optikos 0.4.0 → 0.5.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 (221) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/build.js +2 -0
  3. package/dist/build.js.map +7 -0
  4. package/dist/chunk-2CVMT3IW.js +3 -0
  5. package/dist/chunk-2CVMT3IW.js.map +7 -0
  6. package/dist/{chunk-JSEI44A7.js → chunk-2I4Y7I7C.js} +2 -2
  7. package/dist/{chunk-U5L76VVB.js → chunk-2I7HDIOU.js} +2 -2
  8. package/dist/{chunk-FCJI2JF7.js → chunk-34KVSA2V.js} +2 -2
  9. package/dist/{chunk-NQV4THNE.js → chunk-37PYJAA2.js} +2 -2
  10. package/dist/{chunk-JJLOUMCJ.js → chunk-3OA3P37P.js} +2 -2
  11. package/dist/chunk-5G5PHOZJ.js +2 -0
  12. package/dist/chunk-5G5PHOZJ.js.map +7 -0
  13. package/dist/{chunk-S2CMWKVB.js → chunk-5GCTM37D.js} +2 -2
  14. package/dist/chunk-632LUU52.js +2 -0
  15. package/dist/chunk-632LUU52.js.map +7 -0
  16. package/dist/{chunk-RG6SHPHF.js → chunk-6NP4AEV4.js} +2 -2
  17. package/dist/{chunk-6LJK4QWF.js → chunk-6PPRYSLN.js} +2 -2
  18. package/dist/{chunk-NNR2FNHG.js → chunk-6TZJO2G2.js} +2 -2
  19. package/dist/{chunk-DWTDNKXX.js → chunk-A36JFIA3.js} +2 -2
  20. package/dist/{chunk-CFGCB37K.js → chunk-ADHKL2GM.js} +2 -2
  21. package/dist/{chunk-CMV3F6HR.js → chunk-AJN66F32.js} +2 -2
  22. package/dist/{chunk-DWA45BWR.js → chunk-BRGT4O6Q.js} +2 -2
  23. package/dist/{chunk-643FOYQB.js → chunk-BTGJ3MP4.js} +2 -2
  24. package/dist/{chunk-AT7VFZRB.js → chunk-CXZKCBQE.js} +2 -2
  25. package/dist/{chunk-PMOXLQ72.js → chunk-DLRGB5NY.js} +2 -2
  26. package/dist/chunk-DY3ZYMXD.js +2 -0
  27. package/dist/chunk-DY3ZYMXD.js.map +7 -0
  28. package/dist/{chunk-M7FNPRV4.js → chunk-EO777UIN.js} +2 -2
  29. package/dist/{chunk-HLS5FI55.js → chunk-ESRS5ZQV.js} +2 -2
  30. package/dist/{chunk-YDX2PCVL.js → chunk-FNZI6MFG.js} +2 -2
  31. package/dist/{chunk-6PZPBPAD.js → chunk-FSR6BDVO.js} +2 -2
  32. package/dist/{chunk-ZSPJZ3ZH.js → chunk-G26R2F3W.js} +2 -2
  33. package/dist/chunk-GLAY4RJF.js +2 -0
  34. package/dist/chunk-GLAY4RJF.js.map +7 -0
  35. package/dist/{chunk-SWCB2GMN.js → chunk-GNKVLJ5H.js} +2 -2
  36. package/dist/chunk-IODSL7KU.js +2 -0
  37. package/dist/chunk-IODSL7KU.js.map +7 -0
  38. package/dist/{chunk-EXIADWI7.js → chunk-J2TCHWYD.js} +2 -2
  39. package/dist/{chunk-IUOEPAWG.js → chunk-J5BZAKC6.js} +2 -2
  40. package/dist/{chunk-5BMG5ZBY.js → chunk-JBOKM5YA.js} +2 -2
  41. package/dist/{chunk-N2LS4JD6.js → chunk-L6DOWGBO.js} +2 -2
  42. package/dist/{chunk-2YRQULDC.js → chunk-LHWY6G6Q.js} +2 -2
  43. package/dist/chunk-LLHDEUIA.js +2 -0
  44. package/dist/chunk-LLHDEUIA.js.map +7 -0
  45. package/dist/chunk-LXWCTCZV.js +2 -0
  46. package/dist/chunk-LXWCTCZV.js.map +7 -0
  47. package/dist/{chunk-FPU53CCV.js → chunk-M7HLHGQV.js} +2 -2
  48. package/dist/{chunk-J5QPFJ7M.js → chunk-MGSCSS7X.js} +2 -2
  49. package/dist/{chunk-NJ5IFOPR.js → chunk-MM2OC66E.js} +2 -2
  50. package/dist/{chunk-MNSDGJKA.js → chunk-MQEALOU3.js} +2 -2
  51. package/dist/{chunk-TQPQ4UEA.js → chunk-NAUSRVB6.js} +2 -2
  52. package/dist/{chunk-JLKIHXZP.js → chunk-NEVDHDJ4.js} +2 -2
  53. package/dist/{chunk-F4HZUAKM.js → chunk-NWHH3CYH.js} +2 -2
  54. package/dist/{chunk-3FCIZKIN.js → chunk-OADWLPSF.js} +2 -2
  55. package/dist/{chunk-4AZ44KV4.js → chunk-OB3VIRQR.js} +2 -2
  56. package/dist/{chunk-4CWYF4O7.js → chunk-QOSTS5I3.js} +2 -2
  57. package/dist/{chunk-XR677UYD.js → chunk-QVBDBGS4.js} +2 -2
  58. package/dist/{chunk-GEBAYD6N.js → chunk-RMATRKXV.js} +2 -2
  59. package/dist/{chunk-Z6L55FTN.js → chunk-S3ILIWSW.js} +2 -2
  60. package/dist/{chunk-P4O57S6N.js → chunk-SEUIIPHS.js} +2 -2
  61. package/dist/{chunk-R32HPK7R.js → chunk-T5OGUCY2.js} +2 -2
  62. package/dist/chunk-TMBGEZSD.js +2 -0
  63. package/dist/chunk-TMBGEZSD.js.map +7 -0
  64. package/dist/{chunk-5PWPAN62.js → chunk-TVO3Z2BM.js} +2 -2
  65. package/dist/{chunk-UQRQH2JW.js → chunk-U25QSLAH.js} +2 -2
  66. package/dist/chunk-UCWICDYG.js +2 -0
  67. package/dist/{chunk-YXOKWCYS.js.map → chunk-UCWICDYG.js.map} +4 -4
  68. package/dist/{chunk-C3MWS7P2.js → chunk-UL364TLO.js} +2 -2
  69. package/dist/chunk-UUAGMZD2.js +2 -0
  70. package/dist/chunk-UUAGMZD2.js.map +7 -0
  71. package/dist/chunk-XFDNXSU5.js +2 -0
  72. package/dist/{chunk-XQHATUKN.js.map → chunk-XFDNXSU5.js.map} +3 -3
  73. package/dist/{chunk-XFIREDWO.js → chunk-XNRZJP4E.js} +2 -2
  74. package/dist/{chunk-JE56CJX2.js → chunk-Z6HZY2YG.js} +2 -2
  75. package/dist/{chunk-3QRA3XOA.js → chunk-ZEIE2OCQ.js} +2 -2
  76. package/dist/{chunk-4S3HRFQB.js → chunk-ZLYZFHEN.js} +2 -2
  77. package/dist/components/breadcrumb.js +1 -1
  78. package/dist/components/button.js +1 -1
  79. package/dist/components/chart.js +1 -1
  80. package/dist/components/chat.js +1 -1
  81. package/dist/components/checkbox.js +1 -1
  82. package/dist/components/checkboxgroup.js +1 -1
  83. package/dist/components/codeviewer.js +1 -1
  84. package/dist/components/columntotals.js +2 -0
  85. package/dist/components/columntotals.js.map +7 -0
  86. package/dist/components/combobox.js +1 -1
  87. package/dist/components/dataview.js +1 -1
  88. package/dist/components/datefield.js +1 -1
  89. package/dist/components/daterangefield.js +1 -1
  90. package/dist/components/datetimefield.js +1 -1
  91. package/dist/components/dial.js +1 -1
  92. package/dist/components/dropdown.js +1 -1
  93. package/dist/components/exportbar.js +2 -0
  94. package/dist/components/exportbar.js.map +7 -0
  95. package/dist/components/fieldgroup.js +1 -1
  96. package/dist/components/fieldlist.js +1 -1
  97. package/dist/components/filterbuilder.js +1 -1
  98. package/dist/components/form.js +1 -1
  99. package/dist/components/formactions.js +1 -1
  100. package/dist/components/grid.js +1 -1
  101. package/dist/components/gridexport.js +1 -1
  102. package/dist/components/grouping.js +1 -1
  103. package/dist/components/imagefield.js +1 -1
  104. package/dist/components/inputgroup.js +1 -1
  105. package/dist/components/lookupfield.js +1 -1
  106. package/dist/components/maskfield.js +1 -1
  107. package/dist/components/menu.js +1 -1
  108. package/dist/components/messagebox.js +1 -1
  109. package/dist/components/navmenu.js +1 -1
  110. package/dist/components/numberfield.js +1 -1
  111. package/dist/components/panel.js +1 -1
  112. package/dist/components/pickerfield.js +1 -1
  113. package/dist/components/radiogroup.js +1 -1
  114. package/dist/components/searchgrid.js +1 -1
  115. package/dist/components/secretfield.js +1 -1
  116. package/dist/components/select.js +1 -1
  117. package/dist/components/shortcuts.js +1 -1
  118. package/dist/components/slider.js +1 -1
  119. package/dist/components/stat.js +1 -1
  120. package/dist/components/stepform.js +1 -1
  121. package/dist/components/suggestfield.js +1 -1
  122. package/dist/components/table.js +1 -1
  123. package/dist/components/textarea.js +1 -1
  124. package/dist/components/textfield.js +1 -1
  125. package/dist/components/timeentry.js +2 -0
  126. package/dist/components/timeentry.js.map +7 -0
  127. package/dist/components/timefield.js +1 -1
  128. package/dist/components/timeline.js +1 -1
  129. package/dist/components/toast.js +1 -1
  130. package/dist/components/toggle.js +1 -1
  131. package/dist/components/viewmanager.js +1 -1
  132. package/dist/components/widget.js +1 -1
  133. package/dist/components/window.js +1 -1
  134. package/dist/core.js +1 -1
  135. package/dist/css/columntotals.css +56 -0
  136. package/dist/css/exportbar.css +9 -0
  137. package/dist/css/grid.css +12 -0
  138. package/dist/css/grouping.css +7 -0
  139. package/dist/css/timeentry.css +116 -0
  140. package/dist/css/timeline.css +45 -0
  141. package/dist/data.js +1 -1
  142. package/dist/dev.js +1 -1
  143. package/dist/dev.js.map +2 -2
  144. package/dist/index.js +4 -4
  145. package/dist/index.js.map +1 -1
  146. package/dist/optikos.css +248 -0
  147. package/dist/types/build/build.d.ts +49 -0
  148. package/dist/types/build/index.d.ts +1 -0
  149. package/dist/types/components/columntotals.d.ts +1 -0
  150. package/dist/types/components/data/columntotals/columntotals.d.ts +24 -0
  151. package/dist/types/components/data/exportbar/exportbar.d.ts +24 -0
  152. package/dist/types/components/data/grid/footer.d.ts +6 -0
  153. package/dist/types/components/data/grouping/controls.d.ts +27 -0
  154. package/dist/types/components/data/grouping/grouping.d.ts +15 -3
  155. package/dist/types/components/data/timeentry/timeentry.d.ts +37 -0
  156. package/dist/types/components/data/timeline/timeline.d.ts +3 -0
  157. package/dist/types/components/exportbar.d.ts +1 -0
  158. package/dist/types/components/timeentry.d.ts +1 -0
  159. package/dist/types/data/column.d.ts +4 -2
  160. package/dist/types/index.d.ts +4 -0
  161. package/dist/ui.js +1 -1
  162. package/package.json +5 -1
  163. package/dist/chunk-2HNQ2XRY.js +0 -2
  164. package/dist/chunk-2HNQ2XRY.js.map +0 -7
  165. package/dist/chunk-BJWREA76.js +0 -2
  166. package/dist/chunk-BJWREA76.js.map +0 -7
  167. package/dist/chunk-GFFZTFQH.js +0 -2
  168. package/dist/chunk-GFFZTFQH.js.map +0 -7
  169. package/dist/chunk-SB4ICXBV.js +0 -2
  170. package/dist/chunk-SB4ICXBV.js.map +0 -7
  171. package/dist/chunk-XQHATUKN.js +0 -2
  172. package/dist/chunk-YXOKWCYS.js +0 -2
  173. /package/dist/{chunk-JSEI44A7.js.map → chunk-2I4Y7I7C.js.map} +0 -0
  174. /package/dist/{chunk-U5L76VVB.js.map → chunk-2I7HDIOU.js.map} +0 -0
  175. /package/dist/{chunk-FCJI2JF7.js.map → chunk-34KVSA2V.js.map} +0 -0
  176. /package/dist/{chunk-NQV4THNE.js.map → chunk-37PYJAA2.js.map} +0 -0
  177. /package/dist/{chunk-JJLOUMCJ.js.map → chunk-3OA3P37P.js.map} +0 -0
  178. /package/dist/{chunk-S2CMWKVB.js.map → chunk-5GCTM37D.js.map} +0 -0
  179. /package/dist/{chunk-RG6SHPHF.js.map → chunk-6NP4AEV4.js.map} +0 -0
  180. /package/dist/{chunk-6LJK4QWF.js.map → chunk-6PPRYSLN.js.map} +0 -0
  181. /package/dist/{chunk-NNR2FNHG.js.map → chunk-6TZJO2G2.js.map} +0 -0
  182. /package/dist/{chunk-DWTDNKXX.js.map → chunk-A36JFIA3.js.map} +0 -0
  183. /package/dist/{chunk-CFGCB37K.js.map → chunk-ADHKL2GM.js.map} +0 -0
  184. /package/dist/{chunk-CMV3F6HR.js.map → chunk-AJN66F32.js.map} +0 -0
  185. /package/dist/{chunk-DWA45BWR.js.map → chunk-BRGT4O6Q.js.map} +0 -0
  186. /package/dist/{chunk-643FOYQB.js.map → chunk-BTGJ3MP4.js.map} +0 -0
  187. /package/dist/{chunk-AT7VFZRB.js.map → chunk-CXZKCBQE.js.map} +0 -0
  188. /package/dist/{chunk-PMOXLQ72.js.map → chunk-DLRGB5NY.js.map} +0 -0
  189. /package/dist/{chunk-M7FNPRV4.js.map → chunk-EO777UIN.js.map} +0 -0
  190. /package/dist/{chunk-HLS5FI55.js.map → chunk-ESRS5ZQV.js.map} +0 -0
  191. /package/dist/{chunk-YDX2PCVL.js.map → chunk-FNZI6MFG.js.map} +0 -0
  192. /package/dist/{chunk-6PZPBPAD.js.map → chunk-FSR6BDVO.js.map} +0 -0
  193. /package/dist/{chunk-ZSPJZ3ZH.js.map → chunk-G26R2F3W.js.map} +0 -0
  194. /package/dist/{chunk-SWCB2GMN.js.map → chunk-GNKVLJ5H.js.map} +0 -0
  195. /package/dist/{chunk-EXIADWI7.js.map → chunk-J2TCHWYD.js.map} +0 -0
  196. /package/dist/{chunk-IUOEPAWG.js.map → chunk-J5BZAKC6.js.map} +0 -0
  197. /package/dist/{chunk-5BMG5ZBY.js.map → chunk-JBOKM5YA.js.map} +0 -0
  198. /package/dist/{chunk-N2LS4JD6.js.map → chunk-L6DOWGBO.js.map} +0 -0
  199. /package/dist/{chunk-2YRQULDC.js.map → chunk-LHWY6G6Q.js.map} +0 -0
  200. /package/dist/{chunk-FPU53CCV.js.map → chunk-M7HLHGQV.js.map} +0 -0
  201. /package/dist/{chunk-J5QPFJ7M.js.map → chunk-MGSCSS7X.js.map} +0 -0
  202. /package/dist/{chunk-NJ5IFOPR.js.map → chunk-MM2OC66E.js.map} +0 -0
  203. /package/dist/{chunk-MNSDGJKA.js.map → chunk-MQEALOU3.js.map} +0 -0
  204. /package/dist/{chunk-TQPQ4UEA.js.map → chunk-NAUSRVB6.js.map} +0 -0
  205. /package/dist/{chunk-JLKIHXZP.js.map → chunk-NEVDHDJ4.js.map} +0 -0
  206. /package/dist/{chunk-F4HZUAKM.js.map → chunk-NWHH3CYH.js.map} +0 -0
  207. /package/dist/{chunk-3FCIZKIN.js.map → chunk-OADWLPSF.js.map} +0 -0
  208. /package/dist/{chunk-4AZ44KV4.js.map → chunk-OB3VIRQR.js.map} +0 -0
  209. /package/dist/{chunk-4CWYF4O7.js.map → chunk-QOSTS5I3.js.map} +0 -0
  210. /package/dist/{chunk-XR677UYD.js.map → chunk-QVBDBGS4.js.map} +0 -0
  211. /package/dist/{chunk-GEBAYD6N.js.map → chunk-RMATRKXV.js.map} +0 -0
  212. /package/dist/{chunk-Z6L55FTN.js.map → chunk-S3ILIWSW.js.map} +0 -0
  213. /package/dist/{chunk-P4O57S6N.js.map → chunk-SEUIIPHS.js.map} +0 -0
  214. /package/dist/{chunk-R32HPK7R.js.map → chunk-T5OGUCY2.js.map} +0 -0
  215. /package/dist/{chunk-5PWPAN62.js.map → chunk-TVO3Z2BM.js.map} +0 -0
  216. /package/dist/{chunk-UQRQH2JW.js.map → chunk-U25QSLAH.js.map} +0 -0
  217. /package/dist/{chunk-C3MWS7P2.js.map → chunk-UL364TLO.js.map} +0 -0
  218. /package/dist/{chunk-XFIREDWO.js.map → chunk-XNRZJP4E.js.map} +0 -0
  219. /package/dist/{chunk-JE56CJX2.js.map → chunk-Z6HZY2YG.js.map} +0 -0
  220. /package/dist/{chunk-3QRA3XOA.js.map → chunk-ZEIE2OCQ.js.map} +0 -0
  221. /package/dist/{chunk-4S3HRFQB.js.map → chunk-ZLYZFHEN.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/data/grouping/grouping.ts"],
4
- "sourcesContent": ["// Row grouping with totals for the Grid, as a plugin: `plugins: [grouping({ field: 'event' })]`.\nimport { format } from '../../../data/format';\nimport type { Model } from '../../../data/model';\nimport type { Column } from '../../../data/column';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { iconEl } from '../../base/icon/icon';\nimport type { Grid, GridPlugin, RowEntry } from '../grid/grid';\n\naddMessages('en', { groupTotal: 'Total', groupCount: '{n}', groupToggle: 'Toggle group' });\naddMessages('pt-BR', { groupTotal: 'Total', groupCount: '{n}', groupToggle: 'Alternar grupo' });\n\nexport interface GroupingOptions {\n /** Record field to group by. */\n field?: string;\n /** Or any function of the record (a year, a range): its result is the group. */\n by?: (rec: Model) => unknown;\n /** Text of a group header (before the count). Default: the key. */\n label?: (key: unknown, recs: Model[]) => string;\n /** Total rows of the columns that have a `summary`: `group` (under each group), `grand` (at the end) or `both`. Default `group`. */\n summary?: 'group' | 'grand' | 'both';\n /** Start with every group closed. */\n collapsed?: boolean;\n}\n\nexport interface Grouping extends GridPlugin {\n expandAll(): void;\n collapseAll(): void;\n /** Changes what to group by; `null` shows the plain list. */\n setGroupBy(by: string | ((rec: Model) => unknown) | null): void;\n /** Opens or closes one group by its key. */\n toggle(key: unknown, open?: boolean): void;\n}\n\nconst num = (v: unknown) => (typeof v === 'number' ? v : Number(v));\n\n/** The value of a column's `summary` over some records. */\nexport function summarize(col: Column, recs: Model[]): unknown {\n const values = recs.map((r) => r.data[col.field]);\n const nums = values.filter((v) => v != null && v !== '' && !isNaN(num(v))).map(num);\n const s = col.summary;\n if (typeof s === 'function') return s(values, recs);\n if (s === 'count') return values.filter((v) => v != null && v !== '').length;\n if (!nums.length) return null;\n if (s === 'sum') return nums.reduce((a, b) => a + b, 0);\n if (s === 'avg') return nums.reduce((a, b) => a + b, 0) / nums.length;\n return s === 'min' ? Math.min(...nums) : Math.max(...nums);\n}\n\n/**\n * Groups the rows of the current page (a remote store groups what it loaded, not the whole set) under a header with\n * its count; the header toggles by click, Enter/Space, \u2192 and \u2190. Sorting works inside each group. Group headers and total\n * rows are virtual rows like any other. Fires `group-toggle(key, open)` on the grid.\n */\nexport function grouping(options: GroupingOptions = {}): Grouping {\n let grid!: Grid;\n let by = options.by ?? (options.field ? (r: Model) => r.data[options.field!] : undefined);\n const closed = new Set<string>();\n let all = !!options.collapsed;\n let keys: unknown[] = [];\n let off: Array<() => void> = [];\n\n const where = options.summary ?? 'group';\n\n /** The cells of the user columns in a row (the checkbox and action cells are not). */\n const userCells = (cells: HTMLElement[]) => cells.filter((c) => !c.classList.contains('op-grid__selcell') && !c.classList.contains('op-grid__actcell'));\n\n function totals(label: string, recs: Model[], cls: string): RowEntry {\n return {\n cls: `op-grid__row--total ${cls}`,\n paint(cells, row) {\n row.setAttribute('aria-label', label);\n const cols = grid.getColumns();\n userCells(cells).forEach((cell, n) => {\n const col = cols[n];\n if (!col) return;\n const out = col.summary ? ((v) => (col.summaryRenderer ? col.summaryRenderer(v, col) : v == null ? '' : col.format ? format(col.format, v) : String(v)))(summarize(col, recs)) : n === 0 ? label : '';\n cell.replaceChildren(out);\n cell.classList.toggle('op-grid__cell--right', col.align === 'right');\n });\n },\n };\n }\n\n function build() {\n const store = grid.getStore();\n const recs = store.getRange();\n if (!by) return grid.setRowLayout(undefined);\n const groups = new Map<unknown, Model[]>();\n for (const r of recs) {\n const k = by(r);\n groups.set(k, [...(groups.get(k) ?? []), r]);\n }\n keys = [...groups.keys()];\n if (all) {\n for (const k of keys) closed.add(String(k));\n all = false;\n }\n const rows: RowEntry[] = [];\n const hasSummary = grid.getColumns().some((c) => c.summary);\n for (const [key, list] of groups) {\n const open = !closed.has(String(key));\n rows.push({\n level: 1,\n expanded: open,\n cls: 'op-grid__row--group',\n paint(cells, row) {\n const [label] = userCells(cells);\n label.classList.add('is-group-label');\n label.replaceChildren(\n h('span', 'op-grid__twist', { 'aria-hidden': 'true' }, iconEl('chevron-down')),\n h('span', 'op-grid__group-name', {}, options.label ? options.label(key, list) : String(key ?? '\u2014')),\n h('span', 'op-grid__group-count', {}, t('groupCount', { n: list.length })),\n );\n row.dataset.group = String(key);\n },\n });\n if (!open) continue;\n for (const rec of list) rows.push({ rec, level: 2, cls: 'is-grouped' });\n if (hasSummary && where !== 'grand') rows.push(totals(t('groupTotal'), list, 'is-group-total'));\n }\n if (hasSummary && where !== 'group') rows.push(totals(t('groupTotal'), recs, 'is-grand-total'));\n grid.setRowLayout(rows);\n }\n\n function toggle(key: unknown, open?: boolean) {\n const id = String(key);\n const to = open ?? closed.has(id);\n if (to === !closed.has(id)) return;\n if (to) closed.delete(id);\n else closed.add(id);\n build();\n grid.emit('group-toggle', key, to);\n }\n\n const keyOfRow = (el: Element | null) => {\n const row = el?.closest<HTMLElement>('.op-grid__row--group');\n return row ? keys.find((k) => String(k) === row.dataset.group) : undefined;\n };\n\n return {\n init(g) {\n grid = g;\n const el = g.el;\n const table = el.querySelector<HTMLElement>('[role=grid]')!;\n const onClick = (e: Event) => {\n const k = keyOfRow(e.target as Element);\n if (k !== undefined || (e.target as Element).closest('.op-grid__row--group')) toggle(k);\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.target !== table) return;\n const active = grid.getRowEntry(grid.getActive());\n if (!active || active.rec || active.level !== 1) return;\n const k = keyOfRow(document.getElementById(`${grid.id}-r${grid.getActive()}`));\n const open = active.expanded;\n if (e.key === 'Enter' || e.key === ' ') toggle(k);\n else if (e.key === 'ArrowRight' && !open) toggle(k, true);\n else if (e.key === 'ArrowLeft' && open) toggle(k, false);\n else return;\n e.preventDefault();\n e.stopPropagation();\n };\n el.addEventListener('click', onClick);\n el.addEventListener('keydown', onKey, true);\n off = [store(g), () => el.removeEventListener('click', onClick), () => el.removeEventListener('keydown', onKey, true), () => grid.setRowLayout(undefined)];\n build();\n return () => off.forEach((f) => f());\n },\n expandAll() {\n closed.clear();\n build();\n },\n collapseAll() {\n for (const k of keys) closed.add(String(k));\n build();\n },\n toggle,\n setGroupBy(next) {\n by = next === null ? undefined : typeof next === 'string' ? (r: Model) => r.data[next] : next;\n closed.clear();\n build();\n },\n };\n\n function store(g: Grid) {\n return g.getStore().subscribe((c) => queueMicrotask(() => !g.destroyed && build()));\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["addMessages", "num", "v", "summarize", "col", "recs", "values", "nums", "s", "a", "b", "grouping", "options", "grid", "by", "r", "closed", "all", "keys", "off", "where", "userCells", "cells", "c", "totals", "label", "cls", "row", "cols", "cell", "n", "out", "format", "build", "groups", "k", "rows", "hasSummary", "key", "list", "open", "iconEl", "t", "rec", "toggle", "id", "to", "keyOfRow", "el", "g", "table", "onClick", "e", "onKey", "active", "store", "f", "next"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as z}from"./chunk-BCVOUMJJ.js";import{a as G}from"./chunk-MNSDGJKA.js";import{a as $}from"./chunk-RG6SHPHF.js";import{a as R}from"./chunk-2YRQULDC.js";import{a as b}from"./chunk-HLS5FI55.js";import{c as C}from"./chunk-DIOJGTUN.js";import{a as x,b as L}from"./chunk-OWEQT2HN.js";import{a as _}from"./chunk-TIPK3SCJ.js";import{a as H}from"./chunk-2HNQ2XRY.js";import{c as A}from"./chunk-L5SQQFO7.js";import{c as S,e as E,f as T}from"./chunk-UDXO3KM3.js";import{b as d}from"./chunk-PZSHOSOS.js";import{e as w,f as g}from"./chunk-S4QD5NID.js";w("en",{gridSelected:"{n} selected",gridSelectAll:"Select all {n}",gridClearSel:"Clear selection",gridSelectRow:"Select row",gridSelectPage:"Select all rows",gridRowActions:"Row actions",gridColumns:"Columns",gridResize:"Resize column",gridGroupAll:"All",gridOtherCols:"Other",gridGroups:"Column groups",gridColumnSearch:"Search columns",gridNoColumns:"No matching columns"});w("pt-BR",{gridSelected:"{n} selecionado(s)",gridSelectAll:"Selecionar todos os {n}",gridClearSel:"Limpar sele\xE7\xE3o",gridSelectRow:"Selecionar linha",gridSelectPage:"Selecionar todas as linhas",gridRowActions:"A\xE7\xF5es da linha",gridColumns:"Colunas",gridResize:"Redimensionar coluna",gridGroupAll:"Todas",gridOtherCols:"Outras",gridGroups:"Grupos de colunas",gridColumnSearch:"Buscar colunas",gridNoColumns:"Nenhuma coluna encontrada"});var v="__select",m="__actions",K={field:v,width:44,align:"center",cls:"op-grid__selcell",locked:"start"},P={field:m,width:44,align:"center",cls:"op-grid__actcell",locked:"end"},B="var(--op-grid-row-height, var(--op-row-height))",k=class extends T{baseCls="op-grid";store;offStore;headEl;headRow;viewport;emptyEl;table;pager;v;entries;lockEdge=[-1,-1];selected=new Set;active=-1;anchor=-1;justDragged=!1;cv=0;selAll;barEl;bulkEl;bulkCount;bulkBtns=[];selectAllBtn;rowMenu;colDd;colList;colSearch;colChips;colGroup="";cols(){let e=this.config;return[...e.checkboxSelection?[K]:[],...this.userCols(),...e.rowActions?.length?[P]:[]]}userCols(){let e=(this.config.columns??[]).filter(t=>!t.hidden);return[...e.filter(t=>t.locked==="start"),...e.filter(t=>!t.locked),...e.filter(t=>t.locked==="end")]}visibleActions(){return this.config.rowActionsMode==="visible"&&!!this.config.rowActions?.length}mode(){return this.config.checkboxSelection?"multi":this.config.selection??"single"}build(){let e=this.config;e.rowActions=E(e.rowActions),e.bulkActions=E(e.bulkActions),e.columns=e.columns.filter(i=>S(i.permission));let t=d("div",this.baseCls);return this.headRow=d("div","op-grid__row op-grid__header-row",{role:"row"}),this.headEl=d("div","op-grid__header",{},this.headRow),this.viewport=d("div","op-grid__viewport"),this.emptyEl=d("div","op-grid__empty"),(e.columnMenu||e.bulkActions?.length)&&(this.bulkEl=d("div","op-grid__bulk"),this.bulkEl.hidden=!0,this.barEl=d("div","op-grid__bar",{},this.bulkEl),t.append(this.barEl)),this.table=d("div","op-grid__table",{role:"grid",tabindex:0,"aria-multiselectable":e.selection==="multi"||e.checkboxSelection?"true":null},this.headEl,this.viewport,this.emptyEl),t.append(this.table),t.classList.toggle("op-grid--striped",!!e.striped),e.paging&&(this.pager=new z({cls:"op-grid__pager"}),t.append(this.pager.el)),t}onRender(){let e=this.config;if(this.bindStore(e.store??new A({data:e.data??[]})),this.buildHeader(),this.buildBar(),this.v=x({scroller:this.viewport,count:this.count(),rowHeight:e.rowHeight??(L(this.el,B)||36),render:(t,i)=>this.renderRow(t,i),rowCls:"op-grid__row op-grid__body-row"}),this.own(()=>this.v.destroy()),this.sync(),this.listen(this.viewport,"scroll",()=>this.onScrollX(),{passive:!0}),this.listen(this.viewport,"click",t=>this.onRowEvent(t,"row-click")),this.listen(this.viewport,"dblclick",t=>this.onRowEvent(t,"row-dblclick")),this.listen(this.el,"keydown",t=>this.onKey(t)),this.listen(this.headRow,"change",t=>{t.target===this.selAll&&(this.selAll.checked?this.store.each(i=>this.selected.add(i)):this.config.keepSelection?this.store.each(i=>this.selected.delete(i)):this.selected.clear(),this.changed())}),e.reorderableColumns&&this.initColumnDrag(),e.resizableColumns&&this.initColumnResize(),this.listen(this.headRow,"click",t=>{if(this.justDragged||t.target.closest(".op-grid__resizer"))return;let i=t.target.closest("[data-field]"),s=i&&this.userCols().find(r=>r.field===i.dataset.field);s&&(this.emit("column-click",s),s.sortable&&this.sortBy(s))}),typeof ResizeObserver<"u"){let t=new ResizeObserver(()=>this.layout());t.observe(this.viewport),this.own(()=>t.disconnect())}this.pager&&(this.pager.setStore(this.store),this.store.pageSize||this.store.setPageSize(e.pageSize??20)),this.own(()=>this.pager?.destroy());for(let t of e.plugins??[]){let i=t.init(this);i&&this.own(i),t.destroy&&this.own(()=>t.destroy())}}cellAt(e){let t=e?.closest?.(".op-grid__body-row .op-grid__cell"),i=Number(t?.parentElement?.dataset.i),s=t&&this.cols()[Number(t.getAttribute("aria-colindex"))-1],r=t&&this.recAt(i);return s&&r&&![v,m].includes(s.field)?{index:i,record:r,column:s,el:t}:void 0}getCell(e,t){let i=this.cols().findIndex(s=>s.field===t);return document.getElementById(`${this.id}-r${e}`)?.querySelector(`[aria-colindex="${i+1}"]`)??void 0}getColumns(){return this.userCols()}getActive(){return this.active}notifyMount(){super.notifyMount(),this.layout(),this.pager?.notifyMount()}onScrollX(){let e=this.viewport,t=Math.max(0,e.scrollWidth-e.clientWidth-e.scrollLeft);this.headEl.scrollLeft=e.scrollLeft,this.el.style.setProperty("--op-grid-scroll-x",`${e.scrollLeft}px`),this.el.style.setProperty("--op-grid-scroll-end",`${t}px`),this.el.classList.toggle("is-scrolled-start",e.scrollLeft>0),this.el.classList.toggle("is-scrolled-end",t>0)}layout(){if(this.rendered){if(!this.config.rowHeight){let e=L(this.el,B);e&&this.v.setRowHeight(e)}this.headEl.style.paddingInlineEnd=`${this.viewport.offsetWidth-this.viewport.clientWidth}px`,this.v.refresh(),this.onScrollX()}}bindStore(e){this.offStore?.(),this.store=e;let t=e.subscribe(s=>{this.rendered&&(this.sync(),s.type==="sort"&&this.paintSort())}),i=e.on("loading",s=>this.setLoading(s));this.offStore=()=>(t(),i()),this.own(()=>this.offStore?.())}sync(){let e=this.selected.size;if(!this.config.keepSelection)for(let t of this.selected)this.store.indexOf(t)<0&&this.selected.delete(t);this.active=Math.min(this.active,this.count()-1),this.v.setCount(this.count()),this.table.setAttribute("aria-rowcount",String(this.store.totalCount+1)),this.emptyEl.textContent=this.config.emptyText??g("empty"),this.emptyEl.hidden=this.count()>0||!!this.config.loading,this.el.classList.toggle("is-empty",this.count()===0),this.updateActiveDescendant(),this.paintSelection(),this.selected.size!==e&&this.emit("select",this.getSelection())}setStore(e){this.config.store=e,this.selected.clear(),this.active=this.anchor=-1,this.rendered&&(this.bindStore(e),this.pager?.setStore(e),this.paintSort(),this.sync())}getStore(){return this.render(),this.store}count(){return this.entries?this.entries.length:this.store.count}recAt(e){return this.entries?this.entries[e]?.rec:this.store.getAt(e)}setRowLayout(e){this.entries=e,this.rendered&&this.sync()}getRowEntry(e){return this.entries?this.entries[e]:(t=>t&&{rec:t})(this.store.getAt(e))}getRowCount(){return this.count()}layoutColumns(){let e=this.cols(),t=this.visibleActions()?this.config.rowActions.length:1,i=n=>n.field===m?`calc(${t} * var(--op-grid-action-size) + ${t+1} * var(--op-grid-action-gap))`:`${n.width}px`,s=n=>n.field===m?i(n):`${n.width??140}px`,r=e.map(n=>n.locked?s(n):n.width?`${n.width}px`:`minmax(${n.minWidth??96}px, ${n.flex??1}fr)`).join(" "),o=n=>n.reduce((c,[a,h])=>(this.el.style.setProperty(`--op-grid-lock-${a}`,c.length?`calc(${c.join(" + ")})`:"0px"),[...c,s(h)]),[]),l=e.map((n,c)=>[c,n]);o(l.filter(([,n])=>n.locked==="start")),o(l.filter(([,n])=>n.locked==="end").reverse()),this.lockEdge=[e.map(n=>n.locked).lastIndexOf("start"),e.findIndex(n=>n.locked==="end")],this.el.style.setProperty("--op-grid-cols",r),this.el.style.setProperty("--op-grid-min-width",`${e.reduce((n,c)=>n+(c.field===m?t*36:c.width??(c.locked?140:c.minWidth??96)),0)}px`)}lock(e,t,i){t.locked&&(e.classList.add("is-locked",`is-locked-${t.locked}`),e.classList.toggle("is-lock-edge",this.lockEdge[t.locked==="start"?0:1]===i),e.style.setProperty("--_lock",`var(--op-grid-lock-${i})`))}buildHeader(){let e=this.cols();this.layoutColumns(),this.el.classList.toggle("op-grid--actions-visible",this.visibleActions()),this.el.classList.toggle("op-grid--reorderable",!!this.config.reorderableColumns),this.el.classList.toggle("op-grid--resizable",!!this.config.resizableColumns),this.table.setAttribute("aria-colcount",String(e.length)),this.selAll=void 0,this.headRow.replaceChildren(...e.map((i,s)=>{let r=i.header??i.field,o=d("div",`op-grid__cell op-grid__hcell${i.align?` op-grid__cell--${i.align}`:""}${i.sortable?" is-sortable":""}`,{role:"columnheader","aria-colindex":s+1,"data-field":i.field});this.lock(o,i,s),i.field===v?o.append(this.selAll=d("input","op-grid__check",{type:"checkbox","aria-label":g("gridSelectPage")})):i.field===m?o.append(d("span","op-sr-only",{},g("gridRowActions"))):i.sortable?o.append(d("button","op-grid__sort",{type:"button"},d("span","op-grid__label",{},r),d("span","op-grid__arrow",{"aria-hidden":"true"},C("arrow-up")))):o.append(d("span","op-grid__label",{},r));let l=i.field!==v&&i.field!==m;return this.config.reorderableColumns&&l&&o.classList.add("is-reorderable"),this.canResize(i)&&o.append(d("span","op-grid__resizer",{role:"separator","aria-orientation":"vertical","aria-label":`${g("gridResize")} ${r}`})),l&&!i.sortable&&(this.config.reorderableColumns||this.canResize(i))&&(o.tabIndex=0),o}));let t=this.groupBand(e);this.headEl.replaceChildren(...t?[t]:[],this.headRow),this.paintSort()}groupBand(e){if(this.config.groupHeaders===!1||!e.some(s=>s.group))return null;let t=[],i=0;for(;i<e.length;){let s=e[i].group??"",r=1;for(;i+r<e.length&&(e[i+r].group??"")===s;)r++;let o=d("div",`op-grid__gcell${s?"":" is-empty"}`,{role:"columnheader","aria-colindex":i+1,"aria-colspan":r},s);o.style.gridColumn=`span ${r}`,t.push(o),i+=r}return d("div","op-grid__row op-grid__group-row",{role:"row"},...t)}getColumnGroups(){return[...new Set(this.config.columns.map(e=>e.group).filter(e=>!!e))]}setColumnGroupVisible(e,t){let i=this.config.columns.filter(s=>(s.group??"")===e);if(i.length){for(let s of i)s.hidden=!t;this.config.columns.some(s=>!s.hidden)||(i[0].hidden=!1),this.setColumns(this.config.columns),this.emit("columns-change",this.getColumnState())}}setColumnLocked(e,t){let i=this.config.columns.find(s=>s.field===e);!i||i.locked===(t??void 0)||(this.setColumns(this.config.columns.map(s=>s===i?{...s,locked:t??void 0}:s)),this.emit("columns-change",this.getColumnState()))}setColumns(e){this.config.columns=e,this.rendered&&(this.cv++,this.buildHeader(),this.paintSelection(),this.v.refresh())}getColumnState(){return this.config.columns.map(e=>({field:e.field,hidden:!!e.hidden,width:e.width,locked:e.locked}))}setColumnState(e){let t=new Map(this.config.columns.map(s=>[s.field,s])),i=e.flatMap(s=>{let r=t.get(s.field);return t.delete(s.field),r?[{...r,hidden:s.hidden,width:s.width??r.width,locked:"locked"in s?s.locked:r.locked}]:[]});this.setColumns([...i,...t.values()]),this.emit("columns-change",this.getColumnState())}canResize(e){return!!this.config.resizableColumns&&e.field!==v&&e.field!==m&&e.resizable!==!1}setColumnWidth(e,t){let i=this.config.columns.find(s=>s.field===e);i&&(i.width=t==null?void 0:Math.round(Math.max(i.minWidth??48,Math.min(t,i.maxWidth??1/0))),this.layoutColumns(),this.emit("column-resize",e,i.width),this.emit("columns-change",this.getColumnState()))}initColumnResize(){let e=this.headRow;this.listen(e,"pointerdown",t=>{let i=t.target.closest(".op-grid__resizer");if(!i||t.button)return;t.preventDefault();let s=i.parentElement,r=s.dataset.field,o=this.config.columns.find(u=>u.field===r),l=t.clientX,n=s.getBoundingClientRect().width||o.width||96;this.el.classList.add("is-resizing");let c=o.width,a=u=>{let p=Math.round(Math.max(o.minWidth??48,Math.min(n+(u.clientX-l)*(this.dir()==="rtl"?-1:1),o.maxWidth??1/0)));o.width=c=p,this.layoutColumns()},h=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",h),this.el.classList.remove("is-resizing"),this.justDragged=!0,setTimeout(()=>this.justDragged=!1),c!==void 0&&(this.emit("column-resize",r,c),this.emit("columns-change",this.getColumnState()))};document.addEventListener("pointermove",a),document.addEventListener("pointerup",h),this.own(()=>(document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",h)))}),this.listen(e,"dblclick",t=>{let i=t.target.closest(".op-grid__resizer");i&&this.setColumnWidth(i.parentElement.dataset.field,void 0)}),this.listen(e,"keydown",t=>{if(!(t.altKey&&t.shiftKey)||t.key!=="ArrowLeft"&&t.key!=="ArrowRight")return;let i=t.target.closest(".op-grid__hcell"),s=i&&this.config.columns.find(o=>o.field===i.dataset.field);if(!i||!s||!this.canResize(s))return;t.preventDefault();let r=i.getBoundingClientRect().width||s.width||96;this.setColumnWidth(s.field,r+(t.key==="ArrowRight"?16:-16))})}dir(){return getComputedStyle(this.el).direction}moveColumn(e,t){let i=this.config.columns,s=i.find(h=>h.field===e);if(!s||e===t)return;let r=this.userCols(),o=r.indexOf(s),l=[...i.filter(h=>h!==s)],n=t==null?void 0:l.find(h=>h.field===t),c=r.filter(h=>h!==s).pop(),a=n?l.indexOf(n):c?l.indexOf(c)+1:l.length;l.splice(a,0,s),!l.every((h,u)=>h===i[u])&&(this.setColumns(l),this.emit("column-move",e,o,this.userCols().indexOf(s)),this.emit("columns-change",this.getColumnState()))}initColumnDrag(){let e=this.headRow,t=()=>Array.from(e.querySelectorAll(".is-reorderable"));this.listen(e,"pointerdown",i=>{let s=i.target.closest(".is-reorderable");if(!s||i.button||i.target.closest(".op-grid__resizer"))return;let r=s.dataset.field,o=i.clientX,l,n,c=null,a=u=>{if(!l){if(Math.abs(u.clientX-o)<6)return;l=d("div","op-grid__ghost",{},s.textContent??""),n=d("div","op-grid__drop"),this.el.append(l),this.headEl.append(n),s.classList.add("is-dragging-col")}l.style.left=`${u.clientX}px`,l.style.top=`${u.clientY}px`;let p=t(),f=p.find(O=>{let M=O.getBoundingClientRect();return u.clientX<M.left+M.width/2});c=f?f.dataset.field:null;let y=(f??p[p.length-1])?.getBoundingClientRect(),D=this.headEl.getBoundingClientRect();y&&n&&(n.style.left=`${(f?y.left:y.right)-D.left+this.headEl.scrollLeft}px`)},h=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",h),l&&(l.remove(),n?.remove(),s.classList.remove("is-dragging-col"),this.justDragged=!0,setTimeout(()=>this.justDragged=!1),this.moveColumn(r,c))};document.addEventListener("pointermove",a),document.addEventListener("pointerup",h),this.own(()=>(document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",h)))}),this.listen(e,"keydown",i=>{if(!i.altKey||i.shiftKey||i.key!=="ArrowLeft"&&i.key!=="ArrowRight")return;let s=i.target.closest(".is-reorderable");if(!s)return;i.preventDefault();let r=this.userCols(),o=r.findIndex(c=>c.field===s.dataset.field),l=i.key==="ArrowLeft"?o-1:o+1;if(l<0||l>=r.length)return;this.moveColumn(r[o].field,i.key==="ArrowLeft"?r[l].field:r[l+1]?.field??null);let n=e.querySelector(`[data-field="${CSS.escape(r[o].field)}"]`);(n?.querySelector("button")??n)?.focus()})}paintSort(){let e=this.store.getSorters()[0];for(let t of Array.from(this.headRow.children)){let i=!!e&&t.dataset.field===e.field;t.classList.toggle("is-sorted-asc",i&&e.dir==="asc"),t.classList.toggle("is-sorted-desc",i&&e.dir==="desc"),t.classList.contains("is-sortable")&&t.setAttribute("aria-sort",i?e.dir==="asc"?"ascending":"descending":"none")}}sortBy(e){let t=this.store.getSorters()[0],i=t?.field===e.field?t.dir==="asc"?"desc":null:"asc";this.emit("before-sort",e.field,i)!==!1&&(this.store.sort(i?e.field:null,i??void 0),this.emit("sort",e.field,i))}rowIndexOffset(){return this.store.pageSize?(this.store.page-1)*this.store.pageSize:0}renderRow(e,t){let i=this.getRowEntry(t);if(!i)return;let s=i.rec,r=this.cols();e.id=`${this.id}-r${t}`,e.dataset.i=String(t),e.setAttribute("role","row"),e.setAttribute("aria-rowindex",String(this.rowIndexOffset()+t+2));let o=!!s&&this.selected.has(s);e.dataset.ec&&e.classList.remove(...e.dataset.ec.split(" ")),e.dataset.ec=i.cls??"",i.cls&&e.classList.add(...i.cls.split(" "));for(let[n,c]of[["aria-level",i.level],["aria-expanded",i.expanded]])c==null?e.removeAttribute(n):e.setAttribute(n,String(c));e.setAttribute("aria-selected",this.mode()==="none"||!s?"false":String(o)),e.classList.toggle("is-selected",o),e.classList.toggle("is-active",t===this.active),e.classList.toggle("is-odd",t%2===1),(e.dataset.cv!==String(this.cv)||e.dataset.cn!==String(r.length))&&(e.dataset.cv=String(this.cv),e.dataset.cn=String(r.length),e.replaceChildren(...r.map((n,c)=>{let a=d("div",`op-grid__cell${n.align?` op-grid__cell--${n.align}`:""}${n.cls?` ${n.cls}`:""}`,{role:"gridcell","aria-colindex":c+1});return this.lock(a,n,c),a})));let l=Array.from(e.children).filter(n=>n.classList.contains("op-grid__cell"));if(!s){for(let n of l)n.replaceChildren();return i.paint?.(l,e)}r.forEach((n,c)=>{let a=e.children[c];if(a.classList.contains("is-editing"))return;if(n.field===v){let u=a.firstElementChild??a.appendChild(d("input","op-grid__check",{type:"checkbox",tabindex:-1,"aria-label":g("gridSelectRow")}));u.checked=o;return}if(n.field===m){let u=this.config.rowActions??[];if(!this.visibleActions()){a.firstChild||a.append(d("button","op-grid__actbtn",{type:"button",tabindex:-1,"aria-label":g("gridRowActions"),"aria-haspopup":"menu"},C("more")));return}(a.children.length!==u.length||a.firstElementChild?.dataset.a==null)&&a.replaceChildren(...u.map((p,f)=>d("button",`op-grid__actbtn${p.variant==="danger"?" is-danger":""}`,{type:"button",tabindex:-1,"data-a":f,"aria-label":p.text,title:p.text},p.icon?C(p.icon):p.text))),u.forEach((p,f)=>a.children[f].disabled=!!p.disabled?.(s));return}let h=H(n,s);typeof h=="string"?a.textContent=h:a.replaceChildren(h)}),i.paint?.(l,e)}indexOfEvent(e){let t=e.target.closest(".op-grid__body-row");return t?Number(t.dataset.i):-1}onRowEvent(e,t){let i=this.indexOfEvent(e),s=this.recAt(i);if(s){if(t==="row-click"){let r=e.target.closest(".op-grid__actbtn");if(r){if(r.dataset.a==null)return this.openRowMenu(s,r);r.disabled||this.config.rowActions[Number(r.dataset.a)].handler(s,this);return}this.setActive(i,!1),this.pick(i,e)}this.emit(t,s,i,e)}}getSelection(){return[...this.selected]}select(e,t={}){let i=typeof e=="number"?this.recAt(e):e,s=this.mode();!i||s==="none"||((s==="single"||!t.add)&&this.selected.clear(),this.selected.add(i),this.changed())}deselectAll(){this.selected.size&&(this.selected.clear(),this.changed())}changed(){this.v?.refresh(),this.paintSelection(),this.emit("select",this.getSelection())}selectAllFiltered(){if(this.mode()==="multi"){for(let e of this.store.getFiltered())this.selected.add(e);this.changed()}}pick(e,t){let i=this.mode(),s=this.recAt(e);if(!(!s||i==="none")){if(i==="multi"&&t.shiftKey&&this.anchor>=0){this.config.checkboxSelection||this.selected.clear();for(let r=Math.min(this.anchor,e);r<=Math.max(this.anchor,e);r++){let o=this.recAt(r);o&&this.selected.add(o)}}else i==="multi"&&(t.ctrlKey||t.metaKey||this.config.checkboxSelection)?(this.selected.delete(s)||this.selected.add(s),this.anchor=e):(this.selected.clear(),this.selected.add(s),this.anchor=e);this.changed()}}setActive(e,t=!0){this.active=e,t&&e>=0&&this.v.scrollTo(e),this.v.refresh(),this.updateActiveDescendant()}updateActiveDescendant(){this.active>=0&&this.active<this.count()?this.table.setAttribute("aria-activedescendant",`${this.id}-r${this.active}`):this.table.removeAttribute("aria-activedescendant")}focusRow(e){this.render(),this.setActive(Math.max(0,Math.min(e,this.count()-1))),this.table.focus()}focusEl(){return this.table}scrollToRow(e){this.v?.scrollTo(e)}onKey(e){let t=e.target;if(t.closest(".op-grid__header")||t!==this.table&&t.matches("input:not([type=checkbox]),textarea,select,[contenteditable]"))return;let i=this.count();if(!i)return;if((e.key==="ContextMenu"||e.shiftKey&&e.key==="F10")&&this.active>=0&&this.config.rowActions?.length){e.preventDefault();let n=this.recAt(this.active);return n?this.openRowMenu(n,document.getElementById(`${this.id}-r${this.active}`)??this.el):void 0}let s=Math.max(1,Math.floor((this.viewport.clientHeight||400)/this.config.rowHeight||10)),r=this.active<0?0:this.active,o=this.mode(),l={ArrowDown:Math.min(i-1,this.active<0?0:r+1),ArrowUp:Math.max(0,r-1),Home:0,End:i-1,PageDown:Math.min(i-1,r+s),PageUp:Math.max(0,r-s)};if(e.key in l){e.preventDefault();let n=l[e.key];this.setActive(n),(o==="single"||o==="multi"&&!e.ctrlKey&&!e.metaKey&&!this.config.checkboxSelection)&&this.pick(n,e)}else e.key===" "&&this.active>=0?(e.preventDefault(),o==="multi"?this.pick(this.active,{ctrlKey:!0}):this.pick(this.active,e)):e.key==="Enter"&&this.active>=0?this.emit("row-activate",this.recAt(this.active),this.active):(e.key==="a"||e.key==="A")&&(e.ctrlKey||e.metaKey)&&o==="multi"&&(e.preventDefault(),this.store.each(n=>this.selected.add(n)),this.changed())}refresh(){this.v?.refresh()}buildBar(){let e=this.config;if(!this.barEl)return;this.bulkCount=d("span","op-grid__count",{"aria-live":"polite"}),this.selectAllBtn=new b({text:"",variant:"ghost",handler:()=>this.selectAllFiltered()}),this.bulkBtns=(e.bulkActions??[]).map(i=>new b({text:i.text,icon:i.icon,variant:i.variant==="danger"?"danger":"default",handler:()=>i.handler(this.getSelection(),this)}));let t=new b({text:g("gridClearSel"),variant:"ghost",handler:()=>this.deselectAll()});this.bulkEl.append(this.bulkCount,this.selectAllBtn.el,...this.bulkBtns.map(i=>i.el),t.el),this.own(()=>[this.selectAllBtn,...this.bulkBtns,t].forEach(i=>i?.destroy())),e.columnMenu&&this.buildColumnMenu(),this.paintSelection()}paintSelection(){if(!this.rendered)return;let e=this.store.count,t=0;if(this.store.each(r=>this.selected.has(r)&&t++),this.selAll&&(this.selAll.checked=e>0&&t===e,this.selAll.indeterminate=t>0&&t<e),!this.bulkEl)return;let i=this.selected.size;if(this.bulkEl.hidden=!i||!this.config.bulkActions?.length,this.bulkEl.hidden)return;this.bulkCount.textContent=g("gridSelected",{n:i});let s=this.store.getFiltered().length;this.selectAllBtn.el.hidden=!(this.mode()==="multi"&&t===e&&s>e&&i<s),this.selectAllBtn.setText(g("gridSelectAll",{n:s}))}openRowMenu(e,t){this.rowMenu??=new G({}),this.rowMenu.setItems((this.config.rowActions??[]).map(i=>({text:i.text,icon:i.icon,disabled:!!i.disabled?.(e),handler:()=>i.handler(e,this)}))),this.rowMenu.showBy(t)}buildColumnMenu(){let e=new b({text:g("gridColumns"),icon:"columns",variant:"ghost"});this.colSearch=new R({placeholder:g("gridColumnSearch"),clearable:!0}),this.colChips=d("div","op-grid__colchips",{role:"group","aria-label":g("gridGroups")}),this.colList=d("div","op-grid__collist",{role:"group","aria-label":g("gridColumns")});let t=d("div","op-grid__colempty",{},g("gridNoColumns"));t.hidden=!0;let i=d("div","op-grid__colmenu",{},this.colSearch.el,this.colChips,this.colList,t);this.colDd=new $({anchor:e.el,content:i,placement:"bottom-end",role:"dialog",autoFocus:!1}),this.barEl.append(e.el),this.own(()=>e.destroy());let s=()=>{let r=(this.colSearch.getValue()??"").toLowerCase(),o=0,l,n=0,c=()=>l&&(l.hidden=n===0);for(let a of Array.from(this.colList.children)){if(a.classList.contains("op-grid__colgroup")){c(),l=a,n=0;continue}let h=a.dataset.group??"",u=!this.colGroup||h===this.colGroup,p=!r||h.toLowerCase().includes(r)||a.textContent.toLowerCase().includes(r);a.hidden=!(u&&p),a.hidden||(o++,n++)}c(),t.hidden=o>0};this.colSearch.on("change",s),this.listen(this.colChips,"click",r=>{let o=r.target.closest("[data-g]");o&&(this.colGroup=o.dataset.g,this.paintColumnList(),s())}),e.on("click",()=>{if(this.colDd.isOpen())return this.colDd.close();this.colSearch.setValue(""),this.colGroup="",this.paintColumnList(),this.colDd.open(),this.colList.querySelector("input")?.focus()}),this.listen(this.colList,"change",r=>{let o=r.target;if(o.dataset.groupToggle!=null)this.setColumnGroupVisible(o.dataset.groupToggle,o.checked);else{let l=this.config.columns.find(n=>n.field===o.value);if(!l)return;l.hidden=!o.checked,this.setColumns(this.config.columns),this.emit("columns-change",this.getColumnState())}this.paintColumnList(),s()})}paintColumnList(){let e=this.config.columns,t=this.getColumnGroups(),i=this.userCols().length===1?this.userCols()[0]:null,s=o=>{let l=d("input","op-grid__check",{type:"checkbox",value:o.field});return l.checked=!o.hidden,l.disabled=o===i,d("label","op-grid__colitem",{"data-group":o.group??""},l,d("span","",{},o.header??o.field))};if(this.colChips.hidden=t.length<2,this.colChips.replaceChildren(...[["",g("gridGroupAll")],...t.map(o=>[o,o])].map(([o,l])=>d("button",`op-grid__colchip${this.colGroup===o?" is-on":""}`,{type:"button","data-g":o,"aria-pressed":String(this.colGroup===o)},l))),!t.length)return this.colList.replaceChildren(...e.map(s));let r=[];for(let o of[...t,""]){let l=e.filter(a=>(a.group??"")===o);if(!l.length)continue;let n=l.filter(a=>!a.hidden).length,c=d("input","op-grid__check",{type:"checkbox","data-group-toggle":o,"aria-label":o||g("gridOtherCols")});c.checked=n===l.length,c.indeterminate=n>0&&n<l.length,r.push(d("div","op-grid__colgroup",{"data-group":o},d("label","",{},c,d("span","",{},o||g("gridOtherCols"))),d("span","op-grid__colcount",{},`${n}/${l.length}`)),...l.map(s))}this.colList.replaceChildren(...r)}onDestroy(){this.pager?.destroy(),this.rowMenu?.destroy(),this.colDd?.destroy(),this.colSearch?.destroy()}};_("grid",k);export{k as a};
2
- //# sourceMappingURL=chunk-GFFZTFQH.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/data/grid/grid.ts"],
4
- "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { virtualize, measure } from '../../../core/virtual';\nimport { Store } from '../../../data/store';\nimport type { Model } from '../../../data/model';\nimport { cellContent, type Column } from '../../../data/column';\nimport { allowed, gate } from '../../../core/permission';\nimport { iconEl } from '../../base/icon/icon';\nimport { Pagination } from '../pagination/pagination';\nimport { Button } from '../../base/button/button';\nimport { TextField } from '../../fields/textfield/textfield';\nimport { Dropdown } from '../../overlays/dropdown/dropdown';\nimport { Menu } from '../../overlays/menu/menu';\n\naddMessages('en', {\n gridSelected: '{n} selected',\n gridSelectAll: 'Select all {n}',\n gridClearSel: 'Clear selection',\n gridSelectRow: 'Select row',\n gridSelectPage: 'Select all rows',\n gridRowActions: 'Row actions',\n gridColumns: 'Columns',\n gridResize: 'Resize column',\n gridGroupAll: 'All',\n gridOtherCols: 'Other',\n gridGroups: 'Column groups',\n gridColumnSearch: 'Search columns',\n gridNoColumns: 'No matching columns',\n});\naddMessages('pt-BR', {\n gridSelected: '{n} selecionado(s)',\n gridSelectAll: 'Selecionar todos os {n}',\n gridClearSel: 'Limpar sele\u00E7\u00E3o',\n gridSelectRow: 'Selecionar linha',\n gridSelectPage: 'Selecionar todas as linhas',\n gridRowActions: 'A\u00E7\u00F5es da linha',\n gridColumns: 'Colunas',\n gridResize: 'Redimensionar coluna',\n gridGroupAll: 'Todas',\n gridOtherCols: 'Outras',\n gridGroups: 'Grupos de colunas',\n gridColumnSearch: 'Buscar colunas',\n gridNoColumns: 'Nenhuma coluna encontrada',\n});\n\nexport interface GridConfig<T extends Record<string, any> = any> extends ComponentConfig {\n store?: Store<T>;\n /** Used when no `store` is given. */\n data?: Partial<T>[];\n columns: Column<T>[];\n selection?: 'none' | 'single' | 'multi';\n /** Row height in px. Default: measured from the `--op-grid-row-height` / `--op-row-height` tokens. */\n rowHeight?: number;\n /** Adds a Pagination bar bound to the store (give the store a `pageSize`, or set it here). */\n paging?: boolean;\n pageSize?: number;\n emptyText?: string;\n striped?: boolean;\n /** Adds a leading checkbox column with a select-all in the header. Implies multi selection; a row click toggles. */\n checkboxSelection?: boolean;\n /** Keep selected records when the page or the filters change. Default false. */\n keepSelection?: boolean;\n /** Buttons shown in a bar above the header while records are selected. */\n bulkActions?: GridAction<T>[];\n /** Actions at the end of every row (see `rowActionsMode`). */\n rowActions?: GridRowAction<T>[];\n /** Optional features (`cellEditing()`...). See `GridPlugin`. */\n plugins?: GridPlugin<T>[];\n /** `'menu'` (default): one \"\u22EF\" button opens a menu. `'visible'`: every action is an icon button, always shown (dimmed until the row is hovered, active or selected). */\n rowActionsMode?: 'menu' | 'visible';\n /** A \"Columns\" button in the bar: toggle columns on and off, with search. */\n columnMenu?: boolean;\n /** Drag a header to a new place (or Alt+\u2190/\u2192 on a focused header). `column-move` and `columns-change` fire; ViewManager saves the order. */\n reorderableColumns?: boolean;\n /** A handle on each header's edge: drag to resize (double-click resets), Alt+Shift+\u2190/\u2192 on a focused header. Widths are part of `getColumnState`. */\n resizableColumns?: boolean;\n /** Show the group labels (`Column.group`) as a band over the header. Default true when any column has a group. */\n groupHeaders?: boolean;\n}\n\n/** Extends a Grid without growing its base: `init` runs once the grid is rendered and may return a cleanup. */\nexport interface GridPlugin<T extends Record<string, any> = any> {\n init(grid: Grid<T>): void | (() => void);\n destroy?(): void;\n}\n\n/**\n * One displayed row. Without a row layout every store record is a row; a plugin (grouping, tree) replaces the list with\n * its own, mixing records with rows that are not records (a group header, a total).\n */\nexport interface RowEntry<T extends Record<string, any> = any> {\n /** The record this row shows; absent on a header or total row (which cannot be selected). */\n rec?: Model<T>;\n /** `aria-level` and, with `expanded`, `aria-expanded`: for rows that open and close (a group, a tree node). */\n level?: number;\n expanded?: boolean;\n /** Extra classes on the row (`op-grid__row--group`...). */\n cls?: string;\n /** Fills the row's cells after the grid did (or, on a row without a record, instead of it). */\n paint?(cells: HTMLElement[], row: HTMLElement): void;\n}\n\n/** What `cellAt` finds under a DOM node: the row index, its record, the column and the cell element. */\nexport interface GridCell<T extends Record<string, any> = any> {\n index: number;\n record: Model<T>;\n column: Column<T>;\n el: HTMLElement;\n}\n\nexport interface GridAction<T extends Record<string, any> = any> {\n text: string;\n icon?: string;\n variant?: 'default' | 'danger';\n /** Left out (or disabled) while `setPermissionResolver` denies it. */\n permission?: string;\n handler: (records: Model<T>[], grid: Grid<T>) => void;\n}\nexport interface GridRowAction<T extends Record<string, any> = any> {\n text: string;\n icon?: string;\n variant?: 'default' | 'danger';\n /** Left out (or disabled) while `setPermissionResolver` denies it. */\n permission?: string;\n /** Disabled for the records where this returns true. */\n disabled?: (record: Model<T>) => boolean;\n handler: (record: Model<T>, grid: Grid<T>) => void;\n}\nexport interface ColumnState {\n field: string;\n hidden: boolean;\n width?: number;\n locked?: 'start' | 'end';\n}\n\nconst SEL = '__select';\nconst ACT = '__actions';\nconst SEL_COL: Column = { field: SEL, width: 44, align: 'center', cls: 'op-grid__selcell', locked: 'start' };\nconst ACT_COL: Column = { field: ACT, width: 44, align: 'center', cls: 'op-grid__actcell', locked: 'end' };\n\nconst ROW = 'var(--op-grid-row-height, var(--op-row-height))';\n\n/** Data grid with a virtualized body: only the visible rows (plus a small overscan) exist in the DOM. */\n/** `T` is the record shape; `new Grid({ store })` infers it from a typed `Store<T>`. */\nexport class Grid<T extends Record<string, any> = any> extends Component<GridConfig<T>> {\n protected override baseCls = 'op-grid';\n private store!: Store<T>;\n private offStore?: () => void;\n private headEl!: HTMLElement;\n private headRow!: HTMLElement;\n private viewport!: HTMLElement;\n private emptyEl!: HTMLElement;\n /** The focusable `role=grid` part (header + rows); the root also holds the bulk bar and the pager, which a grid may not contain. */\n private table!: HTMLElement;\n private pager?: Pagination;\n private v!: ReturnType<typeof virtualize>;\n private entries?: RowEntry<T>[];\n private lockEdge = [-1, -1];\n private selected = new Set<Model<T>>();\n private active = -1;\n private anchor = -1;\n private justDragged = false;\n private cv = 0; // bumps when the columns change, so pooled rows rebuild their cells\n private selAll?: HTMLInputElement;\n private barEl?: HTMLElement;\n private bulkEl?: HTMLElement;\n private bulkCount?: HTMLElement;\n private bulkBtns: Button[] = [];\n private selectAllBtn?: Button;\n private rowMenu?: Menu;\n private colDd?: Dropdown;\n private colList?: HTMLElement;\n private colSearch?: TextField;\n private colChips?: HTMLElement;\n private colGroup = '';\n\n private cols(): Column[] {\n const c = this.config;\n return [...(c.checkboxSelection ? [SEL_COL] : []), ...this.userCols(), ...(c.rowActions?.length ? [ACT_COL] : [])];\n }\n /** Visible columns; the locked ones are kept together at their edge, whatever the order they were given or dragged to. */\n private userCols(): Column[] {\n const vis = (this.config.columns ?? []).filter((c) => !c.hidden);\n return [...vis.filter((c) => c.locked === 'start'), ...vis.filter((c) => !c.locked), ...vis.filter((c) => c.locked === 'end')];\n }\n private visibleActions(): boolean {\n return this.config.rowActionsMode === 'visible' && !!this.config.rowActions?.length;\n }\n private mode(): 'none' | 'single' | 'multi' {\n return this.config.checkboxSelection ? 'multi' : (this.config.selection ?? 'single');\n }\n\n protected override build() {\n const c = this.config;\n c.rowActions = gate(c.rowActions);\n c.bulkActions = gate(c.bulkActions);\n c.columns = c.columns.filter((col) => allowed(col.permission));\n const el = h('div', this.baseCls);\n this.headRow = h('div', 'op-grid__row op-grid__header-row', { role: 'row' });\n this.headEl = h('div', 'op-grid__header', {}, this.headRow);\n this.viewport = h('div', 'op-grid__viewport');\n this.emptyEl = h('div', 'op-grid__empty');\n if (c.columnMenu || c.bulkActions?.length) {\n this.bulkEl = h('div', 'op-grid__bulk');\n this.bulkEl.hidden = true;\n this.barEl = h('div', 'op-grid__bar', {}, this.bulkEl);\n el.append(this.barEl);\n }\n this.table = h('div', 'op-grid__table', { role: 'grid', tabindex: 0, 'aria-multiselectable': c.selection === 'multi' || c.checkboxSelection ? 'true' : null }, this.headEl, this.viewport, this.emptyEl);\n el.append(this.table);\n el.classList.toggle('op-grid--striped', !!c.striped);\n if (c.paging) {\n this.pager = new Pagination({ cls: 'op-grid__pager' });\n el.append(this.pager.el);\n }\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n this.bindStore(c.store ?? new Store<T>({ data: c.data ?? [] }));\n this.buildHeader();\n this.buildBar();\n this.v = virtualize({\n scroller: this.viewport,\n count: this.count(),\n rowHeight: c.rowHeight ?? (measure(this.el, ROW) || 36),\n render: (row, i) => this.renderRow(row, i),\n rowCls: 'op-grid__row op-grid__body-row',\n });\n this.own(() => this.v.destroy());\n this.sync();\n\n this.listen(this.viewport, 'scroll', () => this.onScrollX(), { passive: true });\n this.listen(this.viewport, 'click', (e: MouseEvent) => this.onRowEvent(e, 'row-click'));\n this.listen(this.viewport, 'dblclick', (e: MouseEvent) => this.onRowEvent(e, 'row-dblclick'));\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.listen(this.headRow, 'change', (e: Event) => {\n if (e.target !== this.selAll) return;\n if (this.selAll!.checked) this.store.each((r) => this.selected.add(r));\n else if (this.config.keepSelection) this.store.each((r) => this.selected.delete(r));\n else this.selected.clear();\n this.changed();\n });\n if (c.reorderableColumns) this.initColumnDrag();\n if (c.resizableColumns) this.initColumnResize();\n this.listen(this.headRow, 'click', (e: Event) => {\n if (this.justDragged || (e.target as HTMLElement).closest('.op-grid__resizer')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('[data-field]');\n const col = cell && this.userCols().find((x) => x.field === cell.dataset.field);\n if (!col) return;\n this.emit('column-click', col);\n if (col.sortable) this.sortBy(col);\n });\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver(() => this.layout());\n ro.observe(this.viewport);\n this.own(() => ro.disconnect());\n }\n if (this.pager) {\n this.pager.setStore(this.store);\n if (!this.store.pageSize) this.store.setPageSize(c.pageSize ?? 20);\n }\n this.own(() => this.pager?.destroy());\n for (const p of c.plugins ?? []) {\n const off = p.init(this);\n if (off) this.own(off);\n if (p.destroy) this.own(() => p.destroy!());\n }\n }\n\n /** The row, record, column and cell element under a node (e.g. an event target), if it is a body cell. */\n cellAt(node: EventTarget | null): GridCell<T> | undefined {\n const cell = (node as HTMLElement | null)?.closest?.<HTMLElement>('.op-grid__body-row .op-grid__cell');\n const index = Number(cell?.parentElement?.dataset.i);\n const column = cell && this.cols()[Number(cell.getAttribute('aria-colindex')) - 1];\n const record = cell && this.recAt(index);\n return column && record && ![SEL, ACT].includes(column.field) ? { index, record, column, el: cell } : undefined;\n }\n\n /** The body cell of row `index` and column `field`, when that row is in the DOM (rows are virtualized). */\n getCell(index: number, field: string): HTMLElement | undefined {\n const n = this.cols().findIndex((c) => c.field === field);\n return document.getElementById(`${this.id}-r${index}`)?.querySelector<HTMLElement>(`[aria-colindex=\"${n + 1}\"]`) ?? undefined;\n }\n\n /** The visible data columns, in order (no checkbox/action columns). */\n getColumns(): Column<T>[] {\n return this.userCols();\n }\n\n /** The active row index (keyboard cursor), or -1. */\n getActive(): number {\n return this.active;\n }\n\n override notifyMount() {\n super.notifyMount();\n this.layout();\n this.pager?.notifyMount();\n }\n\n /** The header follows the body sideways; its locked cells hold still, and the edges say when there is more to scroll. */\n private onScrollX() {\n const v = this.viewport;\n const end = Math.max(0, v.scrollWidth - v.clientWidth - v.scrollLeft);\n this.headEl.scrollLeft = v.scrollLeft;\n this.el.style.setProperty('--op-grid-scroll-x', `${v.scrollLeft}px`);\n this.el.style.setProperty('--op-grid-scroll-end', `${end}px`);\n this.el.classList.toggle('is-scrolled-start', v.scrollLeft > 0);\n this.el.classList.toggle('is-scrolled-end', end > 0);\n }\n\n /** Re-measures row height and scrollbar (needed after the grid becomes visible or resizes). */\n private layout() {\n if (!this.rendered) return;\n if (!this.config.rowHeight) {\n const hgt = measure(this.el, ROW);\n if (hgt) this.v.setRowHeight(hgt);\n }\n this.headEl.style.paddingInlineEnd = `${this.viewport.offsetWidth - this.viewport.clientWidth}px`;\n this.v.refresh();\n this.onScrollX();\n }\n\n // ---- store ---------------------------------------------------------------------------------\n\n private bindStore(store: Store<T>) {\n this.offStore?.();\n this.store = store;\n const offChange = store.subscribe((c) => {\n if (!this.rendered) return;\n this.sync();\n if (c.type === 'sort') this.paintSort();\n });\n const offLoading = store.on('loading', (on: boolean) => this.setLoading(on));\n this.offStore = () => (offChange(), offLoading());\n this.own(() => this.offStore?.());\n }\n\n /** Brings count, selection and the empty state in line with the store. */\n private sync() {\n const before = this.selected.size;\n if (!this.config.keepSelection) for (const r of this.selected) if (this.store.indexOf(r) < 0) this.selected.delete(r);\n this.active = Math.min(this.active, this.count() - 1);\n this.v.setCount(this.count());\n this.table.setAttribute('aria-rowcount', String(this.store.totalCount + 1));\n this.emptyEl.textContent = this.config.emptyText ?? t('empty');\n this.emptyEl.hidden = this.count() > 0 || !!this.config.loading;\n this.el.classList.toggle('is-empty', this.count() === 0);\n this.updateActiveDescendant();\n this.paintSelection();\n if (this.selected.size !== before) this.emit('select', this.getSelection());\n }\n\n setStore(store: Store<T>) {\n this.config.store = store;\n this.selected.clear();\n this.active = this.anchor = -1;\n if (!this.rendered) return;\n this.bindStore(store);\n this.pager?.setStore(store);\n this.paintSort();\n this.sync();\n }\n getStore(): Store<T> {\n this.render();\n return this.store;\n }\n\n private count(): number {\n return this.entries ? this.entries.length : this.store.count;\n }\n private recAt(i: number): Model<T> | undefined {\n return this.entries ? this.entries[i]?.rec : this.store.getAt(i);\n }\n\n /** For plugins: replaces the displayed rows (`undefined` goes back to one row per store record) and repaints. */\n setRowLayout(rows: RowEntry<T>[] | undefined): void {\n this.entries = rows;\n if (this.rendered) this.sync();\n }\n /** The displayed row `i`: its record, or the header/total a plugin put there. */\n getRowEntry(i: number): RowEntry<T> | undefined {\n return this.entries ? this.entries[i] : ((rec) => rec && { rec })(this.store.getAt(i));\n }\n /** How many rows are displayed (records plus whatever a plugin added). */\n getRowCount(): number {\n return this.count();\n }\n\n // ---- header / columns ----------------------------------------------------------------------\n\n /** Column widths \u2192 the CSS grid template shared by the header and every row. */\n private layoutColumns() {\n const cols = this.cols();\n const n = this.visibleActions() ? this.config.rowActions!.length : 1;\n const wide = (c: Column) => (c.field === ACT ? `calc(${n} * var(--op-grid-action-size) + ${n + 1} * var(--op-grid-action-gap))` : `${c.width}px`);\n const px = (c: Column) => (c.field === ACT ? wide(c) : `${c.width ?? 140}px`);\n const tpl = cols.map((c) => (c.locked ? px(c) : c.width ? `${c.width}px` : `minmax(${c.minWidth ?? 96}px, ${c.flex ?? 1}fr)`)).join(' ');\n // a locked cell sticks at the sum of the locked widths before it (or, for the end, after it)\n const sums = (list: Array<[number, Column]>) => list.reduce<string[]>((acc, [n, c]) => (this.el.style.setProperty(`--op-grid-lock-${n}`, acc.length ? `calc(${acc.join(' + ')})` : '0px'), [...acc, px(c)]), []);\n const at = cols.map((c, n): [number, Column] => [n, c]);\n sums(at.filter(([, c]) => c.locked === 'start'));\n sums(at.filter(([, c]) => c.locked === 'end').reverse());\n this.lockEdge = [cols.map((c) => c.locked).lastIndexOf('start'), cols.findIndex((c) => c.locked === 'end')];\n this.el.style.setProperty('--op-grid-cols', tpl);\n this.el.style.setProperty('--op-grid-min-width', `${cols.reduce((sum, c) => sum + (c.field === ACT ? n * 36 : (c.width ?? (c.locked ? 140 : (c.minWidth ?? 96)))), 0)}px`);\n }\n\n /** Classes and offset of a locked cell (header or body); `n` is the column's place. */\n private lock(cell: HTMLElement, c: Column, n: number) {\n if (!c.locked) return;\n cell.classList.add('is-locked', `is-locked-${c.locked}`);\n cell.classList.toggle('is-lock-edge', this.lockEdge[c.locked === 'start' ? 0 : 1] === n);\n cell.style.setProperty('--_lock', `var(--op-grid-lock-${n})`);\n }\n\n private buildHeader() {\n const cols = this.cols();\n this.layoutColumns();\n this.el.classList.toggle('op-grid--actions-visible', this.visibleActions());\n this.el.classList.toggle('op-grid--reorderable', !!this.config.reorderableColumns);\n this.el.classList.toggle('op-grid--resizable', !!this.config.resizableColumns);\n this.table.setAttribute('aria-colcount', String(cols.length));\n this.selAll = undefined;\n this.headRow.replaceChildren(\n ...cols.map((c, i) => {\n const label = c.header ?? c.field;\n const cell = h('div', `op-grid__cell op-grid__hcell${c.align ? ` op-grid__cell--${c.align}` : ''}${c.sortable ? ' is-sortable' : ''}`, { role: 'columnheader', 'aria-colindex': i + 1, 'data-field': c.field });\n this.lock(cell, c, i);\n if (c.field === SEL) cell.append((this.selAll = h('input', 'op-grid__check', { type: 'checkbox', 'aria-label': t('gridSelectPage') })));\n else if (c.field === ACT) cell.append(h('span', 'op-sr-only', {}, t('gridRowActions')));\n else if (c.sortable) cell.append(h('button', 'op-grid__sort', { type: 'button' }, h('span', 'op-grid__label', {}, label), h('span', 'op-grid__arrow', { 'aria-hidden': 'true' }, iconEl('arrow-up'))));\n else cell.append(h('span', 'op-grid__label', {}, label));\n const user = c.field !== SEL && c.field !== ACT;\n if (this.config.reorderableColumns && user) cell.classList.add('is-reorderable');\n if (this.canResize(c)) {\n cell.append(h('span', 'op-grid__resizer', { role: 'separator', 'aria-orientation': 'vertical', 'aria-label': `${t('gridResize')} ${label}` }));\n }\n // a sortable header already has its button to focus; the others need a tab stop to be moved/resized by keyboard\n if (user && !c.sortable && (this.config.reorderableColumns || this.canResize(c))) cell.tabIndex = 0;\n return cell;\n }),\n );\n const band = this.groupBand(cols);\n this.headEl.replaceChildren(...(band ? [band] : []), this.headRow);\n this.paintSort();\n }\n\n /** Labels over runs of neighbouring columns that share a group (a dragged column can split a group: it shows twice). */\n private groupBand(cols: Column[]): HTMLElement | null {\n if (this.config.groupHeaders === false || !cols.some((c) => c.group)) return null;\n const cells: HTMLElement[] = [];\n let i = 0;\n while (i < cols.length) {\n const g = cols[i].group ?? '';\n let n = 1;\n while (i + n < cols.length && (cols[i + n].group ?? '') === g) n++;\n const cell = h('div', `op-grid__gcell${g ? '' : ' is-empty'}`, { role: 'columnheader', 'aria-colindex': i + 1, 'aria-colspan': n }, g);\n cell.style.gridColumn = `span ${n}`;\n cells.push(cell);\n i += n;\n }\n return h('div', 'op-grid__row op-grid__group-row', { role: 'row' }, ...cells);\n }\n\n /** The group labels in the order they first appear. */\n getColumnGroups(): string[] {\n return [...new Set(this.config.columns.map((c) => c.group).filter((g): g is string => !!g))];\n }\n\n /** Shows or hides every column of a group at once (at least one column always stays visible). */\n setColumnGroupVisible(group: string, visible: boolean): void {\n const cols = this.config.columns.filter((c) => (c.group ?? '') === group);\n if (!cols.length) return;\n for (const c of cols) c.hidden = !visible;\n if (!this.config.columns.some((c) => !c.hidden)) cols[0].hidden = false;\n this.setColumns(this.config.columns);\n this.emit('columns-change', this.getColumnState());\n }\n\n /** Pins a column to the start or the end while the body scrolls sideways (`null` releases it). A locked column needs a `width` (default 140). */\n setColumnLocked(field: string, locked: 'start' | 'end' | null): void {\n const col = this.config.columns.find((c) => c.field === field);\n if (!col || col.locked === (locked ?? undefined)) return;\n this.setColumns(this.config.columns.map((c) => (c === col ? { ...c, locked: locked ?? undefined } : c)));\n this.emit('columns-change', this.getColumnState());\n }\n\n setColumns(columns: Column[]) {\n this.config.columns = columns;\n if (!this.rendered) return;\n this.cv++;\n this.buildHeader();\n this.paintSelection();\n this.v.refresh();\n }\n\n /** Order, visibility and width of every column; save it and give it back to `setColumnState`. */\n getColumnState(): ColumnState[] {\n return this.config.columns.map((c) => ({ field: c.field, hidden: !!c.hidden, width: c.width, locked: c.locked }));\n }\n /** Restores a saved state: columns follow its order (unknown ones keep their place at the end). */\n setColumnState(state: ColumnState[]): void {\n const by = new Map(this.config.columns.map((c) => [c.field, c]));\n const ordered = state.flatMap((s) => {\n const c = by.get(s.field);\n by.delete(s.field);\n return c ? [{ ...c, hidden: s.hidden, width: s.width ?? c.width, locked: 'locked' in s ? s.locked : c.locked }] : [];\n });\n this.setColumns([...ordered, ...by.values()]);\n this.emit('columns-change', this.getColumnState());\n }\n\n // ---- column drag ---------------------------------------------------------------------------\n\n // ---- column resize -------------------------------------------------------------------------\n\n private canResize(c: Column): boolean {\n return !!this.config.resizableColumns && c.field !== SEL && c.field !== ACT && c.resizable !== false;\n }\n\n /** Sets a column's width in px (clamped to `minWidth`/`maxWidth`); `undefined` gives it back its flexible width. */\n setColumnWidth(field: string, width: number | undefined): void {\n const col = this.config.columns.find((x) => x.field === field);\n if (!col) return;\n col.width = width == null ? undefined : Math.round(Math.max(col.minWidth ?? 48, Math.min(width, col.maxWidth ?? Infinity)));\n this.layoutColumns();\n this.emit('column-resize', field, col.width);\n this.emit('columns-change', this.getColumnState());\n }\n\n private initColumnResize(): void {\n const head = this.headRow;\n this.listen(head, 'pointerdown', (e: PointerEvent) => {\n const grip = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__resizer');\n if (!grip || e.button) return;\n e.preventDefault();\n const cell = grip.parentElement!;\n const field = cell.dataset.field!;\n const col = this.config.columns.find((x) => x.field === field)!;\n const x0 = e.clientX;\n const w0 = cell.getBoundingClientRect().width || col.width || 96; // a flexible column starts from what it shows now\n this.el.classList.add('is-resizing');\n let last = col.width;\n const move = (m: PointerEvent) => {\n // set without events while dragging; one event when it ends\n const w = Math.round(Math.max(col.minWidth ?? 48, Math.min(w0 + (m.clientX - x0) * (this.dir() === 'rtl' ? -1 : 1), col.maxWidth ?? Infinity)));\n col.width = last = w;\n this.layoutColumns();\n };\n const up = () => {\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n this.el.classList.remove('is-resizing');\n this.justDragged = true;\n setTimeout(() => (this.justDragged = false));\n if (last !== undefined) {\n this.emit('column-resize', field, last);\n this.emit('columns-change', this.getColumnState());\n }\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.own(() => (document.removeEventListener('pointermove', move), document.removeEventListener('pointerup', up)));\n });\n // double-click on the handle: back to the flexible width\n this.listen(head, 'dblclick', (e: Event) => {\n const grip = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__resizer');\n if (grip) this.setColumnWidth(grip.parentElement!.dataset.field!, undefined);\n });\n // keyboard: Alt+Shift+\u2190/\u2192 on a focused header\n this.listen(head, 'keydown', (e: KeyboardEvent) => {\n if (!(e.altKey && e.shiftKey) || (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__hcell');\n const col = cell && this.config.columns.find((x) => x.field === cell.dataset.field);\n if (!cell || !col || !this.canResize(col)) return;\n e.preventDefault();\n const w = cell.getBoundingClientRect().width || col.width || 96;\n this.setColumnWidth(col.field, w + (e.key === 'ArrowRight' ? 16 : -16));\n });\n }\n\n private dir(): string {\n return getComputedStyle(this.el).direction;\n }\n\n /** Moves a (user) column in front of `before` (or to the end when null). Hidden columns keep their places. */\n moveColumn(field: string, before: string | null): void {\n const cols = this.config.columns;\n const col = cols.find((x) => x.field === field);\n if (!col || field === before) return;\n const vis = this.userCols();\n const from = vis.indexOf(col);\n const next = [...cols.filter((x) => x !== col)];\n const target = before == null ? undefined : next.find((x) => x.field === before);\n const lastVis = vis.filter((x) => x !== col).pop();\n const at = target ? next.indexOf(target) : lastVis ? next.indexOf(lastVis) + 1 : next.length;\n next.splice(at, 0, col);\n if (next.every((x, i) => x === cols[i])) return;\n this.setColumns(next);\n this.emit('column-move', field, from, this.userCols().indexOf(col));\n this.emit('columns-change', this.getColumnState());\n }\n\n private initColumnDrag(): void {\n const head = this.headRow;\n const cellsOf = () => Array.from(head.querySelectorAll<HTMLElement>('.is-reorderable'));\n this.listen(head, 'pointerdown', (e: PointerEvent) => {\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.is-reorderable');\n if (!cell || e.button || (e.target as HTMLElement).closest('.op-grid__resizer')) return;\n const field = cell.dataset.field!;\n const x0 = e.clientX;\n let ghost: HTMLElement | undefined;\n let mark: HTMLElement | undefined;\n let before: string | null = null;\n const move = (m: PointerEvent) => {\n if (!ghost) {\n if (Math.abs(m.clientX - x0) < 6) return; // a click, not a drag\n ghost = h('div', 'op-grid__ghost', {}, cell.textContent ?? '');\n mark = h('div', 'op-grid__drop');\n this.el.append(ghost);\n this.headEl.append(mark);\n cell.classList.add('is-dragging-col');\n }\n ghost.style.left = `${m.clientX}px`;\n ghost.style.top = `${m.clientY}px`;\n // the drop boundary is the nearest cell edge: before the first cell whose middle is right of the pointer\n const cells = cellsOf();\n const hit = cells.find((c) => {\n const r = c.getBoundingClientRect();\n return m.clientX < r.left + r.width / 2;\n });\n before = hit ? hit.dataset.field! : null;\n const edge = hit ?? cells[cells.length - 1];\n const r = edge?.getBoundingClientRect();\n const hr = this.headEl.getBoundingClientRect();\n if (r && mark) mark.style.left = `${(hit ? r.left : r.right) - hr.left + this.headEl.scrollLeft}px`;\n };\n const up = () => {\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n if (!ghost) return;\n ghost.remove();\n mark?.remove();\n cell.classList.remove('is-dragging-col');\n this.justDragged = true;\n setTimeout(() => (this.justDragged = false));\n this.moveColumn(field, before);\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.own(() => (document.removeEventListener('pointermove', move), document.removeEventListener('pointerup', up)));\n });\n // keyboard: Alt+\u2190 / Alt+\u2192 on a focused header moves its column one step\n this.listen(head, 'keydown', (e: KeyboardEvent) => {\n if (!e.altKey || e.shiftKey || (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.is-reorderable');\n if (!cell) return;\n e.preventDefault();\n const vis = this.userCols();\n const i = vis.findIndex((x) => x.field === cell.dataset.field);\n const j = e.key === 'ArrowLeft' ? i - 1 : i + 1;\n if (j < 0 || j >= vis.length) return;\n this.moveColumn(vis[i].field, e.key === 'ArrowLeft' ? vis[j].field : (vis[j + 1]?.field ?? null));\n const again = head.querySelector<HTMLElement>(`[data-field=\"${CSS.escape(vis[i].field)}\"]`);\n (again?.querySelector<HTMLElement>('button') ?? again)?.focus();\n });\n }\n\n private paintSort() {\n const s = this.store.getSorters()[0];\n for (const cell of Array.from(this.headRow.children) as HTMLElement[]) {\n const on = !!s && cell.dataset.field === s.field;\n cell.classList.toggle('is-sorted-asc', on && s.dir === 'asc');\n cell.classList.toggle('is-sorted-desc', on && s.dir === 'desc');\n if (cell.classList.contains('is-sortable')) cell.setAttribute('aria-sort', on ? (s.dir === 'asc' ? 'ascending' : 'descending') : 'none');\n }\n }\n\n /** asc \u2192 desc \u2192 unsorted. */\n private sortBy(col: Column) {\n const s = this.store.getSorters()[0];\n const dir = s?.field === col.field ? (s.dir === 'asc' ? 'desc' : null) : 'asc';\n if (this.emit('before-sort', col.field, dir) === false) return;\n this.store.sort(dir ? col.field : null, dir ?? undefined);\n this.emit('sort', col.field, dir);\n }\n\n // ---- rows ----------------------------------------------------------------------------------\n\n private rowIndexOffset(): number {\n return this.store.pageSize ? (this.store.page - 1) * this.store.pageSize : 0;\n }\n\n private renderRow(row: HTMLElement, i: number) {\n const entry = this.getRowEntry(i);\n if (!entry) return;\n const rec = entry.rec;\n const cols = this.cols();\n row.id = `${this.id}-r${i}`;\n row.dataset.i = String(i);\n row.setAttribute('role', 'row');\n row.setAttribute('aria-rowindex', String(this.rowIndexOffset() + i + 2));\n const sel = !!rec && this.selected.has(rec);\n if (row.dataset.ec) row.classList.remove(...row.dataset.ec.split(' '));\n row.dataset.ec = entry.cls ?? '';\n if (entry.cls) row.classList.add(...entry.cls.split(' '));\n for (const [a, v] of [['aria-level', entry.level], ['aria-expanded', entry.expanded]] as const) {\n if (v == null) row.removeAttribute(a);\n else row.setAttribute(a, String(v));\n }\n row.setAttribute('aria-selected', this.mode() === 'none' || !rec ? 'false' : String(sel));\n row.classList.toggle('is-selected', sel);\n row.classList.toggle('is-active', i === this.active);\n row.classList.toggle('is-odd', i % 2 === 1);\n if (row.dataset.cv !== String(this.cv) || row.dataset.cn !== String(cols.length)) {\n row.dataset.cv = String(this.cv);\n row.dataset.cn = String(cols.length);\n row.replaceChildren(\n ...cols.map((c, n) => {\n const cell = h('div', `op-grid__cell${c.align ? ` op-grid__cell--${c.align}` : ''}${c.cls ? ` ${c.cls}` : ''}`, { role: 'gridcell', 'aria-colindex': n + 1 });\n this.lock(cell, c, n);\n return cell;\n }),\n );\n }\n const cells = (Array.from(row.children) as HTMLElement[]).filter((c) => c.classList.contains('op-grid__cell')); // a plugin may add its own child (an edit bar)\n if (!rec) {\n for (const cell of cells) cell.replaceChildren();\n return entry.paint?.(cells, row);\n }\n cols.forEach((c, n) => {\n const cell = row.children[n] as HTMLElement;\n if (cell.classList.contains('is-editing')) return; // an editor plugin owns this cell until it finishes\n if (c.field === SEL) {\n const box = (cell.firstElementChild as HTMLInputElement | null) ?? cell.appendChild(h('input', 'op-grid__check', { type: 'checkbox', tabindex: -1, 'aria-label': t('gridSelectRow') }));\n box.checked = sel;\n return;\n }\n if (c.field === ACT) {\n const acts = this.config.rowActions ?? [];\n if (!this.visibleActions()) {\n if (!cell.firstChild) cell.append(h('button', 'op-grid__actbtn', { type: 'button', tabindex: -1, 'aria-label': t('gridRowActions'), 'aria-haspopup': 'menu' }, iconEl('more')));\n return;\n }\n if (cell.children.length !== acts.length || (cell.firstElementChild as HTMLElement | null)?.dataset.a == null) {\n cell.replaceChildren(...acts.map((a, k) => h('button', `op-grid__actbtn${a.variant === 'danger' ? ' is-danger' : ''}`, { type: 'button', tabindex: -1, 'data-a': k, 'aria-label': a.text, title: a.text }, a.icon ? iconEl(a.icon) : a.text)));\n }\n acts.forEach((a, k) => ((cell.children[k] as HTMLButtonElement).disabled = !!a.disabled?.(rec)));\n return;\n }\n const content = cellContent(c, rec);\n if (typeof content === 'string') cell.textContent = content;\n else cell.replaceChildren(content);\n });\n entry.paint?.(cells, row);\n }\n\n private indexOfEvent(e: Event): number {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__body-row');\n return row ? Number(row.dataset.i) : -1;\n }\n\n private onRowEvent(e: MouseEvent, name: string) {\n const i = this.indexOfEvent(e);\n const rec = this.recAt(i);\n if (!rec) return;\n if (name === 'row-click') {\n const btn = (e.target as HTMLElement).closest<HTMLButtonElement>('.op-grid__actbtn');\n if (btn) {\n if (btn.dataset.a == null) return this.openRowMenu(rec, btn);\n if (!btn.disabled) this.config.rowActions![Number(btn.dataset.a)].handler(rec, this);\n return;\n }\n this.setActive(i, false);\n this.pick(i, e);\n }\n this.emit(name, rec, i, e);\n }\n\n // ---- selection / keyboard ------------------------------------------------------------------\n\n getSelection(): Model<T>[] {\n return [...this.selected];\n }\n\n /** Selects a record or row index. `add` keeps the current selection (multi mode). */\n select(target: Model<T> | number, opts: { add?: boolean } = {}): void {\n const rec = typeof target === 'number' ? this.recAt(target) : target;\n const mode = this.mode();\n if (!rec || mode === 'none') return;\n if (mode === 'single' || !opts.add) this.selected.clear();\n this.selected.add(rec);\n this.changed();\n }\n\n deselectAll(): void {\n if (!this.selected.size) return;\n this.selected.clear();\n this.changed();\n }\n\n private changed() {\n this.v?.refresh();\n this.paintSelection();\n this.emit('select', this.getSelection());\n }\n\n /** Selects every record that matches the filters, across pages (a remote store: the loaded page). */\n selectAllFiltered(): void {\n if (this.mode() !== 'multi') return;\n for (const r of this.store.getFiltered()) this.selected.add(r);\n this.changed();\n }\n\n /** Click semantics: plain = replace, ctrl/meta = toggle, shift = range from the anchor (multi only). */\n private pick(i: number, e: { ctrlKey?: boolean; metaKey?: boolean; shiftKey?: boolean }) {\n const mode = this.mode();\n const rec = this.recAt(i);\n if (!rec || mode === 'none') return;\n if (mode === 'multi' && e.shiftKey && this.anchor >= 0) {\n if (!this.config.checkboxSelection) this.selected.clear();\n for (let k = Math.min(this.anchor, i); k <= Math.max(this.anchor, i); k++) {\n const r = this.recAt(k);\n if (r) this.selected.add(r);\n }\n } else if (mode === 'multi' && (e.ctrlKey || e.metaKey || this.config.checkboxSelection)) {\n if (!this.selected.delete(rec)) this.selected.add(rec);\n this.anchor = i;\n } else {\n this.selected.clear();\n this.selected.add(rec);\n this.anchor = i;\n }\n this.changed();\n }\n\n private setActive(i: number, scroll = true) {\n this.active = i;\n if (scroll && i >= 0) this.v.scrollTo(i);\n this.v.refresh();\n this.updateActiveDescendant();\n }\n\n private updateActiveDescendant() {\n if (this.active >= 0 && this.active < this.count()) this.table.setAttribute('aria-activedescendant', `${this.id}-r${this.active}`);\n else this.table.removeAttribute('aria-activedescendant');\n }\n\n focusRow(i: number) {\n this.render();\n this.setActive(Math.max(0, Math.min(i, this.count() - 1)));\n this.table.focus();\n }\n\n protected override focusEl(): HTMLElement {\n return this.table;\n }\n\n scrollToRow(i: number) {\n this.v?.scrollTo(i);\n }\n\n private onKey(e: KeyboardEvent) {\n const target = e.target as HTMLElement;\n if (target.closest('.op-grid__header')) return; // header buttons keep their own keys\n if (target !== this.table && target.matches('input:not([type=checkbox]),textarea,select,[contenteditable]')) return; // an editor in a cell keeps its keys\n const n = this.count();\n if (!n) return;\n if ((e.key === 'ContextMenu' || (e.shiftKey && e.key === 'F10')) && this.active >= 0 && this.config.rowActions?.length) {\n e.preventDefault();\n const arec = this.recAt(this.active);\n if (!arec) return;\n return this.openRowMenu(arec, document.getElementById(`${this.id}-r${this.active}`) ?? this.el);\n }\n const page = Math.max(1, Math.floor((this.viewport.clientHeight || 400) / this.config.rowHeight! || 10));\n const cur = this.active < 0 ? 0 : this.active;\n const mode = this.mode();\n const targets: Record<string, number> = {\n ArrowDown: Math.min(n - 1, this.active < 0 ? 0 : cur + 1),\n ArrowUp: Math.max(0, cur - 1),\n Home: 0,\n End: n - 1,\n PageDown: Math.min(n - 1, cur + page),\n PageUp: Math.max(0, cur - page),\n };\n if (e.key in targets) {\n e.preventDefault();\n const to = targets[e.key];\n this.setActive(to);\n if (mode === 'single' || (mode === 'multi' && !e.ctrlKey && !e.metaKey && !this.config.checkboxSelection)) this.pick(to, e);\n } else if (e.key === ' ' && this.active >= 0) {\n e.preventDefault();\n if (mode === 'multi') this.pick(this.active, { ctrlKey: true });\n else this.pick(this.active, e);\n } else if (e.key === 'Enter' && this.active >= 0) {\n this.emit('row-activate', this.recAt(this.active), this.active);\n } else if ((e.key === 'a' || e.key === 'A') && (e.ctrlKey || e.metaKey) && mode === 'multi') {\n e.preventDefault();\n this.store.each((r) => this.selected.add(r));\n this.changed();\n }\n }\n\n refresh() {\n this.v?.refresh();\n }\n\n // ---- bar: bulk actions and the column menu ------------------------------------------------\n\n private buildBar() {\n const c = this.config;\n if (!this.barEl) return;\n this.bulkCount = h('span', 'op-grid__count', { 'aria-live': 'polite' });\n this.selectAllBtn = new Button({ text: '', variant: 'ghost', handler: () => this.selectAllFiltered() });\n this.bulkBtns = (c.bulkActions ?? []).map((a) => new Button({ text: a.text, icon: a.icon, variant: a.variant === 'danger' ? 'danger' : 'default', handler: () => a.handler(this.getSelection(), this) }));\n const clear = new Button({ text: t('gridClearSel'), variant: 'ghost', handler: () => this.deselectAll() });\n this.bulkEl!.append(this.bulkCount, this.selectAllBtn.el, ...this.bulkBtns.map((b) => b.el), clear.el);\n this.own(() => [this.selectAllBtn, ...this.bulkBtns, clear].forEach((b) => b?.destroy()));\n if (c.columnMenu) this.buildColumnMenu();\n this.paintSelection();\n }\n\n /** Header checkbox state and the bulk bar, from the current selection. */\n private paintSelection() {\n if (!this.rendered) return;\n const n = this.store.count;\n let k = 0;\n this.store.each((r) => this.selected.has(r) && k++);\n if (this.selAll) {\n this.selAll.checked = n > 0 && k === n;\n this.selAll.indeterminate = k > 0 && k < n;\n }\n if (!this.bulkEl) return;\n const size = this.selected.size;\n this.bulkEl.hidden = !size || !this.config.bulkActions?.length;\n if (this.bulkEl.hidden) return;\n this.bulkCount!.textContent = t('gridSelected', { n: size });\n const more = this.store.getFiltered().length;\n this.selectAllBtn!.el.hidden = !(this.mode() === 'multi' && k === n && more > n && size < more);\n this.selectAllBtn!.setText(t('gridSelectAll', { n: more }));\n }\n\n private openRowMenu(rec: Model<T>, btn: HTMLElement) {\n this.rowMenu ??= new Menu({});\n this.rowMenu.setItems((this.config.rowActions ?? []).map((a) => ({ text: a.text, icon: a.icon, disabled: !!a.disabled?.(rec), handler: () => a.handler(rec, this) })));\n this.rowMenu.showBy(btn);\n }\n private buildColumnMenu() {\n const btn = new Button({ text: t('gridColumns'), icon: 'columns', variant: 'ghost' });\n this.colSearch = new TextField({ placeholder: t('gridColumnSearch'), clearable: true });\n this.colChips = h('div', 'op-grid__colchips', { role: 'group', 'aria-label': t('gridGroups') });\n this.colList = h('div', 'op-grid__collist', { role: 'group', 'aria-label': t('gridColumns') });\n const none = h('div', 'op-grid__colempty', {}, t('gridNoColumns'));\n none.hidden = true;\n const panel = h('div', 'op-grid__colmenu', {}, this.colSearch.el, this.colChips, this.colList, none);\n this.colDd = new Dropdown({ anchor: btn.el, content: panel, placement: 'bottom-end', role: 'dialog', autoFocus: false });\n this.barEl!.append(btn.el);\n this.own(() => btn.destroy());\n /** Search text and the group chip decide what is listed; a search that names a group shows the whole group. */\n const filter = () => {\n const q = (this.colSearch!.getValue() ?? '').toLowerCase();\n let shown = 0;\n let head: HTMLElement | undefined;\n let rowsInGroup = 0;\n const closeGroup = () => head && (head.hidden = rowsInGroup === 0);\n for (const el of Array.from(this.colList!.children) as HTMLElement[]) {\n if (el.classList.contains('op-grid__colgroup')) {\n closeGroup();\n head = el;\n rowsInGroup = 0;\n continue;\n }\n const g = el.dataset.group ?? '';\n const byChip = !this.colGroup || g === this.colGroup;\n const byText = !q || g.toLowerCase().includes(q) || el.textContent!.toLowerCase().includes(q);\n el.hidden = !(byChip && byText);\n if (!el.hidden) (shown++, rowsInGroup++);\n }\n closeGroup();\n none.hidden = shown > 0;\n };\n this.colSearch.on('change', filter);\n this.listen(this.colChips, 'click', (e: Event) => {\n const b = (e.target as HTMLElement).closest<HTMLElement>('[data-g]');\n if (!b) return;\n this.colGroup = b.dataset.g!;\n this.paintColumnList();\n filter();\n });\n btn.on('click', () => {\n if (this.colDd!.isOpen()) return this.colDd!.close();\n this.colSearch!.setValue('');\n this.colGroup = '';\n this.paintColumnList();\n this.colDd!.open();\n this.colList!.querySelector<HTMLElement>('input')?.focus(); // not the search field: a phone keyboard would cover the list\n });\n this.listen(this.colList, 'change', (e: Event) => {\n const input = e.target as HTMLInputElement;\n if (input.dataset.groupToggle != null) this.setColumnGroupVisible(input.dataset.groupToggle, input.checked);\n else {\n const col = this.config.columns.find((x) => x.field === input.value);\n if (!col) return;\n col.hidden = !input.checked;\n this.setColumns(this.config.columns);\n this.emit('columns-change', this.getColumnState());\n }\n this.paintColumnList();\n filter();\n });\n }\n\n private paintColumnList() {\n const cols = this.config.columns;\n const groups = this.getColumnGroups();\n const last = this.userCols().length === 1 ? this.userCols()[0] : null; // at least one column stays visible\n const row = (c: Column) => {\n const box = h('input', 'op-grid__check', { type: 'checkbox', value: c.field });\n box.checked = !c.hidden;\n box.disabled = c === last;\n return h('label', 'op-grid__colitem', { 'data-group': c.group ?? '' }, box, h('span', '', {}, c.header ?? c.field));\n };\n this.colChips!.hidden = groups.length < 2;\n this.colChips!.replaceChildren(...[['', t('gridGroupAll')], ...groups.map((g) => [g, g])].map(([g, label]) => h('button', `op-grid__colchip${this.colGroup === g ? ' is-on' : ''}`, { type: 'button', 'data-g': g, 'aria-pressed': String(this.colGroup === g) }, label)));\n if (!groups.length) return this.colList!.replaceChildren(...cols.map(row));\n const out: HTMLElement[] = [];\n for (const g of [...groups, '']) {\n const items = cols.filter((c) => (c.group ?? '') === g);\n if (!items.length) continue;\n const on = items.filter((c) => !c.hidden).length;\n const toggle = h('input', 'op-grid__check', { type: 'checkbox', 'data-group-toggle': g, 'aria-label': g || t('gridOtherCols') });\n toggle.checked = on === items.length;\n toggle.indeterminate = on > 0 && on < items.length;\n out.push(h('div', 'op-grid__colgroup', { 'data-group': g }, h('label', '', {}, toggle, h('span', '', {}, g || t('gridOtherCols'))), h('span', 'op-grid__colcount', {}, `${on}/${items.length}`)), ...items.map(row));\n }\n this.colList!.replaceChildren(...out);\n }\n\n protected override onDestroy() {\n this.pager?.destroy();\n this.rowMenu?.destroy();\n this.colDd?.destroy();\n this.colSearch?.destroy();\n }\n}\nregister('grid', Grid);\n"],
5
- "mappings": "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",
6
- "names": ["addMessages", "SEL", "ACT", "SEL_COL", "ACT_COL", "ROW", "Grid", "Component", "c", "vis", "gate", "col", "allowed", "el", "h", "Pagination", "Store", "virtualize", "measure", "row", "e", "r", "cell", "x", "ro", "p", "off", "node", "index", "column", "record", "field", "n", "v", "end", "hgt", "store", "offChange", "offLoading", "on", "before", "t", "i", "rows", "rec", "cols", "wide", "px", "tpl", "sums", "list", "acc", "at", "sum", "label", "iconEl", "user", "band", "cells", "g", "group", "visible", "locked", "columns", "state", "by", "ordered", "width", "head", "grip", "x0", "w0", "last", "move", "m", "w", "up", "from", "next", "target", "lastVis", "cellsOf", "ghost", "mark", "hit", "hr", "j", "again", "s", "dir", "entry", "sel", "a", "box", "acts", "k", "content", "cellContent", "name", "btn", "opts", "mode", "scroll", "arec", "page", "cur", "targets", "to", "Button", "clear", "b", "size", "more", "Menu", "TextField", "none", "panel", "Dropdown", "filter", "q", "shown", "rowsInGroup", "closeGroup", "byChip", "byText", "input", "groups", "out", "items", "toggle", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{c as T}from"./chunk-DIOJGTUN.js";import{a as E}from"./chunk-TIPK3SCJ.js";import{f as I}from"./chunk-UDXO3KM3.js";import{b as s}from"./chunk-PZSHOSOS.js";import{d as _,e as b,f}from"./chunk-S4QD5NID.js";b("en",{timeline:"Timeline",tlNow:"Now",tlFromTo:"{from} to {to}"});b("pt-BR",{timeline:"Linha do tempo",tlNow:"Agora",tlFromTo:"{from} at\xE9 {to}"});var C=/^\d{1,2}:\d{2}$/,d=a=>String(a).padStart(2,"0"),w=864e5,$=(a,e)=>/^\d{4}-\d{2}/.test(a)&&!isNaN(+new Date(a))?new Intl.DateTimeFormat(_()._lang,e).format(new Date(/^\d{4}-\d{2}-\d{2}$/.test(a)?`${a}T00:00`:a)):a,M=class extends I{baseCls="op-timeline";items=[];scale;build(){return s("div",this.baseCls)}onRender(){this.el.classList.add(`op-timeline--${this.config.mode??"list"}`);let e=this.config.store;e&&this.own(e.subscribe(()=>this.setItems(e.getFiltered().map(i=>i.data)))),this.setItems(e?e.getFiltered().map(i=>i.data):this.config.items??[]);for(let i of this.config.plugins??[]){let l=i.init(this);l&&this.own(l)}this.listen(this.el,"click",i=>this.pick(i.target)),this.listen(this.el,"keydown",i=>i.key==="Enter"&&this.pick(i.target))}pick(e){let i=Number(e.closest("[data-i]")?.dataset.i);this.items[i]&&this.emit("select",this.items[i])}getItems(){return this.items}getScale(){return this.scale}setItems(e){this.items=e,this.rendered&&this.paint()}paint(){this.el.setAttribute("role","list"),this.el.setAttribute("aria-label",this.config.ariaLabel??f("timeline")),this.el.replaceChildren(...this.config.mode==="range"?this.range():this.list()),this.emit("paint")}list(){return this.items.map((e,i)=>s("div",`op-timeline__item${e.tone&&e.tone!=="default"?` is-${e.tone}`:""}`,{role:"listitem","data-i":i,tabindex:0},s("div","op-timeline__when",{},e.time?$(e.time,/T/.test(e.time)?{dateStyle:"medium",timeStyle:"short"}:{dateStyle:"medium"}):""),s("div","op-timeline__marker",{"aria-hidden":"true"},e.icon?T(e.icon):null),s("div","op-timeline__body",{},s("div","op-timeline__title",{},e.title),e.text?s("div","op-timeline__text",{},e.text):null)))}range(){let e=this.config,i=C.test(e.from??this.items.find(t=>t.start)?.start??""),l=t=>i?(Number(t.slice(0,-3))*60+Number(t.slice(-2)))*6e4:+new Date(/^\d{4}-\d{2}-\d{2}$/.test(t)?`${t}T00:00`:t),c=this.items.filter(t=>t.start).map(t=>({x:t,a:l(t.start),b:l(t.end??t.start)+(!i&&t.end&&/^\d{4}-\d{2}-\d{2}$/.test(t.end)?w:0)}));if(!c.length&&!(e.from&&e.to))return[];let r=e.from?l(e.from):Math.min(...c.map(t=>t.a)),m=e.to?l(e.to)+(/^\d{4}-\d{2}-\d{2}$/.test(e.to)?w:0):Math.max(...c.map(t=>t.b),r+1),p=t=>`${(Math.min(Math.max((t-r)/(m-r),0),1)*100).toFixed(3)}%`,D=[...e.lanes??[],...c.map(t=>t.x.lane??"").filter((t,o,n)=>n.indexOf(t)===o&&!(e.lanes??[]).includes(t))];this.scale={lo:r,hi:m,clock:i,parse:l,format:t=>i?`${d(Math.floor(t/36e5))}:${d(Math.round(t/6e4)%60)}`:(o=>`${o.getFullYear()}-${d(o.getMonth()+1)}-${d(o.getDate())}T${d(o.getHours())}:${d(o.getMinutes())}`)(new Date(t))};let y=!i&&m-r>62*w,v=[],S=(t,o)=>{let n=s("span","op-timeline__tick",{},o);n.style.insetInlineStart=p(t),v.push(n)};if(i)for(let t=Math.ceil(r/36e5)*36e5,o=(m-r)/36e5>14?72e5:36e5;t<m;t+=o)S(t,this.scale.format(t));else for(let t=new Date(r);+t<m;y?t.setMonth(t.getMonth()+1,1):t.setDate(t.getDate()+1))t.setHours(0,0,0,0),!(+t<r)&&S(+t,new Intl.DateTimeFormat(_()._lang,y?{month:"short"}:{day:"numeric",month:"short"}).format(t));let g=[s("div","op-timeline__axis",{},s("span","op-timeline__lane-name"),s("div","op-timeline__track",{"aria-hidden":"true"},...v))];for(let t of D){let o=c.filter(n=>(n.x.lane??"")===t).map(({x:n,a:k,b:L})=>{let h=s("div",`op-timeline__bar${n.tone&&n.tone!=="default"?` is-${n.tone}`:""}`,{role:"listitem",tabindex:0,"data-i":this.items.indexOf(n),"aria-label":`${n.title}, ${f("tlFromTo",{from:$(n.start,{dateStyle:"medium",timeStyle:/T/.test(n.start)?"short":void 0}),to:$(n.end??n.start,{dateStyle:"medium",timeStyle:/T/.test(n.end??"")?"short":void 0})})}`},n.icon?T(n.icon):null,s("span","op-timeline__bar-text",{},n.title));return h.title=n.text??n.title,h.style.insetInlineStart=p(k),h.style.insetInlineEnd=`calc(100% - ${p(Math.max(L,k+(m-r)/200))})`,h});g.push(s("div","op-timeline__lane",{role:"group","aria-label":t},s("span","op-timeline__lane-name",{},t),s("div","op-timeline__track",{},...o)))}let u=Date.now();if(e.now!==!1&&!i&&u>=r&&u<=m){let t=s("div","op-timeline__now",{"aria-hidden":"true",title:f("tlNow")});t.style.insetInlineStart=p(u),g.push(s("div","op-timeline__nowrow",{"aria-hidden":"true"},s("span","op-timeline__lane-name"),s("div","op-timeline__track",{},t)))}return g}};E("timeline",M);export{M as a};
2
- //# sourceMappingURL=chunk-SB4ICXBV.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/data/timeline/timeline.ts"],
4
- "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, getLocale, addMessages } from '../../../core/i18n';\nimport type { Store } from '../../../data/store';\nimport { iconEl } from '../../base/icon/icon';\n\naddMessages('en', { timeline: 'Timeline', tlNow: 'Now', tlFromTo: '{from} to {to}' });\naddMessages('pt-BR', { timeline: 'Linha do tempo', tlNow: 'Agora', tlFromTo: '{from} at\u00E9 {to}' });\n\nexport interface TimelineItem {\n id?: string | number;\n title: string;\n text?: string;\n icon?: string;\n tone?: 'default' | 'success' | 'warning' | 'danger' | 'info';\n /** `list`: when it happened (an ISO date or time, or any text). */\n time?: string;\n /** `range`: ISO dates or date-times. */\n start?: string;\n end?: string;\n /** `range`: the row (a person, a room, a phase). */\n lane?: string;\n}\n\nexport interface TimelineConfig extends ComponentConfig {\n /** `list`: events one under the other, with a marker (default). `range`: a schedule: bars over a time axis, one row per `lane`. */\n mode?: 'list' | 'range';\n items?: TimelineItem[];\n /** Items from a Store (its records are `TimelineItem`s). */\n store?: Store<any>;\n /** `range`: the order of the rows. Default: order of appearance. */\n lanes?: string[];\n /** `range`: the window shown. Default: from the first start to the last end. */\n from?: string;\n to?: string;\n /** `range`: a marker at the current time. Default true. */\n now?: boolean;\n /** Optional features (`timeEntry()`...). See `TimelinePlugin`. */\n plugins?: TimelinePlugin[];\n}\n\n/** Extends a Timeline without growing its base: `init` runs once it is rendered and may return a cleanup. The timeline fires `paint` after every repaint. */\nexport interface TimelinePlugin {\n init(timeline: Timeline): void | (() => void);\n}\n\n/** The time axis of a `range` timeline: its ends in ms, and how to read and write the item dates (`clock`: `'HH:mm'` of one day, else ISO). */\nexport interface TimelineScale {\n lo: number;\n hi: number;\n clock: boolean;\n parse(v: string): number;\n format(ms: number): string;\n}\n\nconst CLOCK = /^\\d{1,2}:\\d{2}$/;\nconst pad = (n: number) => String(n).padStart(2, '0');\n\nconst DAY = 86400000;\nconst when = (v: string, o: Intl.DateTimeFormatOptions) => (/^\\d{4}-\\d{2}/.test(v) && !isNaN(+new Date(v)) ? new Intl.DateTimeFormat(getLocale()._lang, o).format(new Date(/^\\d{4}-\\d{2}-\\d{2}$/.test(v) ? `${v}T00:00` : v)) : v);\n\n/** Events as a vertical list, or a schedule (phases, staff shifts) as bars on a time axis. Click or Enter on an item fires `select`. */\nexport class Timeline extends Component<TimelineConfig> {\n protected override baseCls = 'op-timeline';\n private items: TimelineItem[] = [];\n private scale?: TimelineScale;\n\n protected override build() {\n return h('div', this.baseCls);\n }\n\n protected override onRender() {\n this.el.classList.add(`op-timeline--${this.config.mode ?? 'list'}`);\n const store = this.config.store;\n if (store) this.own(store.subscribe(() => this.setItems(store.getFiltered().map((r) => r.data))));\n this.setItems(store ? store.getFiltered().map((r) => r.data) : (this.config.items ?? []));\n for (const p of this.config.plugins ?? []) {\n const off = p.init(this);\n if (off) this.own(off);\n }\n this.listen(this.el, 'click', (e: Event) => this.pick(e.target as HTMLElement));\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => e.key === 'Enter' && this.pick(e.target as HTMLElement));\n }\n\n private pick(el: HTMLElement) {\n const i = Number(el.closest<HTMLElement>('[data-i]')?.dataset.i);\n if (this.items[i]) this.emit('select', this.items[i]);\n }\n\n getItems(): TimelineItem[] {\n return this.items;\n }\n\n /** The time axis of a `range` timeline (set by the last paint), for plugins. */\n getScale(): TimelineScale | undefined {\n return this.scale;\n }\n\n setItems(items: TimelineItem[]) {\n this.items = items;\n if (this.rendered) this.paint();\n }\n\n private paint() {\n this.el.setAttribute('role', 'list');\n this.el.setAttribute('aria-label', this.config.ariaLabel ?? t('timeline'));\n this.el.replaceChildren(...(this.config.mode === 'range' ? this.range() : this.list()));\n this.emit('paint');\n }\n\n private list(): HTMLElement[] {\n return this.items.map((it, i) =>\n h('div', `op-timeline__item${it.tone && it.tone !== 'default' ? ` is-${it.tone}` : ''}`, { role: 'listitem', 'data-i': i, tabindex: 0 },\n h('div', 'op-timeline__when', {}, it.time ? when(it.time, /T/.test(it.time) ? { dateStyle: 'medium', timeStyle: 'short' } : { dateStyle: 'medium' }) : ''),\n h('div', 'op-timeline__marker', { 'aria-hidden': 'true' }, it.icon ? iconEl(it.icon) : null),\n h('div', 'op-timeline__body', {}, h('div', 'op-timeline__title', {}, it.title), it.text ? h('div', 'op-timeline__text', {}, it.text) : null),\n ),\n );\n }\n\n private range(): HTMLElement[] {\n const c = this.config;\n const clock = CLOCK.test(c.from ?? this.items.find((x) => x.start)?.start ?? '');\n const ms = (v: string) => (clock ? (Number(v.slice(0, -3)) * 60 + Number(v.slice(-2))) * 60000 : +new Date(/^\\d{4}-\\d{2}-\\d{2}$/.test(v) ? `${v}T00:00` : v));\n const spans = this.items.filter((x) => x.start).map((x) => ({ x, a: ms(x.start!), b: ms(x.end ?? x.start!) + (!clock && x.end && /^\\d{4}-\\d{2}-\\d{2}$/.test(x.end) ? DAY : 0) }));\n if (!spans.length && !(c.from && c.to)) return [];\n const lo = c.from ? ms(c.from) : Math.min(...spans.map((s) => s.a));\n const hi = c.to ? ms(c.to) + (/^\\d{4}-\\d{2}-\\d{2}$/.test(c.to) ? DAY : 0) : Math.max(...spans.map((s) => s.b), lo + 1);\n const pct = (v: number) => `${(Math.min(Math.max((v - lo) / (hi - lo), 0), 1) * 100).toFixed(3)}%`;\n const lanes = [...(c.lanes ?? []), ...spans.map((s) => s.x.lane ?? '').filter((l, i, a) => a.indexOf(l) === i && !(c.lanes ?? []).includes(l))];\n this.scale = { lo, hi, clock, parse: ms, format: (v) => (clock ? `${pad(Math.floor(v / 3600000))}:${pad(Math.round(v / 60000) % 60)}` : ((d) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`)(new Date(v))) };\n const long = !clock && hi - lo > 62 * DAY;\n const tickEls: HTMLElement[] = [];\n const tickAt = (at: number, text: string) => {\n const tick = h('span', 'op-timeline__tick', {}, text);\n tick.style.insetInlineStart = pct(at);\n tickEls.push(tick);\n };\n if (clock) for (let at = Math.ceil(lo / 3600000) * 3600000, hop = (hi - lo) / 3600000 > 14 ? 7200000 : 3600000; at < hi; at += hop) tickAt(at, this.scale.format(at));\n else\n for (let d = new Date(lo); +d < hi; long ? d.setMonth(d.getMonth() + 1, 1) : d.setDate(d.getDate() + 1)) {\n d.setHours(0, 0, 0, 0);\n if (+d < lo) continue;\n tickAt(+d, new Intl.DateTimeFormat(getLocale()._lang, long ? { month: 'short' } : { day: 'numeric', month: 'short' }).format(d));\n }\n const out: HTMLElement[] = [h('div', 'op-timeline__axis', {}, h('span', 'op-timeline__lane-name'), h('div', 'op-timeline__track', { 'aria-hidden': 'true' }, ...tickEls))];\n for (const lane of lanes) {\n const bars = spans.filter((s) => (s.x.lane ?? '') === lane).map(({ x, a, b }) => {\n const bar = h('div', `op-timeline__bar${x.tone && x.tone !== 'default' ? ` is-${x.tone}` : ''}`, { role: 'listitem', tabindex: 0, 'data-i': this.items.indexOf(x), 'aria-label': `${x.title}, ${t('tlFromTo', { from: when(x.start!, { dateStyle: 'medium', timeStyle: /T/.test(x.start!) ? 'short' : undefined }), to: when(x.end ?? x.start!, { dateStyle: 'medium', timeStyle: /T/.test(x.end ?? '') ? 'short' : undefined }) })}` }, x.icon ? iconEl(x.icon) : null, h('span', 'op-timeline__bar-text', {}, x.title));\n bar.title = x.text ?? x.title;\n bar.style.insetInlineStart = pct(a);\n bar.style.insetInlineEnd = `calc(100% - ${pct(Math.max(b, a + (hi - lo) / 200))})`;\n return bar;\n });\n out.push(h('div', 'op-timeline__lane', { role: 'group', 'aria-label': lane }, h('span', 'op-timeline__lane-name', {}, lane), h('div', 'op-timeline__track', {}, ...bars)));\n }\n const now = Date.now();\n if (c.now !== false && !clock && now >= lo && now <= hi) {\n const mark = h('div', 'op-timeline__now', { 'aria-hidden': 'true', title: t('tlNow') });\n mark.style.insetInlineStart = pct(now);\n out.push(h('div', 'op-timeline__nowrow', { 'aria-hidden': 'true' }, h('span', 'op-timeline__lane-name'), h('div', 'op-timeline__track', {}, mark)));\n }\n return out;\n }\n}\nregister('timeline', Timeline);\n"],
5
- "mappings": "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",
6
- "names": ["addMessages", "CLOCK", "pad", "n", "DAY", "when", "v", "o", "getLocale", "Timeline", "Component", "h", "store", "r", "p", "off", "e", "el", "items", "t", "it", "iconEl", "c", "clock", "x", "ms", "spans", "lo", "s", "hi", "pct", "lanes", "l", "i", "a", "d", "long", "tickEls", "tickAt", "at", "text", "tick", "hop", "out", "lane", "bars", "b", "bar", "now", "mark", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{d as o}from"./chunk-S4QD5NID.js";var r=()=>o()._lang,a=(t,e)=>{if(t==null||t==="")return"";let n=t instanceof Date?t:typeof t=="string"&&/^\d{4}-\d{2}-\d{2}$/.test(t)?new Date(+t.slice(0,4),+t.slice(5,7)-1,+t.slice(8,10)):new Date(t);return isNaN(+n)?String(t):new Intl.DateTimeFormat(r(),e).format(n)},i={number:(t,e)=>t==null||t===""?"":new Intl.NumberFormat(r(),e).format(t),money:(t,e)=>t==null||t===""?"":new Intl.NumberFormat(r(),{style:"currency",currency:o()._currency,...e}).format(t),percent:(t,e)=>t==null||t===""?"":new Intl.NumberFormat(r(),{style:"percent",maximumFractionDigits:1,...e}).format(t),date:(t,e)=>a(t,{dateStyle:"medium",...e}),datetime:(t,e)=>a(t,{dateStyle:"medium",timeStyle:"short",...e}),bool:t=>t?"\u2713":""};function s(t,e){i[t]=e}function l(t,e){let n=typeof t=="function"?t:i[t];if(!n)throw new Error(`Optikos: unknown format "${t}"`);return n(e)}export{s as a,l as b};
2
- //# sourceMappingURL=chunk-XQHATUKN.js.map
@@ -1,2 +0,0 @@
1
- import{a as u}from"./chunk-DWA45BWR.js";import{a as B}from"./chunk-3FCIZKIN.js";import{a as b}from"./chunk-ZSPJZ3ZH.js";import{a as L}from"./chunk-NNR2FNHG.js";import{a as T}from"./chunk-CFGCB37K.js";import{a as R}from"./chunk-U5L76VVB.js";import{a}from"./chunk-P4O57S6N.js";import{a as c}from"./chunk-S2CMWKVB.js";import{a as l}from"./chunk-TQPQ4UEA.js";import{a as y}from"./chunk-M7FNPRV4.js";import{a as v}from"./chunk-6PZPBPAD.js";import{a as F}from"./chunk-JJLOUMCJ.js";import{a as k}from"./chunk-4CWYF4O7.js";import{a as m}from"./chunk-5PWPAN62.js";import{a as S}from"./chunk-UQRQH2JW.js";import{a as w}from"./chunk-3F4MN2BU.js";import{a as C}from"./chunk-Z6L55FTN.js";import{a as x}from"./chunk-643FOYQB.js";import{a as h}from"./chunk-CMV3F6HR.js";import{a as f}from"./chunk-R32HPK7R.js";import{a as d}from"./chunk-4AZ44KV4.js";import{a as g}from"./chunk-2YRQULDC.js";import{a as p}from"./chunk-HLS5FI55.js";import{c as s}from"./chunk-BQEFLPDA.js";var n=(t,e,o,r={})=>new t({name:e,label:o,...r}),N={text:(t,e,o)=>n(g,t,e,o),email:(t,e,o)=>n(g,t,e,{inputType:"email",...o}),password:(t,e,o)=>n(g,t,e,{inputType:"password",...o}),area:(t,e,o)=>n(a,t,e,o),number:(t,e,o)=>n(f,t,e,o),mask:(t,e,o,r)=>n(m,t,e,{mask:o,...r}),time:(t,e,o)=>n(y,t,e,o),date:(t,e,o)=>n(d,t,e,o),datetime:(t,e,o)=>n(l,t,e,o),dateRange:(t,e,o)=>n(c,t,e,o),secret:(t,e,o)=>n(L,t,e,o),slider:(t,e,o)=>n(R,t,e,o),dial:(t,e,o)=>n(v,t,e,o),check:(t,e,o)=>n(C,t,void 0,{boxLabel:e,...o}),toggle:(t,e,o)=>n(u,t,void 0,{boxLabel:e,...o}),radio:(t,e,o,r)=>n(b,t,e,{options:o,...r}),checkGroup:(t,e,o,r)=>n(x,t,e,{options:o,...r}),select:(t,e,o,r)=>n(T,t,e,{options:o,...r}),combo:(t,e,o,r)=>n(h,t,e,{options:o,...r}),suggest:(t,e,o,r)=>n(k,t,e,{query:o,...r}),lookup:(t,e,o,r)=>n(F,t,e,{lookup:o,...r}),button:(t,e,o)=>new p({text:t,handler:e,...o}),primary:(t,e,o)=>new p({text:t,handler:e,variant:"primary",...o}),danger:(t,e,o)=>new p({text:t,handler:e,variant:"danger",...o}),row:(...t)=>new s({layout:"hbox",items:t}),col:(...t)=>new s({layout:"vbox",items:t}),grid:(t,...e)=>new s({layout:{type:"grid",columns:t},items:e}),panel:(t,e,o)=>new S({title:t,items:e,...o}),toolbar:(...t)=>new w({items:t}),form:(t,e)=>new B({items:t,...e})};var i=t=>t,ot=i({Default:"default",Primary:"primary",Danger:"danger",Ghost:"ghost"}),nt=i({Top:"top",Left:"left"}),rt=i({Vertical:"vertical",Horizontal:"horizontal"}),it=i({North:"north",South:"south",West:"west",East:"east",Center:"center"}),st=i({Right:"right",Left:"left",Top:"top",Bottom:"bottom"}),gt=i({Fit:"fit",HBox:"hbox",VBox:"vbox",Border:"border",Grid:"grid",Card:"card"}),pt=i({None:"none",Single:"single",Multi:"multi"}),at=i({Info:"info",Success:"success",Warning:"warning",Error:"error"}),ft=i({Eq:"eq",Ne:"ne",Contains:"contains",NotContains:"notContains",StartsWith:"startsWith",EndsWith:"endsWith",Gt:"gt",Ge:"ge",Lt:"lt",Le:"le",Between:"between",NotBetween:"notBetween",In:"in",Nin:"nin",Empty:"empty",NotEmpty:"notEmpty"}),mt=i({Light:"light",Dark:"dark"});export{N as a,ot as b,nt as c,rt as d,it as e,st as f,gt as g,pt as h,at as i,ft as j,mt as k};
2
- //# sourceMappingURL=chunk-YXOKWCYS.js.map