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(