UNPKG

@etsoo/materialui

Version:

TypeScript Material-UI Implementation

137 lines (136 loc) 4.85 kB
import { jsx as _jsx } from "react/jsx-runtime"; import { DataTypes, DateUtils, NumberUtils } from "@etsoo/shared"; import { Divider } from "@mui/material"; import { ViewContainer } from "../ViewContainer"; import { useRequiredAppContext } from "../app/ReactApp"; /** * Transform custom field space * @param space Space * @returns Result */ function transformSize(space) { if (space == null) return undefined; switch (space) { case "full": return true; case "quater": return "medium"; case "five": return { xs: 12, sm: 12, md: 5, lg: 4, xl: 3 }; case "seven": return { xs: 12, sm: 12, md: 7, lg: 6, xl: 5 }; default: return false; } } /** * Custom field view UI * @param props Props * @returns Component */ export function CustomFieldViewUI(props) { // Destruct const { fields, ...rest } = props; // App const app = useRequiredAppContext(); // Mapping const mappedFields = fields.map((f) => { const type = f.type; const label = f.label ? (app.get(f.label) ?? f.label) : undefined; const singleRow = transformSize(f.space); const name = f.name ?? ""; let item; switch (type) { case "amountlabel": const currency = f.mainSlotProps?.currency; const symbol = currency ? NumberUtils.getCurrencySymbol(currency) : ""; item = { label: "", singleRow, data: label ? () => `${symbol}${app.formatNumber(parseFloat(label))}` : () => "" }; break; case "checkbox": case "combobox": case "radio": case "select": item = { label, singleRow, data: (data) => { const value = data[name]; if (value == null) return undefined; const values = Array.isArray(value) ? value : [value]; const options = f.options ?? []; const selectedOptions = options.filter((o) => values.includes(o.id)); return selectedOptions .map((o) => { const label = DataTypes.getListItemLabel(o); return app.get(label) ?? label; }) .join(", "); } }; break; case "date": item = { label, singleRow, data: (data) => { const value = data[name]; if (value == null) return undefined; return typeof value === "string" ? (DateUtils.parse(value)?.toLocaleDateString() ?? value) : value instanceof Date ? value.toLocaleDateString() : `${value}`; } }; break; case "divider": item = { label, singleRow, data: () => _jsx(Divider, {}) }; break; case "json": item = { label, singleRow, data: (data) => { const value = data[name]; if (value == null) return undefined; return JSON.stringify(value, null, 2); } }; break; case "number": const numberCurrency = f.mainSlotProps?.currency; const numberSymbol = numberCurrency ? NumberUtils.getCurrencySymbol(numberCurrency) : ""; item = { label: numberCurrency ? `${label} (${numberCurrency})` : label, singleRow, data: (data) => { const value = NumberUtils.parse(data[name]); return value == null ? undefined : `${numberSymbol}${app.formatNumber(value)}`; } }; break; default: item = { label, singleRow, data: name }; } return item; }); return _jsx(ViewContainer, { fields: mappedFields, ...rest }); }