"use strict"; class UtilsTableview { static _State = class { constructor () { 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 state = new UtilsTableview._State(); state.metasCbs = Object.values(colTransforms) .map((c, i) => { const $cb = $(``) .click(() => { const $eles = $modal.find(`[data-col="${i}"]`); $eles.toggleVe($cb.prop("checked")); }); const $wrp = $$``; return {$wrp, $cb, name: c.name}; }); const $btnCsv = $(``).click(() => { DataUtil.userDownloadText(`${title}.csv`, this._getAsCsv({state})); }); const $btnCopy = $(``).click(async () => { await MiscUtil.pCopyTextToClipboard(this._getAsCsv({state})); JqueryUtil.showCopiedEffect($btnCopy); }); $$($modal)`
${state.metasCbs.map(({$wrp}) => $wrp)}
${$btnCsv} ${$btnCopy}

`; const tableHtml = this._getTableHtml({state, entities, colTransforms, sorter}); $modal.append(tableHtml); } static _getAsCsv ({state}) { const headersActive = state.metasCbs.map(({$cb, name}, i) => { if (!$cb.prop("checked")) return null; return {name, ix: i}; }).filter(Boolean); const parser = new DOMParser(); const rows = state.rows.map(row => headersActive.map(({ix}) => parser.parseFromString(`
${row[ix]}
`, "text/html").documentElement.textContent)); return DataUtil.getCsv(headersActive.map(({name}) => name), rows); } static _getTableHtml ({state, 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(""); state.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 }