TRows = function(param) {
return {
html: `
`,
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