@syncfusion/ej2-querybuilder 30.2.6 → 31.1.22

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 (86) hide show
  1. package/dist/ej2-querybuilder.min.js +3 -3
  2. package/dist/ej2-querybuilder.umd.min.js +3 -3
  3. package/dist/ej2-querybuilder.umd.min.js.map +1 -1
  4. package/dist/es6/ej2-querybuilder.es2015.js +256 -166
  5. package/dist/es6/ej2-querybuilder.es2015.js.map +1 -1
  6. package/dist/es6/ej2-querybuilder.es5.js +260 -169
  7. package/dist/es6/ej2-querybuilder.es5.js.map +1 -1
  8. package/dist/global/ej2-querybuilder.min.js +3 -3
  9. package/dist/global/ej2-querybuilder.min.js.map +1 -1
  10. package/dist/global/index.d.ts +2 -2
  11. package/package.json +7 -7
  12. package/src/query-builder/query-builder.d.ts +7 -0
  13. package/src/query-builder/query-builder.js +260 -168
  14. package/styles/bds-lite.css +37 -0
  15. package/styles/bds.css +36 -0
  16. package/styles/bootstrap-dark-lite.css +37 -0
  17. package/styles/bootstrap-dark.css +36 -0
  18. package/styles/bootstrap-lite.css +37 -0
  19. package/styles/bootstrap.css +36 -0
  20. package/styles/bootstrap4-lite.css +45 -0
  21. package/styles/bootstrap4.css +44 -0
  22. package/styles/bootstrap5-dark-lite.css +37 -0
  23. package/styles/bootstrap5-dark.css +36 -0
  24. package/styles/bootstrap5-lite.css +37 -0
  25. package/styles/bootstrap5.3-lite.css +37 -0
  26. package/styles/bootstrap5.3.css +36 -0
  27. package/styles/bootstrap5.css +36 -0
  28. package/styles/fabric-dark-lite.css +37 -0
  29. package/styles/fabric-dark.css +36 -0
  30. package/styles/fabric-lite.css +37 -0
  31. package/styles/fabric.css +36 -0
  32. package/styles/fluent-dark-lite.css +37 -0
  33. package/styles/fluent-dark.css +36 -0
  34. package/styles/fluent-lite.css +37 -0
  35. package/styles/fluent.css +36 -0
  36. package/styles/fluent2-lite.css +37 -0
  37. package/styles/fluent2.css +36 -0
  38. package/styles/highcontrast-light-lite.css +37 -0
  39. package/styles/highcontrast-light.css +36 -0
  40. package/styles/highcontrast-lite.css +37 -0
  41. package/styles/highcontrast.css +36 -0
  42. package/styles/material-dark-lite.css +37 -0
  43. package/styles/material-dark.css +36 -0
  44. package/styles/material-lite.css +37 -0
  45. package/styles/material.css +36 -0
  46. package/styles/material3-dark-lite.css +37 -0
  47. package/styles/material3-dark.css +36 -0
  48. package/styles/material3-lite.css +37 -0
  49. package/styles/material3.css +36 -0
  50. package/styles/query-builder/_bootstrap-dark-definition.scss +2 -0
  51. package/styles/query-builder/_bootstrap-definition.scss +2 -0
  52. package/styles/query-builder/_bootstrap4-definition.scss +1 -0
  53. package/styles/query-builder/_fabric-dark-definition.scss +2 -0
  54. package/styles/query-builder/_fabric-definition.scss +2 -0
  55. package/styles/query-builder/_highcontrast-definition.scss +2 -0
  56. package/styles/query-builder/_highcontrast-light-definition.scss +2 -0
  57. package/styles/query-builder/_material-dark-definition.scss +1 -0
  58. package/styles/query-builder/_material-definition.scss +1 -0
  59. package/styles/query-builder/_theme.scss +23 -0
  60. package/styles/query-builder/bds.css +36 -0
  61. package/styles/query-builder/bootstrap-dark.css +36 -0
  62. package/styles/query-builder/bootstrap.css +36 -0
  63. package/styles/query-builder/bootstrap4.css +44 -0
  64. package/styles/query-builder/bootstrap5-dark.css +36 -0
  65. package/styles/query-builder/bootstrap5.3.css +36 -0
  66. package/styles/query-builder/bootstrap5.css +36 -0
  67. package/styles/query-builder/fabric-dark.css +36 -0
  68. package/styles/query-builder/fabric.css +36 -0
  69. package/styles/query-builder/fluent-dark.css +36 -0
  70. package/styles/query-builder/fluent.css +36 -0
  71. package/styles/query-builder/fluent2.css +36 -0
  72. package/styles/query-builder/highcontrast-light.css +36 -0
  73. package/styles/query-builder/highcontrast.css +36 -0
  74. package/styles/query-builder/material-dark.css +36 -0
  75. package/styles/query-builder/material.css +36 -0
  76. package/styles/query-builder/material3-dark.css +36 -0
  77. package/styles/query-builder/material3.css +36 -0
  78. package/styles/query-builder/tailwind-dark.css +36 -0
  79. package/styles/query-builder/tailwind.css +36 -0
  80. package/styles/query-builder/tailwind3.css +36 -0
  81. package/styles/tailwind-dark-lite.css +37 -0
  82. package/styles/tailwind-dark.css +36 -0
  83. package/styles/tailwind-lite.css +37 -0
  84. package/styles/tailwind.css +36 -0
  85. package/styles/tailwind3-lite.css +37 -0
  86. package/styles/tailwind3.css +36 -0
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * filename: index.d.ts
3
- * version : 30.2.6
4
- * Copyright Syncfusion Inc. 2001 - 2024. All rights reserved.
3
+ * version : 31.1.22
4
+ * Copyright Syncfusion Inc. 2001 - 2025. All rights reserved.
5
5
  * Use of this code is subject to the terms of our license.
6
6
  * A copy of the current license can be obtained at any time by e-mailing
7
7
  * licensing@syncfusion.com. Any infringement will be prosecuted under
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syncfusion/ej2-querybuilder",
3
- "version": "30.2.6",
3
+ "version": "31.1.22",
4
4
  "description": "Essential JS 2 QueryBuilder",
5
5
  "author": "Syncfusion Inc.",
6
6
  "license": "SEE LICENSE IN license",
@@ -8,12 +8,12 @@
8
8
  "module": "./index.js",
9
9
  "es2015": "./dist/es6/ej2-querybuilder.es5.js",
10
10
  "dependencies": {
11
- "@syncfusion/ej2-base": "~30.2.4",
12
- "@syncfusion/ej2-buttons": "~30.2.4",
13
- "@syncfusion/ej2-calendars": "~30.2.4",
14
- "@syncfusion/ej2-dropdowns": "~30.2.6",
15
- "@syncfusion/ej2-inputs": "~30.2.6",
16
- "@syncfusion/ej2-splitbuttons": "~30.2.4"
11
+ "@syncfusion/ej2-base": "~31.1.22",
12
+ "@syncfusion/ej2-buttons": "~31.1.21",
13
+ "@syncfusion/ej2-calendars": "~31.1.22",
14
+ "@syncfusion/ej2-dropdowns": "~31.1.22",
15
+ "@syncfusion/ej2-inputs": "~31.1.22",
16
+ "@syncfusion/ej2-splitbuttons": "~31.1.17"
17
17
  },
18
18
  "devDependencies": {},
19
19
  "keywords": [
@@ -627,6 +627,13 @@ export declare class QueryBuilder extends Component<HTMLDivElement> implements I
627
627
  private appendRuleElem;
628
628
  private addRuleElement;
629
629
  private addRuleSuccessCallBack;
630
+ private processAdjacentElements;
631
+ private handleOrphanedRuleElement;
632
+ private processConnectorElements;
633
+ private handleOrphanedConnectorElement;
634
+ private applyFieldComponent;
635
+ private applyDropdownListComponent;
636
+ private applyDropdownTreeComponent;
630
637
  private dropdownTreeFiltering;
631
638
  private changeDataSource;
632
639
  private nestedChildFilter;
@@ -891,7 +891,9 @@ var QueryBuilder = /** @class */ (function (_super) {
891
891
  }
892
892
  };
893
893
  QueryBuilder.prototype.addRuleSuccessCallBack = function (args, trgt, rule, col, act, pId, isRlTmp) {
894
- var height = (this.element.className.indexOf('e-device') > -1) ? '250px' : '200px';
894
+ var _this = this;
895
+ var isVertical = this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical';
896
+ var height = isVertical ? '250px' : '200px';
895
897
  var ruleID;
896
898
  var column = (rule && rule.field) ? this.getColumn(rule.field) : col ? col : this.columns[0];
897
899
  var operators;
@@ -902,12 +904,32 @@ var QueryBuilder = /** @class */ (function (_super) {
902
904
  if (column && column.ruleTemplate && rule.field) {
903
905
  this.selectedColumn = column;
904
906
  operators = this.selectedColumn.operators;
905
- newRule = { 'label': column.label, 'field': column.field, 'type': column.type, 'operator': operators[0].value };
906
- var passedRule = Object.keys(rule).length ? rule : newRule;
907
- ruleElem = this.appendRuleElem(trgt, column, act, pId, 'field', passedRule);
908
- var args_1 = { requestType: 'template-create', action: 'insert-rule', ruleID: ruleElem.id,
909
- fields: this.fields, rule: passedRule };
910
- this.trigger('actionBegin', args_1);
907
+ newRule = {
908
+ 'label': column.label,
909
+ 'field': column.field,
910
+ 'type': column.type,
911
+ 'operator': operators[0].value
912
+ };
913
+ var passedRule_1 = Object.keys(rule).length ? rule : newRule;
914
+ ruleElem = this.appendRuleElem(trgt, column, act, pId, 'field', passedRule_1);
915
+ var actionArgs = {
916
+ requestType: 'template-initialize',
917
+ ruleID: ruleElem.id,
918
+ action: 'insert-rule',
919
+ fields: this.fields,
920
+ rule: passedRule_1
921
+ };
922
+ this.trigger('actionBegin', actionArgs);
923
+ setTimeout(function () {
924
+ var createArgs = {
925
+ requestType: 'template-create',
926
+ ruleID: ruleElem.id,
927
+ action: 'insert-rule',
928
+ fields: _this.fields,
929
+ rule: passedRule_1
930
+ };
931
+ _this.trigger('actionBegin', createArgs);
932
+ }, 0);
911
933
  }
912
934
  else {
913
935
  ruleElem = this.appendRuleElem(trgt, column, act, pId, 'field');
@@ -922,139 +944,30 @@ var QueryBuilder = /** @class */ (function (_super) {
922
944
  addClass([element], 'e-round');
923
945
  addClass([element], 'e-icon-btn');
924
946
  element.setAttribute('title', this.l10n.getConstant('DeleteRule'));
925
- var spanElement = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-delete-icon' } });
926
- ruleElem.querySelector('.e-rule-delete').appendChild(spanElement);
947
+ var spanElement = this.createElement('span', {
948
+ attrs: { class: 'e-btn-icon e-icons e-delete-icon' }
949
+ });
950
+ element.appendChild(spanElement);
927
951
  }
928
952
  if (!this.showButtons.ruleDelete) {
929
953
  element.classList.add('e-button-hide');
930
954
  }
931
955
  }
932
- if (this.displayMode === 'Vertical' || this.element.className.indexOf('e-device') > -1) {
933
- ruleElem.className = 'e-rule-container e-vertical-mode';
934
- }
935
- else {
936
- ruleElem.className = 'e-rule-container e-horizontal-mode';
937
- }
956
+ ruleElem.className = 'e-rule-container ' + (isVertical ? 'e-vertical-mode' : 'e-horizontal-mode');
938
957
  var previousRuleElem = ruleElem.previousElementSibling;
939
- if (this.enableSeparateConnector) {
940
- var prevRule = void 0;
941
- var ruleContainer = void 0;
942
- if (previousRuleElem && previousRuleElem.classList.contains('e-group-container')) {
943
- ruleContainer = previousRuleElem.querySelectorAll('.e-rule-container');
944
- previousRuleElem = ruleContainer[ruleContainer.length - 1];
945
- }
946
- if (previousRuleElem && previousRuleElem.classList.contains('e-rule-container')) {
947
- prevRule = this.getRule(previousRuleElem);
948
- }
949
- if (this.headerTemplate && previousRuleElem && prevRule) {
950
- this.headerTemplateFn(previousRuleElem, false, prevRule.condition, prevRule, previousRuleElem.id);
951
- }
952
- else if (isNullOrUndefined(previousRuleElem) && ruleElem.id !== this.element.id + '_group0_rule0') {
953
- var group = ruleElem.closest('.e-group-container');
954
- if (group && group.previousElementSibling) {
955
- var prevElem = group.previousElementSibling;
956
- var prevRuleContainer = prevElem.querySelectorAll('.e-rule-container');
957
- if (prevElem.classList.contains('e-group-container')) {
958
- prevElem = prevRuleContainer[prevRuleContainer.length - 1];
959
- }
960
- if (prevElem.classList.contains('e-rule-container')) {
961
- var prevRule_1 = this.getRule(prevElem);
962
- this.headerTemplateFn(prevElem, false, prevRule_1.condition, prevRule_1, prevElem.id, true);
963
- }
964
- }
965
- else {
966
- this.headerTemplateFn(ruleElem, false, rule.condition, rule, ruleElem.id, true);
967
- }
968
- }
969
- }
970
- else {
971
- if (previousRuleElem && previousRuleElem.className.indexOf('e-rule-container') > -1) {
972
- if (ruleElem.className.indexOf('e-joined-rule') < 0) {
973
- ruleElem.className += ' e-joined-rule';
974
- }
975
- if (previousRuleElem.className.indexOf('e-prev-joined-rule') < 0) {
976
- previousRuleElem.className += ' e-prev-joined-rule';
977
- }
978
- }
979
- }
980
- if (previousRuleElem && previousRuleElem.className.indexOf('e-group-container') > -1 &&
981
- ruleElem.className.indexOf('e-separate-rule') < 0) {
982
- ruleElem.className += ' e-separate-rule';
983
- }
958
+ this.processAdjacentElements(ruleElem, previousRuleElem, rule);
984
959
  if (!this.isImportRules) {
985
960
  this.updateAddedRule(trgt, rule, newRule, isRlTmp, pId, this.enableSeparateConnector ? true : null);
986
961
  }
962
+ var ruleCount = this.rule.rules.length;
987
963
  if (!column || (column && !column.ruleTemplate) || !rule.field) {
988
- if (this.fieldMode === 'Default') {
989
- var ddlField = void 0;
990
- var ddlValue = void 0;
991
- if (this.separator && rule.field) {
992
- ddlValue = this.GetRootColumnName(rule.field);
993
- }
994
- else if (this.autoSelectField) {
995
- ddlValue = this.GetRootColumnName(rule.field);
996
- }
997
- else {
998
- ddlValue = this.isImportRules ? this.GetRootColumnName(rule.field) : rule.field;
999
- }
1000
- ddlField = {
1001
- dataSource: this.columns,
1002
- fields: this.fields, placeholder: this.l10n.getConstant('SelectField'),
1003
- popupHeight: ((this.columns.length > 5) ? height : 'auto'), close: this.fieldClose.bind(this, ruleElem.id + '_filterkey'),
1004
- change: this.changeField.bind(this), value: rule ? ddlValue : null, open: this.popupOpen.bind(this, true), cssClass: 'qb-dropdownlist'
1005
- };
1006
- if (this.fieldModel) {
1007
- ddlField = __assign({}, ddlField, this.fieldModel);
1008
- }
1009
- dropDownList = new DropDownList(ddlField);
1010
- dropDownList.appendTo('#' + ruleElem.id + '_filterkey');
1011
- var ddlVal = void 0;
1012
- if (this.separator && rule.field) {
1013
- ddlVal = this.GetRootColumnName(rule.field);
1014
- }
1015
- else {
1016
- ddlVal = this.isImportRules ? this.GetRootColumnName(rule.field) :
1017
- dropDownList.value;
1018
- }
1019
- this.selectedColumn = dropDownList.getDataByValue(ddlVal);
1020
- if (Object.keys(rule).length) {
1021
- this.changeRule(rule, {
1022
- element: dropDownList.element, itemData: this.selectedColumn
1023
- });
1024
- }
964
+ if (ruleCount > 20) {
965
+ setTimeout(function () {
966
+ _this.applyFieldComponent(ruleElem, rule, height);
967
+ }, 0);
1025
968
  }
1026
969
  else {
1027
- var ddlField = void 0;
1028
- var ddlValue = this.isImportRules ? rule.field : rule.field;
1029
- this.dummyDropdownTreeDs = extend([], this.columns, [], true);
1030
- this.updateDropdowntreeDS(this.dummyDropdownTreeDs);
1031
- ddlField = {
1032
- fields: { dataSource: this.dummyDropdownTreeDs,
1033
- value: 'field', text: 'label', child: 'columns', expanded: 'expanded', selectable: 'selectable' },
1034
- placeholder: this.l10n.getConstant('SelectField'), showClearButton: false,
1035
- popupHeight: ((this.columns.length > 5) ? height : 'auto'), changeOnBlur: false,
1036
- change: this.changeField.bind(this), value: !isNullOrUndefined(ddlValue) ? [ddlValue] : null,
1037
- open: this.popupOpen.bind(this, false), treeSettings: { expandOn: 'Click' },
1038
- cssClass: 'e-qb-ddt', filtering: this.dropdownTreeFiltering.bind(this), close: this.dropdownTreeClose.bind(this)
1039
- };
1040
- if (this.fieldModel) {
1041
- ddlField = __assign({}, ddlField, this.fieldModel);
1042
- }
1043
- var dropdowntree = new DropDownTree(ddlField);
1044
- dropdowntree.appendTo('#' + ruleElem.id + '_filterkey');
1045
- if (!isNullOrUndefined(dropdowntree.value)) {
1046
- var value = this.getLabelFromColumn(dropdowntree.value[0]);
1047
- dropdowntree.element.value = value;
1048
- }
1049
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1050
- var ddlVal = !isNullOrUndefined(rule.field) ?
1051
- this.GetRootColumnName(rule.field) : dropdowntree.value;
1052
- this.selectedColumn = this.getColumn(ddlVal);
1053
- if (Object.keys(rule).length) {
1054
- this.changeRule(rule, {
1055
- element: dropdowntree.element, itemData: this.selectedColumn
1056
- });
1057
- }
970
+ this.applyFieldComponent(ruleElem, rule, height);
1058
971
  }
1059
972
  }
1060
973
  ruleID = ruleElem.id.replace(this.element.id + '_', '');
@@ -1063,46 +976,204 @@ var QueryBuilder = /** @class */ (function (_super) {
1063
976
  this.ruleLock(lockRuleTarget);
1064
977
  }
1065
978
  if (!this.isImportRules && !this.prvtEvtTgrDaD) {
1066
- this.trigger('change', { groupID: trgt.id.replace(this.element.id + '_', ''), ruleID: ruleID, type: 'insertRule' });
979
+ this.trigger('change', {
980
+ groupID: trgt.id.replace(this.element.id + '_', ''),
981
+ ruleID: ruleID,
982
+ type: 'insertRule'
983
+ });
1067
984
  }
1068
985
  }
1069
986
  if (this.enableSeparateConnector && isNullOrUndefined(rule.condition) && ruleID) {
1070
987
  rule = this.getRule(ruleID);
1071
988
  }
1072
989
  if (this.enableSeparateConnector) {
1073
- var prevElem = ruleElem.previousElementSibling;
1074
- var ruleContainer = void 0;
1075
- while (prevElem && !prevElem.classList.contains('e-rule-container')) {
1076
- if (prevElem.classList.contains('e-group-container')) {
1077
- ruleContainer = prevElem.querySelectorAll('.e-rule-container');
1078
- prevElem = ruleContainer[ruleContainer.length - 1];
1079
- break;
990
+ this.processConnectorElements(ruleElem);
991
+ }
992
+ };
993
+ QueryBuilder.prototype.processAdjacentElements = function (ruleElem, previousRuleElem, rule) {
994
+ if (this.enableSeparateConnector) {
995
+ if (previousRuleElem && previousRuleElem.classList.contains('e-group-container')) {
996
+ var ruleContainer = previousRuleElem.querySelectorAll('.e-rule-container');
997
+ previousRuleElem = ruleContainer[ruleContainer.length - 1];
998
+ }
999
+ if (previousRuleElem && previousRuleElem.classList.contains('e-rule-container')) {
1000
+ var prevRule = this.getRule(previousRuleElem);
1001
+ if (this.headerTemplate) {
1002
+ this.headerTemplateFn(previousRuleElem, false, prevRule.condition, prevRule, previousRuleElem.id);
1080
1003
  }
1081
- prevElem = prevElem.previousElementSibling;
1082
1004
  }
1083
- if (this.headerTemplate && prevElem) {
1005
+ else if (isNullOrUndefined(previousRuleElem) && ruleElem.id !== this.element.id + '_group0_rule0') {
1006
+ this.handleOrphanedRuleElement(ruleElem, rule);
1007
+ }
1008
+ }
1009
+ else {
1010
+ if (previousRuleElem && previousRuleElem.className.indexOf('e-rule-container') > -1) {
1011
+ ruleElem.classList.add('e-joined-rule');
1012
+ previousRuleElem.classList.add('e-prev-joined-rule');
1013
+ }
1014
+ }
1015
+ if (previousRuleElem && previousRuleElem.className.indexOf('e-group-container') > -1 &&
1016
+ ruleElem.className.indexOf('e-separate-rule') < 0) {
1017
+ ruleElem.className += ' e-separate-rule';
1018
+ }
1019
+ };
1020
+ QueryBuilder.prototype.handleOrphanedRuleElement = function (ruleElem, rule) {
1021
+ var group = ruleElem.closest('.e-group-container');
1022
+ if (group && group.previousElementSibling) {
1023
+ var prevElem = group.previousElementSibling;
1024
+ var prevRuleContainer = prevElem.querySelectorAll('.e-rule-container');
1025
+ if (prevElem.classList.contains('e-group-container')) {
1026
+ prevElem = prevRuleContainer[prevRuleContainer.length - 1];
1027
+ }
1028
+ if (prevElem.classList.contains('e-rule-container')) {
1084
1029
  var prevRule = this.getRule(prevElem);
1085
- var args_2 = { requestType: 'rule-template-create', ruleID: prevElem.id, condition: prevRule.condition,
1086
- notCondition: this.enableNotCondition ? true : undefined };
1087
- this.trigger('actionBegin', args_2);
1030
+ this.headerTemplateFn(prevElem, false, prevRule.condition, prevRule, prevElem.id, true);
1088
1031
  }
1089
- else if (isNullOrUndefined(prevElem) && ruleElem.id !== this.element.id + '_group0_rule0') {
1090
- var group = ruleElem.closest('.e-group-container');
1091
- if (group && group.previousElementSibling && group.previousElementSibling.previousElementSibling) {
1092
- var prevElem_1 = group.previousElementSibling.previousElementSibling;
1093
- if (prevElem_1.classList.contains('e-group-container')) {
1094
- var ruleContainer_1 = prevElem_1.querySelectorAll('.e-rule-container');
1095
- prevElem_1 = ruleContainer_1[ruleContainer_1.length - 1];
1096
- }
1097
- if (prevElem_1.classList.contains('e-rule-container')) {
1098
- var prevRule = this.getRule(prevElem_1);
1099
- var args_3 = { requestType: 'rule-template-create', ruleID: prevElem_1.id,
1100
- condition: prevRule.condition, notCondition: this.enableNotCondition ? true : undefined };
1101
- this.trigger('actionBegin', args_3);
1102
- }
1103
- }
1032
+ }
1033
+ else {
1034
+ this.headerTemplateFn(ruleElem, false, rule.condition, rule, ruleElem.id, true);
1035
+ }
1036
+ };
1037
+ QueryBuilder.prototype.processConnectorElements = function (ruleElem) {
1038
+ var prevElem = ruleElem.previousElementSibling;
1039
+ var ruleContainer;
1040
+ while (prevElem && !prevElem.classList.contains('e-rule-container')) {
1041
+ if (prevElem.classList.contains('e-group-container')) {
1042
+ ruleContainer = prevElem.querySelectorAll('.e-rule-container');
1043
+ prevElem = ruleContainer[ruleContainer.length - 1];
1044
+ break;
1045
+ }
1046
+ prevElem = prevElem.previousElementSibling;
1047
+ }
1048
+ if (this.headerTemplate && prevElem) {
1049
+ var prevRule = this.getRule(prevElem);
1050
+ var args = {
1051
+ requestType: 'rule-template-create',
1052
+ ruleID: prevElem.id,
1053
+ condition: prevRule.condition,
1054
+ notCondition: this.enableNotCondition ? true : undefined
1055
+ };
1056
+ this.trigger('actionBegin', args);
1057
+ }
1058
+ else if (isNullOrUndefined(prevElem) && ruleElem.id !== this.element.id + '_group0_rule0') {
1059
+ this.handleOrphanedConnectorElement(ruleElem);
1060
+ }
1061
+ this.setMultiConnector(ruleElem);
1062
+ };
1063
+ QueryBuilder.prototype.handleOrphanedConnectorElement = function (ruleElem) {
1064
+ var group = ruleElem.closest('.e-group-container');
1065
+ if (group && group.previousElementSibling && group.previousElementSibling.previousElementSibling) {
1066
+ var prevElem = group.previousElementSibling.previousElementSibling;
1067
+ if (prevElem.classList.contains('e-group-container')) {
1068
+ var ruleContainer = prevElem.querySelectorAll('.e-rule-container');
1069
+ prevElem = ruleContainer[ruleContainer.length - 1];
1070
+ }
1071
+ if (prevElem.classList.contains('e-rule-container')) {
1072
+ var prevRule = this.getRule(prevElem);
1073
+ var args = {
1074
+ requestType: 'rule-template-create',
1075
+ ruleID: prevElem.id,
1076
+ condition: prevRule.condition,
1077
+ notCondition: this.enableNotCondition ? true : undefined
1078
+ };
1079
+ this.trigger('actionBegin', args);
1104
1080
  }
1105
- this.setMultiConnector(ruleElem);
1081
+ }
1082
+ };
1083
+ QueryBuilder.prototype.applyFieldComponent = function (ruleElem, rule, height) {
1084
+ if (this.fieldMode === 'Default') {
1085
+ this.applyDropdownListComponent(ruleElem, rule, height);
1086
+ }
1087
+ else {
1088
+ this.applyDropdownTreeComponent(ruleElem, rule, height);
1089
+ }
1090
+ };
1091
+ QueryBuilder.prototype.applyDropdownListComponent = function (ruleElem, rule, height) {
1092
+ var ddlField;
1093
+ var ddlValue;
1094
+ if (this.separator && rule.field) {
1095
+ ddlValue = this.GetRootColumnName(rule.field);
1096
+ }
1097
+ else if (this.autoSelectField) {
1098
+ ddlValue = this.GetRootColumnName(rule.field);
1099
+ }
1100
+ else {
1101
+ ddlValue = this.isImportRules ? this.GetRootColumnName(rule.field) : rule.field;
1102
+ }
1103
+ ddlField = {
1104
+ dataSource: this.columns,
1105
+ fields: this.fields,
1106
+ placeholder: this.l10n.getConstant('SelectField'),
1107
+ popupHeight: ((this.columns.length > 5) ? height : 'auto'),
1108
+ close: this.fieldClose.bind(this, ruleElem.id + '_filterkey'),
1109
+ change: this.changeField.bind(this),
1110
+ value: rule ? ddlValue : null,
1111
+ open: this.popupOpen.bind(this, true),
1112
+ cssClass: 'qb-dropdownlist'
1113
+ };
1114
+ if (this.fieldModel) {
1115
+ ddlField = __assign({}, ddlField, this.fieldModel);
1116
+ }
1117
+ var dropDownList = new DropDownList(ddlField);
1118
+ dropDownList.appendTo('#' + ruleElem.id + '_filterkey');
1119
+ var ddlVal;
1120
+ if (this.separator && rule.field) {
1121
+ ddlVal = this.GetRootColumnName(rule.field);
1122
+ }
1123
+ else {
1124
+ ddlVal = this.isImportRules ? this.GetRootColumnName(rule.field) : dropDownList.value;
1125
+ }
1126
+ this.selectedColumn = dropDownList.getDataByValue(ddlVal);
1127
+ if (Object.keys(rule).length) {
1128
+ this.changeRule(rule, {
1129
+ element: dropDownList.element,
1130
+ itemData: this.selectedColumn
1131
+ });
1132
+ }
1133
+ };
1134
+ QueryBuilder.prototype.applyDropdownTreeComponent = function (ruleElem, rule, height) {
1135
+ var ddlField;
1136
+ var ddlValue = this.isImportRules ? rule.field : rule.field;
1137
+ this.dummyDropdownTreeDs = extend([], this.columns, [], true);
1138
+ this.updateDropdowntreeDS(this.dummyDropdownTreeDs);
1139
+ ddlField = {
1140
+ fields: {
1141
+ dataSource: this.dummyDropdownTreeDs,
1142
+ value: 'field',
1143
+ text: 'label',
1144
+ child: 'columns',
1145
+ expanded: 'expanded',
1146
+ selectable: 'selectable'
1147
+ },
1148
+ placeholder: this.l10n.getConstant('SelectField'),
1149
+ showClearButton: false,
1150
+ popupHeight: ((this.columns.length > 5) ? height : 'auto'),
1151
+ changeOnBlur: false,
1152
+ change: this.changeField.bind(this),
1153
+ value: !isNullOrUndefined(ddlValue) ? [ddlValue] : null,
1154
+ open: this.popupOpen.bind(this, false),
1155
+ treeSettings: { expandOn: 'Click' },
1156
+ cssClass: 'e-qb-ddt',
1157
+ filtering: this.dropdownTreeFiltering.bind(this),
1158
+ close: this.dropdownTreeClose.bind(this)
1159
+ };
1160
+ if (this.fieldModel) {
1161
+ ddlField = __assign({}, ddlField, this.fieldModel);
1162
+ }
1163
+ var dropdowntree = new DropDownTree(ddlField);
1164
+ dropdowntree.appendTo('#' + ruleElem.id + '_filterkey');
1165
+ if (!isNullOrUndefined(dropdowntree.value)) {
1166
+ var value = this.getLabelFromColumn(dropdowntree.value[0]);
1167
+ dropdowntree.element.value = value;
1168
+ }
1169
+ var ddlVal = !isNullOrUndefined(rule.field) ?
1170
+ this.GetRootColumnName(rule.field) : dropdowntree.value;
1171
+ this.selectedColumn = this.getColumn(ddlVal);
1172
+ if (Object.keys(rule).length) {
1173
+ this.changeRule(rule, {
1174
+ element: dropdowntree.element,
1175
+ itemData: this.selectedColumn
1176
+ });
1106
1177
  }
1107
1178
  };
1108
1179
  QueryBuilder.prototype.dropdownTreeFiltering = function (args) {
@@ -1803,11 +1874,11 @@ var QueryBuilder = /** @class */ (function (_super) {
1803
1874
  }
1804
1875
  this.updatedRule = null;
1805
1876
  if (this.headerTemplate) {
1806
- var args_4 = {
1877
+ var args_1 = {
1807
1878
  requestType: 'header-template-create', ruleID: groupElem.id, condition: condition,
1808
1879
  notCondition: this.enableNotCondition ? not : undefined
1809
1880
  };
1810
- this.trigger('actionBegin', args_4);
1881
+ this.trigger('actionBegin', args_1);
1811
1882
  }
1812
1883
  else {
1813
1884
  if (this.enableSeparateConnector) {
@@ -3001,26 +3072,45 @@ var QueryBuilder = /** @class */ (function (_super) {
3001
3072
  var ddlObj = this.fieldMode === 'DropdownTree' ? getComponent(filterElem, 'dropdowntree')
3002
3073
  : getComponent(container.querySelector('.e-rule-filter .e-filter-input'), 'dropdownlist');
3003
3074
  var column = this.fieldMode === 'DropdownTree' ? this.getColumn(ddlObj.value[0]) : this.getColumn(ddlObj.value);
3075
+ if (target && target.nextElementSibling) {
3076
+ target.nextElementSibling.style.position = 'relative';
3077
+ target.nextElementSibling.classList.add('e-querybuilder-spinner');
3078
+ }
3079
+ var onComplete = function () {
3080
+ if (target && target.nextElementSibling && target.nextElementSibling.classList.contains('e-querybuilder-spinner')) {
3081
+ target.nextElementSibling.classList.remove('e-querybuilder-spinner');
3082
+ }
3083
+ };
3004
3084
  if (typeof itemData.template === 'string' || itemData.template.write === undefined) {
3005
3085
  var args = {
3006
3086
  rule: rule, ruleID: container.id, operator: tempRule.operator, field: column.field,
3007
3087
  requestType: 'value-template-create'
3008
3088
  };
3009
3089
  this.trigger('actionBegin', args);
3090
+ onComplete();
3010
3091
  }
3011
3092
  else {
3012
3093
  var template = itemData.template;
3094
+ var templateArgs = {
3095
+ elements: tempElements.length > 1 ? tempElements : tempElements[0],
3096
+ values: rule.value,
3097
+ operator: tempRule.operator,
3098
+ field: column.field,
3099
+ dataSource: column.values,
3100
+ onComplete: onComplete
3101
+ };
3102
+ var writeResult = void 0;
3013
3103
  if (typeof template.write === 'string') {
3014
- getValue(template.write, window)({
3015
- elements: tempElements.length > 1 ? tempElements : tempElements[0], values: rule.value,
3016
- operator: tempRule.operator, field: column.field, dataSource: column.values
3017
- });
3104
+ writeResult = getValue(template.write, window)(templateArgs);
3018
3105
  }
3019
3106
  else if (typeof itemData.template !== 'function') {
3020
- itemData.template.write({
3021
- elements: tempElements.length > 1 ? tempElements : tempElements[0],
3022
- values: rule.value, operator: tempRule.operator, field: column.field, dataSource: column.values
3023
- });
3107
+ writeResult = itemData.template.write(templateArgs);
3108
+ }
3109
+ if (writeResult && typeof writeResult.then === 'function') {
3110
+ writeResult.then(function () { return onComplete(); });
3111
+ }
3112
+ else {
3113
+ setTimeout(function () { return onComplete(); }, 100);
3024
3114
  }
3025
3115
  }
3026
3116
  };
@@ -7377,7 +7467,8 @@ var QueryBuilder = /** @class */ (function (_super) {
7377
7467
  deleteElem: groupElem.querySelectorAll('.e-rule-delete'),
7378
7468
  lockElem: groupElem.querySelectorAll('.e-lock-rule'),
7379
7469
  cloneElem: groupElem.querySelectorAll('.e-clone-rule'),
7380
- ruleElem: groupElem.querySelectorAll('.e-rule-container')
7470
+ ruleElem: groupElem.querySelectorAll('.e-rule-container'),
7471
+ ddTree: groupElem.querySelectorAll('.e-control.e-dropdowntree')
7381
7472
  };
7382
7473
  elements.deleteElem.forEach(function (elem, i) {
7383
7474
  if (isDisabled) {
@@ -7414,6 +7505,7 @@ var QueryBuilder = /** @class */ (function (_super) {
7414
7505
  disableComponents(elements.checkbox, function (elem) { return getComponent(elem, 'checkbox'); }, isDisabled);
7415
7506
  disableComponents(elements.radio, function (elem) { return getComponent(elem, 'radio'); }, isDisabled);
7416
7507
  disableComponents(elements.multiSelect, function (elem) { return getComponent(elem, 'multiselect'); }, isDisabled);
7508
+ disableComponents(elements.ddTree, function (elem) { return getComponent(elem, 'dropdowntree'); }, isDisabled);
7417
7509
  };
7418
7510
  __decorate([
7419
7511
  Event()
@@ -834,4 +834,41 @@
834
834
  .e-tooltip-wrap.e-querybuilder-error .e-tip-content,
835
835
  .e-tooltip-wrap.e-querybuilder-error .e-tip-content label {
836
836
  color: #d92c20;
837
+ }
838
+
839
+ .querybuilder-spinner::before {
840
+ content: "";
841
+ position: absolute;
842
+ left: 50%;
843
+ -webkit-transform: translateX(-50%);
844
+ transform: translateX(-50%);
845
+ width: 16px;
846
+ height: 16px;
847
+ border: 2px solid var(--color-sf-utility-primary-light);
848
+ border-top: 2px solid var(--color-sf-brand-primary);
849
+ border-radius: 50%;
850
+ -webkit-animation: spin 1s linear infinite;
851
+ animation: spin 1s linear infinite;
852
+ }
853
+
854
+ @-webkit-keyframes spin {
855
+ 0% {
856
+ -webkit-transform: translateX(-50%) rotate(0deg);
857
+ transform: translateX(-50%) rotate(0deg);
858
+ }
859
+ 100% {
860
+ -webkit-transform: translateX(-50%) rotate(360deg);
861
+ transform: translateX(-50%) rotate(360deg);
862
+ }
863
+ }
864
+
865
+ @keyframes spin {
866
+ 0% {
867
+ -webkit-transform: translateX(-50%) rotate(0deg);
868
+ transform: translateX(-50%) rotate(0deg);
869
+ }
870
+ 100% {
871
+ -webkit-transform: translateX(-50%) rotate(360deg);
872
+ transform: translateX(-50%) rotate(360deg);
873
+ }
837
874
  }
package/styles/bds.css CHANGED
@@ -836,6 +836,42 @@
836
836
  color: #d92c20;
837
837
  }
838
838
 
839
+ .querybuilder-spinner::before {
840
+ content: "";
841
+ position: absolute;
842
+ left: 50%;
843
+ -webkit-transform: translateX(-50%);
844
+ transform: translateX(-50%);
845
+ width: 16px;
846
+ height: 16px;
847
+ border: 2px solid var(--color-sf-utility-primary-light);
848
+ border-top: 2px solid var(--color-sf-brand-primary);
849
+ border-radius: 50%;
850
+ -webkit-animation: spin 1s linear infinite;
851
+ animation: spin 1s linear infinite;
852
+ }
853
+
854
+ @-webkit-keyframes spin {
855
+ 0% {
856
+ -webkit-transform: translateX(-50%) rotate(0deg);
857
+ transform: translateX(-50%) rotate(0deg);
858
+ }
859
+ 100% {
860
+ -webkit-transform: translateX(-50%) rotate(360deg);
861
+ transform: translateX(-50%) rotate(360deg);
862
+ }
863
+ }
864
+
865
+ @keyframes spin {
866
+ 0% {
867
+ -webkit-transform: translateX(-50%) rotate(0deg);
868
+ transform: translateX(-50%) rotate(0deg);
869
+ }
870
+ 100% {
871
+ -webkit-transform: translateX(-50%) rotate(360deg);
872
+ transform: translateX(-50%) rotate(360deg);
873
+ }
874
+ }
839
875
  .e-query-builder.e-device.e-multi-connector .e-rule-list .e-group-container,
840
876
  .e-bigger.e-query-builder.e-multi-connector .e-rule-list .e-group-container,
841
877
  .e-bigger .e-query-builder.e-multi-connector .e-rule-list .e-group-container {