187 lines
4.0 KiB
JavaScript
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);
|
|
}
|