diff --git a/_build/resolvers/resolver_01_setup.php b/_build/resolvers/resolver_01_setup.php
index c69cbde92..30f9f7493 100644
--- a/_build/resolvers/resolver_01_setup.php
+++ b/_build/resolvers/resolver_01_setup.php
@@ -19,7 +19,7 @@
'service_url' => 'modstore.pro',
],
'VueTools' => [
- 'version' => '1.0.0-beta1',
+ 'version' => '1.1.2-pl',
'service_url' => 'modstore.pro',
],
];
diff --git a/core/components/minishop3/controllers/manager.class.php b/core/components/minishop3/controllers/manager.class.php
index 33e36f1ac..6ab29d221 100644
--- a/core/components/minishop3/controllers/manager.class.php
+++ b/core/components/minishop3/controllers/manager.class.php
@@ -89,8 +89,8 @@ public function addVueModule($src)
self::$vueCoreCheckRegistered = true;
}
- // Add version to URL
- $src = $src . '?v=' . $this->ms3->version;
+ require_once __DIR__ . '/vue_module_cache_bust.inc.php';
+ $src = ms3_vue_module_cache_bust_url($this->modx, $src, (string) $this->ms3->version);
// Register the module (will be blocked by check if VueCore not installed)
$this->modx->regClientStartupHTMLBlock(
diff --git a/core/components/minishop3/controllers/resource_create.class.php b/core/components/minishop3/controllers/resource_create.class.php
index 85f846302..1c98bdfd4 100644
--- a/core/components/minishop3/controllers/resource_create.class.php
+++ b/core/components/minishop3/controllers/resource_create.class.php
@@ -65,8 +65,8 @@ public function addVueModule($src)
self::$vueCoreCheckRegistered = true;
}
- // Add version to URL
- $src = $src . '?v=' . $this->ms3->version;
+ require_once __DIR__ . '/vue_module_cache_bust.inc.php';
+ $src = ms3_vue_module_cache_bust_url($this->modx, $src, (string) $this->ms3->version);
// Register the module (will be blocked by check if VueCore not installed)
$this->modx->regClientStartupHTMLBlock(
diff --git a/core/components/minishop3/controllers/resource_update.class.php b/core/components/minishop3/controllers/resource_update.class.php
index 2e81d6782..80b8341b5 100644
--- a/core/components/minishop3/controllers/resource_update.class.php
+++ b/core/components/minishop3/controllers/resource_update.class.php
@@ -69,8 +69,8 @@ public function addVueModule($src)
self::$vueCoreCheckRegistered = true;
}
- // Add version to URL
- $src = $src . '?v=' . $this->ms3->version;
+ require_once __DIR__ . '/vue_module_cache_bust.inc.php';
+ $src = ms3_vue_module_cache_bust_url($this->modx, $src, (string) $this->ms3->version);
// Register the module (will be blocked by check if VueCore not installed)
$this->modx->regClientStartupHTMLBlock(
diff --git a/core/components/minishop3/controllers/vue_module_cache_bust.inc.php b/core/components/minishop3/controllers/vue_module_cache_bust.inc.php
new file mode 100644
index 000000000..a564c6a1d
--- /dev/null
+++ b/core/components/minishop3/controllers/vue_module_cache_bust.inc.php
@@ -0,0 +1,31 @@
+getOption('assets_url'), '/');
+ $assetsPath = rtrim((string) $modx->getOption('assets_path'), '/');
+ $fsPath = null;
+ if ($assetsUrl !== '' && str_starts_with($path, $assetsUrl)) {
+ $fsPath = $assetsPath . substr($path, strlen($assetsUrl));
+ } elseif (defined('MODX_ASSETS_PATH') && str_starts_with($path, '/assets/')) {
+ $fsPath = rtrim(MODX_ASSETS_PATH, '/') . substr($path, strlen('/assets'));
+ }
+ if (is_string($fsPath) && is_file($fsPath)) {
+ $version .= '.' . filemtime($fsPath);
+ }
+ }
+
+ $separator = str_contains($src, '?') ? '&' : '?';
+
+ return $src . $separator . 'v=' . rawurlencode($version);
+}
diff --git a/core/components/minishop3/lexicon/en/help.inc.php b/core/components/minishop3/lexicon/en/help.inc.php
index a3c07dbaa..45707e442 100644
--- a/core/components/minishop3/lexicon/en/help.inc.php
+++ b/core/components/minishop3/lexicon/en/help.inc.php
@@ -11,7 +11,7 @@
$_lang['ms3_components_href'] = 'https://modstore.pro/';
$_lang['ms3_components_text'] = 'Paid and free addons';
$_lang['ms3_components_title'] = 'Addons';
-$_lang['ms3_demo_href'] = '#';
+$_lang['ms3_demo_href'] = 'https://minishop3.ru/';
$_lang['ms3_demo_text'] = 'Go to demo site';
$_lang['ms3_demo_title'] = 'Demo';
$_lang['ms3_docs_href'] = 'https://docs.modx.pro/components/minishop3/';
@@ -24,9 +24,11 @@
$_lang['ms3_github_text'] = 'Found an issue? Report it!';
$_lang['ms3_github_title'] = 'github.com';
$_lang['ms3_help'] = 'Help and support';
+$_lang['ms3_help_nav_title'] = 'Manager sections';
+$_lang['ms3_help_resources_title'] = 'Resources';
$_lang['ms3_help_text'] = 'MiniShop3 - the most flexible and fast e-commerce component for MODX3.';
-$_lang['ms3_help_text_support'] = 'You can support MiniShop3 financially:
-
- All details here';
+$_lang['ms3_help_text_support'] = 'Support MiniShop3 development
+
Payment details are on the about page.';
$_lang['ms3_lexicons_href'] = '?a=workspaces/lexicon&ns=minishop3';
$_lang['ms3_lexicons_text'] = 'Lexicon management';
$_lang['ms3_localization_href'] = 'https://crowdin.com/project/minishop3-ecommerce';
@@ -41,6 +43,6 @@
$_lang['ms3_settings_href'] = '?a=mgr/settings&namespace=minishop3';
$_lang['ms3_settings_text'] = 'Settings';
$_lang['ms3_sys_settings_href'] = '?a=system/settings&ns=minishop3';
-$_lang['ms3_sys_settings_text'] = 'System settings & Events';
+$_lang['ms3_sys_settings_text'] = 'System settings';
$_lang['ms3_utilities_href'] = '?a=mgr/utilities&namespace=minishop3';
$_lang['ms3_utilities_text'] = 'Utilities';
diff --git a/core/components/minishop3/lexicon/en/product.inc.php b/core/components/minishop3/lexicon/en/product.inc.php
index 8adb34a43..13f030f8a 100644
--- a/core/components/minishop3/lexicon/en/product.inc.php
+++ b/core/components/minishop3/lexicon/en/product.inc.php
@@ -145,6 +145,7 @@
$_lang['ms3_gallery_file_source'] = 'File Source';
$_lang['ms3_gallery_button_upload'] = 'Select Files';
+$_lang['ms3_gallery_actions'] = 'Gallery actions';
$_lang['ms3_gallery_file_show'] = 'Open in New Window';
$_lang['ms3_gallery_file_update'] = 'Edit Properties';
@@ -184,6 +185,7 @@
$_lang['ms3_gallery_uppy_note_max_size'] = 'Maximum size: %{maxSize}';
$_lang['ms3_gallery_uppy_back'] = 'Back';
$_lang['ms3_gallery_uppy_add_more_files'] = 'Add more files';
+$_lang['ms3_gallery_uppy_adding_more_files'] = 'Adding more files';
$_lang['ms3_gallery_uppy_drop_hint'] = 'Drop your files here';
$_lang['ms3_gallery_uppy_error'] = 'Error';
$_lang['ms3_gallery_uppy_failed_to_upload'] = 'Failed to upload %{file}';
@@ -191,6 +193,18 @@
$_lang['ms3_gallery_uppy_no_files_found'] = 'You have no files or folders here';
$_lang['ms3_gallery_uppy_pause_upload'] = 'Pause upload';
$_lang['ms3_gallery_uppy_resume_upload'] = 'Resume upload';
+$_lang['ms3_gallery_uppy_editing'] = 'Editing image';
+$_lang['ms3_gallery_uppy_save'] = 'Save';
+$_lang['ms3_gallery_uppy_finish_editing'] = 'Finish editing';
+$_lang['ms3_gallery_uppy_save_changes'] = 'Save changes';
+$_lang['ms3_gallery_uppy_revert'] = 'Reset';
+$_lang['ms3_gallery_uppy_rotate'] = 'Rotate 90°';
+$_lang['ms3_gallery_uppy_zoom_in'] = 'Zoom in';
+$_lang['ms3_gallery_uppy_zoom_out'] = 'Zoom out';
+$_lang['ms3_gallery_uppy_flip_horizontal'] = 'Flip horizontally';
+$_lang['ms3_gallery_uppy_crop_square'] = 'Crop square';
+$_lang['ms3_gallery_uppy_crop_landscape'] = 'Crop landscape (16:9)';
+$_lang['ms3_gallery_uppy_crop_portrait'] = 'Crop portrait (9:16)';
$_lang['ms3_gallery_search_placeholder'] = 'Search files...';
$_lang['ms3_gallery_empty_text'] = 'No images yet. Upload files using the area above.';
diff --git a/core/components/minishop3/lexicon/en/vue.inc.php b/core/components/minishop3/lexicon/en/vue.inc.php
index d93550177..e0abac805 100644
--- a/core/components/minishop3/lexicon/en/vue.inc.php
+++ b/core/components/minishop3/lexicon/en/vue.inc.php
@@ -8,6 +8,7 @@
$_lang['ms3_vue_product_fields_title'] = 'Product Fields (Admin)';
$_lang['ms3_vue_product_fields_description'] = 'Here you can configure which fields are displayed on the "Product Data" tab when editing a product';
$_lang['ms3_vue_product_properties'] = 'Product Properties';
+$_lang['ms3_product_links_empty'] = 'No links yet. Create the first one.';
// Grid Fields Config Widget
$_lang['grid_fields_config_title'] = 'Grid Configuration';
@@ -640,6 +641,19 @@
$_lang['log_action'] = 'Action';
$_lang['log_user'] = 'User';
$_lang['log_entry'] = 'Entry';
+$_lang['log_empty'] = 'No order history yet';
+$_lang['log_action_status'] = 'Status';
+$_lang['log_action_field'] = 'Field';
+$_lang['log_action_address'] = 'Address';
+$_lang['log_action_products'] = 'Products';
+$_lang['log_action_payment'] = 'Payment';
+$_lang['log_entry_status_id'] = 'Status ID: {id}';
+$_lang['log_entry_fields'] = 'Fields: {fields}';
+$_lang['log_entry_address'] = 'Address: {fields}';
+$_lang['log_entry_product_op_add'] = 'Added';
+$_lang['log_entry_product_op_remove'] = 'Removed';
+$_lang['log_entry_product_op_update'] = 'Updated';
+$_lang['log_entry_product_op_unknown'] = 'Change';
$_lang['address_first_name'] = 'First Name';
$_lang['address_last_name'] = 'Last Name';
$_lang['address_phone'] = 'Phone';
@@ -1128,6 +1142,10 @@
$_lang['ms3_vendor_email'] = 'Email';
$_lang['ms3_vendor_description'] = 'Description';
$_lang['ms3_vendor_properties'] = 'Properties';
+$_lang['ms3_vendor_select'] = 'Select vendor';
+$_lang['ms3_vendor_search'] = 'Search vendor…';
+$_lang['ms3_vendor_empty'] = 'No vendors found. Add a vendor in component settings.';
+$_lang['ms3_vendor_not_found'] = 'Vendor not found';
// Vendor sections
$_lang['ms3_section_vendor_info'] = 'Information';
diff --git a/core/components/minishop3/lexicon/ru/help.inc.php b/core/components/minishop3/lexicon/ru/help.inc.php
index 55143ba58..2d1ac70a2 100644
--- a/core/components/minishop3/lexicon/ru/help.inc.php
+++ b/core/components/minishop3/lexicon/ru/help.inc.php
@@ -11,7 +11,7 @@
$_lang['ms3_components_href'] = 'https://modstore.pro/';
$_lang['ms3_components_text'] = 'Платные и бесплатные дополнения';
$_lang['ms3_components_title'] = 'Дополнения';
-$_lang['ms3_demo_href'] = '#';
+$_lang['ms3_demo_href'] = 'https://minishop3.ru/';
$_lang['ms3_demo_text'] = 'Перейти на демо-сайт';
$_lang['ms3_demo_title'] = 'Демо';
$_lang['ms3_docs_href'] = 'https://docs.modx.pro/components/minishop3/';
@@ -24,9 +24,11 @@
$_lang['ms3_github_text'] = 'Нашли проблему? Сообщите об этом!';
$_lang['ms3_github_title'] = 'github.com';
$_lang['ms3_help'] = 'Помощь и поддержка';
+$_lang['ms3_help_nav_title'] = 'Разделы менеджера';
+$_lang['ms3_help_resources_title'] = 'Ресурсы';
$_lang['ms3_help_text'] = 'MiniShop3 - самый гибкий и быстрый компонент интернет-магазина для MODX3.';
-$_lang['ms3_help_text_support'] = 'Вы можете поддержать MiniShop3 финансово:
-
- Все реквизиты здесь';
+$_lang['ms3_help_text_support'] = 'Поддержите разработку MiniShop3
+
Реквизиты для перевода — на странице о проекте.';
$_lang['ms3_lexicons_href'] = '?a=workspaces/lexicon&ns=minishop3';
$_lang['ms3_lexicons_text'] = 'Управление словарями';
$_lang['ms3_localization_href'] = 'https://crowdin.com/project/minishop3-ecommerce';
@@ -41,6 +43,6 @@
$_lang['ms3_settings_href'] = '?a=mgr/settings&namespace=minishop3';
$_lang['ms3_settings_text'] = 'Настройки';
$_lang['ms3_sys_settings_href'] = '?a=system/settings&ns=minishop3';
-$_lang['ms3_sys_settings_text'] = 'Системные настройки & События';
+$_lang['ms3_sys_settings_text'] = 'Системные настройки';
$_lang['ms3_utilities_href'] = '?a=mgr/utilities&namespace=minishop3';
$_lang['ms3_utilities_text'] = 'Утилиты';
diff --git a/core/components/minishop3/lexicon/ru/product.inc.php b/core/components/minishop3/lexicon/ru/product.inc.php
index 00303ec0b..f9cbc2a7b 100644
--- a/core/components/minishop3/lexicon/ru/product.inc.php
+++ b/core/components/minishop3/lexicon/ru/product.inc.php
@@ -145,6 +145,7 @@
$_lang['ms3_gallery_file_source'] = 'Источник файла';
$_lang['ms3_gallery_button_upload'] = 'Выбрать файлы';
+$_lang['ms3_gallery_actions'] = 'Действия галереи';
$_lang['ms3_gallery_file_show'] = 'Открыть в новом окне';
$_lang['ms3_gallery_file_update'] = 'Изменить свойства';
@@ -184,6 +185,7 @@
$_lang['ms3_gallery_uppy_note_max_size'] = 'Макс. размер: %{maxSize}';
$_lang['ms3_gallery_uppy_back'] = 'Назад';
$_lang['ms3_gallery_uppy_add_more_files'] = 'Добавить ещё файлы';
+$_lang['ms3_gallery_uppy_adding_more_files'] = 'Добавление файлов';
$_lang['ms3_gallery_uppy_drop_hint'] = 'Перетащите файлы сюда';
$_lang['ms3_gallery_uppy_error'] = 'Ошибка';
$_lang['ms3_gallery_uppy_failed_to_upload'] = 'Не удалось загрузить %{file}';
@@ -191,6 +193,18 @@
$_lang['ms3_gallery_uppy_no_files_found'] = 'У вас нет файлов или папок';
$_lang['ms3_gallery_uppy_pause_upload'] = 'Приостановить загрузку';
$_lang['ms3_gallery_uppy_resume_upload'] = 'Возобновить загрузку';
+$_lang['ms3_gallery_uppy_editing'] = 'Редактирование изображения';
+$_lang['ms3_gallery_uppy_save'] = 'Сохранить';
+$_lang['ms3_gallery_uppy_finish_editing'] = 'Завершить редактирование';
+$_lang['ms3_gallery_uppy_save_changes'] = 'Сохранить изменения';
+$_lang['ms3_gallery_uppy_revert'] = 'Сбросить';
+$_lang['ms3_gallery_uppy_rotate'] = 'Повернуть на 90°';
+$_lang['ms3_gallery_uppy_zoom_in'] = 'Увеличить';
+$_lang['ms3_gallery_uppy_zoom_out'] = 'Уменьшить';
+$_lang['ms3_gallery_uppy_flip_horizontal'] = 'Отразить по горизонтали';
+$_lang['ms3_gallery_uppy_crop_square'] = 'Квадратная обрезка';
+$_lang['ms3_gallery_uppy_crop_landscape'] = 'Альбомная обрезка (16:9)';
+$_lang['ms3_gallery_uppy_crop_portrait'] = 'Портретная обрезка (9:16)';
$_lang['ms3_gallery_search_placeholder'] = 'Поиск файлов...';
$_lang['ms3_gallery_empty_text'] = 'Файлов нет. Загрузите через область выше.';
diff --git a/core/components/minishop3/lexicon/ru/vue.inc.php b/core/components/minishop3/lexicon/ru/vue.inc.php
index 01da74b1b..c9ee83ec4 100644
--- a/core/components/minishop3/lexicon/ru/vue.inc.php
+++ b/core/components/minishop3/lexicon/ru/vue.inc.php
@@ -8,6 +8,7 @@
$_lang['ms3_vue_product_fields_title'] = 'Поля товара (админка)';
$_lang['ms3_vue_product_fields_description'] = 'Здесь вы можете настроить, какие поля отображаются на вкладке "Данные товара" при редактировании товара';
$_lang['ms3_vue_product_properties'] = 'Свойства товара';
+$_lang['ms3_product_links_empty'] = 'Связей пока нет. Создайте первую.';
// Grid Fields Config Widget
$_lang['grid_fields_config_title'] = 'Конфигурация гридов';
@@ -639,6 +640,19 @@
$_lang['log_action'] = 'Действие';
$_lang['log_user'] = 'Пользователь';
$_lang['log_entry'] = 'Запись';
+$_lang['log_empty'] = 'История заказа пуста';
+$_lang['log_action_status'] = 'Статус';
+$_lang['log_action_field'] = 'Поле';
+$_lang['log_action_address'] = 'Адрес';
+$_lang['log_action_products'] = 'Товары';
+$_lang['log_action_payment'] = 'Оплата';
+$_lang['log_entry_status_id'] = 'Статус ID: {id}';
+$_lang['log_entry_fields'] = 'Поля: {fields}';
+$_lang['log_entry_address'] = 'Адрес: {fields}';
+$_lang['log_entry_product_op_add'] = 'Добавлен';
+$_lang['log_entry_product_op_remove'] = 'Удалён';
+$_lang['log_entry_product_op_update'] = 'Изменён';
+$_lang['log_entry_product_op_unknown'] = 'Изменение';
$_lang['address_first_name'] = 'Имя';
$_lang['address_last_name'] = 'Фамилия';
$_lang['address_phone'] = 'Телефон';
@@ -1130,6 +1144,10 @@
$_lang['ms3_vendor_email'] = 'Email';
$_lang['ms3_vendor_description'] = 'Описание';
$_lang['ms3_vendor_properties'] = 'Свойства';
+$_lang['ms3_vendor_select'] = 'Выберите производителя';
+$_lang['ms3_vendor_search'] = 'Поиск производителя…';
+$_lang['ms3_vendor_empty'] = 'Производители не найдены. Добавьте производителя в настройках компонента.';
+$_lang['ms3_vendor_not_found'] = 'Производитель не найден';
// Vendor sections
$_lang['ms3_section_vendor_info'] = 'Информация';
diff --git a/core/components/minishop3/src/Controllers/Api/Manager/CategoryProductsController.php b/core/components/minishop3/src/Controllers/Api/Manager/CategoryProductsController.php
index 7a8858bc3..7845d9cf3 100644
--- a/core/components/minishop3/src/Controllers/Api/Manager/CategoryProductsController.php
+++ b/core/components/minishop3/src/Controllers/Api/Manager/CategoryProductsController.php
@@ -773,8 +773,8 @@ protected function getDefaultFilters(): array
'label' => 'published',
'placeholder' => 'all',
'options' => [
- ['label' => 'Да', 'value' => 1],
- ['label' => 'Нет', 'value' => 0],
+ ['label' => 'yes', 'value' => 1],
+ ['label' => 'no', 'value' => 0],
],
'width' => '120px',
'position' => 20,
diff --git a/vueManager/src/components/ActionsColumn.vue b/vueManager/src/components/ActionsColumn.vue
index 213f0974c..f7bc35c39 100644
--- a/vueManager/src/components/ActionsColumn.vue
+++ b/vueManager/src/components/ActionsColumn.vue
@@ -36,7 +36,7 @@
* }
*/
import { useLexicon } from '@vuetools/useLexicon'
-import Button from 'primevue/button'
+import { Button } from 'primevue'
import { computed } from 'vue'
import { useActions } from '../composables/useActions.js'
diff --git a/vueManager/src/components/ActionsEditor.vue b/vueManager/src/components/ActionsEditor.vue
index 775f669d3..04ad1726f 100644
--- a/vueManager/src/components/ActionsEditor.vue
+++ b/vueManager/src/components/ActionsEditor.vue
@@ -5,13 +5,7 @@
* Allows adding, removing and editing actions in grid column
*/
import { useLexicon } from '@vuetools/useLexicon'
-import Button from 'primevue/button'
-import Checkbox from 'primevue/checkbox'
-import Column from 'primevue/column'
-import DataTable from 'primevue/datatable'
-import Dialog from 'primevue/dialog'
-import InputText from 'primevue/inputtext'
-import Select from 'primevue/select'
+import { Button, Checkbox, Column, DataTable, Dialog, InputText, Select } from 'primevue'
import { computed, ref, watch } from 'vue'
import actionRegistry from '../actionRegistry.js'
diff --git a/vueManager/src/components/ApiTest.vue b/vueManager/src/components/ApiTest.vue
index 0ab791bd7..a7f8dc88d 100644
--- a/vueManager/src/components/ApiTest.vue
+++ b/vueManager/src/components/ApiTest.vue
@@ -2,21 +2,7 @@
import { useApi } from '@vuetools/useApi'
import { useModx } from '@vuetools/useModx'
import { usePermission } from '@vuetools/usePermission'
-import Badge from 'primevue/badge'
-import Button from 'primevue/button'
-import Card from 'primevue/card'
-import Chip from 'primevue/chip'
-import Column from 'primevue/column'
-import DataTable from 'primevue/datatable'
-import Divider from 'primevue/divider'
-import Message from 'primevue/message'
-import Panel from 'primevue/panel'
-import ProgressSpinner from 'primevue/progressspinner'
-import Tab from 'primevue/tab'
-import TabList from 'primevue/tablist'
-import TabPanel from 'primevue/tabpanel'
-import TabPanels from 'primevue/tabpanels'
-import Tabs from 'primevue/tabs'
+import { Badge, Button, Card, Chip, Column, DataTable, Divider, Message, Panel, ProgressSpinner, Tab, TabList, TabPanel, TabPanels, Tabs } from 'primevue'
import { computed, ref } from 'vue'
const { get, loading, error, clearError } = useApi()
diff --git a/vueManager/src/components/AutocompleteCombo.vue b/vueManager/src/components/AutocompleteCombo.vue
index 60c90e914..223137292 100644
--- a/vueManager/src/components/AutocompleteCombo.vue
+++ b/vueManager/src/components/AutocompleteCombo.vue
@@ -17,7 +17,8 @@
-
+
+
+ {{ _('log_empty') }}
+
{{ formatDate(data.timestamp || data.createdon) }}
-
+
+
+
+
+
-
+
- {{ data.entry_formatted || formatLogEntry(data) }}
+ {{ formatLogEntry(data) }}
+
+
diff --git a/vueManager/src/components/order/OrderInfoTab.vue b/vueManager/src/components/order/OrderInfoTab.vue
index e87d8a688..2d7a3676d 100644
--- a/vueManager/src/components/order/OrderInfoTab.vue
+++ b/vueManager/src/components/order/OrderInfoTab.vue
@@ -1,14 +1,6 @@