@syncfusion/ej2-querybuilder 26.1.38 → 26.1.42

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.
@@ -1081,7 +1081,7 @@ let QueryBuilder = class QueryBuilder extends Component {
1081
1081
  popupHeight: ((this.columns.length > 5) ? height : 'auto'), changeOnBlur: false,
1082
1082
  change: this.changeField.bind(this), value: !isNullOrUndefined(ddlValue) ? [ddlValue] : null,
1083
1083
  open: this.popupOpen.bind(this, false), treeSettings: { expandOn: 'Click' },
1084
- cssClass: 'e-qb-ddt'
1084
+ cssClass: 'e-qb-ddt', filtering: this.dropdownTreeFiltering.bind(this), close: this.dropdownTreeClose.bind(this)
1085
1085
  };
1086
1086
  if (this.fieldModel) {
1087
1087
  ddlField = Object.assign({}, ddlField, this.fieldModel);
@@ -1151,14 +1151,80 @@ let QueryBuilder = class QueryBuilder extends Component {
1151
1151
  this.setMultiConnector(ruleElem);
1152
1152
  }
1153
1153
  }
1154
+ dropdownTreeFiltering(args) {
1155
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
1156
+ const proxy = this;
1157
+ let ruleElemID = '';
1158
+ const srcElement = args.event.srcElement;
1159
+ const isClearIcon = srcElement.classList.contains('e-clear-icon');
1160
+ const inputElem = isClearIcon ? srcElement.parentElement.querySelector('.e-textbox') : srcElement;
1161
+ ruleElemID = inputElem.id.split('_filterkey')[0];
1162
+ const ruleElem = document.getElementById(ruleElemID);
1163
+ this.ddTree = getComponent(ruleElem.querySelector('input.e-dropdowntree'), 'dropdowntree');
1164
+ const hierarchicalData = extend([], this.columns, [], true);
1165
+ // Cancel the default filtering.
1166
+ args.cancel = true;
1167
+ if (args.text === '') {
1168
+ this.changeDataSource(hierarchicalData);
1169
+ }
1170
+ else {
1171
+ const matchedDataSource = hierarchicalData
1172
+ .map((data) => this.nestedChildFilter(args.text, data))
1173
+ .filter((filteredChild) => filteredChild !== null);
1174
+ this.changeDataSource(matchedDataSource);
1175
+ setTimeout(() => {
1176
+ proxy.ddTree.treeObj.expandAll();
1177
+ }, 100);
1178
+ }
1179
+ }
1180
+ changeDataSource(data) {
1181
+ this.ddTree.treeObj.fields = {
1182
+ dataSource: data,
1183
+ value: 'field',
1184
+ text: 'label',
1185
+ child: 'columns',
1186
+ expanded: 'expanded'
1187
+ };
1188
+ this.ddTree.treeObj.refresh();
1189
+ }
1190
+ nestedChildFilter(value, node) {
1191
+ const children = node[this.ddTree.fields.child];
1192
+ if (!children) {
1193
+ return this.isMatchedNode(value, node) ? node : null;
1194
+ }
1195
+ const matchedChildren = children
1196
+ .map((child) => this.nestedChildFilter(value, child))
1197
+ .filter((filteredChild) => filteredChild !== null);
1198
+ if (matchedChildren.length) {
1199
+ node[this.ddTree.fields.child] = matchedChildren;
1200
+ return node;
1201
+ }
1202
+ else {
1203
+ node[this.ddTree.fields.child] = children;
1204
+ return this.isMatchedNode(value, node) ? node : null;
1205
+ }
1206
+ }
1207
+ isMatchedNode(value, node) {
1208
+ const checkValue = node[this.ddTree.fields.text].toLowerCase();
1209
+ value = value ? value.toLowerCase() : '';
1210
+ return checkValue.indexOf(value) !== -1;
1211
+ }
1212
+ dropdownTreeClose() {
1213
+ if (this.ddTree) {
1214
+ this.changeDataSource(this.columns);
1215
+ }
1216
+ this.ddTree = null;
1217
+ }
1154
1218
  updateDropdowntreeDS(columns) {
1155
1219
  for (let i = 0; i < columns.length; i++) {
1156
1220
  if (columns[parseInt(i.toString(), 10)].type === 'object') {
1221
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1157
1222
  if (this.isAngular && columns[parseInt(i.toString(), 10)].template) {
1158
1223
  delete columns[parseInt(i.toString(), 10)].template;
1159
1224
  }
1160
1225
  columns[parseInt(i.toString(), 10)].selectable = false;
1161
1226
  this.updateDropdowntreeDS(columns[parseInt(i.toString(), 10)].columns);
1227
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1162
1228
  }
1163
1229
  else if (this.isAngular && columns[parseInt(i.toString(), 10)].template) {
1164
1230
  delete columns[parseInt(i.toString(), 10)].template;
@@ -1323,10 +1389,12 @@ let QueryBuilder = class QueryBuilder extends Component {
1323
1389
  }
1324
1390
  if (excludeOprs.indexOf(rule.rules[index].operator) < -1 &&
1325
1391
  (isNullOrUndefined(rule.rules[index].value) &&
1326
- rule.rules[index].type !== 'date') || rule.rules[index].value === '' ||
1392
+ rule.rules[index].type !== 'date') || rule.rules[index].value === '' || rule.rules[index].value === null ||
1327
1393
  (rule.rules[index].value instanceof Array && valArray.length < 1)) {
1328
1394
  const valElem = tempElem.querySelectorAll('.e-rule-value .e-control');
1329
- isValid = false;
1395
+ if (excludeOprs.indexOf(rule.rules[index].operator) < 0) {
1396
+ isValid = false;
1397
+ }
1330
1398
  for (let j = 0, jLen = valElem.length; j < jLen; j++) {
1331
1399
  const element = valElem[j];
1332
1400
  let elem;
@@ -1341,6 +1409,18 @@ let QueryBuilder = class QueryBuilder extends Component {
1341
1409
  }
1342
1410
  j++;
1343
1411
  }
1412
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1413
+ }
1414
+ else if (rule.rules[index].type === 'date' && (rule.rules[index].value === null || rule.rules[index].value.indexOf(null) > -1)) {
1415
+ const valElem = tempElem.querySelectorAll('.e-rule-value .e-control');
1416
+ if (excludeOprs.indexOf(rule.rules[index].operator) < 0) {
1417
+ isValid = false;
1418
+ }
1419
+ for (let j = 0, jLen = valElem.length; j < jLen; j++) {
1420
+ if (valElem[j].parentElement.className.indexOf('e-tooltip') < 0 && valElem[j].className.indexOf('e-tooltip') < 0 && (isNullOrUndefined(rule.rules[index].value) || rule.rules[index].value[j] == null)) {
1421
+ this.renderToolTip(valElem[j].parentElement);
1422
+ }
1423
+ }
1344
1424
  }
1345
1425
  }
1346
1426
  else if ((dropDownObj && dropDownObj.element && isNullOrUndefined(dropDownObj.index)) ||
@@ -2092,6 +2172,9 @@ let QueryBuilder = class QueryBuilder extends Component {
2092
2172
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
2093
2173
  element = args.element;
2094
2174
  }
2175
+ if (!element) {
2176
+ return;
2177
+ }
2095
2178
  if (element.className.indexOf('e-day') > -1 || element.className.indexOf('e-today') > -1 || element.className.indexOf('e-cell') > -1) {
2096
2179
  const calenderArgs = args;
2097
2180
  element = calenderArgs.element;
@@ -3717,6 +3800,9 @@ let QueryBuilder = class QueryBuilder extends Component {
3717
3800
  if (valElem[1] && valElem[1].parentElement.className.indexOf('e-tooltip') > -1) {
3718
3801
  getComponent(valElem[1].parentElement, 'tooltip').destroy();
3719
3802
  }
3803
+ if (valElem[2] && valElem[2].parentElement.className.indexOf('e-tooltip') > -1) {
3804
+ getComponent(valElem[2].parentElement, 'tooltip').destroy();
3805
+ }
3720
3806
  }
3721
3807
  }
3722
3808
  }
@@ -6482,6 +6568,7 @@ let QueryBuilder = class QueryBuilder extends Component {
6482
6568
  let grpCount;
6483
6569
  let operator;
6484
6570
  let isLeftOpened = false;
6571
+ let isNotOpened = false;
6485
6572
  for (let i = 0, iLen = parser.length; i < iLen; i++) {
6486
6573
  if (parser[i][0] === 'Literal') {
6487
6574
  const column = this.getColumn(parser[i][1]);
@@ -6617,6 +6704,7 @@ let QueryBuilder = class QueryBuilder extends Component {
6617
6704
  }
6618
6705
  else if (parser[i][0] === 'Left') {
6619
6706
  if (!(parser[0][0] === 'Left') && (parser[i - 1][1] === 'not' || sqlLocale && this.l10n.getConstant('NOT').toLowerCase() === parser[i - 1][1])) {
6707
+ isNotOpened = true;
6620
6708
  continue;
6621
6709
  }
6622
6710
  this.parser = parser.splice(i + 1, iLen - (i + 1));
@@ -6647,6 +6735,10 @@ let QueryBuilder = class QueryBuilder extends Component {
6647
6735
  }
6648
6736
  }
6649
6737
  else if (parser[i][0] === 'Right') {
6738
+ if (isNotOpened && parser[i + 1][0] === 'Right') {
6739
+ isNotOpened = false;
6740
+ continue;
6741
+ }
6650
6742
  this.parser = parser.splice(i + 1, iLen - (i + 1));
6651
6743
  levelColl.pop(); //To get the parent Group
6652
6744
  rules = this.rule;