@adaptabletools/adaptable 10.0.0 → 10.0.4-canary.0

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 (169) hide show
  1. package/base.css +77 -29
  2. package/index.css +89 -31
  3. package/package.json +1 -5
  4. package/publishTimestamp.d.ts +1 -1
  5. package/publishTimestamp.js +1 -1
  6. package/src/AdaptableInterfaces/IAdaptable.d.ts +12 -2
  7. package/src/AdaptableOptions/FilterOptions.d.ts +14 -7
  8. package/src/AdaptableOptions/LayoutOptions.d.ts +1 -1
  9. package/src/AdaptableOptions/UserInterfaceOptions.d.ts +88 -4
  10. package/src/Api/AlertApi.d.ts +1 -1
  11. package/src/Api/CalculatedColumnApi.d.ts +15 -0
  12. package/src/Api/ColumnApi.d.ts +39 -0
  13. package/src/Api/ConfigApi.d.ts +8 -0
  14. package/src/Api/GridApi.d.ts +34 -8
  15. package/src/Api/Implementation/AlertApiImpl.d.ts +1 -1
  16. package/src/Api/Implementation/AlertApiImpl.js +16 -9
  17. package/src/Api/Implementation/CalculatedColumnApiImpl.d.ts +3 -0
  18. package/src/Api/Implementation/CalculatedColumnApiImpl.js +23 -0
  19. package/src/Api/Implementation/ColumnApiImpl.d.ts +8 -0
  20. package/src/Api/Implementation/ColumnApiImpl.js +69 -36
  21. package/src/Api/Implementation/ConfigApiImpl.d.ts +1 -1
  22. package/src/Api/Implementation/ConfigApiImpl.js +28 -17
  23. package/src/Api/Implementation/ExportApiImpl.js +4 -4
  24. package/src/Api/Implementation/FormatColumnApiImpl.js +1 -1
  25. package/src/Api/Implementation/FreeTextColumnApiImpl.js +9 -3
  26. package/src/Api/Implementation/GridApiImpl.d.ts +9 -0
  27. package/src/Api/Implementation/GridApiImpl.js +25 -10
  28. package/src/Api/Implementation/InternalApiImpl.d.ts +3 -1
  29. package/src/Api/Implementation/InternalApiImpl.js +20 -4
  30. package/src/Api/Implementation/LayoutApiImpl.js +3 -3
  31. package/src/Api/Implementation/QueryLanguageApiImpl.d.ts +2 -0
  32. package/src/Api/Implementation/QueryLanguageApiImpl.js +3 -0
  33. package/src/Api/Implementation/ScopeApiImpl.js +11 -11
  34. package/src/Api/Implementation/UserInterfaceApiImpl.d.ts +12 -8
  35. package/src/Api/Implementation/UserInterfaceApiImpl.js +59 -86
  36. package/src/Api/InternalApi.d.ts +3 -1
  37. package/src/Api/QueryLanguageApi.d.ts +5 -0
  38. package/src/Api/UserInterfaceApi.d.ts +16 -6
  39. package/src/PredefinedConfig/AlertState.d.ts +10 -0
  40. package/src/PredefinedConfig/CalculatedColumnState.d.ts +4 -37
  41. package/src/PredefinedConfig/Common/AdaptableColumn.d.ts +33 -33
  42. package/src/PredefinedConfig/Common/AdaptableColumn.js +5 -5
  43. package/src/PredefinedConfig/Common/AdaptablePredicate.js +19 -18
  44. package/src/PredefinedConfig/Common/DataChangedInfo.d.ts +3 -2
  45. package/src/PredefinedConfig/Common/DataUpdateConfig.d.ts +5 -1
  46. package/src/PredefinedConfig/Common/SpecialColumnSettings.d.ts +49 -0
  47. package/src/{Utilities/Interface/ProgressIndicator.js → PredefinedConfig/Common/SpecialColumnSettings.js} +0 -0
  48. package/src/PredefinedConfig/FilterState.d.ts +1 -1
  49. package/src/PredefinedConfig/FreeTextColumnState.d.ts +10 -0
  50. package/src/PredefinedConfig/Selection/GridCell.d.ts +2 -1
  51. package/src/PredefinedConfig/Selection/GridRow.d.ts +12 -4
  52. package/src/PredefinedConfig/SystemState.d.ts +4 -1
  53. package/src/Redux/ActionsReducers/SystemRedux.js +1 -1
  54. package/src/Redux/Store/AdaptableReduxMerger.js +7 -1
  55. package/src/Redux/Store/AdaptableStore.js +7 -3
  56. package/src/Strategy/AdaptableModuleBase.js +8 -8
  57. package/src/Strategy/AlertModule.js +12 -11
  58. package/src/Strategy/BulkUpdateModule.js +5 -5
  59. package/src/Strategy/CalculatedColumnModule.js +1 -1
  60. package/src/Strategy/CellSummaryModule.js +3 -3
  61. package/src/Strategy/ConditionalStyleModule.js +3 -3
  62. package/src/Strategy/CustomSortModule.js +2 -2
  63. package/src/Strategy/ExportModule.d.ts +0 -2
  64. package/src/Strategy/ExportModule.js +59 -62
  65. package/src/Strategy/FilterModule.js +4 -4
  66. package/src/Strategy/FormatColumnModule.js +5 -5
  67. package/src/Strategy/FreeTextColumnModule.js +1 -1
  68. package/src/Strategy/LayoutModule.js +3 -3
  69. package/src/Strategy/PlusMinusModule.js +8 -9
  70. package/src/Strategy/SmartEditModule.js +6 -6
  71. package/src/Utilities/Defaults/DefaultAdaptableOptions.js +1 -0
  72. package/src/Utilities/ExpressionFunctions/booleanExpressionFunctions.js +1 -1
  73. package/src/Utilities/ExpressionFunctions/expressionFunctionUtils.js +2 -2
  74. package/src/Utilities/ExpressionFunctions/observableExpressionFunctions.js +3 -2
  75. package/src/Utilities/ExpressionFunctions/scalarExpressionFunctions.js +1 -1
  76. package/src/Utilities/Helpers/DateHelper.d.ts +8 -2
  77. package/src/Utilities/Helpers/DateHelper.js +42 -20
  78. package/src/Utilities/Helpers/PreviewHelper.js +2 -2
  79. package/src/Utilities/ObjectFactory.d.ts +1 -1
  80. package/src/Utilities/ObjectFactory.js +14 -2
  81. package/src/Utilities/Services/DataService.js +5 -5
  82. package/src/Utilities/Services/MetamodelService.js +1 -0
  83. package/src/Utilities/Services/ModuleService.js +31 -24
  84. package/src/Utilities/Services/ReportService.js +12 -12
  85. package/src/Utilities/Services/ValidationService.js +4 -5
  86. package/src/Utilities/runIfNotResolvedIn.d.ts +8 -0
  87. package/src/Utilities/runIfNotResolvedIn.js +23 -0
  88. package/src/View/AdaptableView.js +1 -1
  89. package/src/View/Alert/AlertPopup.js +1 -1
  90. package/src/View/Alert/Wizard/AlertDisplayWizardSection.js +19 -5
  91. package/src/View/Alert/Wizard/BaseAlertScopeWizardSection.js +1 -1
  92. package/src/View/BulkUpdate/BulkUpdatePopup.d.ts +2 -0
  93. package/src/View/BulkUpdate/BulkUpdatePopup.js +6 -4
  94. package/src/View/BulkUpdate/BulkUpdateViewPanel.d.ts +2 -0
  95. package/src/View/BulkUpdate/BulkUpdateViewPanel.js +3 -1
  96. package/src/View/CalculatedColumn/CalculatedColumnPopup.js +1 -1
  97. package/src/View/CalculatedColumn/CalculatedColumnSummary.js +1 -1
  98. package/src/View/CalculatedColumn/Wizard/CalculatedColumnSettingsWizardSection.js +1 -1
  99. package/src/View/Components/ColumnSelector/index.js +2 -2
  100. package/src/View/Components/FilterForm/FilterForm.d.ts +3 -51
  101. package/src/View/Components/FilterForm/FilterForm.js +53 -32
  102. package/src/View/Components/FilterForm/ListBoxFilterForm.d.ts +3 -0
  103. package/src/View/Components/FilterForm/ListBoxFilterForm.js +14 -5
  104. package/src/View/Components/FilterForm/QuickFilterForm.d.ts +3 -43
  105. package/src/View/Components/FilterForm/QuickFilterForm.js +72 -31
  106. package/src/View/Components/FilterForm/getDefaultColumnFilterPredicate.d.ts +3 -0
  107. package/src/View/Components/FilterForm/getDefaultColumnFilterPredicate.js +8 -0
  108. package/src/View/Components/NewScopeComponent.js +1 -1
  109. package/src/View/Components/Popups/AdaptablePopup.d.ts +1 -1
  110. package/src/View/Components/PreviewResultsPanel.js +1 -1
  111. package/src/View/Components/RangesComponent.js +2 -2
  112. package/src/View/Components/Selectors/ColumnSelector.js +5 -5
  113. package/src/View/Components/Selectors/ColumnValueSelector.d.ts +10 -2
  114. package/src/View/Components/Selectors/ColumnValueSelector.js +47 -15
  115. package/src/View/Components/ToolPanel/AdaptableToolPanel.js +6 -6
  116. package/src/View/ConditionalStyle/ConditionalStylePopup.js +1 -1
  117. package/src/View/ConditionalStyle/ConditionalStyleSummary.js +1 -1
  118. package/src/View/CustomSort/CustomSortEntityRow.js +2 -2
  119. package/src/View/CustomSort/CustomSortPopup.js +1 -1
  120. package/src/View/CustomSort/CustomSortSummary.js +3 -3
  121. package/src/View/CustomSort/Wizard/CustomSortColumnWizardSection.js +3 -3
  122. package/src/View/CustomSort/Wizard/CustomSortValuesWizardSection.js +24 -6
  123. package/src/View/DataChangeHistory/DataChangeHistoryGrid.js +3 -3
  124. package/src/View/DataChangeHistory/DataChangeHistoryPopup.js +4 -1
  125. package/src/View/Filter/FilterSummary.js +2 -2
  126. package/src/View/FormatColumn/FormatColumnPopup.js +1 -1
  127. package/src/View/FormatColumn/FormatColumnSummary.js +1 -1
  128. package/src/View/FormatColumn/Wizard/FormatColumnFormatWizardSection.js +1 -1
  129. package/src/View/FreeTextColumn/FreeTextColumnPopup.js +4 -2
  130. package/src/View/FreeTextColumn/FreeTextColumnSummary.js +5 -3
  131. package/src/View/FreeTextColumn/Wizard/FreeTextColumnSettingsWizardSection.js +1 -1
  132. package/src/View/GridInfo/ColumnInfoComponent.js +16 -16
  133. package/src/View/GridInfo/GridInfoPopup.js +4 -1
  134. package/src/View/Layout/Wizard/LayoutEditor/ColumnList.js +6 -6
  135. package/src/View/Layout/Wizard/LayoutEditor/ColumnSortList.js +1 -1
  136. package/src/View/Layout/Wizard/LayoutEditor/PivotList.js +1 -1
  137. package/src/View/Layout/Wizard/LayoutEditor/RowGroupsList.js +1 -1
  138. package/src/View/Layout/Wizard/LayoutEditor/getItemStyle.js +2 -2
  139. package/src/View/Layout/Wizard/LayoutEditor/index.js +41 -41
  140. package/src/View/PlusMinus/PlusMinusPopup.js +1 -1
  141. package/src/View/PlusMinus/PlusMinusSummary.js +1 -1
  142. package/src/View/Query/QueryViewPanel.js +3 -3
  143. package/src/View/Schedule/Wizard/ScheduleScheduleWizard.d.ts +1 -1
  144. package/src/View/Schedule/Wizard/ScheduleScheduleWizard.js +6 -8
  145. package/src/View/UIHelper.d.ts +2 -0
  146. package/src/View/UIHelper.js +10 -1
  147. package/src/agGrid/ActionColumnRenderer.d.ts +2 -1
  148. package/src/agGrid/ActionColumnRenderer.js +20 -3
  149. package/src/agGrid/Adaptable.d.ts +20 -4
  150. package/src/agGrid/Adaptable.js +234 -102
  151. package/src/agGrid/agGridHelper.js +32 -32
  152. package/src/agGrid/agGridMenuHelper.js +2 -2
  153. package/src/components/Dashboard/Dashboard.js +1 -1
  154. package/src/components/DropdownButton/index.js +1 -1
  155. package/src/components/ExpressionEditor/index.js +8 -7
  156. package/src/components/Loader/Loader.d.ts +7 -0
  157. package/src/components/Loader/Loader.js +13 -0
  158. package/src/components/Loader/index.d.ts +2 -0
  159. package/src/components/Loader/index.js +7 -0
  160. package/src/components/ProgressIndicator/ProgressIndicator.d.ts +2 -0
  161. package/src/components/ProgressIndicator/ProgressIndicator.js +54 -0
  162. package/src/metamodel/adaptable.metamodel.d.ts +125 -7
  163. package/src/metamodel/adaptable.metamodel.js +416 -101
  164. package/src/types.d.ts +4 -3
  165. package/version.d.ts +1 -1
  166. package/version.js +1 -1
  167. package/src/Utilities/Interface/ProgressIndicator.d.ts +0 -4
  168. package/src/View/Export/ProgressIndicator.d.ts +0 -6
  169. package/src/View/Export/ProgressIndicator.js +0 -25
@@ -64,7 +64,7 @@ class AlertPopupComponent extends React.Component {
64
64
  if (this.props.popupParams.action == 'New') {
65
65
  let alertDefinition = ObjectFactory_1.ObjectFactory.CreateEmptyAlertDefinition();
66
66
  alertDefinition.Scope = {
67
- ColumnIds: [this.props.popupParams.column.ColumnId],
67
+ ColumnIds: [this.props.popupParams.column.columnId],
68
68
  };
69
69
  this.setState({
70
70
  editedAdaptableObject: alertDefinition,
@@ -11,6 +11,7 @@ const rebass_1 = require("rebass");
11
11
  const AdaptablePopupAlert_1 = require("../../Components/Popups/AdaptablePopupAlert");
12
12
  const AlertButtonsEditor_1 = require("./AlertButtonsEditor");
13
13
  const CodeBlock_1 = require("../../../components/CodeBlock");
14
+ const AdaptableInput_1 = tslib_1.__importDefault(require("../../Components/AdaptableInput"));
14
15
  const DEFAULT_BUTTONS = [
15
16
  {
16
17
  Label: 'OK',
@@ -58,22 +59,35 @@ exports.AlertDisplayWizardSection = (props) => {
58
59
  var _a, _b, _c, _d;
59
60
  const { data, api } = OnePageAdaptableWizard_1.useOnePageWizardContext();
60
61
  const messageType = data.MessageType;
62
+ const messageText = api.alertApi.getAlertDescription(data);
61
63
  const adaptableAlert = {
62
64
  header: data.MessageType,
63
65
  message: '',
64
66
  alertDefinition: data,
65
67
  };
68
+ const onMessageTextChange = (e) => {
69
+ const { value } = e.target;
70
+ props.onChange(Object.assign(Object.assign({}, data), { MessageText: value }));
71
+ };
66
72
  return (React.createElement(React.Fragment, null,
67
73
  React.createElement(Tabs_1.Tabs, null,
68
74
  React.createElement(Tabs_1.Tabs.Tab, null, "Message Type"),
69
75
  React.createElement(Tabs_1.Tabs.Content, null,
70
- React.createElement(Radio_1.RadioGroup, { value: messageType, name: "messageType", orientation: "vertical", onRadioChange: (MessageType) => {
76
+ React.createElement(Radio_1.RadioGroup, { value: messageType, name: "messageType", orientation: "horizontal", onRadioChange: (MessageType) => {
71
77
  props.onChange(Object.assign(Object.assign({}, data), { MessageType }));
72
78
  } },
73
- React.createElement(Radio_1.default, { value: "Info" }, "Info"),
74
- React.createElement(Radio_1.default, { value: "Success" }, "Success"),
75
- React.createElement(Radio_1.default, { value: "Warning" }, "Warning"),
76
- React.createElement(Radio_1.default, { value: "Error" }, "Error")))),
79
+ React.createElement(Radio_1.default, { marginLeft: 1, value: "Info" }, "Info"),
80
+ React.createElement(Radio_1.default, { marginLeft: 4, value: "Success" }, "Success"),
81
+ React.createElement(Radio_1.default, { marginLeft: 4, value: "Warning" }, "Warning"),
82
+ React.createElement(Radio_1.default, { marginLeft: 4, value: "Error" }, "Error")))),
83
+ React.createElement(Tabs_1.Tabs, { mt: 2, mb: 3, autoFocus: false },
84
+ React.createElement(Tabs_1.Tabs.Tab, null, "Message Text"),
85
+ React.createElement(Tabs_1.Tabs.Content, null,
86
+ React.createElement(rebass_1.Text, { fontSize: 2, mt: 3, mb: 2 }, "The text to display as the Alert Message (leave blank to show automated Message based on Trigger and Condition)"),
87
+ ' ',
88
+ React.createElement(AdaptableInput_1.default, { marginTop: 2, type: 'text', autoFocus: false, value: messageText,
89
+ // onChange={(e: any) => onPredicateInputChange(e, index)}
90
+ onChange: (e) => onMessageTextChange(e) }))),
77
91
  React.createElement(Tabs_1.Tabs, { mt: 2, mb: 3, autoFocus: false },
78
92
  React.createElement(Tabs_1.Tabs.Tab, null, "Display options"),
79
93
  React.createElement(Tabs_1.Tabs.Content, null,
@@ -49,7 +49,7 @@ exports.renderBaseAlertScopeSummary = (data) => {
49
49
  : null)),
50
50
  React.createElement(rebass_1.Box, { style: { overflow: 'hidden' } }, 'ColumnIds' in data.Scope ? (React.createElement(React.Fragment, null,
51
51
  React.createElement(rebass_1.Text, { fontSize: 2, mb: columnsInScope.length ? 2 : 0 }, "Changes in selected columns will trigger an alert"),
52
- columnsInScope.length ? (React.createElement(ValueSelector_1.ValueOptionsTags, { options: columnsInScope, value: columnsInScope.map((c) => c.ColumnId), toLabel: (c) => c.FriendlyName, allowWrap: true, readOnly: true, renderLabel: (c) => React.createElement(rebass_1.Text, { fontSize: 2 }, c), toIdentifier: (c) => c.ColumnId })) : null)) : null),
52
+ columnsInScope.length ? (React.createElement(ValueSelector_1.ValueOptionsTags, { options: columnsInScope, value: columnsInScope.map((c) => c.columnId), toLabel: (c) => c.friendlyName, allowWrap: true, readOnly: true, renderLabel: (c) => React.createElement(rebass_1.Text, { fontSize: 2 }, c), toIdentifier: (c) => c.columnId })) : null)) : null),
53
53
  React.createElement(rebass_1.Box, null, 'DataTypes' in data.Scope ? (React.createElement(React.Fragment, null,
54
54
  React.createElement(rebass_1.Text, { fontSize: 2, mb: 2 }, "Changes in columns of the selected data-types trigger an alert"),
55
55
  React.createElement(ValueSelector_1.ValueOptionsTags, { readOnly: true, options: data.Scope.DataTypes, value: data.Scope.DataTypes, toLabel: (c) => c, allowWrap: true, renderLabel: (c) => React.createElement(rebass_1.Text, { fontSize: 2 }, `DataType: ${c}`), toIdentifier: (c) => c }))) : null)));
@@ -4,6 +4,7 @@ import * as SystemRedux from '../../Redux/ActionsReducers/SystemRedux';
4
4
  import { ModuleViewPopupProps } from '../Components/SharedProps/ModuleViewPopupProps';
5
5
  import { PreviewInfo } from '../../Utilities/Interface/Preview';
6
6
  import { BulkUpdateValidationResult } from '../../Strategy/Interface/IBulkUpdateModule';
7
+ import { GridCell } from '../../types';
7
8
  interface BulkUpdatePopupProps extends ModuleViewPopupProps<BulkUpdatePopupComponent> {
8
9
  BulkUpdateValue: string;
9
10
  BulkUpdateValidationResult: BulkUpdateValidationResult;
@@ -11,6 +12,7 @@ interface BulkUpdatePopupProps extends ModuleViewPopupProps<BulkUpdatePopupCompo
11
12
  onBulkUpdateValueChange: (value: string) => SystemRedux.BulkUpdateChangeValueAction;
12
13
  onBulkUpdateCheckSelectedCells: () => SystemRedux.BulkUpdateCheckCellSelectionAction;
13
14
  onRunBulkUpdate: () => BulkUpdateRedux.BulkUpdateCompleteAction;
15
+ SelectedGridCells: GridCell[];
14
16
  }
15
17
  export interface BulkUpdatePopupState {
16
18
  isShowingError: boolean;
@@ -34,7 +34,7 @@ class BulkUpdatePopupComponent extends React.Component {
34
34
  let dataTypeErrorMessage = '';
35
35
  if (col && StringExtensions_1.StringExtensions.IsNotNullOrEmpty(this.props.BulkUpdateValue)) {
36
36
  // check that the update value is a number for a numeric column. not issue for dates as we dont allow free text
37
- if (col.DataType == Enums_1.DataType.Number) {
37
+ if (col.dataType == Enums_1.DataType.Number) {
38
38
  if (isNaN(Number(this.props.BulkUpdateValue))) {
39
39
  hasDataTypeError = true;
40
40
  dataTypeErrorMessage = 'This column only accepts numbers';
@@ -50,14 +50,14 @@ class BulkUpdatePopupComponent extends React.Component {
50
50
  return null;
51
51
  }
52
52
  return (React.createElement(PanelWithImage_1.PanelWithImage, { header: this.props.moduleInfo.FriendlyName, glyphicon: this.props.moduleInfo.Glyph, infoLink: this.props.moduleInfo.HelpPage, infoLinkDisabled: !this.props.api.internalApi.isDocumentationLinksDisplayed(), variant: "primary", bodyProps: { padding: 2 }, style: { height: '100%' } },
53
- col.DataType == Enums_1.DataType.Date ? (React.createElement(React.Fragment, null,
53
+ col.dataType == Enums_1.DataType.Date ? (React.createElement(React.Fragment, null,
54
54
  React.createElement(HelpBlock_1.default, { marginTop: 2, marginBottom: 2 }, "Enter a date value. Alternatively, tick the checkbox and select from an existing column value."),
55
55
  React.createElement(rebass_1.Box, null,
56
56
  React.createElement(CheckBox_1.CheckBox, { marginLeft: 2, onChange: (checked) => this.onUseColumnValuesSelectorChanged(checked), checked: this.state.useSelector },
57
57
  ' ',
58
58
  "Select from existing column values")),
59
59
  React.createElement(rebass_1.Flex, { padding: 2, flexDirection: "row", alignItems: "center" },
60
- React.createElement(rebass_1.Flex, { alignItems: "center", flexDirection: "row", flex: 1, marginRight: 2 }, this.state.useSelector ? (React.createElement(ColumnValueSelector_1.ColumnValueSelector, { selectedColumnValue: this.props.BulkUpdateValue, selectedColumn: col, api: this.props.api, onColumnValueChange: (values) => this.onColumnValueSelectedChanged(values), allowNew: false, style: { width: '100%', maxWidth: 'inherit' } })) : (React.createElement(AdaptableInput_1.default, { style: { width: '100%' }, value: String(this.props.BulkUpdateValue), type: UIHelper_1.UIHelper.getDescriptionForDataType(col.DataType), placeholder: UIHelper_1.UIHelper.getPlaceHolderforDataType(col.DataType), onChange: (e) => this.onBulkUpdateValueChange(e) }))),
60
+ React.createElement(rebass_1.Flex, { alignItems: "center", flexDirection: "row", flex: 1, marginRight: 2 }, this.state.useSelector ? (React.createElement(ColumnValueSelector_1.ColumnValueSelector, { selectedGridCells: this.props.SelectedGridCells, selectedColumnValue: this.props.BulkUpdateValue, selectedColumn: col, api: this.props.api, onColumnValueChange: (values) => this.onColumnValueSelectedChanged(values), allowNew: false, style: { width: '100%', maxWidth: 'inherit' } })) : (React.createElement(AdaptableInput_1.default, { style: { width: '100%' }, value: String(this.props.BulkUpdateValue), type: UIHelper_1.UIHelper.getDescriptionForDataType(col.dataType), placeholder: UIHelper_1.UIHelper.getPlaceHolderforDataType(col.dataType), onChange: (e) => this.onBulkUpdateValueChange(e) }))),
61
61
  React.createElement(SimpleButton_1.default, { disabled: StringExtensions_1.StringExtensions.IsNullOrEmpty(this.props.BulkUpdateValue) ||
62
62
  this.props.PreviewInfo.previewValidationSummary.validationResult == 'All', onClick: () => {
63
63
  this.onApplyClick();
@@ -65,7 +65,7 @@ class BulkUpdatePopupComponent extends React.Component {
65
65
  React.createElement(HelpBlock_1.default, { marginTop: 2, marginBottom: 2 }, "Select an existing column value from the dropdown, or enter a new value"),
66
66
  React.createElement(rebass_1.Flex, { marginTop: 2, flexDirection: "row", alignItems: "center" },
67
67
  React.createElement(rebass_1.Flex, { alignItems: "center", flexDirection: "row", flex: 1, marginRight: 2 },
68
- React.createElement(ColumnValueSelector_1.ColumnValueSelector, { selectedColumnValue: this.props.BulkUpdateValue, selectedColumn: col, api: this.props.api, onColumnValueChange: (columns) => this.onColumnValueSelectedChanged(columns), style: { width: '100%', maxWidth: 'inherit' } })),
68
+ React.createElement(ColumnValueSelector_1.ColumnValueSelector, { selectedGridCells: this.props.SelectedGridCells, selectedColumnValue: this.props.BulkUpdateValue, selectedColumn: col, api: this.props.api, onColumnValueChange: (columns) => this.onColumnValueSelectedChanged(columns), style: { width: '100%', maxWidth: 'inherit' } })),
69
69
  React.createElement(SimpleButton_1.default, { disabled: StringExtensions_1.StringExtensions.IsNullOrEmpty(this.props.BulkUpdateValue) ||
70
70
  this.props.PreviewInfo.previewValidationSummary.validationResult == 'All' ||
71
71
  hasDataTypeError, variant: "raised", tone: "accent", marginRight: 2, onClick: () => {
@@ -96,10 +96,12 @@ class BulkUpdatePopupComponent extends React.Component {
96
96
  }
97
97
  }
98
98
  function mapStateToProps(state, ownProps) {
99
+ var _a;
99
100
  return {
100
101
  BulkUpdateValue: state.System.BulkUpdateValue,
101
102
  PreviewInfo: state.System.BulkUpdatePreviewInfo,
102
103
  BulkUpdateValidationResult: state.System.BulkUpdateValidationResult,
104
+ SelectedGridCells: (_a = state.Grid.SelectedCellInfo) === null || _a === void 0 ? void 0 : _a.gridCells,
103
105
  };
104
106
  }
105
107
  function mapDispatchToProps(dispatch) {
@@ -4,6 +4,7 @@ import * as SystemRedux from '../../Redux/ActionsReducers/SystemRedux';
4
4
  import * as BulkUpdateRedux from '../../Redux/ActionsReducers/BulkUpdateRedux';
5
5
  import { BulkUpdateValidationResult } from '../../Strategy/Interface/IBulkUpdateModule';
6
6
  import { PreviewInfo } from '../../Utilities/Interface/Preview';
7
+ import { GridCell } from '../../types';
7
8
  export interface BulkUpdateViewPanelComponentProps extends ViewPanelProps {
8
9
  BulkUpdateValue: string;
9
10
  BulkUpdateValidationResult: BulkUpdateValidationResult;
@@ -12,6 +13,7 @@ export interface BulkUpdateViewPanelComponentProps extends ViewPanelProps {
12
13
  onBulkUpdateValueChange: (value: string) => SystemRedux.BulkUpdateChangeValueAction;
13
14
  onBulkUpdateCheckSelectedCells: () => SystemRedux.BulkUpdateCheckCellSelectionAction;
14
15
  onRunBulkUpdate: () => BulkUpdateRedux.BulkUpdateCompleteAction;
16
+ SelectedGridCells: GridCell[];
15
17
  }
16
18
  declare class BulkUpdateViewPanelComponent extends React.Component<BulkUpdateViewPanelComponentProps, {}> {
17
19
  private cleanupEvent?;
@@ -52,7 +52,7 @@ class BulkUpdateViewPanelComponent extends React.Component {
52
52
  const elementType = this.props.viewType === 'Toolbar' ? 'DashboardToolbar' : 'ToolPanel';
53
53
  return (React.createElement(rebass_1.Flex, { flexDirection: "row", className: join_1.default(shouldDisable ? GeneralConstants.READ_ONLY_STYLE : '', `ab-${elementType}__BulkUpdate__wrap`), flexWrap: this.props.viewType === 'ToolPanel' ? 'wrap' : 'nowrap' },
54
54
  React.createElement(rebass_1.Flex, null,
55
- React.createElement(ColumnValueSelector_1.ColumnValueSelector, { newLabel: "New", existingLabel: "Existing", dropdownButtonProps: {
55
+ React.createElement(ColumnValueSelector_1.ColumnValueSelector, { selectedGridCells: this.props.SelectedGridCells, newLabel: "New", existingLabel: "Existing", dropdownButtonProps: {
56
56
  listMinWidth: 160,
57
57
  }, className: `ab-${elementType}__BulkUpdate__select`, disabled: shouldDisable, selectedColumnValue: this.props.BulkUpdateValue, selectedColumn: selectedColumn, api: this.props.api, onColumnValueChange: (columns) => this.onColumnValueSelectedChanged(columns) })),
58
58
  React.createElement(rebass_1.Flex, null,
@@ -90,7 +90,9 @@ class BulkUpdateViewPanelComponent extends React.Component {
90
90
  }
91
91
  }
92
92
  function mapStateToProps(state, ownProps) {
93
+ var _a;
93
94
  return {
95
+ SelectedGridCells: (_a = state.Grid.SelectedCellInfo) === null || _a === void 0 ? void 0 : _a.gridCells,
94
96
  BulkUpdateValue: state.System.BulkUpdateValue,
95
97
  BulkUpdateValidationResult: state.System.BulkUpdateValidationResult,
96
98
  PreviewInfo: state.System.BulkUpdatePreviewInfo,
@@ -46,7 +46,7 @@ class CalculatedColumnPopupComponent extends React.Component {
46
46
  if (this.props.popupParams.action && this.props.popupParams.column) {
47
47
  if (this.props.popupParams.action == 'Edit') {
48
48
  // only editing is possible - you cannot create a new calc column from the column menu
49
- let calculatedColumn = this.props.CalculatedColumns.find((x) => x.ColumnId == this.props.popupParams.column.ColumnId);
49
+ let calculatedColumn = this.props.CalculatedColumns.find((x) => x.ColumnId == this.props.popupParams.column.columnId);
50
50
  this.onEdit(calculatedColumn);
51
51
  }
52
52
  }
@@ -29,7 +29,7 @@ class CalculatedColumnSummaryComponent extends React.Component {
29
29
  let sharing = this.props.teamSharingActivated;
30
30
  this.props.CalculatedColumns.map((item, index) => {
31
31
  var _a;
32
- if (item.ColumnId == this.props.summarisedColumn.ColumnId) {
32
+ if (item.ColumnId == this.props.summarisedColumn.columnId) {
33
33
  detailRow = (React.createElement(ModuleDetail_1.ModuleDetail, { key: 'UF' + index, item1: this.props.moduleInfo.FriendlyName, item2: (_a = item.Query) === null || _a === void 0 ? void 0 : _a.ScalarExpression, configEnity: item, showShare: this.props.teamSharingActivated, moduleInfo: this.props.moduleInfo, onEdit: () => this.onEdit(item), onShare: (config) => this.props.onShare(item, config), onDelete: CalculatedColumnRedux.CalculatedColumnDelete(item), showBold: true, accessLevel: this.props.accessLevel }));
34
34
  }
35
35
  });
@@ -48,7 +48,7 @@ exports.isValidCalculatedColumnSettings = (data, api) => {
48
48
  if (!((_a = data.CalculatedColumnSettings) === null || _a === void 0 ? void 0 : _a.DataType)) {
49
49
  return 'No data type specified for column';
50
50
  }
51
- const columnsWithSameIdCount = columns.filter((c) => c.ColumnId === data.ColumnId).length;
51
+ const columnsWithSameIdCount = columns.filter((c) => c.columnId === data.ColumnId).length;
52
52
  const hasAlreadyExistingId = data.Uuid ? columnsWithSameIdCount > 1 : columnsWithSameIdCount > 0;
53
53
  return hasAlreadyExistingId ? 'A Column already exists with that id' : true;
54
54
  };
@@ -9,7 +9,7 @@ exports.NewColumnSelector = (props) => {
9
9
  const { columnFilterText, availableColumns, selected, onChange, singleSelect } = props;
10
10
  const filterFn = react_1.useMemo(() => {
11
11
  return columnFilterText
12
- ? (c) => c.FriendlyName.toLowerCase().indexOf(columnFilterText.toLowerCase()) != -1
12
+ ? (c) => c.friendlyName.toLowerCase().indexOf(columnFilterText.toLowerCase()) != -1
13
13
  : null;
14
14
  }, [columnFilterText]);
15
15
  return (React.createElement(ValueSelector_1.ValueSelector, { value: selected, options: availableColumns, filter: filterFn, singleSelect: singleSelect, allowReorder: false, onChange: (colIds) => {
@@ -19,7 +19,7 @@ exports.NewColumnSelector = (props) => {
19
19
  else {
20
20
  onChange(colIds);
21
21
  }
22
- }, toIdentifier: (c) => c.ColumnId, toLabel: (c) => c.FriendlyName, noSelectionLabel: singleSelect ? 'Please select a column' : 'You have not selected any columns.', xSelectedLabel: singleSelect
22
+ }, toIdentifier: (c) => c.columnId, toLabel: (c) => c.friendlyName, noSelectionLabel: singleSelect ? 'Please select a column' : 'You have not selected any columns.', xSelectedLabel: singleSelect
23
23
  ? () => null
24
24
  : (count) => (count > 1 ? `You selected ${count} columns.` : 'You selected one column.') }));
25
25
  };
@@ -1,63 +1,15 @@
1
- import * as React from 'react';
2
- import * as Redux from 'redux';
3
- import * as FilterRedux from '../../../Redux/ActionsReducers/FilterRedux';
4
- import * as PopupRedux from '../../../Redux/ActionsReducers/PopupRedux';
5
- import { AdaptableColumn } from '../../../PredefinedConfig/Common/AdaptableColumn';
1
+ /// <reference types="react" />
6
2
  import { ColumnFilterContext } from '../../../Utilities/Interface/ColumnFilterContext';
7
3
  import { ColumnMenuTab } from '../../../PredefinedConfig/Common/Enums';
8
- import { ModuleViewPopupProps } from '../SharedProps/ModuleViewPopupProps';
9
- import { UIPrompt } from '../../../Utilities/Interface/MessagePopups';
10
- import { AdaptableMenuItem } from '../../../PredefinedConfig/Common/Menu';
11
4
  import { ColumnFilter } from '../../../PredefinedConfig/FilterState';
12
- import { AdaptablePredicateDef } from '../../../PredefinedConfig/Common/AdaptablePredicate';
13
- import { AdaptableApi } from '../../../Api/AdaptableApi';
14
- interface FilterFormProps extends ModuleViewPopupProps<FilterFormComponent> {
15
- currentColumn: AdaptableColumn;
16
- api: AdaptableApi;
17
- columns: AdaptableColumn[];
18
- columnFilters: ColumnFilter[];
19
- embedColumnMenu: boolean;
20
- showCloseButton: boolean;
21
- onClearColumnFilter: (columnfilter: ColumnFilter) => FilterRedux.ColumnFilterClearAction;
22
- onAddColumnFilter: (columnFilter: ColumnFilter) => FilterRedux.ColumnFilterAddAction;
23
- onEditColumnFilter: (columnFilter: ColumnFilter) => FilterRedux.ColumnFilterEditAction;
24
- onSetColumnFilter: (columnFilter: ColumnFilter) => FilterRedux.ColumnFilterSetAction;
25
- onHideFilterForm: () => FilterRedux.FilterFormHideAction;
26
- onMenuItemClick: (action: Redux.Action) => Redux.Action;
27
- onShowPrompt: (prompt: UIPrompt) => PopupRedux.PopupShowPromptAction;
28
- }
29
5
  export interface FilterFormState {
30
6
  columnFilters: ColumnFilter[];
31
7
  distinctColumnValues: any[];
8
+ isDistinctColumnValuesLoading: boolean;
32
9
  showTab: boolean;
33
10
  selectedTab: ColumnMenuTab;
34
11
  editedColumnFilter: ColumnFilter | undefined;
35
12
  currentTab: 'values' | 'predicates';
13
+ suppressClientSideFilter: boolean;
36
14
  }
37
- declare class FilterFormComponent extends React.Component<FilterFormProps, FilterFormState> {
38
- static createColumnFilterFromProps(props: FilterFormProps): ColumnFilter;
39
- static getCurrentTab(editedColumnFilter: ColumnFilter | undefined): 'values' | 'predicates';
40
- static getDerivedStateFromProps(props: FilterFormProps, state: FilterFormState): {
41
- editedColumnFilter: ColumnFilter;
42
- columnFilters: ColumnFilter[];
43
- currentTab: "values" | "predicates";
44
- };
45
- constructor(props: FilterFormProps);
46
- componentDidMount(): void;
47
- render(): any;
48
- private renderColumnPredicate;
49
- renderPredicateInput(predicateDef: AdaptablePredicateDef, filter: ColumnFilter): JSX.Element | JSX.Element[];
50
- isFilterable(): string;
51
- onSelectTab(tab: any): any;
52
- onColumnValuesChange(columnValues: any[]): void;
53
- persistFilter(): void;
54
- onClearFilter(): void;
55
- onFilterApplied(): void;
56
- onCloseForm(): void;
57
- onMenuItemClick(menuItem: AdaptableMenuItem): any;
58
- selectColumnPredicate(predicateDef: AdaptablePredicateDef): void;
59
- changeColumnPredicateInput(value: string, index: number): void;
60
- }
61
- export declare let FilterForm: import("react-redux").ConnectedComponent<typeof FilterFormComponent, any>;
62
15
  export declare const FilterFormReact: (FilterContext: ColumnFilterContext) => JSX.Element;
63
- export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FilterFormReact = exports.FilterForm = void 0;
3
+ exports.FilterFormReact = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const React = tslib_1.__importStar(require("react"));
6
6
  const react_redux_1 = require("react-redux");
@@ -18,34 +18,56 @@ const HelpBlock_1 = tslib_1.__importDefault(require("../../../components/HelpBlo
18
18
  const rebass_1 = require("rebass");
19
19
  const Radio_1 = tslib_1.__importDefault(require("../../../components/Radio"));
20
20
  const Helper_1 = tslib_1.__importDefault(require("../../../Utilities/Helpers/Helper"));
21
- const ArrayExtensions_1 = tslib_1.__importDefault(require("../../../Utilities/Extensions/ArrayExtensions"));
22
21
  const AdaptableInput_1 = tslib_1.__importDefault(require("../AdaptableInput"));
23
22
  const renderWithAdaptableContext_1 = require("../../renderWithAdaptableContext");
24
23
  const CheckBox_1 = require("../../../components/CheckBox");
24
+ const runIfNotResolvedIn_1 = require("../../../Utilities/runIfNotResolvedIn");
25
+ const getDefaultColumnFilterPredicate_1 = require("./getDefaultColumnFilterPredicate");
25
26
  const panelStyle = {
26
27
  width: '100%',
27
28
  minWidth: 150,
28
29
  };
29
30
  class FilterFormComponent extends React.Component {
31
+ constructor(props) {
32
+ super(props);
33
+ this._isMounted = false;
34
+ this.handleFilterChange = (filter) => {
35
+ if (this.state.suppressClientSideFilter) {
36
+ this.loadPermittedValues(filter);
37
+ }
38
+ };
39
+ this._isMounted = true;
40
+ const existingColumnFilter = FilterFormComponent.createColumnFilterFromProps(this.props);
41
+ this.state = {
42
+ columnFilters: props.columnFilters,
43
+ distinctColumnValues: [],
44
+ isDistinctColumnValuesLoading: false,
45
+ showTab: true,
46
+ selectedTab: Enums_1.ColumnMenuTab.Filter,
47
+ editedColumnFilter: existingColumnFilter,
48
+ currentTab: FilterFormComponent.getCurrentTab(existingColumnFilter),
49
+ suppressClientSideFilter: false,
50
+ };
51
+ }
30
52
  static createColumnFilterFromProps(props) {
31
- let existingColumnFilter = props.columnFilters.find((cf) => cf.ColumnId == props.currentColumn.ColumnId);
53
+ let existingColumnFilter = props.columnFilters.find((cf) => cf.ColumnId == props.currentColumn.columnId);
32
54
  if (!existingColumnFilter) {
33
55
  const filterOptions = props.api.internalApi.getAdaptableOptions()
34
56
  .filterOptions;
35
57
  if (filterOptions.defaultFilterFormTab == 'Values') {
36
- return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.ColumnId, 'Values', []);
58
+ return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.columnId, 'Values', []);
37
59
  }
38
- if (props.currentColumn.DataType === 'Number') {
39
- return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.ColumnId, filterOptions.defaultNumericColumnFilter, ['']);
60
+ if (props.currentColumn.dataType === 'Number') {
61
+ return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.columnId, getDefaultColumnFilterPredicate_1.getDefaultColumnFilterPredicate(props.currentColumn, filterOptions.defaultNumericColumnFilter), ['']);
40
62
  }
41
- if (props.currentColumn.DataType === 'String') {
42
- return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.ColumnId, filterOptions.defaultStringColumnFilter, ['']);
63
+ if (props.currentColumn.dataType === 'String') {
64
+ return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.columnId, getDefaultColumnFilterPredicate_1.getDefaultColumnFilterPredicate(props.currentColumn, filterOptions.defaultStringColumnFilter), ['']);
43
65
  }
44
- if (props.currentColumn.DataType === 'Date') {
45
- return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.ColumnId, filterOptions.defaultDateColumnFilter, ['']);
66
+ if (props.currentColumn.dataType === 'Date') {
67
+ return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.columnId, getDefaultColumnFilterPredicate_1.getDefaultColumnFilterPredicate(props.currentColumn, filterOptions.defaultDateColumnFilter), ['']);
46
68
  }
47
- if (props.currentColumn.DataType === 'Boolean') {
48
- return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.ColumnId, 'BooleanToggle', [
69
+ if (props.currentColumn.dataType === 'Boolean') {
70
+ return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.columnId, 'BooleanToggle', [
49
71
  'all',
50
72
  ]);
51
73
  }
@@ -76,25 +98,24 @@ class FilterFormComponent extends React.Component {
76
98
  : state.currentTab,
77
99
  };
78
100
  }
79
- constructor(props) {
80
- super(props);
81
- let existingColumnFilter = FilterFormComponent.createColumnFilterFromProps(this.props);
82
- this.state = {
83
- columnFilters: props.columnFilters,
84
- distinctColumnValues: [],
85
- showTab: false,
86
- selectedTab: Enums_1.ColumnMenuTab.Filter,
87
- editedColumnFilter: existingColumnFilter,
88
- currentTab: FilterFormComponent.getCurrentTab(existingColumnFilter),
89
- };
101
+ componentWillUnmount() {
102
+ this._isMounted = false;
90
103
  }
91
104
  componentDidMount() {
92
- if (this.props.currentColumn.DataType != Enums_1.DataType.Boolean) {
93
- let distinctColumnValues = this.props.api.columnApi.getDistinctDisplayValuesForColumn(this.props.currentColumn.ColumnId);
94
- let hasItems = ArrayExtensions_1.default.IsNotNullOrEmptyNorContainsSingleEmptyValue(distinctColumnValues);
95
- let currentTab = hasItems ? this.state.currentTab : 'values';
96
- this.setState({ distinctColumnValues, showTab: hasItems, currentTab: currentTab });
105
+ if (this.props.currentColumn.dataType != Enums_1.DataType.Boolean) {
106
+ this.loadPermittedValues();
107
+ }
108
+ }
109
+ async loadPermittedValues(filter = '') {
110
+ const { values: distinctColumnValues, suppressClientSideFilter } = await runIfNotResolvedIn_1.runIfNotResolvedIn(this.props.api.columnApi.getDistinctFilterDisplayValuesForColumn(this.props.currentColumn.columnId, filter), () => this._isMounted && this.setState({ isDistinctColumnValuesLoading: true }));
111
+ if (!this._isMounted) {
112
+ return;
97
113
  }
114
+ this.setState({
115
+ distinctColumnValues,
116
+ isDistinctColumnValuesLoading: false,
117
+ suppressClientSideFilter,
118
+ });
98
119
  }
99
120
  render() {
100
121
  var _a, _b;
@@ -120,7 +141,7 @@ class FilterFormComponent extends React.Component {
120
141
  React.createElement(Radio_1.default, { marginLeft: 2, flex: 1, checked: this.state.currentTab == 'predicates', onChange: () => this.setState({ currentTab: 'predicates' }) },
121
142
  React.createElement(rebass_1.Flex, { fontSize: 'var( --ab-font-size-2)' }, "Filters")))),
122
143
  this.state.currentTab === 'values' && (React.createElement("div", null,
123
- React.createElement(ListBoxFilterForm_1.ListBoxFilterForm, { currentColumn: this.props.currentColumn, columns: this.props.columns, columnDistinctValues: this.state.distinctColumnValues, dataType: this.props.currentColumn.DataType, uiSelectedColumnValues: uiSelectedColumnValues, useVendorStyle: useVendorStyle, onColumnValueSelectedChange: (list) => this.onColumnValuesChange(list) }))),
144
+ React.createElement(ListBoxFilterForm_1.ListBoxFilterForm, { suppressClientSideFilter: this.state.suppressClientSideFilter, isLoading: this.state.isDistinctColumnValuesLoading, onFilterChange: this.handleFilterChange, currentColumn: this.props.currentColumn, columns: this.props.columns, columnDistinctValues: this.state.distinctColumnValues, dataType: this.props.currentColumn.dataType, uiSelectedColumnValues: uiSelectedColumnValues, useVendorStyle: useVendorStyle, onColumnValueSelectedChange: (list) => this.onColumnValuesChange(list) }))),
124
145
  this.state.currentTab === 'predicates' && (React.createElement("div", null,
125
146
  ' ',
126
147
  this.state.showTab && React.createElement("hr", null),
@@ -164,7 +185,7 @@ class FilterFormComponent extends React.Component {
164
185
  } }))));
165
186
  }
166
187
  isFilterable() {
167
- if (!this.props.currentColumn.Filterable) {
188
+ if (!this.props.currentColumn.filterable) {
168
189
  return 'Column is not filterable';
169
190
  }
170
191
  return '';
@@ -258,5 +279,5 @@ function mapDispatchToProps(dispatch) {
258
279
  onHideFilterForm: () => dispatch(FilterRedux.FilterFormHide()),
259
280
  };
260
281
  }
261
- exports.FilterForm = react_redux_1.connect(mapStateToProps, mapDispatchToProps)(FilterFormComponent);
262
- exports.FilterFormReact = (FilterContext) => renderWithAdaptableContext_1.renderWithAdaptableContext(React.createElement(exports.FilterForm, { api: FilterContext.Adaptable.api, currentColumn: FilterContext.Column, teamSharingActivated: false, embedColumnMenu: FilterContext.Adaptable.embedColumnMenu, showCloseButton: FilterContext.ShowCloseButton }), FilterContext.Adaptable);
282
+ const FilterForm = react_redux_1.connect(mapStateToProps, mapDispatchToProps)(FilterFormComponent);
283
+ exports.FilterFormReact = (FilterContext) => renderWithAdaptableContext_1.renderWithAdaptableContext(React.createElement(FilterForm, { api: FilterContext.Adaptable.api, currentColumn: FilterContext.Column, teamSharingActivated: false, embedColumnMenu: FilterContext.Adaptable.embedColumnMenu, showCloseButton: FilterContext.ShowCloseButton }), FilterContext.Adaptable);
@@ -9,6 +9,9 @@ export interface ListBoxFilterFormProps extends ListGroupProps {
9
9
  uiSelectedColumnValues: Array<string>;
10
10
  onColumnValueSelectedChange: (SelectedValues: Array<any>) => void;
11
11
  dataType: 'String' | 'Number' | 'NumberArray' | 'Boolean' | 'Date' | 'Object' | 'Unknown';
12
+ isLoading?: boolean;
13
+ suppressClientSideFilter?: boolean;
14
+ onFilterChange?: (filter: string) => void;
12
15
  }
13
16
  export interface ListBoxFilterFormState extends React.ClassAttributes<any> {
14
17
  UiSelectedColumnValues: Array<string>;
@@ -11,8 +11,13 @@ const join_1 = tslib_1.__importDefault(require("../../../components/utils/join")
11
11
  const AdaptableFormControlTextClear_1 = require("../Forms/AdaptableFormControlTextClear");
12
12
  const GridList_1 = tslib_1.__importDefault(require("../../../components/List/GridList"));
13
13
  const react_1 = require("react");
14
+ const Loader_1 = require("../../../components/Loader");
14
15
  exports.ListBoxFilterForm = (props) => {
15
16
  const [FilterValue, setFilterValue] = react_1.useState('');
17
+ const handleFilterValueChange = React.useCallback((newValue) => {
18
+ setFilterValue(newValue);
19
+ props === null || props === void 0 ? void 0 : props.onFilterChange(newValue);
20
+ }, [props.onFilterChange]);
16
21
  const [UiSelectedColumnValues, internalUpdateUISelectedColumnValues] = react_1.useState(props.uiSelectedColumnValues);
17
22
  const setUiSelectedColumnValues = (values) => {
18
23
  internalUpdateUISelectedColumnValues(values);
@@ -41,7 +46,8 @@ exports.ListBoxFilterForm = (props) => {
41
46
  if (StringExtensions_1.StringExtensions.IsNullOrEmpty(columnValue)) {
42
47
  return null;
43
48
  }
44
- if (StringExtensions_1.StringExtensions.IsNotNullOrEmpty(FilterValue) &&
49
+ if (!props.suppressClientSideFilter &&
50
+ StringExtensions_1.StringExtensions.IsNotNullOrEmpty(FilterValue) &&
45
51
  columnValue.toLocaleLowerCase().indexOf(FilterValue.toLocaleLowerCase()) < 0) {
46
52
  return null;
47
53
  }
@@ -60,9 +66,12 @@ exports.ListBoxFilterForm = (props) => {
60
66
  paddingBottom: 'var(--ab-space-1)',
61
67
  paddingLeft: 'var(--ab-space-1)',
62
68
  borderRadius: 'var(--ab__border-radius)',
63
- }, OnTextChange: setFilterValue }));
64
- return (React.createElement("div", { className: join_1.default(`ab-ListBoxFilterForm`, props.useVendorStyle ? `ab-ListBoxFilterForm--vendor-style` : null) },
69
+ }, OnTextChange: handleFilterValueChange }));
70
+ const baseClassName = 'ab-ListBoxFilterForm';
71
+ return (React.createElement("div", { className: join_1.default(baseClassName, props.useVendorStyle ? `${baseClassName}--vendor-style` : null, props.isLoading && `${baseClassName}--loading`) },
65
72
  React.createElement(rebass_1.Box, { px: 2 },
66
- React.createElement(rebass_1.Box, { mx: props.useVendorStyle ? 0 : '2px', marginBottom: 2 }, textClear)),
67
- React.createElement(GridList_1.default, { showZebraRows: false, className: !props.useVendorStyle ? 'ab-padding-horizontal-0' : '' }, columnValuesItemsElements)));
73
+ React.createElement(rebass_1.Box, { mx: props.useVendorStyle ? 0 : '2px', marginBottom: 2 },
74
+ textClear,
75
+ props.isLoading && React.createElement(Loader_1.Loader, null, "Loading"))),
76
+ !props.isLoading && (React.createElement(GridList_1.default, { showZebraRows: false, className: !props.useVendorStyle ? 'ab-padding-horizontal-0' : '' }, columnValuesItemsElements))));
68
77
  };
@@ -1,50 +1,10 @@
1
- import * as React from 'react';
2
- import * as FilterRedux from '../../../Redux/ActionsReducers/FilterRedux';
1
+ /// <reference types="react" />
3
2
  import { ColumnFilterContext } from '../../../Utilities/Interface/ColumnFilterContext';
4
- import { ModuleViewPopupProps } from '../SharedProps/ModuleViewPopupProps';
5
- import { AdaptableColumn } from '../../../PredefinedConfig/Common/AdaptableColumn';
6
- import { AdaptableApi } from '../../../Api/AdaptableApi';
7
3
  import { ColumnFilter } from '../../../PredefinedConfig/FilterState';
8
- import { AdaptablePredicateDef } from '../../../PredefinedConfig/Common/AdaptablePredicate';
9
- import { FilterOptions } from '../../../AdaptableOptions/FilterOptions';
10
- interface QuickFilterFormProps extends ModuleViewPopupProps<QuickFilterFormComponent> {
11
- api: AdaptableApi;
12
- currentColumn: AdaptableColumn;
13
- columnFilters: ColumnFilter[];
14
- quickFilterTrigger?: FilterOptions['quickFilterTrigger'];
15
- onAddColumnFilter: (columnFilter: ColumnFilter) => FilterRedux.ColumnFilterAddAction;
16
- onEditColumnFilter: (columnFilter: ColumnFilter) => FilterRedux.ColumnFilterEditAction;
17
- }
18
4
  export interface QuickFilterFormState {
19
5
  filter: ColumnFilter;
20
6
  distinctColumnValues: any[];
7
+ isDistinctColumnValuesLoading: boolean;
8
+ suppressClientSideFilter: boolean;
21
9
  }
22
- declare class QuickFilterFormComponent extends React.Component<QuickFilterFormProps, QuickFilterFormState> {
23
- private valuesDropdown?;
24
- constructor(props: QuickFilterFormProps);
25
- getDistinctValues: (props?: Readonly<QuickFilterFormProps> & Readonly<{
26
- children?: React.ReactNode;
27
- }>) => any[];
28
- updateDistinctValues(props?: Readonly<QuickFilterFormProps> & Readonly<{
29
- children?: React.ReactNode;
30
- }>): void;
31
- UNSAFE_componentWillReceiveProps(nextProps: QuickFilterFormProps): void;
32
- getFilterFromProps(props: QuickFilterFormProps): ColumnFilter;
33
- render(): any;
34
- renderLabel(filter: ColumnFilter, activePredicateDef: AdaptablePredicateDef): JSX.Element;
35
- renderPredicateIcon(predicateDef: AdaptablePredicateDef): JSX.Element;
36
- renderPredicateInput(predicateDef: AdaptablePredicateDef, filter: ColumnFilter): JSX.Element | JSX.Element[];
37
- renderNoValuesDropdown(filter: ColumnFilter): JSX.Element;
38
- renderValuesDropdown(filter: ColumnFilter): JSX.Element;
39
- onColumnValuesChange(columnValues: any[]): void;
40
- selectColumnPredicate(predicateId: string): void;
41
- debouncedAddFilter: import("lodash").DebouncedFunc<() => FilterRedux.ColumnFilterAddAction>;
42
- debouncedEditFilter: import("lodash").DebouncedFunc<() => FilterRedux.ColumnFilterEditAction>;
43
- private updateFilter;
44
- changeColumnPredicateInput(value: string, index: number): void;
45
- getPredicateIdForShortcutValue(value: string): string;
46
- clearFilter(): void;
47
- }
48
- export declare const QuickFilterForm: import("react-redux").ConnectedComponent<typeof QuickFilterFormComponent, any>;
49
10
  export declare const QuickFilterFormReact: (FilterContext: ColumnFilterContext) => JSX.Element;
50
- export {};