UNPKG

@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
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', }; }