@syncfusion/ej2-querybuilder 19.4.40 → 19.4.50

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.
@@ -134,6 +134,9 @@ let QueryBuilder = class QueryBuilder extends Component {
134
134
  this.isNotified = false;
135
135
  this.isAddSuccess = false;
136
136
  this.isNotValueChange = false;
137
+ this.isFieldChange = false;
138
+ this.isFieldClose = false;
139
+ this.isDestroy = false;
137
140
  MultiSelect.Inject(CheckBoxSelection);
138
141
  }
139
142
  getPersistData() {
@@ -606,8 +609,8 @@ let QueryBuilder = class QueryBuilder extends Component {
606
609
  ddlField = {
607
610
  dataSource: this.columns,
608
611
  fields: this.fields, placeholder: this.l10n.getConstant('SelectField'),
609
- popupHeight: ((this.columns.length > 5) ? height : 'auto'),
610
- change: this.changeField.bind(this), value: rule ? ddlValue : null, open: this.popupOpen.bind(this)
612
+ popupHeight: ((this.columns.length > 5) ? height : 'auto'), close: this.fieldClose.bind(this, ruleElem.id + '_filterkey'),
613
+ change: this.changeField.bind(this), value: rule ? ddlValue : null, open: this.popupOpen.bind(this, true)
611
614
  };
612
615
  if (this.fieldModel) {
613
616
  ddlField = Object.assign({}, ddlField, this.fieldModel);
@@ -629,11 +632,11 @@ let QueryBuilder = class QueryBuilder extends Component {
629
632
  const ddlValue = this.isImportRules ? rule.field : rule.field;
630
633
  ddlField = {
631
634
  fields: { dataSource: this.columns,
632
- value: "field", text: "label", child: 'columns', expanded: "expanded" },
635
+ value: 'field', text: 'label', child: 'columns', expanded: 'expanded' },
633
636
  placeholder: this.l10n.getConstant('SelectField'), showClearButton: false,
634
637
  popupHeight: ((this.columns.length > 5) ? height : 'auto'), changeOnBlur: false,
635
638
  change: this.changeField.bind(this), value: this.isImportRules ? [ddlValue] : null,
636
- open: this.popupOpen.bind(this)
639
+ open: this.popupOpen.bind(this, false)
637
640
  };
638
641
  if (this.fieldModel) {
639
642
  ddlField = Object.assign({}, ddlField, this.fieldModel);
@@ -677,12 +680,19 @@ let QueryBuilder = class QueryBuilder extends Component {
677
680
  else {
678
681
  groupElem = closest(target, '.e-group-container');
679
682
  rules = this.getParentGroup(groupElem);
683
+ const custom = rule.custom;
680
684
  if (Object.keys(rule).length) {
681
685
  rules.rules.push({
682
686
  'field': rule.field, 'type': rule.type, 'label': rule.label, 'operator': rule.operator, value: rule.value
683
687
  });
688
+ if (custom) {
689
+ rules.rules[rules.rules.length - 1].custom = custom;
690
+ }
684
691
  }
685
692
  else {
693
+ if (custom) {
694
+ newRule.custom = custom;
695
+ }
686
696
  rules.rules.push(newRule);
687
697
  }
688
698
  }
@@ -1233,21 +1243,41 @@ let QueryBuilder = class QueryBuilder extends Component {
1233
1243
  }
1234
1244
  }
1235
1245
  }
1246
+ fieldClose(id) {
1247
+ if (this.isFieldChange || this.isDestroy) {
1248
+ return;
1249
+ }
1250
+ this.isFieldClose = true;
1251
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1252
+ const ddl = getComponent(id, 'dropdownlist');
1253
+ const item = ddl.popupObj.element.querySelector('.e-active');
1254
+ const itemData = ddl.getItemData();
1255
+ ddl.value = itemData.value;
1256
+ const customArgs = { element: ddl.element, value: itemData.value, isInteracted: true,
1257
+ previousItemData: this.prevItemData, previousItem: null, item: item, itemData: itemData, event: null, e: null };
1258
+ this.changeField(customArgs);
1259
+ this.isFieldChange = false;
1260
+ }
1236
1261
  changeField(args) {
1237
1262
  if (args.isInteracted) {
1263
+ if (isNullOrUndefined(args.value)) {
1264
+ return;
1265
+ }
1266
+ this.isFieldChange = true;
1267
+ this.prevItemData = args.itemData;
1238
1268
  const fieldElem = closest(args.element, '.e-rule-filter') || closest(args.element, '.e-rule-sub-filter');
1239
1269
  const column = this.fieldMode === 'DropdownTree' ? this.getColumn(args.value[0]) : this.getColumn(args.value);
1240
1270
  if (this.fieldMode === 'DropdownTree' && fieldElem != null) {
1241
- const ddtElem = fieldElem.querySelector(".e-control");
1271
+ const ddtElem = fieldElem.querySelector('.e-control');
1242
1272
  const ddt = getComponent(ddtElem, 'dropdowntree');
1243
1273
  if (column) {
1244
- if (column.type == 'object') {
1274
+ if (column.type === 'object') {
1245
1275
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1246
1276
  ddt.value = args.oldValue;
1247
1277
  ddt.dataBind();
1248
1278
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1249
1279
  if (isNullOrUndefined(args.oldValue)) {
1250
- ddtElem.value = "";
1280
+ ddtElem.value = '';
1251
1281
  }
1252
1282
  else {
1253
1283
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -1283,6 +1313,7 @@ let QueryBuilder = class QueryBuilder extends Component {
1283
1313
  ruleElem = ruleElem.previousElementSibling;
1284
1314
  index++;
1285
1315
  }
1316
+ rules.rules[index].value = '';
1286
1317
  this.changeRule(rules.rules[index], args);
1287
1318
  }
1288
1319
  }
@@ -1370,6 +1401,9 @@ let QueryBuilder = class QueryBuilder extends Component {
1370
1401
  getComponent(tooltipElem[i], 'tooltip').destroy();
1371
1402
  }
1372
1403
  if (!args.cancel) {
1404
+ if (isNullOrUndefined(this.selectedColumn)) {
1405
+ return;
1406
+ }
1373
1407
  tempRule.type = this.selectedColumn.type;
1374
1408
  if (ruleElem.querySelector('.e-template')) {
1375
1409
  rule.value = '';
@@ -1404,15 +1438,20 @@ let QueryBuilder = class QueryBuilder extends Component {
1404
1438
  tempElem.appendChild(subFieldElem);
1405
1439
  const height = (this.element.className.indexOf('e-device') > -1) ? '250px' : '200px';
1406
1440
  const subFieldData = Object.keys(this.selectedColumn.columns[0]);
1407
- const dropDownList = new DropDownList({
1441
+ let ddlField;
1442
+ ddlField = {
1408
1443
  dataSource: this.selectedColumn.columns,
1409
1444
  fields: this.fields,
1410
1445
  placeholder: this.l10n.getConstant('SelectField'),
1411
1446
  popupHeight: ((subFieldData.length > 5) ? height : 'auto'),
1412
1447
  change: this.changeField.bind(this),
1413
1448
  index: 0,
1414
- open: this.popupOpen.bind(this)
1415
- });
1449
+ open: this.popupOpen.bind(this, false)
1450
+ };
1451
+ if (this.fieldModel) {
1452
+ ddlField = Object.assign({}, ddlField, this.fieldModel);
1453
+ }
1454
+ const dropDownList = new DropDownList(ddlField);
1416
1455
  dropDownList.appendTo('#' + ruleId + '_subfilterkey' + this.subFilterCounter);
1417
1456
  if (this.isImportRules) {
1418
1457
  const subField = this.selectedColumn.columns;
@@ -1532,7 +1571,7 @@ let QueryBuilder = class QueryBuilder extends Component {
1532
1571
  change: this.changeField.bind(this),
1533
1572
  index: 0,
1534
1573
  value: value,
1535
- open: this.popupOpen.bind(this)
1574
+ open: this.popupOpen.bind(this, false)
1536
1575
  };
1537
1576
  if (this.operatorModel) {
1538
1577
  ddlOperator = Object.assign({}, ddlOperator, this.operatorModel);
@@ -1551,10 +1590,13 @@ let QueryBuilder = class QueryBuilder extends Component {
1551
1590
  this.updateRules(ddlArgs.element, ddlArgs.item);
1552
1591
  }
1553
1592
  }
1554
- popupOpen(args) {
1593
+ popupOpen(isField, args) {
1555
1594
  if (this.enableRtl) {
1556
1595
  addClass([args.popup.element], 'e-rtl');
1557
1596
  }
1597
+ if (isField) {
1598
+ this.isFieldClose = false;
1599
+ }
1558
1600
  }
1559
1601
  destroyControls(target, isRuleTemplate) {
1560
1602
  const element = isRuleTemplate ? target : target.nextElementSibling;
@@ -1747,7 +1789,7 @@ let QueryBuilder = class QueryBuilder extends Component {
1747
1789
  change: this.changeValue.bind(this, i),
1748
1790
  close: this.closePopup.bind(this, i),
1749
1791
  actionBegin: this.multiSelectOpen.bind(this, parentId + '_valuekey' + i),
1750
- open: this.popupOpen.bind(this)
1792
+ open: this.popupOpen.bind(this, false)
1751
1793
  };
1752
1794
  if (this.valueModel && this.valueModel.multiSelectModel) {
1753
1795
  multiSelectValue = Object.assign({}, multiSelectValue, this.valueModel.multiSelectModel);
@@ -1806,8 +1848,10 @@ let QueryBuilder = class QueryBuilder extends Component {
1806
1848
  }
1807
1849
  closePopup(i, args) {
1808
1850
  const element = document.getElementById(args.popup.element.id.replace('_popup', ''));
1809
- const value = getComponent(element, 'multiselect').value;
1810
- this.updateRules(element, value, i);
1851
+ if (element) {
1852
+ const value = getComponent(element, 'multiselect').value;
1853
+ this.updateRules(element, value, i);
1854
+ }
1811
1855
  }
1812
1856
  processTemplate(target, itemData, rule, tempRule) {
1813
1857
  const container = closest(target, '.e-rule-container');
@@ -2168,6 +2212,9 @@ let QueryBuilder = class QueryBuilder extends Component {
2168
2212
  return 0;
2169
2213
  }
2170
2214
  getPreviousItemData(prevItemData, column) {
2215
+ if (this.isFieldClose && prevItemData) {
2216
+ prevItemData = this.getColumn(prevItemData.value);
2217
+ }
2171
2218
  if (column.template && prevItemData && Object.keys(prevItemData).length < 4) {
2172
2219
  prevItemData.template = column.template;
2173
2220
  }
@@ -2659,6 +2706,7 @@ let QueryBuilder = class QueryBuilder extends Component {
2659
2706
  * @returns {void}
2660
2707
  */
2661
2708
  destroy() {
2709
+ this.isDestroy = true;
2662
2710
  const queryElement = this.element;
2663
2711
  if (!queryElement) {
2664
2712
  return;
@@ -2714,6 +2762,7 @@ let QueryBuilder = class QueryBuilder extends Component {
2714
2762
  this.clearQBTemplate();
2715
2763
  }
2716
2764
  classList(this.element, [], ['e-rtl', 'e-responsive', 'e-device']);
2765
+ this.isDestroy = false;
2717
2766
  }
2718
2767
  /**
2719
2768
  * Adds single or multiple rules.
@@ -3350,7 +3399,11 @@ let QueryBuilder = class QueryBuilder extends Component {
3350
3399
  }
3351
3400
  }
3352
3401
  const isTemplateRendered = clnruleElem.querySelector('.e-template-value');
3353
- detach(clnruleElem);
3402
+ try {
3403
+ detach(clnruleElem);
3404
+ }
3405
+ catch (err) {
3406
+ }
3354
3407
  if (column && column.ruleTemplate) {
3355
3408
  this.clearQBTemplate([clnruleElem.id]);
3356
3409
  }
@@ -3470,10 +3523,14 @@ let QueryBuilder = class QueryBuilder extends Component {
3470
3523
  }
3471
3524
  }
3472
3525
  if ((this.isRefreshed && this.enablePersistence) || (this.rule.field !== '' && rule.operator !== '' && (rule.value !== '' &&
3473
- rule.value !== undefined))) {
3526
+ rule.value !== undefined)) || (customObj && customObj.isQuestion)) {
3527
+ const condition = rule.condition;
3474
3528
  rule = {
3475
3529
  'label': rule.label, 'field': rule.field, 'operator': rule.operator, 'type': rule.type, 'value': rule.value
3476
3530
  };
3531
+ if (condition) {
3532
+ rule.condition = condition;
3533
+ }
3477
3534
  if (customObj) {
3478
3535
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
3479
3536
  rule.custom = customObj;
@@ -3495,6 +3552,9 @@ let QueryBuilder = class QueryBuilder extends Component {
3495
3552
  rule.not = notValue;
3496
3553
  }
3497
3554
  }
3555
+ else if ((isNullOrUndefined(rule.condition)) && isNullOrUndefined(rule.rules)) {
3556
+ rule = { 'label': '', 'field': '', 'operator': '', 'type': '', 'value': '' };
3557
+ }
3498
3558
  else {
3499
3559
  if (this.enableNotCondition) {
3500
3560
  rule = { 'condition': rule.condition, 'rules': rule.rules, 'not': rule.not };
@@ -3678,7 +3738,7 @@ let QueryBuilder = class QueryBuilder extends Component {
3678
3738
  }
3679
3739
  }
3680
3740
  }
3681
- else if (ruleColl[i].operator.length) {
3741
+ else if (!isNullOrUndefined(ruleColl[i].operator) && !isNullOrUndefined(ruleColl[i].operator.length)) {
3682
3742
  const oper = ruleColl[i].operator.toLowerCase();
3683
3743
  let isDateFilter = false;
3684
3744
  const dateOperColl = ['equal', 'notequal', 'greaterthan', 'greaterthanorequal', 'lessthan', 'lessthanorequal'];
@@ -3779,6 +3839,12 @@ let QueryBuilder = class QueryBuilder extends Component {
3779
3839
  break;
3780
3840
  }
3781
3841
  }
3842
+ else if (field.indexOf(this.separator) > -1) {
3843
+ if (columns[i].field === field.split(this.separator)[0]) {
3844
+ column = columns[i];
3845
+ break;
3846
+ }
3847
+ }
3782
3848
  }
3783
3849
  return column;
3784
3850
  }
@@ -3868,7 +3934,7 @@ let QueryBuilder = class QueryBuilder extends Component {
3868
3934
  }
3869
3935
  if (!(operator.indexOf('null') > -1 || operator.indexOf('empty') > -1)) {
3870
3936
  for (let j = 0, jLen = value.length; j < jLen; j++) {
3871
- if (value[j] !== '') {
3937
+ if (value[j] !== '' || ((operator === 'in' || operator === 'notin') && column.type === 'string')) {
3872
3938
  if (j === 0) {
3873
3939
  const gte = 'greaterthanorequal';
3874
3940
  switch (operator) {
@@ -4010,7 +4076,7 @@ let QueryBuilder = class QueryBuilder extends Component {
4010
4076
  if (!isNullOrUndefined(ruleColl)) {
4011
4077
  for (let i = 0, len = ruleColl.length; i < len; i++) {
4012
4078
  const keys = Object.keys(ruleColl[i]);
4013
- if (!isNullOrUndefined(ruleColl[i].rules) && keys.indexOf('rules') > -1) {
4079
+ if (!isNullOrUndefined(ruleColl[i].rules) && keys.indexOf('rules') > -1 && (ruleColl[i].rules.length !== 0)) {
4014
4080
  parentElem = this.renderGroup(ruleColl[i], ruleColl[i].condition, parentElem, ruleColl[i].not);
4015
4081
  parentElem = this.importRules(ruleColl[i], parentElem, true);
4016
4082
  }
@@ -4167,7 +4233,7 @@ let QueryBuilder = class QueryBuilder extends Component {
4167
4233
  else {
4168
4234
  queryStr += '(';
4169
4235
  }
4170
- const condition = rules.condition;
4236
+ let condition = rules.condition;
4171
4237
  if (rules.not) {
4172
4238
  if (isRoot) {
4173
4239
  queryStr += 'NOT (';
@@ -4246,8 +4312,14 @@ let QueryBuilder = class QueryBuilder extends Component {
4246
4312
  }
4247
4313
  queryStr += rule.field + ' ' + this.operators[rule.operator] + ' ' + valueStr;
4248
4314
  }
4315
+ if (rule.condition && rule.condition != '') {
4316
+ condition = rule.condition;
4317
+ }
4249
4318
  }
4250
4319
  if (j !== jLen - 1) {
4320
+ if (condition === '') {
4321
+ condition = rules.rules[j].condition;
4322
+ }
4251
4323
  queryStr += ' ' + condition.toUpperCase() + ' ';
4252
4324
  }
4253
4325
  }
@@ -4381,6 +4453,12 @@ let QueryBuilder = class QueryBuilder extends Component {
4381
4453
  this.parser.push(['Literal', matchValue]);
4382
4454
  return matchValue.length + 2;
4383
4455
  }
4456
+ // eslint-disable-next-line
4457
+ if (this.checkNumberLiteral(sqlString)) {
4458
+ matchValue = /^[0-9]+(\.[0-9]+)?/.exec(sqlString)[0];
4459
+ this.parser.push(['Literal', matchValue]);
4460
+ return matchValue.length;
4461
+ }
4384
4462
  //String
4385
4463
  if (/^'((?:[^\\']+?|\\.|'')*)'(?!')/.exec(sqlString)) {
4386
4464
  matchValue = /^'((?:[^\\']+?|\\.|'')*)'(?!')/.exec(sqlString)[0];
@@ -4420,6 +4498,25 @@ let QueryBuilder = class QueryBuilder extends Component {
4420
4498
  }
4421
4499
  return false;
4422
4500
  }
4501
+ checkNumberLiteral(sqlString) {
4502
+ const lastParser = this.parser[this.parser.length - 1];
4503
+ if (!lastParser) {
4504
+ return true;
4505
+ }
4506
+ else {
4507
+ if (/^[0-9]+(\.[0-9]+)?/.exec(sqlString)) {
4508
+ const secParser = this.parser[this.parser.length - 2];
4509
+ const betweenParser = this.parser[this.parser.length - 3];
4510
+ if (lastParser[0] === 'Left' && (secParser && secParser[0] === 'Conditions')) {
4511
+ return true;
4512
+ }
4513
+ if (lastParser[0] === 'Conditions' && (betweenParser && betweenParser[1].indexOf('between') < 0)) {
4514
+ return true;
4515
+ }
4516
+ }
4517
+ }
4518
+ return false;
4519
+ }
4423
4520
  getOperator(value, operator) {
4424
4521
  const operators = {
4425
4522
  '=': 'equal', '!=': 'notequal', '<': 'lessthan', '>': 'greaterthan', '<=': 'lessthanorequal',