diff --git a/_build/resolvers/resolver_01_setup.php b/_build/resolvers/resolver_01_setup.php index c69cbde92..dce59fc53 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.2.0-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..b1bf86746 100644 --- a/core/components/minishop3/controllers/manager.class.php +++ b/core/components/minishop3/controllers/manager.class.php @@ -28,7 +28,8 @@ public function initialize() */ public function addCss($script) { - $script = $script . '?v=' . $this->ms3->version; + require_once __DIR__ . '/vue_module_cache_bust.inc.php'; + $script = ms3_vue_module_cache_bust_url($this->modx, $script, (string) $this->ms3->version); parent::addCss($script); } @@ -89,8 +90,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..58e2f90fa 100644 --- a/core/components/minishop3/controllers/resource_create.class.php +++ b/core/components/minishop3/controllers/resource_create.class.php @@ -29,7 +29,8 @@ public function initialize() */ public function addCss($script) { - $script = $script . '?v=' . $this->ms3->version; + require_once __DIR__ . '/vue_module_cache_bust.inc.php'; + $script = ms3_vue_module_cache_bust_url($this->modx, $script, (string) $this->ms3->version); parent::addCss($script); } @@ -65,8 +66,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..d7db2e535 100644 --- a/core/components/minishop3/controllers/resource_update.class.php +++ b/core/components/minishop3/controllers/resource_update.class.php @@ -33,7 +33,8 @@ public function initialize() */ public function addCss($script) { - $script = $script . '?v=' . $this->ms3->version; + require_once __DIR__ . '/vue_module_cache_bust.inc.php'; + $script = ms3_vue_module_cache_bust_url($this->modx, $script, (string) $this->ms3->version); parent::addCss($script); } @@ -69,8 +70,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..afcea4e3b --- /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..06f45081e 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/'; @@ -25,8 +25,8 @@ $_lang['ms3_github_title'] = 'github.com'; $_lang['ms3_help'] = 'Help and support'; $_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 +41,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..bffdff702 100644 --- a/core/components/minishop3/lexicon/en/product.inc.php +++ b/core/components/minishop3/lexicon/en/product.inc.php @@ -184,6 +184,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 +192,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 71cb21b1e..1f41e0bc0 100644 --- a/core/components/minishop3/lexicon/en/vue.inc.php +++ b/core/components/minishop3/lexicon/en/vue.inc.php @@ -658,6 +658,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'; @@ -1146,6 +1159,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..a1a62f97b 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/'; @@ -25,8 +25,8 @@ $_lang['ms3_github_title'] = 'github.com'; $_lang['ms3_help'] = 'Помощь и поддержка'; $_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 +41,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..802a6dc72 100644 --- a/core/components/minishop3/lexicon/ru/product.inc.php +++ b/core/components/minishop3/lexicon/ru/product.inc.php @@ -184,6 +184,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 +192,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 5c3b32b95..1b284f0a4 100644 --- a/core/components/minishop3/lexicon/ru/vue.inc.php +++ b/core/components/minishop3/lexicon/ru/vue.inc.php @@ -657,6 +657,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'] = 'Телефон'; @@ -1148,6 +1161,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..27b55ef5c 100644 --- a/core/components/minishop3/src/Controllers/Api/Manager/CategoryProductsController.php +++ b/core/components/minishop3/src/Controllers/Api/Manager/CategoryProductsController.php @@ -760,6 +760,8 @@ private function applyHideMenu(msProduct $product, bool $hidemenu): bool */ protected function getDefaultFilters(): array { + $this->modx->lexicon->load('minishop3:vue'); + return [ 'query' => [ 'type' => 'text', @@ -773,8 +775,8 @@ protected function getDefaultFilters(): array 'label' => 'published', 'placeholder' => 'all', 'options' => [ - ['label' => 'Да', 'value' => 1], - ['label' => 'Нет', 'value' => 0], + ['label' => $this->modx->lexicon('ms3_yes'), 'value' => 1], + ['label' => $this->modx->lexicon('ms3_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 @@ + + 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 @@