@adaptabletools/adaptable 15.2.0-canary.4 → 15.2.0-canary.6

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 (34) hide show
  1. package/bundle.cjs.js +162 -162
  2. package/package.json +1 -1
  3. package/publishTimestamp.d.ts +1 -1
  4. package/publishTimestamp.js +1 -1
  5. package/src/AdaptableOptions/ColumnOptions.d.ts +1 -5
  6. package/src/AdaptableOptions/FilterOptions.d.ts +7 -0
  7. package/src/AdaptableOptions/LayoutOptions.d.ts +1 -1
  8. package/src/Api/GridApi.d.ts +2 -2
  9. package/src/Api/Implementation/ThemeApiImpl.js +2 -0
  10. package/src/Api/Internal/GridInternalApi.js +1 -0
  11. package/src/Strategy/ExportModule.js +5 -0
  12. package/src/Utilities/Defaults/DefaultAdaptableOptions.js +1 -0
  13. package/src/Utilities/Services/ThemeService.d.ts +1 -0
  14. package/src/Utilities/Services/ThemeService.js +38 -3
  15. package/src/View/Components/AdaptableDateInput/index.d.ts +1 -1
  16. package/src/View/Components/FilterForm/FilterForm.js +1 -1
  17. package/src/View/Components/FilterForm/ListBoxFilterForm.js +4 -2
  18. package/src/View/Components/FilterForm/QuickFilterForm.d.ts +0 -5
  19. package/src/View/Components/FilterForm/QuickFilterForm.js +60 -206
  20. package/src/View/Components/FilterForm/QuickFilterValues.d.ts +19 -0
  21. package/src/View/Components/FilterForm/QuickFilterValues.js +168 -0
  22. package/src/View/CustomSort/Wizard/CustomSortColumnWizardSection.js +1 -1
  23. package/src/agGrid/Adaptable.js +1 -29
  24. package/src/components/ColorPicker/ColorPicker.d.ts +1 -1
  25. package/src/components/Datepicker/index.d.ts +1 -1
  26. package/src/components/Input/index.d.ts +1 -1
  27. package/src/components/List/ListGroupItem/index.d.ts +1 -1
  28. package/src/components/OverlayTrigger/index.d.ts +3 -1
  29. package/src/components/OverlayTrigger/index.js +2 -1
  30. package/src/metamodel/adaptable.metamodel.d.ts +8 -0
  31. package/src/metamodel/adaptable.metamodel.js +1 -1
  32. package/src/types.d.ts +1 -0
  33. package/version.d.ts +1 -1
  34. package/version.js +1 -1
@@ -5,128 +5,39 @@ const tslib_1 = require("tslib");
5
5
  const React = tslib_1.__importStar(require("react"));
6
6
  const debounce_1 = tslib_1.__importDefault(require("lodash/debounce"));
7
7
  const LayoutRedux = tslib_1.__importStar(require("../../../Redux/ActionsReducers/LayoutRedux"));
8
+ const LayoutRedux_1 = require("../../../Redux/ActionsReducers/LayoutRedux");
8
9
  const react_redux_1 = require("react-redux");
9
10
  const ObjectFactory_1 = require("../../../Utilities/ObjectFactory");
10
11
  const OverlayTrigger_1 = tslib_1.__importDefault(require("../../../components/OverlayTrigger"));
11
12
  const SimpleButton_1 = tslib_1.__importDefault(require("../../../components/SimpleButton"));
12
13
  const icons_1 = require("../../../components/icons");
13
14
  const rebass_1 = require("rebass");
14
- const ListBoxFilterForm_1 = require("./ListBoxFilterForm");
15
- const ArrayExtensions_1 = tslib_1.__importDefault(require("../../../Utilities/Extensions/ArrayExtensions"));
16
15
  const AdaptableInput_1 = tslib_1.__importDefault(require("../AdaptableInput"));
17
16
  const renderWithAdaptableContext_1 = require("../../renderWithAdaptableContext");
18
17
  const CheckBox_1 = require("../../../components/CheckBox");
19
- const isEqual_1 = tslib_1.__importDefault(require("lodash/isEqual"));
20
- const runIfNotResolvedIn_1 = require("../../../Utilities/runIfNotResolvedIn");
21
18
  const getDefaultColumnFilterPredicate_1 = require("./getDefaultColumnFilterPredicate");
22
- const date_fns_1 = require("date-fns");
23
- const LayoutRedux_1 = require("../../../Redux/ActionsReducers/LayoutRedux");
24
19
  const AdaptableIconComponent_1 = require("../../../components/AdaptableIconComponent");
20
+ const QuickFilterValues_1 = require("./QuickFilterValues");
25
21
  class QuickFilterFormComponent extends React.Component {
26
- //private debounceTime =
27
22
  constructor(props) {
28
23
  var _a, _b;
29
24
  super(props);
25
+ this.shouldOpenValuesDropdown = false;
30
26
  this._isMounted = false;
31
- this.handleFilterChange = (filter) => {
32
- if (this.state.suppressClientSideFilter) {
33
- this.loadPermittedValues(filter);
34
- }
35
- };
36
- this.loadPermittedValues = async (filter = '') => {
37
- const { values, suppressClientSideFilter } = await (0, runIfNotResolvedIn_1.runIfNotResolvedIn)(this.props.api.gridApi.internalApi.getDistinctFilterDisplayValuesForColumn(this.props.currentColumn.columnId, filter, this.props.api.optionsApi.getFilterOptions().showDistinctFilteredValuesOnly), () => this._isMounted && this.setState({ isDistinctColumnValuesLoading: true }));
38
- if (this._isMounted) {
39
- this.setState({
40
- distinctColumnValues: values,
41
- suppressClientSideFilter,
42
- isDistinctColumnValuesLoading: false,
43
- });
44
- }
45
- };
46
- this.debouncedAddFilter = (0, debounce_1.default)(() => this.props.onAddColumnFilter(this.state.filter), (_a = this.props.api.optionsApi.getFilterOptions()) === null || _a === void 0 ? void 0 : _a.quickFilterDebounce);
47
- this.debouncedEditFilter = (0, debounce_1.default)(() => this.props.onEditColumnFilter(this.state.filter), (_b = this.props.api.optionsApi.getFilterOptions()) === null || _b === void 0 ? void 0 : _b.quickFilterDebounce);
48
- this.debouncedLoadPermittedValues = (0, debounce_1.default)(() => this.loadPermittedValues(), 500);
49
- const filter = this.getFilterFromProps();
27
+ this.debouncedAddFilter = (0, debounce_1.default)((filter) => this.props.onAddColumnFilter(filter), (_a = this.props.api.optionsApi.getFilterOptions()) === null || _a === void 0 ? void 0 : _a.quickFilterDebounce);
28
+ this.debouncedEditFilter = (0, debounce_1.default)((filter) => this.props.onEditColumnFilter(filter), (_b = this.props.api.optionsApi.getFilterOptions()) === null || _b === void 0 ? void 0 : _b.quickFilterDebounce);
50
29
  this._isMounted = true;
51
- this.state = {
52
- filter,
53
- suppressClientSideFilter: false,
54
- isDistinctColumnValuesLoading: false,
55
- distinctColumnValues: [],
56
- };
57
- }
58
- componentDidMount() {
59
- var _a, _b, _c;
60
- if (this.hasValuesPredicate((_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.filter) === null || _b === void 0 ? void 0 : _b.Predicate)) {
61
- this.loadPermittedValues();
62
- }
63
- this.unsubscribeOnCellChanged = this.props.api.eventApi.on('CellChanged', (cellChangedInfo) => {
64
- this.handleGridValueChange(cellChangedInfo.cellChange.column.columnId);
65
- });
66
- this.unsubscribeOnGridDataChanged = this.props.api.eventApi.on('GridDataChanged', () => {
67
- // there is no way to find out if the changed rows are relevant for this filter, so we have to update it every time :/
68
- this.handleGridValueChange();
69
- });
70
- if ((_c = this.props.api.optionsApi.getFilterOptions()) === null || _c === void 0 ? void 0 : _c.showDistinctFilteredValuesOnly) {
71
- this.unsubscribeOnGridFiltered = this.props.api.internalApi
72
- .getAdaptableInstance()
73
- ._on('GridFiltered', () => {
74
- const filter = this.getFilterFromProps();
75
- if (this.hasValuesPredicate(filter === null || filter === void 0 ? void 0 : filter.Predicate)) {
76
- this.loadPermittedValues();
77
- }
78
- });
79
- }
80
30
  }
81
31
  componentWillUnmount() {
82
- var _a, _b, _c;
83
32
  this._isMounted = false;
84
- (_a = this.unsubscribeOnCellChanged) === null || _a === void 0 ? void 0 : _a.call(this);
85
- (_b = this.unsubscribeOnGridDataChanged) === null || _b === void 0 ? void 0 : _b.call(this);
86
- if (this.unsubscribeOnGridFiltered) {
87
- (_c = this.unsubscribeOnGridFiltered) === null || _c === void 0 ? void 0 : _c.call(this);
88
- }
89
33
  }
90
34
  isFilterDisabled() {
91
- return Boolean(this.state.filter.IsSuspended);
92
- }
93
- UNSAFE_componentWillReceiveProps(nextProps) {
94
- const filter = this.getFilterFromProps(nextProps);
95
- if ((0, isEqual_1.default)(filter, this.state.filter)) {
96
- return;
97
- }
98
- this.setState({ filter });
99
- if (this.hasValuesPredicate(filter === null || filter === void 0 ? void 0 : filter.Predicate)) {
100
- this.setState({ isDistinctColumnValuesLoading: true });
101
- this.loadPermittedValues();
102
- }
103
- }
104
- getFilterFromProps(props = this.props) {
105
- const filter = props.columnFilters.find((cf) => cf.ColumnId == props.currentColumn.columnId);
106
- const filterOptions = props.api.optionsApi.getFilterOptions();
107
- if (filter) {
108
- return filter;
109
- }
110
- if (!filter && props.currentColumn.dataType === 'Number') {
111
- return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.columnId, (0, getDefaultColumnFilterPredicate_1.getDefaultColumnFilterPredicate)(props.currentColumn, filterOptions.defaultNumericColumnFilter), ['']);
112
- }
113
- if (!filter && props.currentColumn.dataType === 'String') {
114
- return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.columnId, (0, getDefaultColumnFilterPredicate_1.getDefaultColumnFilterPredicate)(props.currentColumn, filterOptions.defaultStringColumnFilter), ['']);
115
- }
116
- if (!filter && props.currentColumn.dataType === 'Date') {
117
- return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.columnId, (0, getDefaultColumnFilterPredicate_1.getDefaultColumnFilterPredicate)(props.currentColumn, filterOptions.defaultDateColumnFilter), ['']);
118
- }
119
- if (!filter && props.currentColumn.dataType === 'Boolean') {
120
- return ObjectFactory_1.ObjectFactory.CreateColumnFilter(this.props.currentColumn.columnId, 'BooleanToggle', [
121
- 'all',
122
- ]);
123
- }
124
- return ObjectFactory_1.ObjectFactory.CreateColumnFilter(this.props.currentColumn.columnId, null, null);
35
+ return Boolean(this.props.columnFilter.IsSuspended);
125
36
  }
126
37
  render() {
127
- const { filter } = this.state;
38
+ const { columnFilter } = this.props;
128
39
  const predicateDefs = this.props.api.filterApi.getFilterPredicateDefsForColumn(this.props.currentColumn);
129
- const activePredicateDef = this.props.api.predicateApi.getPredicateDefById(filter === null || filter === void 0 ? void 0 : filter.Predicate.PredicateId);
40
+ const activePredicateDef = this.props.api.predicateApi.getPredicateDefById(columnFilter === null || columnFilter === void 0 ? void 0 : columnFilter.Predicate.PredicateId);
130
41
  if (!this.props.currentColumn || !this.props.currentColumn.filterable) {
131
42
  return null;
132
43
  }
@@ -148,30 +59,31 @@ class QuickFilterFormComponent extends React.Component {
148
59
  }
149
60
  return (React.createElement(React.Fragment, null,
150
61
  showQuickFilterDropdown && (React.createElement(OverlayTrigger_1.default, { className: "ab-QuickFilter", showEvent: showEvent, hideEvent: hideEvent, preventPortalEventPropagation: showEvent === 'click', targetOffset: 10, hideDelay: 300, "data-name": "quick-filter-overlay", render: () => (React.createElement(rebass_1.Flex, { className: "ab-QuickFilter__dropdown", flexDirection: "column", "data-name": "quick-filter", fontSize: 2 },
151
- (filter === null || filter === void 0 ? void 0 : filter.Predicate.PredicateId) && (React.createElement(SimpleButton_1.default, { p: 2, variant: "text", onClick: () => this.clearFilter() },
62
+ (columnFilter === null || columnFilter === void 0 ? void 0 : columnFilter.Predicate.PredicateId) && (React.createElement(SimpleButton_1.default, { p: 2, variant: "text", onClick: () => this.clearFilter() },
152
63
  React.createElement("span", { style: { width: 20, marginRight: 10 } },
153
64
  React.createElement(icons_1.Icon, { name: "delete" })),
154
65
  "Clear")),
155
- predicateDefs.map((p) => (React.createElement(SimpleButton_1.default, { "data-name": filter.Predicate.PredicateId, disabled: this.isFilterDisabled(), key: p.id, p: 2, variant: "text", tone: (filter === null || filter === void 0 ? void 0 : filter.Predicate.PredicateId) === p.id ? 'info' : 'none', onClick: () => this.selectColumnPredicate(p.id) },
66
+ predicateDefs.map((p) => (React.createElement(SimpleButton_1.default, { "data-name": columnFilter.Predicate.PredicateId, disabled: this.isFilterDisabled(), key: p.id, p: 2, variant: "text", tone: (columnFilter === null || columnFilter === void 0 ? void 0 : columnFilter.Predicate.PredicateId) === p.id ? 'info' : 'none', onClick: () => this.selectColumnPredicate(p.id) },
156
67
  React.createElement("span", { style: { width: 20, marginRight: 10 } }, this.renderPredicateIcon(p)),
157
68
  p.label))))) },
158
- React.createElement(SimpleButton_1.default, { "data-name": filter.Predicate.PredicateId, style: {
69
+ React.createElement(SimpleButton_1.default, { "data-name": columnFilter.Predicate.PredicateId, style: {
159
70
  borderRadius: 0,
160
71
  borderColor: 'var(--ab-color-primarydark)',
161
72
  } }, this.renderPredicateIcon(activePredicateDef)))),
162
- showQuickFilterInput && this.renderLabel(filter, activePredicateDef),
163
- showQuickFilterInput && this.renderPredicateInput(activePredicateDef, filter)));
73
+ showQuickFilterInput && this.renderLabel(columnFilter, activePredicateDef),
74
+ showQuickFilterInput && this.renderPredicateInput(activePredicateDef, columnFilter)));
164
75
  }
165
76
  renderLabel(filter, activePredicateDef) {
166
77
  if (this.hasValuesPredicate(filter === null || filter === void 0 ? void 0 : filter.Predicate)) {
167
- if (ArrayExtensions_1.default.IsNullOrEmpty(filter.Predicate.Inputs) &&
168
- ArrayExtensions_1.default.IsNullOrEmptyOrContainsSingleEmptyValue(this.state.distinctColumnValues)) {
169
- return this.renderNoValuesDropdown(filter);
170
- }
171
- return this.renderValuesDropdown(filter);
78
+ return (React.createElement(QuickFilterValues_1.QuickFilterValues, { api: this.props.api, currentColumn: this.props.currentColumn, isFilterDisabled: this.isFilterDisabled(), columnFilter: filter, clearColumnFilter: () => this.clearFilter(), updateColumnFilter: (columnFilter) => this.updateFilter(columnFilter), registerValuesDropdownApi: (api) => {
79
+ if (api && this.shouldOpenValuesDropdown) {
80
+ api.show();
81
+ this.shouldOpenValuesDropdown = false;
82
+ }
83
+ }, quickFilterValuesTrigger: this.props.quickFilterValuesTrigger }));
172
84
  }
173
85
  return (activePredicateDef &&
174
- (activePredicateDef === null || activePredicateDef === void 0 ? void 0 : activePredicateDef.inputs) === undefined && (React.createElement(rebass_1.Box, { color: this.isFilterDisabled() && 'var(--ab-color-text-on-primary)', disabled: this.isFilterDisabled(), p: 1, alignSelf: "center" }, activePredicateDef.label)));
86
+ (activePredicateDef === null || activePredicateDef === void 0 ? void 0 : activePredicateDef.inputs) === undefined && (React.createElement(rebass_1.Box, { color: this.isFilterDisabled() ? undefined : 'var(--ab-color-text-on-primary)', disabled: this.isFilterDisabled(), p: 1, alignSelf: "center" }, activePredicateDef.label)));
175
87
  }
176
88
  renderPredicateIcon(predicateDef) {
177
89
  if (!predicateDef || !predicateDef.icon) {
@@ -223,117 +135,39 @@ class QuickFilterFormComponent extends React.Component {
223
135
  } }));
224
136
  });
225
137
  }
226
- renderNoValuesDropdown(filter) {
227
- return (React.createElement(SimpleButton_1.default, { disabled: true, style: {
228
- flex: 1,
229
- whiteSpace: 'nowrap',
230
- overflow: 'hidden',
231
- textOverflow: 'ellipsis',
232
- borderRadius: 0,
233
- borderLeftWidth: 0,
234
- borderColor: 'var(--ab-color-primarydark)',
235
- } }, 'No Column Values'));
236
- }
237
- renderValuesDropdown(filter) {
238
- let showEvent = 'mouseenter';
239
- if (this.props.quickFilterValuesTrigger === 'click') {
240
- showEvent = 'click';
241
- }
242
- let selectedValues = filter.Predicate.PredicateId === 'Values' ? 'Select Values' : 'Exclude Values';
243
- if (filter.Predicate.Inputs.length) {
244
- selectedValues = filter.Predicate.Inputs.map((input) => {
245
- var _a, _b;
246
- const label = (_b = (_a = this.state.distinctColumnValues) === null || _a === void 0 ? void 0 : _a.find((distinctValue) => {
247
- if (input instanceof Date) {
248
- return (0, date_fns_1.isSameDay)(input, distinctValue.value);
249
- }
250
- return distinctValue.value === input;
251
- })) === null || _b === void 0 ? void 0 : _b.label;
252
- return label !== null && label !== void 0 ? label : input;
253
- }).join(', ');
254
- }
255
- return (React.createElement(OverlayTrigger_1.default, { showEvent: showEvent,
256
- // cannot hide on blur, because the form input receives the input when this is opened
257
- hideEvent: "mouseleave", hideDelay: 300, ref: (api) => {
258
- this.valuesDropdown = api;
259
- }, render: () => {
260
- var _a;
261
- return (React.createElement(rebass_1.Flex, { onMouseEnter: () => {
262
- var _a;
263
- if (showEvent === 'click') {
264
- // For showEvent=mousenter this is not needed.
265
- // When mouseenter is triggered on the overlay, onShowFn is called, the overlay is no longer hidden.
266
- // But in this case because the trigger is click, another show is not triggered.
267
- (_a = this.valuesDropdown) === null || _a === void 0 ? void 0 : _a.show();
268
- }
269
- }, "data-name": "quick-filter-form", flexDirection: "column", style: {
270
- fontSize: 'var(--ab-font-size-2)',
271
- border: '1px solid var(--ab-color-primarydark)',
272
- background: 'var(--ab-color-defaultbackground)',
273
- zIndex: 1000,
274
- } },
275
- React.createElement(rebass_1.Flex, { m: 2 },
276
- React.createElement(SimpleButton_1.default, { onClick: () => this.clearFilter() }, "Clear Filter"),
277
- ((_a = this.props.api.optionsApi.getFilterOptions()) === null || _a === void 0 ? void 0 : _a.autoApplyFilter) == false && (React.createElement(SimpleButton_1.default, { ml: 2, onClick: () => this.updateFilter(this.state.filter) }, "Apply Filter"))),
278
- React.createElement(ListBoxFilterForm_1.ListBoxFilterForm, { disabled: this.isFilterDisabled(), suppressClientSideFilter: this.state.suppressClientSideFilter, isLoading: this.state.isDistinctColumnValuesLoading, onFilterChange: this.handleFilterChange, currentColumn: this.props.currentColumn, columns: [], columnDistinctValues: this.state.distinctColumnValues, dataType: this.props.currentColumn.dataType, uiSelectedColumnValues: this.state.filter.Predicate.Inputs.filter((input) => input !== ''), useAgGridStyle: true, onColumnValueSelectedChange: (list) => this.onColumnValuesChange(list) })));
279
- } },
280
- React.createElement(SimpleButton_1.default, { "data-name": 'Select Values', style: {
281
- flex: 1,
282
- whiteSpace: 'nowrap',
283
- overflow: 'hidden',
284
- textOverflow: 'ellipsis',
285
- borderRadius: 0,
286
- borderLeftWidth: 0,
287
- borderColor: 'var(--ab-color-primarydark)',
288
- }, disabled: this.isFilterDisabled() ||
289
- ArrayExtensions_1.default.IsNullOrEmptyOrContainsSingleEmptyValue(this.state.distinctColumnValues) }, selectedValues)));
290
- }
291
138
  onColumnValuesChange(columnValues) {
292
139
  var _a;
293
- const { filter } = this.state;
294
- filter.Predicate = { PredicateId: filter.Predicate.PredicateId, Inputs: columnValues };
140
+ const columnFilter = Object.assign({}, this.props.columnFilter);
141
+ columnFilter.Predicate = {
142
+ PredicateId: columnFilter.Predicate.PredicateId,
143
+ Inputs: columnValues,
144
+ };
295
145
  if ((_a = this.props.api.optionsApi.getFilterOptions()) === null || _a === void 0 ? void 0 : _a.autoApplyFilter) {
296
- this.updateFilter(filter);
146
+ this.updateFilter(columnFilter);
297
147
  }
298
148
  else {
299
- this.setState({ filter });
149
+ this.setState({ transientColumnFilter: columnFilter });
300
150
  }
301
151
  }
302
152
  selectColumnPredicate(predicateId) {
303
153
  var _a;
304
- const filter = Object.assign({}, this.state.filter);
154
+ const columnFilter = Object.assign({}, this.props.columnFilter);
305
155
  const predicateDef = this.props.api.predicateApi.getPredicateDefById(predicateId);
306
- filter.Predicate = {
156
+ columnFilter.Predicate = {
307
157
  PredicateId: predicateId,
308
158
  Inputs: ((_a = predicateDef.inputs) !== null && _a !== void 0 ? _a : []).map((i) => { var _a; return (_a = i.defaultValue) !== null && _a !== void 0 ? _a : ''; }),
309
159
  };
310
- this.updateFilter(filter);
160
+ this.updateFilter(columnFilter);
311
161
  if (predicateId === 'Values' || predicateId === 'ExcludeValues') {
312
- this.loadPermittedValues();
313
- requestAnimationFrame(() => {
314
- if (this.valuesDropdown) {
315
- this.valuesDropdown.show();
316
- }
317
- });
162
+ this.shouldOpenValuesDropdown = true;
318
163
  }
319
164
  }
320
- handleGridValueChange(changedColumnId) {
321
- var _a, _b, _c, _d;
322
- if (!this.hasValuesPredicate((_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.filter) === null || _b === void 0 ? void 0 : _b.Predicate)) {
323
- return;
324
- }
325
- if (changedColumnId && changedColumnId !== ((_d = (_c = this.state) === null || _c === void 0 ? void 0 : _c.filter) === null || _d === void 0 ? void 0 : _d.ColumnId)) {
326
- return;
327
- }
328
- this.debouncedLoadPermittedValues();
329
- }
330
165
  updateFilter(filter) {
331
- this.setState({ filter });
332
166
  if (filter.Uuid) {
333
- this.debouncedEditFilter();
167
+ this.debouncedEditFilter(filter);
334
168
  }
335
169
  else {
336
- this.debouncedAddFilter();
170
+ this.debouncedAddFilter(filter);
337
171
  }
338
172
  }
339
173
  changeColumnPredicateInput(value, index) {
@@ -342,10 +176,10 @@ class QuickFilterFormComponent extends React.Component {
342
176
  this.selectColumnPredicate(predicateId);
343
177
  }
344
178
  else {
345
- const { filter } = this.state;
346
- filter.Predicate.Inputs = filter.Predicate.Inputs || [];
347
- filter.Predicate.Inputs[index] = value;
348
- this.updateFilter(filter);
179
+ const columnFilter = Object.assign({}, this.props.columnFilter);
180
+ columnFilter.Predicate.Inputs = columnFilter.Predicate.Inputs || [];
181
+ columnFilter.Predicate.Inputs[index] = value;
182
+ this.updateFilter(columnFilter);
349
183
  }
350
184
  }
351
185
  getPredicateIdForShortcutValue(value) {
@@ -353,17 +187,37 @@ class QuickFilterFormComponent extends React.Component {
353
187
  return (_a = this.props.api.filterApi.internalApi.findPredicateDefByShortcut(value, this.props.currentColumn)) === null || _a === void 0 ? void 0 : _a.id;
354
188
  }
355
189
  clearFilter() {
356
- const { filter } = this.state;
357
- this.props.api.filterApi.clearColumnFilterForColumn(filter.ColumnId);
190
+ const columnFilter = Object.assign({}, this.props.columnFilter);
191
+ this.props.api.filterApi.clearColumnFilterForColumn(columnFilter.ColumnId);
358
192
  }
359
193
  hasValuesPredicate(predicate) {
360
194
  return this.props.api.predicateApi.internalApi.hasPredicateValues(predicate);
361
195
  }
362
196
  }
197
+ function getColumnFilterWithDefault(state, props) {
198
+ const columnFilter = (0, LayoutRedux_1.getColumnFilterSelector)(state).find((cf) => cf.ColumnId == props.currentColumn.columnId);
199
+ if (columnFilter) {
200
+ return columnFilter;
201
+ }
202
+ const filterOptions = props.api.optionsApi.getFilterOptions();
203
+ if (!columnFilter && props.currentColumn.dataType === 'Number') {
204
+ return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.columnId, (0, getDefaultColumnFilterPredicate_1.getDefaultColumnFilterPredicate)(props.currentColumn, filterOptions.defaultNumericColumnFilter), ['']);
205
+ }
206
+ if (!columnFilter && props.currentColumn.dataType === 'String') {
207
+ return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.columnId, (0, getDefaultColumnFilterPredicate_1.getDefaultColumnFilterPredicate)(props.currentColumn, filterOptions.defaultStringColumnFilter), ['']);
208
+ }
209
+ if (!columnFilter && props.currentColumn.dataType === 'Date') {
210
+ return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.columnId, (0, getDefaultColumnFilterPredicate_1.getDefaultColumnFilterPredicate)(props.currentColumn, filterOptions.defaultDateColumnFilter), ['']);
211
+ }
212
+ if (!columnFilter && props.currentColumn.dataType === 'Boolean') {
213
+ return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.columnId, 'BooleanToggle', ['all']);
214
+ }
215
+ return ObjectFactory_1.ObjectFactory.CreateColumnFilter(props.currentColumn.columnId, null, null);
216
+ }
363
217
  function mapStateToProps(state, ownProps) {
364
218
  return {
365
219
  currentColumn: ownProps.currentColumn,
366
- columnFilters: (0, LayoutRedux_1.getColumnFilterSelector)(state),
220
+ columnFilter: getColumnFilterWithDefault(state, ownProps),
367
221
  };
368
222
  }
369
223
  function mapDispatchToProps(dispatch) {
@@ -0,0 +1,19 @@
1
+ /// <reference types="react" />
2
+ import { ColumnFilter } from '../../../PredefinedConfig/Common/ColumnFilter';
3
+ import { AdaptableApi } from '../../../Api/AdaptableApi';
4
+ import { FilterOptions } from '../../../AdaptableOptions/FilterOptions';
5
+ import { AdaptableColumn } from '../../../PredefinedConfig/Common/AdaptableColumn';
6
+ export interface QuickFilterValuesProps {
7
+ api: AdaptableApi;
8
+ currentColumn: AdaptableColumn;
9
+ isFilterDisabled: boolean;
10
+ columnFilter: ColumnFilter;
11
+ clearColumnFilter: () => void;
12
+ updateColumnFilter: (filter: ColumnFilter) => void;
13
+ registerValuesDropdownApi: (api: {
14
+ show: () => any;
15
+ hide: () => any;
16
+ }) => void;
17
+ quickFilterValuesTrigger?: FilterOptions['quickFilterValuesTrigger'];
18
+ }
19
+ export declare const QuickFilterValues: (props: QuickFilterValuesProps) => JSX.Element;
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QuickFilterValues = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const React = tslib_1.__importStar(require("react"));
6
+ const react_1 = require("react");
7
+ const ArrayExtensions_1 = tslib_1.__importDefault(require("../../../Utilities/Extensions/ArrayExtensions"));
8
+ const SimpleButton_1 = tslib_1.__importDefault(require("../../../components/SimpleButton"));
9
+ const date_fns_1 = require("date-fns");
10
+ const OverlayTrigger_1 = tslib_1.__importDefault(require("../../../components/OverlayTrigger"));
11
+ const rebass_1 = require("rebass");
12
+ const ListBoxFilterForm_1 = require("./ListBoxFilterForm");
13
+ const QuickFilterValues = (props) => {
14
+ const { api } = props;
15
+ const valuesDropdownRef = React.useRef(null);
16
+ const [quickFilterValues, setQuickFilterValues] = React.useState({ values: [], suppressClientSideFilter: false, dataLoadIsComplete: false });
17
+ const [isDistinctColumnValuesLoading, setIsDistinctColumnValuesLoading] = React.useState(false);
18
+ const [textFilterValue, setTextFilterValue] = React.useState('');
19
+ const [valuesLoadTrigger, setValuesLoadTrigger] = React.useState({
20
+ counter: 0,
21
+ });
22
+ const [transientColumnFilter, setTransientColumnFilter] = React.useState(null);
23
+ const onColumnValueSelectedChange = (columnValues) => {
24
+ var _a;
25
+ const { columnFilter } = props;
26
+ columnFilter.Predicate = {
27
+ PredicateId: columnFilter.Predicate.PredicateId,
28
+ Inputs: columnValues,
29
+ };
30
+ if ((_a = api.optionsApi.getFilterOptions()) === null || _a === void 0 ? void 0 : _a.autoApplyFilter) {
31
+ props.updateColumnFilter(columnFilter);
32
+ }
33
+ else {
34
+ setTransientColumnFilter(columnFilter);
35
+ }
36
+ };
37
+ (0, react_1.useEffect)(() => {
38
+ if (valuesLoadTrigger.counter === 0) {
39
+ // skip the first render
40
+ return;
41
+ }
42
+ // loadPermittedValues
43
+ let ignore = false;
44
+ setIsDistinctColumnValuesLoading(true);
45
+ api.gridApi.internalApi
46
+ .getDistinctFilterDisplayValuesForColumn(props.columnFilter.ColumnId, textFilterValue, api.optionsApi.getFilterOptions().showDistinctFilteredValuesOnly)
47
+ .then((distinctFilterDisplayValues) => {
48
+ if (ignore) {
49
+ return;
50
+ }
51
+ setQuickFilterValues(Object.assign(Object.assign({}, distinctFilterDisplayValues), { dataLoadIsComplete: true }));
52
+ setIsDistinctColumnValuesLoading(false);
53
+ });
54
+ return () => {
55
+ ignore = true;
56
+ };
57
+ }, [valuesLoadTrigger]);
58
+ const onVisibleChange = (0, react_1.useCallback)((visible) => {
59
+ if (visible) {
60
+ setValuesLoadTrigger(Object.assign(Object.assign({}, valuesLoadTrigger), { counter: valuesLoadTrigger.counter + 1 }));
61
+ }
62
+ else {
63
+ setQuickFilterValues({
64
+ values: [],
65
+ suppressClientSideFilter: false,
66
+ dataLoadIsComplete: false,
67
+ });
68
+ setTextFilterValue('');
69
+ }
70
+ }, [valuesLoadTrigger, quickFilterValues]);
71
+ const loadedDataIsEmpty = quickFilterValues.dataLoadIsComplete &&
72
+ ArrayExtensions_1.default.IsNullOrEmptyOrContainsSingleEmptyValue(quickFilterValues.values);
73
+ const renderNoValuesDropdown = () => {
74
+ return (React.createElement(SimpleButton_1.default, { disabled: true, style: {
75
+ flex: 1,
76
+ whiteSpace: 'nowrap',
77
+ overflow: 'hidden',
78
+ textOverflow: 'ellipsis',
79
+ borderRadius: 0,
80
+ borderLeftWidth: 0,
81
+ borderColor: 'var(--ab-color-primarydark)',
82
+ } }, 'No Column Values'));
83
+ };
84
+ if (ArrayExtensions_1.default.IsNullOrEmpty(props.columnFilter.Predicate.Inputs) && loadedDataIsEmpty) {
85
+ return renderNoValuesDropdown();
86
+ }
87
+ const handleFilterChange = (filterText) => {
88
+ setTextFilterValue(filterText);
89
+ if (quickFilterValues.suppressClientSideFilter) {
90
+ setValuesLoadTrigger(Object.assign(Object.assign({}, valuesLoadTrigger), { counter: valuesLoadTrigger.counter + 1 }));
91
+ }
92
+ };
93
+ let showEvent = 'mouseenter';
94
+ if (props.quickFilterValuesTrigger === 'click') {
95
+ showEvent = 'click';
96
+ }
97
+ let selectedValues = props.columnFilter.Predicate.PredicateId === 'Values' ? 'Select Values' : 'Exclude Values';
98
+ if (props.columnFilter.Predicate.Inputs.length) {
99
+ selectedValues = props.columnFilter.Predicate.Inputs.map((input) => {
100
+ var _a, _b;
101
+ const label = (_b = (_a = quickFilterValues.values) === null || _a === void 0 ? void 0 : _a.find((distinctValue) => {
102
+ if (input instanceof Date) {
103
+ return (0, date_fns_1.isSameDay)(input, distinctValue.value);
104
+ }
105
+ return distinctValue.value === input;
106
+ })) === null || _b === void 0 ? void 0 : _b.label;
107
+ return label !== null && label !== void 0 ? label : input;
108
+ }).join(', ');
109
+ }
110
+ const quickFilterValuesWidth = props.api.optionsApi.getAdaptableOptions().filterOptions.quickFilterValuesWidth;
111
+ const getPopoverWidth = (targetWidth) => {
112
+ if (quickFilterValuesWidth === 'auto') {
113
+ return Math.max(180, targetWidth);
114
+ }
115
+ if (typeof quickFilterValuesWidth === 'number') {
116
+ return quickFilterValuesWidth;
117
+ }
118
+ return null;
119
+ };
120
+ const currentOverlayVisible = (0, react_1.useRef)(false);
121
+ return (React.createElement(OverlayTrigger_1.default, { showEvent: showEvent,
122
+ // cannot hide on blur, because the form input receives the input when this is opened
123
+ hideEvent: "mouseleave", hideDelay: 300, ref: (api) => {
124
+ valuesDropdownRef.current = api;
125
+ props.registerValuesDropdownApi(api);
126
+ }, onVisibleChange: (visible) => {
127
+ if (currentOverlayVisible.current !== visible) {
128
+ // onVisibleChange() is called redundantly
129
+ currentOverlayVisible.current = visible;
130
+ onVisibleChange(visible);
131
+ }
132
+ }, render: ({ targetWidth }) => {
133
+ var _a;
134
+ return (React.createElement(rebass_1.Flex, { onMouseEnter: () => {
135
+ var _a;
136
+ if (showEvent === 'click') {
137
+ // For showEvent=mousenter this is not needed.
138
+ // When mouseenter is triggered on the overlay, onShowFn is called, the overlay is no longer hidden.
139
+ // But in this case because the trigger is click, another show is not triggered.
140
+ (_a = valuesDropdownRef.current) === null || _a === void 0 ? void 0 : _a.show();
141
+ }
142
+ }, "data-name": "quick-filter-form", flexDirection: "column", style: {
143
+ fontSize: 'var(--ab-font-size-2)',
144
+ border: '1px solid var(--ab-color-primarydark)',
145
+ background: 'var(--ab-color-defaultbackground)',
146
+ zIndex: 1000,
147
+ width: getPopoverWidth(targetWidth),
148
+ } },
149
+ React.createElement(rebass_1.Flex, { m: 2 },
150
+ React.createElement(SimpleButton_1.default, { onClick: () => props.clearColumnFilter() }, "Clear Filter"),
151
+ ((_a = api.optionsApi.getFilterOptions()) === null || _a === void 0 ? void 0 : _a.autoApplyFilter) == false && (React.createElement(SimpleButton_1.default, { ml: 2, onClick: () => {
152
+ if (transientColumnFilter) {
153
+ props.updateColumnFilter(transientColumnFilter);
154
+ }
155
+ } }, "Apply Filter"))),
156
+ React.createElement(ListBoxFilterForm_1.ListBoxFilterForm, { disabled: props.isFilterDisabled, suppressClientSideFilter: quickFilterValues.suppressClientSideFilter, isLoading: isDistinctColumnValuesLoading, onFilterChange: handleFilterChange, currentColumn: props.currentColumn, columns: [], columnDistinctValues: quickFilterValues.values, dataType: props.currentColumn.dataType, uiSelectedColumnValues: props.columnFilter.Predicate.Inputs.filter((input) => input !== ''), useAgGridStyle: true, onColumnValueSelectedChange: (list) => onColumnValueSelectedChange(list) })));
157
+ } },
158
+ React.createElement(SimpleButton_1.default, { "data-name": 'Select Values', style: {
159
+ flex: 1,
160
+ whiteSpace: 'nowrap',
161
+ overflow: 'hidden',
162
+ textOverflow: 'ellipsis',
163
+ borderRadius: 0,
164
+ borderLeftWidth: 0,
165
+ borderColor: 'var(--ab-color-primarydark)',
166
+ }, disabled: props.isFilterDisabled || loadedDataIsEmpty }, selectedValues)));
167
+ };
168
+ exports.QuickFilterValues = QuickFilterValues;
@@ -46,7 +46,7 @@ const CustomSortColumnWizardSection = (props) => {
46
46
  React.createElement(Tabs_1.Tabs.Tab, null, "Column"),
47
47
  React.createElement(Tabs_1.Tabs.Content, null,
48
48
  React.createElement(ColumnSelector_1.NewColumnSelector, { availableColumns: sortableCols, selected: data.ColumnId ? [data.ColumnId] : [], singleSelect: true, onChange: (ids) => {
49
- props.onChange(Object.assign(Object.assign({}, data), { ColumnId: ids[0] }));
49
+ props.onChange(Object.assign(Object.assign({}, data), { SortedValues: [], ColumnId: ids[0] }));
50
50
  }, allowReorder: false }))));
51
51
  };
52
52
  exports.CustomSortColumnWizardSection = CustomSortColumnWizardSection;
@@ -2880,7 +2880,7 @@ class Adaptable {
2880
2880
  }
2881
2881
  }));
2882
2882
  /**
2883
- * Use Case: A visible Column has become row grouped and 'hideColumnWhenGrouped' is true
2883
+ * Use Case: Column Row Grouping changes and 'restoreUngroupedColumns' is true
2884
2884
  * Action: Make the column invisiblel
2885
2885
  */
2886
2886
  this.gridOptions.api.addEventListener(core_1.Events.EVENT_COLUMN_ROW_GROUP_CHANGED, (this.listenerColumnRowGroupChanged = (params) => {
@@ -2891,14 +2891,6 @@ class Adaptable {
2891
2891
  if ((_b = (_a = this.adaptableOptions) === null || _a === void 0 ? void 0 : _a.generalOptions) === null || _b === void 0 ? void 0 : _b.restoreUngroupedColumns) {
2892
2892
  this.persistColumnIndexBeforeGrouping(params);
2893
2893
  }
2894
- if (this.adaptableOptions.columnOptions.hideColumnWhenGrouped === true &&
2895
- params.source !== 'api') {
2896
- params.columns.forEach((col) => {
2897
- if (col.isVisible()) {
2898
- this.api.columnApi.hideColumn(col.getColId());
2899
- }
2900
- });
2901
- }
2902
2894
  }));
2903
2895
  /**
2904
2896
  * Use Case: A Column has finished being resized
@@ -4447,26 +4439,6 @@ class Adaptable {
4447
4439
  else {
4448
4440
  el.classList.remove('ab--custom-mac-like-scrollbars');
4449
4441
  }
4450
- const computedDocumentStyle = getComputedStyle(el);
4451
- const [abLoaded, abThemeLoaded] = ['--ab-loaded', '--ab-theme-loaded'].map((variable) => {
4452
- let val = computedDocumentStyle.getPropertyValue(variable);
4453
- if (typeof val === 'string' && val.trim) {
4454
- val = val.trim();
4455
- }
4456
- return val;
4457
- });
4458
- if (abLoaded !== '777') {
4459
- this.logger.consoleError('Please import Adaptable styles from "@adaptabletools/adaptable/index.css"');
4460
- }
4461
- // every theme should define a custom css variable: --ab-theme-loaded: <themeName> defined on the document element.
4462
- if (abThemeLoaded !== themeName) {
4463
- this.logger
4464
- .consoleWarn(`Theme "${themeName}" doesn't seem to be loaded! Make sure you import the css file for the "${themeName}" theme!
4465
-
4466
- If it's a default theme, try
4467
-
4468
- import "@adaptabletools/adaptable/themes/${themeName}.css"`);
4469
- }
4470
4442
  }
4471
4443
  setupRowStyling() {
4472
4444
  // Set any Row Styles (i.e. items without a classname)