@adaptabletools/adaptable 20.1.8 → 20.2.0-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 (63) hide show
  1. package/base.css +27 -0
  2. package/base.css.map +1 -1
  3. package/index.css +22 -0
  4. package/index.css.map +1 -1
  5. package/package.json +2 -2
  6. package/src/AdaptableInterfaces/IAdaptable.d.ts +1 -0
  7. package/src/AdaptableOptions/DefaultAdaptableOptions.js +2 -1
  8. package/src/AdaptableOptions/ExportOptions.d.ts +91 -8
  9. package/src/AdaptableOptions/QuickSearchOptions.d.ts +1 -6
  10. package/src/AdaptableState/FormatColumnState.d.ts +8 -0
  11. package/src/AdaptableState/LayoutState.d.ts +15 -2
  12. package/src/AdaptableState/QuickSearchState.d.ts +8 -0
  13. package/src/Api/ColumnApi.d.ts +5 -0
  14. package/src/Api/ExportApi.d.ts +23 -7
  15. package/src/Api/Implementation/ColumnApiImpl.d.ts +2 -2
  16. package/src/Api/Implementation/ColumnApiImpl.js +15 -30
  17. package/src/Api/Implementation/ExportApiImpl.d.ts +11 -4
  18. package/src/Api/Implementation/ExportApiImpl.js +51 -9
  19. package/src/Api/Implementation/LayoutHelpers.js +44 -0
  20. package/src/Api/Implementation/QuickSearchApiImpl.d.ts +4 -0
  21. package/src/Api/Implementation/QuickSearchApiImpl.js +12 -0
  22. package/src/Api/Internal/AlertInternalApi.js +1 -1
  23. package/src/Api/Internal/ExportInternalApi.d.ts +3 -8
  24. package/src/Api/Internal/ExportInternalApi.js +1 -74
  25. package/src/Api/Internal/ExpressionInternalApi.d.ts +1 -1
  26. package/src/Api/Internal/ExpressionInternalApi.js +1 -32
  27. package/src/Api/Internal/FormatColumnInternalApi.d.ts +2 -1
  28. package/src/Api/Internal/FormatColumnInternalApi.js +62 -0
  29. package/src/Api/QuickSearchApi.d.ts +16 -0
  30. package/src/Redux/Store/AdaptableStore.js +3 -2
  31. package/src/Utilities/Constants/GeneralConstants.js +2 -1
  32. package/src/View/Components/Forms/AdaptableFormControlTextClear.d.ts +1 -0
  33. package/src/View/Components/Forms/AdaptableFormControlTextClear.js +1 -0
  34. package/src/View/Dashboard/Dashboard.js +2 -4
  35. package/src/View/Layout/Wizard/sections/AggregationsSection.js +2 -2
  36. package/src/View/Layout/Wizard/sections/PivotAggregationsSection.js +2 -2
  37. package/src/View/Layout/Wizard/sections/PivotRowGroupingSection.js +6 -1
  38. package/src/View/Layout/Wizard/sections/RowGroupingSection.d.ts +4 -0
  39. package/src/View/Layout/Wizard/sections/RowGroupingSection.js +22 -19
  40. package/src/View/QuickSearch/QuickSearchInput.js +6 -1
  41. package/src/View/QuickSearch/QuickSearchPopup.js +2 -3
  42. package/src/agGrid/AdaptableAgGrid.d.ts +2 -0
  43. package/src/agGrid/AdaptableAgGrid.js +121 -38
  44. package/src/agGrid/AgGridAdapter.d.ts +4 -1
  45. package/src/agGrid/AgGridAdapter.js +90 -13
  46. package/src/agGrid/AgGridColumnAdapter.d.ts +4 -0
  47. package/src/agGrid/AgGridColumnAdapter.js +142 -35
  48. package/src/agGrid/AgGridExportAdapter.d.ts +6 -1
  49. package/src/agGrid/AgGridExportAdapter.js +103 -14
  50. package/src/agGrid/FloatingFilterWrapper.js +30 -4
  51. package/src/env.js +2 -2
  52. package/src/layout-manager/src/LayoutManagerModel.d.ts +16 -2
  53. package/src/layout-manager/src/index.d.ts +1 -1
  54. package/src/layout-manager/src/index.js +135 -20
  55. package/src/layout-manager/src/normalizeLayoutModel.d.ts +2 -4
  56. package/src/layout-manager/src/normalizeLayoutModel.js +12 -16
  57. package/src/layout-manager/src/simplifyLayoutModel.js +15 -3
  58. package/src/metamodel/adaptable.metamodel.d.ts +71 -0
  59. package/src/metamodel/adaptable.metamodel.js +1 -1
  60. package/src/types.d.ts +1 -1
  61. package/tsconfig.esm.tsbuildinfo +1 -1
  62. package/src/Utilities/buildSortedColumnStateForLayout.d.ts +0 -7
  63. package/src/Utilities/buildSortedColumnStateForLayout.js +0 -131
@@ -1,6 +1,6 @@
1
+ import { IRowNode } from 'ag-grid-enterprise';
1
2
  import { AdaptableColumn, AdaptableFormat, AdaptablePredicateDef, ColumnScope, FormatColumn, StringFormatterOptions } from '../../types';
2
3
  import { ApiBase } from '../Implementation/ApiBase';
3
- import { IRowNode } from 'ag-grid-enterprise';
4
4
  export declare class FormatColumnInternalApi extends ApiBase {
5
5
  /**
6
6
  * Retrieves all Format Columns in Adaptable State with the `Style` property set
@@ -77,6 +77,7 @@ export declare class FormatColumnInternalApi extends ApiBase {
77
77
  * @param scope Scope to check
78
78
  */
79
79
  getFormatColumnDefsForScope(scope: ColumnScope): AdaptablePredicateDef[];
80
+ formatColumnWithColumnGroupStateShouldRender(formatColumn: FormatColumn, column: AdaptableColumn): boolean;
80
81
  /**
81
82
  * Checks if format column is relevant for a given cell (intersection of given AdaptableColumn and RowNode)
82
83
  *
@@ -4,6 +4,33 @@ import FormatHelper from '../../Utilities/Helpers/FormatHelper';
4
4
  import ObjectFactory from '../../Utilities/ObjectFactory';
5
5
  import * as ModuleConstants from '../../Utilities/Constants/ModuleConstants';
6
6
  import { errorOnce } from '../../agGrid/AdaptableLogger';
7
+ function getParentGroup(source) {
8
+ if (!source) {
9
+ return undefined;
10
+ }
11
+ let current = source;
12
+ while (current.getParent()) {
13
+ current = current.getParent();
14
+ if (!current) {
15
+ return undefined;
16
+ }
17
+ const currentProvidedColumnGroup = current.getProvidedColumnGroup();
18
+ // for columns that don't belong to groups or belong to a group that doesn't have full depth
19
+ // there are artificial parent groups created by ag-grid
20
+ // so for the current column group, lets grab the leaf columns
21
+ // and if the only leaf column is the source column, then we can continue
22
+ // and do another iteration where we go up one level
23
+ if (currentProvidedColumnGroup) {
24
+ const leafColumns = current.getLeafColumns();
25
+ if (leafColumns.length === 1 && leafColumns[0] === source) {
26
+ continue;
27
+ }
28
+ // otherwise, we have found the parent group corresponding to the source column
29
+ return currentProvidedColumnGroup;
30
+ }
31
+ }
32
+ return undefined;
33
+ }
7
34
  export class FormatColumnInternalApi extends ApiBase {
8
35
  /**
9
36
  * Retrieves all Format Columns in Adaptable State with the `Style` property set
@@ -145,6 +172,37 @@ export class FormatColumnInternalApi extends ApiBase {
145
172
  .predicateApi.internalApi.getFormatColumnPredicateDefs(scope)
146
173
  .filter((predicateDef) => this.getColumnScopeApi().isScopeInScope(scope, predicateDef.columnScope));
147
174
  }
175
+ formatColumnWithColumnGroupStateShouldRender(formatColumn, column) {
176
+ if (!formatColumn.ColumnGroupState) {
177
+ return true;
178
+ }
179
+ const agGridApi = this.getAdaptableApi().agGridApi;
180
+ const agGridColumn = agGridApi.isPivotMode()
181
+ ? agGridApi.getPivotResultColumns().find((col) => col.getColId() === column.columnId)
182
+ : agGridApi.getColumn(column.columnId);
183
+ if (!agGridColumn) {
184
+ return false;
185
+ }
186
+ const columnGroupParentForCurrentColumn = getParentGroup(agGridColumn);
187
+ if (!columnGroupParentForCurrentColumn) {
188
+ return false;
189
+ }
190
+ const columnGroupState = columnGroupParentForCurrentColumn.isExpanded()
191
+ ? 'Expanded'
192
+ : 'Collapsed';
193
+ const columnGroupLeafColumns = columnGroupParentForCurrentColumn.getLeafColumns();
194
+ const columnIsTopLevel = columnGroupParentForCurrentColumn.getLevel() === 0 &&
195
+ columnGroupLeafColumns.length === 1 &&
196
+ columnGroupLeafColumns[0] === agGridColumn;
197
+ if (columnIsTopLevel) {
198
+ // for top-level columns don't apply formatColumns that have an explicit ColumnGroupState defined
199
+ return false;
200
+ }
201
+ if (formatColumn.ColumnGroupState === 'Both') {
202
+ return true;
203
+ }
204
+ return formatColumn.ColumnGroupState === columnGroupState;
205
+ }
148
206
  /**
149
207
  * Checks if format column is relevant for a given cell (intersection of given AdaptableColumn and RowNode)
150
208
  *
@@ -175,6 +233,10 @@ export class FormatColumnInternalApi extends ApiBase {
175
233
  return false;
176
234
  }
177
235
  }
236
+ if (formatColumn.ColumnGroupState &&
237
+ !this.formatColumnWithColumnGroupStateShouldRender(formatColumn, column)) {
238
+ return false;
239
+ }
178
240
  if (!formatColumn.Rule) {
179
241
  return true;
180
242
  }
@@ -17,6 +17,14 @@ export interface QuickSearchApi {
17
17
  * Clears Quick Search
18
18
  */
19
19
  clearQuickSearch(): void;
20
+ /**
21
+ * Goes to the next match for the current Quick Search text
22
+ */
23
+ gotoNextMatch(): void;
24
+ /**
25
+ * Goes to the previous match for the current Quick Search text
26
+ */
27
+ gotoPreviousMatch(): void;
20
28
  /**
21
29
  * Retrieves current Quick Search text
22
30
  */
@@ -25,6 +33,14 @@ export interface QuickSearchApi {
25
33
  * Retrieves current Quick Search style
26
34
  */
27
35
  getQuickSearchStyle(): AdaptableStyle;
36
+ /**
37
+ * Retrieves the style for the text match in the Quick Search
38
+ */
39
+ getQuickSearchTextMatchStyle(): Omit<AdaptableStyle, 'ClassName'> | undefined;
40
+ /**
41
+ * Retrieves the style for the current text match in the Quick Search
42
+ */
43
+ getQuickSearchCurrentTextMatchStyle(): Omit<AdaptableStyle, 'ClassName'> | undefined;
28
44
  /**
29
45
  * Sets style for Quick Search; can be name of (a provided) css style
30
46
  * @param style the style to use
@@ -499,10 +499,11 @@ const adaptableMiddleware = (adaptable) => (function(middlewareAPI) {
499
499
  case QuickSearchRedux.QUICK_SEARCH_RUN: {
500
500
  let returnAction = next(action);
501
501
  adaptable.api.gridApi.refreshAllCells(true);
502
+ const actionTyped = action;
503
+ const searchText = actionTyped.quickSearchText;
504
+ adaptable.setAgGridFindSearchValue(searchText);
502
505
  // if set then return a query on the text
503
506
  if (adaptable.adaptableOptions.quickSearchOptions.filterGridAfterQuickSearch) {
504
- const actionTyped = action;
505
- const searchText = actionTyped.quickSearchText;
506
507
  if (StringExtensions.IsNotNullOrEmpty(searchText)) {
507
508
  adaptable.setAgGridQuickSearch(searchText);
508
509
  }
@@ -1,3 +1,4 @@
1
+ import { AUTO_GROUP_COLUMN_ID__SINGLE } from '../../layout-manager/src/normalizeLayoutModel';
1
2
  export const AUTOGENERATED_PK_COLUMN = '__ADAPTABLE_PK__';
2
3
  export const MISSING_COLUMN = ' [MISSING]';
3
4
  export const LIGHT_THEME = 'light';
@@ -20,7 +21,7 @@ export const EMPTY_ARRAY = [];
20
21
  export const HALF_SECOND = 500;
21
22
  export const QUARTER_SECOND = 250;
22
23
  export const GROUP_PATH_SEPARATOR = '/';
23
- export const AG_GRID_GROUPED_COLUMN = 'ag-Grid-AutoColumn';
24
+ export const AG_GRID_GROUPED_COLUMN = AUTO_GROUP_COLUMN_ID__SINGLE;
24
25
  export const AG_GRID_SELECTION_COLUMN = 'ag-Grid-SelectionColumn';
25
26
  export const AG_GRID_PIVOT_COLUMN = 'pivot_';
26
27
  export const AG_GRID_PIVOT_GRAND_TOTAL_COLUMN = 'PivotRowTotal_pivot_';
@@ -6,5 +6,6 @@ export type AdaptableFormControlTextClearProps = {
6
6
  focusOnClear?: boolean;
7
7
  autoFocus?: boolean;
8
8
  inputStyle?: CSSProperties;
9
+ actionTools?: React.ReactNode;
9
10
  } & InputProps;
10
11
  export declare const AdaptableFormControlTextClear: React.ForwardRefExoticComponent<Omit<AdaptableFormControlTextClearProps, "ref"> & React.RefAttributes<HTMLInputElement>>;
@@ -25,6 +25,7 @@ export const AdaptableFormControlTextClear = React.forwardRef((props, ref) => {
25
25
  ref.current = r;
26
26
  }
27
27
  }, type: "text", placeholder: props.placeholder, value: props.value, onChange: (x) => props.OnTextChange(x.target.value) }),
28
+ props.actionTools,
28
29
  React.createElement(SimpleButton, { variant: "text", icon: "close", tooltip: closeButtonTooltip, px: 0, py: 0, marginRight: 1, onClick: () => {
29
30
  props.OnTextChange('');
30
31
  const input = inputRef.current;
@@ -11,16 +11,14 @@ import { QuickSearchModuleId } from '../../Utilities/Constants/ModuleConstants';
11
11
  import { AdaptableViewPanelFactory } from '../AdaptableViewFactory';
12
12
  import { AdaptableButtonComponent } from '../Components/AdaptableButton';
13
13
  import { AdaptableIconComponent } from '../Components/AdaptableIconComponent';
14
- import { AdaptableFormControlTextClear } from '../Components/Forms/AdaptableFormControlTextClear';
15
- import { useQuickSearchDebounced } from '../QuickSearch/useQuickSearchDebounced';
16
14
  import UIHelper from '../UIHelper';
17
15
  import { CustomDashboardButton } from './CustomDashboardButton';
18
16
  import { CustomToolbarWrapper } from './CustomToolbar';
19
17
  import { DashboardToolbarFactory } from './DashboardToolbarFactory';
20
18
  import { PinnedDashboard } from './PinnedDashboard';
21
19
  import { ModuleToolbarWrapper } from './ModuleToolbarWrapper';
20
+ import { QuickSearchInput } from '../QuickSearch/QuickSearchInput';
22
21
  const DashboardComponent = (props) => {
23
- const [searchText, search] = useQuickSearchDebounced(props);
24
22
  const dashboardAccessLevel = props.api.entitlementApi.getEntitlementAccessLevelForModule('Dashboard');
25
23
  const renderTab = (tab) => {
26
24
  const visibleToolbarNames = tab.Toolbars.filter((vt) => vt);
@@ -89,7 +87,7 @@ const DashboardComponent = (props) => {
89
87
  };
90
88
  const renderQuickSearch = () => {
91
89
  return (React.createElement(Box, { ml: 2 },
92
- React.createElement(AdaptableFormControlTextClear, { type: "text", "aria-label": 'Quick Search', placeholder: props.api.optionsApi.getQuickSearchOptions().quickSearchPlaceholder, className: "ab-DashboardToolbar__QuickSearch__text", value: searchText, OnTextChange: search, style: { width: 'auto' }, inputStyle: { width: '7rem' } })));
90
+ React.createElement(QuickSearchInput, { width: '7rem' })));
93
91
  };
94
92
  let instanceName = props.api.internalApi.getToolbarTitle();
95
93
  let dashboardOptions = props.api.optionsApi.getDashboardOptions();
@@ -195,9 +195,9 @@ export const AggregationsSection = (props) => {
195
195
  React.createElement(FormRow, { label: 'Omit Aggregation from Header' },
196
196
  React.createElement(CheckBox, { checked: layout.SuppressAggFuncInHeader, onChange: handleSuppressAggFuncInHeader })),
197
197
  React.createElement(FormRow, { label: 'Grand Total Row' },
198
- React.createElement(Select, { style: { width: 120 }, options: ['top', 'bottom'].map((position) => {
198
+ React.createElement(Select, { style: { width: 160 }, options: ['top', 'bottom', 'pinnedTop', 'pinnedBottom'].map((position) => {
199
199
  return {
200
- label: StringExtensions.CapitaliseFirstLetter(position),
200
+ label: StringExtensions.CamelCaseToHumanText(position),
201
201
  value: position,
202
202
  };
203
203
  }), placeholder: "Off", value: layout.GrandTotalRow, onChange: (value) => {
@@ -322,9 +322,9 @@ export const PivotAggregationsSection = (props) => {
322
322
  React.createElement(FormRow, { label: 'Omit Aggregation from Header' },
323
323
  React.createElement(CheckBox, { checked: layout.SuppressAggFuncInHeader, onChange: handleSuppressAggFuncInHeader })),
324
324
  React.createElement(FormRow, { label: 'Grand Total Row' },
325
- React.createElement(Select, { style: { width: 120 }, options: ['top', 'bottom'].map((position) => {
325
+ React.createElement(Select, { style: { width: 160 }, options: ['top', 'bottom', 'pinnedTop', 'pinnedBottom'].map((position) => {
326
326
  return {
327
- label: StringExtensions.CapitaliseFirstLetter(position),
327
+ label: StringExtensions.CamelCaseToHumanText(position),
328
328
  value: position,
329
329
  };
330
330
  }), placeholder: "Off", value: layout.GrandTotalRow, onChange: (value) => {
@@ -8,6 +8,7 @@ import { ValueSelector } from '../../../Components/ValueSelector';
8
8
  import { useOnePageAdaptableWizardContext } from '../../../Wizard/OnePageAdaptableWizard';
9
9
  import ArrayExtensions from '../../../../Utilities/Extensions/ArrayExtensions';
10
10
  import { normalizeLayout } from '../../../../Api/Implementation/LayoutHelpers';
11
+ import { RowGroupBehaviorSection } from './RowGroupingSection';
11
12
  export const PivotRowGroupingSectionSummary = () => {
12
13
  const adaptable = useAdaptable();
13
14
  const { data: layout } = useOnePageAdaptableWizardContext();
@@ -32,10 +33,14 @@ export const PivotRowGroupingSection = (props) => {
32
33
  PivotGroupedColumns: columnIds,
33
34
  });
34
35
  };
36
+ const rowGroupsText = 'Row Group ' + adaptable.api.internalApi.getCorrectEnglishVariant('Behaviour');
35
37
  return (React.createElement(Tabs, { style: { height: '100%' } },
36
38
  React.createElement(Tabs.Tab, null, "Row Grouped Columns"),
39
+ React.createElement(Tabs.Tab, null, rowGroupsText),
37
40
  React.createElement(Tabs.Content, null,
38
41
  React.createElement(ValueSelector, { showFilterInput: true, showSelectedOnlyPosition: "top", filter: columnFilter, toIdentifier: (option) => `${option.columnId}`, toLabel: (option) => option.friendlyName ?? option.columnId, options: sortedGroupableColumns, value: layout.PivotGroupedColumns ?? [], allowReorder: true, xSelectedLabel: () => {
39
42
  return `Selected Columns:`;
40
- }, onChange: handleColumnsChange }))));
43
+ }, onChange: handleColumnsChange })),
44
+ React.createElement(Tabs.Content, null,
45
+ React.createElement(RowGroupBehaviorSection, { layout: layout, onChange: onChange }))));
41
46
  };
@@ -4,5 +4,9 @@ export declare const RowGroupingSectionSummary: React.FunctionComponent;
4
4
  interface RowGroupingSectionProps {
5
5
  onChange: (data: Layout) => void;
6
6
  }
7
+ export declare const RowGroupBehaviorSection: (props: {
8
+ layout: Layout;
9
+ onChange: (data: Layout) => void;
10
+ }) => React.JSX.Element;
7
11
  export declare const RowGroupingSection: React.FunctionComponent<RowGroupingSectionProps>;
8
12
  export {};
@@ -23,6 +23,27 @@ export const RowGroupingSectionSummary = () => {
23
23
  React.createElement(Tag, { key: columnId }, adaptable.api.columnApi.getFriendlyNameForColumnId(columnId))));
24
24
  })) : (React.createElement(Tag, null, "No Row Grouping"))));
25
25
  };
26
+ export const RowGroupBehaviorSection = (props) => {
27
+ const { layout, onChange } = props;
28
+ return (React.createElement(FormLayout, null,
29
+ React.createElement(RadioGroup, { orientation: "vertical", value: layout.RowGroupValues?.RowGroupDefaultBehavior ?? 'always-collapsed', onRadioChange: (RowGroupDefaultBehavior) => {
30
+ const newLayout = {
31
+ ...layout,
32
+ RowGroupValues: {
33
+ RowGroupDefaultBehavior,
34
+ },
35
+ };
36
+ if (newLayout.RowGroupValues.RowGroupDefaultBehavior === 'collapsed' ||
37
+ newLayout.RowGroupValues.RowGroupDefaultBehavior === 'expanded') {
38
+ newLayout.RowGroupValues.ExceptionGroupKeys = [];
39
+ }
40
+ onChange(newLayout);
41
+ } },
42
+ React.createElement(TypeRadio, { value: "always-collapsed", text: "All Collapsed", description: "Always open Layout with all Grouped Rows collapsed" }),
43
+ React.createElement(TypeRadio, { value: "always-expanded", text: "All Expanded", description: "Always open Layout with all Grouped Rows expanded" }),
44
+ React.createElement(TypeRadio, { value: "expanded", text: "Mostly Expanded", description: "Layout opens with all Grouped rows expanded, other than those collapsed when Layout last displayed" }),
45
+ React.createElement(TypeRadio, { value: "collapsed", text: "Mostly Collapsed", description: "Layout opens with all Grouped rows collapsed, other than those expanded when Layout last displayed" }))));
46
+ };
26
47
  export const RowGroupingSection = (props) => {
27
48
  const adaptable = useAdaptable();
28
49
  if (adaptable.api.gridApi.isTreeDataGrid()) {
@@ -78,23 +99,5 @@ export const RowGroupingSection = (props) => {
78
99
  return `Selected Columns:`;
79
100
  }, onChange: handleColumnsChange })),
80
101
  React.createElement(Tabs.Content, null,
81
- React.createElement(FormLayout, null,
82
- React.createElement(RadioGroup, { orientation: "vertical", value: layout.RowGroupValues?.RowGroupDefaultBehavior ?? 'always-collapsed', onRadioChange: (RowGroupDefaultBehavior) => {
83
- let newLayout = {
84
- ...layout,
85
- RowGroupValues: {
86
- RowGroupDefaultBehavior,
87
- },
88
- };
89
- if (newLayout.RowGroupValues.RowGroupDefaultBehavior === 'collapsed' ||
90
- newLayout.RowGroupValues.RowGroupDefaultBehavior === 'expanded') {
91
- newLayout.RowGroupValues.ExceptionGroupKeys =
92
- [];
93
- }
94
- onChange(newLayout);
95
- } },
96
- React.createElement(TypeRadio, { value: "always-collapsed", text: "All Collapsed", description: "Always open Layout with all Grouped Rows collapsed" }),
97
- React.createElement(TypeRadio, { value: "always-expanded", text: "All Expanded", description: "Always open Layout with all Grouped Rows expanded" }),
98
- React.createElement(TypeRadio, { value: "expanded", text: "Mostly Expanded", description: "Layout opens with all Grouped rows expanded, other than those collapsed when Layout last displayed" }),
99
- React.createElement(TypeRadio, { value: "collapsed", text: "Mostly Collapsed", description: "Layout opens with all Grouped rows collapsed, other than those expanded when Layout last displayed" })))))));
102
+ React.createElement(RowGroupBehaviorSection, { layout: layout, onChange: onChange })))));
100
103
  };
@@ -4,6 +4,9 @@ import * as QuickSearchRedux from '../../Redux/ActionsReducers/QuickSearchRedux'
4
4
  import { AdaptableFormControlTextClear } from '../Components/Forms/AdaptableFormControlTextClear';
5
5
  import { useQuickSearchDebounced } from './useQuickSearchDebounced';
6
6
  import { useAdaptable } from '../AdaptableContext';
7
+ import SimpleButton from '../../components/SimpleButton';
8
+ import join from '../../components/utils/join';
9
+ import { Box } from 'rebass';
7
10
  export const QuickSearchInput = (props) => {
8
11
  const adaptable = useAdaptable();
9
12
  const QuickSearchText = useSelector((state) => state.QuickSearch.QuickSearchText);
@@ -13,5 +16,7 @@ export const QuickSearchInput = (props) => {
13
16
  QuickSearchText,
14
17
  onRunQuickSearch,
15
18
  });
16
- return (React.createElement(AdaptableFormControlTextClear, { type: "text", autoFocus: props.autoFocus, placeholder: adaptable.api.optionsApi.getQuickSearchOptions().quickSearchPlaceholder, className: props.className, value: searchText, OnTextChange: search, style: { height: '100%' }, inputStyle: { width: props.width ?? '10rem' } }));
19
+ return (React.createElement(AdaptableFormControlTextClear, { "aria-label": 'Quick Search', type: "text", autoFocus: props.autoFocus, placeholder: adaptable.api.optionsApi.getQuickSearchOptions().quickSearchPlaceholder, className: join('ab-DashboardToolbar__QuickSearch__text', props.className), value: searchText, OnTextChange: search, style: { height: '100%' }, inputStyle: { width: props.width ?? '10rem' }, actionTools: React.createElement(Box, { display: "flex", flexDirection: "row", alignItems: "center", flex: 'none' },
20
+ React.createElement(SimpleButton, { "aria-label": 'Previous Match', icon: "arrow-up", px: 0, py: 0, mr: 1, disabled: !searchText, variant: "text", onClick: () => adaptable.api.quickSearchApi.gotoPreviousMatch() }),
21
+ React.createElement(SimpleButton, { "aria-label": 'Next Match', icon: "arrow-down", px: 0, py: 0, mr: 1, disabled: !searchText, variant: "text", onClick: () => adaptable.api.quickSearchApi.gotoNextMatch() })) }));
17
22
  };
@@ -5,12 +5,12 @@ import * as QuickSearchRedux from '../../Redux/ActionsReducers/QuickSearchRedux'
5
5
  import { PopupPanel } from '../Components/Popups/AdaptablePopup/PopupPanel';
6
6
  import Panel from '../../components/Panel';
7
7
  import FormLayout, { FormRow } from '../../components/FormLayout';
8
- import { AdaptableFormControlTextClear } from '../Components/Forms/AdaptableFormControlTextClear';
9
8
  import { StyleComponent } from '../Components/StyleComponent';
10
9
  import { Flex } from 'rebass';
11
10
  import { CheckBox } from '../../components/CheckBox';
12
11
  import StringExtensions from '../../Utilities/Extensions/StringExtensions';
13
12
  import { useQuickSearchDebounced } from './useQuickSearchDebounced';
13
+ import { QuickSearchInput } from './QuickSearchInput';
14
14
  const QuickSearchPopupComponent = (props) => {
15
15
  const [searchText, search] = useQuickSearchDebounced(props);
16
16
  const [state, setState] = useState({
@@ -28,9 +28,8 @@ const QuickSearchPopupComponent = (props) => {
28
28
  };
29
29
  return (React.createElement(PopupPanel, { headerText: props.moduleInfo.FriendlyName, glyphicon: props.moduleInfo.Glyph, infoLink: props.moduleInfo.HelpPage, infoLinkDisabled: !props.api.internalApi.isDocumentationLinksDisplayed() },
30
30
  React.createElement(Panel, { header: props.moduleInfo.FriendlyName + ' Text', style: { height: 'auto' }, variant: "default", borderRadius: "none", marginTop: 3, marginLeft: 2, marginRight: 2 },
31
- ' ',
32
31
  React.createElement(FormLayout, null,
33
- React.createElement(AdaptableFormControlTextClear, { "data-name": "quick-search-text", type: "text", marginLeft: 2, marginRight: 5, padding: 20, style: { height: '100%' }, placeholder: props.api.optionsApi.getQuickSearchOptions().quickSearchPlaceholder, value: searchText, OnTextChange: search }))),
32
+ React.createElement(QuickSearchInput, null))),
34
33
  React.createElement(Panel, { header: props.api.internalApi.getCorrectEnglishVariant('Behaviour'), style: { height: 'auto' }, variant: "default", borderRadius: "none", marginTop: 3, marginLeft: 2, marginRight: 2 },
35
34
  ' ',
36
35
  React.createElement(Flex, { flexDirection: "column" },
@@ -106,6 +106,7 @@ export declare class AdaptableAgGrid implements IAdaptable {
106
106
  private listenerPivotChanged;
107
107
  private listenerCellSelectionChanged;
108
108
  private listenerSortChanged;
109
+ private listenerColumnGroupOpened;
109
110
  private layoutManager;
110
111
  private columnMinMaxValuesCache;
111
112
  renderReactRoot: RenderReactRootFn;
@@ -303,6 +304,7 @@ export declare class AdaptableAgGrid implements IAdaptable {
303
304
  isGridGroupingActive(): boolean;
304
305
  setAgGridQuickSearch(searchText: string): void;
305
306
  clearAgGridQuickSearch(): void;
307
+ setAgGridFindSearchValue(searchText: string): void;
306
308
  applyAdaptableTheme(theme: AdaptableTheme | string): void;
307
309
  setRowGroupColumns(columnIds: string[]): void;
308
310
  getAllGridColumns(): Column<any>[];