UNPKG

@grandlinex/react-components

Version:
162 lines (161 loc) 7.16 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const react_1 = __importStar(require("react")); const react_icons_1 = require("@grandlinex/react-icons"); const util_1 = require("../../util"); const TableHook_1 = require("./TableHook"); const Form_1 = __importDefault(require("../form/Form")); const FormTypes_1 = require("../form/FormTypes"); function defaultCellrenderer(value, t) { if (typeof value === 'boolean') { return value ? t.get('glx.table.value.bool.true') : t.get('glx.table.value.bool.false'); } if (typeof value === 'number' || typeof value === 'string') { return value; } if (typeof value === 'object') { return JSON.stringify(value); } return ''; } function TableRow(props) { const ui = (0, util_1.useUIContext)(); const { api, rowData, index, extendRowRenderer } = props; const [open, setOpen] = (0, react_1.useState)(false); const [edit, setEdit] = (0, react_1.useState)(false); const [fEdit, setFEdit] = (0, react_1.useState)(rowData); const ac = (0, react_1.useMemo)(() => { const xc = []; if (api.hasEditMode()) { xc.push(() => ({ name: ui.translation.get('glx.table.action.edit'), icon: edit ? react_1.default.createElement(react_icons_1.IOClose, null) : react_1.default.createElement(react_icons_1.IOPencil, null), onClick: () => { setEdit(!edit); }, })); } if (extendRowRenderer) { xc.push(() => ({ name: ui.translation.get('glx.table.action.more'), icon: open ? react_1.default.createElement(react_icons_1.IOChevronUp, null) : react_1.default.createElement(react_icons_1.IOChevronDown, null), onClick: () => { setOpen(!open); }, })); } return xc; }, [extendRowRenderer, open, edit, setEdit]); const formC = (0, react_1.useMemo)(() => { if (!edit) { return []; } const conf = api .getColumDefs() .filter((e) => e.editable); const transForm = (inp) => { let type; switch (inp.dataType) { case 'date': type = FormTypes_1.InputOptionType.DATE_TIME; break; case 'boolean': type = FormTypes_1.InputOptionType.CHECKBOX; break; case 'number': type = FormTypes_1.InputOptionType.NUMBER; break; default: type = FormTypes_1.InputOptionType.TEXT; break; } return { key: inp.field, label: inp.headerName, type, }; }; const out = []; for (let i = 0; i < conf.length; i += 2) { const f = conf[i]; const s = conf[i + 1]; if (f && s) { out.push([transForm(f), transForm(s)]); } else { out.push([transForm(f)]); } } return out; }, [edit]); return (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement("tr", { className: (0, util_1.cnx)('glx-table--row glx-table--row-hover', [ index % 2 === 1, 'glx-table--row-even', ]) }, api.getColumDefs(ac).map((h) => { const val = (0, TableHook_1.getCellValue)(rowData, h); return (react_1.default.createElement("td", null, h.cellRenderer?.({ data: rowData, index, value: val, }) || defaultCellrenderer(val, ui.translation))); })), api.hasEditMode() && edit ? (react_1.default.createElement("tr", { className: (0, util_1.cnx)('glx-table--row', [ index % 2 === 1, 'glx-table--row-even', ]) }, react_1.default.createElement("td", { colSpan: api.getColumDefs().length }, react_1.default.createElement(Form_1.default, { options: formC, defaultState: fEdit, onChange: ({ form }) => { setFEdit(form); }, loading: true, buttonText: ui.translation.get('glx.table.action.save'), onSubmit: async ({ form, setError, clear }) => { const res = await api.editMode?.(form, setError, clear); if (res) { setEdit(false); } } })))) : null, extendRowRenderer && open ? (react_1.default.createElement("tr", { className: (0, util_1.cnx)('glx-table--row', [ index % 2 === 1, 'glx-table--row-even', ]) }, react_1.default.createElement("td", { colSpan: api.getColumDefs().length }, extendRowRenderer({ data: rowData, index })))) : null)); } function Table(props) { const { api, data } = (0, TableHook_1.useTableStore)(props); const { extendRowRenderer, className, fixedHeader, isSelectable = false, } = props; return (react_1.default.createElement("table", { className: (0, util_1.cnx)('glx-table-root', className, [ !!fixedHeader, 'glx-table--fixed-header', ]) }, react_1.default.createElement("thead", null, react_1.default.createElement("tr", null, api.getColumDefs().map((h) => (react_1.default.createElement("th", { key: `key_${h.headerName}` }, h.headerName))))), react_1.default.createElement("tbody", null, data.rowData.map((row, index) => (react_1.default.createElement(TableRow, { key: isSelectable ? `row_${row[isSelectable]}` : undefined, api: api, rowData: row, index: index, extendRowRenderer: extendRowRenderer })))))); } exports.default = Table;