UNPKG

@adaptabletools/adaptable

Version:

Powerful data-agnostic HTML5 AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements

349 lines (348 loc) 15.7 kB
import { VersionUpgrade } from './VersionUpgrade'; import ArrayExtensions from '../Utilities/Extensions/ArrayExtensions'; import ObjectFactory from '../Utilities/ObjectFactory'; import StringExtensions from '../Utilities/Extensions/StringExtensions'; import { updateSingleToMultiplePredicates } from '../Utilities/updateSingleToMultiplePredicates'; export class VersionUpgrade17 extends VersionUpgrade { migrateState(state) { return this.migrateStateWithMethods(state, [ this.migrateCalculatedColumnState, this.migrateAlertState, this.migrateToolPanelState, this.migrateStyledColumnState, this.migrateNamedQueryState, this.migrateGridFilterState, this.migrateFreeTextColumnState, this.migrateFormatColumnState, this.migrateFlashinCellState, this.migrateDashboardState, this.migrateColumnFilterState, this.migrateChartingState, ]); } migrateChartingState(state) { // const allChartDefinitions = this.api.chartingApi.getChartDefinitions(); const allChartDefinitions = state.Charting?.ChartDefinitions; if (Array.isArray(allChartDefinitions)) { allChartDefinitions .filter((chartDefinition) => 'model' in chartDefinition || !('Name' in chartDefinition)) .forEach((charDefinition) => { if ('model' in charDefinition) { charDefinition.Model = charDefinition.model; delete charDefinition.model; } if (!('Name' in charDefinition)) { // default to chartId // @ts-ignore possible because First iteration had no 'Name' and model was under 'model' key (lowercase) charDefinition.Name = charDefinition.Model.chartId; } }); } return state; } migrateColumnFilterState(state) { // Update Module Buttons const moduleButtons = state.Dashboard?.ModuleButtons; if (moduleButtons?.length && !moduleButtons.includes('ColumnFilter')) { const dashboardState = state.Dashboard ?? {}; dashboardState.ModuleButtons = moduleButtons.map((moduleButton) => { if (moduleButton == 'Filter') { return 'ColumnFilter'; } return moduleButton; }); } // Update Toolbars const tabs = state.Dashboard?.Tabs; if (Array.isArray(tabs)) { state.Dashboard.Tabs = tabs.map((tab) => { if (tab.Toolbars.includes('Filter') && !tab.Toolbars.includes('ColumnFilter')) { return { ...tab, // replace with 'GridFilter' Toolbars: tab.Toolbars.map((t) => (t == 'Filter' ? 'ColumnFilter' : t)), }; } return tab; }); } // - move pinned toolbars const pinnedToolbars = state.Dashboard?.PinnedToolbars; if (pinnedToolbars && !pinnedToolbars?.includes('ColumnFilter')) { state.Dashboard.PinnedToolbars = pinnedToolbars.map((pinnedToolbar) => { if (pinnedToolbar == 'Filter') { return 'ColumnFilter'; } return pinnedToolbar; }); } // Update Status Bar const statusBars = state.StatusBar?.StatusBars; if (statusBars) { state.StatusBar.StatusBars = statusBars.map((panel) => { return { ...panel, StatusBarPanels: panel.StatusBarPanels.map((panel) => { if (panel === 'Filter') { return 'ColumnFilter'; } return panel; }), }; }); } return state; } migrateDashboardState(state) { // let dashboardState: any = this.api.dashboardApi.getDashboardState(); let dashboardState = state.Dashboard; if (dashboardState?.VisibleButtons) { this.logger.warn(`Updating Obsolete VisibleButtons Config for DashboardState: [${dashboardState.VisibleButtons}]`); state.Dashboard.ModuleButtons = [ ...state.Dashboard.ModuleButtons, ...dashboardState.VisibleButtons, ]; //@ts-ignore delete as no longer needed delete state.Dashboard.VisibleButtons; } return state; } migrateFlashinCellState(state) { const flashingCellState = state.FlashingCell; if (Array.isArray(flashingCellState?.FlashingCellDefinitions)) { flashingCellState.FlashingCellDefinitions.forEach((flashingCellDefinition) => { if (flashingCellDefinition.Rule && 'Predicate' in flashingCellDefinition.Rule) { updateSingleToMultiplePredicates(flashingCellDefinition.Rule); } }); } return state; } migrateFormatColumnState(state) { // const formatColumns = this.api.formatColumnApi.getFormatColumns(); const formatColumns = state.FormatColumn?.FormatColumns || []; formatColumns.forEach((formatColumn) => { if (formatColumn.Rule && 'Predicate' in formatColumn.Rule) { //@ts-ignore ignore updateSingleToMultiplePredicates(formatColumn.Rule); } }); // update ConditionalStyle StatusBarPanel // const oldStatusBars = this.api.internalApi.getState().StatusBar.StatusBars; const statusBars = state.StatusBar?.StatusBars || []; let replaceConditionalStyleStatusBar = false; statusBars.forEach((statusBar) => ({ ...statusBar, StatusBarPanels: [ ...new Set(statusBar.StatusBarPanels.map((statusBarPanel) => { if (statusBarPanel === 'ConditionalStyle') { replaceConditionalStyleStatusBar = true; return 'FormatColumn'; } return statusBarPanel; })), ], })); // update ConditionalStyle dashboard buttons // const dashboardModuleButtons = this.api.internalApi.getState().Dashboard.ModuleButtons as any; const dashboardModuleButtons = state.Dashboard?.ModuleButtons; if (dashboardModuleButtons && dashboardModuleButtons.includes('ConditionalStyle')) { dashboardModuleButtons[dashboardModuleButtons.indexOf('ConditionalStyle')] = 'FormatColumn'; } // update ConditionalStyle toolPanel buttons // const toolPanelModuleButtons = this.api.internalApi.getState().ToolPanel.ModuleButtons as any; const toolPanelModuleButtons = state.ToolPanel?.ModuleButtons; if (toolPanelModuleButtons && toolPanelModuleButtons.includes('ConditionalStyle')) { toolPanelModuleButtons[toolPanelModuleButtons.indexOf('ConditionalStyle')] = 'FormatColumn'; } return state; } migrateFreeTextColumnState(state) { // make sure all default to type string const allFreeTextColumns = state.FreeTextColumn?.FreeTextColumns || []; for (const freeTextColumn of allFreeTextColumns) { const unTypedCol = freeTextColumn; if (unTypedCol.DataType) { const dataType = unTypedCol.DataType; delete unTypedCol['DataType']; if (!freeTextColumn.FreeTextColumnSettings) { freeTextColumn.FreeTextColumnSettings = { DataType: dataType, }; } else { freeTextColumn.FreeTextColumnSettings.DataType = dataType; } } if (!freeTextColumn.FreeTextColumnSettings) { freeTextColumn.FreeTextColumnSettings = { DataType: 'String', }; } if (!freeTextColumn.FreeTextColumnSettings.DataType) { freeTextColumn.FreeTextColumnSettings.DataType = 'String'; } } return state; } migrateGridFilterState(state) { const oldQueryState = state.Query; if (!oldQueryState) { return state; } // - move query to current layout const expression = oldQueryState.CurrentQuery; const currentLayout = state.Layout.Layouts?.find((l) => l.Name === state.Layout.CurrentLayout); const currentGridFilter = currentLayout?.GridFilter; const currentGridFilterExpression = currentGridFilter && !currentGridFilter.IsSuspended ? currentGridFilter.Expression || '' : ''; if (expression && StringExtensions.IsNullOrEmpty(currentGridFilterExpression)) { currentLayout.GridFilter = { ...currentGridFilter, Expression: expression, }; } // - move dashboard/toolbar state.Dashboard.Tabs?.forEach((tab) => { if (tab.Toolbars.includes('Query')) { tab.Toolbars = tab.Toolbars.map((t) => (t == 'Query' ? 'GridFilter' : t)); } }); // - move pinned toolbars let updatePinnedToolbars = false; if (state.Dashboard.PinnedToolbars) { state.Dashboard.PinnedToolbars = state.Dashboard.PinnedToolbars.map((pinnedToolbar) => { if (pinnedToolbar == 'Query') { return 'GridFilter'; } return pinnedToolbar; }); } return state; } migrateNamedQueryState(state) { // - move named queries from old Query State to this Module // Note: GridFilter Module moves the "old" CurrentQuery into Layout // const oldQueryState: QueryState = this.api.internalApi.getAdaptableState().Query; const oldQueryState = state.Query; const oldNamedQueries = oldQueryState?.NamedQueries; if (ArrayExtensions.IsNotNullOrEmpty(oldNamedQueries)) { const currentNamedQueries = state.NamedQuery.NamedQueries; oldNamedQueries.forEach((oldNamedQuery) => { const currentQuery = currentNamedQueries.find((q) => q.Name === oldNamedQuery.Name); if (!currentQuery) { state.NamedQuery?.NamedQueries?.push(oldNamedQuery); } }); } if (oldQueryState) { delete state.Query; } return state; } migrateStyledColumnState(state) { var _a; const formatColumnsWithColumnStyles = state.FormatColumn?.FormatColumns?.filter((fc) => fc.ColumnStyle) || []; if (!formatColumnsWithColumnStyles.length) { return state; } this.logger.info(`Converting ${formatColumnsWithColumnStyles.length} FormatColumns Styles to Styled Columns`, formatColumnsWithColumnStyles); // delete the format columns with column styles state.FormatColumn.FormatColumns = state.FormatColumn.FormatColumns?.filter((fc) => !fc.ColumnStyle); const styledColumns = formatColumnsWithColumnStyles .map((formatColumn) => { if (!('ColumnIds' in formatColumn.Scope)) { return null; } return { ...ObjectFactory.CreateEmptyStyledColumn(), ColumnId: formatColumn.Scope.ColumnIds[0], ...formatColumn.ColumnStyle, }; }) .filter(Boolean); (_a = state.StyledColumn).StyledColumns ?? (_a.StyledColumns = []); styledColumns.forEach((styledColumn) => { state.StyledColumn.StyledColumns.push(styledColumn); }); return state; } migrateToolPanelState(state) { // const deprecatedToolPanelConfigs: AdaptableToolPanels | undefined = ( // this.api.toolPanelApi.getToolPanelState() as any // ).VisibleToolPanels; const deprecatedToolPanelConfigs = state.ToolPanel ?.VisibleToolPanels; if (deprecatedToolPanelConfigs?.length) { this.logger.warn(`Updating Obsolete VisibleToolPanels Config for ToolPanelState: [${deprecatedToolPanelConfigs}]`); const migratedToolPanelConfigs = deprecatedToolPanelConfigs.map((toolPanel) => ({ Name: toolPanel, State: 'collapsed', })); state.ToolPanel.ToolPanels = migratedToolPanelConfigs; } return state; } migrateAlertState(state) { state.Alert?.AlertDefinitions?.forEach((alertDefinition) => { if (alertDefinition.Rule && 'Predicate' in alertDefinition.Rule) { updateSingleToMultiplePredicates(alertDefinition.Rule); } }); const alertState = state.Alert; if (ArrayExtensions.IsEmpty(state.FlashingCell?.FlashingCellDefinitions) && ArrayExtensions.IsNotNullOrEmpty(alertState?.FlashingAlertDefinitions)) { state.FlashingCell.FlashingCellDefinitions = alertState.FlashingAlertDefinitions; //@ts-ignore delete as no longer needed delete state.Alert.FlashingAlertDefinitions; } state.Alert?.AlertDefinitions?.forEach((alertDefinition) => { // if ShowPopup then change to DisplayNotificate if (alertDefinition.AlertProperties && alertDefinition.AlertProperties.ShowPopup && alertDefinition.AlertProperties.ShowPopup == true && !alertDefinition.AlertProperties.DisplayNotification) { alertDefinition.AlertProperties.DisplayNotification = true; alertDefinition.AlertProperties.ShowPopup = undefined; } // if no rule but a predicate then use that if (!alertDefinition.Rule) { if (alertDefinition.Predicate && alertDefinition.Predicate != undefined) { const predicate = alertDefinition.Predicate; alertDefinition.Rule = { Predicate: predicate, }; alertDefinition.Predicate = undefined; } } else { //migrate alert definitions with `AggregationExpression` (now `AggregatedBooleanExpression`) const obsoleteAggregationExpression = alertDefinition.Rule['AggregationExpression']; if (obsoleteAggregationExpression) { alertDefinition.Rule.AggregatedBooleanExpression = obsoleteAggregationExpression; } } }); return state; } migrateCalculatedColumnState(state) { state.CalculatedColumn?.CalculatedColumns?.forEach((cc) => { if (cc.ColumnExpression && !cc.Query) { cc.Query = { ScalarExpression: cc.ColumnExpression, }; cc.ColumnExpression = undefined; } if (!cc.CalculatedColumnSettings) { cc.CalculatedColumnSettings = { DataType: 'Number', }; this.logger.warn(`Updating incorrect Initial State for Calculated Column: ${cc.ColumnId}`); } }); return state; } migrateUserState(state) { return state; } }