@syncfusion/ej2-querybuilder 24.2.9 → 25.1.37

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 +17 -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 +1616 -162
  6. package/dist/es6/ej2-querybuilder.es2015.js.map +1 -1
  7. package/dist/es6/ej2-querybuilder.es5.js +1618 -162
  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 +906 -137
  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 +38 -12
  25. package/styles/bootstrap5.css +38 -12
  26. package/styles/fabric-dark.css +25 -12
  27. package/styles/fabric.css +25 -12
  28. package/styles/fluent-dark.css +42 -12
  29. package/styles/fluent.css +42 -12
  30. package/styles/highcontrast-light.css +25 -12
  31. package/styles/highcontrast.css +25 -12
  32. package/styles/material-dark.css +34 -12
  33. package/styles/material.css +34 -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 +19 -2
  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 +38 -12
  43. package/styles/query-builder/bootstrap5.css +38 -12
  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 +42 -12
  47. package/styles/query-builder/fluent.css +42 -12
  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 +34 -12
  52. package/styles/query-builder/material.css +34 -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
  }
@@ -1454,7 +1621,7 @@ var QueryBuilder = /** @class */ (function (_super) {
1454
1621
  this.prevItemData = args.itemData;
1455
1622
  var fieldElem = closest(args.element, '.e-rule-filter') || closest(args.element, '.e-rule-sub-filter');
1456
1623
  var column = this.fieldMode === 'DropdownTree' ? this.getColumn(args.value[0]) : this.getColumn(args.value);
1457
- if (this.fieldMode === 'DropdownTree' && fieldElem != null) {
1624
+ if (this.fieldMode === 'DropdownTree' && fieldElem !== null) {
1458
1625
  var ddtElem = fieldElem.querySelector('.e-dropdowntree.e-control');
1459
1626
  var ddt = getComponent(ddtElem, 'dropdowntree');
1460
1627
  if (column) {
@@ -1526,7 +1693,7 @@ var QueryBuilder = /** @class */ (function (_super) {
1526
1693
  var filterElem = closest(ddlArgs.element, '.e-rule-filter');
1527
1694
  filterElem = filterElem ? filterElem : closest(ddlArgs.element, '.e-rule-sub-filter');
1528
1695
  var ddlObj = getComponent(ddlArgs.element, 'dropdownlist');
1529
- if (this.fieldMode === 'DropdownTree' && filterElem != null) {
1696
+ if (this.fieldMode === 'DropdownTree' && filterElem !== null) {
1530
1697
  ddlObj = getComponent(ddlArgs.element, 'dropdowntree');
1531
1698
  }
1532
1699
  var element = closest(ddlArgs.element, '.e-group-container');
@@ -1655,7 +1822,7 @@ var QueryBuilder = /** @class */ (function (_super) {
1655
1822
  this.GetRootColumnName(rule.field) === this.GetRootColumnName(this.previousColumn.field))) {
1656
1823
  var subField = this.selectedColumn.columns;
1657
1824
  for (var i = 0; i < subField.length; i++) {
1658
- if (rule.field === subField[i].field || rule.field.indexOf(subField[i].field) > -1) {
1825
+ if (rule.field === subField[i].field) {
1659
1826
  dropDownList.value = subField[i].field;
1660
1827
  this.selectedColumn = subField[i];
1661
1828
  subFieldValue = true;
@@ -1694,7 +1861,7 @@ var QueryBuilder = /** @class */ (function (_super) {
1694
1861
  rule.value = [];
1695
1862
  }
1696
1863
  }
1697
- else if (typeof rule.value === 'object' && rule.value != null) {
1864
+ else if (typeof rule.value === 'object' && rule.value !== null) {
1698
1865
  rule.value = rule.value.length > 0 ? rule.value[0] : rule.type === 'number' ? 0 : '';
1699
1866
  }
1700
1867
  if (ddlArgs.previousItemData) {
@@ -1721,6 +1888,9 @@ var QueryBuilder = /** @class */ (function (_super) {
1721
1888
  if (valElem && this.getColumn(rule.field).template) {
1722
1889
  filterElem = operatorElem.previousElementSibling;
1723
1890
  }
1891
+ if (valElem.children.length == 0) {
1892
+ filterElem = operatorElem.previousElementSibling;
1893
+ }
1724
1894
  this.changeRuleValues(filterElem, rule, tempRule, ddlArgs);
1725
1895
  }
1726
1896
  };
@@ -1751,7 +1921,9 @@ var QueryBuilder = /** @class */ (function (_super) {
1751
1921
  tempRule.type = this.fieldMode === 'DropdownTree' ? this.getColumn(fieldObj.value[0]).type :
1752
1922
  this.getColumn(fieldObj.value).type;
1753
1923
  var itemData = ddlArgs.itemData;
1754
- 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
+ }
1755
1927
  }
1756
1928
  else {
1757
1929
  var ruleId = closest(operatorElem, '.e-rule-container').id;
@@ -1765,7 +1937,14 @@ var QueryBuilder = /** @class */ (function (_super) {
1765
1937
  }
1766
1938
  var height = (this.element.className.indexOf('e-device') > -1) ? '250px' : '200px';
1767
1939
  var value = operatorList[0].value;
1768
- 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
+ }
1769
1948
  var ddlOperator = void 0;
1770
1949
  ddlOperator = {
1771
1950
  dataSource: operatorList,
@@ -1773,7 +1952,7 @@ var QueryBuilder = /** @class */ (function (_super) {
1773
1952
  placeholder: this.l10n.getConstant('SelectOperator'),
1774
1953
  popupHeight: ((operatorList.length > 5) ? height : 'auto'),
1775
1954
  change: this.changeField.bind(this),
1776
- index: 0,
1955
+ index: ddlIdx,
1777
1956
  value: value,
1778
1957
  open: this.popupOpen.bind(this, false)
1779
1958
  };
@@ -1787,7 +1966,12 @@ var QueryBuilder = /** @class */ (function (_super) {
1787
1966
  tempRule.type = this.selectedColumn.type;
1788
1967
  tempRule.operator = rule.operator;
1789
1968
  }
1790
- 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
+ }
1791
1975
  }
1792
1976
  }
1793
1977
  if (!this.isImportRules) {
@@ -2008,17 +2192,11 @@ var QueryBuilder = /** @class */ (function (_super) {
2008
2192
  if (!this.dataColl.length && values.length) {
2009
2193
  isValues = true;
2010
2194
  }
2011
- var fieldValue = this.selectedRule.field;
2012
- var isNested = this.selectedRule.field.indexOf(this.separator);
2013
- if (isNested !== 0 && this.fieldMode !== 'DropdownTree') {
2014
- var nest = this.selectedRule.field.split(this.separator);
2015
- fieldValue = nest[nest.length - 1];
2016
- }
2017
2195
  var multiSelectValue;
2018
2196
  multiSelectValue = {
2019
2197
  dataSource: isValues ? values : (isFetched ? ds : this.dataManager),
2020
2198
  query: new Query([rule.field]),
2021
- fields: { text: fieldValue, value: fieldValue },
2199
+ fields: { text: this.selectedRule.field, value: this.selectedRule.field },
2022
2200
  placeholder: this.l10n.getConstant('SelectValue'),
2023
2201
  value: selectedValue,
2024
2202
  mode: 'CheckBox',
@@ -2149,14 +2327,14 @@ var QueryBuilder = /** @class */ (function (_super) {
2149
2327
  var columnData = this.getItemData(parentId);
2150
2328
  var selectedValue;
2151
2329
  var isTemplate = (typeof columnData.template === 'string');
2152
- if (this.isImportRules || this.isPublic || isTemplate) {
2330
+ if (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1 || this.isPublic || isTemplate) {
2153
2331
  selectedValue = rule.value;
2154
2332
  }
2155
2333
  else {
2156
2334
  selectedValue = this.setDefaultValue(parentId, false, false);
2157
2335
  }
2158
2336
  if ((operator === 'in' || operator === 'notin') && (this.dataColl.length || columnData.values)) {
2159
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2337
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2160
2338
  this.renderMultiSelect(columnData, parentId, idx, selectedVal, columnData.values);
2161
2339
  if (this.displayMode === 'Vertical' || this.element.className.indexOf('e-device') > -1) {
2162
2340
  ruleValElem.style.width = '100%';
@@ -2168,7 +2346,7 @@ var QueryBuilder = /** @class */ (function (_super) {
2168
2346
  }
2169
2347
  else {
2170
2348
  if (operator === 'in' || operator === 'notin') {
2171
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2349
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2172
2350
  selectedValue = selectedVal.join(',');
2173
2351
  }
2174
2352
  var txtBox = void 0;
@@ -2188,9 +2366,9 @@ var QueryBuilder = /** @class */ (function (_super) {
2188
2366
  QueryBuilder.prototype.renderNumberValue = function (parentId, rule, operator, idx, ruleValElem, itemData, length) {
2189
2367
  var columnData = this.getItemData(parentId);
2190
2368
  var isTemplate = (typeof columnData.template === 'string');
2191
- var selectedVal = (this.isImportRules || this.isPublic || isTemplate) ? rule.value : this.setDefaultValue(parentId, false, true);
2369
+ var selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1 || this.isPublic || isTemplate) ? rule.value : this.setDefaultValue(parentId, false, true);
2192
2370
  if ((operator === 'in' || operator === 'notin') && (this.dataColl.length || columnData.values)) {
2193
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2371
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2194
2372
  this.renderMultiSelect(columnData, parentId, idx, selectedVal, columnData.values);
2195
2373
  if (this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical') {
2196
2374
  ruleValElem.style.width = '100%';
@@ -2201,7 +2379,7 @@ var QueryBuilder = /** @class */ (function (_super) {
2201
2379
  }
2202
2380
  }
2203
2381
  else if (operator === 'in' || operator === 'notin') {
2204
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2382
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2205
2383
  var selVal = selectedVal.join(',');
2206
2384
  var txtInp = void 0;
2207
2385
  txtInp = {
@@ -2474,8 +2652,8 @@ var QueryBuilder = /** @class */ (function (_super) {
2474
2652
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
2475
2653
  : this.getColumn(filtObj.value);
2476
2654
  this.selectedRule = column;
2655
+ var ddlObj = getComponent(target.querySelector('input'), 'dropdownlist');
2477
2656
  if (isRender) {
2478
- var ddlObj = getComponent(target.querySelector('input'), 'dropdownlist');
2479
2657
  itemData = element.id.indexOf('operator') > -1 ? itemData : this.selectedRule;
2480
2658
  if (itemData.operators) {
2481
2659
  ddlObj.value = null;
@@ -2483,7 +2661,13 @@ var QueryBuilder = /** @class */ (function (_super) {
2483
2661
  ddlObj.dataSource = itemData.operators;
2484
2662
  ddlObj.index = this.getOperatorIndex(ddlObj, rule);
2485
2663
  ddlObj.value = tempRule.operator = ddlObj.dataSource[ddlObj.index].value;
2486
- ddlObj.dataBind();
2664
+ if (!this.autoSelectOperator) {
2665
+ ddlObj.index = -1;
2666
+ tempRule.operator = ddlObj.value = '';
2667
+ }
2668
+ else {
2669
+ ddlObj.dataBind();
2670
+ }
2487
2671
  }
2488
2672
  }
2489
2673
  var operator = tempRule.operator.toString();
@@ -2516,39 +2700,41 @@ var QueryBuilder = /** @class */ (function (_super) {
2516
2700
  this.validateValue(rule, closest(target, '.e-rule-container'));
2517
2701
  this.destroyControls(target);
2518
2702
  }
2519
- if (column) {
2520
- itemData.template = column.template;
2521
- }
2522
- if (itemData.template) {
2523
- addClass([target.nextElementSibling], 'e-template-value');
2524
- itemData.template = column.template;
2525
- isTempRendered = this.setColumnTemplate(itemData, parentId, column.field, itemData.value ||
2526
- operator, target, rule);
2527
- }
2528
- if (isTempRendered) {
2529
- var parentElem = target.parentElement.querySelector('.e-rule-value');
2530
- if (this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical') {
2531
- parentElem.style.width = '100%';
2532
- }
2533
- else {
2534
- parentElem.style.width = '200px';
2535
- }
2536
- }
2537
- else {
2538
- removeClass([target.nextElementSibling], 'e-template-value');
2539
- var inputLen = 1;
2540
- if (tempRule.type === 'boolean') {
2541
- inputLen = this.selectedColumn.values ? this.selectedColumn.values.length : 2;
2703
+ if (this.isImportRules || (ddlObj && ddlObj.value !== '')) {
2704
+ if (column) {
2705
+ itemData.template = column.template;
2706
+ }
2707
+ if (itemData.template) {
2708
+ addClass([target.nextElementSibling], 'e-template-value');
2709
+ itemData.template = column.template;
2710
+ isTempRendered = this.setColumnTemplate(itemData, parentId, column.field, itemData.value ||
2711
+ operator, target, rule);
2712
+ }
2713
+ if (isTempRendered) {
2714
+ var parentElem = target.parentElement.querySelector('.e-rule-value');
2715
+ if (this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical') {
2716
+ parentElem.style.width = '100%';
2717
+ }
2718
+ else {
2719
+ parentElem.style.width = '200px';
2720
+ }
2542
2721
  }
2543
2722
  else {
2544
- inputLen = (operator && operator.toLowerCase().indexOf('between') > -1) ? 2 : 1;
2545
- }
2546
- for (var i = 0; i < inputLen; i++) {
2547
- var valElem = this.createElement('input', { attrs: { type: 'text', id: parentId + '_valuekey' + i } });
2548
- target.nextElementSibling.appendChild(valElem);
2723
+ removeClass([target.nextElementSibling], 'e-template-value');
2724
+ var inputLen = 1;
2725
+ if (tempRule.type === 'boolean') {
2726
+ inputLen = this.selectedColumn.values ? this.selectedColumn.values.length : 2;
2727
+ }
2728
+ else {
2729
+ inputLen = (operator && operator.toLowerCase().indexOf('between') > -1) ? 2 : 1;
2730
+ }
2731
+ for (var i = 0; i < inputLen; i++) {
2732
+ var valElem = this.createElement('input', { attrs: { type: 'text', id: parentId + '_valuekey' + i } });
2733
+ target.nextElementSibling.appendChild(valElem);
2734
+ }
2549
2735
  }
2736
+ this.renderControls(target, itemData, rule, tempRule, isTempRendered);
2550
2737
  }
2551
- this.renderControls(target, itemData, rule, tempRule, isTempRendered);
2552
2738
  }
2553
2739
  else {
2554
2740
  var parentElem = target.parentElement.querySelector('.e-rule-value');
@@ -2982,8 +3168,8 @@ var QueryBuilder = /** @class */ (function (_super) {
2982
3168
  var i;
2983
3169
  var len;
2984
3170
  var tooltip;
2985
- var popupElement;
2986
3171
  _super.prototype.destroy.call(this);
3172
+ var popupElement;
2987
3173
  element = this.element.querySelectorAll('.e-addrulegroup');
2988
3174
  len = element.length;
2989
3175
  for (i = 0; i < len; i++) {
@@ -3069,7 +3255,8 @@ var QueryBuilder = /** @class */ (function (_super) {
3069
3255
  if (grouplen) {
3070
3256
  this.isPublic = true;
3071
3257
  for (var i = 0, len = groups.length; i < len; i++) {
3072
- this.updatedRule = { condition: groups[i].condition, not: groups[i].not };
3258
+ this.updatedRule = { isLocked: groups[i].isLocked, condition: groups[i].condition,
3259
+ not: groups[i].not };
3073
3260
  this.importRules(groups[i], groupElem, false, groups[i].not);
3074
3261
  }
3075
3262
  this.isPublic = false;
@@ -3077,15 +3264,27 @@ var QueryBuilder = /** @class */ (function (_super) {
3077
3264
  else {
3078
3265
  var condition = 'and';
3079
3266
  var not = false;
3267
+ var isLocked = false;
3080
3268
  if (this.updatedRule) {
3081
3269
  condition = this.updatedRule.condition;
3082
3270
  not = this.updatedRule.not;
3271
+ isLocked = this.updatedRule.isLocked;
3083
3272
  }
3084
- if (this.enableNotCondition) {
3085
- rule.rules.push({ 'condition': condition, 'not': not, rules: [] });
3273
+ if (this.groupIndex < 0) {
3274
+ if (this.enableNotCondition) {
3275
+ rule.rules.push({ 'condition': condition, 'not': not, rules: [] });
3276
+ }
3277
+ else {
3278
+ rule.rules.push({ 'condition': condition, rules: [] });
3279
+ }
3086
3280
  }
3087
3281
  else {
3088
- rule.rules.push({ 'condition': condition, rules: [] });
3282
+ if (this.enableNotCondition) {
3283
+ rule.rules.splice(this.groupIndex + 1, 0, { condition: condition, not: not, rules: [], isLocked: isLocked });
3284
+ }
3285
+ else {
3286
+ rule.rules.splice(this.groupIndex + 1, 0, { condition: condition, rules: [], isLocked: isLocked });
3287
+ }
3089
3288
  }
3090
3289
  }
3091
3290
  if (!this.headerTemplate) {
@@ -3268,17 +3467,53 @@ var QueryBuilder = /** @class */ (function (_super) {
3268
3467
  this.refresh();
3269
3468
  break;
3270
3469
  case 'showButtons':
3271
- if (newProp.showButtons.ruleDelete) {
3272
- removeClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3470
+ if (!isNullOrUndefined(newProp.showButtons.lockGroup)) {
3471
+ if (newProp.showButtons.lockGroup) {
3472
+ removeClass(this.element.querySelectorAll('.e-lock-grp-btn'), 'e-button-hide');
3473
+ }
3474
+ else {
3475
+ addClass(this.element.querySelectorAll('.e-lock-grp-btn'), 'e-button-hide');
3476
+ }
3273
3477
  }
3274
- else {
3275
- addClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3478
+ if (!isNullOrUndefined(newProp.showButtons.lockRule)) {
3479
+ if (newProp.showButtons.lockRule) {
3480
+ removeClass(this.element.querySelectorAll('.e-lock-rule-btn'), 'e-button-hide');
3481
+ }
3482
+ else {
3483
+ addClass(this.element.querySelectorAll('.e-lock-rule-btn'), 'e-button-hide');
3484
+ }
3276
3485
  }
3277
- if (newProp.showButtons.groupDelete) {
3278
- removeClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3486
+ if (!isNullOrUndefined(newProp.showButtons.cloneGroup)) {
3487
+ if (newProp.showButtons.cloneGroup) {
3488
+ removeClass(this.element.querySelectorAll('.e-clone-grp-btn'), 'e-button-hide');
3489
+ }
3490
+ else {
3491
+ addClass(this.element.querySelectorAll('.e-clone-grp-btn'), 'e-button-hide');
3492
+ }
3279
3493
  }
3280
- else {
3281
- addClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3494
+ if (!isNullOrUndefined(newProp.showButtons.cloneRule)) {
3495
+ if (newProp.showButtons.cloneRule) {
3496
+ removeClass(this.element.querySelectorAll('.e-clone-rule-btn'), 'e-button-hide');
3497
+ }
3498
+ else {
3499
+ addClass(this.element.querySelectorAll('.e-clone-rule-btn'), 'e-button-hide');
3500
+ }
3501
+ }
3502
+ if (!isNullOrUndefined(newProp.showButtons.ruleDelete)) {
3503
+ if (newProp.showButtons.ruleDelete) {
3504
+ removeClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3505
+ }
3506
+ else {
3507
+ addClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3508
+ }
3509
+ }
3510
+ if (!isNullOrUndefined(newProp.showButtons.groupDelete)) {
3511
+ if (newProp.showButtons.groupDelete) {
3512
+ removeClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3513
+ }
3514
+ else {
3515
+ addClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3516
+ }
3282
3517
  }
3283
3518
  break;
3284
3519
  case 'cssClass':
@@ -3355,8 +3590,11 @@ var QueryBuilder = /** @class */ (function (_super) {
3355
3590
  this.element.id = this.element.id || getUniqueID('ej2-querybuilder');
3356
3591
  this.defaultLocale = {
3357
3592
  StartsWith: 'Starts With',
3593
+ DoesNotStartWith: 'Does Not Start With',
3358
3594
  EndsWith: 'Ends With',
3595
+ DoesNotEndWith: 'Does Not End With',
3359
3596
  Contains: 'Contains',
3597
+ DoesNotContain: 'Does Not Contain',
3360
3598
  NotLike: 'Not Like',
3361
3599
  Like: 'Like',
3362
3600
  Equal: 'Equal',
@@ -3390,7 +3628,13 @@ var QueryBuilder = /** @class */ (function (_super) {
3390
3628
  IsNotNull: 'Is Not Null',
3391
3629
  True: 'true',
3392
3630
  False: 'false',
3393
- AddButton: 'Add Group/Condition'
3631
+ AddButton: 'Add Group/Condition',
3632
+ CloneGroup: 'Clone Group',
3633
+ LockGroup: 'Lock Group',
3634
+ CloneRule: 'Clone Rule',
3635
+ LockRule: 'Lock Rule',
3636
+ UnlockRule: 'Unlock Rule',
3637
+ UnlockGroup: 'Unlock Group'
3394
3638
  };
3395
3639
  this.l10n = new L10n('querybuilder', this.defaultLocale, this.locale);
3396
3640
  this.intl = new Internationalization(this.locale);
@@ -3403,8 +3647,11 @@ var QueryBuilder = /** @class */ (function (_super) {
3403
3647
  this.customOperators = {
3404
3648
  stringOperator: [
3405
3649
  { value: 'startswith', key: this.l10n.getConstant('StartsWith') },
3650
+ { value: 'notstartswith', key: this.l10n.getConstant('DoesNotStartWith') },
3406
3651
  { value: 'endswith', key: this.l10n.getConstant('EndsWith') },
3652
+ { value: 'notendswith', key: this.l10n.getConstant('DoesNotEndWith') },
3407
3653
  { value: 'contains', key: this.l10n.getConstant('Contains') },
3654
+ { value: 'notcontains', key: this.l10n.getConstant('DoesNotContain') },
3408
3655
  { value: 'equal', key: this.l10n.getConstant('Equal') },
3409
3656
  { value: 'notequal', key: this.l10n.getConstant('NotEqual') },
3410
3657
  { value: 'in', key: this.l10n.getConstant('In') },
@@ -3418,7 +3665,9 @@ var QueryBuilder = /** @class */ (function (_super) {
3418
3665
  { value: 'greaterthanorequal', key: this.l10n.getConstant('GreaterThanOrEqual') },
3419
3666
  { value: 'lessthan', key: this.l10n.getConstant('LessThan') },
3420
3667
  { value: 'lessthanorequal', key: this.l10n.getConstant('LessThanOrEqual') },
3421
- { value: 'notequal', key: this.l10n.getConstant('NotEqual') }
3668
+ { value: 'notequal', key: this.l10n.getConstant('NotEqual') },
3669
+ { value: 'between', key: this.l10n.getConstant('Between') },
3670
+ { value: 'notbetween', key: this.l10n.getConstant('NotBetween') }
3422
3671
  ],
3423
3672
  booleanOperator: [
3424
3673
  { value: 'equal', key: this.l10n.getConstant('Equal') },
@@ -3743,6 +3992,10 @@ var QueryBuilder = /** @class */ (function (_super) {
3743
3992
  this.setProperties({ rule: rule }, true);
3744
3993
  rule = this.getRuleCollection(this.rule, false);
3745
3994
  this.importRules(this.rule, this.element.querySelector('.e-group-container'), true, this.rule.not, isRoot);
3995
+ if (rule.isLocked) {
3996
+ var lockGrpTarget = this.element.querySelector('.e-group-container').querySelector('.e-lock-grp-btn');
3997
+ this.groupLock(lockGrpTarget);
3998
+ }
3746
3999
  this.isImportRules = false;
3747
4000
  };
3748
4001
  QueryBuilder.prototype.keyBoardHandler = function (e) {
@@ -3838,7 +4091,8 @@ var QueryBuilder = /** @class */ (function (_super) {
3838
4091
  rule.value !== undefined)) || (customObj && customObj.isQuestion)) {
3839
4092
  var condition = rule.condition;
3840
4093
  rule = {
3841
- 'label': rule.label, 'field': rule.field, 'operator': rule.operator, 'type': rule.type, 'value': rule.value
4094
+ 'label': rule.label, 'field': rule.field, 'operator': rule.operator, 'type': rule.type, 'value': rule.value,
4095
+ 'isLocked': rule.isLocked
3842
4096
  };
3843
4097
  if (condition) {
3844
4098
  rule.condition = condition;
@@ -3847,6 +4101,7 @@ var QueryBuilder = /** @class */ (function (_super) {
3847
4101
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
3848
4102
  rule.custom = customObj;
3849
4103
  }
4104
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3850
4105
  if ((rule.operator === 'in' || rule.operator === 'notin') && rule.value && rule.value.length === 0) {
3851
4106
  rule = {};
3852
4107
  }
@@ -3872,10 +4127,10 @@ var QueryBuilder = /** @class */ (function (_super) {
3872
4127
  }
3873
4128
  else {
3874
4129
  if (this.enableNotCondition) {
3875
- rule = { 'condition': rule.condition, 'rules': rule.rules, 'not': rule.not };
4130
+ rule = { 'condition': rule.condition, 'rules': rule.rules, 'not': rule.not, 'isLocked': rule.isLocked };
3876
4131
  }
3877
4132
  else {
3878
- rule = { 'condition': rule.condition, 'rules': rule.rules };
4133
+ rule = { 'condition': rule.condition, 'rules': rule.rules, 'isLocked': rule.isLocked };
3879
4134
  }
3880
4135
  if (customObj) {
3881
4136
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -4040,11 +4295,20 @@ var QueryBuilder = /** @class */ (function (_super) {
4040
4295
  var ruleValue;
4041
4296
  var ignoreCase = false;
4042
4297
  var column;
4043
- var ignoreOper = ['notcontains', 'notstartswith', 'notendswith'];
4044
4298
  if (!ruleColl) {
4045
4299
  return pred;
4046
4300
  }
4047
4301
  for (var i = 0, len = ruleColl.length; i < len; i++) {
4302
+ var operator = ruleColl[i].operator;
4303
+ if (operator === 'notstartswith') {
4304
+ operator = 'doesnotstartwith';
4305
+ }
4306
+ else if (operator === 'notendswith') {
4307
+ operator = 'doesnotendwith';
4308
+ }
4309
+ else if (operator === 'notcontains') {
4310
+ operator = 'doesnotcontain';
4311
+ }
4048
4312
  var keys = Object.keys(ruleColl[i]);
4049
4313
  ignoreCase = false;
4050
4314
  if (keys.indexOf('rules') > -1 && ruleColl[i].rules) {
@@ -4063,7 +4327,7 @@ var QueryBuilder = /** @class */ (function (_super) {
4063
4327
  }
4064
4328
  }
4065
4329
  }
4066
- else if (!isNullOrUndefined(ruleColl[i].operator) && !isNullOrUndefined(ruleColl[i].operator.length)) {
4330
+ else if (!isNullOrUndefined(operator) && !isNullOrUndefined(operator.length)) {
4067
4331
  var oper = ruleColl[i].operator.toLowerCase();
4068
4332
  var isDateFilter = false;
4069
4333
  var dateOperColl = ['equal', 'notequal', 'greaterthan', 'greaterthanorequal', 'lessthan', 'lessthanorequal'];
@@ -4094,23 +4358,20 @@ var QueryBuilder = /** @class */ (function (_super) {
4094
4358
  }
4095
4359
  if (i === 0) {
4096
4360
  if (isDateFilter || (oper.indexOf('in') > -1 || oper.indexOf('between') > -1 || oper.indexOf('null') > -1 ||
4097
- oper.indexOf('empty') > -1) && oper.indexOf('contains') < 0) {
4361
+ oper.indexOf('empty') > -1) && (oper.indexOf('contain') < 0)) {
4098
4362
  pred = isDateFilter ? this.datePredicate(ruleColl[i], ruleValue) :
4099
4363
  this.arrayPredicate(ruleColl[i]);
4100
4364
  }
4101
4365
  else {
4102
4366
  var value = ruleValue;
4103
- if (value !== '' && ignoreOper.indexOf(oper) < 0) {
4104
- pred = new Predicate(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4367
+ if (value !== '') {
4368
+ pred = new Predicate(ruleColl[i].field, operator, ruleValue, ignoreCase);
4105
4369
  }
4106
4370
  }
4107
4371
  }
4108
4372
  else {
4109
- if (ignoreOper.indexOf(oper) > -1) {
4110
- continue;
4111
- }
4112
4373
  if (isDateFilter || (oper.indexOf('in') > -1 || oper.indexOf('between') > -1 ||
4113
- oper.indexOf('null') > -1 || oper.indexOf('empty') > -1) && oper.indexOf('contains') < 0) {
4374
+ oper.indexOf('null') > -1 || oper.indexOf('empty') > -1) && oper.indexOf('contain') < 0) {
4114
4375
  pred = isDateFilter ? this.datePredicate(ruleColl[i], ruleValue, pred, rule.condition) :
4115
4376
  this.arrayPredicate(ruleColl[i], pred, rule.condition);
4116
4377
  }
@@ -4119,19 +4380,19 @@ var QueryBuilder = /** @class */ (function (_super) {
4119
4380
  var value = ruleValue;
4120
4381
  if (pred && value !== '') {
4121
4382
  pred
4122
- = pred.and(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4383
+ = pred.and(ruleColl[i].field, operator, ruleValue, ignoreCase);
4123
4384
  }
4124
4385
  else if (value !== '') {
4125
- pred = new Predicate(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4386
+ pred = new Predicate(ruleColl[i].field, operator, ruleValue, ignoreCase);
4126
4387
  }
4127
4388
  }
4128
4389
  else {
4129
4390
  var value = ruleValue;
4130
4391
  if (pred && value !== '') {
4131
- pred = pred.or(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4392
+ pred = pred.or(ruleColl[i].field, operator, ruleValue, ignoreCase);
4132
4393
  }
4133
4394
  else if (value !== '') {
4134
- pred = new Predicate(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4395
+ pred = new Predicate(ruleColl[i].field, operator, ruleValue, ignoreCase);
4135
4396
  }
4136
4397
  }
4137
4398
  }
@@ -4411,15 +4672,28 @@ var QueryBuilder = /** @class */ (function (_super) {
4411
4672
  for (var i = 0, len = ruleColl.length; i < len; i++) {
4412
4673
  var keys = Object.keys(ruleColl[i]);
4413
4674
  if (!isNullOrUndefined(ruleColl[i].rules) && keys.indexOf('rules') > -1 && (ruleColl[i].rules.length !== 0)) {
4675
+ if (this.element.querySelectorAll('.e-group-container').length > this.maxGroupCount) {
4676
+ return null;
4677
+ }
4414
4678
  parentElem = this.renderGroup(ruleColl[i], ruleColl[i].condition, parentElem, ruleColl[i].not);
4415
4679
  parentElem = this.importRules(ruleColl[i], parentElem, true);
4416
4680
  }
4417
4681
  else {
4418
4682
  this.renderRule(ruleColl[i], parentElem);
4419
4683
  }
4684
+ if (!isNullOrUndefined(ruleColl[i].rules) && ruleColl[i].isLocked) {
4685
+ var lockGrpTarget = parentElem.querySelector('.e-rule-list').children[i].querySelector('.e-lock-grp-btn');
4686
+ this.groupLock(lockGrpTarget);
4687
+ }
4688
+ if (isNullOrUndefined(ruleColl[i].rules) && ruleColl[i].isLocked) {
4689
+ var lockRuleTarget = parentElem.querySelector('.e-rule-list').children[i].querySelector('.e-lock-rule-btn');
4690
+ this.ruleLock(lockRuleTarget);
4691
+ }
4420
4692
  }
4421
4693
  }
4422
- parentElem = closest(parentElem, '.e-rule-list');
4694
+ if (parentElem) {
4695
+ parentElem = closest(parentElem, '.e-rule-list');
4696
+ }
4423
4697
  if (parentElem) {
4424
4698
  parentElem = closest(parentElem, '.e-group-container');
4425
4699
  }
@@ -4428,7 +4702,20 @@ var QueryBuilder = /** @class */ (function (_super) {
4428
4702
  QueryBuilder.prototype.renderGroup = function (rule, condition, parentElem, not, isRoot) {
4429
4703
  this.addGroupElement(true, parentElem, condition, false, not, isRoot, rule); //Child group
4430
4704
  var element = parentElem.querySelectorAll('.e-group-container');
4431
- return element[element.length - 1];
4705
+ var cloneElem = parentElem.querySelector('.e-rule-list').children;
4706
+ if (this.showButtons.cloneGroup && this.cloneGrpBtnClick && this.isMiddleGroup) {
4707
+ this.isMiddleGroup = false;
4708
+ this.cloneGrpBtnClick = false;
4709
+ return cloneElem[this.groupIndex + 1]; // group added in the middle
4710
+ }
4711
+ else if (this.showButtons.cloneGroup && this.cloneGrpBtnClick && this.isLastGroup) {
4712
+ this.isLastGroup = false;
4713
+ this.cloneGrpBtnClick = false;
4714
+ return cloneElem[cloneElem.length - 1]; // group added in the end
4715
+ }
4716
+ else {
4717
+ return element[element.length - 1];
4718
+ }
4432
4719
  };
4433
4720
  QueryBuilder.prototype.renderRule = function (rule, parentElem) {
4434
4721
  if (parentElem.className.indexOf('e-group-container') > -1) {
@@ -4627,15 +4914,19 @@ var QueryBuilder = /** @class */ (function (_super) {
4627
4914
  valueStr += rule.value ? '("%' + rule.value + '%")' : '(' + rule.value + ')';
4628
4915
  }
4629
4916
  else {
4630
- if (rule.type === 'number' || typeof rule.value === 'boolean' || rule.value === null) {
4917
+ if (rule.type === 'number' || typeof rule.value === 'boolean' ||
4918
+ (rule.value === null && (rule.operator.toString().indexOf('empty') < -1))) {
4631
4919
  valueStr += rule.value;
4632
4920
  }
4921
+ else if (rule.operator.toString().indexOf('empty') > -1) {
4922
+ valueStr += '""';
4923
+ }
4633
4924
  else {
4634
4925
  valueStr += '"' + rule.value + '"';
4635
4926
  }
4636
4927
  }
4637
4928
  }
4638
- if (rule.operator.toString().indexOf('null') > -1 || (rule.operator.toString().indexOf('empty') > -1)) {
4929
+ if (rule.operator.toString().indexOf('null') > -1) {
4639
4930
  if (enableEscape) {
4640
4931
  rule.field = '`' + rule.field + '`';
4641
4932
  }
@@ -4647,6 +4938,13 @@ var QueryBuilder = /** @class */ (function (_super) {
4647
4938
  queryStr += rule.field + ' ' + ruleOpertor;
4648
4939
  }
4649
4940
  else {
4941
+ var custOper = ruleOpertor;
4942
+ if (rule.operator === 'isempty') {
4943
+ custOper = '=';
4944
+ }
4945
+ else if (rule.operator === 'isnotempty') {
4946
+ custOper = '!=';
4947
+ }
4650
4948
  if (enableEscape) {
4651
4949
  rule.field = '`' + rule.field + '`';
4652
4950
  }
@@ -4655,7 +4953,7 @@ var QueryBuilder = /** @class */ (function (_super) {
4655
4953
  rule.field = '"' + rule.field + '"';
4656
4954
  }
4657
4955
  }
4658
- queryStr += rule.field + ' ' + ruleOpertor + ' ' + valueStr;
4956
+ queryStr += rule.field + ' ' + custOper + ' ' + valueStr;
4659
4957
  }
4660
4958
  if (rule.condition && rule.condition !== '') {
4661
4959
  condition = rule.condition;
@@ -4685,7 +4983,7 @@ var QueryBuilder = /** @class */ (function (_super) {
4685
4983
  * Sets the rules from the sql query.
4686
4984
  *
4687
4985
  * @param {string} sqlString - 'sql String' to be passed to set the rule.
4688
- * @param {boolean} sqlLocale - Set `true` if Localization for Sql query.
4986
+ * @param {boolean} sqlLocale - Optional. Set `true` if Localization for Sql query.
4689
4987
  * @returns {void}
4690
4988
  */
4691
4989
  QueryBuilder.prototype.setRulesFromSql = function (sqlString, sqlLocale) {
@@ -4717,15 +5015,173 @@ var QueryBuilder = /** @class */ (function (_super) {
4717
5015
  *
4718
5016
  * @param {RuleModel} rule - 'rule' to be passed to get the sql.
4719
5017
  * @param {boolean} allowEscape - Set `true` if it exclude the escape character.
4720
- * @param {boolean} sqlLocale - Set `true` if Localization for Sql query.
4721
- * @returns {object} - Sql query from rules.
5018
+ * @param {boolean} sqlLocale - Set `true` if Localization for Sql query.
5019
+ * @returns {string} - Sql query from rules.
4722
5020
  */
4723
5021
  QueryBuilder.prototype.getSqlFromRules = function (rule, allowEscape, sqlLocale) {
4724
5022
  if (!rule) {
4725
5023
  rule = this.getValidRules();
4726
5024
  }
4727
5025
  rule = this.getRuleCollection(rule, false);
4728
- return this.getSqlString(this.getValidRules(rule), allowEscape, null, sqlLocale).replace(/"/g, '\'');
5026
+ var sqlString = this.getSqlString(this.getValidRules(rule), allowEscape, null, sqlLocale).replace(/"/g, '\'');
5027
+ return sqlString;
5028
+ };
5029
+ /**
5030
+ * Gets the parameter SQL query from rules.
5031
+ *
5032
+ * @param {RuleModel} rule – Specify the rule to be passed to get the parameter sql string.
5033
+ * @returns {ParameterizedSql} – Parameterized SQL query from rules.
5034
+ */
5035
+ QueryBuilder.prototype.getParameterizedSql = function (rule) {
5036
+ if (!rule) {
5037
+ rule = this.getValidRules();
5038
+ }
5039
+ var obj = { sql: null };
5040
+ this.notify('query-library', { prop: 'getParameterSql', onPropertyChange: false, value: { rule: rule, obj: obj } });
5041
+ return obj['sql'];
5042
+ };
5043
+ /**
5044
+ * Sets the rules from the parameter sql query.
5045
+ *
5046
+ * @param { ParameterizedSql} sqlQuery – Specifies the parameter SQL to be passed to set the rule and load it to the query builder.
5047
+ * @returns {void}
5048
+ */
5049
+ QueryBuilder.prototype.setParameterizedSql = function (sqlQuery) {
5050
+ var obj = { sql: null };
5051
+ this.notify('query-library', { prop: 'convertParamSqlToSql', onPropertyChange: false, value: { sql: sqlQuery, obj: obj } });
5052
+ var sql = obj['sql'];
5053
+ if (sql) {
5054
+ sql = sql.replace(/`/g, '');
5055
+ var ruleModel = this.getRulesFromSql(sql);
5056
+ this.setRules({ condition: ruleModel.condition, not: ruleModel.not, rules: ruleModel.rules });
5057
+ }
5058
+ };
5059
+ /**
5060
+ * Gets the named parameter SQL query from rules.
5061
+ *
5062
+ * @param {RuleModel} rule – Specify the rule to be passed to get the named parameter SQL string.
5063
+ * @returns {ParameterizedNamedSql} – Parameterized Named SQL query from rules.
5064
+ */
5065
+ QueryBuilder.prototype.getParameterizedNamedSql = function (rule) {
5066
+ if (!rule) {
5067
+ rule = this.getValidRules();
5068
+ }
5069
+ var obj = { sql: null };
5070
+ this.notify('query-library', { prop: 'getNamedParameterSql', onPropertyChange: false, value: { rule: rule, obj: obj } });
5071
+ return obj['sql'];
5072
+ };
5073
+ /**
5074
+ * Sets the rules from the named parameter SQL query.
5075
+ *
5076
+ * @param { ParameterizedNamedSql } sqlQuery – Specifies the named parameter SQL to be passed to set the rule and load it to the query builder.
5077
+ * @returns {void}
5078
+ */
5079
+ QueryBuilder.prototype.setParameterizedNamedSql = function (sqlQuery) {
5080
+ var obj = { sql: null };
5081
+ this.notify('query-library', { prop: 'convertNamedParamSqlToSql', onPropertyChange: false, value: { sql: sqlQuery, obj: obj } });
5082
+ var sql = obj['sql'];
5083
+ if (sql) {
5084
+ sql = sql.replace(/`/g, '');
5085
+ var ruleModel = this.getRulesFromSql(sql);
5086
+ this.setRules({ condition: ruleModel.condition, not: ruleModel.not, rules: ruleModel.rules });
5087
+ }
5088
+ };
5089
+ /**
5090
+ * Set the rules from Mongo query.
5091
+ *
5092
+ * @param {string} mongoQuery - 'sql String' to be passed to get the rule.
5093
+ * @param {boolean} mongoLocale - Set `true` if Localization for Mongo query.
5094
+ * @returns {void}
5095
+ */
5096
+ QueryBuilder.prototype.setMongoQuery = function (mongoQuery, mongoLocale) {
5097
+ this.rule = { condition: 'and', not: false, rules: [] };
5098
+ this.notify('query-library', { prop: 'mongoParser', onPropertyChange: false, value: { mongoQuery: JSON.parse(mongoQuery), rule: this.rule, mongoLocale: mongoLocale } });
5099
+ };
5100
+ /**
5101
+ * Gets the Mongo query from rules.
5102
+ *
5103
+ * @param {RuleModel} rule - 'rule' to be passed to get the sql.
5104
+ * @returns {object} - Sql query from rules.
5105
+ */
5106
+ QueryBuilder.prototype.getMongoQuery = function (rule) {
5107
+ if (!rule) {
5108
+ rule = this.getValidRules();
5109
+ }
5110
+ var obj = { mongoQuery: null };
5111
+ this.notify('query-library', { prop: 'getMongoFromRules', onPropertyChange: false, value: { rule: rule, mongoQuery: '', obj: obj } });
5112
+ return obj['mongoQuery'];
5113
+ };
5114
+ /**
5115
+ * Clones the rule based on the rule ID to the specific group.
5116
+ *
5117
+ * @param {string} ruleID - Specifies the ruleID that needs to be cloned.
5118
+ * @param {string} groupID - Specifies the groupID in which the rule to be cloned.
5119
+ * @param {number} index - Specifies the index to insert the cloned rule inside the group.
5120
+ * @returns {void}
5121
+ */
5122
+ QueryBuilder.prototype.cloneRule = function (ruleID, groupID, index) {
5123
+ var getRule = this.getRule(ruleID.replace(this.element.id + '_', ''));
5124
+ var isCloneRule = this.showButtons.cloneRule;
5125
+ groupID = groupID.replace(this.element.id + '_', '');
5126
+ this.ruleIndex = index;
5127
+ this.cloneRuleBtnClick = true;
5128
+ this.showButtons.cloneRule = true;
5129
+ this.addRules([{
5130
+ 'label': getRule.label, 'field': getRule.field, 'type': getRule.type, 'operator': getRule.operator,
5131
+ 'value': getRule.value
5132
+ }], groupID);
5133
+ this.ruleIndex = -1;
5134
+ this.cloneRuleBtnClick = false;
5135
+ this.showButtons.cloneRule = isCloneRule;
5136
+ isCloneRule = false;
5137
+ };
5138
+ /**
5139
+ * Clones the group based on the group ID to the specific group.
5140
+ *
5141
+ * @param {string} groupID - Specifies the groupID that needs to be cloned.
5142
+ * @param {string} parentGroupID - Specifies the parentGroupID in which the group to be cloned.
5143
+ * @param {number} index - Specifies the index to insert the cloned group inside the parent group.
5144
+ * @returns {void}
5145
+ */
5146
+ QueryBuilder.prototype.cloneGroup = function (groupID, parentGroupID, index) {
5147
+ parentGroupID = parentGroupID.replace(this.element.id + '_', '');
5148
+ var group = this.getGroup(parentGroupID);
5149
+ var isCloneGroup = this.showButtons.cloneGroup;
5150
+ groupID = groupID.replace(this.element.id + '_', '');
5151
+ this.groupIndex = index;
5152
+ this.cloneGrpBtnClick = true;
5153
+ this.showButtons.cloneGroup = true;
5154
+ this.addGroups([{ 'condition': group.condition, 'not': group.not, 'rules': group.rules }], groupID);
5155
+ this.groupIndex = -1;
5156
+ this.cloneGrpBtnClick = false;
5157
+ this.showButtons.cloneGroup = isCloneGroup;
5158
+ isCloneGroup = false;
5159
+ };
5160
+ /**
5161
+ * Locks the rule based on the rule ID.
5162
+ *
5163
+ * @param {string} ruleID - Specifies the ruleID that needs to be locked.
5164
+ * @returns {void}
5165
+ */
5166
+ QueryBuilder.prototype.lockRule = function (ruleID) {
5167
+ if (ruleID.indexOf(this.element.id) < 0) {
5168
+ ruleID = this.element.id + '_' + ruleID;
5169
+ }
5170
+ var target = document.getElementById(ruleID).querySelectorAll('.e-lock-rule-btn')[0];
5171
+ this.ruleLock(target);
5172
+ };
5173
+ /**
5174
+ * Locks the group based on the group ID
5175
+ *
5176
+ * @param {string} groupID - Specifies the groupID that needs to be locked.
5177
+ * @returns {void}
5178
+ */
5179
+ QueryBuilder.prototype.lockGroup = function (groupID) {
5180
+ if (groupID.indexOf(this.element.id) < 0) {
5181
+ groupID = this.element.id + '_' + groupID;
5182
+ }
5183
+ var target = document.getElementById(groupID).querySelectorAll('.e-lock-grp-btn')[0];
5184
+ this.groupLock(target);
4729
5185
  };
4730
5186
  QueryBuilder.prototype.sqlParser = function (sqlString, sqlLocale) {
4731
5187
  var st = 0;
@@ -4927,13 +5383,13 @@ var QueryBuilder = /** @class */ (function (_super) {
4927
5383
  for (var i = 0; i < localeOperator.length; i++) {
4928
5384
  if (this.sqlOperators[localeOperator[i]] === operator.toUpperCase()) {
4929
5385
  if (value && value.indexOf('%') === 0 && value[value.length - 1] === '%') {
4930
- return (localeOperator[i] === 'notcontains') ? 'notcontains' : 'contains';
5386
+ return (operator.toUpperCase() === 'NOT LIKE') ? 'notcontains' : 'contains';
4931
5387
  }
4932
5388
  else if (value && value.indexOf('%') !== 0 && value.indexOf('%') === value.length - 1) {
4933
- return (localeOperator[i] === 'notstartswith') ? 'notstartswith' : 'startswith';
5389
+ return (operator.toUpperCase() === 'NOT LIKE') ? 'notstartswith' : 'startswith';
4934
5390
  }
4935
5391
  else if (value && value.indexOf('%') === 0 && value.indexOf('%') !== value.length - 1) {
4936
- return (localeOperator[i] === 'notendswith') ? 'notendswith' : 'endswith';
5392
+ return (operator.toUpperCase() === 'NOT LIKE') ? 'notendswith' : 'endswith';
4937
5393
  }
4938
5394
  return localeOperator[i];
4939
5395
  }
@@ -5118,6 +5574,15 @@ var QueryBuilder = /** @class */ (function (_super) {
5118
5574
  }
5119
5575
  else if (parser[i + 1][0] === 'Operators') {
5120
5576
  rule.operator = this.getOperator(parser[i + 2][1], parser[i + 1][1], sqlLocale);
5577
+ var isEmptyOper = false;
5578
+ if (rule.operator == "equal" && parser[i + 2][0] === "String" && parser[i + 2][1] === "''") {
5579
+ rule.operator = "isempty";
5580
+ isEmptyOper = true;
5581
+ }
5582
+ else if (rule.operator == "notequal" && parser[i + 2][0] === "String" && parser[i + 2][1] === "''") {
5583
+ rule.operator = "isnotempty";
5584
+ isEmptyOper = true;
5585
+ }
5121
5586
  if (parser[i + 2][0] === 'Number') {
5122
5587
  rule.type = 'number';
5123
5588
  rule.value = Number(parser[i + 2][1]);
@@ -5174,6 +5639,301 @@ var QueryBuilder = /** @class */ (function (_super) {
5174
5639
  }
5175
5640
  return rules;
5176
5641
  };
5642
+ /**
5643
+ * Clone the Group
5644
+ *
5645
+ * @param {Element | string} target - 'target' to be passed to clone the group.
5646
+ * @returns {void}
5647
+ */
5648
+ QueryBuilder.prototype.groupClone = function (target) {
5649
+ var groupElem = target.closest('.e-rule-list').closest('.e-group-container');
5650
+ var targetGrpId;
5651
+ var groupId;
5652
+ if (typeof target === 'string') {
5653
+ groupId = this.element.id + '_' + target;
5654
+ target = document.getElementById(groupId);
5655
+ }
5656
+ else {
5657
+ targetGrpId = target.id.replace(this.element.id + '_', '');
5658
+ groupId = groupElem.id.replace(this.element.id + '_', '');
5659
+ }
5660
+ var group = this.getGroup(targetGrpId);
5661
+ this.groupIndex = Array.prototype.indexOf.call(target.closest('.e-rule-list').children, target.closest('.e-group-container'));
5662
+ this.addGroups([{ 'condition': group.condition, 'not': group.not, 'rules': group.rules }], groupId);
5663
+ this.groupIndex = -1;
5664
+ };
5665
+ QueryBuilder.prototype.ruleClone = function (target) {
5666
+ var ruleElem = closest(target, '.e-rule-container');
5667
+ var groupElem = target.closest('.e-rule-list').closest('.e-group-container');
5668
+ var getRule = this.getRule(target);
5669
+ var groupId = groupElem.id.replace(this.element.id + '_', '');
5670
+ var ruleElemColl = groupElem.querySelectorAll('.e-rule-container');
5671
+ for (var i = 0, iLen = ruleElemColl.length; i < iLen; i++) {
5672
+ if (ruleElem.id === ruleElemColl[i].id) {
5673
+ this.ruleIndex = i;
5674
+ }
5675
+ }
5676
+ this.addRules([{ 'label': getRule.label, 'field': getRule.field, 'type': getRule.type, 'operator': getRule.operator,
5677
+ 'value': getRule.value }], groupId);
5678
+ this.ruleIndex = -1;
5679
+ };
5680
+ QueryBuilder.prototype.ruleLock = function (target) {
5681
+ var ruleElem = closest(target, '.e-rule-container');
5682
+ var rule = this.getRule(ruleElem.id.replace(this.element.id + '_', ''));
5683
+ if (ruleElem.classList.contains('e-disable')) {
5684
+ rule.isLocked = false;
5685
+ this.lockItems = this.lockItems.filter(function (lockItem) { return lockItem !== ruleElem.id; });
5686
+ ruleElem.classList.remove('e-disable');
5687
+ this.disableRuleControls(target, ruleElem, false);
5688
+ target.children[0].classList.add('e-unlock');
5689
+ target.children[0].classList.remove('e-lock');
5690
+ target.setAttribute('title', this.l10n.getConstant('LockRule'));
5691
+ }
5692
+ else {
5693
+ rule.isLocked = true;
5694
+ if (this.lockItems.indexOf(ruleElem.id) < 0) {
5695
+ this.lockItems.splice(this.lockItems.length - 1, 0, ruleElem.id);
5696
+ }
5697
+ ruleElem.classList.add('e-disable');
5698
+ this.disableRuleControls(target, ruleElem, true);
5699
+ target.children[0].classList.add('e-lock');
5700
+ target.children[0].classList.remove('e-unlock');
5701
+ target.setAttribute('title', this.l10n.getConstant('UnlockRule'));
5702
+ }
5703
+ };
5704
+ QueryBuilder.prototype.groupLock = function (target) {
5705
+ var groupElem = closest(target, '.e-group-container');
5706
+ var group = this.getGroup(groupElem.id.replace(this.element.id + '_', ''));
5707
+ var isRoot = groupElem.id.indexOf('group0') > -1;
5708
+ if (groupElem.classList.contains('e-disable')) {
5709
+ if (isRoot) {
5710
+ var newGroup = {};
5711
+ newGroup.condition = group.condition;
5712
+ newGroup.not = group.not;
5713
+ newGroup.isLocked = false;
5714
+ this.setProperties({ rule: newGroup }, true);
5715
+ }
5716
+ else {
5717
+ group.isLocked = false;
5718
+ }
5719
+ this.lockItems = this.lockItems.filter(function (lockItem) { return lockItem !== groupElem.id; });
5720
+ groupElem.classList.remove('e-disable');
5721
+ this.disableHeaderControls(target, groupElem, false);
5722
+ target.children[0].classList.add('e-unlock');
5723
+ target.children[0].classList.remove('e-lock');
5724
+ target.setAttribute('title', this.l10n.getConstant('LockGroup'));
5725
+ this.updateLockItems();
5726
+ }
5727
+ else {
5728
+ if (isRoot) {
5729
+ var newGroup = {};
5730
+ newGroup.condition = group.condition;
5731
+ newGroup.not = group.not;
5732
+ newGroup.isLocked = true;
5733
+ this.setProperties({ rule: newGroup }, true);
5734
+ }
5735
+ else {
5736
+ group.isLocked = true;
5737
+ }
5738
+ if (this.lockItems.indexOf(groupElem.id) < 0) {
5739
+ this.lockItems.splice(this.lockItems.length - 1, 0, groupElem.id);
5740
+ }
5741
+ groupElem.classList.add('e-disable');
5742
+ this.disableHeaderControls(target, groupElem, true);
5743
+ target.children[0].classList.add('e-lock');
5744
+ target.children[0].classList.remove('e-unlock');
5745
+ target.setAttribute('title', this.l10n.getConstant('UnlockGroup'));
5746
+ }
5747
+ };
5748
+ QueryBuilder.prototype.updateLockItems = function () {
5749
+ for (var i = 0; i < this.lockItems.length; i++) {
5750
+ var idColl = this.lockItems[i].split('_');
5751
+ if (idColl.length > 2) {
5752
+ var ruleElem = this.element.querySelector('#' + this.lockItems[i]);
5753
+ var target = ruleElem.querySelector('.e-lock-rule-btn');
5754
+ ruleElem = closest(target, '.e-rule-container');
5755
+ if (!ruleElem.classList.contains('e-disable')) {
5756
+ this.ruleLock(target);
5757
+ }
5758
+ }
5759
+ else {
5760
+ var groupElem = this.element.querySelector('#' + this.lockItems[i]);
5761
+ var target = groupElem.querySelector('.e-lock-grp-btn');
5762
+ groupElem = closest(target, '.e-group-container');
5763
+ if (!groupElem.classList.contains('e-disable')) {
5764
+ this.groupLock(target);
5765
+ }
5766
+ }
5767
+ }
5768
+ };
5769
+ QueryBuilder.prototype.disableHeaderControls = function (target, groupElem, isDisabled) {
5770
+ var andElem = groupElem.querySelectorAll('.e-btngroup-and');
5771
+ var orElem = groupElem.querySelectorAll('.e-btngroup-or');
5772
+ var notElem = groupElem.querySelectorAll('.e-qb-toggle');
5773
+ var addElem = groupElem.querySelectorAll('.e-add-btn');
5774
+ var deleteGrpElem = groupElem.querySelectorAll('.e-deletegroup');
5775
+ var lockElem = groupElem.querySelectorAll('.e-lock-grp-btn');
5776
+ var cloneElem = groupElem.querySelectorAll('.e-clone-grp-btn');
5777
+ var groupContElem = groupElem.querySelectorAll('.e-group-container');
5778
+ for (var i = 0; i < andElem.length; i++) {
5779
+ if (isDisabled) {
5780
+ if (groupContElem[i] && groupContElem[i].classList.contains('e-disable')) {
5781
+ groupContElem[i].classList.add('e-disable');
5782
+ }
5783
+ andElem[i].disabled = true;
5784
+ orElem[i].disabled = true;
5785
+ addElem[i].disabled = true;
5786
+ if (notElem[i]) {
5787
+ notElem[i].disabled = true;
5788
+ }
5789
+ if (deleteGrpElem[i]) {
5790
+ deleteGrpElem[i].disabled = true;
5791
+ }
5792
+ if (cloneElem[i]) {
5793
+ cloneElem[i].disabled = true;
5794
+ }
5795
+ andElem[i].parentElement.classList.add('e-disabled');
5796
+ if (lockElem[i] !== target) {
5797
+ lockElem[i].disabled = true;
5798
+ lockElem[i].children[0].classList.remove('e-unlock');
5799
+ lockElem[i].children[0].classList.add('e-lock');
5800
+ }
5801
+ }
5802
+ else {
5803
+ if (groupContElem[i]) {
5804
+ groupContElem[i].classList.remove('e-disable');
5805
+ }
5806
+ andElem[i].disabled = false;
5807
+ orElem[i].disabled = false;
5808
+ addElem[i].disabled = false;
5809
+ lockElem[i].disabled = false;
5810
+ if (notElem[i]) {
5811
+ notElem[i].disabled = false;
5812
+ }
5813
+ if (deleteGrpElem[i]) {
5814
+ deleteGrpElem[i].disabled = false;
5815
+ }
5816
+ if (cloneElem[i]) {
5817
+ cloneElem[i].disabled = false;
5818
+ }
5819
+ andElem[i].parentElement.classList.remove('e-disabled');
5820
+ lockElem[i].children[0].classList.remove('e-lock');
5821
+ lockElem[i].children[0].classList.add('e-unlock');
5822
+ }
5823
+ }
5824
+ this.disableRuleControls(target, groupElem, isDisabled);
5825
+ };
5826
+ QueryBuilder.prototype.disableRuleControls = function (target, groupElem, isDisabled) {
5827
+ var ddlElement = groupElem.querySelectorAll('.e-control.e-dropdownlist');
5828
+ var numericElement = groupElem.querySelectorAll('.e-control.e-numerictextbox');
5829
+ var textElement = groupElem.querySelectorAll('.e-control.e-textbox');
5830
+ var dateElement = groupElem.querySelectorAll('.e-control.e-datepicker');
5831
+ var checkboxElement = groupElem.querySelectorAll('.e-control.e-checkbox');
5832
+ var radioBtnElement = groupElem.querySelectorAll('.e-control.e-radio');
5833
+ var multiSelectElement = groupElem.querySelectorAll('.e-control.e-multiselect');
5834
+ var deleteElem = groupElem.querySelectorAll('.e-rule-delete');
5835
+ var lockElem = groupElem.querySelectorAll('.e-lock-rule');
5836
+ var cloneElem = groupElem.querySelectorAll('.e-clone-rule');
5837
+ var ruleElem = groupElem.querySelectorAll('.e-rule-container');
5838
+ for (var i = 0; i < deleteElem.length; i++) {
5839
+ if (isDisabled) {
5840
+ if (ruleElem[i] && ruleElem[i].classList.contains('e-disable')) {
5841
+ ruleElem[i].classList.add('e-disable');
5842
+ }
5843
+ deleteElem[i].disabled = true;
5844
+ if (cloneElem[i]) {
5845
+ cloneElem[i].disabled = true;
5846
+ }
5847
+ if (lockElem[i] !== target) {
5848
+ lockElem[i].disabled = true;
5849
+ lockElem[i].children[0].classList.remove('e-unlock');
5850
+ lockElem[i].children[0].classList.add('e-lock');
5851
+ }
5852
+ }
5853
+ else {
5854
+ if (ruleElem[i]) {
5855
+ ruleElem[i].classList.remove('e-disable');
5856
+ }
5857
+ if (cloneElem[i]) {
5858
+ cloneElem[i].disabled = false;
5859
+ }
5860
+ deleteElem[i].disabled = false;
5861
+ lockElem[i].disabled = false;
5862
+ lockElem[i].children[0].classList.remove('e-lock');
5863
+ lockElem[i].children[0].classList.add('e-unlock');
5864
+ }
5865
+ }
5866
+ var dropDownObj;
5867
+ var numericObj;
5868
+ var textObj;
5869
+ var dateObj;
5870
+ var checkBoxObj;
5871
+ var radioBtnObj;
5872
+ var multiSelectObj;
5873
+ for (var i = 0; i < ddlElement.length; i++) {
5874
+ dropDownObj = getComponent(ddlElement[i], 'dropdownlist');
5875
+ if (isDisabled) {
5876
+ dropDownObj.enabled = false;
5877
+ }
5878
+ else {
5879
+ dropDownObj.enabled = true;
5880
+ }
5881
+ }
5882
+ for (var i = 0; i < numericElement.length; i++) {
5883
+ numericObj = getComponent(numericElement[i], 'numerictextbox');
5884
+ if (isDisabled) {
5885
+ numericObj.enabled = false;
5886
+ }
5887
+ else {
5888
+ numericObj.enabled = true;
5889
+ }
5890
+ }
5891
+ for (var i = 0; i < textElement.length; i++) {
5892
+ textObj = getComponent(textElement[i], 'textbox');
5893
+ if (isDisabled) {
5894
+ textObj.enabled = false;
5895
+ }
5896
+ else {
5897
+ textObj.enabled = true;
5898
+ }
5899
+ }
5900
+ for (var i = 0; i < dateElement.length; i++) {
5901
+ dateObj = getComponent(dateElement[i], 'datepicker');
5902
+ if (isDisabled) {
5903
+ dateObj.enabled = false;
5904
+ }
5905
+ else {
5906
+ dateObj.enabled = true;
5907
+ }
5908
+ }
5909
+ for (var i = 0; i < checkboxElement.length; i++) {
5910
+ checkBoxObj = getComponent(checkboxElement[i], 'checkbox');
5911
+ if (isDisabled) {
5912
+ checkBoxObj.disabled = true;
5913
+ }
5914
+ else {
5915
+ checkBoxObj.disabled = false;
5916
+ }
5917
+ }
5918
+ for (var i = 0; i < radioBtnElement.length; i++) {
5919
+ radioBtnObj = getComponent(radioBtnElement[i], 'radio');
5920
+ if (isDisabled) {
5921
+ radioBtnObj.disabled = true;
5922
+ }
5923
+ else {
5924
+ radioBtnObj.disabled = false;
5925
+ }
5926
+ }
5927
+ for (var i = 0; i < multiSelectElement.length; i++) {
5928
+ multiSelectObj = getComponent(multiSelectElement[i], 'multiselect');
5929
+ if (isDisabled) {
5930
+ multiSelectObj.enabled = false;
5931
+ }
5932
+ else {
5933
+ multiSelectObj.enabled = true;
5934
+ }
5935
+ }
5936
+ };
5177
5937
  __decorate([
5178
5938
  Event()
5179
5939
  ], QueryBuilder.prototype, "created", void 0);
@@ -5193,7 +5953,7 @@ var QueryBuilder = /** @class */ (function (_super) {
5193
5953
  Event()
5194
5954
  ], QueryBuilder.prototype, "ruleChange", void 0);
5195
5955
  __decorate([
5196
- Property({ ruleDelete: true, groupInsert: true, groupDelete: true })
5956
+ Complex({}, ShowButtons)
5197
5957
  ], QueryBuilder.prototype, "showButtons", void 0);
5198
5958
  __decorate([
5199
5959
  Property(false)
@@ -5255,6 +6015,15 @@ var QueryBuilder = /** @class */ (function (_super) {
5255
6015
  __decorate([
5256
6016
  Property(false)
5257
6017
  ], QueryBuilder.prototype, "readonly", void 0);
6018
+ __decorate([
6019
+ Property(true)
6020
+ ], QueryBuilder.prototype, "addRuleToNewGroups", void 0);
6021
+ __decorate([
6022
+ Property(false)
6023
+ ], QueryBuilder.prototype, "autoSelectField", void 0);
6024
+ __decorate([
6025
+ Property(true)
6026
+ ], QueryBuilder.prototype, "autoSelectOperator", void 0);
5258
6027
  __decorate([
5259
6028
  Property('')
5260
6029
  ], QueryBuilder.prototype, "separator", void 0);