@adaptabletools/adaptable 17.0.0-canary.8 → 17.0.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 (71) hide show
  1. package/base.css +24 -1
  2. package/base.css.map +1 -1
  3. package/bundle.cjs.js +199 -226
  4. package/index.css +34 -1
  5. package/index.css.map +1 -1
  6. package/package.json +1 -2
  7. package/publishTimestamp.d.ts +1 -1
  8. package/publishTimestamp.js +1 -1
  9. package/src/AdaptableOptions/ColumnFilterOptions.d.ts +8 -8
  10. package/src/Api/EventApi.d.ts +19 -8
  11. package/src/Api/Events/CellSelectionChanged.d.ts +11 -0
  12. package/src/Api/Events/RowSelectionChanged.d.ts +11 -0
  13. package/src/Api/Events/RowSelectionChanged.js +2 -0
  14. package/src/Redux/ActionsReducers/PlusMinusRedux.d.ts +16 -0
  15. package/src/Redux/ActionsReducers/PlusMinusRedux.js +47 -1
  16. package/src/Strategy/LayoutModule.d.ts +12 -4
  17. package/src/Strategy/LayoutModule.js +11 -5
  18. package/src/Strategy/NotesModule.js +1 -1
  19. package/src/Strategy/PlusMinusModule.js +2 -0
  20. package/src/Strategy/Utilities/Export/getExportRowsViewItems.d.ts +2 -1
  21. package/src/Strategy/Utilities/Export/getExportRowsViewItems.js +14 -5
  22. package/src/Strategy/Utilities/getExpressionViewItems.js +8 -2
  23. package/src/Utilities/Defaults/DefaultAdaptableOptions.js +1 -1
  24. package/src/Utilities/Services/ModuleService.js +1 -1
  25. package/src/View/CalculatedColumn/Wizard/CalculatedColumnExpressionWizardSection.js +1 -1
  26. package/src/View/CalculatedColumn/Wizard/CalculatedColumnWizard.js +1 -1
  27. package/src/View/Components/FilterForm/FilterForm.js +8 -2
  28. package/src/View/Components/FilterForm/ListBoxFilterForm.js +1 -3
  29. package/src/View/Components/FilterForm/QuickFilterForm.js +5 -4
  30. package/src/View/Components/FilterForm/QuickFilterValues.d.ts +2 -2
  31. package/src/View/Components/FilterForm/QuickFilterValues.js +4 -3
  32. package/src/View/Components/Selectors/ColumnSelector.d.ts +1 -0
  33. package/src/View/Components/Selectors/ColumnSelector.js +2 -1
  34. package/src/View/DataImport/DataImportWizard/sections/DataPreview.js +2 -2
  35. package/src/View/Export/Wizard/ReportRowsWizardSection.js +3 -1
  36. package/src/View/GridFilter/GridFilterExpressionEditor.js +1 -1
  37. package/src/View/GridFilter/GridFilterPopup.js +10 -8
  38. package/src/View/GridFilter/GridFilterViewPanel.js +11 -10
  39. package/src/View/GridFilter/NamedQuerySelector.js +1 -1
  40. package/src/View/GridFilter/useGridFilterExpressionEditor.d.ts +3 -0
  41. package/src/View/GridFilter/useGridFilterExpressionEditor.js +16 -5
  42. package/src/View/Layout/Wizard/getGridFilterPreview.d.ts +6 -0
  43. package/src/View/Layout/Wizard/getGridFilterPreview.js +16 -0
  44. package/src/View/Layout/Wizard/sections/FilterSection.js +1 -1
  45. package/src/View/NamedQuery/Wizard/NamedQueryExpressionWizardSection.js +1 -1
  46. package/src/View/Notes/NotesPopup.js +2 -2
  47. package/src/View/PlusMinus/MovePlusMinus.d.ts +7 -0
  48. package/src/View/PlusMinus/MovePlusMinus.js +27 -0
  49. package/src/agGrid/Adaptable.js +2 -2
  50. package/src/agGrid/agGridHelper.d.ts +2 -1
  51. package/src/agGrid/agGridHelper.js +13 -3
  52. package/src/components/Datepicker/index.js +4 -4
  53. package/src/components/ExpressionEditor/ExpressionPreview.d.ts +7 -0
  54. package/src/components/ExpressionEditor/ExpressionPreview.js +25 -0
  55. package/src/components/ExpressionEditor/QueryBuilder/QueryBuilder.js +2 -2
  56. package/src/components/ExpressionEditor/QueryBuilder/QueryBuilderInputs.js +11 -7
  57. package/src/components/ExpressionEditor/index.js +4 -7
  58. package/src/components/InputGroup/InputGroup.d.ts +7 -0
  59. package/src/components/InputGroup/InputGroup.js +12 -0
  60. package/src/components/InputGroup/index.d.ts +1 -0
  61. package/src/components/InputGroup/index.js +4 -0
  62. package/src/components/OverlayTrigger/index.js +7 -2
  63. package/src/components/Select/Select.d.ts +0 -1
  64. package/src/components/Select/Select.js +4 -4
  65. package/src/metamodel/adaptable.metamodel.js +1 -1
  66. package/src/renderReactRoot.js +16 -10
  67. package/src/types.d.ts +2 -1
  68. package/version.d.ts +1 -1
  69. package/version.js +1 -1
  70. package/src/Api/Events/SelectionChanged.d.ts +0 -16
  71. /package/src/Api/Events/{SelectionChanged.js → CellSelectionChanged.js} +0 -0
@@ -18,6 +18,7 @@ const AggregationColumns_1 = require("../PredefinedConfig/Common/AggregationColu
18
18
  const windowFactory_1 = require("../View/Components/Popups/WindowPopups/windowFactory");
19
19
  const flattenDeep_1 = tslib_1.__importDefault(require("lodash/flattenDeep"));
20
20
  const StringExtensions_1 = tslib_1.__importDefault(require("../Utilities/Extensions/StringExtensions"));
21
+ const getGridFilterPreview_1 = require("../View/Layout/Wizard/getGridFilterPreview");
21
22
  class LayoutModule extends AdaptableModuleBase_1.AdaptableModuleBase {
22
23
  constructor(api) {
23
24
  super(ModuleConstants.LayoutModuleId, ModuleConstants.LayoutFriendlyName, 'grid', 'LayoutPopup', 'Named sets of column visibility, order, groupings, aggregation, pivots etc.', api);
@@ -139,7 +140,7 @@ class LayoutModule extends AdaptableModuleBase_1.AdaptableModuleBase {
139
140
  return teamSharingReferences;
140
141
  }
141
142
  hasNamedQueryReferences() {
142
- return false;
143
+ return true;
143
144
  }
144
145
  handleAdaptableReady() {
145
146
  requestAnimationFrame(() => {
@@ -392,10 +393,8 @@ class LayoutModule extends AdaptableModuleBase_1.AdaptableModuleBase {
392
393
  .filter(Boolean),
393
394
  },
394
395
  (layout === null || layout === void 0 ? void 0 : layout.GridFilter) &&
395
- StringExtensions_1.default.IsNotNullOrEmpty(layout.GridFilter.Expression) && {
396
- name: 'Grid Filter',
397
- values: [layout.GridFilter.Expression],
398
- },
396
+ StringExtensions_1.default.IsNotNullOrEmpty(layout.GridFilter.Expression) &&
397
+ (0, getGridFilterPreview_1.getGridFilterViewItems)(layout),
399
398
  ].filter(Boolean),
400
399
  abObject: layout,
401
400
  };
@@ -443,5 +442,12 @@ class LayoutModule extends AdaptableModuleBase_1.AdaptableModuleBase {
443
442
  // we need to refresh the column defs, as some configs may have changed
444
443
  this.api.internalApi.getAdaptableInstance().setupColumns();
445
444
  }
445
+ getReferencedNamedQueryNames(layout) {
446
+ var _a;
447
+ if (!((_a = layout.GridFilter) === null || _a === void 0 ? void 0 : _a.Expression)) {
448
+ return [];
449
+ }
450
+ return this.api.namedQueryApi.internalApi.getReferencedNamedQueryNames(layout.GridFilter.Expression);
451
+ }
446
452
  }
447
453
  exports.LayoutModule = LayoutModule;
@@ -23,7 +23,7 @@ class NotesModule extends AdaptableModuleBase_1.AdaptableModuleBase {
23
23
  return;
24
24
  }
25
25
  this.adaptable._on('MouseEnter', (event) => this.handleMouseEnter(event));
26
- this.api.eventApi.on('SelectionChanged', (params) => {
26
+ this.api.eventApi.on('CellSelectionChanged', (params) => {
27
27
  const cells = params.selectedCellInfo.gridCells;
28
28
  if ((cells === null || cells === void 0 ? void 0 : cells.length) === 1) {
29
29
  const selectedCell = cells[0];
@@ -12,6 +12,7 @@ const getScopeViewItems_1 = require("./Utilities/getScopeViewItems");
12
12
  const PlusMinusWizard_1 = require("../View/PlusMinus/Wizard/PlusMinusWizard");
13
13
  const getRuleViewItems_1 = require("./Utilities/getRuleViewItems");
14
14
  const getObjectTagsViewItems_1 = require("./Utilities/getObjectTagsViewItems");
15
+ const MovePlusMinus_1 = require("../View/PlusMinus/MovePlusMinus");
15
16
  class PlusMinusModule extends AdaptableModuleBase_1.AdaptableModuleBase {
16
17
  constructor(api) {
17
18
  super(ModuleConstants.PlusMinusModuleId, ModuleConstants.PlusMinusFriendlyName, 'add-circle', 'PlusMinusPopup', 'Configure how a cell value will edit when the + or - keys are pressed', api);
@@ -218,6 +219,7 @@ class PlusMinusModule extends AdaptableModuleBase_1.AdaptableModuleBase {
218
219
  }
219
220
  getViewProperties() {
220
221
  return {
222
+ actions: [MovePlusMinus_1.MovePlusMinus],
221
223
  getEditAction: PlusMinusRedux.PlusMinusNudgeEdit,
222
224
  getDeleteAction: PlusMinusRedux.PlusMinusNudgeDelete,
223
225
  getSuspendAction: PlusMinusRedux.PlusMinusNudgeSuspend,
@@ -1,5 +1,6 @@
1
+ /// <reference types="react" />
1
2
  import { AdaptableApi, Report } from '../../../types';
2
3
  export declare const getExportRowsViewItems: (report: Report, api: AdaptableApi) => {
3
4
  name: string;
4
- values: string[];
5
+ view: JSX.Element;
5
6
  };
@@ -1,14 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getExportRowsViewItems = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const React = tslib_1.__importStar(require("react"));
6
+ const ExpressionPreview_1 = require("../../../components/ExpressionEditor/ExpressionPreview");
7
+ const Tag_1 = require("../../../components/Tag");
4
8
  const getExportRowsViewItems = (report, api) => {
9
+ let element = null;
10
+ if (report.ReportRowScope === 'ExpressionRows') {
11
+ element = React.createElement(ExpressionPreview_1.ExpressionPreview, { query: report.Query });
12
+ }
13
+ else {
14
+ element = api.internalApi
15
+ .getReportService()
16
+ .GetReportExpressionDescription(report, api.columnApi.getColumns());
17
+ }
5
18
  return {
6
19
  name: 'Rows',
7
- values: [
8
- api.internalApi
9
- .getReportService()
10
- .GetReportExpressionDescription(report, api.columnApi.getColumns()),
11
- ],
20
+ view: React.createElement(Tag_1.Tag, null, element),
12
21
  };
13
22
  };
14
23
  exports.getExportRowsViewItems = getExportRowsViewItems;
@@ -1,11 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getExpressionViewItems = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const React = tslib_1.__importStar(require("react"));
6
+ const ExpressionPreview_1 = require("../../components/ExpressionEditor/ExpressionPreview");
7
+ const Tag_1 = require("../../components/Tag");
4
8
  const getExpressionViewItems = (query, api) => {
5
- const expressionText = api.internalApi.getAdaptableQueryExpressionText(query);
9
+ // const expressionText = api.internalApi.getAdaptableQueryExpressionText(query);
6
10
  return {
7
11
  name: 'Expression',
8
- values: [expressionText],
12
+ // values: [],
13
+ view: (React.createElement(Tag_1.Tag, null,
14
+ React.createElement(ExpressionPreview_1.ExpressionPreview, { query: query }))),
9
15
  };
10
16
  };
11
17
  exports.getExpressionViewItems = getExpressionViewItems;
@@ -186,7 +186,6 @@ exports.DefaultAdaptableOptions = {
186
186
  hideQuickFilterDropdown: undefined,
187
187
  hideQuickFilterInput: undefined,
188
188
  quickFilterTrigger: 'mouseenter',
189
- quickFilterValuesTrigger: 'mouseenter',
190
189
  quickFilterDebounce: 250,
191
190
  quickFilterHeight: null,
192
191
  showQuickFilter: true,
@@ -198,6 +197,7 @@ exports.DefaultAdaptableOptions = {
198
197
  defaultFilterFormTab: 'Values',
199
198
  },
200
199
  valuesFilterOptions: {
200
+ valuesFilterTrigger: 'mouseenter',
201
201
  sortValuesFilter: false,
202
202
  filterValuesUsingTime: false,
203
203
  showDistinctFilteredValuesOnly: false,
@@ -106,7 +106,7 @@ class ModuleService {
106
106
  case 'ColumnFilter':
107
107
  return learnUrl + 'handbook-column-filter';
108
108
  case 'GridFilter':
109
- return learnUrl + 'handbook-column-filter';
109
+ return learnUrl + 'handbook-grid-filter';
110
110
  case 'FlashingCell':
111
111
  return learnUrl + 'handbook-flashing-cell';
112
112
  case 'FormatColumn':
@@ -50,7 +50,7 @@ const CalculatedColumnExpressionWizardSection = (props) => {
50
50
  return 'quantileAggregatedScalar';
51
51
  }
52
52
  };
53
- return (React.createElement(Tabs_1.Tabs, { autoFocus: false },
53
+ return (React.createElement(Tabs_1.Tabs, { autoFocus: false, height: "100%" },
54
54
  React.createElement(Tabs_1.Tabs.Tab, null, (0, StringExtensions_1.Humanize)(props.expressionType)),
55
55
  React.createElement(Tabs_1.Tabs.Content, null, (() => {
56
56
  switch (props.expressionType) {
@@ -100,7 +100,7 @@ const CalculatedColumnWizard = (props) => {
100
100
  isValid: CalculatedColumnExpressionWizardSection_1.isValidCalculatedColumnExpression,
101
101
  renderSummary: CalculatedColumnExpressionWizardSection_1.renderCalculatedColumnExpressionSummary,
102
102
  render: () => {
103
- return (React.createElement(rebass_1.Box, { p: 2 },
103
+ return (React.createElement(rebass_1.Box, { height: "100%", p: 2 },
104
104
  React.createElement(CalculatedColumnExpressionWizardSection_1.CalculatedColumnExpressionWizardSection, { expressionType: expressionType, onChange: setCalculatedColumn })));
105
105
  },
106
106
  },
@@ -110,7 +110,8 @@ class FilterFormComponent extends React.Component {
110
110
  }
111
111
  }
112
112
  async loadPermittedValues(filter = '') {
113
- const { values: distinctColumnValues, suppressClientSideFilter } = await (0, runIfNotResolvedIn_1.runIfNotResolvedIn)(this.props.api.gridApi.internalApi.getDistinctFilterDisplayValuesForColumn(this.props.currentColumn.columnId, filter, this.props.api.optionsApi.getColumnFilterOptions().valuesFilterOptions.showDistinctFilteredValuesOnly), () => this._isMounted && this.setState({ isDistinctColumnValuesLoading: true }));
113
+ const { values: distinctColumnValues, suppressClientSideFilter } = await (0, runIfNotResolvedIn_1.runIfNotResolvedIn)(this.props.api.gridApi.internalApi.getDistinctFilterDisplayValuesForColumn(this.props.currentColumn.columnId, filter, this.props.api.optionsApi.getColumnFilterOptions().valuesFilterOptions
114
+ .showDistinctFilteredValuesOnly), () => this._isMounted && this.setState({ isDistinctColumnValuesLoading: true }));
114
115
  if (this._isMounted) {
115
116
  this.setState({
116
117
  distinctColumnValues,
@@ -178,7 +179,12 @@ class FilterFormComponent extends React.Component {
178
179
  } })));
179
180
  }
180
181
  return (_a = predicateDef.inputs) === null || _a === void 0 ? void 0 : _a.map((predicateInput, index) => (React.createElement(rebass_1.Flex, { key: index, flexDirection: "row" },
181
- React.createElement(AdaptableInput_1.default, { disabled: this.isFilterDisabled(), type: predicateInput.type, autoFocus: index === 0, value: filter.Predicate.Inputs[index], onChange: (e) => this.changeColumnPredicateInput(e.target.value, index), mb: 1, flex: 1, fontSize: 2 }))));
182
+ React.createElement(AdaptableInput_1.default, { onMouseDown: (event) => {
183
+ if (predicateInput.type === 'date') {
184
+ // This prevents the ag-grid dropdown closing when a date is selected
185
+ event.stopPropagation();
186
+ }
187
+ }, disabled: this.isFilterDisabled(), type: predicateInput.type, autoFocus: index === 0, value: filter.Predicate.Inputs[index], onChange: (e) => this.changeColumnPredicateInput(e.target.value, index), mb: 1, flex: 1, fontSize: 2 }))));
182
188
  }
183
189
  isFilterDisabled() {
184
190
  var _a;
@@ -78,9 +78,7 @@ const ListBoxFilterForm = (props) => {
78
78
  const textClear = (React.createElement(AdaptableFormControlTextClear_1.AdaptableFormControlTextClear, { autoFocus: true, type: "text", placeholder: "Search Column Values", value: FilterValue, style: {
79
79
  paddingTop: 'var(--ab-space-1)',
80
80
  paddingBottom: 'var(--ab-space-1)',
81
- paddingLeft: 'var(--ab-space-1)',
82
- borderRadius: 'var(--ab__border-radius)',
83
- }, OnTextChange: handleFilterValueChange }));
81
+ }, inputStyle: { padding: 'var(--ab-space-1)' }, OnTextChange: handleFilterValueChange }));
84
82
  const baseClassName = 'ab-ListBoxFilterForm';
85
83
  return (React.createElement("div", { className: (0, join_1.default)(baseClassName, props.useAgGridStyle ? `${baseClassName}--aggrid-style` : null, props.isLoading && `${baseClassName}--loading`) },
86
84
  React.createElement(rebass_1.Box, { px: 2 },
@@ -57,7 +57,8 @@ class QuickFilterFormComponent extends React.Component {
57
57
  hideEvent = 'blur';
58
58
  }
59
59
  let showQuickFilterDropdown = true;
60
- let hideQuickFilterDropdownFunction = this.props.api.optionsApi.getColumnFilterOptions().quickFilterOptions.hideQuickFilterDropdown;
60
+ let hideQuickFilterDropdownFunction = this.props.api.optionsApi.getColumnFilterOptions().quickFilterOptions
61
+ .hideQuickFilterDropdown;
61
62
  if (hideQuickFilterDropdownFunction) {
62
63
  const columnFilterContext = {
63
64
  column: this.props.currentColumn,
@@ -79,7 +80,7 @@ class QuickFilterFormComponent extends React.Component {
79
80
  showQuickFilterInput = !hideQuickFilterInputFunction(columnFilterContext);
80
81
  }
81
82
  return (React.createElement(React.Fragment, null,
82
- 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 },
83
+ showQuickFilterDropdown && (React.createElement(OverlayTrigger_1.default, { className: "ab-QuickFilter", showEvent: showEvent, hideEvent: hideEvent, preventPortalEventPropagation: showEvent === 'click', targetOffset: 10, hideDelay: 50, "data-name": "quick-filter-overlay", render: () => (React.createElement(rebass_1.Flex, { className: "ab-QuickFilter__dropdown", flexDirection: "column", "data-name": "quick-filter", fontSize: 2 },
83
84
  (transientColumnFilter === null || transientColumnFilter === void 0 ? void 0 : transientColumnFilter.Predicate.PredicateId) && (React.createElement(SimpleButton_1.default, { p: 2, variant: "text", onClick: () => this.clearFilter() },
84
85
  React.createElement("span", { style: { width: 20, marginRight: 10 } },
85
86
  React.createElement(icons_1.Icon, { name: "delete" })),
@@ -102,7 +103,7 @@ class QuickFilterFormComponent extends React.Component {
102
103
  api.show();
103
104
  this.shouldOpenValuesDropdown = false;
104
105
  }
105
- }, quickFilterValuesTrigger: this.props.quickFilterValuesTrigger }));
106
+ }, valuesFilterTrigger: this.props.valuesFilterTrigger }));
106
107
  }
107
108
  return (activePredicateDef &&
108
109
  (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)));
@@ -252,6 +253,6 @@ function mapDispatchToProps(dispatch) {
252
253
  const QuickFilterForm = (0, react_redux_1.connect)(mapStateToProps, mapDispatchToProps)(QuickFilterFormComponent);
253
254
  const QuickFilterFormReact = (columnFilterProps) => {
254
255
  var _a, _b, _c;
255
- return (0, renderWithAdaptableContext_1.renderWithAdaptableContext)(React.createElement(QuickFilterForm, { api: columnFilterProps.Adaptable.api, quickFilterTrigger: (_a = columnFilterProps.Adaptable.adaptableOptions.columnFilterOptions) === null || _a === void 0 ? void 0 : _a.quickFilterOptions.quickFilterTrigger, quickFilterValuesTrigger: (_b = columnFilterProps.Adaptable.adaptableOptions.columnFilterOptions) === null || _b === void 0 ? void 0 : _b.quickFilterOptions.quickFilterValuesTrigger, quickFilterDebounce: (_c = columnFilterProps.Adaptable.adaptableOptions.columnFilterOptions) === null || _c === void 0 ? void 0 : _c.quickFilterOptions.quickFilterDebounce, currentColumn: columnFilterProps.Column, teamSharingActivated: false, embedColumnMenu: columnFilterProps.Adaptable.embedColumnMenu }), columnFilterProps.Adaptable);
256
+ return (0, renderWithAdaptableContext_1.renderWithAdaptableContext)(React.createElement(QuickFilterForm, { api: columnFilterProps.Adaptable.api, quickFilterTrigger: (_a = columnFilterProps.Adaptable.adaptableOptions.columnFilterOptions) === null || _a === void 0 ? void 0 : _a.quickFilterOptions.quickFilterTrigger, valuesFilterTrigger: (_b = columnFilterProps.Adaptable.adaptableOptions.columnFilterOptions) === null || _b === void 0 ? void 0 : _b.valuesFilterOptions.valuesFilterTrigger, quickFilterDebounce: (_c = columnFilterProps.Adaptable.adaptableOptions.columnFilterOptions) === null || _c === void 0 ? void 0 : _c.quickFilterOptions.quickFilterDebounce, currentColumn: columnFilterProps.Column, teamSharingActivated: false, embedColumnMenu: columnFilterProps.Adaptable.embedColumnMenu }), columnFilterProps.Adaptable);
256
257
  };
257
258
  exports.QuickFilterFormReact = QuickFilterFormReact;
@@ -2,7 +2,7 @@
2
2
  import { ColumnFilter } from '../../../PredefinedConfig/Common/ColumnFilter';
3
3
  import { AdaptableApi } from '../../../Api/AdaptableApi';
4
4
  import { AdaptableColumn } from '../../../PredefinedConfig/Common/AdaptableColumn';
5
- import { QuickFilterOptions } from '../../../types';
5
+ import { ValuesFilterOptions } from '../../../types';
6
6
  export interface QuickFilterValuesProps {
7
7
  api: AdaptableApi;
8
8
  currentColumn: AdaptableColumn;
@@ -14,6 +14,6 @@ export interface QuickFilterValuesProps {
14
14
  show: () => any;
15
15
  hide: () => any;
16
16
  }) => void;
17
- quickFilterValuesTrigger?: QuickFilterOptions['quickFilterValuesTrigger'];
17
+ valuesFilterTrigger?: ValuesFilterOptions['valuesFilterTrigger'];
18
18
  }
19
19
  export declare const QuickFilterValues: (props: QuickFilterValuesProps) => JSX.Element;
@@ -99,7 +99,7 @@ const QuickFilterValues = (props) => {
99
99
  }
100
100
  };
101
101
  let showEvent = 'mouseenter';
102
- if (props.quickFilterValuesTrigger === 'click') {
102
+ if (props.valuesFilterTrigger === 'click') {
103
103
  showEvent = 'click';
104
104
  }
105
105
  let selectedValues = props.columnFilter.Predicate.PredicateId === 'Values' ? 'Select Values' : 'Exclude Values';
@@ -115,7 +115,8 @@ const QuickFilterValues = (props) => {
115
115
  return label !== null && label !== void 0 ? label : input;
116
116
  }).join(', ');
117
117
  }
118
- const quickFilterValuesWidth = props.api.optionsApi.getAdaptableOptions().columnFilterOptions.quickFilterOptions.quickFilterValuesWidth;
118
+ const quickFilterValuesWidth = props.api.optionsApi.getAdaptableOptions().columnFilterOptions.quickFilterOptions
119
+ .quickFilterValuesWidth;
119
120
  const getPopoverWidth = (targetWidth) => {
120
121
  if (quickFilterValuesWidth === 'auto') {
121
122
  return Math.max(180, targetWidth);
@@ -127,7 +128,7 @@ const QuickFilterValues = (props) => {
127
128
  };
128
129
  return (React.createElement(OverlayTrigger_1.default, { showEvent: showEvent,
129
130
  // cannot hide on blur, because the form input receives the input when this is opened
130
- hideEvent: "mouseleave", hideDelay: 300, ref: (api) => {
131
+ hideEvent: "mouseleave", hideDelay: 50, ref: (api) => {
131
132
  valuesDropdownRef.current = api;
132
133
  props.registerValuesDropdownApi(api);
133
134
  }, onVisibleChange: (visible) => {
@@ -9,5 +9,6 @@ export type ColumnSelectorProps<IsMulti extends boolean = false> = {
9
9
  filterColumn?: (column: AdaptableColumn) => boolean;
10
10
  value?: IsMulti extends true ? string[] : string;
11
11
  onChange: (column: IsMulti extends true ? string[] : string) => void;
12
+ placeholder?: string;
12
13
  };
13
14
  export declare const ColumnSelector: <IsMulti extends boolean = false>(props: ColumnSelectorProps<IsMulti>) => JSX.Element;
@@ -6,6 +6,7 @@ const React = tslib_1.__importStar(require("react"));
6
6
  const Select_1 = require("../../../components/Select");
7
7
  const AdaptableContext_1 = require("../../AdaptableContext");
8
8
  const ColumnSelector = function (props) {
9
+ var _a;
9
10
  const { api } = (0, AdaptableContext_1.useAdaptable)();
10
11
  const columns = React.useMemo(() => {
11
12
  return api.columnApi.getColumnsOfType(props.type);
@@ -25,7 +26,7 @@ const ColumnSelector = function (props) {
25
26
  }
26
27
  return true;
27
28
  });
28
- return (React.createElement(Select_1.Select, { "data-name": "column-selector", disabled: props.disabled, isMulti: props.isMulti, menuPosition: props.menuPosition, value: props.value, placeholder: "Select Column", onChange: (colId) => {
29
+ return (React.createElement(Select_1.Select, { "data-name": "column-selector", disabled: props.disabled, isMulti: props.isMulti, menuPosition: props.menuPosition, value: props.value, placeholder: (_a = props.placeholder) !== null && _a !== void 0 ? _a : 'Select Column', onChange: (colId) => {
29
30
  props.onChange(colId);
30
31
  }, options: options }));
31
32
  };
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DataPreview = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const lodash_1 = require("lodash");
5
+ const flatten_1 = tslib_1.__importDefault(require("lodash/flatten"));
6
6
  const React = tslib_1.__importStar(require("react"));
7
7
  const HelpBlock_1 = tslib_1.__importDefault(require("../../../../components/HelpBlock"));
8
8
  const icons_1 = require("../../../../components/icons");
@@ -130,7 +130,7 @@ const DataPreview = (props) => {
130
130
  };
131
131
  return (React.createElement(InfiniteTable_1.DataSource, { data: props.data, primaryKey: primaryKey, onDataMutations: (params) => {
132
132
  const newRowData = [...props.data];
133
- const mutationsList = (0, lodash_1.flatten)(Array.from(params.mutations.values()));
133
+ const mutationsList = (0, flatten_1.default)(Array.from(params.mutations.values()));
134
134
  if (!mutationsList.length) {
135
135
  return;
136
136
  }
@@ -6,6 +6,7 @@ const React = tslib_1.__importStar(require("react"));
6
6
  const react_1 = require("react");
7
7
  const rebass_1 = require("rebass");
8
8
  const ExpressionEditor_1 = require("../../../components/ExpressionEditor");
9
+ const ExpressionPreview_1 = require("../../../components/ExpressionEditor/ExpressionPreview");
9
10
  const Radio_1 = tslib_1.__importDefault(require("../../../components/Radio"));
10
11
  const Tabs_1 = require("../../../components/Tabs");
11
12
  const Tag_1 = require("../../../components/Tag");
@@ -32,7 +33,8 @@ const renderReportRowsSummary = (report) => {
32
33
  report.ReportRowScope === 'ExpressionRows' ? (React.createElement(React.Fragment, null,
33
34
  "Include Rows matching the query:",
34
35
  ' ',
35
- React.createElement(Tag_1.Tag, null, api.internalApi.getAdaptableQueryExpressionText(report.Query)))) : null));
36
+ React.createElement(Tag_1.Tag, null,
37
+ React.createElement(ExpressionPreview_1.ExpressionPreview, { query: report.Query })))) : null));
36
38
  };
37
39
  exports.renderReportRowsSummary = renderReportRowsSummary;
38
40
  const ReportRowsWizardSection = (props) => {
@@ -99,7 +99,7 @@ const GridFilterExpressionEditor = (props) => {
99
99
  } }, "CLOSE")),
100
100
  React.createElement(rebass_1.Box, { flex: 1 }),
101
101
  React.createElement(SimpleButton_1.default, { disabled: actionsDisabled, onClick: handleSaveQuery, icon: "save" }, "Save Query"),
102
- React.createElement(SimpleButton_1.default, { variant: "raised", tone: "accent", "data-name": "action-run", margin: 1, onClick: () => {
102
+ React.createElement(SimpleButton_1.default, { variant: "raised", tone: "accent", "data-name": "action-run", margin: 1, icon: "play", onClick: () => {
103
103
  var _a;
104
104
  if (namedQuery) {
105
105
  onAddNamedQuery({
@@ -9,6 +9,7 @@ const FieldWrap_1 = tslib_1.__importDefault(require("../../components/FieldWrap"
9
9
  const FormLayout_1 = tslib_1.__importStar(require("../../components/FormLayout"));
10
10
  const Input_1 = tslib_1.__importDefault(require("../../components/Input"));
11
11
  const Panel_1 = tslib_1.__importDefault(require("../../components/Panel"));
12
+ const StringExtensions_1 = tslib_1.__importDefault(require("../../Utilities/Extensions/StringExtensions"));
12
13
  const ButtonClear_1 = require("../Components/Buttons/ButtonClear");
13
14
  const ButtonExpand_1 = require("../Components/Buttons/ButtonExpand");
14
15
  const ButtonInvalid_1 = require("../Components/Buttons/ButtonInvalid");
@@ -20,27 +21,28 @@ const PopupPanel_1 = require("../Components/Popups/AdaptablePopup/PopupPanel");
20
21
  const NamedQuerySelector_1 = require("./NamedQuerySelector");
21
22
  const useGridFilterExpressionEditor_1 = require("./useGridFilterExpressionEditor");
22
23
  const GridFilterPopup = () => {
23
- const { cachedQueries, expression, setExpression, isExpressionNamedQuery, isExpressionValid, isSuspended, gridFilter, namedQueries, availableColumns, runQuery, onExpand, clearQuery, namedQueryModuleAccessLevel, saveQuery, suspendGridFilter, unSuspendGridFilter, setGridFilterExpression, gridFilterAccessLevel, } = (0, useGridFilterExpressionEditor_1.useGridFilterExpressionEditor)();
24
+ const { cachedQueries, expression, setExpression, isExpressionNamedQuery, isExpressionValid, isSuspended, gridFilter, namedQueries, availableColumns, runQuery, onExpand, clearQuery, namedQueryModuleAccessLevel, saveQuery, suspendGridFilter, unSuspendGridFilter, setGridFilterExpression, gridFilterAccessLevel, gridFilterHelpPage, gridFilterLinkDisabled, isReadOnly, } = (0, useGridFilterExpressionEditor_1.useGridFilterExpressionEditor)();
24
25
  const handleEnter = (e) => {
25
26
  if (e.key === 'Enter') {
26
27
  runQuery();
27
28
  }
28
29
  };
29
- const disabled = isSuspended || gridFilterAccessLevel === 'ReadOnly';
30
- return (React.createElement(PopupPanel_1.PopupPanel, { className: "ab-GridFilter", headerText: "Grid Filter", glyphicon: "grid-filter" },
30
+ const disabled = isReadOnly || isSuspended || gridFilterAccessLevel === 'ReadOnly';
31
+ return (React.createElement(PopupPanel_1.PopupPanel, { className: "ab-GridFilter", headerText: "Grid Filter", glyphicon: "grid-filter", infoLink: gridFilterHelpPage, infoLinkDisabled: gridFilterLinkDisabled },
31
32
  React.createElement(Panel_1.default, { bodyProps: { height: '100%' }, height: "100%" },
32
33
  React.createElement(FormLayout_1.default, null,
33
34
  React.createElement(FormLayout_1.FormRow, { label: "Expression" },
34
35
  React.createElement(FieldWrap_1.default, { marginRight: 1, width: "100%" },
35
- React.createElement(ButtonExpand_1.ButtonExpand, { disabled: disabled, variant: "text", tone: "neutral", onClick: onExpand, tooltip: "Open Expression Editor", marginLeft: 1 }),
36
+ React.createElement(ButtonExpand_1.ButtonExpand, { disabled: disabled, variant: "text", tone: "neutral", onClick: onExpand, tooltip: "Edit the Expression in UI", marginLeft: 1 }),
36
37
  React.createElement(Input_1.default, { onKeyDown: handleEnter, disabled: disabled, type: "text", "data-name": "grid-filter-input", placeholder: "Grid Filter", spellCheck: false, value: expression, onChange: (x) => setExpression(x.target.value), style: { fontFamily: 'monospace', fontSize: 12 } }),
37
- isExpressionValid ? (React.createElement(ButtonPlay_1.ButtonPlay, { onClick: () => runQuery(), tooltip: '', accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral", disabled: isSuspended || expression == '' || expression == (gridFilter === null || gridFilter === void 0 ? void 0 : gridFilter.Expression), marginRight: 1 })) : (React.createElement(ButtonInvalid_1.ButtonInvalid, { variant: "text", tone: "neutral", tooltip: "Invalid Grid Filter", marginRight: 1 })),
38
+ isExpressionValid && (React.createElement(ButtonPlay_1.ButtonPlay, { onClick: () => runQuery(), tooltip: '', accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral", disabled: disabled || expression == '' || expression == (gridFilter === null || gridFilter === void 0 ? void 0 : gridFilter.Expression), marginRight: 1 })),
39
+ gridFilter && !isExpressionValid && (React.createElement(ButtonInvalid_1.ButtonInvalid, { variant: "text", tone: "neutral", tooltip: "Invalid Grid Filter", marginRight: 1 })),
38
40
  ' ',
39
- (gridFilter === null || gridFilter === void 0 ? void 0 : gridFilter.Expression) !== '' && (React.createElement(ButtonClear_1.ButtonClear, { onClick: () => clearQuery(), tooltip: "Clear Grid Filter", accessLevel: gridFilterAccessLevel })))),
41
+ StringExtensions_1.default.IsNotNullOrEmpty(expression) && (React.createElement(ButtonClear_1.ButtonClear, { onClick: () => clearQuery(), tooltip: "Clear Grid Filter", accessLevel: gridFilterAccessLevel })))),
40
42
  React.createElement(FormLayout_1.FormRow, { label: "" },
41
43
  React.createElement(rebass_1.Flex, { justifyContent: "space-around" },
42
- React.createElement(ButtonSave_1.ButtonSave, { onClick: () => saveQuery(), tooltip: "Save as Named Query", accessLevel: namedQueryModuleAccessLevel, disabled: !isExpressionValid || isExpressionNamedQuery || expression == '', variant: "text", tone: "neutral", marginRight: 1 }, "Save"),
43
- isSuspended ? (React.createElement(ButtonUnsuspend_1.ButtonUnsuspend, { onClick: () => unSuspendGridFilter(), tooltip: "Unsuspend Grid Filter", accessLevel: gridFilterAccessLevel, disabled: !isExpressionValid, variant: "text", tone: "neutral", marginRight: 1 }, "Resume")) : (React.createElement(ButtonPause_1.ButtonPause, { onClick: () => suspendGridFilter(), tooltip: "Suspend Grid Filter", accessLevel: gridFilterAccessLevel, disabled: isSuspended || !isExpressionValid, variant: "text", tone: "neutral", marginRight: 1 }, "Suspend")),
44
+ React.createElement(ButtonSave_1.ButtonSave, { onClick: () => saveQuery(), tooltip: "Save as Named Query", accessLevel: namedQueryModuleAccessLevel, disabled: disabled || !isExpressionValid || isExpressionNamedQuery || expression == '', variant: "text", tone: "neutral", marginRight: 1 }, "Save"),
45
+ isSuspended ? (React.createElement(ButtonUnsuspend_1.ButtonUnsuspend, { onClick: () => unSuspendGridFilter(), tooltip: "Unsuspend Grid Filter", accessLevel: gridFilterAccessLevel, disabled: disabled || !isExpressionValid, variant: "text", tone: "neutral", marginRight: 1 }, "Resume")) : (React.createElement(ButtonPause_1.ButtonPause, { onClick: () => suspendGridFilter(), tooltip: "Suspend Grid Filter", accessLevel: gridFilterAccessLevel, disabled: disabled || !isExpressionValid, variant: "text", tone: "neutral", marginRight: 1 }, "Suspend")),
44
46
  React.createElement(DropdownButton_1.default, { disabled: disabled, variant: "text", items: availableColumns, marginRight: 1, tooltip: "Pick Columns", icon: "list", iconPosition: "start" }, "Columns"),
45
47
  React.createElement(NamedQuerySelector_1.NamedQuerySelector, { disabled: disabled, namedQueries: namedQueries, cachedQueries: cachedQueries, currentQuery: gridFilter === null || gridFilter === void 0 ? void 0 : gridFilter.Expression, onSelect: (query) => runQuery(query), setGridFilterExpression: (query) => setGridFilterExpression(query) }, "Named Queries")))))));
46
48
  };
@@ -19,34 +19,35 @@ const ButtonUnsuspend_1 = require("../Components/Buttons/ButtonUnsuspend");
19
19
  const NamedQuerySelector_1 = require("./NamedQuerySelector");
20
20
  const useGridFilterExpressionEditor_1 = require("./useGridFilterExpressionEditor");
21
21
  const QueryViewPanelComponent = (props) => {
22
- const { cachedQueries, expression, setExpression, isExpressionNamedQuery, isExpressionValid, isSuspended, gridFilter, isAdaptableReady, namedQueries, availableColumns, runQuery, onExpand, clearQuery, namedQueryModuleAccessLevel, saveQuery, suspendGridFilter, unSuspendGridFilter, setGridFilterExpression, gridFilterAccessLevel, } = (0, useGridFilterExpressionEditor_1.useGridFilterExpressionEditor)();
22
+ const { cachedQueries, expression, setExpression, isExpressionNamedQuery, isExpressionValid, isSuspended, gridFilter, isAdaptableReady, namedQueries, availableColumns, runQuery, onExpand, clearQuery, namedQueryModuleAccessLevel, saveQuery, suspendGridFilter, unSuspendGridFilter, setGridFilterExpression, gridFilterAccessLevel, isReadOnly, } = (0, useGridFilterExpressionEditor_1.useGridFilterExpressionEditor)();
23
23
  if (!isAdaptableReady) {
24
24
  return null;
25
25
  }
26
26
  const elementType = props.viewType === 'Toolbar' ? 'DashboardToolbar' : 'ToolPanel';
27
+ const disabled = isReadOnly || isSuspended || gridFilterAccessLevel === 'ReadOnly';
27
28
  const handleEnter = (e) => {
28
29
  if (e.key === 'Enter') {
29
30
  runQuery();
30
31
  }
31
32
  };
32
- const buttonExpand = (React.createElement(ButtonExpand_1.ButtonExpand, { disabled: isSuspended, accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral", onClick: onExpand, tooltip: "Open Expression Editor", marginLeft: 1 }));
33
+ const buttonExpand = (React.createElement(ButtonExpand_1.ButtonExpand, { disabled: disabled, accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral", onClick: onExpand, tooltip: "Edit the Expression in UI", marginLeft: 1 }));
33
34
  const renderTextInput = () => {
34
35
  return props.viewType === 'Toolbar' ? (React.createElement(FieldWrap_1.default, { marginRight: 1, width: 500 },
35
36
  buttonExpand,
36
- React.createElement(Input_1.default, { disabled: isSuspended || gridFilterAccessLevel == 'ReadOnly', type: "text", "data-name": "grid-filter-input", placeholder: "Grid Filter", spellCheck: false, value: expression, onChange: (x) => setExpression(x.target.value), style: { fontFamily: 'monospace', fontSize: 12 } }),
37
- isExpressionValid && (React.createElement(ButtonPlay_1.ButtonPlay, { onClick: () => runQuery(), tooltip: '', accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral", disabled: isSuspended || expression == '' || expression == (gridFilter === null || gridFilter === void 0 ? void 0 : gridFilter.Expression), marginRight: 1 })),
37
+ React.createElement(Input_1.default, { disabled: disabled, type: "text", "data-name": "grid-filter-input", placeholder: "Grid Filter", spellCheck: false, value: expression, onChange: (x) => setExpression(x.target.value), style: { fontFamily: 'monospace', fontSize: 12 } }),
38
+ isExpressionValid && (React.createElement(ButtonPlay_1.ButtonPlay, { onClick: () => runQuery(), tooltip: '', accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral", disabled: disabled || expression == '' || expression == (gridFilter === null || gridFilter === void 0 ? void 0 : gridFilter.Expression), marginRight: 1 })),
38
39
  gridFilter && !isExpressionValid && (React.createElement(ButtonInvalid_1.ButtonInvalid, { variant: "text", tone: "neutral", tooltip: "Invalid Grid Filter", marginRight: 1 })),
39
40
  ' ',
40
41
  StringExtensions_1.default.IsNotNullOrEmpty(expression) && (React.createElement(ButtonClear_1.ButtonClear, { onClick: () => clearQuery(), tooltip: "Clear Grid Filter", accessLevel: gridFilterAccessLevel })))) : (React.createElement(FieldWrap_1.default, null,
41
42
  ' ',
42
43
  buttonExpand,
43
- React.createElement(Input_1.default, { disabled: isSuspended || gridFilterAccessLevel == 'ReadOnly', type: "text", "data-name": "grid-filter-input", placeholder: "Grid Filter", spellCheck: false, value: expression, onChange: (x) => setExpression(x.target.value), style: { width: '100%' } })));
44
+ React.createElement(Input_1.default, { disabled: disabled, type: "text", "data-name": "grid-filter-input", placeholder: "Grid Filter", spellCheck: false, value: expression, onChange: (x) => setExpression(x.target.value), style: { width: '100%' } })));
44
45
  };
45
- const saveButton = (React.createElement(ButtonSave_1.ButtonSave, { onClick: () => saveQuery(), tooltip: "Save as Named Query", accessLevel: namedQueryModuleAccessLevel, disabled: isSuspended || !isExpressionValid || isExpressionNamedQuery || expression == '', variant: "text", tone: "neutral", marginRight: 1 }));
46
- const suspendButton = (React.createElement(ButtonPause_1.ButtonPause, { onClick: () => suspendGridFilter(), tooltip: "Suspend Grid Filter", accessLevel: gridFilterAccessLevel, disabled: !isExpressionValid, variant: "text", tone: "neutral", marginRight: 1 }));
47
- const unSuspendButton = (React.createElement(ButtonUnsuspend_1.ButtonUnsuspend, { onClick: () => unSuspendGridFilter(), tooltip: "Unsuspend Grid Filter", accessLevel: gridFilterAccessLevel, disabled: !isExpressionValid, variant: "text", tone: "neutral", marginRight: 1 }));
46
+ const saveButton = (React.createElement(ButtonSave_1.ButtonSave, { onClick: () => saveQuery(), tooltip: "Save as Named Query", accessLevel: namedQueryModuleAccessLevel, disabled: disabled || !isExpressionValid || isExpressionNamedQuery || expression == '', variant: "text", tone: "neutral", marginRight: 1 }));
47
+ const suspendButton = (React.createElement(ButtonPause_1.ButtonPause, { onClick: () => suspendGridFilter(), tooltip: "Suspend Grid Filter", accessLevel: gridFilterAccessLevel, disabled: disabled || !isExpressionValid, variant: "text", tone: "neutral", marginRight: 1 }));
48
+ const unSuspendButton = (React.createElement(ButtonUnsuspend_1.ButtonUnsuspend, { onClick: () => unSuspendGridFilter(), tooltip: "Unsuspend Grid Filter", accessLevel: gridFilterAccessLevel, disabled: disabled || !isExpressionValid, variant: "text", tone: "neutral", marginRight: 1 }));
48
49
  const namedQuerySelector = (React.createElement(NamedQuerySelector_1.NamedQuerySelector, { namedQueries: namedQueries, cachedQueries: cachedQueries, currentQuery: gridFilter === null || gridFilter === void 0 ? void 0 : gridFilter.Expression, onSelect: (query) => runQuery(query), setGridFilterExpression: (query) => setGridFilterExpression(query) }));
49
- const columnsDropdown = (React.createElement(DropdownButton_1.default, { disabled: isSuspended, accessLevel: gridFilterAccessLevel, variant: "text", items: availableColumns, marginRight: 1, tooltip: "Pick Columns" },
50
+ const columnsDropdown = (React.createElement(DropdownButton_1.default, { disabled: disabled, accessLevel: gridFilterAccessLevel, variant: "text", items: availableColumns, marginRight: 1, tooltip: "Pick Columns" },
50
51
  React.createElement(icons_1.Icon, { name: 'list' })));
51
52
  const renderButtons = () => {
52
53
  return props.viewType === 'Toolbar' ? (React.createElement(React.Fragment, null,
@@ -55,7 +56,7 @@ const QueryViewPanelComponent = (props) => {
55
56
  columnsDropdown,
56
57
  namedQuerySelector,
57
58
  ' ')) : (React.createElement(React.Fragment, null,
58
- React.createElement(ButtonPlay_1.ButtonPlay, { onClick: () => runQuery(), tooltip: "Run Grid Filter", accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral", disabled: isSuspended || !isExpressionValid || expression == '' || expression == gridFilter, marginRight: 1 }),
59
+ React.createElement(ButtonPlay_1.ButtonPlay, { onClick: () => runQuery(), tooltip: "Run Grid Filter", accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral", disabled: disabled || !isExpressionValid || expression == '' || expression == gridFilter, marginRight: 1 }),
59
60
  ' ',
60
61
  React.createElement(ButtonClear_1.ButtonClear, { onClick: () => clearQuery(), tooltip: "Clear Grid Filter", accessLevel: gridFilterAccessLevel, disabled: expression == '' }),
61
62
  ' ',
@@ -48,7 +48,7 @@ const NamedQuerySelector = (props) => {
48
48
  cachedQueries ? (React.createElement(React.Fragment, null,
49
49
  React.createElement(Panel_1.default, { mt: 2, header: "Recent Grid Filters" },
50
50
  React.createElement(rebass_1.Flex, { flexDirection: "column" }, cachedQueries.map((cachedQuery, index) => {
51
- return (React.createElement(SimpleButton_1.default, { mb: 2, variant: "text", key: index, onClick: cachedQuery.onClick }, cachedQuery.label));
51
+ return (React.createElement(SimpleButton_1.default, { disabled: props.disabled, mb: 2, variant: "text", key: index, onClick: cachedQuery.onClick }, cachedQuery.label));
52
52
  }))))) : null),
53
53
  ] },
54
54
  React.createElement(SimpleButton_1.default, { disabled: props.disabled, variant: "text", icon: "folder-open" }, props.children))) : (React.createElement(ButtonOpen_1.ButtonOpen, { tooltip: "Load Named Query", disabled: true }));
@@ -1,6 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { CachedQuery } from '../../PredefinedConfig/NamedQueryState';
3
3
  export declare const useGridFilterExpressionEditor: () => {
4
+ isReadOnly: boolean;
4
5
  namedQueryModuleAccessLevel: import("../../types").AccessLevel;
5
6
  cachedQueries: CachedQuery[];
6
7
  expression: string;
@@ -21,4 +22,6 @@ export declare const useGridFilterExpressionEditor: () => {
21
22
  unSuspendGridFilter: () => void;
22
23
  setGridFilterExpression: (expression: string) => void;
23
24
  gridFilterAccessLevel: import("../../types").AccessLevel;
25
+ gridFilterHelpPage: string;
26
+ gridFilterLinkDisabled: boolean;
24
27
  };
@@ -13,10 +13,11 @@ const useGridFilterExpressionEditor = () => {
13
13
  var _a, _b, _c;
14
14
  const adaptable = (0, AdaptableContext_1.useAdaptable)();
15
15
  const dispatch = (0, react_redux_1.useDispatch)();
16
- const gridFilter = (0, react_redux_1.useSelector)((state) => {
17
- var _a;
18
- return (_a = state.Layout.Layouts.find((l) => l.Name == state.Layout.CurrentLayout)) === null || _a === void 0 ? void 0 : _a.GridFilter;
16
+ const currentLayout = (0, react_redux_1.useSelector)((state) => {
17
+ return state.Layout.Layouts.find((l) => l.Name == state.Layout.CurrentLayout);
19
18
  });
19
+ const isReadOnly = Boolean(currentLayout === null || currentLayout === void 0 ? void 0 : currentLayout.IsReadOnly);
20
+ const gridFilter = currentLayout === null || currentLayout === void 0 ? void 0 : currentLayout.GridFilter;
20
21
  const [isAdaptableReady, setIsAdaptableReady] = React.useState(false);
21
22
  const [expression, setExpression] = React.useState(() => {
22
23
  return adaptable.api.gridFilterApi.getCurrentGridFilterExpression();
@@ -27,14 +28,17 @@ const useGridFilterExpressionEditor = () => {
27
28
  const onAddCachedQuery = (cachedQuery) => {
28
29
  dispatch(SystemRedux.SystemCachedQueryAdd(cachedQuery));
29
30
  };
31
+ const gridFilterHelpPage = adaptable.ModuleService.getModuleById('GridFilter').moduleInfo.HelpPage;
32
+ const gridFilterLinkDisabled = !adaptable.api.internalApi.isDocumentationLinksDisplayed();
30
33
  React.useEffect(() => {
31
34
  adaptable.api.eventApi.on('AdaptableReady', () => {
32
35
  setIsAdaptableReady(true);
33
36
  });
34
37
  }, []);
35
38
  React.useEffect(() => {
39
+ var _a;
36
40
  if ((gridFilter === null || gridFilter === void 0 ? void 0 : gridFilter.Expression) != expression) {
37
- setExpression(gridFilter === null || gridFilter === void 0 ? void 0 : gridFilter.Expression);
41
+ setExpression((_a = gridFilter === null || gridFilter === void 0 ? void 0 : gridFilter.Expression) !== null && _a !== void 0 ? _a : '');
38
42
  }
39
43
  }, [gridFilter === null || gridFilter === void 0 ? void 0 : gridFilter.Expression]);
40
44
  const isExpressionValid = expression == '' ||
@@ -45,7 +49,11 @@ const useGridFilterExpressionEditor = () => {
45
49
  let availableColumns = adaptable.api.columnApi.getColumns().map((col) => {
46
50
  return {
47
51
  label: col.friendlyName,
48
- onClick: () => setExpression(expression + `[${col.columnId}]`),
52
+ onClick: () => {
53
+ // Bogdan - im sure there is a better way to do this check with fancy operators i dont know
54
+ const newExp = StringExtensions_1.default.IsNotNullOrEmpty(expression) ? expression : '';
55
+ setExpression(newExp + `[${col.columnId}]`);
56
+ },
49
57
  };
50
58
  });
51
59
  const clearQuery = () => {
@@ -101,6 +109,7 @@ const useGridFilterExpressionEditor = () => {
101
109
  adaptable.api.gridFilterApi.unSuspendGridFilter();
102
110
  };
103
111
  return {
112
+ isReadOnly,
104
113
  namedQueryModuleAccessLevel,
105
114
  cachedQueries,
106
115
  expression,
@@ -123,6 +132,8 @@ const useGridFilterExpressionEditor = () => {
123
132
  adaptable.api.gridFilterApi.setGridFilterExpression(expression);
124
133
  },
125
134
  gridFilterAccessLevel,
135
+ gridFilterHelpPage,
136
+ gridFilterLinkDisabled,
126
137
  };
127
138
  };
128
139
  exports.useGridFilterExpressionEditor = useGridFilterExpressionEditor;
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ import { Layout } from '../../../types';
3
+ export declare const getGridFilterViewItems: (layout: Layout) => {
4
+ name: string;
5
+ view: JSX.Element;
6
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getGridFilterViewItems = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const React = tslib_1.__importStar(require("react"));
6
+ const ExpressionPreview_1 = require("../../../components/ExpressionEditor/ExpressionPreview");
7
+ const Tag_1 = require("../../../components/Tag");
8
+ const getGridFilterViewItems = (layout) => {
9
+ var _a;
10
+ return {
11
+ name: 'Grid Filters',
12
+ view: (React.createElement(Tag_1.Tag, null,
13
+ React.createElement(ExpressionPreview_1.ExpressionPreview, { query: { BooleanExpression: (_a = layout.GridFilter) === null || _a === void 0 ? void 0 : _a.Expression } }))),
14
+ };
15
+ };
16
+ exports.getGridFilterViewItems = getGridFilterViewItems;