diff --git a/controllers/store/__pycache__/product_permutation.cpython-312.pyc b/controllers/store/__pycache__/product_permutation.cpython-312.pyc index 09bc7ab5..5b4c8733 100644 Binary files a/controllers/store/__pycache__/product_permutation.cpython-312.pyc and b/controllers/store/__pycache__/product_permutation.cpython-312.pyc differ diff --git a/static/MySQL/6500_p_shop_calc_user.sql b/static/MySQL/6500_p_shop_calc_user.sql index 98dc5680..91f4421f 100644 --- a/static/MySQL/6500_p_shop_calc_user.sql +++ b/static/MySQL/6500_p_shop_calc_user.sql @@ -587,6 +587,15 @@ CALL partsltd_prod.p_shop_calc_user ( , '1,2,3,4,5' , 0 ); +CALL partsltd_prod.p_shop_calc_user ( + 'chips ' + , 1 + , 0 + , '2' + , '1' + , NULL + , 0 +); SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE GUID = 'chips '; DELETE FROM partsltd_prod.Shop_Calc_User_Temp WHERE GUID = 'chips '; diff --git a/static/MySQL/7206_p_shop_save_product_permutation.sql b/static/MySQL/7206_p_shop_save_product_permutation.sql index aa61e81c..51a3e326 100644 --- a/static/MySQL/7206_p_shop_save_product_permutation.sql +++ b/static/MySQL/7206_p_shop_save_product_permutation.sql @@ -457,7 +457,7 @@ BEGIN ; END IF; - IF EXISTS (SELECT * FROM partsltd_prod.Shop_User_Eval_Temp WHERE ISNULL(id_product) AND GUID = a_guid AND can_edit = 0) THEN + IF EXISTS (SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE ISNULL(id_product) AND GUID = a_guid AND can_edit = 0) THEN DELETE FROM tmp_Msg_Error WHERE id_type <> v_id_type_error_no_permission ; diff --git a/static/MySQL/7206_p_shop_save_product_permutation_test.sql b/static/MySQL/7206_p_shop_save_product_permutation_test.sql index 3ce60a20..cfa06e27 100644 --- a/static/MySQL/7206_p_shop_save_product_permutation_test.sql +++ b/static/MySQL/7206_p_shop_save_product_permutation_test.sql @@ -96,7 +96,7 @@ BEGIN -1 -- id_permutation , 1 -- id_product , '1:3' -- csv_id_pairs_variation - , 'Test with variations' -- description + , 'Good Green' -- description , NULL -- cost_local_VAT_excl , NULL -- cost_local_VAT_incl , 1 -- id_currency_cost @@ -147,7 +147,6 @@ BEGIN END // DELIMITER ;; -/* CALL partsltd_prod.p_shop_save_product_permutation_test (); DELETE FROM partsltd_prod.Shop_Product_Permutation_Temp; @@ -155,6 +154,7 @@ DELETE FROM partsltd_prod.Shop_Product_Permutation_Temp; DROP TABLE IF EXISTS tmp_Msg_Error; +/* DELETE FROM partsltd_prod.Shop_Product_Permutation_Variation_Link WHERE id_link >= 3 ; diff --git a/static/css/main.css b/static/css/main.css index 9c1ac85d..b56c8995 100644 --- a/static/css/main.css +++ b/static/css/main.css @@ -269,7 +269,7 @@ li { } -:not(input,textarea,select).dirty { +:not(input,textarea,select,button).dirty { background-color: var(--c_purple_dark); } input.dirty, textarea.dirty, select.dirty { diff --git a/static/dist/css/main.bundle.css b/static/dist/css/main.bundle.css index 5cfac856..4a91ab5c 100644 --- a/static/dist/css/main.bundle.css +++ b/static/dist/css/main.bundle.css @@ -269,7 +269,7 @@ li { } -:not(input,textarea,select).dirty { +:not(input,textarea,select,button).dirty { background-color: var(--c_purple_dark); } input.dirty, textarea.dirty, select.dirty { diff --git a/static/dist/js/main.bundle.js b/static/dist/js/main.bundle.js index e4a9c692..e265ee31 100644 --- a/static/dist/js/main.bundle.js +++ b/static/dist/js/main.bundle.js @@ -2626,13 +2626,23 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { key: "hookupButtonsRowDelete", value: function hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete) { var _this13 = this; + var changeHandler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (event, element) { + _this13.handleChangeNestedElementCellTable(event, element); + }; this.hookupEventHandler("click", selectorButtonDelete, function (event, element) { - _this13.handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete); + _this13.handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete, function (changeEvent, changeElement) { + changeHandler(changeEvent, changeElement); + }); }); } }, { key: "handleClickButtonRowDelete", value: function handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete) { + var _this14 = this; + var changeHandler = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function (event, element) { + _this14.handleChangeNestedElementCellTable(event, element); + }; + debugger; var row = DOM.getRowFromElement(element); // row.classList.add(flagDelete); if (row.classList.contains(flagRowNew) && !DOM.hasDirtyChildrenContainer(row)) { @@ -2645,21 +2655,33 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { buttonAdd.textContent = '+'; // DOM.setElementAttributeValueCurrent(buttonAdd, false); element.replaceWith(buttonAdd); - this.handleChangeNestedElementCellTable(null, buttonAdd); - this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete); + changeHandler(null, buttonAdd); + this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete, function (changeEvent, changeElement) { + changeHandler(changeEvent, changeElement); + }); this.updateAndToggleShowButtonsSaveCancel(); } }, { key: "hookupButtonsRowUndelete", value: function hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete) { - var _this14 = this; + var _this15 = this; + var changeHandler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (event, element) { + _this15.handleChangeNestedElementCellTable(event, element); + }; this.hookupEventHandler("click", selectorButtonUndelete, function (event, element) { - _this14.handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete); + _this15.handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete, function (changeEvent, changeElement) { + changeHandler(changeEvent, changeElement); + }); }); } }, { key: "handleClickButtonRowUndelete", value: function handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete) { + var _this16 = this; + var changeHandler = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function (event, element) { + _this16.handleChangeNestedElementCellTable(event, element); + }; + debugger; // let row = DOM.getRowFromElement(element); // row.classList.remove(flagDelete); var buttonDelete = element.cloneNode(false); // document.createElement("button"); @@ -2669,8 +2691,10 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { buttonDelete.textContent = 'x'; // DOM.setElementAttributeValueCurrent(buttonDelete, true); element.replaceWith(buttonDelete); - this.handleChangeNestedElementCellTable(null, buttonDelete); - this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete); + changeHandler(null, buttonDelete); + this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, function (changeEvent, changeElement) { + changeHandler(changeEvent, changeElement); + }); this.updateAndToggleShowButtonsSaveCancel(); } }, { @@ -2682,15 +2706,15 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { }, { key: "hookupTableCellDdlPreviews", value: function hookupTableCellDdlPreviews(cellSelector, optionList) { - var _this15 = this; + var _this17 = this; var ddlHookup = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (cellSelector) { - _this15.hookupTableCellDdls(cellSelector); + _this17.hookupTableCellDdls(cellSelector); }; var changeHandler = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function (event, element) { - _this15.handleChangeNestedElementCellTable(event, element); + _this17.handleChangeNestedElementCellTable(event, element); }; this.hookupEventHandler("click", cellSelector, function (event, td) { - _this15.handleClickTableCellDdlPreview(event, td, optionList, cellSelector, function (cellSelector) { + _this17.handleClickTableCellDdlPreview(event, td, optionList, cellSelector, function (cellSelector) { ddlHookup(cellSelector, function (event, element) { changeHandler(event, element); }); @@ -2701,9 +2725,9 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { }, { key: "hookupTableCellDdls", value: function hookupTableCellDdls(ddlSelector) { - var _this16 = this; + var _this18 = this; var changeHandler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (event, element) { - _this16.handleChangeNestedElementCellTable(event, element); + _this18.handleChangeNestedElementCellTable(event, element); }; this.hookupEventHandler("change", ddlSelector, function (event, element) { changeHandler(event, element); @@ -2712,9 +2736,9 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { }, { key: "handleClickTableCellDdlPreview", value: function handleClickTableCellDdlPreview(event, td, optionObjectList, cellSelector) { - var _this17 = this; + var _this19 = this; var ddlHookup = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function (cellSelector) { - _this17.hookupTableCellDdls(cellSelector); + _this19.hookupTableCellDdls(cellSelector); }; if (td.querySelector('select')) return; // td.removeEventListener("click", ddlHookup); @@ -2774,14 +2798,14 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { }, { key: "hookupTableCellDDlPreviewsWhenNotCollapsed", value: function hookupTableCellDDlPreviewsWhenNotCollapsed(cellSelector, optionList) { - var _this18 = this; + var _this20 = this; var ddlHookup = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (event, element) { - _this18.hookupTableCellDdls(event, element); + _this20.hookupTableCellDdls(event, element); }; this.hookupEventHandler("click", cellSelector, function (event, td) { var div = td.querySelector('div'); if (!div || div.classList.contains(flagCollapsed)) return; - _this18.handleClickTableCellDdlPreview(event, td, optionList, cellSelector, function (event, element) { + _this20.handleClickTableCellDdlPreview(event, td, optionList, cellSelector, function (event, element) { ddlHookup(event, element); }); }); @@ -2789,9 +2813,9 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { }, { key: "hookupProductCategoryDdls", value: function hookupProductCategoryDdls(ddlSelector) { - var _this19 = this; + var _this21 = this; this.hookupChangeHandlerTableCells(ddlSelector, function (event, element) { - _this19.handleChangeProductCategoryDdl(event, element); + _this21.handleChangeProductCategoryDdl(event, element); }); } }, { @@ -2825,15 +2849,15 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { }, { key: "hookupPreviewsProductPermutationVariation", value: function hookupPreviewsProductPermutationVariation() { - var _this20 = this; + var _this22 = this; this.hookupEventHandler("click", idTableMain + ' td.' + flagProductVariations, function (event, element) { - return _this20.handleClickProductPermutationVariationsPreview(event, element); + return _this22.handleClickProductPermutationVariationsPreview(event, element); }); } }, { key: "handleClickProductPermutationVariationsPreview", value: function handleClickProductPermutationVariationsPreview(event, element) { - var _this21 = this; + var _this23 = this; var tblVariations = element.querySelector('table.' + flagProductVariations); if (!validation_Validation.isEmpty(tblVariations)) return; this.toggleColumnCollapsed(flagProductVariations, false); @@ -2862,7 +2886,7 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { var tbody = document.createElement("tbody"); if (!validation_Validation.isEmpty(permutationVariations)) { permutationVariations.forEach(function (permutationVariation, index) { - _this21.addProductPermutationVariationRow(tbody, permutationVariation); + _this23.addProductPermutationVariationRow(tbody, permutationVariation); }); } tblVariations.appendChild(tbody); @@ -2993,8 +3017,10 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { var tdDelete = document.createElement("td"); tdDelete.classList.add(flagDelete); var buttonDelete = document.createElement("button"); + buttonDelete.classList.add(flagActive); buttonDelete.classList.add(flagDelete); buttonDelete.textContent = 'x'; + DOM.setElementAttributesValuesCurrentAndPrevious(buttonDelete, true); var tr = document.createElement("tr"); tr.classList.add(flagProductVariation); tdVariationType.appendChild(ddlVariationType); @@ -3008,9 +3034,9 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { }, { key: "hookupDdlsProductPermutationVariationType", value: function hookupDdlsProductPermutationVariationType() { - var _this22 = this; + var _this24 = this; this.hookupTableCellDdls(idTableMain + ' td.' + flagProductVariations + ' td.' + flagProductVariationType + ' select', function (event, ddlVariationType) { - _this22.handleChangeDdlProductVariationOrVariationType(event, ddlVariationType); + _this24.handleChangeProductVariationInput(event, ddlVariationType); var idVariationTypeSelected = DOM.getElementValueCurrent(ddlVariationType); var row = DOM.getRowFromElement(ddlVariationType); var tdVariation = row.querySelector('td.' + flagProductVariation); @@ -3026,43 +3052,44 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { option = DOM.createOption(optionJson); ddlVariation.appendChild(option); }); - _this22.handleChangeDdlProductVariationOrVariationType(event, ddlVariation); + _this24.handleChangeProductVariationInput(event, ddlVariation); }); } }, { - key: "handleChangeDdlProductVariationOrVariationType", - value: function handleChangeDdlProductVariationOrVariationType(event, element) { + key: "handleChangeProductVariationInput", + value: function handleChangeProductVariationInput(event, element) { this.handleChangeNestedElementCellTable(event, element); this.updateProductPermutationVariations(element); } }, { key: "hookupDdlsProductPermutationVariation", value: function hookupDdlsProductPermutationVariation() { - var _this23 = this; + var _this25 = this; this.hookupTableCellDdls(idTableMain + ' td.' + flagProductVariations + ' td.' + flagProductVariation + ' select', function (event, ddlVariation) { - _this23.handleChangeDdlProductVariationOrVariationType(event, ddlVariation); + _this25.handleChangeProductVariationInput(event, ddlVariation); }); } }, { key: "hookupButtonsProductPermutationVariationAddDelete", value: function hookupButtonsProductPermutationVariationAddDelete() { - var _this24 = this; + var _this26 = this; var selectorButton = idTableMain + ' td.' + flagProductVariations + ' tr.' + flagProductVariation + ' button'; var selectorButtonDelete = selectorButton + '.' + flagDelete; var selectorButtonUndelete = selectorButton + '.' + flagAdd; this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, function (event, element) { - _this24.handleClickButtonRowDelete(event, element); - _this24.updateProductPermutationVariations(element); + _this26.handleChangeProductVariationInput(event, element); + }); + this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete, function (event, element) { + _this26.handleChangeProductVariationInput(event, element); }); - this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete); this.hookupButtonsProductPermutationVariationAdd(); } }, { key: "hookupButtonsProductPermutationVariationAdd", value: function hookupButtonsProductPermutationVariationAdd() { - var _this25 = this; + var _this27 = this; this.hookupEventHandler("click", idTableMain + ' td.' + flagProductVariations + ' button.' + flagAdd, function (event, element) { - _this25.handleClickButtonProductPermutationVariationAdd(event, element); + _this27.handleClickButtonProductPermutationVariationAdd(event, element); }); } }, { @@ -3085,7 +3112,7 @@ var TableBasePage = /*#__PURE__*/function (_BasePage) { }, { key: "getProductPermutationVariationsText", value: function getProductPermutationVariationsText(variationsTd) { - var rows = variationsTd.querySelectorAll(':scope tbody tr'); + var rows = variationsTd.querySelectorAll(':scope tbody tr:has(button.' + flagDelete + ')'); var variationPairsString = ''; var ddlVariationType, ddlVariation, idVariationType, idVariation; rows.forEach(function (row, index) { diff --git a/static/js/pages/base_table.js b/static/js/pages/base_table.js index 64df452d..14f876d7 100644 --- a/static/js/pages/base_table.js +++ b/static/js/pages/base_table.js @@ -484,45 +484,40 @@ export default class TableBasePage extends BasePage { , (event, button) => { handleClickRowNew(event, button); } ); } - hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete) { + hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) { this.hookupEventHandler("click", selectorButtonDelete, (event, element) => { - this.handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete); + this.handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); }); }); } - handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete) { + handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) { let row = DOM.getRowFromElement(element); - // row.classList.add(flagDelete); if (row.classList.contains(flagRowNew) && !DOM.hasDirtyChildrenContainer(row)) { row.parentNode.removeChild(row); } - let buttonAdd = element.cloneNode(false); // document.createElement("button"); + let buttonAdd = element.cloneNode(false); buttonAdd.classList.remove(flagInitialised); buttonAdd.classList.remove(flagDelete); buttonAdd.classList.add(flagAdd); buttonAdd.textContent = '+'; - // DOM.setElementAttributeValueCurrent(buttonAdd, false); element.replaceWith(buttonAdd); - this.handleChangeNestedElementCellTable(null, buttonAdd); - this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete); + changeHandler(null, buttonAdd); + this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); }); this.updateAndToggleShowButtonsSaveCancel(); } - hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete) { + hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) { this.hookupEventHandler("click", selectorButtonUndelete, (event, element) => { - this.handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete); + this.handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); }); }); } - handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete) { - // let row = DOM.getRowFromElement(element); - // row.classList.remove(flagDelete); - let buttonDelete = element.cloneNode(false); // document.createElement("button"); + handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) { + let buttonDelete = element.cloneNode(false); buttonDelete.classList.remove(flagInitialised); buttonDelete.classList.remove(flagAdd); buttonDelete.classList.add(flagDelete); buttonDelete.textContent = 'x'; - // DOM.setElementAttributeValueCurrent(buttonDelete, true); element.replaceWith(buttonDelete); - this.handleChangeNestedElementCellTable(null, buttonDelete); - this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete); + changeHandler(null, buttonDelete); + this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); }); this.updateAndToggleShowButtonsSaveCancel(); } hookupTdsAccessLevel() { @@ -810,8 +805,10 @@ export default class TableBasePage extends BasePage { tdDelete.classList.add(flagDelete); let buttonDelete = document.createElement("button"); + buttonDelete.classList.add(flagActive); buttonDelete.classList.add(flagDelete); buttonDelete.textContent = 'x'; + DOM.setElementAttributesValuesCurrentAndPrevious(buttonDelete, true); let tr = document.createElement("tr"); tr.classList.add(flagProductVariation); @@ -827,7 +824,7 @@ export default class TableBasePage extends BasePage { this.hookupTableCellDdls( idTableMain + ' td.' + flagProductVariations + ' td.' + flagProductVariationType + ' select' , (event, ddlVariationType) => { - this.handleChangeDdlProductVariationOrVariationType(event, ddlVariationType); + this.handleChangeProductVariationInput(event, ddlVariationType); let idVariationTypeSelected = DOM.getElementValueCurrent(ddlVariationType); let row = DOM.getRowFromElement(ddlVariationType); let tdVariation = row.querySelector('td.' + flagProductVariation); @@ -845,26 +842,23 @@ export default class TableBasePage extends BasePage { option = DOM.createOption(optionJson); ddlVariation.appendChild(option); }); - this.handleChangeDdlProductVariationOrVariationType(event, ddlVariation); + this.handleChangeProductVariationInput(event, ddlVariation); } ); } - handleChangeDdlProductVariationOrVariationType(event, element) { + handleChangeProductVariationInput(event, element) { this.handleChangeNestedElementCellTable(event, element); this.updateProductPermutationVariations(element); } hookupDdlsProductPermutationVariation() { - this.hookupTableCellDdls(idTableMain + ' td.' + flagProductVariations + ' td.' + flagProductVariation + ' select', (event, ddlVariation) => { this.handleChangeDdlProductVariationOrVariationType(event, ddlVariation); }); + this.hookupTableCellDdls(idTableMain + ' td.' + flagProductVariations + ' td.' + flagProductVariation + ' select', (event, ddlVariation) => { this.handleChangeProductVariationInput(event, ddlVariation); }); } hookupButtonsProductPermutationVariationAddDelete() { let selectorButton = idTableMain + ' td.' + flagProductVariations + ' tr.' + flagProductVariation + ' button'; let selectorButtonDelete = selectorButton + '.' + flagDelete; let selectorButtonUndelete = selectorButton + '.' + flagAdd; - this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, (event, element) => { - this.handleClickButtonRowDelete(event, element); - this.updateProductPermutationVariations(element); - }); - this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete); + this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, (event, element) => { this.handleChangeProductVariationInput(event, element); }); + this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete, (event, element) => { this.handleChangeProductVariationInput(event, element); }); this.hookupButtonsProductPermutationVariationAdd(); } hookupButtonsProductPermutationVariationAdd() { @@ -888,7 +882,7 @@ export default class TableBasePage extends BasePage { this.handleChangeNestedElementCellTable(null, variationsCell); } getProductPermutationVariationsText(variationsTd) { - let rows = variationsTd.querySelectorAll(':scope tbody tr'); + let rows = variationsTd.querySelectorAll(':scope tbody tr:has(button.' + flagDelete + ')'); let variationPairsString = ''; let ddlVariationType, ddlVariation, idVariationType, idVariation; rows.forEach((row, index) => {