diff --git a/_build/resolvers/resolver_01_setup.php b/_build/resolvers/resolver_01_setup.php index c69cbde92..f628bf9f4 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.3-pl', 'service_url' => 'modstore.pro', ], ]; diff --git a/assets/components/minishop3/css/mgr/main.css b/assets/components/minishop3/css/mgr/main.css index 1aa2a2c09..501821e6e 100644 --- a/assets/components/minishop3/css/mgr/main.css +++ b/assets/components/minishop3/css/mgr/main.css @@ -494,6 +494,8 @@ a.x-menu-item .x-menu-item-text .icon { box-sizing: border-box !important; } -.p-select-filter { - width: 90% !important; +/* Select filter must fill IconField (was 90% — left a dead strip and misaligned search icon). */ +.p-select-overlay .p-select-filter, +.p-multiselect-overlay .p-multiselect-filter { + width: 100% !important; } diff --git a/assets/components/minishop3/js/mgr/category/update.js b/assets/components/minishop3/js/mgr/category/update.js index 5506d0ace..ef12921d0 100644 --- a/assets/components/minishop3/js/mgr/category/update.js +++ b/assets/components/minishop3/js/mgr/category/update.js @@ -172,12 +172,17 @@ Ext.extend(ms3.panel.UpdateCategory, ms3.panel.Category, { return [{ layout: 'form', items: [items, { - html: String.format('

{0}

', _('ms3_product_options')), - style: 'margin-top: 20px', + html: String.format( + '

{0}

', + _('ms3_product_options') + ), + // Theme panel step (15px) above the section; heading→toolbar gap via CSS. + style: 'margin-top: 15px', border: false, }, { xtype: 'container', - cls: 'main-wrapper', + // Avoid .main-wrapper (15px pad) stacking on h3 margin — doubles title→toolbar gap. + style: 'padding: 0', html: '
', }] }]; diff --git a/core/components/minishop3/controllers/category/update.class.php b/core/components/minishop3/controllers/category/update.class.php index caa64694e..d3f6126b3 100644 --- a/core/components/minishop3/controllers/category/update.class.php +++ b/core/components/minishop3/controllers/category/update.class.php @@ -60,6 +60,7 @@ public function loadCustomCssJs() // Vue modules with VueTools dependency check $this->addCss($assetsUrl . 'css/mgr/vue-dist/primeicons.min.css'); + $this->addCss($assetsUrl . 'css/mgr/vue-dist/ActionsColumn.min.css'); $this->addCss($assetsUrl . 'css/mgr/vue-dist/category-products.min.css'); $this->addCss($assetsUrl . 'css/mgr/vue-dist/category-options.min.css'); $this->addVueModule($assetsUrl . 'js/mgr/vue-dist/category-products.min.js'); 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/core/components/minishop3/templates/default/customers.tpl b/core/components/minishop3/templates/default/customers.tpl index b1de06d4d..18d54dca9 100644 --- a/core/components/minishop3/templates/default/customers.tpl +++ b/core/components/minishop3/templates/default/customers.tpl @@ -1,3 +1,3 @@
-
+
diff --git a/core/components/minishop3/templates/default/notifications.tpl b/core/components/minishop3/templates/default/notifications.tpl index d552891fd..5a283354e 100644 --- a/core/components/minishop3/templates/default/notifications.tpl +++ b/core/components/minishop3/templates/default/notifications.tpl @@ -1,3 +1,3 @@
-
+
diff --git a/core/components/minishop3/templates/default/order.tpl b/core/components/minishop3/templates/default/order.tpl index e8729dc17..7574a7f29 100644 --- a/core/components/minishop3/templates/default/order.tpl +++ b/core/components/minishop3/templates/default/order.tpl @@ -1,3 +1,3 @@
-
+
diff --git a/core/components/minishop3/templates/default/orders.tpl b/core/components/minishop3/templates/default/orders.tpl index d1cbebc07..38933ec90 100644 --- a/core/components/minishop3/templates/default/orders.tpl +++ b/core/components/minishop3/templates/default/orders.tpl @@ -1,3 +1,3 @@
-
+
diff --git a/vueManager/src/components/ActionsColumn.vue b/vueManager/src/components/ActionsColumn.vue index 213f0974c..ac35f5af2 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' @@ -96,7 +96,7 @@ const props = defineProps({ */ size: { type: String, - default: 'small', + default: 'normal', }, }) @@ -235,7 +235,7 @@ function getButtonClasses() {