"use strict"; class UtilsTableview { static _RenderState = class { constructor () { this.comp = null; this.rows = []; this.metasCbs = []; } }; static show ({title, entities, colTransforms, sorter}) { const {$modal} = UiUtil.getShowModal({ isWidth100: true, isHeight100: true, isUncappedWidth: true, isUncappedHeight: true, isEmpty: true, }); const rdState = new UtilsTableview._RenderState(); rdState.comp = BaseComponent.fromObject( Object.keys(colTransforms).mergeMap(k => ({[k]: true})), ); const $cbAll = $(``) .on("click", () => { const val = $cbAll.prop("indeterminate") ? false : $cbAll.prop("checked"); rdState.comp._proxyAssignSimple( "state", Object.keys(colTransforms).mergeMap(k => ({[k]: val})), ); }); rdState.metasCbs = Object.entries(colTransforms) .map(([prop, meta]) => { const $cb = ComponentUiUtil.$getCbBool(rdState.comp, prop); const $wrp = $$``; return {$wrp, name: meta.name}; }); Object.keys(colTransforms) .forEach((prop, i) => { rdState.comp._addHookBase(prop, () => { const propsSelected = Object.keys(colTransforms).map(prop => rdState.comp._state[prop]); if (propsSelected.every(Boolean)) $cbAll.prop("checked", true); else if (propsSelected.every(it => !it)) $cbAll.prop("checked", false); else $cbAll.prop("indeterminate", true).prop("checked", true); const $eles = $modal.find(`[data-col="${i}"]`); $eles.toggleVe(rdState.comp._state[prop]); }); }); const $btnCsv = $(``).click(() => { DataUtil.userDownloadText(`${title}.csv`, this._getAsCsv({colTransforms, rdState})); }); const $btnCopy = $(``).click(async () => { await MiscUtil.pCopyTextToClipboard(this._getAsCsv({colTransforms, rdState})); JqueryUtil.showCopiedEffect($btnCopy); }); const $wrpRows = $(`
`); $$($modal)`
${rdState.metasCbs.map(({$wrp}) => $wrp)}
${$btnCsv} ${$btnCopy}

${$wrpRows} `; const tableHtml = this._getTableHtml({rdState, entities, colTransforms, sorter}); $wrpRows.fastSetHtml(tableHtml); } static _getAsCsv ({colTransforms, rdState}) { const headersActive = Object.entries(colTransforms) .map(([prop, meta], ix) => ({name: meta.name, ix, isSelected: rdState.comp._state[prop]})) .filter(({isSelected}) => isSelected); const parser = new DOMParser(); const rows = rdState.rows.map(row => headersActive.map(({ix}) => parser.parseFromString(`
${row[ix]}
`, "text/html").documentElement.textContent)); return DataUtil.getCsv(headersActive.map(({name}) => name), rows); } static _getTableHtml ({rdState, entities, colTransforms, sorter}) { let stack = `${Object.values(colTransforms).map((c, i) => ``).join("")}`; const listCopy = [...entities]; if (sorter) listCopy.sort(sorter); listCopy.forEach(it => { stack += ``; const row = []; stack += Object.keys(colTransforms).map((k, i) => { const c = colTransforms[k]; const val = c.transform == null ? it[k] : c.transform(k[0] === "_" ? it : it[k]); row.push(val); return ``; }).join(""); rdState.rows.push(row); stack += ``; }); stack += `
${c.name}
${val || ""}
`; return stack; } // region Default/generic transforms static COL_TRANSFORM_NAME = {name: "Name"}; static COL_TRANSFORM_SOURCE = {name: "Source", transform: (it) => `${Parser.sourceJsonToAbv(it)}`}; static COL_TRANSFORM_PAGE = {name: "Page"}; // endregion }