UNPKG

@adaptabletools/adaptable

Version:

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

306 lines (305 loc) 11.8 kB
import * as LayoutRedux from '../../Redux/ActionsReducers/LayoutRedux'; import { LayoutSetColumnCaption } from '../../Redux/ActionsReducers/LayoutRedux'; import * as ModuleConstants from '../../Utilities/Constants/ModuleConstants'; import { ApiBase } from './ApiBase'; import StringExtensions from '../../Utilities/Extensions/StringExtensions'; import ObjectFactory from '../../Utilities/ObjectFactory'; import Helper from '../../Utilities/Helpers/Helper'; import { createUuid } from '../../AdaptableState/Uuid'; import { PopupShowPrompt } from '../../Redux/ActionsReducers/PopupRedux'; import { LayoutInternalApi } from '../Internal/LayoutInternalApi'; import { isPivotLayout, normalizeLayout } from './LayoutHelpers'; import { ERROR_LAYOUT } from '../../Utilities/Constants/GeneralConstants'; export class LayoutApiImpl extends ApiBase { constructor(_adaptable) { super(_adaptable); this.internalApi = new LayoutInternalApi(_adaptable); } updateCurrentLayout(updateFn) { const currentLayout = this.getCurrentLayout(); const updatedLayout = normalizeLayout(updateFn(structuredClone(currentLayout))); this._adaptable.setLayout(updatedLayout); } isCurrentLayoutPivot() { return isPivotLayout(this.getCurrentLayout()); } getLayoutState() { return this.getAdaptableState().Layout; } getCurrentVisibleColumnIdsMapForTableLayout() { const layout = this.getCurrentLayout(); if (isPivotLayout(layout)) { return {}; } return layout.TableColumns.reduce((acc, colId) => { acc[colId] = true; return acc; }, {}); } getCurrentVisibleColumnIdsForTableLayout() { const layout = this.getCurrentLayout(); if (isPivotLayout(layout)) { return []; } return layout.TableColumns.filter((colId) => layout.ColumnVisibility?.[colId] !== false); } getCurrentRowGroupsColumnIds() { const layout = this.getCurrentLayout(); if (isPivotLayout(layout)) { return layout.PivotGroupedColumns; } return layout.RowGroupedColumns; } setLayout(layoutName) { if (StringExtensions.IsNullOrEmpty(layoutName)) { return; } if (layoutName === this.getCurrentLayoutName()) { return; } let layout = this.getLayoutByName(layoutName); if (this.checkItemExists(layout, layoutName, 'Layout')) { this.dispatchAction(LayoutRedux.LayoutSelect(layoutName)); } } getCurrentLayout() { let layoutName = this.getLayoutState().CurrentLayout; return this.getLayoutByName(layoutName) ?? ERROR_LAYOUT; } getCurrentLayoutColumnSort(columnId) { const currentLayout = this.getCurrentLayout(); return (currentLayout?.ColumnSorts?.find?.((sort) => sort.ColumnId === columnId)?.SortOrder ?? null); } getCurrentLayoutName() { return this.getAdaptableState().Layout.CurrentLayout; } getLayoutByName(layoutName) { if (StringExtensions.IsNotNullOrEmpty(layoutName)) { let layout = this.getLayouts().find((l) => l.Name == layoutName); if (this.checkItemExists(layout, layoutName, 'Layout')) { return layout; } } } getExtendedLayoutByName(layoutName) { const layout = this.getLayoutByName(layoutName); if (!layout) { return undefined; } const config = { includeLayoutNotAssociatedObjects: true, associatedWithLayout: layoutName, }; // cannot see a better way than to go through this module by module... let extensions = []; this.getAlertApi() .getAlertDefinitions(config) .forEach((obj) => { extensions.push({ Module: 'Alert', Object: obj }); }); this.getCustomSortApi() .getCustomSorts(config) .forEach((obj) => { extensions.push({ Module: 'CustomSort', Object: obj }); }); this.getFlashingCellApi() .getFlashingCellDefinitions(config) .forEach((obj) => { extensions.push({ Module: 'FlashingCell', Object: obj }); }); this.getFormatColumnApi() .getFormatColumns(config) .forEach((obj) => { extensions.push({ Module: 'FormatColumn', Object: obj }); }); this.getPlusMinusApi() .getAllPlusMinus(config) .forEach((obj) => { extensions.push({ Module: 'PlusMinus', Object: obj }); }); this.getScheduleApi() .getReminderSchedules(config) .forEach((obj) => { extensions.push({ Module: 'Schedule', Object: obj }); }); this.getScheduleApi() .getReportSchedules(config) .forEach((obj) => { extensions.push({ Module: 'Schedule', Object: obj }); }); this.getShortcutApi() .getShortcuts(config) .forEach((obj) => { extensions.push({ Module: 'Shortcut', Object: obj }); }); this.getStyledColumnApi() .getStyledColumns(config) .forEach((obj) => { extensions.push({ Module: 'StyledColumn', Object: obj }); }); return { Layout: layout, Extensions: extensions, }; } getLayouts() { return this.getAdaptableState().Layout.Layouts ?? []; } getLayoutById(id) { return this.getLayouts()?.find((layout) => layout?.Uuid === id); } saveCurrentLayout() { let currentLayout = this.getCurrentLayout(); if (currentLayout) { this.createOrUpdateLayout(currentLayout); } } doesLayoutExist(layout) { if (layout == null) { return false; } let existingLayout = this.getLayouts().find((l) => l.Uuid == layout.Uuid || l.Name === layout.Name); return existingLayout != null; } createAndSetLayout(layoutToCreate) { const layout = this.createLayout(layoutToCreate); if (layout) { this.setLayout(layoutToCreate.Name); } return layout; } createLayout(layoutToCreate) { if (this.doesLayoutExist(layoutToCreate)) { this.logError("Cannot create layout with the Name: '" + layoutToCreate.Name + "' as it already exists"); return false; } const newLayout = ObjectFactory.CreateEmptyLayout({ ...layoutToCreate }); this.addUidToAdaptableObject(newLayout); this.dispatchAction(LayoutRedux.LayoutAdd(newLayout)); return newLayout; } cloneAndSetLayout(layoutToClone, layoutName) { const newLayout = this.cloneLayout(layoutToClone, layoutName); if (newLayout) { this.setLayout(layoutName); } return newLayout; } cloneLayout(layoutToClone, layoutName) { if (!this.doesLayoutExist(layoutToClone)) { this.logError("Cannot clone layout with Name: '" + layoutName + "' as other Layout does not exist"); return false; } const newLayout = Helper.cloneObject(layoutToClone); newLayout.Uuid = createUuid(); newLayout.Name = layoutName; this.dispatchAction(LayoutRedux.LayoutAdd(newLayout)); return this.getLayoutById(newLayout.Uuid); } setColumnCaption(columnId, caption) { if (StringExtensions.IsNotNullOrEmpty(columnId) && StringExtensions.IsNotNullOrEmpty(caption)) { const currentLayoutName = this.getCurrentLayoutName(); if (StringExtensions.IsNotNullOrEmpty(currentLayoutName)) { this.dispatchAction(LayoutRedux.LayoutSetColumnCaption(currentLayoutName, columnId, caption)); } } } createOrUpdateLayout(layout) { if (!this.doesLayoutExist(layout)) { this.createLayout(layout); } else { this.dispatchAction(LayoutRedux.LayoutSave(layout)); } } showChangeColumnCaption(column) { const customHeader = this.getCurrentLayout().ColumnHeaders?.[column.columnId] ?? column.friendlyName; this.dispatchAction(PopupShowPrompt({ Header: `Change caption for '${column.friendlyName}'`, Msg: '', DefaultValue: customHeader, ConfirmActionCreator: (inputText) => inputText !== customHeader && LayoutSetColumnCaption(this.getCurrentLayoutName(), column.columnId, inputText), })); } openLayoutSettingsPanel() { this.showModulePopup(ModuleConstants.LayoutModuleId); } showLayoutEditor(layoutName, layoutType, action = 'Edit') { let preparedAction = action; if (!['Edit', 'New', 'Clone'].includes(action)) { preparedAction = 'Edit'; this.logError(`When opening the layout editor the action must be one of: New, Clone, Edit; given: ${action}`); } let layout = layoutName ? this.getLayoutByName(layoutName) : this.getCurrentLayout(); if (preparedAction === 'New') { layout = null; } this.showModulePopup(ModuleConstants.LayoutModuleId, { source: 'Toolbar', action: preparedAction, value: layout, config: { layoutType, }, }); } isCurrentLayoutReadOnly() { const currentLayout = this.getCurrentLayout(); if (currentLayout) { return currentLayout.IsReadOnly; } return true; } deleteLayout(layout) { const layoutCount = this.getLayouts().length; if (layoutCount === 1) { this.logWarn('You cannot delete the only Layout. AdapTable always requires one layout'); return; } this.dispatchAction(LayoutRedux.LayoutDelete(layout)); } deleteLayoutByName(layoutName) { const layout = this.getLayoutByName(layoutName); if (!layout) { this.logWarn('No Layout exists with that name'); return; } return this.deleteLayout(layout); } removeColumnFromCurrentLayout(columnId) { this.removeColumnFromLayout(columnId, this.getCurrentLayoutName()); } removeColumnFromAllLayouts(columnId) { this.getLayouts().forEach((layout) => { this.removeColumnFromLayout(columnId, layout.Name); }); } removeColumnFromLayout(columnId, layoutName) { const column = this.getColumnApi().getColumnWithColumnId(columnId); if (column) { const layout = this.getLayoutByName(layoutName); if (layout && !isPivotLayout(layout)) { if (layout.TableColumns.includes(columnId)) { this.dispatchAction(LayoutRedux.LayoutRemoveColumn(layoutName, columnId)); this.getColumnApi().hideColumn(columnId); } } } } addColumnToTableLayout(columnId, layoutName) { const column = this.getColumnApi().getColumnWithColumnId(columnId); if (column) { const layout = this.getLayoutByName(layoutName); if (layout && !isPivotLayout(layout)) { if (!layout.TableColumns.includes(columnId)) { this.dispatchAction(LayoutRedux.LayoutAddColumn(layoutName, columnId)); this.getColumnApi().showColumn(columnId); } } } } addColumnToCurrentTableLayout(columnId) { this.addColumnToTableLayout(columnId, this.getCurrentLayoutName()); } }