@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
JavaScript
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());
}
}