@gcsa/console-vue 0.1.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 (557) hide show
  1. package/dist/components/ConsoleHeader.vue.d.ts +18 -0
  2. package/dist/components/ConsoleHeader.vue.js +37 -0
  3. package/dist/components/ConsoleHeader.vue.js.map +1 -0
  4. package/dist/components/ConsoleHeader2.vue.js +5 -0
  5. package/dist/components/ConsoleHeader2.vue.js.map +1 -0
  6. package/dist/components/ConsolePage.vue.d.ts +18 -0
  7. package/dist/components/ConsolePage.vue.js +31 -0
  8. package/dist/components/ConsolePage.vue.js.map +1 -0
  9. package/dist/components/ConsolePage2.vue.js +5 -0
  10. package/dist/components/ConsolePage2.vue.js.map +1 -0
  11. package/dist/components/ConsoleShell.vue.d.ts +40 -0
  12. package/dist/components/ConsoleShell.vue.js +166 -0
  13. package/dist/components/ConsoleShell.vue.js.map +1 -0
  14. package/dist/components/ConsoleShell2.vue.js +5 -0
  15. package/dist/components/ConsoleShell2.vue.js.map +1 -0
  16. package/dist/components/ConsoleSidebar.vue.d.ts +13 -0
  17. package/dist/components/ConsoleSidebar.vue.js +52 -0
  18. package/dist/components/ConsoleSidebar.vue.js.map +1 -0
  19. package/dist/components/ConsoleSidebar2.vue.js +5 -0
  20. package/dist/components/ConsoleSidebar2.vue.js.map +1 -0
  21. package/dist/components/GcsaAlert.vue.d.ts +20 -0
  22. package/dist/components/GcsaAlert.vue.js +32 -0
  23. package/dist/components/GcsaAlert.vue.js.map +1 -0
  24. package/dist/components/GcsaAlert2.vue.js +5 -0
  25. package/dist/components/GcsaAlert2.vue.js.map +1 -0
  26. package/dist/components/GcsaAutoComplete.vue.d.ts +17 -0
  27. package/dist/components/GcsaAutoComplete.vue.js +136 -0
  28. package/dist/components/GcsaAutoComplete.vue.js.map +1 -0
  29. package/dist/components/GcsaAutoComplete2.vue.js +5 -0
  30. package/dist/components/GcsaAutoComplete2.vue.js.map +1 -0
  31. package/dist/components/GcsaAvatar.vue.d.ts +21 -0
  32. package/dist/components/GcsaAvatar.vue.js +23 -0
  33. package/dist/components/GcsaAvatar.vue.js.map +1 -0
  34. package/dist/components/GcsaAvatar2.vue.js +5 -0
  35. package/dist/components/GcsaAvatar2.vue.js.map +1 -0
  36. package/dist/components/GcsaBadge.vue.d.ts +20 -0
  37. package/dist/components/GcsaBadge.vue.js +20 -0
  38. package/dist/components/GcsaBadge.vue.js.map +1 -0
  39. package/dist/components/GcsaBadge2.vue.js +5 -0
  40. package/dist/components/GcsaBadge2.vue.js.map +1 -0
  41. package/dist/components/GcsaBrandMark.vue.d.ts +3 -0
  42. package/dist/components/GcsaBrandMark.vue.js +30 -0
  43. package/dist/components/GcsaBrandMark.vue.js.map +1 -0
  44. package/dist/components/GcsaBrandMark2.vue.js +5 -0
  45. package/dist/components/GcsaBrandMark2.vue.js.map +1 -0
  46. package/dist/components/GcsaBreadcrumb.vue.d.ts +3 -0
  47. package/dist/components/GcsaBreadcrumb.vue.js +37 -0
  48. package/dist/components/GcsaBreadcrumb.vue.js.map +1 -0
  49. package/dist/components/GcsaBreadcrumb2.vue.js +5 -0
  50. package/dist/components/GcsaBreadcrumb2.vue.js.map +1 -0
  51. package/dist/components/GcsaButton.vue.d.ts +23 -0
  52. package/dist/components/GcsaButton.vue.js +34 -0
  53. package/dist/components/GcsaButton.vue.js.map +1 -0
  54. package/dist/components/GcsaButton2.vue.js +5 -0
  55. package/dist/components/GcsaButton2.vue.js.map +1 -0
  56. package/dist/components/GcsaCalendar.vue.d.ts +11 -0
  57. package/dist/components/GcsaCalendar.vue.js +154 -0
  58. package/dist/components/GcsaCalendar.vue.js.map +1 -0
  59. package/dist/components/GcsaCalendar2.vue.js +5 -0
  60. package/dist/components/GcsaCalendar2.vue.js.map +1 -0
  61. package/dist/components/GcsaCard.vue.d.ts +19 -0
  62. package/dist/components/GcsaCard.vue.js +32 -0
  63. package/dist/components/GcsaCard.vue.js.map +1 -0
  64. package/dist/components/GcsaCard2.vue.js +5 -0
  65. package/dist/components/GcsaCard2.vue.js.map +1 -0
  66. package/dist/components/GcsaCascader.vue.d.ts +15 -0
  67. package/dist/components/GcsaCascader.vue.js +114 -0
  68. package/dist/components/GcsaCascader.vue.js.map +1 -0
  69. package/dist/components/GcsaCascader2.vue.js +5 -0
  70. package/dist/components/GcsaCascader2.vue.js.map +1 -0
  71. package/dist/components/GcsaChatPanel.vue.d.ts +61 -0
  72. package/dist/components/GcsaChatPanel.vue.js +291 -0
  73. package/dist/components/GcsaChatPanel.vue.js.map +1 -0
  74. package/dist/components/GcsaChatPanel2.vue.js +5 -0
  75. package/dist/components/GcsaChatPanel2.vue.js.map +1 -0
  76. package/dist/components/GcsaCheckbox.vue.d.ts +22 -0
  77. package/dist/components/GcsaCheckbox.vue.js +71 -0
  78. package/dist/components/GcsaCheckbox.vue.js.map +1 -0
  79. package/dist/components/GcsaCheckbox2.vue.js +5 -0
  80. package/dist/components/GcsaCheckbox2.vue.js.map +1 -0
  81. package/dist/components/GcsaCollapse.vue.d.ts +31 -0
  82. package/dist/components/GcsaCollapse.vue.js +71 -0
  83. package/dist/components/GcsaCollapse.vue.js.map +1 -0
  84. package/dist/components/GcsaCollapse2.vue.js +5 -0
  85. package/dist/components/GcsaCollapse2.vue.js.map +1 -0
  86. package/dist/components/GcsaConfigProvider.vue.d.ts +23 -0
  87. package/dist/components/GcsaConfigProvider.vue.js +103 -0
  88. package/dist/components/GcsaConfigProvider.vue.js.map +1 -0
  89. package/dist/components/GcsaConfigProvider2.vue.js +5 -0
  90. package/dist/components/GcsaConfigProvider2.vue.js.map +1 -0
  91. package/dist/components/GcsaDataTable.vue.d.ts +84 -0
  92. package/dist/components/GcsaDataTable.vue.js +1020 -0
  93. package/dist/components/GcsaDataTable.vue.js.map +1 -0
  94. package/dist/components/GcsaDataTable2.vue.js +5 -0
  95. package/dist/components/GcsaDataTable2.vue.js.map +1 -0
  96. package/dist/components/GcsaDatePicker.vue.d.ts +10 -0
  97. package/dist/components/GcsaDatePicker.vue.js +319 -0
  98. package/dist/components/GcsaDatePicker.vue.js.map +1 -0
  99. package/dist/components/GcsaDatePicker2.vue.js +5 -0
  100. package/dist/components/GcsaDatePicker2.vue.js.map +1 -0
  101. package/dist/components/GcsaDateRangeMonthPanel.vue.d.ts +3 -0
  102. package/dist/components/GcsaDateRangeMonthPanel.vue.js +110 -0
  103. package/dist/components/GcsaDateRangeMonthPanel.vue.js.map +1 -0
  104. package/dist/components/GcsaDateRangeMonthPanel2.vue.js +5 -0
  105. package/dist/components/GcsaDateRangeMonthPanel2.vue.js.map +1 -0
  106. package/dist/components/GcsaDateRangePicker.vue.d.ts +10 -0
  107. package/dist/components/GcsaDateRangePicker.vue.js +252 -0
  108. package/dist/components/GcsaDateRangePicker.vue.js.map +1 -0
  109. package/dist/components/GcsaDateRangePicker2.vue.js +5 -0
  110. package/dist/components/GcsaDateRangePicker2.vue.js.map +1 -0
  111. package/dist/components/GcsaDateTimePicker.vue.d.ts +11 -0
  112. package/dist/components/GcsaDateTimePicker.vue.js +360 -0
  113. package/dist/components/GcsaDateTimePicker.vue.js.map +1 -0
  114. package/dist/components/GcsaDateTimePicker2.vue.js +5 -0
  115. package/dist/components/GcsaDateTimePicker2.vue.js.map +1 -0
  116. package/dist/components/GcsaDescriptions.vue.d.ts +3 -0
  117. package/dist/components/GcsaDescriptions.vue.js +23 -0
  118. package/dist/components/GcsaDescriptions.vue.js.map +1 -0
  119. package/dist/components/GcsaDescriptions2.vue.js +5 -0
  120. package/dist/components/GcsaDescriptions2.vue.js.map +1 -0
  121. package/dist/components/GcsaDivider.vue.d.ts +3 -0
  122. package/dist/components/GcsaDivider.vue.js +15 -0
  123. package/dist/components/GcsaDivider.vue.js.map +1 -0
  124. package/dist/components/GcsaDivider2.vue.js +5 -0
  125. package/dist/components/GcsaDivider2.vue.js.map +1 -0
  126. package/dist/components/GcsaDrawer.vue.d.ts +30 -0
  127. package/dist/components/GcsaDrawer.vue.js +115 -0
  128. package/dist/components/GcsaDrawer.vue.js.map +1 -0
  129. package/dist/components/GcsaDrawer2.vue.js +5 -0
  130. package/dist/components/GcsaDrawer2.vue.js.map +1 -0
  131. package/dist/components/GcsaDropdown.vue.d.ts +26 -0
  132. package/dist/components/GcsaDropdown.vue.js +108 -0
  133. package/dist/components/GcsaDropdown.vue.js.map +1 -0
  134. package/dist/components/GcsaDropdown2.vue.js +5 -0
  135. package/dist/components/GcsaDropdown2.vue.js.map +1 -0
  136. package/dist/components/GcsaEmpty.vue.d.ts +19 -0
  137. package/dist/components/GcsaEmpty.vue.js +39 -0
  138. package/dist/components/GcsaEmpty.vue.js.map +1 -0
  139. package/dist/components/GcsaEmpty2.vue.js +5 -0
  140. package/dist/components/GcsaEmpty2.vue.js.map +1 -0
  141. package/dist/components/GcsaField.vue.d.ts +18 -0
  142. package/dist/components/GcsaField.vue.js +73 -0
  143. package/dist/components/GcsaField.vue.js.map +1 -0
  144. package/dist/components/GcsaField2.vue.js +5 -0
  145. package/dist/components/GcsaField2.vue.js.map +1 -0
  146. package/dist/components/GcsaForm.vue.d.ts +32 -0
  147. package/dist/components/GcsaForm.vue.js +77 -0
  148. package/dist/components/GcsaForm.vue.js.map +1 -0
  149. package/dist/components/GcsaForm2.vue.js +5 -0
  150. package/dist/components/GcsaForm2.vue.js.map +1 -0
  151. package/dist/components/GcsaFormField.vue.d.ts +39 -0
  152. package/dist/components/GcsaFormField.vue.js +54 -0
  153. package/dist/components/GcsaFormField.vue.js.map +1 -0
  154. package/dist/components/GcsaFormField2.vue.js +5 -0
  155. package/dist/components/GcsaFormField2.vue.js.map +1 -0
  156. package/dist/components/GcsaIcon.vue.d.ts +5 -0
  157. package/dist/components/GcsaIcon.vue.js +21 -0
  158. package/dist/components/GcsaIcon.vue.js.map +1 -0
  159. package/dist/components/GcsaIcon2.vue.js +5 -0
  160. package/dist/components/GcsaIcon2.vue.js.map +1 -0
  161. package/dist/components/GcsaImagePreview.vue.d.ts +9 -0
  162. package/dist/components/GcsaImagePreview.vue.js +64 -0
  163. package/dist/components/GcsaImagePreview.vue.js.map +1 -0
  164. package/dist/components/GcsaImagePreview2.vue.js +5 -0
  165. package/dist/components/GcsaImagePreview2.vue.js.map +1 -0
  166. package/dist/components/GcsaInput.vue.d.ts +19 -0
  167. package/dist/components/GcsaInput.vue.js +67 -0
  168. package/dist/components/GcsaInput.vue.js.map +1 -0
  169. package/dist/components/GcsaInput2.vue.js +5 -0
  170. package/dist/components/GcsaInput2.vue.js.map +1 -0
  171. package/dist/components/GcsaInputGroup.vue.d.ts +22 -0
  172. package/dist/components/GcsaInputGroup.vue.js +38 -0
  173. package/dist/components/GcsaInputGroup.vue.js.map +1 -0
  174. package/dist/components/GcsaInputGroup2.vue.js +5 -0
  175. package/dist/components/GcsaInputGroup2.vue.js.map +1 -0
  176. package/dist/components/GcsaInputNumber.vue.d.ts +13 -0
  177. package/dist/components/GcsaInputNumber.vue.js +135 -0
  178. package/dist/components/GcsaInputNumber.vue.js.map +1 -0
  179. package/dist/components/GcsaInputNumber2.vue.js +5 -0
  180. package/dist/components/GcsaInputNumber2.vue.js.map +1 -0
  181. package/dist/components/GcsaLoadingMask.vue.d.ts +3 -0
  182. package/dist/components/GcsaLoadingMask.vue.js +47 -0
  183. package/dist/components/GcsaLoadingMask.vue.js.map +1 -0
  184. package/dist/components/GcsaLoadingMask2.vue.js +5 -0
  185. package/dist/components/GcsaLoadingMask2.vue.js.map +1 -0
  186. package/dist/components/GcsaMarkdownRenderer.vue.d.ts +7 -0
  187. package/dist/components/GcsaMarkdownRenderer.vue.js +35 -0
  188. package/dist/components/GcsaMarkdownRenderer.vue.js.map +1 -0
  189. package/dist/components/GcsaMarkdownRenderer2.vue.js +5 -0
  190. package/dist/components/GcsaMarkdownRenderer2.vue.js.map +1 -0
  191. package/dist/components/GcsaMenu.vue.d.ts +14 -0
  192. package/dist/components/GcsaMenu.vue.js +63 -0
  193. package/dist/components/GcsaMenu.vue.js.map +1 -0
  194. package/dist/components/GcsaMenu2.vue.js +5 -0
  195. package/dist/components/GcsaMenu2.vue.js.map +1 -0
  196. package/dist/components/GcsaMenuNodes.vue.d.ts +9 -0
  197. package/dist/components/GcsaMenuNodes.vue.js +306 -0
  198. package/dist/components/GcsaMenuNodes.vue.js.map +1 -0
  199. package/dist/components/GcsaMenuNodes2.vue.js +5 -0
  200. package/dist/components/GcsaMenuNodes2.vue.js.map +1 -0
  201. package/dist/components/GcsaModal.vue.d.ts +26 -0
  202. package/dist/components/GcsaModal.vue.js +127 -0
  203. package/dist/components/GcsaModal.vue.js.map +1 -0
  204. package/dist/components/GcsaModal2.vue.js +5 -0
  205. package/dist/components/GcsaModal2.vue.js.map +1 -0
  206. package/dist/components/GcsaMultiSelect.vue.d.ts +16 -0
  207. package/dist/components/GcsaMultiSelect.vue.js +235 -0
  208. package/dist/components/GcsaMultiSelect.vue.js.map +1 -0
  209. package/dist/components/GcsaMultiSelect2.vue.js +5 -0
  210. package/dist/components/GcsaMultiSelect2.vue.js.map +1 -0
  211. package/dist/components/GcsaPagination.vue.d.ts +15 -0
  212. package/dist/components/GcsaPagination.vue.js +119 -0
  213. package/dist/components/GcsaPagination.vue.js.map +1 -0
  214. package/dist/components/GcsaPagination2.vue.js +5 -0
  215. package/dist/components/GcsaPagination2.vue.js.map +1 -0
  216. package/dist/components/GcsaPopconfirm.vue.d.ts +29 -0
  217. package/dist/components/GcsaPopconfirm.vue.js +133 -0
  218. package/dist/components/GcsaPopconfirm.vue.js.map +1 -0
  219. package/dist/components/GcsaPopconfirm2.vue.js +5 -0
  220. package/dist/components/GcsaPopconfirm2.vue.js.map +1 -0
  221. package/dist/components/GcsaPopover.vue.d.ts +21 -0
  222. package/dist/components/GcsaPopover.vue.js +138 -0
  223. package/dist/components/GcsaPopover.vue.js.map +1 -0
  224. package/dist/components/GcsaPopover2.vue.js +5 -0
  225. package/dist/components/GcsaPopover2.vue.js.map +1 -0
  226. package/dist/components/GcsaPortal.vue.d.ts +21 -0
  227. package/dist/components/GcsaPortal.vue.js +32 -0
  228. package/dist/components/GcsaPortal.vue.js.map +1 -0
  229. package/dist/components/GcsaPortal2.vue.js +5 -0
  230. package/dist/components/GcsaPortal2.vue.js.map +1 -0
  231. package/dist/components/GcsaProgress.vue.d.ts +5 -0
  232. package/dist/components/GcsaProgress.vue.js +26 -0
  233. package/dist/components/GcsaProgress.vue.js.map +1 -0
  234. package/dist/components/GcsaProgress2.vue.js +5 -0
  235. package/dist/components/GcsaProgress2.vue.js.map +1 -0
  236. package/dist/components/GcsaRadioGroup.vue.d.ts +9 -0
  237. package/dist/components/GcsaRadioGroup.vue.js +61 -0
  238. package/dist/components/GcsaRadioGroup.vue.js.map +1 -0
  239. package/dist/components/GcsaRadioGroup2.vue.js +5 -0
  240. package/dist/components/GcsaRadioGroup2.vue.js.map +1 -0
  241. package/dist/components/GcsaResult.vue.d.ts +19 -0
  242. package/dist/components/GcsaResult.vue.js +37 -0
  243. package/dist/components/GcsaResult.vue.js.map +1 -0
  244. package/dist/components/GcsaResult2.vue.js +5 -0
  245. package/dist/components/GcsaResult2.vue.js.map +1 -0
  246. package/dist/components/GcsaRow.vue.d.ts +20 -0
  247. package/dist/components/GcsaRow.vue.js +19 -0
  248. package/dist/components/GcsaRow.vue.js.map +1 -0
  249. package/dist/components/GcsaRow2.vue.js +5 -0
  250. package/dist/components/GcsaRow2.vue.js.map +1 -0
  251. package/dist/components/GcsaSelect.vue.d.ts +15 -0
  252. package/dist/components/GcsaSelect.vue.js +183 -0
  253. package/dist/components/GcsaSelect.vue.js.map +1 -0
  254. package/dist/components/GcsaSelect2.vue.js +5 -0
  255. package/dist/components/GcsaSelect2.vue.js.map +1 -0
  256. package/dist/components/GcsaSkeleton.vue.d.ts +6 -0
  257. package/dist/components/GcsaSkeleton.vue.js +20 -0
  258. package/dist/components/GcsaSkeleton.vue.js.map +1 -0
  259. package/dist/components/GcsaSkeleton2.vue.js +5 -0
  260. package/dist/components/GcsaSkeleton2.vue.js.map +1 -0
  261. package/dist/components/GcsaSpace.vue.d.ts +18 -0
  262. package/dist/components/GcsaSpace.vue.js +19 -0
  263. package/dist/components/GcsaSpace.vue.js.map +1 -0
  264. package/dist/components/GcsaSpace2.vue.js +5 -0
  265. package/dist/components/GcsaSpace2.vue.js.map +1 -0
  266. package/dist/components/GcsaSpin.vue.d.ts +20 -0
  267. package/dist/components/GcsaSpin.vue.js +29 -0
  268. package/dist/components/GcsaSpin.vue.js.map +1 -0
  269. package/dist/components/GcsaSpin2.vue.js +5 -0
  270. package/dist/components/GcsaSpin2.vue.js.map +1 -0
  271. package/dist/components/GcsaStatistic.vue.d.ts +18 -0
  272. package/dist/components/GcsaStatistic.vue.js +23 -0
  273. package/dist/components/GcsaStatistic.vue.js.map +1 -0
  274. package/dist/components/GcsaStatistic2.vue.js +5 -0
  275. package/dist/components/GcsaStatistic2.vue.js.map +1 -0
  276. package/dist/components/GcsaSteps.vue.d.ts +14 -0
  277. package/dist/components/GcsaSteps.vue.js +77 -0
  278. package/dist/components/GcsaSteps.vue.js.map +1 -0
  279. package/dist/components/GcsaSteps2.vue.js +5 -0
  280. package/dist/components/GcsaSteps2.vue.js.map +1 -0
  281. package/dist/components/GcsaSwitch.vue.d.ts +22 -0
  282. package/dist/components/GcsaSwitch.vue.js +52 -0
  283. package/dist/components/GcsaSwitch.vue.js.map +1 -0
  284. package/dist/components/GcsaSwitch2.vue.js +5 -0
  285. package/dist/components/GcsaSwitch2.vue.js.map +1 -0
  286. package/dist/components/GcsaTabs.vue.d.ts +22 -0
  287. package/dist/components/GcsaTabs.vue.js +61 -0
  288. package/dist/components/GcsaTabs.vue.js.map +1 -0
  289. package/dist/components/GcsaTabs2.vue.js +5 -0
  290. package/dist/components/GcsaTabs2.vue.js.map +1 -0
  291. package/dist/components/GcsaTag.vue.d.ts +18 -0
  292. package/dist/components/GcsaTag.vue.js +19 -0
  293. package/dist/components/GcsaTag.vue.js.map +1 -0
  294. package/dist/components/GcsaTag2.vue.js +5 -0
  295. package/dist/components/GcsaTag2.vue.js.map +1 -0
  296. package/dist/components/GcsaTextarea.vue.d.ts +18 -0
  297. package/dist/components/GcsaTextarea.vue.js +66 -0
  298. package/dist/components/GcsaTextarea.vue.js.map +1 -0
  299. package/dist/components/GcsaTextarea2.vue.js +5 -0
  300. package/dist/components/GcsaTextarea2.vue.js.map +1 -0
  301. package/dist/components/GcsaTimePicker.vue.d.ts +17 -0
  302. package/dist/components/GcsaTimePicker.vue.js +264 -0
  303. package/dist/components/GcsaTimePicker.vue.js.map +1 -0
  304. package/dist/components/GcsaTimePicker2.vue.js +5 -0
  305. package/dist/components/GcsaTimePicker2.vue.js.map +1 -0
  306. package/dist/components/GcsaTimeline.vue.d.ts +3 -0
  307. package/dist/components/GcsaTimeline.vue.js +41 -0
  308. package/dist/components/GcsaTimeline.vue.js.map +1 -0
  309. package/dist/components/GcsaTimeline2.vue.js +5 -0
  310. package/dist/components/GcsaTimeline2.vue.js.map +1 -0
  311. package/dist/components/GcsaToastStack.vue.d.ts +3 -0
  312. package/dist/components/GcsaToastStack.vue.js +96 -0
  313. package/dist/components/GcsaToastStack.vue.js.map +1 -0
  314. package/dist/components/GcsaToastStack2.vue.js +5 -0
  315. package/dist/components/GcsaToastStack2.vue.js.map +1 -0
  316. package/dist/components/GcsaTooltip.vue.d.ts +28 -0
  317. package/dist/components/GcsaTooltip.vue.js +102 -0
  318. package/dist/components/GcsaTooltip.vue.js.map +1 -0
  319. package/dist/components/GcsaTooltip2.vue.js +5 -0
  320. package/dist/components/GcsaTooltip2.vue.js.map +1 -0
  321. package/dist/components/GcsaTransfer.vue.d.ts +12 -0
  322. package/dist/components/GcsaTransfer.vue.js +139 -0
  323. package/dist/components/GcsaTransfer.vue.js.map +1 -0
  324. package/dist/components/GcsaTransfer2.vue.js +5 -0
  325. package/dist/components/GcsaTransfer2.vue.js.map +1 -0
  326. package/dist/components/GcsaTree.vue.d.ts +14 -0
  327. package/dist/components/GcsaTree.vue.js +76 -0
  328. package/dist/components/GcsaTree.vue.js.map +1 -0
  329. package/dist/components/GcsaTree2.vue.js +5 -0
  330. package/dist/components/GcsaTree2.vue.js.map +1 -0
  331. package/dist/components/GcsaTypography.vue.d.ts +21 -0
  332. package/dist/components/GcsaTypography.vue.js +21 -0
  333. package/dist/components/GcsaTypography.vue.js.map +1 -0
  334. package/dist/components/GcsaTypography2.vue.js +5 -0
  335. package/dist/components/GcsaTypography2.vue.js.map +1 -0
  336. package/dist/components/GcsaUpload.vue.d.ts +26 -0
  337. package/dist/components/GcsaUpload.vue.js +160 -0
  338. package/dist/components/GcsaUpload.vue.js.map +1 -0
  339. package/dist/components/GcsaUpload2.vue.js +5 -0
  340. package/dist/components/GcsaUpload2.vue.js.map +1 -0
  341. package/dist/components/gcsaDataTableTypes.d.ts +18 -0
  342. package/dist/composables/gcsaFormTypes.d.ts +9 -0
  343. package/dist/composables/useDocumentThemeSync.d.ts +3 -0
  344. package/dist/composables/useDocumentThemeSync.js +7 -0
  345. package/dist/composables/useDocumentThemeSync.js.map +1 -0
  346. package/dist/composables/useGcsaComponentSize.d.ts +7 -0
  347. package/dist/composables/useGcsaComponentSize.js +26 -0
  348. package/dist/composables/useGcsaComponentSize.js.map +1 -0
  349. package/dist/composables/useGcsaFormField.d.ts +26 -0
  350. package/dist/composables/useGcsaFormField.js +47 -0
  351. package/dist/composables/useGcsaFormField.js.map +1 -0
  352. package/dist/composables/useGcsaFormSchema.d.ts +3 -0
  353. package/dist/composables/useGcsaFormSchema.js +7 -0
  354. package/dist/composables/useGcsaFormSchema.js.map +1 -0
  355. package/dist/composables/useGcsaLocale.d.ts +5 -0
  356. package/dist/composables/useGcsaLocale.js +17 -0
  357. package/dist/composables/useGcsaLocale.js.map +1 -0
  358. package/dist/composables/useGcsaMessage.d.ts +2 -0
  359. package/dist/composables/useGcsaMessage.js +12 -0
  360. package/dist/composables/useGcsaMessage.js.map +1 -0
  361. package/dist/composables/useGcsaPopupZIndex.d.ts +6 -0
  362. package/dist/composables/useGcsaPopupZIndex.js +16 -0
  363. package/dist/composables/useGcsaPopupZIndex.js.map +1 -0
  364. package/dist/composables/useGcsaTextCount.d.ts +17 -0
  365. package/dist/composables/useGcsaTextCount.js +21 -0
  366. package/dist/composables/useGcsaTextCount.js.map +1 -0
  367. package/dist/composables/useGcsaTheme.d.ts +3 -0
  368. package/dist/composables/useGcsaTheme.js +11 -0
  369. package/dist/composables/useGcsaTheme.js.map +1 -0
  370. package/dist/composables/useGcsaZIndex.d.ts +10 -0
  371. package/dist/composables/useGcsaZIndex.js +44 -0
  372. package/dist/composables/useGcsaZIndex.js.map +1 -0
  373. package/dist/composables/useMessage.d.ts +7 -0
  374. package/dist/composables/useMessage.js +5 -0
  375. package/dist/composables/useMessage.js.map +1 -0
  376. package/dist/composables/usePreserveScrollOnFocus.d.ts +4 -0
  377. package/dist/composables/usePreserveScrollOnFocus.js +86 -0
  378. package/dist/composables/usePreserveScrollOnFocus.js.map +1 -0
  379. package/dist/icons/iconNames.d.ts +7 -0
  380. package/dist/icons/iconNames.js +24 -0
  381. package/dist/icons/iconNames.js.map +1 -0
  382. package/dist/icons/index.d.ts +2 -0
  383. package/dist/icons/registry.d.ts +3 -0
  384. package/dist/icons/registry.js +58 -0
  385. package/dist/icons/registry.js.map +1 -0
  386. package/dist/icons/svg/alert.svg.js +9 -0
  387. package/dist/icons/svg/alert.svg.js.map +1 -0
  388. package/dist/icons/svg/assets.svg.js +9 -0
  389. package/dist/icons/svg/assets.svg.js.map +1 -0
  390. package/dist/icons/svg/chat.svg.js +8 -0
  391. package/dist/icons/svg/chat.svg.js.map +1 -0
  392. package/dist/icons/svg/check.svg.js +8 -0
  393. package/dist/icons/svg/check.svg.js.map +1 -0
  394. package/dist/icons/svg/chevron-down.svg.js +8 -0
  395. package/dist/icons/svg/chevron-down.svg.js.map +1 -0
  396. package/dist/icons/svg/chevron-left.svg.js +8 -0
  397. package/dist/icons/svg/chevron-left.svg.js.map +1 -0
  398. package/dist/icons/svg/chevron-right.svg.js +8 -0
  399. package/dist/icons/svg/chevron-right.svg.js.map +1 -0
  400. package/dist/icons/svg/chevron-up.svg.js +8 -0
  401. package/dist/icons/svg/chevron-up.svg.js.map +1 -0
  402. package/dist/icons/svg/close.svg.js +6 -0
  403. package/dist/icons/svg/close.svg.js.map +1 -0
  404. package/dist/icons/svg/dashboard.svg.js +8 -0
  405. package/dist/icons/svg/dashboard.svg.js.map +1 -0
  406. package/dist/icons/svg/menu.svg.js +8 -0
  407. package/dist/icons/svg/menu.svg.js.map +1 -0
  408. package/dist/icons/svg/plus.svg.js +6 -0
  409. package/dist/icons/svg/plus.svg.js.map +1 -0
  410. package/dist/icons/svg/result-empty.svg.js +6 -0
  411. package/dist/icons/svg/result-empty.svg.js.map +1 -0
  412. package/dist/icons/svg/settings.svg.js +8 -0
  413. package/dist/icons/svg/settings.svg.js.map +1 -0
  414. package/dist/icons/svg/users.svg.js +11 -0
  415. package/dist/icons/svg/users.svg.js.map +1 -0
  416. package/dist/index.d.ts +87 -0
  417. package/dist/index.js +172 -0
  418. package/dist/index.js.map +1 -0
  419. package/dist/loading/directive.d.ts +5 -0
  420. package/dist/loading/directive.js +57 -0
  421. package/dist/loading/directive.js.map +1 -0
  422. package/dist/loading/index.d.ts +7 -0
  423. package/dist/loading/index.js +14 -0
  424. package/dist/loading/index.js.map +1 -0
  425. package/dist/loading/service.d.ts +28 -0
  426. package/dist/loading/service.js +106 -0
  427. package/dist/loading/service.js.map +1 -0
  428. package/dist/resolver.d.ts +16 -0
  429. package/dist/resolver.js +16 -0
  430. package/dist/resolver.js.map +1 -0
  431. package/dist/style.css +8028 -0
  432. package/dist/types/componentProps.d.ts +565 -0
  433. package/dist/types/index.d.ts +2 -0
  434. package/dist/types/shared.d.ts +42 -0
  435. package/dist/utils/gcsaDateValue.d.ts +24 -0
  436. package/dist/utils/gcsaDateValue.js +60 -0
  437. package/dist/utils/gcsaDateValue.js.map +1 -0
  438. package/dist/utils/gcsaTableColumns.d.ts +19 -0
  439. package/dist/utils/gcsaTableColumns.js +50 -0
  440. package/dist/utils/gcsaTableColumns.js.map +1 -0
  441. package/dist/utils/zodValidators.d.ts +21 -0
  442. package/dist/utils/zodValidators.js +35 -0
  443. package/dist/utils/zodValidators.js.map +1 -0
  444. package/package.json +67 -0
  445. package/src/components/ConsoleHeader.vue +22 -0
  446. package/src/components/ConsolePage.vue +17 -0
  447. package/src/components/ConsoleShell.vue +206 -0
  448. package/src/components/ConsoleSidebar.vue +61 -0
  449. package/src/components/GcsaAlert.vue +25 -0
  450. package/src/components/GcsaAutoComplete.vue +165 -0
  451. package/src/components/GcsaAvatar.vue +19 -0
  452. package/src/components/GcsaBadge.vue +16 -0
  453. package/src/components/GcsaBrandMark.vue +20 -0
  454. package/src/components/GcsaBreadcrumb.vue +20 -0
  455. package/src/components/GcsaButton.vue +32 -0
  456. package/src/components/GcsaCalendar.vue +39 -0
  457. package/src/components/GcsaCard.vue +20 -0
  458. package/src/components/GcsaCascader.vue +84 -0
  459. package/src/components/GcsaChatPanel.vue +249 -0
  460. package/src/components/GcsaCheckbox.vue +45 -0
  461. package/src/components/GcsaCollapse.vue +51 -0
  462. package/src/components/GcsaConfigProvider.vue +147 -0
  463. package/src/components/GcsaDataTable.vue +1183 -0
  464. package/src/components/GcsaDatePicker.vue +232 -0
  465. package/src/components/GcsaDateRangeMonthPanel.vue +66 -0
  466. package/src/components/GcsaDateRangePicker.vue +208 -0
  467. package/src/components/GcsaDateTimePicker.vue +379 -0
  468. package/src/components/GcsaDescriptions.vue +16 -0
  469. package/src/components/GcsaDivider.vue +11 -0
  470. package/src/components/GcsaDrawer.vue +97 -0
  471. package/src/components/GcsaDropdown.vue +84 -0
  472. package/src/components/GcsaEmpty.vue +28 -0
  473. package/src/components/GcsaField.vue +27 -0
  474. package/src/components/GcsaForm.vue +70 -0
  475. package/src/components/GcsaFormField.vue +53 -0
  476. package/src/components/GcsaIcon.vue +24 -0
  477. package/src/components/GcsaImagePreview.vue +28 -0
  478. package/src/components/GcsaInput.vue +80 -0
  479. package/src/components/GcsaInputGroup.vue +37 -0
  480. package/src/components/GcsaInputNumber.vue +165 -0
  481. package/src/components/GcsaLoadingMask.vue +49 -0
  482. package/src/components/GcsaMarkdownRenderer.vue +49 -0
  483. package/src/components/GcsaMenu.vue +86 -0
  484. package/src/components/GcsaMenuNodes.vue +226 -0
  485. package/src/components/GcsaModal.vue +106 -0
  486. package/src/components/GcsaMultiSelect.vue +197 -0
  487. package/src/components/GcsaPagination.vue +147 -0
  488. package/src/components/GcsaPopconfirm.vue +93 -0
  489. package/src/components/GcsaPopover.vue +121 -0
  490. package/src/components/GcsaPortal.vue +41 -0
  491. package/src/components/GcsaProgress.vue +16 -0
  492. package/src/components/GcsaRadioGroup.vue +45 -0
  493. package/src/components/GcsaResult.vue +23 -0
  494. package/src/components/GcsaRow.vue +16 -0
  495. package/src/components/GcsaSelect.vue +154 -0
  496. package/src/components/GcsaSkeleton.vue +21 -0
  497. package/src/components/GcsaSpace.vue +13 -0
  498. package/src/components/GcsaSpin.vue +25 -0
  499. package/src/components/GcsaStatistic.vue +16 -0
  500. package/src/components/GcsaSteps.vue +30 -0
  501. package/src/components/GcsaSwitch.vue +38 -0
  502. package/src/components/GcsaTabs.vue +55 -0
  503. package/src/components/GcsaTag.vue +13 -0
  504. package/src/components/GcsaTextarea.vue +77 -0
  505. package/src/components/GcsaTimePicker.vue +306 -0
  506. package/src/components/GcsaTimeline.vue +17 -0
  507. package/src/components/GcsaToastStack.vue +45 -0
  508. package/src/components/GcsaTooltip.vue +79 -0
  509. package/src/components/GcsaTransfer.vue +50 -0
  510. package/src/components/GcsaTree.vue +56 -0
  511. package/src/components/GcsaTypography.vue +28 -0
  512. package/src/components/GcsaUpload.vue +154 -0
  513. package/src/components/gcsaDataTableTypes.ts +18 -0
  514. package/src/composables/gcsaFormTypes.ts +30 -0
  515. package/src/composables/useDocumentThemeSync.ts +6 -0
  516. package/src/composables/useGcsaComponentSize.ts +30 -0
  517. package/src/composables/useGcsaFormField.ts +49 -0
  518. package/src/composables/useGcsaFormSchema.ts +6 -0
  519. package/src/composables/useGcsaLocale.ts +18 -0
  520. package/src/composables/useGcsaMessage.ts +10 -0
  521. package/src/composables/useGcsaPopupZIndex.ts +24 -0
  522. package/src/composables/useGcsaTextCount.ts +48 -0
  523. package/src/composables/useGcsaTheme.ts +9 -0
  524. package/src/composables/useGcsaZIndex.ts +62 -0
  525. package/src/composables/useMessage.ts +9 -0
  526. package/src/composables/usePreserveScrollOnFocus.ts +153 -0
  527. package/src/icons/iconNames.ts +27 -0
  528. package/src/icons/index.ts +8 -0
  529. package/src/icons/registry.ts +43 -0
  530. package/src/icons/svg/alert.svg +4 -0
  531. package/src/icons/svg/assets.svg +4 -0
  532. package/src/icons/svg/chat.svg +3 -0
  533. package/src/icons/svg/check.svg +3 -0
  534. package/src/icons/svg/chevron-down.svg +3 -0
  535. package/src/icons/svg/chevron-left.svg +3 -0
  536. package/src/icons/svg/chevron-right.svg +3 -0
  537. package/src/icons/svg/chevron-up.svg +3 -0
  538. package/src/icons/svg/close.svg +1 -0
  539. package/src/icons/svg/dashboard.svg +3 -0
  540. package/src/icons/svg/menu.svg +3 -0
  541. package/src/icons/svg/plus.svg +1 -0
  542. package/src/icons/svg/result-empty.svg +1 -0
  543. package/src/icons/svg/settings.svg +3 -0
  544. package/src/icons/svg/users.svg +6 -0
  545. package/src/index.ts +193 -0
  546. package/src/loading/directive.ts +104 -0
  547. package/src/loading/index.ts +19 -0
  548. package/src/loading/service.ts +216 -0
  549. package/src/resolver.ts +22 -0
  550. package/src/tanstack-table.d.ts +7 -0
  551. package/src/types/componentProps.ts +692 -0
  552. package/src/types/index.ts +2 -0
  553. package/src/types/shared.ts +55 -0
  554. package/src/utils/gcsaDateValue.ts +98 -0
  555. package/src/utils/gcsaTableColumns.ts +92 -0
  556. package/src/utils/zodValidators.ts +45 -0
  557. package/src/vite-env.d.ts +7 -0
@@ -0,0 +1,1183 @@
1
+ <template>
2
+ <div class="gcsa-data-table" :class="{ 'gcsa-data-table--cards': mobileMode === 'cards' }">
3
+ <div v-if="showToolbar" class="gcsa-data-table__toolbar">
4
+ <div class="gcsa-data-table__toolbar-meta">
5
+ <span v-if="showCount && !loading" class="gcsa-data-table__count">{{ totalCountText }}</span>
6
+ <span v-if="selectedCount" class="gcsa-data-table__selected">{{ selectedCountText }}</span>
7
+ </div>
8
+ <div v-if="$slots.toolbar" class="gcsa-data-table__toolbar-actions">
9
+ <slot name="toolbar" />
10
+ </div>
11
+ <div v-if="$slots.columns" class="gcsa-data-table__columns-control">
12
+ <slot name="columns" :columns="columnOptions" :visibility="columnVisibility" :toggle="toggleColumn" />
13
+ </div>
14
+ </div>
15
+
16
+ <div ref="tableWrap" class="gcsa-table-wrap gcsa-ui-surface" :style="tableWrapStyle">
17
+ <div v-if="loading" class="gcsa-data-table__state gcsa-data-table__state--loading" role="status" aria-live="polite">
18
+ <div class="gcsa-data-table__loading-label">
19
+ <GcsaSpin />
20
+ <span>{{ messages.dataTableLoading }}</span>
21
+ </div>
22
+ </div>
23
+ <div v-else-if="error" class="gcsa-data-table__state gcsa-data-table__state--error" role="alert">
24
+ <span>{{ error }}</span>
25
+ <GcsaButton size="sm" variant="secondary" @click="emit('retry')">{{ resolvedRetryLabel }}</GcsaButton>
26
+ </div>
27
+ <table v-else class="gcsa-table" :class="tableClass">
28
+ <thead class="gcsa-table__head">
29
+ <tr v-for="(headerGroup, headerGroupIndex) in table.getHeaderGroups()" :key="headerGroup.id">
30
+ <th v-if="headerGroupIndex === 0 && (effectiveExpandable || treeData)" class="gcsa-table__col-expand" scope="col" :style="expandColumnStyle" :rowspan="table.getHeaderGroups().length" />
31
+ <th
32
+ v-if="headerGroupIndex === 0 && effectiveSelectable"
33
+ class="gcsa-table__col-check"
34
+ scope="col"
35
+ :style="selectionColumnStyle"
36
+ :rowspan="table.getHeaderGroups().length"
37
+ >
38
+ <GcsaCheckbox
39
+ :model-value="allSelected"
40
+ :disabled="!selectableRows.length"
41
+ label=""
42
+ :aria-label="messages.dataTableSelectAll"
43
+ @update:model-value="toggleAll"
44
+ />
45
+ </th>
46
+ <th
47
+ v-for="header in headerGroup.headers"
48
+ :key="header.id"
49
+ scope="col"
50
+ :colspan="header.colSpan"
51
+ :rowspan="header.rowSpan > 1 ? header.rowSpan : undefined"
52
+ :class="alignClass(columnMeta(header.column.columnDef).align)"
53
+ :style="columnStyle(columnMeta(header.column.columnDef), header.column.id)"
54
+ @click="handleHeaderClick($event, header.column.id, header.column.columnDef)"
55
+ :aria-sort="childColumns(header.column.columnDef).length ? undefined : ariaSort(header.column.getIsSorted())"
56
+ >
57
+ <button
58
+ v-if="!header.isPlaceholder && !childColumns(header.column.columnDef).length && header.column.getCanSort()"
59
+ type="button"
60
+ class="gcsa-table__sort"
61
+ :class="{ 'gcsa-table__sort--active': header.column.getIsSorted() }"
62
+ @click="header.column.getToggleSortingHandler()?.($event)"
63
+ >
64
+ <span class="gcsa-table__sort-label">
65
+ <slot
66
+ :name="headerSlotName(headerSlotKey(header.column))"
67
+ :column="header.column.id"
68
+ :title="headerTitle(header)"
69
+ >
70
+ <FlexRender
71
+ v-if="!header.isPlaceholder"
72
+ :render="header.column.columnDef.header"
73
+ :props="header.getContext()"
74
+ />
75
+ </slot>
76
+ </span>
77
+ <span class="gcsa-table__sort-icon" aria-hidden="true">
78
+ <span
79
+ class="gcsa-table__sort-chevron gcsa-table__sort-chevron--up"
80
+ :class="{ 'gcsa-table__sort-chevron--on': header.column.getIsSorted() === 'asc' }"
81
+ >
82
+ <GcsaIcon name="chevronUp" size="sm" />
83
+ </span>
84
+ <span
85
+ class="gcsa-table__sort-chevron gcsa-table__sort-chevron--down"
86
+ :class="{ 'gcsa-table__sort-chevron--on': header.column.getIsSorted() === 'desc' }"
87
+ >
88
+ <GcsaIcon name="chevronDown" size="sm" />
89
+ </span>
90
+ </span>
91
+ </button>
92
+ <span v-else-if="!header.isPlaceholder && !childColumns(header.column.columnDef).length" class="gcsa-table__head-text">
93
+ <slot
94
+ :name="headerSlotName(headerSlotKey(header.column))"
95
+ :column="header.column.id"
96
+ :title="headerTitle(header)"
97
+ >
98
+ <FlexRender
99
+ :render="header.column.columnDef.header"
100
+ :props="header.getContext()"
101
+ />
102
+ </slot>
103
+ </span>
104
+ <span v-else-if="!header.isPlaceholder" class="gcsa-table__head-text">
105
+ <slot
106
+ :name="headerSlotName(headerSlotKey(header.column))"
107
+ :column="header.column.id"
108
+ :title="headerTitle(header)"
109
+ >
110
+ <FlexRender :render="header.column.columnDef.header" :props="header.getContext()" />
111
+ </slot>
112
+ </span>
113
+ <div v-if="!header.isPlaceholder && !childColumns(header.column.columnDef).length && columnMeta(header.column.columnDef).filter" class="gcsa-table__filter">
114
+ <GcsaInput
115
+ v-if="columnMeta(header.column.columnDef).filter?.type === 'text'"
116
+ :model-value="filterValue(header.column.id)"
117
+ :placeholder="columnMeta(header.column.columnDef).filter?.placeholder ?? messages.dataTableFilter"
118
+ @update:model-value="value => updateFilter(header.column.id, value)"
119
+ />
120
+ <GcsaSelect
121
+ v-else
122
+ :model-value="filterValue(header.column.id)"
123
+ :options="columnMeta(header.column.columnDef).filter?.options ?? []"
124
+ :placeholder="columnMeta(header.column.columnDef).filter?.placeholder ?? messages.dataTableFilter"
125
+ :portalled="true"
126
+ :same-width="false"
127
+ @update:model-value="value => updateFilter(header.column.id, value)"
128
+ />
129
+ </div>
130
+ <span
131
+ v-if="resizable && !header.isPlaceholder && !childColumns(header.column.columnDef).length"
132
+ class="gcsa-table__resize-handle"
133
+ role="separator"
134
+ :aria-label="messages.dataTableResizeColumn"
135
+ @pointerdown.stop.prevent="startColumnResize($event, header.column.id)"
136
+ />
137
+ </th>
138
+ </tr>
139
+ </thead>
140
+ <tbody v-if="tableData.length" class="gcsa-table__body">
141
+ <template v-for="(row, rowIndex) in table.getRowModel().rows" :key="row.id">
142
+ <tr
143
+ class="gcsa-table__row"
144
+ :class="[rowIndex % 2 === 1 ? 'gcsa-table__row--striped' : undefined, rowClass(row.original, row.index)]"
145
+ :data-selected="row.getIsSelected() || undefined"
146
+ :data-current="isCurrentRow(row.original, row.index) || undefined"
147
+ @click="handleRowClick($event, row.original, row.index)"
148
+ @dblclick="handleRowDblClick($event, row.original, row.index)"
149
+ @contextmenu.prevent="handleRowContextMenu($event, row.original, row.index)"
150
+ >
151
+ <td v-if="effectiveExpandable || treeData" class="gcsa-table__col-expand" :style="expandColumnStyle" @click.stop>
152
+ <button v-if="!treeData || row.getCanExpand()" type="button" class="gcsa-table__expand gcsa-focus-ring" :disabled="treeLoading(row.id)" :aria-label="expandRowAriaLabel(row.id)" :aria-expanded="isExpanded(row.id)" @click="toggleExpanded(row)">
153
+ <GcsaIcon name="chevronDown" size="sm" :class="{ 'gcsa-table__expand-icon--open': isExpanded(row.id) }" />
154
+ </button>
155
+ <span v-if="treeLoading(row.id)" class="gcsa-table__tree-state" role="status">{{ resolvedTreeLoadingText }}</span>
156
+ <button v-else-if="treeError(row.id)" type="button" class="gcsa-table__tree-retry" @click="toggleExpanded(row)">{{ resolvedTreeLoadErrorText }}</button>
157
+ </td>
158
+ <td v-if="effectiveSelectable" class="gcsa-table__col-check" :style="selectionColumnStyle" @click.stop>
159
+ <GcsaCheckbox
160
+ :model-value="row.getIsSelected()"
161
+ :disabled="!row.getCanSelect()"
162
+ label=""
163
+ :aria-label="messages.dataTableSelectRow"
164
+ @update:model-value="v => handleRowSelection(row.original, row.id, v)"
165
+ />
166
+ </td>
167
+ <td
168
+ v-for="(cell, cellIndex) in row.getVisibleCells()"
169
+ :key="cell.id"
170
+ :class="alignClass(columnMeta(cell.column.columnDef).align)"
171
+ :style="columnStyle(columnMeta(cell.column.columnDef), cell.column.id)"
172
+ :data-label="headerTitleFromColumn(cell.column.columnDef)"
173
+ :title="columnMeta(cell.column.columnDef).showOverflowTooltip ? formatGcsaTableCellValue(cell.getValue()) : undefined"
174
+ :data-column-id="cell.column.id"
175
+ @click.stop="handleCellClick($event, row.original, cell.column.id, cell.getValue(), row.index)"
176
+ @dblclick.stop="handleCellDblClick($event, row.original, cell.column.id, cell.getValue(), row.index)"
177
+ @contextmenu.stop.prevent="handleCellContextMenu($event, row.original, cell.column.id, cell.getValue(), row.index)"
178
+ >
179
+ <div class="gcsa-table__cell" :style="treeData && cellIndex === 0 ? { paddingInlineStart: `${row.depth * 18}px` } : undefined">
180
+ <slot
181
+ :name="cellSlotName(cellSlotKey(cell.column))"
182
+ :row="row.original"
183
+ :value="cell.getValue()"
184
+ :index="row.index"
185
+ :column="cell.column.id"
186
+ >
187
+ <slot
188
+ name="cell"
189
+ :row="row.original"
190
+ :value="cell.getValue()"
191
+ :index="row.index"
192
+ :column="cell.column.id"
193
+ >
194
+ <FlexRender
195
+ v-if="hasCustomCell(cell.column.columnDef)"
196
+ :render="cell.column.columnDef.cell"
197
+ :props="cell.getContext()"
198
+ />
199
+ <span v-else>{{ formatGcsaTableCellValue(cell.getValue()) }}</span>
200
+ </slot>
201
+ </slot>
202
+ </div>
203
+ </td>
204
+ </tr>
205
+ <tr v-if="effectiveExpandable && isExpanded(row.id)" :key="`${row.id}-expanded`" class="gcsa-table__expanded-row">
206
+ <td :colspan="visibleColumnCount">
207
+ <slot name="expanded-row" :row="row.original" :index="row.index" />
208
+ </td>
209
+ </tr>
210
+ </template>
211
+ </tbody>
212
+ <tfoot v-if="summaryValues" class="gcsa-table__foot">
213
+ <tr class="gcsa-table__summary-row">
214
+ <th v-if="effectiveExpandable || treeData" class="gcsa-table__col-expand" scope="row" :style="expandColumnStyle" />
215
+ <th v-if="effectiveSelectable" class="gcsa-table__col-check" scope="row" :style="selectionColumnStyle" />
216
+ <td v-for="(column, summaryIndex) in visibleColumns" :key="column.id" :class="alignClass(columnMeta(column).align)" :style="columnStyle(columnMeta(column), column.id ?? '')">
217
+ {{ summaryValues[column.id ?? ''] ?? (summaryIndex === 0 ? resolvedSummaryLabel : '') }}
218
+ </td>
219
+ </tr>
220
+ </tfoot>
221
+ </table>
222
+
223
+ <div v-if="!loading && !error && !tableRows.length" class="gcsa-data-table__empty">
224
+ <slot name="empty">
225
+ <GcsaEmpty :title="messages.dataTableEmpty" />
226
+ </slot>
227
+ </div>
228
+ </div>
229
+
230
+ <div v-if="pagination && total > 0 && !loading && !error" class="gcsa-data-table__footer">
231
+ <div v-if="showTotal" class="gcsa-data-table__footer-meta">
232
+ {{ rangeText }}
233
+ </div>
234
+ <GcsaPagination
235
+ class="gcsa-data-table__pagination"
236
+ :page="page"
237
+ :total="total"
238
+ :page-size="pageSize"
239
+ :page-size-options="pageSizeOptions"
240
+ :show-page-size="showPageSize"
241
+ :show-jumper="showJumper"
242
+ :page-size-label="resolvedPageSizeLabel"
243
+ :jumper-label="resolvedJumperLabel"
244
+ :layout="paginationLayout"
245
+ :align="paginationAlign"
246
+ @update:page="onPageChange"
247
+ @update:page-size="onPageSizeChange"
248
+ />
249
+ </div>
250
+ </div>
251
+ </template>
252
+
253
+ <script setup lang="ts" generic="T extends Record<string, unknown>">
254
+ import { computed, ref, watch } from 'vue';
255
+ import {
256
+ FlexRender,
257
+ getCoreRowModel,
258
+ getPaginationRowModel,
259
+ getFilteredRowModel,
260
+ getSortedRowModel,
261
+ getExpandedRowModel,
262
+ useVueTable,
263
+ type ColumnDef,
264
+ type Header,
265
+ type SortingState,
266
+ type ColumnFiltersState,
267
+ type ExpandedState,
268
+ type Row
269
+ } from '@tanstack/vue-table';
270
+ import type {
271
+ GcsaLegacyTableColumn,
272
+ GcsaTableColumn,
273
+ GcsaTableColumnAlign,
274
+ GcsaTableColumnFixed,
275
+ GcsaTableColumnInfo
276
+ } from '@gcsa/console-core';
277
+ import {
278
+ GCSA_TABLE_EXPAND_COLUMN_WIDTH,
279
+ GCSA_TABLE_SELECTION_COLUMN_WIDTH,
280
+ formatGcsaLocaleMessage,
281
+ getGcsaTableFixedOffset,
282
+ getGcsaTableDefaultExpandedKeys,
283
+ getGcsaTableRowId,
284
+ getGcsaTableSortChange,
285
+ getGcsaTableSorting,
286
+ normalizeGcsaTableColumns
287
+ } from '@gcsa/console-core';
288
+ import GcsaButton from './GcsaButton.vue';
289
+ import GcsaCheckbox from './GcsaCheckbox.vue';
290
+ import GcsaEmpty from './GcsaEmpty.vue';
291
+ import GcsaIcon from './GcsaIcon.vue';
292
+ import GcsaInput from './GcsaInput.vue';
293
+ import GcsaPagination from './GcsaPagination.vue';
294
+ import GcsaSelect from './GcsaSelect.vue';
295
+ import GcsaSpin from './GcsaSpin.vue';
296
+ import {
297
+ formatGcsaTableCellValue,
298
+ gcsaTableCellSlotName,
299
+ gcsaTableHeaderSlotName,
300
+ resolveGcsaTableColumns
301
+ } from '../utils/gcsaTableColumns';
302
+ import { useGcsaLocaleMessages } from '../composables/useGcsaLocale';
303
+ import { useGcsaComponentSize } from '../composables/useGcsaComponentSize';
304
+ import type { GcsaDataTableProps } from '../types/componentProps';
305
+ import type { GcsaDataTableApi } from './gcsaDataTableTypes';
306
+
307
+ defineOptions({ name: 'GcsaDataTable' });
308
+
309
+ const props = withDefaults(
310
+ defineProps<GcsaDataTableProps<T>>(),
311
+ {
312
+ pagination: true,
313
+ pageSize: 10,
314
+ pageSizeOptions: () => [10, 20, 50, 100],
315
+ showPageSize: false,
316
+ showJumper: false,
317
+ showTotal: true,
318
+ page: 1,
319
+ showToolbar: true,
320
+ showCount: true,
321
+ total: undefined,
322
+ serverSide: false,
323
+ defaultSorting: () => [],
324
+ defaultFilters: () => ({}),
325
+ loading: false,
326
+ error: undefined,
327
+ treeData: false,
328
+ childrenKey: 'children' as keyof T & string,
329
+ treeLazy: false,
330
+ treeHasChildrenKey: 'hasChildren' as keyof T & string,
331
+ defaultExpandAll: false,
332
+ selectionColumnWidth: undefined,
333
+ expandColumnWidth: undefined,
334
+ mobileMode: 'scroll',
335
+ stripe: false,
336
+ bordered: false,
337
+ highlightCurrentRow: false,
338
+ data: () => [] as T[]
339
+ }
340
+ );
341
+
342
+ const messages = useGcsaLocaleMessages();
343
+
344
+ const resolvedPageSizeLabel = computed(() => props.pageSizeLabel ?? messages.value.paginationPageSize);
345
+ const resolvedJumperLabel = computed(() => props.jumperLabel ?? messages.value.paginationJumper);
346
+ const resolvedRetryLabel = computed(() => props.retryLabel ?? messages.value.retry);
347
+ const resolvedTreeLoadingText = computed(() => props.treeLoadingText ?? messages.value.dataTableTreeLoading);
348
+ const resolvedTreeLoadErrorText = computed(() => props.treeLoadErrorText ?? messages.value.dataTableTreeLoadError);
349
+ const resolvedSummaryLabel = computed(() => props.summaryLabel ?? messages.value.dataTableSummary);
350
+
351
+ function expandRowAriaLabel(key: string) {
352
+ if (treeLoading(key)) return messages.value.dataTableLoadChildren;
353
+ if (treeError(key)) return messages.value.dataTableRetryChildren;
354
+ if (isExpanded(key)) return messages.value.dataTableCollapseRow;
355
+ return messages.value.dataTableExpandRow;
356
+ }
357
+
358
+ const tableData = computed(() => props.data ?? []);
359
+
360
+ const emit = defineEmits<{
361
+ 'update:page': [page: number];
362
+ 'update:pageSize': [pageSize: number];
363
+ 'update:sorting': [sorting: SortingState];
364
+ 'sort-change': [change: ReturnType<typeof getGcsaTableSortChange>];
365
+ 'update:filters': [filters: Record<string, string>];
366
+ 'filter-change': [filters: Record<string, string>];
367
+ 'update:selectedRows': [rows: T[]];
368
+ 'update:selectedRowKeys': [keys: string[]];
369
+ 'selection-change': [rows: T[]];
370
+ 'select': [rows: T[], row: T];
371
+ 'select-all': [rows: T[]];
372
+ 'update:columnVisibility': [visibility: Record<string, boolean>];
373
+ 'update:columnWidths': [widths: Record<string, number>];
374
+ 'update:expandedRowKeys': [keys: string[]];
375
+ 'update:currentRowKey': [key: string | undefined];
376
+ 'tree-load-error': [error: unknown, row: T, index: number];
377
+ retry: [];
378
+ 'row-click': [row: T, index: number];
379
+ 'row-dblclick': [row: T, index: number, event: MouseEvent];
380
+ 'cell-click': [row: T, column: string, value: unknown, index: number];
381
+ 'cell-dblclick': [row: T, column: string, value: unknown, index: number, event: MouseEvent];
382
+ 'header-click': [column: GcsaTableColumnInfo, event: MouseEvent];
383
+ 'row-context-menu': [event: MouseEvent, row: T, index: number];
384
+ 'cell-context-menu': [event: MouseEvent, row: T, column: string, value: unknown, index: number];
385
+ 'legacy-row-click': [row: T, column: GcsaTableColumnInfo, event: MouseEvent];
386
+ 'legacy-cell-click': [row: T, column: GcsaTableColumnInfo, cell: HTMLElement, event: MouseEvent];
387
+ 'legacy-row-context-menu': [row: T, column: GcsaTableColumnInfo, event: MouseEvent];
388
+ 'legacy-cell-context-menu': [row: T, column: GcsaTableColumnInfo, cell: HTMLElement, event: MouseEvent];
389
+ 'current-change': [current: T | undefined, previous: T | undefined];
390
+ 'expand-change': [row: T, expanded: boolean, expandedRows: T[]];
391
+ }>();
392
+
393
+ const page = ref(props.page);
394
+ const pageSize = ref(props.pageSize);
395
+ const legacyMigration = computed(() => props.legacyColumns?.length
396
+ ? normalizeGcsaTableColumns(props.legacyColumns, { page: page.value, pageSize: pageSize.value })
397
+ : undefined);
398
+ const effectiveSelectable = computed(() => legacyMigration.value?.selectable ?? props.selectable ?? false);
399
+ const effectiveExpandable = computed(() => legacyMigration.value?.expandable ?? props.expandable ?? false);
400
+ const effectiveFixedSelection = computed(() => props.fixedSelection ?? legacyMigration.value?.fixedSelection ?? false);
401
+ const effectiveSelectionColumnWidth = computed(() => props.selectionColumnWidth ?? legacyMigration.value?.selectionColumnWidth ?? GCSA_TABLE_SELECTION_COLUMN_WIDTH);
402
+ const effectiveExpandColumnWidth = computed(() => props.expandColumnWidth ?? legacyMigration.value?.expandColumnWidth ?? GCSA_TABLE_EXPAND_COLUMN_WIDTH);
403
+ const resolvedColumns = computed(() => resolveGcsaTableColumns(legacyMigration.value?.columns ?? props.columns ?? []));
404
+ const sorting = ref<SortingState>([...(props.sorting ?? props.defaultSorting)]);
405
+ const columnFilters = ref<ColumnFiltersState>(toColumnFilters(props.filters ?? props.defaultFilters));
406
+ const rowSelection = ref<Record<string, boolean>>(selectionMap(props.selectedRowKeys));
407
+ const columnVisibility = ref<Record<string, boolean>>({ ...(props.columnVisibility ?? {}) });
408
+ const columnWidths = ref<Record<string, number>>({ ...(props.columnWidths ?? {}) });
409
+ const expandedKeys = ref<ExpandedState>(selectionMap(props.expandedRowKeys ?? (props.defaultExpandAll ? collectDefaultExpandedKeys(tableData.value) : undefined)));
410
+ const currentRowKey = ref(props.currentRowKey);
411
+ const tableWrap = ref<HTMLElement>();
412
+ const treeChildren = ref<Record<string, T[]>>({});
413
+ const treeLoadingKeys = ref<Record<string, boolean>>({});
414
+ const treeErrors = ref<Record<string, unknown>>({});
415
+ const treeObjectIds = new WeakMap<object, string>();
416
+ let treeObjectSequence = 0;
417
+ const total = computed(() => props.total ?? tableData.value.length);
418
+ const tableColumns = computed(() => filterColumnTree(resolvedColumns.value));
419
+ const visibleColumns = computed(() => flattenColumns(tableColumns.value));
420
+ const columnOptions = computed(() => visibleColumns.value.filter(column => !columnMeta(column).hidden).map(column => ({ id: column.id ?? '', title: headerTitleFromColumn(column), visible: columnVisibility.value[column.id ?? ''] !== false })));
421
+ const visibleColumnCount = computed(() => visibleColumns.value.length + (effectiveSelectable.value ? 1 : 0) + (effectiveExpandable.value || props.treeData ? 1 : 0));
422
+ const fixedControlColumns = computed(() => Boolean(effectiveSelectable.value && effectiveFixedSelection.value));
423
+ const expandColumnStyle = computed(() => ({
424
+ width: `${effectiveExpandColumnWidth.value}px`,
425
+ minWidth: `${effectiveExpandColumnWidth.value}px`,
426
+ maxWidth: `${effectiveExpandColumnWidth.value}px`,
427
+ ...(fixedControlColumns.value ? { position: 'sticky' as const, left: '0' } : {})
428
+ }));
429
+ const selectionColumnStyle = computed(() => ({
430
+ width: `${effectiveSelectionColumnWidth.value}px`,
431
+ minWidth: `${effectiveSelectionColumnWidth.value}px`,
432
+ maxWidth: `${effectiveSelectionColumnWidth.value}px`,
433
+ ...(fixedControlColumns.value ? {
434
+ position: 'sticky' as const,
435
+ left: effectiveExpandable.value || props.treeData ? `${effectiveExpandColumnWidth.value}px` : '0'
436
+ } : {})
437
+ }));
438
+ const tableWrapStyle = computed(() => {
439
+ const style: Record<string, string> = {};
440
+ if (props.height !== undefined) style.height = typeof props.height === 'number' ? `${props.height}px` : props.height;
441
+ if (props.maxHeight !== undefined) style.maxHeight = typeof props.maxHeight === 'number' ? `${props.maxHeight}px` : props.maxHeight;
442
+ return style;
443
+ });
444
+ const treeDataRows = computed(() => {
445
+ if (!props.treeData || !Object.keys(treeChildren.value).length) return tableData.value;
446
+ const merge = (rows: T[]): T[] => rows.map((row, index) => {
447
+ const key = treeNodeKey(row, index);
448
+ const loaded = treeChildren.value[key];
449
+ const inline = (row as Record<string, unknown>)[props.childrenKey as string] as T[] | undefined;
450
+ const children = loaded ?? inline;
451
+ if (!children) return row;
452
+ const clone = { ...row, [props.childrenKey as string]: merge(children) } as T;
453
+ treeObjectIds.set(clone as object, key);
454
+ return clone;
455
+ });
456
+ return merge(tableData.value);
457
+ });
458
+
459
+ const table = useVueTable({
460
+ get data() {
461
+ return treeDataRows.value;
462
+ },
463
+ get columns() {
464
+ return tableColumns.value;
465
+ },
466
+ getRowId: (row, index, parent) => rowId(row, index, parent?.id),
467
+ getSubRows: row => props.treeData ? (((row as Record<string, unknown>)[props.childrenKey as string] as T[] | undefined) ?? []) : undefined,
468
+ getRowCanExpand: row => props.treeData ? canExpandTreeRow(row.original, row.index) : false,
469
+ state: {
470
+ get sorting() {
471
+ return sorting.value;
472
+ },
473
+ get columnFilters() {
474
+ return columnFilters.value;
475
+ },
476
+ get rowSelection() {
477
+ return rowSelection.value;
478
+ },
479
+ get pagination() {
480
+ return {
481
+ pageIndex: page.value - 1,
482
+ pageSize: pageSize.value
483
+ };
484
+ },
485
+ get expanded() {
486
+ return expandedKeys.value;
487
+ }
488
+ },
489
+ enableRowSelection: row => typeof effectiveSelectable.value === 'function' ? effectiveSelectable.value(row.original, row.index) : effectiveSelectable.value,
490
+ onSortingChange: updater => {
491
+ const next = typeof updater === 'function' ? updater(sorting.value) : updater;
492
+ sorting.value = next;
493
+ emit('sort-change', getGcsaTableSortChange(next));
494
+ },
495
+ onColumnFiltersChange: updater => {
496
+ columnFilters.value = typeof updater === 'function' ? updater(columnFilters.value) : updater;
497
+ },
498
+ onRowSelectionChange: updater => {
499
+ const next = typeof updater === 'function' ? updater(rowSelection.value) : updater;
500
+ emitSelection(next);
501
+ },
502
+ onExpandedChange: updater => {
503
+ const next = typeof updater === 'function' ? updater(expandedKeys.value) : updater;
504
+ expandedKeys.value = next;
505
+ emit('update:expandedRowKeys', next === true ? table.getRowModel().flatRows.map(row => row.id) : Object.keys(next).filter(key => next[key]));
506
+ },
507
+ getCoreRowModel: getCoreRowModel(),
508
+ getFilteredRowModel: props.serverSide ? undefined : getFilteredRowModel(),
509
+ getSortedRowModel: props.serverSide ? undefined : getSortedRowModel(),
510
+ getExpandedRowModel: props.treeData ? getExpandedRowModel() : undefined,
511
+ getPaginationRowModel: props.serverSide ? undefined : getPaginationRowModel(),
512
+ manualPagination: props.serverSide,
513
+ manualSorting: props.serverSide,
514
+ manualFiltering: props.serverSide,
515
+ get pageCount() {
516
+ return props.serverSide ? Math.ceil(total.value / pageSize.value) : undefined;
517
+ }
518
+ });
519
+
520
+ const resolvedSize = useGcsaComponentSize(() => props.size);
521
+ const sizeClass = computed(() => (resolvedSize.value === 'sm' ? 'gcsa-table--sm' : undefined));
522
+ const tableClass = computed(() => ({
523
+ [sizeClass.value ?? '']: Boolean(sizeClass.value),
524
+ 'gcsa-table--striped': props.stripe,
525
+ 'gcsa-table--bordered': props.bordered
526
+ }));
527
+ const summaryValues = computed(() => props.summary?.(tableData.value));
528
+
529
+ const selectedCount = computed(() => table.getSelectedRowModel().rows.length);
530
+ const tableRows = computed(() => table.getRowModel().rows);
531
+
532
+ const allSelected = computed(() => {
533
+ return selectableRows.value.length > 0 && selectableRows.value.every(row => row.getIsSelected());
534
+ });
535
+
536
+ const selectableRows = computed(() => table.getRowModel().rows.filter(row => row.getCanSelect()));
537
+
538
+ const rangeStart = computed(() => {
539
+ if (!total.value) return 0;
540
+ return (page.value - 1) * pageSize.value + 1;
541
+ });
542
+
543
+ const rangeEnd = computed(() => Math.min(page.value * pageSize.value, total.value));
544
+
545
+ const totalCountText = computed(() =>
546
+ formatGcsaLocaleMessage(messages.value.dataTableTotal, { count: total.value })
547
+ );
548
+
549
+ const selectedCountText = computed(() =>
550
+ formatGcsaLocaleMessage(messages.value.dataTableSelected, { count: selectedCount.value })
551
+ );
552
+
553
+ const rangeText = computed(() =>
554
+ formatGcsaLocaleMessage(messages.value.dataTableRange, {
555
+ start: rangeStart.value,
556
+ end: rangeEnd.value,
557
+ total: total.value
558
+ })
559
+ );
560
+
561
+ function toggleAll(value: boolean) {
562
+ if (!selectableRows.value.length) return;
563
+ table.toggleAllPageRowsSelected(value);
564
+ const next = { ...rowSelection.value };
565
+ selectableRows.value.forEach(row => { next[row.id] = value; });
566
+ emit('select-all', rowsForSelection(next));
567
+ }
568
+
569
+ function rowsForSelection(selection: Record<string, boolean>) {
570
+ return table.getCoreRowModel().flatRows
571
+ .filter(row => selection[row.id] && row.getCanSelect())
572
+ .map(row => row.original);
573
+ }
574
+
575
+ function handleRowSelection(row: T, rowIdValue: string, selected: boolean) {
576
+ const next = { ...rowSelection.value, [rowIdValue]: selected };
577
+ const selectedRows = rowsForSelection(next);
578
+ table.getCoreRowModel().flatRows.find(candidate => candidate.id === rowIdValue)?.toggleSelected(selected);
579
+ emit('select', selectedRows, row);
580
+ }
581
+
582
+ function emitSelection(next: Record<string, boolean>) {
583
+ rowSelection.value = next;
584
+ const keys = Object.keys(next).filter(key => next[key]);
585
+ emit('update:selectedRowKeys', keys);
586
+ const rows = rowsForSelection(next);
587
+ emit('update:selectedRows', rows);
588
+ emit('selection-change', rows);
589
+ }
590
+
591
+ function clearSorting() {
592
+ sorting.value = [];
593
+ emit('sort-change', getGcsaTableSortChange([]));
594
+ }
595
+
596
+ function clearFilters() {
597
+ columnFilters.value = [];
598
+ emit('update:filters', {});
599
+ emit('filter-change', {});
600
+ }
601
+
602
+ function clearFilter(columnKeys?: string | string[]) {
603
+ if (columnKeys === undefined) {
604
+ clearFilters();
605
+ return;
606
+ }
607
+ const keys = new Set(Array.isArray(columnKeys) ? columnKeys : [columnKeys]);
608
+ columnFilters.value = columnFilters.value.filter(filter => !keys.has(filter.id));
609
+ const filters = filterRecord(columnFilters.value);
610
+ emit('update:filters', filters);
611
+ emit('filter-change', filters);
612
+ }
613
+
614
+ function sort(prop: string, order: 'ascending' | 'descending' | null) {
615
+ sorting.value = getGcsaTableSorting(prop, order);
616
+ emit('sort-change', getGcsaTableSortChange(sorting.value));
617
+ }
618
+
619
+ function clearSelection() {
620
+ emitSelection({});
621
+ }
622
+
623
+ function clearExpanded() {
624
+ expandedKeys.value = {};
625
+ emit('update:expandedRowKeys', []);
626
+ }
627
+
628
+ function setRowSelected(key: string, selected = true) {
629
+ const row = table.getCoreRowModel().flatRows.find(candidate => candidate.id === key);
630
+ if (!row || !row.getCanSelect()) return;
631
+ emitSelection({ ...rowSelection.value, [key]: selected });
632
+ }
633
+
634
+ function toggleRowSelection(row: T, selected?: boolean) {
635
+ const tableRow = findTableRow(row);
636
+ if (!tableRow || !tableRow.getCanSelect()) return;
637
+ setRowSelected(tableRow.id, selected ?? !tableRow.getIsSelected());
638
+ }
639
+
640
+ function toggleAllSelection() {
641
+ toggleAll(!allSelected.value);
642
+ }
643
+
644
+ async function setRowExpanded(key: string, expanded = true) {
645
+ const row = table.getCoreRowModel().flatRows.find(candidate => candidate.id === key);
646
+ if (!row) return;
647
+ if (props.treeData) {
648
+ if (isExpanded(key) === expanded) return;
649
+ if (expanded) await toggleExpanded(row);
650
+ else applyExpanded(row, false);
651
+ return;
652
+ }
653
+ const next = { ...(expandedKeys.value === true ? {} : expandedKeys.value), [key]: expanded };
654
+ expandedKeys.value = next;
655
+ emit('update:expandedRowKeys', Object.keys(next).filter(value => next[value]));
656
+ }
657
+
658
+ async function toggleRowExpansion(row: T, expanded?: boolean) {
659
+ const tableRow = findTableRow(row);
660
+ if (!tableRow) return;
661
+ await setRowExpanded(tableRow.id, expanded ?? !isExpanded(tableRow.id));
662
+ }
663
+
664
+ function setCurrentRow(row?: T) {
665
+ const tableRow = row ? findTableRow(row) : undefined;
666
+ currentRowKey.value = tableRow?.id;
667
+ emit('update:currentRowKey', tableRow?.id);
668
+ }
669
+
670
+ function findTableRow(row: T) {
671
+ const rows = table.getCoreRowModel().flatRows;
672
+ const byReference = rows.find(candidate => candidate.original === row);
673
+ if (byReference) return byReference;
674
+ if (props.rowKey) {
675
+ const key = rowId(row, 0);
676
+ return rows.find(candidate => candidate.id === key);
677
+ }
678
+ return undefined;
679
+ }
680
+
681
+ function getSelectionRows() {
682
+ return table.getCoreRowModel().flatRows.filter(row => row.getIsSelected()).map(row => row.original);
683
+ }
684
+
685
+ function setScrollTop(top: number) {
686
+ tableWrap.value?.scrollTo({ top });
687
+ }
688
+
689
+ function scrollTo(options: ScrollToOptions | number, y?: number) {
690
+ if (!tableWrap.value) return;
691
+ if (typeof options === 'number') tableWrap.value.scrollTo(options, y ?? 0);
692
+ else tableWrap.value.scrollTo(options);
693
+ }
694
+
695
+ function onPageChange(next: number) {
696
+ page.value = next;
697
+ table.setPageIndex(next - 1);
698
+ emit('update:page', next);
699
+ }
700
+
701
+ function onPageSizeChange(next: number) {
702
+ if (!props.pageSizeOptions.includes(next) || next === pageSize.value) return;
703
+ pageSize.value = next;
704
+ page.value = 1;
705
+ emit('update:pageSize', next);
706
+ emit('update:page', 1);
707
+ }
708
+
709
+ function rowId(row: T, index: number, parentId?: string) {
710
+ return getGcsaTableRowId(row, index, props.rowKey, parentId);
711
+ }
712
+
713
+ function selectionMap(keys?: string[]) {
714
+ return Object.fromEntries((keys ?? []).map(key => [key, true]));
715
+ }
716
+
717
+ function toColumnFilters(filters?: Record<string, string>): ColumnFiltersState {
718
+ return Object.entries(filters ?? {}).filter(([, value]) => value !== '').map(([id, value]) => ({ id, value }));
719
+ }
720
+
721
+ function filterRecord(filters: ColumnFiltersState) {
722
+ return Object.fromEntries(filters.map(filter => [filter.id, String(filter.value)]));
723
+ }
724
+
725
+ function collectDefaultExpandedKeys(rows: T[]) {
726
+ return getGcsaTableDefaultExpandedKeys(rows, props.treeData, props.childrenKey as keyof T & string, props.rowKey);
727
+ }
728
+
729
+ function collectExpandedRows(expanded: ExpandedState) {
730
+ const expandedSet = expanded === true ? undefined : new Set(Object.keys(expanded).filter(key => expanded[key]));
731
+ const result: T[] = [];
732
+ const visit = (rows: T[], parentId?: string) => rows.forEach((row, index) => {
733
+ const key = rowId(row, index, parentId);
734
+ if (!expandedSet || expandedSet.has(key)) result.push(row);
735
+ if (props.treeData) {
736
+ const children = (row as Record<string, unknown>)[props.childrenKey as string];
737
+ if (Array.isArray(children)) visit(children as T[], key);
738
+ }
739
+ });
740
+ visit(treeDataRows.value);
741
+ return result;
742
+ }
743
+
744
+ function headerTitleFromColumn(column: ColumnDef<T, unknown>) {
745
+ return typeof column.header === 'string' ? column.header : column.id ?? '';
746
+ }
747
+
748
+ function toggleColumn(id: string) {
749
+ const visible = visibleColumns.value.length;
750
+ const next = { ...columnVisibility.value, [id]: columnVisibility.value[id] === false };
751
+ if (!next[id] && visible <= 1) return;
752
+ columnVisibility.value = next;
753
+ emit('update:columnVisibility', next);
754
+ }
755
+
756
+ function isExpanded(key: string) {
757
+ return expandedKeys.value === true || expandedKeys.value[key] === true;
758
+ }
759
+
760
+ function applyExpanded(row: Row<T>, expanded: boolean) {
761
+ const current = expandedKeys.value === true ? {} : expandedKeys.value;
762
+ const next = { ...current, [row.id]: expanded };
763
+ expandedKeys.value = next;
764
+ emit('update:expandedRowKeys', Object.keys(next).filter(key => next[key]));
765
+ emitExpandChange(row.original, expanded, next);
766
+ }
767
+
768
+ async function toggleExpanded(row: Row<T>) {
769
+ if (props.treeData && props.treeLazy && !isExpanded(row.id)) {
770
+ const key = treeNodeKey(row.original, row.index);
771
+ if (!Object.prototype.hasOwnProperty.call(treeChildren.value, key) && props.loadChildren && canExpandTreeRow(row.original, row.index)) {
772
+ treeLoadingKeys.value = { ...treeLoadingKeys.value, [key]: true };
773
+ const nextErrors = { ...treeErrors.value };
774
+ delete nextErrors[key];
775
+ treeErrors.value = nextErrors;
776
+ try {
777
+ const children = await props.loadChildren(row.original, row.index);
778
+ treeChildren.value = { ...treeChildren.value, [key]: children ?? [] };
779
+ if (children?.length) {
780
+ applyExpanded(row, true);
781
+ }
782
+ } catch (error) {
783
+ treeErrors.value = { ...treeErrors.value, [key]: error };
784
+ emit('tree-load-error', error, row.original, row.index);
785
+ props.onTreeLoadError?.(error, row.original, row.index);
786
+ } finally {
787
+ const nextLoading = { ...treeLoadingKeys.value };
788
+ delete nextLoading[key];
789
+ treeLoadingKeys.value = nextLoading;
790
+ }
791
+ } else if (Object.prototype.hasOwnProperty.call(treeChildren.value, key)) {
792
+ applyExpanded(row, !isExpanded(row.id));
793
+ }
794
+ return;
795
+ }
796
+ applyExpanded(row, !isExpanded(row.id));
797
+ }
798
+
799
+ function emitExpandChange(row: T, expanded: boolean, state: ExpandedState = expandedKeys.value) {
800
+ const expandedRows = collectExpandedRows(state);
801
+ emit('expand-change', row, expanded, expandedRows);
802
+ props.onExpandChange?.(row, expanded, expandedRows);
803
+ }
804
+
805
+ function treeNodeKey(row: T, index: number) {
806
+ const objectRow = row as object;
807
+ const existing = treeObjectIds.get(objectRow);
808
+ if (existing) return existing;
809
+ const key = props.rowKey ? rowId(row, index) : `tree-${treeObjectSequence++}`;
810
+ treeObjectIds.set(objectRow, key);
811
+ return key;
812
+ }
813
+
814
+ function treeChildrenFor(row: T) {
815
+ const key = treeNodeKey(row, 0);
816
+ if (Object.prototype.hasOwnProperty.call(treeChildren.value, key)) return treeChildren.value[key];
817
+ return ((row as Record<string, unknown>)[props.childrenKey as string] as T[] | undefined) ?? [];
818
+ }
819
+
820
+ function canExpandTreeRow(row: T, index: number) {
821
+ const key = treeNodeKey(row, index);
822
+ if (Object.prototype.hasOwnProperty.call(treeChildren.value, key)) return treeChildren.value[key].length > 0;
823
+ const children = (row as Record<string, unknown>)[props.childrenKey as string];
824
+ if (Array.isArray(children) && children.length) return true;
825
+ if (!props.treeLazy) return false;
826
+ if (props.treeHasChildren) return props.treeHasChildren(row, index);
827
+ return (row as Record<string, unknown>)[props.treeHasChildrenKey as string] === true;
828
+ }
829
+
830
+ function treeLoading(key: string) {
831
+ const row = table.getRowModel().flatRows.find(candidate => candidate.id === key);
832
+ return Boolean(row && treeLoadingKeys.value[treeNodeKey(row.original, row.index)]);
833
+ }
834
+
835
+ function treeError(key: string) {
836
+ const row = table.getRowModel().flatRows.find(candidate => candidate.id === key);
837
+ return Boolean(row && treeErrors.value[treeNodeKey(row.original, row.index)]);
838
+ }
839
+
840
+ function columnInfo(columnId: string, columnDef?: ColumnDef<T, unknown>): GcsaTableColumnInfo {
841
+ const meta = columnDef ? columnMeta(columnDef) : {};
842
+ return {
843
+ id: columnId,
844
+ prop: columnId,
845
+ label: columnDef ? headerTitleFromColumn(columnDef) : columnId,
846
+ width: meta.width,
847
+ minWidth: meta.minWidth,
848
+ fixed: meta.fixed
849
+ };
850
+ }
851
+
852
+ function handleHeaderClick(event: MouseEvent, columnId: string, columnDef: ColumnDef<T, unknown>) {
853
+ const info = columnInfo(columnId, columnDef);
854
+ emit('header-click', info, event);
855
+ }
856
+
857
+ function handleRowClick(event: MouseEvent, row: T, index: number) {
858
+ if (props.highlightCurrentRow) {
859
+ const previous = table.getCoreRowModel().flatRows.find(candidate => candidate.id === currentRowKey.value)?.original;
860
+ currentRowKey.value = rowId(row, index);
861
+ emit('update:currentRowKey', currentRowKey.value);
862
+ emit('current-change', row, previous);
863
+ props.onCurrentChange?.(row, previous);
864
+ }
865
+ emit('row-click', row, index);
866
+ props.onRowClick?.(row, index);
867
+ const firstCell = table.getRowModel().rows.find(candidate => candidate.original === row)?.getVisibleCells()[0];
868
+ const info = columnInfo(firstCell?.column.id ?? '', firstCell?.column.columnDef);
869
+ emit('legacy-row-click', row, info, event);
870
+ props.onLegacyRowClick?.(row, info, event);
871
+ }
872
+
873
+ function handleRowDblClick(event: MouseEvent, row: T, index: number) {
874
+ emit('row-dblclick', row, index, event);
875
+ }
876
+
877
+ function isCurrentRow(row: T, index: number) {
878
+ return props.highlightCurrentRow && currentRowKey.value === rowId(row, index);
879
+ }
880
+
881
+ function rowClass(row: T, index: number) {
882
+ return typeof props.rowClassName === 'function' ? props.rowClassName(row, index) : props.rowClassName;
883
+ }
884
+
885
+ function handleCellClick(event: MouseEvent, row: T, column: string, value: unknown, index: number) {
886
+ if (props.highlightCurrentRow) {
887
+ const previous = table.getCoreRowModel().flatRows.find(candidate => candidate.id === currentRowKey.value)?.original;
888
+ currentRowKey.value = rowId(row, index);
889
+ emit('update:currentRowKey', currentRowKey.value);
890
+ emit('current-change', row, previous);
891
+ props.onCurrentChange?.(row, previous);
892
+ }
893
+ emit('cell-click', row, column, value, index);
894
+ props.onCellClick?.(row, column, value, index);
895
+ const info = columnInfo(column, table.getAllLeafColumns().find(candidate => candidate.id === column)?.columnDef);
896
+ const cell = event.currentTarget as HTMLElement;
897
+ emit('legacy-cell-click', row, info, cell, event);
898
+ props.onLegacyCellClick?.(row, info, cell, event);
899
+ }
900
+
901
+ function handleCellDblClick(event: MouseEvent, row: T, column: string, value: unknown, index: number) {
902
+ emit('cell-dblclick', row, column, value, index, event);
903
+ }
904
+
905
+ function childColumns(column: ColumnDef<T, unknown>): ColumnDef<T, unknown>[] {
906
+ return 'columns' in column && Array.isArray(column.columns)
907
+ ? column.columns as ColumnDef<T, unknown>[]
908
+ : [];
909
+ }
910
+
911
+ function flattenColumns(columns: ColumnDef<T, unknown>[]): ColumnDef<T, unknown>[] {
912
+ return columns.flatMap(column => {
913
+ const children = childColumns(column);
914
+ return children.length ? flattenColumns(children) : [column];
915
+ });
916
+ }
917
+
918
+ function filterColumnTree(columns: ColumnDef<T, unknown>[]): ColumnDef<T, unknown>[] {
919
+ return columns.flatMap(column => {
920
+ const meta = columnMeta(column);
921
+ if (meta.hidden || columnVisibility.value[column.id ?? ''] === false) return [];
922
+ const columnChildren = childColumns(column);
923
+ if (!columnChildren.length) return [column];
924
+ const children = filterColumnTree(columnChildren);
925
+ return children.length ? [{ ...column, columns: children }] : [];
926
+ });
927
+ }
928
+
929
+ function handleRowContextMenu(event: MouseEvent, row: T, index: number) {
930
+ emit('row-context-menu', event, row, index);
931
+ props.onRowContextMenu?.(event, row, index);
932
+ const firstCell = table.getRowModel().rows.find(candidate => candidate.original === row)?.getVisibleCells()[0];
933
+ const info = columnInfo(firstCell?.column.id ?? '', firstCell?.column.columnDef);
934
+ emit('legacy-row-context-menu', row, info, event);
935
+ props.onLegacyRowContextMenu?.(row, info, event);
936
+ }
937
+
938
+ function handleCellContextMenu(event: MouseEvent, row: T, column: string, value: unknown, index: number) {
939
+ emit('cell-context-menu', event, row, column, value, index);
940
+ props.onCellContextMenu?.(event, row, column, value, index);
941
+ const info = columnInfo(column, table.getAllLeafColumns().find(candidate => candidate.id === column)?.columnDef);
942
+ const cell = event.currentTarget as HTMLElement;
943
+ emit('legacy-cell-context-menu', row, info, cell, event);
944
+ props.onLegacyCellContextMenu?.(row, info, cell, event);
945
+ }
946
+
947
+ function alignClass(align?: GcsaTableColumnAlign) {
948
+ if (align === 'center') return 'gcsa-table__align-center';
949
+ if (align === 'right') return 'gcsa-table__align-right';
950
+ return undefined;
951
+ }
952
+
953
+ function ariaSort(state: false | 'asc' | 'desc') {
954
+ if (state === 'asc') return 'ascending';
955
+ if (state === 'desc') return 'descending';
956
+ return 'none';
957
+ }
958
+
959
+ function cellSlotKey(column: { id: string; columnDef: ColumnDef<T, unknown> }) {
960
+ return columnMeta(column.columnDef).slotKey ?? column.id;
961
+ }
962
+
963
+ function columnMeta(columnDef: ColumnDef<T, unknown>) {
964
+ return (columnDef.meta ?? {}) as {
965
+ width?: string;
966
+ minWidth?: string;
967
+ align?: GcsaTableColumnAlign;
968
+ slotKey?: string;
969
+ fixed?: GcsaTableColumnFixed;
970
+ hidden?: boolean;
971
+ filter?: { type: 'text' | 'select'; placeholder?: string; options?: Array<{ label: string; value: string; disabled?: boolean }> };
972
+ resizable?: boolean;
973
+ showOverflowTooltip?: boolean;
974
+ };
975
+ }
976
+
977
+ function columnStyle(meta: ReturnType<typeof columnMeta>, id: string) {
978
+ const style: Record<string, string> = {};
979
+ const override = columnWidths.value[id];
980
+ if (override) style.width = `${override}px`;
981
+ else if (meta.width) style.width = meta.width;
982
+ if (override) style.minWidth = `${override}px`;
983
+ else if (meta.minWidth ?? meta.width) style.minWidth = meta.minWidth ?? meta.width!;
984
+ if (meta.fixed) {
985
+ style.position = 'sticky';
986
+ const fixedDirection = meta.fixed === true ? 'left' : meta.fixed;
987
+ const offset = getGcsaTableFixedOffset(
988
+ visibleColumns.value.map(column => ({ id: column.id ?? '', ...columnMeta(column) })),
989
+ id,
990
+ fixedDirection,
991
+ {
992
+ expandable: effectiveExpandable.value || props.treeData,
993
+ selectable: Boolean(effectiveSelectable.value),
994
+ fixedSelection: effectiveFixedSelection.value,
995
+ expandColumnWidth: effectiveExpandColumnWidth.value,
996
+ selectionColumnWidth: effectiveSelectionColumnWidth.value,
997
+ columnWidths: columnWidths.value
998
+ }
999
+ );
1000
+ style[fixedDirection] = `${offset}px`;
1001
+ }
1002
+ return Object.keys(style).length ? style : undefined;
1003
+ }
1004
+
1005
+ function startColumnResize(event: PointerEvent, id: string) {
1006
+ const handle = event.currentTarget as HTMLElement;
1007
+ const cell = handle.parentElement;
1008
+ const initialWidth = cell?.getBoundingClientRect().width ?? parseColumnWidth(columnMeta(visibleColumns.value.find(column => column.id === id) ?? {} as ColumnDef<T, unknown>));
1009
+ const minWidth = Math.max(64, parseColumnWidth(columnMeta(visibleColumns.value.find(column => column.id === id) ?? {} as ColumnDef<T, unknown>)) || 64);
1010
+ const startX = event.clientX;
1011
+ const onMove = (moveEvent: PointerEvent) => {
1012
+ const next = Math.max(minWidth, Math.round(initialWidth + moveEvent.clientX - startX));
1013
+ columnWidths.value = { ...columnWidths.value, [id]: next };
1014
+ };
1015
+ const onUp = () => {
1016
+ emit('update:columnWidths', { ...columnWidths.value });
1017
+ document.removeEventListener('pointermove', onMove);
1018
+ document.removeEventListener('pointerup', onUp);
1019
+ };
1020
+ document.addEventListener('pointermove', onMove);
1021
+ document.addEventListener('pointerup', onUp, { once: true });
1022
+ }
1023
+
1024
+ function parseColumnWidth(meta: ReturnType<typeof columnMeta>) {
1025
+ const value = meta.width ?? meta.minWidth;
1026
+ const parsed = value ? Number.parseFloat(value) : Number.NaN;
1027
+ return Number.isFinite(parsed) ? parsed : 0;
1028
+ }
1029
+
1030
+ function filterValue(id: string) {
1031
+ return String(columnFilters.value.find(filter => filter.id === id)?.value ?? '');
1032
+ }
1033
+
1034
+ function updateFilter(id: string, value: string) {
1035
+ const next = columnFilters.value.filter(filter => filter.id !== id);
1036
+ if (value) next.push({ id, value });
1037
+ columnFilters.value = next;
1038
+ const filters = filterRecord(next);
1039
+ emit('update:filters', filters);
1040
+ emit('filter-change', filters);
1041
+ }
1042
+
1043
+ function columnSizingStyle(meta: ReturnType<typeof columnMeta>) {
1044
+ if (!meta.width && !meta.minWidth) return undefined;
1045
+ return {
1046
+ width: meta.width,
1047
+ minWidth: meta.minWidth ?? meta.width
1048
+ };
1049
+ }
1050
+
1051
+ function headerSlotKey(column: { id: string; columnDef: ColumnDef<T, unknown> }) {
1052
+ return cellSlotKey(column);
1053
+ }
1054
+
1055
+ function cellSlotName(slotKey: string) {
1056
+ return gcsaTableCellSlotName(slotKey);
1057
+ }
1058
+
1059
+ function headerSlotName(slotKey: string) {
1060
+ return gcsaTableHeaderSlotName(slotKey);
1061
+ }
1062
+
1063
+ function hasCustomCell(columnDef: ColumnDef<T, unknown>) {
1064
+ return typeof columnDef.cell === 'function';
1065
+ }
1066
+
1067
+ function headerTitle(header: Header<T, unknown>) {
1068
+ const headerDef = header.column.columnDef.header;
1069
+ if (typeof headerDef === 'string') return headerDef;
1070
+ return header.column.id;
1071
+ }
1072
+
1073
+ defineExpose<GcsaDataTableApi<T>>({
1074
+ clearSorting,
1075
+ clearFilters,
1076
+ clearSelection,
1077
+ clearExpanded,
1078
+ setRowSelected,
1079
+ setRowExpanded,
1080
+ clearSort: clearSorting,
1081
+ clearFilter,
1082
+ sort,
1083
+ toggleRowSelection,
1084
+ toggleAllSelection,
1085
+ toggleRowExpansion,
1086
+ setCurrentRow,
1087
+ getSelectionRows,
1088
+ setScrollTop,
1089
+ scrollTo
1090
+ });
1091
+
1092
+ watch(
1093
+ () => tableData.value.length,
1094
+ () => {
1095
+ page.value = 1;
1096
+ }
1097
+ );
1098
+
1099
+ watch(
1100
+ () => props.page,
1101
+ value => {
1102
+ if (value !== undefined && value !== page.value) page.value = value;
1103
+ }
1104
+ );
1105
+
1106
+ watch(
1107
+ () => props.pageSize,
1108
+ value => {
1109
+ if (value !== undefined && value !== pageSize.value) pageSize.value = value;
1110
+ }
1111
+ );
1112
+
1113
+ watch(
1114
+ () => props.selectedRowKeys,
1115
+ value => {
1116
+ if (value) rowSelection.value = selectionMap(value);
1117
+ },
1118
+ { deep: true }
1119
+ );
1120
+
1121
+ watch(
1122
+ () => props.columnVisibility,
1123
+ value => {
1124
+ if (value) columnVisibility.value = { ...value };
1125
+ },
1126
+ { deep: true }
1127
+ );
1128
+
1129
+ watch(
1130
+ () => props.columnWidths,
1131
+ value => {
1132
+ if (value) columnWidths.value = { ...value };
1133
+ },
1134
+ { deep: true }
1135
+ );
1136
+
1137
+ watch(
1138
+ () => props.expandedRowKeys,
1139
+ value => {
1140
+ if (value) expandedKeys.value = selectionMap(value);
1141
+ },
1142
+ { deep: true }
1143
+ );
1144
+
1145
+ watch(
1146
+ () => props.currentRowKey,
1147
+ value => {
1148
+ currentRowKey.value = value;
1149
+ }
1150
+ );
1151
+
1152
+ watch(
1153
+ () => props.sorting,
1154
+ value => {
1155
+ if (value) sorting.value = [...value];
1156
+ },
1157
+ { deep: true }
1158
+ );
1159
+
1160
+ watch(
1161
+ () => props.filters,
1162
+ value => {
1163
+ if (value) columnFilters.value = toColumnFilters(value);
1164
+ },
1165
+ { deep: true }
1166
+ );
1167
+
1168
+ watch(
1169
+ () => tableData.value,
1170
+ value => {
1171
+ treeChildren.value = {};
1172
+ treeLoadingKeys.value = {};
1173
+ treeErrors.value = {};
1174
+ if (props.defaultExpandAll && !props.expandedRowKeys) {
1175
+ expandedKeys.value = selectionMap(collectDefaultExpandedKeys(value));
1176
+ }
1177
+ }
1178
+ );
1179
+
1180
+ watch(sorting, value => {
1181
+ emit('update:sorting', value);
1182
+ });
1183
+ </script>