@focuson/form_components
Version:
Components that can be used by @focuson/forms
106 lines (105 loc) • 7.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TableWithHighLightIfOverDataDependant = exports.TableWithHighLightIfOver = exports.StructureTable = exports.oneRowForStructure = exports.Table = exports.defaultOneRow = exports.defaultOneRowWithGetValue = exports.tdClassForTable = exports.rawTable = exports.defaultDisplayTitleFn = exports.addClassRowFn = exports.defaultOnClick = exports.transformsForUpdateSelected = exports.getValueForTable = void 0;
const jsx_runtime_1 = require("react/jsx-runtime");
const utils_1 = require("@focuson/utils");
const state_1 = require("@focuson/state");
const lens_1 = require("@focuson/lens");
const pages_1 = require("@focuson/pages");
function getValueForTable(o, row, joiners) {
return (0, utils_1.makeIntoString)(o.toString(), row[o], (0, utils_1.findJoiner)(o.toString(), joiners));
}
exports.getValueForTable = getValueForTable;
const transformsForUpdateSelected = (copySelectedIndexTo, copySelectedItemTo) => (i, row) => {
const indexTx = copySelectedIndexTo ? [[copySelectedIndexTo.optional, () => i]] : [];
const itemTx = copySelectedItemTo ? [[copySelectedItemTo.optional, () => row]] : [];
return [...indexTx, ...itemTx];
};
exports.transformsForUpdateSelected = transformsForUpdateSelected;
function defaultOnClick(props) {
const { id, state, copySelectedIndexTo, copySelectedItemTo } = props;
return (i, row) => (e) => {
if (copySelectedIndexTo || copySelectedItemTo) {
const txs = (0, exports.transformsForUpdateSelected)(copySelectedIndexTo, copySelectedItemTo)(i, row);
state.massTransform((0, state_1.reasonFor)('Table', 'onClick', id, `selected row ${i}`))(...txs);
}
};
}
exports.defaultOnClick = defaultOnClick;
function addClassRowFn(fn, classFn) {
return (row, i, classForTr, rights, onClick) => {
const classFromFn = classFn(row);
const realClassForTr = classForTr ? `${classForTr} ${classFromFn ? classFromFn : ''}` : classFromFn;
return fn(row, i, realClassForTr, rights, onClick);
};
}
exports.addClassRowFn = addClassRowFn;
const defaultDisplayTitleFn = (id, field, i) => (0, jsx_runtime_1.jsx)("th", Object.assign({ id: `${id}.th[${i}]` }, { children: (0, utils_1.decamelize)(field, ' ') }), field);
exports.defaultDisplayTitleFn = defaultDisplayTitleFn;
const rawTable = (titles, onClick, oneRow, displayTitleFn) => (props) => {
const realDisplayTitleFn = displayTitleFn ? displayTitleFn : exports.defaultDisplayTitleFn;
const { id, state, copySelectedIndexTo, joiners, prefixFilter, prefixColumn, maxCount, emptyData, tableTitle, scrollAfter, rights } = props;
const tbodyScroll = scrollAfter ? { height: scrollAfter, overflow: 'auto' } : undefined;
const orderJsx = titles.map((o, i) => realDisplayTitleFn(id, o.toString(), i));
const json = (0, utils_1.safeArray)(state.optJson(), `Table id: [${id}] path: ${state.optional.description}`);
const selected = copySelectedIndexTo === null || copySelectedIndexTo === void 0 ? void 0 : copySelectedIndexTo.optJson();
function selectedClass(i) { return i === selected ? 'grid-selected' : undefined; }
const prefixFilterString = prefixFilter === null || prefixFilter === void 0 ? void 0 : prefixFilter.optJsonOr('');
const filter = (t) => prefixColumn && prefixFilter ? getValueForTable(prefixColumn, t, joiners).toString().startsWith(prefixFilterString) : true;
let maxCountInt = maxCount ? Number.parseInt(maxCount) : 0;
let count = 0;
let tableBody = json.length === 0 && emptyData ?
(0, jsx_runtime_1.jsx)("tr", Object.assign({ id: `${id}[0]` }, { children: (0, jsx_runtime_1.jsx)("td", Object.assign({ colSpan: titles.length }, { children: emptyData })) })) :
json.map((row, i) => filter(row) && (maxCount === undefined || count++ < maxCountInt) ? oneRow(row, i, selectedClass(i), rights, onClick) : null);
const title = tableTitle ? (0, jsx_runtime_1.jsx)("h2", { dangerouslySetInnerHTML: { __html: (0, pages_1.replaceTextUsingPath)(state, tableTitle) } }) : null;
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [title, (0, jsx_runtime_1.jsxs)("table", Object.assign({ id: id, className: "grid" }, { children: [(0, jsx_runtime_1.jsx)("thead", { children: (0, jsx_runtime_1.jsx)("tr", { children: orderJsx }) }), (0, jsx_runtime_1.jsx)("tbody", Object.assign({ className: "grid-sub", style: tbodyScroll }, { children: tableBody }))] }))] });
};
exports.rawTable = rawTable;
function tdClassForTable(rights, s) {
if (!rights)
return undefined;
return rights.includes(s) ? 'right' : undefined;
}
exports.tdClassForTable = tdClassForTable;
const defaultOneRowWithGetValue = (getValue) => (id, order, joiners, ...extraTds) => (row, i, clazz, rights, onClick) => ((0, jsx_runtime_1.jsxs)("tr", Object.assign({ id: `${id}[${i}]`, className: clazz, onClick: onClick(i, row) }, { children: [order.map(o => (0, jsx_runtime_1.jsx)("td", Object.assign({ id: `${id}[${i}].${o.toString()}`, className: tdClassForTable(rights, o) }, { children: getValue(o, row, joiners) }), o.toString())), extraTds.map((e, j) => (0, jsx_runtime_1.jsx)("td", { children: e(i, row) }, `extra${j}`))] }), i));
exports.defaultOneRowWithGetValue = defaultOneRowWithGetValue;
exports.defaultOneRow = (0, exports.defaultOneRowWithGetValue)(getValueForTable);
function Table(props) {
const { id, order, joiners } = props;
return (0, exports.rawTable)(order, defaultOnClick(props), (0, exports.defaultOneRow)(id, order, joiners))(props);
}
exports.Table = Table;
const oneRowForStructure = (id, state, paths, ...extraTds) => (row, i, clazz, rights, onClick) => {
const rowState = state.chainLens(lens_1.Lenses.nth(i));
return ((0, jsx_runtime_1.jsxs)("tr", Object.assign({ id: `${id}[${i}]`, className: clazz, onClick: onClick(i, row) }, { children: [Object.values(paths).map((o, col) => {
const colState = o(rowState);
return (0, jsx_runtime_1.jsx)("td", Object.assign({ id: `${id}[${i}].${col}`, className: tdClassForTable(rights, o) }, { children: colState.optJson() }), col);
}), extraTds.map(e => (0, jsx_runtime_1.jsx)("td", { children: e(i, row) }))] }), i));
};
exports.oneRowForStructure = oneRowForStructure;
function StructureTable(props) {
const { id, state, paths } = props;
return (0, exports.rawTable)(Object.keys(paths), defaultOnClick(props), (0, exports.oneRowForStructure)(id, state, paths))(props);
}
exports.StructureTable = StructureTable;
function TableWithHighLightIfOver(props) {
const { id, nameOfCellForMinimum, minimumValue, classNameOfHighlight, order, joiners } = props;
const oneRow = addClassRowFn((0, exports.defaultOneRow)(id, order, joiners), row => {
const value = (0, utils_1.numberOrUndefined)(row[nameOfCellForMinimum]);
const shouldHighlight = value !== undefined && minimumValue !== undefined && value <= minimumValue;
return shouldHighlight ? classNameOfHighlight : undefined;
});
return (0, exports.rawTable)(order, defaultOnClick(props), oneRow)(props);
}
exports.TableWithHighLightIfOver = TableWithHighLightIfOver;
function TableWithHighLightIfOverDataDependant(props) {
const { id, nameOfCellForMinimum, minimumPath, classNameOfHighlight, order, joiners } = props;
const minimumValue = minimumPath.optJson();
const oneRow = addClassRowFn((0, exports.defaultOneRow)(id, order, joiners), row => {
const value = (0, utils_1.numberOrUndefined)(row[nameOfCellForMinimum]);
const shouldHighlight = value !== undefined && minimumValue !== undefined && value <= minimumValue;
return shouldHighlight ? classNameOfHighlight : undefined;
});
return (0, exports.rawTable)(order, defaultOnClick(props), oneRow)(props);
}
exports.TableWithHighLightIfOverDataDependant = TableWithHighLightIfOverDataDependant;