tsgrid-ui 2.9.0 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +121 -40
  2. package/dist/chunks/{chunk-GJD5NFWQ.js → chunk-6MOFFUV2.js} +5 -5
  3. package/dist/chunks/{chunk-YBY52G2U.js → chunk-6UCGFWIQ.js} +19 -3
  4. package/dist/chunks/chunk-6UCGFWIQ.js.map +1 -0
  5. package/dist/chunks/{chunk-BIB3X2TW.js → chunk-DZSFZLV6.js} +2 -2
  6. package/dist/chunks/chunk-EQK6JAHT.js +33 -0
  7. package/dist/chunks/chunk-EQK6JAHT.js.map +1 -0
  8. package/dist/chunks/{chunk-OFASTA2A.js → chunk-FAIRNXQR.js} +46 -6
  9. package/dist/chunks/chunk-FAIRNXQR.js.map +1 -0
  10. package/dist/chunks/{chunk-OMLGN735.js → chunk-GZFWK4LZ.js} +2 -2
  11. package/dist/chunks/{chunk-26XP2XU3.js → chunk-KLJ35UAH.js} +2 -2
  12. package/dist/chunks/chunk-KXOFRWPD.js +8801 -0
  13. package/dist/chunks/chunk-KXOFRWPD.js.map +1 -0
  14. package/dist/chunks/{chunk-EVZMMVXO.js → chunk-LUSNRF73.js} +2 -2
  15. package/dist/chunks/{chunk-WKSLGUB3.js → chunk-N3GASHTI.js} +3 -3
  16. package/dist/field.es6.js +3 -2
  17. package/dist/form.es6.js +6 -5
  18. package/dist/grid.d.ts +4 -0
  19. package/dist/grid.es6.js +14 -0
  20. package/dist/grid.es6.js.map +1 -0
  21. package/dist/layout.d.ts +1 -1
  22. package/dist/layout.es6.js +5 -4
  23. package/dist/popup.d.ts +7 -2
  24. package/dist/popup.es6.js +6 -3
  25. package/dist/sidebar.es6.js +3 -2
  26. package/dist/tabs.es6.js +3 -2
  27. package/dist/toolbar.es6.js +3 -2
  28. package/dist/tooltip.d.ts +9 -1
  29. package/dist/tooltip.es6.js +6 -3
  30. package/dist/tsgrid-BEnny8OX.d.ts +575 -0
  31. package/dist/tsgrid-ui.d.ts +3 -577
  32. package/dist/tsgrid-ui.es6.js +14 -8789
  33. package/dist/tsgrid-ui.es6.js.map +1 -1
  34. package/dist/tsgrid-ui.es6.min.js +33 -33
  35. package/dist/tsgrid-ui.js +55 -6
  36. package/dist/tsgrid-ui.min.js +32 -32
  37. package/dist/tsutils-message-BC0wOHZs.d.ts +82 -0
  38. package/dist/utils.d.ts +1 -1
  39. package/package.json +3 -3
  40. package/dist/chunks/chunk-OFASTA2A.js.map +0 -1
  41. package/dist/chunks/chunk-YBY52G2U.js.map +0 -1
  42. package/dist/metafile-esm.json +0 -1
  43. /package/dist/chunks/{chunk-GJD5NFWQ.js.map → chunk-6MOFFUV2.js.map} +0 -0
  44. /package/dist/chunks/{chunk-BIB3X2TW.js.map → chunk-DZSFZLV6.js.map} +0 -0
  45. /package/dist/chunks/{chunk-OMLGN735.js.map → chunk-GZFWK4LZ.js.map} +0 -0
  46. /package/dist/chunks/{chunk-26XP2XU3.js.map → chunk-KLJ35UAH.js.map} +0 -0
  47. /package/dist/chunks/{chunk-EVZMMVXO.js.map → chunk-LUSNRF73.js.map} +0 -0
  48. /package/dist/chunks/{chunk-WKSLGUB3.js.map → chunk-N3GASHTI.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/grid-columns.ts","../src/grid-state.ts","../src/grid-data.ts","../src/grid-selection.ts","../src/grid-edit.ts","../src/grid-search.ts","../src/grid-interaction.ts","../src/grid-render.ts","../src/tsgrid.ts"],"sourcesContent":["/**\n * grid-columns.ts — Column management sub-module for TsGrid (v2.0)\n *\n * Extracted from src/tsgrid.ts as part of the tsgrid-v2-core structural refactor.\n * Strategy D — Hybrid sibling files: plain functions taking `grid: TsGrid` as first parameter.\n * All method bodies lifted verbatim from TsGrid; `this.X` → `grid.X` mechanically.\n *\n * Design R13: No per-module unit tests. Sub-modules require a full TsGrid instance.\n * Design R8: No helper closures promoted to top-level exports.\n */\n\nimport type { TsGrid } from './tsgrid.js'\nimport type { TsGridColumn } from './tsgrid.js'\nimport { TsUtils } from './tsutils.js'\n\n/** Add one or more columns. If `columns` is omitted, `before` is treated as the column(s) to append. */\n// any: `before` is reassigned inside the body (number | string → number); TS can't narrow post-assignment\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function addColumn(grid: TsGrid, before: any, columns?: any): number {\n let added = 0\n if (columns === undefined) {\n columns = before\n before = grid.columns.length\n } else {\n if (typeof before == 'string') before = grid.getColumn(before, true)\n if (before == null) before = grid.columns.length\n }\n if (!Array.isArray(columns)) columns = [columns]\n for (let i = 0; i < columns.length; i++) {\n const col = TsUtils.extend({}, grid.colTemplate, columns[i])\n grid.columns.splice(before, 0, col)\n // if column is searchable, add search field\n if (columns[i].searchable) {\n let stype = columns[i].searchable\n let attr = ''\n if (columns[i].searchable === true) { stype = 'text'; attr = 'size=\"20\"' }\n grid.addSearch({ field: columns[i].field, label: columns[i].text, type: stype, attr: attr })\n }\n before++\n added++\n }\n grid.refresh()\n return added\n}\n\nexport function removeColumn(grid: TsGrid, ...fields: string[]) {\n let removed = 0\n for (let a = 0; a < fields.length; a++) {\n const field_a = fields[a]!\n for (let r = grid.columns.length-1; r >= 0; r--) {\n if (grid.columns[r]!.field == field_a) {\n if (grid.columns[r]!.searchable) grid.removeSearch(field_a)\n grid.columns.splice(r, 1)\n removed++\n }\n }\n }\n grid.refresh()\n return removed\n}\n\nexport function getColumn(grid: TsGrid): string[]\nexport function getColumn(grid: TsGrid, field: string, returnIndex: true): number | null\nexport function getColumn(grid: TsGrid, field: string, returnIndex?: false): TsGridColumn | null\nexport function getColumn(grid: TsGrid, field?: string, returnIndex?: boolean): string[] | number | TsGridColumn | null {\n // no arguments - return fields of all columns\n if (field === undefined) {\n const ret = []\n for (let i = 0; i < grid.columns.length; i++) ret.push(grid.columns[i]!.field)\n return ret\n }\n // find column\n for (let i = 0; i < grid.columns.length; i++) {\n if (grid.columns[i]!.field == field) {\n if (returnIndex === true) return i; else return grid.columns[i]!\n }\n }\n return null\n}\n\n// any: Record<string, any> — dynamic property bag; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function updateColumn(grid: TsGrid, fields: string | string[], updates: Partial<TsGridColumn> | Record<string, any>) {\n let effected = 0\n fields = (Array.isArray(fields) ? fields : [fields])\n fields.forEach((colName) => {\n grid.columns.forEach((col) => {\n if (col.field == colName) {\n const _updates = TsUtils.clone(updates)\n Object.keys(_updates).forEach((key) => {\n // if it is a function\n if (typeof _updates[key] == 'function') {\n _updates[key] = _updates[key](col)\n }\n if (col[key] != _updates[key]) effected++\n })\n TsUtils.extend(col, _updates)\n }\n })\n })\n if (effected > 0) {\n grid.refresh() // need full refresh due to colgroups not reassigning properly\n }\n return effected\n}\n\nexport function toggleColumn(grid: TsGrid, ...fields: string[]) {\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return grid.updateColumn(fields, { hidden(col: any) { return !col.hidden } })\n}\n\nexport function showColumn(grid: TsGrid, ...fields: string[]) {\n return grid.updateColumn(fields, { hidden: false })\n}\n\nexport function hideColumn(grid: TsGrid, ...fields: string[]) {\n return grid.updateColumn(fields, { hidden: true })\n}\n","/**\n * grid-state.ts — State management sub-module for TsGrid (v2.0)\n *\n * Extracted from src/tsgrid.ts as part of the tsgrid-v2-core structural refactor.\n * Strategy D — Hybrid sibling files: plain functions taking `grid: TsGrid` as first parameter.\n * All method bodies lifted verbatim from TsGrid; `this.X` → `grid.X` mechanically.\n *\n * Design R13: No per-module unit tests. Sub-modules require a full TsGrid instance.\n * Design R8: Lowest shared DAG node — imports NOTHING from other extracted modules.\n */\n\nimport type { TsGrid } from './tsgrid.js'\nimport type { TsGridRecord } from './tsgrid.js'\nimport { TsUtils } from './tsutils.js'\nimport { query as _queryRaw } from './query.js'\n\n// any: Query wrapper used as jQuery-like in TsGrid\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst query = _queryRaw as (...args: any[]) => any\n\nexport function status(grid: TsGrid, msg?: string) {\n if (msg != null) {\n query(grid.box).find(`#grid_${grid.name}_footer`).find('.tsg-footer-left').html(msg)\n } else {\n // show number of selected\n let msgLeft = ''\n const sel = grid.getSelection()\n if (sel.length > 0) {\n if (grid.show.statusSelection && sel.length > 1) {\n msgLeft = String(sel.length).replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, '$1' + TsUtils.settings.groupSymbol) + ' ' + TsUtils.lang('selected')\n }\n if (grid.show.statusRecordID && sel.length == 1) {\n // any: status bar widens recid display to include column for cell mode; mode is detected by typeof\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let tmp: any = sel[0]\n if (typeof tmp == 'object') tmp = tmp.recid + ', '+ TsUtils.lang('Column') +': '+ tmp.column\n msgLeft = TsUtils.lang('Record ID') + ': '+ tmp + ' '\n }\n }\n query(grid.box).find('#grid_'+ grid.name +'_footer .tsg-footer-left').html(msgLeft)\n }\n}\n\nexport function lock(grid: TsGrid, msg?: string, showSpinner?: boolean) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const args: any[] = [grid.box, msg, showSpinner] // any: TsUtils.lock accepts mixed args\n setTimeout(() => {\n // hide empty msg if any\n query(grid.box).find('#grid_'+ grid.name +'_empty_msg').remove()\n // any: cast-to-any for dynamic dispatch; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(TsUtils.lock as any)(...args)\n }, 10)\n}\n\nexport function unlock(grid: TsGrid, speed?: number) {\n setTimeout(() => {\n // do not unlock if there is a message\n if (query(grid.box).find('.tsg-message').hasClass('tsg-closing')) return\n TsUtils.unlock(grid.box, speed)\n }, 25) // needed timer so if server fast, it will not flash\n}\n\n// any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function stateSave(grid: TsGrid, returnOnly: any) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const state: { columns: Record<string, any>[]; show: any; last: any; sortData: any[]; searchData: any[] } = { // any: state blob is serialized JSON\n columns: [],\n show: TsUtils.clone(grid.show),\n last: {\n search: grid.last.search,\n multi : grid.last.multi,\n logic : grid.last.logic,\n label : grid.last.label,\n field : grid.last.field,\n scrollTop : grid.last.vscroll.scrollTop,\n scrollLeft: grid.last.vscroll.scrollLeft\n },\n sortData : [],\n searchData: []\n }\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let prop_val: any\n for (let i = 0; i < grid.columns.length; i++) {\n const col = grid.columns[i]\n // any: Record<string, any> — dynamic property bag; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const col_save_obj: Record<string, any> = {}\n // iterate properties to save\n Object.keys(grid.stateColProps).forEach((prop, _idx) => {\n // any: cast-then-index for dynamic property access; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((grid.stateColProps as any)[prop]){\n // check if the property is defined on the column\n // any: cast-then-index for dynamic property access; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((col as any)[prop] !== undefined){\n // any: cast-then-index for dynamic property access; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n prop_val = (col as any)[prop]\n } else {\n // use fallback or null\n // any: cast-then-index for dynamic property access; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n prop_val = (grid.colTemplate as any)[prop] || null\n }\n col_save_obj[prop] = prop_val\n }\n })\n state.columns.push(col_save_obj)\n }\n for (let i = 0; i < grid.sortData.length; i++) state.sortData.push(TsUtils.clone(grid.sortData[i]))\n for (let i = 0; i < grid.searchData.length; i++) state.searchData.push(TsUtils.clone(grid.searchData[i]))\n // event before\n const edata = grid.trigger('stateSave', { target: grid.name, state: state })\n if (edata.isCancelled === true) {\n return\n }\n // save into local storage\n if (returnOnly !== true) {\n grid.cacheSave('state', state)\n }\n // event after\n edata.finish()\n return state\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function stateRestore(grid: TsGrid, newState?: any) { // any: state blob is serialized JSON\n const url = grid.url?.get ?? grid.url\n if (!newState) {\n newState = grid.cache('state')\n }\n // event before\n const edata = grid.trigger('stateRestore', { target: grid.name, state: newState })\n if (edata.isCancelled === true) {\n return\n }\n // default behavior\n if (TsUtils.isPlainObject(newState)) {\n TsUtils.extend(grid.show, newState.show ?? {})\n TsUtils.extend(grid.last, newState.last ?? {})\n const sTop = grid.last.vscroll.scrollTop\n const sLeft = grid.last.vscroll.scrollLeft\n for (let c = 0; c < newState.columns?.length; c++) {\n const tmp = newState.columns[c]\n const col_index = grid.getColumn(tmp.field, true)\n if (col_index !== null) {\n TsUtils.extend(grid.columns[col_index]!, tmp)\n // restore column order from saved state\n if (c !== col_index) grid.columns.splice(c, 0, grid.columns.splice(col_index, 1)[0]!)\n }\n }\n grid.sortData.splice(0, grid.sortData.length)\n for (let c = 0; c < newState.sortData?.length; c++) {\n grid.sortData.push(newState.sortData[c])\n }\n grid.searchData.splice(0, grid.searchData.length)\n for (let c = 0; c < newState.searchData?.length; c++) {\n grid.searchData.push(newState.searchData[c])\n }\n // apply sort and search\n setTimeout(() => {\n // needs timeout as records need to be populated\n // ez 10.09.2014 this -->\n if (!url) {\n if (grid.sortData.length > 0) grid.localSort()\n if (grid.searchData.length > 0) grid.localSearch()\n }\n grid.last.vscroll.scrollTop = sTop\n grid.last.vscroll.scrollLeft = sLeft\n grid.refresh()\n }, 1)\n console.log(`INFO (TsUi): state restored for \"${grid.name}\"`)\n }\n // event after\n edata.finish()\n return true\n}\n\nexport function stateReset(grid: TsGrid) {\n grid.stateRestore(grid.last.state)\n grid.cacheSave('state', null)\n}\n\n// any: return type any — caller narrows by code path; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseField(grid: TsGrid, obj: TsGridRecord | null | undefined, field: string): any {\n let val\n if (grid.nestedFields) {\n val = TsUtils.getNested(obj, field)\n } else {\n val = obj?.[field]\n }\n return (val != null ? val : '')\n}\n\nexport function prepareData(grid: TsGrid) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const obj = grid\n\n // loops thru records and prepares date and time objects\n for (let r = 0; r < grid.records.length; r++) {\n const rec = grid.records[r]!\n prepareRecord(rec)\n }\n\n // prepare date and time objects for the 'rec' record and its closed children\n function prepareRecord(rec: TsGridRecord): void {\n for (let c = 0; c < obj.columns.length; c++) {\n const column = obj.columns[c]!\n if (rec[column.field] == null || typeof column.render != 'string') continue\n // number\n if (['number', 'int', 'float', 'money', 'currency', 'percent'].indexOf(column.render.split(':')[0] ?? '') != -1) {\n if (typeof rec[column.field] != 'number') rec[column.field] = parseFloat(rec[column.field])\n }\n // date\n if (['date', 'age'].indexOf(column.render.split(':')[0] ?? '') != -1) {\n if (!rec[column.field + '_']) {\n let dt = rec[column.field]\n if (TsUtils.isInt(dt)) dt = parseInt(dt)\n rec[column.field + '_'] = new Date(dt)\n }\n }\n // time\n if (['time'].indexOf(column.render) != -1) {\n if (TsUtils.isTime(rec[column.field])) { // if string\n // any: cast-to-any for return-position narrowing; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tmp = TsUtils.isTime(rec[column.field], true) as any\n const dt = new Date()\n dt.setHours(tmp.hours, tmp.minutes, (tmp.seconds ? tmp.seconds : 0), 0) // sets hours, min, sec, mills\n if (!rec[column.field + '_']) rec[column.field + '_'] = dt\n } else { // if date object\n let tmp = rec[column.field]\n if (TsUtils.isInt(tmp)) tmp = parseInt(tmp)\n tmp = (tmp != null ? new Date(tmp) : new Date())\n const dt = new Date()\n dt.setHours(tmp.getHours(), tmp.getMinutes(), tmp.getSeconds(), 0) // sets hours, min, sec, mills\n if (!rec[column.field + '_']) rec[column.field + '_'] = dt\n }\n }\n }\n\n if (rec.TsUi?.children && rec.TsUi?.expanded !== true) {\n // there are closed children, prepare them too.\n for (let r = 0; r < rec.TsUi.children.length; r++) {\n const subRec = rec.TsUi.children[r]!\n prepareRecord(subRec)\n }\n }\n }\n}\n\nexport function nextCell(grid: TsGrid, index: number, col_ind: number, editable?: boolean): { index: number; colIndex: number } | null {\n const check = col_ind + 1\n if (check >= grid.columns.length) {\n const nextIdx = grid.nextRow(index)\n return nextIdx == null ? null : grid.nextCell(nextIdx, -1, editable)\n }\n const tmp = grid.records[index]?.TsUi\n const col = grid.columns[check]\n const span = (tmp && tmp['colspan'] && col != null && !isNaN(tmp['colspan'][col.field]) ? parseInt(tmp['colspan'][col.field]) : 1)\n if (col == null) return null\n if (col && col.hidden || span === 0) return grid.nextCell(index, check, editable)\n if (editable) {\n const edit = grid.getCellEditable(index, check)\n if (edit == null || ['checkbox', 'check'].indexOf(edit.type) != -1) {\n return grid.nextCell(index, check, editable)\n }\n }\n return { index, colIndex: check }\n}\n\nexport function prevCell(grid: TsGrid, index: number, col_ind: number, editable?: boolean): { index: number; colIndex: number } | null {\n const check = col_ind - 1\n if (check < 0) {\n const prevIdx = grid.prevRow(index)\n return prevIdx == null ? null : grid.prevCell(prevIdx, grid.columns.length, editable)\n }\n if (check < 0) return null\n const tmp = grid.records[index]?.TsUi\n const col = grid.columns[check]\n const span = (tmp && tmp['colspan'] && col != null && !isNaN(tmp['colspan'][col.field]) ? parseInt(tmp['colspan'][col.field]) : 1)\n if (col == null) return null\n if (col && col.hidden || span === 0) return grid.prevCell(index, check, editable)\n if (editable) {\n const edit = grid.getCellEditable(index, check)\n if (edit == null || ['checkbox', 'check'].indexOf(edit.type) != -1) {\n return grid.prevCell(index, check, editable)\n }\n }\n return { index, colIndex: check }\n}\n\nexport function nextRow(grid: TsGrid, ind: number, col_ind?: number, numRows?: number): number | null {\n const sids = grid.last.searchIds\n let ret = null\n if (numRows == null) numRows = 1\n if (numRows == -1) {\n return grid.records.length-1\n }\n if ((ind + numRows < grid.records.length && sids.length === 0) // if there are more records\n || (sids.length > 0 && ind < (sids[sids.length-numRows] ?? 0))) {\n ind += numRows\n if (sids.length > 0) while (true) {\n if (sids.includes(ind) || ind > grid.records.length) break\n ind += numRows\n }\n // colspan\n const tmp = grid.records[ind]?.TsUi\n const col = col_ind != null ? grid.columns[col_ind] : undefined\n const span = (tmp && tmp['colspan'] && col != null && !isNaN(tmp['colspan'][col.field]) ? parseInt(tmp['colspan'][col.field]) : 1)\n if (span === 0 || tmp?.selectable === false) {\n ret = grid.nextRow(ind, col_ind, numRows)\n } else {\n ret = ind\n }\n }\n return ret\n}\n\nexport function prevRow(grid: TsGrid, ind: number, col_ind?: number, numRows?: number): number | null {\n const sids = grid.last.searchIds\n let ret = null\n if (numRows == null) numRows = 1\n if (numRows == -1) {\n return 0\n }\n if ((ind - numRows >= 0 && sids.length === 0) // if there are more records\n || (sids.length > 0 && ind > (sids[0] ?? 0))) {\n ind -= numRows\n if (sids.length > 0) while (true) {\n if (sids.includes(ind) || ind < 0) break\n ind -= numRows\n }\n // colspan\n const tmp = grid.records[ind]?.TsUi\n const col = col_ind != null ? grid.columns[col_ind] : undefined\n const span = (tmp && tmp['colspan'] && col != null && !isNaN(tmp['colspan'][col.field]) ? parseInt(tmp['colspan'][col.field]) : 1)\n if (span === 0 || tmp?.selectable === false) {\n ret = grid.prevRow(ind, col_ind, numRows)\n if (ret == null) ret = ind\n } else {\n ret = ind\n }\n }\n return ret\n}\n\nexport function selectionSave(grid: TsGrid) {\n grid.last.saved_sel = grid.getSelection()\n return grid.last.saved_sel\n}\n\nexport function selectionRestore(grid: TsGrid, noRefresh?: boolean) {\n const time = Date.now()\n grid.last.selection = { indexes: [], columns: {} }\n const sel = grid.last.selection\n const lst = grid.last.saved_sel\n if (lst) for (let i = 0; i < lst.length; i++) {\n if (TsUtils.isPlainObject(lst[i])) {\n // selectType: cell\n const tmp = grid.get(lst[i].recid, true)\n if (tmp != null) {\n if (sel.indexes.indexOf(tmp) == -1) sel.indexes.push(tmp)\n if (!sel.columns[tmp]) sel.columns[tmp] = []\n sel.columns[tmp].push(lst[i].column)\n }\n } else {\n // selectType: row\n const tmp = grid.get(lst[i], true)\n if (tmp != null) sel.indexes.push(tmp)\n }\n }\n delete grid.last.saved_sel\n if (noRefresh !== true) grid.refresh()\n return Date.now() - time\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function message(grid: TsGrid, options?: any) { // any: message options vary by type (string, object)\n return TsUtils.message({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n owner: grid as any, // any: TsGrid.lock signature differs from owner.lock type\n box : grid.box,\n after: '.tsg-grid-header'\n }, options)\n}\n\n// any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function confirm(grid: TsGrid, options: any) {\n return TsUtils.confirm({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n owner: grid as any, // any: TsGrid.lock signature differs from owner.lock type\n box : grid.box,\n after: '.tsg-grid-header'\n }, options)\n}\n","/**\n * grid-data.ts — Data management sub-module for TsGrid (v2.0)\n *\n * Extracted from src/tsgrid.ts as part of the tsgrid-v2-core structural refactor.\n * Strategy D — Hybrid sibling files: plain functions taking `grid: TsGrid` as first parameter.\n * All method bodies lifted verbatim from TsGrid; `this.X` → `grid.X` (or `self.X`/`obj.X`) mechanically.\n *\n * Design R13: No per-module unit tests. Sub-modules require a full TsGrid instance.\n * Design R3: FORBIDDEN to import grid-search.ts — cross-domain calls go through grid.X() delegators.\n */\n\nimport type { TsGrid } from './tsgrid.js'\nimport type { TsGridRecord, TsGridColumn, TsGridSearch, TsGridRange } from './tsgrid.js'\nimport { TsUtils } from './tsutils.js'\nimport { query as _queryRaw } from './query.js'\n\n// any: Query wrapper used as jQuery-like in TsGrid\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst query = _queryRaw as (...args: any[]) => any\n\nexport function add(grid: TsGrid, record: TsGridRecord | TsGridRecord[], first?: boolean): number {\n if (!Array.isArray(record)) record = [record]\n let added = 0\n for (let i = 0; i < record.length; i++) {\n const rec = record[i]!\n if (grid.recid != null && rec[grid.recid] != null) {\n rec.recid = rec[grid.recid!]\n }\n if (rec.recid == null) {\n console.log('ERROR: Cannot add record without recid. (obj: '+ grid.name +')')\n continue\n }\n if (rec.TsUi?.summary === true) {\n if (first) grid.summary.unshift(rec); else grid.summary.push(rec)\n } else {\n if (first) grid.records.unshift(rec); else grid.records.push(rec)\n }\n added++\n }\n grid.processGroupBy()\n const url = grid.url?.get ?? grid.url\n if (!url) {\n grid.total = grid.records.length\n grid.localSort(false, true)\n grid.localSearch()\n // only refresh if it is in virtual view\n const indStart = grid.records.length - record.length\n const indEnd = indStart + record.length\n if ((grid.last.vscroll.recIndStart ?? 0) <= indEnd && (grid.last.vscroll.recIndEnd ?? 0) >= indStart) {\n grid.refresh()\n } else {\n // just update total if it it there\n query(grid.box)\n .find('#grid_'+ grid.name + '_footer .tsg-footer-right .tsg-total')\n .html(TsUtils.formatNumber(grid.total))\n }\n } else {\n grid.refresh()\n }\n return added\n}\n\n// any: Record<string, any> — dynamic property bag; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function find(grid: TsGrid, obj?: Record<string, any>, returnIndex?: boolean, displayedOnly?: boolean): (string | number)[] {\n // any: obj values are user-supplied record field values for matching\n if (obj == null) obj = {}\n const recs = []\n let hasDots = false\n // check if property is nested - needed for speed\n for (const o in obj) if (String(o).indexOf('.') != -1) hasDots = true\n // look for an item\n const start = displayedOnly ? (grid.last.vscroll.recIndStart ?? 0) : 0\n let end = displayedOnly ? (grid.last.vscroll.recIndEnd ?? grid.records.length) + 1: grid.records.length\n if (end > grid.records.length) end = grid.records.length\n for (let i = start; i < end; i++) {\n const rec_i = grid.records[i]!\n let match = true\n for (const o in obj) {\n let val = rec_i[o]\n if (hasDots && String(o).indexOf('.') != -1) val = grid.parseField(rec_i, o)\n if (obj[o] == 'not-null') {\n if (val == null || val === '') match = false\n } else {\n if (obj[o] != val) match = false\n }\n }\n if (match && returnIndex !== true) recs.push(rec_i.recid)\n if (match && returnIndex === true) recs.push(i)\n }\n return recs\n}\n\n// does not delete existing, but overrides on top of it\n// Overload: set(recid, record, noRefresh?) or set(record, noRefresh?) — shifts args when recid is object\n// any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function set(grid: TsGrid, recid: any, record?: any, noRefresh?: boolean): boolean {\n if ((typeof recid == 'object') && (recid !== null)) {\n noRefresh = record\n record = recid\n recid = null\n }\n // update all records\n if (recid == null) {\n for (let i = 0; i < grid.records.length; i++) {\n TsUtils.extend(grid.records[i], record) // recid is the whole record\n }\n if (noRefresh !== true) grid.refresh()\n } else { // find record to update\n const ind = grid.get(recid, true)\n if (ind == null) return false\n const isSummary = (grid.records[ind]?.recid == recid ? false : true)\n if (isSummary) {\n TsUtils.extend(grid.summary[ind], record)\n } else {\n TsUtils.extend(grid.records[ind], record)\n }\n if (noRefresh !== true) grid.refreshRow(recid, ind) // refresh only that record\n }\n grid.processGroupBy()\n return true\n}\n\n// replaces existing record\nexport function replace(grid: TsGrid, recid: string | number, record: TsGridRecord, noRefresh?: boolean): boolean {\n const ind = grid.get(recid, true)\n if (ind == null) return false\n const isSummary = (grid.records[ind]?.recid == recid ? false : true)\n if (isSummary) {\n grid.summary[ind] = record\n } else {\n grid.records[ind] = record\n }\n if (noRefresh !== true) grid.refreshRow(recid, ind) // refresh only that record\n grid.processGroupBy()\n return true\n}\n\nexport function get(grid: TsGrid, recid: (string | number)[], returnIndex?: boolean): (TsGridRecord | number)[]\nexport function get(grid: TsGrid, recid: string | number, returnIndex: true): number | null\nexport function get(grid: TsGrid, recid: string | number, returnIndex?: false): TsGridRecord | null\nexport function get(grid: TsGrid, recid: string | number | (string | number)[], returnIndex?: boolean): TsGridRecord | (TsGridRecord | number)[] | number | null {\n // search records\n if (Array.isArray(recid)) {\n const recs = []\n for (let i = 0; i < recid.length; i++) {\n // any: this-cast for legacy widget self-reference; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = (grid as any).get(recid[i], returnIndex)\n if (v !== null)\n recs.push(v)\n }\n return recs\n } else {\n // get() must be fast, implements a cache to bypass loop over all records\n // most of the time.\n let idCache = grid.last.idCache\n if (!idCache) {\n grid.last.idCache = idCache = {}\n }\n let i = idCache[recid]\n if (typeof(i) === 'number') {\n if (i >= 0 && i < grid.records.length && grid.records[i]!.recid == recid) {\n if (returnIndex === true) return i; else return grid.records[i]!\n }\n // summary indexes are stored as negative numbers, try them now.\n i = ~i\n if (i >= 0 && i < grid.summary.length && grid.summary[i]!.recid == recid) {\n if (returnIndex === true) return i; else return grid.summary[i]!\n }\n // wrong index returned, clear cache\n grid.last.idCache = idCache = {}\n }\n for (let i = 0; i < grid.records.length; i++) {\n if (grid.records[i]!.recid == recid) {\n idCache[recid] = i\n if (returnIndex === true) return i; else return grid.records[i]!\n }\n }\n // search summary\n for (let i = 0; i < grid.summary.length; i++) {\n if (grid.summary[i]!.recid == recid) {\n idCache[recid] = ~i\n if (returnIndex === true) return i; else return grid.summary[i]!\n }\n }\n return null\n }\n}\n\nexport function remove(grid: TsGrid, ...recids: (string | number)[]): number {\n let removed = 0\n for (let a = 0; a < recids.length; a++) {\n for (let r = grid.records.length-1; r >= 0; r--) {\n if (grid.records[r]!.recid == recids[a]) { grid.records.splice(r, 1); removed++ }\n }\n for (let r = grid.summary.length-1; r >= 0; r--) {\n if (grid.summary[r]!.recid == recids[a]) { grid.summary.splice(r, 1); removed++ }\n }\n }\n const url = grid.url?.get ?? grid.url\n if (!url) {\n grid.localSort(false, true)\n grid.localSearch()\n grid.total = grid.records.length\n }\n grid.refresh()\n return removed\n}\n\n/**\n * If there is a grid.groupBy, then process all records with that in mind. It will remember groups in grid.last.groupBy_links, that\n * needs to be cleared when record is cleared\n */\nexport function processGroupBy(grid: TsGrid): void {\n if (grid.groupBy == null) return\n const groupBy = grid.groupBy\n // any: array of heterogeneous runtime values; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const new_records: any[] = []\n grid.records.forEach(rec => {\n const group = rec[groupBy.field]\n if (group != null) {\n if (grid.last.groupBy_links[group] == null) {\n // any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const gr: any = { recid: 'group-'+ group, group, TsUi: { ...groupBy, children: [] } }\n grid.last.groupBy_links[group] = gr\n delete gr.TsUi!['field'] // no need for this field\n new_records.push(gr)\n }\n rec[groupBy.field] = ''\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(grid.last.groupBy_links[group] as any).TsUi.children.push(rec) // any: groupBy_links values are TsGridRecord with TsUi.children\n }\n })\n grid.records = new_records\n if (grid.total !== -1) {\n grid.total = grid.records.length\n }\n}\n\nexport function localSort(grid: TsGrid, silent?: boolean, noResetRefresh?: boolean) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const obj = grid\n const url = grid.url?.get ?? grid.url\n if (url) {\n console.log('ERROR: grid.localSort can only be used on local data source, grid.url should be empty.')\n return 0 // time it took\n }\n if (Object.keys(grid.sortData).length === 0) {\n // restore original sorting\n const os = grid.last.originalSort\n if (os) {\n grid.records.sort((a, b) => {\n const aInd = os.indexOf(a.recid)\n const bInd = os.indexOf(b.recid)\n // order cann be equal, so, no need to return 0\n return aInd > bInd ? 1 : -1\n })\n }\n return 0 // time it took\n }\n let time = Date.now()\n // process date fields\n grid.selectionSave()\n grid.prepareData()\n if (!noResetRefresh) {\n grid.reset()\n }\n // process sortData\n for (let i = 0; i < grid.sortData.length; i++) {\n const sortItem = grid.sortData[i]!\n const column = grid.getColumn(sortItem.field) as TsGridColumn | null\n if (!column) return // TODO: ability to sort columns when they are not part of colums array\n if (typeof column.render == 'string') {\n const renderType = column.render.split(':')[0] ?? ''\n if (['date', 'age'].indexOf(renderType) != -1) {\n sortItem.field_ = column.field + '_'\n }\n if (['time'].indexOf(renderType) != -1) {\n sortItem.field_ = column.field + '_'\n }\n }\n }\n\n // prepare paths and process sort\n preparePaths()\n grid.records.sort((a, b) => {\n return compareRecordPaths(a, b)\n })\n cleanupPaths()\n\n grid.selectionRestore(noResetRefresh)\n time = Date.now() - time\n if (silent !== true && grid.show.statusSort) {\n setTimeout(() => {\n grid.status(TsUtils.lang('Sorting took ${count} seconds', { count: time/1000 }))\n }, 10)\n }\n return time\n\n // grab paths before sorting for efficiency and because calling obj.get()\n // while sorting 'obj.records' is unsafe, at least on webkit\n function preparePaths(): void {\n for (let i = 0; i < obj.records.length; i++) {\n const rec = obj.records[i]!\n if (rec.TsUi?.parent_recid != null) {\n rec.TsUi['_path'] = getRecordPath(rec)\n }\n }\n }\n\n // cleanup and release memory allocated by preparePaths()\n function cleanupPaths(): void {\n for (let i = 0; i < obj.records.length; i++) {\n const rec = obj.records[i]!\n if (rec.TsUi?.parent_recid != null) {\n rec.TsUi['_path'] = null\n }\n }\n }\n\n // compare two paths, from root of tree to given records\n function compareRecordPaths(a: TsGridRecord, b: TsGridRecord): number {\n if ((!a.TsUi || a.TsUi.parent_recid == null) && (!b.TsUi || b.TsUi.parent_recid == null)) {\n return compareRecords(a, b) // no tree, fast path\n }\n const pa = getRecordPath(a)\n const pb = getRecordPath(b)\n for (let i = 0; i < Math.min(pa.length, pb.length); i++) {\n const diff = compareRecords(pa[i]!, pb[i]!)\n if (diff !== 0) return diff // different subpath\n }\n if (pa.length > pb.length) return 1\n if (pa.length < pb.length) return -1\n console.log('ERROR: two paths should not be equal.')\n return 0\n }\n\n // return an array of all records from root to and including 'rec'\n function getRecordPath(rec: TsGridRecord): TsGridRecord[] {\n if (!rec.TsUi || rec.TsUi.parent_recid == null) return [rec]\n if (rec.TsUi['_path'])\n return rec.TsUi['_path'] as TsGridRecord[]\n // during actual sort, we should never reach this point\n const subrec = obj.get(rec.TsUi.parent_recid)\n if (!subrec) {\n console.log('ERROR: no parent record: ' + rec.TsUi.parent_recid)\n return [rec]\n }\n return (getRecordPath(subrec).concat(rec))\n }\n\n // compare two records according to sortData and finally recid\n function compareRecords(a: TsGridRecord, b: TsGridRecord): number {\n if (a === b) return 0 // optimize, same object\n for (let i = 0; i < obj.sortData.length; i++) {\n const sortItem = obj.sortData[i]!\n const fld = sortItem.field\n const sortFld = sortItem.field_ ? sortItem.field_! : fld\n // any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let aa: any = a[sortFld]\n // any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let bb: any = b[sortFld]\n if (String(fld).indexOf('.') != -1) {\n aa = obj.parseField(a, sortFld)\n bb = obj.parseField(b, sortFld)\n }\n const col = obj.getColumn(fld) as TsGridColumn | null\n if (col && col['editable'] && Object.keys(col['editable']).length > 0) { // for drop editable fields and drop downs\n if (TsUtils.isPlainObject(aa) && aa.text) aa = aa.text\n if (TsUtils.isPlainObject(bb) && bb.text) bb = bb.text\n }\n const ret = compareCells(aa, bb, i, sortItem.direction, col?.sortMode || 'default')\n if (ret !== 0) return ret\n }\n // break tie for similar records,\n // required to have consistent ordering for tree paths\n const ret = compareCells(a.recid, b.recid, -1, 'asc')\n return ret\n }\n\n // compare two values, aa and bb, producing consistent ordering\n // any: aa/bb are record field values — dynamic types (string | number | Date | object)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function compareCells(aa: any, bb: any, i: number, direction: string, sortMode?: string | ((a: any, b: any) => number)) {\n // if both objects are strictly equal, we're done\n if (aa === bb)\n return 0\n const dir = (direction.toLowerCase() === 'asc') ? 1 : -1\n\n // if we have comparison callback, let it make all decisions,\n // including how nulls sort\n if (typeof sortMode == 'function') {\n return sortMode(aa, bb) * dir\n }\n\n // all nulls, empty and undefined on bottom\n if ((aa == null || aa === '') && (bb != null && bb !== ''))\n return 1\n if ((aa != null && aa !== '') && (bb == null || bb === ''))\n return -1\n // for different kind of objects, sort by object type\n if (typeof aa != typeof bb)\n return (typeof aa > typeof bb) ? dir : -dir\n // for different kind of classes, sort by classes\n if (aa.constructor.name != bb.constructor.name)\n return (aa.constructor.name > bb.constructor.name) ? dir : -dir\n // if we're dealing with non-null objects, call valueOf().\n // this mean that Date() or custom objects will compare properly.\n if (aa && typeof aa == 'object')\n aa = aa.valueOf()\n if (bb && typeof bb == 'object')\n bb = bb.valueOf()\n // if we're still dealing with non-null objects that have\n // a useful Object => String conversion, convert to string.\n const defaultToString = {}.toString\n if (aa && typeof aa == 'object' && aa.toString != defaultToString)\n aa = String(aa)\n if (bb && typeof bb == 'object' && bb.toString != defaultToString)\n bb = String(bb)\n // do case-insensitive string comparison\n if (typeof aa == 'string')\n aa = aa.toLowerCase().trim()\n if (typeof bb == 'string')\n bb = bb.toLowerCase().trim()\n\n switch (sortMode) {\n case 'natural':\n sortMode = TsUtils.naturalCompare\n break\n case 'i18n':\n sortMode = TsUtils.i18nCompare\n break\n }\n\n if (typeof sortMode == 'function') {\n return sortMode(aa,bb) * dir\n }\n\n // compare both objects\n if (aa > bb)\n return dir\n if (aa < bb)\n return -dir\n return 0\n }\n}\n\nexport function localSearch(grid: TsGrid, silent?: boolean) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const obj = grid\n const url = grid.url?.get ?? grid.url\n if (url) {\n console.log('ERROR: grid.localSearch can only be used on local data source, grid.url should be empty.')\n return\n }\n let time = Date.now()\n const defaultToString = {}.toString\n const duplicateMap: Record<string | number, boolean> = {}\n grid.total = grid.records.length\n // mark all records as shown\n grid.last.searchIds = []\n // prepare date/time fields\n grid.prepareData()\n // hide records that did not match\n if (grid.searchData.length > 0 && !url) {\n grid.total = 0\n for (let i = 0; i < grid.records.length; i++) {\n const rec = grid.records[i]!\n const match = searchRecord(rec)\n if (match) {\n if (rec?.TsUi) addParent(rec.TsUi.parent_recid ?? null)\n if (grid.showExtraOnSearch > 0) {\n let before = grid.showExtraOnSearch\n let after = grid.showExtraOnSearch\n if (i < before) before = i\n if (i + after > grid.records.length) after = grid.records.length - i\n if (before > 0) {\n for (let j = i - before; j < i; j++) {\n if (grid.last.searchIds.indexOf(j) < 0)\n grid.last.searchIds.push(j)\n }\n }\n if (grid.last.searchIds.indexOf(i) < 0) grid.last.searchIds.push(i)\n if (after > 0) {\n for (let j = (i + 1) ; j <= (i + after) ; j++) {\n if (grid.last.searchIds.indexOf(j) < 0) grid.last.searchIds.push(j)\n }\n }\n } else {\n grid.last.searchIds.push(i)\n }\n }\n }\n grid.total = grid.last.searchIds.length\n }\n time = Date.now() - time\n if (silent !== true && grid.show.statusSearch) {\n setTimeout(() => {\n grid.status(TsUtils.lang('Search took ${count} seconds', { count: time/1000 }))\n }, 10)\n }\n return time\n\n // check if a record (or one of its closed children) matches the search data\n function searchRecord(rec: TsGridRecord): boolean {\n let fl = 0, val1, val2, val3, tmp\n let orEqual = false\n for (let j = 0; j < obj.searchData.length; j++) {\n const sdata = obj.searchData[j]\n if (sdata == null) continue\n let search = obj.getSearch(sdata.field) as TsGridSearch | null\n if (search == null) search = { field: sdata.field, type: sdata.type } as TsGridSearch\n // поиск среди изменений\n const val1b = rec.TsUi?.['changes']?.[search.field] ?? obj.parseField(rec, search.field)\n val1 = (val1b != null && (typeof val1b != 'object' || val1b.toString != defaultToString))\n ? String(val1b).toLowerCase()\n : '' // do not match a bogus string\n if (sdata['value'] != null) {\n if (!Array.isArray(sdata['value'])) {\n val2 = String(sdata['value']).toLowerCase()\n } else {\n val2 = sdata['value'][0]\n val3 = sdata['value'][1]\n }\n }\n switch (sdata['operator']) {\n case '=':\n case 'is':\n if (val1b == sdata['value'] || String(val1b) == sdata['value']) fl++ // do not hide record\n else if (search.type == 'date') {\n tmp = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field))\n val1 = TsUtils.formatDate(tmp, 'yyyy-mm-dd')\n val2 = TsUtils.formatDate(TsUtils.isDate(val2, TsUtils.settings.dateFormat, true), 'yyyy-mm-dd')\n if (val1 == val2) fl++\n }\n else if (search.type == 'time') {\n tmp = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field))\n val1 = TsUtils.formatTime(tmp, 'hh24:mi')\n val2 = TsUtils.formatTime(val2, 'hh24:mi')\n if (val1 == val2) fl++\n }\n else if (search.type == 'datetime') {\n tmp = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field))\n val1 = TsUtils.formatDateTime(tmp, 'yyyy-mm-dd|hh24:mm:ss')\n val2 = TsUtils.formatDateTime(TsUtils.isDateTime(val2, TsUtils.settings.datetimeFormat, true), 'yyyy-mm-dd|hh24:mm:ss')\n if (val1 == val2) fl++\n }\n break\n case 'is not':\n case '!=':\n if (val1b != sdata['value'] && String(val1b) != sdata['value']) fl++\n break\n case 'between':\n if (['int', 'float', 'money', 'currency', 'percent'].indexOf(search.type) != -1) {\n if (parseFloat(obj.parseField(rec, search.field)) >= parseFloat(val2) && parseFloat(obj.parseField(rec, search.field)) <= parseFloat(val3)) fl++\n }\n else if (search.type == 'date') {\n tmp = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field))\n val1 = TsUtils.isDate(tmp, TsUtils.settings.dateFormat, true)\n val2 = TsUtils.isDate(val2, TsUtils.settings.dateFormat, true)\n val3 = TsUtils.isDate(val3, TsUtils.settings.dateFormat, true)\n if (val3 instanceof Date) val3 = new Date((val3 as Date).getTime() + 86400000) // 1 day\n if (val1 >= val2 && val1 < val3) fl++\n }\n else if (search.type == 'time') {\n val1 = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field))\n val2 = TsUtils.isTime(val2, true)\n val3 = TsUtils.isTime(val3, true)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const t2 = val2 as any // any: isTime(,true) returns TsTimeResult but union type is bool|TsTimeResult\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const t3 = val3 as any // any: isTime(,true) returns TsTimeResult but union type is bool|TsTimeResult\n val2 = (new Date()).setHours(t2.hours, t2.minutes, t2.seconds ? t2.seconds : 0, 0)\n val3 = (new Date()).setHours(t3.hours, t3.minutes, t3.seconds ? t3.seconds : 0, 0)\n if (val1 >= val2 && val1 < val3) fl++\n }\n else if (search.type == 'datetime') {\n val1 = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field))\n val2 = TsUtils.isDateTime(val2, TsUtils.settings.datetimeFormat, true)\n val3 = TsUtils.isDateTime(val3, TsUtils.settings.datetimeFormat, true)\n if (val3 instanceof Date) val3 = new Date((val3 as Date).getTime() + 86400000) // 1 day\n if (val1 >= val2 && val1 < val3) fl++\n }\n break\n case '<=':\n orEqual = true\n case '<':\n case 'less':\n if (['int', 'float', 'money', 'currency', 'percent'].indexOf(search.type) != -1) {\n val1 = parseFloat(obj.parseField(rec, search.field))\n val2 = parseFloat(sdata['value'])\n if (val1 < val2 || (orEqual && val1 === val2)) fl++\n }\n else if (search.type == 'date') {\n tmp = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field))\n val1 = TsUtils.isDate(tmp, TsUtils.settings.dateFormat, true)\n val2 = TsUtils.isDate(val2, TsUtils.settings.dateFormat, true)\n if (val1 < val2 || (orEqual && val1 === val2)) fl++\n }\n else if (search.type == 'time') {\n tmp = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field))\n val1 = TsUtils.formatTime(tmp, 'hh24:mi')\n val2 = TsUtils.formatTime(val2, 'hh24:mi')\n if (val1 < val2 || (orEqual && val1 === val2)) fl++\n }\n else if (search.type == 'datetime') {\n tmp = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field))\n val1 = TsUtils.formatDateTime(tmp, 'yyyy-mm-dd|hh24:mm:ss')\n val2 = TsUtils.formatDateTime(TsUtils.isDateTime(val2, TsUtils.settings.datetimeFormat, true), 'yyyy-mm-dd|hh24:mm:ss')\n if (val1.length == val2.length && (val1 < val2 || (orEqual && val1 === val2))) fl++\n }\n break\n case '>=':\n orEqual = true\n case '>':\n case 'more':\n if (['int', 'float', 'money', 'currency', 'percent'].indexOf(search.type) != -1) {\n val1 = parseFloat(obj.parseField(rec, search.field))\n val2 = parseFloat(sdata['value'])\n if (val1 > val2 || (orEqual && val1 === val2)) fl++\n }\n else if (search.type == 'date') {\n tmp = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field))\n val1 = TsUtils.isDate(tmp, TsUtils.settings.dateFormat, true)\n val2 = TsUtils.isDate(val2, TsUtils.settings.dateFormat, true)\n if (val1 > val2 || (orEqual && val1 === val2)) fl++\n }\n else if (search.type == 'time') {\n tmp = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field))\n val1 = TsUtils.formatTime(tmp, 'hh24:mi')\n val2 = TsUtils.formatTime(val2, 'hh24:mi')\n if (val1 > val2 || (orEqual && val1 === val2)) fl++\n }\n else if (search.type == 'datetime') {\n tmp = (obj.parseField(rec, search.field + '_') instanceof Date ? obj.parseField(rec, search.field + '_') : obj.parseField(rec, search.field))\n val1 = TsUtils.formatDateTime(tmp, 'yyyy-mm-dd|hh24:mm:ss')\n val2 = TsUtils.formatDateTime(TsUtils.isDateTime(val2, TsUtils.settings.datetimeFormat, true), 'yyyy-mm-dd|hh24:mm:ss')\n if (val1.length == val2.length && (val1 > val2 || (orEqual && val1 === val2))) fl++\n }\n break\n case 'in':\n tmp = sdata['value']\n if (sdata['svalue']) tmp = sdata['svalue']\n if ((tmp.indexOf(TsUtils.isFloat(val1b) ? parseFloat(val1b) : val1b) !== -1) || (tmp.indexOf(val1) !== -1 && val1 !== '')) fl++\n break\n case 'not in':\n tmp = sdata['value']\n if (sdata['svalue']) tmp = sdata['svalue']\n if (!((tmp.indexOf(TsUtils.isFloat(val1b) ? parseFloat(val1b) : val1b) !== -1) || (tmp.indexOf(val1) !== -1 && val1 !== ''))) fl++\n break\n case 'begins':\n case 'begins with': // need for back compatibility\n if (val1.indexOf(val2) === 0) fl++ // do not hide record\n break\n case 'contains':\n if (val1.indexOf(val2) >= 0) fl++ // do not hide record\n break\n case 'null':\n if (obj.parseField(rec, search.field) == null) fl++ // do not hide record\n break\n case 'not null':\n if (obj.parseField(rec, search.field) != null) fl++ // do not hide record\n break\n case 'ends':\n case 'ends with': // need for back compatibility\n const lastIndex = val1.lastIndexOf(val2)\n if (lastIndex !== -1 && lastIndex == val1.length - val2.length) fl++ // do not hide record\n break\n }\n }\n if ((obj.last.logic == 'OR' && fl !== 0) || (obj.last.logic == 'AND' && fl == obj.searchData.length)) {\n return true\n }\n if (rec.TsUi?.children && rec.TsUi?.expanded !== true) {\n // there are closed children, search them too.\n for (let r = 0; r < rec.TsUi.children.length; r++) {\n const subRec = rec.TsUi.children[r]!\n if (searchRecord(subRec)) {\n return true\n }\n }\n }\n return false\n }\n\n // add parents nodes recursively\n function addParent(recid: string | number | null): void {\n if (recid == null) return\n const i = obj.get(recid, true)\n if (i == null || duplicateMap[recid] || obj.last.searchIds.includes(i)) {\n return\n }\n duplicateMap[recid] = true\n const rec = obj.records[i]!\n if (rec?.TsUi) {\n addParent(rec.TsUi.parent_recid ?? null)\n }\n obj.last.searchIds.push(i)\n }\n}\n\n// any: array of heterogeneous runtime values; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getRangeData(grid: TsGrid, range: [{ recid: string | number; column: number }, { recid: string | number; column: number }], extra?: boolean): any[] {\n const rec1 = grid.get(range[0]!.recid, true) ?? 0\n const rec2 = grid.get(range[1]!.recid, true) ?? 0\n const col1 = range[0]!.column\n const col2 = range[1]!.column\n\n const res = []\n if (col1 == col2) { // one column\n for (let r = Math.min(rec1, rec2); r <= Math.max(rec1, rec2); r++) {\n const record = grid.records[r]!\n const dt = record[grid.columns[col1]!.field] || null\n if (extra !== true) {\n res.push(dt)\n } else {\n res.push({ data: dt, column: col1, index: r, record: record })\n }\n }\n } else if (rec1 == rec2) { // one row\n const record = grid.records[rec1]!\n for (let i = Math.min(col1, col2); i <= Math.max(col1, col2); i++) {\n const dt = record[grid.columns[i]!.field] || null\n if (extra !== true) {\n res.push(dt)\n } else {\n res.push({ data: dt, column: i, index: rec1, record: record })\n }\n }\n } else {\n for (let r = Math.min(rec1, rec2); r <= Math.max(rec1, rec2); r++) {\n const record = grid.records[r]!\n // any: array of heterogeneous runtime values; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const rowData: any[] = []\n res.push(rowData)\n for (let i = Math.min(col1, col2); i <= Math.max(col1, col2); i++) {\n const dt = record[grid.columns[i]!.field]\n if (extra !== true) {\n rowData.push(dt)\n } else {\n rowData.push({ data: dt, column: i, index: r, record: record })\n }\n }\n }\n }\n return res\n}\n\n// any: addRange accepts string 'selection' shorthand, single range object, or array of ranges\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function addRange(grid: TsGrid, rangesInput: TsGridRange | TsGridRange[] | string | Record<string, any>): number {\n let added = 0, first, last\n if (grid.selectType == 'row') return added\n // any: cast-then-index for dynamic property access; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ranges: any[] = !Array.isArray(rangesInput) ? [rangesInput] : rangesInput as any[]\n // if it is selection\n for (let i = 0; i < ranges.length; i++) {\n if (typeof ranges[i] != 'object') ranges[i] = { name: 'selection' }\n if (ranges[i].name == 'selection') {\n if (grid.show.selectionBorder === false) continue\n const sel = grid.getSelection()\n if (sel.length === 0) {\n grid.removeRange('selection')\n continue\n } else {\n first = sel[0]\n last = sel[sel.length-1]\n }\n } else { // other range\n first = ranges[i].range[0]\n last = ranges[i].range[1]\n }\n if (first) {\n const rg = {\n name: ranges[i].name,\n range: [{ recid: first.recid, column: first.column }, { recid: last.recid, column: last.column }],\n style: ranges[i].style || '',\n class: ranges[i].class\n }\n // add range\n let ind: number | false = false\n for (let j = 0; j < grid.ranges.length; j++) if (grid.ranges[j]!.name == ranges[i]!.name) { ind = j; break }\n if (ind !== false) {\n grid.ranges[ind] = rg\n } else {\n grid.ranges.push(rg)\n }\n added++\n }\n }\n grid.refreshRanges()\n return added\n}\n\nexport function removeRange(grid: TsGrid, ...names: string[]) {\n let removed = 0\n for (let a = 0; a < names.length; a++) {\n const name = names[a]\n query(grid.box).find('#grid_'+ grid.name +'_'+ name).remove()\n query(grid.box).find('#grid_'+ grid.name +'_f'+ name).remove()\n for (let r = grid.ranges.length-1; r >= 0; r--) {\n if (grid.ranges[r]!.name == name) {\n grid.ranges.splice(r, 1)\n removed++\n }\n }\n }\n return removed\n}\n\nexport function refreshRanges(grid: TsGrid) {\n if (grid.ranges.length === 0) return\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = grid\n let range\n const time = Date.now()\n const rec1 = query(grid.box).find(`#grid_${grid.name}_frecords`)\n const rec2 = query(grid.box).find(`#grid_${grid.name}_records`)\n for (let i = 0; i < grid.ranges.length; i++) {\n const rg = grid.ranges[i]!\n let first = rg.range[0]!\n let last = rg.range[1]!\n if (first.index == null) {\n const fi = grid.get(first.recid, true)\n if (fi != null) first.index = fi\n }\n if (last.index == null) {\n const li = grid.get(last.recid, true)\n if (li != null) last.index = li\n }\n if (first.index!= null && last.index!=null && first.index > last.index) {\n const tmp = first\n first = last\n last = tmp\n }\n let td1 = query(grid.box).find('#grid_'+ grid.name +'_rec_'+ TsUtils.escapeId(first.recid) + ' td[col=\"'+ first.column +'\"]')\n let td2 = query(grid.box).find('#grid_'+ grid.name +'_rec_'+ TsUtils.escapeId(last.recid) + ' td[col=\"'+ last.column +'\"]')\n let td1f = query(grid.box).find('#grid_'+ grid.name +'_frec_'+ TsUtils.escapeId(first.recid) + ' td[col=\"'+ first.column +'\"]')\n let td2f = query(grid.box).find('#grid_'+ grid.name +'_frec_'+ TsUtils.escapeId(last.recid) + ' td[col=\"'+ last.column +'\"]')\n let _lastColumn: number | string = last.column // any: sentinel 'end'/'start' used for virtual scroll boundary cols\n // adjustment due to column virtual scroll\n if (first.column < grid.last.vscroll.colIndStart && last.column > grid.last.vscroll.colIndStart) {\n td1 = query(grid.box).find('#grid_'+ grid.name +'_rec_'+ TsUtils.escapeId(first.recid) + ' td[col=\"start\"]')\n }\n if (first.column < grid.last.vscroll.colIndEnd && last.column > grid.last.vscroll.colIndEnd) {\n td2 = query(grid.box).find('#grid_'+ grid.name +'_rec_'+ TsUtils.escapeId(last.recid) + ' td[col=\"end\"]')\n _lastColumn = 'end'\n //_lastColumn = '\"end\"' // cause error\n }\n // if virtual scrolling kicked in\n const index_top = parseInt(query(grid.box).find('#grid_'+ grid.name +'_rec_top').next().attr('index'))\n const index_bottom = parseInt(query(grid.box).find('#grid_'+ grid.name +'_rec_bottom').prev().attr('index'))\n const index_ftop = parseInt(query(grid.box).find('#grid_'+ grid.name +'_frec_top').next().attr('index'))\n const index_fbottom = parseInt(query(grid.box).find('#grid_'+ grid.name +'_frec_bottom').prev().attr('index'))\n if (td1.length === 0 && first.index! < index_top && last.index! > index_top) {\n td1 = query(grid.box).find('#grid_'+ grid.name +'_rec_top').next().find('td[col=\"'+ first.column +'\"]')\n }\n if (td2.length === 0 && last.index! > index_bottom && first.index! < index_bottom) {\n td2 = query(grid.box).find('#grid_'+ grid.name +'_rec_bottom').prev().find('td[col=\"'+ _lastColumn +'\"]')\n }\n if (td1f.length === 0 && first.index! < index_ftop && last.index! > index_ftop) { // frozen\n td1f = query(grid.box).find('#grid_'+ grid.name +'_frec_top').next().find('td[col=\"'+ first.column +'\"]')\n }\n if (td2f.length === 0 && last.index! > index_fbottom && first.index! < index_fbottom) { // frozen\n td2f = query(grid.box).find('#grid_'+ grid.name +'_frec_bottom').prev().find('td[col=\"'+ last.column +'\"]')\n }\n\n // do not show selection cell if it is editable\n const edit = query(grid.box).find('#grid_'+ grid.name + '_editable')\n const tmp = edit.find('.tsg-input')\n const tmp_ind = tmp.attr('index')\n const tmp1 = grid.records[tmp_ind]?.recid\n const tmp2 = tmp.attr('column')\n if (rg.name == 'selection' && rg.range[0]!.recid == tmp1 && rg.range[0]!.column == tmp2) continue\n\n // frozen regular columns range\n range = query(grid.box).find('#grid_'+ grid.name +'_f'+ rg.name)\n if (td1f.length > 0 || td2f.length > 0) {\n if (range.length === 0) {\n rec1.append('<div id=\"grid_'+ grid.name +'_f' + rg.name +'\" class=\"tsg-selection\" style=\"'+ rg.style +'\">'+\n (rg.name == 'selection' && grid.show.selectionResizer ? '<div id=\"grid_'+ grid.name +'_resizer\" class=\"tsg-selection-resizer\"></div>' : '')+\n '</div>')\n range = query(grid.box).find('#grid_'+ grid.name +'_f'+ rg.name)\n } else {\n range.attr('style', rg.style)\n range.find('.tsg-selection-resizer').show()\n }\n if (td2f.length === 0) {\n td2f = query(grid.box).find('#grid_'+ grid.name +'_frec_'+ TsUtils.escapeId(last.recid) +' td:last-child')\n if (td2f.length === 0) td2f = query(grid.box).find('#grid_'+ grid.name +'_frec_bottom td:first-child')\n range.css('border-right', '0px')\n range.find('.tsg-selection-resizer').hide()\n }\n if (first.recid != null && last.recid != null && td1f.length > 0 && td2f.length > 0) {\n const style = getComputedStyle(td2f[0])\n const top1 = (td1f.prop('offsetTop') - td1f.prop('scrollTop'))\n const left1 = (td1f.prop('offsetLeft') + td1f.prop('scrollLeft'))\n const top2 = (td2f.prop('offsetTop') - td2f.prop('scrollTop'))\n const left2 = (td2f.prop('offsetLeft') + td2f.prop('scrollLeft'))\n range.show().css({\n top : (top1 > 0 ? top1 : 0) + 'px',\n left : (left1 > 0 ? left1 : 0) + 'px',\n width : (left2 - left1 + parseFloat(style.width) - 1) + 'px',\n height : (top2 - top1 + parseFloat(style.height) - 1) + 'px'\n })\n } else {\n range.hide()\n }\n } else {\n range.hide()\n }\n // regular columns range\n range = query(grid.box).find('#grid_'+ grid.name +'_'+ rg.name)\n if (td1.length > 0 || td2.length > 0) {\n if (range.length === 0) {\n rec2.append(`\n <div id=\"grid_${grid.name}_${rg.name}\" class=\"tsg-selection ${rg.class ?? ''}\" style=\"${rg.style}\">\n ${rg.name == 'selection' && grid.show.selectionResizer\n ? `<div id=\"grid_${grid.name}_resizer\" class=\"tsg-selection-resizer\"></div>`\n : ''\n }\n </div>\n `)\n range = query(grid.box).find('#grid_'+ grid.name +'_'+ rg.name)\n } else {\n range.attr('style', rg.style)\n }\n if (td1.length === 0) {\n td1 = query(grid.box).find('#grid_'+ grid.name +'_rec_'+ TsUtils.escapeId(first.recid) +' td:first-child')\n if (td1.length === 0) td1 = query(grid.box).find('#grid_'+ grid.name +'_rec_top td:first-child')\n }\n if (td2f.length !== 0) {\n range.css('border-left', '0px')\n }\n if (first.recid != null && last.recid != null && td1.length > 0 && td2.length > 0) {\n const style = getComputedStyle(td2[0])\n const top1 = (td1.prop('offsetTop') - td1.prop('scrollTop'))\n const left1 = (td1.prop('offsetLeft') + td1.prop('scrollLeft'))\n const top2 = (td2.prop('offsetTop') - td2.prop('scrollTop'))\n const left2 = (td2.prop('offsetLeft') + td2.prop('scrollLeft'))\n range.show().css({\n top : (top1 > 0 ? top1 : 0) + 'px',\n left : (left1 > 0 ? left1 : 0) + 'px',\n width : (left2 - left1 + parseFloat(style.width) - 1) + 'px',\n height : (top2 - top1 + parseFloat(style.height) - 1) + 'px'\n })\n } else {\n range.hide()\n }\n } else {\n range.hide()\n }\n }\n\n // add resizer events\n query(grid.box).find('.tsg-selection-resizer')\n .off('.resizer')\n .on('mousedown.resizer', mouseStart)\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('dblclick.resizer', (event: any) => {\n const edata = self.trigger('resizerDblClick', { target: self.name, originalEvent: event })\n if (edata.isCancelled === true) return\n edata.finish()\n })\n // this variables are needed for selection expantion\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let edata: any\n // any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const detail: any = { target: self.name, originalRange: null, newRange: null }\n const letters = 'abcdefghijklmnopqrstuvwxyz'\n\n return Date.now() - time\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function mouseStart(event: any) { // any: event is MouseEvent at runtime; typed loosely to avoid EventListener mismatch\n const sel = self.getSelectionCells()\n const first = sel[0]!\n const last = sel[sel.length-1]!\n self.last.move = {\n type : 'expand',\n x : event.screenX,\n y : event.screenY,\n divX : 0,\n divY : 0,\n index : first.index,\n recid : first.recid,\n column : first.column,\n name : letters[first.column]! + (first.index + 1) + ':' + letters[last.column]! + (last.index + 1),\n originalRange : [TsUtils.clone(first), TsUtils.clone(last) ],\n newRange : [TsUtils.clone(first), TsUtils.clone(last) ]\n }\n detail.originalName = self.last.move.name\n detail.originalRange = self.last.move.originalRange\n query('body')\n .off('.tsg-' + self.name)\n .on('mousemove.tsg-' + self.name, mouseMove)\n .on('mouseup.tsg-' + self.name, mouseStop)\n // do not blur grid\n event.preventDefault()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function mouseMove(event: any) { // any: event is MouseEvent at runtime; typed loosely to avoid EventListener mismatch\n const mv = self.last.move\n if (!mv || mv.type != 'expand') return\n mv.divX = (event.screenX - mv.x)\n mv.divY = (event.screenY - mv.y)\n // find new cell\n let column: number | undefined\n let tmp = event.target\n if (tmp.tagName.toUpperCase() != 'TD') tmp = query(tmp).closest('td')[0]\n if (query(tmp).attr('col') != null) column = parseInt(query(tmp).attr('col'))\n if (column == null) {\n return\n }\n tmp = query(tmp).closest('tr')[0]\n const index = parseInt(query(tmp).attr('index'))\n const recid = self.records[index]?.recid\n // new range\n if (mv.newRange[1].recid == recid && mv.newRange[1].column == column) {\n // if range did not change\n return\n }\n const prevNewRange = TsUtils.clone(mv.newRange)\n mv.newRange = [{ recid: mv.recid, index: mv.index, column: mv.column }, { recid, index, column }]\n // remember update ranges\n detail.newName = letters[mv.column] + (mv.index + 1) + ':' + letters[column] + (index + 1)\n detail.newRange = TsUtils.clone(mv.newRange)\n // event before\n edata = self.trigger('selectionExtend', detail)\n if (edata.isCancelled === true) {\n mv.newRange = prevNewRange\n detail.newRange = prevNewRange\n return\n } else {\n // default behavior\n self.addRange({\n name: 'selection-expand',\n range: mv.newRange,\n class: 'tsg-selection-expand'\n })\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function mouseStop(_event: any) { // any: event is MouseEvent at runtime; typed loosely to avoid EventListener mismatch\n // default behavior\n self.removeRange('selection-expand')\n query('body').off('.tsg-' + self.name)\n // event after\n if (self.last.move?.type == 'expand' && edata.finish) {\n edata.finish()\n }\n delete self.last.move\n }\n}\n\n// clears records and related params\nexport function clear(grid: TsGrid, noRefresh?: boolean): void {\n grid.total = 0\n grid.records = []\n grid.summary = []\n grid.last.fetch.offset = 0 // need this for reload button to work on remote data set\n grid.last.idCache = {} // optimization to free memory\n grid.last.selection = { indexes: [], columns: {} }\n grid.last.groupBy_links = {}\n grid.reset(true)\n // refresh\n if (!noRefresh) grid.refresh()\n}\n\n// clears scroll position, selection, ranges\nexport function reset(grid: TsGrid, noRefresh?: boolean): void {\n // position\n grid.last.vscroll.scrollTop = 0\n grid.last.vscroll.scrollLeft = 0\n grid.last.vscroll.recIndStart = null\n grid.last.vscroll.recIndEnd = null\n // additional\n query(grid.box).find(`#grid_${grid.name}_records`).prop('scrollTop', 0)\n // refresh\n if (!noRefresh) grid.refresh()\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function load(grid: TsGrid, url: any, callBack?: any) { // any: url can be string or object with .get/.save\n if (url == null) {\n console.log('ERROR: You need to provide url argument when calling .load() method of \"'+ grid.name +'\" object.')\n return new Promise((resolve, reject) => { reject() })\n }\n // default action\n grid.clear(true)\n return grid.request('load', {}, url, callBack)\n}\n\n// any: array of heterogeneous runtime values; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function reload(grid: TsGrid, callBack?: (...args: any[]) => void) {\n const url = grid.url?.get ?? grid.url\n grid.selectionSave()\n if (url) {\n // need to remember selection (not just last.selection object)\n return grid.load(url, () => {\n grid.selectionRestore()\n if (typeof callBack == 'function') callBack()\n })\n } else {\n grid.reset(true)\n grid.localSearch()\n grid.selectionRestore()\n if (typeof callBack == 'function') callBack({ status: 'success' })\n return new Promise<void>(resolve => { resolve() })\n }\n}\n\n// any: url can be string, { get, save, remove } object, URL instance, or null\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function request(grid: TsGrid, action: string, postData?: Record<string, any>, url?: any, callBack?: (...args: any[]) => void): Promise<any> {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = grid\n // any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let resolve: any, reject: any\n const requestProm = new Promise((res, rej) => { resolve = res; reject = rej })\n if (postData == null) postData = {}\n if (!url) url = grid.url\n if (!url) return new Promise((resolve, reject) => { reject() })\n // build parameters list\n if (!TsUtils.isInt(grid.offset)) grid.offset = 0\n if (!TsUtils.isInt(grid.last.fetch.offset)) grid.last.fetch.offset = 0\n // add list params\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let edata: any\n // any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const params: any = {\n limit: grid.limit,\n offset: (grid.offset as number) + (grid.last.fetch.offset as number),\n searchLogic: grid.last.logic,\n search: grid.searchData.map((search) => {\n const _search = TsUtils.clone(search)\n if (grid.searchMap && grid.searchMap[_search.field]) _search.field = grid.searchMap[_search.field]\n return _search\n }),\n sort: grid.sortData.map((sort) => {\n const _sort = TsUtils.clone(sort)\n if (grid.sortMap && grid.sortMap[_sort.field]) _sort.field = grid.sortMap[_sort.field]\n return _sort\n })\n }\n if (grid.searchData.length === 0) {\n delete params.search\n delete params.searchLogic\n }\n if (grid.sortData.length === 0) {\n delete params.sort\n }\n // append other params\n TsUtils.extend(params, grid.postData)\n TsUtils.extend(params, postData)\n // other actions\n if (action == 'delete' || action == 'save') {\n delete params.limit\n delete params.offset\n params.action = action\n if (action == 'delete') {\n params[grid.recid || 'recid'] = grid.getSelection()\n }\n }\n // event before\n if (action == 'load') {\n edata = grid.trigger('request', { target: grid.name, url, postData: params, httpMethod: 'GET',\n httpHeaders: grid.httpHeaders })\n if (edata.isCancelled === true) return new Promise((resolve, reject) => { reject() })\n } else {\n edata = { detail: {\n url,\n postData: params,\n httpMethod: action == 'save' ? 'PUT' : 'DELETE',\n httpHeaders: grid.httpHeaders\n }}\n }\n // call server to get data\n if (grid.last.fetch.offset === 0) {\n grid.lock(TsUtils.lang(grid.msgRefresh), true)\n }\n if (grid.last.fetch.controller) try { grid.last.fetch.controller.abort() } catch (e) {}\n // URL\n url = edata.detail.url\n switch (action) {\n case 'save':\n if (url?.save) url = url.save\n break\n case 'delete':\n if (url?.remove) url = url.remove\n break\n default:\n url = url?.get ?? url\n }\n // process url with routeData\n if (Object.keys(grid.routeData).length > 0) {\n const info = TsUtils.parseRoute(url)\n if (info.keys.length > 0) {\n for (let k = 0; k < info.keys.length; k++) {\n const key_k = info.keys[k]!\n if (grid.routeData[key_k.name] == null) continue\n url = url.replace((new RegExp(':'+ key_k.name, 'g')), grid.routeData[key_k.name])\n }\n }\n }\n url = new URL(url, location.href)\n // ajax options\n const fetchOptions = TsUtils.prepareParams(url, {\n method: edata.detail.httpMethod,\n headers: edata.detail.httpHeaders,\n body: edata.detail.postData\n }, { dataType: grid.dataType, caller: grid, action })\n Object.assign(grid.last.fetch, {\n action: action,\n options: fetchOptions,\n controller: new AbortController(),\n start: Date.now(),\n loaded: false\n })\n fetchOptions['signal'] = grid.last.fetch.controller!.signal\n fetch(url, fetchOptions)\n .catch(processError)\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .then((resp: any) => {\n if (resp == null) return // request aborted\n if (resp?.status != 200) {\n processError(resp ?? {})\n return\n }\n resp.json()\n .catch(processError)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .then((data: any) => { // any: server response shape varies by API\n grid.requestComplete(data ?? {}, action, callBack, resolve, reject)\n })\n .finally(() => self.unlock())\n })\n if (action == 'load') {\n // event after\n edata.finish()\n }\n return requestProm\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function processError(response: any) { // any: could be Response or Error\n if (response?.name === 'AbortError') {\n // request was aborted by the grid\n return\n }\n self.unlock()\n // trigger event\n const edata2 = self.trigger('error', { response, lastFetch: self.last.fetch })\n if (edata2.isCancelled === true) return\n // default behavior\n if (response.status && response.status != 200) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n response.json().then((data: any) => { // any: error response body shape varies\n self.error(response.status + ': ' + (data.message || response.statusText))\n }).catch(() => {\n self.error(response.status + ': ' + response.statusText)\n })\n } else {\n console.log('ERROR: Server communication failed.',\n '\\n EXPECTED:', { total: 5, records: [{ recid: 1, field: 'value' }] },\n '\\n OR:', { error: true, message: 'error message' })\n self.requestComplete({ error: true, message: TsUtils.lang(self.msgHTTPError), response }, action, callBack, resolve, reject)\n }\n // event after\n edata2.finish()\n }\n}\n\n// any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function save(grid: TsGrid, callBack?: (data: any) => void) {\n const changes = grid.getChanges()\n const url = grid.url?.save ?? grid.url\n // event before\n const edata = grid.trigger('save', { target: grid.name, changes: changes })\n if (edata.isCancelled === true) return\n if (url) {\n grid.request('save', { 'changes' : edata.detail['changes'] }, null,\n (data) => {\n if (!data.error) {\n // only merge changes, if save was successful\n grid.mergeChanges()\n }\n // event after\n edata.finish()\n // call back\n if (typeof callBack == 'function') callBack(data)\n }\n )\n } else {\n grid.mergeChanges()\n // event after\n edata.finish()\n }\n}\n","/**\n * grid-selection.ts — Selection management sub-module for TsGrid (v2.0)\n *\n * Extracted from src/tsgrid.ts as part of the tsgrid-v2-core structural refactor.\n * Strategy D — Hybrid sibling files: plain functions taking `grid: TsGrid` as first parameter.\n * All method bodies lifted verbatim from TsGrid; `this.X` → `grid.X` (or `self.X`/`obj.X`) mechanically.\n *\n * Design R13: No per-module unit tests. Sub-modules require a full TsGrid instance.\n * Design R3: FORBIDDEN to import grid-search, grid-edit, grid-interaction, grid-render.\n * Cross-domain calls go through grid.X() delegators.\n */\n\nimport type { TsGrid } from './tsgrid.js'\nimport type { TsGridCellSelection } from './tsgrid.js'\nimport type { RecId } from './types.js'\nimport { TsUtils } from './tsutils.js'\nimport { query as _queryRaw } from './query.js'\n\n// any: Query wrapper used as jQuery-like in TsGrid\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst query = _queryRaw as (...args: any[]) => any\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function select(grid: TsGrid, ...selectArgs: any[]): number | undefined { // any: recid (string|number) or {recid, column} cell descriptor\n if (selectArgs.length === 0) return 0\n let selected = 0\n const sel = grid.last.selection\n if (!grid.multiSelect) grid.selectNone(true)\n // if too many arguments > 150k, then it errors off\n let args = selectArgs.slice()\n if (Array.isArray(args[0])) args = args[0]\n // filter unselectable records\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args = args.filter((aa: any) => { // any: recid or cell descriptor\n const recid = aa?.recid ?? aa\n const index = aa?.index ?? grid.get(recid, true)\n const rec = grid.records[index]!\n if (rec?.TsUi?.selectable === false) {\n return false\n }\n if (typeof aa === 'object') {\n aa.index ??= index\n }\n return true\n })\n\n // event before\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tmp: any = { target: grid.name } // any: dynamic event payload built incrementally\n if (args.length == 1) {\n tmp.multiple = false\n if (TsUtils.isPlainObject(args[0])) {\n tmp.clicked = {\n recid: args[0].recid,\n column: args[0].column\n }\n } else {\n tmp.recid = args[0]\n }\n } else {\n tmp.multiple = true\n tmp.clicked = { recids: args }\n }\n if (grid.compareSelection(args).select.length == 0) {\n // if all needed records are already selected\n return\n }\n const edata = grid.trigger('select', tmp)\n if (edata.isCancelled === true) return 0\n\n // default action\n if (grid.selectType == 'row') {\n for (let a = 0; a < args.length; a++) {\n const recid = typeof args[a] == 'object' ? args[a].recid : args[a]\n const index = grid.get(recid, true)\n if (index == null) continue\n let recEl1 = null\n let recEl2 = null\n if (grid.searchData.length !== 0 || (index + 1 >= (grid.last.vscroll.recIndStart ?? 0) && index + 1 <= (grid.last.vscroll.recIndEnd ?? 0))) {\n recEl1 = query(grid.box).find('#grid_'+ grid.name +'_frec_'+ TsUtils.escapeId(recid))\n recEl2 = query(grid.box).find('#grid_'+ grid.name +'_rec_'+ TsUtils.escapeId(recid))\n }\n if (grid.selectType == 'row') {\n if (sel.indexes.indexOf(index) != -1) continue\n sel.indexes.push(index)\n if (recEl1 && recEl2) {\n recEl1.addClass('tsg-selected').find('.tsg-col-number').addClass('tsg-row-selected')\n recEl2.addClass('tsg-selected').find('.tsg-col-number').addClass('tsg-row-selected')\n recEl1.find('.tsg-grid-select-check').prop('checked', true)\n }\n selected++\n }\n }\n } else {\n // normalize for performance\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const new_sel: Record<string, any[]> = {}\n for (let a = 0; a < args.length; a++) {\n const recid = typeof args[a] == 'object' ? args[a].recid : args[a]\n const column = typeof args[a] == 'object' ? args[a].column : null\n new_sel[recid] = new_sel[recid] || []\n if (Array.isArray(column)) {\n new_sel[recid] = column\n } else if (TsUtils.isInt(column)) {\n new_sel[recid].push(column)\n } else {\n for (let i = 0; i < grid.columns.length; i++) { if (grid.columns[i]!.hidden) continue; new_sel[recid]!.push(i) }\n }\n }\n // add all\n const col_sel = []\n for (const recid in new_sel) {\n const index = grid.get(recid, true)\n if (index == null) continue\n let recEl1 = null\n let recEl2 = null\n if (index + 1 >= (grid.last.vscroll.recIndStart ?? 0) && index + 1 <= (grid.last.vscroll.recIndEnd ?? 0)) {\n recEl1 = query(grid.box).find('#grid_'+ grid.name +'_rec_'+ TsUtils.escapeId(recid))\n recEl2 = query(grid.box).find('#grid_'+ grid.name +'_frec_'+ TsUtils.escapeId(recid))\n }\n const s = sel.columns[index] || []\n // default action\n if (sel.indexes.indexOf(index) == -1) {\n sel.indexes.push(index)\n }\n const new_sel_recid = new_sel[recid]!\n // only only those that are new\n for (let t = 0; t < new_sel_recid.length; t++) {\n if (s.indexOf(new_sel_recid[t]) == -1) s.push(new_sel_recid[t])\n }\n s.sort((a: number, b: number) => { return a-b }) // sort function must be for numerical sort\n for (let t = 0; t < new_sel_recid.length; t++) {\n const col = new_sel_recid[t]\n if (col_sel.indexOf(col) == -1) col_sel.push(col)\n if (recEl1) {\n recEl1.find('#grid_'+ grid.name +'_data_'+ index +'_'+ col).addClass('tsg-selected')\n recEl1.find('.tsg-col-number').addClass('tsg-row-selected')\n recEl1.find('.tsg-grid-select-check').prop('checked', true)\n }\n if (recEl2) {\n recEl2.find('#grid_'+ grid.name +'_data_'+ index +'_'+ col).addClass('tsg-selected')\n recEl2.find('.tsg-col-number').addClass('tsg-row-selected')\n recEl2.find('.tsg-grid-select-check').prop('checked', true)\n }\n selected++\n }\n // save back to selection object\n sel.columns[index] = s\n }\n // select columns (need here for speed)\n for (let c = 0; c < col_sel.length; c++) {\n query(grid.box).find('#grid_'+ grid.name +'_column_'+ col_sel[c] +' .tsg-col-header').addClass('tsg-col-selected')\n }\n }\n // need to sort new selection for speed\n sel.indexes.sort((a: number, b: number) => { return a-b })\n // all selected?\n const areAllSelected = (grid.records.length > 0 && sel.indexes.length == grid.records.length),\n areAllSearchedSelected = (sel.indexes.length > 0 && grid.searchData.length !== 0 && sel.indexes.length == grid.last.searchIds.length)\n if (areAllSelected || areAllSearchedSelected) {\n query(grid.box).find('#grid_'+ grid.name +'_check_all').prop('checked', true)\n } else {\n query(grid.box).find('#grid_'+ grid.name +'_check_all').prop('checked', false)\n }\n grid.status()\n grid.addRange('selection')\n grid.updateToolbar(sel, areAllSelected)\n // event after\n edata.finish()\n return selected\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function unselect(grid: TsGrid, ...unselectArgs: any[]): number { // any: recid (string|number) or {recid, column} cell descriptor\n let unselected = 0\n const sel = grid.last.selection\n // if too many arguments > 150k, then it errors off\n let args = unselectArgs.slice()\n if (Array.isArray(args[0])) args = args[0]\n // event before\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tmp: any = { target: grid.name } // any: dynamic event payload built incrementally\n if (args.length == 1) {\n tmp.multiple = false\n if (TsUtils.isPlainObject(args[0])) {\n tmp.clicked = {\n recid: args[0].recid,\n column: args[0].column\n }\n } else {\n tmp.clicked = { recid: args[0] }\n }\n } else {\n tmp.multiple = true\n tmp.recids = args\n }\n if (grid.compareSelection(args).unselect.length == 0) {\n // if all needed records are already unselected\n return 0\n }\n const edata = grid.trigger('select', tmp)\n if (edata.isCancelled === true) return 0\n\n for (let a = 0; a < args.length; a++) {\n const recid = typeof args[a] == 'object' ? args[a].recid : args[a]\n const record = grid.get(recid)\n if (record == null) continue\n const index = grid.get(record.recid, true) ?? -1\n const recEl1 = query(grid.box).find('#grid_'+ grid.name +'_frec_'+ TsUtils.escapeId(recid))\n const recEl2 = query(grid.box).find('#grid_'+ grid.name +'_rec_'+ TsUtils.escapeId(recid))\n if (grid.selectType == 'row') {\n if (sel.indexes.indexOf(index) == -1) continue\n // default action\n sel.indexes.splice(sel.indexes.indexOf(index), 1)\n recEl1.removeClass('tsg-selected tsg-inactive').find('.tsg-col-number').removeClass('tsg-row-selected')\n recEl2.removeClass('tsg-selected tsg-inactive').find('.tsg-col-number').removeClass('tsg-row-selected')\n if (recEl1.length != 0) {\n recEl1[0].style.cssText = 'height: '+ grid.recordHeight +'px; ' + recEl1.attr('custom_style')\n recEl2[0].style.cssText = 'height: '+ grid.recordHeight +'px; ' + recEl2.attr('custom_style')\n }\n recEl1.find('.tsg-grid-select-check').prop('checked', false)\n unselected++\n } else {\n const col = args[a].column\n if (!TsUtils.isInt(col)) { // unselect all columns\n const cols = []\n for (let i = 0; i < grid.columns.length; i++) { if (grid.columns[i]!.hidden) continue; cols.push({ recid: recid, column: i }) }\n return grid.unselect(cols)\n }\n const s = sel.columns[index]\n if (!Array.isArray(s) || s.indexOf(col) == -1) continue\n // default action\n s.splice(s.indexOf(col), 1)\n query(grid.box).find(`#grid_${grid.name}_rec_${TsUtils.escapeId(recid)} > td[col=\"${col}\"]`).removeClass('tsg-selected tsg-inactive')\n query(grid.box).find(`#grid_${grid.name}_frec_${TsUtils.escapeId(recid)} > td[col=\"${col}\"]`).removeClass('tsg-selected tsg-inactive')\n // check if any row/column still selected\n let isColSelected = false\n let isRowSelected = false\n const tmp = grid.getSelectionCells()\n for (let i = 0; i < tmp.length; i++) {\n if (tmp[i]!.column == col) isColSelected = true\n if (tmp[i]!.recid == recid) isRowSelected = true\n }\n if (!isColSelected) {\n query(grid.box).find(`.tsg-grid-columns td[col=\"${col}\"] .tsg-col-header, .tsg-grid-fcolumns td[col=\"${col}\"] .tsg-col-header`).removeClass('tsg-col-selected')\n }\n if (!isRowSelected) {\n query(grid.box).find('#grid_'+ grid.name +'_frec_'+ TsUtils.escapeId(recid)).find('.tsg-col-number').removeClass('tsg-row-selected')\n }\n unselected++\n if (s.length === 0) {\n delete sel.columns[index]\n sel.indexes.splice(sel.indexes.indexOf(index), 1)\n recEl1.find('.tsg-grid-select-check').prop('checked', false)\n }\n }\n }\n // all selected?\n const areAllSelected = (grid.records.length > 0 && sel.indexes.length == grid.records.length),\n areAllSearchedSelected = (sel.indexes.length > 0 && grid.searchData.length !== 0 && sel.indexes.length == grid.last.searchIds.length)\n if (areAllSelected || areAllSearchedSelected) {\n query(grid.box).find('#grid_'+ grid.name +'_check_all').prop('checked', true)\n } else {\n query(grid.box).find('#grid_'+ grid.name +'_check_all').prop('checked', false)\n }\n // show number of selected\n grid.status()\n grid.addRange('selection')\n grid.updateToolbar(sel, areAllSelected)\n // event after\n edata.finish()\n return unselected\n}\n\n// any: array of heterogeneous runtime values; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function compareSelection(grid: TsGrid, newSel: any[]): { select: any[]; unselect: any[] } {\n const select = []\n const unselect = []\n if (grid.selectType == 'row') {\n const sel = grid.getSelectionRows() as Array<RecId | number>\n // normalize\n newSel.forEach((sel, ind) => {\n if (typeof sel == 'object') newSel[ind] = sel.recid\n })\n // add items\n for (let i = 0; i < newSel.length; i++) {\n if (!(sel as Array<RecId | number>).includes(newSel[i])) {\n select.push(newSel[i])\n }\n }\n // remove items\n for (let i = 0; i < newSel.length; i++) {\n if ((sel as Array<RecId | number>).includes(newSel[i])) {\n unselect.push(newSel[i])\n }\n }\n } else {\n const sel = grid.getSelectionCells()\n // add more items\n for (let ns = 0; ns < newSel.length; ns++) {\n let flag = false\n for (let s = 0; s < sel.length; s++) if (newSel[ns].recid == sel[s]!.recid && newSel[ns].column == sel[s]!.column) flag = true\n if (!flag) select.push({ recid: newSel[ns].recid, column: newSel[ns].column })\n }\n // remove items\n for (let s = 0; s < sel.length; s++) {\n let flag = false\n for (let ns = 0; ns < newSel.length; ns++) if (newSel[ns].recid == sel[s]!.recid && newSel[ns].column == sel[s]!.column) flag = true\n if (!flag) unselect.push({ recid: sel[s]!.recid, column: sel[s]!.column })\n }\n }\n return { select, unselect }\n}\n\nexport function selectAll(grid: TsGrid): number | undefined {\n const time = Date.now()\n if (grid.multiSelect === false) return\n // default action\n const url = grid.url?.get ?? grid.url\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let sel: any = TsUtils.clone(grid.last.selection) // any: TsUtils.clone returns unknown; selection shape is TsGridLast['selection']\n const cols = []\n for (let i = 0; i < grid.columns.length; i++) cols.push(i)\n // if local data source and searched\n sel.indexes = []\n if (!url && grid.searchData.length !== 0) {\n // local search applied\n for (let i = 0; i < grid.last.searchIds.length; i++) {\n sel.indexes.push(grid.last.searchIds[i]!)\n if (grid.selectType != 'row') sel.columns[grid.last.searchIds[i]!] = cols.slice() // .slice makes copy of the array\n }\n } else {\n let buffered = grid.records.length\n if (grid.searchData.length != 0 && !url) buffered = grid.last.searchIds.length\n for (let i = 0; i < buffered; i++) {\n sel.indexes.push(i)\n if (grid.selectType != 'row') sel.columns[i] = cols.slice() // .slice makes copy of the array\n }\n }\n // event before\n const edata = grid.trigger('select', { target: grid.name, multiple: true, all: true, clicked: sel })\n if (edata.isCancelled === true) return\n\n grid.last.selection = sel\n // add selected class\n if (grid.selectType == 'row') {\n query(grid.box).find('.tsg-grid-records tr:not(.tsg-empty-record)')\n .addClass('tsg-selected').find('.tsg-col-number').addClass('tsg-row-selected')\n query(grid.box).find('.tsg-grid-frecords tr:not(.tsg-empty-record)')\n .addClass('tsg-selected').find('.tsg-col-number').addClass('tsg-row-selected')\n query(grid.box).find('input.tsg-grid-select-check').prop('checked', true)\n } else {\n query(grid.box).find('.tsg-grid-columns td .tsg-col-header, .tsg-grid-fcolumns td .tsg-col-header').addClass('tsg-col-selected')\n query(grid.box).find('.tsg-grid-records tr .tsg-col-number').addClass('tsg-row-selected')\n query(grid.box).find('.tsg-grid-records tr:not(.tsg-empty-record)')\n .find('.tsg-grid-data:not(.tsg-col-select)').addClass('tsg-selected')\n query(grid.box).find('.tsg-grid-frecords tr .tsg-col-number').addClass('tsg-row-selected')\n query(grid.box).find('.tsg-grid-frecords tr:not(.tsg-empty-record)')\n .find('.tsg-grid-data:not(.tsg-col-select)').addClass('tsg-selected')\n query(grid.box).find('input.tsg-grid-select-check').prop('checked', true)\n }\n // enable/disable toolbar buttons\n sel = grid.getSelectionRows(true) as number[]\n grid.addRange('selection')\n query(grid.box).find('#grid_'+ grid.name +'_check_all').prop('checked', true)\n grid.status()\n grid.updateToolbar({ indexes: sel }, true)\n // event after\n edata.finish()\n return Date.now() - time\n}\n\nexport function selectNone(grid: TsGrid, skipEvent?: boolean): number | undefined {\n const time = Date.now()\n // event before\n let edata\n if (!skipEvent) {\n edata = grid.trigger('select', { target: grid.name, clicked: [] })\n if (edata.isCancelled === true) return\n }\n // default action\n const sel = grid.last.selection\n // remove selected class\n if (grid.selectType == 'row') {\n query(grid.box).find('.tsg-grid-records tr.tsg-selected').removeClass('tsg-selected tsg-inactive')\n .find('.tsg-col-number').removeClass('tsg-row-selected')\n query(grid.box).find('.tsg-grid-frecords tr.tsg-selected').removeClass('tsg-selected tsg-inactive')\n .find('.tsg-col-number').removeClass('tsg-row-selected')\n query(grid.box).find('input.tsg-grid-select-check').prop('checked', false)\n } else {\n query(grid.box).find('.tsg-grid-columns td .tsg-col-header, .tsg-grid-fcolumns td .tsg-col-header').removeClass('tsg-col-selected')\n query(grid.box).find('.tsg-grid-records tr .tsg-col-number').removeClass('tsg-row-selected')\n query(grid.box).find('.tsg-grid-frecords tr .tsg-col-number').removeClass('tsg-row-selected')\n query(grid.box).find('.tsg-grid-data.tsg-selected').removeClass('tsg-selected tsg-inactive')\n query(grid.box).find('input.tsg-grid-select-check').prop('checked', false)\n }\n sel.indexes = []\n sel.columns = {}\n grid.removeRange('selection')\n query(grid.box).find('#grid_'+ grid.name +'_check_all').prop('checked', false)\n grid.status()\n grid.updateToolbar(sel, false)\n // event after\n if (!skipEvent) {\n edata!.finish()\n }\n return Date.now() - time\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function updateToolbar(grid: TsGrid, sel?: any, _areAllSelected?: boolean): void { // any: sel is selection object from last.selection\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const obj = grid\n const cnt = sel && sel.indexes ? sel.indexes.length : 0\n // if there is no toolbar\n if (!grid.toolbar.render) {\n return\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n grid.toolbar.items.forEach((item: any) => { // any: toolbar item shape varies\n _checkItem(item, '')\n if (Array.isArray(item.items)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n item.items.forEach((it: any) => { // any: toolbar item shape varies\n _checkItem(it, item.id + ':')\n })\n }\n })\n // enable/disable toolbar search button\n if (grid.show.toolbarSave) {\n if (grid.getChanges().length > 0) {\n grid.toolbar.enable('tsg-save')\n } else {\n grid.toolbar.disable('tsg-save')\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _checkItem(item: any, prefix: any) { // any: toolbar item and prefix vary\n if (item.batch != null) {\n let enabled = false\n if (item.batch === true) {\n if (cnt > 0) enabled = true\n } else if (typeof item.batch == 'number') {\n if (cnt === item.batch) enabled = true\n } else if (typeof item.batch == 'function') {\n enabled = item.batch({ cnt, sel })\n }\n if (enabled) {\n obj.toolbar.enable(prefix + item.id)\n } else {\n obj.toolbar.disable(prefix + item.id)\n }\n }\n }\n}\n\n/**\n * Row-mode selection. Returns the recids of selected records, or their indexes\n * when `returnIndex === true`. Unaffected by `selectType === 'cell'` — callers\n * should branch on `grid.selectType` and use `getSelectionCells()` for cell mode.\n */\nexport function getSelectionRows(grid: TsGrid, returnIndex?: boolean): RecId[] | number[] {\n const ret: Array<RecId | number> = []\n const sel = grid.last.selection\n for (let i = 0; i < sel.indexes.length; i++) {\n const idx = sel.indexes[i]!\n if (!grid.records[idx]) continue\n if (returnIndex === true) ret.push(idx); else ret.push(grid.records[idx]!.recid as RecId)\n }\n return ret as RecId[] | number[]\n}\n\n/**\n * Cell-mode selection. Returns one descriptor per selected cell. `returnIndex`\n * is intentionally not a parameter — it was ignored in cell mode by the legacy\n * `getSelection()` API.\n */\nexport function getSelectionCells(grid: TsGrid): TsGridCellSelection[] {\n const ret: TsGridCellSelection[] = []\n const sel = grid.last.selection\n for (let i = 0; i < sel.indexes.length; i++) {\n const idx = sel.indexes[i]!\n const cols = sel.columns[idx] ?? []\n if (!grid.records[idx]) continue\n for (let j = 0; j < cols.length; j++) {\n ret.push({ recid: grid.records[idx]!.recid, index: idx, column: cols[j]! })\n }\n }\n return ret\n}\n\n/**\n * Discriminated-union wrapper. The shape depends on `grid.selectType`:\n * - `'row'` → `RecId[]` (or `number[]` if `returnIndex === true`)\n * - `'cell'` → `TsGridCellSelection[]` (`returnIndex` is ignored)\n *\n * Prefer the typed split methods (`getSelectionRows` / `getSelectionCells`)\n * when the caller knows the mode statically. This wrapper is kept for back-\n * compat with the v2.0 API and for callers that genuinely handle both modes.\n */\nexport function getSelection(grid: TsGrid, returnIndex?: boolean): RecId[] | number[] | TsGridCellSelection[] {\n return grid.selectType === 'row'\n ? grid.getSelectionRows(returnIndex)\n : grid.getSelectionCells()\n}\n","/**\n * grid-edit.ts — Phase 5 of tsgrid-v2-core SDD\n *\n * Extracted edit domain: editField, editChange, editDone.\n * All functions take (grid: TsGrid, ...args) and delegate cross-domain\n * calls back through the TsGrid prototype (grid.X()).\n *\n * DAG: imports tsgrid (type), grid-state (runtime), query, TsUtils, TsField, TsTooltip.\n * FORBIDDEN imports: grid-columns, grid-data, grid-selection, grid-search,\n * grid-interaction, grid-render.\n */\n\nimport type { TsGrid } from './tsgrid.js'\nimport { TsUtils } from './tsutils.js'\nimport { query as _queryRaw } from './query.js'\nimport { TsField } from './tsfield.js'\nimport { TsTooltip as _w2tooltip } from './tstooltip.js'\n\n// any: query() always returns Query at runtime; cast to any for clean duck-typing\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst query = _queryRaw as (...args: any[]) => any // any: Query wrapper used as jQuery-like in grid-edit\n// any: TsTooltip has complex show/hide overloads\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst TsTooltip = _w2tooltip as any // any: tooltip with flexible option shapes\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function editField(grid: TsGrid, recid: string | number, column: number, value: any, event?: any): void { // any: can be KeyboardEvent, MouseEvent, or synthetic event\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = grid\n if (grid.last.inEditMode === true) {\n // This is triggerign when user types fast\n if (event && event.keyCode == 13) {\n const { index, column, value } = grid.last._edit!\n grid.editChange({ type: 'custom', value }, index, column, event)\n grid.editDone(index, column, event)\n } else {\n // when 2 chars entered fast (spreadsheet)\n const input = query(grid.box).find('div.tsg-edit-box .tsg-input')\n if (input.length > 0) {\n if (input.get(0).tagName == 'DIV') {\n input.text(input.text() + value)\n TsUtils.setCursorPosition(input.get(0), input.text().length)\n } else {\n input.val(input.val() + value)\n TsUtils.setCursorPosition(input.get(0), input.val().length)\n }\n }\n }\n return\n }\n const index = grid.get(recid, true)\n if (index == null) return\n const edit = grid.getCellEditable(index, column)\n if (!edit || ['checkbox', 'check'].includes(edit.type)) return\n const rec = grid.records[index]!\n const col = grid.columns[column]!\n const prefix = (col.frozen === true ? '_f' : '_')\n if (['enum', 'file'].indexOf(edit.type) != -1) {\n console.log('ERROR: input types \"enum\" and \"file\" are not supported in inline editing.')\n return\n }\n // event before\n const edata = grid.trigger('editField', { target: grid.name, recid, column, value, index, originalEvent: event })\n if (edata.isCancelled === true) return\n value = edata.detail['value']\n // default behaviour\n grid.last.inEditMode = true\n grid.last['editColumn'] = column\n grid.last._edit = { value: value, index: index, column: column, recid: recid }\n grid.selectNone(true) // no need to trigger select event\n grid.select({ recid: recid, column: column })\n // create input element\n const tr = query(grid.box).find('#grid_'+ grid.name + prefix +'rec_' + TsUtils.escapeId(recid))\n let div = tr.find('[col=\"'+ column +'\"] > div') // TD -> DIV\n grid.last._edit['tr'] = tr\n grid.last._edit['div'] = div\n // clear previous if any (spreadsheet)\n query(grid.box).find('div.tsg-edit-box').remove()\n // for spreadsheet - insert into selection\n if (grid.selectType != 'row') {\n query(grid.box).find('#grid_'+ grid.name + prefix + 'selection')\n .attr('id', 'grid_'+ grid.name + '_editable')\n .removeClass('tsg-selection')\n .addClass('tsg-edit-box')\n .prepend('<div style=\"position: absolute; top: 0px; bottom: 0px; left: 0px; right: 0px;\"></div>')\n .find('.tsg-selection-resizer')\n .remove()\n div = query(grid.box).find('#grid_'+ grid.name + '_editable > div:first-child')\n }\n edit.attr = edit.attr ?? ''\n edit.text = edit.text ?? ''\n edit.style = edit.style ?? ''\n edit.items = edit.items ?? []\n let val = (rec.TsUi?.['changes']?.[col.field] != null\n ? TsUtils.stripTags(rec.TsUi['changes'][col.field])\n : TsUtils.stripTags(self.parseField(rec, col.field)))\n if (val == null) val = ''\n let prevValue = (typeof val != 'object' ? val : '')\n if (edata.detail['prevValue'] != null) prevValue = edata.detail['prevValue']\n if (value != null) val = value\n let addStyle = (col.style != null ? col.style + ';' : '')\n if (typeof col.render == 'string') {\n const tmp = col.render.replace('|', ':').split(':')\n if (['number', 'int', 'float', 'money', 'currency', 'percent', 'size'].includes(tmp[0] ?? '')) {\n addStyle += 'text-align: right;'\n }\n }\n // normalize items, if not yet normlized\n if (edit.items.length > 0 && !TsUtils.isPlainObject(edit.items[0])) {\n edit.items = TsUtils.normMenu(edit.items, edit)\n }\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let input: any\n const dropTypes = ['date', 'time', 'datetime', 'color', 'list', 'combo']\n const styles = getComputedStyle(tr.find('[col=\"'+ column +'\"] > div').get(0) as Element)\n const font = `font-family: ${styles.getPropertyValue('font-family')}; font-size: ${styles.getPropertyValue('font-size')};`\n switch (edit.type) {\n case 'div': {\n div.addClass('tsg-editable')\n .html(TsUtils.stripSpaces(`<div id=\"grid_${grid.name}_edit_${recid}_${column}\" class=\"tsg-input tsg-focus\"\n contenteditable autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\"\n style=\"${font + addStyle + edit.style}\"\n field=\"${col.field}\" recid=\"${recid}\" column=\"${column}\" ${edit.attr}>\n </div>${edit.text}`))\n input = div.find('div.tsg-input').get(0)\n input.innerText = (typeof val != 'object' ? val : '')\n if (value != null) {\n TsUtils.setCursorPosition(input, input.innerText.length)\n } else {\n TsUtils.setCursorPosition(input, 0, input.innerText.length)\n }\n break\n }\n default: {\n div.addClass('tsg-editable')\n .html(TsUtils.stripSpaces(`<input id=\"grid_${grid.name}_edit_${recid}_${column}\" class=\"tsg-input\"\n autocorrect=\"off\" autocomplete=\"off\" spellcheck=\"false\" type=\"text\"\n style=\"${font + addStyle + edit.style}\"\n field=\"${col.field}\" recid=\"${recid}\" column=\"${column}\" ${edit.attr}>${edit.text}`))\n input = div.find('input').get(0)\n // issue #499\n if (edit.type == 'number') {\n val = TsUtils.formatNumber(val)\n }\n if (edit.type == 'date') {\n val = TsUtils.formatDate(TsUtils.isDate(val, edit.format, true) || new Date(), edit.format)\n }\n input.value = (typeof val != 'object' ? val : '')\n\n // init TsField, attached to input._w2field\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const doHide = (event: any) => { // any: could be KeyboardEvent or custom event\n const escKey = grid.last._edit?.['escKey']\n // check if any element is selected in drop down\n let selected = false\n const name = query(input).data('tooltipName')\n if (name && TsTooltip.get(name[0])?.selected != null) {\n selected = true\n }\n // trigger change on new value if selected from overlay\n if (grid.last.inEditMode && !escKey && dropTypes.includes(edit.type) // drop down types\n && (event.detail.overlay.anchor?.id == grid.last._edit?.['input']?.id || edit.type == 'list')) {\n grid.editChange()\n grid.editDone(undefined, undefined, { keyCode: selected ? 13 : 0 }) // advance on select\n }\n }\n new TsField(TsUtils.extend({}, edit, {\n el: input,\n selected: val,\n onSelect: doHide,\n onHide: doHide\n }))\n if (value == null && input) {\n // if no new value, then select content\n input.select()\n }\n }\n }\n Object.assign(grid.last._edit, { input, edit })\n query(input)\n .off('.tsg-editable')\n .on('blur.tsg-editable', (event: Event) => {\n if (grid.last.inEditMode) {\n const type = grid.last._edit?.['edit']?.type\n const name = query(input).data('tooltipName') // if popup is open\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const et = event.target as any // any: custom _keepOpen property on event target\n if ((name && dropTypes.includes(type)) || et?._keepOpen === true) {\n delete et._keepOpen\n // drop downs finish edit when popover is closed\n return\n }\n grid.editChange(input, index, column, event)\n grid.editDone()\n }\n })\n .on('mousedown.tsg-editable', (event: Event) => {\n event.stopPropagation()\n })\n .on('click.tsg-editable', (event: Event) => {\n expand.call(input, event)\n })\n .on('paste.tsg-editable', (event: Event) => {\n // clean paste to be plain text\n event.preventDefault()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const text = (event as any as ClipboardEvent).clipboardData!.getData('text/plain') // any: typed as Event but is ClipboardEvent\n document.execCommand('insertHTML', false, text)\n })\n .on('keyup.tsg-editable', (event: Event) => {\n expand.call(input, event)\n })\n .on('keydown.tsg-editable', (event: Event) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const kev = event as any as KeyboardEvent // any: typed as Event but is KeyboardEvent\n switch (kev.keyCode) {\n case 8: // backspace;\n if (edit.type == 'list' && !input._w2field) { // cancel backspace when deleting element\n kev.preventDefault()\n }\n break\n case 9:\n case 13:\n kev.preventDefault()\n break\n case 27: // esc button exits edit mode, but if in a popup, it will also close the popup, hence\n // if tooltip is open - hide it\n const name = query(input).data('tooltipName')\n if (name && name.length > 0) {\n if (grid.last._edit) grid.last._edit['escKey'] = true\n TsTooltip.hide(name[0])\n kev.preventDefault()\n return // keep input editable just close tooltip\n }\n kev.stopPropagation()\n break\n }\n // need timeout so, this handler is executed after key is processed by browser\n setTimeout(() => {\n switch (kev.keyCode) {\n case 9: { // tab\n const next = kev.shiftKey\n ? self.prevCell(index, column, true)\n : self.nextCell(index, column, true)\n if (next != null) {\n const recid = self.records[next.index]!.recid\n grid.editChange(input, index, column, event)\n grid.editDone(index, column, event)\n if (self.selectType != 'row') {\n self.selectNone(true) // no need to trigger select event\n self.select({ recid, column: next.colIndex })\n } else {\n self.editField(recid, next.colIndex, null, event)\n }\n if (event.preventDefault) event.preventDefault()\n }\n break\n }\n case 13: { // enter\n // check if any element is selected in drop down\n let selected = false\n const name = query(input).data('tooltipName')\n if (name && TsTooltip.get(name[0]).selected != null) {\n selected = true\n }\n // if tooltip is not open or no element is selected\n if ((!name || !selected) && input._keepOpen !== true) {\n grid.editChange(input, index, column, event)\n grid.editDone(index, column, event)\n } else {\n delete input._keepOpen\n }\n break\n }\n\n case 27: { // escape\n if (grid.last._edit) grid.last._edit['escKey'] = false\n let old = self.parseField(rec, col.field)\n if (rec.TsUi?.['changes']?.[col.field] != null) old = rec.TsUi['changes'][col.field]\n if (input._prevValue != null) old = input._prevValue\n if (input.tagName == 'DIV') {\n input.innerText = old != null ? old : ''\n } else {\n input.value = old != null ? old : ''\n }\n grid.editDone(index, column, event)\n setTimeout(() => { self.select({ recid: recid, column: column }) }, 1)\n break\n }\n }\n // if input too small - expand\n expand(input)\n }, 1)\n })\n // save previous value\n if (input) input._prevValue = prevValue\n // focus and select\n if (edit.type != 'list') {\n setTimeout(() => {\n if (!grid.last.inEditMode) return\n if (input) {\n input.focus()\n clearTimeout(grid.last.kbd_timer ?? undefined) // keep focus\n input.resize = expand\n expand(input)\n }\n }, 50)\n }\n // event after\n edata.finish({ input })\n return\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function expand(input: any) { // any: input is HTMLInputElement or HTMLDivElement\n try {\n const styles = getComputedStyle(input)\n const val = (input.tagName.toUpperCase() == 'DIV' ? input.innerText : input.value)\n const editBox = query(self.box).find('#grid_'+ self.name + '_editable').get(0)\n const style = `font-family: ${styles.getPropertyValue('font-family')}; font-size: ${styles.getPropertyValue('font-size')}; white-space: no-wrap;`\n const width = TsUtils.getStrWidth(val, style)\n if (width + 20 > editBox.clientWidth) {\n query(editBox).css('width', width + 20 + 'px')\n }\n } catch (e) {\n }\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function editChange(grid: TsGrid, input?: any, index?: any, column?: any, event?: any): void { // any: all params are optional grid-edit internals\n // if params are not specified\n input = input ?? grid.last._edit?.['input']\n index = index ?? grid.last._edit?.['index']\n column = column ?? grid.last._edit?.['column']\n event = event ?? {}\n // all other fields\n const summary = index < 0\n index = index < 0 ? -index - 1 : index\n const records = summary ? grid.summary : grid.records\n const rec = records[index]!\n const col = grid.columns[column]!\n let new_val = (input?.tagName == 'DIV' ? input.innerText : input.value)\n const fld = input._w2field\n if (fld) {\n if (fld.type == 'list') {\n new_val = fld.selected\n }\n if (new_val == null || Object.keys(new_val).length === 0) new_val = ''\n if (!TsUtils.isPlainObject(new_val)) new_val = fld.clean(new_val)\n }\n if (input.type == 'checkbox') {\n if (rec.TsUi?.['editable'] === false) input.checked = !input.checked\n new_val = input.checked\n }\n const old_val = grid.parseField(rec, col.field)\n const prev_val = (rec.TsUi?.['changes'] && rec.TsUi['changes'].hasOwnProperty(col.field) ? rec.TsUi['changes'][col.field]: old_val)\n // change/restore event\n // any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let edata: any = {\n target: grid.name, input,\n recid: rec.recid, index, column,\n originalEvent: event,\n value: {\n new: new_val,\n previous: prev_val,\n original: old_val,\n }\n }\n if (event.target?._prevValue != null) edata.value.previous = event.target._prevValue\n let count = 0 // just in case to avoid infinite loop\n while (count < 20) {\n count++\n new_val = edata.value.new\n if ((typeof new_val != 'object' && String(old_val) != String(new_val)) ||\n (typeof new_val == 'object' && new_val && new_val.id != old_val\n && (typeof old_val != 'object' || old_val == null || new_val.id != old_val.id))) {\n // change event\n edata = grid.trigger('change', edata)\n if (edata.isCancelled !== true) {\n if (new_val !== edata.detail.value.new) {\n // re-evaluate the type of change to be made\n continue\n }\n // default action\n if ((edata.detail.value.new === '' || edata.detail.value.new == null) && (prev_val === '' || prev_val == null)) {\n // value did not change, was empty is empty\n } else {\n rec.TsUi = rec.TsUi ?? {}\n rec.TsUi['changes'] = rec.TsUi['changes'] ?? {}\n rec.TsUi['changes'][col.field] = edata.detail.value.new\n }\n // event after\n edata.finish()\n }\n } else {\n // restore event\n edata = grid.trigger('restore', edata)\n if (edata.isCancelled !== true) {\n if (new_val !== edata.detail.value.new) {\n // re-evaluate the type of change to be made\n continue\n }\n // default action\n if (rec.TsUi?.['changes']) {\n delete rec.TsUi['changes'][col.field]\n if (Object.keys(rec.TsUi['changes']).length === 0) {\n delete rec.TsUi['changes']\n }\n }\n // event after\n edata.finish()\n }\n }\n break\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function editDone(grid: TsGrid, index?: any, column?: any, event?: any): void { // any: all params are optional grid-edit internals\n // if params are not specified\n index = index ?? grid.last._edit?.['index']\n column = column ?? grid.last._edit?.['column']\n event = event ?? {}\n // removal of input happens when TR is redrawn\n if (grid.advanceOnEdit && event.keyCode == 13) {\n const next: number = event.shiftKey ? (grid.prevRow(index, column, 1) ?? index) : (grid.nextRow(index, column, 1) ?? index)\n setTimeout(() => {\n if (grid.selectType != 'row') {\n grid.selectNone(true) // no need to trigger select event\n grid.select({ recid: grid.records[next]!.recid, column: column })\n } else {\n grid.editField(grid.records[next]!.recid, column, null, event)\n }\n }, 1)\n }\n const summary = index < 0\n const cell = query(grid.last._edit?.['tr']).find('[col=\"'+ column +'\"]')\n const rec = grid.records[index]!\n const col = grid.columns[column]!\n // need to set before remove, as remove will trigger blur\n grid.last.inEditMode = false\n grid.last._edit = null\n // remove - by updating cell data\n if (!summary) {\n if (rec.TsUi?.['changes']?.[col.field] != null) {\n cell.addClass('tsg-changed')\n } else {\n cell.removeClass('tsg-changed')\n }\n cell.replace(grid.getCellHTML(index, column, summary))\n }\n // remove - spreadsheet\n query(grid.box).find('div.tsg-edit-box').remove()\n // update toolbar buttons\n grid.updateToolbar()\n // keep grid in focus if needed\n setTimeout(() => {\n const input = query(grid.box).find(`#grid_${grid.name}_focus`).get(0)\n if (document.activeElement !== input && !grid.last.inEditMode) {\n input.focus()\n }\n }, 10)\n}\n","/**\n * grid-search.ts — Search domain extracted from TsGrid (Phase 6 of v2.0 SDD).\n * All functions take (grid: TsGrid, ...args) and are delegated from TsGrid methods.\n * DAG: leaf module — imports only tsgrid (type), query, TsUtils, TsTooltip, TsMenu, TsField.\n * FORBIDDEN: do NOT import any other grid-*.ts module (R3).\n */\n\nimport type { TsGrid, TsGridSearch } from './tsgrid.js'\nimport { TsUtils } from './tsutils.js'\nimport { query as _queryRaw } from './query.js'\nimport { TsMenu as _w2menu, TsTooltip as _w2tooltip } from './tstooltip.js'\nimport { TsField } from './tsfield.js'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst query = _queryRaw as (...args: any[]) => any // any: Query wrapper used as jQuery-like\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst TsMenu = _w2menu as any // any: menu overlay with dynamic option shapes\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst TsTooltip = _w2tooltip as any // any: tooltip with flexible option shapes\n\n/** Add one or more search fields. If `search` is omitted, `before` is treated as the search(es) to append. */\n// any: `before` is reassigned inside the body (number | string → number); TS can't narrow post-assignment\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function addSearch(grid: TsGrid, before: any, search?: any): number {\n let added = 0\n if (search === undefined) {\n search = before\n before = grid.searches.length\n } else {\n if (typeof before == 'string') before = grid.getSearch(before, true)\n if (before == null) before = grid.searches.length\n }\n if (!Array.isArray(search)) search = [search]\n for (let i = 0; i < search.length; i++) {\n grid.searches.splice(before, 0, search[i])\n before++\n added++\n }\n grid.searchClose()\n return added\n}\n\nexport function removeSearch(grid: TsGrid, ...fields: string[]) {\n let removed = 0\n for (let a = 0; a < fields.length; a++) {\n const field_a = fields[a]!\n for (let r = grid.searches.length-1; r >= 0; r--) {\n if (grid.searches[r]!.field == field_a) { grid.searches.splice(r, 1); removed++ }\n }\n }\n grid.searchClose()\n return removed\n}\n\nexport function getSearch(grid: TsGrid): string[]\nexport function getSearch(grid: TsGrid, field: string, returnIndex: true): number | null\nexport function getSearch(grid: TsGrid, field: string, returnIndex?: false): TsGridSearch | null\nexport function getSearch(grid: TsGrid, field?: string, returnIndex?: boolean): string[] | number | TsGridSearch | null {\n // no arguments - return fields of all searches\n if (field === undefined) {\n const ret = []\n for (let i = 0; i < grid.searches.length; i++) ret.push(grid.searches[i]!.field)\n return ret\n }\n // find search\n for (let i = 0; i < grid.searches.length; i++) {\n if (grid.searches[i]!.field == field) {\n if (returnIndex === true) return i; else return grid.searches[i]!\n }\n }\n return null\n}\n\nexport function toggleSearch(grid: TsGrid, ...fields: string[]) {\n let effected = 0\n for (let a = 0; a < fields.length; a++) {\n const field_a = fields[a]!\n for (let r = grid.searches.length-1; r >= 0; r--) {\n if (grid.searches[r]!.field == field_a) {\n grid.searches[r]!.hidden = !grid.searches[r]!.hidden\n effected++\n }\n }\n }\n grid.searchClose()\n return effected\n}\n\nexport function showSearch(grid: TsGrid, ...fields: string[]) {\n let shown = 0\n for (let a = 0; a < fields.length; a++) {\n const field_a = fields[a]!\n for (let r = grid.searches.length-1; r >= 0; r--) {\n if (grid.searches[r]!.field == field_a && grid.searches[r]!.hidden !== false) {\n grid.searches[r]!.hidden = false\n shown++\n }\n }\n }\n grid.searchClose()\n return shown\n}\n\nexport function hideSearch(grid: TsGrid, ...fields: string[]) {\n let hidden = 0\n for (let a = 0; a < fields.length; a++) {\n const field_a = fields[a]!\n for (let r = grid.searches.length-1; r >= 0; r--) {\n if (grid.searches[r]!.field == field_a && grid.searches[r]!.hidden !== true) {\n grid.searches[r]!.hidden = true\n hidden++\n }\n }\n }\n grid.searchClose()\n return hidden\n}\n\n// any: Record<string, any> — dynamic property bag; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getSearchData(grid: TsGrid, field: string): Record<string, any> | null {\n for (let i = 0; i < grid.searchData.length; i++) {\n if (grid.searchData[i]!.field == field) return grid.searchData[i]!\n }\n return null\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function search(grid: TsGrid, field?: any, value?: any) { // any: field can be string or searchData array; value varies\n const url = grid.url?.get ?? grid.url\n const searchData = []\n let last_multi = grid.last.multi\n let last_logic = grid.last.logic\n let last_field = grid.last.field\n let last_search = grid.last.search\n let hasHiddenSearches = false\n const overlay = query(`#w2overlay-${grid.name}-search-overlay`)\n // if emty sting, same as no search\n if (value === '') value = null\n // add hidden searches\n for (let i = 0; i < grid.searches.length; i++) {\n const srch_i = grid.searches[i]!\n if (!srch_i.hidden || srch_i.value == null) continue\n searchData.push({\n field : srch_i.field,\n operator : srch_i.operator || 'is',\n type : srch_i.type,\n value : srch_i.value || ''\n })\n hasHiddenSearches = true\n }\n if (field === undefined && overlay.length === 0) {\n if (grid.multiSearch) {\n field = grid.searchData\n value = grid.last.logic\n } else {\n field = grid.last.field\n value = grid.last.search\n }\n }\n // 1: search() - advanced search (reads from popup)\n if (field === undefined && overlay.length !== 0) {\n grid.focus() // otherwise search drop down covers searches\n last_logic = overlay.find(`#grid_${grid.name}_logic`).val()\n last_search = ''\n // advanced search\n for (let i = 0; i < grid.searches.length; i++) {\n const srch = grid.searches[i]!\n const operator = overlay.find('#grid_'+ grid.name + '_operator_'+ i).val()\n const field1 = overlay.find('#grid_'+ grid.name + '_field_'+ i)\n const field2 = overlay.find('#grid_'+ grid.name + '_field2_'+ i)\n let value1 = field1.val()\n let value2 = field2.val()\n let svalue = null\n let text = null\n\n if (['int', 'float', 'money', 'currency', 'percent'].indexOf(srch.type) != -1) {\n const fld1 = field1[0]._w2field\n const fld2 = field2[0]._w2field\n if (fld1) value1 = fld1.clean(value1)\n if (fld2) value2 = fld2.clean(value2)\n }\n if (['list', 'enum'].indexOf(srch.type) != -1 || ['in', 'not in'].indexOf(operator) != -1) {\n value1 = field1[0]._w2field.selected || {}\n if (Array.isArray(value1)) {\n svalue = []\n for (let j = 0; j < value1.length; j++) {\n svalue.push(TsUtils.isFloat(value1[j].id) ? parseFloat(value1[j].id) : String(value1[j].id).toLowerCase())\n delete value1[j].hidden\n }\n if (Object.keys(value1).length === 0) value1 = ''\n } else {\n text = value1.text || ''\n value1 = value1.id || ''\n }\n }\n if ((value1 !== '' && value1 != null) || (value2 != null && value2 !== '')) {\n // any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tmp: any = {\n field : srch.field,\n type : srch.type,\n operator : operator\n }\n if (operator == 'between') {\n TsUtils.extend(tmp, { value: [value1, value2] })\n } else if (operator == 'in' && typeof value1 == 'string') {\n TsUtils.extend(tmp, { value: value1.split(',') })\n } else if (operator == 'not in' && typeof value1 == 'string') {\n TsUtils.extend(tmp, { value: value1.split(',') })\n } else {\n TsUtils.extend(tmp, { value: value1 })\n }\n if (svalue) TsUtils.extend(tmp, { svalue: svalue })\n if (text) TsUtils.extend(tmp, { text: text })\n\n // convert date to unix time\n try {\n if (srch.type == 'date' && operator == 'between') {\n tmp.value[0] = value1 // TsUtils.isDate(value1, TsUtils.settings.dateFormat, true).getTime();\n tmp.value[1] = value2 // TsUtils.isDate(value2, TsUtils.settings.dateFormat, true).getTime();\n }\n if (srch.type == 'date' && operator == 'is') {\n tmp.value = value1 // TsUtils.isDate(value1, TsUtils.settings.dateFormat, true).getTime();\n }\n } catch (e) {\n\n }\n searchData.push(tmp)\n last_multi = true // if only hidden searches, then do not set\n }\n }\n }\n // 2: search(field, value) - regular search\n if (typeof field == 'string') {\n // if only one argument - search all\n if (value === undefined) {\n value = field\n field = 'all'\n }\n last_field = field\n last_search = value\n last_multi = false\n last_logic = (hasHiddenSearches ? 'AND' : 'OR')\n // loop through all searches and see if it applies\n if (value != null) {\n if (field.toLowerCase() == 'all') {\n // if there are search fields loop thru them\n if (grid.searches.length > 0) {\n for (let i = 0; i < grid.searches.length; i++) {\n const srch = grid.searches[i]!\n if (srch.type == 'text' || (srch.type == 'alphanumeric' && TsUtils.isAlphaNumeric(value))\n || (srch.type == 'int' && TsUtils.isInt(value)) || (srch.type == 'float' && TsUtils.isFloat(value))\n || (srch.type == 'percent' && TsUtils.isFloat(value)) || ((srch.type == 'hex' || srch.type == 'color') && TsUtils.isHex(value))\n || (srch.type == 'currency' && TsUtils.isMoney(value)) || (srch.type == 'money' && TsUtils.isMoney(value))\n || (srch.type == 'date' && TsUtils.isDate(value)) || (srch.type == 'time' && TsUtils.isTime(value))\n || (srch.type == 'datetime' && TsUtils.isDateTime(value)) || (srch.type == 'datetime' && TsUtils.isDate(value))\n || (srch.type == 'enum' && TsUtils.isAlphaNumeric(value)) || (srch.type == 'list' && TsUtils.isAlphaNumeric(value))\n ) {\n const def = grid.defaultOperator[grid.operatorsMap[srch.type]!]\n const tmp = {\n field : srch.field,\n type : srch.type,\n operator : (srch.operator != null ? srch.operator : def),\n value : value\n }\n if (String(value).trim() != '') searchData.push(tmp)\n }\n // range in global search box\n if (['int', 'float', 'money', 'currency', 'percent'].indexOf(srch.type) != -1){\n const t = String(value).trim().split('-').map(v => v.trim()).filter(v => TsUtils.isFloat(v))\n if (t.length == 2) {\n const tmp = {\n field : srch.field,\n type : srch.type,\n operator : 'between',\n value : [t[0], t[1]]\n }\n searchData.push(tmp)\n }\n }\n // lists fields\n if (['list', 'enum'].indexOf(srch.type) != -1) {\n const new_values = []\n if (srch.options == null) srch.options = {}\n if (!Array.isArray(srch.options['items'])) srch.options['items'] = []\n for (let j = 0; j < srch.options['items']; j++) {\n const tmp = srch.options['items'][j]\n try {\n const re = new RegExp(value, 'i')\n if (re.test(tmp)) new_values.push(j)\n if (tmp.text && re.test(tmp.text)) new_values.push(tmp.id)\n } catch (e) {}\n }\n if (new_values.length > 0) {\n const tmp = {\n field : srch.field,\n type : srch.type,\n operator : (srch.operator != null ? srch.operator : 'in'),\n value : new_values\n }\n searchData.push(tmp)\n }\n }\n }\n } else {\n // no search fields, loop thru columns\n for (let i = 0; i < grid.columns.length; i++) {\n const tmp = {\n field : grid.columns[i]!.field,\n type : 'text',\n operator : grid.defaultOperator['text'],\n value : value\n }\n searchData.push(tmp)\n }\n }\n /**\n * If user searched ALL field and there was no matching searches then add a bogus field, so that no result will be\n * shown. Otherwise search string is not empty, but no fields is actually applied and all fields are shown\n */\n if (searchData.length == 0) {\n const tmp = {\n field: 'All',\n type: 'text',\n operator: grid.defaultOperator['text'],\n value: value\n }\n searchData.push(tmp)\n }\n } else {\n const el = overlay.find('#grid_'+ grid.name +'_search_all')\n let srch = grid.getSearch(field)\n if (srch == null) srch = { field: field, type: 'text' }\n if (srch.field == field) grid.last.label = srch.label ?? ''\n if (value !== '') {\n let op = grid.defaultOperator[grid.operatorsMap[srch.type]!]\n let val = value\n if (['date', 'time', 'datetime'].indexOf(srch.type) != -1) op = 'is'\n if (['list', 'enum'].indexOf(srch.type) != -1) {\n op = 'is'\n const tmp = el._w2field?.get()\n if (tmp && Object.keys(tmp).length > 0) val = tmp.id; else val = ''\n }\n if (srch.type == 'int' && value !== '') {\n op = 'is'\n if (String(value).indexOf('-') != -1) {\n const tmp = value.split('-')\n if (tmp.length == 2) {\n op = 'between'\n val = [parseInt(tmp[0]), parseInt(tmp[1])]\n }\n }\n if (String(value).indexOf(',') != -1) {\n const tmp = value.split(',')\n op = 'in'\n val = []\n for (let i = 0; i < tmp.length; i++) val.push(tmp[i])\n }\n }\n if (srch.operator != null) op = srch.operator\n const tmp = {\n field : srch.field,\n type : srch.type,\n operator : op,\n value : val\n }\n searchData.push(tmp)\n }\n }\n }\n }\n // 3: search([{ field, value, [operator,] [type] }, { field, value, [operator,] [type] } ], logic) - submit whole structure\n if (Array.isArray(field)) {\n let logic: 'AND' | 'OR' = 'AND'\n if (typeof value == 'string') {\n const upperLogic = value.toUpperCase()\n if (upperLogic === 'OR' || upperLogic === 'AND') logic = upperLogic\n }\n last_search = ''\n last_multi = true\n last_logic = logic\n for (let i = 0; i < field.length; i++) {\n const data = field[i]\n if (typeof data.value == 'number' && data.operator == null) data.operator = grid.defaultOperator['number']\n if (typeof data.value == 'string' && data.operator == null) data.operator = grid.defaultOperator['text']\n if (Array.isArray(data.value) && data.operator == null) data.operator = grid.defaultOperator['enum']\n if (TsUtils.isDate(data.value) && data.operator == null) data.operator = grid.defaultOperator['date']\n\n // merge current field and search if any\n searchData.push(data)\n }\n }\n // event before\n const edata = grid.trigger('search', {\n target: grid.name,\n multi: (field === undefined ? true : false),\n searchField: (field ? field : 'multi'),\n searchValue: (field ? value : 'multi'),\n searchData: searchData,\n searchLogic: last_logic\n })\n if (edata.isCancelled === true) return\n // default action\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n grid.searchData = edata.detail['searchData'] as any[] // any: detail values are unknown from TsEventData\n grid.last.field = last_field\n grid.last.search = last_search\n grid.last.multi = last_multi\n grid.last.logic = edata.detail['searchLogic'] as 'AND' | 'OR'\n grid.last.vscroll.scrollTop = 0\n grid.last.vscroll.scrollLeft = 0\n grid.last.selection.indexes = []\n grid.last.selection.columns = {}\n // -- clear all search field\n grid.searchClose()\n // apply search\n if (url) {\n grid.last.fetch.offset = 0\n grid.reload()\n } else {\n // local search\n grid.localSearch()\n grid.refresh()\n }\n // event after\n edata.finish()\n}\n\n// open advanced search popover\n// any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function searchOpen(grid: TsGrid, options: any = {}) {\n if (!grid.box) return\n if (grid.searches.length === 0) return\n // event before\n const edata = grid.trigger('searchOpen', { target: grid.name })\n if (edata.isCancelled === true) {\n return\n }\n const $btn = query(grid.toolbar.box).find('.tsg-grid-search-input .tsg-search-drop')\n $btn.addClass('checked')\n // show search\n TsTooltip.show({\n name: grid.name + '-search-overlay',\n anchor: query(grid.box).find('#grid_'+ grid.name +'_search_all').get(0),\n position: 'bottom|top',\n html: grid.getSearchesHTML(),\n align: 'left',\n arrowSize: 12,\n class: 'tsg-grid-search-advanced',\n hideOn: ['doc-click'],\n ...(options?.overlay ?? {})\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .then((_event: any) => { // any: TsMenu/TsTooltip event detail shape varies\n grid.initSearches()\n grid.last['search_opened'] = true\n const overlay = query(`#w2overlay-${grid.name}-search-overlay`)\n overlay\n .data('gridName', grid.name)\n .off('.grid-search')\n .on('click.grid-search', (event: Event) => {\n // hide any tooltip opened by searches\n overlay.find('input, select').each((el: Node) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const names: any[] = query(el).data('tooltipName') // any: tooltip name list shape varies\n if (names) names.forEach((name: string) => {\n TsTooltip.hide(name)\n })\n })\n console.log(event.target)\n if (!query(event.target).hasClass('tsg-saved-searches')) {\n TsTooltip.hide(grid.name + '-search-suggest')\n }\n })\n TsUtils.bindEvents(overlay.find('select, input, button'), grid)\n // init first field\n const sfields = query(`#w2overlay-${grid.name}-search-overlay *[rel=search]`)\n if (sfields.length > 0) sfields[0].focus()\n // event after\n edata.finish()\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .hide((_event: any) => { // any: TsTooltip event shape varies\n const edata = grid.trigger('searchClose', { target: grid.name })\n if (edata.isCancelled === true) {\n return\n }\n $btn.removeClass('checked')\n grid.last['search_opened'] = false\n edata.finish()\n })\n}\n\nexport function searchClose(grid: TsGrid) {\n TsTooltip.hide(grid.name + '-search-overlay')\n}\n\n// if clicked on a field in the search strip\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function searchFieldTooltip(grid: TsGrid, ind: any, sd_ind: any, el: any) { // any: all params are loosely typed from DOM\n const sf = grid.searches[ind]\n const sd = grid.searchData[sd_ind]\n if (sd == null || sf == null) return\n let oper = sd.operator\n if (oper == 'more' && sd.type == 'date') oper = 'since'\n if (oper == 'less' && sd.type == 'date') oper = 'before'\n let options = ''\n let val = sd.value\n if (Array.isArray(sd.value)) { // && Array.isArray(sf.options.items)) {\n sd.value.forEach(opt => {\n options += `<span class=\"value\">${opt.text || opt}</span>`\n })\n if (sd.type == 'date') {\n options = ''\n sd.value.forEach(opt => {\n options += `<span class=\"value\">${TsUtils.formatDate(opt)}</span>`\n })\n }\n } else {\n if (sd.type == 'date') {\n val = TsUtils.formatDateTime(val)\n }\n\n }\n TsTooltip.hide(grid.name + '-search-props')\n TsTooltip.show({\n name: grid.name + '-search-props',\n anchor: el,\n class: 'tsg-white',\n hideOn: 'doc-click',\n html: `\n <div class=\"tsg-grid-search-single\">\n <span class=\"field\">${sf.label ?? ''}</span>\n <span class=\"operator\">${TsUtils.lang(oper)}</span>\n ${Array.isArray(sd.value)\n ? `${options}`\n : `<span class=\"value\">${val}</span>`\n }\n <div class=\"buttons\">\n <button id=\"remove\" class=\"tsg-btn\">${TsUtils.lang('Remove This Field')}</button>\n </div>\n </div>`\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }).then((event: any) => { // any: TsMenu/TsTooltip event detail shape varies\n query(event.detail.overlay.box).find('#remove').on('click', () => {\n grid.searchData.splice(sd_ind, 1)\n grid.reload()\n grid.localSearch()\n TsTooltip.hide(grid.name + '-search-props')\n })\n })\n}\n\n// drop down with save searches\nexport function searchSuggest(grid: TsGrid, imediate?: boolean, forceHide?: boolean, anchor?: HTMLElement | Element) {\n clearTimeout(grid.last.kbd_timer ?? undefined)\n clearTimeout(grid.last['overlay_timer'])\n grid.searchShowFields(true)\n if (anchor == null) grid.searchClose()\n if (forceHide === true || (anchor != null && query(`#w2overlay-${grid.name}-search-suggest`).length > 0)) {\n TsTooltip.hide(grid.name + '-search-suggest')\n return\n }\n if (query(`#w2overlay-${grid.name}-search-suggest`).length > 0) {\n // already shown\n return\n }\n if (!imediate) {\n grid.last['overlay_timer'] = setTimeout(() => { grid.searchSuggest(true) }, 100)\n return\n }\n\n const el = anchor ?? query(grid.box).find(`#grid_${grid.name}_search_all`).get(0)\n const searches = [\n ...grid.defaultSearches ?? [],\n ...grid.defaultSearches?.length > 0 && grid.savedSearches?.length > 0 ? ['--'] : [],\n ...grid.savedSearches ?? []\n ]\n if (Array.isArray(searches) && searches.length > 0) {\n TsMenu.show({\n name: grid.name + '-search-suggest',\n anchor: el,\n align: anchor != null ? 'left' : 'both',\n items: searches,\n selected: false,\n filter: true,\n hideOn: ['doc-click', 'sleect', 'remove'],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n render(item: any) { // any: TsMenu item shape varies\n let ret = item.text\n if (item.isDefault) ret = `<b>${ret}</b>`\n return ret\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .select((event: any) => { // any: TsMenu event shape varies\n const edata = grid.trigger('searchSelect', {\n target: grid.name,\n index: event.detail.index,\n item: event.detail.item\n })\n if (edata.isCancelled === true) {\n event.preventDefault()\n return\n }\n event.detail.overlay.hide()\n grid.last.logic = event.detail.item.logic || 'AND'\n grid.last.search = ''\n grid.last.label = '[Multiple Fields]'\n grid.searchData = TsUtils.clone(event.detail.item.data)\n grid['searchSelected'] = TsUtils.clone(event.detail.item, { exclude: ['icon', 'remove'] })\n grid.reload()\n edata.finish()\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .remove((event: any) => { // any: TsMenu event shape varies\n const item = event.detail.item\n const edata = grid.trigger('searchRemove', { target: grid.name, index: event.detail.index, item })\n if (edata.isCancelled === true) {\n event.preventDefault()\n return\n }\n queueMicrotask(() => event.detail.overlay.hide())\n TsTooltip.hide(grid.name + '-search-overlay')\n\n // any: cast-to-any for dynamic dispatch; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(grid.confirm(TsUtils.lang('Do you want to delete search \"${item}\"?', { item: item.text })) as any)\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .yes((evt: any) => {\n // remove from searches\n const srch = grid.savedSearches.findIndex((s) => s.id == item.id ? true : false)\n if (srch !== -1) {\n grid.savedSearches.splice(srch, 1)\n }\n grid.cacheSave('searches', grid.savedSearches.map(s => TsUtils.clone(s, { exclude: ['remove', 'icon'] })))\n evt.detail.self.close()\n // evt after\n edata.finish()\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .no((evt: any) => { // any: TsConfirm evt shape\n evt.detail.self.close()\n })\n })\n }\n}\n\nexport function searchSave(grid: TsGrid) {\n let value = ''\n if (grid['searchSelected']) {\n value = grid['searchSelected'].text\n }\n const ind = grid.savedSearches.findIndex(s => { return s.id == grid['searchSelected']?.id ? true : false })\n // event before\n const edata = grid.trigger('searchSave', { target: grid.name, saveLocalStorage: true })\n if (edata.isCancelled === true) return\n\n grid.message({\n width: 350,\n height: 150,\n body: `<div class=\"tsg-grid-save-search\">\n <span>${TsUtils.lang(ind != -1 ? 'Update Search' : 'Save New Search')}</span>\n <input class=\"search-name tsg-input\" placeholder=\"${TsUtils.lang('Search name')}\">\n </div>`,\n buttons: `\n <button id=\"grid-search-cancel\" class=\"tsg-btn\">${TsUtils.lang('Cancel')}</button>\n <button id=\"grid-search-save\" class=\"tsg-btn tsg-btn-blue\" ${String(value).trim() == '' ? 'disabled': ''}>${TsUtils.lang('Save')}</button>\n `\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n })?.open(async (event: any) => { // any: TsEvent message open callback\n query(event.detail.box).find('input, button').eq(0).val(value)\n await event.complete\n query(event.detail.box).find('#grid-search-cancel').on('click', () => {\n grid.message()\n })\n query(event.detail.box).find('#grid-search-save').on('click', () => {\n const input = query(event.detail.box).find('.tsg-message .search-name')\n const name = input.val()\n // save in savedSearches\n if (grid['searchSelected'] && ind != -1) {\n Object.assign(grid.savedSearches[ind], {\n id: name,\n text: name,\n logic: grid.last.logic,\n data: TsUtils.clone(grid.searchData)\n })\n } else {\n grid.savedSearches.push({\n id: name,\n text: name,\n icon: 'tsg-icon-search',\n remove: true,\n logic: grid.last.logic,\n data: grid.searchData\n })\n }\n // save local storage\n grid.cacheSave('searches', grid.savedSearches.map(s => TsUtils.clone(s, { exclude: ['remove', 'icon'] })))\n grid.message()\n // update on screen\n if (grid['searchSelected']) {\n grid['searchSelected'].text = name\n query(grid.box).find(`#grid_${grid.name}_search_name .name-text`).html(name)\n } else {\n grid['searchSelected'] = {\n text: name,\n logic: grid.last.logic,\n data: TsUtils.clone(grid.searchData)\n }\n query(event.detail.box).find(`#grid_${grid.name}_search_all`).val(' ').prop('readOnly', true)\n query(event.detail.box).find(`#grid_${grid.name}_search_name`).show().find('.name-text').html(name)\n }\n edata.finish({ name })\n })\n await TsUtils.wait(100) // need this for dialog to be ready (sliding down) for focus to work\n query(event.detail.box).find('input, button')\n .off('.message')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('keydown.message', (evt: any) => { // any: KeyboardEvent at runtime\n const val = String(query(event.detail.box).find('.tsg-message-body input').val()).trim()\n if (evt.keyCode == 13 && val != '') {\n query(event.detail.box).find('#grid-search-save').trigger('click') // enter\n }\n if (evt.keyCode == 27) { // escape\n grid.message()\n }\n })\n .eq(0)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('input.message', (_evt: any) => { // any: InputEvent at runtime\n const $save = query(event.detail.box).closest('.tsg-message').find('#grid-search-save')\n if (String(query(event.detail.box).val()).trim() === '') {\n $save.prop('disabled', true)\n } else {\n $save.prop('disabled', false)\n }\n })\n .get(0)\n .focus()\n })\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function cache(grid: TsGrid, type: any) { // any: cache key is always string, loosely typed\n if (TsUtils.hasLocalStorage && grid.useLocalStorage) {\n try {\n const data = JSON.parse(localStorage['TsUi'] || '{}')\n data[(grid.stateId || grid.name)] ??= {}\n return data[(grid.stateId || grid.name)][type]\n } catch (e) {\n }\n }\n return null\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function cacheSave(grid: TsGrid, type: any, value: any) { // any: cache key and value are dynamic\n if (TsUtils.hasLocalStorage && grid.useLocalStorage) {\n try {\n const data = JSON.parse(localStorage['TsUi'] || '{}')\n data[(grid.stateId || grid.name)] ??= {}\n data[(grid.stateId || grid.name)][type] = value\n localStorage['TsUi'] = JSON.stringify(data)\n return true\n } catch (e) {\n delete localStorage['TsUi']\n }\n }\n return false\n}\n\nexport function searchReset(grid: TsGrid, noReload?: boolean) {\n const searchData = []\n let hasHiddenSearches = false\n // add hidden searches\n for (let i = 0; i < grid.searches.length; i++) {\n const srch_r = grid.searches[i]!\n if (!srch_r.hidden || srch_r.value == null) continue\n searchData.push({\n field : srch_r.field,\n operator : srch_r.operator || 'is',\n type : srch_r.type,\n value : srch_r.value || ''\n })\n hasHiddenSearches = true\n }\n // event before\n const edata = grid.trigger('search', { reset: true, target: grid.name, searchData: searchData })\n if (edata.isCancelled === true) return\n // default action\n const input = query(grid.box).find('#grid_'+ grid.name +'_search_all')\n // any: cast-then-index for dynamic property access; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n grid.searchData = edata.detail['searchData'] as any[]\n grid['searchSelected'] = null\n grid.last.search = ''\n grid.last.logic = (hasHiddenSearches ? 'AND' : grid.last.logic)\n // advanced search button\n if (grid.multiSearch) {\n input.next().show()\n } else {\n input.next().hide()\n }\n grid.last.multi = false\n grid.last.fetch.offset = 0\n // reset scrolling position\n grid.last.vscroll.scrollTop = 0\n grid.last.vscroll.scrollLeft = 0\n grid.last.selection.indexes = []\n grid.last.selection.columns = {}\n // -- clear all search field\n grid.searchClose()\n const all = input.val('').get(0)\n if (all?._w2field) { all._w2field.reset() }\n // apply search\n if (!noReload) {\n grid.reload()\n }\n // event after\n edata.finish()\n}\n\nexport function searchShowFields(grid: TsGrid, forceHide?: boolean) {\n if (forceHide === true) {\n TsTooltip.hide(grid.name + '-search-fields')\n return\n }\n const items = []\n for (let s = -1; s < grid.searches.length; s++) {\n let srch: TsGridSearch | undefined = grid.searches[s]\n const sField = (srch ? srch.field : null)\n const column = sField != null ? grid.getColumn(sField) : null\n let disabled = false\n let tooltip = null\n if (grid.show.searchHiddenMsg == true && s != -1\n && (column == null || (column.hidden === true && column.hideable !== false))) {\n disabled = true\n tooltip = TsUtils.lang(`This column ${column == null ? 'does not exist' : 'is hidden'}`)\n }\n if (s == -1) { // -1 is All Fields search\n if (!grid.multiSearch || !grid.show.searchAll) continue\n srch = { field: 'all', label: 'All Fields', type: 'text' } as TsGridSearch\n } else {\n if (column != null && column.hideable === false) continue\n if (srch == null) continue\n if (srch.hidden === true) {\n tooltip = TsUtils.lang('This column is hidden')\n // don't show hidden (not simple) searches\n if (srch['simple'] === false) continue\n }\n }\n if (srch == null) continue\n if (srch.label == null && srch['caption'] != null) {\n console.log('NOTICE: grid search.caption property is deprecated, please use search.label. Search ->', srch)\n srch.label = srch['caption']\n }\n items.push({\n id: srch.field,\n text: TsUtils.lang(srch.label ?? ''),\n search: srch,\n tooltip,\n disabled,\n checked: (srch.field == grid.last.field)\n })\n }\n TsMenu.show({\n type: 'radio',\n name: grid.name + '-search-fields',\n anchor: query(grid.box).find('#grid_'+ grid.name +'_search_name').parent().find('.tsg-search-down').get(0),\n items,\n align: 'none',\n hideOn: ['doc-click', 'select']\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .select((event: any) => { // any: TsMenu event shape varies\n grid.searchInitInput(event.detail.item.search.field)\n })\n}\n\n// any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function searchInitInput(grid: TsGrid, field: string, _value?: any) {\n let srch\n const el = query(grid.box).find('#grid_'+ grid.name +'_search_all')\n if (field == 'all') {\n srch = { field: 'all', label: TsUtils.lang('All Fields') }\n } else {\n srch = grid.getSearch(field)\n if (srch == null) return\n }\n // update field\n if (grid.last.search != '') {\n grid.last.label = srch.label ?? ''\n grid.search(srch.field, grid.last.search)\n } else {\n grid.last.field = srch.field\n grid.last.label = srch.label ?? ''\n }\n el.attr('placeholder', TsUtils.lang('Search') + ' ' + TsUtils.lang(srch.label || srch['caption'] || srch.field, true))\n\n // if there is pre-selected search\n if (grid['searchSelected']) {\n query(grid.box).find(`#grid_${grid.name}_search_all`).val(' ').prop('readOnly', true)\n query(grid.box).find(`#grid_${grid.name}_search_name`).show().find('.name-text').html(grid['searchSelected'].text)\n } else {\n query(grid.box).find(`#grid_${grid.name}_search_all`).prop('readOnly', false)\n query(grid.box).find(`#grid_${grid.name}_search_name`).hide().find('.name-text').html('')\n }\n}\n\nexport function getSearchesHTML(grid: TsGrid) {\n let html = `\n <div class=\"search-title\">\n ${TsUtils.lang('Advanced Search')}\n ${grid.savedSearches?.length > 0\n ? `<button class=\"tsg-btn tsg-saved-searches\" data-click=\"searchSuggest|true|false|this\">Saved Searches (${grid.savedSearches?.length ?? 0})</button>`\n : ''\n }\n <span class=\"search-logic\" style=\"${grid.show.searchLogic ? '' : 'display: none'}\">\n <select id=\"grid_${grid.name}_logic\" class=\"tsg-input\">\n <option value=\"AND\" ${grid.last.logic == 'AND' ? 'selected' : ''}>${TsUtils.lang('All')}</option>\n <option value=\"OR\" ${grid.last.logic == 'OR' ? 'selected' : ''}>${TsUtils.lang('Any')}</option>\n </select>\n </span>\n </div>\n `\n // any: array of heterogeneous runtime values; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const columns: any[] = []\n let col_ind = 0\n columns.push('<div><table cellspacing=\"0\"><tbody>')\n for (let i = 0; i < grid.searches.length; i++) {\n const s = grid.searches[i]!\n s.type = String(s.type).toLowerCase()\n if (s.hidden) continue\n\n if (s.type == 'new-column') {\n columns[col_ind] += '</tbody></table></div>'\n columns.push('<div><table cellspacing=\"0\"><tbody>')\n col_ind++\n continue\n }\n if (s.attr == null) s.attr = ''\n if (s.text == null) s.text = ''\n if (s.style == null) s.style = ''\n if (s.type == null) s.type = 'text'\n if (s.label == null && s['caption'] != null) {\n console.log('NOTICE: grid search.caption property is deprecated, please use search.label. Search ->', s)\n s.label = s['caption']\n }\n const operator =`\n <select id=\"grid_${grid.name}_operator_${i}\" class=\"tsg-input\" data-change=\"initOperator|${i}\">\n ${grid.getOperators(s.type, s.operators)}\n </select>\n `\n columns[col_ind] += `<tr>\n <td class=\"caption\">${(TsUtils.lang(s.label ?? s.field) || '')}</td>\n <td class=\"operator\">${operator}</td>\n <td class=\"value\">`\n\n let tmpStyle\n switch (s.type) {\n case 'text':\n case 'alphanumeric':\n case 'hex':\n case 'color':\n case 'list':\n case 'combo':\n case 'enum':\n tmpStyle = 'width: 250px;'\n if (['hex', 'color'].indexOf(s.type) != -1) tmpStyle = 'width: 90px;'\n columns[col_ind] += `<input rel=\"search\" type=\"text\" id=\"grid_${grid.name}_field_${i}\" name=\"${s.field}\"\n class=\"tsg-input\" style=\"${tmpStyle + s.style}\" ${s.attr}>`\n break\n\n case 'int':\n case 'float':\n case 'money':\n case 'currency':\n case 'percent':\n case 'date':\n case 'time':\n case 'datetime':\n tmpStyle = 'width: 90px;'\n if (s.type == 'datetime') tmpStyle = 'width: 140px;'\n columns[col_ind] += `<input id=\"grid_${grid.name}_field_${i}\" name=\"${s.field}\" ${s.attr} rel=\"search\" type=\"text\"\n class=\"tsg-input\" style=\"${tmpStyle + s.style}\">\n <span id=\"grid_${grid.name}_range_${i}\" style=\"display: none\">&#160;-&#160;&#160;\n <input rel=\"search\" type=\"text\" class=\"tsg-input\" style=\"${tmpStyle + s.style}\" id=\"grid_${grid.name}_field2_${i}\" name=\"${s.field}\" ${s.attr}>\n </span>`\n break\n\n case 'select':\n columns[col_ind] += `<select rel=\"search\" class=\"tsg-input\" style=\"${s.style}\" id=\"grid_${grid.name}_field_${i}\"\n name=\"${s.field}\" ${s.attr}></select>`\n break\n\n }\n columns[col_ind] += s.text +\n ' </td>' +\n '</tr>'\n }\n columns[col_ind] += '</tbody></table></div>'\n\n html += `\n <div class=\"search-body\">\n ${columns.join('')}\n </div>\n <div class=\"search-bottom actions\">\n <button type=\"button\" class=\"tsg-btn close-btn\" data-click=\"searchClose\">${TsUtils.lang('Close')}</button>\n <div style=\"float: right; display: inline\">\n <button type=\"button\" class=\"tsg-btn\" data-click=\"searchReset\">${TsUtils.lang('Reset')}</button>\n <button type=\"button\" class=\"tsg-btn tsg-btn-blue\" data-click=\"search\">${TsUtils.lang('Search')}</button>\n </div>\n </div>\n `\n return html\n}\n\n// any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getOperators(grid: TsGrid, type: any, opers: any) {\n let operators = grid.operators[grid.operatorsMap[type] ?? ''] || []\n if (opers != null && Array.isArray(opers)) {\n operators = opers\n }\n let html = ''\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n operators.forEach((oper: any) => {\n let displayText = oper\n let operValue = oper\n if (Array.isArray(oper)) {\n displayText = oper[1]\n operValue = oper[0]\n } else if (TsUtils.isPlainObject(oper)) {\n displayText = oper.text\n operValue = oper.oper\n }\n if (displayText == null) displayText = oper\n html += `<option value=\"${operValue}\">${TsUtils.lang(displayText)}</option>\\n`\n })\n return html\n}\n\n// any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function initOperator(grid: TsGrid, ind: any) {\n let options\n const srch = grid.searches[ind]!\n const sdata = grid.getSearchData(srch.field)\n const overlay = query(`#w2overlay-${grid.name}-search-overlay`)\n const $rng = overlay.find(`#grid_${grid.name}_range_${ind}`)\n const $fld1 = overlay.find(`#grid_${grid.name}_field_${ind}`)\n const $fld2 = overlay.find(`#grid_${grid.name}_field2_${ind}`)\n const $oper = overlay.find(`#grid_${grid.name}_operator_${ind}`)\n const oper = $oper.val()\n $fld1.show()\n $rng.hide()\n // init based on operator value\n switch (oper) {\n case 'between':\n $rng.css('display', 'inline')\n break\n case 'null':\n case 'not null':\n $fld1.hide()\n $fld1.val(oper) // need to insert something for search to activate\n $fld1.trigger('change')\n break\n }\n\n // init based on search type\n switch (srch.type) {\n case 'text':\n case 'alphanumeric':\n const fld = $fld1[0]._w2field\n if (fld) { fld.reset() }\n break\n\n case 'int':\n case 'float':\n case 'hex':\n case 'color':\n case 'money':\n case 'currency':\n case 'percent':\n case 'date':\n case 'time':\n case 'datetime':\n if (!$fld1[0]._w2field) {\n // init fields\n new TsField(srch.type, { el: $fld1[0], ...srch.options })\n new TsField(srch.type, { el: $fld2[0], ...srch.options })\n setTimeout(() => { // convert to date if it is number\n $fld1.trigger('keydown')\n $fld2.trigger('keydown')\n }, 1)\n }\n break\n\n case 'list':\n case 'combo':\n case 'enum':\n options = srch.options ?? {}\n if (srch.type == 'list') options['selected'] = {}\n if (srch.type == 'enum') options['selected'] = []\n if (sdata) options['selected'] = sdata['value']\n if (!$fld1[0]._w2field) {\n const fld = new TsField(srch.type, {\n el: $fld1[0],\n ...options,\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSelect: async (event: any) => {\n await event.complete\n grid.initSearchLists(srch.field)\n },\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onRemove: async (event: any) => {\n await event.complete\n grid.initSearchLists(srch.field)\n }\n })\n if (sdata && sdata['text'] != null) {\n fld.set({ id: sdata['value'], text: sdata['text'] })\n }\n srch['_w2field'] = fld\n }\n break\n\n case 'select':\n // build options\n options = '<option value=\"\">--</option>'\n const searchOpts = srch.options ?? {}\n for (let i = 0; i < searchOpts['items'].length; i++) {\n const si = searchOpts['items'][i]\n if (TsUtils.isPlainObject(searchOpts['items'][i])) {\n let val = si.id\n let txt = si.text\n if (val == null && si.value != null) val = si.value\n if (txt == null && si.text != null) txt = si.text\n if (val == null) val = ''\n options += '<option value=\"'+ val +'\">'+ txt +'</option>'\n } else {\n options += '<option value=\"'+ si +'\">'+ si +'</option>'\n }\n }\n $fld1.html(options)\n break\n }\n grid.initSearchLists()\n}\n\n// any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function initSearchLists(grid: TsGrid, changedField?: any) {\n const fields = grid.getSearch()\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fields.forEach((field: any) => {\n const srch = grid.getSearch(field)\n if (srch != null && srch.options?.['parentList'] != null) {\n const parent = grid.getSearch(srch.options['parentList'])\n if (parent == null) return\n let values = grid.getSearch(parent.field)?.['_w2field']?.get()\n if (Array.isArray(values)) {\n values = values.map(vv => vv.id)\n } else {\n values = values?.id != null ? [values.id] : []\n }\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n srch['_w2field']?.options?.items?.forEach?.((item: any) => {\n const parent = TsUtils.getNested(item, srch?.options?.['parentField'] ?? 'parentId')\n if (parent == null) {\n return\n }\n const possible = TsUtils.clone(Array.isArray(parent) ? parent : [parent])\n possible.unshift('')\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const includes = values.some((item: any) => possible.includes(item))\n if (includes && item.hidden === true) {\n item.hidden = false\n } else if (!includes && item.hidden !== true) {\n item.hidden = true\n }\n })\n }\n })\n // set all fields that refer to changed one to blank\n if (changedField != null) {\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fields.forEach((field: any) => {\n const srch = grid.getSearch(field)\n if (srch != null && srch.options?.['parentList'] == changedField) {\n const fld = srch['_w2field']\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const items = fld.options.items.filter((it: any) => !it.hidden).map((it: any) => it.id)\n if (fld.type == 'list' && !items.includes(fld.get()?.id)) {\n fld.set(null)\n }\n if (fld.type == 'enum') {\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const new_sel = fld.get()?.filter((it: any) => items.includes(it.id))\n fld.set(new_sel || [])\n }\n }\n })\n }\n}\n\nexport function initSearches(grid: TsGrid) {\n const overlay = query(`#w2overlay-${grid.name}-search-overlay`)\n // init searches\n for (let ind = 0; ind < grid.searches.length; ind++) {\n const srch = grid.searches[ind]!\n const sdata = grid.getSearchData(srch.field)\n srch.type = String(srch.type).toLowerCase()\n if (srch.type == 'new-column') {\n continue\n }\n if (typeof srch.options != 'object') srch.options = {}\n // operators\n let operator = srch.operator\n let operators = [...(grid.operators[grid.operatorsMap[srch.type] ?? ''] ?? [])] // need a copy\n if (srch.operators) operators = [...srch.operators] // need a copy as this variable will be changed\n // normalize\n // any: cast-to-any for dynamic dispatch; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (TsUtils.isPlainObject(operator)) operator = (operator as any).oper\n operators.forEach((oper, ind) => {\n if (TsUtils.isPlainObject(oper)) operators[ind] = oper.oper\n })\n if (sdata && sdata['operator']) {\n operator = sdata['operator']\n }\n // default operator\n const def = grid.defaultOperator[grid.operatorsMap[srch.type] ?? '']\n if (operators.indexOf(operator) == -1) {\n operator = def\n }\n overlay.find(`#grid_${grid.name}_operator_${ind}`).val(operator)\n grid.initOperator(ind)\n // populate field value\n const $fld1 = overlay.find(`#grid_${grid.name}_field_${ind}`)\n const $fld2 = overlay.find(`#grid_${grid.name}_field2_${ind}`)\n if (sdata != null) {\n if (!Array.isArray(sdata['value'])) {\n if (sdata['value'] != null) $fld1.val(sdata['value']).trigger('change')\n } else {\n if (['in', 'not in'].includes(sdata['operator'])) {\n $fld1[0]._w2field.set(sdata['value'])\n } else {\n $fld1.val(sdata['value'][0]).trigger('change')\n $fld2.val(sdata['value'][1]).trigger('change')\n }\n }\n }\n }\n // add on change event\n overlay.find('.tsg-grid-search-advanced *[rel=search]')\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('keypress', (evnt: any) => {\n if (evnt.keyCode == 13) {\n grid.search()\n TsTooltip.hide(grid.name + '-search-overlay')\n }\n })\n}\n","/**\n * grid-interaction.ts — Interaction domain extracted from TsGrid (Phase 7 of v2.0 SDD).\n * All functions take (grid: TsGrid, ...args) and are delegated from TsGrid methods.\n * DAG: leaf module — imports only tsgrid (type), query, TsUtils, TsMenu, TsTooltip.\n * FORBIDDEN: do NOT import any other grid-*.ts module (R3).\n * Cross-domain calls (refresh, localSort, localSearch, editField, select, etc.) go through grid.X() delegators.\n */\n\nimport type { TsGrid, TsGridCellSelection, TsGridRecord } from './tsgrid.js'\nimport { TsUtils } from './tsutils.js'\nimport { query as _queryRaw } from './query.js'\nimport { TsMenu as _w2menu } from './tstooltip.js'\nimport type { RecId } from './types.js'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst query = _queryRaw as (...args: any[]) => any // any: Query wrapper used as jQuery-like\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst TsMenu = _w2menu as any // any: menu overlay with dynamic option shapes\n\n// any: recid can be string|number (row select) or {recid, column} object (cell select)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function click(grid: TsGrid, recid: string | number | { recid: string | number; column?: number } | any, event?: MouseEvent | any) {\n const time = Date.now()\n let column = null\n if (grid.last.cancelClick == true || (event && event.altKey)) return\n if ((typeof recid == 'object') && (recid !== null)) {\n column = recid.column\n recid = recid.recid\n }\n if (event == null) event = {}\n // check for double click\n if (time - (grid.last.click_time as number) < 350 && grid.last.click_recid == recid && event.type == 'click') {\n grid.dblClick(recid, event)\n return\n }\n // hide bubble\n if (grid.last.bubbleEl) {\n grid.last.bubbleEl = null\n }\n grid.last.click_time = time\n const last_recid = grid.last.click_recid\n grid.last.click_recid = recid\n // column user clicked on\n if (column == null && event.target) {\n let trg = event.target\n if (trg.tagName != 'TD') trg = query(trg).closest('td')[0]\n if (query(trg).attr('col') != null) column = parseInt(query(trg).attr('col'))\n }\n // check if record is selectable\n const index = grid.get(recid, true)\n const rec = index != null ? grid.records[index]! : null\n if (rec?.TsUi?.selectable === false && (rec?.TsUi?.children?.length ?? 0) > 0) {\n // if not a show-children button, then toggle\n if (!query(event.target).hasClass('tsg-show-children')) {\n grid.toggle(recid)\n return\n }\n }\n // event before\n const edata = grid.trigger('click', { target: grid.name, recid, column, originalEvent: event })\n if (edata.isCancelled === true) return\n // default action\n const sel = grid.getSelection()\n query(grid.box).find('#grid_'+ grid.name +'_check_all').prop('checked', false)\n const ind = grid.get(recid, true)\n const selectColumns = []\n grid.last.sel_ind = ind\n grid.last.sel_col = column\n grid.last.sel_recid = recid\n grid.last.sel_type = 'click'\n // multi select with shift key\n let start: number = 0, end: number = 0, t1: number = 0, t2: number = 0\n if (event.shiftKey && sel.length > 0 && grid.multiSelect) {\n const cellSel = sel as TsGridCellSelection[]\n if (typeof sel[0] === 'object' && cellSel[0]!.recid != null) {\n start = grid.get(cellSel[0]!.recid, true) ?? 0\n end = grid.get(recid, true) ?? 0\n if (column > cellSel[0]!.column) {\n t1 = cellSel[0]!.column\n t2 = column\n } else {\n t1 = column\n t2 = cellSel[0]!.column\n }\n for (let c = t1; c <= t2; c++) selectColumns.push(c)\n } else {\n start = last_recid != null ? (grid.get(last_recid, true) ?? 0) : 0\n end = grid.get(recid, true) ?? 0\n }\n const sel_add = []\n if (start > end) { const tmp = start; start = end; end = tmp }\n const url = grid.url?.get ?? grid.url\n for (let i = start; i <= end; i++) {\n if (grid.searchData.length > 0 && !url && !grid.last.searchIds.includes(i)) continue\n if (grid.selectType == 'row') {\n sel_add.push(grid.records[i]!.recid)\n } else {\n for (let sc = 0; sc < selectColumns.length; sc++) {\n sel_add.push({ recid: grid.records[i]!.recid, column: selectColumns[sc] })\n }\n }\n //sel.push(grid.records[i]!.recid);\n }\n grid.select(sel_add)\n } else {\n const last = grid.last.selection\n let flag = (last.indexes.indexOf(ind ?? -1) != -1 ? true : false)\n let fselect = false\n // if clicked on the checkbox\n if (query(event.target).closest('td').hasClass('tsg-col-select')) fselect = true\n // clear other if necessary\n if (((!event.ctrlKey && !event.shiftKey && !event.metaKey && !fselect) || !grid.multiSelect) && !grid['showSelectColumn']) {\n if (grid.selectType != 'row' && !last.columns[ind ?? -1]?.includes(column)) {\n flag = false\n }\n if (flag === true && sel.length == 1) {\n grid.unselect({ recid: recid, column: column })\n } else {\n grid.selectNone(true) // no need to trigger select event\n grid.select({ recid: recid, column: column })\n }\n } else {\n if (grid.selectType != 'row') flag = false\n if (flag === true) {\n grid.unselect({ recid: recid, column: column })\n } else {\n grid.select({ recid: recid, column: column })\n }\n }\n }\n grid.status()\n grid.initResize()\n // event after\n edata.finish()\n}\n\n// any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function columnClick(grid: TsGrid, field: string, event?: MouseEvent | any) {\n // ignore click if column was resized\n if (grid.last.colResizing === true) {\n return\n }\n // event before\n let edata = grid.trigger('columnClick', { target: grid.name, field: field, originalEvent: event })\n if (edata.isCancelled === true) return\n // default behaviour\n if (grid.selectType == 'row') {\n const column = grid.getColumn(field)\n if (column && column.sortable) grid.sort(field, null, (event && (event.ctrlKey || event.metaKey || event.shiftKey) ? true : false))\n if (edata.detail['field'] == 'line-number') {\n if (grid.getSelection().length >= grid.records.length) {\n grid.selectNone()\n } else {\n grid.selectAll()\n }\n }\n } else {\n if (event.altKey){\n const column = grid.getColumn(field)\n if (column && column.sortable) grid.sort(field, null, (event && (event.ctrlKey || event.metaKey || event.shiftKey) ? true : false))\n }\n // select entire column\n if (edata.detail['field'] == 'line-number') {\n if (grid.getSelection().length >= grid.records.length) {\n grid.selectNone()\n } else {\n grid.selectAll()\n }\n } else {\n if (!event.shiftKey && !event.metaKey && !event.ctrlKey) {\n grid.selectNone(true)\n }\n const tmp = grid.getSelectionCells()\n const column = grid.getColumn(edata.detail['field'] as string, true) ?? 0\n const sel = []\n const cols = []\n // check if there was a selection before\n if (tmp.length != 0 && event.shiftKey) {\n let start = column\n let end = tmp[0]!.column\n if (start > end) {\n start = tmp[0]!.column\n end = column\n }\n for (let i = start; i<=end; i++) cols.push(i)\n } else {\n cols.push(column)\n }\n edata = grid.trigger('columnSelect', { target: grid.name, columns: cols })\n if (edata.isCancelled !== true) {\n for (let i = 0; i < grid.records.length; i++) {\n sel.push({ recid: grid.records[i]!.recid, column: cols })\n }\n grid.select(sel)\n }\n edata.finish()\n }\n }\n // event after\n edata.finish()\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function columnDblClick(grid: TsGrid, field: any, event: any) { // any: field is string; event is MouseEvent or CustomEvent\n // event before\n const edata = grid.trigger('columnDblClick', { target: grid.name, field: field, originalEvent: event })\n if (edata.isCancelled === true) return\n // event after\n edata.finish()\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function columnContextMenu(grid: TsGrid, field: any, event: any) { // any: field is string; event is MouseEvent\n const edata = grid.trigger('columnContextMenu', { target: grid.name, field: field, originalEvent: event })\n if (edata.isCancelled === true) return\n // show menu\n TsMenu.show({\n type: 'check',\n contextMenu: true,\n originalEvent: event,\n items: grid.initColumnOnOff()\n })\n .then(() => {\n query('#w2overlay-context-menu .tsg-grid-skip')\n .off('.tsg-grid')\n .on('click.tsg-grid', (evt: Event) => {\n evt.stopPropagation()\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('keypress', (evt: any) => { // any: KeyboardEvent at runtime; typed loosely\n if (evt.keyCode == 13) {\n grid.skip(evt.target.value)\n grid.toolbar.click('tsg-column-on-off') // close menu\n }\n })\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .select((event: any) => { // any: TsMenu select event shape varies\n const id = event.detail.item.id\n if (['tsg-stateSave', 'tsg-stateReset'].includes(id)) {\n grid[id.substring(5)]()\n } else if (id == 'tsg-skip') {\n // empty\n } else {\n grid.columnOnOff(event, event.detail.item.id)\n }\n clearTimeout(grid.last.kbd_timer ?? undefined) // keep grid in focus\n })\n clearTimeout(grid.last.kbd_timer ?? undefined) // keep grid in focus\n // cancel default\n event.preventDefault()\n edata.finish()\n}\n\n// if called w/o arguments, then will resize all columns\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function columnAutoSize(grid: TsGrid, colIndex?: number) {\n if (colIndex === undefined) {\n // autoSize all columns\n grid.columns.forEach((col, i) => grid.columnAutoSize(i))\n return\n }\n const col = grid.columns[colIndex]!\n const el = query(`#grid_${grid.name}_column_${colIndex} .tsg-col-header`)[0]\n if (col['autoResize'] === false || col.hidden === true || !el) {\n return true\n }\n const style = getComputedStyle(el)\n let maxWidth = TsUtils.getStrWidth(el.innerHTML, `font-family: ${style.fontFamily}; font-size: ${style.fontSize}`, true)\n + parseFloat(style.paddingLeft) + parseFloat(style.paddingRight) + 4\n\n query(grid.box).find(`.tsg-grid-records td[col=\"${colIndex}\"] > div`, grid.box).each((el: Node) => {\n const htmlEl = el as HTMLElement // cast: query().each() passes Element but typed as Node\n const style = getComputedStyle(htmlEl)\n const width = TsUtils.getStrWidth(htmlEl.innerHTML, `font-family: ${style.fontFamily}; font-size: ${style.fontSize}`, true)\n + parseFloat(style.paddingLeft) + parseFloat(style.paddingRight) + 4 // add some extra because of the border\n if (maxWidth < width) {\n maxWidth = width\n }\n })\n\n // event before\n const edata = grid.trigger('columnAutoResize', { maxWidth, originalEvent: event, target: grid.name, column: col })\n if (edata.isCancelled === true) { return }\n\n if (maxWidth > 0) {\n if (col.sizeOriginal == null) col.sizeOriginal = col.size ?? ''\n col.size = Math.min(Math.abs(maxWidth), col.max || Infinity) + 'px'\n grid.resizeRecords()\n grid.resizeRecords() // Why do we have to call it twice in order to show the scrollbar?\n grid.scroll()\n }\n // event after\n edata.finish()\n}\n\nexport function columnAutoSizeAll(grid: TsGrid) {\n grid.columns.forEach((col, ind) => grid.columnAutoSize(ind))\n}\n\n// any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function focus(grid: TsGrid, event?: Event | any) {\n // event before\n const edata = grid.trigger('focus', { target: grid.name, originalEvent: event })\n if (edata.isCancelled === true) return false\n // default behaviour\n grid.hasFocus = true\n query(grid.box).removeClass('tsg-inactive').find('.tsg-inactive').removeClass('tsg-inactive')\n setTimeout(() => {\n const txt = query(grid.box).find(`#grid_${grid.name}_focus`).get(0)\n if (txt && document.activeElement != txt) {\n txt.focus()\n }\n }, 10)\n // event after\n edata.finish()\n}\n\n// any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function blur(grid: TsGrid, event?: Event | any) {\n // event before\n const edata = grid.trigger('blur', { target: grid.name, originalEvent: event })\n if (edata.isCancelled === true) return false\n // default behaviour\n grid.hasFocus = false\n query(grid.box).addClass('tsg-inactive').find('.tsg-selected').addClass('tsg-inactive')\n query(grid.box).find('.tsg-selection').addClass('tsg-inactive')\n // event after\n edata.finish()\n}\n\n// any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function keydown(grid: TsGrid, event: KeyboardEvent | any) {\n // this method is called from TsUtils\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const obj = grid\n const url = grid.url?.get ?? grid.url\n if (obj.keyboard !== true) return\n // trigger event\n const edata = obj.trigger('keydown', { target: obj.name, originalEvent: event })\n if (edata.isCancelled === true) return\n // default behavior\n if (query(grid.box).find('.tsg-message').length > 0) {\n // if there are messages\n if (event.keyCode == 27) grid.message()\n return\n }\n let empty = false\n const records = query(obj.box).find('#grid_'+ obj.name +'_records')\n const sel = obj.getSelection()\n if (sel.length === 0) empty = true\n // any: keyboard nav handles row/cell modes inline; recid is narrowed by `typeof recid == 'object'` runtime guard below\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let recid: any = sel[0] || null\n // any: array of heterogeneous runtime values; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let columns: any[] = []\n // any: same as recid above; runtime-narrowed below\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let recid2: any = sel[sel.length-1]\n // Cell-mode alias used by sub-functions (moveLeft/Right/Up/Down) when selectType !== 'row'.\n // Same data as `sel`, narrowed to TsGridCellSelection[]; safe to read inside the\n // selectType-checked branches below.\n const cellSel = sel as TsGridCellSelection[]\n if (typeof recid == 'object' && recid != null) {\n const cellSel = sel as TsGridCellSelection[]\n recid = cellSel[0]!.recid\n columns = []\n let ii = 0\n while (true) {\n if (!cellSel[ii] || cellSel[ii]!.recid != recid) break\n columns.push(cellSel[ii]!.column)\n ii++\n }\n recid2 = cellSel[cellSel.length-1]!.recid\n }\n const ind = obj.get(recid, true) ?? -1\n const ind2 = obj.get(recid2, true) ?? -1\n const recEL = query(obj.box).find(`#grid_${obj.name}_rec_${(ind >= 0 ? TsUtils.escapeId(obj.records[ind]!.recid) : 'none')}`)\n const pageSize = Math.floor(records[0].clientHeight / obj.recordHeight)\n let cancel = false\n const key = event.keyCode\n const shiftKey = event.shiftKey\n\n switch (key) {\n case 8: // backspace\n case 46: { // delete\n // delete if button is visible\n obj.delete()\n cancel = true\n event.stopPropagation()\n break\n }\n case 27: { // escape\n if (obj.last.move?.type) {\n delete obj.last.move\n obj.removeRange('selection-preview')\n obj.removeRange('selection-expand')\n cancel = true\n } else {\n obj.selectNone()\n cancel = true\n }\n break\n }\n case 65: { // cmd + A\n if (!event.metaKey && !event.ctrlKey) break\n obj.selectAll()\n cancel = true\n break\n }\n case 13: { // enter\n // if expandable columns - expand it\n if (grid.selectType == 'row' && obj.show.expandColumn === true) {\n if (recEL.length <= 0) break\n obj.toggle(recid, event)\n cancel = true\n } else { // or enter edit\n for (let c = 0; c < grid.columns.length; c++) {\n const edit = grid.getCellEditable(ind, c)\n if (edit) {\n columns.push(c)\n break\n }\n }\n // edit last column that was edited\n if (grid.selectType == 'row' && grid.last._edit && grid.last._edit['column']) {\n columns = [grid.last._edit['column']]\n }\n if (columns.length > 0) {\n obj.editField(recid, columns[0] ?? grid.last['editColumn'], null, event)\n cancel = true\n }\n }\n break\n }\n case 37: { // left\n moveLeft()\n break\n }\n case 39: { // right\n moveRight()\n break\n }\n case 33: { // <PgUp>\n moveUp(pageSize)\n break\n }\n case 34: { // <PgDn>\n moveDown(pageSize)\n break\n }\n case 35: { // <End>\n moveDown(-1)\n break\n }\n case 36: { // <Home>\n moveUp(-1)\n break\n }\n case 38: { // up\n // ctrl (or cmd) + up -> same as home\n moveUp(event.metaKey || event.ctrlKey ? -1 : 1)\n break\n }\n case 40: { // down\n // ctrl (or cmd) + up -> same as end\n moveDown(event.metaKey || event.ctrlKey ? -1 : 1)\n break\n }\n // copy & paste\n case 17: // ctrl key\n case 91: { // cmd key\n // SLOW: 10k records take 7.0\n if (empty) break\n // in Safari need to copy to buffer on cmd or ctrl key (otherwise does not work)\n if (TsUtils.isSafari) {\n obj.last.copy_event = obj.copy(false, event)\n const focus = query(obj.box).find('#grid_'+ obj.name + '_focus')\n focus.val(obj.last.copy_event.detail.text)\n focus[0].select()\n }\n break\n }\n case 67: { // - c\n // this fill trigger event.onComplete\n if (event.metaKey || event.ctrlKey) {\n if (TsUtils.isSafari) {\n obj.copy(obj.last.copy_event, event)\n } else {\n obj.last.copy_event = obj.copy(false, event)\n const focus = query(obj.box).find('#grid_'+ obj.name + '_focus')\n focus.val(obj.last.copy_event.detail.text)\n focus[0].select()\n obj.copy(obj.last.copy_event, event)\n }\n }\n break\n }\n case 88: { // x - cut\n if (empty) break\n if (event.ctrlKey || event.metaKey) {\n if (TsUtils.isSafari) {\n obj.copy(obj.last.copy_event, event)\n } else {\n obj.last.copy_event = obj.copy(false, event)\n const focus = query(obj.box).find('#grid_'+ obj.name + '_focus')\n focus.val(obj.last.copy_event.detail.text)\n focus[0].select()\n obj.copy(obj.last.copy_event, event)\n }\n }\n break\n }\n }\n const tmp = [32, 187, 189, 192, 219, 220, 221, 186, 222, 188, 190, 191] // other typeable chars\n for (let i = 48; i <= 111; i++) tmp.push(i) // 0-9,a-z,A-Z,numpad\n if (tmp.indexOf(key) != -1 && !event.ctrlKey && !event.metaKey && !cancel) {\n if (columns.length === 0) columns.push(0)\n cancel = false\n // move typed key into edit\n setTimeout(() => {\n const focus = query(obj.box).find('#grid_'+ obj.name + '_focus')\n const key = focus.val()\n focus.val('')\n obj.editField(recid, columns[0], key, event)\n }, 1)\n }\n if (cancel) { // cancel default behaviour\n if (event.preventDefault) event.preventDefault()\n }\n // event after\n edata.finish()\n\n function moveLeft() {\n if (empty) { // no selection\n selectTopRecord()\n return\n }\n if (obj.selectType == 'row') {\n if (recEL.length <= 0) return\n const tmp = obj.records[ind]!.TsUi || {}\n if (tmp && tmp.parent_recid != null && (!Array.isArray(tmp.children) || tmp.children.length === 0 || !tmp.expanded)) {\n obj.unselect(recid)\n obj.collapse(tmp.parent_recid, event)\n obj.select(tmp.parent_recid)\n } else {\n obj.collapse(recid, event)\n }\n } else {\n const prevCell = obj.prevCell(ind, columns[0]!)\n let prevCol: number | null = (prevCell?.index != ind) ? null : (prevCell?.colIndex ?? null)\n if (!shiftKey && prevCol == null) {\n obj.selectNone(true)\n prevCol = 0\n }\n if (prevCol != null) {\n if (shiftKey && obj.multiSelect) {\n if (tmpUnselect()) return\n const tmp = []\n const newSel = []\n const unSel = []\n if (columns.indexOf(obj.last.sel_col) === 0 && columns.length > 1) {\n for (let i = 0; i < sel.length; i++) {\n if (tmp.indexOf(cellSel[i]!.recid) == -1) tmp.push(cellSel[i]!.recid)\n unSel.push({ recid: cellSel[i]!.recid, column: columns[columns.length-1]! })\n }\n obj.unselect(unSel)\n obj.scrollIntoView(ind, columns[columns.length-1]!, true)\n } else {\n for (let i = 0; i < sel.length; i++) {\n if (tmp.indexOf(cellSel[i]!.recid) == -1) tmp.push(cellSel[i]!.recid)\n newSel.push({ recid: cellSel[i]!.recid, column: prevCol })\n }\n obj.select(newSel)\n obj.scrollIntoView(ind, prevCol, true)\n }\n } else {\n obj.click({ recid: recid, column: prevCol }, event)\n obj.scrollIntoView(ind, prevCol, true)\n }\n } else {\n // if selected more then one, then select first\n if (!shiftKey) {\n obj.selectNone(true)\n }\n }\n }\n cancel = true\n }\n\n function moveRight() {\n if (empty) {\n selectTopRecord()\n return\n }\n if (obj.selectType == 'row') {\n if (recEL.length <= 0) return\n obj.expand(recid, event)\n } else {\n const nextCell = obj.nextCell(ind, columns[columns.length-1]!) // columns is an array of selected columns\n let nextCol: number | null = (nextCell?.index != ind) ? null : (nextCell?.colIndex ?? null)\n if (!shiftKey && nextCol == null) {\n obj.selectNone(true)\n nextCol = obj.columns.length-1\n }\n if (nextCol != null) {\n if (shiftKey && key == 39 && obj.multiSelect) {\n if (tmpUnselect()) return\n const tmp = []\n const newSel = []\n const unSel = []\n if (columns.indexOf(obj.last.sel_col) == columns.length-1 && columns.length > 1) {\n for (let i = 0; i < sel.length; i++) {\n if (tmp.indexOf(cellSel[i]!.recid) == -1) tmp.push(cellSel[i]!.recid)\n unSel.push({ recid: cellSel[i]!.recid, column: columns[0]! })\n }\n obj.unselect(unSel)\n obj.scrollIntoView(ind, columns[0]!, true)\n } else {\n for (let i = 0; i < sel.length; i++) {\n if (tmp.indexOf(cellSel[i]!.recid) == -1) tmp.push(cellSel[i]!.recid)\n newSel.push({ recid: cellSel[i]!.recid, column: nextCol })\n }\n obj.select(newSel)\n obj.scrollIntoView(ind, nextCol, true)\n }\n } else {\n obj.click({ recid: recid, column: nextCol }, event)\n obj.scrollIntoView(ind, nextCol, true)\n }\n } else {\n // if selected more then one, then select first\n if (!shiftKey) {\n obj.selectNone(true)\n }\n }\n }\n cancel = true\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function moveUp(numRows: any) { // any: number of rows to scroll\n if (empty) selectTopRecord()\n if (recEL.length <= 0) return\n // move to the previous record\n let prev = obj.prevRow(ind, obj.selectType == 'row' ? 0 : cellSel[0]!.column, numRows)\n if (!shiftKey && prev == null) {\n if (obj.searchData.length != 0 && !url) {\n prev = obj.last.searchIds[0] ?? null\n } else {\n prev = 0\n }\n }\n if (prev != null) {\n if (shiftKey && obj.multiSelect) { // expand selection\n if (tmpUnselect()) return\n const sel_ind = obj.last.sel_ind ?? -1\n if (obj.selectType == 'row') {\n if (sel_ind > prev && sel_ind != ind2) {\n obj.unselect(obj.records[ind2]!.recid)\n } else {\n obj.select(obj.records[prev]!.recid)\n }\n } else {\n if (sel_ind > prev && sel_ind != ind2) {\n prev = ind2\n const tmp = []\n for (let c = 0; c < columns.length; c++) tmp.push({ recid: obj.records[prev]!.recid, column: columns[c]! })\n obj.unselect(tmp)\n } else {\n const tmp = []\n for (let c = 0; c < columns.length; c++) tmp.push({ recid: obj.records[prev]!.recid, column: columns[c]! })\n obj.select(tmp)\n }\n }\n } else { // move selected record\n obj.selectNone(true) // no need to trigger select event\n obj.click({ recid: obj.records[prev]!.recid, column: columns[0]! }, event)\n }\n obj.scrollIntoView(prev, undefined, true, numRows != 1) // top align record\n if (event.preventDefault) event.preventDefault()\n } else {\n // if selected more then one, then select first\n if (!shiftKey) {\n obj.selectNone(true)\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function moveDown(numRows: any) { // any: number of rows to scroll\n if (empty) selectTopRecord()\n if (recEL.length <= 0) return\n // move to the next record\n let next = obj.nextRow(ind2, obj.selectType == 'row' ? 0 : cellSel[0]!.column, numRows)\n if (!shiftKey && next == null) {\n if (obj.searchData.length != 0 && !url) {\n next = obj.last.searchIds[obj.last.searchIds.length - 1] ?? null\n } else {\n next = obj.records.length - 1\n }\n }\n if (next != null) {\n if (shiftKey && obj.multiSelect) { // expand selection\n if (tmpUnselect()) return\n const sel_ind = obj.last.sel_ind ?? -1\n if (obj.selectType == 'row') {\n if (sel_ind < next && sel_ind != ind) {\n obj.unselect(obj.records[ind]!.recid)\n } else {\n obj.select(obj.records[next]!.recid)\n }\n } else {\n if (sel_ind < next && sel_ind != ind) {\n next = ind\n const tmp = []\n for (let c = 0; c < columns.length; c++) tmp.push({ recid: obj.records[next]!.recid, column: columns[c]! })\n obj.unselect(tmp)\n } else {\n const tmp = []\n for (let c = 0; c < columns.length; c++) tmp.push({ recid: obj.records[next]!.recid, column: columns[c]! })\n obj.select(tmp)\n }\n }\n } else { // move selected record\n obj.selectNone(true) // no need to trigger select event\n obj.click({ recid: obj.records[next]!.recid, column: columns[0]! }, event)\n }\n obj.scrollIntoView(next, undefined, true, numRows != 1) // top align record\n cancel = true\n } else {\n // if selected more then one, then select first\n if (!shiftKey) {\n obj.selectNone(true) // no need to trigger select event\n }\n }\n }\n\n function selectTopRecord() {\n if (!obj.records || obj.records.length === 0) return\n let ind = Math.floor(records[0].scrollTop / obj.recordHeight) + 1\n if (!obj.records[ind] || ind < 2) ind = 0\n if (typeof obj.records[ind] === 'undefined') return\n obj.select({ recid: obj.records[ind]!.recid, column: 0})\n }\n\n function tmpUnselect () {\n if (obj.last.sel_type != 'click') return false\n if (obj.selectType != 'row') {\n obj.last.sel_type = 'key'\n if (sel.length > 1) {\n for (let s = 0; s < sel.length; s++) {\n if (cellSel[s]!.recid == obj.last.sel_recid && cellSel[s]!.column == obj.last.sel_col) {\n sel.splice(s, 1)\n break\n }\n }\n obj.unselect(sel)\n return true\n }\n return false\n } else {\n obj.last.sel_type = 'key'\n if (sel.length > 1) {\n // tmpUnselect runs in row mode here (cell-mode early-returns above)\n const rowSel = sel as Array<RecId | number>\n rowSel.splice(rowSel.indexOf(obj.records[obj.last.sel_ind ?? 0]!.recid as RecId), 1)\n obj.unselect(rowSel)\n return true\n }\n return false\n }\n }\n}\n\nexport function scrollIntoView(grid: TsGrid, ind?: number | null, column?: number, instant?: boolean, recTop?: boolean) {\n let buffered = grid.records.length\n if (grid.searchData.length != 0 && !grid.url) buffered = grid.last.searchIds.length\n if (buffered === 0) return\n if (ind == null) {\n const sel = grid.getSelection()\n if (sel.length === 0) return\n if (TsUtils.isPlainObject(sel[0])) {\n const cellSel = sel as TsGridCellSelection[]\n ind = cellSel[0]!.index\n column = cellSel[0]!.column\n } else {\n ind = grid.get(sel[0] as RecId | number, true)\n }\n }\n const records = query(grid.box).find(`#grid_${grid.name}_records`)\n const recWidth = records[0].clientWidth\n const recHeight = records[0].clientHeight\n const recSTop = records[0].scrollTop\n const recSLeft = records[0].scrollLeft\n // if all records in view\n const len = grid.last.searchIds.length\n if (len > 0) ind = grid.last.searchIds.indexOf(ind ?? 0) // if search is applied\n // smooth or instant\n records.css({ 'scroll-behavior': instant ? 'auto' : 'smooth' })\n\n // vertical\n if (recHeight < grid.recordHeight * (len > 0 ? len : buffered) && records.length > 0) {\n // scroll to correct one\n const t1 = Math.floor(recSTop / grid.recordHeight)\n const t2 = t1 + Math.floor(recHeight / grid.recordHeight)\n if (ind == t1) {\n records.prop('scrollTop', recSTop - recHeight / 1.3)\n }\n if (ind == t2) {\n records.prop('scrollTop', recSTop + recHeight / 1.3)\n }\n if ((ind ?? 0) < t1 || (ind ?? 0) > t2) {\n records.prop('scrollTop', ((ind ?? 0) - 1) * grid.recordHeight)\n }\n if (recTop === true) {\n records.prop('scrollTop', (ind ?? 0) * grid.recordHeight)\n }\n }\n\n // horizontal\n if (column != null) {\n let x1 = 0\n let x2 = 0\n const sb = TsUtils.scrollBarSize() as number\n for (let i = 0; i <= column; i++) {\n const col = grid.columns[i]!\n if (col.frozen || col.hidden) continue\n x1 = x2\n x2 += parseInt(col.sizeCalculated ?? '0')\n }\n if (recWidth < x2 - recSLeft) { // right\n records.prop('scrollLeft', x1 - sb)\n } else if (x1 < recSLeft) { // left\n records.prop('scrollLeft', x2 - recWidth + sb * 2)\n }\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function scrollToColumn(grid: TsGrid, field: any) { // any: field name is string\n if (field == null)\n return\n let sWidth = 0\n let found = false\n for (let i = 0; i < grid.columns.length; i++) {\n const col = grid.columns[i]!\n if (col.field == field) {\n found = true\n break\n }\n if (col.frozen || col.hidden)\n continue\n const cSize = parseInt(col.sizeCalculated ? col.sizeCalculated : String(col.size ?? 0))\n sWidth += cSize\n }\n if (!found)\n return\n grid.last.vscroll.scrollLeft = sWidth + 1\n grid.scroll()\n}\n\n// any: recid can be string|number (row select) or {recid, column} object (cell select)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function dblClick(grid: TsGrid, recid: string | number | { recid: string | number; column?: number } | any, event?: MouseEvent | any) {\n // find columns\n let column = null\n if ((typeof recid == 'object') && (recid !== null)) {\n column = recid.column\n recid = recid.recid\n }\n if (event == null) event = {}\n // column user clicked on\n if (column == null && event.target) {\n let tmp = event.target\n if (tmp.tagName.toUpperCase() != 'TD') tmp = query(tmp).closest('td')[0]\n column = parseInt(query(tmp).attr('col'))\n }\n const index = grid.get(recid, true)\n const rec = index != null ? grid.records[index] : null\n // event before\n const edata = grid.trigger('dblClick', { target: grid.name, recid: recid, column: column, originalEvent: event })\n if (edata.isCancelled === true) return\n // default action\n grid.selectNone(true) // no need to trigger select event\n const edit = index != null ? grid.getCellEditable(index, column) : null\n if (edit) {\n grid.editField(recid, column, null, event)\n } else {\n grid.select({ recid: recid, column: column })\n if (grid.show.expandColumn || (rec && rec.TsUi && Array.isArray(rec.TsUi.children))) grid.toggle(recid)\n }\n // event after\n edata.finish()\n}\n\n// any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function showContextMenu(grid: TsGrid, event: MouseEvent | any, options: { recid?: string | number; index?: number; column?: number }) {\n const { recid, index, column } = options\n if (grid.last.userSelect == 'text') return\n if (event == null) {\n event = { offsetX: 0, offsetY: 0, target: query(grid.box).find(`#grid_${grid.name}_rec_${recid}`)[0] }\n }\n if (event.offsetX == null) {\n event.offsetX = event.layerX - event.target.offsetLeft\n event.offsetY = event.layerY - event.target.offsetTop\n }\n // if (TsUtils.isFloat(recid)) recid = parseFloat(recid)\n if (grid.selectType == 'row') {\n const sel = grid.getSelectionRows() as Array<RecId | number>\n if (recid != null && sel.indexOf(recid as RecId) == -1) {\n grid.click(recid)\n }\n } else {\n const sel = grid.getSelectionCells()\n let sel_col = false // any cell in a column\n let sel_row = false // any cell in a row\n let sel_cell = false // this exact cell\n sel.forEach(rec => {\n if (rec.recid == recid) sel_row = true\n if (rec.column == column) sel_col = true\n if (rec.recid == recid && rec.column == column) sel_cell = true\n })\n if (!sel_row && recid != null && column === null) grid.click({ recid }) // select entire row\n if (!sel_col && recid === null && column != null) grid.columnClick(grid.columns[column]!.field, event)\n if (!sel_cell && recid != null && column != null) grid.click({ recid, column }) // select a cell\n }\n // event before\n const edata = grid.trigger('contextMenu', { target: grid.name, originalEvent: event, recid, index, column })\n if (edata.isCancelled === true) return\n // default action\n if (grid.contextMenu?.length > 0) {\n TsMenu.show({\n contextMenu: true,\n originalEvent: event,\n items: grid.contextMenu\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .select((event: any) => { // any: TsMenu select event shape varies\n clearTimeout(grid.last.kbd_timer ?? undefined) // keep grid in focus\n grid.contextMenuClick(recid ?? '', column ?? null, event)\n })\n }\n // cancel browser context menu\n event.preventDefault()\n clearTimeout(grid.last.kbd_timer ?? undefined) // keep grid in focus\n // event after\n edata.finish()\n}\n\n// any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function contextMenuClick(grid: TsGrid, recid: string | number, column: number | null, event: any) {\n // event before\n const edata = grid.trigger('contextMenuClick', {\n target: grid.name, recid, column, originalEvent: event.detail.originalEvent,\n menuEvent: event, menuIndex: event.detail.index, menuItem: event.detail.item\n })\n if (edata.isCancelled === true) return\n // no default action\n edata.finish()\n}\n\nexport function toggle(grid: TsGrid, recid: string | number, _event?: Event) {\n const rec = grid.get(recid)\n if (rec == null) return\n rec.TsUi = rec.TsUi ?? {}\n if (rec.TsUi.expanded === true) {\n return grid.collapse(recid)\n } else {\n return grid.expand(recid)\n }\n}\n\n/**\n * When record is expaned, then TsUi.children of the record is copied into grid.records and grid.total is updated. It will\n * also set TsUi._copeid = true, so it would not copy it again.\n *\n * There is also updateExpaned() that is called in grid.refresh()\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function expand(grid: TsGrid, recid: any, noRefresh?: any) { // any: recid is string|number; noRefresh is boolean\n const ind = grid.get(recid, true)\n if (ind == null) return false\n const rec = grid.records[ind]!\n rec.TsUi = rec.TsUi ?? {}\n const id = TsUtils.escapeId(recid)\n const children = rec.TsUi.children\n let edata\n if (Array.isArray(children)) {\n if (rec.TsUi.expanded === true || children.length === 0) return false // already shown\n edata = grid.trigger('expand', { target: grid.name, recid: recid })\n if (edata.isCancelled === true) return false\n rec.TsUi.expanded = true\n rec.TsUi['_copied'] = true\n children.forEach((child) => {\n child.TsUi = child.TsUi ?? {}\n child.TsUi.parent_recid = rec.recid\n if (child.TsUi.children == null) child.TsUi.children = []\n })\n grid.records.splice(ind + 1, 0, ...children)\n if (grid.total !== -1) {\n grid.total += children.length\n }\n const url = grid.url?.get ?? grid.url\n if (!url) {\n grid.localSort(true, true)\n if (grid.searchData.length > 0) {\n grid.localSearch(true)\n }\n }\n if (noRefresh !== true) grid.refresh()\n edata.finish()\n } else {\n if (query(grid.box).find('#grid_'+ grid.name +'_rec_'+ id +'_expanded_row').length > 0 || grid.show.expandColumn !== true) return false\n // any: cast-to-any for dynamic dispatch; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((rec.TsUi.expanded as any) == 'none') return false\n // insert expand row\n query(grid.box).find('#grid_'+ grid.name +'_rec_'+ id).after(\n `<tr id=\"grid_${grid.name}_rec_${recid}_expanded_row\" class=\"tsg-expanded-row\">\n <td colspan=\"100\" class=\"tsg-expanded2\">\n <div id=\"grid_${grid.name}_rec_${recid}_expanded\"></div>\n </td>\n <td class=\"tsg-grid-data-last\"></td>\n </tr>`)\n\n query(grid.box).find('#grid_'+ grid.name +'_frec_'+ id).after(\n `<tr id=\"grid_${grid.name}_frec_${recid}_expanded_row\" class=\"tsg-expanded-row\">\n ${grid.show.lineNumbers ? '<td class=\"tsg-col-number\"></td>' : ''}\n <td class=\"tsg-grid-data tsg-expanded1\" colspan=\"100\">\n <div id=\"grid_${grid.name}_frec_${recid}_expanded\"></div>\n </td>\n </tr>`)\n\n // event before\n edata = grid.trigger('expand', { target: grid.name, recid: recid,\n box_id: 'grid_'+ grid.name +'_rec_'+ recid +'_expanded', fbox_id: 'grid_'+ grid.name +'_frec_'+ recid +'_expanded' })\n if (edata.isCancelled === true) {\n query(grid.box).find('#grid_'+ grid.name +'_rec_'+ id +'_expanded_row').remove()\n query(grid.box).find('#grid_'+ grid.name +'_frec_'+ id +'_expanded_row').remove()\n return false\n }\n // expand column\n const row1 = query(grid.box).find('#grid_'+ grid.name +'_rec_'+ recid +'_expanded')\n const row2 = query(grid.box).find('#grid_'+ grid.name +'_frec_'+ recid +'_expanded')\n const innerHeight = row1.find(':scope div:first-child')[0]?.clientHeight ?? 50\n if (row1[0].clientHeight < innerHeight) {\n row1.css({ height: innerHeight + 'px' })\n }\n if (row2[0].clientHeight < innerHeight) {\n row2.css({ height: innerHeight + 'px' })\n }\n // default action\n query(grid.box).find('#grid_'+ grid.name +'_rec_'+ id).attr('expanded', 'yes').addClass('tsg-expanded')\n query(grid.box).find('#grid_'+ grid.name +'_frec_'+ id).attr('expanded', 'yes').addClass('tsg-expanded')\n query(grid.box).find('#grid_'+ grid.name +'_cell_'+ grid.get(recid, true) +'_expand div').html('-')\n rec.TsUi.expanded = true\n // event after\n edata.finish()\n grid.resizeRecords()\n }\n grid.selectNone() // or selection is messed up\n return true\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function collapse(grid: TsGrid, recid: any, noRefresh?: any) { // any: recid is string|number; noRefresh is boolean\n const ind = grid.get(recid, true)\n if (ind == null) return false\n const rec = grid.records[ind]!\n rec.TsUi = rec.TsUi || {}\n const id = TsUtils.escapeId(recid)\n const children = rec.TsUi.children\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let edata: any\n if (Array.isArray(children)) {\n if (rec.TsUi.expanded !== true) return false // already hidden\n edata = grid.trigger('collapse', { target: grid.name, recid: recid })\n if (edata.isCancelled === true) return false\n clearExpanded(rec)\n const stops = []\n for (let r: TsGridRecord | null = rec; r != null; r = (r.TsUi?.parent_recid != null ? grid.get(r.TsUi.parent_recid) : null))\n stops.push(r.TsUi?.parent_recid)\n // stops contains 'undefined' plus the ID of all nodes in the path from 'rec' to the tree root\n const start = ind + 1\n let end = start\n while (true) {\n if (grid.records.length <= end + 1 || grid.records[end+1]!.TsUi == null ||\n stops.indexOf(grid.records[end+1]!.TsUi!.parent_recid) >= 0) {\n break\n }\n end++\n }\n grid.records.splice(start, end - start + 1)\n if (grid.total !== -1) {\n grid.total -= end - start + 1\n }\n const url = grid.url?.get ?? grid.url\n if (!url) {\n if (grid.searchData.length > 0) {\n grid.localSearch(true)\n }\n }\n if (noRefresh !== true) grid.refresh()\n edata.finish()\n } else {\n if (query(grid.box).find('#grid_'+ grid.name +'_rec_'+ id +'_expanded_row').length === 0 || grid.show.expandColumn !== true) return false\n // event before\n edata = grid.trigger('collapse', { target: grid.name, recid: recid,\n box_id: 'grid_'+ grid.name +'_rec_'+ recid +'_expanded', fbox_id: 'grid_'+ grid.name +'_frec_'+ recid +'_expanded' })\n if (edata.isCancelled === true) return false\n // default action\n query(grid.box).find('#grid_'+ grid.name +'_rec_'+ id).removeAttr('expanded').removeClass('tsg-expanded')\n query(grid.box).find('#grid_'+ grid.name +'_frec_'+ id).removeAttr('expanded').removeClass('tsg-expanded')\n query(grid.box).find('#grid_'+ grid.name +'_cell_'+ grid.get(recid, true) +'_expand div').html('+')\n query(grid.box).find('#grid_'+ grid.name +'_rec_'+ id +'_expanded').css('height', '0px')\n query(grid.box).find('#grid_'+ grid.name +'_frec_'+ id +'_expanded').css('height', '0px')\n setTimeout(() => {\n query(grid.box).find('#grid_'+ grid.name +'_rec_'+ id +'_expanded_row').remove()\n query(grid.box).find('#grid_'+ grid.name +'_frec_'+ id +'_expanded_row').remove()\n if (rec.TsUi) rec.TsUi.expanded = false\n // event after\n edata.finish()\n grid.resizeRecords()\n }, 300)\n }\n grid.selectNone() // or selection is messed up\n return true\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function clearExpanded(rec: any) { // any: TsGridRecord\n rec.TsUi.expanded = false\n rec.TsUi['_copied'] = false\n for (let i = 0; i < rec.TsUi.children.length; i++) {\n const subRec = rec.TsUi.children[i]\n if (subRec.TsUi?.expanded) {\n clearExpanded(subRec)\n }\n }\n }\n}\n\nexport function updateExpanded(grid: TsGrid) {\n let updated = false\n for (let ind = grid.records.length - 1; ind >= 0; ind--) {\n const rec = grid.records[ind]!\n const children = rec.TsUi?.children\n if (rec.TsUi?.expanded === true && (children?.length ?? 0) > 0 && !rec.TsUi['_copied']) {\n rec.TsUi['_copied'] = true\n children!.forEach((child) => {\n child.TsUi ??= {}\n child.TsUi.parent_recid = rec.recid\n child.TsUi.children ??= []\n })\n grid.records.splice(ind + 1, 0, ...children!)\n if (grid.total !== -1) {\n grid.total += children!.length\n }\n updated = true\n }\n }\n if (updated) {\n const url = grid.url?.get ?? grid.url\n if (!url) {\n grid.localSort(true, true)\n if (grid.searchData.length > 0) {\n grid.localSearch(true)\n }\n }\n }\n}\n\nexport function sort(grid: TsGrid, field?: string, direction?: 'asc' | 'desc' | '' | null, multiField?: boolean) { // if no params - clears sort\n // event before\n const edata = grid.trigger('sort', { target: grid.name, field, direction, multiField })\n if (edata.isCancelled === true) return\n // check if needed to quit\n if (field != null) {\n // default action\n let sortIndex = grid.sortData.length\n for (let s = 0; s < grid.sortData.length; s++) {\n if (grid.sortData[s]!.field == field) {\n sortIndex = s\n break\n }\n }\n if (direction == null) {\n direction = grid.sortData[sortIndex]?.direction\n if (direction == null) {\n // save original sort, so it can be restored\n if (grid.last.originalSort == null) {\n grid.last.originalSort = grid.records.map(rec => rec.recid)\n }\n direction = 'asc'\n } else {\n switch (direction.toLowerCase()) {\n case 'asc': {\n direction = 'desc'\n break\n }\n case 'desc': {\n direction = ''\n break\n }\n default: {\n direction = 'asc'\n break\n }\n }\n }\n }\n if (multiField != true) {\n grid.sortData = []\n sortIndex = 0\n }\n if (direction === '') {\n grid.sortData.splice(sortIndex, 1)\n } else {\n // set new sort\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n grid.sortData[sortIndex] ??= {} as any // any: TsGridSortData partial init\n Object.assign(grid.sortData[sortIndex]!, { field, direction })\n }\n } else {\n grid.sortData = []\n }\n // if local\n const url = grid.url?.get ?? grid.url\n if (!url) {\n grid.localSort(false, true)\n if (grid.searchData.length > 0) grid.localSearch(true)\n // reset vertical scroll\n grid.last.vscroll.scrollTop = 0\n query(grid.box).find(`#grid_${grid.name}_records`).prop('scrollTop', 0)\n // event after\n edata.finish({ direction })\n grid.refresh()\n } else {\n // event after\n edata.finish({ direction })\n grid.last.fetch.offset = 0\n grid.reload()\n }\n}\n\n// any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function copy(grid: TsGrid, flag: any, oEvent?: ClipboardEvent | any) {\n if (TsUtils.isPlainObject(flag)) {\n // event after\n flag.finish()\n return flag.text\n }\n // generate text to copy\n const sel = grid.getSelection()\n if (sel.length === 0) return ''\n let text = ''\n if (typeof sel[0] == 'object') { // cell copy\n const cellSel = sel as TsGridCellSelection[]\n // find min/max column\n let minCol = cellSel[0]!.column\n let maxCol = cellSel[0]!.column\n const recs = []\n for (let s = 0; s < cellSel.length; s++) {\n if (cellSel[s]!.column < minCol) minCol = cellSel[s]!.column\n if (cellSel[s]!.column > maxCol) maxCol = cellSel[s]!.column\n if (recs.indexOf(cellSel[s]!.index) == -1) recs.push(cellSel[s]!.index)\n }\n recs.sort((a, b) => { return a-b }) // sort function must be for numerical sort\n for (let r = 0 ; r < recs.length; r++) {\n const ind = recs[r]\n for (let c = minCol; c <= maxCol; c++) {\n const col = grid.columns[c]!\n if (col.hidden === true) continue\n text += grid.getCellCopy(ind, c) + '\\t'\n }\n text = text.substr(0, text.length-1) // remove last \\t\n text += '\\n'\n }\n } else { // row copy\n // copy headers\n for (let c = 0; c < grid.columns.length; c++) {\n const col = grid.columns[c]!\n if (col.hidden === true) continue\n let colName = (col.text ? col.text : col.field)\n if (col.text && col.text.length < 3 && col.tooltip) colName = col.tooltip // if column name is less then 3 char and there is tooltip - use it\n text += '\"' + TsUtils.stripTags(colName) + '\"\\t'\n }\n text = text.substr(0, text.length-1) // remove last \\t\n text += '\\n'\n // copy selected text — row branch, sel[s] is RecId | number\n for (let s = 0; s < sel.length; s++) {\n const ind = grid.get(sel[s] as RecId | number, true)\n for (let c = 0; c < grid.columns.length; c++) {\n const col = grid.columns[c]!\n if (col.hidden === true) continue\n text += '\"' + grid.getCellCopy(ind, c) + '\"\\t'\n }\n text = text.substr(0, text.length-1) // remove last \\t\n text += '\\n'\n }\n }\n text = text.substr(0, text.length - 1)\n\n // if called without params\n let edata\n if (flag == null) {\n // before event\n edata = grid.trigger('copy', { target: grid.name, text: text,\n cut: (oEvent.keyCode == 88 ? true : false), originalEvent: oEvent })\n if (edata.isCancelled === true) return ''\n text = edata.detail['text'] as string\n // event after\n edata.finish()\n return text\n } else if (flag === false) { // only before event\n // before event\n edata = grid.trigger('copy', { target: grid.name, text: text,\n cut: (oEvent.keyCode == 88 ? true : false), originalEvent: oEvent })\n if (edata.isCancelled === true) return ''\n text = edata.detail['text'] as string\n return edata\n }\n}\n\n/**\n * Gets value to be copied to the clipboard\n * @param ind index of the record\n * @param col_ind index of the column\n * @returns the displayed value of the field's record associated with the cell\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getCellCopy(grid: TsGrid, ind: any, col_ind: any) { // any: record index and column index\n return TsUtils.stripTags(grid.getCellHTML(ind, col_ind))\n}\n\n// any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function paste(grid: TsGrid, text: string, event?: ClipboardEvent | any) {\n const sel = grid.getSelectionCells()\n let ind: number = grid.get(sel[0]!.recid, true) ?? 0\n const col = sel[0]!.column\n // before event\n const edata = grid.trigger('paste', { target: grid.name, text: text, index: ind, column: col, originalEvent: event })\n if (edata.isCancelled === true) return\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let pasteText: any = edata.detail['text'] // any: reassigned from string to string[] after .split()\n // default action\n if (grid.selectType == 'row' || sel.length === 0) {\n console.log('ERROR: You can paste only if grid.selectType = \\'cell\\' and when at least one cell selected.')\n // event after\n edata.finish()\n return\n }\n if (typeof pasteText !== 'object') {\n const newSel = []\n pasteText = pasteText.split('\\n')\n for (let t = 0; t < pasteText.length; t++) {\n const tmp = pasteText[t].split('\\t')\n let cnt = 0\n const rec = grid.records[ind]!\n const cols = []\n if (rec == null) continue\n for (let dt = 0; dt < tmp.length; dt++) {\n if (!grid.columns[col + cnt]) continue\n setCellPaste(rec, grid.columns[col + cnt]!.field, tmp[dt])\n cols.push(col + cnt)\n cnt++\n }\n for (let c = 0; c < cols.length; c++) newSel.push({ recid: rec.recid, column: cols[c] })\n ind++\n }\n grid.selectNone(true) // no need to trigger select event\n grid.select(newSel)\n } else {\n grid.selectNone(true) // no need to trigger select event\n grid.select([{ recid: grid.records[ind]!.recid, column: col }])\n }\n grid.refresh()\n // event after\n edata.finish()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function setCellPaste(rec: any, field: any, paste: any) { // any: record, field name, paste value\n rec.TsUi = rec.TsUi ?? {}\n rec.TsUi['changes'] = rec.TsUi['changes'] || {}\n rec.TsUi['changes'][field] = paste\n }\n}\n","import type { TsGrid, TsGridRecord, TsGridColumn } from './tsgrid.js'\nimport { TsUi, TsUtils } from './tsutils.js'\nimport { query as _queryRaw } from './query.js'\nimport { TsToolbar } from './tstoolbar.js'\nimport { TsMenu as _w2menu, TsTooltip as _w2tooltip } from './tstooltip.js'\n\n// any: query() always returns Query at runtime; cast to any for clean duck-typing throughout TsGrid\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst query = _queryRaw as (...args: any[]) => any // any: Query wrapper used as jQuery-like in TsGrid\n// any: TsMenu/TsTooltip have complex show/hide overloads\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst TsMenu = _w2menu as any // any: menu overlay with dynamic option shapes\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst TsTooltip = _w2tooltip as any // any: tooltip with flexible option shapes\n\nexport function resize(grid: TsGrid) {\n const time = Date.now()\n // make sure the box is right\n if (!grid.box || query(grid.box).attr('name') != grid.name) return\n // event before\n const edata = grid.trigger('resize', { target: grid.name })\n if (edata.isCancelled === true) return\n // resize\n if (grid.box != null) {\n grid.resizeBoxes()\n grid.resizeRecords()\n }\n // event after\n edata.finish()\n return Date.now() - time\n}\n\n// any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function update(grid: TsGrid, { cells, fullCellRefresh, ignoreColumns }: any = {}) {\n const time = Date.now()\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = grid\n if (grid.box == null) return 0\n if (Array.isArray(cells)) {\n for (let i = 0; i < cells.length; i++) {\n const index = cells[i].index\n const column = cells[i].column\n if (index < 0) continue\n if (index == null || column == null) {\n console.log('ERROR: Wrong argument for grid.update({ cells }), cells should be [{ index: X, column: Y }, ...]')\n continue\n }\n const rec: TsGridRecord = grid.records[index] ?? {} as TsGridRecord\n rec.TsUi = rec.TsUi ?? {}\n rec.TsUi['_update'] = rec.TsUi['_update'] ?? { cells: [] }\n let row1 = rec.TsUi['_update'].row1\n let row2 = rec.TsUi['_update'].row2\n if (row1 == null || !row1.isConnected || row2 == null || !row2.isColSelected) {\n row1 = grid.box.querySelector(`#grid_${grid.name}_rec_${TsUtils.escapeId(rec.recid)}`)\n row2 = grid.box.querySelector(`#grid_${grid.name}_frec_${TsUtils.escapeId(rec.recid)}`)\n rec.TsUi['_update'].row1 = row1\n rec.TsUi['_update'].row2 = row2\n }\n _update(rec, row1, row2, index, column)\n }\n } else {\n for (let i = (grid.last.vscroll.recIndStart ?? 0) - 1; i <= (grid.last.vscroll.recIndEnd ?? 0); i++) {\n let index = i\n if (grid.last.searchIds.length > 0) { // if search is applied\n index = grid.last.searchIds[i] ?? i\n } else {\n index = i\n }\n const rec = grid.records[index]!\n if (index < 0 || rec == null) continue\n rec.TsUi = rec.TsUi ?? {}\n rec.TsUi['_update'] = rec.TsUi['_update'] ?? { cells: [] }\n let row1 = rec.TsUi['_update'].row1\n let row2 = rec.TsUi['_update'].row2\n if (row1 == null || !row1.isConnected || row2 == null || !row2.isColSelected) {\n row1 = grid.box.querySelector(`#grid_${grid.name}_rec_${TsUtils.escapeId(rec.recid)}`)\n row2 = grid.box.querySelector(`#grid_${grid.name}_frec_${TsUtils.escapeId(rec.recid)}`)\n rec.TsUi['_update'].row1 = row1\n rec.TsUi['_update'].row2 = row2\n }\n for (let column = 0; column < grid.columns.length; column++) {\n _update(rec, row1, row2, index, column)\n }\n }\n }\n return Date.now() - time\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _update(rec: any, row1: any, row2: any, index: any, column: any) { // any: selection update params\n const pcol = self.columns[column]\n if (Array.isArray(ignoreColumns) && (ignoreColumns.includes(column) || ignoreColumns.includes(pcol?.field))) {\n return\n }\n let cell = rec.TsUi['_update'].cells[column]\n if (cell == null || !cell.isConnected) {\n cell = self.box!.querySelector(`#grid_${self.name}_data_${index}_${column}`)\n rec.TsUi['_update'].cells[column] = cell\n }\n if (cell == null) return\n if (fullCellRefresh) {\n query(cell).replace(self.getCellHTML(index, column, false))\n // need to reselect as it was replaced\n cell = self.box!.querySelector(`#grid_${self.name}_data_${index}_${column}`)\n rec.TsUi['_update'].cells[column] = cell\n } else {\n const div = cell.children[0] // there is always a div inside a cell\n // value, attr, style, className, divAttr -- all on TD level except divAttr\n const { value, style, className } = self.getCellValue(index, column, false, true)\n if (div.innerHTML != value) {\n div.innerHTML = value\n }\n if (style != '' && cell.style.cssText != style) {\n cell.style.cssText = style\n }\n if (className != '') {\n const ignore = ['tsg-grid-data']\n const remove: string[] = []\n const add = className.split(' ').filter((cl: string) => !!cl) // remove empty\n cell.classList.forEach((cl: string) => { if (!ignore.includes(cl)) remove.push(cl) })\n cell.classList.remove(...remove)\n cell.classList.add(...add)\n }\n }\n // column styles if any (lower priority)\n if (self.columns[column]?.style && self.columns[column]?.style != cell.style.cssText) {\n cell.style.cssText = self.columns[column]?.style ?? ''\n }\n // record class if any\n if (rec.TsUi.class != null) {\n if (typeof rec.TsUi.class == 'string') {\n const ignore = ['tsg-odd', 'tsg-even', 'tsg-record']\n const remove: string[] = []\n const add = rec['TsUi']['class'].split(' ').filter((cl: string) => !!cl) // remove empty\n if (row1 && row2) {\n row1.classList.forEach((cl: string) => { if (!ignore.includes(cl)) remove.push(cl) })\n row1.classList.remove(...remove)\n row1.classList.add(...add)\n row2.classList.remove(...remove)\n row2.classList.add(...add)\n }\n }\n if (TsUtils.isPlainObject(rec.TsUi.class) && typeof rec.TsUi.class[pcol?.field ?? ''] == 'string') {\n const ignore = ['tsg-grid-data']\n const remove: string[] = []\n const add = rec['TsUi']['class'][pcol!.field].split(' ').filter((cl: string) => !!cl)\n cell.classList.forEach((cl: string) => { if (!ignore.includes(cl)) remove.push(cl) })\n cell.classList.remove(...remove)\n cell.classList.add(...add)\n }\n }\n // record styles if any\n if (rec.TsUi.style != null || rec.TsUi.styles != null) {\n if (row1 && row2 && typeof rec.TsUi.style == 'string' && row1.style.cssText !== rec.TsUi.style) {\n row1.style.cssText = 'height: '+ self.recordHeight + 'px;' + rec.TsUi.style\n row1.setAttribute('custom_style', rec.TsUi.style)\n row2.style.cssText = 'height: '+ self.recordHeight + 'px;' + rec.TsUi.style\n row2.setAttribute('custom_style', rec.TsUi.style)\n }\n if (rec.TsUi.styles == null) {\n rec.TsUi.styles = rec.TsUi.style\n }\n if (TsUtils.isPlainObject(rec.TsUi.styles) && typeof rec.TsUi.styles[pcol?.field ?? ''] == 'string'\n && cell.style.cssText !== rec.TsUi.styles[pcol?.field ?? '']) {\n cell.style.cssText = rec.TsUi.styles[pcol!.field]\n }\n }\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function refreshCell(grid: TsGrid, recid: any, field: any) { // any: recid is string|number; field is string\n const index = grid.get(recid, true)\n const col_ind = grid.getColumn(field, true)\n if (index == null || col_ind == null) return false\n const isSummary = (grid.records[index] && grid.records[index]!.recid == recid ? false : true)\n const cell = query(grid.box).find(`${isSummary ? '.tsg-grid-summary ' : ''}#grid_${grid.name}_data_${index}_${col_ind}`)\n if (cell.length == 0) return false\n // set cell html and changed flag\n cell.replace(grid.getCellHTML(index, col_ind, isSummary))\n return true\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function refreshRow(grid: TsGrid, recid: any, ind: any = null) { // any: recid is string|number; ind is number\n let tr1 = query(grid.box).find('#grid_'+ grid.name +'_frec_'+ TsUtils.escapeId(recid))\n let tr2 = query(grid.box).find('#grid_'+ grid.name +'_rec_'+ TsUtils.escapeId(recid))\n if (tr1.length > 0) {\n if (ind == null) ind = grid.get(recid, true)\n const line = tr1.attr('line')\n const isSummary = (grid.records[ind] && grid.records[ind]!.recid == recid ? false : true)\n // if it is searched, find index in search array\n const url = grid.url?.get ?? grid.url\n if (grid.searchData.length > 0 && !url) for (let s = 0; s < grid.last.searchIds.length; s++) if (grid.last.searchIds[s] == ind) ind = s\n const rec_html = grid.getRecordHTML(ind, line, isSummary)\n tr1.replace(rec_html[0])\n tr2.replace(rec_html[1])\n // apply style to row if it was changed in render functions\n let st = (grid.records[ind]!.TsUi ? grid.records[ind]!.TsUi!['style'] : '')\n if (typeof st == 'string') {\n tr1 = query(grid.box).find('#grid_'+ grid.name +'_frec_'+ TsUtils.escapeId(recid))\n tr2 = query(grid.box).find('#grid_'+ grid.name +'_rec_'+ TsUtils.escapeId(recid))\n tr1.attr('custom_style', st)\n tr2.attr('custom_style', st)\n if (tr1.hasClass('tsg-selected')) {\n st = st.replace('background-color', 'none')\n }\n tr1[0].style.cssText = 'height: '+ grid.recordHeight + 'px;' + st\n tr2[0].style.cssText = 'height: '+ grid.recordHeight + 'px;' + st\n }\n if (isSummary) {\n grid.resize()\n }\n return true\n }\n return false\n}\n\nexport function refresh(grid: TsGrid) {\n const time = Date.now()\n const url = grid.url?.get ?? grid.url\n if (grid.total <= 0 && !url && grid.searchData.length === 0) {\n grid.total = grid.records.length\n }\n if (!grid.box) return\n // event before\n const edata = grid.trigger('refresh', { target: grid.name })\n if (edata.isCancelled === true) return\n // -- header\n if (grid.show.header) {\n query(grid.box).find(`#grid_${grid.name}_header`).html(TsUtils.lang(grid.header) +'&#160;').show()\n } else {\n query(grid.box).find(`#grid_${grid.name}_header`).hide()\n }\n // -- toolbar\n if (grid.show.toolbar) {\n query(grid.box).find('#grid_'+ grid.name +'_toolbar').show()\n } else {\n query(grid.box).find('#grid_'+ grid.name +'_toolbar').hide()\n }\n // -- make sure search is closed\n grid.searchClose()\n // --- default search field\n const getFirstSearchField = () => {\n let tmp = 0\n while (tmp < grid.searches.length && (grid.searches[tmp]!.hidden || grid.searches[tmp]!['simple'] === false)) {\n tmp++\n }\n if (tmp >= grid.searches.length) return { field: '', label: '' } // all searches are hidden or simple\n return grid.searches[tmp]!\n }\n if (!grid.multiSearch && grid.last.field == 'all') {\n const fld = getFirstSearchField()\n grid.last.field = fld.field\n grid.last.label = fld.label ?? ''\n }\n if (grid.last.field == 'all' && !grid.show.searchAll) {\n grid.last.field = ''\n }\n if (!grid.last.field) {\n if (grid.show.searchAll) {\n grid.last.field = 'all'\n grid.last.label = 'All Fields'\n } else {\n const fld = getFirstSearchField()\n grid.last.field = fld.field\n grid.last.label = fld.label ?? ''\n }\n }\n const sInput = query(grid.box).find('#grid_'+ grid.name +'_search_all')\n // find right search label\n for (let ss = 0; ss < grid.searches.length; ss++) {\n if (grid.searches[ss]!.field == grid.last.field) {\n grid.last.label = grid.searches[ss]!.label ?? ''\n }\n }\n if (grid.last.multi) {\n sInput.attr('placeholder', '[' + TsUtils.lang('Multiple Fields') + ']')\n } else {\n sInput.attr('placeholder', TsUtils.lang('Search') + ' ' + TsUtils.lang(grid.last.label, true))\n }\n if (sInput.val() != grid.last.search) {\n let val = grid.last.search\n const tmp = sInput._w2field\n if (tmp) val = tmp.format(val)\n sInput.val(val)\n }\n\n grid.refreshSearch()\n grid.refreshBody()\n\n // -- footer\n if (grid.show.footer) {\n query(grid.box).find(`#grid_${grid.name}_footer`).html(grid.getFooterHTML()).show()\n } else {\n query(grid.box).find(`#grid_${grid.name}_footer`).hide()\n }\n // all selected?\n const sel = grid.last.selection,\n areAllSelected = (grid.records.length > 0 && sel.indexes.length == grid.records.length),\n areAllSearchedSelected = (sel.indexes.length > 0 && grid.searchData.length !== 0 && sel.indexes.length == grid.last.searchIds.length)\n if (areAllSelected || areAllSearchedSelected) {\n query(grid.box).find('#grid_'+ grid.name +'_check_all').prop('checked', true)\n } else {\n query(grid.box).find('#grid_'+ grid.name +'_check_all').prop('checked', false)\n }\n // show number of selected\n grid.status()\n // collapse all records\n const rows = grid.find({ 'TsUi.expanded': true }, true, true)\n for (let r = 0; r < rows.length; r++) {\n const tmp = grid.records[rows[r]! as number]!.TsUi\n if (tmp && !Array.isArray(tmp.children)) {\n tmp.expanded = false\n }\n }\n // mark selection\n if (grid.markSearch) {\n setTimeout(() => {\n // mark all search strings\n const search = []\n for (let s = 0; s < grid.searchData.length; s++) {\n const sdata = grid.searchData[s]!\n const fld = grid.getSearch(sdata.field)\n if (!fld || fld.hidden) continue\n const ind = grid.getColumn(sdata.field, true)\n search.push({ field: sdata.field, search: sdata['value'], col: ind })\n }\n if (search.length > 0) {\n search.forEach((item) => {\n const el = query(grid.box).find('td[col=\"'+ item.col +'\"]:not(.tsg-head)')\n TsUtils.marker(el, item.search)\n })\n }\n }, 50)\n }\n grid.updateToolbar(grid.last.selection)\n // event after\n edata.finish()\n grid.resize()\n grid.addRange('selection')\n setTimeout(() => { // allow to render first\n grid.resize() // needed for horizontal scroll to show (do not remove)\n grid.scroll()\n }, 1)\n\n if (grid.reorderColumns && !grid.last.columnDrag) {\n grid.last.columnDrag = grid.initColumnDrag()\n } else if (!grid.reorderColumns && grid.last.columnDrag) {\n grid.last.columnDrag.remove()\n }\n return Date.now() - time\n}\n\nexport function refreshSearch(grid: TsGrid) {\n if (grid.multiSearch && grid.searchData.length > 0) {\n if (query(grid.box).find('.tsg-grid-searches').length == 0) {\n query(grid.box).find('.tsg-grid-toolbar')\n .css('height', (grid.last.toolbar_height + 35) + 'px')\n .append(`<div id=\"grid_${grid.name}_searches\" class=\"tsg-grid-searches\"></div>`)\n\n }\n let searches = `\n <span id=\"grid_${grid.name}_search_logic\" class=\"tsg-grid-search-logic\"></span>\n <div class=\"grid-search-line\"></div>`\n grid.searchData.forEach((sd, sd_ind) => {\n const ind = grid.getSearch(sd.field, true)\n const sf = ind != null ? grid.searches[ind] : null\n let display\n if (sf?.type == 'enum' && Array.isArray(sd.value)) {\n display = `<span class=\"grid-search-count\">${sd.value.length}</span>`\n } else if (sf?.type == 'list') {\n display = !!sd.text && sd.text !== sd.value ? `: ${sd.text}` : `: ${sd.value}`\n } else {\n display = `: ${sd.value}`\n }\n if (sf && sf.type == 'date') {\n if (sd.operator == 'between') {\n let dsp1 = sd.value[0]\n let dsp2 = sd.value[1]\n if (Number(dsp1) === dsp1) {\n dsp1 = TsUtils.formatDate(dsp1)\n }\n if (Number(dsp2) === dsp2) {\n dsp2 = TsUtils.formatDate(dsp2)\n }\n display = `: ${dsp1} - ${dsp2}`\n } else {\n let dsp = sd.value\n if (Number(dsp) == dsp) {\n dsp = TsUtils.formatDate(dsp)\n }\n let oper = sd.operator\n if (oper == 'more') oper = 'since'\n if (oper == 'less') oper = 'before'\n if (oper.substr(0, 5) == 'more:') {\n oper = 'since'\n }\n if (oper == 'null') dsp = ''\n if (oper == 'not null') dsp = ''\n display = `: ${oper} ${dsp}`\n }\n }\n searches += `<span class=\"tsg-action\" data-click=\"searchFieldTooltip|${ind}|${sd_ind}|this\">\n ${sf ? (sf.label ?? sf.field) : sd.field}\n ${display}\n <span class=\"icon-chevron-down\"></span>\n </span>`\n })\n // clear and save\n searches += `\n ${grid.show.searchSave\n ? `<div class=\"grid-search-line\"></div>\n <button class=\"tsg-btn grid-search-btn\" data-click=\"searchSave\" type=\"button\">${TsUtils.lang('Save')}</button>\n `\n : ''\n }\n <button class=\"tsg-btn grid-search-btn btn-remove\" type=\"button\"\n data-click=\"searchReset\">X</button>\n `\n query(grid.box).find(`#grid_${grid.name}_searches`).html(searches)\n query(grid.box).find(`#grid_${grid.name}_search_logic`).html(TsUtils.lang(grid.last.logic == 'AND' ? 'All' : 'Any'))\n } else {\n query(grid.box).find('.tsg-grid-toolbar')\n .css('height', grid.last.toolbar_height + 'px')\n .find('.tsg-grid-searches')\n .remove()\n }\n if (grid['searchSelected']) {\n query(grid.box).find(`#grid_${grid.name}_search_all`).val(' ').prop('readOnly', true)\n query(grid.box).find(`#grid_${grid.name}_search_name`).show().find('.name-text').html(grid['searchSelected'].text)\n } else {\n query(grid.box).find(`#grid_${grid.name}_search_all`).prop('readOnly', false)\n query(grid.box).find(`#grid_${grid.name}_search_name`).hide().find('.name-text').html('')\n }\n TsUtils.bindEvents(query(grid.box).find(`#grid_${grid.name}_searches .tsg-action, #grid_${grid.name}_searches button`), grid)\n}\n\nexport function refreshBody(grid: TsGrid) {\n grid.updateExpanded()\n grid.scroll() // need to calculate virtual scrolling for columns\n const recHTML = grid.getRecordsHTML()\n const colHTML = grid.getColumnsHTML()\n const bodyHTML =\n '<div id=\"grid_'+ grid.name +'_frecords\" class=\"tsg-grid-frecords\" style=\"margin-bottom: '+ ((TsUtils.scrollBarSize() as number) - 1) +'px;\">'+\n recHTML[0] +\n '</div>'+\n '<div id=\"grid_'+ grid.name +'_records\" class=\"tsg-grid-records\">' +\n recHTML[1] +\n '</div>'+\n '<div id=\"grid_'+ grid.name +'_scroll1\" class=\"tsg-grid-scroll1\" style=\"height: '+ TsUtils.scrollBarSize() +'px\"></div>'+\n // Columns need to be after to be able to overlap\n '<div id=\"grid_'+ grid.name +'_fcolumns\" class=\"tsg-grid-fcolumns\">'+\n ' <table><tbody>'+ colHTML[0] +'</tbody></table>'+\n '</div>'+\n '<div id=\"grid_'+ grid.name +'_columns\" class=\"tsg-grid-columns\">'+\n ' <table><tbody>'+ colHTML[1] +'</tbody></table>'+\n '</div>'+\n `<div class=\"tsg-intersection-marker\" style=\"display: none; height: ${grid.recordHeight - 5}px\">\n <div class=\"top-marker\"></div>\n <div class=\"bottom-marker\"></div>\n </div>`\n\n const gridBody = query(grid.box).find(`#grid_${grid.name}_body`, grid.box).html(bodyHTML)\n const records = query(grid.box).find(`#grid_${grid.name}_records`, grid.box)\n const frecords = query(grid.box).find(`#grid_${grid.name}_frecords`, grid.box)\n if (grid.selectType == 'row') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n records.on('mouseover mouseout', { delegate: 'tr' }, (event: any) => { // any: event.delegate is a Query extension\n const ind = query(event.delegate).attr('index') // don't read recid directly as it could be a number or a string\n const recid = grid.records[ind]?.recid\n query(grid.box).find(`#grid_${grid.name}_frec_${TsUtils.escapeId(recid)}`)\n .toggleClass('tsg-record-hover', event.type == 'mouseover')\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n frecords.on('mouseover mouseout', { delegate: 'tr' }, (event: any) => { // any: event.delegate is a Query extension\n const ind = query(event.delegate).attr('index') // don't read recid directly as it could be a number or a string\n const recid = grid.records[ind]?.recid\n query(grid.box).find(`#grid_${grid.name}_rec_${TsUtils.escapeId(recid)}`)\n .toggleClass('tsg-record-hover', event.type == 'mouseover')\n })\n }\n if (TsUtils.isMobile) {\n records.append(frecords)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click', { delegate: 'tr' }, (event: any) => { // any: event.delegate is a Query extension\n const index = query(event.delegate).attr('index') // don't read recid directly as it could be a number or a string\n const recid = grid.records[index]?.recid\n grid.click(recid, event)\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('touchstart', { delegate: 'tr' }, (event: any) => { // any: event.delegate Query extension + TouchEvent props\n const index = query(event.delegate).attr('index') // don't read recid directly as it could be a number or a string\n const recid = grid.records[index]?.recid\n // emulate double click\n if (grid.last['mobile_touch'] && Date.now() - grid.last['mobile_touch'] < 350) {\n event.preventDefault()\n grid.dblClick(recid, event)\n }\n grid.last['mobile_touch'] = Date.now()\n setTimeout(() => grid.last['mobile_touch'] = null, 350)\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('contextmenu', { delegate: 'tr' }, (event: any) => { // any: event.delegate Query extension\n const index = parseInt(query(event.delegate).attr('index')) // don't read recid directly as it could be a number or a string\n const recid = grid.records[index]?.recid\n const td = query(event.target).closest('td')\n const column = td.attr('col') ? parseInt(td.attr('col')) : undefined\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ctxOpts: any = { index } // any: exactOptionalPropertyTypes — build opts conditionally\n if (recid != null) ctxOpts.recid = recid\n if (column != null) ctxOpts.column = column\n grid.showContextMenu(event, ctxOpts)\n })\n } else {\n records.add(frecords)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click', { delegate: 'tr' }, (event: any) => { // any: event.delegate is a Query extension\n const index = query(event.delegate).attr('index') // don't read recid directly as it could be a number or a string\n const recid = grid.records[index]?.recid\n // do not generate click if empty record is clicked\n if (recid != '-none-' && !grid.last.inEditMode) {\n grid.click(recid, event)\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('contextmenu', { delegate: 'tr' }, (event: any) => { // any: event.delegate Query extension\n const index = parseInt(query(event.delegate).attr('index')) // don't read recid directly as it could be a number or a string\n const recid = grid.records[index]?.recid\n const td = query(event.target).closest('td')\n const column = td.attr('col') ? parseInt(td.attr('col')) : undefined\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ctxOpts: any = { index } // any: exactOptionalPropertyTypes — build opts conditionally\n if (recid != null) ctxOpts.recid = recid\n if (column != null) ctxOpts.column = column\n grid.showContextMenu(event, ctxOpts)\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseover', { delegate: 'tr' }, (event: any) => { // any: event.delegate Query extension\n grid.last['rec_out'] = false\n const index = query(event.delegate).attr('index') // don't read recid directly as it could be a number or a string\n const recid = grid.records[index]?.recid\n if (index !== grid.last['rec_over']) {\n grid.last['rec_over'] = index\n // setTimeout is needed for correct event order enter/leave\n setTimeout(() => {\n delete grid.last['rec_out']\n const edata = grid.trigger('mouseEnter', { target: grid.name, originalEvent: event, index, recid })\n edata.finish()\n })\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseout', { delegate: 'tr' }, (event: any) => { // any: event.delegate Query extension\n const index = query(event.delegate).attr('index') // don't read recid directly as it could be a number or a string\n const recid = grid.records[index]?.recid\n grid.last['rec_out'] = true\n // setTimeouts are needed for correct event order enter/leave\n setTimeout(() => {\n const recLeave = () => {\n const edata = grid.trigger('mouseLeave', { target: grid.name, originalEvent: event, index, recid })\n edata.finish()\n }\n if (index !== grid.last['rec_over']) {\n recLeave()\n }\n setTimeout(() => {\n if (grid.last['rec_out']) {\n delete grid.last['rec_out']\n delete grid.last['rec_over']\n recLeave()\n }\n })\n })\n })\n }\n\n // enable scrolling on frozen records,\n gridBody\n .data('scroll', { lastDelta: 0, lastTime: 0 })\n .find('.tsg-grid-frecords')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mousewheel DOMMouseScroll ', (event: any) => { // any: WheelEvent or MouseEvent, browser-specific\n event.preventDefault()\n // TODO: improve, scroll is not smooth, if scrolled to the end, it takes a while to return\n const scroll = gridBody.data('scroll')\n const container = gridBody.find('.tsg-grid-records')\n let amount = typeof event.wheelDelta != 'undefined' ? -event.wheelDelta : (event.detail || event.deltaY)\n const newScrollTop = container.prop('scrollTop')\n\n scroll.lastDelta += amount\n amount = Math.round(scroll.lastDelta)\n gridBody.data('scroll', scroll)\n\n // make scroll amount dependent on visible rows\n // amount *= (Math.round(records.prop('clientHeight') / self.recordHeight) - 1) * self.recordHeight / 4\n container.get(0).scroll({ top: newScrollTop + amount, behavior: 'smooth' })\n })\n // scroll on records (and frozen records)\n records.off('.body-global')\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('scroll.body-global', { delegate: '.tsg-grid-records' }, (event: any) => { // any: event.delegate Query extension\n grid.scroll(event)\n })\n\n query(grid.box).find('.tsg-grid-body') // gridBody\n .off('.body-global')\n // header column click\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click.body-global dblclick.body-global contextmenu.body-global', { delegate: 'td.tsg-head' }, (event: any) => { // any: event.delegate Query extension\n const col_ind = parseInt(query(event.delegate).attr('col'))\n const col = grid.columns[col_ind] ?? { field: String(col_ind) } // it could be line number\n switch (event.type) {\n case 'click':\n grid.columnClick(col.field, event)\n break\n case 'dblclick':\n grid.columnDblClick(col.field, event)\n break\n case 'contextmenu':\n if (grid.show.columnMenu) {\n grid.columnContextMenu(col.field, event)\n } else {\n grid.showContextMenu(event, { column: col_ind ?? undefined })\n }\n break\n\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseover.body-global', { delegate: '.tsg-col-header' }, (event: any) => { // any: event.delegate Query extension\n const col = query(event.delegate).parent().attr('col')\n grid.columnTooltipShow(col, event)\n query(event.delegate)\n .off('.tooltip')\n .on('mouseleave.tooltip', () => {\n grid.columnTooltipHide(col, event)\n })\n })\n // select all\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click.body-global', { delegate: 'input.tsg-select-all' }, (event: any) => { // any: event.delegate Query extension\n if (event.delegate.checked) { grid.selectAll() } else { grid.selectNone() }\n event.stopPropagation()\n clearTimeout(grid.last.kbd_timer ?? undefined) // keep grid in focus\n })\n // tree-like grid (or expandable column) expand/collapse\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click.body-global', { delegate: '.tsg-show-children, .tsg-col-expand' }, (event: any) => { // any: event.delegate Query extension\n event.stopPropagation()\n const ind = query(event.target).parents('tr').attr('index')\n grid.toggle(grid.records[ind]!.recid)\n })\n // info bubbles\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click.body-global mouseover.body-global', { delegate: '.tsg-info' }, (event: any) => { // any: event.delegate Query extension\n const td = query(event.delegate).closest('td')\n const tr = td.parent()\n const col = grid.columns[td.attr('col')]\n const isSummary = tr.parents('.tsg-grid-body').hasClass('tsg-grid-summary')\n if (['mouseenter', 'mouseover'].includes(col?.['info']?.showOn?.toLowerCase()) && event.type == 'mouseover') {\n grid.showBubble(parseInt(tr.attr('index')), parseInt(td.attr('col')), isSummary)\n .then(() => {\n query(event.delegate)\n .off('.tooltip')\n .on('mouseleave.tooltip', () => { TsTooltip.hide(grid.name + '-bubble') })\n })\n } else if (event.type == 'click') {\n TsTooltip.hide(grid.name + '-bubble')\n grid.showBubble(parseInt(tr.attr('index')), parseInt(td.attr('col')), isSummary)\n }\n })\n // clipborad copy icon\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseover.body-global', { delegate: '.tsg-clipboard-copy' }, (event: any) => { // any: event.delegate Query extension\n if (event.delegate._tooltipShow) return\n const td = query(event.delegate).parent()\n const tr = td.parent()\n const col = grid.columns[td.attr('col')]\n const isSummary = tr.parents('.tsg-grid-body').hasClass('tsg-grid-summary')\n\n TsTooltip.show({\n name: grid.name + '-bubble',\n anchor: event.delegate,\n html: TsUtils.lang(typeof col?.clipboardCopy == 'string' ? col.clipboardCopy : 'Copy to clipboard'),\n position: 'top|bottom',\n offsetY: -2\n })\n query(event.delegate)\n .off('.tooltip')\n .on('mouseleave.tooltip', (_evt: Event) => {\n TsTooltip.hide(grid.name + '-bubble')\n })\n .on('click.tooltip', (evt: Event) => {\n evt.stopPropagation()\n TsTooltip.update(grid.name + '-bubble', TsUtils.lang('Copied'))\n grid.clipboardCopy(tr.attr('index'), td.attr('col'), isSummary)\n })\n event.delegate._tooltipShow = true\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click.body-global', { delegate: '.tsg-editable-checkbox' }, (event: any) => { // any: event.delegate Query extension\n const dt = query(event.delegate).data()\n grid.editChange.call(grid, event.delegate, dt.changeind, dt.colind, event)\n grid.updateToolbar()\n })\n\n // show empty message\n if (grid.records.length === 0 && grid.msgEmpty) {\n query(grid.box).find(`#grid_${grid.name}_body`)\n .append(`<div id=\"grid_${grid.name}_empty_msg\" class=\"tsg-grid-empty-msg\"><div>${TsUtils.lang(grid.msgEmpty)}</div></div>`)\n } else if (query(grid.box).find(`#grid_${grid.name}_empty_msg`).length > 0) {\n query(grid.box).find(`#grid_${grid.name}_empty_msg`).remove()\n }\n // show summary records\n if (grid.summary.length > 0) {\n const sumHTML = grid.getSummaryHTML()\n query(grid.box).find(`#grid_${grid.name}_fsummary`).html(sumHTML?.[0] ?? '').show()\n query(grid.box).find(`#grid_${grid.name}_summary`).html(sumHTML?.[1] ?? '').show()\n } else {\n query(grid.box).find(`#grid_${grid.name}_fsummary`).hide()\n query(grid.box).find(`#grid_${grid.name}_summary`).hide()\n }\n}\n\nexport function destroy(grid: TsGrid) {\n // event before\n const edata = grid.trigger('destroy', { target: grid.name })\n if (edata.isCancelled === true) return\n // clean up\n grid.toolbar?.destroy?.()\n if (query(grid.box).find(`#grid_${grid.name}_body`).length > 0) {\n grid.unmount()\n }\n delete TsUi[grid.name]\n // event after\n edata.finish()\n}\n\nexport function initColumnOnOff(grid: TsGrid) {\n // any: array of heterogeneous runtime values; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const items: any[] = [\n { id: 'line-numbers', text: 'Line #', checked: grid.show.lineNumbers }\n ]\n // columns\n for (let c = 0; c < grid.columns.length; c++) {\n const col = grid.columns[c]!\n let text = col.text\n if (col.hideable === false) continue\n if (!text && col.tooltip) text = col.tooltip\n if (!text) text = '- column '+ (c + 1) +' -'\n items.push({ id: col.field, text: TsUtils.stripTags(text as string), checked: !col.hidden })\n }\n const url = grid.url?.get ?? grid.url\n if ((url && grid.show.skipRecords) || grid.show.saveRestoreState) {\n items.push({ text: '--' })\n }\n // skip records\n if (grid.show.skipRecords) {\n const skip = TsUtils.lang('Skip') +\n `<input id=\"${grid.name}_skip\" type=\"text\" class=\"tsg-input tsg-grid-skip\" value=\"${grid.offset}\">` +\n TsUtils.lang('records')\n items.push({ id: 'tsg-skip', text: skip, group: false, icon: 'tsg-icon-empty' })\n }\n // save/restore state\n if (grid.show.saveRestoreState) {\n items.push(\n { id: 'tsg-stateSave', text: TsUtils.lang('Save Grid State'), icon: 'tsg-icon-empty', group: false },\n { id: 'tsg-stateReset', text: TsUtils.lang('Restore Default State'), icon: 'tsg-icon-empty', group: false }\n )\n }\n // any: array of heterogeneous runtime values; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const selected: any[] = []\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.forEach((item: any) => {\n item.text = TsUtils.lang(item.text) // translate\n if (item.checked) selected.push(item.id)\n })\n grid.toolbar.set('tsg-column-on-off', { selected, items })\n return items\n}\n\n// any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function initColumnDrag(grid: TsGrid, _box?: any) {\n // throw error if using column groups\n if (grid.columnGroups && grid.columnGroups.length) {\n throw 'Draggable columns are not currently supported with column groups.'\n }\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = grid\n let dragData: {\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pressed: boolean; targetPos: any; columnHead: any; [key: string]: any\n } = {\n pressed: false,\n targetPos: null,\n columnHead: null\n }\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const hasInvalidClass = (target: any, lastColumn?: any) => {\n const iClass = ['tsg-col-number', 'tsg-col-expand', 'tsg-col-select']\n if (lastColumn !== true) iClass.push('tsg-head-last')\n for (let i = 0; i < iClass.length; i++) {\n if (query(target).closest('.tsg-head').hasClass(iClass[i])) {\n return true\n }\n }\n return false\n }\n\n // attach original event listener\n query(self.box)\n .off('.colDrag')\n .on('mousedown.colDrag', dragColStart)\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function dragColStart(event: any) { // any: DragEvent at runtime\n if (dragData.pressed || dragData['numberPreColumnsPresent'] === 0 || event.button !== 0) return\n\n const preColHeadersSelector = '.tsg-head.tsg-col-number, .tsg-head.tsg-col-expand, .tsg-head.tsg-col-select'\n\n // do nothing if it is not a header\n if (!query(event.target).parents().hasClass('tsg-head') || hasInvalidClass(event.target)) return\n\n dragData.pressed = true\n dragData['initialX'] = event.pageX\n dragData['initialY'] = event.pageY\n dragData['numberPreColumnsPresent'] = query(self.box).find(preColHeadersSelector).length\n\n // start event for drag start\n const origColumn = dragData.columnHead = query(event.target).closest('.tsg-head')\n const origColumnNumber = dragData['originalPos'] = parseInt(origColumn.attr('col'), 10)\n const edata = self.trigger('columnDragStart', { originalEvent: event, origColumnNumber, target: origColumn[0] })\n if (edata.isCancelled === true) return false\n\n const columns = dragData['columns'] = query(self.box).find('.tsg-head:not(.tsg-head-last)')\n\n // add events\n query(document).on('mouseup.colDrag', dragColEnd)\n query(document).on('mousemove.colDrag', dragColOver)\n\n const col = self.columns[dragData['originalPos']]!\n const colText = TsUtils.lang(typeof col.text == 'function' ? col.text(col) : col.text)\n dragData['ghost'] = _queryRaw.html(`<span col=\"${dragData['originalPos']}\">${colText}</span>`)[0]\n\n query(document.body).append(dragData['ghost'])\n query(dragData['ghost'])\n .css({\n display: 'none',\n left: event.pageX,\n top: event.pageY,\n opacity: 1,\n margin: '3px 0 0 20px',\n padding: '3px',\n 'background-color': 'white',\n position: 'fixed',\n 'z-index': 999999,\n })\n .addClass('.tsg-grid-ghost')\n\n // establish current offsets\n dragData['offsets'] = []\n for (let i = 0, l = columns.length; i < l; i++) {\n const rect = columns[i].getBoundingClientRect()\n dragData['offsets'].push(rect.left)\n }\n // conclude event\n edata.finish()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function dragColOver(event: any) { // any: DragEvent at runtime\n if (!dragData.pressed || !dragData.columnHead) return\n const cursorX = event.pageX\n const cursorY = event.pageY\n if (!hasInvalidClass(event.target, true)) {\n markIntersection(event)\n }\n trackGhost(cursorX, cursorY)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function dragColEnd(event: any) { // any: DragEvent at runtime\n if (!dragData.pressed || !dragData.columnHead) return\n dragData.pressed = false\n\n let target\n const finish = () => {\n const ghosts = query(self.box).find('.tsg-grid-ghost')\n query(self.box).find('.tsg-intersection-marker').hide()\n query(dragData['ghost']).remove()\n ghosts.remove()\n query(document).off('.colDrag')\n // any: cast-to-any for return-position narrowing; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n dragData = {} as any\n }\n\n // if no move, then click event for sorting\n if (event.pageX == dragData['initialX'] && event.pageY == dragData['initialY']) {\n self.columnClick(self.columns[dragData['originalPos']]!.field, event)\n finish()\n return\n }\n\n // start event for drag start\n const edata = self.trigger('columnDragEnd', { originalEvent: event, target: dragData.columnHead[0], dragData })\n if (edata.isCancelled === true) return false\n\n const selected = self.columns[dragData['originalPos']]!\n const columnConfig = self.columns\n\n if (dragData['originalPos'] != dragData.targetPos && dragData.targetPos != null) {\n columnConfig.splice(dragData.targetPos, 0, TsUtils.clone(selected))\n columnConfig.splice(columnConfig.indexOf(selected), 1)\n }\n finish()\n\n self.refresh()\n edata.finish({ targetColumn: (target ?? 1) - 1 })\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function markIntersection(event: any) { // any: MouseEvent at runtime\n // if mouse over is not over table\n if (query(event.target).closest('td').length == 0) {\n return\n }\n const td = query(event.target).closest('td')\n const newPos = td.hasClass('tsg-head-last') ? self.columns.length : parseInt(td.attr('col'))\n if (dragData.targetPos != newPos) {\n // if mouse over invalid column\n const rect1 = query(self.box).find('.tsg-grid-body').get(0).getBoundingClientRect()\n const rect2 = query(event.target).closest('td').get(0).getBoundingClientRect()\n query(self.box).find('.tsg-intersection-marker')\n .show()\n .css({\n left: (rect2.left - rect1.left) + 'px',\n height:rect2.height + 'px'\n })\n dragData.targetPos = newPos\n }\n return\n }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function trackGhost(cursorX: any, cursorY: any){\n query(dragData['ghost'])\n .css({\n left : (cursorX - 10) + 'px',\n top : (cursorY - 10) + 'px'\n })\n .show()\n }\n\n // return an object to remove drag if it has ever been enabled\n return {\n remove() {\n query(self.box).off('.colDrag')\n self.last.columnDrag = false\n }\n }\n}\n\n// any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function columnOnOff(grid: TsGrid, event: MouseEvent | any, field: string) {\n // event before\n const edata = grid.trigger('columnOnOff', { target: grid.name, field: field, originalEvent: event })\n if (edata.isCancelled === true) return\n // collapse expanded rows\n const rows = grid.find({ 'TsUi.expanded': true }, true)\n for (let r = 0; r < rows.length; r++) {\n const tmp = grid.records[r]!.TsUi\n if (tmp && !Array.isArray(tmp.children)) {\n grid.records[r]!.TsUi!.expanded = false\n }\n }\n // show/hide\n if (field == 'line-numbers') {\n grid.show.lineNumbers = !grid.show.lineNumbers\n grid.refresh()\n } else {\n const col = grid.getColumn(field)\n if (col != null && col.hidden) {\n grid.showColumn(col.field)\n } else if (col != null) {\n grid.hideColumn(col.field)\n }\n }\n // event after\n edata.finish()\n}\n\nexport function initToolbar(grid: TsGrid) {\n // if it is already initiazlied\n if (grid.toolbar.render != null) {\n return\n }\n let tb_items = grid.toolbar.items || []\n grid.toolbar.items = []\n grid.toolbar = new TsToolbar(TsUtils.extend({}, grid.toolbar, { name: grid.name +'_toolbar', owner: grid }))\n if (grid.show.toolbarReload) {\n grid.toolbar.items.push(TsUtils.extend({}, grid.buttons['reload']))\n }\n if (grid.show.toolbarColumns) {\n grid.toolbar.items.push(TsUtils.extend({}, grid.buttons['columns']))\n }\n if (grid.show.toolbarSearch) {\n const html =`\n <div class=\"tsg-grid-search-input\">\n ${grid.buttons['search'].html}\n <div id=\"grid_${grid.name}_search_name\" class=\"tsg-grid-search-name\">\n <span class=\"name-icon tsg-icon-search\"></span>\n <span class=\"name-text\"></span>\n <span class=\"name-cross tsg-action\" data-click=\"searchReset\">x</span>\n </div>\n <input type=\"text\" id=\"grid_${grid.name}_search_all\" class=\"tsg-search-all\" tabindex=\"-1\"\n autocapitalize=\"off\" autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\n placeholder=\"${TsUtils.lang(grid.last.label, true)}\" value=\"${grid.last.search}\"\n data-focus=\"searchSuggest\" data-click=\"stop\"\n >\n <div class=\"tsg-search-drop tsg-action\" data-click=\"searchOpen\"\n style=\"${grid.multiSearch ? '' : 'display: none'}\">\n <span class=\"tsg-icon-drop\"></span>\n </div>\n </div>`\n grid.toolbar.items.push({\n id: 'tsg-search',\n type: 'html',\n html,\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onRefresh: async (event: any) => {\n await event.complete\n const input = query(grid.box).find(`#grid_${grid.name}_search_all`)\n TsUtils.bindEvents(query(grid.box).find(`#grid_${grid.name}_search_all, .tsg-action`), grid)\n // slow down live search calls\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const slowSearch = TsUtils.debounce((event: any) => {\n const val = event.target.value\n if (grid.liveSearch && grid.last['liveText'] != val) {\n grid.last['liveText'] = val\n grid.search(grid.last.field, val)\n }\n }, 250)\n input\n .on('blur', () => { grid.last['liveText'] = '' })\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('keyup', (event: any) => {\n switch (event.keyCode) {\n case 40: {\n // show saved searches on arrow down\n grid.searchSuggest(true)\n break\n }\n case 38: {\n // hide saved searches on arrow up\n grid.searchSuggest(true, true)\n break\n }\n case 13: {\n // search on enter key\n TsMenu.hide(grid.name + '-search-suggest')\n grid.search(grid.last.field, event.target.value)\n break\n }\n default: {\n // live search (if enabled)\n slowSearch(event)\n break\n }\n }\n })\n }\n })\n }\n if (Array.isArray(tb_items)) {\n const ids = tb_items.map(item => item.id)\n if (grid.show.toolbarAdd && !ids.includes(grid.buttons['add'].id)) {\n grid.toolbar.items.push(TsUtils.extend({}, grid.buttons['add']))\n }\n if (grid.show.toolbarEdit && !ids.includes(grid.buttons['edit'].id)) {\n grid.toolbar.items.push(TsUtils.extend({}, grid.buttons['edit']))\n }\n if (grid.show.toolbarDelete && !ids.includes(grid.buttons['delete'].id)) {\n grid.toolbar.items.push(TsUtils.extend({}, grid.buttons['delete']))\n }\n if (grid.show.toolbarSave && !ids.includes(grid.buttons['save'].id)) {\n if (grid.show.toolbarAdd || grid.show.toolbarDelete || grid.show.toolbarEdit) {\n grid.toolbar.items.push({ type: 'break', id: 'tsg-break2' })\n }\n grid.toolbar.items.push(TsUtils.extend({}, grid.buttons['save']))\n }\n tb_items = tb_items.map(item => grid.buttons[item.name]\n ? TsUtils.extend({}, grid.buttons[item.name], item) : item)\n }\n // add original buttons\n grid.toolbar.items.push(...tb_items)\n\n // =============================================\n // ------ Toolbar onClick processing\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n grid.toolbar.on('click', (event: any) => {\n const edata = grid.trigger('toolbar', { target: event.target, originalEvent: event })\n if (edata.isCancelled === true) return\n let edata2\n switch (event.detail.item.id) {\n case 'tsg-reload':\n edata2 = grid.trigger('reload', { target: grid.name })\n if (edata2.isCancelled === true) return false\n grid.reload()\n edata2.finish()\n break\n case 'tsg-column-on-off':\n if (event.detail.subItem) {\n const id = event.detail.subItem.id\n if (['tsg-stateSave', 'tsg-stateReset'].includes(id)) {\n grid[id.substring(5)]()\n } else if (id == 'tsg-skip') {\n // empty\n } else {\n grid.columnOnOff(event, event.detail.subItem.id)\n }\n } else {\n grid.initColumnOnOff()\n setTimeout(() => {\n query(`#w2overlay-${grid.name}_toolbar-drop .tsg-grid-skip`)\n .off('.tsg-grid')\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click.tsg-grid', (evt: any) => {\n evt.stopPropagation()\n })\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('keypress', (evt: any) => {\n if (evt.keyCode == 13) {\n grid.skip(evt.target.value)\n grid.toolbar.click('tsg-column-on-off') // close menu\n }\n })\n }, 100)\n }\n break\n case 'tsg-add':\n edata2 = grid.trigger('add', { target: grid.name, recid: null })\n if (edata2.isCancelled === true) return false\n edata2.finish()\n break\n case 'tsg-edit': {\n const sel = grid.getSelection()\n let recid = null\n if (sel.length == 1) recid = sel[0]\n edata2 = grid.trigger('edit', { target: grid.name, recid: recid })\n if (edata2.isCancelled === true) return false\n edata2.finish()\n break\n }\n case 'tsg-delete':\n grid.delete()\n break\n case 'tsg-save':\n grid.save()\n break\n }\n // no default action\n edata.finish()\n })\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n grid.toolbar.on('refresh', (event: any) => {\n if (event.target == 'tsg-search') {\n const sd = grid.searchData\n setTimeout(() => {\n grid.searchInitInput(grid.last.field, (sd.length == 1 ? sd[0]!.value : null))\n }, 1)\n }\n })\n}\n\nexport function initResize(grid: TsGrid) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const obj = grid\n query(grid.box).find('.tsg-resizer')\n .off('.grid-col-resize')\n .on('click.grid-col-resize', function(event: Event) {\n event.stopPropagation()\n event.preventDefault()\n })\n .on('mousedown.grid-col-resize', function(this: Element, event: Event) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mev = event as any as MouseEvent // any: typed as Event but is MouseEvent\n if (!mev) return\n obj.last.colResizing = true\n obj.last.tmp = {\n x : mev.screenX,\n y : mev.screenY,\n gx : mev.screenX,\n gy : mev.screenY,\n col : parseInt(query(this).attr('name')) // 'this' is the DOM element\n }\n obj.last.tmp.tds = query(obj.box).find('#grid_'+ obj.name +'_body table tr:first-child td[col=\"'+ obj.last.tmp.col +'\"]')\n\n mev.stopPropagation()\n mev.preventDefault()\n // fix sizes\n for (let c = 0; c < obj.columns.length; c++) {\n if (obj.columns[c]!.hidden) continue\n if (obj.columns[c]!.sizeOriginal == null) obj.columns[c]!.sizeOriginal = obj.columns[c]!.size ?? ''\n obj.columns[c]!.size = obj.columns[c]!.sizeCalculated ?? ''\n }\n const edata = obj.trigger('columnResize', {\n target: obj.name, resizeBy: 0, originalEvent: mev,\n column: obj.last.tmp.col, field: obj.columns[obj.last.tmp.col]!.field\n })\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let timer: any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mouseMove = function(event: any) { // any: MouseEvent at runtime, passed as EventListener\n if (obj.last.colResizing != true) return\n if (!event) event = window.event\n const edata2 = obj.trigger('columnResizeMove', TsUtils.extend(edata.detail, { resizeBy: (event.screenX - obj.last.tmp.gx), originalEvent: event }))\n if (edata2.isCancelled === true) { return }\n obj.last.tmp.x = (event.screenX - obj.last.tmp.x)\n obj.last.tmp.y = (event.screenY - obj.last.tmp.y)\n const newWidth = (parseInt(String(obj.columns[obj.last.tmp.col]!.size ?? 0)) + obj.last.tmp.x) + 'px'\n obj.columns[obj.last.tmp.col]!.size = newWidth\n if (timer) clearTimeout(timer)\n timer = setTimeout(() => {\n obj.resizeRecords()\n obj.scroll()\n }, 100)\n obj.last.tmp.tds.css({ width: newWidth })\n obj.last.tmp.x = event.screenX\n obj.last.tmp.y = event.screenY\n edata2.finish()\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mouseUp = function(event: any) { // any: MouseEvent at runtime, passed as EventListener\n query(document).off('.grid-col-resize')\n obj.resizeRecords()\n obj.scroll()\n edata.finish({ originalEvent: event })\n setTimeout(() => { obj.last.colResizing = false }, 1)\n }\n\n query(document)\n .off('.grid-col-resize')\n .on('mousemove.grid-col-resize', mouseMove)\n .on('mouseup.grid-col-resize', mouseUp)\n })\n .on('dblclick.grid-col-resize', function(this: Element, event: Event) {\n const ind = parseInt(query(this).attr('name'))\n obj.columnAutoSize(ind)\n event.stopPropagation()\n event.preventDefault()\n })\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .each((el: any) => {\n const td = query(el).get(0).parentNode\n query(el).css({\n 'height' : td.clientHeight + 'px',\n 'margin-left' : (td.clientWidth - 3) + 'px'\n })\n })\n}\n\nexport function resizeBoxes(grid: TsGrid) {\n // elements\n const header = query(grid.box).find(`#grid_${grid.name}_header`)\n const toolbar = query(grid.box).find(`#grid_${grid.name}_toolbar`)\n const fsummary = query(grid.box).find(`#grid_${grid.name}_fsummary`)\n const summary = query(grid.box).find(`#grid_${grid.name}_summary`)\n const footer = query(grid.box).find(`#grid_${grid.name}_footer`)\n const body = query(grid.box).find(`#grid_${grid.name}_body`)\n\n if (grid.show.header) {\n header.css({ top: '0px', left: '0px', right: '0px' })\n }\n if (grid.show.toolbar) {\n toolbar.css({\n top: (0 + (grid.show.header ? TsUtils.getSize(header, 'height') : 0)) + 'px',\n left: '0px',\n right: '0px'\n })\n }\n if (grid.summary.length > 0) {\n fsummary.css({\n bottom: (0 + (grid.show.footer ? TsUtils.getSize(footer, 'height') : 0)) + 'px'\n })\n summary.css({\n bottom: (0 + (grid.show.footer ? TsUtils.getSize(footer, 'height') : 0)) + 'px',\n right: '0px'\n })\n }\n if (grid.show.footer) {\n footer.css({ bottom: '0px', left: '0px', right: '0px' })\n }\n body.css({\n top: (0 + (grid.show.header ? TsUtils.getSize(header, 'height') : 0) + (grid.show.toolbar ? TsUtils.getSize(toolbar, 'height') : 0)) + 'px',\n bottom: (0 + (grid.show.footer ? TsUtils.getSize(footer, 'height') : 0) + (grid.summary.length > 0 ? TsUtils.getSize(summary, 'height') : 0)) + 'px',\n left: '0px',\n right: '0px'\n })\n}\n\nexport function resizeRecords(grid: TsGrid) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const obj = grid\n // remove empty records\n query(grid.box).find('.tsg-empty-record').remove()\n const box = query(grid.box)\n const gridEl = query(grid.box).find(':scope > div.tsg-grid-box')\n const header = query(grid.box).find(`#grid_${grid.name}_header`)\n const toolbar = query(grid.box).find(`#grid_${grid.name}_toolbar`)\n const summary = query(grid.box).find(`#grid_${grid.name}_summary`)\n const fsummary = query(grid.box).find(`#grid_${grid.name}_fsummary`)\n const footer = query(grid.box).find(`#grid_${grid.name}_footer`)\n const body = query(grid.box).find(`#grid_${grid.name}_body`)\n const columns = query(grid.box).find(`#grid_${grid.name}_columns`)\n const fcolumns = query(grid.box).find(`#grid_${grid.name}_fcolumns`)\n const records = query(grid.box).find(`#grid_${grid.name}_records`)\n const frecords = query(grid.box).find(`#grid_${grid.name}_frecords`)\n const scroll1 = query(grid.box).find(`#grid_${grid.name}_scroll1`)\n let lineNumberWidth = String(grid.total).length * 8 + 10\n if (lineNumberWidth < 34) lineNumberWidth = 34 // 3 digit width\n if (grid.lineNumberWidth != null) lineNumberWidth = grid.lineNumberWidth\n\n let bodyOverflowX = false\n let bodyOverflowY = false\n let sWidth = 0\n for (let i = 0; i < grid.columns.length; i++) {\n if (grid.columns[i]!.frozen || grid.columns[i]!.hidden) continue\n const cSize = parseInt(grid.columns[i]!.sizeCalculated ? grid.columns[i]!.sizeCalculated! : String(grid.columns[i]!.size ?? 0))\n sWidth += cSize\n }\n if (records[0]?.clientWidth < sWidth) bodyOverflowX = true\n if (body[0]?.clientHeight - (columns[0]?.clientHeight ?? 0)\n < (query(records).find(':scope > table')[0]?.clientHeight ?? 0) + (bodyOverflowX ? TsUtils.scrollBarSize() : 0)) {\n bodyOverflowY = true\n }\n\n if (!grid.fixedBody) {\n const bodyHeight = (TsUtils.getSize(columns, 'height') as number)\n + (TsUtils.getSize(query(grid.box).find('#grid_'+ grid.name +'_records table'), 'height') as number)\n + (bodyOverflowX ? (TsUtils.scrollBarSize() as number) : 0)\n const calculatedHeight = bodyHeight\n + (grid.show.header ? TsUtils.getSize(header, 'height') : 0)\n + (grid.show.toolbar ? TsUtils.getSize(toolbar, 'height') : 0)\n + (summary.css('display') != 'none' ? TsUtils.getSize(summary, 'height') : 0)\n + (grid.show.footer ? TsUtils.getSize(footer, 'height') : 0)\n gridEl.css('height', calculatedHeight + 'px')\n body.css('height', bodyHeight + 'px')\n box.css('height', TsUtils.getSize(gridEl, 'height') + 'px')\n } else {\n const calculatedHeight = gridEl[0]?.clientHeight\n - (grid.show.header ? TsUtils.getSize(header, 'height') : 0)\n - (grid.show.toolbar ? TsUtils.getSize(toolbar, 'height') : 0)\n - (summary.css('display') != 'none' ? TsUtils.getSize(summary, 'height') : 0)\n - (grid.show.footer ? TsUtils.getSize(footer, 'height') : 0)\n body.css('height', calculatedHeight + 'px')\n }\n\n let buffered = grid.records.length\n const url = grid.url?.get ?? grid.url\n if (grid.searchData.length != 0 && !url) buffered = grid.last.searchIds.length\n if (!grid.fixedBody) { bodyOverflowY = false }\n if (bodyOverflowX || bodyOverflowY) {\n columns.find(':scope > table > tbody > tr:nth-child(1) td.tsg-head-last')\n .css('width', TsUtils.scrollBarSize() + 'px')\n .show()\n records.css({\n top: ((grid.columnGroups.length > 0 && grid.show.columns ? 1 : 0) + (TsUtils.getSize(columns, 'height') as number)) +'px',\n '-webkit-overflow-scrolling': 'touch',\n 'overflow-x': (bodyOverflowX ? 'auto' : 'hidden'),\n 'overflow-y': (bodyOverflowY ? 'auto' : 'hidden')\n })\n } else {\n columns.find(':scope > table > tbody > tr:nth-child(1) td.tsg-head-last').hide()\n records.css({\n top: ((grid.columnGroups.length > 0 && grid.show.columns ? 1 : 0) + (TsUtils.getSize(columns, 'height') as number)) +'px',\n overflow: 'hidden'\n })\n if (records.length > 0) { grid.last.vscroll.scrollTop = 0; grid.last.vscroll.scrollLeft = 0 }\n }\n if (bodyOverflowX) {\n frecords.css('margin-bottom', TsUtils.scrollBarSize() + 'px')\n scroll1.show()\n } else {\n frecords.css('margin-bottom', 0)\n scroll1.hide()\n }\n frecords.css({ overflow: 'hidden', top: records.css('top') })\n if (grid.show.emptyRecords && !bodyOverflowY) {\n let max = Math.floor((records[0]?.clientHeight ?? 0) / grid.recordHeight) - 1\n let leftover = 0\n if (records[0]) leftover = records[0].scrollHeight - max * grid.recordHeight\n if (leftover >= grid.recordHeight) {\n leftover -= grid.recordHeight\n max++\n }\n if (grid.fixedBody) {\n for (let di = buffered; di < max; di++) {\n addEmptyRow(di, grid.recordHeight, grid)\n }\n addEmptyRow(max, leftover, grid)\n }\n }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function addEmptyRow(row: any, height: any, grid: any) {\n let html1 = ''\n let html2 = ''\n let htmlp = ''\n html1 += '<tr class=\"'+ (row % 2 ? 'tsg-even' : 'tsg-odd') + ' tsg-empty-record\" recid=\"-none-\" style=\"height: '+ height +'px\">'\n html2 += '<tr class=\"'+ (row % 2 ? 'tsg-even' : 'tsg-odd') + ' tsg-empty-record\" recid=\"-none-\" style=\"height: '+ height +'px\">'\n if (grid.show.lineNumbers) html1 += '<td class=\"tsg-col-number\"></td>'\n if (grid.show.selectColumn) html1 += '<td class=\"tsg-grid-data tsg-col-select\"></td>'\n if (grid.show.expandColumn) html1 += '<td class=\"tsg-grid-data tsg-col-expand\"></td>'\n html2 += '<td class=\"tsg-grid-data-spacer\" col=\"start\" style=\"border-right: 0\"></td>'\n if (grid.reorderRows) html2 += '<td class=\"tsg-grid-data tsg-col-order\" col=\"order\"></td>'\n for (let j = 0; j < grid.columns.length; j++) {\n const col = grid.columns[j]\n if ((col.hidden || j < grid.last.vscroll.colIndStart || j > grid.last.vscroll.colIndEnd) && !col.frozen) continue\n htmlp = '<td class=\"tsg-grid-data\" '+ (col.attr != null ? col.attr : '') +' col=\"'+ j +'\"></td>'\n if (col.frozen) html1 += htmlp; else html2 += htmlp\n }\n html1 += '<td class=\"tsg-grid-data-last\"></td> </tr>'\n html2 += '<td class=\"tsg-grid-data-last\" col=\"end\"></td> </tr>'\n query(grid.box).find('#grid_'+ grid.name +'_frecords > table').append(html1)\n query(grid.box).find('#grid_'+ grid.name +'_records > table').append(html2)\n }\n // any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let width_box: any, percent: any\n if (body.length > 0) {\n let width_max = parseInt(body[0].clientWidth)\n - (bodyOverflowY ? (TsUtils.scrollBarSize() as number) : 0)\n - (grid.show.lineNumbers ? lineNumberWidth : 0)\n - (grid.reorderRows ? 26 : 0)\n - (grid.show.selectColumn ? 26 : 0)\n - (grid.show.expandColumn ? 26 : 0)\n - 1\n width_box = width_max\n percent = 0\n let restart = false\n for (let i = 0; i < grid.columns.length; i++) {\n const col = grid.columns[i]!\n if ((col.gridMinWidth ?? 0) > 0) {\n if ((col.gridMinWidth ?? 0) > width_box && col.hidden !== true) {\n col.hidden = true\n restart = true\n }\n if ((col.gridMinWidth ?? 0) < width_box && col.hidden === true) {\n col.hidden = false\n restart = true\n }\n }\n }\n if (restart === true) {\n grid.refresh()\n return\n }\n for (let i = 0; i < grid.columns.length; i++) {\n const col = grid.columns[i]!\n if (col.hidden) continue\n const sizeStr = String(col.size ?? 0)\n if (sizeStr.substr(sizeStr.length-2).toLowerCase() == 'px') {\n width_max -= parseFloat(sizeStr)\n col.sizeCalculated = sizeStr\n col.sizeType = 'px'\n } else {\n percent += parseFloat(sizeStr)\n col.sizeType = '%'\n delete col['sizeCorrected']\n }\n }\n if (percent != 100 && percent > 0) {\n for (let i = 0; i < grid.columns.length; i++) {\n const col = grid.columns[i]!\n if (col.hidden) continue\n if (col.sizeType == '%') {\n col['sizeCorrected'] = Math.round(parseFloat(String(col.size ?? 0)) * 100 * 100 / percent) / 100 + '%'\n }\n }\n }\n for (let i = 0; i < grid.columns.length; i++) {\n const col = grid.columns[i]!\n if (col.hidden) continue\n if (col.sizeType == '%') {\n if (col['sizeCorrected'] != null) {\n col.sizeCalculated = Math.floor(width_max * parseFloat(String(col['sizeCorrected'])) / 100) - 1 + 'px'\n } else {\n col.sizeCalculated = Math.floor(width_max * parseFloat(String(col.size ?? 0)) / 100) - 1 + 'px'\n }\n }\n }\n }\n let width_cols = 0\n for (let i = 0; i < grid.columns.length; i++) {\n const col = grid.columns[i]!\n if (col.hidden) continue\n if (col.min == null) col.min = 20\n if (parseInt(col.sizeCalculated ?? '0') < (col.min as number)) col.sizeCalculated = col.min + 'px'\n if (col.max != null && parseInt(col.sizeCalculated ?? '0') > (col.max as number)) col.sizeCalculated = col.max + 'px'\n width_cols += parseInt(col.sizeCalculated ?? '0')\n }\n let width_diff = parseInt(width_box) - width_cols\n if (width_diff > 0 && percent > 0) {\n let i = 0\n while (true) {\n const col = grid.columns[i]!\n if (col == null) { i = 0; continue }\n if (col.hidden || col.sizeType == 'px') { i++; continue }\n col.sizeCalculated = (parseInt(col.sizeCalculated ?? '0') + 1) + 'px'\n width_diff--\n if (width_diff === 0) break\n i++\n }\n } else if (width_diff > 0) {\n columns.find(':scope > table > tbody > tr:nth-child(1) td.tsg-head-last')\n .css('width', TsUtils.scrollBarSize() + 'px')\n .show()\n }\n\n let fwidth = 1\n if (grid.show.lineNumbers) fwidth += lineNumberWidth\n if (grid.show.selectColumn) fwidth += 26\n if (grid.show.expandColumn) fwidth += 26\n for (let i = 0; i < grid.columns.length; i++) {\n if (grid.columns[i]!.hidden) continue\n if (grid.columns[i]!.frozen) fwidth += parseInt(grid.columns[i]!.sizeCalculated ?? '0')\n }\n fcolumns.css('width', fwidth + 'px')\n frecords.css('width', fwidth + 'px')\n fsummary.css('width', fwidth + 'px')\n scroll1.css('width', fwidth + 'px')\n columns.css({ left: fwidth + 'px', 'padding-left': '0.5px' })\n records.css({ left: fwidth + 'px' })\n summary.css({ left: fwidth + 'px' })\n\n // resize columns\n columns.find(':scope > table > tbody > tr:nth-child(1) td')\n .add(fcolumns.find(':scope > table > tbody > tr:nth-child(1) td'))\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .each((el: any) => {\n if (query(el).hasClass('tsg-col-number')) {\n query(el).css('width', lineNumberWidth + 'px')\n }\n const ind = query(el).attr('col')\n if (ind != null) {\n if (ind == 'start') {\n let width = 0\n for (let i = 0; i < (obj.last.vscroll.colIndStart ?? 0); i++) {\n if (!obj.columns[i] || obj.columns[i]!.frozen || obj.columns[i]!.hidden) continue\n width += parseInt(obj.columns[i]!.sizeCalculated ?? '0')\n }\n query(el).css('width', width + 'px')\n }\n if (obj.columns[ind]) query(el).css('width', obj.columns[ind]!.sizeCalculated ?? '')\n }\n if (query(el).hasClass('tsg-head-last')) {\n if ((obj.last.vscroll.colIndEnd ?? 0) + 1 < obj.columns.length) {\n let width = 0\n for (let i = (obj.last.vscroll.colIndEnd ?? 0) + 1; i < obj.columns.length; i++) {\n if (!obj.columns[i] || obj.columns[i]!.frozen || obj.columns[i]!.hidden) continue\n width += parseInt(obj.columns[i]!.sizeCalculated ?? '0')\n }\n query(el).css('width', width + 'px')\n } else {\n query(el).css('width', (TsUtils.scrollBarSize() as number) + (width_diff > 0 && percent === 0 ? width_diff : 0) + 'px')\n }\n }\n })\n if (columns.find(':scope > table > tbody > tr').length == 3) {\n columns.find(':scope > table > tbody > tr:nth-child(1) td')\n .add(fcolumns.find(':scope > table > tbody > tr:nth-child(1) td'))\n .html('').css({\n 'height' : '0',\n 'border' : '0',\n 'padding': '0',\n 'margin' : '0'\n })\n }\n // resize records\n records.find(':scope > table > tbody > tr:nth-child(1) td')\n .add(frecords.find(':scope > table > tbody > tr:nth-child(1) td'))\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .each((el: any) => {\n if (query(el).hasClass('tsg-col-number')) {\n query(el).css('width', lineNumberWidth + 'px')\n }\n const ind = query(el).attr('col')\n if (ind != null) {\n if (ind == 'start') {\n let width = 0\n for (let i = 0; i < (obj.last.vscroll.colIndStart ?? 0); i++) {\n if (!obj.columns[i] || obj.columns[i]!.frozen || obj.columns[i]!.hidden) continue\n width += parseInt(obj.columns[i]!.sizeCalculated ?? '0')\n }\n query(el).css('width', width + 'px')\n }\n if (obj.columns[ind]) query(el).css('width', obj.columns[ind]!.sizeCalculated ?? '')\n }\n if (query(el).hasClass('tsg-grid-data-last') && query(el).parents('.tsg-grid-frecords').length === 0) {\n if ((obj.last.vscroll.colIndEnd ?? 0) + 1 < obj.columns.length) {\n let width = 0\n for (let i = (obj.last.vscroll.colIndEnd ?? 0) + 1; i < obj.columns.length; i++) {\n if (!obj.columns[i] || obj.columns[i]!.frozen || obj.columns[i]!.hidden) continue\n width += parseInt(obj.columns[i]!.sizeCalculated ?? '0')\n }\n query(el).css('width', width + 'px')\n } else {\n query(el).css('width', (width_diff > 0 && percent === 0 ? width_diff : 0) + 'px')\n }\n }\n })\n // resize summary\n summary.find(':scope > table > tbody > tr:nth-child(1) td')\n .add(fsummary.find(':scope > table > tbody > tr:nth-child(1) td'))\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .each((el: any) => {\n if (query(el).hasClass('tsg-col-number')) {\n query(el).css('width', lineNumberWidth + 'px')\n }\n const ind = query(el).attr('col')\n if (ind != null) {\n if (ind == 'start') {\n let width = 0\n for (let i = 0; i < (obj.last.vscroll.colIndStart ?? 0); i++) {\n if (!obj.columns[i] || obj.columns[i]!.frozen || obj.columns[i]!.hidden) continue\n width += parseInt(obj.columns[i]!.sizeCalculated ?? '0')\n }\n query(el).css('width', width + 'px')\n }\n if (obj.columns[ind]) query(el).css('width', obj.columns[ind]!.sizeCalculated ?? '')\n }\n if (query(el).hasClass('tsg-grid-data-last') && query(el).parents('.tsg-grid-frecords').length === 0) {\n query(el).css('width', (TsUtils.scrollBarSize() as number) + (width_diff > 0 && percent === 0 ? width_diff : 0) + 'px')\n }\n })\n grid.initResize()\n grid.refreshRanges()\n if ((grid.last.vscroll.scrollTop || grid.last.vscroll.scrollLeft) && records.length > 0) {\n columns.prop('scrollLeft', grid.last.vscroll.scrollLeft)\n records.prop('scrollTop', grid.last.vscroll.scrollTop)\n records.prop('scrollLeft', grid.last.vscroll.scrollLeft)\n }\n columns.css('will-change', 'scroll-position')\n}\n\nexport function getColumnsHTML(grid: TsGrid) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = grid\n let html1 = ''\n let html2 = ''\n if (grid.show.columnHeaders) {\n if (grid.columnGroups.length > 0) {\n const tmp1 = getColumns(true)\n const tmp2 = getGroups()\n const tmp3 = getColumns(false)\n html1 = (tmp1[0] ?? '') + (tmp2[0] ?? '') + (tmp3[0] ?? '')\n html2 = (tmp1[1] ?? '') + (tmp2[1] ?? '') + (tmp3[1] ?? '')\n } else {\n const tmp = getColumns(true)\n html1 = tmp[0] ?? ''\n html2 = tmp[1] ?? ''\n }\n }\n return [html1, html2]\n\n function getGroups() {\n let html1 = '<tr>'\n let html2 = '<tr>'\n let tmpf = ''\n // add empty group at the end\n const tmp = self.columnGroups.length - 1\n if (self.columnGroups[tmp].text == null && self.columnGroups[tmp]['caption'] != null) {\n console.log('NOTICE: grid columnGroup.caption property is deprecated, please use columnGroup.text. Group -> ', self.columnGroups[tmp])\n self.columnGroups[tmp].text = self.columnGroups[tmp]['caption']\n }\n if (self.columnGroups[self.columnGroups.length-1].text != '') self.columnGroups.push({ text: '' })\n\n if (self.show.lineNumbers) {\n html1 += '<td class=\"tsg-head tsg-col-number\" col=\"line-number\">' +\n ' <div>&#160;</div>' +\n '</td>'\n }\n if (self.show.selectColumn) {\n html1 += '<td class=\"tsg-head tsg-col-select\" col=\"select\">' +\n ' <div style=\"height: 25px\">&#160;</div>' +\n '</td>'\n }\n if (self.show.expandColumn) {\n html1 += '<td class=\"tsg-head tsg-col-expand\" col=\"expand\">' +\n ' <div style=\"height: 25px\">&#160;</div>' +\n '</td>'\n }\n let ii = 0\n html2 += `<td id=\"grid_${self.name}_column_start\" class=\"tsg-head\" col=\"start\" style=\"border-right: 0\"></td>`\n if (self.reorderRows) {\n html2 += '<td class=\"tsg-head tsg-col-order\" col=\"order\">' +\n ' <div style=\"height: 25px\">&#160;</div>' +\n '</td>'\n }\n for (let i = 0; i < self.columnGroups.length; i++) {\n const colg = self.columnGroups[i]\n const col: TsGridColumn = self.columns[ii] ?? {} as TsGridColumn\n if (colg.colspan != null) colg.span = colg.colspan\n if (colg.span == null || colg.span != parseInt(colg.span)) colg.span = 1\n if (col.text == null && col['caption'] != null) {\n console.log('NOTICE: grid column.caption property is deprecated, please use column.text. Column ->', col)\n col.text = col['caption']\n }\n let colspan = 0\n for (let jj = ii; jj < ii + colg.span; jj++) {\n if (self.columns[jj] && !self.columns[jj]!.hidden) {\n colspan++\n }\n }\n if (i == self.columnGroups.length-1) {\n colspan = 100 // last column\n }\n if (colspan <= 0) {\n // do nothing here, all columns in the group are hidden.\n } else if (colg.main === true) {\n let sortStyle = ''\n for (let si = 0; si < self.sortData.length; si++) {\n if (self.sortData[si]!.field == col.field) {\n if ((self.sortData[si]!.direction || '').toLowerCase() === 'asc') sortStyle = 'tsg-sort-up'\n if ((self.sortData[si]!.direction || '').toLowerCase() === 'desc') sortStyle = 'tsg-sort-down'\n }\n }\n let resizer = ''\n if (col.resizable !== false) {\n resizer = `<div class=\"tsg-resizer\" name=\"${ii}\"></div>`\n }\n const text = TsUtils.lang(typeof col.text == 'function' ? col.text(col) : col.text)\n tmpf = `<td id=\"grid_${self.name}_column_${ii}\" class=\"tsg-head ${sortStyle}\" col=\"${ii}\" `+\n ` rowspan=\"2\" colspan=\"${colspan}\">`+ resizer +\n ` <div class=\"tsg-col-group tsg-col-header ${sortStyle ? 'tsg-col-sorted' : ''}\">` +\n ` <div class=\"${sortStyle}\"></div>` + (!text ? '&#160;' : text) +\n ' </div>'+\n '</td>'\n if (col && col.frozen) html1 += tmpf; else html2 += tmpf\n } else {\n const gText = TsUtils.lang(typeof colg.text == 'function' ? colg.text(colg) : colg.text)\n tmpf = `<td id=\"grid_${self.name}_column_${ii}\" class=\"tsg-head\" col=\"${ii}\" colspan=\"${colspan}\">` +\n ` <div class=\"tsg-col-group\" style=\"${colg.style ?? ''}\">${!gText ? '&#160;' : gText}</div>` +\n '</td>'\n if (col && col.frozen) html1 += tmpf; else html2 += tmpf\n }\n ii += colg.span\n }\n html1 += '<td></td></tr>' // need empty column for border-right\n html2 += `<td id=\"grid_${self.name}_column_end\" class=\"tsg-head\" col=\"end\"></td></tr>`\n return [html1, html2]\n }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function getColumns(main: any) {\n let html1 = '<tr>'\n let html2 = '<tr>'\n if (self.show.lineNumbers) {\n html1 += '<td class=\"tsg-head tsg-col-number\" col=\"line-number\">' +\n ' <div>#</div>' +\n '</td>'\n }\n if (self.show.selectColumn) {\n html1 += '<td class=\"tsg-head tsg-col-select\" col=\"select\">' +\n ' <div>' +\n ` <input type=\"checkbox\" id=\"grid_${self.name}_check_all\" class=\"tsg-select-all\" tabindex=\"-1\"` +\n ` style=\"${self.multiSelect == false ? 'display: none;' : ''}\"` +\n ' >' +\n ' </div>' +\n '</td>'\n }\n if (self.show.expandColumn) {\n html1 += '<td class=\"tsg-head tsg-col-expand\" col=\"expand\">' +\n ' <div>&#160;</div>' +\n '</td>'\n }\n let ii = 0\n let id = 0\n let colg\n html2 += `<td id=\"grid_${self.name}_column_start\" class=\"tsg-head\" col=\"start\" style=\"border-right: 0\"></td>`\n if (self.reorderRows) {\n html2 += '<td class=\"tsg-head tsg-col-order\" col=\"order\">'+\n ' <div>&#160;</div>'+\n '</td>'\n }\n for (let i = 0; i < self.columns.length; i++) {\n const col = self.columns[i]!\n if (col.text == null && col['caption'] != null) {\n console.log('NOTICE: grid column.caption property is deprecated, please use column.text. Column -> ', col)\n col.text = col['caption']\n }\n if (col.size == null) col.size = '100%'\n if (i == id) { // always true on first iteration\n colg = self.columnGroups[ii++] || {}\n id = id + colg.span\n }\n if ((i < (self.last.vscroll.colIndStart ?? 0) || i > (self.last.vscroll.colIndEnd ?? Infinity)) && !col.frozen)\n continue\n if (col.hidden)\n continue\n if (colg.main !== true || main) { // grouping of columns\n const colCellHTML = self.getColumnCellHTML(i)\n if (col && col.frozen) html1 += colCellHTML; else html2 += colCellHTML\n }\n }\n html1 += '<td class=\"tsg-head tsg-head-last\"><div>&#160;</div></td>'\n html2 += '<td class=\"tsg-head tsg-head-last\" col=\"end\"><div>&#160;</div></td>'\n html1 += '</tr>'\n html2 += '</tr>'\n return [html1, html2]\n }\n}\n\n// any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getColumnCellHTML(grid: TsGrid, i: any) {\n const col = grid.columns[i]!\n if (col == null) return ''\n // reorder style\n const reorderCols = (grid.reorderColumns && (!grid.columnGroups || !grid.columnGroups.length)) ? ' tsg-col-reorderable ' : ''\n // sort style\n let sortStyle = ''\n for (let si = 0; si < grid.sortData.length; si++) {\n if (grid.sortData[si]!.field == col.field) {\n if ((grid.sortData[si]!.direction || '').toLowerCase() === 'asc') sortStyle = 'tsg-sort-up'\n if ((grid.sortData[si]!.direction || '').toLowerCase() === 'desc') sortStyle = 'tsg-sort-down'\n }\n }\n // col selected\n const tmp = grid.last.selection.columns\n let selected = false\n for (const t in tmp) {\n for (let si = 0; si < tmp[t]!.length; si++) {\n if (tmp[t]![si] == i) selected = true\n }\n }\n const text = TsUtils.lang(typeof col.text == 'function' ? col.text(col) : col.text)\n const html = '<td id=\"grid_'+ grid.name + '_column_' + i +'\" col=\"'+ i +'\" class=\"tsg-head '+ sortStyle + reorderCols + '\">' +\n (col.resizable !== false ? '<div class=\"tsg-resizer\" name=\"'+ i +'\"></div>' : '') +\n ' <div class=\"tsg-col-header '+ (sortStyle ? 'tsg-col-sorted' : '') +' '+ (selected ? 'tsg-col-selected' : '') +'\">'+\n ' <div class=\"'+ sortStyle +'\"></div>'+\n (!text ? '&#160;' : text) +\n ' </div>'+\n '</td>'\n\n return html\n}\n\n// any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function columnTooltipShow(grid: TsGrid, ind: any, _event: any) {\n const $el = query(grid.box).find('#grid_'+ grid.name + '_column_'+ ind)\n const item = grid.columns[ind]\n const pos = grid.columnTooltip\n TsTooltip.show({\n name: grid.name + '-column-tooltip',\n anchor: $el.get(0),\n html: item?.tooltip,\n position: pos,\n })\n}\n\n// any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function columnTooltipHide(grid: TsGrid, _ind: any, _event: any) {\n TsTooltip.hide(grid.name + '-column-tooltip')\n}\n\nexport function getRecordsHTML(grid: TsGrid) {\n let buffered = grid.records.length\n const url = grid.url?.get ?? grid.url\n if (grid.searchData.length != 0 && !url) buffered = grid.last.searchIds.length\n // larger number works better with chrome, smaller with FF.\n if (buffered > grid.vs_start) grid.last.vscroll.show_extra = grid.vs_extra; else grid.last.vscroll.show_extra = grid.vs_start\n const records = query(grid.box).find(`#grid_${grid.name}_records`)\n let limit = Math.floor((records.get(0)?.clientHeight || 0) / grid.recordHeight) + grid.last.vscroll.show_extra + 1\n if (limit < grid.vs_start) {\n limit = grid.vs_start\n }\n if (!grid.fixedBody || limit > buffered) limit = buffered\n // always need first record for resizing purposes\n let rec_html = grid.getRecordHTML(-1, 0)\n let html1 = '<table><tbody>' + rec_html[0]\n let html2 = '<table><tbody>' + rec_html[1]\n // first empty row with height\n html1 += '<tr id=\"grid_'+ grid.name + '_frec_top\" line=\"top\" style=\"height: '+ 0 +'px\">'+\n ' <td colspan=\"2000\"></td>'+\n '</tr>'\n html2 += '<tr id=\"grid_'+ grid.name + '_rec_top\" line=\"top\" style=\"height: '+ 0 +'px\">'+\n ' <td colspan=\"2000\"></td>'+\n '</tr>'\n for (let i = 0; i < limit; i++) {\n rec_html = grid.getRecordHTML(i, i+1)\n html1 += rec_html[0]\n html2 += rec_html[1]\n }\n const h2 = (buffered - limit) * grid.recordHeight\n html1 += '<tr id=\"grid_' + grid.name + '_frec_bottom\" rec=\"bottom\" line=\"bottom\" style=\"height: ' + h2 + 'px; vertical-align: top\">' +\n ' <td colspan=\"2000\" style=\"border: 0\"></td>'+\n '</tr>'+\n '<tr id=\"grid_'+ grid.name +'_frec_more\" style=\"display: none; \">'+\n ' <td colspan=\"2000\" class=\"tsg-load-more\"></td>'+\n '</tr>'+\n '</tbody></table>'\n html2 += '<tr id=\"grid_' + grid.name + '_rec_bottom\" rec=\"bottom\" line=\"bottom\" style=\"height: ' + h2 + 'px; vertical-align: top\">' +\n ' <td colspan=\"2000\" style=\"border: 0\"></td>'+\n '</tr>'+\n '<tr id=\"grid_'+ grid.name +'_rec_more\" style=\"display: none\">'+\n ' <td colspan=\"2000\" class=\"tsg-load-more\"></td>'+\n '</tr>'+\n '</tbody></table>'\n grid.last.vscroll.recIndStart = 0\n grid.last.vscroll.recIndEnd = limit\n return [html1, html2]\n}\n\nexport function getSummaryHTML(grid: TsGrid) {\n if (grid.summary.length === 0) return\n let rec_html = grid.getRecordHTML(-1, 0) // need this in summary too for colspan to work properly\n let html1 = '<table><tbody>' + rec_html[0]\n let html2 = '<table><tbody>' + rec_html[1]\n for (let i = 0; i < grid.summary.length; i++) {\n rec_html = grid.getRecordHTML(i, i+1, true)\n html1 += rec_html[0]\n html2 += rec_html[1]\n }\n html1 += '</tbody></table>'\n html2 += '</tbody></table>'\n return [html1, html2]\n}\n\nexport function getRecordHTML(grid: TsGrid, ind: number, lineNum: number, summary?: boolean) {\n let tmph = ''\n let rec_html1 = ''\n let rec_html2 = ''\n const sel = grid.last.selection\n let record\n // first record needs for resize purposes\n if (ind == -1) {\n rec_html1 += '<tr line=\"0\">'\n rec_html2 += '<tr line=\"0\">'\n if (grid.show.lineNumbers) rec_html1 += '<td class=\"tsg-col-number\" style=\"height: 0px\"></td>'\n if (grid.show.selectColumn) rec_html1 += '<td class=\"tsg-col-select\" style=\"height: 0px\"></td>'\n if (grid.show.expandColumn) rec_html1 += '<td class=\"tsg-col-expand\" style=\"height: 0px\"></td>'\n rec_html2 += '<td class=\"tsg-grid-data tsg-grid-data-spacer\" col=\"start\" style=\"height: 0px; width: 0px\"></td>'\n if (grid.reorderRows) rec_html2 += '<td class=\"tsg-col-order\" style=\"height: 0px\"></td>'\n for (let i = 0; i < grid.columns.length; i++) {\n const col = grid.columns[i]!\n tmph = '<td class=\"tsg-grid-data\" col=\"'+ i +'\" style=\"height: 0px;\"></td>'\n if (col.frozen && !col.hidden) {\n rec_html1 += tmph\n } else {\n if (col.hidden || i < grid.last.vscroll.colIndStart || i > grid.last.vscroll.colIndEnd) continue\n rec_html2 += tmph\n }\n }\n rec_html1 += '<td class=\"tsg-grid-data-last\" style=\"height: 0px\"></td>'\n rec_html2 += '<td class=\"tsg-grid-data-last\" col=\"end\" style=\"height: 0px\"></td>'\n rec_html1 += '</tr>'\n rec_html2 += '</tr>'\n return [rec_html1, rec_html2]\n }\n // regular record\n const url = grid.url?.get ?? grid.url\n if (summary !== true) {\n if (grid.searchData.length > 0 && !url) {\n if (ind >= grid.last.searchIds.length) return ''\n ind = grid.last.searchIds[ind] ?? ind\n record = grid.records[ind]\n } else {\n if (ind >= grid.records.length) return ''\n record = grid.records[ind]\n }\n } else {\n if (ind >= grid.summary.length) return ''\n record = grid.summary[ind]\n }\n if (!record) return ''\n if (record.recid == null && grid.recid != null) {\n const rid = grid.parseField(record, grid.recid)\n if (rid != null) record.recid = rid\n }\n let isRowSelected = false\n if (sel.indexes.indexOf(ind) != -1) isRowSelected = true\n let rec_style = (record.TsUi ? record.TsUi['style'] : '')\n if (rec_style == null || typeof rec_style != 'string') rec_style = ''\n let rec_class = (record.TsUi ? record.TsUi['class'] : '')\n if (rec_class == null || typeof rec_class != 'string') rec_class = ''\n // render TR\n rec_html1 += '<tr id=\"grid_'+ grid.name +'_frec_'+ record.recid +'\" recid=\"'+ record.recid +'\" line=\"'+ lineNum +'\" index=\"'+ ind +'\" '+\n ' class=\"'+ (lineNum % 2 === 0 ? 'tsg-even' : 'tsg-odd') + ' tsg-record ' + rec_class +\n (isRowSelected && grid.selectType == 'row' ? ' tsg-selected' : '') +\n (record.TsUi && record.TsUi['editable'] === false ? ' tsg-no-edit' : '') +\n (record.TsUi && record.TsUi.expanded === true ? ' tsg-expanded' : '') + '\" ' +\n ' style=\"height: '+ grid.recordHeight +'px; '+ (!isRowSelected && rec_style != '' ? rec_style : rec_style.replace('background-color', 'none')) +'\" '+\n (rec_style != '' ? 'custom_style=\"'+ rec_style +'\"' : '') +\n '>'\n rec_html2 += '<tr id=\"grid_'+ grid.name +'_rec_'+ record.recid +'\" recid=\"'+ record.recid +'\" line=\"'+ lineNum +'\" index=\"'+ ind +'\" '+\n ' class=\"'+ (lineNum % 2 === 0 ? 'tsg-even' : 'tsg-odd') + ' tsg-record ' + rec_class +\n (isRowSelected && grid.selectType == 'row' ? ' tsg-selected' : '') +\n (record.TsUi && record.TsUi['editable'] === false ? ' tsg-no-edit' : '') +\n (record.TsUi && record.TsUi.expanded === true ? ' tsg-expanded' : '') + '\" ' +\n ' style=\"height: '+ grid.recordHeight +'px; '+ (!isRowSelected && rec_style != '' ? rec_style : rec_style.replace('background-color', 'none')) +'\" '+\n (rec_style != '' ? 'custom_style=\"'+ rec_style +'\"' : '') +\n '>'\n if (grid.show.lineNumbers) {\n rec_html1 += '<td id=\"grid_'+ grid.name +'_cell_'+ ind +'_number' + (summary ? '_s' : '') + '\" '+\n ' class=\"tsg-col-number '+ (isRowSelected ? ' tsg-row-selected' : '') +'\"'+\n (grid.reorderRows ? ' style=\"cursor: move\"' : '') + '>'+\n (summary !== true ? grid.getLineHTML(lineNum) : '') +\n '</td>'\n }\n if (grid.show.selectColumn) {\n rec_html1 +=\n '<td id=\"grid_'+ grid.name +'_cell_'+ ind +'_select' + (summary ? '_s' : '') + '\" class=\"tsg-grid-data tsg-col-select\">'+\n (summary !== true && !(record.TsUi && record.TsUi['hideCheckBox'] === true) ?\n ' <div>'+\n ' <input class=\"tsg-grid-select-check\" type=\"checkbox\" tabindex=\"-1\" '+\n (isRowSelected ? 'checked=\"checked\"' : '') + ' style=\"pointer-events: none\"/>'+\n ' </div>'\n :\n '' ) +\n '</td>'\n }\n if (grid.show.expandColumn) {\n let tmp_img = ''\n if (record.TsUi?.expanded === true) tmp_img = '-'; else tmp_img = '+'\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (((record.TsUi?.expanded as any) == 'none' || !Array.isArray(record.TsUi?.children) || !record.TsUi?.children.length)) tmp_img = '+' // any: expanded is bool but runtime uses string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((record.TsUi?.expanded as any) == 'spinner') tmp_img = '<div class=\"tsg-spinner\" style=\"width: 16px; margin: -2px 2px;\"></div>' // any: same\n rec_html1 +=\n '<td id=\"grid_'+ grid.name +'_cell_'+ ind +'_expand' + (summary ? '_s' : '') + '\" class=\"tsg-grid-data tsg-col-expand\">'+\n (summary !== true ? `<div>${tmp_img}</div>` : '' ) +\n '</td>'\n }\n // insert empty first column\n rec_html2 += '<td class=\"tsg-grid-data-spacer\" col=\"start\" style=\"border-right: 0\"></td>'\n if (grid.reorderRows) {\n rec_html2 +=\n '<td id=\"grid_'+ grid.name +'_cell_'+ ind +'_order' + (summary ? '_s' : '') + '\" class=\"tsg-grid-data tsg-col-order\" col=\"order\">'+\n (summary !== true ? '<div title=\"Drag to reorder\">&nbsp;</div>' : '' ) +\n '</td>'\n }\n let col_ind = 0\n let col_skip = 0\n while (true) {\n let col_span = 1\n const col = grid.columns[col_ind]\n if (col == null) break\n if (col.hidden) {\n col_ind++\n if (col_skip > 0) col_skip--\n continue\n }\n if (col_skip > 0) {\n col_ind++\n if (grid.columns[col_ind] == null) break\n record.TsUi!['colspan'][grid.columns[col_ind-1]!.field] = 0 // need it for other methods\n col_skip--\n continue\n } else if (record.TsUi) {\n const tmp1 = record.TsUi['colspan']\n const tmp2 = grid.columns[col_ind]!.field\n if (tmp1 && tmp1[tmp2] === 0) {\n delete tmp1[tmp2] // if no longer colspan then remove 0\n }\n }\n // column virtual scroll\n if ((col_ind < (grid.last.vscroll.colIndStart ?? 0) || col_ind > (grid.last.vscroll.colIndEnd ?? Infinity)) && !col.frozen) {\n col_ind++\n continue\n }\n if (record.TsUi) {\n if (typeof record.TsUi['colspan'] == 'object') {\n const span = parseInt(record.TsUi['colspan'][col.field]) || null\n if (span != null && span > 1) {\n // if there are hidden columns, then no colspan on them\n let hcnt = 0\n for (let i = col_ind; i < col_ind + span; i++) {\n if (i >= grid.columns.length) break\n if (grid.columns[i]!.hidden) hcnt++\n }\n col_span = span - hcnt\n col_skip = span - 1\n }\n }\n }\n const rec_cell = grid.getCellHTML(ind, col_ind, summary, col_span)\n if (col.frozen) rec_html1 += rec_cell; else rec_html2 += rec_cell\n col_ind++\n }\n rec_html1 += '<td class=\"tsg-grid-data-last\"></td>'\n rec_html2 += '<td class=\"tsg-grid-data-last\" col=\"end\"></td>'\n rec_html1 += '</tr>'\n rec_html2 += '</tr>'\n return [rec_html1, rec_html2]\n}\n\nexport function getLineHTML(_grid: TsGrid, lineNum: number): string {\n return '<div>' + lineNum + '</div>'\n}\n\nexport function getCellHTML(grid: TsGrid, ind: number, col_ind: number, summary?: boolean, col_span?: number) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const obj = grid\n const col = grid.columns[col_ind]!\n if (col == null) return ''\n const record = (summary !== true ? grid.records[ind] : grid.summary[ind])\n // value, attr, style, className, divAttr — style/className/title reassigned below; keep let\n // eslint-disable-next-line prefer-const\n let { value, style, className, attr, divAttr, title } = grid.getCellValue(ind, col_ind, summary, true)\n const edit = (ind !== -1 ? grid.getCellEditable(ind, col_ind) : '')\n let divStyle = 'max-height: '+ grid.recordHeight +'px;' + (col.clipboardCopy ? 'margin-right: 20px' : '')\n const isChanged = !summary && record?.TsUi?.['changes'] && record.TsUi['changes'][col.field] != null\n const sel = grid.last.selection\n let isRowSelected = false\n let infoBubble = ''\n if (sel.indexes.indexOf(ind) != -1) isRowSelected = true\n if (col_span == null) {\n if (record?.TsUi?.['colspan'] && record.TsUi['colspan'][col.field]) {\n col_span = record.TsUi['colspan'][col.field]\n } else {\n col_span = 1\n }\n }\n // expand icon\n if (col_ind === grid.hierarchyColumn && Array.isArray(record?.TsUi?.children)) {\n let level = 0\n let subrec = record.TsUi.parent_recid != null ? grid.get(record.TsUi.parent_recid, true) : null\n while (true) {\n if (subrec != null) {\n level++\n const tmp = grid.records[subrec]!.TsUi\n if (tmp != null && tmp.parent_recid != null) {\n subrec = grid.get(tmp.parent_recid, true)\n } else {\n break\n }\n } else {\n break\n }\n }\n if (record.TsUi.parent_recid) {\n for (let i = 0; i < level; i++) {\n infoBubble += '<span class=\"tsg-show-children tsg-icon-empty\"></span>'\n }\n }\n const className = record.TsUi?.children?.length > 0\n ? (record.TsUi.expanded ? 'tsg-icon-collapse' : 'tsg-icon-expand')\n : 'tsg-icon-empty'\n if (record.TsUi?.children?.length > 0) {\n infoBubble += `<span class=\"tsg-show-children ${className}\"></span>`\n }\n }\n // info bubble\n if (col['info'] === true) col['info'] = {}\n if (col['info'] != null) {\n let infoIcon = 'tsg-icon-info'\n if (typeof col['info'].icon == 'function') {\n infoIcon = col['info'].icon(record, { self: grid, index: ind, colIndex: col_ind, summary: !!summary })\n } else if (typeof col['info'].icon == 'object') {\n infoIcon = col['info'].icon[grid.parseField(record, col.field)] || ''\n } else if (typeof col['info'].icon == 'string') {\n infoIcon = col['info'].icon\n }\n let infoStyle = col['info'].style || ''\n if (typeof col['info'].style == 'function') {\n infoStyle = col['info'].style(record, { self: grid, index: ind, colIndex: col_ind, summary: !!summary })\n } else if (typeof col['info'].style == 'object') {\n infoStyle = col['info'].style[grid.parseField(record, col.field)] || ''\n } else if (typeof col['info'].style == 'string') {\n infoStyle = col['info'].style\n }\n infoBubble += `<span class=\"tsg-info ${infoIcon}\" style=\"${infoStyle}\"></span>`\n }\n let data = value\n // if editable checkbox\n if (edit && ['checkbox', 'check'].indexOf(edit.type) != -1) {\n const changeInd = summary ? -(ind + 1) : ind\n divStyle += 'text-align: center;'\n data = `<input tabindex=\"-1\" type=\"checkbox\" class=\"tsg-editable-checkbox\"\n data-changeInd=\"${changeInd}\" data-colInd=\"${col_ind}\" ${data ? 'checked=\"checked\"' : ''}>`\n infoBubble = ''\n }\n // if renderer returned title it will have priority\n data = `<div style=\"${divStyle}\" ${getTitle(data, title)} ${divAttr}>${infoBubble}${String(data)}</div>`\n if (data == null) data = ''\n // --> cell TD\n if (typeof col.render == 'string') {\n const tmp = col.render.replace('|', ':').split(':')\n if (['number', 'int', 'float', 'money', 'currency', 'percent', 'size'].includes(tmp[0]!)) {\n style += 'text-align: right;'\n }\n }\n if (record?.TsUi) {\n if (record.TsUi.styles == null) {\n record.TsUi.styles = record.TsUi['style']\n }\n if (typeof record.TsUi.styles == 'object') {\n if (typeof record.TsUi.styles[col_ind] == 'string') style += record.TsUi.styles[col_ind] + ';'\n if (typeof record.TsUi.styles[col.field] == 'string') style += record.TsUi.styles[col.field] + ';'\n }\n if (typeof record.TsUi['class'] == 'object') {\n if (typeof record.TsUi['class'][col_ind] == 'string') className += record.TsUi['class'][col_ind] + ' '\n if (typeof record.TsUi['class'][col.field] == 'string') className += record.TsUi['class'][col.field] + ' '\n }\n }\n let isCellSelected = false\n if (isRowSelected && sel.columns[ind]?.includes(col_ind)) isCellSelected = true\n // clipboardCopy\n let clipboardIcon\n if (col.clipboardCopy){\n clipboardIcon = '<span class=\"tsg-clipboard-copy tsg-icon-paste\"></span>'\n }\n // data\n data = '<td class=\"tsg-grid-data'+ (isCellSelected ? ' tsg-selected' : '') + ' ' + className +\n (isChanged ? ' tsg-changed' : '') + '\" '+\n ' id=\"grid_'+ grid.name +'_data_'+ ind +'_'+ col_ind +'\" col=\"'+ col_ind +'\" '+\n ' style=\"'+ style + (col.style != null ? col.style : '') +'\" '+\n (col.attr != null ? col.attr : '') + attr +\n ((col_span ?? 0) > 1 ? 'colspan=\"'+ col_span + '\"' : '') +\n '>' + data + (clipboardIcon && TsUtils.stripTags(data) ? clipboardIcon : '') +'</td>'\n // summary top row\n if (ind === -1 && summary === true) {\n data = '<td class=\"tsg-grid-data\" col=\"'+ col_ind +'\" style=\"height: 0px; '+ style + '\" '+\n ((col_span ?? 0) > 1 ? 'colspan=\"'+ col_span + '\"' : '') +\n '></td>'\n }\n return data\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function getTitle(cellData: any, title: any){\n if (title === undefined && obj.show.recordTitles) {\n if (col['title'] != null) {\n if (typeof col['title'] == 'function') {\n title = col['title'].call(obj, record, { self: obj, index: ind, colIndex: col_ind, summary: !!summary })\n }\n if (typeof col['title'] == 'string') title = col['title']\n } else {\n title = TsUtils.stripTags(String(cellData).replace(/\"/g, '\\'\\''))\n }\n }\n return (title != null) ? 'title=\"' + String(title) + '\"' : ''\n }\n}\n\n// any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function clipboardCopy(grid: TsGrid, ind: any, col_ind: any, summary: any) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const rec = (summary ? grid.summary[ind] : grid.records[ind])!\n const col = grid.columns[col_ind]\n let txt = (col ? grid.parseField(rec, col.field) : '')\n if (col && typeof col.clipboardCopy == 'function') {\n txt = col.clipboardCopy(rec, { self: grid, index: ind, colIndex: col_ind, summary: !!summary })\n }\n query(grid.box).find('#grid_' + grid.name + '_focus').text(txt).get(0).select()\n document.execCommand('copy')\n}\n\n// any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function showBubble(grid: TsGrid, ind: any, col_ind: any, summary: any) {\n const info = grid.columns[col_ind]?.['info']\n if (!info) return\n let html = ''\n const rec = grid.records[ind]\n const el = query(grid.box).find(`${summary ? '.tsg-grid-summary' : ''} #grid_${grid.name}_data_${ind}_${col_ind} .tsg-info`)\n if (grid.last.bubbleEl) {\n TsTooltip.hide(grid.name + '-bubble')\n }\n grid.last.bubbleEl = el\n // if no fields defined - show all\n if (info.fields == null) {\n info.fields = []\n for (let i = 0; i < grid.columns.length; i++) {\n const col = grid.columns[i]!\n info.fields.push(col.field + (typeof col.render == 'string' ? ':' + col.render : ''))\n }\n }\n let fields = info.fields\n if (typeof fields == 'function') {\n fields = fields(rec, { self: grid, index: ind, colIndex: col_ind, summary: !!summary }) // custom renderer\n }\n // generate html\n if (typeof info.render == 'function') {\n html = info.render(rec, { self: grid, index: ind, colIndex: col_ind, summary: !!summary })\n\n } else if (Array.isArray(fields)) {\n // display mentioned fields\n html = '<table cellpadding=\"0\" cellspacing=\"0\">'\n for (let i = 0; i < fields.length; i++) {\n const tmp = String(fields[i]).split(':')\n if (tmp[0] == '' || tmp[0] == '-' || tmp[0] == '--' || tmp[0] == '---') {\n html += '<tr><td colspan=2><div style=\"border-top: '+ (tmp[0] == '' ? '0' : '1') +'px solid #C1BEBE; margin: 6px 0px;\"></div></td></tr>'\n continue\n }\n let col = grid.getColumn(tmp[0] ?? '')\n if (col == null) col = { field: tmp[0] ?? '', text: tmp[0] ?? '', caption: tmp[0] } as TsGridColumn // if not found in columns\n let val = (col ? grid.parseField(rec, col.field) : '')\n // if change by inline editing\n if (rec?.TsUi?.['changes']?.[col.field] != null) {\n val = rec.TsUi['changes'][col.field]\n }\n if (tmp.length > 1) {\n if (TsUtils.formatters[tmp[1] ?? '']) {\n const extra = {\n self: grid,\n value: val,\n params: tmp[2] || null,\n field: grid.columns[col_ind]!.field,\n index: ind,\n colIndex: col_ind,\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n val = (TsUtils.formatters[tmp[1]!] as any).call(grid, rec, extra) // any: formatter this-binding mismatch\n } else {\n console.log('ERROR: TsUtils.formatters[\"'+ tmp[1] + '\"] does not exists.')\n }\n }\n if (typeof val == 'object' && val.text != null) val = val.text\n if (info.showEmpty !== true && (val == null || val == '')) continue\n if (info.maxLength != null && typeof val == 'string' && val.length > info.maxLength) val = val.substr(0, info.maxLength) + '...'\n html += '<tr><td>' + col.text + '</td><td>' + ((val === 0 ? '0' : val) || '') + '</td></tr>'\n }\n html += '</table>'\n } else if (TsUtils.isPlainObject(fields)) {\n // display some fields\n html = '<table cellpadding=\"0\" cellspacing=\"0\">'\n for (const caption in fields) {\n const fld = fields[caption]\n if (fld == '' || fld == '-' || fld == '--' || fld == '---') {\n html += '<tr><td colspan=2><div style=\"border-top: '+ (fld == '' ? '0' : '1') +'px solid #C1BEBE; margin: 6px 0px;\"></div></td></tr>'\n continue\n }\n const tmp = String(fld).split(':')\n let col = grid.getColumn(tmp[0] ?? '')\n if (col == null) col = { field: tmp[0] ?? '', text: tmp[0] ?? '', caption: tmp[0] } as TsGridColumn // if not found in columns\n let val = (col ? grid.parseField(rec, col.field) : '')\n // if change by inline editing\n if (rec?.TsUi?.['changes']?.[col.field] != null) {\n val = rec.TsUi['changes'][col.field]\n }\n if (tmp.length > 1) {\n if (TsUtils.formatters[tmp[1] ?? '']) {\n const extra = {\n self: grid,\n value: val,\n params: tmp[2] || null,\n field: grid.columns[col_ind]!.field,\n index: ind,\n colIndex: col_ind,\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n val = (TsUtils.formatters[tmp[1]!] as any).call(grid, rec, extra) // any: formatter this-binding mismatch\n } else {\n console.log('ERROR: TsUtils.formatters[\"'+ tmp[1] + '\"] does not exists.')\n }\n }\n if (typeof fld == 'function') {\n val = fld(rec, { self: grid, index: ind, colIndex: col_ind, summary: !!summary })\n }\n if (val?.text != null) val = val.text\n if (info.showEmpty !== true && (val == null || val == '')) continue\n if (info.maxLength != null && typeof val == 'string' && val.length > info.maxLength) val = val.substr(0, info.maxLength) + '...'\n html += '<tr><td>' + caption + '</td><td>' + ((val === 0 ? '0' : val) || '') + '</td></tr>'\n }\n html += '</table>'\n }\n return TsTooltip.show(TsUtils.extend({\n name: grid.name + '-bubble',\n html,\n anchor: el.get(0),\n position: 'top|bottom',\n class: 'tsg-info-bubble',\n style: '',\n hideOn: ['doc-click']\n }, info.options ?? {}))\n .hide(() => [\n grid.last.bubbleEl = null\n ])\n}\n\n// return null or the editable object if the given cell is editable\n// any: return type any — caller narrows by code path; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getCellEditable(grid: TsGrid, ind: number, col_ind: number): any {\n const col = grid.columns[col_ind]\n const rec = grid.records[ind]!\n if (!rec || !col) return null\n let edit = (rec.TsUi ? rec.TsUi['editable'] : null)\n if (edit === false) return null\n if (edit == null || edit === true) {\n edit = (Object.keys(col['editable'] ?? {}).length > 0 ? col['editable'] : null)\n if (typeof col['editable'] === 'function') {\n const value = grid.getCellValue(ind, col_ind, false)\n // same arguments as col.render()\n edit = col['editable'].call(grid, rec, { self: grid, value, index: ind, colIndex: col_ind })\n }\n }\n return edit\n}\n\n// any: return type any — caller narrows by code path; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getCellValue(grid: TsGrid, ind: number, col_ind: number, summary?: boolean, extra?: boolean): any {\n const col = grid.columns[col_ind]!\n const record = (summary !== true ? grid.records[ind] : grid.summary[ind])\n let value = grid.parseField(record, col.field)\n let className = '', style = '', attr = '', divAttr = ''\n let title\n // if change by inline editing\n if (record?.TsUi?.['changes']?.[col.field] != null) {\n value = record.TsUi['changes'][col.field]\n }\n // if there is a cell renderer\n if (col.render != null && ind !== -1) {\n let render = col.render\n let params\n // predefined formatters\n if (typeof render == 'string') {\n const tmp = render.toLowerCase().replace('|', ':').split(':')\n // formatters\n let func = TsUtils.formatters[tmp[0] ?? '']\n if (col['options'] && col['options'].autoFormat === false) {\n func = undefined\n }\n // any: cast-to-any for return-position narrowing; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n render = func as any\n params = tmp[1]\n }\n if (typeof render == 'function' && record != null) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let html: any // any: render can be TsFormatter or column render, shapes differ\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n html = (render as any).call(grid, record, { // any: unified call for both formatter and column render\n self: grid,\n value, params,\n field: grid.columns[col_ind]!.field,\n index: ind,\n colIndex: col_ind,\n summary: !!summary\n })\n } catch (e) {\n throw new Error(`Render function for column \"${col.field}\" in grid \"${grid.name}\": -- ` + (e as Error).message)\n }\n if (html != null && typeof html == 'object' && typeof html != 'function') {\n if (html.id != null && html.text != null) {\n // normalized menu kind of return\n value = html.text\n } else if (typeof html.html == 'string' || typeof html.html == 'number') {\n value = String(html.html ?? '').trim()\n } else {\n value = ''\n console.log('ERROR: render function should return a primitive or an object of the following structure.',\n { html: '', attr: '', style: '', class: '', divAttr: '' }, '... but it returned:', html)\n }\n attr = html.attr ?? ''\n style = html.style ?? ''\n className = html.class ?? ''\n divAttr = html.divAttr ?? ''\n // pass undefined up\n title = html.title\n } else {\n value = String(html || '').trim()\n }\n }\n // if it is an object\n if (typeof render == 'object') {\n // any: cast-then-index for dynamic property access; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tmp = (render as any)[value]\n if (tmp != null && tmp !== '') {\n value = tmp\n }\n }\n }\n if (value == null) value = ''\n return !extra ? value : { value, attr, style, className, divAttr, title }\n}\n\nexport function getFooterHTML(_grid: TsGrid) {\n return '<div>'+\n ' <div class=\"tsg-footer-left\"></div>'+\n ' <div class=\"tsg-footer-right\"></div>'+\n ' <div class=\"tsg-footer-center\"></div>'+\n '</div>'\n}\n\n// any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function scroll(grid: TsGrid, event?: Event | any) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const obj = grid\n const url = grid.url?.get ?? grid.url\n\n const records = query(grid.box).find(`#grid_${grid.name}_records`)\n const frecords = query(grid.box).find(`#grid_${grid.name}_frecords`)\n // sync scroll positions\n if (event) {\n const sTop = event.target.scrollTop\n const sLeft = event.target.scrollLeft\n grid.last.vscroll.scrollTop = sTop\n grid.last.vscroll.scrollLeft = sLeft\n const cols = query(grid.box).find(`#grid_${grid.name}_columns`)[0]\n const summary = query(grid.box).find(`#grid_${grid.name}_summary`)[0]\n if (cols) cols.scrollLeft = sLeft\n if (summary) summary.scrollLeft = sLeft\n if (frecords[0]) frecords[0].scrollTop = sTop\n }\n // hide bubble\n if (grid.last.bubbleEl) {\n TsTooltip.hide(grid.name + '-bubble')\n grid.last.bubbleEl = null\n }\n // column virtual scroll\n let colStart = null\n let colEnd = null\n if (grid.disableCVS || grid.columnGroups.length > 0) {\n // disable virtual scroll\n colStart = 0\n colEnd = grid.columns.length - 1\n } else {\n const sWidth = records.prop('clientWidth')\n let cLeft = 0\n for (let i = 0; i < grid.columns.length; i++) {\n if (grid.columns[i]!.frozen || grid.columns[i]!.hidden) continue\n const cSize = parseInt(grid.columns[i]!.sizeCalculated ? grid.columns[i]!.sizeCalculated! : String(grid.columns[i]!.size ?? 0))\n if (cLeft + cSize + 30 > grid.last.vscroll.scrollLeft && colStart == null) colStart = i\n if (cLeft + cSize - 30 > grid.last.vscroll.scrollLeft + sWidth && colEnd == null) colEnd = i\n cLeft += cSize\n }\n if (colEnd == null) colEnd = grid.columns.length - 1\n }\n if (colStart != null) {\n if (colStart < 0) colStart = 0\n if (colEnd < 0) colEnd = 0\n if (colStart == colEnd) {\n if (colStart > 0) colStart--; else colEnd++ // show at least one column\n }\n // ---------\n if (colStart != grid.last.vscroll.colIndStart || colEnd != grid.last.vscroll.colIndEnd) {\n const $box = query(grid.box)\n const deltaStart = Math.abs(colStart - grid.last.vscroll.colIndStart)\n const deltaEnd = Math.abs(colEnd - grid.last.vscroll.colIndEnd)\n // add/remove columns for small jumps\n if (deltaStart < 5 && deltaEnd < 5) {\n const $cfirst = $box.find(`.tsg-grid-columns #grid_${grid.name}_column_start`)\n const $clast = $box.find('.tsg-grid-columns .tsg-head-last')\n const $rfirst = $box.find(`#grid_${grid.name}_records .tsg-grid-data-spacer`)\n const $rlast = $box.find(`#grid_${grid.name}_records .tsg-grid-data-last`)\n const $sfirst = $box.find(`#grid_${grid.name}_summary .tsg-grid-data-spacer`)\n const $slast = $box.find(`#grid_${grid.name}_summary .tsg-grid-data-last`)\n // remove on left\n if (colStart > grid.last.vscroll.colIndStart) {\n for (let i = grid.last.vscroll.colIndStart; i < colStart; i++) {\n $box.find('#grid_'+ grid.name +'_columns #grid_'+ grid.name +'_column_'+ i).remove() // column\n $box.find('#grid_'+ grid.name +'_records td[col=\"'+ i +'\"]').remove() // record\n $box.find('#grid_'+ grid.name +'_summary td[col=\"'+ i +'\"]').remove() // summary\n }\n }\n // remove on right\n if (colEnd < grid.last.vscroll.colIndEnd) {\n for (let i = grid.last.vscroll.colIndEnd; i > colEnd; i--) {\n $box.find('#grid_'+ grid.name +'_columns #grid_'+ grid.name +'_column_'+ i).remove() // column\n $box.find('#grid_'+ grid.name +'_records td[col=\"'+ i +'\"]').remove() // record\n $box.find('#grid_'+ grid.name +'_summary td[col=\"'+ i +'\"]').remove() // summary\n }\n }\n // add on left\n if (colStart < grid.last.vscroll.colIndStart) {\n for (let i = (grid.last.vscroll.colIndStart ?? 0) - 1; i >= colStart; i--) {\n if (grid.columns[i] && (grid.columns[i]!.frozen || grid.columns[i]!.hidden)) continue\n $cfirst.after(grid.getColumnCellHTML(i)) // column\n // record\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n $rfirst.each((el: any) => {\n const index = query(el).parent().attr('index')\n let td = '<td class=\"tsg-grid-data\" col=\"'+ i +'\" style=\"height: 0px\"></td>' // width column\n if (index != null) td = grid.getCellHTML(parseInt(index), i, false)\n query(el).after(td)\n })\n // summary\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n $sfirst.each((el: any) => {\n const index = query(el).parent().attr('index')\n let td = '<td class=\"tsg-grid-data\" col=\"'+ i +'\" style=\"height: 0px\"></td>' // width column\n if (index != null) td = grid.getCellHTML(parseInt(index), i, true)\n query(el).after(td)\n })\n }\n }\n // add on right\n if (colEnd > grid.last.vscroll.colIndEnd) {\n for (let i = (grid.last.vscroll.colIndEnd ?? 0) + 1; i <= colEnd; i++) {\n if (grid.columns[i] && (grid.columns[i]!.frozen || grid.columns[i]!.hidden)) continue\n $clast.before(grid.getColumnCellHTML(i)) // column\n // record\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n $rlast.each((el: any) => {\n const index = query(el).parent().attr('index')\n let td = '<td class=\"tsg-grid-data\" col=\"'+ i +'\" style=\"height: 0px\"></td>' // width column\n if (index != null) td = grid.getCellHTML(parseInt(index), i, false)\n query(el).before(td)\n })\n // summary\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n $slast.each((el: any) => {\n const index = query(el).parent().attr('index') || -1\n const td = grid.getCellHTML(parseInt(index), i, true)\n query(el).before(td)\n })\n }\n }\n grid.last.vscroll.colIndStart = colStart\n grid.last.vscroll.colIndEnd = colEnd\n grid.resizeRecords()\n } else {\n grid.last.vscroll.colIndStart = colStart\n grid.last.vscroll.colIndEnd = colEnd\n // dot not just call grid.refresh();\n const colHTML = grid.getColumnsHTML()\n const recHTML = grid.getRecordsHTML()\n const sumHTML = grid.getSummaryHTML()\n const $columns = $box.find(`#grid_${grid.name}_columns`)\n const $records = $box.find(`#grid_${grid.name}_records`)\n const $frecords = $box.find(`#grid_${grid.name}_frecords`)\n const $summary = $box.find(`#grid_${grid.name}_summary`)\n $columns.find('tbody').html(colHTML[1])\n $frecords.html(recHTML[0])\n $records.prepend(recHTML[1])\n if (sumHTML != null) $summary.html(sumHTML[1])\n // need timeout to clean up (otherwise scroll problem)\n setTimeout(() => {\n $records.find(':scope > table').filter(':not(table:first-child)').remove()\n if ($summary[0]) $summary[0].scrollLeft = grid.last.vscroll.scrollLeft\n }, 1)\n grid.resizeRecords()\n }\n }\n }\n // perform virtual scroll\n let buffered = grid.records.length\n if (buffered > grid.total && grid.total !== -1) buffered = grid.total\n if (grid.searchData.length != 0 && !url) buffered = grid.last.searchIds.length\n if (buffered === 0 || records.length === 0 || records.prop('clientHeight') === 0) return\n if (buffered > grid.vs_start) grid.last.vscroll.show_extra = grid.vs_extra; else grid.last.vscroll.show_extra = grid.vs_start\n // update footer\n let t1 = Math.round(records.prop('scrollTop') / grid.recordHeight + 1)\n let t2 = t1 + (Math.round(records.prop('clientHeight') / grid.recordHeight) - 1)\n if (t1 > buffered) t1 = buffered\n if (t2 >= buffered - 1) t2 = buffered\n query(grid.box).find('#grid_'+ grid.name + '_footer .tsg-footer-right').html(\n (grid.show.statusRange\n ? TsUtils.formatNumber(grid.offset + t1) + '-' + TsUtils.formatNumber(grid.offset + t2) +\n (grid.total != -1 ? ' ' + TsUtils.lang('of') + ' <span class=\"tsg-total\">' + TsUtils.formatNumber(grid.total) + '</span>' : '')\n : '') +\n (url && grid.show.statusBuffered ? ' ('+ TsUtils.lang('buffered') + ' <span class=\"tsg-buffered\">'+ TsUtils.formatNumber(buffered) + '</span>' +\n (grid.offset > 0 ? ', skip <span class=\"tsg-skip\">' + TsUtils.formatNumber(grid.offset) : '') + '</span>)' : '')\n )\n // only for local data source, else no extra records loaded\n if (!url && (!grid.fixedBody || (grid.total != -1 && grid.total <= grid.vs_start))) return\n // regular processing\n let start = Math.floor(records.prop('scrollTop') / grid.recordHeight) - grid.last.vscroll.show_extra\n let end = start + Math.floor(records.prop('clientHeight') / grid.recordHeight) + grid.last.vscroll.show_extra * 2 + 1\n // let div = start - grid.last.vscroll.recIndStart;\n if (start < 1) start = 1\n if (end > grid.total && grid.total != -1) end = grid.total\n const tr1 = records.find('#grid_'+ grid.name +'_rec_top')\n const tr2 = records.find('#grid_'+ grid.name +'_rec_bottom')\n const tr1f = frecords.find('#grid_'+ grid.name +'_frec_top')\n const tr2f = frecords.find('#grid_'+ grid.name +'_frec_bottom')\n // if row is expanded\n if (String(tr1.next().prop('id')).indexOf('_expanded_row') != -1) {\n tr1.next().remove()\n tr1f.next().remove()\n }\n if (grid.total > end && String(tr2.prev().prop('id')).indexOf('_expanded_row') != -1) {\n tr2.prev().remove()\n tr2f.prev().remove()\n }\n const first = parseInt(tr1.next().attr('line'))\n const last = parseInt(tr2.prev().attr('line'))\n let tmp, tmp1, tmp2, rec_start, rec_html\n if (first <= start || first == 1 || grid.last.vscroll.pull_refresh) { // scroll down\n if (end <= last + grid.last.vscroll.show_extra - 2 && end != grid.total) return\n grid.last.vscroll.pull_refresh = false\n // remove from top\n while (true) {\n tmp1 = frecords.find('#grid_'+ grid.name +'_frec_top').next()\n tmp2 = records.find('#grid_'+ grid.name +'_rec_top').next()\n if (tmp2.attr('line') == 'bottom') break\n if (parseInt(tmp2.attr('line')) < start) {\n tmp1.remove()\n tmp2.remove()\n } else {\n break\n }\n }\n // add at bottom\n tmp = records.find('#grid_'+ grid.name +'_rec_bottom').prev()\n rec_start = tmp.attr('line')\n if (rec_start == 'top') rec_start = start\n for (let i = parseInt(rec_start) + 1; i <= end; i++) {\n if (!grid.records[i-1]) continue\n tmp2 = grid.records[i-1]!.TsUi\n if (tmp2 && !Array.isArray(tmp2.children)) {\n tmp2.expanded = false\n }\n rec_html = grid.getRecordHTML(i-1, i)\n tr2.before(rec_html[1])\n tr2f.before(rec_html[0])\n }\n markSearch()\n setTimeout(() => { grid.refreshRanges() }, 0)\n } else { // scroll up\n if (start >= first - grid.last.vscroll.show_extra + 2 && start > 1) return\n // remove from bottom\n while (true) {\n tmp1 = frecords.find('#grid_'+ grid.name +'_frec_bottom').prev()\n tmp2 = records.find('#grid_'+ grid.name +'_rec_bottom').prev()\n if (tmp2.attr('line') == 'top') break\n if (parseInt(tmp2.attr('line')) > end) {\n tmp1.remove()\n tmp2.remove()\n } else {\n break\n }\n }\n // add at top\n tmp = records.find('#grid_'+ grid.name +'_rec_top').next()\n rec_start = tmp.attr('line')\n if (rec_start == 'bottom') rec_start = end\n for (let i = parseInt(rec_start) - 1; i >= start; i--) {\n if (!grid.records[i-1]) continue\n tmp2 = grid.records[i-1]!.TsUi\n if (tmp2 && !Array.isArray(tmp2.children)) {\n tmp2.expanded = false\n }\n rec_html = grid.getRecordHTML(i-1, i)\n tr1.after(rec_html[1])\n tr1f.after(rec_html[0])\n }\n markSearch()\n setTimeout(() => { grid.refreshRanges() }, 0)\n }\n // first/last row size\n const h1 = (start - 1) * grid.recordHeight\n let h2 = (buffered - end) * grid.recordHeight\n if (h2 < 0) h2 = 0\n tr1.css('height', h1 + 'px')\n tr1f.css('height', h1 + 'px')\n tr2.css('height', h2 + 'px')\n tr2f.css('height', h2 + 'px')\n grid.last.vscroll.recIndStart = start\n grid.last.vscroll.recIndEnd = end\n // load more if needed\n const s = Math.floor(records.prop('scrollTop') / grid.recordHeight)\n const e = s + Math.floor(records.prop('clientHeight') / grid.recordHeight)\n if (e + 10 > buffered && grid.last.vscroll.pull_more !== true && (buffered < grid.total - grid.offset || (grid.total == -1 && grid.last.fetch.hasMore))) {\n if (grid.autoLoad === true) {\n grid.last.vscroll.pull_more = true\n grid.last.fetch.offset = (grid.last.fetch.offset ?? 0) + grid.limit\n grid.request('load')\n }\n // scroll function\n const more = query(grid.box).find('#grid_'+ grid.name +'_rec_more, #grid_'+ grid.name +'_frec_more')\n more.show()\n .eq(1) // only main table\n .off('.load-more')\n .on('click.load-more', function(this: Element) {\n // show spinner\n query(this).find('td').html('<div><div style=\"width: 20px; height: 20px;\" class=\"tsg-spinner\"></div></div>')\n // load more\n obj.last.vscroll.pull_more = true\n obj.last.fetch.offset = (obj.last.fetch.offset ?? 0) + obj.limit\n obj.request('load')\n })\n .find('td')\n .html(obj.autoLoad\n ? '<div><div style=\"width: 20px; height: 20px;\" class=\"tsg-spinner\"></div></div>'\n : '<div style=\"padding-top: 15px\">'+ TsUtils.lang('Load ${count} more...', { count: obj.limit }) + '</div>'\n )\n }\n\n function markSearch() {\n // mark search\n if (!obj.markSearch) return\n clearTimeout(obj.last.marker_timer ?? undefined)\n obj.last.marker_timer = setTimeout(() => {\n // mark all search strings\n const search = []\n for (let s = 0; s < obj.searchData.length; s++) {\n const sdata = obj.searchData[s]!\n const fld = obj.getSearch(sdata.field)\n if (!fld || fld.hidden) continue\n const ind = obj.getColumn(sdata.field, true)\n search.push({ field: sdata.field, search: sdata['value'], col: ind })\n }\n if (search.length > 0) {\n search.forEach((item) => {\n const el = query(obj.box).find('td[col=\"'+ item.col +'\"]:not(.tsg-head)')\n TsUtils.marker(el, item.search)\n })\n }\n }, 50)\n }\n}\n","/**\n * Part of TsUi 2.0 library\n * - Dependencies: TsUtils, TsBase, TsToolbar, TsTooltip, TsField\n *\n * T5.1: Renamed src/TsGrid.js → src/TsGrid.ts.\n * Skeleton + data CRUD cluster typed per typing_policy.\n * No @ts-nocheck. Targeted `any` sites documented with // any: comments.\n * T5.6 will fix the pre-existing `??` unreachable warning at original line 3061.\n * EXCEPTION: 9,115 LOC initial rename; subsequent T5.2–T5.9 sub-units are\n * incremental edits ≤400 LOC each on the same .ts file.\n *\n * == TODO ==\n * - problem with .set() and arrays, array get extended too, but should be replaced\n * - allow functions in routeData (also add routeData to list/enum)\n * - send parsed URL to the event if there is routeData\n * - add selectType: 'none' so that no selection can be make but with mouse\n * - focus/blur for selectType = cell not display grayed out selection\n * - allow enum in inline edit (see https://github.com/vitmalina/TsUi/issues/911#issuecomment-107341193)\n * - remote source, but localSort/localSearch\n * - promise for request, load, save, etc.\n * - onloadmore event (so it will be easy to implement remote data source with local sort)\n * - status() - clears on next select, etc. Should not if it is off\n *\n * == DEMOS To create ==\n * - batch for disabled buttons\n * - natural sort\n *\n * == 2.0 changes\n * - toolbarInput - deprecated, toolbarSearch stays\n * - searchSuggest\n * - searchSave, searchSelected, savedSearches, defaultSearches, useLocalStorage, searchFieldTooltip\n * - cache, cacheSave\n * - onSearchSave, onSearchRemove, onSearchSelect\n * - show.searchLogic\n * - show.searchSave\n * - refreshSearch\n * - initAllFields -> searchInitInput\n * - textSearch - deprecated in favor of defaultOperator\n * - grid.confirm - refactored\n * - grid.message - refactored\n * - search.type == 'text' can have 'in' and 'not in' operators, then it will switch to enum\n * - grid.find(..., displayedOnly)\n * - column.render(..., this) - added\n * - observeResize for the box\n * - remove edit.type == 'select'\n * - editDone(...)\n * - liveSearch\n * - deprecated onUnselect event\n * - requestComplete(data, action, callBack, resolve, reject) - new argument list\n * - msgAJAXError -> msgHTTPError\n * - aded msgServerError\n * - added mouseEnter/mouseLeave\n * - grid.show.columnReorder -> grid.reorderRows\n * - updagte docs search.label (not search.text)\n * - added columnAutoSize - which resizes column based on text in it\n * - added grid.replace()\n * - grid.compareSelection\n * - this.showContextMenu(event, { recid, column, index }) - arguments changed\n * - this.parseField\n * - added rec.TsUi.selectable\n * - added rec.TsUi.styles\n * - added grid.groupBy = {} and grid.last.groupBy_links = {}\n */\n\nimport { TsBase, TsEventPayload } from './tsbase.js'\nimport { TsUi, TsUtils } from './tsutils.js'\nimport { query as _queryRaw } from './query.js'\nimport type { RecId } from './types.js'\nimport * as gridColumns from './grid-columns.js'\nimport * as gridState from './grid-state.js'\nimport * as gridData from './grid-data.js'\nimport * as gridSelection from './grid-selection.js'\nimport * as gridEdit from './grid-edit.js'\nimport * as gridSearch from './grid-search.js'\nimport * as gridInteraction from './grid-interaction.js'\nimport * as gridRender from './grid-render.js'\n\n// any: query() always returns Query at runtime; cast to any for clean duck-typing throughout TsGrid\n// (grid makes extensive use of .get(0) as HTMLElement and Node.style patterns)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst query = _queryRaw as (...args: any[]) => any // any: Query wrapper used as jQuery-like in TsGrid\n// ---------------------------------------------------------------------------\n// Type definitions — T5.1 (skeleton + CRUD); T5.2 (column + search cluster)\n// T5.4 (selection + ranges)\n// Additional interfaces added in T5.3–T5.9 as clusters are typed\n// ---------------------------------------------------------------------------\n\n/** A single data record stored in the grid */\nexport interface TsGridRecord {\n recid: string | number\n TsUi?: {\n summary?: boolean\n children?: TsGridRecord[]\n parent_recid?: string | number\n expanded?: boolean\n selectable?: boolean\n styles?: Record<string, string>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: dynamic per-record TsUi metadata\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: user-defined field values\n}\n\n/** Sort descriptor used in grid.sortData */\nexport interface TsGridSortData {\n field: string\n direction: 'asc' | 'desc'\n field_?: string // any: runtime-computed cached field name for date/time render types (localSort internal)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: runtime-assigned sort state properties\n}\n\n/** Virtual scroll state kept in grid.last.vscroll */\ninterface TsGridVScroll {\n scrollTop: number\n scrollLeft: number\n recIndStart: number | null\n recIndEnd: number | null\n colIndStart: number\n colIndEnd: number\n pull_more: boolean\n pull_refresh: boolean\n show_extra: number\n}\n\n/** Fetch state kept in grid.last.fetch */\ninterface TsGridFetch {\n action: string\n offset?: number | null\n start: number\n response: number\n options: RequestInit | null\n controller: AbortController | null\n loaded: boolean\n hasMore: boolean\n}\n\n/** Column definition — T5.2 */\nexport interface TsGridColumn {\n field: string\n text: string | ((col: TsGridColumn) => string)\n size?: string | number // CSS size e.g. '100px' or '20%'\n min?: number // minimum pixel width (for resize)\n max?: number // maximum pixel width (for resize)\n frozen?: boolean // if true column is frozen (left-pinned)\n hidden?: boolean // if true column is hidden\n hideable?: boolean // if false user cannot hide/show via menu\n resizable?: boolean // if false resize handle is omitted\n sortable?: boolean // if false column header is not clickable for sort\n searchable?: boolean | string // if true/string auto-adds a search field\n sortMode?: string // 'default' | 'natural' | 'i18n' | function\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editable?: boolean | { type: string; [key: string]: any } | ((rec: TsGridRecord, cell: any) => any)\n render?: string | ((record: TsGridRecord, index: number, colIndex: number) => string)\n tooltip?: string // tooltip shown on column header hover\n style?: string // inline CSS for cells in this column\n attr?: string // HTML attributes for <td> elements\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n clipboardCopy?: boolean | ((record: TsGridRecord, cell: any) => string) // if true/function show clipboard copy icon in cells\n colspan?: Record<string, number> | ((record: TsGridRecord, index: number) => number)\n sizeCalculated?: string // runtime-computed pixel width string (e.g. '120px')\n sizeOriginal?: string | number // original size before resize operations\n sizeType?: string // 'px' or '%'\n gridMinWidth?: number // minimum grid width for this column to be visible\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: custom per-column metadata\n}\n\n/** Search field definition — T5.2 */\nexport interface TsGridSearch {\n field: string\n label?: string\n caption?: string // deprecated alias for label\n type: string // 'text' | 'int' | 'float' | 'date' | 'list' | 'enum' | 'new-column' | ...\n hidden?: boolean\n attr?: string // HTML attributes for the search input\n text?: string // extra text/HTML rendered in the search row\n style?: string // CSS style for the search cell\n operator?: string // default operator key for this search\n operators?: string[] // override available operators for this search\n // any: Record<string, any> — dynamic property bag; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Record<string, any> // extra options passed to TsField (list items, etc.)\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value?: any // current value of the search field (runtime)\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n svalue?: any // display value for enum/list searches (runtime)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: custom per-search metadata\n}\n\n/** Internal last-state object */\ninterface TsGridLast {\n field: string\n label: string\n logic: 'AND' | 'OR'\n search: string\n searchIds: number[]\n selection: TsGridSelection\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n saved_sel: any | null // any: complex selection restore payload\n multi: boolean\n fetch: TsGridFetch\n vscroll: TsGridVScroll\n sel_ind: number | null\n sel_col: number | null\n sel_type: string | null\n sel_recid: string | number | null\n idCache: Record<string | number, number>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n move: any | null // any: drag/move state object shape varies\n cancelClick: boolean | null\n inEditMode: boolean\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _edit: { value: any; index: number; column: number; recid: string | number; [key: string]: any } | null\n kbd_timer: ReturnType<typeof setTimeout> | null\n marker_timer: ReturnType<typeof setTimeout> | null\n click_time: number | null\n click_recid: string | number | null\n bubbleEl: HTMLElement | null\n colResizing: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tmp: any | null // any: column resize temp state\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n copy_event: any | null // any: copy() returns a TsEvent with .detail.text, not a ClipboardEvent\n userSelect: string\n columnDrag: false | { remove(): void }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n state: any | null // any: serialized grid state blob\n toolbar_height: number\n groupBy_links: Record<string, TsGridRecord>\n originalSort?: (string | number)[] // any: saved original record order for sort restore\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: runtime-assigned transient last-state properties\n}\n\n/** Cell-level selection descriptor returned by `getSelectionCells()` (and by `getSelection()` when `selectType === 'cell'`). */\nexport interface TsGridCellSelection {\n recid: string | number\n index: number\n column: number\n}\n\n/** Selection state — T5.4 */\nexport interface TsGridSelection {\n indexes: number[]\n columns: Record<string | number, number[]>\n}\n\n/** Range endpoint (used in addRange / refreshRanges) */\nexport interface TsGridRangeEndpoint {\n recid: string | number\n column: number\n index?: number // runtime index (added by refreshRanges)\n}\n\n/** Range descriptor for addRange / refreshRanges */\nexport interface TsGridRange {\n name: string\n range: TsGridRangeEndpoint[] // [start, end] — 2-element in practice\n style?: string\n class?: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: custom range metadata\n}\n\n/** Active search filter — one entry in grid.searchData — T5.5 */\ninterface TsGridSearchFilter {\n field: string\n type: string\n operator: string\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value?: any\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n svalue?: any // display values for enum/list searches\n text?: string // display text for list/enum\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: dynamic search filter props\n}\n\n/** GroupBy configuration object */\nexport interface TsGridGroupBy {\n field: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: user can attach extra groupBy metadata\n}\n\nclass TsGrid extends TsBase {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any // any: dynamic properties added via TsUtils.extend and event handlers\n\n declare name: string\n declare box: HTMLElement | null\n columns: TsGridColumn[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n columnGroups: any[] // any: column group shapes — span/text/main/style; minimal typing for T5.2\n records: TsGridRecord[]\n summary: TsGridRecord[]\n searches: TsGridSearch[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toolbar: any // any: TsToolbar instance or config object\n ranges: TsGridRange[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n contextMenu: any[] // any: context menu item shapes\n searchMap: Record<string, string>\n searchData: TsGridSearchFilter[]\n sortMap: Record<string, string>\n sortData: TsGridSortData[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n savedSearches: any[] // any: saved search objects\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n defaultSearches: any[] // any: default search objects\n groupBy: TsGridGroupBy | null\n total: number\n recid: string | null\n hierarchyColumn: number\n last: TsGridLast\n header: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n url: any // any: url can be string or {get,save,remove,...} object; duck-typed with ?.get ?? url pattern\n limit: number\n offset: number\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n postData: Record<string, any> // any: user-supplied post data\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n routeData: Record<string, any> // any: route params\n httpHeaders: Record<string, string>\n show: {\n header: boolean; toolbar: boolean; footer: boolean; columnMenu: boolean\n columnHeaders: boolean; lineNumbers: boolean; expandColumn: boolean\n selectColumn: boolean; emptyRecords: boolean; toolbarReload: boolean\n toolbarColumns: boolean; toolbarSearch: boolean; toolbarAdd: boolean\n toolbarEdit: boolean; toolbarDelete: boolean; toolbarSave: boolean\n searchAll: boolean; searchLogic: boolean; searchHiddenMsg: boolean\n searchSave: boolean; statusRange: boolean; statusBuffered: boolean\n statusRecordID: boolean; statusSelection: boolean; statusResponse: boolean\n statusSort: boolean; statusSearch: boolean; recordTitles: boolean\n selectionBorder: boolean; selectionResizer: boolean; skipRecords: boolean\n saveRestoreState: boolean; columns?: boolean\n }\n stateId: string | null\n hasFocus: boolean\n autoLoad: boolean\n fixedBody: boolean\n recordHeight: number\n lineNumberWidth: number\n keyboard: boolean\n selectType: 'row' | 'cell'\n liveSearch: boolean\n multiSearch: boolean\n multiSelect: boolean\n multiSort: boolean\n reorderColumns: boolean\n reorderRows: boolean\n showExtraOnSearch: number\n markSearch: boolean\n columnTooltip: string\n disableCVS: boolean\n nestedFields: boolean\n vs_start: number\n vs_extra: number\n style: string\n tabIndex: number | null\n dataType: string | null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parser: ((data: any) => any) | null // any: parser transforms arbitrary server response\n advanceOnEdit: boolean\n useLocalStorage: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n colTemplate: Record<string, any> // any: column template default values\n stateColProps: Record<string, boolean>\n msgDelete: string\n msgNotJSON: string\n msgHTTPError: string\n msgServerError: string\n msgRefresh: string\n msgNeedReload: string\n msgEmpty: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n buttons: Record<string, any> // any: toolbar button definitions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n operators: Record<string, any[]> // any: operator list items vary by type\n defaultOperator: Record<string, string>\n operatorsMap: Record<string, string>\n // event handlers\n onAdd: ((event: TsEventPayload) => void) | null\n onEdit: ((event: TsEventPayload) => void) | null\n onRequest: ((event: TsEventPayload) => void) | null\n onLoad: ((event: TsEventPayload) => void) | null\n onDelete: ((event: TsEventPayload) => void) | null\n onSave: ((event: TsEventPayload) => void) | null\n onSelect: ((event: TsEventPayload) => void) | null\n onClick: ((event: TsEventPayload) => void) | null\n onDblClick: ((event: TsEventPayload) => void) | null\n onContextMenu: ((event: TsEventPayload) => void) | null\n onContextMenuClick: ((event: TsEventPayload) => void) | null\n onColumnClick: ((event: TsEventPayload) => void) | null\n onColumnDblClick: ((event: TsEventPayload) => void) | null\n onColumnContextMenu: ((event: TsEventPayload) => void) | null\n onColumnResize: ((event: TsEventPayload) => void) | null\n onColumnAutoResize: ((event: TsEventPayload) => void) | null\n onSort: ((event: TsEventPayload) => void) | null\n onSearch: ((event: TsEventPayload) => void) | null\n onSearchOpen: ((event: TsEventPayload) => void) | null\n onSearchClose: ((event: TsEventPayload) => void) | null\n onChange: ((event: TsEventPayload) => void) | null\n onRestore: ((event: TsEventPayload) => void) | null\n onExpand: ((event: TsEventPayload) => void) | null\n onCollapse: ((event: TsEventPayload) => void) | null\n onError: ((event: TsEventPayload) => void) | null\n onKeydown: ((event: TsEventPayload) => void) | null\n onToolbar: ((event: TsEventPayload) => void) | null\n onColumnOnOff: ((event: TsEventPayload) => void) | null\n onCopy: ((event: TsEventPayload) => void) | null\n onPaste: ((event: TsEventPayload) => void) | null\n onSelectionExtend: ((event: TsEventPayload) => void) | null\n onEditField: ((event: TsEventPayload) => void) | null\n onRender: ((event: TsEventPayload) => void) | null\n onRefresh: ((event: TsEventPayload) => void) | null\n onReload: ((event: TsEventPayload) => void) | null\n onResize: ((event: TsEventPayload) => void) | null\n onDestroy: ((event: TsEventPayload) => void) | null\n onStateSave: ((event: TsEventPayload) => void) | null\n onStateRestore: ((event: TsEventPayload) => void) | null\n onFocus: ((event: TsEventPayload) => void) | null\n onBlur: ((event: TsEventPayload) => void) | null\n onReorderRow: ((event: TsEventPayload) => void) | null\n onSearchSave: ((event: TsEventPayload) => void) | null\n onSearchRemove: ((event: TsEventPayload) => void) | null\n onSearchSelect: ((event: TsEventPayload) => void) | null\n onColumnSelect: ((event: TsEventPayload) => void) | null\n onColumnDragStart: ((event: TsEventPayload) => void) | null\n onColumnDragEnd: ((event: TsEventPayload) => void) | null\n onResizerDblClick: ((event: TsEventPayload) => void) | null\n onMouseEnter: ((event: TsEventPayload) => void) | null\n onMouseLeave: ((event: TsEventPayload) => void) | null\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(options: Record<string, any>) { // any: options bag is user-supplied\n super(options['name'])\n this.name = ''\n this.box = null // HTML element that hold this element\n this.columns = [] // { field, text, size, attr, render, hidden, gridMinWidth, editable }\n this.columnGroups = [] // { span: int, text: 'string', main: true/false, style: 'string' }\n this.records = [] // { recid: int(required), field1: 'value1', ... fieldN: 'valueN', style: 'string', changes: object }\n this.summary = [] // array of summary records, same structure as records array\n this.searches = [] // { type, label, field, attr, text, hidden }\n this.toolbar = {} // if not empty object; then it is toolbar object\n this.ranges = []\n this.contextMenu = []\n this.searchMap = {} // re-map search fields\n this.searchData = []\n this.sortMap = {} // re-map sort fields\n this.sortData = []\n this.savedSearches = []\n this.defaultSearches = []\n this.groupBy = null // defines how to group records\n this.total = 0 // server total\n this.recid = null // field from records to be used as recid\n this.hierarchyColumn = 0 // index of the hierarchy column\n\n // internal\n this.last = {\n field : '', // last search field, e.g. 'all'\n label : '', // last search field label, e.g. 'All Fields'\n logic : 'AND', // last search logic, e.g. 'AND' or 'OR'\n search : '', // last search text\n searchIds : [], // last search IDs\n selection : { // last selection details\n indexes : [],\n columns : {}\n },\n saved_sel : null, // last result of selectionSave()\n multi : false, // last multi flag, true when searching for multiple fields\n fetch: {\n action : '', // last fetch command, e.g. 'load'\n offset : null, // last fetch offset, integer\n start : 0, // timestamp of start of last fetch request\n response : 0, // time it took to complete the last fetch request in seconds\n options : null,\n controller: null,\n loaded : false, // data is loaded from the server\n hasMore : false // flag to indicate if there are more items to pull from the server\n },\n vscroll: {\n scrollTop : 0, // last scrollTop position\n scrollLeft : 0, // last scrollLeft position\n recIndStart : null, // record index for first record in DOM\n recIndEnd : null, // record index for last record in DOM\n colIndStart : 0, // for column virtual scrolling\n colIndEnd : 0, // for column virtual scrolling\n pull_more : false,\n pull_refresh : true,\n show_extra : 0, // last show extra for virtual scrolling\n },\n sel_ind : null, // last selected cell index\n sel_col : null, // last selected column\n sel_type : null, // last selection type, e.g. 'click' or 'key'\n sel_recid : null, // last selected record id\n idCache : {}, // object, id cache for get()\n move : null, // object, move details\n cancelClick : null, // boolean flag to indicate if the click event should be ignored, set during mouseMove()\n inEditMode : false, // flag to indicate if we're currently in edit mode during inline editing\n _edit : null, // object with details on the last edited cell, { value, index, column, recid }\n kbd_timer : null, // last id of blur() timer\n marker_timer : null, // last id of markSearch() timer\n click_time : null, // timestamp of last click\n click_recid : null, // last clicked record id\n bubbleEl : null, // last bubble element\n colResizing : false, // flag to indicate that a column is currently being resized\n tmp : null, // object with last column resizing details\n copy_event : null, // last copy event\n userSelect : '', // last user select type, e.g. 'text'\n columnDrag : false, // false or an object with a remove() method\n state : null, // last grid state\n toolbar_height: 0, // height of grid's toolbar\n groupBy_links : {}, // map of group links used in conjuntction with groupBy\n }\n this.header = ''\n this.url = ''\n this.limit = 100\n this.offset = 0 // how many records to skip (for infinite scroll) when pulling from server\n this.postData = {}\n this.routeData = {}\n this.httpHeaders = {}\n this.show = {\n header : false,\n toolbar : false,\n footer : false,\n columnMenu : true,\n columnHeaders : true,\n lineNumbers : false,\n expandColumn : false,\n selectColumn : false,\n emptyRecords : true,\n toolbarReload : true,\n toolbarColumns : false,\n toolbarSearch : true,\n toolbarAdd : false,\n toolbarEdit : false,\n toolbarDelete : false,\n toolbarSave : false,\n searchAll : true,\n searchLogic : true,\n searchHiddenMsg : false,\n searchSave : true,\n statusRange : true,\n statusBuffered : false,\n statusRecordID : true,\n statusSelection : true,\n statusResponse : true,\n statusSort : false,\n statusSearch : false,\n recordTitles : false,\n selectionBorder : true,\n selectionResizer: true,\n skipRecords : true,\n saveRestoreState: true\n }\n this.stateId = null // Custom state name for stateSave, stateRestore and stateReset\n this.hasFocus = false\n this.autoLoad = true // for infinite scroll\n this.fixedBody = true // if false; then grid grows with data\n this.recordHeight = (TsUtils.settings?.['recordHeight'] as number) ?? 32\n this.lineNumberWidth = 34\n this.keyboard = true\n this.selectType = 'row' // can be row|cell\n this.liveSearch = false // if true, it will auto search if typed in search_all\n this.multiSearch = true\n this.multiSelect = true\n this.multiSort = true\n this.reorderColumns = false\n this.reorderRows = false\n this.showExtraOnSearch = 0 // show extra records before and after on search\n this.markSearch = true\n this.columnTooltip = 'top|bottom' // can be top, bottom, left, right\n this.disableCVS = false // disable Column Virtual Scroll\n this.nestedFields = true // use field name containing dots as separator to look into object\n this.vs_start = 150\n this.vs_extra = 5\n this.style = ''\n this.tabIndex = null\n this.dataType = null // if defined, then overwrites TsUtils.settings.dataType\n this.parser = null\n this.advanceOnEdit = true // automatically begin editing the next cell after submitting an inline edit?\n this.useLocalStorage = true\n\n // default values for the column\n this.colTemplate = {\n text : '', // column text (can be a function)\n field : '', // field name to map the column to a record\n size : null, // size of column in px or %\n min : 20, // minimum width of column in px\n max : null, // maximum width of column in px\n gridMinWidth : null, // minimum width of the grid when column is visible\n sizeCorrected : null, // read only, corrected size (see explanation below)\n sizeCalculated : null, // read only, size in px (see explanation below)\n sizeOriginal : null, // size as defined\n sizeType : null, // px or %\n hidden : false, // indicates if column is hidden\n sortable : false, // indicates if column is sortable\n sortMode : null, // sort mode ('default'|'natural'|'i18n') or custom compare function\n searchable : false, // bool/string: int,float,date,... or an object to create search field\n resizable : true, // indicates if column is resizable\n hideable : true, // indicates if column can be hidden\n autoResize : null, // indicates if column can be auto-resized by double clicking on the resizer\n attr : '', // string that will be inside the <td ... attr> tag\n style : '', // additional style for the td tag\n render : null, // string or render function\n title : null, // string or function for the title property for the column cells\n tooltip : null, // string for the title property for the column header\n editable : {}, // editable object (see explanation below)\n frozen : false, // indicates if the column is fixed to the left\n info : null, // info bubble, can be bool/object\n clipboardCopy : false, // if true (or string or function), it will display clipboard copy icon\n }\n\n // these column properties will be saved in stateSave()\n this.stateColProps = {\n text : false,\n field : true,\n size : true,\n min : false,\n max : false,\n gridMinWidth : false,\n sizeCorrected : false,\n sizeCalculated : true,\n sizeOriginal : true,\n sizeType : true,\n hidden : true,\n sortable : false,\n sortMode : true,\n searchable : false,\n resizable : false,\n hideable : false,\n autoResize : false,\n attr : false,\n style : false,\n render : false,\n title : false,\n tooltip : false,\n editable : false,\n frozen : true,\n info : false,\n clipboardCopy : false\n }\n\n this.msgDelete = 'Are you sure you want to delete ${count} ${records}?'\n this.msgNotJSON = 'Returned data is not in valid JSON format.'\n this.msgHTTPError = 'HTTP error. See console for more details.'\n this.msgServerError= 'Server error'\n this.msgRefresh = 'Refreshing...'\n this.msgNeedReload = 'Your remote data source record count has changed, reloading from the first record.'\n this.msgEmpty = '' // if not blank, then it is message when server returns no records\n\n this.buttons = {\n 'reload' : { type: 'button', id: 'tsg-reload', icon: 'tsg-icon-reload', tooltip: TsUtils.lang('Reload data in the list') },\n 'columns' : { type: 'menu-check', id: 'tsg-column-on-off', icon: 'tsg-icon-columns', tooltip: TsUtils.lang('Show/hide columns'),\n overlay: { align: 'none' }\n },\n 'search' : { type: 'html', id: 'tsg-search',\n html: '<div class=\"tsg-icon tsg-icon-search tsg-search-down tsg-action\" data-click=\"searchShowFields\"></div>'\n },\n 'add' : { type: 'button', id: 'tsg-add', text: 'Add New', tooltip: TsUtils.lang('Add new record'), icon: 'tsg-icon-plus' },\n 'edit' : { type: 'button', id: 'tsg-edit', text: 'Edit', tooltip: TsUtils.lang('Edit selected record'), icon: 'tsg-icon-pencil', batch: 1, disabled: true },\n 'delete' : { type: 'button', id: 'tsg-delete', text: 'Delete', tooltip: TsUtils.lang('Delete selected records'), icon: 'tsg-icon-cross', batch: true, disabled: true },\n 'save' : { type: 'button', id: 'tsg-save', text: 'Save', tooltip: TsUtils.lang('Save changed records'), icon: 'tsg-icon-check' }\n }\n\n this.operators = { // for search fields\n 'text': ['is', 'begins', 'contains', 'ends', 'is not'], // could have \"in\" and \"not in\"\n 'number': ['=', 'between', '>', '<', '>=', '<=', '!='],\n 'date' : ['is', { oper: 'less', text: 'before'}, { oper: 'more', text: 'since' }, 'between'],\n 'list' : ['is'],\n 'hex' : ['is', 'between'],\n 'color' : ['is', 'begins', 'contains', 'ends'],\n 'enum' : ['in', 'not in']\n // -- all possible\n // \"text\" : ['is', 'begins', 'contains', 'ends'],\n // \"number\" : ['is', 'between', 'less', 'more', 'null', 'not null'],\n // \"list\" : ['is', 'null', 'not null'],\n // \"enum\" : ['in', 'not in', 'null', 'not null']\n }\n this.defaultOperator = {\n 'text' : 'begins',\n 'number' : '=',\n 'date' : 'is',\n 'list' : 'is',\n 'enum' : 'in',\n 'hex' : 'begins',\n 'color' : 'begins'\n }\n\n // map search field type to operator\n this.operatorsMap = {\n 'text' : 'text',\n 'int' : 'number',\n 'float' : 'number',\n 'money' : 'number',\n 'currency' : 'number',\n 'percent' : 'number',\n 'hex' : 'hex',\n 'alphanumeric' : 'text',\n 'color' : 'color',\n 'date' : 'date',\n 'time' : 'date',\n 'datetime' : 'date',\n 'list' : 'list',\n 'combo' : 'text',\n 'enum' : 'enum',\n 'file' : 'enum',\n 'select' : 'list',\n 'radio' : 'list',\n 'checkbox' : 'list',\n 'toggle' : 'list'\n }\n\n // events\n this.onAdd = null\n this.onEdit = null\n this.onRequest = null // called on any server event\n this.onLoad = null\n this.onDelete = null\n this.onSave = null\n this.onSelect = null\n this.onClick = null\n this.onDblClick = null\n this.onContextMenu = null\n this.onContextMenuClick = null // when context menu item selected\n this.onColumnClick = null\n this.onColumnDblClick = null\n this.onColumnContextMenu = null\n this.onColumnResize = null\n this.onColumnAutoResize = null\n this.onSort = null\n this.onSearch = null\n this.onSearchOpen = null\n this.onSearchClose = null\n this.onChange = null // called when editable record is changed\n this.onRestore = null // called when editable record is restored\n this.onExpand = null\n this.onCollapse = null\n this.onError = null\n this.onKeydown = null\n this.onToolbar = null // all events from toolbar\n this.onColumnOnOff = null\n this.onCopy = null\n this.onPaste = null\n this.onSelectionExtend = null\n this.onEditField = null\n this.onRender = null\n this.onRefresh = null\n this.onReload = null\n this.onResize = null\n this.onDestroy = null\n this.onStateSave = null\n this.onStateRestore = null\n this.onFocus = null\n this.onBlur = null\n this.onReorderRow = null\n this.onSearchSave = null\n this.onSearchRemove = null\n this.onSearchSelect = null\n this.onColumnSelect = null\n this.onColumnDragStart = null\n this.onColumnDragEnd = null\n this.onResizerDblClick = null\n this.onMouseEnter = null // mouse enter over record event\n this.onMouseLeave = null\n\n // need deep merge, should be extend, not objectAssign\n TsUtils.extend(this, options)\n\n // check if there are records without recid\n if (Array.isArray(this.records)) {\n // any: array of heterogeneous runtime values; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const remove: any[] = [] // remove from records as they are summary\n this.records.forEach((rec, ind) => {\n if (this.recid != null && rec[this.recid] != null) {\n rec.recid = rec[this.recid!]\n }\n if (rec.recid == null) {\n console.log('ERROR: Cannot add records without recid. (obj: '+ this.name +')')\n }\n if (rec.TsUi?.summary === true) {\n this.summary.push(rec)\n remove.push(ind) // cannot remove here as it will mess up array walk thru\n }\n })\n remove.sort()\n for (let t = remove.length-1; t >= 0; t--) {\n this.records.splice(remove[t], 1)\n }\n this.processGroupBy()\n }\n // add searches\n if (Array.isArray(this.columns)) {\n this.columns.forEach((col, ind) => {\n col = TsUtils.extend({}, this.colTemplate, col)\n this.columns[ind] = col\n const search = col.searchable\n if (search == null || search === false || this.getSearch(col.field) != null) return\n if (TsUtils.isPlainObject(search)) {\n this.addSearch(TsUtils.extend({ field: col.field, label: col.text, type: 'text' }, search))\n } else {\n let stype = col.searchable\n let attr = ''\n if (col.searchable === true) {\n stype = 'text'\n attr = 'size=\"20\"'\n }\n this.addSearch({ field: col.field, label: col.text, type: stype, attr: attr })\n }\n })\n }\n // add icon to default searches if not defined\n if (Array.isArray(this.defaultSearches)) {\n this.defaultSearches.forEach((search, ind) => {\n search.id = 'default-'+ ind\n search.icon ??= 'tsg-icon-search'\n })\n }\n // check if there are saved searches in localStorage\n const data = this.cache('searches')\n if (Array.isArray(data)) {\n data.forEach(search => {\n this.savedSearches.push({\n id: search.id ?? 'none',\n text: search.text ?? 'none',\n icon: 'tsg-icon-search',\n remove: true,\n logic: search.logic ?? 'AND',\n data: search.data ?? []\n })\n })\n }\n // init toolbar\n this.initToolbar()\n // render if box specified\n if (typeof this.box == 'string') this.box = query(this.box).get(0)\n if (this.box) this.render(this.box)\n }\n\n add(record: TsGridRecord | TsGridRecord[], first?: boolean): number {\n return gridData.add(this, record, first)\n }\n\n // any: Record<string, any> — dynamic property bag; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n find(obj?: Record<string, any>, returnIndex?: boolean, displayedOnly?: boolean): (string | number)[] {\n return gridData.find(this, obj, returnIndex, displayedOnly)\n }\n\n // does not delete existing, but overrides on top of it\n // Overload: set(recid, record, noRefresh?) or set(record, noRefresh?) — shifts args when recid is object\n // any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n set(recid: any, record?: any, noRefresh?: boolean): boolean {\n return gridData.set(this, recid, record, noRefresh)\n }\n\n // replaces existing record\n replace(recid: string | number, record: TsGridRecord, noRefresh?: boolean): boolean {\n return gridData.replace(this, recid, record, noRefresh)\n }\n\n get(recid: (string | number)[], returnIndex?: boolean): (TsGridRecord | number)[]\n get(recid: string | number, returnIndex: true): number | null\n get(recid: string | number, returnIndex?: false): TsGridRecord | null\n get(recid: string | number | (string | number)[], returnIndex?: boolean): TsGridRecord | (TsGridRecord | number)[] | number | null {\n // any: forwarding overloaded args to delegator — overload resolution happens at the public surface\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridData.get as any)(this, recid, returnIndex)\n }\n\n getFirst(offset?: number): TsGridRecord | null {\n if (this.records.length == 0) return null\n let rec: TsGridRecord | null = this.records[0] ?? null\n const tmp = this.last.searchIds\n if (this.searchData.length > 0) {\n if (Array.isArray(tmp) && tmp.length > 0) {\n rec = this.records[tmp[offset || 0]!] ?? null\n } else {\n rec = null\n }\n }\n return rec\n }\n\n remove(...recids: (string | number)[]): number {\n return gridData.remove(this, ...recids)\n }\n\n /**\n * If there is a this.groupBy, then process all records with that in mind. It will remember groups in this.last.groupBy_links, that\n * needs to be cleared when record is cleared\n */\n processGroupBy(): void {\n return gridData.processGroupBy(this)\n }\n\n /** Add one or more columns. If `columns` is omitted, `before` is treated as the column(s) to append. */\n // any: `before` is reassigned inside the body (number | string → number); TS can't narrow post-assignment\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n addColumn(before: any, columns?: any): number {\n return gridColumns.addColumn(this, before, columns)\n }\n\n removeColumn(...fields: string[]) {\n return gridColumns.removeColumn(this, ...fields)\n }\n\n getColumn(): string[]\n getColumn(field: string, returnIndex: true): number | null\n getColumn(field: string, returnIndex?: false): TsGridColumn | null\n getColumn(field?: string, returnIndex?: boolean): string[] | number | TsGridColumn | null {\n // any: forwarding overloaded args to delegator — overload resolution happens at the public surface\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridColumns.getColumn as any)(this, field, returnIndex)\n }\n\n // any: Record<string, any> — dynamic property bag; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n updateColumn(fields: string | string[], updates: Partial<TsGridColumn> | Record<string, any>) {\n return gridColumns.updateColumn(this, fields, updates)\n }\n\n toggleColumn(...fields: string[]) {\n return gridColumns.toggleColumn(this, ...fields)\n }\n\n showColumn(...fields: string[]) {\n return gridColumns.showColumn(this, ...fields)\n }\n\n hideColumn(...fields: string[]) {\n return gridColumns.hideColumn(this, ...fields)\n }\n\n /** Add one or more search fields. If `search` is omitted, `before` is treated as the search(es) to append. */\n // any: `before` is reassigned inside the body (number | string → number); TS can't narrow post-assignment\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n addSearch(before: any, search?: any): number {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.addSearch as any)(this, before, search) // any: variadic overload pass-through\n }\n\n removeSearch(...fields: string[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.removeSearch as any)(this, ...fields) // any: variadic pass-through\n }\n\n getSearch(): string[]\n getSearch(field: string, returnIndex: true): number | null\n getSearch(field: string, returnIndex?: false): TsGridSearch | null\n getSearch(field?: string, returnIndex?: boolean): string[] | number | TsGridSearch | null {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.getSearch as any)(this, field, returnIndex) // any: overload narrowing bypass\n }\n\n toggleSearch(...fields: string[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.toggleSearch as any)(this, ...fields) // any: variadic pass-through\n }\n\n showSearch(...fields: string[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.showSearch as any)(this, ...fields) // any: variadic pass-through\n }\n\n hideSearch(...fields: string[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.hideSearch as any)(this, ...fields) // any: variadic pass-through\n }\n\n // any: Record<string, any> — dynamic property bag; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getSearchData(field: string): Record<string, any> | null {\n return gridSearch.getSearchData(this, field)\n }\n\n localSort(silent?: boolean, noResetRefresh?: boolean) {\n return gridData.localSort(this, silent, noResetRefresh)\n }\n\n localSearch(silent?: boolean) {\n return gridData.localSearch(this, silent)\n }\n\n // any: array of heterogeneous runtime values; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getRangeData(range: [{ recid: string | number; column: number }, { recid: string | number; column: number }], extra?: boolean): any[] {\n return gridData.getRangeData(this, range, extra)\n }\n\n // any: addRange accepts string 'selection' shorthand, single range object, or array of ranges\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n addRange(rangesInput: TsGridRange | TsGridRange[] | string | Record<string, any>): number {\n return gridData.addRange(this, rangesInput)\n }\n\n removeRange(...names: string[]) {\n return gridData.removeRange(this, ...names)\n }\n\n refreshRanges() {\n return gridData.refreshRanges(this)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n select(...selectArgs: any[]) { // any: recid (string|number) or {recid, column} cell descriptor\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSelection.select as any)(this, ...selectArgs) // any: variadic overload pass-through\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n unselect(...unselectArgs: any[]): number { // any: recid (string|number) or {recid, column} cell descriptor\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSelection.unselect as any)(this, ...unselectArgs) // any: variadic overload pass-through\n }\n\n // any: array of heterogeneous runtime values; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n compareSelection(newSel: any[]): { select: any[]; unselect: any[] } {\n return gridSelection.compareSelection(this, newSel)\n }\n\n selectAll() {\n return gridSelection.selectAll(this)\n }\n\n selectNone(skipEvent?: boolean) {\n return gridSelection.selectNone(this, skipEvent)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n updateToolbar(sel?: any, _areAllSelected?: boolean) { // any: sel is selection object from last.selection\n return gridSelection.updateToolbar(this, sel, _areAllSelected)\n }\n\n /**\n * Row-mode selection. Returns the recids of selected records, or their indexes\n * when `returnIndex === true`. Unaffected by `selectType === 'cell'` — callers\n * should branch on `this.selectType` and use `getSelectionCells()` for cell mode.\n */\n getSelectionRows(returnIndex?: boolean): RecId[] | number[] {\n return gridSelection.getSelectionRows(this, returnIndex)\n }\n\n /**\n * Cell-mode selection. Returns one descriptor per selected cell. `returnIndex`\n * is intentionally not a parameter — it was ignored in cell mode by the legacy\n * `getSelection()` API.\n */\n getSelectionCells(): TsGridCellSelection[] {\n return gridSelection.getSelectionCells(this)\n }\n\n /**\n * Discriminated-union wrapper. The shape depends on `this.selectType`:\n * - `'row'` → `RecId[]` (or `number[]` if `returnIndex === true`)\n * - `'cell'` → `TsGridCellSelection[]` (`returnIndex` is ignored)\n *\n * Prefer the typed split methods (`getSelectionRows` / `getSelectionCells`)\n * when the caller knows the mode statically. This wrapper is kept for back-\n * compat with the v2.0 API and for callers that genuinely handle both modes.\n */\n getSelection(returnIndex?: boolean): RecId[] | number[] | TsGridCellSelection[] {\n return gridSelection.getSelection(this, returnIndex)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n search(field?: any, value?: any) { // any: field can be string or searchData array; value varies\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.search as any)(this, field, value) // any: variadic overload pass-through\n }\n\n // open advanced search popover\n // any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n searchOpen(options: any = {}) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.searchOpen as any)(this, options) // any: variadic overload pass-through\n }\n\n searchClose() {\n return gridSearch.searchClose(this)\n }\n\n // if clicked on a field in the search strip\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n searchFieldTooltip(ind: any, sd_ind: any, el: any) { // any: all params are loosely typed from DOM\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.searchFieldTooltip as any)(this, ind, sd_ind, el) // any: loosely-typed DOM params pass-through\n }\n\n // drop down with save searches\n searchSuggest(imediate?: boolean, forceHide?: boolean, anchor?: HTMLElement | Element) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.searchSuggest as any)(this, imediate, forceHide, anchor) // any: variadic pass-through\n }\n\n searchSave() {\n return gridSearch.searchSave(this)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cache(type: any) { // any: cache key is always string, loosely typed\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.cache as any)(this, type) // any: cache key loosely typed\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cacheSave(type: any, value: any) { // any: cache key and value are dynamic\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.cacheSave as any)(this, type, value) // any: cache key and value are dynamic\n }\n\n searchReset(noReload?: boolean) {\n return gridSearch.searchReset(this, noReload)\n }\n\n searchShowFields(forceHide?: boolean) {\n return gridSearch.searchShowFields(this, forceHide)\n }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n searchInitInput(field: string, _value?: any) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.searchInitInput as any)(this, field, _value) // any: optional _value loosely typed\n }\n\n // clears records and related params\n clear(noRefresh?: boolean): void {\n return gridData.clear(this, noRefresh)\n }\n\n // clears scroll position, selection, ranges\n reset(noRefresh?: boolean): void {\n return gridData.reset(this, noRefresh)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n skip(offset: any, callBack?: any) { // any: offset is number-like, callBack is optional function\n const url = this.url?.get ?? this.url\n if (url) {\n this.offset = parseInt(offset)\n if (this.offset > this.total) this.offset = this.total - this.limit\n if (this.offset < 0 || !TsUtils.isInt(this.offset)) this.offset = 0\n this.clear(true)\n this.reload(callBack)\n } else {\n console.log('ERROR: grid.skip() can only be called when you have remote data source.')\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n load(url: any, callBack?: any) { // any: url can be string or object with .get/.save\n return gridData.load(this, url, callBack)\n }\n\n // any: array of heterogeneous runtime values; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n reload(callBack?: (...args: any[]) => void) {\n return gridData.reload(this, callBack)\n }\n\n // any: url can be string, { get, save, remove } object, URL instance, or null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n request(action: string, postData?: Record<string, any>, url?: any, callBack?: (...args: any[]) => void): Promise<any> {\n return gridData.request(this, action, postData, url, callBack)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n requestComplete(data: any, action: any, callBack: any, resolve: any, reject: any) { // any: all params vary by context\n let error = data.error ?? false\n if (data.error == null && data.status === 'error') error = true\n this.last.fetch.response = (Date.now() - this.last.fetch.start) / 1000\n setTimeout(() => {\n if (this.show.statusResponse) {\n this.status(TsUtils.lang('Server Response ${count} seconds', { count: this.last.fetch.response }))\n }\n }, 10)\n this.last.vscroll.pull_more = false\n this.last.vscroll.pull_refresh = true\n\n // event before\n let event_name = 'load'\n if (this.last.fetch.action == 'save') event_name = 'save'\n if (this.last.fetch.action == 'delete') event_name = 'delete'\n const edata = this.trigger(event_name, { target: this.name, error, data, lastFetch: this.last.fetch })\n if (edata.isCancelled === true) {\n reject()\n return\n }\n // parse server response\n if (!error) {\n // default action\n if (typeof this.parser == 'function') {\n data = this.parser(data)\n if (typeof data != 'object') {\n console.log('ERROR: Your parser did not return proper object')\n }\n } else {\n if (data == null) {\n data = {\n error: true,\n message: TsUtils.lang(this.msgNotJSON),\n }\n } else if (Array.isArray(data)) {\n // if it is plain array, assume these are records\n data = {\n error,\n records: data,\n total: data.length\n }\n }\n }\n if (action == 'load') {\n if (data.total == null) data.total = -1\n if (data.records == null) {\n data.records = []\n this.last.groupBy_links = {}\n }\n if (data.records.length == this.limit) {\n const loaded = this.records.length + data.records.length\n this.last.fetch.hasMore = (loaded == this.total ? false : true)\n } else {\n this.last.fetch.hasMore = false\n this.total = this.offset + (this.last.fetch.offset ?? 0) + data.records.length\n }\n if (!this.last.fetch.hasMore) {\n // if no more records, then hide spinner\n query(this.box).find('#grid_'+ this.name +'_rec_more, #grid_'+ this.name +'_frec_more').hide()\n }\n if (this.last.fetch.offset === 0) {\n this.records = []\n this.summary = []\n this.last.groupBy_links = {}\n } else {\n if (data.total != -1 && parseInt(String(data.total)) != this.total) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const grid = this\n // any: cast-to-any for dynamic dispatch; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(this.message(TsUtils.lang(this.msgNeedReload)) as any)\n .ok(() => {\n delete grid.last.fetch.offset\n grid.reload()\n })\n return new Promise<void>(resolve => { resolve() })\n }\n }\n if (TsUtils.isInt(data.total)) this.total = parseInt(data.total)\n // records\n if (data.records) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data.records.forEach((rec: any) => { // any: record shape from server varies\n if (this.recid) {\n rec.recid = this.parseField(rec, this.recid)\n }\n if (rec.recid == null) {\n rec.recid = 'recid-' + this.records.length\n }\n if (rec.TsUi?.summary === true) {\n this.summary.push(rec)\n } else {\n this.records.push(rec)\n }\n })\n }\n if (data.groupBy != null) {\n this.groupBy = data.groupBy\n }\n this.processGroupBy()\n // summary records (if any)\n if (data.summary) {\n this.summary = [] // reset summary with each call\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data.summary.forEach((rec: any) => { // any: summary record shape varies\n if (this.recid) {\n rec.recid = this.parseField(rec, this.recid)\n }\n if (rec.recid == null) {\n rec.recid = 'recid-' + this.summary.length\n }\n this.summary.push(rec)\n })\n }\n } else if (action == 'delete') {\n this.reset() // unselect old selections\n return this.reload()\n }\n } else {\n this.error(TsUtils.lang(data.message || this.msgServerError)) // || not ?? — empty string should also fall back\n reject(data)\n }\n // event after\n const url = this.url?.get ?? this.url\n if (!url) {\n this.localSort()\n this.localSearch()\n }\n this.total = parseInt(String(this.total))\n // do not refresh if loading on infinite scroll\n if (this.last.fetch.offset === 0) {\n this.refresh()\n } else {\n this.scroll()\n this.resize()\n }\n // call back\n if (typeof callBack == 'function') callBack(data) // need to be before event:after\n resolve(data)\n // after event\n edata.finish()\n this.last.fetch.loaded = true\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error(msg: any) { // any: error message can be string or object\n // let the management of the error outside of the grid\n const edata = this.trigger('error', { target: this.name, message: msg })\n if (edata.isCancelled === true) {\n return\n }\n this.message(msg)\n // event after\n edata.finish()\n }\n\n // any: Record<string, any> — dynamic property bag; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getChanges(recordsBase?: TsGridRecord[]): Record<string, any>[] {\n const changes = []\n if (typeof recordsBase == 'undefined') {\n recordsBase = this.records\n }\n\n for (let r = 0; r < recordsBase.length; r++) {\n const rec = recordsBase[r]!\n if (rec?.TsUi) {\n if (rec.TsUi['changes'] != null) {\n // any: Record<string, any> — dynamic property bag; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const obj: Record<string, any> = {}\n obj[this.recid || 'recid'] = rec.recid\n changes.push(TsUtils.extend(obj, rec.TsUi['changes']))\n }\n\n // recursively look for changes in non-expanded children\n if (rec.TsUi.expanded !== true && rec.TsUi.children && rec.TsUi.children.length) {\n changes.push(...this.getChanges(rec.TsUi.children))\n }\n }\n }\n return changes\n }\n\n mergeChanges() {\n const changes = this.getChanges()\n for (let c = 0; c < changes.length; c++) {\n const change_c = changes[c]!\n const record = this.get(change_c[this.recid || 'recid'])\n if (record == null) continue\n for (const s in change_c) {\n if (s == 'recid' || (this.recid && s == this.recid)) continue // do not allow to change recid\n if (typeof change_c[s] === 'object') change_c[s] = change_c[s].text\n try {\n _setValue(record, s, change_c[s])\n } catch (e) {\n // any: cast-to-any for dynamic dispatch; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n console.log('ERROR: Cannot merge. ', (e as any)?.message || '', e)\n }\n if (record.TsUi) delete record.TsUi['changes']\n }\n }\n this.refresh()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _setValue(obj: any, field: any, value: any) { // any: record fields and values are dynamic\n const fld = field.split('.')\n if (fld.length == 1) {\n obj[field] = value\n } else {\n obj = obj[fld[0]]\n fld.shift()\n _setValue(obj, fld.join('.'), value)\n }\n }\n }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n save(callBack?: (data: any) => void) {\n return gridData.save(this, callBack)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editField(recid: string | number, column: number, value: any, event?: any) { // any: can be KeyboardEvent, MouseEvent, or synthetic event\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridEdit.editField as any)(this, recid, column, value, event) // any: variadic pass-through for optional event arg\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editChange(input?: any, index?: any, column?: any, event?: any) { // any: all params are optional grid-edit internals\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridEdit.editChange as any)(this, input, index, column, event) // any: variadic pass-through for all-optional params\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editDone(index?: any, column?: any, event?: any) { // any: all params are optional grid-edit internals\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridEdit.editDone as any)(this, index, column, event) // any: variadic pass-through for all-optional params\n }\n\n 'delete'(force?: boolean) {\n // event before\n const edata = this.trigger('delete', { target: this.name, force: force })\n if (force) this.message() // close message\n if (edata.isCancelled === true) return\n force = edata.detail['force'] as boolean\n // default action\n const recs = this.getSelection()\n if (recs.length === 0) return\n if (this.msgDelete != '' && !force) {\n ;(this.confirm({\n text: TsUtils.lang(this.msgDelete, {\n count: recs.length,\n records: TsUtils.lang( recs.length == 1 ? 'record' : 'records')\n }),\n width: 380,\n height: 170,\n yes_text: TsUtils.lang('Delete'),\n yes_class: 'tsg-btn-red',\n no_text: TsUtils.lang('Cancel'),\n // any: cast-to-any for dynamic dispatch; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any)\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .yes((event: any) => {\n event.detail.self.close()\n this.delete(true)\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .no((event: any) => { // any: TsConfirm event shape\n event.detail.self.close()\n })\n return\n }\n // call delete script\n const url = this.url?.remove ?? this.url\n if (url) {\n this.request('delete')\n } else {\n if (typeof recs[0] != 'object') {\n this.selectNone()\n this.remove(...(recs as Array<RecId | number>))\n } else {\n // clear cells\n const cellRecs = recs as TsGridCellSelection[]\n for (let r = 0; r < cellRecs.length; r++) {\n const rr = cellRecs[r]!\n const fld = this.columns[rr.column]!.field\n const ind = this.get(rr.recid, true)\n const rec = ind != null ? this.records[ind]! : null\n if (ind != null && fld != 'recid' && rec != null) {\n this.records[ind]![fld] = ''\n if (rec.TsUi?.['changes']) delete rec.TsUi['changes'][fld]\n // -- style should not be deleted\n // if (rec.style != null && TsUtils.isPlainObject(rec.style) && rec.style[recs[r].column]) {\n // delete rec.style[recs[r].column];\n // }\n }\n }\n this.update()\n }\n }\n // event after\n edata.finish()\n }\n\n // any: recid can be string|number (row select) or {recid, column} object (cell select)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n click(recid: string | number | { recid: string | number; column?: number } | any, event?: MouseEvent | any) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridInteraction.click as any)(this, recid, event) // any: variadic overload pass-through\n }\n\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n columnClick(field: string, event?: MouseEvent | any) {\n return gridInteraction.columnClick(this, field, event)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n columnDblClick(field: any, event: any) { // any: field is string; event is MouseEvent or CustomEvent\n return gridInteraction.columnDblClick(this, field, event)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n columnContextMenu(field: any, event: any) { // any: field is string; event is MouseEvent\n return gridInteraction.columnContextMenu(this, field, event)\n }\n\n // if called w/o arguments, then will resize all columns\n columnAutoSize(colIndex?: number) {\n return gridInteraction.columnAutoSize(this, colIndex)\n }\n\n columnAutoSizeAll() {\n return gridInteraction.columnAutoSizeAll(this)\n }\n\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n focus(event?: Event | any) {\n return gridInteraction.focus(this, event)\n }\n\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n blur(event?: Event | any) {\n return gridInteraction.blur(this, event)\n }\n\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n keydown(event: KeyboardEvent | any) {\n return gridInteraction.keydown(this, event)\n }\n\n scrollIntoView(ind?: number | null, column?: number, instant?: boolean, recTop?: boolean) {\n return gridInteraction.scrollIntoView(this, ind, column, instant, recTop)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n scrollToColumn(field: any) { // any: field name is string\n return gridInteraction.scrollToColumn(this, field)\n }\n\n\n // any: recid can be string|number (row select) or {recid, column} object (cell select)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n dblClick(recid: string | number | { recid: string | number; column?: number } | any, event?: MouseEvent | any) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridInteraction.dblClick as any)(this, recid, event) // any: variadic overload pass-through\n }\n\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n showContextMenu(event: MouseEvent | any, options: { recid?: string | number; index?: number; column?: number }) {\n return gridInteraction.showContextMenu(this, event, options)\n }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n contextMenuClick(recid: string | number, column: number | null, event: any) {\n return gridInteraction.contextMenuClick(this, recid, column, event)\n }\n\n toggle(recid: string | number, _event?: Event) {\n return gridInteraction.toggle(this, recid, _event)\n }\n\n /**\n * When record is expaned, then TsUi.children of the record is copied into this.records and this.total is updated. It will\n * also set TsUi._copeid = true, so it would not copy it again.\n *\n * There is also updateExpaned() that is called in this.refresh()\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n expand(recid: any, noRefresh?: any) { // any: recid is string|number; noRefresh is boolean\n return gridInteraction.expand(this, recid, noRefresh)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n collapse(recid: any, noRefresh?: any) { // any: recid is string|number; noRefresh is boolean\n return gridInteraction.collapse(this, recid, noRefresh)\n }\n\n updateExpanded() {\n return gridInteraction.updateExpanded(this)\n }\n\n sort(field?: string, direction?: 'asc' | 'desc' | '' | null, multiField?: boolean) { // if no params - clears sort\n return gridInteraction.sort(this, field, direction, multiField)\n }\n\n // any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n copy(flag: any, oEvent?: ClipboardEvent | any) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridInteraction.copy as any)(this, flag, oEvent) // any: variadic overload pass-through\n }\n\n /**\n * Gets value to be copied to the clipboard\n * @param ind index of the record\n * @param col_ind index of the column\n * @returns the displayed value of the field's record associated with the cell\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getCellCopy(ind: any, col_ind: any) { // any: record index and column index\n return gridInteraction.getCellCopy(this, ind, col_ind)\n }\n\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n paste(text: string, event?: ClipboardEvent | any) {\n return gridInteraction.paste(this, text, event)\n }\n\n // ==================================================\n // --- Common functions\n\n resize() { return gridRender.resize(this) }\n\n // any: parameter typed any — runtime dispatch by call site; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n update({ cells, fullCellRefresh, ignoreColumns }: any = {}) { return gridRender.update(this, { cells, fullCellRefresh, ignoreColumns }) }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n refreshCell(recid: any, field: any) { return gridRender.refreshCell(this, recid, field) } // any: recid is string|number; field is string\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n refreshRow(recid: any, ind: any = null) { return gridRender.refreshRow(this, recid, ind) } // any: recid is string|number; ind is number\n\n refresh() { return gridRender.refresh(this) }\n\n refreshSearch() { return gridRender.refreshSearch(this) }\n\n refreshBody() { return gridRender.refreshBody(this) }\n\n override render(box?: HTMLElement | string | null) {\n const time = Date.now()\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const obj = this\n if (typeof box == 'string') box = query(box).get(0)\n // event before\n const edata = this.trigger('render', { target: this.name, box: box ?? this.box })\n if (edata.isCancelled === true) return\n // default action\n if (box != null) {\n this.unmount() // clean previous control\n this.box = box as HTMLElement // any: string was converted to Element via query().get(0) above\n }\n if (!this.box) return\n const url = this.url?.get ?? this.url\n // reset needed if grid existed\n this.reset(true)\n // insert elements\n query(this.box)\n .attr('name', this.name)\n .addClass('tsg-reset tsg-grid tsg-inactive')\n .html('<div class=\"tsg-grid-box\">'+\n ' <div id=\"grid_'+ this.name +'_header\" class=\"tsg-grid-header\"></div>'+\n ' <div id=\"grid_'+ this.name +'_toolbar\" class=\"tsg-grid-toolbar\"></div>'+\n ' <div id=\"grid_'+ this.name +'_body\" class=\"tsg-grid-body\"></div>'+\n ' <div id=\"grid_'+ this.name +'_fsummary\" class=\"tsg-grid-body tsg-grid-summary\"></div>'+\n ' <div id=\"grid_'+ this.name +'_summary\" class=\"tsg-grid-body tsg-grid-summary\"></div>'+\n ' <div id=\"grid_'+ this.name +'_footer\" class=\"tsg-grid-footer\"></div>'+\n ' <textarea id=\"grid_'+ this.name +'_focus\" class=\"tsg-grid-focus-input\" '+\n (this.tabIndex ? 'tabindex=\"' + this.tabIndex + '\"' : '')+\n (TsUtils.isMobile ? 'readonly' : '') +'></textarea>'+ // readonly needed on android not to open keyboard\n '</div>')\n if (this.selectType != 'row') query(this.box).addClass('tsg-ss')\n if (query(this.box).length > 0) query(this.box)[0].style.cssText += this.style\n // render toolbar\n const tb_box = query(this.box).find(`#grid_${this.name}_toolbar`)\n if (this.toolbar != null) this.toolbar.render(tb_box[0])\n this.last.toolbar_height = tb_box.prop('offsetHeight')\n // re-init search_all\n if (this.last.field && this.last.field != 'all') {\n const sd = this.searchData\n setTimeout(() => { this.searchInitInput(this.last.field, (sd.length == 1 ? sd[0]!.value : null)) }, 1)\n }\n // init footer\n query(this.box).find(`#grid_${this.name}_footer`).html(this.getFooterHTML())\n // refresh\n if (!this.last.state) this.last.state = this.stateSave(true) // initial default state\n this.stateRestore()\n if (url) { this.clear(); this.refresh() } // show empty grid (need it) - should it be only for remote data source\n // if hidden searches - apply it\n let hasHiddenSearches = false\n for (let i = 0; i < this.searches.length; i++) {\n if (this.searches[i]!.hidden) { hasHiddenSearches = true; break }\n }\n if (hasHiddenSearches) {\n this.searchReset(false) // will call reload\n if (!url) setTimeout(() => { this.searchReset() }, 1)\n } else {\n this.reload()\n }\n // focus\n query(this.box).find(`#grid_${this.name}_focus`)\n .on('focus', (_event: Event) => {\n clearTimeout(this.last.kbd_timer ?? undefined)\n if (!this.hasFocus) this.focus()\n })\n .on('blur', (_event: Event) => {\n clearTimeout(this.last.kbd_timer ?? undefined)\n this.last.kbd_timer = setTimeout(() => {\n if (this.hasFocus) { this.blur() }\n }, 100) // need this timer to be 100 ms\n })\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('paste', (event: any) => {\n const cd = (event.clipboardData ? event.clipboardData : null)\n if (cd) {\n let items = cd.items\n if (items.length == 2) {\n if (items.length == 2 && items[1].kind == 'file') {\n items = [items[1]]\n }\n if (items.length == 2 && items[0].type == 'text/plain' && items[1].type == 'text/html') {\n items = [items[1]]\n }\n }\n let items2send = []\n // might contain data in different formats, but it is a single paste\n for (const index in items) {\n const item = items[index]\n if (item.kind === 'file') {\n const file = item.getAsFile()\n items2send.push({ kind: 'file', data: file })\n } else if (item.kind === 'string' && (item.type === 'text/plain' || item.type === 'text/html')) {\n event.preventDefault()\n let text = cd.getData('text/plain')\n if (text.indexOf('\\r') != -1 && text.indexOf('\\n') == -1) {\n text = text.replace(/\\r/g, '\\n')\n }\n items2send.push({ kind: (item.type == 'text/html' ? 'html' : 'text'), data: text })\n }\n }\n if (items2send.length === 1 && items2send[0]!.kind != 'file') {\n items2send = items2send[0]!.data\n }\n // any: cast-to-any for dynamic dispatch; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(TsUi[this.name] as any).paste(items2send, event)\n event.preventDefault()\n }\n })\n .on('keydown', function (event: Event) {\n // any: cast-to-any for dynamic dispatch; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(TsUi[obj.name] as any).keydown.call(TsUi[obj.name], event)\n })\n // init mouse events for mouse selection\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let edataCol: any // event for column select\n query(this.box).off('mousedown.mouseStart').on('mousedown.mouseStart', mouseStart)\n this.updateToolbar()\n // event after\n edata.finish()\n // observe div resize\n this.last['observeResize'] = new ResizeObserver(() => {\n this.resize()\n this.scroll()\n })\n this.last['observeResize'].observe(this.box)\n return Date.now() - time\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function mouseStart(event: any) { // any: event is MouseEvent at runtime; typed loosely to avoid EventListener mismatch\n if (event.which != 1) return // if not left mouse button\n // restore css user-select\n if (obj.last.userSelect == 'text') {\n obj.last.userSelect = ''\n query(obj.box).find('.tsg-grid-body').css('user-select', 'none')\n }\n // regular record select\n if (obj.selectType == 'row' && (query(event.target).parents().hasClass('tsg-head') || query(event.target).hasClass('tsg-head'))) return\n if (obj.last.move && obj.last.move.type == 'expand') return\n // if altKey - alow text selection\n if (event.altKey) {\n query(obj.box).find('.tsg-grid-body').css('user-select', 'text')\n obj.selectNone()\n obj.last.move = { type: 'text-select' }\n obj.last.userSelect = 'text'\n } else {\n let tmp = event.target\n const pos = {\n x: event.offsetX - 10,\n y: event.offsetY - 10\n }\n let tmps = false\n while (tmp) {\n if (tmp.classList && tmp.classList.contains('tsg-grid')) break\n if (tmp.tagName && tmp.tagName.toUpperCase() == 'TD') tmps = true\n if (tmp.tagName && tmp.tagName.toUpperCase() != 'TR' && tmps == true) {\n pos.x += tmp.offsetLeft\n pos.y += tmp.offsetTop\n }\n tmp = tmp.parentNode\n }\n const index = query(event.target).parents('tr').attr('index')\n const recid = obj.records[index]?.recid\n\n // if cell selection, on initial click start selection\n if (obj.selectType == 'cell' && !event.shiftKey) {\n let column1 = parseInt(query(event.target).closest('td').attr('col'))\n let column2 = column1\n if (isNaN(column1)) {\n column1 = 0\n column2 = obj.columns.length - 1\n }\n obj.addRange({\n name: 'selection-preview',\n range: [{ recid, column: column1 }, { recid, column: column2 }],\n class: 'tsg-selection-preview'\n })\n }\n\n obj.last.move = {\n x : event.screenX,\n y : event.screenY,\n divX : 0,\n divY : 0,\n focusX : pos.x,\n focusY : pos.y,\n recid : recid,\n column : parseInt(event.target.tagName.toUpperCase() == 'TD' ? query(event.target).attr('col') : query(event.target).parents('td').attr('col')),\n type : 'select',\n ghost : false,\n start : true\n }\n if (obj.last.move.recid == null && obj.records.length > 0) {\n obj.last.move.type = 'select-column'\n const column = parseInt(query(event.target).closest('td').attr('col'))\n const start = obj.records[0]!.recid\n const end = obj.records[obj.records.length - 1]!.recid\n obj.addRange({\n name: 'selection-preview',\n range: [{ recid: start, column }, { recid: end, column }],\n class: 'tsg-selection-preview'\n })\n }\n // set focus to grid\n const target = event.target\n const $input = query(obj.box).find('#grid_'+ obj.name + '_focus')\n // move input next to cursor so screen does not jump\n if (obj.last.move) {\n let sLeft = obj.last.move.focusX\n let sTop = obj.last.move.focusY\n const $owner = query(target).parents('table').parent()\n if ($owner.hasClass('tsg-grid-records') || $owner.hasClass('tsg-grid-frecords')\n || $owner.hasClass('tsg-grid-columns') || $owner.hasClass('tsg-grid-fcolumns')\n || $owner.hasClass('tsg-grid-summary')) {\n sLeft = obj.last.move.focusX - query(obj.box).find('#grid_'+ obj.name +'_records').prop('scrollLeft')\n sTop = obj.last.move.focusY - query(obj.box).find('#grid_'+ obj.name +'_records').prop('scrollTop')\n }\n if (query(target).hasClass('tsg-grid-footer') || query(target).parents('div.tsg-grid-footer').length > 0) {\n sTop = query(obj.box).find('#grid_'+ obj.name +'_footer').get(0).offsetTop\n }\n // if clicked on toolbar\n if ($owner.hasClass('tsg-scroll-wrapper') && $owner.parent().hasClass('tsg-toolbar')) {\n sLeft = obj.last.move.focusX - $owner.prop('scrollLeft')\n }\n $input.css({\n left: sLeft - 10,\n top : sTop\n })\n }\n // if toolbar input is clicked\n setTimeout(() => {\n if (!obj.last.inEditMode) {\n if (['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName)) {\n target.focus()\n } else {\n if ($input.get(0) !== document.activeElement) $input.get(0)?.focus({ preventScroll: true })\n }\n }\n }, 50)\n // disable click select for this condition\n if (!obj.multiSelect && !obj.reorderRows && obj.last.move.type == 'drag') {\n delete obj.last.move\n }\n }\n if (obj.reorderRows == true) {\n let el = event.target\n if (el.tagName.toUpperCase() != 'TD') el = query(el).parents('td')[0]\n if (query(el).hasClass('tsg-col-number') || query(el).hasClass('tsg-col-order')) {\n //multiple rows reordering\n //obj.selectNone()\n let sel: Array<RecId | number | string> = obj.getSelection() as Array<RecId | number | string>\n if (sel.length > 0 && typeof sel[0] == 'object') {\n const cellSel = sel as unknown as TsGridCellSelection[]\n obj.select([...new Set(cellSel.map(r => r.recid))])\n sel = [...new Set(obj.getSelectionCells().map(r => r.recid))]\n }\n if (sel.indexOf(obj.last.move.recid) == -1) {\n obj.selectNone()\n obj.select([obj.last.move.recid])\n sel = [obj.last.move.recid]\n }\n //select children\n // any: array of heterogeneous runtime values; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const new_sel: any[] = []\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const selectExpandedChildren = (recid: any) => {\n const rec = obj.get(recid)\n if (rec?.TsUi?.children) {\n rec.TsUi.children.forEach(c => {\n const child_rec = obj.get(c.recid)\n if (!child_rec) return\n new_sel.push(c.recid)\n selectExpandedChildren(c.recid)\n })\n }\n }\n sel.forEach((recid) => selectExpandedChildren(recid))\n sel = [...sel, ...new_sel]\n obj.last.move.reorder = true\n // suppress hover\n const eColor = query(obj.box).find('.tsg-even.tsg-empty-record').css('background-color')\n const oColor = query(obj.box).find('.tsg-odd.tsg-empty-record').css('background-color')\n query(obj.box).find('.tsg-even td').filter(':not(.tsg-col-number)').css('background-color', eColor)\n query(obj.box).find('.tsg-odd td').filter(':not(.tsg-col-number)').css('background-color', oColor)\n // display empty record and ghost record\n const mv = obj.last.move\n const recs = query(obj.box).find('.tsg-grid-records')\n if (!mv['ghost']) {\n //multiple rows reordering\n //let row = query(obj.box).find(`#grid_${obj.name}_rec_${mv.recid}`)\n const rows = sel.map(r => query(obj.box).find(`#grid_${obj.name}_rec_${r}`))\n const tmp = rows[0].parents('table').find('tr:first-child').get(0).cloneNode(true)\n mv.offsetY = event.offsetY\n //multiple rows reordering\n //mv.from = mv.recid\n mv.from = sel\n //mv.pos = {top: row.get(0).offsetTop - 1, left: row.get(0).offsetLeft}\n mv.pos = {top: rows[0].get(0).offsetTop - 1, left: rows[rows.length-1].get(0).offsetLeft}\n //mv['ghost'] = query(row.get(0).cloneNode(true))\n mv['ghost'] = query(rows.map(row => row.get(0).cloneNode(true)))\n mv['ghost'].removeAttr('id')\n mv['ghost'].find('td').css({\n 'border-top': '1px solid silver',\n 'border-bottom': '1px solid silver'\n })\n rows.forEach(row => {\n row.find('td').remove()\n row.append(`<td colspan=\"1000\"><div class=\"tsg-reorder-empty\" style=\"height: ${(obj.recordHeight - 2)}px\"></div></td>`)\n })\n recs.append('<div id=\"grid_'+ obj.name + '_ghost_line\" style=\"position: absolute; z-index: 999999; pointer-events: none; width: 100%;\"></div>')\n recs.append('<table id=\"grid_'+ obj.name + '_ghost\" style=\"position: absolute; z-index: 999998; opacity: 0.9; pointer-events: none;\"></table>')\n query(obj.box).find('#grid_'+ obj.name + '_ghost').append(tmp).append(mv['ghost'])\n }\n const ghost = query(obj.box).find('#grid_'+ obj.name + '_ghost')\n ghost.css({\n top : mv.pos.top + 'px',\n left : mv.pos.left + 'px'\n })\n } else {\n obj.last.move.reorder = false\n }\n }\n query(document)\n .on('mousemove.tsg-' + obj.name, mouseMove)\n .on('mouseup.tsg-' + obj.name, mouseStop)\n // needed when grid grids are nested, see issue #1275\n event.stopPropagation()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function mouseMove(event: any) { // any: event is MouseEvent at runtime; typed loosely to avoid EventListener mismatch\n if (!event.target.tagName) {\n // element has no tagName - most likely the target is the #document itself\n // this can happen is you click+drag and move the mouse out of the DOM area,\n // e.g. into the browser's toolbar area\n return\n }\n const mv = obj.last.move\n if (!mv || !['select', 'select-column'].includes(mv.type)) return\n mv.divX = (event.screenX - mv.x)\n mv.divY = (event.screenY - mv.y)\n if (Math.abs(mv.divX) <= 1 && Math.abs(mv.divY) <= 1) return // only if moved more then 1px\n obj.last.cancelClick = true\n if (obj.reorderRows == true && obj.last.move.reorder) {\n const tmp = query(event.target).parents('tr')\n const ind = tmp.attr('index')\n let recid = obj.records[ind]?.recid\n if (recid == '-none-' || recid == null) recid = 'bottom'\n if (mv.from.indexOf(recid) == -1) {\n // let row1 = query(obj.box).find('#grid_'+ obj.name + '_rec_'+ mv.recid)\n const row2 = query(obj.box).find('#grid_'+ obj.name + '_rec_'+ recid)\n query(obj.box).find('.insert-before')\n row2.addClass('insert-before')\n // MOVABLE GHOST\n // if (event.screenY - mv.lastY < 0) row1.after(row2); else row2.after(row1);\n mv.lastY = event.screenY\n mv.to = recid\n // line to insert before\n const pos = { top: row2.get(0)?.offsetTop, left: row2.get(0)?.offsetLeft }\n const ghost_line = query(obj.box).find('#grid_'+ obj.name + '_ghost_line')\n if (pos) {\n ghost_line.css({\n top : pos.top + 'px',\n left : mv.pos.left + 'px',\n 'border-top': '2px solid #769EFC'\n })\n } else {\n ghost_line.css({\n 'border-top': '2px solid transparent'\n })\n }\n }\n const ghost = query(obj.box).find('#grid_'+ obj.name + '_ghost')\n ghost.css({\n top : (mv.pos.top + mv.divY) + 'px',\n left : mv.pos.left + 'px'\n })\n return\n }\n if (obj.selectType == 'row' && mv.start && mv.recid) {\n obj.selectNone()\n mv.start = false\n }\n const newSel = []\n const ind = (event.target.tagName.toUpperCase() == 'TR' ? query(event.target).attr('index') : query(event.target).parents('tr').attr('index'))\n const recid = obj.records[ind]?.recid\n if (recid == null) {\n // select by dragging columns\n if (obj.selectType == 'row') return\n if (obj.last.move && obj.last.move.type == 'select') return\n const col = parseInt(query(event.target).parents('td').attr('col'))\n if (isNaN(col)) {\n obj.removeRange('column-selection')\n query(obj.box).find('.tsg-grid-columns .tsg-col-header, .tsg-grid-fcolumns .tsg-col-header').removeClass('tsg-col-selected')\n query(obj.box).find('.tsg-col-number').removeClass('tsg-row-selected')\n delete mv.colRange\n } else {\n // add all columns in between\n let newRange = col + '-' + col\n if (mv.column < col) newRange = mv.column + '-' + col\n if (mv.column > col) newRange = col + '-' + mv.column\n // array of selected columns\n const cols = []\n const tmp = newRange.split('-')\n for (let ii = parseInt(tmp[0] ?? '0'); ii <= parseInt(tmp[1] ?? '0'); ii++) {\n cols.push(ii)\n }\n if (mv.colRange != newRange && mv.type == 'select-column') {\n edataCol = obj.trigger('columnSelect', { target: obj.name, columns: cols })\n if (edataCol.isCancelled !== true) {\n // show new range\n mv.colRange = newRange\n const start = obj.records[0]!.recid\n const end = obj.records[obj.records.length - 1]!.recid\n obj.addRange({\n name: 'selection-preview',\n range: [{ recid: start, column: tmp[0] }, { recid: end, column: tmp[1] }],\n class: 'tsg-selection-preview'\n })\n }\n }\n }\n\n } else { // regular selection\n\n let ind1 = obj.get(mv.recid, true)\n // this happens when selection is started on summary row\n if (ind1 == null || (obj.records[ind1] && obj.records[ind1]!.recid != mv.recid)) return\n let ind2 = obj.get(recid, true)\n // this happens when selection is extended into summary row (a good place to implement scrolling)\n if (ind2 == null) return\n let col1 = parseInt(mv.column)\n let col2 = parseInt(event.target.tagName.toUpperCase() == 'TD' ? query(event.target).attr('col') : query(event.target).parents('td').attr('col'))\n if (isNaN(col1) && isNaN(col2)) { // line number select entire record\n col1 = 0\n col2 = obj.columns.length-1\n }\n if (ind1 > ind2) { const tmp = ind1; ind1 = ind2; ind2 = tmp }\n // check if need to refresh\n const tmp = 'ind1:'+ ind1 +',ind2;'+ ind2 +',col1:'+ col1 +',col2:'+ col2\n if (mv.range == tmp) return\n mv.range = tmp\n for (let i = ind1; i <= ind2; i++) {\n if (obj.last.searchIds.length > 0 && obj.last.searchIds.indexOf(i) == -1) continue\n if (obj.selectType != 'row') {\n if (col1 > col2) { const tmp = col1; col1 = col2; col2 = tmp }\n for (let c = col1; c <= col2; c++) {\n if (obj.columns[c]!.hidden) continue\n newSel.push({ recid: obj.records[i]!.recid, column: c })\n }\n } else {\n newSel.push(obj.records[i]!.recid)\n }\n }\n if (obj.selectType != 'row') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const start = newSel[0] as any // any: newSel contains {recid,column} objects in non-row selectType\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const end = newSel[newSel.length - 1] as any // any: same\n obj.addRange({\n name: 'selection-preview',\n range: [{ recid: start?.recid, column: start?.column }, { recid: end?.recid, column: end?.column }],\n class: 'tsg-selection-preview'\n })\n mv.newRange = newSel\n } else {\n if (obj.multiSelect) {\n // any: range select handles row + cell selections via raw arrays;\n // both sel and newSel carry mode-specific shapes that this method intentionally treats opaquely\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sel = obj.getSelection() as any[]\n for (let ns = 0; ns < newSel.length; ns++) {\n if (sel.indexOf(newSel[ns]) == -1) obj.select(newSel[ns]) // add more items\n }\n for (let s = 0; s < sel.length; s++) {\n if (newSel.indexOf(sel[s]) == -1) obj.unselect(sel[s]) // remove items\n }\n }\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function mouseStop(event: any) { // any: event is MouseEvent at runtime; typed loosely to avoid EventListener mismatch\n const mv = obj.last.move\n setTimeout(() => {\n obj.last.cancelClick = null\n }, 1)\n if (query(event.target).parents().hasClass('.tsg-head') || query(event.target).hasClass('.tsg-head')) return\n obj.removeRange('selection-preview')\n if (mv && ['select', 'select-column'].includes(mv.type)) {\n if (mv.colRange != null && edataCol.isCancelled !== true) {\n const tmp = mv.colRange.split('-')\n const sel = []\n for (let i = 0; i < obj.records.length; i++) {\n const cols = []\n for (let j = parseInt(tmp[0]); j <= parseInt(tmp[1]); j++) cols.push(j)\n sel.push({ recid: obj.records[i]!.recid, column: cols })\n }\n edataCol.finish()\n obj.selectNone(true)\n obj.select(sel)\n } else if (mv.newRange != null) {\n obj.selectNone(true)\n obj.select(...mv.newRange)\n }\n if (obj.reorderRows == true && obj.last.move.reorder) {\n if (mv.to != null) {\n // event\n const edata = obj.trigger('reorderRow', { target: obj.name, recid: mv.from, moveBefore: mv.to })\n if (edata.isCancelled === true) {\n resetRowReorder()\n delete obj.last.move\n return\n }\n // default behavior\n // multiple rows reordering\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ind1 = mv.from.map((recid: any) => obj.get(recid, true))\n let ind2 = obj.get(mv.to, true)\n if (mv.to == 'bottom') ind2 = obj.records.length // end of list\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tmp = ind1.map((ind: any) => obj.records[ind])\n // swap records\n if (ind1 != null && ind2 != null) {\n obj.records.splice(ind1[0], ind1.length)\n if (ind1[0] > ind2) {\n obj.records.splice(ind2, 0, ...tmp)\n } else {\n obj.records.splice(ind2 - 1, 0, ...tmp)\n }\n }\n // clear sortData\n obj.sortData = []\n query(obj.box)\n .find(`#grid_${obj.name}_columns .tsg-col-header`)\n .removeClass('tsg-col-sorted')\n resetRowReorder()\n obj.selectNone(true)\n obj.select(mv.from)\n // event after\n edata.finish()\n } else {\n resetRowReorder()\n }\n }\n }\n delete obj.last.move\n query(document).off('.tsg-' + obj.name)\n }\n\n function resetRowReorder() {\n query(obj.box).find(`#grid_${obj.name}_ghost`).remove()\n query(obj.box).find(`#grid_${obj.name}_ghost_line`).remove()\n obj.refresh()\n delete obj.last.move\n }\n }\n\n override unmount() {\n super.unmount()\n this.toolbar?.unmount()\n this.last['observeResize']?.disconnect()\n }\n\n destroy() { return gridRender.destroy(this) }\n\n // ===========================================\n // --- Internal Functions\n\n initColumnOnOff() { return gridRender.initColumnOnOff(this) }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initColumnDrag(_box?: any) { return gridRender.initColumnDrag(this, _box) }\n\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n columnOnOff(event: MouseEvent | any, field: string) { return gridRender.columnOnOff(this, event, field) }\n\n initToolbar() { return gridRender.initToolbar(this) }\n\n initResize() { return gridRender.initResize(this) }\n\n resizeBoxes() { return gridRender.resizeBoxes(this) }\n\n resizeRecords() { return gridRender.resizeRecords(this) }\n\n getSearchesHTML() {\n return gridSearch.getSearchesHTML(this)\n }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getOperators(type: any, opers: any) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.getOperators as any)(this, type, opers) // any: loosely-typed operator params pass-through\n }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initOperator(ind: any) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.initOperator as any)(this, ind) // any: ind is loosely typed from DOM\n }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initSearchLists(changedField?: any) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (gridSearch.initSearchLists as any)(this, changedField) // any: changedField loosely typed\n }\n\n initSearches() {\n return gridSearch.initSearches(this)\n }\n\n getColumnsHTML() { return gridRender.getColumnsHTML(this) }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getColumnCellHTML(i: any) { return gridRender.getColumnCellHTML(this, i) }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n columnTooltipShow(ind: any, _event: any) { return gridRender.columnTooltipShow(this, ind, _event) }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n columnTooltipHide(_ind: any, _event: any) { return gridRender.columnTooltipHide(this, _ind, _event) }\n\n getRecordsHTML() { return gridRender.getRecordsHTML(this) }\n\n getSummaryHTML() { return gridRender.getSummaryHTML(this) }\n\n // any: targeted-any per typing_policy; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n scroll(event?: Event | any) { return gridRender.scroll(this, event) }\n\n getRecordHTML(ind: number, lineNum: number, summary?: boolean) { return gridRender.getRecordHTML(this, ind, lineNum, summary) }\n\n getLineHTML(lineNum: number): string { return gridRender.getLineHTML(this, lineNum) }\n\n getCellHTML(ind: number, col_ind: number, summary?: boolean, col_span?: number) { return gridRender.getCellHTML(this, ind, col_ind, summary, col_span) }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n clipboardCopy(ind: any, col_ind: any, summary: any) { return gridRender.clipboardCopy(this, ind, col_ind, summary) }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n showBubble(ind: any, col_ind: any, summary: any) { return gridRender.showBubble(this, ind, col_ind, summary) }\n\n // return null or the editable object if the given cell is editable\n // any: return type any — caller narrows by code path; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getCellEditable(ind: number, col_ind: number): any { return gridRender.getCellEditable(this, ind, col_ind) }\n\n // any: return type any — caller narrows by code path; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getCellValue(ind: number, col_ind: number, summary?: boolean, extra?: boolean): any { return gridRender.getCellValue(this, ind, col_ind, summary, extra) }\n\n getFooterHTML() { return gridRender.getFooterHTML(this) }\n\n status(msg?: string) {\n return gridState.status(this, msg)\n }\n\n lock(msg?: string, showSpinner?: boolean) {\n return gridState.lock(this, msg, showSpinner)\n }\n\n unlock(speed?: number) {\n return gridState.unlock(this, speed)\n }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n stateSave(returnOnly: any) {\n return gridState.stateSave(this, returnOnly)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n stateRestore(newState?: any) { // any: state blob is serialized JSON\n return gridState.stateRestore(this, newState)\n }\n\n stateReset() {\n return gridState.stateReset(this)\n }\n\n // any: return type any — caller narrows by code path; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parseField(obj: TsGridRecord | null | undefined, field: string): any {\n return gridState.parseField(this, obj, field)\n }\n\n prepareData() {\n return gridState.prepareData(this)\n }\n\n nextCell(index: number, col_ind: number, editable?: boolean): { index: number; colIndex: number } | null {\n return gridState.nextCell(this, index, col_ind, editable)\n }\n\n prevCell(index: number, col_ind: number, editable?: boolean): { index: number; colIndex: number } | null {\n return gridState.prevCell(this, index, col_ind, editable)\n }\n\n nextRow(ind: number, col_ind?: number, numRows?: number): number | null {\n return gridState.nextRow(this, ind, col_ind, numRows)\n }\n\n prevRow(ind: number, col_ind?: number, numRows?: number): number | null {\n return gridState.prevRow(this, ind, col_ind, numRows)\n }\n\n selectionSave() {\n return gridState.selectionSave(this)\n }\n\n selectionRestore(noRefresh?: boolean) {\n return gridState.selectionRestore(this, noRefresh)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n message(options?: any) { // any: message options vary by type (string, object)\n return gridState.message(this, options)\n }\n\n // any: callback parameter — caller signature varies; TsGrid record/cell shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n confirm(options: any) {\n return gridState.confirm(this, options)\n }\n}\n\nexport { TsGrid }\n"],"mappings":"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","names":["query","query","i","ret","search","tmp","event","edata","resolve","reject","sort","query","tmp","select","unselect","sel","query","TsTooltip","event","index","column","value","input","expand","recid","styles","val","query","TsMenu","TsTooltip","search","tmp","event","edata","fld","parent","item","ind","query","TsMenu","event","col","el","style","cellSel","focus","key","tmp","prevCell","nextCell","ind","rec","paste","query","TsMenu","TsTooltip","remove","add","search","event","scroll","grid","html1","html2","className","title","s","query","remove","search","resolve","event","ind","recid","tmp","edata"]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}