Files
bface/src/ui/components/grid/utils.js
2026-05-05 12:24:13 -05:00

187 lines
4.0 KiB
JavaScript

export function normalizeColumnDefinitionsInput(input = {}) {
if (Array.isArray(input)) {
return Object.fromEntries(
input
.map((column) => {
const field = column?.field || column?.id;
if (!field) {
return null;
}
return [
field,
{
...column,
field,
id: field,
renderer: column.renderer || column.render || null
}
];
})
.filter(Boolean)
);
}
if (input && typeof input === 'object') {
return Object.fromEntries(
Object.entries(input).map(([field, column]) => [
field,
{
...(column || {}),
field: column?.field || column?.id || field,
id: column?.id || column?.field || field,
renderer: column?.renderer || column?.render || null
}
])
);
}
return {};
}
export function normalizeColumnsArray(input = []) {
if (Array.isArray(input)) {
return input
.map((column) => {
const id = column?.id || column?.field;
if (!id) {
return null;
}
return {
...column,
id,
field: column.field || id,
render: column.render || column.renderer || null
};
})
.filter(Boolean);
}
if (input && typeof input === 'object') {
return Object.entries(input).map(([field, column]) => ({
...(column || {}),
id: column?.id || column?.field || field,
field: column?.field || column?.id || field,
render: column?.render || column?.renderer || null
}));
}
return [];
}
export function resolveCellValue(row, column) {
return row?.[column.field];
}
export function resolveCellAlignment(column) {
return column.align || 'left';
}
export function resolveVisibleColumns(columns = [], viewportWidth = 0) {
if (!columns.length) {
return [];
}
let hiddenPriorities = new Set();
if (viewportWidth > 0 && viewportWidth < 760) {
hiddenPriorities = new Set(['wide', 'mid']);
} else if (viewportWidth > 0 && viewportWidth < 980) {
hiddenPriorities = new Set(['wide']);
}
const filtered = columns.filter((column) => {
if (column.alwaysVisible || !column.priority) {
return true;
}
return !hiddenPriorities.has(column.priority);
});
return filtered.length ? filtered : columns.slice(0, 1);
}
export function areSortEntriesEqual(left = [], right = []) {
if (left.length !== right.length) {
return false;
}
return left.every(
(entry, index) =>
entry.field === right[index]?.field && entry.direction === right[index]?.direction
);
}
export function getColumnJustify(align = 'left') {
if (align === 'right') {
return 'flex-end';
}
if (align === 'center') {
return 'center';
}
return 'flex-start';
}
export function getColumnLayoutStyle(column = {}) {
const width = column.width;
if (typeof width === 'number') {
if (width > 0 && width <= 1) {
return {
flex: width,
flexBasis: 0,
minWidth: column.minWidth || 120
};
}
if (width > 1) {
return {
flexShrink: 0,
flexGrow: 0,
width: `${width}em`,
minWidth: `${width}em`
};
}
}
if (typeof width === 'string') {
return {
flexShrink: 0,
flexGrow: 0,
width,
minWidth: width
};
}
return {
flex: column.flex || 1,
flexBasis: 0,
minWidth: column.minWidth || 120
};
}
export function formatValueByColumn(value, column = {}) {
if (value == null || value === '') {
return '-';
}
if (typeof column.format === 'function') {
return column.format(value, column);
}
if (column.type === 'currency') {
const numeric = Number(value);
if (!Number.isFinite(numeric)) {
return '-';
}
return new Intl.NumberFormat('en-US', {
style: 'currency',
currency: column.currency || 'USD'
}).format(numeric);
}
if (column.type === 'boolean') {
return value ? 'Yes' : 'No';
}
return String(value);
}