@syncfusion/ej2-querybuilder 30.1.42 → 30.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { ChildProperty, Property, Collection, Component, getComponent, removeClass, isNullOrUndefined, Animation, extend, closest, addClass, select, append, detach, rippleEffect, getInstance, getValue, getNumericObject, Browser, classList, Internationalization, getUniqueID, L10n, Draggable, remove, compile, EventHandler, cldrData, Event, Complex, NotifyPropertyChanges } from '@syncfusion/ej2-base';
1
+ import { ChildProperty, Property, Collection, Component, removeClass, isNullOrUndefined, Animation, extend, closest, addClass, select, append, getComponent, detach, rippleEffect, getInstance, getValue, getNumericObject, Browser, classList, Internationalization, getUniqueID, L10n, Draggable, remove, compile, EventHandler, cldrData, Event, Complex, NotifyPropertyChanges } from '@syncfusion/ej2-base';
2
2
  import { Button, CheckBox, RadioButton } from '@syncfusion/ej2-buttons';
3
3
  import { MultiSelect, CheckBoxSelection, DropDownList, DropDownTree } from '@syncfusion/ej2-dropdowns';
4
4
  import { Query, DataManager, Deferred, Predicate } from '@syncfusion/ej2-data';
@@ -174,37 +174,71 @@ let QueryBuilder = class QueryBuilder extends Component {
174
174
  reset() {
175
175
  this.isImportRules = false;
176
176
  let bodyElem = this.element.querySelector('.e-group-body');
177
- const inputElement = this.element.querySelectorAll('input.e-control');
178
- for (let i = 0, len = inputElement.length; i < len; i++) {
179
- if (inputElement[i].className.indexOf('e-tooltip') > -1) {
180
- getComponent(inputElement[i], 'tooltip').destroy();
177
+ const inputElements = this.element.querySelectorAll('input.e-control');
178
+ const batchSize = 20;
179
+ let currentIndex = 0;
180
+ const processBatch = () => {
181
+ const endIndex = Math.min(currentIndex + batchSize, inputElements.length);
182
+ for (let i = currentIndex; i < endIndex; i++) {
183
+ const element = inputElements[i];
184
+ try {
185
+ if (element.className.indexOf('e-tooltip') > -1) {
186
+ const tooltip = getComponent(element, 'tooltip');
187
+ if (tooltip) {
188
+ tooltip.destroy();
189
+ }
190
+ }
191
+ else if (element.parentElement && element.parentElement.className.indexOf('e-tooltip') > -1) {
192
+ const tooltip = getComponent(element.parentElement, 'tooltip');
193
+ if (tooltip) {
194
+ tooltip.destroy();
195
+ }
196
+ }
197
+ }
198
+ catch (e) {
199
+ console.warn('Error destroying tooltip:', e);
200
+ }
181
201
  }
182
- else if (inputElement[i].parentElement.className.indexOf('e-tooltip') > -1) {
183
- getComponent(inputElement[i].parentElement, 'tooltip').destroy();
202
+ currentIndex = endIndex;
203
+ if (currentIndex < inputElements.length) {
204
+ requestAnimationFrame(processBatch);
184
205
  }
206
+ };
207
+ if (inputElements.length > 0) {
208
+ processBatch();
185
209
  }
186
210
  if (bodyElem) {
187
- bodyElem.innerHTML = '';
211
+ bodyElem.textContent = '';
188
212
  }
189
213
  else {
214
+ const fragment = document.createDocumentFragment();
190
215
  const grpContainer = this.createElement('div', { attrs: { class: 'e-group-container' } });
191
216
  const grpHeader = this.createElement('div', { attrs: { class: 'e-group-header' } });
192
217
  const grpBody = this.createElement('div', { attrs: { class: 'e-group-body' } });
193
- grpContainer.appendChild(grpHeader).appendChild(grpBody);
194
- this.element.appendChild(grpContainer);
218
+ grpContainer.appendChild(grpHeader);
219
+ grpContainer.appendChild(grpBody);
220
+ fragment.appendChild(grpContainer);
221
+ this.element.appendChild(fragment);
195
222
  bodyElem = this.element.querySelector('.e-group-body');
196
223
  }
197
224
  if (this.headerTemplate && this.isRoot) {
198
- this.element.innerHTML = '';
225
+ this.element.textContent = '';
199
226
  this.isRoot = false;
200
227
  }
201
228
  if (this.enableNotCondition) {
202
- removeClass(this.element.querySelectorAll('.e-qb-toggle'), 'e-active-toggle');
229
+ const toggleElements = this.element.querySelectorAll('.e-qb-toggle');
230
+ for (let i = 0; i < toggleElements.length; i++) {
231
+ removeClass([toggleElements[i]], 'e-active-toggle');
232
+ }
233
+ }
234
+ if (bodyElem) {
235
+ bodyElem.appendChild(this.createElement('div', { attrs: { class: 'e-rule-list' } }));
203
236
  }
204
- bodyElem.appendChild(this.createElement('div', { attrs: { class: 'e-rule-list' } }));
205
237
  this.levelColl[this.element.id + '_group0'] = [0];
206
238
  this.setProperties({ rule: { condition: 'and', not: false, rules: [] } }, true);
207
- this.disableRuleCondition(bodyElem.parentElement);
239
+ if (bodyElem && bodyElem.parentElement) {
240
+ this.disableRuleCondition(bodyElem.parentElement);
241
+ }
208
242
  }
209
243
  getWrapper() {
210
244
  return this.element;
@@ -239,11 +273,11 @@ let QueryBuilder = class QueryBuilder extends Component {
239
273
  if (this.columns.length) {
240
274
  this.columnSort();
241
275
  const columns = this.columns;
242
- for (let i = 0, len = columns.length; i < len; i++) {
243
- this.updateCustomOperator(columns[i], 'initial');
244
- if (!columns[i].type) {
245
- if (columnKeys.indexOf(columns[i].field) > -1) {
246
- value = this.dataColl[0][columns[i].field];
276
+ columns.forEach((column) => {
277
+ this.updateCustomOperator(column, 'initial');
278
+ if (!column.type) {
279
+ if (columnKeys.indexOf(column.field) > -1) {
280
+ value = this.dataColl[0][column.field];
247
281
  type = typeof value;
248
282
  if (type === 'string') {
249
283
  isDate = !isNaN(Date.parse(value));
@@ -252,28 +286,28 @@ let QueryBuilder = class QueryBuilder extends Component {
252
286
  isDate = value instanceof Date && !isNaN(value.getTime());
253
287
  type = 'string';
254
288
  }
255
- columns[i].type = type;
289
+ column.type = type;
256
290
  isDate = false;
257
291
  }
258
292
  type = 'string';
259
293
  }
260
- if (!columns[i].validation) {
261
- columns[i].validation = validateObj;
294
+ if (!column.validation) {
295
+ column.validation = validateObj;
262
296
  }
263
- if (columns[i].category) {
297
+ if (column.category) {
264
298
  groupBy = true;
265
299
  }
266
300
  else {
267
- columns[i].category = this.l10n.getConstant('OtherFields');
301
+ column.category = this.l10n.getConstant('OtherFields');
268
302
  }
269
- if (categories.indexOf(columns[i].category) < 0) {
270
- categories.push(columns[i].category);
303
+ if (categories.indexOf(column.category) < 0) {
304
+ categories.push(column.category);
271
305
  }
272
- if (!columns[i].operators ||
273
- (this.isLocale && this.isCustomOprCols.indexOf(columns[i].field) === -1)) {
274
- columns[i].operators = this.customOperators[columns[i].type + 'Operator'];
306
+ if (!column.operators ||
307
+ (this.isLocale && this.isCustomOprCols.indexOf(column.field) === -1)) {
308
+ column.operators = this.customOperators[column.type + 'Operator'];
275
309
  }
276
- }
310
+ });
277
311
  if (groupBy && (categories.length > 1 || categories[0] !== this.l10n.getConstant('OtherFields'))) {
278
312
  this.fields = { text: 'label', value: 'field', groupBy: 'category' };
279
313
  }
@@ -290,8 +324,10 @@ let QueryBuilder = class QueryBuilder extends Component {
290
324
  isDate = value instanceof Date && !isNaN(value.getTime());
291
325
  type = 'string';
292
326
  }
293
- cols[i] = { 'field': columnKeys[i], 'label': columnKeys[i], 'type': isDate ? 'date' : type,
294
- 'validation': validateObj };
327
+ cols[i] = {
328
+ 'field': columnKeys[i], 'label': columnKeys[i], 'type': isDate ? 'date' : type,
329
+ 'validation': validateObj
330
+ };
295
331
  isDate = false;
296
332
  cols[i].operators = this.customOperators[cols[i].type + 'Operator'];
297
333
  if (type === 'object') {
@@ -302,8 +338,28 @@ let QueryBuilder = class QueryBuilder extends Component {
302
338
  }
303
339
  }
304
340
  else if (this.columns && this.columns.length) {
305
- const columns = this.columns;
306
- for (let i = 0, len = columns.length; i < len; i++) {
341
+ if (this.sortDirection !== 'Default') {
342
+ this.columnSort();
343
+ }
344
+ this.processColumnsInBatches();
345
+ if (this.columns.length > 50) {
346
+ setTimeout(() => {
347
+ this.updateSubFieldsFromColumns(this.columns);
348
+ }, 0);
349
+ }
350
+ else {
351
+ this.updateSubFieldsFromColumns(this.columns);
352
+ }
353
+ }
354
+ this.trigger('dataBound', { type: 'dataBound' });
355
+ }
356
+ processColumnsInBatches() {
357
+ const columns = this.columns;
358
+ const batchSize = 10;
359
+ let processedCount = 0;
360
+ const processBatch = () => {
361
+ const endIdx = Math.min(processedCount + batchSize, columns.length);
362
+ for (let i = processedCount; i < endIdx; i++) {
307
363
  if (columns[i].category && columns[i].category !== this.l10n.getConstant('OtherFields')) {
308
364
  this.fields = { text: 'label', value: 'field', groupBy: 'category' };
309
365
  }
@@ -316,11 +372,18 @@ let QueryBuilder = class QueryBuilder extends Component {
316
372
  columns[i].operators = this.customOperators[columns[i].type + 'Operator'];
317
373
  }
318
374
  }
319
- this.updateSubFieldsFromColumns(this.columns);
320
- }
321
- this.trigger('dataBound', { type: 'dataBound' });
375
+ processedCount = endIdx;
376
+ if (processedCount < columns.length) {
377
+ requestAnimationFrame(processBatch);
378
+ }
379
+ };
380
+ processBatch();
322
381
  }
323
382
  updateSubFieldsFromColumns(col, field) {
383
+ if (col.length > 50) {
384
+ this.updateSubFieldsLarge(col, field);
385
+ return;
386
+ }
324
387
  for (let i = 0; i < col.length; i++) {
325
388
  if (this.separator !== '' && col[i].field.indexOf(this.separator) < 0) {
326
389
  col[i].field = field ? field + this.separator + col[i].field : col[i].field;
@@ -337,6 +400,38 @@ let QueryBuilder = class QueryBuilder extends Component {
337
400
  }
338
401
  }
339
402
  }
403
+ updateSubFieldsLarge(col, field) {
404
+ let i = 0;
405
+ const colLength = col.length;
406
+ const processNextBatch = () => {
407
+ const endIdx = Math.min(i + 10, colLength);
408
+ for (; i < endIdx; i++) {
409
+ if (this.separator !== '' && col[i].field.indexOf(this.separator) < 0) {
410
+ col[i].field = field ? field + this.separator + col[i].field : col[i].field;
411
+ }
412
+ if (col[i].operators) {
413
+ this.updateCustomOperator(col[i]);
414
+ }
415
+ else if (col[i].type && col[i].type !== 'object') {
416
+ col[i].operators = this.customOperators[col[i].type + 'Operator'];
417
+ }
418
+ }
419
+ if (i < colLength) {
420
+ requestAnimationFrame(processNextBatch);
421
+ }
422
+ else {
423
+ setTimeout(() => {
424
+ for (let j = 0; j < colLength; j++) {
425
+ if (col[j].columns) {
426
+ col[j].type = 'object';
427
+ this.updateSubFieldsFromColumns(col[j].columns, col[j].field);
428
+ }
429
+ }
430
+ }, 0);
431
+ }
432
+ };
433
+ processNextBatch();
434
+ }
340
435
  updateSubFields(value, col, data) {
341
436
  let sampCol;
342
437
  col.columns = [];
@@ -501,8 +596,10 @@ let QueryBuilder = class QueryBuilder extends Component {
501
596
  }
502
597
  args = { groupID: groupID, cancel: false, type: 'condition', value: targetValue.toLowerCase() };
503
598
  if (this.enableNotCondition) {
504
- args = { groupID: groupID, cancel: false, type: 'condition', value: targetValue.toLowerCase(),
505
- 'not': ariaChecked };
599
+ args = {
600
+ groupID: groupID, cancel: false, type: 'condition', value: targetValue.toLowerCase(),
601
+ 'not': ariaChecked
602
+ };
506
603
  }
507
604
  }
508
605
  if (!this.isImportRules) {
@@ -600,7 +697,7 @@ let QueryBuilder = class QueryBuilder extends Component {
600
697
  appendRuleElem(target, column, type, parentId, action, rule) {
601
698
  let ruleElem;
602
699
  let elem;
603
- const ruleListElem = target.querySelector('.e-rule-list');
700
+ const ruleListElem = target && target.querySelector('.e-rule-list');
604
701
  let args;
605
702
  if (type === 'change') {
606
703
  ruleElem = select('#' + parentId, target);
@@ -951,7 +1048,6 @@ let QueryBuilder = class QueryBuilder extends Component {
951
1048
  const ruleElem = document.getElementById(ruleElemID);
952
1049
  this.ddTree = getComponent(ruleElem.querySelector('input.e-dropdowntree'), 'dropdowntree');
953
1050
  const hierarchicalData = extend([], this.columns, [], true);
954
- // Cancel the default filtering.
955
1051
  args.cancel = true;
956
1052
  if (args.text === '') {
957
1053
  this.changeDataSource(hierarchicalData);
@@ -1110,7 +1206,8 @@ let QueryBuilder = class QueryBuilder extends Component {
1110
1206
  }
1111
1207
  }
1112
1208
  renderToolTip(element) {
1113
- const tooltip = new Tooltip({ content: this.l10n.getConstant('ValidationMessage'), isSticky: true,
1209
+ const tooltip = new Tooltip({
1210
+ content: this.l10n.getConstant('ValidationMessage'), isSticky: true,
1114
1211
  position: 'BottomCenter', cssClass: 'e-querybuilder-error', afterClose: () => {
1115
1212
  tooltip.destroy();
1116
1213
  }, beforeOpen: (args) => {
@@ -1118,7 +1215,8 @@ let QueryBuilder = class QueryBuilder extends Component {
1118
1215
  if (tooltipCloseElement) {
1119
1216
  tooltipCloseElement.style.display = 'none';
1120
1217
  }
1121
- } });
1218
+ }
1219
+ });
1122
1220
  tooltip.appendTo(element);
1123
1221
  tooltip.open(element);
1124
1222
  }
@@ -1276,7 +1374,6 @@ let QueryBuilder = class QueryBuilder extends Component {
1276
1374
  groupElem.appendChild(groupHdrElem);
1277
1375
  grpBodyElem.appendChild(rulesElem);
1278
1376
  groupElem.appendChild(grpBodyElem);
1279
- // create button group in OR and AND process
1280
1377
  if (!this.headerTemplate) {
1281
1378
  if (this.allowDragAndDrop) {
1282
1379
  dragClsName = 'e-icons e-drag-qb-rule';
@@ -1284,8 +1381,12 @@ let QueryBuilder = class QueryBuilder extends Component {
1284
1381
  else {
1285
1382
  dragClsName = 'e-icons e-drag-qb-rule e-hidden';
1286
1383
  }
1287
- const spanDragElement = this.createElement('span', { attrs: { class: dragClsName, 'aria-label': 'drag handle',
1288
- title: 'drag handle' } });
1384
+ const spanDragElement = this.createElement('span', {
1385
+ attrs: {
1386
+ class: dragClsName, 'aria-label': 'drag handle',
1387
+ title: 'drag handle'
1388
+ }
1389
+ });
1289
1390
  groupHdrElem.appendChild(spanDragElement);
1290
1391
  const className = this.enableSeparateConnector && !isConnector ? 'e-lib e-btn-group e-qb-toggle-btn' : 'e-lib e-btn-group';
1291
1392
  glueElem = this.createElement('div', { attrs: { class: className, role: 'group' } });
@@ -1303,13 +1404,17 @@ let QueryBuilder = class QueryBuilder extends Component {
1303
1404
  }
1304
1405
  inputElem = this.createElement('input', { attrs: { type: 'radio', class: 'e-btngroup-and', value: 'AND' } });
1305
1406
  glueElem.appendChild(inputElem);
1306
- labelElem = this.createElement('label', { attrs: { class: 'e-lib e-btn e-btngroup-and-lbl e-small' },
1307
- innerHTML: this.l10n.getConstant('AND') });
1407
+ labelElem = this.createElement('label', {
1408
+ attrs: { class: 'e-lib e-btn e-btngroup-and-lbl e-small' },
1409
+ innerHTML: this.l10n.getConstant('AND')
1410
+ });
1308
1411
  glueElem.appendChild(labelElem);
1309
1412
  inputElem = this.createElement('input', { attrs: { type: 'radio', class: 'e-btngroup-or', value: 'OR' } });
1310
1413
  glueElem.appendChild(inputElem);
1311
- labelElem = this.createElement('label', { attrs: { class: 'e-lib e-btn e-btngroup-or-lbl e-small' },
1312
- innerHTML: this.l10n.getConstant('OR') });
1414
+ labelElem = this.createElement('label', {
1415
+ attrs: { class: 'e-lib e-btn e-btngroup-or-lbl e-small' },
1416
+ innerHTML: this.l10n.getConstant('OR')
1417
+ });
1313
1418
  glueElem.appendChild(labelElem);
1314
1419
  groupHdrElem.appendChild(glueElem);
1315
1420
  grpActElem = this.createElement('div', { attrs: { class: 'e-group-action' } });
@@ -1342,8 +1447,12 @@ let QueryBuilder = class QueryBuilder extends Component {
1342
1447
  else {
1343
1448
  dragClsName = 'e-icons e-drag-qb-rule e-hidden';
1344
1449
  }
1345
- const spanDragElement = this.createElement('span', { attrs: { class: dragClsName, 'aria-label': 'drag handle',
1346
- title: 'drag handle' } });
1450
+ const spanDragElement = this.createElement('span', {
1451
+ attrs: {
1452
+ class: dragClsName, 'aria-label': 'drag handle',
1453
+ title: 'drag handle'
1454
+ }
1455
+ });
1347
1456
  fieldElem.appendChild(spanDragElement);
1348
1457
  const filterElem = this.createElement('input', { attrs: { type: 'text', class: 'e-filter-input' } });
1349
1458
  tempElem.appendChild(filterElem);
@@ -1622,8 +1731,10 @@ let QueryBuilder = class QueryBuilder extends Component {
1622
1731
  }
1623
1732
  this.updatedRule = null;
1624
1733
  if (this.headerTemplate) {
1625
- const args = { requestType: 'header-template-create', ruleID: groupElem.id, condition: condition,
1626
- notCondition: this.enableNotCondition ? not : undefined };
1734
+ const args = {
1735
+ requestType: 'header-template-create', ruleID: groupElem.id, condition: condition,
1736
+ notCondition: this.enableNotCondition ? not : undefined
1737
+ };
1627
1738
  this.trigger('actionBegin', args);
1628
1739
  }
1629
1740
  else {
@@ -1662,9 +1773,10 @@ let QueryBuilder = class QueryBuilder extends Component {
1662
1773
  }
1663
1774
  }
1664
1775
  setMultiConnector(trgt) {
1665
- if (this.enableSeparateConnector && !this.headerTemplate) {
1666
- if (trgt.previousElementSibling && this.groupElem.querySelector('.e-btn-group')) {
1667
- trgt.parentElement.insertBefore(this.groupTemplate(true).querySelector('.e-btn-group'), trgt);
1776
+ if (this.enableSeparateConnector && !this.headerTemplate && trgt.previousElementSibling) {
1777
+ const btnGroupElem = this.groupTemplate(true).querySelector('.e-btn-group');
1778
+ if (btnGroupElem) {
1779
+ trgt.parentElement.insertBefore(btnGroupElem, trgt);
1668
1780
  const notElem = trgt.previousElementSibling.childNodes[0];
1669
1781
  if (notElem.classList.contains('e-qb-toggle')) {
1670
1782
  notElem.style.display = 'none';
@@ -1707,9 +1819,11 @@ let QueryBuilder = class QueryBuilder extends Component {
1707
1819
  groupHdr = groupElem;
1708
1820
  }
1709
1821
  if (this.headerTemplate) {
1710
- args = { requestType: 'header-template-initialize', ruleID: groupElem.id,
1822
+ args = {
1823
+ requestType: 'header-template-initialize', ruleID: groupElem.id,
1711
1824
  notCondition: this.enableNotCondition ? not : undefined,
1712
- condition: condition, rule: this.getRuleCollection(rule, false), groupID: groupID };
1825
+ condition: condition, rule: this.getRuleCollection(rule, false), groupID: groupID
1826
+ };
1713
1827
  this.trigger('actionBegin', args);
1714
1828
  if (this.enableSeparateConnector && groupElem.id.indexOf('rule') !== -1) {
1715
1829
  args.requestType = 'rule-template-create';
@@ -1862,7 +1976,7 @@ let QueryBuilder = class QueryBuilder extends Component {
1862
1976
  templateChange(element, value, type) {
1863
1977
  const grpElem = closest(element, '.e-group-container');
1864
1978
  let eventsArgs;
1865
- const rules = this.getParentGroup(grpElem);
1979
+ const rules = grpElem && this.getParentGroup(grpElem);
1866
1980
  let ruleElem = closest(element, '.e-rule-container');
1867
1981
  let index = 0;
1868
1982
  if (this.allowValidation) {
@@ -1877,7 +1991,7 @@ let QueryBuilder = class QueryBuilder extends Component {
1877
1991
  index++;
1878
1992
  }
1879
1993
  }
1880
- const rule = rules.rules[index];
1994
+ const rule = rules && rules.rules[index];
1881
1995
  if (type === 'field') {
1882
1996
  this.selectedColumn = this.getColumn(value);
1883
1997
  }
@@ -1885,7 +1999,7 @@ let QueryBuilder = class QueryBuilder extends Component {
1885
1999
  this.selectedColumn = this.getColumn(rule.field);
1886
2000
  }
1887
2001
  let operVal;
1888
- this.previousColumn = this.getColumn(rule.field);
2002
+ this.previousColumn = rule && this.getColumn(rule.field);
1889
2003
  const beforeRules = this.getValidRules(this.rule);
1890
2004
  if (this.selectedColumn) {
1891
2005
  if (this.selectedColumn.operators) {
@@ -1900,11 +2014,16 @@ let QueryBuilder = class QueryBuilder extends Component {
1900
2014
  switch (type) {
1901
2015
  case 'field':
1902
2016
  if (isNullOrUndefined(value)) {
1903
- rule.field = '';
1904
- rule.label = '';
1905
- rule.type = '';
1906
- rule.value = '';
1907
- rule.operator = '';
2017
+ if (!isNullOrUndefined(rule)) {
2018
+ rule.field = '';
2019
+ rule.label = '';
2020
+ rule.type = '';
2021
+ rule.value = '';
2022
+ rule.operator = '';
2023
+ }
2024
+ else {
2025
+ return;
2026
+ }
1908
2027
  }
1909
2028
  else {
1910
2029
  rule.field = value;
@@ -1955,10 +2074,14 @@ let QueryBuilder = class QueryBuilder extends Component {
1955
2074
  ruleElement.className.indexOf('e-separate-rule') < 0) {
1956
2075
  ruleElement.className += ' e-separate-rule';
1957
2076
  }
1958
- const args = { requestType: 'template-create', action: type, ruleID: grpEle.id,
1959
- fields: this.fields, rule: rule };
1960
- eventsArgs = { groupID: grpElem.id.replace(this.element.id + '_', ''), ruleID: grpEle.id.replace(this.element.id + '_', ''),
1961
- value: rule.field, type: 'field' };
2077
+ const args = {
2078
+ requestType: 'template-create', action: type, ruleID: grpEle.id,
2079
+ fields: this.fields, rule: rule
2080
+ };
2081
+ eventsArgs = {
2082
+ groupID: grpElem.id.replace(this.element.id + '_', ''), ruleID: grpEle.id.replace(this.element.id + '_', ''),
2083
+ value: rule.field, type: 'field'
2084
+ };
1962
2085
  this.trigger('actionBegin', args);
1963
2086
  this.trigger('change', eventsArgs);
1964
2087
  }
@@ -2097,8 +2220,10 @@ let QueryBuilder = class QueryBuilder extends Component {
2097
2220
  const item = ddl.popupObj && ddl.popupObj.element.querySelector('.e-active');
2098
2221
  const itemData = ddl.getItemData();
2099
2222
  ddl.value = itemData.value;
2100
- const customArgs = { element: ddl.element, value: itemData.value, isInteracted: true,
2101
- previousItemData: this.prevItemData, previousItem: null, item: item, itemData: itemData, event: null, e: null };
2223
+ const customArgs = {
2224
+ element: ddl.element, value: itemData.value, isInteracted: true,
2225
+ previousItemData: this.prevItemData, previousItem: null, item: item, itemData: itemData, event: null, e: null
2226
+ };
2102
2227
  if (ddl.previousValue !== ddl.value) {
2103
2228
  this.changeField(customArgs);
2104
2229
  }
@@ -2210,8 +2335,10 @@ let QueryBuilder = class QueryBuilder extends Component {
2210
2335
  this.selectedColumn = this.getColumn(ddlValue);
2211
2336
  const ruleElem = closest(flt, '.e-rule-container');
2212
2337
  const ruleID = ruleElem.id.replace(this.element.id + '_', '');
2213
- const eventsArgs = { groupID: grID, ruleID: ruleID, selectedField: this.fieldMode === 'DropdownTree' ?
2214
- dl.value[0] : dl.value, cancel: false, type: 'field' };
2338
+ const eventsArgs = {
2339
+ groupID: grID, ruleID: ruleID, selectedField: this.fieldMode === 'DropdownTree' ?
2340
+ dl.value[0] : dl.value, cancel: false, type: 'field'
2341
+ };
2215
2342
  if (!this.isImportRules && !this.prvtEvtTgrDaD) {
2216
2343
  this.trigger('beforeChange', eventsArgs, (observedChangeArgs) => {
2217
2344
  this.fieldChangeSuccess(observedChangeArgs, tmpRl, flt, rl, dArg);
@@ -2794,19 +2921,25 @@ let QueryBuilder = class QueryBuilder extends Component {
2794
2921
  : getComponent(container.querySelector('.e-rule-filter .e-filter-input'), 'dropdownlist');
2795
2922
  const column = this.fieldMode === 'DropdownTree' ? this.getColumn(ddlObj.value[0]) : this.getColumn(ddlObj.value);
2796
2923
  if (typeof itemData.template === 'string' || itemData.template.write === undefined) {
2797
- const args = { rule: rule, ruleID: container.id, operator: tempRule.operator, field: column.field,
2798
- requestType: 'value-template-create' };
2924
+ const args = {
2925
+ rule: rule, ruleID: container.id, operator: tempRule.operator, field: column.field,
2926
+ requestType: 'value-template-create'
2927
+ };
2799
2928
  this.trigger('actionBegin', args);
2800
2929
  }
2801
2930
  else {
2802
2931
  const template = itemData.template;
2803
2932
  if (typeof template.write === 'string') {
2804
- getValue(template.write, window)({ elements: tempElements.length > 1 ? tempElements : tempElements[0], values: rule.value,
2805
- operator: tempRule.operator, field: column.field, dataSource: column.values });
2933
+ getValue(template.write, window)({
2934
+ elements: tempElements.length > 1 ? tempElements : tempElements[0], values: rule.value,
2935
+ operator: tempRule.operator, field: column.field, dataSource: column.values
2936
+ });
2806
2937
  }
2807
2938
  else if (typeof itemData.template !== 'function') {
2808
- itemData.template.write({ elements: tempElements.length > 1 ? tempElements : tempElements[0],
2809
- values: rule.value, operator: tempRule.operator, field: column.field, dataSource: column.values });
2939
+ itemData.template.write({
2940
+ elements: tempElements.length > 1 ? tempElements : tempElements[0],
2941
+ values: rule.value, operator: tempRule.operator, field: column.field, dataSource: column.values
2942
+ });
2810
2943
  }
2811
2944
  }
2812
2945
  }
@@ -3303,8 +3436,10 @@ let QueryBuilder = class QueryBuilder extends Component {
3303
3436
  }
3304
3437
  else {
3305
3438
  if (typeof itemData.template === 'string' || itemData.template.create === undefined) {
3306
- args = { requestType: 'value-template-initialize', ruleID: ruleID, field: field, operator: operator, rule: rule,
3307
- renderTemplate: true };
3439
+ args = {
3440
+ requestType: 'value-template-initialize', ruleID: ruleID, field: field, operator: operator, rule: rule,
3441
+ renderTemplate: true
3442
+ };
3308
3443
  this.trigger('actionBegin', args, (observedActionArgs) => {
3309
3444
  isRendered = this.actionBeginSuccessCallBack(observedActionArgs, itemData, ruleID, field, target);
3310
3445
  });
@@ -3512,7 +3647,6 @@ let QueryBuilder = class QueryBuilder extends Component {
3512
3647
  element = element ? element : ruleElement.nextElementSibling.nextElementSibling.querySelector('input.e-control');
3513
3648
  operator = getComponent(element, 'dropdownlist').value.toString();
3514
3649
  rule.rules[index].operator = operator;
3515
- // Value Fields
3516
3650
  const valueContainer = ruleElement.nextElementSibling.nextElementSibling;
3517
3651
  let elementCln = valueContainer.querySelectorAll('input.e-control');
3518
3652
  if (elementCln.length < 1) {
@@ -3674,6 +3808,9 @@ let QueryBuilder = class QueryBuilder extends Component {
3674
3808
  }
3675
3809
  }
3676
3810
  validateValue(rule, ruleElem, index) {
3811
+ if (isNullOrUndefined(rule) && isNullOrUndefined(ruleElem)) {
3812
+ return;
3813
+ }
3677
3814
  if (!isNullOrUndefined(index)) {
3678
3815
  rule = rule.rules[index];
3679
3816
  }
@@ -3835,8 +3972,10 @@ let QueryBuilder = class QueryBuilder extends Component {
3835
3972
  if (grouplen) {
3836
3973
  this.isPublic = true;
3837
3974
  for (let i = 0, len = groups.length; i < len; i++) {
3838
- this.updatedRule = { isLocked: groups[i].isLocked, condition: groups[i].condition,
3839
- not: groups[i].not };
3975
+ this.updatedRule = {
3976
+ isLocked: groups[i].isLocked, condition: groups[i].condition,
3977
+ not: groups[i].not
3978
+ };
3840
3979
  this.importRules(groups[i], groupElem, false, groups[i].not);
3841
3980
  }
3842
3981
  this.isPublic = false;
@@ -3965,10 +4104,10 @@ let QueryBuilder = class QueryBuilder extends Component {
3965
4104
  this.element.querySelector('.e-group-header').appendChild(collapseElem);
3966
4105
  }
3967
4106
  columnSort() {
3968
- if (this.sortDirection.toLowerCase() === 'descending') {
4107
+ if (this.sortDirection && this.sortDirection.toLowerCase() === 'descending') {
3969
4108
  this.columns = new DataManager(this.columns).executeLocal(new Query().sortByDesc('field'));
3970
4109
  }
3971
- else if (this.sortDirection.toLowerCase() === 'ascending') {
4110
+ else if (this.sortDirection && this.sortDirection.toLowerCase() === 'ascending') {
3972
4111
  this.columns = new DataManager(this.columns).executeLocal(new Query().sortBy('field'));
3973
4112
  }
3974
4113
  }
@@ -4454,8 +4593,10 @@ let QueryBuilder = class QueryBuilder extends Component {
4454
4593
  }
4455
4594
  }
4456
4595
  }
4457
- const dragEventArgs = { dragRuleID: targetElem !== null ? targetElem.id : grpElem !== null ? grpElem.id : null,
4458
- dragGroupID: grpElem !== null ? grpElem.id : null, cancel: false };
4596
+ const dragEventArgs = {
4597
+ dragRuleID: targetElem !== null ? targetElem.id : grpElem !== null ? grpElem.id : null,
4598
+ dragGroupID: grpElem !== null ? grpElem.id : null, cancel: false
4599
+ };
4459
4600
  this.trigger('drag', dragEventArgs);
4460
4601
  this.isDragEventPrevent = dragEventArgs.cancel;
4461
4602
  }
@@ -4475,8 +4616,10 @@ let QueryBuilder = class QueryBuilder extends Component {
4475
4616
  let prevRule;
4476
4617
  if (!isPreventelem) {
4477
4618
  const targetGrp = closest(e.target, '.e-group-container');
4478
- const dropEventArgs = { cancel: false, dropRuleID: targetGroup !== null ? targetGroup.id
4479
- : targetGrp !== null ? targetGrp.id : null, dropGroupID: targetGrp !== null ? targetGrp.id : null };
4619
+ const dropEventArgs = {
4620
+ cancel: false, dropRuleID: targetGroup !== null ? targetGroup.id
4621
+ : targetGrp !== null ? targetGrp.id : null, dropGroupID: targetGrp !== null ? targetGrp.id : null
4622
+ };
4480
4623
  this.trigger('drop', dropEventArgs);
4481
4624
  if (dropEventArgs.cancel) {
4482
4625
  isPreventelem = true;
@@ -5242,7 +5385,8 @@ let QueryBuilder = class QueryBuilder extends Component {
5242
5385
  else {
5243
5386
  if (customObj && (customObj.type === 'question' || customObj.type === 'answer')) {
5244
5387
  const notValue = rule.not;
5245
- rule = { 'label': rule.label, 'field': rule.field, 'operator': rule.operator, 'type': rule.type, 'value': rule.value,
5388
+ rule = {
5389
+ 'label': rule.label, 'field': rule.field, 'operator': rule.operator, 'type': rule.type, 'value': rule.value,
5246
5390
  'condition': rule.condition, 'rules': rule.rules
5247
5391
  };
5248
5392
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -5564,21 +5708,40 @@ let QueryBuilder = class QueryBuilder extends Component {
5564
5708
  let columns = this.columns;
5565
5709
  let column;
5566
5710
  columns = col ? col : columns;
5567
- for (let i = 0, iLen = columns.length; i < iLen; i++) {
5711
+ const fieldParts = this.separator !== '' ? (field ? field.split(this.separator) : []) : [field];
5712
+ const rootField = fieldParts && fieldParts.length > 0 ? fieldParts[0] : null;
5713
+ for (let i = 0; i < columns.length; i++) {
5568
5714
  if (columns[i].field === field) {
5569
5715
  column = columns[i];
5570
5716
  break;
5571
5717
  }
5572
- else if (columns[i].columns) {
5573
- column = this.getColumn(field, columns[i].columns);
5574
- if (column) {
5718
+ }
5719
+ if (!column && this.separator !== '') {
5720
+ for (let i = 0; i < columns.length; i++) {
5721
+ if (columns[i].field === rootField) {
5722
+ if (columns[i].columns) {
5723
+ const subField = field.substring(rootField.length + this.separator.length);
5724
+ if (subField) {
5725
+ column = this.getColumn(subField, columns[i].columns);
5726
+ }
5727
+ else {
5728
+ column = columns[i];
5729
+ }
5730
+ }
5731
+ else {
5732
+ column = columns[i];
5733
+ }
5575
5734
  break;
5576
5735
  }
5577
5736
  }
5578
- else if (field && field.indexOf(this.separator) > -1) {
5579
- if (this.separator !== '' && columns[i].field === field.split(this.separator)[0]) {
5580
- column = columns[i];
5581
- break;
5737
+ }
5738
+ if (!column) {
5739
+ for (let i = 0; i < columns.length; i++) {
5740
+ if (columns[i].columns) {
5741
+ column = this.getColumn(field, columns[i].columns);
5742
+ if (column) {
5743
+ break;
5744
+ }
5582
5745
  }
5583
5746
  }
5584
5747
  }
@@ -6039,86 +6202,74 @@ let QueryBuilder = class QueryBuilder extends Component {
6039
6202
  else {
6040
6203
  queryStr += '(';
6041
6204
  }
6042
- let condition = rules.condition;
6043
6205
  if (rules.not) {
6044
- let rulesNotCondition;
6045
- if (isRoot) {
6046
- rulesNotCondition = sqlLocale ? this.l10n.getConstant('NOT').toUpperCase() + ' (' : 'NOT (';
6047
- queryStr += rulesNotCondition;
6048
- }
6049
- else {
6050
- rulesNotCondition = sqlLocale ? ' ' + this.l10n.getConstant('NOT').toUpperCase() + ' (' : ' NOT (';
6051
- queryStr += rulesNotCondition;
6052
- }
6206
+ const notPrefix = sqlLocale ? this.l10n.getConstant('NOT').toUpperCase() + ' ' : 'NOT ';
6207
+ queryStr += isRoot ? notPrefix + '(' : ' ' + notPrefix + '(';
6053
6208
  }
6054
- if (rules.rules) {
6055
- for (let j = 0, jLen = rules.rules.length; j < jLen; j++) {
6056
- if (rules.rules[j].rules) {
6057
- queryStr = this.getSqlString(rules.rules[j], enableEscape, queryStr, sqlLocale);
6209
+ if (rules.rules && rules.rules.length) {
6210
+ queryStr += rules.rules.reduce((result, rule, j) => {
6211
+ let ruleStr = '';
6212
+ if (rule.rules) {
6213
+ ruleStr = this.getSqlString(rule, enableEscape, '', sqlLocale);
6058
6214
  if (this.enableSeparateConnector) {
6059
- condition = rules.rules[j].condition;
6215
+ rules.condition = rule.condition;
6060
6216
  }
6061
6217
  }
6062
6218
  else {
6063
- const rule = rules.rules[j];
6064
- let valueStr = '';
6065
6219
  const ruleOpertor = sqlLocale ? this.sqlOperators[rule.operator] : this.operators[rule.operator];
6220
+ let valueStr = '';
6066
6221
  if (rule.value instanceof Array) {
6067
6222
  if (rule.operator.toString().indexOf('between') > -1) {
6068
- const ruleCondition = sqlLocale ? ' ' + this.l10n.getConstant('AND').toUpperCase() + ' ' : ' ' + 'AND' + ' ';
6223
+ const ruleCondition = sqlLocale ? ' ' + this.l10n.getConstant('AND').toUpperCase() + ' ' : ' AND ';
6069
6224
  if (rule.type === 'date' && !this.isDateFunction(rule.value[0])) {
6070
- valueStr += '"' + rule.value[0] + '"' + ruleCondition + '"' + rule.value[1] + '"';
6225
+ valueStr = `"${rule.value[0]}"${ruleCondition}"${rule.value[1]}"`;
6071
6226
  }
6072
6227
  else {
6073
- valueStr += rule.value[0] + ruleCondition + rule.value[1];
6228
+ valueStr = `${rule.value[0]}${ruleCondition}${rule.value[1]}`;
6074
6229
  }
6075
6230
  }
6076
6231
  else {
6077
6232
  if (typeof rule.value[0] === 'string' && rule.value !== null) {
6078
- valueStr += '("' + rule.value[0] + '"';
6079
- for (let k = 1, kLen = rule.value.length; k < kLen; k++) {
6080
- valueStr += ',"' + rule.value[k] + '"';
6081
- }
6082
- valueStr += ')';
6233
+ const valueArray = rule.value;
6234
+ valueStr = '("' + valueArray.join('","') + '")';
6083
6235
  }
6084
6236
  else {
6085
- valueStr += '(' + rule.value + ')';
6237
+ valueStr = `(${rule.value})`;
6086
6238
  }
6087
6239
  }
6088
6240
  }
6089
6241
  else {
6090
6242
  if (rule.operator.toString().indexOf('startswith') > -1) {
6091
- valueStr += rule.value ? '("' + rule.value + '%")' : '(' + rule.value + ')';
6243
+ valueStr = rule.value ? `("${rule.value}%")` : `(${rule.value})`;
6092
6244
  }
6093
6245
  else if (rule.operator.toString().indexOf('endswith') > -1) {
6094
- valueStr += rule.value ? '("%' + rule.value + '")' : '(' + rule.value + ')';
6246
+ valueStr = rule.value ? `("%${rule.value}")` : `(${rule.value})`;
6095
6247
  }
6096
6248
  else if (rule.operator.toString().indexOf('contains') > -1) {
6097
- valueStr += rule.value ? '("%' + rule.value + '%")' : '(' + rule.value + ')';
6249
+ valueStr = rule.value ? `("%${rule.value}%")` : `(${rule.value})`;
6098
6250
  }
6099
6251
  else {
6100
6252
  if (rule.type === 'number' || typeof rule.value === 'boolean' ||
6101
6253
  (rule.value === null && (rule.operator.toString().indexOf('empty') < -1))) {
6102
- valueStr += rule.value;
6254
+ valueStr = `${rule.value}`;
6103
6255
  }
6104
6256
  else if (rule.operator.toString().indexOf('empty') > -1) {
6105
- valueStr += '""';
6257
+ valueStr = '""';
6106
6258
  }
6107
6259
  else {
6108
- valueStr += '"' + rule.value + '"';
6260
+ valueStr = `"${rule.value}"`;
6109
6261
  }
6110
6262
  }
6111
6263
  }
6264
+ let fieldName = rule.field;
6265
+ if (enableEscape) {
6266
+ fieldName = '`' + fieldName + '`';
6267
+ }
6268
+ else if (fieldName.indexOf(' ') > -1) {
6269
+ fieldName = '"' + fieldName + '"';
6270
+ }
6112
6271
  if (rule.operator.toString().indexOf('null') > -1) {
6113
- if (enableEscape) {
6114
- rule.field = '`' + rule.field + '`';
6115
- }
6116
- else {
6117
- if (rule.field.indexOf(' ') > -1) {
6118
- rule.field = '"' + rule.field + '"';
6119
- }
6120
- }
6121
- queryStr += rule.field + ' ' + ruleOpertor;
6272
+ ruleStr = fieldName + ' ' + ruleOpertor;
6122
6273
  }
6123
6274
  else {
6124
6275
  let custOper = ruleOpertor;
@@ -6128,33 +6279,21 @@ let QueryBuilder = class QueryBuilder extends Component {
6128
6279
  else if (rule.operator === 'isnotempty') {
6129
6280
  custOper = '!=';
6130
6281
  }
6131
- if (enableEscape) {
6132
- rule.field = '`' + rule.field + '`';
6133
- }
6134
- else {
6135
- if (rule.field.indexOf(' ') > -1) {
6136
- rule.field = '"' + rule.field + '"';
6137
- }
6138
- }
6139
- queryStr += rule.field + ' ' + custOper + ' ' + valueStr;
6140
- }
6141
- if (rule.condition && rule.condition !== '') {
6142
- condition = rule.condition;
6282
+ ruleStr = fieldName + ' ' + custOper + ' ' + valueStr;
6143
6283
  }
6144
6284
  }
6145
- if (j !== jLen - 1) {
6146
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
6147
- const rule = rules.rules[j];
6148
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
6285
+ if (j !== rules.rules.length - 1) {
6286
+ let condition = rules.condition;
6149
6287
  if (condition === '' || (rule && rule.condition !== '' && rule.custom && rule.custom.isCustom)) {
6150
6288
  condition = rule.condition;
6151
6289
  }
6152
6290
  if (condition) {
6153
6291
  condition = sqlLocale ? this.l10n.getConstant(condition.toUpperCase()).toUpperCase() : condition.toUpperCase();
6154
- queryStr += ' ' + condition + ' ';
6292
+ ruleStr += ' ' + condition + ' ';
6155
6293
  }
6156
6294
  }
6157
- }
6295
+ return result + ruleStr;
6296
+ }, '');
6158
6297
  }
6159
6298
  if (!isRoot) {
6160
6299
  queryStr += ')';
@@ -6472,23 +6611,19 @@ let QueryBuilder = class QueryBuilder extends Component {
6472
6611
  return subOp[i].length;
6473
6612
  }
6474
6613
  }
6475
- //Left Parenthesis
6476
6614
  if (/^\(/.exec(sqlString)) {
6477
6615
  this.parser.push(['Left', '(']);
6478
6616
  return 1;
6479
6617
  }
6480
- //Right Parenthesis
6481
6618
  if (/^\)/.exec(sqlString)) {
6482
6619
  this.parser.push(['Right', ')']);
6483
6620
  return 1;
6484
6621
  }
6485
- //Boolean
6486
6622
  if (/^(true|false)/.exec(sqlString)) {
6487
6623
  matchValue = /^(true|false)/.exec(sqlString)[0];
6488
6624
  this.parser.push(['String', matchValue]);
6489
6625
  return matchValue.length;
6490
6626
  }
6491
- //Null
6492
6627
  if (/^null/.exec(sqlString)) {
6493
6628
  matchValue = /^null/.exec(sqlString)[0];
6494
6629
  this.parser.push(['String', null]);
@@ -6513,7 +6648,6 @@ let QueryBuilder = class QueryBuilder extends Component {
6513
6648
  return matchValue.length;
6514
6649
  }
6515
6650
  }
6516
- //String
6517
6651
  const singleString = this.getSingleQuoteString(sqlString);
6518
6652
  if (singleString !== '') {
6519
6653
  matchValue = singleString;
@@ -6533,24 +6667,20 @@ let QueryBuilder = class QueryBuilder extends Component {
6533
6667
  !this.checkCondition(sqlString, matchValue)) {
6534
6668
  matchValue = this.combineSingleQuoteString(sqlString, matchValue);
6535
6669
  }
6536
- // end
6537
6670
  this.parser.push(['String', matchValue]);
6538
6671
  return matchValue.length;
6539
6672
  }
6540
- // Double String
6541
6673
  const doubleString = this.getDoubleQuoteString(sqlString);
6542
6674
  if (doubleString !== '') {
6543
6675
  matchValue = doubleString;
6544
6676
  this.parser.push(['DoubleString', matchValue]);
6545
6677
  return matchValue.length;
6546
6678
  }
6547
- //Number
6548
6679
  if (/^\d*\.?\d+/.exec(sqlString)) {
6549
6680
  matchValue = /^\d*\.?\d+/.exec(sqlString)[0];
6550
6681
  this.parser.push(['Number', matchValue]);
6551
6682
  return matchValue.length;
6552
6683
  }
6553
- //Negative Number
6554
6684
  if (/^-?\d*\.?\d+/.exec(sqlString)) {
6555
6685
  matchValue = /^-?\d*\.?\d+/.exec(sqlString)[0];
6556
6686
  this.parser.push(['Number', matchValue]);
@@ -6718,7 +6848,7 @@ let QueryBuilder = class QueryBuilder extends Component {
6718
6848
  fieldName += this.separator;
6719
6849
  }
6720
6850
  }
6721
- return this.getColumn(fieldName).label;
6851
+ return this.getColumn(fieldName) ? this.getColumn(fieldName).label : '';
6722
6852
  }
6723
6853
  processParser(parser, rules, levelColl, sqlLocale) {
6724
6854
  let j;
@@ -6950,12 +7080,16 @@ let QueryBuilder = class QueryBuilder extends Component {
6950
7080
  }
6951
7081
  }
6952
7082
  if (this.enableSeparateConnector) {
6953
- this.addRules([{ 'label': getRule.label, 'field': getRule.field, 'type': getRule.type, 'operator': getRule.operator,
6954
- 'value': getRule.value, 'condition': getRule.condition }], groupId);
7083
+ this.addRules([{
7084
+ 'label': getRule.label, 'field': getRule.field, 'type': getRule.type, 'operator': getRule.operator,
7085
+ 'value': getRule.value, 'condition': getRule.condition
7086
+ }], groupId);
6955
7087
  }
6956
7088
  else {
6957
- this.addRules([{ 'label': getRule.label, 'field': getRule.field, 'type': getRule.type, 'operator': getRule.operator,
6958
- 'value': getRule.value }], groupId);
7089
+ this.addRules([{
7090
+ 'label': getRule.label, 'field': getRule.field, 'type': getRule.type, 'operator': getRule.operator,
7091
+ 'value': getRule.value
7092
+ }], groupId);
6959
7093
  }
6960
7094
  this.ruleIndex = -1;
6961
7095
  }
@@ -7130,115 +7264,65 @@ let QueryBuilder = class QueryBuilder extends Component {
7130
7264
  this.disableRuleControls(target, groupElem, isDisabled);
7131
7265
  }
7132
7266
  disableRuleControls(target, groupElem, isDisabled) {
7133
- const ddlElement = groupElem.querySelectorAll('.e-control.e-dropdownlist');
7134
- const numericElement = groupElem.querySelectorAll('.e-control.e-numerictextbox');
7135
- const textElement = groupElem.querySelectorAll('.e-control.e-textbox');
7136
- const dateElement = groupElem.querySelectorAll('.e-control.e-datepicker');
7137
- const checkboxElement = groupElem.querySelectorAll('.e-control.e-checkbox');
7138
- const radioBtnElement = groupElem.querySelectorAll('.e-control.e-radio');
7139
- const multiSelectElement = groupElem.querySelectorAll('.e-control.e-multiselect');
7140
- const deleteElem = groupElem.querySelectorAll('.e-rule-delete');
7141
- const lockElem = groupElem.querySelectorAll('.e-lock-rule');
7142
- const cloneElem = groupElem.querySelectorAll('.e-clone-rule');
7143
- const ruleElem = groupElem.querySelectorAll('.e-rule-container');
7144
- for (let i = 0; i < deleteElem.length; i++) {
7267
+ const disableComponents = (elements, componentGetter, isDisabled) => {
7268
+ elements.forEach((element) => {
7269
+ const component = componentGetter(element);
7270
+ if ('enabled' in component) {
7271
+ component.enabled = !isDisabled;
7272
+ }
7273
+ else if ('disabled' in component) {
7274
+ component.disabled = isDisabled;
7275
+ }
7276
+ });
7277
+ };
7278
+ const elements = {
7279
+ ddl: groupElem.querySelectorAll('.e-control.e-dropdownlist'),
7280
+ numeric: groupElem.querySelectorAll('.e-control.e-numerictextbox'),
7281
+ text: groupElem.querySelectorAll('.e-control.e-textbox'),
7282
+ date: groupElem.querySelectorAll('.e-control.e-datepicker'),
7283
+ checkbox: groupElem.querySelectorAll('.e-control.e-checkbox'),
7284
+ radio: groupElem.querySelectorAll('.e-control.e-radio'),
7285
+ multiSelect: groupElem.querySelectorAll('.e-control.e-multiselect'),
7286
+ deleteElem: groupElem.querySelectorAll('.e-rule-delete'),
7287
+ lockElem: groupElem.querySelectorAll('.e-lock-rule'),
7288
+ cloneElem: groupElem.querySelectorAll('.e-clone-rule'),
7289
+ ruleElem: groupElem.querySelectorAll('.e-rule-container')
7290
+ };
7291
+ elements.deleteElem.forEach((elem, i) => {
7145
7292
  if (isDisabled) {
7146
- if (ruleElem[i] && ruleElem[i].classList.contains('e-disable')) {
7147
- ruleElem[i].classList.add('e-disable');
7293
+ if (elements.ruleElem[i] && elements.ruleElem[i].classList.contains('e-disable')) {
7294
+ elements.ruleElem[i].classList.add('e-disable');
7148
7295
  }
7149
- deleteElem[i].disabled = true;
7150
- if (cloneElem[i]) {
7151
- cloneElem[i].disabled = true;
7296
+ elements.deleteElem[i].disabled = true;
7297
+ if (elements.cloneElem[i]) {
7298
+ elements.cloneElem[i].disabled = true;
7152
7299
  }
7153
- if (lockElem[i] !== target) {
7154
- lockElem[i].disabled = true;
7155
- lockElem[i].children[0].classList.remove('e-unlock');
7156
- lockElem[i].children[0].classList.add('e-lock');
7300
+ if (elements.lockElem[i] !== target) {
7301
+ elements.lockElem[i].disabled = true;
7302
+ elements.lockElem[i].children[0].classList.remove('e-unlock');
7303
+ elements.lockElem[i].children[0].classList.add('e-lock');
7157
7304
  }
7158
7305
  }
7159
7306
  else {
7160
- if (ruleElem[i]) {
7161
- ruleElem[i].classList.remove('e-disable');
7307
+ if (elements.ruleElem[i]) {
7308
+ elements.ruleElem[i].classList.remove('e-disable');
7162
7309
  }
7163
- if (cloneElem[i]) {
7164
- cloneElem[i].disabled = false;
7310
+ if (elements.cloneElem[i]) {
7311
+ elements.cloneElem[i].disabled = false;
7165
7312
  }
7166
- deleteElem[i].disabled = false;
7167
- lockElem[i].disabled = false;
7168
- lockElem[i].children[0].classList.remove('e-lock');
7169
- lockElem[i].children[0].classList.add('e-unlock');
7170
- }
7171
- }
7172
- let dropDownObj;
7173
- let numericObj;
7174
- let textObj;
7175
- let dateObj;
7176
- let checkBoxObj;
7177
- let radioBtnObj;
7178
- let multiSelectObj;
7179
- for (let i = 0; i < ddlElement.length; i++) {
7180
- dropDownObj = getComponent(ddlElement[i], 'dropdownlist');
7181
- if (isDisabled) {
7182
- dropDownObj.enabled = false;
7183
- }
7184
- else {
7185
- dropDownObj.enabled = true;
7186
- }
7187
- }
7188
- for (let i = 0; i < numericElement.length; i++) {
7189
- numericObj = getComponent(numericElement[i], 'numerictextbox');
7190
- if (isDisabled) {
7191
- numericObj.enabled = false;
7192
- }
7193
- else {
7194
- numericObj.enabled = true;
7195
- }
7196
- }
7197
- for (let i = 0; i < textElement.length; i++) {
7198
- textObj = getComponent(textElement[i], 'textbox');
7199
- if (isDisabled) {
7200
- textObj.enabled = false;
7201
- }
7202
- else {
7203
- textObj.enabled = true;
7204
- }
7205
- }
7206
- for (let i = 0; i < dateElement.length; i++) {
7207
- dateObj = getComponent(dateElement[i], 'datepicker');
7208
- if (isDisabled) {
7209
- dateObj.enabled = false;
7210
- }
7211
- else {
7212
- dateObj.enabled = true;
7213
- }
7214
- }
7215
- for (let i = 0; i < checkboxElement.length; i++) {
7216
- checkBoxObj = getComponent(checkboxElement[i], 'checkbox');
7217
- if (isDisabled) {
7218
- checkBoxObj.disabled = true;
7219
- }
7220
- else {
7221
- checkBoxObj.disabled = false;
7222
- }
7223
- }
7224
- for (let i = 0; i < radioBtnElement.length; i++) {
7225
- radioBtnObj = getComponent(radioBtnElement[i], 'radio');
7226
- if (isDisabled) {
7227
- radioBtnObj.disabled = true;
7228
- }
7229
- else {
7230
- radioBtnObj.disabled = false;
7231
- }
7232
- }
7233
- for (let i = 0; i < multiSelectElement.length; i++) {
7234
- multiSelectObj = getComponent(multiSelectElement[i], 'multiselect');
7235
- if (isDisabled) {
7236
- multiSelectObj.enabled = false;
7237
- }
7238
- else {
7239
- multiSelectObj.enabled = true;
7313
+ elements.deleteElem[i].disabled = false;
7314
+ elements.lockElem[i].disabled = false;
7315
+ elements.lockElem[i].children[0].classList.remove('e-lock');
7316
+ elements.lockElem[i].children[0].classList.add('e-unlock');
7240
7317
  }
7241
- }
7318
+ });
7319
+ disableComponents(elements.ddl, (elem) => getComponent(elem, 'dropdownlist'), isDisabled);
7320
+ disableComponents(elements.numeric, (elem) => getComponent(elem, 'numerictextbox'), isDisabled);
7321
+ disableComponents(elements.text, (elem) => getComponent(elem, 'textbox'), isDisabled);
7322
+ disableComponents(elements.date, (elem) => getComponent(elem, 'datepicker'), isDisabled);
7323
+ disableComponents(elements.checkbox, (elem) => getComponent(elem, 'checkbox'), isDisabled);
7324
+ disableComponents(elements.radio, (elem) => getComponent(elem, 'radio'), isDisabled);
7325
+ disableComponents(elements.multiSelect, (elem) => getComponent(elem, 'multiselect'), isDisabled);
7242
7326
  }
7243
7327
  };
7244
7328
  __decorate([