@syncfusion/ej2-querybuilder 19.2.60 → 19.3.53

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.
Files changed (41) hide show
  1. package/.eslintrc.json +1 -1
  2. package/CHANGELOG.md +17 -0
  3. package/dist/ej2-querybuilder.umd.min.js +2 -2
  4. package/dist/ej2-querybuilder.umd.min.js.map +1 -1
  5. package/dist/es6/ej2-querybuilder.es2015.js +176 -66
  6. package/dist/es6/ej2-querybuilder.es2015.js.map +1 -1
  7. package/dist/es6/ej2-querybuilder.es5.js +174 -64
  8. package/dist/es6/ej2-querybuilder.es5.js.map +1 -1
  9. package/dist/global/ej2-querybuilder.min.js +2 -2
  10. package/dist/global/ej2-querybuilder.min.js.map +1 -1
  11. package/dist/global/index.d.ts +1 -1
  12. package/helpers/e2e/index.d.ts +1 -0
  13. package/helpers/e2e/index.js +6 -0
  14. package/helpers/e2e/querybuilderHelper.d.ts +37 -0
  15. package/helpers/e2e/querybuilderHelper.js +36 -0
  16. package/package.json +11 -11
  17. package/src/query-builder/query-builder-model.d.ts +10 -3
  18. package/src/query-builder/query-builder.d.ts +17 -2
  19. package/src/query-builder/query-builder.js +174 -64
  20. package/styles/bootstrap5-dark.css +962 -0
  21. package/styles/bootstrap5-dark.scss +1 -0
  22. package/styles/bootstrap5.css +962 -0
  23. package/styles/bootstrap5.scss +1 -0
  24. package/styles/material-dark.css +3 -3
  25. package/styles/query-builder/_bootstrap5-dark-definition.scss +1 -0
  26. package/styles/query-builder/_bootstrap5-definition.scss +107 -0
  27. package/styles/query-builder/_tailwind-dark-definition.scss +1 -106
  28. package/styles/query-builder/_tailwind-definition.scss +17 -16
  29. package/styles/query-builder/_theme.scss +1 -1
  30. package/styles/query-builder/bootstrap5-dark.css +962 -0
  31. package/styles/query-builder/bootstrap5-dark.scss +15 -0
  32. package/styles/query-builder/bootstrap5.css +962 -0
  33. package/styles/query-builder/bootstrap5.scss +15 -0
  34. package/styles/query-builder/icons/_bootstrap5-dark.scss +1 -0
  35. package/styles/query-builder/icons/_bootstrap5.scss +8 -0
  36. package/styles/query-builder/icons/_tailwind.scss +1 -1
  37. package/styles/query-builder/material-dark.css +3 -3
  38. package/styles/query-builder/tailwind-dark.css +9 -9
  39. package/styles/query-builder/tailwind.css +10 -10
  40. package/styles/tailwind-dark.css +9 -9
  41. package/styles/tailwind.css +10 -10
@@ -1,6 +1,6 @@
1
1
  import { Animation, Browser, ChildProperty, Collection, Complex, Component, Event, EventHandler, Internationalization, L10n, NotifyPropertyChanges, Property, addClass, classList, cldrData, closest, compile, detach, extend, getComponent, getInstance, getUniqueID, getValue, isNullOrUndefined, removeClass, rippleEffect, select } from '@syncfusion/ej2-base';
2
2
  import { Button, RadioButton } from '@syncfusion/ej2-buttons';
3
- import { CheckBoxSelection, DropDownList, MultiSelect } from '@syncfusion/ej2-dropdowns';
3
+ import { CheckBoxSelection, DropDownList, DropDownTree, MultiSelect } from '@syncfusion/ej2-dropdowns';
4
4
  import { DataManager, Deferred, Predicate, Query } from '@syncfusion/ej2-data';
5
5
  import { NumericTextBox, TextBox } from '@syncfusion/ej2-inputs';
6
6
  import { DatePicker } from '@syncfusion/ej2-calendars';
@@ -279,7 +279,9 @@ let QueryBuilder = class QueryBuilder extends Component {
279
279
  }
280
280
  updateSubFieldsFromColumns(col, field) {
281
281
  for (let i = 0; i < col.length; i++) {
282
- col[i].field = field ? field + this.separator + col[i].field : col[i].field;
282
+ if (this.separator != '' && col[i].field.indexOf(this.separator) < 0) {
283
+ col[i].field = field ? field + this.separator + col[i].field : col[i].field;
284
+ }
283
285
  if (col[i].operators) {
284
286
  this.updateCustomOperator(col[i]);
285
287
  }
@@ -598,28 +600,57 @@ let QueryBuilder = class QueryBuilder extends Component {
598
600
  this.updateAddedRule(trgt, rule, newRule, isRlTmp, pId);
599
601
  }
600
602
  if (!column || (column && !column.ruleTemplate)) {
601
- let ddlField;
602
- const ddlValue = this.isImportRules ? this.GetRootColumnName(rule.field) : rule.field;
603
- ddlField = {
604
- dataSource: this.columns,
605
- fields: this.fields, placeholder: this.l10n.getConstant('SelectField'),
606
- popupHeight: ((this.columns.length > 5) ? height : 'auto'),
607
- change: this.changeField.bind(this), value: rule ? ddlValue : null,
608
- open: this.popupOpen.bind(this)
609
- };
610
- if (this.fieldModel) {
611
- ddlField = Object.assign({}, ddlField, this.fieldModel);
603
+ if (this.fieldMode === 'Default') {
604
+ let ddlField;
605
+ const ddlValue = this.isImportRules ? this.GetRootColumnName(rule.field) : rule.field;
606
+ ddlField = {
607
+ dataSource: this.columns,
608
+ fields: this.fields, placeholder: this.l10n.getConstant('SelectField'),
609
+ popupHeight: ((this.columns.length > 5) ? height : 'auto'),
610
+ change: this.changeField.bind(this), value: rule ? ddlValue : null, open: this.popupOpen.bind(this)
611
+ };
612
+ if (this.fieldModel) {
613
+ ddlField = Object.assign({}, ddlField, this.fieldModel);
614
+ }
615
+ dropDownList = new DropDownList(ddlField);
616
+ dropDownList.appendTo('#' + ruleElem.id + '_filterkey');
617
+ const ddlVal = this.isImportRules ?
618
+ this.GetRootColumnName(rule.field) : dropDownList.value;
619
+ this.selectedColumn = dropDownList.getDataByValue(ddlVal);
620
+ if (Object.keys(rule).length) {
621
+ this.changeRule(rule, {
622
+ element: dropDownList.element, itemData: this.selectedColumn
623
+ });
624
+ }
612
625
  }
613
- dropDownList = new DropDownList(ddlField);
614
- dropDownList.appendTo('#' + ruleElem.id + '_filterkey');
615
- const ddlVal = this.isImportRules ?
616
- this.GetRootColumnName(rule.field) : dropDownList.value;
617
- this.selectedColumn = dropDownList.getDataByValue(ddlVal);
618
- if (Object.keys(rule).length) {
619
- this.changeRule(rule, {
620
- element: dropDownList.element,
621
- itemData: this.selectedColumn
622
- });
626
+ else {
627
+ let dropdowntree;
628
+ let ddlField;
629
+ const ddlValue = this.isImportRules ? rule.field : rule.field;
630
+ ddlField = {
631
+ fields: { dataSource: this.columns,
632
+ value: "field", text: "label", child: 'columns', expanded: "expanded" },
633
+ placeholder: this.l10n.getConstant('SelectField'), showClearButton: false,
634
+ popupHeight: ((this.columns.length > 5) ? height : 'auto'), changeOnBlur: false,
635
+ change: this.changeField.bind(this), value: this.isImportRules ? [ddlValue] : null,
636
+ open: this.popupOpen.bind(this)
637
+ };
638
+ if (this.fieldModel) {
639
+ ddlField = Object.assign({}, ddlField, this.fieldModel);
640
+ }
641
+ dropdowntree = new DropDownTree(ddlField);
642
+ dropdowntree.appendTo('#' + ruleElem.id + '_filterkey');
643
+ if (!isNullOrUndefined(dropdowntree.value)) {
644
+ dropdowntree.element.value = dropdowntree.value[0];
645
+ }
646
+ const ddlVal = this.isImportRules ?
647
+ this.GetRootColumnName(rule.field) : dropdowntree.value;
648
+ this.selectedColumn = this.getColumn(ddlVal);
649
+ if (Object.keys(rule).length) {
650
+ this.changeRule(rule, {
651
+ element: dropdowntree.element, itemData: this.selectedColumn
652
+ });
653
+ }
623
654
  }
624
655
  }
625
656
  ruleID = ruleElem.id.replace(this.element.id + '_', '');
@@ -847,7 +878,7 @@ let QueryBuilder = class QueryBuilder extends Component {
847
878
  else {
848
879
  clsName = 'e-removerule e-rule-delete e-css e-btn e-small e-button-hide';
849
880
  }
850
- const delBtnElem = this.createElement('button', { attrs: { class: clsName } });
881
+ const delBtnElem = this.createElement('button', { attrs: { type: 'button', class: clsName } });
851
882
  tempElem.appendChild(delBtnElem);
852
883
  fieldElem.appendChild(tempElem);
853
884
  ruleElem.appendChild(fieldElem);
@@ -898,7 +929,7 @@ let QueryBuilder = class QueryBuilder extends Component {
898
929
  }
899
930
  if (isGroup) {
900
931
  const clsName = this.showButtons.groupDelete ? 'e-deletegroup' : 'e-deletegroup e-button-hide';
901
- dltGroupBtn = this.createElement('button', { attrs: { class: clsName } });
932
+ dltGroupBtn = this.createElement('button', { attrs: { type: 'button', class: clsName } });
902
933
  const button = new Button({ iconCss: 'e-icons e-delete-icon', cssClass: 'e-small e-round' });
903
934
  button.appendTo(dltGroupBtn);
904
935
  dltGroupBtn.setAttribute('title', this.l10n.getConstant('DeleteGroup'));
@@ -974,7 +1005,7 @@ let QueryBuilder = class QueryBuilder extends Component {
974
1005
  const groupHdr = groupElem.querySelector('.e-group-header');
975
1006
  if (this.headerTemplate) {
976
1007
  args = { requestType: 'header-template-initialize', ruleID: groupElem.id,
977
- notCondition: this.enableNotCondition ? not : undefined, condition: condition, rule: rule };
1008
+ notCondition: this.enableNotCondition ? not : undefined, condition: condition, rule: this.getRuleCollection(rule, true) };
978
1009
  this.trigger('actionBegin', args);
979
1010
  this.headerFn = this.templateParser(this.headerTemplate);
980
1011
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -1127,12 +1158,17 @@ let QueryBuilder = class QueryBuilder extends Component {
1127
1158
  }
1128
1159
  changeValue(i, args) {
1129
1160
  let element;
1130
- if (args.event) {
1161
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1162
+ if (args.element && args.element.classList.contains('e-multiselect')) {
1163
+ const multiSelectArgs = args;
1164
+ element = multiSelectArgs.element;
1165
+ }
1166
+ else if (args.event) {
1131
1167
  element = args.event.target;
1132
1168
  }
1133
1169
  else {
1134
- const multiSelectArgs = args;
1135
- element = multiSelectArgs.element;
1170
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1171
+ element = args.element;
1136
1172
  }
1137
1173
  if (element.className.indexOf('e-day') > -1 || element.className.indexOf('e-today') > -1 || element.className.indexOf('e-cell') > -1) {
1138
1174
  const calenderArgs = args;
@@ -1200,10 +1236,41 @@ let QueryBuilder = class QueryBuilder extends Component {
1200
1236
  changeField(args) {
1201
1237
  if (args.isInteracted) {
1202
1238
  const fieldElem = closest(args.element, '.e-rule-filter') || closest(args.element, '.e-rule-sub-filter');
1239
+ const column = this.fieldMode === 'DropdownTree' ? this.getColumn(args.value[0]) : this.getColumn(args.value);
1240
+ if (this.fieldMode === 'DropdownTree' && fieldElem != null) {
1241
+ const ddtElem = fieldElem.querySelector(".e-control");
1242
+ const ddt = getComponent(ddtElem, 'dropdowntree');
1243
+ if (column) {
1244
+ if (column.type == 'object') {
1245
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1246
+ ddt.value = args.oldValue;
1247
+ ddt.dataBind();
1248
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1249
+ if (isNullOrUndefined(args.oldValue)) {
1250
+ ddtElem.value = "";
1251
+ }
1252
+ else {
1253
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1254
+ ddtElem.value = args.oldValue[0];
1255
+ }
1256
+ return;
1257
+ }
1258
+ else {
1259
+ if (!isNullOrUndefined(args.value[0])) {
1260
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1261
+ ddt.value = args.value[0];
1262
+ ddt.dataBind();
1263
+ ddtElem.value = args.value[0];
1264
+ }
1265
+ }
1266
+ }
1267
+ else {
1268
+ return;
1269
+ }
1270
+ }
1203
1271
  this.destroySubFields(fieldElem);
1204
1272
  this.subFieldElem = null;
1205
1273
  this.isNotValueChange = true;
1206
- const column = this.getColumn(args.value);
1207
1274
  if (column && column.ruleTemplate) {
1208
1275
  this.templateChange(args.element, column.field, 'field');
1209
1276
  }
@@ -1222,23 +1289,41 @@ let QueryBuilder = class QueryBuilder extends Component {
1222
1289
  }
1223
1290
  changeRule(rule, ddlArgs) {
1224
1291
  if (!ddlArgs.itemData) {
1225
- return;
1292
+ if (this.fieldMode === "DropdownTree") {
1293
+ const ddt = getComponent(ddlArgs.element, 'dropdowntree');
1294
+ if (ddt.value == null) {
1295
+ return;
1296
+ }
1297
+ }
1298
+ else {
1299
+ return;
1300
+ }
1226
1301
  }
1227
1302
  const tempRule = {};
1228
1303
  let filterElem = closest(ddlArgs.element, '.e-rule-filter');
1229
1304
  filterElem = filterElem ? filterElem : closest(ddlArgs.element, '.e-rule-sub-filter');
1230
- const ddlObj = getComponent(ddlArgs.element, 'dropdownlist');
1305
+ let ddlObj = getComponent(ddlArgs.element, 'dropdownlist');
1306
+ if (this.fieldMode === 'DropdownTree' && filterElem != null) {
1307
+ ddlObj = getComponent(ddlArgs.element, 'dropdowntree');
1308
+ }
1231
1309
  const element = closest(ddlArgs.element, '.e-group-container');
1232
1310
  const groupID = element.id.replace(this.element.id + '_', '');
1233
1311
  this.changeFilter(filterElem, ddlObj, groupID, rule, tempRule, ddlArgs);
1234
1312
  }
1235
1313
  changeFilter(flt, dl, grID, rl, tmpRl, dArg) {
1236
1314
  if (flt) {
1237
- const ddlValue = this.isImportRules ? this.GetRootColumnName(dl.value) : dl.value;
1238
- this.selectedColumn = dl.getDataByValue(ddlValue);
1315
+ let ddlValue;
1316
+ if (this.fieldMode === 'DropdownTree') {
1317
+ ddlValue = (dl.value[0]);
1318
+ }
1319
+ else {
1320
+ ddlValue = this.isImportRules ? this.GetRootColumnName(dl.value) : dl.value;
1321
+ }
1322
+ this.selectedColumn = this.getColumn(ddlValue);
1239
1323
  const ruleElem = closest(flt, '.e-rule-container');
1240
1324
  const ruleID = ruleElem.id.replace(this.element.id + '_', '');
1241
- const eventsArgs = { groupID: grID, ruleID: ruleID, selectedField: dl.value, cancel: false, type: 'field' };
1325
+ const eventsArgs = { groupID: grID, ruleID: ruleID, selectedField: this.fieldMode === 'DropdownTree' ?
1326
+ dl.value[0] : dl.value, cancel: false, type: 'field' };
1242
1327
  if (!this.isImportRules) {
1243
1328
  this.trigger('beforeChange', eventsArgs, (observedChangeArgs) => {
1244
1329
  this.fieldChangeSuccess(observedChangeArgs, tmpRl, flt, rl, dArg);
@@ -1289,7 +1374,7 @@ let QueryBuilder = class QueryBuilder extends Component {
1289
1374
  if (ruleElem.querySelector('.e-template')) {
1290
1375
  rule.value = '';
1291
1376
  }
1292
- if (this.selectedColumn.type === 'object') {
1377
+ if (this.selectedColumn.type === 'object' && this.fieldMode === 'Default') {
1293
1378
  tempRule.type = this.selectedColumn.columns[0].type;
1294
1379
  while (this.selectedColumn.columns) {
1295
1380
  this.createSubFields(filterElem, rule, tempRule, ddlArgs);
@@ -1412,9 +1497,16 @@ let QueryBuilder = class QueryBuilder extends Component {
1412
1497
  addClass([operatorElem], 'e-operator');
1413
1498
  if (operatorElem.childElementCount) {
1414
1499
  ddlObj = getComponent(operatorElem.querySelector('.e-dropdownlist'), 'dropdownlist');
1415
- const fieldObj = getComponent(filterElem.querySelector('.e-dropdownlist'), 'dropdownlist');
1416
1500
  tempRule.operator = ddlObj.value;
1417
- tempRule.type = this.getColumn(fieldObj.value).type;
1501
+ let fieldObj;
1502
+ if (this.fieldMode === 'DropdownTree') {
1503
+ fieldObj = getComponent(filterElem.querySelector('.e-dropdowntree'), 'dropdowntree');
1504
+ }
1505
+ else {
1506
+ fieldObj = getComponent(filterElem.querySelector('.e-dropdownlist'), 'dropdownlist');
1507
+ }
1508
+ tempRule.type = this.fieldMode === 'DropdownTree' ? this.getColumn(fieldObj.value[0]).type :
1509
+ this.getColumn(fieldObj.value).type;
1418
1510
  const itemData = ddlArgs.itemData;
1419
1511
  this.renderValues(operatorElem, itemData, ddlArgs.previousItemData, true, rule, tempRule, ddlArgs.element);
1420
1512
  }
@@ -1720,8 +1812,10 @@ let QueryBuilder = class QueryBuilder extends Component {
1720
1812
  processTemplate(target, itemData, rule, tempRule) {
1721
1813
  const container = closest(target, '.e-rule-container');
1722
1814
  const tempElements = container.querySelectorAll('.e-template');
1723
- const ddlObj = getComponent(container.querySelector('.e-rule-filter .e-filter-input'), 'dropdownlist');
1724
- const column = this.getColumn(ddlObj.value);
1815
+ const filterElem = container.querySelector('.e-rule-filter .e-filter-input');
1816
+ const ddlObj = this.fieldMode === 'DropdownTree' ? getComponent(filterElem, 'dropdowntree')
1817
+ : getComponent(container.querySelector('.e-rule-filter .e-filter-input'), 'dropdownlist');
1818
+ const column = this.fieldMode === 'DropdownTree' ? this.getColumn(ddlObj.value[0]) : this.getColumn(ddlObj.value);
1725
1819
  if (typeof itemData.template === 'string' || itemData.template.write === undefined) {
1726
1820
  const args = { rule: rule, ruleID: container.id, operator: tempRule.operator, field: column.field,
1727
1821
  requestType: 'value-template-create' };
@@ -1740,8 +1834,11 @@ let QueryBuilder = class QueryBuilder extends Component {
1740
1834
  }
1741
1835
  }
1742
1836
  getItemData(parentId) {
1743
- const fieldObj = getComponent(document.getElementById(parentId + '_filterkey'), 'dropdownlist');
1744
- return this.getColumn(fieldObj.value);
1837
+ let fieldObj = getComponent(document.getElementById(parentId + '_filterkey'), 'dropdownlist');
1838
+ if (this.fieldMode === "DropdownTree") {
1839
+ fieldObj = getComponent(document.getElementById(parentId + '_filterkey'), 'dropdowntree');
1840
+ }
1841
+ return this.fieldMode === "DropdownTree" ? this.getColumn(fieldObj.value[0]) : this.getColumn(fieldObj.value);
1745
1842
  }
1746
1843
  setDefaultValue(parentId, isArryValue, isNumber) {
1747
1844
  const itemData = this.getItemData(parentId);
@@ -1833,8 +1930,7 @@ let QueryBuilder = class QueryBuilder extends Component {
1833
1930
  input.dataBind();
1834
1931
  }
1835
1932
  else {
1836
- const fieldObj = getComponent(document.getElementById(parentId + '_filterkey'), 'dropdownlist');
1837
- itemData = this.getColumn(fieldObj.value);
1933
+ itemData = columnData;
1838
1934
  const min = (itemData.validation && itemData.validation.min) ? itemData.validation.min : 0;
1839
1935
  const max = (itemData.validation && itemData.validation.max) ? itemData.validation.max : Number.MAX_VALUE;
1840
1936
  const format = itemData.format ? itemData.format : 'n';
@@ -2080,10 +2176,11 @@ let QueryBuilder = class QueryBuilder extends Component {
2080
2176
  renderValues(target, itemData, prevItemData, isRender, rule, tempRule, element) {
2081
2177
  const subFldElem = target.previousElementSibling;
2082
2178
  const filtElem = subFldElem.getElementsByTagName('input')[0];
2083
- const filtObj = getComponent(filtElem, 'dropdownlist');
2084
- const column = this.getColumn(filtObj.value);
2085
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
2086
- this.selectedRule = filtObj.itemData;
2179
+ const filtObj = this.fieldMode === 'DropdownTree' ? getComponent(filtElem, 'dropdowntree')
2180
+ : getComponent(filtElem, 'dropdownlist');
2181
+ let column = this.fieldMode === 'DropdownTree' ? this.getColumn(filtObj.value[0])
2182
+ : this.getColumn(filtObj.value);
2183
+ this.selectedRule = column;
2087
2184
  if (isRender) {
2088
2185
  const ddlObj = getComponent(target.querySelector('input'), 'dropdownlist');
2089
2186
  itemData = element.id.indexOf('operator') > -1 ? itemData : this.selectedRule;
@@ -2323,15 +2420,17 @@ let QueryBuilder = class QueryBuilder extends Component {
2323
2420
  if (this.subFieldElem) {
2324
2421
  target = this.subFieldElem;
2325
2422
  }
2326
- dropDownObj = getComponent(target, 'dropdownlist');
2327
- const column = this.getColumn(dropDownObj.value);
2423
+ dropDownObj = this.fieldMode === 'DropdownTree' ? getComponent(target, 'dropdowntree') :
2424
+ getComponent(target, 'dropdownlist');
2425
+ const column = this.fieldMode === 'DropdownTree' ? this.getColumn(dropDownObj.value[0])
2426
+ : this.getColumn(dropDownObj.value);
2328
2427
  if (!this.isImportRules && rule.rules[index].field && rule.rules[index].field.toLowerCase() !== column.field.toLowerCase()) {
2329
2428
  if (!(ruleElem.querySelectorAll('.e-template')) && !(operator.indexOf('null') > -1)
2330
2429
  || (operator.indexOf('empty') > -1)) {
2331
2430
  rule.rules[index].value = '';
2332
2431
  }
2333
2432
  }
2334
- this.selectedColumn = dropDownObj.getDataByValue(dropDownObj.value);
2433
+ this.selectedColumn = this.getColumn(this.selectedColumn.field);
2335
2434
  rule.rules[index].field = this.selectedColumn.field;
2336
2435
  rule.rules[index].type = this.selectedColumn.type;
2337
2436
  rule.rules[index].label = this.selectedColumn.label;
@@ -2464,8 +2563,7 @@ let QueryBuilder = class QueryBuilder extends Component {
2464
2563
  }
2465
2564
  }
2466
2565
  else if (target.className.indexOf('e-datepicker') > -1) {
2467
- const ddlInst = getInstance(ruleElem.querySelector('.e-rule-filter input'), DropDownList);
2468
- const format = this.getFormat(this.getColumn(ddlInst.value).format);
2566
+ const format = this.getFormat(this.getColumn(this.selectedColumn.field).format);
2469
2567
  if (format.type) {
2470
2568
  if (arrOperator.indexOf(oper) > -1) {
2471
2569
  if (typeof rule.rules[index].value === 'string') {
@@ -2583,7 +2681,12 @@ let QueryBuilder = class QueryBuilder extends Component {
2583
2681
  element = this.element.querySelectorAll('.e-rule-filter .e-control:not(.e-tooltip)');
2584
2682
  len = element.length;
2585
2683
  for (i = 0; i < len; i++) {
2586
- getComponent(element[i], 'dropdownlist').destroy();
2684
+ if (getComponent(element[i], 'dropdownlist')) {
2685
+ getComponent(element[i], 'dropdownlist').destroy();
2686
+ }
2687
+ else {
2688
+ getComponent(element[i], 'dropdowntree').destroy();
2689
+ }
2587
2690
  detach(element[i]);
2588
2691
  }
2589
2692
  tooltip = this.element.querySelectorAll('.e-rule-operator .e-control.e-tooltip');
@@ -2593,8 +2696,10 @@ let QueryBuilder = class QueryBuilder extends Component {
2593
2696
  element = this.element.querySelectorAll('.e-rule-operator .e-control:not(.e-tooltip)');
2594
2697
  len = element.length;
2595
2698
  for (i = 0; i < len; i++) {
2596
- getComponent(element[i], 'dropdownlist').destroy();
2597
- detach(element[i]);
2699
+ if (getComponent(element[i], 'dropdownlist')) {
2700
+ getComponent(element[i], 'dropdownlist').destroy();
2701
+ detach(element[i]);
2702
+ }
2598
2703
  }
2599
2704
  tooltip = this.element.querySelectorAll('.e-rule-value .e-control.e-tooltip');
2600
2705
  for (i = 0; i < tooltip.length; i++) {
@@ -2736,7 +2841,7 @@ let QueryBuilder = class QueryBuilder extends Component {
2736
2841
  }
2737
2842
  });
2738
2843
  const textElem = this.createElement('textarea', { attrs: { class: 'e-summary-text', readonly: 'true' }, styles: 'max-height:500px' });
2739
- const editElem = this.createElement('button', { attrs: { class: 'e-edit-rule e-css e-btn e-small e-flat e-primary' } });
2844
+ const editElem = this.createElement('button', { attrs: { type: 'button', class: 'e-edit-rule e-css e-btn e-small e-flat e-primary' } });
2740
2845
  const divElem = this.createElement('div', { attrs: { class: 'e-summary-btndiv' } });
2741
2846
  contentElem.appendChild(textElem);
2742
2847
  textElem.textContent = this.getSqlFromRules(this.rule);
@@ -3338,6 +3443,9 @@ let QueryBuilder = class QueryBuilder extends Component {
3338
3443
  return rule;
3339
3444
  }
3340
3445
  getRuleCollection(rule, isValidRule) {
3446
+ if (isNullOrUndefined(rule)) {
3447
+ return null;
3448
+ }
3341
3449
  let orgRule;
3342
3450
  if (rule.rules && rule.rules.length && (Object.keys(rule.rules[0]).length > 6 || isValidRule)) {
3343
3451
  let jLen = rule.rules.length;
@@ -4340,14 +4448,8 @@ let QueryBuilder = class QueryBuilder extends Component {
4340
4448
  return operators[operator];
4341
4449
  }
4342
4450
  getTypeFromColumn(rules) {
4343
- const columnData = this.columns;
4344
- for (let i = 0; i < columnData.length; i++) {
4345
- if (columnData[i].field === rules.field) {
4346
- rules.type = columnData[i].type;
4347
- break;
4348
- }
4349
- }
4350
- return rules.type;
4451
+ const columnData = this.getColumn(rules.field);
4452
+ return columnData.type;
4351
4453
  }
4352
4454
  processParser(parser, rules, levelColl) {
4353
4455
  let j;
@@ -4362,6 +4464,7 @@ let QueryBuilder = class QueryBuilder extends Component {
4362
4464
  let lLen;
4363
4465
  let grpCount;
4364
4466
  let operator;
4467
+ let isLeftOpened = false;
4365
4468
  for (let i = 0, iLen = parser.length; i < iLen; i++) {
4366
4469
  if (parser[i][0] === 'Literal') {
4367
4470
  rule = { label: parser[i][1], field: parser[i][1] };
@@ -4380,8 +4483,12 @@ let QueryBuilder = class QueryBuilder extends Component {
4380
4483
  j = i + 1;
4381
4484
  jLen = iLen;
4382
4485
  for (j = i + 1; j < jLen; j++) {
4383
- if (parser[j][0] === 'Right') {
4486
+ if (operator.indexOf('between') < 0 && parser[j][0] === 'Left') {
4487
+ isLeftOpened = true;
4488
+ }
4489
+ else if (parser[j][0] === 'Right' && isLeftOpened) {
4384
4490
  i = j;
4491
+ isLeftOpened = false;
4385
4492
  break;
4386
4493
  }
4387
4494
  else {
@@ -4519,6 +4626,9 @@ __decorate([
4519
4626
  __decorate([
4520
4627
  Property(false)
4521
4628
  ], QueryBuilder.prototype, "allowValidation", void 0);
4629
+ __decorate([
4630
+ Property('Default')
4631
+ ], QueryBuilder.prototype, "fieldMode", void 0);
4522
4632
  __decorate([
4523
4633
  Property([])
4524
4634
  ], QueryBuilder.prototype, "columns", void 0);