@syncfusion/ej2-querybuilder 30.2.6 → 31.1.17

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.
@@ -823,23 +823,43 @@ let QueryBuilder = class QueryBuilder extends Component {
823
823
  }
824
824
  }
825
825
  addRuleSuccessCallBack(args, trgt, rule, col, act, pId, isRlTmp) {
826
- const height = (this.element.className.indexOf('e-device') > -1) ? '250px' : '200px';
826
+ const isVertical = this.element.className.indexOf('e-device') > -1 || this.displayMode === 'Vertical';
827
+ const height = isVertical ? '250px' : '200px';
827
828
  let ruleID;
828
829
  const column = (rule && rule.field) ? this.getColumn(rule.field) : col ? col : this.columns[0];
829
830
  let operators;
830
- let dropDownList;
831
831
  let ruleElem;
832
832
  let newRule = { 'label': '', 'field': '', 'type': '', 'operator': '' };
833
833
  if (!args.cancel) {
834
834
  if (column && column.ruleTemplate && rule.field) {
835
835
  this.selectedColumn = column;
836
836
  operators = this.selectedColumn.operators;
837
- newRule = { 'label': column.label, 'field': column.field, 'type': column.type, 'operator': operators[0].value };
837
+ newRule = {
838
+ 'label': column.label,
839
+ 'field': column.field,
840
+ 'type': column.type,
841
+ 'operator': operators[0].value
842
+ };
838
843
  const passedRule = Object.keys(rule).length ? rule : newRule;
839
844
  ruleElem = this.appendRuleElem(trgt, column, act, pId, 'field', passedRule);
840
- const args = { requestType: 'template-create', action: 'insert-rule', ruleID: ruleElem.id,
841
- fields: this.fields, rule: passedRule };
842
- this.trigger('actionBegin', args);
845
+ const actionArgs = {
846
+ requestType: 'template-initialize',
847
+ ruleID: ruleElem.id,
848
+ action: 'insert-rule',
849
+ fields: this.fields,
850
+ rule: passedRule
851
+ };
852
+ this.trigger('actionBegin', actionArgs);
853
+ setTimeout(() => {
854
+ const createArgs = {
855
+ requestType: 'template-create',
856
+ ruleID: ruleElem.id,
857
+ action: 'insert-rule',
858
+ fields: this.fields,
859
+ rule: passedRule
860
+ };
861
+ this.trigger('actionBegin', createArgs);
862
+ }, 0);
843
863
  }
844
864
  else {
845
865
  ruleElem = this.appendRuleElem(trgt, column, act, pId, 'field');
@@ -854,139 +874,30 @@ let QueryBuilder = class QueryBuilder extends Component {
854
874
  addClass([element], 'e-round');
855
875
  addClass([element], 'e-icon-btn');
856
876
  element.setAttribute('title', this.l10n.getConstant('DeleteRule'));
857
- const spanElement = this.createElement('span', { attrs: { class: 'e-btn-icon e-icons e-delete-icon' } });
858
- ruleElem.querySelector('.e-rule-delete').appendChild(spanElement);
877
+ const spanElement = this.createElement('span', {
878
+ attrs: { class: 'e-btn-icon e-icons e-delete-icon' }
879
+ });
880
+ element.appendChild(spanElement);
859
881
  }
860
882
  if (!this.showButtons.ruleDelete) {
861
883
  element.classList.add('e-button-hide');
862
884
  }
863
885
  }
864
- if (this.displayMode === 'Vertical' || this.element.className.indexOf('e-device') > -1) {
865
- ruleElem.className = 'e-rule-container e-vertical-mode';
866
- }
867
- else {
868
- ruleElem.className = 'e-rule-container e-horizontal-mode';
869
- }
870
- let previousRuleElem = ruleElem.previousElementSibling;
871
- if (this.enableSeparateConnector) {
872
- let prevRule;
873
- let ruleContainer;
874
- if (previousRuleElem && previousRuleElem.classList.contains('e-group-container')) {
875
- ruleContainer = previousRuleElem.querySelectorAll('.e-rule-container');
876
- previousRuleElem = ruleContainer[ruleContainer.length - 1];
877
- }
878
- if (previousRuleElem && previousRuleElem.classList.contains('e-rule-container')) {
879
- prevRule = this.getRule(previousRuleElem);
880
- }
881
- if (this.headerTemplate && previousRuleElem && prevRule) {
882
- this.headerTemplateFn(previousRuleElem, false, prevRule.condition, prevRule, previousRuleElem.id);
883
- }
884
- else if (isNullOrUndefined(previousRuleElem) && ruleElem.id !== this.element.id + '_group0_rule0') {
885
- const group = ruleElem.closest('.e-group-container');
886
- if (group && group.previousElementSibling) {
887
- let prevElem = group.previousElementSibling;
888
- const prevRuleContainer = prevElem.querySelectorAll('.e-rule-container');
889
- if (prevElem.classList.contains('e-group-container')) {
890
- prevElem = prevRuleContainer[prevRuleContainer.length - 1];
891
- }
892
- if (prevElem.classList.contains('e-rule-container')) {
893
- const prevRule = this.getRule(prevElem);
894
- this.headerTemplateFn(prevElem, false, prevRule.condition, prevRule, prevElem.id, true);
895
- }
896
- }
897
- else {
898
- this.headerTemplateFn(ruleElem, false, rule.condition, rule, ruleElem.id, true);
899
- }
900
- }
901
- }
902
- else {
903
- if (previousRuleElem && previousRuleElem.className.indexOf('e-rule-container') > -1) {
904
- if (ruleElem.className.indexOf('e-joined-rule') < 0) {
905
- ruleElem.className += ' e-joined-rule';
906
- }
907
- if (previousRuleElem.className.indexOf('e-prev-joined-rule') < 0) {
908
- previousRuleElem.className += ' e-prev-joined-rule';
909
- }
910
- }
911
- }
912
- if (previousRuleElem && previousRuleElem.className.indexOf('e-group-container') > -1 &&
913
- ruleElem.className.indexOf('e-separate-rule') < 0) {
914
- ruleElem.className += ' e-separate-rule';
915
- }
886
+ ruleElem.className = 'e-rule-container ' + (isVertical ? 'e-vertical-mode' : 'e-horizontal-mode');
887
+ const previousRuleElem = ruleElem.previousElementSibling;
888
+ this.processAdjacentElements(ruleElem, previousRuleElem, rule);
916
889
  if (!this.isImportRules) {
917
890
  this.updateAddedRule(trgt, rule, newRule, isRlTmp, pId, this.enableSeparateConnector ? true : null);
918
891
  }
892
+ const ruleCount = this.rule.rules.length;
919
893
  if (!column || (column && !column.ruleTemplate) || !rule.field) {
920
- if (this.fieldMode === 'Default') {
921
- let ddlField;
922
- let ddlValue;
923
- if (this.separator && rule.field) {
924
- ddlValue = this.GetRootColumnName(rule.field);
925
- }
926
- else if (this.autoSelectField) {
927
- ddlValue = this.GetRootColumnName(rule.field);
928
- }
929
- else {
930
- ddlValue = this.isImportRules ? this.GetRootColumnName(rule.field) : rule.field;
931
- }
932
- ddlField = {
933
- dataSource: this.columns,
934
- fields: this.fields, placeholder: this.l10n.getConstant('SelectField'),
935
- popupHeight: ((this.columns.length > 5) ? height : 'auto'), close: this.fieldClose.bind(this, ruleElem.id + '_filterkey'),
936
- change: this.changeField.bind(this), value: rule ? ddlValue : null, open: this.popupOpen.bind(this, true), cssClass: 'qb-dropdownlist'
937
- };
938
- if (this.fieldModel) {
939
- ddlField = Object.assign({}, ddlField, this.fieldModel);
940
- }
941
- dropDownList = new DropDownList(ddlField);
942
- dropDownList.appendTo('#' + ruleElem.id + '_filterkey');
943
- let ddlVal;
944
- if (this.separator && rule.field) {
945
- ddlVal = this.GetRootColumnName(rule.field);
946
- }
947
- else {
948
- ddlVal = this.isImportRules ? this.GetRootColumnName(rule.field) :
949
- dropDownList.value;
950
- }
951
- this.selectedColumn = dropDownList.getDataByValue(ddlVal);
952
- if (Object.keys(rule).length) {
953
- this.changeRule(rule, {
954
- element: dropDownList.element, itemData: this.selectedColumn
955
- });
956
- }
894
+ if (ruleCount > 20) {
895
+ setTimeout(() => {
896
+ this.applyFieldComponent(ruleElem, rule, height);
897
+ }, 0);
957
898
  }
958
899
  else {
959
- let ddlField;
960
- const ddlValue = this.isImportRules ? rule.field : rule.field;
961
- this.dummyDropdownTreeDs = extend([], this.columns, [], true);
962
- this.updateDropdowntreeDS(this.dummyDropdownTreeDs);
963
- ddlField = {
964
- fields: { dataSource: this.dummyDropdownTreeDs,
965
- value: 'field', text: 'label', child: 'columns', expanded: 'expanded', selectable: 'selectable' },
966
- placeholder: this.l10n.getConstant('SelectField'), showClearButton: false,
967
- popupHeight: ((this.columns.length > 5) ? height : 'auto'), changeOnBlur: false,
968
- change: this.changeField.bind(this), value: !isNullOrUndefined(ddlValue) ? [ddlValue] : null,
969
- open: this.popupOpen.bind(this, false), treeSettings: { expandOn: 'Click' },
970
- cssClass: 'e-qb-ddt', filtering: this.dropdownTreeFiltering.bind(this), close: this.dropdownTreeClose.bind(this)
971
- };
972
- if (this.fieldModel) {
973
- ddlField = Object.assign({}, ddlField, this.fieldModel);
974
- }
975
- const dropdowntree = new DropDownTree(ddlField);
976
- dropdowntree.appendTo('#' + ruleElem.id + '_filterkey');
977
- if (!isNullOrUndefined(dropdowntree.value)) {
978
- const value = this.getLabelFromColumn(dropdowntree.value[0]);
979
- dropdowntree.element.value = value;
980
- }
981
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
982
- const ddlVal = !isNullOrUndefined(rule.field) ?
983
- this.GetRootColumnName(rule.field) : dropdowntree.value;
984
- this.selectedColumn = this.getColumn(ddlVal);
985
- if (Object.keys(rule).length) {
986
- this.changeRule(rule, {
987
- element: dropdowntree.element, itemData: this.selectedColumn
988
- });
989
- }
900
+ this.applyFieldComponent(ruleElem, rule, height);
990
901
  }
991
902
  }
992
903
  ruleID = ruleElem.id.replace(this.element.id + '_', '');
@@ -995,46 +906,204 @@ let QueryBuilder = class QueryBuilder extends Component {
995
906
  this.ruleLock(lockRuleTarget);
996
907
  }
997
908
  if (!this.isImportRules && !this.prvtEvtTgrDaD) {
998
- this.trigger('change', { groupID: trgt.id.replace(this.element.id + '_', ''), ruleID: ruleID, type: 'insertRule' });
909
+ this.trigger('change', {
910
+ groupID: trgt.id.replace(this.element.id + '_', ''),
911
+ ruleID: ruleID,
912
+ type: 'insertRule'
913
+ });
999
914
  }
1000
915
  }
1001
916
  if (this.enableSeparateConnector && isNullOrUndefined(rule.condition) && ruleID) {
1002
917
  rule = this.getRule(ruleID);
1003
918
  }
1004
919
  if (this.enableSeparateConnector) {
1005
- let prevElem = ruleElem.previousElementSibling;
1006
- let ruleContainer;
1007
- while (prevElem && !prevElem.classList.contains('e-rule-container')) {
1008
- if (prevElem.classList.contains('e-group-container')) {
1009
- ruleContainer = prevElem.querySelectorAll('.e-rule-container');
1010
- prevElem = ruleContainer[ruleContainer.length - 1];
1011
- break;
920
+ this.processConnectorElements(ruleElem);
921
+ }
922
+ }
923
+ processAdjacentElements(ruleElem, previousRuleElem, rule) {
924
+ if (this.enableSeparateConnector) {
925
+ if (previousRuleElem && previousRuleElem.classList.contains('e-group-container')) {
926
+ const ruleContainer = previousRuleElem.querySelectorAll('.e-rule-container');
927
+ previousRuleElem = ruleContainer[ruleContainer.length - 1];
928
+ }
929
+ if (previousRuleElem && previousRuleElem.classList.contains('e-rule-container')) {
930
+ const prevRule = this.getRule(previousRuleElem);
931
+ if (this.headerTemplate) {
932
+ this.headerTemplateFn(previousRuleElem, false, prevRule.condition, prevRule, previousRuleElem.id);
1012
933
  }
1013
- prevElem = prevElem.previousElementSibling;
1014
934
  }
1015
- if (this.headerTemplate && prevElem) {
935
+ else if (isNullOrUndefined(previousRuleElem) && ruleElem.id !== this.element.id + '_group0_rule0') {
936
+ this.handleOrphanedRuleElement(ruleElem, rule);
937
+ }
938
+ }
939
+ else {
940
+ if (previousRuleElem && previousRuleElem.className.indexOf('e-rule-container') > -1) {
941
+ ruleElem.classList.add('e-joined-rule');
942
+ previousRuleElem.classList.add('e-prev-joined-rule');
943
+ }
944
+ }
945
+ if (previousRuleElem && previousRuleElem.className.indexOf('e-group-container') > -1 &&
946
+ ruleElem.className.indexOf('e-separate-rule') < 0) {
947
+ ruleElem.className += ' e-separate-rule';
948
+ }
949
+ }
950
+ handleOrphanedRuleElement(ruleElem, rule) {
951
+ const group = ruleElem.closest('.e-group-container');
952
+ if (group && group.previousElementSibling) {
953
+ let prevElem = group.previousElementSibling;
954
+ const prevRuleContainer = prevElem.querySelectorAll('.e-rule-container');
955
+ if (prevElem.classList.contains('e-group-container')) {
956
+ prevElem = prevRuleContainer[prevRuleContainer.length - 1];
957
+ }
958
+ if (prevElem.classList.contains('e-rule-container')) {
1016
959
  const prevRule = this.getRule(prevElem);
1017
- const args = { requestType: 'rule-template-create', ruleID: prevElem.id, condition: prevRule.condition,
1018
- notCondition: this.enableNotCondition ? true : undefined };
1019
- this.trigger('actionBegin', args);
960
+ this.headerTemplateFn(prevElem, false, prevRule.condition, prevRule, prevElem.id, true);
1020
961
  }
1021
- else if (isNullOrUndefined(prevElem) && ruleElem.id !== this.element.id + '_group0_rule0') {
1022
- const group = ruleElem.closest('.e-group-container');
1023
- if (group && group.previousElementSibling && group.previousElementSibling.previousElementSibling) {
1024
- let prevElem = group.previousElementSibling.previousElementSibling;
1025
- if (prevElem.classList.contains('e-group-container')) {
1026
- const ruleContainer = prevElem.querySelectorAll('.e-rule-container');
1027
- prevElem = ruleContainer[ruleContainer.length - 1];
1028
- }
1029
- if (prevElem.classList.contains('e-rule-container')) {
1030
- const prevRule = this.getRule(prevElem);
1031
- const args = { requestType: 'rule-template-create', ruleID: prevElem.id,
1032
- condition: prevRule.condition, notCondition: this.enableNotCondition ? true : undefined };
1033
- this.trigger('actionBegin', args);
1034
- }
1035
- }
962
+ }
963
+ else {
964
+ this.headerTemplateFn(ruleElem, false, rule.condition, rule, ruleElem.id, true);
965
+ }
966
+ }
967
+ processConnectorElements(ruleElem) {
968
+ let prevElem = ruleElem.previousElementSibling;
969
+ let ruleContainer;
970
+ while (prevElem && !prevElem.classList.contains('e-rule-container')) {
971
+ if (prevElem.classList.contains('e-group-container')) {
972
+ ruleContainer = prevElem.querySelectorAll('.e-rule-container');
973
+ prevElem = ruleContainer[ruleContainer.length - 1];
974
+ break;
975
+ }
976
+ prevElem = prevElem.previousElementSibling;
977
+ }
978
+ if (this.headerTemplate && prevElem) {
979
+ const prevRule = this.getRule(prevElem);
980
+ const args = {
981
+ requestType: 'rule-template-create',
982
+ ruleID: prevElem.id,
983
+ condition: prevRule.condition,
984
+ notCondition: this.enableNotCondition ? true : undefined
985
+ };
986
+ this.trigger('actionBegin', args);
987
+ }
988
+ else if (isNullOrUndefined(prevElem) && ruleElem.id !== this.element.id + '_group0_rule0') {
989
+ this.handleOrphanedConnectorElement(ruleElem);
990
+ }
991
+ this.setMultiConnector(ruleElem);
992
+ }
993
+ handleOrphanedConnectorElement(ruleElem) {
994
+ const group = ruleElem.closest('.e-group-container');
995
+ if (group && group.previousElementSibling && group.previousElementSibling.previousElementSibling) {
996
+ let prevElem = group.previousElementSibling.previousElementSibling;
997
+ if (prevElem.classList.contains('e-group-container')) {
998
+ const ruleContainer = prevElem.querySelectorAll('.e-rule-container');
999
+ prevElem = ruleContainer[ruleContainer.length - 1];
1000
+ }
1001
+ if (prevElem.classList.contains('e-rule-container')) {
1002
+ const prevRule = this.getRule(prevElem);
1003
+ const args = {
1004
+ requestType: 'rule-template-create',
1005
+ ruleID: prevElem.id,
1006
+ condition: prevRule.condition,
1007
+ notCondition: this.enableNotCondition ? true : undefined
1008
+ };
1009
+ this.trigger('actionBegin', args);
1036
1010
  }
1037
- this.setMultiConnector(ruleElem);
1011
+ }
1012
+ }
1013
+ applyFieldComponent(ruleElem, rule, height) {
1014
+ if (this.fieldMode === 'Default') {
1015
+ this.applyDropdownListComponent(ruleElem, rule, height);
1016
+ }
1017
+ else {
1018
+ this.applyDropdownTreeComponent(ruleElem, rule, height);
1019
+ }
1020
+ }
1021
+ applyDropdownListComponent(ruleElem, rule, height) {
1022
+ let ddlField;
1023
+ let ddlValue;
1024
+ if (this.separator && rule.field) {
1025
+ ddlValue = this.GetRootColumnName(rule.field);
1026
+ }
1027
+ else if (this.autoSelectField) {
1028
+ ddlValue = this.GetRootColumnName(rule.field);
1029
+ }
1030
+ else {
1031
+ ddlValue = this.isImportRules ? this.GetRootColumnName(rule.field) : rule.field;
1032
+ }
1033
+ ddlField = {
1034
+ dataSource: this.columns,
1035
+ fields: this.fields,
1036
+ placeholder: this.l10n.getConstant('SelectField'),
1037
+ popupHeight: ((this.columns.length > 5) ? height : 'auto'),
1038
+ close: this.fieldClose.bind(this, ruleElem.id + '_filterkey'),
1039
+ change: this.changeField.bind(this),
1040
+ value: rule ? ddlValue : null,
1041
+ open: this.popupOpen.bind(this, true),
1042
+ cssClass: 'qb-dropdownlist'
1043
+ };
1044
+ if (this.fieldModel) {
1045
+ ddlField = Object.assign({}, ddlField, this.fieldModel);
1046
+ }
1047
+ const dropDownList = new DropDownList(ddlField);
1048
+ dropDownList.appendTo('#' + ruleElem.id + '_filterkey');
1049
+ let ddlVal;
1050
+ if (this.separator && rule.field) {
1051
+ ddlVal = this.GetRootColumnName(rule.field);
1052
+ }
1053
+ else {
1054
+ ddlVal = this.isImportRules ? this.GetRootColumnName(rule.field) : dropDownList.value;
1055
+ }
1056
+ this.selectedColumn = dropDownList.getDataByValue(ddlVal);
1057
+ if (Object.keys(rule).length) {
1058
+ this.changeRule(rule, {
1059
+ element: dropDownList.element,
1060
+ itemData: this.selectedColumn
1061
+ });
1062
+ }
1063
+ }
1064
+ applyDropdownTreeComponent(ruleElem, rule, height) {
1065
+ let ddlField;
1066
+ const ddlValue = this.isImportRules ? rule.field : rule.field;
1067
+ this.dummyDropdownTreeDs = extend([], this.columns, [], true);
1068
+ this.updateDropdowntreeDS(this.dummyDropdownTreeDs);
1069
+ ddlField = {
1070
+ fields: {
1071
+ dataSource: this.dummyDropdownTreeDs,
1072
+ value: 'field',
1073
+ text: 'label',
1074
+ child: 'columns',
1075
+ expanded: 'expanded',
1076
+ selectable: 'selectable'
1077
+ },
1078
+ placeholder: this.l10n.getConstant('SelectField'),
1079
+ showClearButton: false,
1080
+ popupHeight: ((this.columns.length > 5) ? height : 'auto'),
1081
+ changeOnBlur: false,
1082
+ change: this.changeField.bind(this),
1083
+ value: !isNullOrUndefined(ddlValue) ? [ddlValue] : null,
1084
+ open: this.popupOpen.bind(this, false),
1085
+ treeSettings: { expandOn: 'Click' },
1086
+ cssClass: 'e-qb-ddt',
1087
+ filtering: this.dropdownTreeFiltering.bind(this),
1088
+ close: this.dropdownTreeClose.bind(this)
1089
+ };
1090
+ if (this.fieldModel) {
1091
+ ddlField = Object.assign({}, ddlField, this.fieldModel);
1092
+ }
1093
+ const dropdowntree = new DropDownTree(ddlField);
1094
+ dropdowntree.appendTo('#' + ruleElem.id + '_filterkey');
1095
+ if (!isNullOrUndefined(dropdowntree.value)) {
1096
+ const value = this.getLabelFromColumn(dropdowntree.value[0]);
1097
+ dropdowntree.element.value = value;
1098
+ }
1099
+ const ddlVal = !isNullOrUndefined(rule.field) ?
1100
+ this.GetRootColumnName(rule.field) : dropdowntree.value;
1101
+ this.selectedColumn = this.getColumn(ddlVal);
1102
+ if (Object.keys(rule).length) {
1103
+ this.changeRule(rule, {
1104
+ element: dropdowntree.element,
1105
+ itemData: this.selectedColumn
1106
+ });
1038
1107
  }
1039
1108
  }
1040
1109
  dropdownTreeFiltering(args) {