@syncfusion/ej2-querybuilder 24.2.8 → 25.1.35

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 (58) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/ej2-querybuilder.min.js +2 -2
  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 +1615 -157
  6. package/dist/es6/ej2-querybuilder.es2015.js.map +1 -1
  7. package/dist/es6/ej2-querybuilder.es5.js +1617 -157
  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/package.json +12 -12
  13. package/src/global.js +2 -0
  14. package/src/query-builder/index.d.ts +1 -0
  15. package/src/query-builder/index.js +1 -0
  16. package/src/query-builder/query-builder-model.d.ts +69 -1
  17. package/src/query-builder/query-builder.d.ts +189 -4
  18. package/src/query-builder/query-builder.js +903 -130
  19. package/src/query-builder/query-library.d.ts +24 -0
  20. package/src/query-builder/query-library.js +689 -0
  21. package/styles/bootstrap-dark.css +29 -12
  22. package/styles/bootstrap.css +29 -12
  23. package/styles/bootstrap4.css +25 -12
  24. package/styles/bootstrap5-dark.css +35 -11
  25. package/styles/bootstrap5.css +35 -11
  26. package/styles/fabric-dark.css +25 -12
  27. package/styles/fabric.css +25 -12
  28. package/styles/fluent-dark.css +39 -11
  29. package/styles/fluent.css +39 -11
  30. package/styles/highcontrast-light.css +25 -12
  31. package/styles/highcontrast.css +25 -12
  32. package/styles/material-dark.css +25 -12
  33. package/styles/material.css +25 -12
  34. package/styles/material3-dark.css +25 -12
  35. package/styles/material3.css +25 -12
  36. package/styles/query-builder/_bds-definition.scss +107 -0
  37. package/styles/query-builder/_layout.scss +37 -7
  38. package/styles/query-builder/_theme.scss +16 -1
  39. package/styles/query-builder/bootstrap-dark.css +29 -12
  40. package/styles/query-builder/bootstrap.css +29 -12
  41. package/styles/query-builder/bootstrap4.css +25 -12
  42. package/styles/query-builder/bootstrap5-dark.css +35 -11
  43. package/styles/query-builder/bootstrap5.css +35 -11
  44. package/styles/query-builder/fabric-dark.css +25 -12
  45. package/styles/query-builder/fabric.css +25 -12
  46. package/styles/query-builder/fluent-dark.css +39 -11
  47. package/styles/query-builder/fluent.css +39 -11
  48. package/styles/query-builder/highcontrast-light.css +25 -12
  49. package/styles/query-builder/highcontrast.css +25 -12
  50. package/styles/query-builder/icons/_bds.scss +7 -0
  51. package/styles/query-builder/material-dark.css +25 -12
  52. package/styles/query-builder/material.css +25 -12
  53. package/styles/query-builder/material3-dark.css +25 -12
  54. package/styles/query-builder/material3.css +25 -12
  55. package/styles/query-builder/tailwind-dark.css +30 -11
  56. package/styles/query-builder/tailwind.css +30 -11
  57. package/styles/tailwind-dark.css +30 -11
  58. package/styles/tailwind.css +30 -11
@@ -127,6 +127,9 @@ var Rule = /** @class */ (function (_super) {
127
127
  __decorate([
128
128
  Property(false)
129
129
  ], Rule.prototype, "not", void 0);
130
+ __decorate([
131
+ Property(false)
132
+ ], Rule.prototype, "isLocked", void 0);
130
133
  return Rule;
131
134
  }(ChildProperty));
132
135
  export { Rule };
@@ -164,6 +167,18 @@ var ShowButtons = /** @class */ (function (_super) {
164
167
  function ShowButtons() {
165
168
  return _super !== null && _super.apply(this, arguments) || this;
166
169
  }
170
+ __decorate([
171
+ Property(false)
172
+ ], ShowButtons.prototype, "cloneRule", void 0);
173
+ __decorate([
174
+ Property(false)
175
+ ], ShowButtons.prototype, "cloneGroup", void 0);
176
+ __decorate([
177
+ Property(false)
178
+ ], ShowButtons.prototype, "lockRule", void 0);
179
+ __decorate([
180
+ Property(false)
181
+ ], ShowButtons.prototype, "lockGroup", void 0);
167
182
  __decorate([
168
183
  Property(true)
169
184
  ], ShowButtons.prototype, "ruleDelete", void 0);
@@ -182,7 +197,7 @@ var QueryBuilder = /** @class */ (function (_super) {
182
197
  var _this = _super.call(this, options, element) || this;
183
198
  _this.isReadonly = true;
184
199
  _this.fields = { text: 'label', value: 'field' };
185
- _this.updatedRule = { not: false, condition: 'and' };
200
+ _this.updatedRule = { not: false, condition: 'and', isLocked: false };
186
201
  _this.isLocale = false;
187
202
  _this.isRefreshed = false;
188
203
  _this.isNotified = false;
@@ -193,6 +208,14 @@ var QueryBuilder = /** @class */ (function (_super) {
193
208
  _this.isDestroy = false;
194
209
  _this.isGetNestedData = false;
195
210
  _this.isCustomOprCols = [];
211
+ _this.groupCounter = 0;
212
+ _this.lockItems = [];
213
+ _this.groupIndex = -1;
214
+ _this.ruleIndex = -1;
215
+ _this.isLastGroup = false;
216
+ _this.cloneGrpBtnClick = false;
217
+ _this.isMiddleGroup = false;
218
+ _this.cloneRuleBtnClick = false;
196
219
  MultiSelect.Inject(CheckBoxSelection);
197
220
  return _this;
198
221
  }
@@ -245,6 +268,14 @@ var QueryBuilder = /** @class */ (function (_super) {
245
268
  QueryBuilder.prototype.getModuleName = function () {
246
269
  return 'query-builder';
247
270
  };
271
+ QueryBuilder.prototype.requiredModules = function () {
272
+ var modules = [];
273
+ modules.push({
274
+ member: 'query-library',
275
+ args: [this]
276
+ });
277
+ return modules;
278
+ };
248
279
  QueryBuilder.prototype.GetRootColumnName = function (field) {
249
280
  return this.separator ? field.split(this.separator)[0] : field;
250
281
  };
@@ -438,31 +469,51 @@ var QueryBuilder = /** @class */ (function (_super) {
438
469
  txtareaElem.style.height = txtareaElem.scrollHeight + 'px';
439
470
  }
440
471
  if (target.tagName === 'BUTTON' && target.className.indexOf('e-qb-toggle') < 0) {
441
- if (target.className.indexOf('e-removerule') > -1) {
442
- this.actionButton = target;
443
- this.deleteRule(target);
444
- }
445
- else if (target.className.indexOf('e-deletegroup') > -1) {
446
- this.actionButton = target;
447
- this.deleteGroup(closest(target, '.e-group-container'));
448
- }
449
- else if (target.className.indexOf('e-edit-rule') > -1) {
450
- var animation = new Animation({ duration: 1000, delay: 0 });
451
- animation.animate('.e-query-builder', { name: 'SlideLeftIn' });
452
- document.getElementById(this.element.id + '_summary_content').style.display = 'none';
453
- if (this.element.querySelectorAll('.e-group-container').length < 1) {
454
- this.addGroupElement(false, this.element, this.rule.condition, false, this.rule.not);
455
- var mRules = extend({}, this.rule, {}, true);
456
- this.setGroupRules(mRules);
457
- this.renderSummaryCollapse();
458
- }
459
- else {
460
- var groupElem = this.element.querySelector('.e-group-container');
461
- if (groupElem.querySelectorAll('.e-collapse-rule').length < 1) {
472
+ switch (true) {
473
+ case target.className.indexOf('e-removerule') > -1:
474
+ this.actionButton = target;
475
+ this.deleteRule(target);
476
+ break;
477
+ case target.className.indexOf('e-clone-rule-btn') > -1:
478
+ this.actionButton = target;
479
+ this.cloneRuleBtnClick = true;
480
+ this.ruleClone(target);
481
+ break;
482
+ case target.className.indexOf('e-lock-rule-btn') > -1:
483
+ this.actionButton = target;
484
+ this.ruleLock(target);
485
+ break;
486
+ case target.className.indexOf('e-lock-grp-btn') > -1:
487
+ this.actionButton = target;
488
+ this.groupLock(target);
489
+ break;
490
+ case target.className.indexOf('e-clone-grp-btn') > -1:
491
+ this.actionButton = target;
492
+ this.cloneGrpBtnClick = true;
493
+ this.groupClone(closest(target, '.e-group-container'));
494
+ break;
495
+ case target.className.indexOf('e-deletegroup') > -1:
496
+ this.actionButton = target;
497
+ this.deleteGroup(closest(target, '.e-group-container'));
498
+ break;
499
+ case target.className.indexOf('e-edit-rule') > -1:
500
+ var animation = new Animation({ duration: 1000, delay: 0 });
501
+ animation.animate('.e-query-builder', { name: 'SlideLeftIn' });
502
+ document.getElementById(this.element.id + '_summary_content').style.display = 'none';
503
+ if (this.element.querySelectorAll('.e-group-container').length < 1) {
504
+ this.addGroupElement(false, this.element, this.rule.condition, false, this.rule.not);
505
+ var mRules = extend({}, this.rule, {}, true);
506
+ this.setGroupRules(mRules);
462
507
  this.renderSummaryCollapse();
463
508
  }
464
- groupElem.style.display = 'block';
465
- }
509
+ else {
510
+ var groupElem = this.element.querySelector('.e-group-container');
511
+ if (groupElem.querySelectorAll('.e-collapse-rule').length < 1) {
512
+ this.renderSummaryCollapse();
513
+ }
514
+ groupElem.style.display = 'block';
515
+ }
516
+ break;
466
517
  }
467
518
  }
468
519
  else if ((target.tagName === 'LABEL' && target.parentElement.className.indexOf('e-btn-group') > -1) ||
@@ -562,7 +613,18 @@ var QueryBuilder = /** @class */ (function (_super) {
562
613
  else {
563
614
  ruleElem = this.createElement('div', { attrs: { class: 'e-rule-container' } });
564
615
  ruleElem.setAttribute('id', target.id + '_rule' + this.ruleIdCounter);
565
- ruleListElem.appendChild(ruleElem);
616
+ if (this.showButtons.cloneRule && this.cloneRuleBtnClick) {
617
+ if (this.ruleIndex < 0) {
618
+ ruleListElem.appendChild(ruleElem);
619
+ }
620
+ else {
621
+ ruleListElem.insertBefore(ruleElem, ruleListElem.children[this.ruleIndex + 1]); // added clone rule to next position
622
+ }
623
+ this.cloneRuleBtnClick = false;
624
+ }
625
+ else {
626
+ ruleListElem.appendChild(ruleElem);
627
+ }
566
628
  this.ruleIdCounter++;
567
629
  }
568
630
  if (column && column.ruleTemplate && rule) {
@@ -612,6 +674,21 @@ var QueryBuilder = /** @class */ (function (_super) {
612
674
  elem = this.ruleElem.querySelector('.e-rule-field').cloneNode(true);
613
675
  ruleElem.appendChild(elem);
614
676
  }
677
+ if (this.showButtons.lockGroup) {
678
+ removeClass(ruleElem.querySelectorAll('.e-lock-grp-btn'), 'e-button-hide');
679
+ }
680
+ if (this.showButtons.lockRule) {
681
+ removeClass(ruleElem.querySelectorAll('.e-lock-rule-btn'), 'e-button-hide');
682
+ }
683
+ if (this.showButtons.cloneGroup) {
684
+ removeClass(ruleElem.querySelectorAll('.e-clone-grp-btn'), 'e-button-hide');
685
+ }
686
+ if (this.showButtons.cloneRule) {
687
+ removeClass(ruleElem.querySelectorAll('.e-clone-rule-btn'), 'e-button-hide');
688
+ }
689
+ if (this.showButtons.ruleDelete) {
690
+ removeClass(ruleElem.querySelectorAll('.e-lock-grp-btn'), 'e-button-hide');
691
+ }
615
692
  if (column && column.ruleTemplate && rule) {
616
693
  this.renderReactTemplates();
617
694
  }
@@ -655,7 +732,7 @@ var QueryBuilder = /** @class */ (function (_super) {
655
732
  else {
656
733
  ruleElem = this.appendRuleElem(trgt, column, act, pId, 'field');
657
734
  ruleElem.querySelector('.e-filter-input').setAttribute('id', ruleElem.id + '_filterkey');
658
- var element = ruleElem.querySelector('button');
735
+ var element = ruleElem.querySelector('.e-rule-delete');
659
736
  if (this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical') {
660
737
  element.textContent = this.l10n.getConstant('Remove');
661
738
  addClass([element], 'e-flat');
@@ -665,8 +742,11 @@ var QueryBuilder = /** @class */ (function (_super) {
665
742
  addClass([element], 'e-round');
666
743
  addClass([element], 'e-icon-btn');
667
744
  element.setAttribute('title', this.l10n.getConstant('DeleteRule'));
668
- element = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-delete-icon' } });
669
- ruleElem.querySelector('button').appendChild(element);
745
+ var spanElement = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-delete-icon' } });
746
+ ruleElem.querySelector('.e-rule-delete').appendChild(spanElement);
747
+ }
748
+ if (!this.showButtons.ruleDelete) {
749
+ element.classList.add('e-button-hide');
670
750
  }
671
751
  }
672
752
  if (this.displayMode === 'Vertical' || this.element.className.indexOf('e-device') > -1) {
@@ -697,6 +777,9 @@ var QueryBuilder = /** @class */ (function (_super) {
697
777
  if (this.separator && rule.field) {
698
778
  ddlValue = this.GetRootColumnName(rule.field);
699
779
  }
780
+ else if (this.autoSelectField) {
781
+ ddlValue = this.GetRootColumnName(rule.field);
782
+ }
700
783
  else {
701
784
  ddlValue = this.isImportRules ? this.GetRootColumnName(rule.field) : rule.field;
702
785
  }
@@ -704,8 +787,7 @@ var QueryBuilder = /** @class */ (function (_super) {
704
787
  dataSource: this.columns,
705
788
  fields: this.fields, placeholder: this.l10n.getConstant('SelectField'),
706
789
  popupHeight: ((this.columns.length > 5) ? height : 'auto'), close: this.fieldClose.bind(this, ruleElem.id + '_filterkey'),
707
- change: this.changeField.bind(this), value: rule ? ddlValue : null, open: this.popupOpen.bind(this, true),
708
- cssClass: 'qb-dropdownlist'
790
+ change: this.changeField.bind(this), value: rule ? ddlValue : null, open: this.popupOpen.bind(this, true), cssClass: 'qb-dropdownlist'
709
791
  };
710
792
  if (this.fieldModel) {
711
793
  ddlField = __assign({}, ddlField, this.fieldModel);
@@ -795,12 +877,23 @@ var QueryBuilder = /** @class */ (function (_super) {
795
877
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
796
878
  var custom = rule.custom;
797
879
  if (Object.keys(rule).length) {
798
- rules.rules.push({
799
- 'field': rule.field, 'type': rule.type, 'label': rule.label, 'operator': rule.operator, value: rule.value
800
- });
801
- if (custom) {
802
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
803
- rules.rules[rules.rules.length - 1].custom = custom;
880
+ if (this.ruleIndex < 0) {
881
+ rules.rules.push({
882
+ 'field': rule.field, 'type': rule.type, 'label': rule.label, 'operator': rule.operator, value: rule.value
883
+ });
884
+ if (custom) {
885
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
886
+ rules.rules[rules.rules.length - 1].custom = custom;
887
+ }
888
+ }
889
+ else {
890
+ rules.rules.splice(this.ruleIndex + 1, 0, {
891
+ 'field': rule.field, 'type': rule.type, 'label': rule.label, 'operator': rule.operator, value: rule.value
892
+ });
893
+ if (custom) {
894
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
895
+ rules.rules[this.ruleIndex + 1].custom = custom;
896
+ }
804
897
  }
805
898
  }
806
899
  else {
@@ -808,6 +901,9 @@ var QueryBuilder = /** @class */ (function (_super) {
808
901
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
809
902
  newRule.custom = custom;
810
903
  }
904
+ if (this.autoSelectField) {
905
+ rule.field = newRule.field = this.rule.rules[0].field;
906
+ }
811
907
  rules.rules.push(newRule);
812
908
  }
813
909
  }
@@ -1007,6 +1103,8 @@ var QueryBuilder = /** @class */ (function (_super) {
1007
1103
  QueryBuilder.prototype.ruleTemplate = function () {
1008
1104
  var tempElem;
1009
1105
  var clsName;
1106
+ var cloneClsName;
1107
+ var lockClsName;
1010
1108
  var ruleElem = this.createElement('div');
1011
1109
  var fieldElem = this.createElement('div', { attrs: { class: 'e-rule-field' } });
1012
1110
  tempElem = this.createElement('div', { attrs: { class: 'e-rule-filter' } });
@@ -1018,6 +1116,24 @@ var QueryBuilder = /** @class */ (function (_super) {
1018
1116
  tempElem = this.createElement('div', { attrs: { class: 'e-rule-value' } });
1019
1117
  fieldElem.appendChild(tempElem);
1020
1118
  tempElem = this.createElement('div', { attrs: { class: 'e-rule-value-delete' } });
1119
+ if (this.showButtons.cloneRule) {
1120
+ cloneClsName = 'e-clone-rule-btn e-clone-rule e-css e-btn e-small e-round e-icon-btn';
1121
+ }
1122
+ else {
1123
+ cloneClsName = 'e-clone-rule-btn e-clone-rule e-css e-btn e-small e-round e-icon-btn e-button-hide';
1124
+ }
1125
+ if (this.showButtons.lockRule) {
1126
+ lockClsName = 'e-lock-rule-btn e-lock-rule e-css e-btn e-small e-round e-icons e-icon-btn';
1127
+ }
1128
+ else {
1129
+ lockClsName = 'e-lock-rule-btn e-lock-rule e-css e-btn e-small e-round e-icons e-icon-btn e-button-hide';
1130
+ }
1131
+ var cloneRuleBtnElem = this.createElement('button', { attrs: { title: this.l10n.getConstant('CloneRule'), type: 'button', class: cloneClsName } });
1132
+ var spanElement = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-copy' } });
1133
+ cloneRuleBtnElem.appendChild(spanElement);
1134
+ var cloneLockBtnElem = this.createElement('button', { attrs: { title: this.l10n.getConstant('LockRule'), type: 'button', class: lockClsName } });
1135
+ spanElement = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-unlock' } });
1136
+ cloneLockBtnElem.appendChild(spanElement);
1021
1137
  if (this.showButtons.ruleDelete || isNullOrUndefined(this.showButtons.ruleDelete)) {
1022
1138
  clsName = 'e-removerule e-rule-delete e-css e-btn e-small';
1023
1139
  }
@@ -1025,6 +1141,8 @@ var QueryBuilder = /** @class */ (function (_super) {
1025
1141
  clsName = 'e-removerule e-rule-delete e-css e-btn e-small e-button-hide';
1026
1142
  }
1027
1143
  var delBtnElem = this.createElement('button', { attrs: { type: 'button', class: clsName } });
1144
+ tempElem.appendChild(cloneRuleBtnElem);
1145
+ tempElem.appendChild(cloneLockBtnElem);
1028
1146
  tempElem.appendChild(delBtnElem);
1029
1147
  fieldElem.appendChild(tempElem);
1030
1148
  ruleElem.appendChild(fieldElem);
@@ -1094,9 +1212,6 @@ var QueryBuilder = /** @class */ (function (_super) {
1094
1212
  button.appendTo(dltGroupBtn);
1095
1213
  dltGroupBtn.setAttribute('title', this.l10n.getConstant('DeleteGroup'));
1096
1214
  rippleEffect(dltGroupBtn, { selector: '.deletegroup' });
1097
- if (!this.headerTemplate) {
1098
- groupElem.querySelector('.e-group-action').appendChild(dltGroupBtn);
1099
- }
1100
1215
  var ruleList = target.querySelector('.e-rule-list');
1101
1216
  var childElems = ruleList.children;
1102
1217
  var grpLen = 0;
@@ -1105,20 +1220,72 @@ var QueryBuilder = /** @class */ (function (_super) {
1105
1220
  grpLen += 1;
1106
1221
  }
1107
1222
  }
1108
- ruleList.appendChild(groupElem);
1223
+ if (this.showButtons.cloneGroup && this.cloneGrpBtnClick) {
1224
+ if (this.groupIndex === (childElems.length - 1)) {
1225
+ ruleList.appendChild(groupElem);
1226
+ this.isLastGroup = true;
1227
+ }
1228
+ else {
1229
+ childElems[this.groupIndex + 1].parentNode.insertBefore(groupElem, childElems[this.groupIndex + 1]); // clone the element to nxt element
1230
+ this.isMiddleGroup = true;
1231
+ }
1232
+ }
1233
+ else {
1234
+ ruleList.appendChild(groupElem);
1235
+ }
1109
1236
  var level = this.levelColl[target.id].slice(0);
1110
1237
  level.push(grpLen);
1111
1238
  this.levelColl[groupElem.id] = level;
1239
+ if (this.groupIndex > -1) {
1240
+ this.refreshLevelColl();
1241
+ }
1112
1242
  if (!this.isImportRules) {
1113
1243
  this.isAddSuccess = true;
1114
1244
  this.addGroups([], target.id.replace(this.element.id + '_', ''));
1115
1245
  this.isAddSuccess = false;
1116
- if (isBtnClick) {
1246
+ if (isBtnClick && this.addRuleToNewGroups) {
1117
1247
  this.addRuleElement(groupElem, {});
1118
1248
  }
1119
1249
  }
1250
+ if (!this.headerTemplate) {
1251
+ var lockClsName = '';
1252
+ if (this.showButtons.cloneGroup) {
1253
+ lockClsName = 'e-clone-grp-btn e-css e-btn e-small e-round e-icons e-icon-btn';
1254
+ }
1255
+ else {
1256
+ lockClsName = 'e-clone-grp-btn e-css e-btn e-small e-round e-icons e-icon-btn e-button-hide';
1257
+ }
1258
+ var cloneBtnElem = this.createElement('button', { attrs: { title: this.l10n.getConstant('CloneGroup'), type: 'button', class: lockClsName } });
1259
+ var spanElement = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-copy' } });
1260
+ cloneBtnElem.appendChild(spanElement);
1261
+ groupElem.querySelector('.e-group-action').appendChild(cloneBtnElem);
1262
+ if (this.showButtons.lockGroup) {
1263
+ lockClsName = 'e-lock-grp-btn e-css e-btn e-small e-round e-icons e-icon-btn';
1264
+ }
1265
+ else {
1266
+ lockClsName = 'e-lock-grp-btn e-css e-btn e-small e-round e-icons e-icon-btn e-button-hide';
1267
+ }
1268
+ var lockBtnElem = this.createElement('button', { attrs: { title: this.l10n.getConstant('LockGroup'), type: 'button', class: lockClsName } });
1269
+ var lockSpanElement = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-unlock' } });
1270
+ lockBtnElem.appendChild(lockSpanElement);
1271
+ groupElem.querySelector('.e-group-action').appendChild(lockBtnElem);
1272
+ groupElem.querySelector('.e-group-action').appendChild(dltGroupBtn);
1273
+ }
1120
1274
  }
1121
1275
  else {
1276
+ if (!this.headerTemplate) {
1277
+ var lockClsName = '';
1278
+ if (this.showButtons.lockGroup) {
1279
+ lockClsName = 'e-lock-grp-btn e-css e-btn e-small e-round e-icons e-icon-btn';
1280
+ }
1281
+ else {
1282
+ lockClsName = 'e-lock-grp-btn e-css e-btn e-small e-round e-icons e-icon-btn e-button-hide';
1283
+ }
1284
+ var lockBtnElem = this.createElement('button', { attrs: { title: this.l10n.getConstant('LockGroup'), type: 'button', class: lockClsName } });
1285
+ var spanElement = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-unlock' } });
1286
+ lockBtnElem.appendChild(spanElement);
1287
+ groupElem.querySelector('.e-group-action').appendChild(lockBtnElem);
1288
+ }
1122
1289
  target.appendChild(groupElem);
1123
1290
  this.levelColl[groupElem.id] = [0];
1124
1291
  }
@@ -1376,6 +1543,10 @@ var QueryBuilder = /** @class */ (function (_super) {
1376
1543
  if (this.fieldMode === 'Default') {
1377
1544
  dropDownObj = getComponent(closest(element, '.e-rule-container').querySelector('.e-filter-input'), 'dropdownlist');
1378
1545
  this.selectedColumn = dropDownObj.getDataByValue(dropDownObj.value);
1546
+ if (this.selectedColumn.columns) {
1547
+ dropDownObj = getComponent(closest(element, '.e-rule-container').querySelector('.e-rule-sub-filter .e-dropdownlist'), 'dropdownlist');
1548
+ this.selectedColumn = this.getColumn(dropDownObj.value);
1549
+ }
1379
1550
  }
1380
1551
  else {
1381
1552
  dropDownObj = getComponent(closest(element, '.e-rule-container').querySelector('.e-filter-input'), 'dropdowntree');
@@ -1450,7 +1621,7 @@ var QueryBuilder = /** @class */ (function (_super) {
1450
1621
  this.prevItemData = args.itemData;
1451
1622
  var fieldElem = closest(args.element, '.e-rule-filter') || closest(args.element, '.e-rule-sub-filter');
1452
1623
  var column = this.fieldMode === 'DropdownTree' ? this.getColumn(args.value[0]) : this.getColumn(args.value);
1453
- if (this.fieldMode === 'DropdownTree' && fieldElem != null) {
1624
+ if (this.fieldMode === 'DropdownTree' && fieldElem !== null) {
1454
1625
  var ddtElem = fieldElem.querySelector('.e-dropdowntree.e-control');
1455
1626
  var ddt = getComponent(ddtElem, 'dropdowntree');
1456
1627
  if (column) {
@@ -1522,7 +1693,7 @@ var QueryBuilder = /** @class */ (function (_super) {
1522
1693
  var filterElem = closest(ddlArgs.element, '.e-rule-filter');
1523
1694
  filterElem = filterElem ? filterElem : closest(ddlArgs.element, '.e-rule-sub-filter');
1524
1695
  var ddlObj = getComponent(ddlArgs.element, 'dropdownlist');
1525
- if (this.fieldMode === 'DropdownTree' && filterElem != null) {
1696
+ if (this.fieldMode === 'DropdownTree' && filterElem !== null) {
1526
1697
  ddlObj = getComponent(ddlArgs.element, 'dropdowntree');
1527
1698
  }
1528
1699
  var element = closest(ddlArgs.element, '.e-group-container');
@@ -1651,7 +1822,7 @@ var QueryBuilder = /** @class */ (function (_super) {
1651
1822
  this.GetRootColumnName(rule.field) === this.GetRootColumnName(this.previousColumn.field))) {
1652
1823
  var subField = this.selectedColumn.columns;
1653
1824
  for (var i = 0; i < subField.length; i++) {
1654
- if (rule.field === subField[i].field || rule.field.indexOf(subField[i].field) > -1) {
1825
+ if (rule.field === subField[i].field) {
1655
1826
  dropDownList.value = subField[i].field;
1656
1827
  this.selectedColumn = subField[i];
1657
1828
  subFieldValue = true;
@@ -1690,7 +1861,7 @@ var QueryBuilder = /** @class */ (function (_super) {
1690
1861
  rule.value = [];
1691
1862
  }
1692
1863
  }
1693
- else if (typeof rule.value === 'object' && rule.value != null) {
1864
+ else if (typeof rule.value === 'object' && rule.value !== null) {
1694
1865
  rule.value = rule.value.length > 0 ? rule.value[0] : rule.type === 'number' ? 0 : '';
1695
1866
  }
1696
1867
  if (ddlArgs.previousItemData) {
@@ -1717,6 +1888,9 @@ var QueryBuilder = /** @class */ (function (_super) {
1717
1888
  if (valElem && this.getColumn(rule.field).template) {
1718
1889
  filterElem = operatorElem.previousElementSibling;
1719
1890
  }
1891
+ if (valElem.children.length == 0) {
1892
+ filterElem = operatorElem.previousElementSibling;
1893
+ }
1720
1894
  this.changeRuleValues(filterElem, rule, tempRule, ddlArgs);
1721
1895
  }
1722
1896
  };
@@ -1747,7 +1921,9 @@ var QueryBuilder = /** @class */ (function (_super) {
1747
1921
  tempRule.type = this.fieldMode === 'DropdownTree' ? this.getColumn(fieldObj.value[0]).type :
1748
1922
  this.getColumn(fieldObj.value).type;
1749
1923
  var itemData = ddlArgs.itemData;
1750
- this.renderValues(operatorElem, itemData, ddlArgs.previousItemData, true, rule, tempRule, ddlArgs.element);
1924
+ if (ddlObj.value !== '') {
1925
+ this.renderValues(operatorElem, itemData, ddlArgs.previousItemData, true, rule, tempRule, ddlArgs.element);
1926
+ }
1751
1927
  }
1752
1928
  else {
1753
1929
  var ruleId = closest(operatorElem, '.e-rule-container').id;
@@ -1761,7 +1937,14 @@ var QueryBuilder = /** @class */ (function (_super) {
1761
1937
  }
1762
1938
  var height = (this.element.className.indexOf('e-device') > -1) ? '250px' : '200px';
1763
1939
  var value = operatorList[0].value;
1764
- value = rule ? (rule.operator !== '' ? rule.operator : value) : value;
1940
+ var ddlIdx = 0;
1941
+ if (!this.autoSelectOperator) {
1942
+ value = '';
1943
+ ddlIdx = -1;
1944
+ }
1945
+ if (this.isImportRules || (this.ruleIndex > -1 || this.groupIndex > -1)) {
1946
+ value = rule ? (rule.operator ? rule.operator : value) : value;
1947
+ }
1765
1948
  var ddlOperator = void 0;
1766
1949
  ddlOperator = {
1767
1950
  dataSource: operatorList,
@@ -1769,7 +1952,7 @@ var QueryBuilder = /** @class */ (function (_super) {
1769
1952
  placeholder: this.l10n.getConstant('SelectOperator'),
1770
1953
  popupHeight: ((operatorList.length > 5) ? height : 'auto'),
1771
1954
  change: this.changeField.bind(this),
1772
- index: 0,
1955
+ index: ddlIdx,
1773
1956
  value: value,
1774
1957
  open: this.popupOpen.bind(this, false)
1775
1958
  };
@@ -1783,7 +1966,12 @@ var QueryBuilder = /** @class */ (function (_super) {
1783
1966
  tempRule.type = this.selectedColumn.type;
1784
1967
  tempRule.operator = rule.operator;
1785
1968
  }
1786
- this.renderValues(operatorElem, this.selectedColumn, ddlArgs.previousItemData, false, rule, tempRule, ddlArgs.element);
1969
+ if (!isNullOrUndefined(value) && value !== '') {
1970
+ this.renderValues(operatorElem, this.selectedColumn, ddlArgs.previousItemData, false, rule, tempRule, ddlArgs.element);
1971
+ }
1972
+ else if (this.autoSelectField && this.autoSelectOperator) {
1973
+ this.renderValues(operatorElem, this.selectedColumn, ddlArgs.previousItemData, false, rule, tempRule, ddlArgs.element);
1974
+ }
1787
1975
  }
1788
1976
  }
1789
1977
  if (!this.isImportRules) {
@@ -2145,14 +2333,14 @@ var QueryBuilder = /** @class */ (function (_super) {
2145
2333
  var columnData = this.getItemData(parentId);
2146
2334
  var selectedValue;
2147
2335
  var isTemplate = (typeof columnData.template === 'string');
2148
- if (this.isImportRules || this.isPublic || isTemplate) {
2336
+ if (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1 || this.isPublic || isTemplate) {
2149
2337
  selectedValue = rule.value;
2150
2338
  }
2151
2339
  else {
2152
2340
  selectedValue = this.setDefaultValue(parentId, false, false);
2153
2341
  }
2154
2342
  if ((operator === 'in' || operator === 'notin') && (this.dataColl.length || columnData.values)) {
2155
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2343
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2156
2344
  this.renderMultiSelect(columnData, parentId, idx, selectedVal, columnData.values);
2157
2345
  if (this.displayMode === 'Vertical' || this.element.className.indexOf('e-device') > -1) {
2158
2346
  ruleValElem.style.width = '100%';
@@ -2164,7 +2352,7 @@ var QueryBuilder = /** @class */ (function (_super) {
2164
2352
  }
2165
2353
  else {
2166
2354
  if (operator === 'in' || operator === 'notin') {
2167
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2355
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2168
2356
  selectedValue = selectedVal.join(',');
2169
2357
  }
2170
2358
  var txtBox = void 0;
@@ -2184,9 +2372,9 @@ var QueryBuilder = /** @class */ (function (_super) {
2184
2372
  QueryBuilder.prototype.renderNumberValue = function (parentId, rule, operator, idx, ruleValElem, itemData, length) {
2185
2373
  var columnData = this.getItemData(parentId);
2186
2374
  var isTemplate = (typeof columnData.template === 'string');
2187
- var selectedVal = (this.isImportRules || this.isPublic || isTemplate) ? rule.value : this.setDefaultValue(parentId, false, true);
2375
+ var selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1 || this.isPublic || isTemplate) ? rule.value : this.setDefaultValue(parentId, false, true);
2188
2376
  if ((operator === 'in' || operator === 'notin') && (this.dataColl.length || columnData.values)) {
2189
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2377
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2190
2378
  this.renderMultiSelect(columnData, parentId, idx, selectedVal, columnData.values);
2191
2379
  if (this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical') {
2192
2380
  ruleValElem.style.width = '100%';
@@ -2197,7 +2385,7 @@ var QueryBuilder = /** @class */ (function (_super) {
2197
2385
  }
2198
2386
  }
2199
2387
  else if (operator === 'in' || operator === 'notin') {
2200
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2388
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2201
2389
  var selVal = selectedVal.join(',');
2202
2390
  var txtInp = void 0;
2203
2391
  txtInp = {
@@ -2470,8 +2658,8 @@ var QueryBuilder = /** @class */ (function (_super) {
2470
2658
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
2471
2659
  : this.getColumn(filtObj.value);
2472
2660
  this.selectedRule = column;
2661
+ var ddlObj = getComponent(target.querySelector('input'), 'dropdownlist');
2473
2662
  if (isRender) {
2474
- var ddlObj = getComponent(target.querySelector('input'), 'dropdownlist');
2475
2663
  itemData = element.id.indexOf('operator') > -1 ? itemData : this.selectedRule;
2476
2664
  if (itemData.operators) {
2477
2665
  ddlObj.value = null;
@@ -2479,7 +2667,13 @@ var QueryBuilder = /** @class */ (function (_super) {
2479
2667
  ddlObj.dataSource = itemData.operators;
2480
2668
  ddlObj.index = this.getOperatorIndex(ddlObj, rule);
2481
2669
  ddlObj.value = tempRule.operator = ddlObj.dataSource[ddlObj.index].value;
2482
- ddlObj.dataBind();
2670
+ if (!this.autoSelectOperator) {
2671
+ ddlObj.index = -1;
2672
+ tempRule.operator = ddlObj.value = '';
2673
+ }
2674
+ else {
2675
+ ddlObj.dataBind();
2676
+ }
2483
2677
  }
2484
2678
  }
2485
2679
  var operator = tempRule.operator.toString();
@@ -2512,39 +2706,41 @@ var QueryBuilder = /** @class */ (function (_super) {
2512
2706
  this.validateValue(rule, closest(target, '.e-rule-container'));
2513
2707
  this.destroyControls(target);
2514
2708
  }
2515
- if (column) {
2516
- itemData.template = column.template;
2517
- }
2518
- if (itemData.template) {
2519
- addClass([target.nextElementSibling], 'e-template-value');
2520
- itemData.template = column.template;
2521
- isTempRendered = this.setColumnTemplate(itemData, parentId, column.field, itemData.value ||
2522
- operator, target, rule);
2523
- }
2524
- if (isTempRendered) {
2525
- var parentElem = target.parentElement.querySelector('.e-rule-value');
2526
- if (this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical') {
2527
- parentElem.style.width = '100%';
2528
- }
2529
- else {
2530
- parentElem.style.width = '200px';
2531
- }
2532
- }
2533
- else {
2534
- removeClass([target.nextElementSibling], 'e-template-value');
2535
- var inputLen = 1;
2536
- if (tempRule.type === 'boolean') {
2537
- inputLen = this.selectedColumn.values ? this.selectedColumn.values.length : 2;
2709
+ if (this.isImportRules || (ddlObj && ddlObj.value !== '')) {
2710
+ if (column) {
2711
+ itemData.template = column.template;
2712
+ }
2713
+ if (itemData.template) {
2714
+ addClass([target.nextElementSibling], 'e-template-value');
2715
+ itemData.template = column.template;
2716
+ isTempRendered = this.setColumnTemplate(itemData, parentId, column.field, itemData.value ||
2717
+ operator, target, rule);
2718
+ }
2719
+ if (isTempRendered) {
2720
+ var parentElem = target.parentElement.querySelector('.e-rule-value');
2721
+ if (this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical') {
2722
+ parentElem.style.width = '100%';
2723
+ }
2724
+ else {
2725
+ parentElem.style.width = '200px';
2726
+ }
2538
2727
  }
2539
2728
  else {
2540
- inputLen = (operator && operator.toLowerCase().indexOf('between') > -1) ? 2 : 1;
2541
- }
2542
- for (var i = 0; i < inputLen; i++) {
2543
- var valElem = this.createElement('input', { attrs: { type: 'text', id: parentId + '_valuekey' + i } });
2544
- target.nextElementSibling.appendChild(valElem);
2729
+ removeClass([target.nextElementSibling], 'e-template-value');
2730
+ var inputLen = 1;
2731
+ if (tempRule.type === 'boolean') {
2732
+ inputLen = this.selectedColumn.values ? this.selectedColumn.values.length : 2;
2733
+ }
2734
+ else {
2735
+ inputLen = (operator && operator.toLowerCase().indexOf('between') > -1) ? 2 : 1;
2736
+ }
2737
+ for (var i = 0; i < inputLen; i++) {
2738
+ var valElem = this.createElement('input', { attrs: { type: 'text', id: parentId + '_valuekey' + i } });
2739
+ target.nextElementSibling.appendChild(valElem);
2740
+ }
2545
2741
  }
2742
+ this.renderControls(target, itemData, rule, tempRule, isTempRendered);
2546
2743
  }
2547
- this.renderControls(target, itemData, rule, tempRule, isTempRendered);
2548
2744
  }
2549
2745
  else {
2550
2746
  var parentElem = target.parentElement.querySelector('.e-rule-value');
@@ -2978,8 +3174,8 @@ var QueryBuilder = /** @class */ (function (_super) {
2978
3174
  var i;
2979
3175
  var len;
2980
3176
  var tooltip;
2981
- var popupElement;
2982
3177
  _super.prototype.destroy.call(this);
3178
+ var popupElement;
2983
3179
  element = this.element.querySelectorAll('.e-addrulegroup');
2984
3180
  len = element.length;
2985
3181
  for (i = 0; i < len; i++) {
@@ -3065,7 +3261,8 @@ var QueryBuilder = /** @class */ (function (_super) {
3065
3261
  if (grouplen) {
3066
3262
  this.isPublic = true;
3067
3263
  for (var i = 0, len = groups.length; i < len; i++) {
3068
- this.updatedRule = { condition: groups[i].condition, not: groups[i].not };
3264
+ this.updatedRule = { isLocked: groups[i].isLocked, condition: groups[i].condition,
3265
+ not: groups[i].not };
3069
3266
  this.importRules(groups[i], groupElem, false, groups[i].not);
3070
3267
  }
3071
3268
  this.isPublic = false;
@@ -3073,15 +3270,27 @@ var QueryBuilder = /** @class */ (function (_super) {
3073
3270
  else {
3074
3271
  var condition = 'and';
3075
3272
  var not = false;
3273
+ var isLocked = false;
3076
3274
  if (this.updatedRule) {
3077
3275
  condition = this.updatedRule.condition;
3078
3276
  not = this.updatedRule.not;
3277
+ isLocked = this.updatedRule.isLocked;
3079
3278
  }
3080
- if (this.enableNotCondition) {
3081
- rule.rules.push({ 'condition': condition, 'not': not, rules: [] });
3279
+ if (this.groupIndex < 0) {
3280
+ if (this.enableNotCondition) {
3281
+ rule.rules.push({ 'condition': condition, 'not': not, rules: [] });
3282
+ }
3283
+ else {
3284
+ rule.rules.push({ 'condition': condition, rules: [] });
3285
+ }
3082
3286
  }
3083
3287
  else {
3084
- rule.rules.push({ 'condition': condition, rules: [] });
3288
+ if (this.enableNotCondition) {
3289
+ rule.rules.splice(this.groupIndex + 1, 0, { condition: condition, not: not, rules: [], isLocked: isLocked });
3290
+ }
3291
+ else {
3292
+ rule.rules.splice(this.groupIndex + 1, 0, { condition: condition, rules: [], isLocked: isLocked });
3293
+ }
3085
3294
  }
3086
3295
  }
3087
3296
  if (!this.headerTemplate) {
@@ -3264,17 +3473,53 @@ var QueryBuilder = /** @class */ (function (_super) {
3264
3473
  this.refresh();
3265
3474
  break;
3266
3475
  case 'showButtons':
3267
- if (newProp.showButtons.ruleDelete) {
3268
- removeClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3476
+ if (!isNullOrUndefined(newProp.showButtons.lockGroup)) {
3477
+ if (newProp.showButtons.lockGroup) {
3478
+ removeClass(this.element.querySelectorAll('.e-lock-grp-btn'), 'e-button-hide');
3479
+ }
3480
+ else {
3481
+ addClass(this.element.querySelectorAll('.e-lock-grp-btn'), 'e-button-hide');
3482
+ }
3269
3483
  }
3270
- else {
3271
- addClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3484
+ if (!isNullOrUndefined(newProp.showButtons.lockRule)) {
3485
+ if (newProp.showButtons.lockRule) {
3486
+ removeClass(this.element.querySelectorAll('.e-lock-rule-btn'), 'e-button-hide');
3487
+ }
3488
+ else {
3489
+ addClass(this.element.querySelectorAll('.e-lock-rule-btn'), 'e-button-hide');
3490
+ }
3491
+ }
3492
+ if (!isNullOrUndefined(newProp.showButtons.cloneGroup)) {
3493
+ if (newProp.showButtons.cloneGroup) {
3494
+ removeClass(this.element.querySelectorAll('.e-clone-grp-btn'), 'e-button-hide');
3495
+ }
3496
+ else {
3497
+ addClass(this.element.querySelectorAll('.e-clone-grp-btn'), 'e-button-hide');
3498
+ }
3272
3499
  }
3273
- if (newProp.showButtons.groupDelete) {
3274
- removeClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3500
+ if (!isNullOrUndefined(newProp.showButtons.cloneRule)) {
3501
+ if (newProp.showButtons.cloneRule) {
3502
+ removeClass(this.element.querySelectorAll('.e-clone-rule-btn'), 'e-button-hide');
3503
+ }
3504
+ else {
3505
+ addClass(this.element.querySelectorAll('.e-clone-rule-btn'), 'e-button-hide');
3506
+ }
3275
3507
  }
3276
- else {
3277
- addClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3508
+ if (!isNullOrUndefined(newProp.showButtons.ruleDelete)) {
3509
+ if (newProp.showButtons.ruleDelete) {
3510
+ removeClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3511
+ }
3512
+ else {
3513
+ addClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3514
+ }
3515
+ }
3516
+ if (!isNullOrUndefined(newProp.showButtons.groupDelete)) {
3517
+ if (newProp.showButtons.groupDelete) {
3518
+ removeClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3519
+ }
3520
+ else {
3521
+ addClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3522
+ }
3278
3523
  }
3279
3524
  break;
3280
3525
  case 'cssClass':
@@ -3351,8 +3596,11 @@ var QueryBuilder = /** @class */ (function (_super) {
3351
3596
  this.element.id = this.element.id || getUniqueID('ej2-querybuilder');
3352
3597
  this.defaultLocale = {
3353
3598
  StartsWith: 'Starts With',
3599
+ DoesNotStartWith: 'Does Not Start With',
3354
3600
  EndsWith: 'Ends With',
3601
+ DoesNotEndWith: 'Does Not End With',
3355
3602
  Contains: 'Contains',
3603
+ DoesNotContain: 'Does Not Contain',
3356
3604
  NotLike: 'Not Like',
3357
3605
  Like: 'Like',
3358
3606
  Equal: 'Equal',
@@ -3386,7 +3634,13 @@ var QueryBuilder = /** @class */ (function (_super) {
3386
3634
  IsNotNull: 'Is Not Null',
3387
3635
  True: 'true',
3388
3636
  False: 'false',
3389
- AddButton: 'Add Group/Condition'
3637
+ AddButton: 'Add Group/Condition',
3638
+ CloneGroup: 'Clone Group',
3639
+ LockGroup: 'Lock Group',
3640
+ CloneRule: 'Clone Rule',
3641
+ LockRule: 'Lock Rule',
3642
+ UnlockRule: 'Unlock Rule',
3643
+ UnlockGroup: 'Unlock Group'
3390
3644
  };
3391
3645
  this.l10n = new L10n('querybuilder', this.defaultLocale, this.locale);
3392
3646
  this.intl = new Internationalization(this.locale);
@@ -3399,8 +3653,11 @@ var QueryBuilder = /** @class */ (function (_super) {
3399
3653
  this.customOperators = {
3400
3654
  stringOperator: [
3401
3655
  { value: 'startswith', key: this.l10n.getConstant('StartsWith') },
3656
+ { value: 'notstartswith', key: this.l10n.getConstant('DoesNotStartWith') },
3402
3657
  { value: 'endswith', key: this.l10n.getConstant('EndsWith') },
3658
+ { value: 'notendswith', key: this.l10n.getConstant('DoesNotEndWith') },
3403
3659
  { value: 'contains', key: this.l10n.getConstant('Contains') },
3660
+ { value: 'notcontains', key: this.l10n.getConstant('DoesNotContain') },
3404
3661
  { value: 'equal', key: this.l10n.getConstant('Equal') },
3405
3662
  { value: 'notequal', key: this.l10n.getConstant('NotEqual') },
3406
3663
  { value: 'in', key: this.l10n.getConstant('In') },
@@ -3414,7 +3671,9 @@ var QueryBuilder = /** @class */ (function (_super) {
3414
3671
  { value: 'greaterthanorequal', key: this.l10n.getConstant('GreaterThanOrEqual') },
3415
3672
  { value: 'lessthan', key: this.l10n.getConstant('LessThan') },
3416
3673
  { value: 'lessthanorequal', key: this.l10n.getConstant('LessThanOrEqual') },
3417
- { value: 'notequal', key: this.l10n.getConstant('NotEqual') }
3674
+ { value: 'notequal', key: this.l10n.getConstant('NotEqual') },
3675
+ { value: 'between', key: this.l10n.getConstant('Between') },
3676
+ { value: 'notbetween', key: this.l10n.getConstant('NotBetween') }
3418
3677
  ],
3419
3678
  booleanOperator: [
3420
3679
  { value: 'equal', key: this.l10n.getConstant('Equal') },
@@ -3718,6 +3977,10 @@ var QueryBuilder = /** @class */ (function (_super) {
3718
3977
  if (!(rule.rules[0] && rule.rules[0].rules)) {
3719
3978
  this.disableRuleCondition(groupElem, rule);
3720
3979
  }
3980
+ var tooltipElem = this.element.querySelectorAll('.e-tooltip');
3981
+ for (var i_3 = 0; i_3 < tooltipElem.length; i_3++) {
3982
+ getComponent(tooltipElem[i_3], 'tooltip').refresh(tooltipElem[i_3]);
3983
+ }
3721
3984
  if (!this.isImportRules) {
3722
3985
  this.trigger('change', args);
3723
3986
  }
@@ -3735,6 +3998,10 @@ var QueryBuilder = /** @class */ (function (_super) {
3735
3998
  this.setProperties({ rule: rule }, true);
3736
3999
  rule = this.getRuleCollection(this.rule, false);
3737
4000
  this.importRules(this.rule, this.element.querySelector('.e-group-container'), true, this.rule.not, isRoot);
4001
+ if (rule.isLocked) {
4002
+ var lockGrpTarget = this.element.querySelector('.e-group-container').querySelector('.e-lock-grp-btn');
4003
+ this.groupLock(lockGrpTarget);
4004
+ }
3738
4005
  this.isImportRules = false;
3739
4006
  };
3740
4007
  QueryBuilder.prototype.keyBoardHandler = function (e) {
@@ -3830,7 +4097,8 @@ var QueryBuilder = /** @class */ (function (_super) {
3830
4097
  rule.value !== undefined)) || (customObj && customObj.isQuestion)) {
3831
4098
  var condition = rule.condition;
3832
4099
  rule = {
3833
- 'label': rule.label, 'field': rule.field, 'operator': rule.operator, 'type': rule.type, 'value': rule.value
4100
+ 'label': rule.label, 'field': rule.field, 'operator': rule.operator, 'type': rule.type, 'value': rule.value,
4101
+ 'isLocked': rule.isLocked
3834
4102
  };
3835
4103
  if (condition) {
3836
4104
  rule.condition = condition;
@@ -3839,6 +4107,7 @@ var QueryBuilder = /** @class */ (function (_super) {
3839
4107
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
3840
4108
  rule.custom = customObj;
3841
4109
  }
4110
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3842
4111
  if ((rule.operator === 'in' || rule.operator === 'notin') && rule.value && rule.value.length === 0) {
3843
4112
  rule = {};
3844
4113
  }
@@ -3864,10 +4133,10 @@ var QueryBuilder = /** @class */ (function (_super) {
3864
4133
  }
3865
4134
  else {
3866
4135
  if (this.enableNotCondition) {
3867
- rule = { 'condition': rule.condition, 'rules': rule.rules, 'not': rule.not };
4136
+ rule = { 'condition': rule.condition, 'rules': rule.rules, 'not': rule.not, 'isLocked': rule.isLocked };
3868
4137
  }
3869
4138
  else {
3870
- rule = { 'condition': rule.condition, 'rules': rule.rules };
4139
+ rule = { 'condition': rule.condition, 'rules': rule.rules, 'isLocked': rule.isLocked };
3871
4140
  }
3872
4141
  if (customObj) {
3873
4142
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -4032,11 +4301,20 @@ var QueryBuilder = /** @class */ (function (_super) {
4032
4301
  var ruleValue;
4033
4302
  var ignoreCase = false;
4034
4303
  var column;
4035
- var ignoreOper = ['notcontains', 'notstartswith', 'notendswith'];
4036
4304
  if (!ruleColl) {
4037
4305
  return pred;
4038
4306
  }
4039
4307
  for (var i = 0, len = ruleColl.length; i < len; i++) {
4308
+ var operator = ruleColl[i].operator;
4309
+ if (operator === 'notstartswith') {
4310
+ operator = 'doesnotstartwith';
4311
+ }
4312
+ else if (operator === 'notendswith') {
4313
+ operator = 'doesnotendwith';
4314
+ }
4315
+ else if (operator === 'notcontains') {
4316
+ operator = 'doesnotcontain';
4317
+ }
4040
4318
  var keys = Object.keys(ruleColl[i]);
4041
4319
  ignoreCase = false;
4042
4320
  if (keys.indexOf('rules') > -1 && ruleColl[i].rules) {
@@ -4055,7 +4333,7 @@ var QueryBuilder = /** @class */ (function (_super) {
4055
4333
  }
4056
4334
  }
4057
4335
  }
4058
- else if (!isNullOrUndefined(ruleColl[i].operator) && !isNullOrUndefined(ruleColl[i].operator.length)) {
4336
+ else if (!isNullOrUndefined(operator) && !isNullOrUndefined(operator.length)) {
4059
4337
  var oper = ruleColl[i].operator.toLowerCase();
4060
4338
  var isDateFilter = false;
4061
4339
  var dateOperColl = ['equal', 'notequal', 'greaterthan', 'greaterthanorequal', 'lessthan', 'lessthanorequal'];
@@ -4086,23 +4364,20 @@ var QueryBuilder = /** @class */ (function (_super) {
4086
4364
  }
4087
4365
  if (i === 0) {
4088
4366
  if (isDateFilter || (oper.indexOf('in') > -1 || oper.indexOf('between') > -1 || oper.indexOf('null') > -1 ||
4089
- oper.indexOf('empty') > -1) && oper.indexOf('contains') < 0) {
4367
+ oper.indexOf('empty') > -1) && (oper.indexOf('contain') < 0)) {
4090
4368
  pred = isDateFilter ? this.datePredicate(ruleColl[i], ruleValue) :
4091
4369
  this.arrayPredicate(ruleColl[i]);
4092
4370
  }
4093
4371
  else {
4094
4372
  var value = ruleValue;
4095
- if (value !== '' && ignoreOper.indexOf(oper) < 0) {
4096
- pred = new Predicate(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4373
+ if (value !== '') {
4374
+ pred = new Predicate(ruleColl[i].field, operator, ruleValue, ignoreCase);
4097
4375
  }
4098
4376
  }
4099
4377
  }
4100
4378
  else {
4101
- if (ignoreOper.indexOf(oper) > -1) {
4102
- continue;
4103
- }
4104
4379
  if (isDateFilter || (oper.indexOf('in') > -1 || oper.indexOf('between') > -1 ||
4105
- oper.indexOf('null') > -1 || oper.indexOf('empty') > -1) && oper.indexOf('contains') < 0) {
4380
+ oper.indexOf('null') > -1 || oper.indexOf('empty') > -1) && oper.indexOf('contain') < 0) {
4106
4381
  pred = isDateFilter ? this.datePredicate(ruleColl[i], ruleValue, pred, rule.condition) :
4107
4382
  this.arrayPredicate(ruleColl[i], pred, rule.condition);
4108
4383
  }
@@ -4111,19 +4386,19 @@ var QueryBuilder = /** @class */ (function (_super) {
4111
4386
  var value = ruleValue;
4112
4387
  if (pred && value !== '') {
4113
4388
  pred
4114
- = pred.and(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4389
+ = pred.and(ruleColl[i].field, operator, ruleValue, ignoreCase);
4115
4390
  }
4116
4391
  else if (value !== '') {
4117
- pred = new Predicate(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4392
+ pred = new Predicate(ruleColl[i].field, operator, ruleValue, ignoreCase);
4118
4393
  }
4119
4394
  }
4120
4395
  else {
4121
4396
  var value = ruleValue;
4122
4397
  if (pred && value !== '') {
4123
- pred = pred.or(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4398
+ pred = pred.or(ruleColl[i].field, operator, ruleValue, ignoreCase);
4124
4399
  }
4125
4400
  else if (value !== '') {
4126
- pred = new Predicate(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4401
+ pred = new Predicate(ruleColl[i].field, operator, ruleValue, ignoreCase);
4127
4402
  }
4128
4403
  }
4129
4404
  }
@@ -4403,15 +4678,28 @@ var QueryBuilder = /** @class */ (function (_super) {
4403
4678
  for (var i = 0, len = ruleColl.length; i < len; i++) {
4404
4679
  var keys = Object.keys(ruleColl[i]);
4405
4680
  if (!isNullOrUndefined(ruleColl[i].rules) && keys.indexOf('rules') > -1 && (ruleColl[i].rules.length !== 0)) {
4681
+ if (this.element.querySelectorAll('.e-group-container').length > this.maxGroupCount) {
4682
+ return null;
4683
+ }
4406
4684
  parentElem = this.renderGroup(ruleColl[i], ruleColl[i].condition, parentElem, ruleColl[i].not);
4407
4685
  parentElem = this.importRules(ruleColl[i], parentElem, true);
4408
4686
  }
4409
4687
  else {
4410
4688
  this.renderRule(ruleColl[i], parentElem);
4411
4689
  }
4690
+ if (!isNullOrUndefined(ruleColl[i].rules) && ruleColl[i].isLocked) {
4691
+ var lockGrpTarget = parentElem.querySelector('.e-rule-list').children[i].querySelector('.e-lock-grp-btn');
4692
+ this.groupLock(lockGrpTarget);
4693
+ }
4694
+ if (isNullOrUndefined(ruleColl[i].rules) && ruleColl[i].isLocked) {
4695
+ var lockRuleTarget = parentElem.querySelector('.e-rule-list').children[i].querySelector('.e-lock-rule-btn');
4696
+ this.ruleLock(lockRuleTarget);
4697
+ }
4412
4698
  }
4413
4699
  }
4414
- parentElem = closest(parentElem, '.e-rule-list');
4700
+ if (parentElem) {
4701
+ parentElem = closest(parentElem, '.e-rule-list');
4702
+ }
4415
4703
  if (parentElem) {
4416
4704
  parentElem = closest(parentElem, '.e-group-container');
4417
4705
  }
@@ -4420,7 +4708,20 @@ var QueryBuilder = /** @class */ (function (_super) {
4420
4708
  QueryBuilder.prototype.renderGroup = function (rule, condition, parentElem, not, isRoot) {
4421
4709
  this.addGroupElement(true, parentElem, condition, false, not, isRoot, rule); //Child group
4422
4710
  var element = parentElem.querySelectorAll('.e-group-container');
4423
- return element[element.length - 1];
4711
+ var cloneElem = parentElem.querySelector('.e-rule-list').children;
4712
+ if (this.showButtons.cloneGroup && this.cloneGrpBtnClick && this.isMiddleGroup) {
4713
+ this.isMiddleGroup = false;
4714
+ this.cloneGrpBtnClick = false;
4715
+ return cloneElem[this.groupIndex + 1]; // group added in the middle
4716
+ }
4717
+ else if (this.showButtons.cloneGroup && this.cloneGrpBtnClick && this.isLastGroup) {
4718
+ this.isLastGroup = false;
4719
+ this.cloneGrpBtnClick = false;
4720
+ return cloneElem[cloneElem.length - 1]; // group added in the end
4721
+ }
4722
+ else {
4723
+ return element[element.length - 1];
4724
+ }
4424
4725
  };
4425
4726
  QueryBuilder.prototype.renderRule = function (rule, parentElem) {
4426
4727
  if (parentElem.className.indexOf('e-group-container') > -1) {
@@ -4619,15 +4920,19 @@ var QueryBuilder = /** @class */ (function (_super) {
4619
4920
  valueStr += rule.value ? '("%' + rule.value + '%")' : '(' + rule.value + ')';
4620
4921
  }
4621
4922
  else {
4622
- if (rule.type === 'number' || typeof rule.value === 'boolean' || rule.value === null) {
4923
+ if (rule.type === 'number' || typeof rule.value === 'boolean' ||
4924
+ (rule.value === null && (rule.operator.toString().indexOf('empty') < -1))) {
4623
4925
  valueStr += rule.value;
4624
4926
  }
4927
+ else if (rule.operator.toString().indexOf('empty') > -1) {
4928
+ valueStr += '""';
4929
+ }
4625
4930
  else {
4626
4931
  valueStr += '"' + rule.value + '"';
4627
4932
  }
4628
4933
  }
4629
4934
  }
4630
- if (rule.operator.toString().indexOf('null') > -1 || (rule.operator.toString().indexOf('empty') > -1)) {
4935
+ if (rule.operator.toString().indexOf('null') > -1) {
4631
4936
  if (enableEscape) {
4632
4937
  rule.field = '`' + rule.field + '`';
4633
4938
  }
@@ -4639,6 +4944,13 @@ var QueryBuilder = /** @class */ (function (_super) {
4639
4944
  queryStr += rule.field + ' ' + ruleOpertor;
4640
4945
  }
4641
4946
  else {
4947
+ var custOper = ruleOpertor;
4948
+ if (rule.operator === 'isempty') {
4949
+ custOper = '=';
4950
+ }
4951
+ else if (rule.operator === 'isnotempty') {
4952
+ custOper = '!=';
4953
+ }
4642
4954
  if (enableEscape) {
4643
4955
  rule.field = '`' + rule.field + '`';
4644
4956
  }
@@ -4647,7 +4959,7 @@ var QueryBuilder = /** @class */ (function (_super) {
4647
4959
  rule.field = '"' + rule.field + '"';
4648
4960
  }
4649
4961
  }
4650
- queryStr += rule.field + ' ' + ruleOpertor + ' ' + valueStr;
4962
+ queryStr += rule.field + ' ' + custOper + ' ' + valueStr;
4651
4963
  }
4652
4964
  if (rule.condition && rule.condition !== '') {
4653
4965
  condition = rule.condition;
@@ -4677,7 +4989,7 @@ var QueryBuilder = /** @class */ (function (_super) {
4677
4989
  * Sets the rules from the sql query.
4678
4990
  *
4679
4991
  * @param {string} sqlString - 'sql String' to be passed to set the rule.
4680
- * @param {boolean} sqlLocale - Set `true` if Localization for Sql query.
4992
+ * @param {boolean} sqlLocale - Optional. Set `true` if Localization for Sql query.
4681
4993
  * @returns {void}
4682
4994
  */
4683
4995
  QueryBuilder.prototype.setRulesFromSql = function (sqlString, sqlLocale) {
@@ -4709,15 +5021,163 @@ var QueryBuilder = /** @class */ (function (_super) {
4709
5021
  *
4710
5022
  * @param {RuleModel} rule - 'rule' to be passed to get the sql.
4711
5023
  * @param {boolean} allowEscape - Set `true` if it exclude the escape character.
4712
- * @param {boolean} sqlLocale - Set `true` if Localization for Sql query.
4713
- * @returns {object} - Sql query from rules.
5024
+ * @param {boolean} sqlLocale - Set `true` if Localization for Sql query.
5025
+ * @returns {string} - Sql query from rules.
4714
5026
  */
4715
5027
  QueryBuilder.prototype.getSqlFromRules = function (rule, allowEscape, sqlLocale) {
4716
5028
  if (!rule) {
4717
5029
  rule = this.getValidRules();
4718
5030
  }
4719
5031
  rule = this.getRuleCollection(rule, false);
4720
- return this.getSqlString(this.getValidRules(rule), allowEscape, null, sqlLocale).replace(/"/g, '\'');
5032
+ var sqlString = this.getSqlString(this.getValidRules(rule), allowEscape, null, sqlLocale).replace(/"/g, '\'');
5033
+ return sqlString;
5034
+ };
5035
+ /**
5036
+ * Gets the parameter SQL query from rules.
5037
+ *
5038
+ * @param {RuleModel} rule – Specify the rule to be passed to get the parameter sql string.
5039
+ * @returns {ParameterizedSql} – Parameterized SQL query from rules.
5040
+ */
5041
+ QueryBuilder.prototype.getParameterizedSql = function (rule) {
5042
+ if (!rule) {
5043
+ rule = this.getValidRules();
5044
+ }
5045
+ var obj = { sql: null };
5046
+ this.notify('query-library', { prop: 'getParameterSql', onPropertyChange: false, value: { rule: rule, obj: obj } });
5047
+ return obj['sql'];
5048
+ };
5049
+ /**
5050
+ * Sets the rules from the parameter sql query.
5051
+ *
5052
+ * @param { ParameterizedSql} sqlQuery – Specifies the parameter SQL to be passed to set the rule and load it to the query builder.
5053
+ * @returns {void}
5054
+ */
5055
+ QueryBuilder.prototype.setParameterizedSql = function (sqlQuery) {
5056
+ var obj = { sql: null };
5057
+ this.notify('query-library', { prop: 'convertParamSqlToSql', onPropertyChange: false, value: { sql: sqlQuery, obj: obj } });
5058
+ var sql = obj['sql'];
5059
+ if (sql) {
5060
+ sql = sql.replace(/`/g, '');
5061
+ var ruleModel = this.getRulesFromSql(sql);
5062
+ this.setRules({ condition: ruleModel.condition, not: ruleModel.not, rules: ruleModel.rules });
5063
+ }
5064
+ };
5065
+ /**
5066
+ * Gets the named parameter SQL query from rules.
5067
+ *
5068
+ * @param {RuleModel} rule – Specify the rule to be passed to get the named parameter SQL string.
5069
+ * @returns {ParameterizedNamedSql} – Parameterized Named SQL query from rules.
5070
+ */
5071
+ QueryBuilder.prototype.getParameterizedNamedSql = function (rule) {
5072
+ if (!rule) {
5073
+ rule = this.getValidRules();
5074
+ }
5075
+ var obj = { sql: null };
5076
+ this.notify('query-library', { prop: 'getNamedParameterSql', onPropertyChange: false, value: { rule: rule, obj: obj } });
5077
+ return obj['sql'];
5078
+ };
5079
+ /**
5080
+ * Sets the rules from the named parameter SQL query.
5081
+ *
5082
+ * @param { ParameterizedNamedSql } sqlQuery – Specifies the named parameter SQL to be passed to set the rule and load it to the query builder.
5083
+ * @returns {void}
5084
+ */
5085
+ QueryBuilder.prototype.setParameterizedNamedSql = function (sqlQuery) {
5086
+ var obj = { sql: null };
5087
+ this.notify('query-library', { prop: 'convertNamedParamSqlToSql', onPropertyChange: false, value: { sql: sqlQuery, obj: obj } });
5088
+ var sql = obj['sql'];
5089
+ if (sql) {
5090
+ sql = sql.replace(/`/g, '');
5091
+ var ruleModel = this.getRulesFromSql(sql);
5092
+ this.setRules({ condition: ruleModel.condition, not: ruleModel.not, rules: ruleModel.rules });
5093
+ }
5094
+ };
5095
+ /**
5096
+ * Set the rules from Mongo query.
5097
+ *
5098
+ * @param {string} mongoQuery - 'sql String' to be passed to get the rule.
5099
+ * @param {boolean} mongoLocale - Set `true` if Localization for Mongo query.
5100
+ * @returns {void}
5101
+ */
5102
+ QueryBuilder.prototype.setMongoQuery = function (mongoQuery, mongoLocale) {
5103
+ this.rule = { condition: 'and', not: false, rules: [] };
5104
+ this.notify('query-library', { prop: 'mongoParser', onPropertyChange: false, value: { mongoQuery: JSON.parse(mongoQuery), rule: this.rule, mongoLocale: mongoLocale } });
5105
+ };
5106
+ /**
5107
+ * Gets the Mongo query from rules.
5108
+ *
5109
+ * @param {RuleModel} rule - 'rule' to be passed to get the sql.
5110
+ * @returns {object} - Sql query from rules.
5111
+ */
5112
+ QueryBuilder.prototype.getMongoQuery = function (rule) {
5113
+ if (!rule) {
5114
+ rule = this.getValidRules();
5115
+ }
5116
+ var obj = { mongoQuery: null };
5117
+ this.notify('query-library', { prop: 'getMongoFromRules', onPropertyChange: false, value: { rule: rule, mongoQuery: '', obj: obj } });
5118
+ return obj['mongoQuery'];
5119
+ };
5120
+ /**
5121
+ * Clones the rule based on the rule ID to the specific group.
5122
+ *
5123
+ * @param {string} ruleID - Specifies the ruleID that needs to be cloned.
5124
+ * @param {string} groupID - Specifies the groupID in which the rule to be cloned.
5125
+ * @param {number} index - Specifies the index to insert the cloned rule inside the group.
5126
+ * @returns {void}
5127
+ */
5128
+ QueryBuilder.prototype.cloneRule = function (ruleID, groupID, index) {
5129
+ var getRule = this.getRule(ruleID.replace(this.element.id + '_', ''));
5130
+ groupID = groupID.replace(this.element.id + '_', '');
5131
+ this.ruleIndex = index;
5132
+ this.cloneRuleBtnClick = true;
5133
+ this.showButtons.cloneRule = true;
5134
+ this.addRules([{
5135
+ 'label': getRule.label, 'field': getRule.field, 'type': getRule.type, 'operator': getRule.operator,
5136
+ 'value': getRule.value
5137
+ }], groupID);
5138
+ this.ruleIndex = -1;
5139
+ this.cloneRuleBtnClick = false;
5140
+ this.showButtons.cloneRule = false;
5141
+ };
5142
+ /**
5143
+ * Clones the group based on the group ID to the specific group.
5144
+ *
5145
+ * @param {string} groupID - Specifies the groupID that needs to be cloned.
5146
+ * @param {string} parentGroupID - Specifies the parentGroupID in which the group to be cloned.
5147
+ * @param {number} index - Specifies the index to insert the cloned group inside the parent group.
5148
+ * @returns {void}
5149
+ */
5150
+ QueryBuilder.prototype.cloneGroup = function (groupID, parentGroupID, index) {
5151
+ parentGroupID = parentGroupID.replace(this.element.id + '_', '');
5152
+ var group = this.getGroup(parentGroupID);
5153
+ groupID = groupID.replace(this.element.id + '_', '');
5154
+ this.groupIndex = index;
5155
+ this.cloneGrpBtnClick = true;
5156
+ this.showButtons.cloneGroup = true;
5157
+ this.addGroups([{ 'condition': group.condition, 'not': group.not, 'rules': group.rules }], groupID);
5158
+ this.groupIndex = -1;
5159
+ this.cloneGrpBtnClick = false;
5160
+ this.showButtons.cloneGroup = false;
5161
+ };
5162
+ /**
5163
+ * Locks the rule based on the rule ID.
5164
+ *
5165
+ * @param {string} ruleID - Specifies the ruleID that needs to be locked.
5166
+ * @returns {void}
5167
+ */
5168
+ QueryBuilder.prototype.lockRule = function (ruleID) {
5169
+ var target = document.getElementById(ruleID).querySelectorAll('.e-lock-rule-btn')[0];
5170
+ this.ruleLock(target);
5171
+ };
5172
+ /**
5173
+ * Locks the group based on the group ID
5174
+ *
5175
+ * @param {string} groupID - Specifies the groupID that needs to be locked.
5176
+ * @returns {void}
5177
+ */
5178
+ QueryBuilder.prototype.lockGroup = function (groupID) {
5179
+ var target = document.getElementById(groupID).querySelectorAll('.e-lock-grp-btn')[0];
5180
+ this.groupLock(target);
4721
5181
  };
4722
5182
  QueryBuilder.prototype.sqlParser = function (sqlString, sqlLocale) {
4723
5183
  var st = 0;
@@ -4919,13 +5379,13 @@ var QueryBuilder = /** @class */ (function (_super) {
4919
5379
  for (var i = 0; i < localeOperator.length; i++) {
4920
5380
  if (this.sqlOperators[localeOperator[i]] === operator.toUpperCase()) {
4921
5381
  if (value && value.indexOf('%') === 0 && value[value.length - 1] === '%') {
4922
- return (localeOperator[i] === 'notcontains') ? 'notcontains' : 'contains';
5382
+ return (operator.toUpperCase() === 'NOT LIKE') ? 'notcontains' : 'contains';
4923
5383
  }
4924
5384
  else if (value && value.indexOf('%') !== 0 && value.indexOf('%') === value.length - 1) {
4925
- return (localeOperator[i] === 'notstartswith') ? 'notstartswith' : 'startswith';
5385
+ return (operator.toUpperCase() === 'NOT LIKE') ? 'notstartswith' : 'startswith';
4926
5386
  }
4927
5387
  else if (value && value.indexOf('%') === 0 && value.indexOf('%') !== value.length - 1) {
4928
- return (localeOperator[i] === 'notendswith') ? 'notendswith' : 'endswith';
5388
+ return (operator.toUpperCase() === 'NOT LIKE') ? 'notendswith' : 'endswith';
4929
5389
  }
4930
5390
  return localeOperator[i];
4931
5391
  }
@@ -5110,6 +5570,15 @@ var QueryBuilder = /** @class */ (function (_super) {
5110
5570
  }
5111
5571
  else if (parser[i + 1][0] === 'Operators') {
5112
5572
  rule.operator = this.getOperator(parser[i + 2][1], parser[i + 1][1], sqlLocale);
5573
+ var isEmptyOper = false;
5574
+ if (rule.operator == "equal" && parser[i + 2][0] === "String" && parser[i + 2][1] === "''") {
5575
+ rule.operator = "isempty";
5576
+ isEmptyOper = true;
5577
+ }
5578
+ else if (rule.operator == "notequal" && parser[i + 2][0] === "String" && parser[i + 2][1] === "''") {
5579
+ rule.operator = "isnotempty";
5580
+ isEmptyOper = true;
5581
+ }
5113
5582
  if (parser[i + 2][0] === 'Number') {
5114
5583
  rule.type = 'number';
5115
5584
  rule.value = Number(parser[i + 2][1]);
@@ -5166,6 +5635,301 @@ var QueryBuilder = /** @class */ (function (_super) {
5166
5635
  }
5167
5636
  return rules;
5168
5637
  };
5638
+ /**
5639
+ * Clone the Group
5640
+ *
5641
+ * @param {Element | string} target - 'target' to be passed to clone the group.
5642
+ * @returns {void}
5643
+ */
5644
+ QueryBuilder.prototype.groupClone = function (target) {
5645
+ var groupElem = target.closest('.e-rule-list').closest('.e-group-container');
5646
+ var targetGrpId;
5647
+ var groupId;
5648
+ if (typeof target === 'string') {
5649
+ groupId = this.element.id + '_' + target;
5650
+ target = document.getElementById(groupId);
5651
+ }
5652
+ else {
5653
+ targetGrpId = target.id.replace(this.element.id + '_', '');
5654
+ groupId = groupElem.id.replace(this.element.id + '_', '');
5655
+ }
5656
+ var group = this.getGroup(targetGrpId);
5657
+ this.groupIndex = Array.prototype.indexOf.call(target.closest('.e-rule-list').children, target.closest('.e-group-container'));
5658
+ this.addGroups([{ 'condition': group.condition, 'not': group.not, 'rules': group.rules }], groupId);
5659
+ this.groupIndex = -1;
5660
+ };
5661
+ QueryBuilder.prototype.ruleClone = function (target) {
5662
+ var ruleElem = closest(target, '.e-rule-container');
5663
+ var groupElem = target.closest('.e-rule-list').closest('.e-group-container');
5664
+ var getRule = this.getRule(target);
5665
+ var groupId = groupElem.id.replace(this.element.id + '_', '');
5666
+ var ruleElemColl = groupElem.querySelectorAll('.e-rule-container');
5667
+ for (var i = 0, iLen = ruleElemColl.length; i < iLen; i++) {
5668
+ if (ruleElem.id === ruleElemColl[i].id) {
5669
+ this.ruleIndex = i;
5670
+ }
5671
+ }
5672
+ this.addRules([{ 'label': getRule.label, 'field': getRule.field, 'type': getRule.type, 'operator': getRule.operator,
5673
+ 'value': getRule.value }], groupId);
5674
+ this.ruleIndex = -1;
5675
+ };
5676
+ QueryBuilder.prototype.ruleLock = function (target) {
5677
+ var ruleElem = closest(target, '.e-rule-container');
5678
+ var rule = this.getRule(ruleElem.id.replace(this.element.id + '_', ''));
5679
+ if (ruleElem.classList.contains('e-disable')) {
5680
+ rule.isLocked = false;
5681
+ this.lockItems = this.lockItems.filter(function (lockItem) { return lockItem !== ruleElem.id; });
5682
+ ruleElem.classList.remove('e-disable');
5683
+ this.disableRuleControls(target, ruleElem, false);
5684
+ target.children[0].classList.add('e-unlock');
5685
+ target.children[0].classList.remove('e-lock');
5686
+ target.setAttribute('title', this.l10n.getConstant('LockRule'));
5687
+ }
5688
+ else {
5689
+ rule.isLocked = true;
5690
+ if (this.lockItems.indexOf(ruleElem.id) < 0) {
5691
+ this.lockItems.splice(this.lockItems.length - 1, 0, ruleElem.id);
5692
+ }
5693
+ ruleElem.classList.add('e-disable');
5694
+ this.disableRuleControls(target, ruleElem, true);
5695
+ target.children[0].classList.add('e-lock');
5696
+ target.children[0].classList.remove('e-unlock');
5697
+ target.setAttribute('title', this.l10n.getConstant('UnlockRule'));
5698
+ }
5699
+ };
5700
+ QueryBuilder.prototype.groupLock = function (target) {
5701
+ var groupElem = closest(target, '.e-group-container');
5702
+ var group = this.getGroup(groupElem.id.replace(this.element.id + '_', ''));
5703
+ var isRoot = groupElem.id.indexOf('group0') > -1;
5704
+ if (groupElem.classList.contains('e-disable')) {
5705
+ if (isRoot) {
5706
+ var newGroup = {};
5707
+ newGroup.condition = group.condition;
5708
+ newGroup.not = group.not;
5709
+ newGroup.isLocked = false;
5710
+ this.setProperties({ rule: newGroup }, true);
5711
+ }
5712
+ else {
5713
+ group.isLocked = false;
5714
+ }
5715
+ this.lockItems = this.lockItems.filter(function (lockItem) { return lockItem !== groupElem.id; });
5716
+ groupElem.classList.remove('e-disable');
5717
+ this.disableHeaderControls(target, groupElem, false);
5718
+ target.children[0].classList.add('e-unlock');
5719
+ target.children[0].classList.remove('e-lock');
5720
+ target.setAttribute('title', this.l10n.getConstant('LockGroup'));
5721
+ this.updateLockItems();
5722
+ }
5723
+ else {
5724
+ if (isRoot) {
5725
+ var newGroup = {};
5726
+ newGroup.condition = group.condition;
5727
+ newGroup.not = group.not;
5728
+ newGroup.isLocked = true;
5729
+ this.setProperties({ rule: newGroup }, true);
5730
+ }
5731
+ else {
5732
+ group.isLocked = true;
5733
+ }
5734
+ if (this.lockItems.indexOf(groupElem.id) < 0) {
5735
+ this.lockItems.splice(this.lockItems.length - 1, 0, groupElem.id);
5736
+ }
5737
+ groupElem.classList.add('e-disable');
5738
+ this.disableHeaderControls(target, groupElem, true);
5739
+ target.children[0].classList.add('e-lock');
5740
+ target.children[0].classList.remove('e-unlock');
5741
+ target.setAttribute('title', this.l10n.getConstant('UnlockGroup'));
5742
+ }
5743
+ };
5744
+ QueryBuilder.prototype.updateLockItems = function () {
5745
+ for (var i = 0; i < this.lockItems.length; i++) {
5746
+ var idColl = this.lockItems[i].split('_');
5747
+ if (idColl.length > 2) {
5748
+ var ruleElem = this.element.querySelector('#' + this.lockItems[i]);
5749
+ var target = ruleElem.querySelector('.e-lock-rule-btn');
5750
+ ruleElem = closest(target, '.e-rule-container');
5751
+ if (!ruleElem.classList.contains('e-disable')) {
5752
+ this.ruleLock(target);
5753
+ }
5754
+ }
5755
+ else {
5756
+ var groupElem = this.element.querySelector('#' + this.lockItems[i]);
5757
+ var target = groupElem.querySelector('.e-lock-grp-btn');
5758
+ groupElem = closest(target, '.e-group-container');
5759
+ if (!groupElem.classList.contains('e-disable')) {
5760
+ this.groupLock(target);
5761
+ }
5762
+ }
5763
+ }
5764
+ };
5765
+ QueryBuilder.prototype.disableHeaderControls = function (target, groupElem, isDisabled) {
5766
+ var andElem = groupElem.querySelectorAll('.e-btngroup-and');
5767
+ var orElem = groupElem.querySelectorAll('.e-btngroup-or');
5768
+ var notElem = groupElem.querySelectorAll('.e-qb-toggle');
5769
+ var addElem = groupElem.querySelectorAll('.e-add-btn');
5770
+ var deleteGrpElem = groupElem.querySelectorAll('.e-deletegroup');
5771
+ var lockElem = groupElem.querySelectorAll('.e-lock-grp-btn');
5772
+ var cloneElem = groupElem.querySelectorAll('.e-clone-grp-btn');
5773
+ var groupContElem = groupElem.querySelectorAll('.e-group-container');
5774
+ for (var i = 0; i < andElem.length; i++) {
5775
+ if (isDisabled) {
5776
+ if (groupContElem[i] && groupContElem[i].classList.contains('e-disable')) {
5777
+ groupContElem[i].classList.add('e-disable');
5778
+ }
5779
+ andElem[i].disabled = true;
5780
+ orElem[i].disabled = true;
5781
+ addElem[i].disabled = true;
5782
+ if (notElem[i]) {
5783
+ notElem[i].disabled = true;
5784
+ }
5785
+ if (deleteGrpElem[i]) {
5786
+ deleteGrpElem[i].disabled = true;
5787
+ }
5788
+ if (cloneElem[i]) {
5789
+ cloneElem[i].disabled = true;
5790
+ }
5791
+ andElem[i].parentElement.classList.add('e-disabled');
5792
+ if (lockElem[i] !== target) {
5793
+ lockElem[i].disabled = true;
5794
+ lockElem[i].children[0].classList.remove('e-unlock');
5795
+ lockElem[i].children[0].classList.add('e-lock');
5796
+ }
5797
+ }
5798
+ else {
5799
+ if (groupContElem[i]) {
5800
+ groupContElem[i].classList.remove('e-disable');
5801
+ }
5802
+ andElem[i].disabled = false;
5803
+ orElem[i].disabled = false;
5804
+ addElem[i].disabled = false;
5805
+ lockElem[i].disabled = false;
5806
+ if (notElem[i]) {
5807
+ notElem[i].disabled = false;
5808
+ }
5809
+ if (deleteGrpElem[i]) {
5810
+ deleteGrpElem[i].disabled = false;
5811
+ }
5812
+ if (cloneElem[i]) {
5813
+ cloneElem[i].disabled = false;
5814
+ }
5815
+ andElem[i].parentElement.classList.remove('e-disabled');
5816
+ lockElem[i].children[0].classList.remove('e-lock');
5817
+ lockElem[i].children[0].classList.add('e-unlock');
5818
+ }
5819
+ }
5820
+ this.disableRuleControls(target, groupElem, isDisabled);
5821
+ };
5822
+ QueryBuilder.prototype.disableRuleControls = function (target, groupElem, isDisabled) {
5823
+ var ddlElement = groupElem.querySelectorAll('.e-control.e-dropdownlist');
5824
+ var numericElement = groupElem.querySelectorAll('.e-control.e-numerictextbox');
5825
+ var textElement = groupElem.querySelectorAll('.e-control.e-textbox');
5826
+ var dateElement = groupElem.querySelectorAll('.e-control.e-datepicker');
5827
+ var checkboxElement = groupElem.querySelectorAll('.e-control.e-checkbox');
5828
+ var radioBtnElement = groupElem.querySelectorAll('.e-control.e-radio');
5829
+ var multiSelectElement = groupElem.querySelectorAll('.e-control.e-multiselect');
5830
+ var deleteElem = groupElem.querySelectorAll('.e-rule-delete');
5831
+ var lockElem = groupElem.querySelectorAll('.e-lock-rule');
5832
+ var cloneElem = groupElem.querySelectorAll('.e-clone-rule');
5833
+ var ruleElem = groupElem.querySelectorAll('.e-rule-container');
5834
+ for (var i = 0; i < deleteElem.length; i++) {
5835
+ if (isDisabled) {
5836
+ if (ruleElem[i] && ruleElem[i].classList.contains('e-disable')) {
5837
+ ruleElem[i].classList.add('e-disable');
5838
+ }
5839
+ deleteElem[i].disabled = true;
5840
+ if (cloneElem[i]) {
5841
+ cloneElem[i].disabled = true;
5842
+ }
5843
+ if (lockElem[i] !== target) {
5844
+ lockElem[i].disabled = true;
5845
+ lockElem[i].children[0].classList.remove('e-unlock');
5846
+ lockElem[i].children[0].classList.add('e-lock');
5847
+ }
5848
+ }
5849
+ else {
5850
+ if (ruleElem[i]) {
5851
+ ruleElem[i].classList.remove('e-disable');
5852
+ }
5853
+ if (cloneElem[i]) {
5854
+ cloneElem[i].disabled = false;
5855
+ }
5856
+ deleteElem[i].disabled = false;
5857
+ lockElem[i].disabled = false;
5858
+ lockElem[i].children[0].classList.remove('e-lock');
5859
+ lockElem[i].children[0].classList.add('e-unlock');
5860
+ }
5861
+ }
5862
+ var dropDownObj;
5863
+ var numericObj;
5864
+ var textObj;
5865
+ var dateObj;
5866
+ var checkBoxObj;
5867
+ var radioBtnObj;
5868
+ var multiSelectObj;
5869
+ for (var i = 0; i < ddlElement.length; i++) {
5870
+ dropDownObj = getComponent(ddlElement[i], 'dropdownlist');
5871
+ if (isDisabled) {
5872
+ dropDownObj.enabled = false;
5873
+ }
5874
+ else {
5875
+ dropDownObj.enabled = true;
5876
+ }
5877
+ }
5878
+ for (var i = 0; i < numericElement.length; i++) {
5879
+ numericObj = getComponent(numericElement[i], 'numerictextbox');
5880
+ if (isDisabled) {
5881
+ numericObj.enabled = false;
5882
+ }
5883
+ else {
5884
+ numericObj.enabled = true;
5885
+ }
5886
+ }
5887
+ for (var i = 0; i < textElement.length; i++) {
5888
+ textObj = getComponent(textElement[i], 'textbox');
5889
+ if (isDisabled) {
5890
+ textObj.enabled = false;
5891
+ }
5892
+ else {
5893
+ textObj.enabled = true;
5894
+ }
5895
+ }
5896
+ for (var i = 0; i < dateElement.length; i++) {
5897
+ dateObj = getComponent(dateElement[i], 'datepicker');
5898
+ if (isDisabled) {
5899
+ dateObj.enabled = false;
5900
+ }
5901
+ else {
5902
+ dateObj.enabled = true;
5903
+ }
5904
+ }
5905
+ for (var i = 0; i < checkboxElement.length; i++) {
5906
+ checkBoxObj = getComponent(checkboxElement[i], 'checkbox');
5907
+ if (isDisabled) {
5908
+ checkBoxObj.disabled = true;
5909
+ }
5910
+ else {
5911
+ checkBoxObj.disabled = false;
5912
+ }
5913
+ }
5914
+ for (var i = 0; i < radioBtnElement.length; i++) {
5915
+ radioBtnObj = getComponent(radioBtnElement[i], 'radio');
5916
+ if (isDisabled) {
5917
+ radioBtnObj.disabled = true;
5918
+ }
5919
+ else {
5920
+ radioBtnObj.disabled = false;
5921
+ }
5922
+ }
5923
+ for (var i = 0; i < multiSelectElement.length; i++) {
5924
+ multiSelectObj = getComponent(multiSelectElement[i], 'multiselect');
5925
+ if (isDisabled) {
5926
+ multiSelectObj.enabled = false;
5927
+ }
5928
+ else {
5929
+ multiSelectObj.enabled = true;
5930
+ }
5931
+ }
5932
+ };
5169
5933
  __decorate([
5170
5934
  Event()
5171
5935
  ], QueryBuilder.prototype, "created", void 0);
@@ -5185,7 +5949,7 @@ var QueryBuilder = /** @class */ (function (_super) {
5185
5949
  Event()
5186
5950
  ], QueryBuilder.prototype, "ruleChange", void 0);
5187
5951
  __decorate([
5188
- Property({ ruleDelete: true, groupInsert: true, groupDelete: true })
5952
+ Complex({}, ShowButtons)
5189
5953
  ], QueryBuilder.prototype, "showButtons", void 0);
5190
5954
  __decorate([
5191
5955
  Property(false)
@@ -5247,6 +6011,15 @@ var QueryBuilder = /** @class */ (function (_super) {
5247
6011
  __decorate([
5248
6012
  Property(false)
5249
6013
  ], QueryBuilder.prototype, "readonly", void 0);
6014
+ __decorate([
6015
+ Property(true)
6016
+ ], QueryBuilder.prototype, "addRuleToNewGroups", void 0);
6017
+ __decorate([
6018
+ Property(false)
6019
+ ], QueryBuilder.prototype, "autoSelectField", void 0);
6020
+ __decorate([
6021
+ Property(true)
6022
+ ], QueryBuilder.prototype, "autoSelectOperator", void 0);
5250
6023
  __decorate([
5251
6024
  Property('')
5252
6025
  ], QueryBuilder.prototype, "separator", void 0);