@syncfusion/ej2-querybuilder 24.2.9 → 25.1.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/ej2-querybuilder.min.js +2 -2
  3. package/dist/ej2-querybuilder.umd.min.js +2 -2
  4. package/dist/ej2-querybuilder.umd.min.js.map +1 -1
  5. package/dist/es6/ej2-querybuilder.es2015.js +1616 -162
  6. package/dist/es6/ej2-querybuilder.es2015.js.map +1 -1
  7. package/dist/es6/ej2-querybuilder.es5.js +1618 -162
  8. package/dist/es6/ej2-querybuilder.es5.js.map +1 -1
  9. package/dist/global/ej2-querybuilder.min.js +2 -2
  10. package/dist/global/ej2-querybuilder.min.js.map +1 -1
  11. package/dist/global/index.d.ts +1 -1
  12. package/package.json +12 -12
  13. package/src/global.js +2 -0
  14. package/src/query-builder/index.d.ts +1 -0
  15. package/src/query-builder/index.js +1 -0
  16. package/src/query-builder/query-builder-model.d.ts +69 -1
  17. package/src/query-builder/query-builder.d.ts +189 -4
  18. package/src/query-builder/query-builder.js +906 -137
  19. package/src/query-builder/query-library.d.ts +24 -0
  20. package/src/query-builder/query-library.js +689 -0
  21. package/styles/bootstrap-dark.css +29 -12
  22. package/styles/bootstrap.css +29 -12
  23. package/styles/bootstrap4.css +25 -12
  24. package/styles/bootstrap5-dark.css +38 -12
  25. package/styles/bootstrap5.css +38 -12
  26. package/styles/fabric-dark.css +25 -12
  27. package/styles/fabric.css +25 -12
  28. package/styles/fluent-dark.css +42 -12
  29. package/styles/fluent.css +42 -12
  30. package/styles/highcontrast-light.css +25 -12
  31. package/styles/highcontrast.css +25 -12
  32. package/styles/material-dark.css +34 -12
  33. package/styles/material.css +34 -12
  34. package/styles/material3-dark.css +25 -12
  35. package/styles/material3.css +25 -12
  36. package/styles/query-builder/_bds-definition.scss +107 -0
  37. package/styles/query-builder/_layout.scss +37 -7
  38. package/styles/query-builder/_theme.scss +19 -2
  39. package/styles/query-builder/bootstrap-dark.css +29 -12
  40. package/styles/query-builder/bootstrap.css +29 -12
  41. package/styles/query-builder/bootstrap4.css +25 -12
  42. package/styles/query-builder/bootstrap5-dark.css +38 -12
  43. package/styles/query-builder/bootstrap5.css +38 -12
  44. package/styles/query-builder/fabric-dark.css +25 -12
  45. package/styles/query-builder/fabric.css +25 -12
  46. package/styles/query-builder/fluent-dark.css +42 -12
  47. package/styles/query-builder/fluent.css +42 -12
  48. package/styles/query-builder/highcontrast-light.css +25 -12
  49. package/styles/query-builder/highcontrast.css +25 -12
  50. package/styles/query-builder/icons/_bds.scss +7 -0
  51. package/styles/query-builder/material-dark.css +34 -12
  52. package/styles/query-builder/material.css +34 -12
  53. package/styles/query-builder/material3-dark.css +25 -12
  54. package/styles/query-builder/material3.css +25 -12
  55. package/styles/query-builder/tailwind-dark.css +30 -11
  56. package/styles/query-builder/tailwind.css +30 -11
  57. package/styles/tailwind-dark.css +30 -11
  58. package/styles/tailwind.css +30 -11
@@ -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) {
@@ -1999,17 +2183,11 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
1999
2183
  if (!this.dataColl.length && values.length) {
2000
2184
  isValues = true;
2001
2185
  }
2002
- var fieldValue = this.selectedRule.field;
2003
- var isNested = this.selectedRule.field.indexOf(this.separator);
2004
- if (isNested !== 0 && this.fieldMode !== 'DropdownTree') {
2005
- var nest = this.selectedRule.field.split(this.separator);
2006
- fieldValue = nest[nest.length - 1];
2007
- }
2008
2186
  var multiSelectValue;
2009
2187
  multiSelectValue = {
2010
2188
  dataSource: isValues ? values : (isFetched ? ds : this.dataManager),
2011
2189
  query: new Query([rule.field]),
2012
- fields: { text: fieldValue, value: fieldValue },
2190
+ fields: { text: this.selectedRule.field, value: this.selectedRule.field },
2013
2191
  placeholder: this.l10n.getConstant('SelectValue'),
2014
2192
  value: selectedValue,
2015
2193
  mode: 'CheckBox',
@@ -2140,14 +2318,14 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2140
2318
  var columnData = this.getItemData(parentId);
2141
2319
  var selectedValue;
2142
2320
  var isTemplate = (typeof columnData.template === 'string');
2143
- if (this.isImportRules || this.isPublic || isTemplate) {
2321
+ if (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1 || this.isPublic || isTemplate) {
2144
2322
  selectedValue = rule.value;
2145
2323
  }
2146
2324
  else {
2147
2325
  selectedValue = this.setDefaultValue(parentId, false, false);
2148
2326
  }
2149
2327
  if ((operator === 'in' || operator === 'notin') && (this.dataColl.length || columnData.values)) {
2150
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2328
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2151
2329
  this.renderMultiSelect(columnData, parentId, idx, selectedVal, columnData.values);
2152
2330
  if (this.displayMode === 'Vertical' || this.element.className.indexOf('e-device') > -1) {
2153
2331
  ruleValElem.style.width = '100%';
@@ -2159,7 +2337,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2159
2337
  }
2160
2338
  else {
2161
2339
  if (operator === 'in' || operator === 'notin') {
2162
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2340
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2163
2341
  selectedValue = selectedVal.join(',');
2164
2342
  }
2165
2343
  var txtBox = void 0;
@@ -2179,9 +2357,9 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2179
2357
  QueryBuilder.prototype.renderNumberValue = function (parentId, rule, operator, idx, ruleValElem, itemData, length) {
2180
2358
  var columnData = this.getItemData(parentId);
2181
2359
  var isTemplate = (typeof columnData.template === 'string');
2182
- var selectedVal = (this.isImportRules || this.isPublic || isTemplate) ? rule.value : this.setDefaultValue(parentId, false, true);
2360
+ var selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1 || this.isPublic || isTemplate) ? rule.value : this.setDefaultValue(parentId, false, true);
2183
2361
  if ((operator === 'in' || operator === 'notin') && (this.dataColl.length || columnData.values)) {
2184
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2362
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2185
2363
  this.renderMultiSelect(columnData, parentId, idx, selectedVal, columnData.values);
2186
2364
  if (this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical') {
2187
2365
  ruleValElem.style.width = '100%';
@@ -2192,7 +2370,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2192
2370
  }
2193
2371
  }
2194
2372
  else if (operator === 'in' || operator === 'notin') {
2195
- selectedVal = this.isImportRules ? rule.value : this.setDefaultValue(parentId, true, false);
2373
+ selectedVal = (this.isImportRules || this.ruleIndex > -1 || this.groupIndex > -1) ? rule.value : this.setDefaultValue(parentId, true, false);
2196
2374
  var selVal = selectedVal.join(',');
2197
2375
  var txtInp = void 0;
2198
2376
  txtInp = {
@@ -2465,8 +2643,8 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2465
2643
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
2466
2644
  : this.getColumn(filtObj.value);
2467
2645
  this.selectedRule = column;
2646
+ var ddlObj = getComponent(target.querySelector('input'), 'dropdownlist');
2468
2647
  if (isRender) {
2469
- var ddlObj = getComponent(target.querySelector('input'), 'dropdownlist');
2470
2648
  itemData = element.id.indexOf('operator') > -1 ? itemData : this.selectedRule;
2471
2649
  if (itemData.operators) {
2472
2650
  ddlObj.value = null;
@@ -2474,7 +2652,13 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2474
2652
  ddlObj.dataSource = itemData.operators;
2475
2653
  ddlObj.index = this.getOperatorIndex(ddlObj, rule);
2476
2654
  ddlObj.value = tempRule.operator = ddlObj.dataSource[ddlObj.index].value;
2477
- ddlObj.dataBind();
2655
+ if (!this.autoSelectOperator) {
2656
+ ddlObj.index = -1;
2657
+ tempRule.operator = ddlObj.value = '';
2658
+ }
2659
+ else {
2660
+ ddlObj.dataBind();
2661
+ }
2478
2662
  }
2479
2663
  }
2480
2664
  var operator = tempRule.operator.toString();
@@ -2507,39 +2691,41 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2507
2691
  this.validateValue(rule, closest(target, '.e-rule-container'));
2508
2692
  this.destroyControls(target);
2509
2693
  }
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;
2694
+ if (this.isImportRules || (ddlObj && ddlObj.value !== '')) {
2695
+ if (column) {
2696
+ itemData.template = column.template;
2697
+ }
2698
+ if (itemData.template) {
2699
+ addClass([target.nextElementSibling], 'e-template-value');
2700
+ itemData.template = column.template;
2701
+ isTempRendered = this.setColumnTemplate(itemData, parentId, column.field, itemData.value ||
2702
+ operator, target, rule);
2703
+ }
2704
+ if (isTempRendered) {
2705
+ var parentElem = target.parentElement.querySelector('.e-rule-value');
2706
+ if (this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical') {
2707
+ parentElem.style.width = '100%';
2708
+ }
2709
+ else {
2710
+ parentElem.style.width = '200px';
2711
+ }
2533
2712
  }
2534
2713
  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);
2714
+ removeClass([target.nextElementSibling], 'e-template-value');
2715
+ var inputLen = 1;
2716
+ if (tempRule.type === 'boolean') {
2717
+ inputLen = this.selectedColumn.values ? this.selectedColumn.values.length : 2;
2718
+ }
2719
+ else {
2720
+ inputLen = (operator && operator.toLowerCase().indexOf('between') > -1) ? 2 : 1;
2721
+ }
2722
+ for (var i = 0; i < inputLen; i++) {
2723
+ var valElem = this.createElement('input', { attrs: { type: 'text', id: parentId + '_valuekey' + i } });
2724
+ target.nextElementSibling.appendChild(valElem);
2725
+ }
2540
2726
  }
2727
+ this.renderControls(target, itemData, rule, tempRule, isTempRendered);
2541
2728
  }
2542
- this.renderControls(target, itemData, rule, tempRule, isTempRendered);
2543
2729
  }
2544
2730
  else {
2545
2731
  var parentElem = target.parentElement.querySelector('.e-rule-value');
@@ -2973,8 +3159,8 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
2973
3159
  var i;
2974
3160
  var len;
2975
3161
  var tooltip;
2976
- var popupElement;
2977
3162
  _super.prototype.destroy.call(this);
3163
+ var popupElement;
2978
3164
  element = this.element.querySelectorAll('.e-addrulegroup');
2979
3165
  len = element.length;
2980
3166
  for (i = 0; i < len; i++) {
@@ -3060,7 +3246,8 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3060
3246
  if (grouplen) {
3061
3247
  this.isPublic = true;
3062
3248
  for (var i = 0, len = groups.length; i < len; i++) {
3063
- this.updatedRule = { condition: groups[i].condition, not: groups[i].not };
3249
+ this.updatedRule = { isLocked: groups[i].isLocked, condition: groups[i].condition,
3250
+ not: groups[i].not };
3064
3251
  this.importRules(groups[i], groupElem, false, groups[i].not);
3065
3252
  }
3066
3253
  this.isPublic = false;
@@ -3068,15 +3255,27 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3068
3255
  else {
3069
3256
  var condition = 'and';
3070
3257
  var not = false;
3258
+ var isLocked = false;
3071
3259
  if (this.updatedRule) {
3072
3260
  condition = this.updatedRule.condition;
3073
3261
  not = this.updatedRule.not;
3262
+ isLocked = this.updatedRule.isLocked;
3074
3263
  }
3075
- if (this.enableNotCondition) {
3076
- rule.rules.push({ 'condition': condition, 'not': not, rules: [] });
3264
+ if (this.groupIndex < 0) {
3265
+ if (this.enableNotCondition) {
3266
+ rule.rules.push({ 'condition': condition, 'not': not, rules: [] });
3267
+ }
3268
+ else {
3269
+ rule.rules.push({ 'condition': condition, rules: [] });
3270
+ }
3077
3271
  }
3078
3272
  else {
3079
- rule.rules.push({ 'condition': condition, rules: [] });
3273
+ if (this.enableNotCondition) {
3274
+ rule.rules.splice(this.groupIndex + 1, 0, { condition: condition, not: not, rules: [], isLocked: isLocked });
3275
+ }
3276
+ else {
3277
+ rule.rules.splice(this.groupIndex + 1, 0, { condition: condition, rules: [], isLocked: isLocked });
3278
+ }
3080
3279
  }
3081
3280
  }
3082
3281
  if (!this.headerTemplate) {
@@ -3259,17 +3458,53 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3259
3458
  this.refresh();
3260
3459
  break;
3261
3460
  case 'showButtons':
3262
- if (newProp.showButtons.ruleDelete) {
3263
- removeClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3461
+ if (!isNullOrUndefined(newProp.showButtons.lockGroup)) {
3462
+ if (newProp.showButtons.lockGroup) {
3463
+ removeClass(this.element.querySelectorAll('.e-lock-grp-btn'), 'e-button-hide');
3464
+ }
3465
+ else {
3466
+ addClass(this.element.querySelectorAll('.e-lock-grp-btn'), 'e-button-hide');
3467
+ }
3264
3468
  }
3265
- else {
3266
- addClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3469
+ if (!isNullOrUndefined(newProp.showButtons.lockRule)) {
3470
+ if (newProp.showButtons.lockRule) {
3471
+ removeClass(this.element.querySelectorAll('.e-lock-rule-btn'), 'e-button-hide');
3472
+ }
3473
+ else {
3474
+ addClass(this.element.querySelectorAll('.e-lock-rule-btn'), 'e-button-hide');
3475
+ }
3267
3476
  }
3268
- if (newProp.showButtons.groupDelete) {
3269
- removeClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3477
+ if (!isNullOrUndefined(newProp.showButtons.cloneGroup)) {
3478
+ if (newProp.showButtons.cloneGroup) {
3479
+ removeClass(this.element.querySelectorAll('.e-clone-grp-btn'), 'e-button-hide');
3480
+ }
3481
+ else {
3482
+ addClass(this.element.querySelectorAll('.e-clone-grp-btn'), 'e-button-hide');
3483
+ }
3270
3484
  }
3271
- else {
3272
- addClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3485
+ if (!isNullOrUndefined(newProp.showButtons.cloneRule)) {
3486
+ if (newProp.showButtons.cloneRule) {
3487
+ removeClass(this.element.querySelectorAll('.e-clone-rule-btn'), 'e-button-hide');
3488
+ }
3489
+ else {
3490
+ addClass(this.element.querySelectorAll('.e-clone-rule-btn'), 'e-button-hide');
3491
+ }
3492
+ }
3493
+ if (!isNullOrUndefined(newProp.showButtons.ruleDelete)) {
3494
+ if (newProp.showButtons.ruleDelete) {
3495
+ removeClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3496
+ }
3497
+ else {
3498
+ addClass(this.element.querySelectorAll('.e-rule-delete'), 'e-button-hide');
3499
+ }
3500
+ }
3501
+ if (!isNullOrUndefined(newProp.showButtons.groupDelete)) {
3502
+ if (newProp.showButtons.groupDelete) {
3503
+ removeClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3504
+ }
3505
+ else {
3506
+ addClass(this.element.querySelectorAll('.e-deletegroup'), 'e-button-hide');
3507
+ }
3273
3508
  }
3274
3509
  break;
3275
3510
  case 'cssClass':
@@ -3346,8 +3581,11 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3346
3581
  this.element.id = this.element.id || getUniqueID('ej2-querybuilder');
3347
3582
  this.defaultLocale = {
3348
3583
  StartsWith: 'Starts With',
3584
+ DoesNotStartWith: 'Does Not Start With',
3349
3585
  EndsWith: 'Ends With',
3586
+ DoesNotEndWith: 'Does Not End With',
3350
3587
  Contains: 'Contains',
3588
+ DoesNotContain: 'Does Not Contain',
3351
3589
  NotLike: 'Not Like',
3352
3590
  Like: 'Like',
3353
3591
  Equal: 'Equal',
@@ -3381,7 +3619,13 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3381
3619
  IsNotNull: 'Is Not Null',
3382
3620
  True: 'true',
3383
3621
  False: 'false',
3384
- AddButton: 'Add Group/Condition'
3622
+ AddButton: 'Add Group/Condition',
3623
+ CloneGroup: 'Clone Group',
3624
+ LockGroup: 'Lock Group',
3625
+ CloneRule: 'Clone Rule',
3626
+ LockRule: 'Lock Rule',
3627
+ UnlockRule: 'Unlock Rule',
3628
+ UnlockGroup: 'Unlock Group'
3385
3629
  };
3386
3630
  this.l10n = new L10n('querybuilder', this.defaultLocale, this.locale);
3387
3631
  this.intl = new Internationalization(this.locale);
@@ -3394,8 +3638,11 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3394
3638
  this.customOperators = {
3395
3639
  stringOperator: [
3396
3640
  { value: 'startswith', key: this.l10n.getConstant('StartsWith') },
3641
+ { value: 'notstartswith', key: this.l10n.getConstant('DoesNotStartWith') },
3397
3642
  { value: 'endswith', key: this.l10n.getConstant('EndsWith') },
3643
+ { value: 'notendswith', key: this.l10n.getConstant('DoesNotEndWith') },
3398
3644
  { value: 'contains', key: this.l10n.getConstant('Contains') },
3645
+ { value: 'notcontains', key: this.l10n.getConstant('DoesNotContain') },
3399
3646
  { value: 'equal', key: this.l10n.getConstant('Equal') },
3400
3647
  { value: 'notequal', key: this.l10n.getConstant('NotEqual') },
3401
3648
  { value: 'in', key: this.l10n.getConstant('In') },
@@ -3409,7 +3656,9 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3409
3656
  { value: 'greaterthanorequal', key: this.l10n.getConstant('GreaterThanOrEqual') },
3410
3657
  { value: 'lessthan', key: this.l10n.getConstant('LessThan') },
3411
3658
  { value: 'lessthanorequal', key: this.l10n.getConstant('LessThanOrEqual') },
3412
- { value: 'notequal', key: this.l10n.getConstant('NotEqual') }
3659
+ { value: 'notequal', key: this.l10n.getConstant('NotEqual') },
3660
+ { value: 'between', key: this.l10n.getConstant('Between') },
3661
+ { value: 'notbetween', key: this.l10n.getConstant('NotBetween') }
3413
3662
  ],
3414
3663
  booleanOperator: [
3415
3664
  { value: 'equal', key: this.l10n.getConstant('Equal') },
@@ -3734,6 +3983,10 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3734
3983
  this.setProperties({ rule: rule }, true);
3735
3984
  rule = this.getRuleCollection(this.rule, false);
3736
3985
  this.importRules(this.rule, this.element.querySelector('.e-group-container'), true, this.rule.not, isRoot);
3986
+ if (rule.isLocked) {
3987
+ var lockGrpTarget = this.element.querySelector('.e-group-container').querySelector('.e-lock-grp-btn');
3988
+ this.groupLock(lockGrpTarget);
3989
+ }
3737
3990
  this.isImportRules = false;
3738
3991
  };
3739
3992
  QueryBuilder.prototype.keyBoardHandler = function (e) {
@@ -3829,7 +4082,8 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3829
4082
  rule.value !== undefined)) || (customObj && customObj.isQuestion)) {
3830
4083
  var condition = rule.condition;
3831
4084
  rule = {
3832
- 'label': rule.label, 'field': rule.field, 'operator': rule.operator, 'type': rule.type, 'value': rule.value
4085
+ 'label': rule.label, 'field': rule.field, 'operator': rule.operator, 'type': rule.type, 'value': rule.value,
4086
+ 'isLocked': rule.isLocked
3833
4087
  };
3834
4088
  if (condition) {
3835
4089
  rule.condition = condition;
@@ -3838,6 +4092,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3838
4092
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
3839
4093
  rule.custom = customObj;
3840
4094
  }
4095
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3841
4096
  if ((rule.operator === 'in' || rule.operator === 'notin') && rule.value && rule.value.length === 0) {
3842
4097
  rule = {};
3843
4098
  }
@@ -3863,10 +4118,10 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
3863
4118
  }
3864
4119
  else {
3865
4120
  if (this.enableNotCondition) {
3866
- rule = { 'condition': rule.condition, 'rules': rule.rules, 'not': rule.not };
4121
+ rule = { 'condition': rule.condition, 'rules': rule.rules, 'not': rule.not, 'isLocked': rule.isLocked };
3867
4122
  }
3868
4123
  else {
3869
- rule = { 'condition': rule.condition, 'rules': rule.rules };
4124
+ rule = { 'condition': rule.condition, 'rules': rule.rules, 'isLocked': rule.isLocked };
3870
4125
  }
3871
4126
  if (customObj) {
3872
4127
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -4031,11 +4286,20 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4031
4286
  var ruleValue;
4032
4287
  var ignoreCase = false;
4033
4288
  var column;
4034
- var ignoreOper = ['notcontains', 'notstartswith', 'notendswith'];
4035
4289
  if (!ruleColl) {
4036
4290
  return pred;
4037
4291
  }
4038
4292
  for (var i = 0, len = ruleColl.length; i < len; i++) {
4293
+ var operator = ruleColl[i].operator;
4294
+ if (operator === 'notstartswith') {
4295
+ operator = 'doesnotstartwith';
4296
+ }
4297
+ else if (operator === 'notendswith') {
4298
+ operator = 'doesnotendwith';
4299
+ }
4300
+ else if (operator === 'notcontains') {
4301
+ operator = 'doesnotcontain';
4302
+ }
4039
4303
  var keys = Object.keys(ruleColl[i]);
4040
4304
  ignoreCase = false;
4041
4305
  if (keys.indexOf('rules') > -1 && ruleColl[i].rules) {
@@ -4054,7 +4318,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4054
4318
  }
4055
4319
  }
4056
4320
  }
4057
- else if (!isNullOrUndefined(ruleColl[i].operator) && !isNullOrUndefined(ruleColl[i].operator.length)) {
4321
+ else if (!isNullOrUndefined(operator) && !isNullOrUndefined(operator.length)) {
4058
4322
  var oper = ruleColl[i].operator.toLowerCase();
4059
4323
  var isDateFilter = false;
4060
4324
  var dateOperColl = ['equal', 'notequal', 'greaterthan', 'greaterthanorequal', 'lessthan', 'lessthanorequal'];
@@ -4085,23 +4349,20 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4085
4349
  }
4086
4350
  if (i === 0) {
4087
4351
  if (isDateFilter || (oper.indexOf('in') > -1 || oper.indexOf('between') > -1 || oper.indexOf('null') > -1 ||
4088
- oper.indexOf('empty') > -1) && oper.indexOf('contains') < 0) {
4352
+ oper.indexOf('empty') > -1) && (oper.indexOf('contain') < 0)) {
4089
4353
  pred = isDateFilter ? this.datePredicate(ruleColl[i], ruleValue) :
4090
4354
  this.arrayPredicate(ruleColl[i]);
4091
4355
  }
4092
4356
  else {
4093
4357
  var value = ruleValue;
4094
- if (value !== '' && ignoreOper.indexOf(oper) < 0) {
4095
- pred = new Predicate(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4358
+ if (value !== '') {
4359
+ pred = new Predicate(ruleColl[i].field, operator, ruleValue, ignoreCase);
4096
4360
  }
4097
4361
  }
4098
4362
  }
4099
4363
  else {
4100
- if (ignoreOper.indexOf(oper) > -1) {
4101
- continue;
4102
- }
4103
4364
  if (isDateFilter || (oper.indexOf('in') > -1 || oper.indexOf('between') > -1 ||
4104
- oper.indexOf('null') > -1 || oper.indexOf('empty') > -1) && oper.indexOf('contains') < 0) {
4365
+ oper.indexOf('null') > -1 || oper.indexOf('empty') > -1) && oper.indexOf('contain') < 0) {
4105
4366
  pred = isDateFilter ? this.datePredicate(ruleColl[i], ruleValue, pred, rule.condition) :
4106
4367
  this.arrayPredicate(ruleColl[i], pred, rule.condition);
4107
4368
  }
@@ -4110,19 +4371,19 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4110
4371
  var value = ruleValue;
4111
4372
  if (pred && value !== '') {
4112
4373
  pred
4113
- = pred.and(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4374
+ = pred.and(ruleColl[i].field, operator, ruleValue, ignoreCase);
4114
4375
  }
4115
4376
  else if (value !== '') {
4116
- pred = new Predicate(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4377
+ pred = new Predicate(ruleColl[i].field, operator, ruleValue, ignoreCase);
4117
4378
  }
4118
4379
  }
4119
4380
  else {
4120
4381
  var value = ruleValue;
4121
4382
  if (pred && value !== '') {
4122
- pred = pred.or(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4383
+ pred = pred.or(ruleColl[i].field, operator, ruleValue, ignoreCase);
4123
4384
  }
4124
4385
  else if (value !== '') {
4125
- pred = new Predicate(ruleColl[i].field, ruleColl[i].operator, ruleValue, ignoreCase);
4386
+ pred = new Predicate(ruleColl[i].field, operator, ruleValue, ignoreCase);
4126
4387
  }
4127
4388
  }
4128
4389
  }
@@ -4402,15 +4663,28 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4402
4663
  for (var i = 0, len = ruleColl.length; i < len; i++) {
4403
4664
  var keys = Object.keys(ruleColl[i]);
4404
4665
  if (!isNullOrUndefined(ruleColl[i].rules) && keys.indexOf('rules') > -1 && (ruleColl[i].rules.length !== 0)) {
4666
+ if (this.element.querySelectorAll('.e-group-container').length > this.maxGroupCount) {
4667
+ return null;
4668
+ }
4405
4669
  parentElem = this.renderGroup(ruleColl[i], ruleColl[i].condition, parentElem, ruleColl[i].not);
4406
4670
  parentElem = this.importRules(ruleColl[i], parentElem, true);
4407
4671
  }
4408
4672
  else {
4409
4673
  this.renderRule(ruleColl[i], parentElem);
4410
4674
  }
4675
+ if (!isNullOrUndefined(ruleColl[i].rules) && ruleColl[i].isLocked) {
4676
+ var lockGrpTarget = parentElem.querySelector('.e-rule-list').children[i].querySelector('.e-lock-grp-btn');
4677
+ this.groupLock(lockGrpTarget);
4678
+ }
4679
+ if (isNullOrUndefined(ruleColl[i].rules) && ruleColl[i].isLocked) {
4680
+ var lockRuleTarget = parentElem.querySelector('.e-rule-list').children[i].querySelector('.e-lock-rule-btn');
4681
+ this.ruleLock(lockRuleTarget);
4682
+ }
4411
4683
  }
4412
4684
  }
4413
- parentElem = closest(parentElem, '.e-rule-list');
4685
+ if (parentElem) {
4686
+ parentElem = closest(parentElem, '.e-rule-list');
4687
+ }
4414
4688
  if (parentElem) {
4415
4689
  parentElem = closest(parentElem, '.e-group-container');
4416
4690
  }
@@ -4419,7 +4693,20 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4419
4693
  QueryBuilder.prototype.renderGroup = function (rule, condition, parentElem, not, isRoot) {
4420
4694
  this.addGroupElement(true, parentElem, condition, false, not, isRoot, rule); //Child group
4421
4695
  var element = parentElem.querySelectorAll('.e-group-container');
4422
- return element[element.length - 1];
4696
+ var cloneElem = parentElem.querySelector('.e-rule-list').children;
4697
+ if (this.showButtons.cloneGroup && this.cloneGrpBtnClick && this.isMiddleGroup) {
4698
+ this.isMiddleGroup = false;
4699
+ this.cloneGrpBtnClick = false;
4700
+ return cloneElem[this.groupIndex + 1]; // group added in the middle
4701
+ }
4702
+ else if (this.showButtons.cloneGroup && this.cloneGrpBtnClick && this.isLastGroup) {
4703
+ this.isLastGroup = false;
4704
+ this.cloneGrpBtnClick = false;
4705
+ return cloneElem[cloneElem.length - 1]; // group added in the end
4706
+ }
4707
+ else {
4708
+ return element[element.length - 1];
4709
+ }
4423
4710
  };
4424
4711
  QueryBuilder.prototype.renderRule = function (rule, parentElem) {
4425
4712
  if (parentElem.className.indexOf('e-group-container') > -1) {
@@ -4618,15 +4905,19 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4618
4905
  valueStr += rule.value ? '("%' + rule.value + '%")' : '(' + rule.value + ')';
4619
4906
  }
4620
4907
  else {
4621
- if (rule.type === 'number' || typeof rule.value === 'boolean' || rule.value === null) {
4908
+ if (rule.type === 'number' || typeof rule.value === 'boolean' ||
4909
+ (rule.value === null && (rule.operator.toString().indexOf('empty') < -1))) {
4622
4910
  valueStr += rule.value;
4623
4911
  }
4912
+ else if (rule.operator.toString().indexOf('empty') > -1) {
4913
+ valueStr += '""';
4914
+ }
4624
4915
  else {
4625
4916
  valueStr += '"' + rule.value + '"';
4626
4917
  }
4627
4918
  }
4628
4919
  }
4629
- if (rule.operator.toString().indexOf('null') > -1 || (rule.operator.toString().indexOf('empty') > -1)) {
4920
+ if (rule.operator.toString().indexOf('null') > -1) {
4630
4921
  if (enableEscape) {
4631
4922
  rule.field = '`' + rule.field + '`';
4632
4923
  }
@@ -4638,6 +4929,13 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4638
4929
  queryStr += rule.field + ' ' + ruleOpertor;
4639
4930
  }
4640
4931
  else {
4932
+ var custOper = ruleOpertor;
4933
+ if (rule.operator === 'isempty') {
4934
+ custOper = '=';
4935
+ }
4936
+ else if (rule.operator === 'isnotempty') {
4937
+ custOper = '!=';
4938
+ }
4641
4939
  if (enableEscape) {
4642
4940
  rule.field = '`' + rule.field + '`';
4643
4941
  }
@@ -4646,7 +4944,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4646
4944
  rule.field = '"' + rule.field + '"';
4647
4945
  }
4648
4946
  }
4649
- queryStr += rule.field + ' ' + ruleOpertor + ' ' + valueStr;
4947
+ queryStr += rule.field + ' ' + custOper + ' ' + valueStr;
4650
4948
  }
4651
4949
  if (rule.condition && rule.condition !== '') {
4652
4950
  condition = rule.condition;
@@ -4676,7 +4974,7 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4676
4974
  * Sets the rules from the sql query.
4677
4975
  *
4678
4976
  * @param {string} sqlString - 'sql String' to be passed to set the rule.
4679
- * @param {boolean} sqlLocale - Set `true` if Localization for Sql query.
4977
+ * @param {boolean} sqlLocale - Optional. Set `true` if Localization for Sql query.
4680
4978
  * @returns {void}
4681
4979
  */
4682
4980
  QueryBuilder.prototype.setRulesFromSql = function (sqlString, sqlLocale) {
@@ -4708,15 +5006,173 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4708
5006
  *
4709
5007
  * @param {RuleModel} rule - 'rule' to be passed to get the sql.
4710
5008
  * @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.
5009
+ * @param {boolean} sqlLocale - Set `true` if Localization for Sql query.
5010
+ * @returns {string} - Sql query from rules.
4713
5011
  */
4714
5012
  QueryBuilder.prototype.getSqlFromRules = function (rule, allowEscape, sqlLocale) {
4715
5013
  if (!rule) {
4716
5014
  rule = this.getValidRules();
4717
5015
  }
4718
5016
  rule = this.getRuleCollection(rule, false);
4719
- return this.getSqlString(this.getValidRules(rule), allowEscape, null, sqlLocale).replace(/"/g, '\'');
5017
+ var sqlString = this.getSqlString(this.getValidRules(rule), allowEscape, null, sqlLocale).replace(/"/g, '\'');
5018
+ return sqlString;
5019
+ };
5020
+ /**
5021
+ * Gets the parameter SQL query from rules.
5022
+ *
5023
+ * @param {RuleModel} rule – Specify the rule to be passed to get the parameter sql string.
5024
+ * @returns {ParameterizedSql} – Parameterized SQL query from rules.
5025
+ */
5026
+ QueryBuilder.prototype.getParameterizedSql = function (rule) {
5027
+ if (!rule) {
5028
+ rule = this.getValidRules();
5029
+ }
5030
+ var obj = { sql: null };
5031
+ this.notify('query-library', { prop: 'getParameterSql', onPropertyChange: false, value: { rule: rule, obj: obj } });
5032
+ return obj['sql'];
5033
+ };
5034
+ /**
5035
+ * Sets the rules from the parameter sql query.
5036
+ *
5037
+ * @param { ParameterizedSql} sqlQuery – Specifies the parameter SQL to be passed to set the rule and load it to the query builder.
5038
+ * @returns {void}
5039
+ */
5040
+ QueryBuilder.prototype.setParameterizedSql = function (sqlQuery) {
5041
+ var obj = { sql: null };
5042
+ this.notify('query-library', { prop: 'convertParamSqlToSql', onPropertyChange: false, value: { sql: sqlQuery, obj: obj } });
5043
+ var sql = obj['sql'];
5044
+ if (sql) {
5045
+ sql = sql.replace(/`/g, '');
5046
+ var ruleModel = this.getRulesFromSql(sql);
5047
+ this.setRules({ condition: ruleModel.condition, not: ruleModel.not, rules: ruleModel.rules });
5048
+ }
5049
+ };
5050
+ /**
5051
+ * Gets the named parameter SQL query from rules.
5052
+ *
5053
+ * @param {RuleModel} rule – Specify the rule to be passed to get the named parameter SQL string.
5054
+ * @returns {ParameterizedNamedSql} – Parameterized Named SQL query from rules.
5055
+ */
5056
+ QueryBuilder.prototype.getParameterizedNamedSql = function (rule) {
5057
+ if (!rule) {
5058
+ rule = this.getValidRules();
5059
+ }
5060
+ var obj = { sql: null };
5061
+ this.notify('query-library', { prop: 'getNamedParameterSql', onPropertyChange: false, value: { rule: rule, obj: obj } });
5062
+ return obj['sql'];
5063
+ };
5064
+ /**
5065
+ * Sets the rules from the named parameter SQL query.
5066
+ *
5067
+ * @param { ParameterizedNamedSql } sqlQuery – Specifies the named parameter SQL to be passed to set the rule and load it to the query builder.
5068
+ * @returns {void}
5069
+ */
5070
+ QueryBuilder.prototype.setParameterizedNamedSql = function (sqlQuery) {
5071
+ var obj = { sql: null };
5072
+ this.notify('query-library', { prop: 'convertNamedParamSqlToSql', onPropertyChange: false, value: { sql: sqlQuery, obj: obj } });
5073
+ var sql = obj['sql'];
5074
+ if (sql) {
5075
+ sql = sql.replace(/`/g, '');
5076
+ var ruleModel = this.getRulesFromSql(sql);
5077
+ this.setRules({ condition: ruleModel.condition, not: ruleModel.not, rules: ruleModel.rules });
5078
+ }
5079
+ };
5080
+ /**
5081
+ * Set the rules from Mongo query.
5082
+ *
5083
+ * @param {string} mongoQuery - 'sql String' to be passed to get the rule.
5084
+ * @param {boolean} mongoLocale - Set `true` if Localization for Mongo query.
5085
+ * @returns {void}
5086
+ */
5087
+ QueryBuilder.prototype.setMongoQuery = function (mongoQuery, mongoLocale) {
5088
+ this.rule = { condition: 'and', not: false, rules: [] };
5089
+ this.notify('query-library', { prop: 'mongoParser', onPropertyChange: false, value: { mongoQuery: JSON.parse(mongoQuery), rule: this.rule, mongoLocale: mongoLocale } });
5090
+ };
5091
+ /**
5092
+ * Gets the Mongo query from rules.
5093
+ *
5094
+ * @param {RuleModel} rule - 'rule' to be passed to get the sql.
5095
+ * @returns {object} - Sql query from rules.
5096
+ */
5097
+ QueryBuilder.prototype.getMongoQuery = function (rule) {
5098
+ if (!rule) {
5099
+ rule = this.getValidRules();
5100
+ }
5101
+ var obj = { mongoQuery: null };
5102
+ this.notify('query-library', { prop: 'getMongoFromRules', onPropertyChange: false, value: { rule: rule, mongoQuery: '', obj: obj } });
5103
+ return obj['mongoQuery'];
5104
+ };
5105
+ /**
5106
+ * Clones the rule based on the rule ID to the specific group.
5107
+ *
5108
+ * @param {string} ruleID - Specifies the ruleID that needs to be cloned.
5109
+ * @param {string} groupID - Specifies the groupID in which the rule to be cloned.
5110
+ * @param {number} index - Specifies the index to insert the cloned rule inside the group.
5111
+ * @returns {void}
5112
+ */
5113
+ QueryBuilder.prototype.cloneRule = function (ruleID, groupID, index) {
5114
+ var getRule = this.getRule(ruleID.replace(this.element.id + '_', ''));
5115
+ var isCloneRule = this.showButtons.cloneRule;
5116
+ groupID = groupID.replace(this.element.id + '_', '');
5117
+ this.ruleIndex = index;
5118
+ this.cloneRuleBtnClick = true;
5119
+ this.showButtons.cloneRule = true;
5120
+ this.addRules([{
5121
+ 'label': getRule.label, 'field': getRule.field, 'type': getRule.type, 'operator': getRule.operator,
5122
+ 'value': getRule.value
5123
+ }], groupID);
5124
+ this.ruleIndex = -1;
5125
+ this.cloneRuleBtnClick = false;
5126
+ this.showButtons.cloneRule = isCloneRule;
5127
+ isCloneRule = false;
5128
+ };
5129
+ /**
5130
+ * Clones the group based on the group ID to the specific group.
5131
+ *
5132
+ * @param {string} groupID - Specifies the groupID that needs to be cloned.
5133
+ * @param {string} parentGroupID - Specifies the parentGroupID in which the group to be cloned.
5134
+ * @param {number} index - Specifies the index to insert the cloned group inside the parent group.
5135
+ * @returns {void}
5136
+ */
5137
+ QueryBuilder.prototype.cloneGroup = function (groupID, parentGroupID, index) {
5138
+ parentGroupID = parentGroupID.replace(this.element.id + '_', '');
5139
+ var group = this.getGroup(parentGroupID);
5140
+ var isCloneGroup = this.showButtons.cloneGroup;
5141
+ groupID = groupID.replace(this.element.id + '_', '');
5142
+ this.groupIndex = index;
5143
+ this.cloneGrpBtnClick = true;
5144
+ this.showButtons.cloneGroup = true;
5145
+ this.addGroups([{ 'condition': group.condition, 'not': group.not, 'rules': group.rules }], groupID);
5146
+ this.groupIndex = -1;
5147
+ this.cloneGrpBtnClick = false;
5148
+ this.showButtons.cloneGroup = isCloneGroup;
5149
+ isCloneGroup = false;
5150
+ };
5151
+ /**
5152
+ * Locks the rule based on the rule ID.
5153
+ *
5154
+ * @param {string} ruleID - Specifies the ruleID that needs to be locked.
5155
+ * @returns {void}
5156
+ */
5157
+ QueryBuilder.prototype.lockRule = function (ruleID) {
5158
+ if (ruleID.indexOf(this.element.id) < 0) {
5159
+ ruleID = this.element.id + '_' + ruleID;
5160
+ }
5161
+ var target = document.getElementById(ruleID).querySelectorAll('.e-lock-rule-btn')[0];
5162
+ this.ruleLock(target);
5163
+ };
5164
+ /**
5165
+ * Locks the group based on the group ID
5166
+ *
5167
+ * @param {string} groupID - Specifies the groupID that needs to be locked.
5168
+ * @returns {void}
5169
+ */
5170
+ QueryBuilder.prototype.lockGroup = function (groupID) {
5171
+ if (groupID.indexOf(this.element.id) < 0) {
5172
+ groupID = this.element.id + '_' + groupID;
5173
+ }
5174
+ var target = document.getElementById(groupID).querySelectorAll('.e-lock-grp-btn')[0];
5175
+ this.groupLock(target);
4720
5176
  };
4721
5177
  QueryBuilder.prototype.sqlParser = function (sqlString, sqlLocale) {
4722
5178
  var st = 0;
@@ -4918,13 +5374,13 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
4918
5374
  for (var i = 0; i < localeOperator.length; i++) {
4919
5375
  if (this.sqlOperators[localeOperator[i]] === operator.toUpperCase()) {
4920
5376
  if (value && value.indexOf('%') === 0 && value[value.length - 1] === '%') {
4921
- return (localeOperator[i] === 'notcontains') ? 'notcontains' : 'contains';
5377
+ return (operator.toUpperCase() === 'NOT LIKE') ? 'notcontains' : 'contains';
4922
5378
  }
4923
5379
  else if (value && value.indexOf('%') !== 0 && value.indexOf('%') === value.length - 1) {
4924
- return (localeOperator[i] === 'notstartswith') ? 'notstartswith' : 'startswith';
5380
+ return (operator.toUpperCase() === 'NOT LIKE') ? 'notstartswith' : 'startswith';
4925
5381
  }
4926
5382
  else if (value && value.indexOf('%') === 0 && value.indexOf('%') !== value.length - 1) {
4927
- return (localeOperator[i] === 'notendswith') ? 'notendswith' : 'endswith';
5383
+ return (operator.toUpperCase() === 'NOT LIKE') ? 'notendswith' : 'endswith';
4928
5384
  }
4929
5385
  return localeOperator[i];
4930
5386
  }
@@ -5109,6 +5565,14 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
5109
5565
  }
5110
5566
  else if (parser[i + 1][0] === 'Operators') {
5111
5567
  rule.operator = this.getOperator(parser[i + 2][1], parser[i + 1][1], sqlLocale);
5568
+ if (rule.operator == "equal" && parser[i + 2][0] === "String" && parser[i + 2][1] === "''") {
5569
+ rule.operator = "isempty";
5570
+
5571
+ }
5572
+ else if (rule.operator == "notequal" && parser[i + 2][0] === "String" && parser[i + 2][1] === "''") {
5573
+ rule.operator = "isnotempty";
5574
+
5575
+ }
5112
5576
  if (parser[i + 2][0] === 'Number') {
5113
5577
  rule.type = 'number';
5114
5578
  rule.value = Number(parser[i + 2][1]);
@@ -5165,31 +5629,326 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
5165
5629
  }
5166
5630
  return rules;
5167
5631
  };
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([
5632
+ /**
5633
+ * Clone the Group
5634
+ *
5635
+ * @param {Element | string} target - 'target' to be passed to clone the group.
5636
+ * @returns {void}
5637
+ */
5638
+ QueryBuilder.prototype.groupClone = function (target) {
5639
+ var groupElem = target.closest('.e-rule-list').closest('.e-group-container');
5640
+ var targetGrpId;
5641
+ var groupId;
5642
+ if (typeof target === 'string') {
5643
+ groupId = this.element.id + '_' + target;
5644
+ target = document.getElementById(groupId);
5645
+ }
5646
+ else {
5647
+ targetGrpId = target.id.replace(this.element.id + '_', '');
5648
+ groupId = groupElem.id.replace(this.element.id + '_', '');
5649
+ }
5650
+ var group = this.getGroup(targetGrpId);
5651
+ this.groupIndex = Array.prototype.indexOf.call(target.closest('.e-rule-list').children, target.closest('.e-group-container'));
5652
+ this.addGroups([{ 'condition': group.condition, 'not': group.not, 'rules': group.rules }], groupId);
5653
+ this.groupIndex = -1;
5654
+ };
5655
+ QueryBuilder.prototype.ruleClone = function (target) {
5656
+ var ruleElem = closest(target, '.e-rule-container');
5657
+ var groupElem = target.closest('.e-rule-list').closest('.e-group-container');
5658
+ var getRule = this.getRule(target);
5659
+ var groupId = groupElem.id.replace(this.element.id + '_', '');
5660
+ var ruleElemColl = groupElem.querySelectorAll('.e-rule-container');
5661
+ for (var i = 0, iLen = ruleElemColl.length; i < iLen; i++) {
5662
+ if (ruleElem.id === ruleElemColl[i].id) {
5663
+ this.ruleIndex = i;
5664
+ }
5665
+ }
5666
+ this.addRules([{ 'label': getRule.label, 'field': getRule.field, 'type': getRule.type, 'operator': getRule.operator,
5667
+ 'value': getRule.value }], groupId);
5668
+ this.ruleIndex = -1;
5669
+ };
5670
+ QueryBuilder.prototype.ruleLock = function (target) {
5671
+ var ruleElem = closest(target, '.e-rule-container');
5672
+ var rule = this.getRule(ruleElem.id.replace(this.element.id + '_', ''));
5673
+ if (ruleElem.classList.contains('e-disable')) {
5674
+ rule.isLocked = false;
5675
+ this.lockItems = this.lockItems.filter(function (lockItem) { return lockItem !== ruleElem.id; });
5676
+ ruleElem.classList.remove('e-disable');
5677
+ this.disableRuleControls(target, ruleElem, false);
5678
+ target.children[0].classList.add('e-unlock');
5679
+ target.children[0].classList.remove('e-lock');
5680
+ target.setAttribute('title', this.l10n.getConstant('LockRule'));
5681
+ }
5682
+ else {
5683
+ rule.isLocked = true;
5684
+ if (this.lockItems.indexOf(ruleElem.id) < 0) {
5685
+ this.lockItems.splice(this.lockItems.length - 1, 0, ruleElem.id);
5686
+ }
5687
+ ruleElem.classList.add('e-disable');
5688
+ this.disableRuleControls(target, ruleElem, true);
5689
+ target.children[0].classList.add('e-lock');
5690
+ target.children[0].classList.remove('e-unlock');
5691
+ target.setAttribute('title', this.l10n.getConstant('UnlockRule'));
5692
+ }
5693
+ };
5694
+ QueryBuilder.prototype.groupLock = function (target) {
5695
+ var groupElem = closest(target, '.e-group-container');
5696
+ var group = this.getGroup(groupElem.id.replace(this.element.id + '_', ''));
5697
+ var isRoot = groupElem.id.indexOf('group0') > -1;
5698
+ if (groupElem.classList.contains('e-disable')) {
5699
+ if (isRoot) {
5700
+ var newGroup = {};
5701
+ newGroup.condition = group.condition;
5702
+ newGroup.not = group.not;
5703
+ newGroup.isLocked = false;
5704
+ this.setProperties({ rule: newGroup }, true);
5705
+ }
5706
+ else {
5707
+ group.isLocked = false;
5708
+ }
5709
+ this.lockItems = this.lockItems.filter(function (lockItem) { return lockItem !== groupElem.id; });
5710
+ groupElem.classList.remove('e-disable');
5711
+ this.disableHeaderControls(target, groupElem, false);
5712
+ target.children[0].classList.add('e-unlock');
5713
+ target.children[0].classList.remove('e-lock');
5714
+ target.setAttribute('title', this.l10n.getConstant('LockGroup'));
5715
+ this.updateLockItems();
5716
+ }
5717
+ else {
5718
+ if (isRoot) {
5719
+ var newGroup = {};
5720
+ newGroup.condition = group.condition;
5721
+ newGroup.not = group.not;
5722
+ newGroup.isLocked = true;
5723
+ this.setProperties({ rule: newGroup }, true);
5724
+ }
5725
+ else {
5726
+ group.isLocked = true;
5727
+ }
5728
+ if (this.lockItems.indexOf(groupElem.id) < 0) {
5729
+ this.lockItems.splice(this.lockItems.length - 1, 0, groupElem.id);
5730
+ }
5731
+ groupElem.classList.add('e-disable');
5732
+ this.disableHeaderControls(target, groupElem, true);
5733
+ target.children[0].classList.add('e-lock');
5734
+ target.children[0].classList.remove('e-unlock');
5735
+ target.setAttribute('title', this.l10n.getConstant('UnlockGroup'));
5736
+ }
5737
+ };
5738
+ QueryBuilder.prototype.updateLockItems = function () {
5739
+ for (var i = 0; i < this.lockItems.length; i++) {
5740
+ var idColl = this.lockItems[i].split('_');
5741
+ if (idColl.length > 2) {
5742
+ var ruleElem = this.element.querySelector('#' + this.lockItems[i]);
5743
+ var target = ruleElem.querySelector('.e-lock-rule-btn');
5744
+ ruleElem = closest(target, '.e-rule-container');
5745
+ if (!ruleElem.classList.contains('e-disable')) {
5746
+ this.ruleLock(target);
5747
+ }
5748
+ }
5749
+ else {
5750
+ var groupElem = this.element.querySelector('#' + this.lockItems[i]);
5751
+ var target = groupElem.querySelector('.e-lock-grp-btn');
5752
+ groupElem = closest(target, '.e-group-container');
5753
+ if (!groupElem.classList.contains('e-disable')) {
5754
+ this.groupLock(target);
5755
+ }
5756
+ }
5757
+ }
5758
+ };
5759
+ QueryBuilder.prototype.disableHeaderControls = function (target, groupElem, isDisabled) {
5760
+ var andElem = groupElem.querySelectorAll('.e-btngroup-and');
5761
+ var orElem = groupElem.querySelectorAll('.e-btngroup-or');
5762
+ var notElem = groupElem.querySelectorAll('.e-qb-toggle');
5763
+ var addElem = groupElem.querySelectorAll('.e-add-btn');
5764
+ var deleteGrpElem = groupElem.querySelectorAll('.e-deletegroup');
5765
+ var lockElem = groupElem.querySelectorAll('.e-lock-grp-btn');
5766
+ var cloneElem = groupElem.querySelectorAll('.e-clone-grp-btn');
5767
+ var groupContElem = groupElem.querySelectorAll('.e-group-container');
5768
+ for (var i = 0; i < andElem.length; i++) {
5769
+ if (isDisabled) {
5770
+ if (groupContElem[i] && groupContElem[i].classList.contains('e-disable')) {
5771
+ groupContElem[i].classList.add('e-disable');
5772
+ }
5773
+ andElem[i].disabled = true;
5774
+ orElem[i].disabled = true;
5775
+ addElem[i].disabled = true;
5776
+ if (notElem[i]) {
5777
+ notElem[i].disabled = true;
5778
+ }
5779
+ if (deleteGrpElem[i]) {
5780
+ deleteGrpElem[i].disabled = true;
5781
+ }
5782
+ if (cloneElem[i]) {
5783
+ cloneElem[i].disabled = true;
5784
+ }
5785
+ andElem[i].parentElement.classList.add('e-disabled');
5786
+ if (lockElem[i] !== target) {
5787
+ lockElem[i].disabled = true;
5788
+ lockElem[i].children[0].classList.remove('e-unlock');
5789
+ lockElem[i].children[0].classList.add('e-lock');
5790
+ }
5791
+ }
5792
+ else {
5793
+ if (groupContElem[i]) {
5794
+ groupContElem[i].classList.remove('e-disable');
5795
+ }
5796
+ andElem[i].disabled = false;
5797
+ orElem[i].disabled = false;
5798
+ addElem[i].disabled = false;
5799
+ lockElem[i].disabled = false;
5800
+ if (notElem[i]) {
5801
+ notElem[i].disabled = false;
5802
+ }
5803
+ if (deleteGrpElem[i]) {
5804
+ deleteGrpElem[i].disabled = false;
5805
+ }
5806
+ if (cloneElem[i]) {
5807
+ cloneElem[i].disabled = false;
5808
+ }
5809
+ andElem[i].parentElement.classList.remove('e-disabled');
5810
+ lockElem[i].children[0].classList.remove('e-lock');
5811
+ lockElem[i].children[0].classList.add('e-unlock');
5812
+ }
5813
+ }
5814
+ this.disableRuleControls(target, groupElem, isDisabled);
5815
+ };
5816
+ QueryBuilder.prototype.disableRuleControls = function (target, groupElem, isDisabled) {
5817
+ var ddlElement = groupElem.querySelectorAll('.e-control.e-dropdownlist');
5818
+ var numericElement = groupElem.querySelectorAll('.e-control.e-numerictextbox');
5819
+ var textElement = groupElem.querySelectorAll('.e-control.e-textbox');
5820
+ var dateElement = groupElem.querySelectorAll('.e-control.e-datepicker');
5821
+ var checkboxElement = groupElem.querySelectorAll('.e-control.e-checkbox');
5822
+ var radioBtnElement = groupElem.querySelectorAll('.e-control.e-radio');
5823
+ var multiSelectElement = groupElem.querySelectorAll('.e-control.e-multiselect');
5824
+ var deleteElem = groupElem.querySelectorAll('.e-rule-delete');
5825
+ var lockElem = groupElem.querySelectorAll('.e-lock-rule');
5826
+ var cloneElem = groupElem.querySelectorAll('.e-clone-rule');
5827
+ var ruleElem = groupElem.querySelectorAll('.e-rule-container');
5828
+ for (var i = 0; i < deleteElem.length; i++) {
5829
+ if (isDisabled) {
5830
+ if (ruleElem[i] && ruleElem[i].classList.contains('e-disable')) {
5831
+ ruleElem[i].classList.add('e-disable');
5832
+ }
5833
+ deleteElem[i].disabled = true;
5834
+ if (cloneElem[i]) {
5835
+ cloneElem[i].disabled = true;
5836
+ }
5837
+ if (lockElem[i] !== target) {
5838
+ lockElem[i].disabled = true;
5839
+ lockElem[i].children[0].classList.remove('e-unlock');
5840
+ lockElem[i].children[0].classList.add('e-lock');
5841
+ }
5842
+ }
5843
+ else {
5844
+ if (ruleElem[i]) {
5845
+ ruleElem[i].classList.remove('e-disable');
5846
+ }
5847
+ if (cloneElem[i]) {
5848
+ cloneElem[i].disabled = false;
5849
+ }
5850
+ deleteElem[i].disabled = false;
5851
+ lockElem[i].disabled = false;
5852
+ lockElem[i].children[0].classList.remove('e-lock');
5853
+ lockElem[i].children[0].classList.add('e-unlock');
5854
+ }
5855
+ }
5856
+ var dropDownObj;
5857
+ var numericObj;
5858
+ var textObj;
5859
+ var dateObj;
5860
+ var checkBoxObj;
5861
+ var radioBtnObj;
5862
+ var multiSelectObj;
5863
+ for (var i = 0; i < ddlElement.length; i++) {
5864
+ dropDownObj = getComponent(ddlElement[i], 'dropdownlist');
5865
+ if (isDisabled) {
5866
+ dropDownObj.enabled = false;
5867
+ }
5868
+ else {
5869
+ dropDownObj.enabled = true;
5870
+ }
5871
+ }
5872
+ for (var i = 0; i < numericElement.length; i++) {
5873
+ numericObj = getComponent(numericElement[i], 'numerictextbox');
5874
+ if (isDisabled) {
5875
+ numericObj.enabled = false;
5876
+ }
5877
+ else {
5878
+ numericObj.enabled = true;
5879
+ }
5880
+ }
5881
+ for (var i = 0; i < textElement.length; i++) {
5882
+ textObj = getComponent(textElement[i], 'textbox');
5883
+ if (isDisabled) {
5884
+ textObj.enabled = false;
5885
+ }
5886
+ else {
5887
+ textObj.enabled = true;
5888
+ }
5889
+ }
5890
+ for (var i = 0; i < dateElement.length; i++) {
5891
+ dateObj = getComponent(dateElement[i], 'datepicker');
5892
+ if (isDisabled) {
5893
+ dateObj.enabled = false;
5894
+ }
5895
+ else {
5896
+ dateObj.enabled = true;
5897
+ }
5898
+ }
5899
+ for (var i = 0; i < checkboxElement.length; i++) {
5900
+ checkBoxObj = getComponent(checkboxElement[i], 'checkbox');
5901
+ if (isDisabled) {
5902
+ checkBoxObj.disabled = true;
5903
+ }
5904
+ else {
5905
+ checkBoxObj.disabled = false;
5906
+ }
5907
+ }
5908
+ for (var i = 0; i < radioBtnElement.length; i++) {
5909
+ radioBtnObj = getComponent(radioBtnElement[i], 'radio');
5910
+ if (isDisabled) {
5911
+ radioBtnObj.disabled = true;
5912
+ }
5913
+ else {
5914
+ radioBtnObj.disabled = false;
5915
+ }
5916
+ }
5917
+ for (var i = 0; i < multiSelectElement.length; i++) {
5918
+ multiSelectObj = getComponent(multiSelectElement[i], 'multiselect');
5919
+ if (isDisabled) {
5920
+ multiSelectObj.enabled = false;
5921
+ }
5922
+ else {
5923
+ multiSelectObj.enabled = true;
5924
+ }
5925
+ }
5926
+ };
5927
+ __decorate([
5928
+ Event()
5929
+ ], QueryBuilder.prototype, "created", void 0);
5930
+ __decorate([
5931
+ Event()
5932
+ ], QueryBuilder.prototype, "actionBegin", void 0);
5933
+ __decorate([
5934
+ Event()
5935
+ ], QueryBuilder.prototype, "beforeChange", void 0);
5936
+ __decorate([
5937
+ Event()
5938
+ ], QueryBuilder.prototype, "change", void 0);
5939
+ __decorate([
5940
+ Event()
5941
+ ], QueryBuilder.prototype, "dataBound", void 0);
5942
+ __decorate([
5943
+ Event()
5944
+ ], QueryBuilder.prototype, "ruleChange", void 0);
5945
+ __decorate([
5946
+ Complex({}, ShowButtons)
5947
+ ], QueryBuilder.prototype, "showButtons", void 0);
5948
+ __decorate([
5949
+ Property(false)
5950
+ ], QueryBuilder.prototype, "summaryView", void 0);
5951
+ __decorate([
5193
5952
  Property(false)
5194
5953
  ], QueryBuilder.prototype, "allowValidation", void 0);
5195
5954
  __decorate([
@@ -5246,6 +6005,15 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
5246
6005
  __decorate([
5247
6006
  Property(false)
5248
6007
  ], QueryBuilder.prototype, "readonly", void 0);
6008
+ __decorate([
6009
+ Property(true)
6010
+ ], QueryBuilder.prototype, "addRuleToNewGroups", void 0);
6011
+ __decorate([
6012
+ Property(false)
6013
+ ], QueryBuilder.prototype, "autoSelectField", void 0);
6014
+ __decorate([
6015
+ Property(true)
6016
+ ], QueryBuilder.prototype, "autoSelectOperator", void 0);
5249
6017
  __decorate([
5250
6018
  Property('')
5251
6019
  ], QueryBuilder.prototype, "separator", void 0);
@@ -5258,6 +6026,694 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
5258
6026
  return QueryBuilder;
5259
6027
  }(Component));
5260
6028
 
6029
+ var QueryLibrary = /** @__PURE__ @class */ (function () {
6030
+ function QueryLibrary(parent) {
6031
+ this.parent = parent;
6032
+ this.addEventListener();
6033
+ }
6034
+ QueryLibrary.prototype.destroy = function () {
6035
+ if (this.parent.isDestroyed) {
6036
+ return;
6037
+ }
6038
+ this.removeEventListener();
6039
+ };
6040
+ QueryLibrary.prototype.addEventListener = function () {
6041
+ if (this.parent.isDestroyed) {
6042
+ return;
6043
+ }
6044
+ this.parent.on('query-library', this.queryLibrary, this);
6045
+ this.parent.on('destroyed', this.destroy, this);
6046
+ };
6047
+ QueryLibrary.prototype.removeEventListener = function () {
6048
+ this.parent.off('query-library', this.queryLibrary);
6049
+ this.parent.off('destroyed', this.destroy);
6050
+ };
6051
+ QueryLibrary.prototype.queryLibrary = function (args) {
6052
+ switch (args.prop) {
6053
+ case 'getMongoFromRules':
6054
+ args.value['obj']['mongoQuery'] = this.getMongoFromRules(args.value['rule'], args.value['mongoQuery']);
6055
+ break;
6056
+ case 'mongoParser':
6057
+ this.mongoParser(args.value['mongoQuery'], args.value['rule'], args.value['mongoLocale']);
6058
+ break;
6059
+ case 'getParameterSql':
6060
+ args.value['obj']['sql'] = this.getParameterSql(args.value['rule']);
6061
+ break;
6062
+ case 'getNamedParameterSql':
6063
+ args.value['obj']['sql'] = this.getNamedParameterSql(args.value['rule']);
6064
+ break;
6065
+ case 'convertParamSqlToSql':
6066
+ args.value['obj']['sql'] = this.convertParamSqlToSql(args.value['sql']);
6067
+ break;
6068
+ case 'convertNamedParamSqlToSql':
6069
+ args.value['obj']['sql'] = this.convertNamedParamSqlToSql(args.value['sql']);
6070
+ break;
6071
+ }
6072
+ };
6073
+ QueryLibrary.prototype.getMongoFromRules = function (rule, mongoQuery) {
6074
+ mongoQuery = '{';
6075
+ if (rule.condition === 'or') {
6076
+ mongoQuery += '"$or":[';
6077
+ mongoQuery = this.convertMongoQuery(rule.rules, mongoQuery) + ']';
6078
+ }
6079
+ else {
6080
+ mongoQuery += '"$and":[';
6081
+ mongoQuery = this.convertMongoQuery(rule.rules, mongoQuery) + ']';
6082
+ }
6083
+ mongoQuery += '}';
6084
+ return mongoQuery;
6085
+ };
6086
+ QueryLibrary.prototype.getOperatorFromMongoOperator = function (operator) {
6087
+ var operatorValue;
6088
+ switch (operator) {
6089
+ case '$ne':
6090
+ operatorValue = 'notequal';
6091
+ break;
6092
+ case '$gt':
6093
+ operatorValue = 'greaterthan';
6094
+ break;
6095
+ case '$gte':
6096
+ operatorValue = 'greaterthanorequal';
6097
+ break;
6098
+ case '$lt':
6099
+ operatorValue = 'lessthan';
6100
+ break;
6101
+ case '$lte':
6102
+ operatorValue = 'lessthanorequal';
6103
+ break;
6104
+ case '$nin':
6105
+ operatorValue = 'notin';
6106
+ break;
6107
+ }
6108
+ return operatorValue;
6109
+ };
6110
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6111
+ QueryLibrary.prototype.convertMongoQuery = function (rules, mongoQuery) {
6112
+ var _this = this;
6113
+ var i = 0;
6114
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6115
+ rules.forEach(function (item) {
6116
+ i++;
6117
+ mongoQuery += '{';
6118
+ if (item.rules !== undefined) {
6119
+ if (item.condition === 'or') {
6120
+ mongoQuery += ' "$or":[';
6121
+ mongoQuery = _this.convertMongoQuery(item.rules, mongoQuery) + ']';
6122
+ }
6123
+ else {
6124
+ mongoQuery += ' "$and":[';
6125
+ mongoQuery = _this.convertMongoQuery(item.rules, mongoQuery) + ']';
6126
+ }
6127
+ }
6128
+ var itVal = item.type === 'string' && item.operator !== 'in' && item.operator !== 'notin' && item.value && item.value.trim() !== '' ? item.value.replace(/'/g, '\\') : '';
6129
+ if (item.type === 'string' && (item.operator === 'in' || item.operator === 'notin') && item.value && item.value.length === 1) {
6130
+ itVal = item.value[0].replace(/'/g, '\\');
6131
+ }
6132
+ var field = item.field ? item.field.substring(0) : '';
6133
+ switch (item.operator) {
6134
+ case 'contains':
6135
+ mongoQuery += '"' + field + '":{"$regex":"' + itVal + '"}';
6136
+ break;
6137
+ case 'notcontains':
6138
+ mongoQuery += '"' + field + '":{"$not":{"$regex":"' + item.value + '"}}';
6139
+ break;
6140
+ case 'startswith':
6141
+ mongoQuery += '"' + field + '":{"$regex":"^' + itVal + '"}';
6142
+ break;
6143
+ case 'notstartswith':
6144
+ mongoQuery += '"' + field + '":{"$not":{"$regex":"^' + item.value + '"}}';
6145
+ break;
6146
+ case 'endswith':
6147
+ mongoQuery += '"' + field + '":{"$regex":"' + itVal + '$"}';
6148
+ break;
6149
+ case 'notendswith':
6150
+ mongoQuery += '"' + field + '":{"$not":{"$regex":"' + item.value + '$"}}';
6151
+ break;
6152
+ case 'isnull':
6153
+ mongoQuery += '"' + field + '": null';
6154
+ break;
6155
+ case 'isnotnull':
6156
+ mongoQuery += '"' + field + '":{"$ne": null}';
6157
+ break;
6158
+ case 'isempty':
6159
+ mongoQuery += '"' + field + '": ""';
6160
+ break;
6161
+ case 'isnotempty':
6162
+ mongoQuery += '"' + field + '":{"$ne": ""}';
6163
+ break;
6164
+ case 'equal':
6165
+ if (item.type === 'string') {
6166
+ mongoQuery += '"' + field + '":"' + itVal + '"';
6167
+ }
6168
+ else if (item.type === 'date') {
6169
+ mongoQuery += '"' + field + '":"' + item.value + '"';
6170
+ }
6171
+ else if (item.type === 'boolean') {
6172
+ mongoQuery += '"' + field + '":' + item.value + '';
6173
+ }
6174
+ else {
6175
+ mongoQuery += '"' + field + '":' + item.value + '';
6176
+ }
6177
+ break;
6178
+ case 'notequal':
6179
+ if (item.type === 'string') {
6180
+ mongoQuery += '"' + field + '":{"$ne":"' + itVal + '"}';
6181
+ }
6182
+ else if (item.type === 'date') {
6183
+ mongoQuery += '"' + field + '":{"$ne":"' + item.value + '"}';
6184
+ }
6185
+ else {
6186
+ mongoQuery += '"' + field + '":{"$ne":' + item.value + '}';
6187
+ }
6188
+ break;
6189
+ case 'in':
6190
+ if (item.type === 'string') {
6191
+ if (item.value.length > 1) {
6192
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6193
+ var s = item.value.map(function (x, j) { return (j < item.value.length ? "\"" + x + "\"" : ''); }).toString();
6194
+ s = s.endsWith(',') ? s.substring(0, s.length - 1) : s;
6195
+ mongoQuery += '"' + field + '": { "$in": [' + s + ']}';
6196
+ }
6197
+ else {
6198
+ mongoQuery += '"' + field + '": { "$in": ["' + itVal + '"]}';
6199
+ }
6200
+ }
6201
+ else if (item.type === 'number') {
6202
+ if (item.value.length > 1) {
6203
+ mongoQuery += '"' + field + '": { "$in": [' + item.value.toString() + ']}';
6204
+ }
6205
+ else {
6206
+ mongoQuery += '"' + field + '": { "$in": [' + item.value + ']}';
6207
+ }
6208
+ }
6209
+ break;
6210
+ case 'notin':
6211
+ if (item.type === 'string') {
6212
+ if (item.value.length > 1) {
6213
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6214
+ var s = item.value.map(function (x, j) { return (j < item.value.length ? "\"" + x + "\"" : ''); }).toString();
6215
+ s = s.endsWith(',') ? s.substring(0, s.length - 1) : s;
6216
+ mongoQuery += '"' + field + '": { "$nin": [' + s + ']}';
6217
+ }
6218
+ else {
6219
+ mongoQuery += '"' + field + '": { "$nin": ["' + itVal + '"]}';
6220
+ }
6221
+ }
6222
+ else if (item.type === 'number') {
6223
+ if (item.value.length > 1) {
6224
+ mongoQuery += '"' + field + '": { "$nin": [' + item.value.toString() + ']}';
6225
+ }
6226
+ else {
6227
+ mongoQuery += '"' + field + '": { "$nin": [' + item.value + ']}';
6228
+ }
6229
+ }
6230
+ break;
6231
+ case 'greaterthan':
6232
+ if (item.type === 'number') {
6233
+ mongoQuery += '"' + field + '": { "$gt": ' + item.value + '}';
6234
+ }
6235
+ else {
6236
+ mongoQuery += '"' + field + '": { "$gt": "' + item.value + '"}';
6237
+ }
6238
+ break;
6239
+ case 'greaterthanorequal':
6240
+ if (item.type === 'number') {
6241
+ mongoQuery += '"' + field + '": { "$gte": ' + item.value + '}';
6242
+ }
6243
+ else {
6244
+ mongoQuery += '"' + field + '": { "$gte": "' + item.value + '"}';
6245
+ }
6246
+ break;
6247
+ case 'between':
6248
+ if (item.type === 'number') {
6249
+ mongoQuery += '"' + field + '": {"$gte":' + item.value[0] + ', "$lte":' + item.value[1] + '}';
6250
+ }
6251
+ else {
6252
+ mongoQuery += '"' + field + '": {"$gte": "' + item.value[0] + '", "$lte": "' + item.value[1] + '"}';
6253
+ }
6254
+ break;
6255
+ case 'notbetween':
6256
+ if (item.type === 'number') {
6257
+ mongoQuery += '"$or":[{"' + field + '": {"$lt":' + item.value[0] + '}}, {"' + field + '": {"$gt":' + item.value[1] + '}}]';
6258
+ }
6259
+ else {
6260
+ mongoQuery += '"$or":[{"' + field + '": {"$lt": "' + item.value[0] + '"}}, {"' + field + '": {"$gt": "' + item.value[1] + '"}}]';
6261
+ }
6262
+ break;
6263
+ case 'lessthan':
6264
+ if (item.type === 'number') {
6265
+ mongoQuery += '"' + field + '": { "$lt": ' + item.value + '}';
6266
+ }
6267
+ else {
6268
+ mongoQuery += '"' + field + '": { "$lt": "' + item.value + '"}';
6269
+ }
6270
+ break;
6271
+ case 'lessthanorequal':
6272
+ if (item.type === 'number') {
6273
+ mongoQuery += '"' + field + '": { "$lte": ' + item.value + '}';
6274
+ }
6275
+ else {
6276
+ mongoQuery += '"' + field + '": { "$lte": "' + item.value + '"}';
6277
+ }
6278
+ break;
6279
+ }
6280
+ mongoQuery += '}';
6281
+ if (rules.length !== i) {
6282
+ mongoQuery += ',';
6283
+ }
6284
+ });
6285
+ return mongoQuery;
6286
+ };
6287
+ QueryLibrary.prototype.mongoParser = function (mongoQuery, rule, mongoLocale) {
6288
+ var mongoList;
6289
+ if (Object.keys(mongoQuery).indexOf('$and') > -1) {
6290
+ mongoList = mongoQuery['$and'];
6291
+ rule.condition = 'and';
6292
+ }
6293
+ else if (Object.keys(mongoQuery).indexOf('$or') > -1) {
6294
+ mongoList = mongoQuery['$or'];
6295
+ rule.condition = 'or';
6296
+ }
6297
+ rule.rules = [];
6298
+ this.mongoRecursion(mongoList, rule.rules, mongoLocale);
6299
+ };
6300
+ QueryLibrary.prototype.mongoRecursion = function (mongoList, rules, mongoLocale) {
6301
+ var operatorValue;
6302
+ var type;
6303
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6304
+ var stringValue;
6305
+ var key;
6306
+ var betweenValue;
6307
+ var condition;
6308
+ var value;
6309
+ var subRules;
6310
+ var rule;
6311
+ var keyObj;
6312
+ var ruleValue;
6313
+ for (var i = 0, len = mongoList.length; i < len; i++) {
6314
+ var betweenOperatorArray = [];
6315
+ var inOperatorArray = [];
6316
+ condition = Object.keys(mongoList[i])[0];
6317
+ value = mongoList[i][condition];
6318
+ if (condition === '$and') {
6319
+ if (this.parent.enableNotCondition) {
6320
+ subRules = { condition: condition.replace('$', ''), rules: [], not: false };
6321
+ }
6322
+ else {
6323
+ subRules = { condition: condition.replace('$', ''), rules: [] };
6324
+ }
6325
+ rules.push(subRules);
6326
+ this.mongoRecursion(mongoList[i][condition], rules[rules.length - 1].rules, mongoLocale);
6327
+ }
6328
+ else if (condition === '$or') {
6329
+ var notBetween = void 0;
6330
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, max-len
6331
+ var innerObject = [];
6332
+ var keys = [];
6333
+ var firstKey = [];
6334
+ var secondKey = [];
6335
+ var innerKeys = [];
6336
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, max-len
6337
+ var firstValue = [];
6338
+ var secondValue = [];
6339
+ var innerFirstValue = [];
6340
+ var innerSecondValue = [];
6341
+ if (Array.isArray(value) && value.length === 2) {
6342
+ keys = Object.keys(value);
6343
+ innerFirstValue = value[keys[0]];
6344
+ innerSecondValue = value[keys[1]];
6345
+ if (typeof innerFirstValue === 'object') {
6346
+ innerObject = Object.keys(innerFirstValue)[0];
6347
+ innerKeys = Object.keys(innerFirstValue[Object.keys(innerFirstValue)[0]]);
6348
+ firstKey = innerKeys[0];
6349
+ secondKey = Object.keys(innerSecondValue[Object.keys(innerSecondValue)[0]])[0];
6350
+ if (firstKey === '$lt' && secondKey === '$gt') {
6351
+ operatorValue = 'notbetween';
6352
+ // eslint-disable-next-line security/detect-object-injection
6353
+ firstValue = innerFirstValue[innerObject][firstKey];
6354
+ // eslint-disable-next-line security/detect-object-injection
6355
+ secondValue = innerSecondValue[innerObject][secondKey];
6356
+ type = typeof firstValue === 'number' ? 'number' : 'date';
6357
+ ruleValue = [firstValue, secondValue];
6358
+ rule = { field: innerObject, label: innerObject, value: ruleValue, operator: operatorValue, type: type };
6359
+ rules.push(rule);
6360
+ notBetween = true;
6361
+ }
6362
+ }
6363
+ }
6364
+ if (!notBetween) {
6365
+ if (this.parent.enableNotCondition) {
6366
+ subRules = { condition: condition.replace('$', ''), rules: [], not: false };
6367
+ }
6368
+ else {
6369
+ subRules = { condition: condition.replace('$', ''), rules: [] };
6370
+ }
6371
+ rules.push(subRules);
6372
+ this.mongoRecursion(mongoList[i][condition], rules[rules.length - 1].rules, mongoLocale);
6373
+ }
6374
+ }
6375
+ else {
6376
+ value = mongoList[i][condition];
6377
+ if (value === null) { // isnull operator
6378
+ operatorValue = 'isnull';
6379
+ }
6380
+ if (typeof value === 'boolean') { // boolean type values
6381
+ operatorValue = 'equal';
6382
+ type = 'boolean';
6383
+ ruleValue = value;
6384
+ }
6385
+ if (typeof (value) === 'number') {
6386
+ ruleValue = value;
6387
+ type = 'number';
6388
+ operatorValue = 'equal';
6389
+ }
6390
+ else if (typeof (value) === 'object' && value !== null) {
6391
+ keyObj = Object.keys(value);
6392
+ for (var i_1 = 0; i_1 < keyObj.length; i_1++) {
6393
+ key = keyObj[i_1];
6394
+ stringValue = (value)[keyObj[i_1]];
6395
+ if (key === '$ne' && isNullOrUndefined(stringValue)) { // not null operator
6396
+ operatorValue = 'isnotnull';
6397
+ ruleValue = null;
6398
+ }
6399
+ if (key === '$ne' && typeof stringValue === 'boolean') { // not equal operator for boolean
6400
+ operatorValue = 'notequal';
6401
+ ruleValue = stringValue;
6402
+ type = 'boolean';
6403
+ }
6404
+ if (keyObj.length >= 2 && keyObj[i_1]) {
6405
+ if (typeof (stringValue) == 'object') { // between and notbetween operators
6406
+ operatorValue = 'notbetween';
6407
+ condition = Object.keys(stringValue)[0];
6408
+ betweenValue = [Object.keys(stringValue[condition])[0]];
6409
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6410
+ betweenOperatorArray.push(stringValue[condition][betweenValue]);
6411
+ type = 'number';
6412
+ }
6413
+ else {
6414
+ operatorValue = 'between';
6415
+ betweenOperatorArray.push(stringValue);
6416
+ }
6417
+ if (typeof (stringValue) === 'number') {
6418
+ type = 'number';
6419
+ }
6420
+ }
6421
+ else if (typeof (stringValue) === 'object' && stringValue !== null) { // "in" and "notin" operator
6422
+ if (key === '$not' && Object.keys(stringValue)[0] === '$regex') {
6423
+ if (stringValue['$regex'].indexOf('^') > -1) {
6424
+ operatorValue = 'notstartswith';
6425
+ ruleValue = stringValue['$regex'].replace('^', '');
6426
+ }
6427
+ else if (stringValue['$regex'].indexOf('$') > -1) {
6428
+ operatorValue = 'notendswith';
6429
+ ruleValue = stringValue['$regex'].replace('$', '');
6430
+ }
6431
+ else {
6432
+ operatorValue = 'notcontains';
6433
+ ruleValue = stringValue['$regex'];
6434
+ }
6435
+ }
6436
+ else {
6437
+ operatorValue = key === '$in' ? 'in' : 'notin';
6438
+ inOperatorArray = stringValue;
6439
+ type = typeof (stringValue[0]) === 'number' ? 'number' : 'string';
6440
+ }
6441
+ }
6442
+ else if (typeof (stringValue) === 'number') { // number type values
6443
+ operatorValue = this.getOperatorFromMongoOperator(key);
6444
+ type = 'number';
6445
+ ruleValue = stringValue;
6446
+ }
6447
+ if (typeof (stringValue) === 'string') { // string type values
6448
+ if (key === '$regex') {
6449
+ operatorValue = 'contains';
6450
+ ruleValue = stringValue;
6451
+ type = 'string';
6452
+ }
6453
+ if (key === '$ne') { // not equal
6454
+ if (stringValue !== null && stringValue.length > 0 && isNaN(Date.parse(stringValue))) {
6455
+ operatorValue = 'notequal';
6456
+ ruleValue = stringValue;
6457
+ }
6458
+ else if (isNullOrUndefined(stringValue)) { // is not null operator
6459
+ operatorValue = 'isnotnull';
6460
+ ruleValue = stringValue;
6461
+ }
6462
+ else if (stringValue === '') { // is not empty operator
6463
+ operatorValue = 'isnotempty';
6464
+ ruleValue = stringValue;
6465
+ }
6466
+ type = 'string';
6467
+ }
6468
+ if (stringValue.indexOf('^') > -1) {
6469
+ operatorValue = 'startswith';
6470
+ ruleValue = stringValue.replace('^', '');
6471
+ type = 'string';
6472
+ }
6473
+ if (stringValue.indexOf('$') > -1 && key !== '$not') {
6474
+ operatorValue = 'endswith';
6475
+ ruleValue = stringValue.replace('$', '');
6476
+ type = 'string';
6477
+ }
6478
+ if (!isNaN(Date.parse(stringValue))) { // Date type operators
6479
+ operatorValue = operatorValue || this.getOperatorFromMongoOperator(key);
6480
+ type = 'date';
6481
+ ruleValue = stringValue;
6482
+ }
6483
+ }
6484
+ }
6485
+ }
6486
+ else if (value && typeof (value) === 'string' && !isNaN(Date.parse(value))) {
6487
+ operatorValue = 'equal';
6488
+ ruleValue = value;
6489
+ type = 'date';
6490
+ }
6491
+ else if (typeof (value) === 'string' && value !== '' && value !== 'true' && value !== 'false') {
6492
+ operatorValue = 'equal';
6493
+ ruleValue = value;
6494
+ type = 'string';
6495
+ }
6496
+ else if (typeof (value) === 'string' && value === '') {
6497
+ operatorValue = 'isempty';
6498
+ ruleValue = value;
6499
+ type = 'string';
6500
+ }
6501
+ if (betweenOperatorArray && betweenOperatorArray.length > 1) { // between opertor value
6502
+ rule = { field: condition, label: condition, value: betweenOperatorArray, operator: operatorValue, type: type };
6503
+ }
6504
+ else if (inOperatorArray && inOperatorArray.length > 1) { // in operator value
6505
+ rule = { field: condition, label: condition, value: inOperatorArray, operator: operatorValue, type: type };
6506
+ }
6507
+ else {
6508
+ rule = { field: condition, label: condition, value: ruleValue, operator: operatorValue, type: type };
6509
+ }
6510
+ rules.push(rule);
6511
+ operatorValue = '';
6512
+ }
6513
+ }
6514
+ };
6515
+ QueryLibrary.prototype.convertParamSqlToSql = function (sql) {
6516
+ var paramSql = sql.sql;
6517
+ var paramValues = sql.params;
6518
+ var parts = paramSql.split('?');
6519
+ var normalSql = parts[0];
6520
+ for (var i = 0; i < paramValues.length; i++) {
6521
+ normalSql += (typeof (paramValues[i]) === 'string' ? "'" + paramValues[i] + "'" + parts[i + 1] : paramValues[i] + parts[i + 1]);
6522
+ }
6523
+ if (normalSql.length >= 2 && normalSql[0] === '(' && normalSql[normalSql.length - 1] === ')') {
6524
+ normalSql = normalSql.slice(1, -1);
6525
+ }
6526
+ normalSql = normalSql.replace(/!= ''(?! =)/g, 'IS NOT EMPTY').replace(/= ''/g, 'IS EMPTY');
6527
+ return normalSql;
6528
+ };
6529
+ QueryLibrary.prototype.convertNamedParamSqlToSql = function (sql) {
6530
+ var namedParamSql = sql.sql;
6531
+ var params = sql.params;
6532
+ var normalSql = namedParamSql;
6533
+ Object.keys(params).forEach(function (paramName) {
6534
+ var paramValue = params[paramName];
6535
+ paramName = ':' + paramName;
6536
+ normalSql = normalSql.replace(paramName, typeof (paramValue) === 'string' ? "'" + paramValue + "'" : String(paramValue));
6537
+ });
6538
+ if (normalSql.length >= 2 && normalSql[0] === '(' && normalSql[normalSql.length - 1] === ')') {
6539
+ normalSql = normalSql.slice(1, -1);
6540
+ }
6541
+ normalSql = normalSql.replace(/!= ''(?! =)/g, 'IS NOT EMPTY').replace(/= ''/g, 'IS EMPTY');
6542
+ return normalSql;
6543
+ };
6544
+ QueryLibrary.prototype.getParameterSql = function (qbrule) {
6545
+ var qbRule = extend({}, qbrule, null, true);
6546
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6547
+ var value = this.updateRuleValue(qbRule, false);
6548
+ return this.getParameterSQLVal(this.parent.getSqlFromRules(qbRule), value['ruleVal']);
6549
+ };
6550
+ QueryLibrary.prototype.getNamedParameterSql = function (qbrule) {
6551
+ var qbRule = extend({}, qbrule, null, true);
6552
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6553
+ var value = this.updateRuleValue(qbRule, true);
6554
+ return this.getNamedParameterSQLVal(this.parent.getSqlFromRules(qbRule), value['namedRuleVal']);
6555
+ };
6556
+ QueryLibrary.prototype.getParameterSQLVal = function (content, ruleValue) {
6557
+ var replacedString = content.replace(/[%']/g, '');
6558
+ return { sql: '(' + replacedString + ')', params: ruleValue };
6559
+ };
6560
+ QueryLibrary.prototype.getNamedParameterSQLVal = function (content, ruleValue) {
6561
+ var replacedString = content.replace(/[%']/g, '');
6562
+ return { sql: '(' + replacedString + ')', params: ruleValue };
6563
+ };
6564
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6565
+ QueryLibrary.prototype.updateRuleValue = function (rule, isNamedParameter) {
6566
+ var ruleVal = [];
6567
+ var namedRuleVal = {};
6568
+ var namedParameters = [];
6569
+ return this.updateValue(rule.rules, isNamedParameter, ruleVal, namedRuleVal, namedParameters);
6570
+ };
6571
+ QueryLibrary.prototype.updateValue = function (rules, isNamedParameter, ruleVal,
6572
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6573
+ namedRuleVal, namedParameters) {
6574
+ if (isNullOrUndefined(rules)) {
6575
+ return { ruleVal: ruleVal, namedRuleVal: namedRuleVal };
6576
+ }
6577
+ for (var i = 0; i < rules.length; i++) {
6578
+ if (rules[i].rules) {
6579
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6580
+ var value = this.updateValue(rules[i].rules, isNamedParameter, ruleVal, namedRuleVal, namedParameters);
6581
+ ruleVal = value['ruleVal'];
6582
+ namedRuleVal = value['namedRuleVal'];
6583
+ }
6584
+ else {
6585
+ var namedField = void 0;
6586
+ if (rules[i].value instanceof Array) {
6587
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6588
+ for (var j = 0; j < (rules[i].value).length; j++) {
6589
+ if (isNamedParameter) {
6590
+ namedField = this.getNamedParameter(rules[i].field, namedParameters);
6591
+ }
6592
+ if (!isNullOrUndefined(rules[i].value[j])) {
6593
+ if (rules[i].type === 'string' || rules[i].type === 'date') {
6594
+ if (isNamedParameter) {
6595
+ namedRuleVal[namedField] = rules[i].value[j];
6596
+ }
6597
+ else {
6598
+ ruleVal.push(rules[i].value[j]);
6599
+ }
6600
+ }
6601
+ else {
6602
+ if (isNamedParameter) {
6603
+ namedRuleVal[namedField] = rules[i].value[j];
6604
+ }
6605
+ else {
6606
+ ruleVal.push(rules[i].value[j]);
6607
+ }
6608
+ }
6609
+ }
6610
+ if (isNamedParameter) {
6611
+ rules[i].value[j] = ':' + namedField;
6612
+ }
6613
+ else {
6614
+ rules[i].value[j] = '?';
6615
+ }
6616
+ }
6617
+ }
6618
+ else {
6619
+ if (isNamedParameter) {
6620
+ namedField = this.getNamedParameter(rules[i].field, namedParameters);
6621
+ }
6622
+ if (rules[i].operator.indexOf('null') < 1) {
6623
+ if (rules[i].type !== 'string' || (rules[i].type === 'string' && (rules[i].value !== '' || rules[i].value === 0))) {
6624
+ if (rules[i].type === 'string' || rules[i].type === 'date') {
6625
+ if (rules[i].operator.indexOf('empty') < 1) {
6626
+ var value = rules[i].value.toString();
6627
+ switch (rules[i].operator) {
6628
+ case 'startswith':
6629
+ case 'notstartswith':
6630
+ value = value + '%';
6631
+ break;
6632
+ case 'endswith':
6633
+ case 'notendswith':
6634
+ value = '%' + value;
6635
+ break;
6636
+ case 'contains':
6637
+ case 'notcontains':
6638
+ value = '%' + value + '%';
6639
+ break;
6640
+ }
6641
+ if (isNamedParameter) {
6642
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6643
+ namedRuleVal[namedField] = value;
6644
+ }
6645
+ else {
6646
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6647
+ ruleVal.push(value);
6648
+ }
6649
+ }
6650
+ else {
6651
+ if (isNamedParameter) {
6652
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6653
+ namedRuleVal[namedField] = '';
6654
+ }
6655
+ else {
6656
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6657
+ ruleVal.push('');
6658
+ }
6659
+ if (rules[i].operator === 'isempty') {
6660
+ rules[i].operator = 'equal';
6661
+ }
6662
+ else {
6663
+ rules[i].operator = 'notequal';
6664
+ }
6665
+ }
6666
+ }
6667
+ else {
6668
+ if (!isNullOrUndefined(rules[i].value)) {
6669
+ if (isNamedParameter) {
6670
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6671
+ namedRuleVal[namedField] = rules[i].value;
6672
+ }
6673
+ else {
6674
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6675
+ ruleVal.push(rules[i].value);
6676
+ }
6677
+ }
6678
+ }
6679
+ if (isNamedParameter) {
6680
+ rules[i].value = ':' + namedField;
6681
+ }
6682
+ else {
6683
+ rules[i].value = '?';
6684
+ }
6685
+ }
6686
+ }
6687
+ }
6688
+ }
6689
+ }
6690
+ return { ruleVal: ruleVal, namedRuleVal: namedRuleVal };
6691
+ };
6692
+ QueryLibrary.prototype.getNamedParameter = function (field, namedParameters) {
6693
+ var newField = null;
6694
+ if (namedParameters.length > 0) {
6695
+ for (var i = namedParameters.length - 1; i >= 0; i--) {
6696
+ var currField = namedParameters[i];
6697
+ if (currField.indexOf(field) > -1) {
6698
+ var idx = parseInt(currField.split('_')[1], 10) + 1;
6699
+ newField = field + '_' + idx;
6700
+ namedParameters.push(newField);
6701
+ break;
6702
+ }
6703
+ }
6704
+ }
6705
+ if (!newField) {
6706
+ newField = field + '_1';
6707
+ namedParameters.push(newField);
6708
+ }
6709
+ return newField;
6710
+ };
6711
+ QueryLibrary.prototype.getModuleName = function () {
6712
+ return 'query-library';
6713
+ };
6714
+ return QueryLibrary;
6715
+ }());
6716
+
5261
6717
  /**
5262
6718
  * QueryBuilder modules
5263
6719
  */
@@ -5266,5 +6722,5 @@ var QueryBuilder = /** @__PURE__ @class */ (function (_super) {
5266
6722
  * QueryBuilder all modules
5267
6723
  */
5268
6724
 
5269
- export { Columns, Rule, Value, ShowButtons, QueryBuilder };
6725
+ export { Columns, Rule, Value, ShowButtons, QueryBuilder, QueryLibrary };
5270
6726
  //# sourceMappingURL=ej2-querybuilder.es5.js.map