@adaptabletools/adaptable 20.1.2 → 20.1.4

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 (62) hide show
  1. package/base.css +1 -0
  2. package/base.css.map +1 -1
  3. package/index.css +1 -0
  4. package/index.css.map +1 -1
  5. package/package.json +1 -1
  6. package/src/AdaptableState/Common/{AdaptableSearchState.d.ts → AdaptableFilterState.d.ts} +7 -7
  7. package/src/AdaptableState/Common/AdaptableSortState.d.ts +1 -1
  8. package/src/Api/Implementation/StateApiImpl.d.ts +2 -2
  9. package/src/Api/Implementation/StateApiImpl.js +5 -5
  10. package/src/Api/Internal/EventInternalApi.js +1 -1
  11. package/src/Api/Internal/ExportInternalApi.js +1 -1
  12. package/src/Api/StateApi.d.ts +3 -3
  13. package/src/Redux/Store/AdaptableStore.js +7 -6
  14. package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/ColumnsList.js +2 -2
  15. package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/EntitlementsForm.js +2 -2
  16. package/src/View/CellSummary/CellSummaryDetails.js +2 -2
  17. package/src/View/CellSummary/CellSummaryViewPanel.js +2 -2
  18. package/src/View/ColumnInfo/ColumnInfo.js +2 -2
  19. package/src/View/Comments/CommentsPopup.js +2 -2
  20. package/src/View/Components/ColumnFilter/components/FloatingFilterValues.js +7 -1
  21. package/src/View/Components/Forms/AdaptableFormControlTextClear.js +1 -1
  22. package/src/View/Components/PreviewResultsPanel.js +2 -2
  23. package/src/View/Components/Selectors/BulkUpdateValueSelector.js +2 -2
  24. package/src/View/Components/Selectors/PermittedValuesSelector.js +1 -1
  25. package/src/View/Components/WizardSummaryPage.js +2 -2
  26. package/src/View/Dashboard/CustomDashboardButton.js +1 -1
  27. package/src/View/Dashboard/Dashboard.js +2 -2
  28. package/src/View/Dashboard/DashboardToolbarFactory.js +1 -1
  29. package/src/View/DataChangeHistory/DataChangeHistoryViewPanel.js +8 -9
  30. package/src/View/DataImport/DataImportWizard/sections/ColumnsSection.js +2 -2
  31. package/src/View/DataImport/DataImportWizard/sections/DataPreview.js +2 -2
  32. package/src/View/DataSet/DataSetViewPanel.js +1 -1
  33. package/src/View/Export/ReportFormatSelector.js +1 -1
  34. package/src/View/Export/ReportNameSelector.js +1 -1
  35. package/src/View/Filter/FilterViewPanel.js +2 -2
  36. package/src/View/GridFilter/GridFilterViewPanel.js +1 -1
  37. package/src/View/Layout/LayoutViewPanel.js +1 -1
  38. package/src/View/Layout/PivotDetailsPopoup.js +2 -2
  39. package/src/View/Layout/Wizard/sections/ColumnsSection.js +2 -2
  40. package/src/View/Note/NotePopup.js +2 -2
  41. package/src/View/SmartEdit/SmartEditViewPanel.js +1 -1
  42. package/src/View/StateManagement/components/LoadButton.js +1 -1
  43. package/src/View/Theme/ThemeSelector.js +1 -1
  44. package/src/agGrid/AdaptableAgGrid.d.ts +10 -0
  45. package/src/agGrid/AdaptableAgGrid.js +66 -28
  46. package/src/agGrid/AgGridExportAdapter.js +1 -1
  47. package/src/components/Dashboard/DashboardToolbar.js +2 -2
  48. package/src/components/Datepicker/index.js +50 -5
  49. package/src/components/Icon/index.js +1 -1
  50. package/src/components/InfiniteTable/index.d.ts +2 -2
  51. package/src/components/InfiniteTable/index.js +2 -2
  52. package/src/components/List/GridList/index.js +2 -2
  53. package/src/components/Select/Select.d.ts +2 -0
  54. package/src/components/Select/Select.js +1 -1
  55. package/src/components/SimpleButton/index.js +5 -1
  56. package/src/env.js +2 -2
  57. package/src/layout-manager/src/index.js +32 -3
  58. package/src/metamodel/adaptable.metamodel.d.ts +10 -10
  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/AdaptableState/Common/{AdaptableSearchState.js → AdaptableFilterState.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { AdaptablePopover } from '../AdaptablePopover';
3
- import { DataSource, InfiniteTable } from '../../components/InfiniteTable';
3
+ import { DataSource, InfiniteTableGrid } from '../../components/InfiniteTable';
4
4
  import CheckIcon from '../../components/icons/check';
5
5
  import UIHelper from '../UIHelper';
6
6
  import Panel from '../../components/Panel';
@@ -58,7 +58,7 @@ export class PreviewResultsPanel extends React.Component {
58
58
  },
59
59
  } },
60
60
  React.createElement(DataSource, { data: dataSource, primaryKey: "Id" },
61
- React.createElement(InfiniteTable, { sortable: false, domProps: tableDOMProps, columns: columnsMap })))) : null;
61
+ React.createElement(InfiniteTableGrid, { sortable: false, domProps: tableDOMProps, columns: columnsMap })))) : null;
62
62
  }
63
63
  getValidationErrorMessage(alertDefinitions) {
64
64
  let validationService = this.props.api.internalApi.getValidationService();
@@ -33,7 +33,7 @@ export const BulkUpdateValueSelector = (props) => {
33
33
  ]), onChange: (value) => {
34
34
  props.onColumnValueChange(value || null);
35
35
  } })));
36
- const input = (React.createElement(AdaptableInput, { "data-name": "bulkupdate-value-input", type: props.selectedColumn
36
+ const input = (React.createElement(AdaptableInput, { "data-name": "bulkupdate-value-input", "aria-label": "Bulk Update Value Input", type: props.selectedColumn
37
37
  ? UIHelper.getDescriptionForDataType(props.selectedColumn.dataType)
38
38
  : 'text', placeholder: props.selectedColumn
39
39
  ? UIHelper.getPlaceholderForDataType(props.selectedColumn.dataType)
@@ -42,7 +42,7 @@ export const BulkUpdateValueSelector = (props) => {
42
42
  } }));
43
43
  let valueTypeSelector = null;
44
44
  if (isDateType) {
45
- valueTypeSelector = (React.createElement(Select, { options: [
45
+ valueTypeSelector = (React.createElement(Select, { "aria-label": "Bulk Update Value Selector", options: [
46
46
  { label: 'New', value: 'new' },
47
47
  { label: 'Existing', value: 'existing' },
48
48
  ], value: valueType, onChange: (value) => {
@@ -97,5 +97,5 @@ export const PermittedValuesSelector = function (props) {
97
97
  reload();
98
98
  }
99
99
  };
100
- return (React.createElement(Select, { menuPortalTarget: props.menuPortalTarget, size: props.size, isMulti: props.isMulti, className: props.className, disabled: props.disabled, closeMenuOnSelect: !props.isMulti, "data-name": "permitted-values-selector", placeholder: props.placeholder || (props.allowNewValues ? 'Select or type new value' : 'Select value'), isCreatable: isCreatable, isClearable: true, onMenuOpen: reload, options: options, isLoading: isLoading, onInputChange: onInputChange, onChange: handleOnChange, onFocus: props.onFocus, onBlur: props.onBlur, value: props.value }));
100
+ return (React.createElement(Select, { "aria-label": "Permitted Values Selector", menuPortalTarget: props.menuPortalTarget, size: props.size, isMulti: props.isMulti, className: props.className, disabled: props.disabled, closeMenuOnSelect: !props.isMulti, "data-name": "permitted-values-selector", placeholder: props.placeholder || (props.allowNewValues ? 'Select or type new value' : 'Select value'), isCreatable: isCreatable, isClearable: true, onMenuOpen: reload, options: options, isLoading: isLoading, onInputChange: onInputChange, onChange: handleOnChange, onFocus: props.onFocus, onBlur: props.onBlur, value: props.value }));
101
101
  };
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import WizardPanel from '../../components/WizardPanel';
3
- import { DataSource, InfiniteTable } from '../../components/InfiniteTable';
3
+ import { DataSource, InfiniteTableGrid } from '../../components/InfiniteTable';
4
4
  const columnsMap = {
5
5
  Key: { field: 'Key', header: 'Property', defaultFlex: 1 },
6
6
  Value: { field: 'Value', header: 'Value', defaultFlex: 3 },
@@ -15,5 +15,5 @@ const tableDOMProps = {
15
15
  export const WizardSummaryPage = (props) => {
16
16
  return (React.createElement(WizardPanel, { bodyProps: { padding: 0 }, className: "ab-WizardSummary", "data-name": 'wizard-summary' },
17
17
  React.createElement(DataSource, { data: props.KeyValuePairs, primaryKey: "Key" },
18
- React.createElement(InfiniteTable, { showZebraRows: true, domProps: tableDOMProps, columns: columnsMap }))));
18
+ React.createElement(InfiniteTableGrid, { showZebraRows: true, domProps: tableDOMProps, columns: columnsMap }))));
19
19
  };
@@ -19,7 +19,7 @@ export const CustomDashboardButton = (props) => {
19
19
  return null;
20
20
  }
21
21
  const disabled = button.disabled && button.disabled(button, dashboardContext);
22
- return (React.createElement(SimpleButton, { key: buttonLabel, variant: buttonStyle && buttonStyle.variant ? buttonStyle.variant : 'text', tone: buttonStyle && buttonStyle.tone ? buttonStyle.tone : 'none', className: `ab-DashboardToolbar__Home__${kebabCase(buttonLabel)} ${buttonStyle?.className || ''}`, tooltip: buttonTooltip, icon: buttonIcon, disabled: disabled || props.accessLevel == 'ReadOnly', onClick: () => {
22
+ return (React.createElement(SimpleButton, { key: buttonLabel, "aria-label": buttonLabel, variant: buttonStyle && buttonStyle.variant ? buttonStyle.variant : 'text', tone: buttonStyle && buttonStyle.tone ? buttonStyle.tone : 'none', className: `ab-DashboardToolbar__Home__${kebabCase(buttonLabel)} ${buttonStyle?.className || ''}`, tooltip: buttonTooltip, icon: buttonIcon, disabled: disabled || props.accessLevel == 'ReadOnly', onClick: () => {
23
23
  button.onClick?.(button, dashboardContext);
24
24
  setTimeout(() => {
25
25
  // mutate state to force a re-rendering
@@ -65,7 +65,7 @@ const DashboardComponent = (props) => {
65
65
  shortcuts = shortcutsArray.map((x, index) => {
66
66
  let menuItem = props.InternalState.Dashboard.DashboardModuleButtons.find((y) => y.isVisible && y.category == x);
67
67
  if (menuItem) {
68
- return (React.createElement(AdaptableButtonComponent, { "data-name": `dashboard-module-button-${menuItem.category ?? 'custom-' + index}`, key: menuItem.label, variant: menuItem.category === 'SystemStatus' ? 'outlined' : 'text', tone: menuItem.category === 'SystemStatus' ? 'neutral' : 'none', className: `ab-DashboardToolbar__Home__${kebabCase(menuItem.label)}`, icon: menuItem.icon, tooltip: menuItem.label, disabled: props.accessLevel == 'ReadOnly', onClick: () => props.dispatch(menuItem.reduxAction), accessLevel: 'Full', style: menuItem.category === 'SystemStatus'
68
+ return (React.createElement(AdaptableButtonComponent, { "data-name": `dashboard-module-button-${menuItem.category ?? 'custom-' + index}`, "aria-label": menuItem.label, key: menuItem.label, variant: menuItem.category === 'SystemStatus' ? 'outlined' : 'text', tone: menuItem.category === 'SystemStatus' ? 'neutral' : 'none', className: `ab-DashboardToolbar__Home__${kebabCase(menuItem.label)}`, icon: menuItem.icon, tooltip: menuItem.label, disabled: props.accessLevel == 'ReadOnly', onClick: () => props.dispatch(menuItem.reduxAction), accessLevel: 'Full', style: menuItem.category === 'SystemStatus'
69
69
  ? {
70
70
  ...UIHelper.getStyleForMessageType(props.api.systemStatusApi.getCurrentSystemStatusMessageInfo()?.statusType ??
71
71
  'Success'),
@@ -89,7 +89,7 @@ const DashboardComponent = (props) => {
89
89
  };
90
90
  const renderQuickSearch = () => {
91
91
  return (React.createElement(Box, { ml: 2 },
92
- React.createElement(AdaptableFormControlTextClear, { type: "text", placeholder: props.api.optionsApi.getQuickSearchOptions().quickSearchPlaceholder, className: "ab-DashboardToolbar__QuickSearch__text", value: searchText, OnTextChange: search, style: { width: 'auto' }, inputStyle: { width: '7rem' } })));
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' } })));
93
93
  };
94
94
  let instanceName = props.api.internalApi.getToolbarTitle();
95
95
  let dashboardOptions = props.api.optionsApi.getDashboardOptions();
@@ -12,7 +12,7 @@ const SystemDashboardToolbarFactory = (props) => {
12
12
  const accessLevel = adaptable.api.entitlementApi.getEntitlementAccessLevelForModule(props.toolbarName);
13
13
  const moduleToolbarView = AdaptableViewPanelFactory.get(props.toolbarName);
14
14
  if (!moduleToolbarView) {
15
- return React.createElement(React.Fragment, null, "adasdasdas");
15
+ return React.createElement(React.Fragment, null);
16
16
  }
17
17
  const moduleToolbarElement = React.createElement(moduleToolbarView, {
18
18
  viewType: 'Toolbar',
@@ -20,21 +20,20 @@ export const DataChangeHistoryViewPanelControl = (props) => {
20
20
  const handleOpenPopup = React.useCallback(() => {
21
21
  adaptable.api.settingsPanelApi.openSettingsPanel('DataChangeHistory');
22
22
  }, []);
23
- const { changeHistoryMode, activationTime, suspensionTime } = useSelector((state) => ({
24
- changeHistoryMode: state.Internal.DataChangeHistory.currentMode,
25
- activationTime: state.Internal.DataChangeHistory.enableTime,
26
- suspensionTime: state.Internal.DataChangeHistory.suspendTime,
27
- }));
23
+ const dataChangeHistoryState = useSelector((state) => state.Internal.DataChangeHistory);
24
+ const changeHistoryMode = dataChangeHistoryState.currentMode;
25
+ const activationTime = dataChangeHistoryState.enableTime;
26
+ const suspensionTime = dataChangeHistoryState.suspendTime;
28
27
  const enabled = changeHistoryMode === 'ACTIVE';
29
28
  const disabled = changeHistoryMode === 'INACTIVE';
30
29
  const suspended = changeHistoryMode === 'SUSPENDED';
31
30
  const gap = props.gap ?? 'var(--ab-space-1)';
32
31
  const buttonsPaddingY = props.buttonsPaddingY ?? 2;
33
32
  const buttonPanel = (React.createElement(Flex, { className: "ab-DataChangeHistoryPanel--button-panel", paddingY: buttonsPaddingY, style: { gap: gap } },
34
- disabled && (React.createElement(ButtonPlay, { className: "ab-DataChangeHistoryPanel--button-activate", "data-name": 'data-change-history--button-activate', tooltip: '', onClick: () => onChangeHistoryEnable() })),
35
- suspended && (React.createElement(ButtonPlay, { className: "ab-DataChangeHistoryPanel--button-resume", "data-name": 'data-change-history--button-resume', tooltip: 'Resume tracking data changes', onClick: () => onChangeHistoryResume() })),
36
- enabled && (React.createElement(ButtonPause, { className: "ab-DataChangeHistoryPanel--button-suspend", "data-name": 'data-change-history--button-suspend', tooltip: 'Suspend tracking data changes', onClick: () => onChangeHistorySuspend() })),
37
- (enabled || suspended) && (React.createElement(ButtonStop, { className: "ab-DataChangeHistoryPanel--button-deactivate", "data-name": 'data-change-history--button-deactivate', tooltip: 'Deactivate data change tracking', onClick: () => onChangeHistoryDisable() }))));
33
+ disabled && (React.createElement(ButtonPlay, { "aria-label": "Enable Data Change History", className: "ab-DataChangeHistoryPanel--button-activate", "data-name": 'data-change-history--button-activate', tooltip: '', onClick: () => onChangeHistoryEnable() })),
34
+ suspended && (React.createElement(ButtonPlay, { "aria-label": "Resume Data Change History", className: "ab-DataChangeHistoryPanel--button-resume", "data-name": 'data-change-history--button-resume', tooltip: 'Resume tracking data changes', onClick: () => onChangeHistoryResume() })),
35
+ enabled && (React.createElement(ButtonPause, { "aria-label": "Suspend Data Change History", className: "ab-DataChangeHistoryPanel--button-suspend", "data-name": 'data-change-history--button-suspend', tooltip: 'Suspend tracking data changes', onClick: () => onChangeHistorySuspend() })),
36
+ (enabled || suspended) && (React.createElement(ButtonStop, { "aria-label": "Deactivate Data Change History", className: "ab-DataChangeHistoryPanel--button-deactivate", "data-name": 'data-change-history--button-deactivate', tooltip: 'Deactivate data change tracking', onClick: () => onChangeHistoryDisable() }))));
38
37
  const dateFormat = `${adaptable.api.optionsApi.getUserInterfaceOptions().dateInputOptions.dateFormat} HH:mm:ss`;
39
38
  const statusPanel = (React.createElement(Flex, { className: "ab-DataChangeHistoryPanel--status-panel", alignItems: 'center', style: { gap: gap } },
40
39
  enabled && (React.createElement(Tooltip, { label: !!activationTime && `since ${DateFormatter(activationTime, { Pattern: dateFormat })}` },
@@ -4,7 +4,7 @@ import { CheckBox } from '../../../../components/CheckBox';
4
4
  import DropdownButton from '../../../../components/DropdownButton';
5
5
  import HelpBlock from '../../../../components/HelpBlock';
6
6
  import { Icon } from '../../../../components/icons';
7
- import { DataSource, InfiniteTable, } from '../../../../components/InfiniteTable';
7
+ import { DataSource, InfiniteTableGrid, } from '../../../../components/InfiniteTable';
8
8
  import { Tabs } from '../../../../components/Tabs';
9
9
  import { Tag } from '../../../../components/Tag';
10
10
  import { useAdaptable } from '../../../AdaptableContext';
@@ -114,7 +114,7 @@ export const ColumnsSection = (props) => {
114
114
  React.createElement(Tabs.Tab, null, "Columns"),
115
115
  React.createElement(Tabs.Content, null,
116
116
  React.createElement(DataSource, { data: props.columnsMap, primaryKey: 'field' },
117
- React.createElement(InfiniteTable, { columnPinning: {
117
+ React.createElement(InfiniteTableGrid, { columnPinning: {
118
118
  valid: 'end',
119
119
  type: 'end',
120
120
  }, columnTypes: {
@@ -2,7 +2,7 @@ import flatten from 'lodash/flatten';
2
2
  import * as React from 'react';
3
3
  import HelpBlock from '../../../../components/HelpBlock';
4
4
  import { Icon } from '../../../../components/icons';
5
- import { DataSource, InfiniteTable, } from '../../../../components/InfiniteTable';
5
+ import { DataSource, InfiniteTableGrid, } from '../../../../components/InfiniteTable';
6
6
  import { Tag } from '../../../../components/Tag';
7
7
  import { useAdaptable } from '../../../AdaptableContext';
8
8
  import { AdaptablePopover } from '../../../AdaptablePopover';
@@ -139,7 +139,7 @@ export const DataPreview = (props) => {
139
139
  });
140
140
  props.onDataChange(newRowData);
141
141
  } },
142
- React.createElement(InfiniteTable, { columnPinning: {
142
+ React.createElement(InfiniteTableGrid, { columnPinning: {
143
143
  valid: 'end',
144
144
  type: 'end',
145
145
  }, columnTypes: {
@@ -26,7 +26,7 @@ class DataSetViewPanelComponent extends React.Component {
26
26
  });
27
27
  const elementType = this.props.viewType === 'Toolbar' ? 'DashboardToolbar' : 'ToolPanel';
28
28
  return (React.createElement(Flex, { flexDirection: "row", className: `ab-${elementType}__DataSet__wrap` },
29
- React.createElement(Select, { style: { width: '100%' }, placeholder: 'Select Data Set', disabled: ArrayExtensions.IsNullOrEmpty(availableDataSets), options: availableDataSets, value: currentDataSetName, className: `ab-${elementType}__DataSet__select`, onChange: (destination) => this.onSelectedDataSetChanged(destination) })));
29
+ React.createElement(Select, { "aria-label": 'Select Data Set', style: { width: '100%' }, placeholder: 'Select Data Set', disabled: ArrayExtensions.IsNullOrEmpty(availableDataSets), options: availableDataSets, value: currentDataSetName, className: `ab-${elementType}__DataSet__select`, onChange: (destination) => this.onSelectedDataSetChanged(destination) })));
30
30
  }
31
31
  onSelectedDataSetChanged(dataSetName) {
32
32
  if (StringExtensions.IsNullOrEmpty(dataSetName)) {
@@ -16,5 +16,5 @@ export const ReportFormatSelector = (props) => {
16
16
  });
17
17
  const elementType = props.viewType === 'Toolbar' ? 'DashboardToolbar' : 'ToolPanel';
18
18
  return (React.createElement(Flex, { "data-name": "report-format-selector", flex: 1, minWidth: 140 },
19
- React.createElement(Select, { style: { width: '100%' }, size: size, placeholder: SELECT_REPORT_FORMAT_STRING, disabled: !allFormats.length || reportName == undefined, className: `ab-${elementType}__Export__format-select`, options: formatItems, onChange: (format) => onReportFormatSelected(format), value: reportFormat, isClearable: true })));
19
+ React.createElement(Select, { "aria-label": SELECT_REPORT_FORMAT_STRING, style: { width: '100%' }, size: size, placeholder: SELECT_REPORT_FORMAT_STRING, disabled: !allFormats.length || reportName == undefined, className: `ab-${elementType}__Export__format-select`, options: formatItems, onChange: (format) => onReportFormatSelected(format), value: reportFormat, isClearable: true })));
20
20
  };
@@ -16,5 +16,5 @@ export const ReportNameSelector = (props) => {
16
16
  });
17
17
  const elementType = props.viewType === 'Toolbar' ? 'DashboardToolbar' : 'ToolPanel';
18
18
  return (React.createElement(Flex, { "data-name": "report-name-selector", flex: 1, minWidth: 160 },
19
- React.createElement(Select, { style: { width: '100%' }, size: size, "data-name": "report-name-selector", placeholder: SELECT_REPORT_STRING, disabled: !allReportNames.length, className: `ab-${elementType}__Export__report-select`, options: reportItems, onChange: (report) => onReportNameSelected(report), value: reportName, isClearable: true })));
19
+ React.createElement(Select, { "aria-label": SELECT_REPORT_STRING, style: { width: '100%' }, size: size, "data-name": "report-name-selector", placeholder: SELECT_REPORT_STRING, disabled: !allReportNames.length, className: `ab-${elementType}__Export__report-select`, options: reportItems, onChange: (report) => onReportNameSelected(report), value: reportName, isClearable: true })));
20
20
  };
@@ -29,8 +29,8 @@ class FilterViewPanelComponent extends React.Component {
29
29
  return (React.createElement(Flex, { flexDirection: "row", className: `ab-${elementType}__Filter__wrap`, flexWrap: this.props.viewType === 'ToolPanel' ? 'wrap' : 'nowrap' },
30
30
  React.createElement(Flex, null,
31
31
  ArrayExtensions.IsNotNullOrEmpty(this.props.ColumnFilters) && (React.createElement(AdaptablePopover, { popupPadding: 0, className: `ab-${elementType}__Filter__info`, headerText: "", bodyText: [React.createElement(ActiveFiltersPanel, null)], useButton: true, showEvent: 'focus', hideEvent: "blur", popoverMinWidth: 400 })),
32
- React.createElement(ButtonClear, { className: `ab-${elementType}__Filter__clear`, marginLeft: 1, marginBottom: 0, marginRight: 1, onClick: () => this.onClearFilters(), tooltip: "Clear Filters", disabled: this.props.ColumnFilters.length == 0, showText: this.props.viewType === 'ToolPanel' }, this.props.viewType === 'ToolPanel' && 'Clear'),
33
- React.createElement(SimpleButton, { className: join(`ab-${elementType}__Filter__suspend-button`, isAtLeastOneFilterActive && `ab-${elementType}__Filter__suspend-all`, !isAtLeastOneFilterActive && `ab-${elementType}__Filter__un-suspend-all`), disabled: !isAtLeastOneFilter, onClick: handleSuspendUnsuspendAll, tone: isAtLeastOneFilterActive ? 'neutral' : 'success', variant: "text", icon: isAtLeastOneFilterActive ? 'pause' : 'play', accessLevel: this.props.accessLevel })),
32
+ React.createElement(ButtonClear, { "aria-label": 'Clear Filters', className: `ab-${elementType}__Filter__clear`, marginLeft: 1, marginBottom: 0, marginRight: 1, onClick: () => this.onClearFilters(), tooltip: "Clear Filters", disabled: this.props.ColumnFilters.length == 0, showText: this.props.viewType === 'ToolPanel' }, this.props.viewType === 'ToolPanel' && 'Clear'),
33
+ React.createElement(SimpleButton, { "aria-label": isAtLeastOneFilterActive ? 'Suspend All Filters' : 'Resume All Filters', className: join(`ab-${elementType}__Filter__suspend-button`, isAtLeastOneFilterActive && `ab-${elementType}__Filter__suspend-all`, !isAtLeastOneFilterActive && `ab-${elementType}__Filter__un-suspend-all`), disabled: !isAtLeastOneFilter, onClick: handleSuspendUnsuspendAll, tone: isAtLeastOneFilterActive ? 'neutral' : 'success', variant: "text", icon: isAtLeastOneFilterActive ? 'pause' : 'play', accessLevel: this.props.accessLevel })),
34
34
  React.createElement(Flex, { alignItems: "center" }, this.props.api.filterApi.columnFilterApi.isQuickFilterAvailable() && (React.createElement(CheckBox, { className: `ab-${elementType}__Filter__active-check`, disabled: this.props.accessLevel === 'ReadOnly' ||
35
35
  this.props.api.layoutApi.isCurrentLayoutPivot(), marginTop: 0, marginBottom: 0, fontSize: 2, padding: 1, checked: this.props.IsQuickFilterVisible, onChange: (checked) => {
36
36
  checked ? this.props.onShowQuickFilterBar() : this.props.onHideQuickFilterBar();
@@ -90,7 +90,7 @@ const QueryViewPanelComponent = (props) => {
90
90
  columnsDropdown,
91
91
  namedQuerySelector,
92
92
  ' ')) : (React.createElement(React.Fragment, null,
93
- React.createElement(ButtonPlay, { onClick: () => runQuery(), tooltip: "Run Grid Filter", accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral", disabled: disabled || !isExpressionValid || expression == '' || expression == gridFilter, marginRight: 1 }),
93
+ React.createElement(ButtonPlay, { "aria-label": 'Run Grid Filter', onClick: () => runQuery(), tooltip: "Run Grid Filter", accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral", disabled: disabled || !isExpressionValid || expression == '' || expression == gridFilter, marginRight: 1 }),
94
94
  ' ',
95
95
  React.createElement(ButtonClear, { onClick: () => clearQuery(), tooltip: "Clear Grid Filter", accessLevel: gridFilterAccessLevel, disabled: expression == '' }),
96
96
  ' ',
@@ -40,7 +40,7 @@ const LayoutViewPanelComponent = (props) => {
40
40
  const layoutSelectStyle = elementType === 'ToolPanel' ? { minWidth: '100%' } : {};
41
41
  return (React.createElement(Flex, { flexDirection: "row", className: `ab-${elementType}__Layout__wrap`, flexWrap: viewType === 'ToolPanel' ? 'wrap' : 'nowrap' },
42
42
  React.createElement(Flex, { style: layoutSelectStyle, flex: 1 },
43
- React.createElement(Select, { disabled: isErrorLayout, style: { width: '100%' }, options: availableLayoutOptions, className: `ab-${elementType}__Layout__select`, value: layoutEntity ? layoutEntity.Name : null, onChange: (layout) => onSelectLayout(layout) })),
43
+ React.createElement(Select, { "aria-label": 'Select Layout', disabled: isErrorLayout, style: { width: '100%' }, options: availableLayoutOptions, className: `ab-${elementType}__Layout__select`, value: layoutEntity ? layoutEntity.Name : null, onChange: (layout) => onSelectLayout(layout) })),
44
44
  React.createElement(Flex, { flexDirection: "row", className: join(accessLevel === 'ReadOnly' ? GeneralConstants.READ_ONLY_STYLE : '', `ab-${elementType}__Layout__wrap`) },
45
45
  React.createElement(ButtonEdit, { disabled: isErrorLayout, onClick: () => api.layoutApi.showLayoutEditor(layoutEntity.Name), tooltip: LAYOUT_EDIT_TOOLTIP, className: `ab-${elementType}__Layout__edit`, accessLevel: entityAccessLevel }),
46
46
  React.createElement(ButtonClone, { disabled: isErrorLayout, onClick: () => api.layoutApi.showLayoutEditor(layoutEntity.Name, isPivotLayout(layoutEntity) ? 'pivot' : 'table', 'Clone'), tooltip: LAYOUT_CLONE_TOOLTIP, className: `ab-${elementType}__Layout__clone`, tone: "neutral", variant: "text", children: null, accessLevel: cloneAccessLevel }),
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { DataSource, InfiniteTable } from '../../components/InfiniteTable';
2
+ import { DataSource, InfiniteTableGrid } from '../../components/InfiniteTable';
3
3
  import { useAdaptable } from '../AdaptableContext';
4
4
  const tableDOMProps = {
5
5
  style: {
@@ -69,5 +69,5 @@ export const PivotDetailsPopoup = (props) => {
69
69
  };
70
70
  }, [props.popupProps]);
71
71
  return (React.createElement(DataSource, { data: data, primaryKey: columnId },
72
- React.createElement(InfiniteTable, { columnTypes: columnTypes, domProps: tableDOMProps, columns: columns })));
72
+ React.createElement(InfiniteTableGrid, { columnTypes: columnTypes, domProps: tableDOMProps, columns: columns })));
73
73
  };
@@ -1,4 +1,4 @@
1
- import { DataSource, InfiniteTable, } from '../../../../components/InfiniteTable';
1
+ import { DataSource, InfiniteTableGrid, } from '../../../../components/InfiniteTable';
2
2
  import * as React from 'react';
3
3
  import { Box, Flex, Text } from 'rebass';
4
4
  import DropdownButton from '../../../../components/DropdownButton';
@@ -129,7 +129,7 @@ export const ColumnsSectionSummary = () => {
129
129
  },
130
130
  };
131
131
  return (React.createElement(DataSource, { data: data, primaryKey: "columnId" },
132
- React.createElement(InfiniteTable, { columnTypes: columnTypes, rowHeight: rowHeight, columnHeaderHeight: headerHeight, domProps: tableDOMProps, columns: columns })));
132
+ React.createElement(InfiniteTableGrid, { columnTypes: columnTypes, rowHeight: rowHeight, columnHeaderHeight: headerHeight, domProps: tableDOMProps, columns: columns })));
133
133
  };
134
134
  const ColumnRow = (props) => {
135
135
  const [isExpanded, setIsExpanded] = React.useState(false);
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { useSelector } from 'react-redux';
3
- import { DataSource, InfiniteTable } from '../../components/InfiniteTable';
3
+ import { DataSource, InfiniteTableGrid } from '../../components/InfiniteTable';
4
4
  import { GetAllNotesSelector } from '../../Redux/ActionsReducers/NoteRedux';
5
5
  import { useAdaptable } from '../AdaptableContext';
6
6
  import { AdaptableButtonComponent } from '../Components/AdaptableButton';
@@ -87,5 +87,5 @@ export const NotePopup = (props) => {
87
87
  }
88
88
  }
89
89
  } },
90
- React.createElement(InfiniteTable, { columnTypes: columnTypes, headerOptions: headerOptions, domProps: tableDOMProps, columns: columnsMap }))));
90
+ React.createElement(InfiniteTableGrid, { columnTypes: columnTypes, headerOptions: headerOptions, domProps: tableDOMProps, columns: columnsMap }))));
91
91
  };
@@ -66,7 +66,7 @@ class SmartEditViewPanelComponent extends React.Component {
66
66
  const elementType = this.props.viewType === 'Toolbar' ? 'DashboardToolbar' : 'ToolPanel';
67
67
  return (React.createElement(Flex, { flexDirection: "row", className: `ab-${elementType}__SmartEdit__wrap`, flexWrap: this.props.viewType === 'ToolPanel' ? 'wrap' : 'nowrap' },
68
68
  React.createElement(Flex, null,
69
- React.createElement(Select, { value: typeof this.props.SmartEditOperation === 'object'
69
+ React.createElement(Select, { "aria-label": 'Select Smart Edit Operation', value: typeof this.props.SmartEditOperation === 'object'
70
70
  ? this.props.SmartEditOperation.name
71
71
  : this.props.SmartEditOperation, options: operationMenuItems, onChange: (operation) => this.props.onSmartEditOperationChange(operation), style: { marginRight: 1 } }),
72
72
  React.createElement(Input, { style: {
@@ -17,7 +17,7 @@ export const LoadButton = (props) => {
17
17
  });
18
18
  };
19
19
  return (React.createElement(SimpleButton, { ...props, className: "ab-StateManagement__Load-Button" },
20
- React.createElement("input", { type: "file", onChange: (json) => onLoadInitialState(json), accept: '.json', style: {
20
+ React.createElement("input", { "aria-label": "Load Adaptable State", type: "file", onChange: (json) => onLoadInitialState(json), accept: '.json', style: {
21
21
  opacity: 0,
22
22
  position: 'absolute',
23
23
  cursor: 'pointer',
@@ -23,7 +23,7 @@ export const ThemeSelector = (props) => {
23
23
  label: theme.Description,
24
24
  };
25
25
  });
26
- return (React.createElement(Select, { "data-name": "select-theme-dropdown", searchable: false, options: optionThemes, value: currentTheme, disabled: disabled, size: props.size, onChange: (themeName) => {
26
+ return (React.createElement(Select, { "aria-label": "Select Theme", "data-name": "select-theme-dropdown", searchable: false, options: optionThemes, value: currentTheme, disabled: disabled, size: props.size, onChange: (themeName) => {
27
27
  dispatch(ThemeRedux.ThemeSelect(themeName));
28
28
  } }));
29
29
  };
@@ -225,6 +225,16 @@ export declare class AdaptableAgGrid implements IAdaptable {
225
225
  updateRowGroupsExpandedState(layout?: Layout): void;
226
226
  isGroupRowNode(rowNode: IRowNode): boolean;
227
227
  getFilteredData(): any[];
228
+ /**
229
+ * This method internally differentiates between server-side and client-side row model
230
+ * and correctly calls the appropriate method as per the current row model type
231
+ */
232
+ private applyAgGridTransaction;
233
+ /**
234
+ * This method internally differentiates between server-side and client-side row model
235
+ * and correctly calls the appropriate method as per the current row model type
236
+ */
237
+ private applyAgGridTransactionAsync;
228
238
  updateRows(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<IRowNode[]>;
229
239
  addRows(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<IRowNode[]>;
230
240
  addOrUpdateRows(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<{
@@ -1557,8 +1557,11 @@ You need to define at least one Layout!`);
1557
1557
  if (isPivot) {
1558
1558
  // let's also support the pivot result columns
1559
1559
  const pivotResultColumns = gridApi.getPivotResultColumns() || [];
1560
+ const autoGroupColumns = gridApi
1561
+ .getAllGridColumns()
1562
+ .filter((column) => this.api.columnApi.isAutoRowGroupColumn(column.getColId()));
1560
1563
  if (pivotResultColumns.length) {
1561
- agGridCols = [...agGridCols, ...pivotResultColumns];
1564
+ agGridCols = [...agGridCols, ...pivotResultColumns, ...autoGroupColumns];
1562
1565
  }
1563
1566
  }
1564
1567
  const columnGroupChildren = gridApi
@@ -1954,6 +1957,28 @@ You need to define at least one Layout!`);
1954
1957
  });
1955
1958
  return data;
1956
1959
  }
1960
+ /**
1961
+ * This method internally differentiates between server-side and client-side row model
1962
+ * and correctly calls the appropriate method as per the current row model type
1963
+ */
1964
+ applyAgGridTransaction(transaction) {
1965
+ const isServerSideRowModel = this.getAgGridRowModelType() === 'serverSide';
1966
+ const agGridApi = this.agGridAdapter.getAgGridApi();
1967
+ return isServerSideRowModel
1968
+ ? agGridApi.applyServerSideTransaction(transaction)
1969
+ : agGridApi.applyTransaction(transaction);
1970
+ }
1971
+ /**
1972
+ * This method internally differentiates between server-side and client-side row model
1973
+ * and correctly calls the appropriate method as per the current row model type
1974
+ */
1975
+ applyAgGridTransactionAsync(transaction, callback) {
1976
+ const isServerSideRowModel = this.getAgGridRowModelType() === 'serverSide';
1977
+ const agGridApi = this.agGridAdapter.getAgGridApi();
1978
+ return isServerSideRowModel
1979
+ ? agGridApi.applyServerSideTransactionAsync(transaction, callback)
1980
+ : agGridApi.applyTransactionAsync(transaction, callback);
1981
+ }
1957
1982
  updateRows(dataRows, dataUpdateConfig) {
1958
1983
  if (this.hasAutogeneratedPrimaryKey) {
1959
1984
  this.addSyntheticPrimaryKeyIfMissing(dataRows);
@@ -1961,9 +1986,7 @@ You need to define at least one Layout!`);
1961
1986
  dataUpdateConfig = dataUpdateConfig || {};
1962
1987
  if (dataUpdateConfig.runAsync) {
1963
1988
  return new Promise((resolve) => {
1964
- this.agGridAdapter
1965
- .getAgGridApi()
1966
- .applyTransactionAsync({ update: dataRows }, (transaction) => {
1989
+ this.applyAgGridTransactionAsync({ update: dataRows }, (transaction) => {
1967
1990
  if (typeof dataUpdateConfig.callback === 'function') {
1968
1991
  dataUpdateConfig.callback(transaction);
1969
1992
  }
@@ -1975,7 +1998,7 @@ You need to define at least one Layout!`);
1975
1998
  });
1976
1999
  }
1977
2000
  else {
1978
- const transaction = this.agGridAdapter.getAgGridApi().applyTransaction({
2001
+ const transaction = this.applyAgGridTransaction({
1979
2002
  update: dataRows,
1980
2003
  });
1981
2004
  if (dataUpdateConfig.flushAsync) {
@@ -1995,7 +2018,7 @@ You need to define at least one Layout!`);
1995
2018
  }
1996
2019
  if (dataUpdateConfig.runAsync) {
1997
2020
  return new Promise((resolve) => {
1998
- this.agGridAdapter.getAgGridApi().applyTransactionAsync(newData, (transaction) => {
2021
+ this.applyAgGridTransactionAsync(newData, (transaction) => {
1999
2022
  if (typeof dataUpdateConfig.callback === 'function') {
2000
2023
  dataUpdateConfig.callback(transaction);
2001
2024
  }
@@ -2008,7 +2031,7 @@ You need to define at least one Layout!`);
2008
2031
  });
2009
2032
  }
2010
2033
  else {
2011
- const transaction = this.agGridAdapter.getAgGridApi().applyTransaction(newData);
2034
+ const transaction = this.applyAgGridTransaction(newData);
2012
2035
  if (dataUpdateConfig.flushAsync) {
2013
2036
  this.agGridAdapter.getAgGridApi().flushAsyncTransactions();
2014
2037
  }
@@ -2035,9 +2058,7 @@ You need to define at least one Layout!`);
2035
2058
  dataUpdateConfig = dataUpdateConfig || {};
2036
2059
  if (dataUpdateConfig.runAsync) {
2037
2060
  return new Promise((resolve) => {
2038
- this.agGridAdapter
2039
- .getAgGridApi()
2040
- .applyTransactionAsync({ update: updateDataRows, add: addDataRows, addIndex: dataUpdateConfig.addIndex }, (transaction) => {
2061
+ this.applyAgGridTransactionAsync({ update: updateDataRows, add: addDataRows, addIndex: dataUpdateConfig.addIndex }, (transaction) => {
2041
2062
  if (typeof dataUpdateConfig.callback === 'function') {
2042
2063
  dataUpdateConfig.callback(transaction);
2043
2064
  }
@@ -2055,7 +2076,7 @@ You need to define at least one Layout!`);
2055
2076
  });
2056
2077
  }
2057
2078
  else {
2058
- const transaction = this.agGridAdapter.getAgGridApi().applyTransaction({
2079
+ const transaction = this.applyAgGridTransaction({
2059
2080
  update: updateDataRows,
2060
2081
  add: addDataRows,
2061
2082
  addIndex: dataUpdateConfig.addIndex,
@@ -2076,9 +2097,7 @@ You need to define at least one Layout!`);
2076
2097
  dataUpdateConfig = dataUpdateConfig || {};
2077
2098
  if (dataUpdateConfig.runAsync) {
2078
2099
  return new Promise((resolve) => {
2079
- this.agGridAdapter
2080
- .getAgGridApi()
2081
- .applyTransactionAsync({ remove: dataRows }, (transaction) => {
2100
+ this.applyAgGridTransactionAsync({ remove: dataRows }, (transaction) => {
2082
2101
  if (typeof dataUpdateConfig.callback === 'function') {
2083
2102
  dataUpdateConfig.callback(transaction);
2084
2103
  }
@@ -2090,7 +2109,7 @@ You need to define at least one Layout!`);
2090
2109
  });
2091
2110
  }
2092
2111
  else {
2093
- const transaction = this.agGridAdapter.getAgGridApi().applyTransaction({
2112
+ const transaction = this.applyAgGridTransaction({
2094
2113
  remove: dataRows,
2095
2114
  });
2096
2115
  if (dataUpdateConfig.flushAsync) {
@@ -3026,7 +3045,7 @@ You need to define at least one Layout!`);
3026
3045
  // and is specific to Adaptable, therefore we need to refresh it manually
3027
3046
  this.refreshHeader();
3028
3047
  const layoutModel = layoutStateToLayoutModel(layout);
3029
- this.layoutManager?.setLayout(layoutModel, {
3048
+ const layoutChanged = this.layoutManager?.setLayout(layoutModel, {
3030
3049
  skipApplyRowGroupsExpandedState: !shouldUpdateExpandState,
3031
3050
  });
3032
3051
  if (layout.AutoSizeColumns) {
@@ -3049,6 +3068,15 @@ You need to define at least one Layout!`);
3049
3068
  plugin.afterSetLayout(this, layout);
3050
3069
  }
3051
3070
  });
3071
+ if (!layoutChanged) {
3072
+ // we won't get an onLayoutChange event
3073
+ // most likely only filters have changed (column or grid filters)
3074
+ // and because filters are not part of the layout manager
3075
+ // there will be no change to the layout
3076
+ // so we need to manually trigger the onLayoutChange event
3077
+ // for other layout-related updates
3078
+ this.onLayoutChange(layout, { skipRefresh: true });
3079
+ }
3052
3080
  perfSetLayout.end();
3053
3081
  }
3054
3082
  getActiveAdaptableAggFuncForCol(columnId) {
@@ -3172,7 +3200,14 @@ You need to define at least one Layout!`);
3172
3200
  });
3173
3201
  this.refreshCellsBasedOnCellDataChange(rowNode, cellDataChangedInfos);
3174
3202
  this.refreshColumnsBasedOnCellDataChange(cellDataChangedInfos);
3175
- this.filterOnDataChange();
3203
+ const colIds = cellDataChangedInfos.map((c) => c.column.columnId);
3204
+ const { columnFilterApi, gridFilterApi } = this.api.filterApi;
3205
+ const isGridFilterActive = !!gridFilterApi.getCurrentGridFilterExpression();
3206
+ const isColumnFilterActive = colIds.some((colId) => columnFilterApi.isColumnFilterActiveForColumn(colId));
3207
+ const shouldFilter = isGridFilterActive || isColumnFilterActive;
3208
+ if (shouldFilter) {
3209
+ this.filterOnDataChange();
3210
+ }
3176
3211
  }
3177
3212
  refreshCellsBasedOnCellDataChange(rowNode, cellDataChangedInfos) {
3178
3213
  // Check if node is visible as otherwise AG Grid wont refresh
@@ -3350,18 +3385,21 @@ You need to define at least one Layout!`);
3350
3385
  };
3351
3386
  return hasPivotTotals(one) || hasPivotTotals(other);
3352
3387
  }
3353
- onLayoutChange(layout) {
3388
+ onLayoutChange(layout, options) {
3354
3389
  this.logger.info('onLayoutChange()');
3355
- const prevOnChangeLayout = this.__prevLayoutForOnChange || this.api.layoutApi.getCurrentLayout();
3356
- // see #on-regroup-expect-group-column-to-be-recomputed-and-setup-properly
3357
- const rowGroupsChanged = this.isRowGroupDifferentInLayout(prevOnChangeLayout, layout);
3358
- const hasPivotTotalsInLayout = this.hasPivotTotalsInLayout(prevOnChangeLayout, layout);
3359
- const pivotColsChanged = JSON.stringify(layout.PivotColumns) !== JSON.stringify(prevOnChangeLayout.PivotColumns);
3360
- if (rowGroupsChanged || pivotColsChanged || hasPivotTotalsInLayout) {
3361
- this.updateColumnModelAndRefreshGrid();
3362
- }
3363
- else {
3364
- this.deriveAdaptableColumnStateFromAgGrid();
3390
+ const skipRefresh = options?.skipRefresh;
3391
+ if (!skipRefresh) {
3392
+ const prevOnChangeLayout = this.__prevLayoutForOnChange || this.api.layoutApi.getCurrentLayout();
3393
+ // see #on-regroup-expect-group-column-to-be-recomputed-and-setup-properly
3394
+ const rowGroupsChanged = this.isRowGroupDifferentInLayout(prevOnChangeLayout, layout);
3395
+ const hasPivotTotalsInLayout = this.hasPivotTotalsInLayout(prevOnChangeLayout, layout);
3396
+ const pivotColsChanged = JSON.stringify(layout.PivotColumns) !== JSON.stringify(prevOnChangeLayout.PivotColumns);
3397
+ if (rowGroupsChanged || pivotColsChanged || hasPivotTotalsInLayout) {
3398
+ this.updateColumnModelAndRefreshGrid();
3399
+ }
3400
+ else {
3401
+ this.deriveAdaptableColumnStateFromAgGrid();
3402
+ }
3365
3403
  }
3366
3404
  this.__prevLayoutForOnChange = layout;
3367
3405
  this.api.layoutApi.createOrUpdateLayout(layout);
@@ -108,7 +108,7 @@ export class AgGridExportAdapter {
108
108
  };
109
109
  }
110
110
  catch (error) {
111
- this.logger.consoleError(`Error exporting ${report.Name} in ${format} format to ${config.destination}`, error);
111
+ this.logger.consoleError(`Error exporting ${report.Name} in ${format} format to ${config.destination}`, error.message);
112
112
  }
113
113
  finally {
114
114
  /**
@@ -7,7 +7,7 @@ export function DashboardToolbar(props) {
7
7
  React.createElement("div", { className: "ab-Dashboard__toolbar-content" }, props.children),
8
8
  React.createElement(Flex, { className: "ab-Dashboard__toolbar-title", flexDirection: "row", alignItems: "center" },
9
9
  React.createElement("span", null, props.title),
10
- props.showConfigure && (React.createElement(SimpleButton, { icon: "spanner", variant: "text", tone: "none", "data-name": "configure", iconSize: 16, marginLeft: 1, tooltip: props.tooltip || `Configure ${props.title}`, onClick: () => props.onConfigure() })),
10
+ props.showConfigure && (React.createElement(SimpleButton, { "aria-label": `Configure ${props.title}`, icon: "spanner", variant: "text", tone: "none", "data-name": "configure", iconSize: 16, marginLeft: 1, tooltip: props.tooltip || `Configure ${props.title}`, onClick: () => props.onConfigure() })),
11
11
  ' ',
12
- props.showClose && (React.createElement(SimpleButton, { style: { alignSelf: 'flex-end' }, disabled: props.accessLevel == 'ReadOnly', "data-name": "close", icon: "close", variant: "text", tone: "none", iconSize: 16, marginLeft: 1, tooltip: props.tooltip || `Close ${props.title} Toolbar`, onClick: () => props.onClose() })))));
12
+ props.showClose && (React.createElement(SimpleButton, { "aria-label": `Close ${props.title}`, style: { alignSelf: 'flex-end' }, disabled: props.accessLevel == 'ReadOnly', "data-name": "close", icon: "close", variant: "text", tone: "none", iconSize: 16, marginLeft: 1, tooltip: props.tooltip || `Close ${props.title} Toolbar`, onClick: () => props.onClose() })))));
13
13
  }