diff --git a/_build/data/transport.settings.php b/_build/data/transport.settings.php index 1bec79b7e..bae91c5eb 100644 --- a/_build/data/transport.settings.php +++ b/_build/data/transport.settings.php @@ -299,7 +299,7 @@ 'area' => 'ms2_frontend', ], 'ms2_cart_js_class_name' => [ - 'value' => 'msCart', + 'value' => 'MsCart', 'xtype' => 'textfield', 'area' => 'ms2_frontend', ], @@ -309,7 +309,7 @@ 'area' => 'ms2_frontend', ], 'ms2_order_js_class_name' => [ - 'value' => 'msOrder', + 'value' => 'MsOrder', 'xtype' => 'textfield', 'area' => 'ms2_frontend', ], @@ -319,7 +319,7 @@ 'area' => 'ms2_frontend', ], 'ms2_notify_js_class_name' => [ - 'value' => 'msIziToast', + 'value' => 'MsIziToast', 'xtype' => 'textfield', 'area' => 'ms2_frontend', ], diff --git a/assets/components/minishop2/css/web/default.css b/assets/components/minishop2/css/web/default.css index c7d3c9496..f843c41d7 100644 --- a/assets/components/minishop2/css/web/default.css +++ b/assets/components/minishop2/css/web/default.css @@ -49,3 +49,31 @@ div.jGrowl > .ui-state-highlight { word-wrap: normal; white-space: pre; } + +/* Input Number */ +.ms-hidden{ + position: absolute !important; + opacity: 0; + visibility: hidden; + z-index: -10000 !important; +} +.ms-input-number-wrap{ + display: flex; + font-size: 16px; +} +.ms-input-number-emulator{ + width: 3em; + text-align: center; + border: none; + background-color: transparent; +} +.ms-input-number-emulator:focus, .ms-input-number-emulator:active{ + outline: none; + box-shadow: none; + border: none; +} +.ms-input-number-btn{ + display: flex; + align-items: center; + justify-content: center; +} diff --git a/assets/components/minishop2/js/web/vanilajs/message_settings.json b/assets/components/minishop2/js/web/vanilajs/message_settings.json index d3651b02d..247bb9d0d 100644 --- a/assets/components/minishop2/js/web/vanilajs/message_settings.json +++ b/assets/components/minishop2/js/web/vanilajs/message_settings.json @@ -1,6 +1,6 @@ { - "msNotify": {}, - "msIziToast": { + "MsNotify": {}, + "MsIziToast": { "jsPath": "assets/components/minishop2/js/web/vanilajs/lib/izitoast/iziToast.min.js", "cssPath": "assets/components/minishop2/css/web/lib/izitoast/iziToast.min.css", "handlerClassName": "iziToast", diff --git a/assets/components/minishop2/js/web/vanilajs/modules/minishop.class.js b/assets/components/minishop2/js/web/vanilajs/modules/minishop.class.js index 43305177f..04d194049 100644 --- a/assets/components/minishop2/js/web/vanilajs/modules/minishop.class.js +++ b/assets/components/minishop2/js/web/vanilajs/modules/minishop.class.js @@ -1,9 +1,19 @@ export default class MiniShop { constructor(miniShop2Config) { - this.miniShop2Config = Object.assign(miniShop2Config, { + const defaults = { + notifyClassPath: './msnotify.class.js', + notifyClassName: 'MsNotify', + cartClassPath: './mscart.class.js', + cartClassName: 'MsCart', + orderClassPath: './msorder.class.js', + orderClassName: 'MsOrder', + moduleImportErrorMsg: 'Произошла ошибка при загрузке модуля', + properties: ['Message', 'Cart', 'Order'], actionUrl: document.location.href, formMethod: 'POST', - }); + }; + this.miniShop2Config = Object.assign(defaults, miniShop2Config); + this.miniShop2Config.callbacksObjectTemplate = this.callbacksObjectTemplate; this.Callbacks = this.miniShop2Config.Callbacks = { Cart: { @@ -28,57 +38,39 @@ export default class MiniShop { this.formData = null; this.Message = null; this.timeout = 300; + this.initialize(); } - async setHandler(property, pathPropertyName, classnamePropertyName, defaultPath, defaultClassName, errorMsg, response) { - const classPath = (this.miniShop2Config.hasOwnProperty(pathPropertyName) && this.miniShop2Config[pathPropertyName]) ? - this.miniShop2Config[pathPropertyName] : defaultPath, - className = (this.miniShop2Config.hasOwnProperty(classnamePropertyName) && this.miniShop2Config[classnamePropertyName]) ? - this.miniShop2Config[classnamePropertyName] : defaultClassName, - config = response ? response[className] : this; + async setHandler(property){ + let prefix = property.toLowerCase(), + response = false, + messageSettings = false; + if(prefix === 'message'){ + prefix = 'notify'; + response = await this.sendResponse({url: this.miniShop2Config.notifySettingsPath, method: 'GET'}); + if (response.ok) { + messageSettings = await response.json(); + } + } + const classPath = this.miniShop2Config[prefix + 'ClassPath']; + const className = this.miniShop2Config[prefix + 'ClassName']; + const config = messageSettings ? messageSettings[className] : this; try { - const { default: ModuleName } = await import(classPath); + const {default: ModuleName} = await import(classPath); this[property] = new ModuleName(config); } catch (e) { - console.error(e, errorMsg); + throw new Error(this.miniShop2Config.moduleImportErrorMsg); } } async initialize() { - this.setHandler( - 'Cart', - 'cartClassPath', - 'cartClassName', - './mscart.class.js', - 'msCart', - 'Произошла ошибка при загрузке модуля корзины'); - - this.setHandler( - 'Order', - 'orderClassPath', - 'orderClassName', - './msorder.class.js', - 'msOrder', - 'Произошла ошибка при загрузке модуля отправки заказа'); + if(!this.miniShop2Config.properties.length) { throw new Error('Не передан массив имён обработчиков'); } - if (this.miniShop2Config.notifySettingsPath) { - const response = await this.sendResponse({ url: this.miniShop2Config.notifySettingsPath, method: 'GET' }); - if (response.ok) { - const messageSettings = await response.json(); - if (messageSettings) { - this.setHandler( - 'Message', - 'notifyClassPath', - 'notifyClassName', - './msnotify.class.js', - 'msNotify', - 'Произошла ошибка при загрузке модуля уведомлений', - messageSettings); - } - } - } + await this.miniShop2Config.properties.forEach(property => { + this.setHandler(property); + }); document.addEventListener('submit', e => { e.preventDefault(); @@ -86,38 +78,20 @@ export default class MiniShop { const action = form.querySelector(this.action) ? form.querySelector(this.action).value : ''; if (action) { - const formData = new FormData(form); + const formData = new FormData(form), + components = this.getObjectMethod(action); formData.append(this.actionName, action); this.formData = formData; - - this.controller(action); + this[components.object][components.method](this.formData); } }); } - controller(action) { - switch (action) { - case 'cart/add': - this.Cart.add(this.formData); - break; - case 'cart/remove': - this.Cart.remove(this.formData); - break; - case 'cart/change': - this.Cart.change(this.formData); - break; - case 'cart/clean': - this.Cart.clean(this.formData); - break; - case 'order/submit': - this.Order.submit(this.formData); - break; - case 'order/clean': - this.Order.clean(this.formData); - break; - default: - return; - } + getObjectMethod(action) { + const actionComponents = action.split('/'), + object = actionComponents[0].replace(actionComponents[0].substring(0, 1), actionComponents[0].substring(0, 1).toUpperCase()), + method = actionComponents[1]; + return {object, method}; } callbacksObjectTemplate() { @@ -226,15 +200,13 @@ export default class MiniShop { if (response.ok) { const result = await response.json(); if (result.success) { - if (result.message) { - this.Message.success(result.message); - } this.runCallback(callbacks.response.success, this, result); this.runCallback(userCallbacks.response.success, this, result); + result.message ? this.Message.success(result.message) : ''; } else { - this.Message.error(result.message); this.runCallback(callbacks.response.error, this, result); this.runCallback(userCallbacks.response.error, this, result); + result.message ? this.Message.error(result.message) : ''; } this.runCallback(callbacks.ajax.done, this, response); this.runCallback(userCallbacks.ajax.done, this, response); diff --git a/assets/components/minishop2/js/web/vanilajs/modules/msizitoast.class.js b/assets/components/minishop2/js/web/vanilajs/modules/msizitoast.class.js index 5a386d761..bc60543dd 100644 --- a/assets/components/minishop2/js/web/vanilajs/modules/msizitoast.class.js +++ b/assets/components/minishop2/js/web/vanilajs/modules/msizitoast.class.js @@ -2,7 +2,7 @@ import MsNotify from './msnotify.class.js'; export default class MsIziToast extends MsNotify { show(type, message) { - if (window[this.config.handlerClassName]) { + if (window[this.config.handlerClassName] && message) { const options = Object.assign(this.config.handlerOptions, { title: message }); try { window[this.config.handlerClassName][type](options); diff --git a/assets/components/minishop2/js/web/vanilajs/modules/msorder.class.js b/assets/components/minishop2/js/web/vanilajs/modules/msorder.class.js index 0f0cb1c20..99db7baf4 100644 --- a/assets/components/minishop2/js/web/vanilajs/modules/msorder.class.js +++ b/assets/components/minishop2/js/web/vanilajs/modules/msorder.class.js @@ -112,7 +112,7 @@ export default class MsOrder { } } - field.value = response.data[key]; + field.value = response.data[key] || ''; field.classList.remove('error'); field.closest(this.inputParent).classList.remove('error'); } diff --git a/core/components/minishop2/model/minishop2/minishop2.class.php b/core/components/minishop2/model/minishop2/minishop2.class.php index 2881af508..33203c66f 100644 --- a/core/components/minishop2/model/minishop2/minishop2.class.php +++ b/core/components/minishop2/model/minishop2/minishop2.class.php @@ -117,7 +117,7 @@ public function registerFrontend($ctx = 'web') $js .= '?v=' . substr(md5($this->version), 0, 10); } $js = str_replace($config['pl'], $config['vl'], $js); - $this->modx->regClientScript('',1); + $this->modx->regClientStartupScript('',1); } $js_setting = array(