TRows = function(param) { return { html: `
BBBinfoBBB
BBBaddHtmlBBB
`, objName: param.objName, blockName: param.blockName, elementName: param.elementName, elementType: param.elementType, infoId: param.infoId, header: param.header, title: param.title, typeTitle: param.typeTitle, typeValueMask: param.typeValueMask, typePlaceholder: param.typePlaceholder, numberTitle: param.numberTitle, numberValueMask: param.numberValueMask, numberPlaceholder: param.numberPlaceholder, delTitle: param.delTitle, delText: param.delText, addTitle: param.addTitle, addText: param.addText, maxRows: ((param.maxRows) ? param.maxRows : 5), rows: {}, rowsData: [], rowsDomId: param.blockName + '_' + param.elementName + '_rows', addElement: null, getHtml: function(){ let infoIdContent = ''; let infoIdDom = document.getElementById(this.infoId); if (infoIdDom) { infoIdContent = infoIdDom.innerHTML; } this.addElement = new TIconAAdd({ objName: this.objName + '.addElement', blockName: this.blockName, elementName: this.elementName + 'add', title: this.addTitle, text: this.addText, } ); window.addEventListener(this.blockName + 'GetData', (ev) => {this.getData(ev, this);}); window.addEventListener(this.blockName + 'ChangeData', (ev) => {this.changeData(ev, this);}); window.addEventListener(this.blockName + 'AddRow', (ev) => {this.rowAdd(ev, this);}); window.addEventListener(this.blockName + 'DelRow', (ev) => {this.rowDel(ev, this);}); return this.html .replace(new RegExp('BBBobjNameBBB', 'gim'), this.objName) .replace(new RegExp('BBBblockNameBBB', 'gim'), this.blockName) .replace(new RegExp('BBBelementNameBBB', 'gim'), this.elementName) .replace(new RegExp('BBBelementObjBBB', 'gim'), this.objName) .replace(new RegExp('BBBinfoBBB', 'gim'), infoIdContent) .replace(new RegExp('BBBheaderBBB', 'gim'), this.header) .replace(new RegExp('BBBtitleBBB', 'gim'), this.title) .replace(new RegExp('BBBvalueMaskBBB', 'gim'), this.valueMask) .replace(new RegExp('BBBplaceholderBBB', 'gim'), this.placeholder) .replace(new RegExp('BBBaddHtmlBBB', 'gim'), this.addElement.getHtml()) ; }, getData: function (ev, obj){ if ( ('detail' in ev) &&('elementName' in ev.detail) &&(ev.detail.elementName) &&('element' in ev.detail) &&(ev.detail.element) ){ if (ev.detail.elementName == obj.elementName + 'type'){ obj.getTypeData(ev.detail.element, obj); } } }, changeData: function (ev, obj){ if ( ('detail' in ev) &&('elementType' in ev.detail) &&(ev.detail.elementType) &&('element' in ev.detail) &&(ev.detail.element) ){ let data = []; if (obj.rows) { for (let key in obj.rows) { let element = obj.rows[key]; data.push(element.getBlockData(element)); } } obj.rowsData = data; let e = new CustomEvent(obj.blockName + 'ChangeRowsData', { bubbles: true, cancelable: true, composed: true, detail: { 'event': ev, 'blockName': obj.blockName, 'elementName': obj.elementName, 'elementType': obj.elementType, 'objName': obj.objName, 'data': obj.rowsData, 'element': ev.detail.element, }, }); document.dispatchEvent(e); } }, getTypeData: function (ev, obj){ let txt = ev.detail.element; let e = new CustomEvent(this.blockName + 'GetData', { bubbles: true, cancelable: true, composed: true, detail: { 'event': ev, 'blockName': obj.blockName, 'elementName':obj.elementName, 'elementType':this.elementType, 'element': txt, }, }); document.dispatchEvent(e); }, rowAdd: function (ev, obj){ if ( ('detail' in ev) &&('elementName' in ev.detail) &&(ev.detail.elementName) &&('element' in ev.detail) &&(ev.detail.element) ){ if (ev.detail.elementName == obj.elementName + 'add'){ obj.addRow(ev, obj); } } }, rowDel: function (ev, obj){ if ( ('detail' in ev) &&('elementName' in ev.detail) &&(ev.detail.elementName) &&('element' in ev.detail) &&(ev.detail.element) &&(ev.detail.element.dataset.elementObj) ){ let elementForDel = ev.detail.element.dataset.delRowNom; if ( (elementForDel) &&(elementForDel in obj.rows) ) { let cou = 0; for(let key in obj.rows) { cou++; } if (cou<2) { return false; } delete obj.rows[elementForDel]; obj.rowsData = []; let data = []; if (obj.rows) { for (let key in obj.rows) { let element = obj.rows[key]; data.push(element.getBlockData(element)); } } obj.rowsData = data; } } obj.prepareAllRow(obj); }, addRow: function(ev, obj, dataDefault) { let data = ((dataDefault) ? dataDefault : null); let isAdd = true; if ( (obj.rowsData) &&(obj.rowsData.length>0) &&((Object.keys(obj.rows)).length == obj.rowsData.length) ) { for (let key in obj.rowsData) { let element = obj.rowsData[key]; if ( (!element.nomber) ||(!element.type) ||(!('name' in element.nomber)) ||(!('name' in element.type)) ||(!element.nomber.name) ||(!(element.type.name)) ){ isAdd = false; break; } } } else { if ((Object.keys(obj.rows)).length > obj.rowsData.length) { isAdd = false; } } if (obj.maxRows <= (Object.keys(obj.rows)).length){ isAdd = false; } if (data) { isAdd = true; } if (!isAdd){ return false; } else { let nom = Math.floor((new Date()).getTime()); obj.rows['r' + nom] = new TTypeNumber({ objName: obj.objName + '.rows.r' + nom, blockName: obj.blockName, elementName: obj.elementName + 'row' + nom, elementType: obj.elementType, infoId: '', header: '', title: '', typeTitle: obj.typeTitle, typeValueMask: obj.typeValueMask, typePlaceholder: obj.typePlaceholder, typeDatasetValue: ((data && data.typeDatasetValue) ? data.typeDatasetValue : ''), typeDatasetTxtValue: ((data && data.typeDatasetTxtValue) ? data.typeDatasetTxtValue : ''), numberTitle: obj.numberTitle, numberValueMask: obj.numberValueMask, numberPlaceholder: obj.numberPlaceholder, numberDatasetValue: ((data && data.numberDatasetValue) ? data.numberDatasetValue : ''), numberDatasetTxtValue: ((data && data.numberDatasetTxtValue) ? data.numberDatasetTxtValue : ''), numberDisabled: ((data && data.numberDisabled) ? data.numberDisabled : ''), delTitle: obj.delTitle, delRowNom: 'r' + nom, }); let rowsDom = document.getElementById(obj.rowsDomId); if (rowsDom) { let block = document.createElement('div'); block.dataset.rowId = 'r' + nom; block.innerHTML = obj.rows['r' + nom].getHtml(); rowsDom.append(block); if ( (ev) && ('detail' in ev) && ('isRealClick' in ev.detail) && (ev.detail.isRealClick) && ((Object.keys(obj.rows)).length > 1) ) { let activeElement = block.querySelector('input'); if (activeElement) { activeElement.focus(); } } } } obj.prepareAllRow(obj); }, clearBlock: function(obj){ obj.rows = []; obj.prepareAllRow(obj); }, prepareAllRow: function(obj){ let rowsDom = document.getElementById(obj.rowsDomId); if (rowsDom) { let rowsAllDom = rowsDom.querySelectorAll('div[data-row-id]'); if (rowsAllDom) { for (let key=0; key