@adaptabletools/adaptable
Version:
Powerful AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements
162 lines (161 loc) • 6.35 kB
JavaScript
export const TABLE_COLUMNS_SETTINGS_PANEL_LABELS = {
visibility: 'Columns',
pinning: 'Pinning',
sizing: 'Sizing',
sorting: 'Sorting',
};
export const TABLE_COLUMNS_WIZARD_SUBSECTION_LABELS = {
visibility: 'Visibility and Order',
pinning: 'Pinning',
sizing: 'Sizing',
sorting: 'Sorting',
};
function resolveDefaultColumnWidth(api) {
return (columnId) => api.internalApi.getAdaptableInstance().getDefaultColumnWidthForCol(columnId);
}
function hasExplicitLayoutSizing(columnId, sizing, resolveDefaultWidth) {
if (!sizing) {
return false;
}
if (sizing.Flex != null) {
return true;
}
if (sizing.MinWidth != null || sizing.MaxWidth != null) {
return true;
}
if (sizing.Width != null) {
return sizing.Width !== resolveDefaultWidth(columnId);
}
return false;
}
function getLayoutExplicitSizedColumnIds(layout, resolveDefaultWidth) {
const sizing = layout.ColumnSizing ?? {};
return Object.keys(sizing).filter((columnId) => hasExplicitLayoutSizing(columnId, sizing[columnId], resolveDefaultWidth));
}
function formatExplicitColumnSizingBrief(columnId, sizing, resolveDefaultWidth) {
if (!hasExplicitLayoutSizing(columnId, sizing, resolveDefaultWidth)) {
return '';
}
const parts = [];
if (sizing?.Flex != null) {
parts.push(`flex ${sizing.Flex}`);
}
else if (sizing?.Width != null && sizing.Width !== resolveDefaultWidth(columnId)) {
parts.push(String(sizing.Width));
}
if (sizing?.MinWidth != null) {
parts.push(`min ${sizing.MinWidth}`);
}
if (sizing?.MaxWidth != null) {
parts.push(`max ${sizing.MaxWidth}`);
}
return parts.join(', ');
}
function getLayoutTableColumnIds(layout, api) {
return (layout.TableColumns ?? [])
.filter((columnId) => !api.columnApi.isAutoRowGroupColumn(columnId))
.filter((columnId) => !api.columnApi.isPivotResultColumn(columnId))
.filter((columnId) => !api.columnApi.isSelectionColumn(columnId));
}
function getLayoutPinnedColumnIds(layout, side) {
const pinning = layout.ColumnPinning ?? {};
return Object.entries(pinning)
.filter(([, pin]) => pin === side)
.map(([columnId]) => columnId);
}
export function getTableColumnsVisibilitySummaryValues(layout, api) {
return getLayoutTableColumnIds(layout, api).map((columnId) => {
const name = api.columnApi.getFriendlyNameForColumnId(columnId, layout);
const customHeader = layout.ColumnHeaders?.[columnId]?.trim();
if (customHeader) {
return `${name} (header: ${customHeader})`;
}
return name;
});
}
export function getTableColumnsPinningSummaryValues(layout, api) {
const leftPinned = getLayoutPinnedColumnIds(layout, 'left');
const rightPinned = getLayoutPinnedColumnIds(layout, 'right');
return [
...leftPinned.map((columnId) => `${api.columnApi.getFriendlyNameForColumnId(columnId, layout)} (left)`),
...rightPinned.map((columnId) => `${api.columnApi.getFriendlyNameForColumnId(columnId, layout)} (right)`),
];
}
export function getTableColumnsSizingSummaryValues(layout, api) {
const resolveDefaultWidth = resolveDefaultColumnWidth(api);
return getLayoutExplicitSizedColumnIds(layout, resolveDefaultWidth).map((columnId) => {
const name = api.columnApi.getFriendlyNameForColumnId(columnId, layout);
const sizingBrief = formatExplicitColumnSizingBrief(columnId, layout.ColumnSizing?.[columnId], resolveDefaultWidth);
return `${name} (${sizingBrief})`;
});
}
export function getTableColumnsSortingSummaryValues(layout, api) {
return (layout.ColumnSorts ?? []).map((sort) => `[${api.columnApi.getFriendlyNameForColumnId(sort.ColumnId, layout)}: ${sort.SortOrder}]`);
}
export const DEFAULT_LAYOUT_VIEW_MAX_COLUMNS = 10;
export function truncateColumnSummaryValues(values, maxToDisplay = DEFAULT_LAYOUT_VIEW_MAX_COLUMNS) {
if (maxToDisplay <= 0 || values.length <= maxToDisplay + 1) {
return values;
}
const extra = values.length - maxToDisplay;
return [...values.slice(0, maxToDisplay), `+${extra} more`];
}
export function getTableColumnsSummaryGroups(layout, api, labels = TABLE_COLUMNS_SETTINGS_PANEL_LABELS) {
return [
{
label: labels.visibility,
values: getTableColumnsVisibilitySummaryValues(layout, api),
emptyLabel: 'No columns in this Layout',
},
{
label: labels.pinning,
values: getTableColumnsPinningSummaryValues(layout, api),
emptyLabel: 'No columns pinned in this Layout',
},
{
label: labels.sizing,
values: getTableColumnsSizingSummaryValues(layout, api),
emptyLabel: 'All columns use default sizing in this Layout',
},
{
label: labels.sorting,
values: getTableColumnsSortingSummaryValues(layout, api),
emptyLabel: 'No column sorts in this Layout',
},
];
}
export function getLayoutTableColumnsViewItems(layout, api, options) {
const maxColumnsToDisplay = options?.maxColumnsToDisplay ?? DEFAULT_LAYOUT_VIEW_MAX_COLUMNS;
const optionalRowLabels = new Set([
TABLE_COLUMNS_SETTINGS_PANEL_LABELS.pinning,
TABLE_COLUMNS_SETTINGS_PANEL_LABELS.sizing,
TABLE_COLUMNS_SETTINGS_PANEL_LABELS.sorting,
]);
return getTableColumnsSummaryGroups(layout, api).flatMap(({ label, values, emptyLabel }) => {
if (optionalRowLabels.has(label) && !values.length) {
return [];
}
const resolvedValues = values.length ? values : [emptyLabel];
const displayValues = label === TABLE_COLUMNS_SETTINGS_PANEL_LABELS.visibility
? truncateColumnSummaryValues(resolvedValues, maxColumnsToDisplay)
: resolvedValues;
return [
{
name: label,
values: displayValues,
tagVariant: 'column',
},
];
});
}
export function getLayoutPivotSortingViewItem(layout, api) {
const values = getTableColumnsSortingSummaryValues(layout, api);
if (!values.length) {
return null;
}
return {
name: 'Sorting',
values,
tagVariant: 'column',
};
}