@etsoo/materialui
Version:
TypeScript Material-UI Implementation
140 lines (139 loc) • 5.07 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CustomFieldViewUI = CustomFieldViewUI;
const jsx_runtime_1 = require("react/jsx-runtime");
const shared_1 = require("@etsoo/shared");
const material_1 = require("@mui/material");
const ViewContainer_1 = require("../ViewContainer");
const ReactApp_1 = require("../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
*/
function CustomFieldViewUI(props) {
// Destruct
const { fields, ...rest } = props;
// App
const app = (0, ReactApp_1.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 ? shared_1.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 = shared_1.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"
? (shared_1.DateUtils.parse(value)?.toLocaleDateString() ?? value)
: value instanceof Date
? value.toLocaleDateString()
: `${value}`;
}
};
break;
case "divider":
item = {
label,
singleRow,
data: () => (0, jsx_runtime_1.jsx)(material_1.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
? shared_1.NumberUtils.getCurrencySymbol(numberCurrency)
: "";
item = {
label: numberCurrency ? `${label} (${numberCurrency})` : label,
singleRow,
data: (data) => {
const value = shared_1.NumberUtils.parse(data[name]);
return value == null
? undefined
: `${numberSymbol}${app.formatNumber(value)}`;
}
};
break;
default:
item = { label, singleRow, data: name };
}
return item;
});
return (0, jsx_runtime_1.jsx)(ViewContainer_1.ViewContainer, { fields: mappedFields, ...rest });
}