UNPKG

tubular-common

Version:

Tubular Common Models and Data Transformer

79 lines 3.47 kB
import { ColumnDataType, parseDateColumnValue } from './Models'; export const parsePayload = (row, columns) => columns.reduce((obj, column, key) => { obj[column.name] = row[key] || row[column.name]; return obj; }, {}); export const getColumnAlign = (column) => { switch (column.dataType) { case ColumnDataType.Numeric: return 'right'; case ColumnDataType.Boolean: return 'center'; default: return 'inherit'; } }; const getRealCellValue = (column, value, isHeader = false) => { if (isHeader) return String(value); switch (column.dataType) { case ColumnDataType.Date: case ColumnDataType.DateTime: case ColumnDataType.DateTimeUtc: return value ? parseDateColumnValue(column, String(value)) : ''; case ColumnDataType.Boolean: return value === true ? 'Yes' : 'No'; default: return String(value ?? ''); } }; const getCellValue = (column, row, isHeader) => column.isComputed ? column.getComputedStringValue(column, row, isHeader) : getRealCellValue(column, row[column.name], isHeader); const processRow = (row, columns, isHeader) => { const finalVal = columns.reduce((prev, currentColumn) => { const result = `"${getCellValue(currentColumn, row, isHeader).replace(/"/g, '""')}"`; return `${prev}${result},`; }, ''); return `${finalVal.replace(/(^,)|(,$)/g, '')}\n`; }; const visibleColumns = (c) => (c.visible && c.exportable) || (c.isComputed && !c.getComputedStringValue); export const getCsv = (gridResult, columns) => { const exportableColumns = columns.filter(visibleColumns); const headers = processRow(exportableColumns .map((x) => ({ [x.name]: x.label })) // biome-ignore lint/performance/noAccumulatingSpread: <explanation> .reduce((prev, current) => ({ ...prev, ...current }), {}), exportableColumns, true); return gridResult.reduce((prev, row) => String(prev) + processRow(row, exportableColumns, false), headers); }; export const getHtml = (gridResult, columns) => { const exportableColumns = columns.filter(visibleColumns); const headers = exportableColumns.reduce((prev, el) => `${prev}<th>${el.label || el.name}</th>`, ''); return `<table class="table table-bordered table-striped"><thead><tr>${headers}</tr></thead><tbody>${gridResult.reduce((prevRow, row) => `${prevRow}<tr>${exportableColumns.reduce((prev, currentColumn) => `${prev}<td>${getCellValue(currentColumn, row, false)}</td>`, '')}</tr>`, '')}</tbody></table>`; }; export const getPages = (currentPage, totalRows, rowsPerPage) => { const pages = []; // Default page limits const totalPages = Math.ceil(totalRows / rowsPerPage); let startPage = 1; let endPage = totalPages; const maxSize = 6; const isMaxSized = maxSize < totalPages; // recompute if maxSize if (isMaxSized) { // Current page is displayed in the middle of the visible ones startPage = Math.max(currentPage - Math.floor(maxSize / 2), 1); endPage = startPage + maxSize - 1; // Adjust if limit is exceeded if (endPage > totalPages) { endPage = totalPages; startPage = endPage - maxSize + 1; } } // Add page number links for (let num = startPage; num <= endPage; num++) { pages.push(num - 1); } return pages; }; //# sourceMappingURL=utils.js.map