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/core/components/minishop3/controllers/manager.class.php b/core/components/minishop3/controllers/manager.class.php index b1bf86746..b3c53b70b 100644 --- a/core/components/minishop3/controllers/manager.class.php +++ b/core/components/minishop3/controllers/manager.class.php @@ -105,57 +105,11 @@ public function addVueModule($src) */ protected function registerVueCoreCheck() { + require_once __DIR__ . '/vue_core_check.inc.php'; $alertTitle = $this->modx->lexicon('ms3_error') ?: 'Error'; $alertMessage = $this->modx->lexicon('ms3_vuetools_required') - ?: 'VueTools package is required. Please install it from Package Manager.'; - - $script = << -(function() { - var importMap = document.querySelector('script[type="importmap"]'); - var hasVueCore = false; - - if (importMap) { - try { - var mapContent = JSON.parse(importMap.textContent); - hasVueCore = mapContent.imports && mapContent.imports.vue; - } catch (e) { - hasVueCore = false; - } - } - - if (!hasVueCore) { - document.querySelectorAll('script[type="module"][data-vue-module]').forEach(function(el) { - el.remove(); - }); - - if (typeof Ext !== 'undefined') { - Ext.onReady(function() { - if (typeof MODx !== 'undefined' && MODx.msg) { - MODx.msg.alert('{$alertTitle}', '{$alertMessage}'); - } else { - alert('{$alertMessage}'); - } - }); - } else { - document.addEventListener('DOMContentLoaded', function() { - setTimeout(function() { - if (typeof MODx !== 'undefined' && MODx.msg) { - MODx.msg.alert('{$alertTitle}', '{$alertMessage}'); - } else { - alert('{$alertMessage}'); - } - }, 500); - }); - } - - window.MS3_VUE_CORE_MISSING = true; - } -})(); - -JS; - - $this->modx->regClientStartupHTMLBlock($script); + ?: 'VueTools package (>= 1.2.0) is required. Please install or update it via Package Manager.'; + ms3_register_vue_core_check($this->modx, $alertTitle, $alertMessage); } /** diff --git a/core/components/minishop3/controllers/resource_create.class.php b/core/components/minishop3/controllers/resource_create.class.php index 58e2f90fa..13dfbe063 100644 --- a/core/components/minishop3/controllers/resource_create.class.php +++ b/core/components/minishop3/controllers/resource_create.class.php @@ -81,57 +81,11 @@ public function addVueModule($src) */ protected function registerVueCoreCheck() { + require_once __DIR__ . '/vue_core_check.inc.php'; $alertTitle = $this->modx->lexicon('ms3_error') ?: 'Error'; $alertMessage = $this->modx->lexicon('ms3_vuetools_required') - ?: 'VueTools package is required. Please install it from Package Manager.'; - - $script = << -(function() { - var importMap = document.querySelector('script[type="importmap"]'); - var hasVueCore = false; - - if (importMap) { - try { - var mapContent = JSON.parse(importMap.textContent); - hasVueCore = mapContent.imports && mapContent.imports.vue; - } catch (e) { - hasVueCore = false; - } - } - - if (!hasVueCore) { - document.querySelectorAll('script[type="module"][data-vue-module]').forEach(function(el) { - el.remove(); - }); - - if (typeof Ext !== 'undefined') { - Ext.onReady(function() { - if (typeof MODx !== 'undefined' && MODx.msg) { - MODx.msg.alert('{$alertTitle}', '{$alertMessage}'); - } else { - alert('{$alertMessage}'); - } - }); - } else { - document.addEventListener('DOMContentLoaded', function() { - setTimeout(function() { - if (typeof MODx !== 'undefined' && MODx.msg) { - MODx.msg.alert('{$alertTitle}', '{$alertMessage}'); - } else { - alert('{$alertMessage}'); - } - }, 500); - }); - } - - window.MS3_VUE_CORE_MISSING = true; - } -})(); - -JS; - - $this->modx->regClientStartupHTMLBlock($script); + ?: 'VueTools package (>= 1.2.0) is required. Please install or update it via Package Manager.'; + ms3_register_vue_core_check($this->modx, $alertTitle, $alertMessage); } /** diff --git a/core/components/minishop3/controllers/resource_update.class.php b/core/components/minishop3/controllers/resource_update.class.php index d7db2e535..f66ea89de 100644 --- a/core/components/minishop3/controllers/resource_update.class.php +++ b/core/components/minishop3/controllers/resource_update.class.php @@ -85,57 +85,11 @@ public function addVueModule($src) */ protected function registerVueCoreCheck() { + require_once __DIR__ . '/vue_core_check.inc.php'; $alertTitle = $this->modx->lexicon('ms3_error') ?: 'Error'; $alertMessage = $this->modx->lexicon('ms3_vuetools_required') - ?: 'VueTools package is required. Please install it from Package Manager.'; - - $script = << -(function() { - var importMap = document.querySelector('script[type="importmap"]'); - var hasVueCore = false; - - if (importMap) { - try { - var mapContent = JSON.parse(importMap.textContent); - hasVueCore = mapContent.imports && mapContent.imports.vue; - } catch (e) { - hasVueCore = false; - } - } - - if (!hasVueCore) { - document.querySelectorAll('script[type="module"][data-vue-module]').forEach(function(el) { - el.remove(); - }); - - if (typeof Ext !== 'undefined') { - Ext.onReady(function() { - if (typeof MODx !== 'undefined' && MODx.msg) { - MODx.msg.alert('{$alertTitle}', '{$alertMessage}'); - } else { - alert('{$alertMessage}'); - } - }); - } else { - document.addEventListener('DOMContentLoaded', function() { - setTimeout(function() { - if (typeof MODx !== 'undefined' && MODx.msg) { - MODx.msg.alert('{$alertTitle}', '{$alertMessage}'); - } else { - alert('{$alertMessage}'); - } - }, 500); - }); - } - - window.MS3_VUE_CORE_MISSING = true; - } -})(); - -JS; - - $this->modx->regClientStartupHTMLBlock($script); + ?: 'VueTools package (>= 1.2.0) is required. Please install or update it via Package Manager.'; + ms3_register_vue_core_check($this->modx, $alertTitle, $alertMessage); } /** diff --git a/core/components/minishop3/controllers/vue_core_check.inc.php b/core/components/minishop3/controllers/vue_core_check.inc.php new file mode 100644 index 000000000..4f84184a2 --- /dev/null +++ b/core/components/minishop3/controllers/vue_core_check.inc.php @@ -0,0 +1,65 @@ += 1.2.0). + * + * Signal key `vuetools/theme` is present only in VueTools builds that ship + * `@vuetools/useTheme` / getActiveTheme(). Without it, remove data-vue-module + * scripts and show a MODX alert instead of a silent ES module link error. + * + * @param \MODX\Revolution\modX $modx + * @param string $alertTitle + * @param string $alertMessage + */ +function ms3_register_vue_core_check($modx, string $alertTitle, string $alertMessage): void +{ + $script = << +(function() { + var importMap = document.querySelector('script[type="importmap"]'); + var hasVueToolsTheme = false; + + if (importMap) { + try { + var mapContent = JSON.parse(importMap.textContent); + hasVueToolsTheme = mapContent.imports + && mapContent.imports.vue + && mapContent.imports['vuetools/theme']; + } catch (e) { + hasVueToolsTheme = false; + } + } + + if (!hasVueToolsTheme) { + document.querySelectorAll('script[type="module"][data-vue-module]').forEach(function(el) { + el.remove(); + }); + + if (typeof Ext !== 'undefined') { + Ext.onReady(function() { + if (typeof MODx !== 'undefined' && MODx.msg) { + MODx.msg.alert('{$alertTitle}', '{$alertMessage}'); + } else { + alert('{$alertMessage}'); + } + }); + } else { + document.addEventListener('DOMContentLoaded', function() { + setTimeout(function() { + if (typeof MODx !== 'undefined' && MODx.msg) { + MODx.msg.alert('{$alertTitle}', '{$alertMessage}'); + } else { + alert('{$alertMessage}'); + } + }, 500); + }); + } + + window.MS3_VUE_CORE_MISSING = true; + } +})(); + +JS; + + $modx->regClientStartupHTMLBlock($script); +} diff --git a/core/components/minishop3/lexicon/en/default.inc.php b/core/components/minishop3/lexicon/en/default.inc.php index e6c65ed78..30f266a0c 100644 --- a/core/components/minishop3/lexicon/en/default.inc.php +++ b/core/components/minishop3/lexicon/en/default.inc.php @@ -294,7 +294,7 @@ $_lang['ms3_help_desc'] = 'Useful links and information'; $_lang['ms3_error'] = 'Error'; -$_lang['ms3_vuetools_required'] = 'VueTools package is required for MiniShop3. Please install it via Package Manager.'; +$_lang['ms3_vuetools_required'] = 'VueTools package (>= 1.2.0) is required for MiniShop3. Please install or update it via Package Manager.'; $_lang['ms3_mgr_order_recalc_invalid_mode'] = 'Invalid order cost recalculation mode.'; $_lang['ms3_mgr_order_recalc_manual_delivery_missing'] = 'Manual delivery cost (manual_delivery_cost) is required in manual mode.'; diff --git a/core/components/minishop3/lexicon/ru/default.inc.php b/core/components/minishop3/lexicon/ru/default.inc.php index 8791f7eaf..67747b555 100644 --- a/core/components/minishop3/lexicon/ru/default.inc.php +++ b/core/components/minishop3/lexicon/ru/default.inc.php @@ -294,7 +294,7 @@ $_lang['ms3_help_desc'] = 'Полезные ссылки и информация'; $_lang['ms3_error'] = 'Ошибка'; -$_lang['ms3_vuetools_required'] = 'Для работы MiniShop3 требуется пакет VueTools. Установите его через Менеджер пакетов.'; +$_lang['ms3_vuetools_required'] = 'Для работы MiniShop3 требуется пакет VueTools (>= 1.2.0). Установите или обновите его через Менеджер пакетов.'; $_lang['ms3_mgr_order_recalc_invalid_mode'] = 'Недопустимый режим пересчёта стоимости заказа.'; $_lang['ms3_mgr_order_recalc_manual_delivery_missing'] = 'В режиме manual обязательно укажите manual_delivery_cost (стоимость доставки).'; diff --git a/vueManager/src/components/ActionsEditor.vue b/vueManager/src/components/ActionsEditor.vue index 04ad1726f..f57b62142 100644 --- a/vueManager/src/components/ActionsEditor.vue +++ b/vueManager/src/components/ActionsEditor.vue @@ -9,6 +9,7 @@ import { Button, Checkbox, Column, DataTable, Dialog, InputText, Select } from ' import { computed, ref, watch } from 'vue' import actionRegistry from '../actionRegistry.js' +import { getPrimarySaveSeverity } from '../utils/primevueTheme.js' const props = defineProps({ /** @@ -31,6 +32,7 @@ const props = defineProps({ const emit = defineEmits(['update:modelValue']) const { _ } = useLexicon() +const primarySaveSeverity = getPrimarySaveSeverity() const localActions = ref([]) @@ -370,6 +372,7 @@ function closeDialog() {