Aleksandr37rus

Untitled

Oct 10th, 2022
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. $(document).ready(function () {
  2.     var CLASS_SWITCHER_ACTIVE = 'switcher__item_active',
  3.         CLASS_USER_FORM_ACTIVE = 'user-form_active',
  4.         MAX_LENGTH_ROW = 500,
  5.         TITLE_FOR_MODAL_WINDOW = 'Предупреждение',
  6.         ERROR_MSG_HAS_NOT_CHECKED_ITEMS = 'Не выбрано ни одной позиции. Выберите позиции с помощью галочек.';
  7.  
  8.     var $wrapper = $('#main'),
  9.         $mobileContent = $('#mobileContent'),
  10.         $switcher = $('#switcher'),
  11.         $buttonsSwitcher = $switcher.find('.switcher__item'),
  12.         $headline = $('#headline'),
  13.         $wrapButtonsHeadline = $headline.find('.headline__buttons-wrap'),
  14.         $buttonParseFile = $headline.find('.js-headline-buttons[data-type="parseFile"]'),
  15.         $userForm = $('#userForm'),
  16.         $userFormElements = $userForm.find('.js-user-form'),
  17.         $userFormFile = $userForm.find('.js-user-form[data-type="file"]'),
  18.         $inputsColumns = $userFormFile.find('.js-input-columns'),
  19.         latestColumns = getItemInLocalStorage('latestColumns') || false,
  20.         $userFormClipboard = $userForm.find('.js-user-form[data-type="clipboard"]'),
  21.         $buttonSendClipboardValues = $userFormClipboard.find('.js-send-clipboard-values'),
  22.         $inputClipboard = $userForm.find('.js-clipboard-input'),
  23.         $tableWrap = $('#tableWrap'),
  24.         $buttonAddToCart = $tableWrap.find('.js-add-to-cart'),
  25.         $buttonMainDelete = $tableWrap.find('.js-main-delete'),
  26.         $buttonCheckItem = $tableWrap.find('.js-check-item'),
  27.         $alerts = $tableWrap.find('#alert'),
  28.         $errorsBlock = $alerts.find('.js-alert-error'),
  29.         $errorsList = $errorsBlock.find('.js-alert-error-list'),
  30.         $warningsBlock = $alerts.find('.js-alert-warning'),
  31.         $warningsList = $warningsBlock.find('.js-alert-warning-list'),
  32.         $table = $('#table'),
  33.         $tableHeader = $table.find('.js-table-header'),
  34.         $buttonMainCheckBox = $tableHeader.find('.js-main-checkbox'),
  35.         $tableBody = $table.find('.js-table-body'),
  36.         $modalSendFile = $('#loadFileModal'),
  37.         $buttonSendFile = $modalSendFile.find('.js-load'),
  38.         $inputFile = $modalSendFile.find('#inputFile'),
  39.         pageContext = $('#pageContextPath').val();
  40.  
  41.     var preloader = {
  42.         hidePreloader: function (element) {
  43.             $(element).preloader('hide');
  44.         },
  45.         showPreloader: function (element, width) {
  46.             $(element).preloader({
  47.                 overlayBackground: 'rgba(255, 255, 255, .6)',
  48.                 showOverlay: true,
  49.                 contentsWidth: width + 'px',
  50.                 contentsHtml: '<img src=" ' + changeStaticLink($('#constantEndecaPath').val() +
  51.                     '/static/img/assets/product-card/preloader.gif') +
  52.                     ' " class="preloader__image" alt="" role="presentation">',
  53.                 delay: 0
  54.             });
  55.         },
  56.         showMsg: function (msg, title, typeValue) {
  57.             var modal = $('#cartModal');
  58.  
  59.             $('#cartBody').html(msg);
  60.             $('#cartTitle').text('Предупреждение');
  61.             modal.attr('data-type', typeValue);
  62.             modal.modal();
  63.  
  64.             setTimeout(function () {
  65.                 $('#cartModal').modal('hide');
  66.             }, 10000);
  67.         }
  68.     };
  69.  
  70.     togglePageContent(getWindowSize());
  71.  
  72.     if (latestColumns) {
  73.         var valueEtmCode = validateColumnsValue(latestColumns.etmCode),
  74.             valueProductCode = validateColumnsValue(latestColumns.code),
  75.             valueClientCode = validateColumnsValue(latestColumns.clientCode),
  76.             valueVendorCode = validateColumnsValue(latestColumns.vendorCode),
  77.             valueQuantity = validateColumnsValue(latestColumns.quantity);
  78.  
  79.         filterInputs($inputsColumns, 'code').val(valueProductCode);
  80.         filterInputs($inputsColumns, 'etm-code').val(valueEtmCode);
  81.         filterInputs($inputsColumns, 'client-code').val(valueClientCode);
  82.         filterInputs($inputsColumns, 'vendor-code').val(valueVendorCode);
  83.         filterInputs($inputsColumns, 'quantity').val(valueQuantity);
  84.     }
  85.  
  86.     $buttonsSwitcher.on('click', function () {
  87.         var $self = $(this),
  88.             type = $self.attr('data-type');
  89.  
  90.         if ($self.hasClass(CLASS_SWITCHER_ACTIVE)) {
  91.             return;
  92.         }
  93.  
  94.         $self.addClass(CLASS_SWITCHER_ACTIVE).siblings().removeClass(CLASS_SWITCHER_ACTIVE);
  95.         $wrapButtonsHeadline.fadeToggle(160);
  96.         toggleUserForm(type);
  97.     });
  98.  
  99.     $buttonParseFile.on('click', function () {
  100.         var MSG_ERROR_COLUMNS = 'Исправьте порядок колонок';
  101.  
  102.         if (!isValidColumnsValues()) {
  103.             showModalWindow(MSG_ERROR_COLUMNS, TITLE_FOR_MODAL_WINDOW);
  104.             return;
  105.         }
  106.  
  107.         $('#loadFileModal').modal('show');
  108.     });
  109.  
  110.     $buttonSendFile.on('click', function () {
  111.         var ERROR_MSG_EMPTY_INPUT_COLUMN = 'Укажите номер столбца для поиска товара.',
  112.             ERROR_MSG_EQUALS_COLUMNS = 'Несколько одинаковых значений не могут находиться в одном столбце.';
  113.         var file = $inputFile.prop('files')[0],
  114.             code = filterInputs($inputsColumns, 'code').val().trim(),
  115.             etmCode = filterInputs($inputsColumns, 'etm-code').val().trim(),
  116.             clientCode = filterInputs($inputsColumns, 'client-code').val().trim(),
  117.             vendorCode = filterInputs($inputsColumns, 'vendor-code').val().trim(),
  118.             quantity = filterInputs($inputsColumns, 'quantity').val().trim(),
  119.             columns = validateColumns(code, etmCode, clientCode, vendorCode, quantity),
  120.             $errorRows = getErrorLines(),
  121.             startNumberRow = getStartNumberRow();
  122.  
  123.         if (!code && !clientCode && !vendorCode && !etmCode) {
  124.             showModalWindow(ERROR_MSG_EMPTY_INPUT_COLUMN, TITLE_FOR_MODAL_WINDOW);
  125.             return;
  126.         }
  127.  
  128.         if (hasEqualValues(columns)) {
  129.             showModalWindow(ERROR_MSG_EQUALS_COLUMNS, TITLE_FOR_MODAL_WINDOW);
  130.             return;
  131.         }
  132.  
  133.         setItemInLocalStorage('latestColumns', columns);
  134.         setLoadingStateButton($buttonParseFile);
  135.         showPreloader();
  136.  
  137.         requestFile(file, columns, startNumberRow).then(
  138.             function success(response) {
  139.                 if (!response.error) {
  140.                     var linesLength = $tableBody.find('.js-table-row').length;
  141.                     if ($errorRows.length === linesLength) {
  142.                         $tableBody.empty();
  143.                     }
  144.                     var items = response.items;
  145.                     showTableRows(items, linesLength);
  146.                     setDefaultStateButton($buttonParseFile);
  147.                     hidePreloader();
  148.                 } else {
  149.                     var text = response.message;
  150.                     if (!isHtml(text)) {
  151.                         showModalWindow(text, TITLE_FOR_MODAL_WINDOW);
  152.                     } else {
  153.                         showModalWindow(
  154.                             'При отправке файла произошла ошибка! Попробуйте позднее или обратитесь в поддержку.',
  155.                             TITLE_FOR_MODAL_WINDOW
  156.                         );
  157.                     }
  158.                     hidePreloader();
  159.                     setDefaultStateButton($buttonParseFile);
  160.                 }
  161.             },
  162.             function error(response) {
  163.                 var text = response.responseText;
  164.                 if (!isHtml(text)) {
  165.                     showModalWindow(text, TITLE_FOR_MODAL_WINDOW);
  166.                 } else {
  167.                     showModalWindow(
  168.                         'При отправке файла произошла ошибка! Попробуйте позднее или обратитесь в поддержку.',
  169.                         TITLE_FOR_MODAL_WINDOW
  170.                     );
  171.                 }
  172.                 hidePreloader();
  173.                 setDefaultStateButton($buttonParseFile);
  174.             }
  175.         );
  176.     });
  177.    
  178.     $('.js-merge-lines').on('click', function () {
  179.         var lines = $tableBody.find('.js-table-row'),
  180.             linesByProductCode = buildLinesByProductCode(lines);
  181.  
  182.         mergeLines(linesByProductCode);
  183.  
  184.         var linesAfterMerge = $tableBody.find('.js-table-row');
  185.  
  186.         setNumberRow(linesAfterMerge);
  187.         toggleWarning(linesAfterMerge);
  188.     });
  189.  
  190.     $inputFile.on('change', function () {
  191.         var file = $(this).prop('files')[0];
  192.  
  193.         if (!file) {
  194.             $buttonSendFile.prop('disabled', true);
  195.         } else {
  196.             $buttonSendFile.prop('disabled', false);
  197.         }
  198.     });
  199.  
  200.     $buttonMainCheckBox.on('change', function () {
  201.         var isChecked = isCheckedCheckbox(this);
  202.  
  203.         if (isChecked) {
  204.             $tableBody.find('.js-table-checkbox:not(:checked)').prop('checked', true);
  205.         } else {
  206.             $tableBody.find('.js-table-checkbox:checked').prop('checked', false);
  207.         }
  208.     });
  209.  
  210.     $buttonMainDelete.on('click', function () {
  211.         var $lines = $tableBody.find('.js-table-row'),
  212.             $checkedLines = getCheckedLines($lines);
  213.  
  214.         if (!$checkedLines.length) {
  215.             showModalWindow(ERROR_MSG_HAS_NOT_CHECKED_ITEMS, TITLE_FOR_MODAL_WINDOW);
  216.             return;
  217.         }
  218.  
  219.         $checkedLines.remove();
  220.         $lines = $tableBody.find('.js-table-row');
  221.  
  222.         if (!$lines.length) {
  223.             $tableWrap.hide();
  224.         }
  225.  
  226.         setNumberRow($lines);
  227.         showErrorMsgess();
  228.         toggleWarning($lines);
  229.     });
  230.  
  231.     $buttonAddToCart.on('click', function () {
  232.         var ERROR_MSG_MAX_LENGTH = 'Число добавляемых позиций не может превышать 500';
  233.         var $lines = $tableBody.find('.js-table-row'),
  234.             $selectedRows = getCheckedLines($lines),
  235.             lengthSelectedRows = $selectedRows.length,
  236.             itemsParams = getParams($selectedRows);
  237.  
  238.         if (!lengthSelectedRows) {
  239.             showModalWindow(ERROR_MSG_HAS_NOT_CHECKED_ITEMS, TITLE_FOR_MODAL_WINDOW);
  240.             return;
  241.         }
  242.  
  243.         if (lengthSelectedRows > MAX_LENGTH_ROW) {
  244.             showModalWindow(ERROR_MSG_MAX_LENGTH, TITLE_FOR_MODAL_WINDOW);
  245.             return;
  246.         }
  247.  
  248.         showPreloader();
  249.         requestAddToCart(itemsParams).then(
  250.             function success(response) {
  251.                 var isSuccess = response.success,
  252.                 errorMsg = response.error || 'При добавлении в корзину произошла ошибка! Попробуйте позднее или обратитесь в поддержку.',
  253.                 data = response.data;
  254.                
  255.                 hidePreloader();
  256.                
  257.                 if (isSuccess) {
  258.                     var products = data || {},
  259.                     yaProducts = [];
  260.  
  261.                     for (var productsKey in products) {
  262.                         var productsByKey = products[productsKey];
  263.  
  264.                         productsByKey.forEach(function (product) {
  265.                             yaProducts.push(buildYaProduct(
  266.                                     product.id,
  267.                                     validateStringLength(product.description, 50),
  268.                                     0,
  269.                                     product.brand,
  270.                                     product.quantity
  271.                             ));
  272.                         });
  273.                     }
  274.                     pushElementToDataLayerForAddingElements(yaProducts);
  275.  
  276.                     window.location.href = pageContext + '/cart.htm';
  277.                 } else if (data) {
  278.                     updateLines($lines, data);
  279.                     return;
  280.                 } else {
  281.                     showModalWindow(errorMsg, TITLE_FOR_MODAL_WINDOW);
  282.                     return;
  283.                 }
  284.             });
  285.     });
  286.  
  287.     $buttonCheckItem.on('click', function () {
  288.         var $lines = $tableBody.find('.js-table-row'),
  289.             $checkedLines = getCheckedLines($lines),
  290.             products = getParams($checkedLines),
  291.             numberRowsNotValidProduct = getNumberRowNotValidProducts(products);
  292.  
  293.         if (!$checkedLines.length) {
  294.             showModalWindow(ERROR_MSG_HAS_NOT_CHECKED_ITEMS, TITLE_FOR_MODAL_WINDOW);
  295.             return;
  296.         }
  297.  
  298.         if (numberRowsNotValidProduct.length) {
  299.             showModalWindow(buildEmptyRowsMsg(numberRowsNotValidProduct), TITLE_FOR_MODAL_WINDOW);
  300.             return;
  301.         }
  302.  
  303.         showPreloader();
  304.  
  305.         requestSendClipboardValues(products).then(
  306.             function success(response) {
  307.                 if (!response.error) {
  308.                     var $lines = $tableBody.find('.js-table-row');
  309.                     var items = response.items;
  310.                     updateLines($lines, items);
  311.                     setNumberRow($tableBody.find('.js-table-row'));
  312.                     hidePreloader();
  313.                 } else {
  314.                     hidePreloader();
  315.                     var text = response.message;
  316.                     if (!isHtml(text)) {
  317.                         showModalWindow(text, TITLE_FOR_MODAL_WINDOW);
  318.                     } else {
  319.                         showModalWindow('При проверке позиций произошла ошибка! Попробуйте позднее или обратитесь в поддержку.', TITLE_FOR_MODAL_WINDOW);
  320.                     }    
  321.                 }
  322.  
  323.             },
  324.             function error(response) {
  325.                 hidePreloader();
  326.                 var text = response.responseText;
  327.                 if (!isHtml(text)) {
  328.                     showModalWindow(text, TITLE_FOR_MODAL_WINDOW);
  329.                 } else {
  330.                     showModalWindow('При проверке позиций произошла ошибка! Попробуйте позднее или обратитесь в поддержку.', TITLE_FOR_MODAL_WINDOW);
  331.                 }
  332.             }
  333.         );
  334.     });
  335.  
  336.     $buttonSendClipboardValues.on('click', function () {
  337.         var clipboardValues = $inputClipboard.val().trim(),
  338.             selectedType = $userFormClipboard.find('.js-clipboard-radio:checked').attr('data-type'),
  339.             $lines = $tableBody.find('.js-table-row'),
  340.             $errorRows = getErrorLines(),
  341.             params = parseClipboardValues(clipboardValues, selectedType);
  342.  
  343.         $inputClipboard.removeClass('border-red');
  344.  
  345.         setLoadingStateButton($buttonSendClipboardValues);
  346.         showPreloader();
  347.  
  348.         requestSendClipboardValues(params).then(
  349.             function success(response) {
  350.                 if (!response.error) {
  351.                     if ($errorRows.length === $lines.length) {
  352.                         $tableBody.empty();
  353.                     }
  354.                     var listRows = response.items;
  355.                     showTableRows(listRows, $lines.length);
  356.                     setDefaultStateButton($buttonSendClipboardValues);
  357.                     hidePreloader();
  358.                 } else {
  359.                     hidePreloader();
  360.                     var text = response.message;
  361.                     if (!isHtml(text)) {
  362.                         showModalWindow(text, TITLE_FOR_MODAL_WINDOW);
  363.                     } else {
  364.                         showModalWindow('При проверке позиций произошла ошибка! Попробуйте позднее или обратитесь в поддержку.', TITLE_FOR_MODAL_WINDOW);
  365.                     }    
  366.                 }
  367.             },
  368.             function error(response) {
  369.                 hidePreloader();
  370.                 setDefaultStateButton($buttonSendClipboardValues);
  371.                 var text = response.responseText;
  372.                 if (!isHtml(text)) {
  373.                     showModalWindow(text, TITLE_FOR_MODAL_WINDOW);
  374.                 } else {
  375.                     showModalWindow('При отправке позиций произошла ошибка! Попробуйте позднее или обратитесь в поддержку.', TITLE_FOR_MODAL_WINDOW);
  376.                 }
  377.             });
  378.     });
  379.  
  380.     $tableBody.on('change', '.js-select-box', function () {
  381.         var $self = $(this),
  382.             $row = $self.closest('.js-table-row'),
  383.             selectedUomCode = $self.find('option:selected').attr('data-code');
  384.  
  385.         $row.attr('data-uom-id', selectedUomCode);
  386.     });
  387.  
  388.     $tableBody.on('change', '.js-table-checkbox', function () {
  389.         toggleMainCheckBox();
  390.     });
  391.  
  392.     $tableBody.on('click', '.js-table-delete-row', function () {
  393.         var $self = $(this),
  394.             $row = $self.closest('.js-table-row');
  395.  
  396.         $row.remove();
  397.         var $lines = $tableBody.find('.js-table-row');
  398.  
  399.         if (!$lines.length) {
  400.             $tableWrap.hide();
  401.         }
  402.  
  403.         setNumberRow($lines);
  404.         showErrorMsgess();
  405.         toggleWarning($lines);
  406.     });
  407.  
  408.     $userFormFile.on('input', '.js-input-columns', function () {
  409.         var $self = $(this),
  410.             value = $self.val();
  411.  
  412.         $self.val(validateNumber(value));
  413.     });
  414.  
  415.     $tableBody.on('input', '.js-table-input', function () {
  416.         var $self = $(this),
  417.             type = $self.attr('data-type'),
  418.             $row = $self.closest('.js-table-row');
  419.  
  420.         if (type === 'quantity' || type === 'code') {
  421.             $self.val(validateNumber($self.val()));
  422.         }
  423.  
  424.         $row.attr('data-' + type, $self.val());
  425.     });
  426.  
  427.     $(window).on('resize', function () {
  428.         togglePageContent(getWindowSize());
  429.     });
  430.  
  431.     function mergeLines(linesByProductCode) {
  432.         for (var productCode in linesByProductCode) {
  433.             var linesList = linesByProductCode[productCode] || [];
  434.  
  435.             if (linesList.length <= 1) {
  436.                 continue;
  437.             }
  438.  
  439.             var quantity = calculateLinesQuantity(linesList),
  440.                 linesForDelete = linesList.slice(1, linesList.length);
  441.  
  442.             $(linesList[0])
  443.                 .attr('data-quantity', quantity)
  444.                 .find('.js-table-input[data-type="quantity"]')
  445.                 .val(quantity);
  446.             deleteLines(linesForDelete);
  447.         }
  448.     }
  449.  
  450.     function deleteLines(lines) {
  451.         lines.forEach(function (line) {
  452.             $(line).remove();
  453.         });
  454.     }
  455.  
  456.     function calculateLinesQuantity(lines) {
  457.         return lines.reduce(function (sum, line) {
  458.             var lineQuantity = Number($(line).find('.js-table-input[data-type="quantity"]').val().trim()) || 1;
  459.             return sum + lineQuantity;
  460.         }, 0);
  461.     }
  462.  
  463.     function buildLinesByProductCode(lines) {
  464.         return lines.toArray().reduce(function (part, line) {
  465.             var productCode = $(line).attr('data-code'),
  466.                 linesList = part[productCode];
  467.  
  468.             if (linesList) {
  469.                 linesList.push(line);
  470.             } else {
  471.                 part[productCode] = [line];
  472.             }
  473.  
  474.             return part;
  475.         }, {});
  476.     }
  477.  
  478.     function updateLines($linesForUpdate, newLines) {
  479.         for (var numberRow in newLines) {
  480.             var linesForRow = newLines[numberRow],
  481.                 html = '';
  482.  
  483.             linesForRow.forEach(function (item) {
  484.                 html += getTableRow(numberRow, item.clientCode, item.vendorCode,
  485.                     item.code, item.uoms, item.link,
  486.                     item.description, item.quantity, item.balance, item.outOfStock,
  487.                     item.multiplicity, item.analyticalCategory, item.selectedUomCode,
  488.                     item.hasError, item.hasEqualCodes, item.id, item.errorMsg,
  489.                     item.etmCode);
  490.             });
  491.  
  492.             $linesForUpdate.eq(--numberRow).replaceWith(html);
  493.         }
  494.  
  495.         initStyleElement();
  496.  
  497.         var $lines = $tableBody.find('.js-table-row');
  498.  
  499.         toggleMainCheckBox();
  500.         $tableWrap.show();
  501.         showErrorMsgess();
  502.         toggleWarning($lines);
  503.     }
  504.  
  505.     function getEmptyCellsMsg(numberRow) {
  506.         return '<div>Строка ' + numberRow + ' : Укажите хотя бы 1 столбец для проверки позиции.</div>';
  507.     }
  508.  
  509.     function filterInputs($inputs, type) {
  510.         return $inputs.filter('[data-type="' + type + '"]');
  511.     }
  512.  
  513.     function validateNumber(value) {
  514.         if (!value) {
  515.             return null;
  516.         }
  517.         return value.replace(/\D/g, '');
  518.     }
  519.  
  520.     function hasEqualValues(object) {
  521.         var values = getObjectValues(object);
  522.         return values.some(function (element) {
  523.             return element !== null && values.indexOf(element) !== values.lastIndexOf(element);
  524.         });
  525.     }
  526.  
  527.     function getObjectValues(object) {
  528.         var values = [];
  529.  
  530.         for (var key in object) {
  531.             values.push(object[key]);
  532.         }
  533.  
  534.         return values;
  535.     }
  536.  
  537.     function getStartNumberRow() {
  538.         return ++$tableBody.find('.js-table-row').length;
  539.     }
  540.  
  541.     function getWindowSize() {
  542.         return $(window).width();
  543.     }
  544.  
  545.     function togglePageContent(windowSize) {
  546.         var MIN_WINDOW_SIZE_FOR_CONTENT = 768;
  547.  
  548.         if (windowSize < MIN_WINDOW_SIZE_FOR_CONTENT) {
  549.             $mobileContent.show();
  550.             $headline.hide();
  551.             $switcher.hide();
  552.             $wrapper.hide();
  553.         } else {
  554.             $mobileContent.hide();
  555.             $headline.show();
  556.             $switcher.show();
  557.             $wrapper.show();
  558.         }
  559.     }
  560.  
  561.     function validateErrorMsg(message) {
  562.         if (!message.includes('Снятый')) {
  563.             return message;
  564.         }
  565.  
  566.         var SEPARATOR = '.';
  567.         var msgElements = message.split(SEPARATOR);
  568.  
  569.         return msgElements[0] + msgElements[1];
  570.     }
  571.  
  572.     function validateColumnsValue(value) {
  573.         if (value === null) {
  574.             return '';
  575.         }
  576.         return ++value || '';
  577.     }
  578.  
  579.     function showTableRows(items, startNumberRow) {
  580.         $tableBody.append(getHtmlRows(items, startNumberRow));
  581.         initStyleElement();
  582.  
  583.         var $lines = $tableBody.find('.js-table-row');
  584.  
  585.         toggleMainCheckBox();
  586.         $tableWrap.show();
  587.         showErrorMsgess();
  588.         toggleWarning($lines);
  589.     }
  590.  
  591.     function isValidColumnsValues() {
  592.         var notValidColumns = $userFormFile.find('.js-input-columns.border-red');
  593.         return notValidColumns.length === 0;
  594.     }
  595.  
  596.     function toggleWarning($lines) {
  597.         var linesWithEqualCodes = $lines.filter('[data-equal-codes="true"]'),
  598.             html = '',
  599.             uniqueMsgs = {};
  600.  
  601.         if (!linesWithEqualCodes.length) {
  602.             $warningsBlock.hide();
  603.             return;
  604.         }
  605.  
  606.         linesWithEqualCodes.each(function (index, element) {
  607.             var msg = $(element).attr('data-error-msg');
  608.  
  609.             uniqueMsgs[msg] = '';
  610.         });
  611.  
  612.         Object.keys(uniqueMsgs).forEach(function (msg) {
  613.             html += getHtmlWarningItem(msg);
  614.         });
  615.  
  616.         $warningsList.html(html);
  617.         $warningsBlock.show();
  618.     }
  619.  
  620.     function showErrorMsgess() {
  621.         var $errorLines = getErrorLines();
  622.  
  623.         $errorsList.empty();
  624.  
  625.         if (!$errorLines.length) {
  626.             $errorsBlock.hide();
  627.             return;
  628.         }
  629.  
  630.         createErrorRows($errorLines);
  631.         $errorsBlock.show();
  632.     }
  633.  
  634.     function createErrorRows(rows) {
  635.         var html = '';
  636.  
  637.         $(rows).each(function (indexRow, row) {
  638.             var $row = $(row),
  639.                 numberRow = $row.find('.js-table-number-row').text(),
  640.                 errMsg = validateErrorMsg($row.attr('data-error-msg'));
  641.  
  642.             html += getHtmlErrorRow(numberRow, errMsg);
  643.         });
  644.  
  645.         $errorsList.append(html);
  646.     }
  647.  
  648.     function getErrorLines() {
  649.         return $tableBody.find('.js-table-row[data-has-error="true"]');
  650.     }
  651.  
  652.     function getHtmlErrorRow(numberRow, errorMsg) {
  653.         return '<div data-number-row="' + numberRow + '" class="js-alerts-error-row alerts__errors-item alerts__errors-item_dec">' +
  654.             '<span class="alerts__errors-number-row alerts__errors-number-row_dec">Строка <span class="js-alert-error-number-row">' + numberRow + '</span> : </span>' +
  655.             '<span class="alerts__errors-text alerts__errors-text_dec"> ' + errorMsg + '</span>' +
  656.             '</div>';
  657.     }
  658.  
  659.     function setLoadingStateButton(button) {
  660.         $(button).button('loading');
  661.     }
  662.  
  663.     function setDefaultStateButton(button) {
  664.         $(button).button('reset');
  665.     }
  666.  
  667.     function parseClipboardValues(value, columnName) {
  668.         var REG_EXP_LINE_BREAK = /\n/g;
  669.         var rows = value.split(REG_EXP_LINE_BREAK),
  670.             $lines = $tableBody.find('.js-table-row'),
  671.             length = $lines.length,
  672.             parseResult = [];
  673.  
  674.         rows.forEach(function (row) {
  675.             var rowTrimmed = row.trim(),
  676.                 clipboardRow = parseClipboardRow(rowTrimmed, columnName);
  677.  
  678.             parseResult.push(buildItem(++length,
  679.                 clipboardRow.code, clipboardRow.clientCode,
  680.                 clipboardRow.vendorCode, clipboardRow.etmCode,
  681.                 null, clipboardRow.quantity));
  682.         });
  683.  
  684.         return parseResult;
  685.     }
  686.  
  687.     function parseClipboardRow(row, columnName) {
  688.         var REG_EXP_TAB = /\t+/g,
  689.             REG_EXP_SPACE = /\s+/g;
  690.  
  691.         if (isFoundSymbolInString(row, REG_EXP_TAB)) {
  692.             return parseForSeveralColumns(row, REG_EXP_TAB, columnName);
  693.         }
  694.  
  695.         if (isFoundSymbolInString(row, REG_EXP_SPACE)) {
  696.             return parseForSeveralColumns(row, REG_EXP_SPACE, columnName);
  697.         }
  698.  
  699.         return parseForOneColumn(row, columnName);
  700.     }
  701.  
  702.     function isFoundSymbolInString(string, regExp) {
  703.         return string.match(regExp) !== null;
  704.     }
  705.  
  706.     function parseForSeveralColumns(string, separator, columnName) {
  707.         var stringItems = string.split(separator),
  708.             lengthItems = getLengthPrimitive(stringItems),
  709.             lastItem = stringItems[lengthItems - 1],
  710.             values = {};
  711.  
  712.         if (lengthItems === 2 && !isNumber(stringItems[1])) {
  713.             values[columnName] = stringItems.join(" ");
  714.             values.quantity = "1";
  715.  
  716.             return values;
  717.         }
  718.  
  719.         if (lengthItems === 2) {
  720.             values[columnName] = stringItems[0];
  721.             values.quantity = stringItems[1];
  722.  
  723.             return values;
  724.         }
  725.  
  726.         if (stringItems.length > 2 && !isNumber(lastItem)) {
  727.             values[columnName] = stringItems.join(" ");
  728.             values.quantity = "1";
  729.  
  730.             return values;
  731.         }
  732.  
  733.  
  734.         if (stringItems.length > 2 && isNumber(lastItem)) {
  735.             values[columnName] = stringItems.slice(0, lengthItems - 1).join(" ");
  736.             values.quantity = lastItem;
  737.         }
  738.  
  739.         return values;
  740.     }
  741.  
  742.     function parseForOneColumn(string, columnName) {
  743.         var values = {};
  744.         values[columnName] = string;
  745.         return values;
  746.     }
  747.  
  748.     function getParams($selectedLines) {
  749.         var params = [];
  750.  
  751.         $selectedLines.each(function (index, line) {
  752.             params.push(buildItemFromDomLine($(line)));
  753.         });
  754.  
  755.         return params;
  756.     }
  757.  
  758.     function getNumberRowNotValidProducts(products) {
  759.         var numberRows = [];
  760.  
  761.         products.forEach(function (product) {
  762.             if (product.code === null && product.clientCode === null && product.vendorCode === null && product.etmCode === null) {
  763.                 numberRows.push(product.numberRow);
  764.             }
  765.         });
  766.  
  767.         return numberRows;
  768.     }
  769.  
  770.     function buildEmptyRowsMsg(numberRows) {
  771.         var text = '';
  772.  
  773.         numberRows.forEach(function (numberRow) {
  774.             text += getEmptyCellsMsg(numberRow);
  775.         });
  776.  
  777.         return text;
  778.     }
  779.  
  780.     function buildItemFromDomLine($line) {
  781.         var numberRow = $line.attr('data-number-row') || null,
  782.             code = $line.attr('data-code') || null,
  783.             clientCode = $line.attr('data-client-code') || null,
  784.             vendorCode = $line.attr('data-vendor-code') || null,
  785.             etmCode = $line.attr('data-etm-code') || null,
  786.             selectedUomCode = $line.attr('data-uom-id') || null,
  787.             quantity = $line.attr('data-quantity') || null;
  788.  
  789.         return buildItem(numberRow, code, clientCode, vendorCode, etmCode, selectedUomCode, quantity);
  790.     }
  791.  
  792.     function getCheckedLines($lines) {
  793.         return $lines.find('.js-table-checkbox:checked').closest('.js-table-row');
  794.     }
  795.  
  796.     function setNumberRow($lines) {
  797.         var startNumberRow = 0;
  798.  
  799.         $lines.find('.js-table-number-row').text(function (index, value) {
  800.             var $line = $lines.eq(index),
  801.                 numberRow = ++startNumberRow;
  802.  
  803.             $line.attr('data-number-row', numberRow);
  804.  
  805.             return numberRow;
  806.         });
  807.     }
  808.  
  809.     function getLengthCollection(element) {
  810.         return $(element).length;
  811.     }
  812.  
  813.     function getLengthPrimitive(value) {
  814.         return value.length;
  815.     }
  816.  
  817.     function isCheckedCheckbox(element) {
  818.         return $(element).prop('checked');
  819.     }
  820.  
  821.     function getMultiplicity(multiplicity, analyticalCategory) {
  822.         var CATEGORY_ORDERED = 'Заказной';
  823.         return CATEGORY_ORDERED === analyticalCategory && isValidMultiplicity(multiplicity) ? multiplicity : '';
  824.     }
  825.  
  826.     function isValidMultiplicity(value) {
  827.         return value && Number(value) !== 1;
  828.     }
  829.  
  830.     function getBalance(balance) {
  831.         return balance >= 0 ? balance : '';
  832.     }
  833.  
  834.     function validateColumns(productCode, etmCode, clientCode, vendorCode, quantity) {
  835.         return {
  836.             'code': productCode ? --productCode : null,
  837.             'etmCode': etmCode ? --etmCode : null,
  838.             'clientCode': clientCode ? --clientCode : null,
  839.             'vendorCode': vendorCode ? --vendorCode : null,
  840.             'quantity': quantity ? --quantity : null
  841.         };
  842.     }
  843.  
  844.     function toggleMainCheckBox() {
  845.         var rowsLength = getLengthCollection($tableBody.find('.js-table-row')),
  846.             checkedCheckBoxesLength = getLengthCollection($tableBody.find('.js-table-checkbox:checked'));
  847.  
  848.         return rowsLength === checkedCheckBoxesLength ? $buttonMainCheckBox.prop('checked', true) : $buttonMainCheckBox.prop('checked', false);
  849.     }
  850.  
  851.     function toggleUserForm(dataType) {
  852.         $userFormElements.removeClass(CLASS_USER_FORM_ACTIVE);
  853.         $userForm.find('.js-user-form[data-type=' + dataType + ']').addClass(CLASS_USER_FORM_ACTIVE);
  854.     }
  855.  
  856.     function setItemInLocalStorage(key, value) {
  857.         localStorage.setItem(key, JSON.stringify(value));
  858.     }
  859.  
  860.     function getItemInLocalStorage(key) {
  861.         return JSON.parse(localStorage.getItem(key));
  862.     }
  863.  
  864.     function getSelectBox(uoms, selectedUom) {
  865.         if (!uoms) {
  866.             return '';
  867.         }
  868.  
  869.         return uoms.length > 1 ? getHtmlSelectBox(uoms, selectedUom) : getHtmlDisabledSelectBox(uoms);
  870.     }
  871.  
  872.     function validateValue(value) {
  873.         return value || '';
  874.     }
  875.  
  876.     function getHtmlDisabledSelectBox(uoms) {
  877.         return '<label class="table__row-label table__row-label_dec">' +
  878.             '<select disabled class="js-styled-select SumoUnder" tabindex="-1">' +
  879.             getOptions(uoms) +
  880.             '</select>' +
  881.             '</label>';
  882.     }
  883.  
  884.     function getHtmlSelectBox(uoms, selectedUom) {
  885.         return '<label class="table__row-label table__row-label_dec">' +
  886.             '<select data-type="active" class="js-select-box js-styled-select SumoUnder" tabindex="-1">' +
  887.             getOptions(uoms, selectedUom) +
  888.             '</select>' +
  889.             '</label>';
  890.     }
  891.  
  892.     function getOptions(uoms, selectedUom) {
  893.         var options = '';
  894.  
  895.         uoms.forEach(function (uom) {
  896.             var isSelectedUom = selectedUom === uom.uomCode;
  897.  
  898.             options += getHtmlOption(uom.uomCode, uom.uomName, isSelectedUom);
  899.         });
  900.  
  901.         return options;
  902.     }
  903.  
  904.     function getHtmlOption(code, value, selected) {
  905.         if (selected) {
  906.             return '<option selected data-code="' + code + '">' + value + '</option>';
  907.         }
  908.         return '<option data-code="' + code + '">' + value + '</option>';
  909.     }
  910.  
  911.     function getHtmlInput(value, type) {
  912.         return '<label class="table__row-label  table__row-label_dec">' +
  913.             '<input data-type="' + type + '" type="text" value="' + validateValue(value) + '" class="js-table-input table__row-input table__row-input_dec">' +
  914.             '</label>';
  915.     }
  916.  
  917.     function getHtmlRows(items, startNumberRow) {
  918.         var html = '';
  919.  
  920.         for (var numberRow in items) {
  921.             var rowItems = items[numberRow];
  922.  
  923.             rowItems.forEach(function (item) {
  924.  
  925.                 html += getTableRow(++startNumberRow, item.clientCode, item.vendorCode,
  926.                     item.code, item.uoms, item.link,
  927.                     item.description, item.quantity, item.balance, item.outOfStock,
  928.                     item.multiplicity, item.analyticalCategory, item.selectedUomCode,
  929.                     item.hasError, item.hasEqualCodes, item.id, item.errorMsg,
  930.                     item.etmCode);
  931.             });
  932.         }
  933.  
  934.         return html;
  935.     }
  936.  
  937.     function getHtmlCheckbox() {
  938.         return '<label class="check table__row-label-checkbox  table__row-label-checkbox_dec">' +
  939.             '<input checked type="checkbox" class="js-table-checkbox table__row-checkbox table__row-checkbox_dec">' +
  940.             '<span></span>' +
  941.             '</label>';
  942.     }
  943.  
  944.     function showModalWindow(text, title) {
  945.         preloader.showMsg(text, title);
  946.     }
  947.  
  948.     function hidePreloader() {
  949.         $('#resultPreloader').hide();
  950.     }
  951.  
  952.     function showPreloader() {
  953.         $('#resultPreloader').show();
  954.     }
  955.  
  956.     function getClassEqualsRow(hasEqualsVendorCode) {
  957.         return hasEqualsVendorCode ? 'info' : '';
  958.     }
  959.  
  960.     function getClassErrorRow(rowHasError) {
  961.         return rowHasError ? 'danger' : '';
  962.     }
  963.  
  964.     function getBackgroundLine(hasError, hasEqualCodes) {
  965.         return hasError ? getClassErrorRow(hasError) : getClassEqualsRow(hasEqualCodes);
  966.     }
  967.  
  968.     function getHtmlLink(link, description) {
  969.         if (!link || !description) {
  970.             return '';
  971.         }
  972.  
  973.         return '<a target="_blank" href="' + pageContext + link + '" title="' + description + '" class="table__row-link table__row-link_dec">' +
  974.             description +
  975.             '</a>';
  976.     }
  977.  
  978.     function isNumber(value) {
  979.         console.log(value);
  980.         return !isNaN(parseFloat(value)) && isFinite(value) && !~value.indexOf('-') && !~value.indexOf('+');
  981.     }
  982.  
  983.     function isHtml(value) {
  984.         return value.startsWith('<!DOCTYPE');
  985.     }
  986.  
  987.     function getHtmlWarningItem(msg) {
  988.         return '<div class="alerts__warnings-item alerts__warnings-item_dec">' +
  989.             msg +
  990.             '</div>';
  991.     }
  992.  
  993.     function getTableRow(numberRow, clientCode, vendorCode,
  994.                          code, uoms, link,
  995.                          description, quantity, balance, outOfStock,
  996.                          multiplicity, analyticalCategory, selectedUom,
  997.                          hasError, hasEqualCodes, productId, errorMsg, etmCode) {
  998.         return '<tr data-number-row="' + numberRow + '" data-has-error="' + validateValue(hasError) + '" data-quantity="' + validateValue(quantity) + '"  ' +
  999.             'data-uom-id="' + validateValue(selectedUom) + '" data-product-id="' + validateValue(productId) + '" ' +
  1000.             'data-equal-codes="' + validateValue(hasEqualCodes) + '" ' +
  1001.             'data-etm-code="' + validateValue(etmCode) + '" ' +
  1002.             'data-code="' + validateValue(code) + '" ' + 'data-client-code="' + validateValue(clientCode) + '" ' +
  1003.             'data-vendor-code="' + validateValue(vendorCode) + '" ' + 'data-error-msg=\'' + validateValue(errorMsg) + '\' ' +
  1004.             'class="js-table-row row table__row table__row_dec ' + getBackgroundLine(hasError, hasEqualCodes) + '">' +
  1005.             '<td class="js-table-number-row col-sm-1 col-md-1 table__row-item table__row-item_dec">' +
  1006.             numberRow +
  1007.             '</td>' +
  1008.             '<td class="col-sm-1 col-md-1 table__row-item table__row-item_dec">' +
  1009.             getHtmlCheckbox() +
  1010.             '</td>' +
  1011.             '<td class="col-sm-1 col-md-1 table__row-item table__row-item_dec">' +
  1012.             getHtmlInput(clientCode, 'client-code') +
  1013.             '</td>' +
  1014.             '<td class="col-sm-1 col-md-1 table__row-item table__row-item_dec">' +
  1015.             getHtmlInput(vendorCode, 'vendor-code') +
  1016.             '</td>' +
  1017.             '<td class="col-sm-1 col-md-1 table__row-item table__row-item_dec">' +
  1018.             getHtmlInput(code, 'code') +
  1019.             '</td>' +
  1020.             '<td class="col-sm-1 col-md-1 table__row-item table__row-item_dec">' +
  1021.             getHtmlInput(etmCode, 'etm-code') +
  1022.             '</td>' +
  1023.             '<td class="js-table-selectbox col-sm-1 col-md-1 table__row-item table__row-item_dec">' +
  1024.             getSelectBox(uoms, selectedUom) +
  1025.             '</td>' +
  1026.             '<td class="col-sm-2 col-md-2 table__row-item table__row-item_dec">' +
  1027.             '<div class="js-table-link table__row-link-wrap table__row-link-wrap_dec">' +
  1028.             getHtmlLink(link, description) +
  1029.             '</div>' +
  1030.             '</td>' +
  1031.             '<td class="col-sm-1 col-md-1 table__row-item table__row-item_dec">' +
  1032.             getHtmlInput(quantity, 'quantity') +
  1033.             '</td>' +
  1034.             (outOfStock === 'N' ?
  1035.             '<td class="js-table-balance col-sm-1 col-md-1 table__row-item table__row-item_dec"' +
  1036.                 ' colspan="2" style="font-weight: bold; font-size: 16px;">' +
  1037.                     'Нет в продаже' +
  1038.             '</td>'
  1039.             :
  1040.             '<td class="js-table-balance col-sm-1 col-md-1 table__row-item table__row-item_dec">' +
  1041.             getBalance(balance) +
  1042.             '</td>' +
  1043.             '<td class="js-table-multiplicity col-sm-1 col-md-1 table__row-item table__row-item_dec">' +
  1044.             getMultiplicity(multiplicity, analyticalCategory) +
  1045.             '</td>'
  1046.             ) +
  1047.             '<td class="col-sm-1 col-md-1 table__row-item table__row-item_dec">' +
  1048.             '<button type="button" class="js-table-delete-row table__row-icon table__row-icon_dec">' +
  1049.             '&#x75;' +
  1050.             '</button>' +
  1051.             '</td>' +
  1052.             '</tr>';
  1053.     }
  1054.  
  1055.     function buildItem(numberRow, code, clientCode, vendorCode, etmCode, selectedUomCode, quantity) {
  1056.         var validQuantity = quantity || 1;
  1057.  
  1058.         if (clientCode) {
  1059.             return {
  1060.                 'numberRow': numberRow,
  1061.                 'code': null,
  1062.                 'clientCode': clientCode,
  1063.                 'vendorCode': null,
  1064.                 'etmCode': null,
  1065.                 'selectedUomCode': selectedUomCode,
  1066.                 'quantity': validQuantity
  1067.             };
  1068.         }
  1069.  
  1070.         if (code) {
  1071.             return {
  1072.                 'numberRow': numberRow,
  1073.                 'code': code,
  1074.                 'clientCode': null,
  1075.                 'vendorCode': null,
  1076.                 'etmCode': null,
  1077.                 'selectedUomCode': selectedUomCode,
  1078.                 'quantity': validQuantity
  1079.             };
  1080.         }
  1081.  
  1082.         if (vendorCode) {
  1083.             return {
  1084.                 'numberRow': numberRow,
  1085.                 'code': null,
  1086.                 'clientCode': null,
  1087.                 'vendorCode': vendorCode,
  1088.                 'etmCode': null,
  1089.                 'selectedUomCode': selectedUomCode,
  1090.                 'quantity': validQuantity
  1091.             };
  1092.         }
  1093.  
  1094.         if (etmCode) {
  1095.             return {
  1096.                 'numberRow': numberRow,
  1097.                 'code': null,
  1098.                 'clientCode': null,
  1099.                 'vendorCode': null,
  1100.                 'etmCode': etmCode,
  1101.                 'selectedUomCode': selectedUomCode,
  1102.                 'quantity': validQuantity
  1103.             };
  1104.         }
  1105.  
  1106.         return {
  1107.             'numberRow': numberRow,
  1108.             'code': null,
  1109.             'clientCode': null,
  1110.             'vendorCode': null,
  1111.             'etmCode': null,
  1112.             'selectedUomCode': selectedUomCode,
  1113.             'quantity': validQuantity
  1114.         }
  1115.     }
  1116.  
  1117.     function requestFile(file, columns, startNumberRow) {
  1118.         return new Promise(function (resolve, reject) {
  1119.             var formData = new FormData;
  1120.  
  1121.             formData.append('columns', JSON.stringify(columns));
  1122.             formData.append('file', file);
  1123.             formData.append('startNumberRow', JSON.stringify(startNumberRow));
  1124.  
  1125.             $.ajax({
  1126.                 method: "POST",
  1127.                 url: '/positionEntryFile',
  1128.                 processData: false,
  1129.                 contentType: false,
  1130.                 enctype: 'multipart/form-data',
  1131.                 data: formData,
  1132.                 success: function (data) {
  1133.                     resolve(tryParseJSON(data));
  1134.                 },
  1135.                 error: function (response) {
  1136.                     reject(response);
  1137.                 }
  1138.             });
  1139.         });
  1140.     }
  1141.  
  1142.     function requestAddToCart(items) {
  1143.         return new Promise(function (resolve, reject) {
  1144.             $.ajax({
  1145.                 method: "POST",
  1146.                 url: '/positionEntryAddToCart',
  1147.                 data: 'items=' + JSON.stringify(items),
  1148.                 success: function (data) {
  1149.                     resolve(tryParseJSON(data));
  1150.                 },
  1151.                 error: function (response) {
  1152.                     reject(response);
  1153.                 }
  1154.             });
  1155.         });
  1156.     }
  1157.  
  1158.     function requestSendClipboardValues(params) {
  1159.         return new Promise(function (resolve, reject) {
  1160.             $.ajax({
  1161.                 method: "POST",
  1162.                 url: '/positionEntrySearchItem',
  1163.                 data: 'items=' + JSON.stringify(params),
  1164.                 success: function (response) {
  1165.                     resolve(tryParseJSON(response));
  1166.                 },
  1167.                 error: function (response) {
  1168.                     reject(response);
  1169.                 }
  1170.             });
  1171.         });
  1172.     }
  1173. });
Add Comment
Please, Sign In to add comment