@syncfusion/ej2-querybuilder 24.2.9 → 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 +9 -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 +1609 -159
  6. package/dist/es6/ej2-querybuilder.es2015.js.map +1 -1
  7. package/dist/es6/ej2-querybuilder.es5.js +1611 -159
  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 +895 -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
@@ -121,6 +121,9 @@ var Rule = /** @__PURE__ @class */ (function (_super) {
121
121
  __decorate([
122
122
  Property(false)
123
123
  ], Rule.prototype, "not", void 0);
124
+ __decorate([
125
+ Property(false)
126
+ ], Rule.prototype, "isLocked", void 0);
124
127
  return Rule;
125
128
  }(ChildProperty));
126
129
  /**
@@ -156,6 +159,18 @@ var ShowButtons = /** @__PURE__ @class */ (function (_super) {
156
159
  function ShowButtons() {
157
160
  return _super !== null && _super.apply(this, arguments) || this;
158
161
  }
162
+ __decorate([
163
+ Property(false)
164
+ ], ShowButtons.prototype, "cloneRule", void 0);
165
+ __decorate([
166
+ Property(false)
167
+ ], ShowButtons.prototype, "cloneGroup", void 0);
168
+ __decorate([
169
+ Property(false)
170
+ ], ShowButtons.prototype, "lockRule", void 0);
171
+ __decorate([
172
+ Property(false)
173
+ ], ShowButtons.prototype, "lockGroup", void 0);
159
174
  __decorate([
160
175
  Property(true)
161
176
  ], ShowButtons.prototype, "ruleDelete", void 0);
@@ -173,7 +188,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
173
188
  var _this = _super.call(this, options, element) || this;
174
189
  _this.isReadonly = true;
175
190
  _this.fields = { text: 'label', value: 'field' };
176
- _this.updatedRule = { not: false, condition: 'and' };
191
+ _this.updatedRule = { not: false, condition: 'and', isLocked: false };
177
192
  _this.isLocale = false;
178
193
  _this.isRefreshed = false;
179
194
  _this.isNotified = false;
@@ -184,6 +199,14 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
184
199
  _this.isDestroy = false;
185
200
  _this.isGetNestedData = false;
186
201
  _this.isCustomOprCols = [];
202
+ _this.groupCounter = 0;
203
+ _this.lockItems = [];
204
+ _this.groupIndex = -1;
205
+ _this.ruleIndex = -1;
206
+ _this.isLastGroup = false;
207
+ _this.cloneGrpBtnClick = false;
208
+ _this.isMiddleGroup = false;
209
+ _this.cloneRuleBtnClick = false;
187
210
  MultiSelect.Inject(CheckBoxSelection);
188
211
  return _this;
189
212
  }
@@ -236,6 +259,14 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
236
259
  QueryBuilder.prototype.getModuleName = function () {
237
260
  return 'query-builder';
238
261
  };
262
+ QueryBuilder.prototype.requiredModules = function () {
263
+ var modules = [];
264
+ modules.push({
265
+ member: 'query-library',
266
+ args: [this]
267
+ });
268
+ return modules;
269
+ };
239
270
  QueryBuilder.prototype.GetRootColumnName = function (field) {
240
271
  return this.separator ? field.split(this.separator)[0] : field;
241
272
  };
@@ -429,31 +460,51 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
429
460
  txtareaElem.style.height = txtareaElem.scrollHeight + 'px';
430
461
  }
431
462
  if (target.tagName === 'BUTTON' && target.className.indexOf('e-qb-toggle') < 0) {
432
- if (target.className.indexOf('e-removerule') > -1) {
433
- this.actionButton = target;
434
- this.deleteRule(target);
435
- }
436
- else if (target.className.indexOf('e-deletegroup') > -1) {
437
- this.actionButton = target;
438
- this.deleteGroup(closest(target, '.e-group-container'));
439
- }
440
- else if (target.className.indexOf('e-edit-rule') > -1) {
441
- var animation = new Animation({ duration: 1000, delay: 0 });
442
- animation.animate('.e-query-builder', { name: 'SlideLeftIn' });
443
- document.getElementById(this.element.id + '_summary_content').style.display = 'none';
444
- if (this.element.querySelectorAll('.e-group-container').length < 1) {
445
- this.addGroupElement(false, this.element, this.rule.condition, false, this.rule.not);
446
- var mRules = extend({}, this.rule, {}, true);
447
- this.setGroupRules(mRules);
448
- this.renderSummaryCollapse();
449
- }
450
- else {
451
- var groupElem = this.element.querySelector('.e-group-container');
452
- if (groupElem.querySelectorAll('.e-collapse-rule').length < 1) {
463
+ switch (true) {
464
+ case target.className.indexOf('e-removerule') > -1:
465
+ this.actionButton = target;
466
+ this.deleteRule(target);
467
+ break;
468
+ case target.className.indexOf('e-clone-rule-btn') > -1:
469
+ this.actionButton = target;
470
+ this.cloneRuleBtnClick = true;
471
+ this.ruleClone(target);
472
+ break;
473
+ case target.className.indexOf('e-lock-rule-btn') > -1:
474
+ this.actionButton = target;
475
+ this.ruleLock(target);
476
+ break;
477
+ case target.className.indexOf('e-lock-grp-btn') > -1:
478
+ this.actionButton = target;
479
+ this.groupLock(target);
480
+ break;
481
+ case target.className.indexOf('e-clone-grp-btn') > -1:
482
+ this.actionButton = target;
483
+ this.cloneGrpBtnClick = true;
484
+ this.groupClone(closest(target, '.e-group-container'));
485
+ break;
486
+ case target.className.indexOf('e-deletegroup') > -1:
487
+ this.actionButton = target;
488
+ this.deleteGroup(closest(target, '.e-group-container'));
489
+ break;
490
+ case target.className.indexOf('e-edit-rule') > -1:
491
+ var animation = new Animation({ duration: 1000, delay: 0 });
492
+ animation.animate('.e-query-builder', { name: 'SlideLeftIn' });
493
+ document.getElementById(this.element.id + '_summary_content').style.display = 'none';
494
+ if (this.element.querySelectorAll('.e-group-container').length < 1) {
495
+ this.addGroupElement(false, this.element, this.rule.condition, false, this.rule.not);
496
+ var mRules = extend({}, this.rule, {}, true);
497
+ this.setGroupRules(mRules);
453
498
  this.renderSummaryCollapse();
454
499
  }
455
- groupElem.style.display = 'block';
456
- }
500
+ else {
501
+ var groupElem = this.element.querySelector('.e-group-container');
502
+ if (groupElem.querySelectorAll('.e-collapse-rule').length < 1) {
503
+ this.renderSummaryCollapse();
504
+ }
505
+ groupElem.style.display = 'block';
506
+ }
507
+ break;
457
508
  }
458
509
  }
459
510
  else if ((target.tagName === 'LABEL' && target.parentElement.className.indexOf('e-btn-group') > -1) ||
@@ -553,7 +604,18 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
553
604
  else {
554
605
  ruleElem = this.createElement('div', { attrs: { class: 'e-rule-container' } });
555
606
  ruleElem.setAttribute('id', target.id + '_rule' + this.ruleIdCounter);
556
- ruleListElem.appendChild(ruleElem);
607
+ if (this.showButtons.cloneRule && this.cloneRuleBtnClick) {
608
+ if (this.ruleIndex < 0) {
609
+ ruleListElem.appendChild(ruleElem);
610
+ }
611
+ else {
612
+ ruleListElem.insertBefore(ruleElem, ruleListElem.children[this.ruleIndex + 1]); // added clone rule to next position
613
+ }
614
+ this.cloneRuleBtnClick = false;
615
+ }
616
+ else {
617
+ ruleListElem.appendChild(ruleElem);
618
+ }
557
619
  this.ruleIdCounter++;
558
620
  }
559
621
  if (column && column.ruleTemplate && rule) {
@@ -603,6 +665,21 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
603
665
  elem = this.ruleElem.querySelector('.e-rule-field').cloneNode(true);
604
666
  ruleElem.appendChild(elem);
605
667
  }
668
+ if (this.showButtons.lockGroup) {
669
+ removeClass(ruleElem.querySelectorAll('.e-lock-grp-btn'), 'e-button-hide');
670
+ }
671
+ if (this.showButtons.lockRule) {
672
+ removeClass(ruleElem.querySelectorAll('.e-lock-rule-btn'), 'e-button-hide');
673
+ }
674
+ if (this.showButtons.cloneGroup) {
675
+ removeClass(ruleElem.querySelectorAll('.e-clone-grp-btn'), 'e-button-hide');
676
+ }
677
+ if (this.showButtons.cloneRule) {
678
+ removeClass(ruleElem.querySelectorAll('.e-clone-rule-btn'), 'e-button-hide');
679
+ }
680
+ if (this.showButtons.ruleDelete) {
681
+ removeClass(ruleElem.querySelectorAll('.e-lock-grp-btn'), 'e-button-hide');
682
+ }
606
683
  if (column && column.ruleTemplate && rule) {
607
684
  this.renderReactTemplates();
608
685
  }
@@ -646,7 +723,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
646
723
  else {
647
724
  ruleElem = this.appendRuleElem(trgt, column, act, pId, 'field');
648
725
  ruleElem.querySelector('.e-filter-input').setAttribute('id', ruleElem.id + '_filterkey');
649
- var element = ruleElem.querySelector('button');
726
+ var element = ruleElem.querySelector('.e-rule-delete');
650
727
  if (this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical') {
651
728
  element.textContent = this.l10n.getConstant('Remove');
652
729
  addClass([element], 'e-flat');
@@ -656,8 +733,11 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
656
733
  addClass([element], 'e-round');
657
734
  addClass([element], 'e-icon-btn');
658
735
  element.setAttribute('title', this.l10n.getConstant('DeleteRule'));
659
- element = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-delete-icon' } });
660
- ruleElem.querySelector('button').appendChild(element);
736
+ var spanElement = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-delete-icon' } });
737
+ ruleElem.querySelector('.e-rule-delete').appendChild(spanElement);
738
+ }
739
+ if (!this.showButtons.ruleDelete) {
740
+ element.classList.add('e-button-hide');
661
741
  }
662
742
  }
663
743
  if (this.displayMode === 'Vertical' || this.element.className.indexOf('e-device') > -1) {
@@ -688,6 +768,9 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
688
768
  if (this.separator && rule.field) {
689
769
  ddlValue = this.GetRootColumnName(rule.field);
690
770
  }
771
+ else if (this.autoSelectField) {
772
+ ddlValue = this.GetRootColumnName(rule.field);
773
+ }
691
774
  else {
692
775
  ddlValue = this.isImportRules ? this.GetRootColumnName(rule.field) : rule.field;
693
776
  }
@@ -695,8 +778,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
695
778
  dataSource: this.columns,
696
779
  fields: this.fields, placeholder: this.l10n.getConstant('SelectField'),
697
780
  popupHeight: ((this.columns.length > 5) ? height : 'auto'), close: this.fieldClose.bind(this, ruleElem.id + '_filterkey'),
698
- change: this.changeField.bind(this), value: rule ? ddlValue : null, open: this.popupOpen.bind(this, true),
699
- cssClass: 'qb-dropdownlist'
781
+ change: this.changeField.bind(this), value: rule ? ddlValue : null, open: this.popupOpen.bind(this, true), cssClass: 'qb-dropdownlist'
700
782
  };
701
783
  if (this.fieldModel) {
702
784
  ddlField = __assign({}, ddlField, this.fieldModel);
@@ -786,12 +868,23 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
786
868
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
787
869
  var custom = rule.custom;
788
870
  if (Object.keys(rule).length) {
789
- rules.rules.push({
790
- 'field': rule.field, 'type': rule.type, 'label': rule.label, 'operator': rule.operator, value: rule.value
791
- });
792
- if (custom) {
793
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
794
- rules.rules[rules.rules.length - 1].custom = custom;
871
+ if (this.ruleIndex < 0) {
872
+ rules.rules.push({
873
+ 'field': rule.field, 'type': rule.type, 'label': rule.label, 'operator': rule.operator, value: rule.value
874
+ });
875
+ if (custom) {
876
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
877
+ rules.rules[rules.rules.length - 1].custom = custom;
878
+ }
879
+ }
880
+ else {
881
+ rules.rules.splice(this.ruleIndex + 1, 0, {
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[this.ruleIndex + 1].custom = custom;
887
+ }
795
888
  }
796
889
  }
797
890
  else {
@@ -799,6 +892,9 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
799
892
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
800
893
  newRule.custom = custom;
801
894
  }
895
+ if (this.autoSelectField) {
896
+ rule.field = newRule.field = this.rule.rules[0].field;
897
+ }
802
898
  rules.rules.push(newRule);
803
899
  }
804
900
  }
@@ -998,6 +1094,8 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
998
1094
  QueryBuilder.prototype.ruleTemplate = function () {
999
1095
  var tempElem;
1000
1096
  var clsName;
1097
+ var cloneClsName;
1098
+ var lockClsName;
1001
1099
  var ruleElem = this.createElement('div');
1002
1100
  var fieldElem = this.createElement('div', { attrs: { class: 'e-rule-field' } });
1003
1101
  tempElem = this.createElement('div', { attrs: { class: 'e-rule-filter' } });
@@ -1009,6 +1107,24 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
1009
1107
  tempElem = this.createElement('div', { attrs: { class: 'e-rule-value' } });
1010
1108
  fieldElem.appendChild(tempElem);
1011
1109
  tempElem = this.createElement('div', { attrs: { class: 'e-rule-value-delete' } });
1110
+ if (this.showButtons.cloneRule) {
1111
+ cloneClsName = 'e-clone-rule-btn e-clone-rule e-css e-btn e-small e-round e-icon-btn';
1112
+ }
1113
+ else {
1114
+ cloneClsName = 'e-clone-rule-btn e-clone-rule e-css e-btn e-small e-round e-icon-btn e-button-hide';
1115
+ }
1116
+ if (this.showButtons.lockRule) {
1117
+ lockClsName = 'e-lock-rule-btn e-lock-rule e-css e-btn e-small e-round e-icons e-icon-btn';
1118
+ }
1119
+ else {
1120
+ lockClsName = 'e-lock-rule-btn e-lock-rule e-css e-btn e-small e-round e-icons e-icon-btn e-button-hide';
1121
+ }
1122
+ var cloneRuleBtnElem = this.createElement('button', { attrs: { title: this.l10n.getConstant('CloneRule'), type: 'button', class: cloneClsName } });
1123
+ var spanElement = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-copy' } });
1124
+ cloneRuleBtnElem.appendChild(spanElement);
1125
+ var cloneLockBtnElem = this.createElement('button', { attrs: { title: this.l10n.getConstant('LockRule'), type: 'button', class: lockClsName } });
1126
+ spanElement = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-unlock' } });
1127
+ cloneLockBtnElem.appendChild(spanElement);
1012
1128
  if (this.showButtons.ruleDelete || isNullOrUndefined(this.showButtons.ruleDelete)) {
1013
1129
  clsName = 'e-removerule e-rule-delete e-css e-btn e-small';
1014
1130
  }
@@ -1016,6 +1132,8 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
1016
1132
  clsName = 'e-removerule e-rule-delete e-css e-btn e-small e-button-hide';
1017
1133
  }
1018
1134
  var delBtnElem = this.createElement('button', { attrs: { type: 'button', class: clsName } });
1135
+ tempElem.appendChild(cloneRuleBtnElem);
1136
+ tempElem.appendChild(cloneLockBtnElem);
1019
1137
  tempElem.appendChild(delBtnElem);
1020
1138
  fieldElem.appendChild(tempElem);
1021
1139
  ruleElem.appendChild(fieldElem);
@@ -1085,9 +1203,6 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
1085
1203
  button.appendTo(dltGroupBtn);
1086
1204
  dltGroupBtn.setAttribute('title', this.l10n.getConstant('DeleteGroup'));
1087
1205
  rippleEffect(dltGroupBtn, { selector: '.deletegroup' });
1088
- if (!this.headerTemplate) {
1089
- groupElem.querySelector('.e-group-action').appendChild(dltGroupBtn);
1090
- }
1091
1206
  var ruleList = target.querySelector('.e-rule-list');
1092
1207
  var childElems = ruleList.children;
1093
1208
  var grpLen = 0;
@@ -1096,20 +1211,72 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
1096
1211
  grpLen += 1;
1097
1212
  }
1098
1213
  }
1099
- ruleList.appendChild(groupElem);
1214
+ if (this.showButtons.cloneGroup && this.cloneGrpBtnClick) {
1215
+ if (this.groupIndex === (childElems.length - 1)) {
1216
+ ruleList.appendChild(groupElem);
1217
+ this.isLastGroup = true;
1218
+ }
1219
+ else {
1220
+ childElems[this.groupIndex + 1].parentNode.insertBefore(groupElem, childElems[this.groupIndex + 1]); // clone the element to nxt element
1221
+ this.isMiddleGroup = true;
1222
+ }
1223
+ }
1224
+ else {
1225
+ ruleList.appendChild(groupElem);
1226
+ }
1100
1227
  var level = this.levelColl[target.id].slice(0);
1101
1228
  level.push(grpLen);
1102
1229
  this.levelColl[groupElem.id] = level;
1230
+ if (this.groupIndex > -1) {
1231
+ this.refreshLevelColl();
1232
+ }
1103
1233
  if (!this.isImportRules) {
1104
1234
  this.isAddSuccess = true;
1105
1235
  this.addGroups([], target.id.replace(this.element.id + '_', ''));
1106
1236
  this.isAddSuccess = false;
1107
- if (isBtnClick) {
1237
+ if (isBtnClick && this.addRuleToNewGroups) {
1108
1238
  this.addRuleElement(groupElem, {});
1109
1239
  }
1110
1240
  }
1241
+ if (!this.headerTemplate) {
1242
+ var lockClsName = '';
1243
+ if (this.showButtons.cloneGroup) {
1244
+ lockClsName = 'e-clone-grp-btn e-css e-btn e-small e-round e-icons e-icon-btn';
1245
+ }
1246
+ else {
1247
+ lockClsName = 'e-clone-grp-btn e-css e-btn e-small e-round e-icons e-icon-btn e-button-hide';
1248
+ }
1249
+ var cloneBtnElem = this.createElement('button', { attrs: { title: this.l10n.getConstant('CloneGroup'), type: 'button', class: lockClsName } });
1250
+ var spanElement = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-copy' } });
1251
+ cloneBtnElem.appendChild(spanElement);
1252
+ groupElem.querySelector('.e-group-action').appendChild(cloneBtnElem);
1253
+ if (this.showButtons.lockGroup) {
1254
+ lockClsName = 'e-lock-grp-btn e-css e-btn e-small e-round e-icons e-icon-btn';
1255
+ }
1256
+ else {
1257
+ lockClsName = 'e-lock-grp-btn e-css e-btn e-small e-round e-icons e-icon-btn e-button-hide';
1258
+ }
1259
+ var lockBtnElem = this.createElement('button', { attrs: { title: this.l10n.getConstant('LockGroup'), type: 'button', class: lockClsName } });
1260
+ var lockSpanElement = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-unlock' } });
1261
+ lockBtnElem.appendChild(lockSpanElement);
1262
+ groupElem.querySelector('.e-group-action').appendChild(lockBtnElem);
1263
+ groupElem.querySelector('.e-group-action').appendChild(dltGroupBtn);
1264
+ }
1111
1265
  }
1112
1266
  else {
1267
+ if (!this.headerTemplate) {
1268
+ var lockClsName = '';
1269
+ if (this.showButtons.lockGroup) {
1270
+ lockClsName = 'e-lock-grp-btn e-css e-btn e-small e-round e-icons e-icon-btn';
1271
+ }
1272
+ else {
1273
+ lockClsName = 'e-lock-grp-btn e-css e-btn e-small e-round e-icons e-icon-btn e-button-hide';
1274
+ }
1275
+ var lockBtnElem = this.createElement('button', { attrs: { title: this.l10n.getConstant('LockGroup'), type: 'button', class: lockClsName } });
1276
+ var spanElement = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-unlock' } });
1277
+ lockBtnElem.appendChild(spanElement);
1278
+ groupElem.querySelector('.e-group-action').appendChild(lockBtnElem);
1279
+ }
1113
1280
  target.appendChild(groupElem);
1114
1281
  this.levelColl[groupElem.id] = [0];
1115
1282
  }
@@ -1445,7 +1612,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
1445
1612
  this.prevItemData = args.itemData;
1446
1613
  var fieldElem = closest(args.element, '.e-rule-filter') || closest(args.element, '.e-rule-sub-filter');
1447
1614
  var column = this.fieldMode === 'DropdownTree' ? this.getColumn(args.value[0]) : this.getColumn(args.value);
1448
- if (this.fieldMode === 'DropdownTree' && fieldElem != null) {
1615
+ if (this.fieldMode === 'DropdownTree' && fieldElem !== null) {
1449
1616
  var ddtElem = fieldElem.querySelector('.e-dropdowntree.e-control');
1450
1617
  var ddt = getComponent(ddtElem, 'dropdowntree');
1451
1618
  if (column) {
@@ -1517,7 +1684,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
1517
1684
  var filterElem = closest(ddlArgs.element, '.e-rule-filter');
1518
1685
  filterElem = filterElem ? filterElem : closest(ddlArgs.element, '.e-rule-sub-filter');
1519
1686
  var ddlObj = getComponent(ddlArgs.element, 'dropdownlist');
1520
- if (this.fieldMode === 'DropdownTree' && filterElem != null) {
1687
+ if (this.fieldMode === 'DropdownTree' && filterElem !== null) {
1521
1688
  ddlObj = getComponent(ddlArgs.element, 'dropdowntree');
1522
1689
  }
1523
1690
  var element = closest(ddlArgs.element, '.e-group-container');
@@ -1646,7 +1813,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
1646
1813
  this.GetRootColumnName(rule.field) === this.GetRootColumnName(this.previousColumn.field))) {
1647
1814
  var subField = this.selectedColumn.columns;
1648
1815
  for (var i = 0; i < subField.length; i++) {
1649
- if (rule.field === subField[i].field || rule.field.indexOf(subField[i].field) > -1) {
1816
+ if (rule.field === subField[i].field) {
1650
1817
  dropDownList.value = subField[i].field;
1651
1818
  this.selectedColumn = subField[i];
1652
1819
  subFieldValue = true;
@@ -1685,7 +1852,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
1685
1852
  rule.value = [];
1686
1853
  }
1687
1854
  }
1688
- else if (typeof rule.value === 'object' && rule.value != null) {
1855
+ else if (typeof rule.value === 'object' && rule.value !== null) {
1689
1856
  rule.value = rule.value.length > 0 ? rule.value[0] : rule.type === 'number' ? 0 : '';
1690
1857
  }
1691
1858
  if (ddlArgs.previousItemData) {
@@ -1712,6 +1879,9 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
1712
1879
  if (valElem && this.getColumn(rule.field).template) {
1713
1880
  filterElem = operatorElem.previousElementSibling;
1714
1881
  }
1882
+ if (valElem.children.length == 0) {
1883
+ filterElem = operatorElem.previousElementSibling;
1884
+ }
1715
1885
  this.changeRuleValues(filterElem, rule, tempRule, ddlArgs);
1716
1886
  }
1717
1887
  };
@@ -1742,7 +1912,9 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
1742
1912
  tempRule.type = this.fieldMode === 'DropdownTree' ? this.getColumn(fieldObj.value[0]).type :
1743
1913
  this.getColumn(fieldObj.value).type;
1744
1914
  var itemData = ddlArgs.itemData;
1745
- this.renderValues(operatorElem, itemData, ddlArgs.previousItemData, true, rule, tempRule, ddlArgs.element);
1915
+ if (ddlObj.value !== '') {
1916
+ this.renderValues(operatorElem, itemData, ddlArgs.previousItemData, true, rule, tempRule, ddlArgs.element);
1917
+ }
1746
1918
  }
1747
1919
  else {
1748
1920
  var ruleId = closest(operatorElem, '.e-rule-container').id;
@@ -1756,7 +1928,14 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
1756
1928
  }
1757
1929
  var height = (this.element.className.indexOf('e-device') > -1) ? '250px' : '200px';
1758
1930
  var value = operatorList[0].value;
1759
- value = rule ? (rule.operator !== '' ? rule.operator : value) : value;
1931
+ var ddlIdx = 0;
1932
+ if (!this.autoSelectOperator) {
1933
+ value = '';
1934
+ ddlIdx = -1;
1935
+ }
1936
+ if (this.isImportRules || (this.ruleIndex > -1 || this.groupIndex > -1)) {
1937
+ value = rule ? (rule.operator ? rule.operator : value) : value;
1938
+ }
1760
1939
  var ddlOperator = void 0;
1761
1940
  ddlOperator = {
1762
1941
  dataSource: operatorList,
@@ -1764,7 +1943,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
1764
1943
  placeholder: this.l10n.getConstant('SelectOperator'),
1765
1944
  popupHeight: ((operatorList.length > 5) ? height : 'auto'),
1766
1945
  change: this.changeField.bind(this),
1767
- index: 0,
1946
+ index: ddlIdx,
1768
1947
  value: value,
1769
1948
  open: this.popupOpen.bind(this, false)
1770
1949
  };
@@ -1778,7 +1957,12 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
1778
1957
  tempRule.type = this.selectedColumn.type;
1779
1958
  tempRule.operator = rule.operator;
1780
1959
  }
1781
- this.renderValues(operatorElem, this.selectedColumn, ddlArgs.previousItemData, false, rule, tempRule, ddlArgs.element);
1960
+ if (!isNullOrUndefined(value) && value !== '') {
1961
+ this.renderValues(operatorElem, this.selectedColumn, ddlArgs.previousItemData, false, rule, tempRule, ddlArgs.element);
1962
+ }
1963
+ else if (this.autoSelectField && this.autoSelectOperator) {
1964
+ this.renderValues(operatorElem, this.selectedColumn, ddlArgs.previousItemData, false, rule, tempRule, ddlArgs.element);
1965
+ }
1782
1966
  }
1783
1967
  }
1784
1968
  if (!this.isImportRules) {
@@ -2140,14 +2324,14 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2140
2324
  var columnData = this.getItemData(parentId);
2141
2325
  var selectedValue;
2142
2326
  var isTemplate = (typeof columnData.template === 'string');
2143
- if (this.isImportRules || this.isPublic || isTemplate) {
2327
+ if (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1 || this.isPublic || isTemplate) {
2144
2328
  selectedValue = rule.value;
2145
2329
  }
2146
2330
  else {
2147
2331
  selectedValue = this.setDefaultValue(parentId, false, false);
2148
2332
  }
2149
2333
  if ((operator === 'in' || operator === 'notin') && (this.dataColl.length || columnData.values)) {
2150
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2334
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2151
2335
  this.renderMultiSelect(columnData, parentId, idx, selectedVal, columnData.values);
2152
2336
  if (this.displayMode === 'Vertical' || this.element.className.indexOf('e-device') > -1) {
2153
2337
  ruleValElem.style.width = '100%';
@@ -2159,7 +2343,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2159
2343
  }
2160
2344
  else {
2161
2345
  if (operator === 'in' || operator === 'notin') {
2162
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2346
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2163
2347
  selectedValue = selectedVal.join(',');
2164
2348
  }
2165
2349
  var txtBox = void 0;
@@ -2179,9 +2363,9 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2179
2363
  QueryBuilder.prototype.renderNumberValue = function (parentId, rule, operator, idx, ruleValElem, itemData, length) {
2180
2364
  var columnData = this.getItemData(parentId);
2181
2365
  var isTemplate = (typeof columnData.template === 'string');
2182
- var selectedVal = (this.isImportRules || this.isPublic || isTemplate) ? rule.value : this.setDefaultValue(parentId, false, true);
2366
+ var selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1 || this.isPublic || isTemplate) ? rule.value : this.setDefaultValue(parentId, false, true);
2183
2367
  if ((operator === 'in' || operator === 'notin') && (this.dataColl.length || columnData.values)) {
2184
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2368
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2185
2369
  this.renderMultiSelect(columnData, parentId, idx, selectedVal, columnData.values);
2186
2370
  if (this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical') {
2187
2371
  ruleValElem.style.width = '100%';
@@ -2192,7 +2376,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2192
2376
  }
2193
2377
  }
2194
2378
  else if (operator === 'in' || operator === 'notin') {
2195
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2379
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2196
2380
  var selVal = selectedVal.join(',');
2197
2381
  var txtInp = void 0;
2198
2382
  txtInp = {
@@ -2465,8 +2649,8 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2465
2649
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
2466
2650
  : this.getColumn(filtObj.value);
2467
2651
  this.selectedRule = column;
2652
+ var ddlObj = getComponent(target.querySelector('input'), 'dropdownlist');
2468
2653
  if (isRender) {
2469
- var ddlObj = getComponent(target.querySelector('input'), 'dropdownlist');
2470
2654
  itemData = element.id.indexOf('operator') > -1 ? itemData : this.selectedRule;
2471
2655
  if (itemData.operators) {
2472
2656
  ddlObj.value = null;
@@ -2474,7 +2658,13 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2474
2658
  ddlObj.dataSource = itemData.operators;
2475
2659
  ddlObj.index = this.getOperatorIndex(ddlObj, rule);
2476
2660
  ddlObj.value = tempRule.operator = ddlObj.dataSource[ddlObj.index].value;
2477
- ddlObj.dataBind();
2661
+ if (!this.autoSelectOperator) {
2662
+ ddlObj.index = -1;
2663
+ tempRule.operator = ddlObj.value = '';
2664
+ }
2665
+ else {
2666
+ ddlObj.dataBind();
2667
+ }
2478
2668
  }
2479
2669
  }
2480
2670
  var operator = tempRule.operator.toString();
@@ -2507,39 +2697,41 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2507
2697
  this.validateValue(rule, closest(target, '.e-rule-container'));
2508
2698
  this.destroyControls(target);
2509
2699
  }
2510
- if (column) {
2511
- itemData.template = column.template;
2512
- }
2513
- if (itemData.template) {
2514
- addClass([target.nextElementSibling], 'e-template-value');
2515
- itemData.template = column.template;
2516
- isTempRendered = this.setColumnTemplate(itemData, parentId, column.field, itemData.value ||
2517
- operator, target, rule);
2518
- }
2519
- if (isTempRendered) {
2520
- var parentElem = target.parentElement.querySelector('.e-rule-value');
2521
- if (this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical') {
2522
- parentElem.style.width = '100%';
2523
- }
2524
- else {
2525
- parentElem.style.width = '200px';
2526
- }
2527
- }
2528
- else {
2529
- removeClass([target.nextElementSibling], 'e-template-value');
2530
- var inputLen = 1;
2531
- if (tempRule.type === 'boolean') {
2532
- inputLen = this.selectedColumn.values ? this.selectedColumn.values.length : 2;
2700
+ if (this.isImportRules || (ddlObj && ddlObj.value !== '')) {
2701
+ if (column) {
2702
+ itemData.template = column.template;
2703
+ }
2704
+ if (itemData.template) {
2705
+ addClass([target.nextElementSibling], 'e-template-value');
2706
+ itemData.template = column.template;
2707
+ isTempRendered = this.setColumnTemplate(itemData, parentId, column.field, itemData.value ||
2708
+ operator, target, rule);
2709
+ }
2710
+ if (isTempRendered) {
2711
+ var parentElem = target.parentElement.querySelector('.e-rule-value');
2712
+ if (this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical') {
2713
+ parentElem.style.width = '100%';
2714
+ }
2715
+ else {
2716
+ parentElem.style.width = '200px';
2717
+ }
2533
2718
  }
2534
2719
  else {
2535
- inputLen = (operator && operator.toLowerCase().indexOf('between') > -1) ? 2 : 1;
2536
- }
2537
- for (var i = 0; i < inputLen; i++) {
2538
- var valElem = this.createElement('input', { attrs: { type: 'text', id: parentId + '_valuekey' + i } });
2539
- target.nextElementSibling.appendChild(valElem);
2720
+ removeClass([target.nextElementSibling], 'e-template-value');
2721
+ var inputLen = 1;
2722
+ if (tempRule.type === 'boolean') {
2723
+ inputLen = this.selectedColumn.values ? this.selectedColumn.values.length : 2;
2724
+ }
2725
+ else {
2726
+ inputLen = (operator && operator.toLowerCase().indexOf('between') > -1) ? 2 : 1;
2727
+ }
2728
+ for (var i = 0; i < inputLen; i++) {
2729
+ var valElem = this.createElement('input', { attrs: { type: 'text', id: parentId + '_valuekey' + i } });
2730
+ target.nextElementSibling.appendChild(valElem);
2731
+ }
2540
2732
  }
2733
+ this.renderControls(target, itemData, rule, tempRule, isTempRendered);
2541
2734
  }
2542
- this.renderControls(target, itemData, rule, tempRule, isTempRendered);
2543
2735
  }
2544
2736
  else {
2545
2737
  var parentElem = target.parentElement.querySelector('.e-rule-value');
@@ -2973,8 +3165,8 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2973
3165
  var i;
2974
3166
  var len;
2975
3167
  var tooltip;
2976
- var popupElement;
2977
3168
  _super.prototype.destroy.call(this);
3169
+ var popupElement;
2978
3170
  element = this.element.querySelectorAll('.e-addrulegroup');
2979
3171
  len = element.length;
2980
3172
  for (i = 0; i < len; i++) {
@@ -3060,7 +3252,8 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3060
3252
  if (grouplen) {
3061
3253
  this.isPublic = true;
3062
3254
  for (var i = 0, len = groups.length; i < len; i++) {
3063
- this.updatedRule = { condition: groups[i].condition, not: groups[i].not };
3255
+ this.updatedRule = { isLocked: groups[i].isLocked, condition: groups[i].condition,
3256
+ not: groups[i].not };
3064
3257
  this.importRules(groups[i], groupElem, false, groups[i].not);
3065
3258
  }
3066
3259
  this.isPublic = false;
@@ -3068,15 +3261,27 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3068
3261
  else {
3069
3262
  var condition = 'and';
3070
3263
  var not = false;
3264
+ var isLocked = false;
3071
3265
  if (this.updatedRule) {
3072
3266
  condition = this.updatedRule.condition;
3073
3267
  not = this.updatedRule.not;
3268
+ isLocked = this.updatedRule.isLocked;
3074
3269
  }
3075
- if (this.enableNotCondition) {
3076
- rule.rules.push({ 'condition': condition, 'not': not, rules: [] });
3270
+ if (this.groupIndex < 0) {
3271
+ if (this.enableNotCondition) {
3272
+ rule.rules.push({ 'condition': condition, 'not': not, rules: [] });
3273
+ }
3274
+ else {
3275
+ rule.rules.push({ 'condition': condition, rules: [] });
3276
+ }
3077
3277
  }
3078
3278
  else {
3079
- rule.rules.push({ 'condition': condition, rules: [] });
3279
+ if (this.enableNotCondition) {
3280
+ rule.rules.splice(this.groupIndex + 1, 0, { condition: condition, not: not, rules: [], isLocked: isLocked });
3281
+ }
3282
+ else {
3283
+ rule.rules.splice(this.groupIndex + 1, 0, { condition: condition, rules: [], isLocked: isLocked });
3284
+ }
3080
3285
  }
3081
3286
  }
3082
3287
  if (!this.headerTemplate) {
@@ -3259,17 +3464,53 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3259
3464
  this.refresh();
3260
3465
  break;
3261
3466
  case 'showButtons':
3262
- if (newProp.showButtons.ruleDelete) {
3263
- removeClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3467
+ if (!isNullOrUndefined(newProp.showButtons.lockGroup)) {
3468
+ if (newProp.showButtons.lockGroup) {
3469
+ removeClass(this.element.querySelectorAll('.e-lock-grp-btn'), 'e-button-hide');
3470
+ }
3471
+ else {
3472
+ addClass(this.element.querySelectorAll('.e-lock-grp-btn'), 'e-button-hide');
3473
+ }
3264
3474
  }
3265
- else {
3266
- addClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3475
+ if (!isNullOrUndefined(newProp.showButtons.lockRule)) {
3476
+ if (newProp.showButtons.lockRule) {
3477
+ removeClass(this.element.querySelectorAll('.e-lock-rule-btn'), 'e-button-hide');
3478
+ }
3479
+ else {
3480
+ addClass(this.element.querySelectorAll('.e-lock-rule-btn'), 'e-button-hide');
3481
+ }
3267
3482
  }
3268
- if (newProp.showButtons.groupDelete) {
3269
- removeClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3483
+ if (!isNullOrUndefined(newProp.showButtons.cloneGroup)) {
3484
+ if (newProp.showButtons.cloneGroup) {
3485
+ removeClass(this.element.querySelectorAll('.e-clone-grp-btn'), 'e-button-hide');
3486
+ }
3487
+ else {
3488
+ addClass(this.element.querySelectorAll('.e-clone-grp-btn'), 'e-button-hide');
3489
+ }
3270
3490
  }
3271
- else {
3272
- addClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3491
+ if (!isNullOrUndefined(newProp.showButtons.cloneRule)) {
3492
+ if (newProp.showButtons.cloneRule) {
3493
+ removeClass(this.element.querySelectorAll('.e-clone-rule-btn'), 'e-button-hide');
3494
+ }
3495
+ else {
3496
+ addClass(this.element.querySelectorAll('.e-clone-rule-btn'), 'e-button-hide');
3497
+ }
3498
+ }
3499
+ if (!isNullOrUndefined(newProp.showButtons.ruleDelete)) {
3500
+ if (newProp.showButtons.ruleDelete) {
3501
+ removeClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3502
+ }
3503
+ else {
3504
+ addClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3505
+ }
3506
+ }
3507
+ if (!isNullOrUndefined(newProp.showButtons.groupDelete)) {
3508
+ if (newProp.showButtons.groupDelete) {
3509
+ removeClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3510
+ }
3511
+ else {
3512
+ addClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3513
+ }
3273
3514
  }
3274
3515
  break;
3275
3516
  case 'cssClass':
@@ -3346,8 +3587,11 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3346
3587
  this.element.id = this.element.id || getUniqueID('ej2-querybuilder');
3347
3588
  this.defaultLocale = {
3348
3589
  StartsWith: 'Starts With',
3590
+ DoesNotStartWith: 'Does Not Start With',
3349
3591
  EndsWith: 'Ends With',
3592
+ DoesNotEndWith: 'Does Not End With',
3350
3593
  Contains: 'Contains',
3594
+ DoesNotContain: 'Does Not Contain',
3351
3595
  NotLike: 'Not Like',
3352
3596
  Like: 'Like',
3353
3597
  Equal: 'Equal',
@@ -3381,7 +3625,13 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3381
3625
  IsNotNull: 'Is Not Null',
3382
3626
  True: 'true',
3383
3627
  False: 'false',
3384
- AddButton: 'Add Group/Condition'
3628
+ AddButton: 'Add Group/Condition',
3629
+ CloneGroup: 'Clone Group',
3630
+ LockGroup: 'Lock Group',
3631
+ CloneRule: 'Clone Rule',
3632
+ LockRule: 'Lock Rule',
3633
+ UnlockRule: 'Unlock Rule',
3634
+ UnlockGroup: 'Unlock Group'
3385
3635
  };
3386
3636
  this.l10n = new L10n('querybuilder', this.defaultLocale, this.locale);
3387
3637
  this.intl = new Internationalization(this.locale);
@@ -3394,8 +3644,11 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3394
3644
  this.customOperators = {
3395
3645
  stringOperator: [
3396
3646
  { value: 'startswith', key: this.l10n.getConstant('StartsWith') },
3647
+ { value: 'notstartswith', key: this.l10n.getConstant('DoesNotStartWith') },
3397
3648
  { value: 'endswith', key: this.l10n.getConstant('EndsWith') },
3649
+ { value: 'notendswith', key: this.l10n.getConstant('DoesNotEndWith') },
3398
3650
  { value: 'contains', key: this.l10n.getConstant('Contains') },
3651
+ { value: 'notcontains', key: this.l10n.getConstant('DoesNotContain') },
3399
3652
  { value: 'equal', key: this.l10n.getConstant('Equal') },
3400
3653
  { value: 'notequal', key: this.l10n.getConstant('NotEqual') },
3401
3654
  { value: 'in', key: this.l10n.getConstant('In') },
@@ -3409,7 +3662,9 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3409
3662
  { value: 'greaterthanorequal', key: this.l10n.getConstant('GreaterThanOrEqual') },
3410
3663
  { value: 'lessthan', key: this.l10n.getConstant('LessThan') },
3411
3664
  { value: 'lessthanorequal', key: this.l10n.getConstant('LessThanOrEqual') },
3412
- { value: 'notequal', key: this.l10n.getConstant('NotEqual') }
3665
+ { value: 'notequal', key: this.l10n.getConstant('NotEqual') },
3666
+ { value: 'between', key: this.l10n.getConstant('Between') },
3667
+ { value: 'notbetween', key: this.l10n.getConstant('NotBetween') }
3413
3668
  ],
3414
3669
  booleanOperator: [
3415
3670
  { value: 'equal', key: this.l10n.getConstant('Equal') },
@@ -3734,6 +3989,10 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3734
3989
  this.setProperties({ rule: rule }, true);
3735
3990
  rule = this.getRuleCollection(this.rule, false);
3736
3991
  this.importRules(this.rule, this.element.querySelector('.e-group-container'), true, this.rule.not, isRoot);
3992
+ if (rule.isLocked) {
3993
+ var lockGrpTarget = this.element.querySelector('.e-group-container').querySelector('.e-lock-grp-btn');
3994
+ this.groupLock(lockGrpTarget);
3995
+ }
3737
3996
  this.isImportRules = false;
3738
3997
  };
3739
3998
  QueryBuilder.prototype.keyBoardHandler = function (e) {
@@ -3829,7 +4088,8 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3829
4088
  rule.value !== undefined)) || (customObj && customObj.isQuestion)) {
3830
4089
  var condition = rule.condition;
3831
4090
  rule = {
3832
- 'label': rule.label, 'field': rule.field, 'operator': rule.operator, 'type': rule.type, 'value': rule.value
4091
+ 'label': rule.label, 'field': rule.field, 'operator': rule.operator, 'type': rule.type, 'value': rule.value,
4092
+ 'isLocked': rule.isLocked
3833
4093
  };
3834
4094
  if (condition) {
3835
4095
  rule.condition = condition;
@@ -3838,6 +4098,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3838
4098
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
3839
4099
  rule.custom = customObj;
3840
4100
  }
4101
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3841
4102
  if ((rule.operator === 'in' || rule.operator === 'notin') && rule.value && rule.value.length === 0) {
3842
4103
  rule = {};
3843
4104
  }
@@ -3863,10 +4124,10 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3863
4124
  }
3864
4125
  else {
3865
4126
  if (this.enableNotCondition) {
3866
- rule = { 'condition': rule.condition, 'rules': rule.rules, 'not': rule.not };
4127
+ rule = { 'condition': rule.condition, 'rules': rule.rules, 'not': rule.not, 'isLocked': rule.isLocked };
3867
4128
  }
3868
4129
  else {
3869
- rule = { 'condition': rule.condition, 'rules': rule.rules };
4130
+ rule = { 'condition': rule.condition, 'rules': rule.rules, 'isLocked': rule.isLocked };
3870
4131
  }
3871
4132
  if (customObj) {
3872
4133
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -4031,11 +4292,20 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4031
4292
  var ruleValue;
4032
4293
  var ignoreCase = false;
4033
4294
  var column;
4034
- var ignoreOper = ['notcontains', 'notstartswith', 'notendswith'];
4035
4295
  if (!ruleColl) {
4036
4296
  return pred;
4037
4297
  }
4038
4298
  for (var i = 0, len = ruleColl.length; i < len; i++) {
4299
+ var operator = ruleColl[i].operator;
4300
+ if (operator === 'notstartswith') {
4301
+ operator = 'doesnotstartwith';
4302
+ }
4303
+ else if (operator === 'notendswith') {
4304
+ operator = 'doesnotendwith';
4305
+ }
4306
+ else if (operator === 'notcontains') {
4307
+ operator = 'doesnotcontain';
4308
+ }
4039
4309
  var keys = Object.keys(ruleColl[i]);
4040
4310
  ignoreCase = false;
4041
4311
  if (keys.indexOf('rules') > -1 && ruleColl[i].rules) {
@@ -4054,7 +4324,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4054
4324
  }
4055
4325
  }
4056
4326
  }
4057
- else if (!isNullOrUndefined(ruleColl[i].operator) && !isNullOrUndefined(ruleColl[i].operator.length)) {
4327
+ else if (!isNullOrUndefined(operator) && !isNullOrUndefined(operator.length)) {
4058
4328
  var oper = ruleColl[i].operator.toLowerCase();
4059
4329
  var isDateFilter = false;
4060
4330
  var dateOperColl = ['equal', 'notequal', 'greaterthan', 'greaterthanorequal', 'lessthan', 'lessthanorequal'];
@@ -4085,23 +4355,20 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4085
4355
  }
4086
4356
  if (i === 0) {
4087
4357
  if (isDateFilter || (oper.indexOf('in') > -1 || oper.indexOf('between') > -1 || oper.indexOf('null') > -1 ||
4088
- oper.indexOf('empty') > -1) && oper.indexOf('contains') < 0) {
4358
+ oper.indexOf('empty') > -1) && (oper.indexOf('contain') < 0)) {
4089
4359
  pred = isDateFilter ? this.datePredicate(ruleColl[i], ruleValue) :
4090
4360
  this.arrayPredicate(ruleColl[i]);
4091
4361
  }
4092
4362
  else {
4093
4363
  var value = ruleValue;
4094
- if (value !== '' && ignoreOper.indexOf(oper) < 0) {
4095
- pred = new Predicate(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4364
+ if (value !== '') {
4365
+ pred = new Predicate(ruleColl[i].field, operator, ruleValue, ignoreCase);
4096
4366
  }
4097
4367
  }
4098
4368
  }
4099
4369
  else {
4100
- if (ignoreOper.indexOf(oper) > -1) {
4101
- continue;
4102
- }
4103
4370
  if (isDateFilter || (oper.indexOf('in') > -1 || oper.indexOf('between') > -1 ||
4104
- oper.indexOf('null') > -1 || oper.indexOf('empty') > -1) && oper.indexOf('contains') < 0) {
4371
+ oper.indexOf('null') > -1 || oper.indexOf('empty') > -1) && oper.indexOf('contain') < 0) {
4105
4372
  pred = isDateFilter ? this.datePredicate(ruleColl[i], ruleValue, pred, rule.condition) :
4106
4373
  this.arrayPredicate(ruleColl[i], pred, rule.condition);
4107
4374
  }
@@ -4110,19 +4377,19 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4110
4377
  var value = ruleValue;
4111
4378
  if (pred && value !== '') {
4112
4379
  pred
4113
- = pred.and(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4380
+ = pred.and(ruleColl[i].field, operator, ruleValue, ignoreCase);
4114
4381
  }
4115
4382
  else if (value !== '') {
4116
- pred = new Predicate(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4383
+ pred = new Predicate(ruleColl[i].field, operator, ruleValue, ignoreCase);
4117
4384
  }
4118
4385
  }
4119
4386
  else {
4120
4387
  var value = ruleValue;
4121
4388
  if (pred && value !== '') {
4122
- pred = pred.or(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4389
+ pred = pred.or(ruleColl[i].field, operator, ruleValue, ignoreCase);
4123
4390
  }
4124
4391
  else if (value !== '') {
4125
- pred = new Predicate(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4392
+ pred = new Predicate(ruleColl[i].field, operator, ruleValue, ignoreCase);
4126
4393
  }
4127
4394
  }
4128
4395
  }
@@ -4402,15 +4669,28 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4402
4669
  for (var i = 0, len = ruleColl.length; i < len; i++) {
4403
4670
  var keys = Object.keys(ruleColl[i]);
4404
4671
  if (!isNullOrUndefined(ruleColl[i].rules) && keys.indexOf('rules') > -1 && (ruleColl[i].rules.length !== 0)) {
4672
+ if (this.element.querySelectorAll('.e-group-container').length > this.maxGroupCount) {
4673
+ return null;
4674
+ }
4405
4675
  parentElem = this.renderGroup(ruleColl[i], ruleColl[i].condition, parentElem, ruleColl[i].not);
4406
4676
  parentElem = this.importRules(ruleColl[i], parentElem, true);
4407
4677
  }
4408
4678
  else {
4409
4679
  this.renderRule(ruleColl[i], parentElem);
4410
4680
  }
4681
+ if (!isNullOrUndefined(ruleColl[i].rules) && ruleColl[i].isLocked) {
4682
+ var lockGrpTarget = parentElem.querySelector('.e-rule-list').children[i].querySelector('.e-lock-grp-btn');
4683
+ this.groupLock(lockGrpTarget);
4684
+ }
4685
+ if (isNullOrUndefined(ruleColl[i].rules) && ruleColl[i].isLocked) {
4686
+ var lockRuleTarget = parentElem.querySelector('.e-rule-list').children[i].querySelector('.e-lock-rule-btn');
4687
+ this.ruleLock(lockRuleTarget);
4688
+ }
4411
4689
  }
4412
4690
  }
4413
- parentElem = closest(parentElem, '.e-rule-list');
4691
+ if (parentElem) {
4692
+ parentElem = closest(parentElem, '.e-rule-list');
4693
+ }
4414
4694
  if (parentElem) {
4415
4695
  parentElem = closest(parentElem, '.e-group-container');
4416
4696
  }
@@ -4419,7 +4699,20 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4419
4699
  QueryBuilder.prototype.renderGroup = function (rule, condition, parentElem, not, isRoot) {
4420
4700
  this.addGroupElement(true, parentElem, condition, false, not, isRoot, rule); //Child group
4421
4701
  var element = parentElem.querySelectorAll('.e-group-container');
4422
- return element[element.length - 1];
4702
+ var cloneElem = parentElem.querySelector('.e-rule-list').children;
4703
+ if (this.showButtons.cloneGroup && this.cloneGrpBtnClick && this.isMiddleGroup) {
4704
+ this.isMiddleGroup = false;
4705
+ this.cloneGrpBtnClick = false;
4706
+ return cloneElem[this.groupIndex + 1]; // group added in the middle
4707
+ }
4708
+ else if (this.showButtons.cloneGroup && this.cloneGrpBtnClick && this.isLastGroup) {
4709
+ this.isLastGroup = false;
4710
+ this.cloneGrpBtnClick = false;
4711
+ return cloneElem[cloneElem.length - 1]; // group added in the end
4712
+ }
4713
+ else {
4714
+ return element[element.length - 1];
4715
+ }
4423
4716
  };
4424
4717
  QueryBuilder.prototype.renderRule = function (rule, parentElem) {
4425
4718
  if (parentElem.className.indexOf('e-group-container') > -1) {
@@ -4618,15 +4911,19 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4618
4911
  valueStr += rule.value ? '("%' + rule.value + '%")' : '(' + rule.value + ')';
4619
4912
  }
4620
4913
  else {
4621
- if (rule.type === 'number' || typeof rule.value === 'boolean' || rule.value === null) {
4914
+ if (rule.type === 'number' || typeof rule.value === 'boolean' ||
4915
+ (rule.value === null && (rule.operator.toString().indexOf('empty') < -1))) {
4622
4916
  valueStr += rule.value;
4623
4917
  }
4918
+ else if (rule.operator.toString().indexOf('empty') > -1) {
4919
+ valueStr += '""';
4920
+ }
4624
4921
  else {
4625
4922
  valueStr += '"' + rule.value + '"';
4626
4923
  }
4627
4924
  }
4628
4925
  }
4629
- if (rule.operator.toString().indexOf('null') > -1 || (rule.operator.toString().indexOf('empty') > -1)) {
4926
+ if (rule.operator.toString().indexOf('null') > -1) {
4630
4927
  if (enableEscape) {
4631
4928
  rule.field = '`' + rule.field + '`';
4632
4929
  }
@@ -4638,6 +4935,13 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4638
4935
  queryStr += rule.field + ' ' + ruleOpertor;
4639
4936
  }
4640
4937
  else {
4938
+ var custOper = ruleOpertor;
4939
+ if (rule.operator === 'isempty') {
4940
+ custOper = '=';
4941
+ }
4942
+ else if (rule.operator === 'isnotempty') {
4943
+ custOper = '!=';
4944
+ }
4641
4945
  if (enableEscape) {
4642
4946
  rule.field = '`' + rule.field + '`';
4643
4947
  }
@@ -4646,7 +4950,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4646
4950
  rule.field = '"' + rule.field + '"';
4647
4951
  }
4648
4952
  }
4649
- queryStr += rule.field + ' ' + ruleOpertor + ' ' + valueStr;
4953
+ queryStr += rule.field + ' ' + custOper + ' ' + valueStr;
4650
4954
  }
4651
4955
  if (rule.condition && rule.condition !== '') {
4652
4956
  condition = rule.condition;
@@ -4676,7 +4980,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4676
4980
  * Sets the rules from the sql query.
4677
4981
  *
4678
4982
  * @param {string} sqlString - 'sql String' to be passed to set the rule.
4679
- * @param {boolean} sqlLocale - Set `true` if Localization for Sql query.
4983
+ * @param {boolean} sqlLocale - Optional. Set `true` if Localization for Sql query.
4680
4984
  * @returns {void}
4681
4985
  */
4682
4986
  QueryBuilder.prototype.setRulesFromSql = function (sqlString, sqlLocale) {
@@ -4708,15 +5012,163 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4708
5012
  *
4709
5013
  * @param {RuleModel} rule - 'rule' to be passed to get the sql.
4710
5014
  * @param {boolean} allowEscape - Set `true` if it exclude the escape character.
4711
- * @param {boolean} sqlLocale - Set `true` if Localization for Sql query.
4712
- * @returns {object} - Sql query from rules.
5015
+ * @param {boolean} sqlLocale - Set `true` if Localization for Sql query.
5016
+ * @returns {string} - Sql query from rules.
4713
5017
  */
4714
5018
  QueryBuilder.prototype.getSqlFromRules = function (rule, allowEscape, sqlLocale) {
4715
5019
  if (!rule) {
4716
5020
  rule = this.getValidRules();
4717
5021
  }
4718
5022
  rule = this.getRuleCollection(rule, false);
4719
- return this.getSqlString(this.getValidRules(rule), allowEscape, null, sqlLocale).replace(/"/g, '\'');
5023
+ var sqlString = this.getSqlString(this.getValidRules(rule), allowEscape, null, sqlLocale).replace(/"/g, '\'');
5024
+ return sqlString;
5025
+ };
5026
+ /**
5027
+ * Gets the parameter SQL query from rules.
5028
+ *
5029
+ * @param {RuleModel} rule – Specify the rule to be passed to get the parameter sql string.
5030
+ * @returns {ParameterizedSql} – Parameterized SQL query from rules.
5031
+ */
5032
+ QueryBuilder.prototype.getParameterizedSql = function (rule) {
5033
+ if (!rule) {
5034
+ rule = this.getValidRules();
5035
+ }
5036
+ var obj = { sql: null };
5037
+ this.notify('query-library', { prop: 'getParameterSql', onPropertyChange: false, value: { rule: rule, obj: obj } });
5038
+ return obj['sql'];
5039
+ };
5040
+ /**
5041
+ * Sets the rules from the parameter sql query.
5042
+ *
5043
+ * @param { ParameterizedSql} sqlQuery – Specifies the parameter SQL to be passed to set the rule and load it to the query builder.
5044
+ * @returns {void}
5045
+ */
5046
+ QueryBuilder.prototype.setParameterizedSql = function (sqlQuery) {
5047
+ var obj = { sql: null };
5048
+ this.notify('query-library', { prop: 'convertParamSqlToSql', onPropertyChange: false, value: { sql: sqlQuery, obj: obj } });
5049
+ var sql = obj['sql'];
5050
+ if (sql) {
5051
+ sql = sql.replace(/`/g, '');
5052
+ var ruleModel = this.getRulesFromSql(sql);
5053
+ this.setRules({ condition: ruleModel.condition, not: ruleModel.not, rules: ruleModel.rules });
5054
+ }
5055
+ };
5056
+ /**
5057
+ * Gets the named parameter SQL query from rules.
5058
+ *
5059
+ * @param {RuleModel} rule – Specify the rule to be passed to get the named parameter SQL string.
5060
+ * @returns {ParameterizedNamedSql} – Parameterized Named SQL query from rules.
5061
+ */
5062
+ QueryBuilder.prototype.getParameterizedNamedSql = function (rule) {
5063
+ if (!rule) {
5064
+ rule = this.getValidRules();
5065
+ }
5066
+ var obj = { sql: null };
5067
+ this.notify('query-library', { prop: 'getNamedParameterSql', onPropertyChange: false, value: { rule: rule, obj: obj } });
5068
+ return obj['sql'];
5069
+ };
5070
+ /**
5071
+ * Sets the rules from the named parameter SQL query.
5072
+ *
5073
+ * @param { ParameterizedNamedSql } sqlQuery – Specifies the named parameter SQL to be passed to set the rule and load it to the query builder.
5074
+ * @returns {void}
5075
+ */
5076
+ QueryBuilder.prototype.setParameterizedNamedSql = function (sqlQuery) {
5077
+ var obj = { sql: null };
5078
+ this.notify('query-library', { prop: 'convertNamedParamSqlToSql', onPropertyChange: false, value: { sql: sqlQuery, obj: obj } });
5079
+ var sql = obj['sql'];
5080
+ if (sql) {
5081
+ sql = sql.replace(/`/g, '');
5082
+ var ruleModel = this.getRulesFromSql(sql);
5083
+ this.setRules({ condition: ruleModel.condition, not: ruleModel.not, rules: ruleModel.rules });
5084
+ }
5085
+ };
5086
+ /**
5087
+ * Set the rules from Mongo query.
5088
+ *
5089
+ * @param {string} mongoQuery - 'sql String' to be passed to get the rule.
5090
+ * @param {boolean} mongoLocale - Set `true` if Localization for Mongo query.
5091
+ * @returns {void}
5092
+ */
5093
+ QueryBuilder.prototype.setMongoQuery = function (mongoQuery, mongoLocale) {
5094
+ this.rule = { condition: 'and', not: false, rules: [] };
5095
+ this.notify('query-library', { prop: 'mongoParser', onPropertyChange: false, value: { mongoQuery: JSON.parse(mongoQuery), rule: this.rule, mongoLocale: mongoLocale } });
5096
+ };
5097
+ /**
5098
+ * Gets the Mongo query from rules.
5099
+ *
5100
+ * @param {RuleModel} rule - 'rule' to be passed to get the sql.
5101
+ * @returns {object} - Sql query from rules.
5102
+ */
5103
+ QueryBuilder.prototype.getMongoQuery = function (rule) {
5104
+ if (!rule) {
5105
+ rule = this.getValidRules();
5106
+ }
5107
+ var obj = { mongoQuery: null };
5108
+ this.notify('query-library', { prop: 'getMongoFromRules', onPropertyChange: false, value: { rule: rule, mongoQuery: '', obj: obj } });
5109
+ return obj['mongoQuery'];
5110
+ };
5111
+ /**
5112
+ * Clones the rule based on the rule ID to the specific group.
5113
+ *
5114
+ * @param {string} ruleID - Specifies the ruleID that needs to be cloned.
5115
+ * @param {string} groupID - Specifies the groupID in which the rule to be cloned.
5116
+ * @param {number} index - Specifies the index to insert the cloned rule inside the group.
5117
+ * @returns {void}
5118
+ */
5119
+ QueryBuilder.prototype.cloneRule = function (ruleID, groupID, index) {
5120
+ var getRule = this.getRule(ruleID.replace(this.element.id + '_', ''));
5121
+ groupID = groupID.replace(this.element.id + '_', '');
5122
+ this.ruleIndex = index;
5123
+ this.cloneRuleBtnClick = true;
5124
+ this.showButtons.cloneRule = true;
5125
+ this.addRules([{
5126
+ 'label': getRule.label, 'field': getRule.field, 'type': getRule.type, 'operator': getRule.operator,
5127
+ 'value': getRule.value
5128
+ }], groupID);
5129
+ this.ruleIndex = -1;
5130
+ this.cloneRuleBtnClick = false;
5131
+ this.showButtons.cloneRule = false;
5132
+ };
5133
+ /**
5134
+ * Clones the group based on the group ID to the specific group.
5135
+ *
5136
+ * @param {string} groupID - Specifies the groupID that needs to be cloned.
5137
+ * @param {string} parentGroupID - Specifies the parentGroupID in which the group to be cloned.
5138
+ * @param {number} index - Specifies the index to insert the cloned group inside the parent group.
5139
+ * @returns {void}
5140
+ */
5141
+ QueryBuilder.prototype.cloneGroup = function (groupID, parentGroupID, index) {
5142
+ parentGroupID = parentGroupID.replace(this.element.id + '_', '');
5143
+ var group = this.getGroup(parentGroupID);
5144
+ groupID = groupID.replace(this.element.id + '_', '');
5145
+ this.groupIndex = index;
5146
+ this.cloneGrpBtnClick = true;
5147
+ this.showButtons.cloneGroup = true;
5148
+ this.addGroups([{ 'condition': group.condition, 'not': group.not, 'rules': group.rules }], groupID);
5149
+ this.groupIndex = -1;
5150
+ this.cloneGrpBtnClick = false;
5151
+ this.showButtons.cloneGroup = false;
5152
+ };
5153
+ /**
5154
+ * Locks the rule based on the rule ID.
5155
+ *
5156
+ * @param {string} ruleID - Specifies the ruleID that needs to be locked.
5157
+ * @returns {void}
5158
+ */
5159
+ QueryBuilder.prototype.lockRule = function (ruleID) {
5160
+ var target = document.getElementById(ruleID).querySelectorAll('.e-lock-rule-btn')[0];
5161
+ this.ruleLock(target);
5162
+ };
5163
+ /**
5164
+ * Locks the group based on the group ID
5165
+ *
5166
+ * @param {string} groupID - Specifies the groupID that needs to be locked.
5167
+ * @returns {void}
5168
+ */
5169
+ QueryBuilder.prototype.lockGroup = function (groupID) {
5170
+ var target = document.getElementById(groupID).querySelectorAll('.e-lock-grp-btn')[0];
5171
+ this.groupLock(target);
4720
5172
  };
4721
5173
  QueryBuilder.prototype.sqlParser = function (sqlString, sqlLocale) {
4722
5174
  var st = 0;
@@ -4918,13 +5370,13 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4918
5370
  for (var i = 0; i < localeOperator.length; i++) {
4919
5371
  if (this.sqlOperators[localeOperator[i]] === operator.toUpperCase()) {
4920
5372
  if (value && value.indexOf('%') === 0 && value[value.length - 1] === '%') {
4921
- return (localeOperator[i] === 'notcontains') ? 'notcontains' : 'contains';
5373
+ return (operator.toUpperCase() === 'NOT LIKE') ? 'notcontains' : 'contains';
4922
5374
  }
4923
5375
  else if (value && value.indexOf('%') !== 0 && value.indexOf('%') === value.length - 1) {
4924
- return (localeOperator[i] === 'notstartswith') ? 'notstartswith' : 'startswith';
5376
+ return (operator.toUpperCase() === 'NOT LIKE') ? 'notstartswith' : 'startswith';
4925
5377
  }
4926
5378
  else if (value && value.indexOf('%') === 0 && value.indexOf('%') !== value.length - 1) {
4927
- return (localeOperator[i] === 'notendswith') ? 'notendswith' : 'endswith';
5379
+ return (operator.toUpperCase() === 'NOT LIKE') ? 'notendswith' : 'endswith';
4928
5380
  }
4929
5381
  return localeOperator[i];
4930
5382
  }
@@ -5109,6 +5561,14 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
5109
5561
  }
5110
5562
  else if (parser[i + 1][0] === 'Operators') {
5111
5563
  rule.operator = this.getOperator(parser[i + 2][1], parser[i + 1][1], sqlLocale);
5564
+ if (rule.operator == "equal" && parser[i + 2][0] === "String" && parser[i + 2][1] === "''") {
5565
+ rule.operator = "isempty";
5566
+
5567
+ }
5568
+ else if (rule.operator == "notequal" && parser[i + 2][0] === "String" && parser[i + 2][1] === "''") {
5569
+ rule.operator = "isnotempty";
5570
+
5571
+ }
5112
5572
  if (parser[i + 2][0] === 'Number') {
5113
5573
  rule.type = 'number';
5114
5574
  rule.value = Number(parser[i + 2][1]);
@@ -5165,35 +5625,330 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
5165
5625
  }
5166
5626
  return rules;
5167
5627
  };
5168
- __decorate([
5169
- Event()
5170
- ], QueryBuilder.prototype, "created", void 0);
5171
- __decorate([
5172
- Event()
5173
- ], QueryBuilder.prototype, "actionBegin", void 0);
5174
- __decorate([
5175
- Event()
5176
- ], QueryBuilder.prototype, "beforeChange", void 0);
5177
- __decorate([
5178
- Event()
5179
- ], QueryBuilder.prototype, "change", void 0);
5180
- __decorate([
5181
- Event()
5182
- ], QueryBuilder.prototype, "dataBound", void 0);
5183
- __decorate([
5184
- Event()
5185
- ], QueryBuilder.prototype, "ruleChange", void 0);
5186
- __decorate([
5187
- Property({ ruleDelete: true, groupInsert: true, groupDelete: true })
5188
- ], QueryBuilder.prototype, "showButtons", void 0);
5189
- __decorate([
5190
- Property(false)
5191
- ], QueryBuilder.prototype, "summaryView", void 0);
5192
- __decorate([
5193
- Property(false)
5194
- ], QueryBuilder.prototype, "allowValidation", void 0);
5195
- __decorate([
5196
- Property('Default')
5628
+ /**
5629
+ * Clone the Group
5630
+ *
5631
+ * @param {Element | string} target - 'target' to be passed to clone the group.
5632
+ * @returns {void}
5633
+ */
5634
+ QueryBuilder.prototype.groupClone = function (target) {
5635
+ var groupElem = target.closest('.e-rule-list').closest('.e-group-container');
5636
+ var targetGrpId;
5637
+ var groupId;
5638
+ if (typeof target === 'string') {
5639
+ groupId = this.element.id + '_' + target;
5640
+ target = document.getElementById(groupId);
5641
+ }
5642
+ else {
5643
+ targetGrpId = target.id.replace(this.element.id + '_', '');
5644
+ groupId = groupElem.id.replace(this.element.id + '_', '');
5645
+ }
5646
+ var group = this.getGroup(targetGrpId);
5647
+ this.groupIndex = Array.prototype.indexOf.call(target.closest('.e-rule-list').children, target.closest('.e-group-container'));
5648
+ this.addGroups([{ 'condition': group.condition, 'not': group.not, 'rules': group.rules }], groupId);
5649
+ this.groupIndex = -1;
5650
+ };
5651
+ QueryBuilder.prototype.ruleClone = function (target) {
5652
+ var ruleElem = closest(target, '.e-rule-container');
5653
+ var groupElem = target.closest('.e-rule-list').closest('.e-group-container');
5654
+ var getRule = this.getRule(target);
5655
+ var groupId = groupElem.id.replace(this.element.id + '_', '');
5656
+ var ruleElemColl = groupElem.querySelectorAll('.e-rule-container');
5657
+ for (var i = 0, iLen = ruleElemColl.length; i < iLen; i++) {
5658
+ if (ruleElem.id === ruleElemColl[i].id) {
5659
+ this.ruleIndex = i;
5660
+ }
5661
+ }
5662
+ this.addRules([{ 'label': getRule.label, 'field': getRule.field, 'type': getRule.type, 'operator': getRule.operator,
5663
+ 'value': getRule.value }], groupId);
5664
+ this.ruleIndex = -1;
5665
+ };
5666
+ QueryBuilder.prototype.ruleLock = function (target) {
5667
+ var ruleElem = closest(target, '.e-rule-container');
5668
+ var rule = this.getRule(ruleElem.id.replace(this.element.id + '_', ''));
5669
+ if (ruleElem.classList.contains('e-disable')) {
5670
+ rule.isLocked = false;
5671
+ this.lockItems = this.lockItems.filter(function (lockItem) { return lockItem !== ruleElem.id; });
5672
+ ruleElem.classList.remove('e-disable');
5673
+ this.disableRuleControls(target, ruleElem, false);
5674
+ target.children[0].classList.add('e-unlock');
5675
+ target.children[0].classList.remove('e-lock');
5676
+ target.setAttribute('title', this.l10n.getConstant('LockRule'));
5677
+ }
5678
+ else {
5679
+ rule.isLocked = true;
5680
+ if (this.lockItems.indexOf(ruleElem.id) < 0) {
5681
+ this.lockItems.splice(this.lockItems.length - 1, 0, ruleElem.id);
5682
+ }
5683
+ ruleElem.classList.add('e-disable');
5684
+ this.disableRuleControls(target, ruleElem, true);
5685
+ target.children[0].classList.add('e-lock');
5686
+ target.children[0].classList.remove('e-unlock');
5687
+ target.setAttribute('title', this.l10n.getConstant('UnlockRule'));
5688
+ }
5689
+ };
5690
+ QueryBuilder.prototype.groupLock = function (target) {
5691
+ var groupElem = closest(target, '.e-group-container');
5692
+ var group = this.getGroup(groupElem.id.replace(this.element.id + '_', ''));
5693
+ var isRoot = groupElem.id.indexOf('group0') > -1;
5694
+ if (groupElem.classList.contains('e-disable')) {
5695
+ if (isRoot) {
5696
+ var newGroup = {};
5697
+ newGroup.condition = group.condition;
5698
+ newGroup.not = group.not;
5699
+ newGroup.isLocked = false;
5700
+ this.setProperties({ rule: newGroup }, true);
5701
+ }
5702
+ else {
5703
+ group.isLocked = false;
5704
+ }
5705
+ this.lockItems = this.lockItems.filter(function (lockItem) { return lockItem !== groupElem.id; });
5706
+ groupElem.classList.remove('e-disable');
5707
+ this.disableHeaderControls(target, groupElem, false);
5708
+ target.children[0].classList.add('e-unlock');
5709
+ target.children[0].classList.remove('e-lock');
5710
+ target.setAttribute('title', this.l10n.getConstant('LockGroup'));
5711
+ this.updateLockItems();
5712
+ }
5713
+ else {
5714
+ if (isRoot) {
5715
+ var newGroup = {};
5716
+ newGroup.condition = group.condition;
5717
+ newGroup.not = group.not;
5718
+ newGroup.isLocked = true;
5719
+ this.setProperties({ rule: newGroup }, true);
5720
+ }
5721
+ else {
5722
+ group.isLocked = true;
5723
+ }
5724
+ if (this.lockItems.indexOf(groupElem.id) < 0) {
5725
+ this.lockItems.splice(this.lockItems.length - 1, 0, groupElem.id);
5726
+ }
5727
+ groupElem.classList.add('e-disable');
5728
+ this.disableHeaderControls(target, groupElem, true);
5729
+ target.children[0].classList.add('e-lock');
5730
+ target.children[0].classList.remove('e-unlock');
5731
+ target.setAttribute('title', this.l10n.getConstant('UnlockGroup'));
5732
+ }
5733
+ };
5734
+ QueryBuilder.prototype.updateLockItems = function () {
5735
+ for (var i = 0; i < this.lockItems.length; i++) {
5736
+ var idColl = this.lockItems[i].split('_');
5737
+ if (idColl.length > 2) {
5738
+ var ruleElem = this.element.querySelector('#' + this.lockItems[i]);
5739
+ var target = ruleElem.querySelector('.e-lock-rule-btn');
5740
+ ruleElem = closest(target, '.e-rule-container');
5741
+ if (!ruleElem.classList.contains('e-disable')) {
5742
+ this.ruleLock(target);
5743
+ }
5744
+ }
5745
+ else {
5746
+ var groupElem = this.element.querySelector('#' + this.lockItems[i]);
5747
+ var target = groupElem.querySelector('.e-lock-grp-btn');
5748
+ groupElem = closest(target, '.e-group-container');
5749
+ if (!groupElem.classList.contains('e-disable')) {
5750
+ this.groupLock(target);
5751
+ }
5752
+ }
5753
+ }
5754
+ };
5755
+ QueryBuilder.prototype.disableHeaderControls = function (target, groupElem, isDisabled) {
5756
+ var andElem = groupElem.querySelectorAll('.e-btngroup-and');
5757
+ var orElem = groupElem.querySelectorAll('.e-btngroup-or');
5758
+ var notElem = groupElem.querySelectorAll('.e-qb-toggle');
5759
+ var addElem = groupElem.querySelectorAll('.e-add-btn');
5760
+ var deleteGrpElem = groupElem.querySelectorAll('.e-deletegroup');
5761
+ var lockElem = groupElem.querySelectorAll('.e-lock-grp-btn');
5762
+ var cloneElem = groupElem.querySelectorAll('.e-clone-grp-btn');
5763
+ var groupContElem = groupElem.querySelectorAll('.e-group-container');
5764
+ for (var i = 0; i < andElem.length; i++) {
5765
+ if (isDisabled) {
5766
+ if (groupContElem[i] && groupContElem[i].classList.contains('e-disable')) {
5767
+ groupContElem[i].classList.add('e-disable');
5768
+ }
5769
+ andElem[i].disabled = true;
5770
+ orElem[i].disabled = true;
5771
+ addElem[i].disabled = true;
5772
+ if (notElem[i]) {
5773
+ notElem[i].disabled = true;
5774
+ }
5775
+ if (deleteGrpElem[i]) {
5776
+ deleteGrpElem[i].disabled = true;
5777
+ }
5778
+ if (cloneElem[i]) {
5779
+ cloneElem[i].disabled = true;
5780
+ }
5781
+ andElem[i].parentElement.classList.add('e-disabled');
5782
+ if (lockElem[i] !== target) {
5783
+ lockElem[i].disabled = true;
5784
+ lockElem[i].children[0].classList.remove('e-unlock');
5785
+ lockElem[i].children[0].classList.add('e-lock');
5786
+ }
5787
+ }
5788
+ else {
5789
+ if (groupContElem[i]) {
5790
+ groupContElem[i].classList.remove('e-disable');
5791
+ }
5792
+ andElem[i].disabled = false;
5793
+ orElem[i].disabled = false;
5794
+ addElem[i].disabled = false;
5795
+ lockElem[i].disabled = false;
5796
+ if (notElem[i]) {
5797
+ notElem[i].disabled = false;
5798
+ }
5799
+ if (deleteGrpElem[i]) {
5800
+ deleteGrpElem[i].disabled = false;
5801
+ }
5802
+ if (cloneElem[i]) {
5803
+ cloneElem[i].disabled = false;
5804
+ }
5805
+ andElem[i].parentElement.classList.remove('e-disabled');
5806
+ lockElem[i].children[0].classList.remove('e-lock');
5807
+ lockElem[i].children[0].classList.add('e-unlock');
5808
+ }
5809
+ }
5810
+ this.disableRuleControls(target, groupElem, isDisabled);
5811
+ };
5812
+ QueryBuilder.prototype.disableRuleControls = function (target, groupElem, isDisabled) {
5813
+ var ddlElement = groupElem.querySelectorAll('.e-control.e-dropdownlist');
5814
+ var numericElement = groupElem.querySelectorAll('.e-control.e-numerictextbox');
5815
+ var textElement = groupElem.querySelectorAll('.e-control.e-textbox');
5816
+ var dateElement = groupElem.querySelectorAll('.e-control.e-datepicker');
5817
+ var checkboxElement = groupElem.querySelectorAll('.e-control.e-checkbox');
5818
+ var radioBtnElement = groupElem.querySelectorAll('.e-control.e-radio');
5819
+ var multiSelectElement = groupElem.querySelectorAll('.e-control.e-multiselect');
5820
+ var deleteElem = groupElem.querySelectorAll('.e-rule-delete');
5821
+ var lockElem = groupElem.querySelectorAll('.e-lock-rule');
5822
+ var cloneElem = groupElem.querySelectorAll('.e-clone-rule');
5823
+ var ruleElem = groupElem.querySelectorAll('.e-rule-container');
5824
+ for (var i = 0; i < deleteElem.length; i++) {
5825
+ if (isDisabled) {
5826
+ if (ruleElem[i] && ruleElem[i].classList.contains('e-disable')) {
5827
+ ruleElem[i].classList.add('e-disable');
5828
+ }
5829
+ deleteElem[i].disabled = true;
5830
+ if (cloneElem[i]) {
5831
+ cloneElem[i].disabled = true;
5832
+ }
5833
+ if (lockElem[i] !== target) {
5834
+ lockElem[i].disabled = true;
5835
+ lockElem[i].children[0].classList.remove('e-unlock');
5836
+ lockElem[i].children[0].classList.add('e-lock');
5837
+ }
5838
+ }
5839
+ else {
5840
+ if (ruleElem[i]) {
5841
+ ruleElem[i].classList.remove('e-disable');
5842
+ }
5843
+ if (cloneElem[i]) {
5844
+ cloneElem[i].disabled = false;
5845
+ }
5846
+ deleteElem[i].disabled = false;
5847
+ lockElem[i].disabled = false;
5848
+ lockElem[i].children[0].classList.remove('e-lock');
5849
+ lockElem[i].children[0].classList.add('e-unlock');
5850
+ }
5851
+ }
5852
+ var dropDownObj;
5853
+ var numericObj;
5854
+ var textObj;
5855
+ var dateObj;
5856
+ var checkBoxObj;
5857
+ var radioBtnObj;
5858
+ var multiSelectObj;
5859
+ for (var i = 0; i < ddlElement.length; i++) {
5860
+ dropDownObj = getComponent(ddlElement[i], 'dropdownlist');
5861
+ if (isDisabled) {
5862
+ dropDownObj.enabled = false;
5863
+ }
5864
+ else {
5865
+ dropDownObj.enabled = true;
5866
+ }
5867
+ }
5868
+ for (var i = 0; i < numericElement.length; i++) {
5869
+ numericObj = getComponent(numericElement[i], 'numerictextbox');
5870
+ if (isDisabled) {
5871
+ numericObj.enabled = false;
5872
+ }
5873
+ else {
5874
+ numericObj.enabled = true;
5875
+ }
5876
+ }
5877
+ for (var i = 0; i < textElement.length; i++) {
5878
+ textObj = getComponent(textElement[i], 'textbox');
5879
+ if (isDisabled) {
5880
+ textObj.enabled = false;
5881
+ }
5882
+ else {
5883
+ textObj.enabled = true;
5884
+ }
5885
+ }
5886
+ for (var i = 0; i < dateElement.length; i++) {
5887
+ dateObj = getComponent(dateElement[i], 'datepicker');
5888
+ if (isDisabled) {
5889
+ dateObj.enabled = false;
5890
+ }
5891
+ else {
5892
+ dateObj.enabled = true;
5893
+ }
5894
+ }
5895
+ for (var i = 0; i < checkboxElement.length; i++) {
5896
+ checkBoxObj = getComponent(checkboxElement[i], 'checkbox');
5897
+ if (isDisabled) {
5898
+ checkBoxObj.disabled = true;
5899
+ }
5900
+ else {
5901
+ checkBoxObj.disabled = false;
5902
+ }
5903
+ }
5904
+ for (var i = 0; i < radioBtnElement.length; i++) {
5905
+ radioBtnObj = getComponent(radioBtnElement[i], 'radio');
5906
+ if (isDisabled) {
5907
+ radioBtnObj.disabled = true;
5908
+ }
5909
+ else {
5910
+ radioBtnObj.disabled = false;
5911
+ }
5912
+ }
5913
+ for (var i = 0; i < multiSelectElement.length; i++) {
5914
+ multiSelectObj = getComponent(multiSelectElement[i], 'multiselect');
5915
+ if (isDisabled) {
5916
+ multiSelectObj.enabled = false;
5917
+ }
5918
+ else {
5919
+ multiSelectObj.enabled = true;
5920
+ }
5921
+ }
5922
+ };
5923
+ __decorate([
5924
+ Event()
5925
+ ], QueryBuilder.prototype, "created", void 0);
5926
+ __decorate([
5927
+ Event()
5928
+ ], QueryBuilder.prototype, "actionBegin", void 0);
5929
+ __decorate([
5930
+ Event()
5931
+ ], QueryBuilder.prototype, "beforeChange", void 0);
5932
+ __decorate([
5933
+ Event()
5934
+ ], QueryBuilder.prototype, "change", void 0);
5935
+ __decorate([
5936
+ Event()
5937
+ ], QueryBuilder.prototype, "dataBound", void 0);
5938
+ __decorate([
5939
+ Event()
5940
+ ], QueryBuilder.prototype, "ruleChange", void 0);
5941
+ __decorate([
5942
+ Complex({}, ShowButtons)
5943
+ ], QueryBuilder.prototype, "showButtons", void 0);
5944
+ __decorate([
5945
+ Property(false)
5946
+ ], QueryBuilder.prototype, "summaryView", void 0);
5947
+ __decorate([
5948
+ Property(false)
5949
+ ], QueryBuilder.prototype, "allowValidation", void 0);
5950
+ __decorate([
5951
+ Property('Default')
5197
5952
  ], QueryBuilder.prototype, "fieldMode", void 0);
5198
5953
  __decorate([
5199
5954
  Property([])
@@ -5246,6 +6001,15 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
5246
6001
  __decorate([
5247
6002
  Property(false)
5248
6003
  ], QueryBuilder.prototype, "readonly", void 0);
6004
+ __decorate([
6005
+ Property(true)
6006
+ ], QueryBuilder.prototype, "addRuleToNewGroups", void 0);
6007
+ __decorate([
6008
+ Property(false)
6009
+ ], QueryBuilder.prototype, "autoSelectField", void 0);
6010
+ __decorate([
6011
+ Property(true)
6012
+ ], QueryBuilder.prototype, "autoSelectOperator", void 0);
5249
6013
  __decorate([
5250
6014
  Property('')
5251
6015
  ], QueryBuilder.prototype, "separator", void 0);
@@ -5258,6 +6022,694 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
5258
6022
  return QueryBuilder;
5259
6023
  }(Component));
5260
6024
 
6025
+ var QueryLibrary = /** @__PURE__ @class */ (function () {
6026
+ function QueryLibrary(parent) {
6027
+ this.parent = parent;
6028
+ this.addEventListener();
6029
+ }
6030
+ QueryLibrary.prototype.destroy = function () {
6031
+ if (this.parent.isDestroyed) {
6032
+ return;
6033
+ }
6034
+ this.removeEventListener();
6035
+ };
6036
+ QueryLibrary.prototype.addEventListener = function () {
6037
+ if (this.parent.isDestroyed) {
6038
+ return;
6039
+ }
6040
+ this.parent.on('query-library', this.queryLibrary, this);
6041
+ this.parent.on('destroyed', this.destroy, this);
6042
+ };
6043
+ QueryLibrary.prototype.removeEventListener = function () {
6044
+ this.parent.off('query-library', this.queryLibrary);
6045
+ this.parent.off('destroyed', this.destroy);
6046
+ };
6047
+ QueryLibrary.prototype.queryLibrary = function (args) {
6048
+ switch (args.prop) {
6049
+ case 'getMongoFromRules':
6050
+ args.value['obj']['mongoQuery'] = this.getMongoFromRules(args.value['rule'], args.value['mongoQuery']);
6051
+ break;
6052
+ case 'mongoParser':
6053
+ this.mongoParser(args.value['mongoQuery'], args.value['rule'], args.value['mongoLocale']);
6054
+ break;
6055
+ case 'getParameterSql':
6056
+ args.value['obj']['sql'] = this.getParameterSql(args.value['rule']);
6057
+ break;
6058
+ case 'getNamedParameterSql':
6059
+ args.value['obj']['sql'] = this.getNamedParameterSql(args.value['rule']);
6060
+ break;
6061
+ case 'convertParamSqlToSql':
6062
+ args.value['obj']['sql'] = this.convertParamSqlToSql(args.value['sql']);
6063
+ break;
6064
+ case 'convertNamedParamSqlToSql':
6065
+ args.value['obj']['sql'] = this.convertNamedParamSqlToSql(args.value['sql']);
6066
+ break;
6067
+ }
6068
+ };
6069
+ QueryLibrary.prototype.getMongoFromRules = function (rule, mongoQuery) {
6070
+ mongoQuery = '{';
6071
+ if (rule.condition === 'or') {
6072
+ mongoQuery += '"$or":[';
6073
+ mongoQuery = this.convertMongoQuery(rule.rules, mongoQuery) + ']';
6074
+ }
6075
+ else {
6076
+ mongoQuery += '"$and":[';
6077
+ mongoQuery = this.convertMongoQuery(rule.rules, mongoQuery) + ']';
6078
+ }
6079
+ mongoQuery += '}';
6080
+ return mongoQuery;
6081
+ };
6082
+ QueryLibrary.prototype.getOperatorFromMongoOperator = function (operator) {
6083
+ var operatorValue;
6084
+ switch (operator) {
6085
+ case '$ne':
6086
+ operatorValue = 'notequal';
6087
+ break;
6088
+ case '$gt':
6089
+ operatorValue = 'greaterthan';
6090
+ break;
6091
+ case '$gte':
6092
+ operatorValue = 'greaterthanorequal';
6093
+ break;
6094
+ case '$lt':
6095
+ operatorValue = 'lessthan';
6096
+ break;
6097
+ case '$lte':
6098
+ operatorValue = 'lessthanorequal';
6099
+ break;
6100
+ case '$nin':
6101
+ operatorValue = 'notin';
6102
+ break;
6103
+ }
6104
+ return operatorValue;
6105
+ };
6106
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6107
+ QueryLibrary.prototype.convertMongoQuery = function (rules, mongoQuery) {
6108
+ var _this = this;
6109
+ var i = 0;
6110
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6111
+ rules.forEach(function (item) {
6112
+ i++;
6113
+ mongoQuery += '{';
6114
+ if (item.rules !== undefined) {
6115
+ if (item.condition === 'or') {
6116
+ mongoQuery += ' "$or":[';
6117
+ mongoQuery = _this.convertMongoQuery(item.rules, mongoQuery) + ']';
6118
+ }
6119
+ else {
6120
+ mongoQuery += ' "$and":[';
6121
+ mongoQuery = _this.convertMongoQuery(item.rules, mongoQuery) + ']';
6122
+ }
6123
+ }
6124
+ var itVal = item.type === 'string' && item.operator !== 'in' && item.operator !== 'notin' && item.value && item.value.trim() !== '' ? item.value.replace(/'/g, '\\') : '';
6125
+ if (item.type === 'string' && (item.operator === 'in' || item.operator === 'notin') && item.value && item.value.length === 1) {
6126
+ itVal = item.value[0].replace(/'/g, '\\');
6127
+ }
6128
+ var field = item.field ? item.field.substring(0) : '';
6129
+ switch (item.operator) {
6130
+ case 'contains':
6131
+ mongoQuery += '"' + field + '":{"$regex":"' + itVal + '"}';
6132
+ break;
6133
+ case 'notcontains':
6134
+ mongoQuery += '"' + field + '":{"$not":{"$regex":"' + item.value + '"}}';
6135
+ break;
6136
+ case 'startswith':
6137
+ mongoQuery += '"' + field + '":{"$regex":"^' + itVal + '"}';
6138
+ break;
6139
+ case 'notstartswith':
6140
+ mongoQuery += '"' + field + '":{"$not":{"$regex":"^' + item.value + '"}}';
6141
+ break;
6142
+ case 'endswith':
6143
+ mongoQuery += '"' + field + '":{"$regex":"' + itVal + '$"}';
6144
+ break;
6145
+ case 'notendswith':
6146
+ mongoQuery += '"' + field + '":{"$not":{"$regex":"' + item.value + '$"}}';
6147
+ break;
6148
+ case 'isnull':
6149
+ mongoQuery += '"' + field + '": null';
6150
+ break;
6151
+ case 'isnotnull':
6152
+ mongoQuery += '"' + field + '":{"$ne": null}';
6153
+ break;
6154
+ case 'isempty':
6155
+ mongoQuery += '"' + field + '": ""';
6156
+ break;
6157
+ case 'isnotempty':
6158
+ mongoQuery += '"' + field + '":{"$ne": ""}';
6159
+ break;
6160
+ case 'equal':
6161
+ if (item.type === 'string') {
6162
+ mongoQuery += '"' + field + '":"' + itVal + '"';
6163
+ }
6164
+ else if (item.type === 'date') {
6165
+ mongoQuery += '"' + field + '":"' + item.value + '"';
6166
+ }
6167
+ else if (item.type === 'boolean') {
6168
+ mongoQuery += '"' + field + '":' + item.value + '';
6169
+ }
6170
+ else {
6171
+ mongoQuery += '"' + field + '":' + item.value + '';
6172
+ }
6173
+ break;
6174
+ case 'notequal':
6175
+ if (item.type === 'string') {
6176
+ mongoQuery += '"' + field + '":{"$ne":"' + itVal + '"}';
6177
+ }
6178
+ else if (item.type === 'date') {
6179
+ mongoQuery += '"' + field + '":{"$ne":"' + item.value + '"}';
6180
+ }
6181
+ else {
6182
+ mongoQuery += '"' + field + '":{"$ne":' + item.value + '}';
6183
+ }
6184
+ break;
6185
+ case 'in':
6186
+ if (item.type === 'string') {
6187
+ if (item.value.length > 1) {
6188
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6189
+ var s = item.value.map(function (x, j) { return (j < item.value.length ? "\"" + x + "\"" : ''); }).toString();
6190
+ s = s.endsWith(',') ? s.substring(0, s.length - 1) : s;
6191
+ mongoQuery += '"' + field + '": { "$in": [' + s + ']}';
6192
+ }
6193
+ else {
6194
+ mongoQuery += '"' + field + '": { "$in": ["' + itVal + '"]}';
6195
+ }
6196
+ }
6197
+ else if (item.type === 'number') {
6198
+ if (item.value.length > 1) {
6199
+ mongoQuery += '"' + field + '": { "$in": [' + item.value.toString() + ']}';
6200
+ }
6201
+ else {
6202
+ mongoQuery += '"' + field + '": { "$in": [' + item.value + ']}';
6203
+ }
6204
+ }
6205
+ break;
6206
+ case 'notin':
6207
+ if (item.type === 'string') {
6208
+ if (item.value.length > 1) {
6209
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6210
+ var s = item.value.map(function (x, j) { return (j < item.value.length ? "\"" + x + "\"" : ''); }).toString();
6211
+ s = s.endsWith(',') ? s.substring(0, s.length - 1) : s;
6212
+ mongoQuery += '"' + field + '": { "$nin": [' + s + ']}';
6213
+ }
6214
+ else {
6215
+ mongoQuery += '"' + field + '": { "$nin": ["' + itVal + '"]}';
6216
+ }
6217
+ }
6218
+ else if (item.type === 'number') {
6219
+ if (item.value.length > 1) {
6220
+ mongoQuery += '"' + field + '": { "$nin": [' + item.value.toString() + ']}';
6221
+ }
6222
+ else {
6223
+ mongoQuery += '"' + field + '": { "$nin": [' + item.value + ']}';
6224
+ }
6225
+ }
6226
+ break;
6227
+ case 'greaterthan':
6228
+ if (item.type === 'number') {
6229
+ mongoQuery += '"' + field + '": { "$gt": ' + item.value + '}';
6230
+ }
6231
+ else {
6232
+ mongoQuery += '"' + field + '": { "$gt": "' + item.value + '"}';
6233
+ }
6234
+ break;
6235
+ case 'greaterthanorequal':
6236
+ if (item.type === 'number') {
6237
+ mongoQuery += '"' + field + '": { "$gte": ' + item.value + '}';
6238
+ }
6239
+ else {
6240
+ mongoQuery += '"' + field + '": { "$gte": "' + item.value + '"}';
6241
+ }
6242
+ break;
6243
+ case 'between':
6244
+ if (item.type === 'number') {
6245
+ mongoQuery += '"' + field + '": {"$gte":' + item.value[0] + ', "$lte":' + item.value[1] + '}';
6246
+ }
6247
+ else {
6248
+ mongoQuery += '"' + field + '": {"$gte": "' + item.value[0] + '", "$lte": "' + item.value[1] + '"}';
6249
+ }
6250
+ break;
6251
+ case 'notbetween':
6252
+ if (item.type === 'number') {
6253
+ mongoQuery += '"$or":[{"' + field + '": {"$lt":' + item.value[0] + '}}, {"' + field + '": {"$gt":' + item.value[1] + '}}]';
6254
+ }
6255
+ else {
6256
+ mongoQuery += '"$or":[{"' + field + '": {"$lt": "' + item.value[0] + '"}}, {"' + field + '": {"$gt": "' + item.value[1] + '"}}]';
6257
+ }
6258
+ break;
6259
+ case 'lessthan':
6260
+ if (item.type === 'number') {
6261
+ mongoQuery += '"' + field + '": { "$lt": ' + item.value + '}';
6262
+ }
6263
+ else {
6264
+ mongoQuery += '"' + field + '": { "$lt": "' + item.value + '"}';
6265
+ }
6266
+ break;
6267
+ case 'lessthanorequal':
6268
+ if (item.type === 'number') {
6269
+ mongoQuery += '"' + field + '": { "$lte": ' + item.value + '}';
6270
+ }
6271
+ else {
6272
+ mongoQuery += '"' + field + '": { "$lte": "' + item.value + '"}';
6273
+ }
6274
+ break;
6275
+ }
6276
+ mongoQuery += '}';
6277
+ if (rules.length !== i) {
6278
+ mongoQuery += ',';
6279
+ }
6280
+ });
6281
+ return mongoQuery;
6282
+ };
6283
+ QueryLibrary.prototype.mongoParser = function (mongoQuery, rule, mongoLocale) {
6284
+ var mongoList;
6285
+ if (Object.keys(mongoQuery).indexOf('$and') > -1) {
6286
+ mongoList = mongoQuery['$and'];
6287
+ rule.condition = 'and';
6288
+ }
6289
+ else if (Object.keys(mongoQuery).indexOf('$or') > -1) {
6290
+ mongoList = mongoQuery['$or'];
6291
+ rule.condition = 'or';
6292
+ }
6293
+ rule.rules = [];
6294
+ this.mongoRecursion(mongoList, rule.rules, mongoLocale);
6295
+ };
6296
+ QueryLibrary.prototype.mongoRecursion = function (mongoList, rules, mongoLocale) {
6297
+ var operatorValue;
6298
+ var type;
6299
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6300
+ var stringValue;
6301
+ var key;
6302
+ var betweenValue;
6303
+ var condition;
6304
+ var value;
6305
+ var subRules;
6306
+ var rule;
6307
+ var keyObj;
6308
+ var ruleValue;
6309
+ for (var i = 0, len = mongoList.length; i < len; i++) {
6310
+ var betweenOperatorArray = [];
6311
+ var inOperatorArray = [];
6312
+ condition = Object.keys(mongoList[i])[0];
6313
+ value = mongoList[i][condition];
6314
+ if (condition === '$and') {
6315
+ if (this.parent.enableNotCondition) {
6316
+ subRules = { condition: condition.replace('$', ''), rules: [], not: false };
6317
+ }
6318
+ else {
6319
+ subRules = { condition: condition.replace('$', ''), rules: [] };
6320
+ }
6321
+ rules.push(subRules);
6322
+ this.mongoRecursion(mongoList[i][condition], rules[rules.length - 1].rules, mongoLocale);
6323
+ }
6324
+ else if (condition === '$or') {
6325
+ var notBetween = void 0;
6326
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, max-len
6327
+ var innerObject = [];
6328
+ var keys = [];
6329
+ var firstKey = [];
6330
+ var secondKey = [];
6331
+ var innerKeys = [];
6332
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, max-len
6333
+ var firstValue = [];
6334
+ var secondValue = [];
6335
+ var innerFirstValue = [];
6336
+ var innerSecondValue = [];
6337
+ if (Array.isArray(value) && value.length === 2) {
6338
+ keys = Object.keys(value);
6339
+ innerFirstValue = value[keys[0]];
6340
+ innerSecondValue = value[keys[1]];
6341
+ if (typeof innerFirstValue === 'object') {
6342
+ innerObject = Object.keys(innerFirstValue)[0];
6343
+ innerKeys = Object.keys(innerFirstValue[Object.keys(innerFirstValue)[0]]);
6344
+ firstKey = innerKeys[0];
6345
+ secondKey = Object.keys(innerSecondValue[Object.keys(innerSecondValue)[0]])[0];
6346
+ if (firstKey === '$lt' && secondKey === '$gt') {
6347
+ operatorValue = 'notbetween';
6348
+ // eslint-disable-next-line security/detect-object-injection
6349
+ firstValue = innerFirstValue[innerObject][firstKey];
6350
+ // eslint-disable-next-line security/detect-object-injection
6351
+ secondValue = innerSecondValue[innerObject][secondKey];
6352
+ type = typeof firstValue === 'number' ? 'number' : 'date';
6353
+ ruleValue = [firstValue, secondValue];
6354
+ rule = { field: innerObject, label: innerObject, value: ruleValue, operator: operatorValue, type: type };
6355
+ rules.push(rule);
6356
+ notBetween = true;
6357
+ }
6358
+ }
6359
+ }
6360
+ if (!notBetween) {
6361
+ if (this.parent.enableNotCondition) {
6362
+ subRules = { condition: condition.replace('$', ''), rules: [], not: false };
6363
+ }
6364
+ else {
6365
+ subRules = { condition: condition.replace('$', ''), rules: [] };
6366
+ }
6367
+ rules.push(subRules);
6368
+ this.mongoRecursion(mongoList[i][condition], rules[rules.length - 1].rules, mongoLocale);
6369
+ }
6370
+ }
6371
+ else {
6372
+ value = mongoList[i][condition];
6373
+ if (value === null) { // isnull operator
6374
+ operatorValue = 'isnull';
6375
+ }
6376
+ if (typeof value === 'boolean') { // boolean type values
6377
+ operatorValue = 'equal';
6378
+ type = 'boolean';
6379
+ ruleValue = value;
6380
+ }
6381
+ if (typeof (value) === 'number') {
6382
+ ruleValue = value;
6383
+ type = 'number';
6384
+ operatorValue = 'equal';
6385
+ }
6386
+ else if (typeof (value) === 'object' && value !== null) {
6387
+ keyObj = Object.keys(value);
6388
+ for (var i_1 = 0; i_1 < keyObj.length; i_1++) {
6389
+ key = keyObj[i_1];
6390
+ stringValue = (value)[keyObj[i_1]];
6391
+ if (key === '$ne' && isNullOrUndefined(stringValue)) { // not null operator
6392
+ operatorValue = 'isnotnull';
6393
+ ruleValue = null;
6394
+ }
6395
+ if (key === '$ne' && typeof stringValue === 'boolean') { // not equal operator for boolean
6396
+ operatorValue = 'notequal';
6397
+ ruleValue = stringValue;
6398
+ type = 'boolean';
6399
+ }
6400
+ if (keyObj.length >= 2 && keyObj[i_1]) {
6401
+ if (typeof (stringValue) == 'object') { // between and notbetween operators
6402
+ operatorValue = 'notbetween';
6403
+ condition = Object.keys(stringValue)[0];
6404
+ betweenValue = [Object.keys(stringValue[condition])[0]];
6405
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6406
+ betweenOperatorArray.push(stringValue[condition][betweenValue]);
6407
+ type = 'number';
6408
+ }
6409
+ else {
6410
+ operatorValue = 'between';
6411
+ betweenOperatorArray.push(stringValue);
6412
+ }
6413
+ if (typeof (stringValue) === 'number') {
6414
+ type = 'number';
6415
+ }
6416
+ }
6417
+ else if (typeof (stringValue) === 'object' && stringValue !== null) { // "in" and "notin" operator
6418
+ if (key === '$not' && Object.keys(stringValue)[0] === '$regex') {
6419
+ if (stringValue['$regex'].indexOf('^') > -1) {
6420
+ operatorValue = 'notstartswith';
6421
+ ruleValue = stringValue['$regex'].replace('^', '');
6422
+ }
6423
+ else if (stringValue['$regex'].indexOf('$') > -1) {
6424
+ operatorValue = 'notendswith';
6425
+ ruleValue = stringValue['$regex'].replace('$', '');
6426
+ }
6427
+ else {
6428
+ operatorValue = 'notcontains';
6429
+ ruleValue = stringValue['$regex'];
6430
+ }
6431
+ }
6432
+ else {
6433
+ operatorValue = key === '$in' ? 'in' : 'notin';
6434
+ inOperatorArray = stringValue;
6435
+ type = typeof (stringValue[0]) === 'number' ? 'number' : 'string';
6436
+ }
6437
+ }
6438
+ else if (typeof (stringValue) === 'number') { // number type values
6439
+ operatorValue = this.getOperatorFromMongoOperator(key);
6440
+ type = 'number';
6441
+ ruleValue = stringValue;
6442
+ }
6443
+ if (typeof (stringValue) === 'string') { // string type values
6444
+ if (key === '$regex') {
6445
+ operatorValue = 'contains';
6446
+ ruleValue = stringValue;
6447
+ type = 'string';
6448
+ }
6449
+ if (key === '$ne') { // not equal
6450
+ if (stringValue !== null && stringValue.length > 0 && isNaN(Date.parse(stringValue))) {
6451
+ operatorValue = 'notequal';
6452
+ ruleValue = stringValue;
6453
+ }
6454
+ else if (isNullOrUndefined(stringValue)) { // is not null operator
6455
+ operatorValue = 'isnotnull';
6456
+ ruleValue = stringValue;
6457
+ }
6458
+ else if (stringValue === '') { // is not empty operator
6459
+ operatorValue = 'isnotempty';
6460
+ ruleValue = stringValue;
6461
+ }
6462
+ type = 'string';
6463
+ }
6464
+ if (stringValue.indexOf('^') > -1) {
6465
+ operatorValue = 'startswith';
6466
+ ruleValue = stringValue.replace('^', '');
6467
+ type = 'string';
6468
+ }
6469
+ if (stringValue.indexOf('$') > -1 && key !== '$not') {
6470
+ operatorValue = 'endswith';
6471
+ ruleValue = stringValue.replace('$', '');
6472
+ type = 'string';
6473
+ }
6474
+ if (!isNaN(Date.parse(stringValue))) { // Date type operators
6475
+ operatorValue = operatorValue || this.getOperatorFromMongoOperator(key);
6476
+ type = 'date';
6477
+ ruleValue = stringValue;
6478
+ }
6479
+ }
6480
+ }
6481
+ }
6482
+ else if (value && typeof (value) === 'string' && !isNaN(Date.parse(value))) {
6483
+ operatorValue = 'equal';
6484
+ ruleValue = value;
6485
+ type = 'date';
6486
+ }
6487
+ else if (typeof (value) === 'string' && value !== '' && value !== 'true' && value !== 'false') {
6488
+ operatorValue = 'equal';
6489
+ ruleValue = value;
6490
+ type = 'string';
6491
+ }
6492
+ else if (typeof (value) === 'string' && value === '') {
6493
+ operatorValue = 'isempty';
6494
+ ruleValue = value;
6495
+ type = 'string';
6496
+ }
6497
+ if (betweenOperatorArray && betweenOperatorArray.length > 1) { // between opertor value
6498
+ rule = { field: condition, label: condition, value: betweenOperatorArray, operator: operatorValue, type: type };
6499
+ }
6500
+ else if (inOperatorArray && inOperatorArray.length > 1) { // in operator value
6501
+ rule = { field: condition, label: condition, value: inOperatorArray, operator: operatorValue, type: type };
6502
+ }
6503
+ else {
6504
+ rule = { field: condition, label: condition, value: ruleValue, operator: operatorValue, type: type };
6505
+ }
6506
+ rules.push(rule);
6507
+ operatorValue = '';
6508
+ }
6509
+ }
6510
+ };
6511
+ QueryLibrary.prototype.convertParamSqlToSql = function (sql) {
6512
+ var paramSql = sql.sql;
6513
+ var paramValues = sql.params;
6514
+ var parts = paramSql.split('?');
6515
+ var normalSql = parts[0];
6516
+ for (var i = 0; i < paramValues.length; i++) {
6517
+ normalSql += (typeof (paramValues[i]) === 'string' ? "'" + paramValues[i] + "'" + parts[i + 1] : paramValues[i] + parts[i + 1]);
6518
+ }
6519
+ if (normalSql.length >= 2 && normalSql[0] === '(' && normalSql[normalSql.length - 1] === ')') {
6520
+ normalSql = normalSql.slice(1, -1);
6521
+ }
6522
+ normalSql = normalSql.replace(/!= ''(?! =)/g, 'IS NOT EMPTY').replace(/= ''/g, 'IS EMPTY');
6523
+ return normalSql;
6524
+ };
6525
+ QueryLibrary.prototype.convertNamedParamSqlToSql = function (sql) {
6526
+ var namedParamSql = sql.sql;
6527
+ var params = sql.params;
6528
+ var normalSql = namedParamSql;
6529
+ Object.keys(params).forEach(function (paramName) {
6530
+ var paramValue = params[paramName];
6531
+ paramName = ':' + paramName;
6532
+ normalSql = normalSql.replace(paramName, typeof (paramValue) === 'string' ? "'" + paramValue + "'" : String(paramValue));
6533
+ });
6534
+ if (normalSql.length >= 2 && normalSql[0] === '(' && normalSql[normalSql.length - 1] === ')') {
6535
+ normalSql = normalSql.slice(1, -1);
6536
+ }
6537
+ normalSql = normalSql.replace(/!= ''(?! =)/g, 'IS NOT EMPTY').replace(/= ''/g, 'IS EMPTY');
6538
+ return normalSql;
6539
+ };
6540
+ QueryLibrary.prototype.getParameterSql = function (qbrule) {
6541
+ var qbRule = extend({}, qbrule, null, true);
6542
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6543
+ var value = this.updateRuleValue(qbRule, false);
6544
+ return this.getParameterSQLVal(this.parent.getSqlFromRules(qbRule), value['ruleVal']);
6545
+ };
6546
+ QueryLibrary.prototype.getNamedParameterSql = function (qbrule) {
6547
+ var qbRule = extend({}, qbrule, null, true);
6548
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6549
+ var value = this.updateRuleValue(qbRule, true);
6550
+ return this.getNamedParameterSQLVal(this.parent.getSqlFromRules(qbRule), value['namedRuleVal']);
6551
+ };
6552
+ QueryLibrary.prototype.getParameterSQLVal = function (content, ruleValue) {
6553
+ var replacedString = content.replace(/[%']/g, '');
6554
+ return { sql: '(' + replacedString + ')', params: ruleValue };
6555
+ };
6556
+ QueryLibrary.prototype.getNamedParameterSQLVal = function (content, ruleValue) {
6557
+ var replacedString = content.replace(/[%']/g, '');
6558
+ return { sql: '(' + replacedString + ')', params: ruleValue };
6559
+ };
6560
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6561
+ QueryLibrary.prototype.updateRuleValue = function (rule, isNamedParameter) {
6562
+ var ruleVal = [];
6563
+ var namedRuleVal = {};
6564
+ var namedParameters = [];
6565
+ return this.updateValue(rule.rules, isNamedParameter, ruleVal, namedRuleVal, namedParameters);
6566
+ };
6567
+ QueryLibrary.prototype.updateValue = function (rules, isNamedParameter, ruleVal,
6568
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6569
+ namedRuleVal, namedParameters) {
6570
+ if (isNullOrUndefined(rules)) {
6571
+ return { ruleVal: ruleVal, namedRuleVal: namedRuleVal };
6572
+ }
6573
+ for (var i = 0; i < rules.length; i++) {
6574
+ if (rules[i].rules) {
6575
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6576
+ var value = this.updateValue(rules[i].rules, isNamedParameter, ruleVal, namedRuleVal, namedParameters);
6577
+ ruleVal = value['ruleVal'];
6578
+ namedRuleVal = value['namedRuleVal'];
6579
+ }
6580
+ else {
6581
+ var namedField = void 0;
6582
+ if (rules[i].value instanceof Array) {
6583
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6584
+ for (var j = 0; j < (rules[i].value).length; j++) {
6585
+ if (isNamedParameter) {
6586
+ namedField = this.getNamedParameter(rules[i].field, namedParameters);
6587
+ }
6588
+ if (!isNullOrUndefined(rules[i].value[j])) {
6589
+ if (rules[i].type === 'string' || rules[i].type === 'date') {
6590
+ if (isNamedParameter) {
6591
+ namedRuleVal[namedField] = rules[i].value[j];
6592
+ }
6593
+ else {
6594
+ ruleVal.push(rules[i].value[j]);
6595
+ }
6596
+ }
6597
+ else {
6598
+ if (isNamedParameter) {
6599
+ namedRuleVal[namedField] = rules[i].value[j];
6600
+ }
6601
+ else {
6602
+ ruleVal.push(rules[i].value[j]);
6603
+ }
6604
+ }
6605
+ }
6606
+ if (isNamedParameter) {
6607
+ rules[i].value[j] = ':' + namedField;
6608
+ }
6609
+ else {
6610
+ rules[i].value[j] = '?';
6611
+ }
6612
+ }
6613
+ }
6614
+ else {
6615
+ if (isNamedParameter) {
6616
+ namedField = this.getNamedParameter(rules[i].field, namedParameters);
6617
+ }
6618
+ if (rules[i].operator.indexOf('null') < 1) {
6619
+ if (rules[i].type !== 'string' || (rules[i].type === 'string' && (rules[i].value !== '' || rules[i].value === 0))) {
6620
+ if (rules[i].type === 'string' || rules[i].type === 'date') {
6621
+ if (rules[i].operator.indexOf('empty') < 1) {
6622
+ var value = rules[i].value.toString();
6623
+ switch (rules[i].operator) {
6624
+ case 'startswith':
6625
+ case 'notstartswith':
6626
+ value = value + '%';
6627
+ break;
6628
+ case 'endswith':
6629
+ case 'notendswith':
6630
+ value = '%' + value;
6631
+ break;
6632
+ case 'contains':
6633
+ case 'notcontains':
6634
+ value = '%' + value + '%';
6635
+ break;
6636
+ }
6637
+ if (isNamedParameter) {
6638
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6639
+ namedRuleVal[namedField] = value;
6640
+ }
6641
+ else {
6642
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6643
+ ruleVal.push(value);
6644
+ }
6645
+ }
6646
+ else {
6647
+ if (isNamedParameter) {
6648
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6649
+ namedRuleVal[namedField] = '';
6650
+ }
6651
+ else {
6652
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6653
+ ruleVal.push('');
6654
+ }
6655
+ if (rules[i].operator === 'isempty') {
6656
+ rules[i].operator = 'equal';
6657
+ }
6658
+ else {
6659
+ rules[i].operator = 'notequal';
6660
+ }
6661
+ }
6662
+ }
6663
+ else {
6664
+ if (!isNullOrUndefined(rules[i].value)) {
6665
+ if (isNamedParameter) {
6666
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6667
+ namedRuleVal[namedField] = rules[i].value;
6668
+ }
6669
+ else {
6670
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6671
+ ruleVal.push(rules[i].value);
6672
+ }
6673
+ }
6674
+ }
6675
+ if (isNamedParameter) {
6676
+ rules[i].value = ':' + namedField;
6677
+ }
6678
+ else {
6679
+ rules[i].value = '?';
6680
+ }
6681
+ }
6682
+ }
6683
+ }
6684
+ }
6685
+ }
6686
+ return { ruleVal: ruleVal, namedRuleVal: namedRuleVal };
6687
+ };
6688
+ QueryLibrary.prototype.getNamedParameter = function (field, namedParameters) {
6689
+ var newField = null;
6690
+ if (namedParameters.length > 0) {
6691
+ for (var i = namedParameters.length - 1; i >= 0; i--) {
6692
+ var currField = namedParameters[i];
6693
+ if (currField.indexOf(field) > -1) {
6694
+ var idx = parseInt(currField.split('_')[1], 10) + 1;
6695
+ newField = field + '_' + idx;
6696
+ namedParameters.push(newField);
6697
+ break;
6698
+ }
6699
+ }
6700
+ }
6701
+ if (!newField) {
6702
+ newField = field + '_1';
6703
+ namedParameters.push(newField);
6704
+ }
6705
+ return newField;
6706
+ };
6707
+ QueryLibrary.prototype.getModuleName = function () {
6708
+ return 'query-library';
6709
+ };
6710
+ return QueryLibrary;
6711
+ }());
6712
+
5261
6713
  /**
5262
6714
  * QueryBuilder modules
5263
6715
  */
@@ -5266,5 +6718,5 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
5266
6718
  * QueryBuilder all modules
5267
6719
  */
5268
6720
 
5269
- export { Columns, Rule, Value, ShowButtons, QueryBuilder };
6721
+ export { Columns, Rule, Value, ShowButtons, QueryBuilder, QueryLibrary };
5270
6722
  //# sourceMappingURL=ej2-querybuilder.es5.js.map