admins-components 9.0.50 → 9.0.51

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 (237) hide show
  1. package/dist/admins-components.js +35 -33
  2. package/dist/admins-components100.js +245 -3
  3. package/dist/admins-components100.js.map +1 -1
  4. package/dist/admins-components102.js +6 -52
  5. package/dist/admins-components102.js.map +1 -1
  6. package/dist/admins-components103.js +3 -82
  7. package/dist/admins-components103.js.map +1 -1
  8. package/dist/admins-components104.js +3 -113
  9. package/dist/admins-components104.js.map +1 -1
  10. package/dist/admins-components105.js +49 -44
  11. package/dist/admins-components105.js.map +1 -1
  12. package/dist/admins-components106.js +80 -104
  13. package/dist/admins-components106.js.map +1 -1
  14. package/dist/admins-components107.js +109 -16
  15. package/dist/admins-components107.js.map +1 -1
  16. package/dist/admins-components108.js +46 -6
  17. package/dist/admins-components108.js.map +1 -1
  18. package/dist/admins-components109.js +100 -246
  19. package/dist/admins-components109.js.map +1 -1
  20. package/dist/admins-components110.js +19 -26
  21. package/dist/admins-components110.js.map +1 -1
  22. package/dist/admins-components111.js +6 -27
  23. package/dist/admins-components111.js.map +1 -1
  24. package/dist/admins-components112.js +239 -159
  25. package/dist/admins-components112.js.map +1 -1
  26. package/dist/admins-components113.js +26 -67
  27. package/dist/admins-components113.js.map +1 -1
  28. package/dist/admins-components114.js +25 -64
  29. package/dist/admins-components114.js.map +1 -1
  30. package/dist/admins-components115.js +169 -27
  31. package/dist/admins-components115.js.map +1 -1
  32. package/dist/admins-components116.js +65 -13
  33. package/dist/admins-components116.js.map +1 -1
  34. package/dist/admins-components117.js +64 -24
  35. package/dist/admins-components117.js.map +1 -1
  36. package/dist/admins-components118.js +29 -8
  37. package/dist/admins-components118.js.map +1 -1
  38. package/dist/admins-components119.js +16 -4
  39. package/dist/admins-components119.js.map +1 -1
  40. package/dist/admins-components120.js +27 -3
  41. package/dist/admins-components120.js.map +1 -1
  42. package/dist/admins-components121.js +8 -2
  43. package/dist/admins-components121.js.map +1 -1
  44. package/dist/admins-components122.js +4 -21
  45. package/dist/admins-components122.js.map +1 -1
  46. package/dist/admins-components123.js +3 -14
  47. package/dist/admins-components123.js.map +1 -1
  48. package/dist/admins-components124.js +3 -8
  49. package/dist/admins-components124.js.map +1 -1
  50. package/dist/admins-components125.js +19 -11
  51. package/dist/admins-components125.js.map +1 -1
  52. package/dist/admins-components126.js +14 -26
  53. package/dist/admins-components126.js.map +1 -1
  54. package/dist/admins-components127.js +7 -82
  55. package/dist/admins-components127.js.map +1 -1
  56. package/dist/admins-components128.js +9 -7
  57. package/dist/admins-components128.js.map +1 -1
  58. package/dist/admins-components129.js +25 -4
  59. package/dist/admins-components129.js.map +1 -1
  60. package/dist/admins-components130.js +81 -6
  61. package/dist/admins-components130.js.map +1 -1
  62. package/dist/admins-components131.js +10 -6
  63. package/dist/admins-components131.js.map +1 -1
  64. package/dist/admins-components132.js +2 -3
  65. package/dist/admins-components132.js.map +1 -1
  66. package/dist/admins-components133.js +8 -15
  67. package/dist/admins-components133.js.map +1 -1
  68. package/dist/admins-components134.js +6 -12
  69. package/dist/admins-components134.js.map +1 -1
  70. package/dist/admins-components135.js +6 -30
  71. package/dist/admins-components135.js.map +1 -1
  72. package/dist/admins-components136.js +15 -4
  73. package/dist/admins-components136.js.map +1 -1
  74. package/dist/admins-components137.js +13 -29
  75. package/dist/admins-components137.js.map +1 -1
  76. package/dist/admins-components138.js +30 -5
  77. package/dist/admins-components138.js.map +1 -1
  78. package/dist/admins-components139.js +4 -5
  79. package/dist/admins-components139.js.map +1 -1
  80. package/dist/admins-components140.js +28 -7
  81. package/dist/admins-components140.js.map +1 -1
  82. package/dist/admins-components141.js +4 -73
  83. package/dist/admins-components141.js.map +1 -1
  84. package/dist/admins-components142.js +4 -28
  85. package/dist/admins-components142.js.map +1 -1
  86. package/dist/admins-components143.js +8 -59
  87. package/dist/admins-components143.js.map +1 -1
  88. package/dist/admins-components144.js +72 -22
  89. package/dist/admins-components144.js.map +1 -1
  90. package/dist/admins-components145.js +26 -47
  91. package/dist/admins-components145.js.map +1 -1
  92. package/dist/admins-components146.js +58 -30
  93. package/dist/admins-components146.js.map +1 -1
  94. package/dist/admins-components147.js +24 -3
  95. package/dist/admins-components147.js.map +1 -1
  96. package/dist/admins-components148.js +44 -173
  97. package/dist/admins-components148.js.map +1 -1
  98. package/dist/admins-components149.js +28 -43
  99. package/dist/admins-components149.js.map +1 -1
  100. package/dist/admins-components150.js +3 -37
  101. package/dist/admins-components150.js.map +1 -1
  102. package/dist/admins-components151.js +176 -43
  103. package/dist/admins-components151.js.map +1 -1
  104. package/dist/admins-components152.js +41 -136
  105. package/dist/admins-components152.js.map +1 -1
  106. package/dist/admins-components153.js +36 -57
  107. package/dist/admins-components153.js.map +1 -1
  108. package/dist/admins-components154.js +44 -5
  109. package/dist/admins-components154.js.map +1 -1
  110. package/dist/admins-components155.js +141 -6
  111. package/dist/admins-components155.js.map +1 -1
  112. package/dist/admins-components156.js +57 -75
  113. package/dist/admins-components156.js.map +1 -1
  114. package/dist/admins-components157.js +6 -28
  115. package/dist/admins-components157.js.map +1 -1
  116. package/dist/admins-components158.js +5 -1930
  117. package/dist/admins-components158.js.map +1 -1
  118. package/dist/admins-components159.js +75 -24810
  119. package/dist/admins-components159.js.map +1 -1
  120. package/dist/admins-components16.js +4 -3
  121. package/dist/admins-components16.js.map +1 -1
  122. package/dist/admins-components160.js +28 -8
  123. package/dist/admins-components160.js.map +1 -1
  124. package/dist/admins-components161.js +1929 -5
  125. package/dist/admins-components161.js.map +1 -0
  126. package/dist/admins-components162.js +24809 -140
  127. package/dist/admins-components162.js.map +1 -1
  128. package/dist/admins-components163.js +3 -3
  129. package/dist/admins-components163.js.map +1 -1
  130. package/dist/admins-components164.js +7 -9
  131. package/dist/admins-components165.js +143 -0
  132. package/dist/admins-components165.js.map +1 -0
  133. package/dist/admins-components166.js +8 -167
  134. package/dist/admins-components166.js.map +1 -1
  135. package/dist/admins-components167.js +8 -50
  136. package/dist/admins-components167.js.map +1 -1
  137. package/dist/admins-components169.js +161 -43
  138. package/dist/admins-components169.js.map +1 -1
  139. package/dist/admins-components17.js.map +1 -1
  140. package/dist/admins-components170.js +51 -6
  141. package/dist/admins-components170.js.map +1 -1
  142. package/dist/admins-components171.js +8 -79
  143. package/dist/admins-components171.js.map +1 -1
  144. package/dist/admins-components172.js +35 -43
  145. package/dist/admins-components172.js.map +1 -1
  146. package/dist/admins-components173.js +6 -59
  147. package/dist/admins-components173.js.map +1 -1
  148. package/dist/admins-components174.js +79 -8
  149. package/dist/admins-components174.js.map +1 -1
  150. package/dist/admins-components175.js +43 -37
  151. package/dist/admins-components175.js.map +1 -1
  152. package/dist/admins-components176.js +58 -8
  153. package/dist/admins-components176.js.map +1 -1
  154. package/dist/admins-components177.js +10 -0
  155. package/dist/admins-components177.js.map +1 -0
  156. package/dist/admins-components178.js +44 -50
  157. package/dist/admins-components178.js.map +1 -1
  158. package/dist/admins-components179.js +10 -0
  159. package/dist/admins-components179.js.map +1 -0
  160. package/dist/admins-components181.js +59 -0
  161. package/dist/admins-components181.js.map +1 -0
  162. package/dist/admins-components5.js +30 -28
  163. package/dist/admins-components5.js.map +1 -1
  164. package/dist/admins-components58.js.map +1 -1
  165. package/dist/admins-components6.js.map +1 -1
  166. package/dist/admins-components65.js +66 -42
  167. package/dist/admins-components65.js.map +1 -1
  168. package/dist/admins-components67.js.map +1 -1
  169. package/dist/admins-components68.js +102 -95
  170. package/dist/admins-components68.js.map +1 -1
  171. package/dist/admins-components70.js.map +1 -1
  172. package/dist/admins-components72.js +135 -126
  173. package/dist/admins-components72.js.map +1 -1
  174. package/dist/admins-components74.js.map +1 -1
  175. package/dist/admins-components76.js +32 -122
  176. package/dist/admins-components76.js.map +1 -1
  177. package/dist/admins-components77.js +146 -0
  178. package/dist/admins-components77.js.map +1 -0
  179. package/dist/admins-components79.js +6 -59
  180. package/dist/admins-components79.js.map +1 -1
  181. package/dist/admins-components80.js +140 -67
  182. package/dist/admins-components80.js.map +1 -1
  183. package/dist/admins-components82.js +7 -0
  184. package/dist/admins-components82.js.map +1 -0
  185. package/dist/admins-components83.js +59 -6
  186. package/dist/admins-components83.js.map +1 -1
  187. package/dist/admins-components84.js +66 -229
  188. package/dist/admins-components84.js.map +1 -1
  189. package/dist/{admins-components81.js → admins-components85.js} +2 -2
  190. package/dist/{admins-components81.js.map → admins-components85.js.map} +1 -1
  191. package/dist/admins-components87.js +6 -37
  192. package/dist/admins-components87.js.map +1 -1
  193. package/dist/admins-components88.js +231 -0
  194. package/dist/admins-components88.js.map +1 -0
  195. package/dist/admins-components90.js +6 -199
  196. package/dist/admins-components90.js.map +1 -1
  197. package/dist/admins-components91.js +38 -0
  198. package/dist/{admins-components89.js.map → admins-components91.js.map} +1 -1
  199. package/dist/admins-components93.js +6 -16
  200. package/dist/admins-components93.js.map +1 -1
  201. package/dist/admins-components94.js +188 -64
  202. package/dist/admins-components94.js.map +1 -1
  203. package/dist/admins-components96.js +2 -2
  204. package/dist/admins-components96.js.map +1 -1
  205. package/dist/admins-components97.js +76 -198
  206. package/dist/admins-components97.js.map +1 -1
  207. package/dist/admins-components99.js +2 -2
  208. package/dist/admins-components99.js.map +1 -1
  209. package/dist/main.css +1 -1
  210. package/dist/main.css.map +1 -1
  211. package/dist/src/components/TextInput.vue.d.ts +2 -0
  212. package/dist/src/components/data-table/DataList.vue.d.ts +12 -3
  213. package/dist/src/components/data-table/DataPaginator.vue.d.ts +5 -1
  214. package/dist/src/components/data-table/DataSearch.vue.d.ts +9 -0
  215. package/dist/src/components/data-table/DataSort.vue.d.ts +51 -0
  216. package/dist/src/components/data-table/DataTable.vue.d.ts +12 -0
  217. package/dist/src/index.d.ts +4 -0
  218. package/dist/src/styles/components/data-table/data-cards.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  219. package/dist/src/styles/components/data-table/data-list.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  220. package/dist/src/styles/components/data-table/data-search.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  221. package/dist/src/styles/components/data-table/data-sort.scss_vue_type_style_index_0_src_true_lang.css +1 -0
  222. package/dist/src/styles/components/dropdown-select.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  223. package/dist/src/types/data-list.d.ts +1 -0
  224. package/dist/src/utils/url.d.ts +21 -0
  225. package/package.json +1 -1
  226. package/dist/admins-components101.js +0 -4
  227. package/dist/admins-components101.js.map +0 -1
  228. package/dist/admins-components164.js.map +0 -1
  229. package/dist/admins-components168.js +0 -10
  230. package/dist/admins-components168.js.map +0 -1
  231. package/dist/admins-components78.js +0 -7
  232. package/dist/admins-components78.js.map +0 -1
  233. package/dist/admins-components86.js +0 -7
  234. package/dist/admins-components86.js.map +0 -1
  235. package/dist/admins-components89.js +0 -7
  236. package/dist/admins-components92.js +0 -7
  237. package/dist/admins-components92.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components74.js","names":[],"sources":["../src/components/data-table/DataListOptions.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Column, DataListSettings } from '@/types/data-list'\nimport {\n dataTableSettingsDefaults,\n dataCardsSettingsDefaults,\n dataListSettingsDefaults,\n} from '@/types/data-list'\nimport { deepMerge } from '@/utils/objects'\nimport Button from '@/components/Button.vue'\n\nexport interface DataListOptionsProps {\n open?: boolean\n columns: Column[]\n settings: Partial<DataListSettings>\n position?: SidebarPosition\n storageKey: string\n orderable?: boolean\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted } from 'vue'\nimport Sidebar, { type SidebarPosition } from '@/components/Sidebar.vue'\n\nconst props = withDefaults(defineProps<DataListOptionsProps>(), {\n orderable: false,\n})\n\nconst emit = defineEmits<{\n close: []\n change: [settings: DataListSettings]\n}>()\n\nconst local = ref<DataListSettings>(getDefaults())\n\nconst storageKey = computed(() => `data-list-${props.storageKey}`)\n\nconst hasCustomSettings = computed(\n () => JSON.stringify(local.value) !== JSON.stringify(getDefaults()),\n)\n\nfunction getDefaults(): DataListSettings {\n return {\n ...dataCardsSettingsDefaults,\n ...dataTableSettingsDefaults,\n ...dataListSettingsDefaults,\n ...props.settings,\n columns: Object.fromEntries(\n props.columns.map((c) => [\n c.property,\n props.settings.columns?.[c.property] ?? c.visible !== false,\n ]),\n ),\n cardHeaderColumns: Object.fromEntries(\n props.columns.map((c) => [\n c.property,\n props.settings.cardHeaderColumns?.[c.property] ?? c.primary === true,\n ]),\n ),\n columnOrder: props.settings.columnOrder ?? props.columns.map((c) => c.property),\n cardHeaderOrder: props.settings.cardHeaderOrder ?? props.columns.map((c) => c.property),\n } as DataListSettings\n}\n\nfunction load() {\n try {\n const raw = localStorage.getItem(storageKey.value)\n const defaults = getDefaults()\n if (raw) {\n const data = JSON.parse(raw)\n local.value = data.settings\n ? reconcileOrders(deepMerge(defaults, data.settings) as DataListSettings, props.columns)\n : defaults\n } else {\n local.value = defaults\n }\n } catch {\n local.value = getDefaults()\n }\n emit('change', local.value)\n}\n\nfunction reconcileOrders(settings: DataListSettings, columns: Column[]): DataListSettings {\n const props = columns.map((c) => c.property)\n const reconcile = (order: string[] | undefined): string[] => {\n const known = new Set(props)\n const filtered = (order ?? []).filter((p) => known.has(p))\n const missing = props.filter((p) => !filtered.includes(p))\n return [...filtered, ...missing]\n }\n return {\n ...settings,\n columnOrder: reconcile(settings.columnOrder),\n cardHeaderOrder: reconcile(settings.cardHeaderOrder),\n }\n}\n\nfunction save() {\n try {\n const key = storageKey.value\n const raw = localStorage.getItem(key)\n const data = raw ? JSON.parse(raw) : {}\n data.settings = local.value\n localStorage.setItem(key, JSON.stringify(data))\n } catch {\n /* ignore */\n }\n emit('change', local.value)\n}\n\nfunction update<K extends keyof DataListSettings>(key: K, value: DataListSettings[K]) {\n local.value = { ...local.value, [key]: value }\n save()\n}\n\nfunction toggleColumn(property: string) {\n update('columns', { ...local.value.columns, [property]: !local.value.columns[property] })\n}\n\nfunction toggleCardHeaderColumn(property: string) {\n update('cardHeaderColumns', {\n ...local.value.cardHeaderColumns,\n [property]: !local.value.cardHeaderColumns[property],\n })\n}\n\nfunction toggle(key: 'striped' | 'compact') {\n update(key, !local.value[key])\n}\n\nfunction sortByOrder(cols: Column[], order: string[]) {\n return [...cols].sort((a, b) => {\n const ai = order.indexOf(a.property)\n const bi = order.indexOf(b.property)\n return (ai === -1 ? 999 : ai) - (bi === -1 ? 999 : bi)\n })\n}\n\nconst orderedColumns = computed(() => sortByOrder(props.columns, local.value.columnOrder))\n\nconst orderedCardHeaderColumns = computed(() =>\n sortByOrder(props.columns, local.value.cardHeaderOrder),\n)\n\nconst dragIndex = ref<number | null>(null)\nconst selectedReorderIndex = ref<number | null>(null)\n\nconst cardHeaderDragIndex = ref<number | null>(null)\nconst selectedCardHeaderIndex = ref<number | null>(null)\n\nfunction onDragStart(index: number) {\n dragIndex.value = index\n}\n\nfunction onDragOver(e: DragEvent, index: number) {\n e.preventDefault()\n if (dragIndex.value === null || dragIndex.value === index) return\n const order = [...local.value.columnOrder]\n const moved = order.splice(dragIndex.value, 1)[0]\n if (!moved) return\n order.splice(index, 0, moved)\n dragIndex.value = index\n update('columnOrder', order)\n}\n\nfunction onDragEnd() {\n dragIndex.value = null\n}\n\nfunction selectForReorder(index: number) {\n selectedReorderIndex.value = selectedReorderIndex.value === index ? null : index\n}\n\nfunction moveSelected(direction: -1 | 1) {\n if (selectedReorderIndex.value === null) return\n const target = selectedReorderIndex.value + direction\n if (target < 0 || target >= local.value.columnOrder.length) return\n const order = [...local.value.columnOrder]\n const tmp = order[selectedReorderIndex.value]!\n order[selectedReorderIndex.value] = order[target]!\n order[target] = tmp\n update('columnOrder', order)\n selectedReorderIndex.value = target\n}\n\nfunction onCardHeaderDragStart(index: number) {\n cardHeaderDragIndex.value = index\n}\n\nfunction onCardHeaderDragOver(e: DragEvent, index: number) {\n e.preventDefault()\n if (cardHeaderDragIndex.value === null || cardHeaderDragIndex.value === index) return\n const order = [...local.value.cardHeaderOrder]\n const moved = order.splice(cardHeaderDragIndex.value, 1)[0]\n if (!moved) return\n order.splice(index, 0, moved)\n cardHeaderDragIndex.value = index\n update('cardHeaderOrder', order)\n}\n\nfunction onCardHeaderDragEnd() {\n cardHeaderDragIndex.value = null\n}\n\nfunction selectCardHeader(index: number) {\n selectedCardHeaderIndex.value = selectedCardHeaderIndex.value === index ? null : index\n}\n\nfunction moveCardHeader(direction: -1 | 1) {\n if (selectedCardHeaderIndex.value === null) return\n const target = selectedCardHeaderIndex.value + direction\n if (target < 0 || target >= local.value.cardHeaderOrder.length) return\n const order = [...local.value.cardHeaderOrder]\n const tmp = order[selectedCardHeaderIndex.value]!\n order[selectedCardHeaderIndex.value] = order[target]!\n order[target] = tmp\n update('cardHeaderOrder', order)\n selectedCardHeaderIndex.value = target\n}\n\nfunction reset() {\n localStorage.removeItem(storageKey.value)\n local.value = getDefaults()\n emit('change', local.value)\n}\n\nonMounted(load)\n</script>\n\n<template>\n <Sidebar :open=\"open\" title=\"Lista beállítások\" :position=\"props.position\" @close=\"emit('close')\">\n <div class=\"table-options\">\n <div class=\"table-options__col\">\n <h4 class=\"table-options__title\">\n Elrendezés\n <span class=\"table-options__title-value\"\n >—\n {{\n local.layout === 'screen' ? 'Auto' : local.layout === 'table' ? 'Táblázat' : 'Kártyák'\n }}</span\n >\n </h4>\n <div class=\"layout-switch\">\n <button\n class=\"layout-switch__btn\"\n :class=\"{ 'layout-switch__btn--active': local.layout === 'screen' }\"\n title=\"Kijelző méretéhez igazodó elrendezés\"\n @click=\"update('layout', 'screen')\"\n >\n <i class=\"fa-solid fa-display\"></i>\n </button>\n <button\n class=\"layout-switch__btn\"\n :class=\"{ 'layout-switch__btn--active': local.layout === 'table' }\"\n title=\"Táblázat nézet\"\n @click=\"update('layout', 'table')\"\n >\n <i class=\"fa-solid fa-table-list\"></i>\n </button>\n <button\n class=\"layout-switch__btn\"\n :class=\"{ 'layout-switch__btn--active': local.layout === 'cards' }\"\n title=\"Kártya nézet\"\n @click=\"update('layout', 'cards')\"\n >\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n </div>\n <div class=\"table-options__col\">\n <h4\n class=\"table-options__title\"\n v-tooltip.html=\"\n '<b>Kompakt</b>: A sorok közötti térköz csökkentése<br><br><b>Sávos</b> (csak táblázat nézetben): A páros sorok háttere kicsit sötétebb '\"\n >\n Megjelenés <i class=\"fa-regular fa-question-circle\"></i>\n </h4>\n <ul class=\"table-options__list\">\n <li\n class=\"table-options__item\"\n @click=\"toggle('compact')\"\n title=\"A sorok közötti térköz csökkentése\"\n >\n <span\n class=\"c-checkbox\"\n :class=\"{ 'c-checkbox--checked': local.compact }\"\n @click.stop=\"toggle('compact')\"\n ></span>\n <span>Kompakt</span>\n </li>\n <li\n class=\"table-options__item\"\n @click=\"toggle('striped')\"\n title=\"A páros sorok háttere kicsit sötétebb (csak táblázat nézetben)\"\n >\n <span\n class=\"c-checkbox\"\n :class=\"{ 'c-checkbox--checked': local.striped }\"\n @click.stop=\"toggle('striped')\"\n ></span>\n <span>Sávos (striped)</span>\n </li>\n </ul>\n </div>\n <div class=\"table-options__col\">\n <h4 class=\"table-options__title\" v-tooltip=\"'Táblázat nézetben megjelenő oszlopok'\">\n Táblázat oszlopok <i class=\"fa-regular fa-question-circle\"></i>\n </h4>\n <ul class=\"table-options__list\">\n <li\n v-for=\"(col, index) in orderedColumns\"\n :key=\"col.property\"\n class=\"table-options__item\"\n :class=\"{\n 'table-options__item--disabled': col.primary,\n 'table-options__item--selected': orderable && selectedReorderIndex === index,\n 'table-options__item--dragging': orderable && dragIndex === index,\n }\"\n :draggable=\"orderable\"\n @dragstart.stop=\"orderable && onDragStart(index)\"\n @dragover.prevent=\"orderable && onDragOver($event, index)\"\n @drop.prevent\n @dragend=\"orderable && onDragEnd()\"\n @click.prevent=\"\n orderable ? selectForReorder(index) : !col.primary && toggleColumn(col.property)\n \"\n >\n <i v-if=\"orderable\" class=\"fa-solid fa-grip-vertical table-options__drag-handle\"></i>\n <span\n class=\"table-options__toggle\"\n @click.stop=\"!col.primary && toggleColumn(col.property)\"\n >\n <span\n class=\"c-checkbox\"\n :class=\"{ 'c-checkbox--checked': local.columns[col.property] }\"\n ></span>\n <span>{{ col.label }}</span>\n </span>\n </li>\n </ul>\n <div v-if=\"orderable && selectedReorderIndex !== null\" class=\"table-options__move-actions\">\n <button\n class=\"table-options__move-btn\"\n :disabled=\"selectedReorderIndex === 0\"\n @click=\"moveSelected(-1)\"\n >\n <i class=\"fa-solid fa-arrow-up\"></i>\n </button>\n <button\n class=\"table-options__move-btn\"\n :disabled=\"selectedReorderIndex === orderedColumns.length - 1\"\n @click=\"moveSelected(1)\"\n >\n <i class=\"fa-solid fa-arrow-down\"></i>\n </button>\n </div>\n </div>\n <div class=\"table-options__col\">\n <h4\n class=\"table-options__title flex-center gap-1\"\n v-tooltip=\"'Kártya nézetben, a sorok fejlécén megjelenő oszlopok'\"\n >\n Kártya fejléc <i class=\"fa-regular fa-question-circle\"></i>\n </h4>\n <ul class=\"table-options__list\">\n <li\n v-for=\"(col, index) in orderedCardHeaderColumns\"\n :key=\"'ch-' + col.property\"\n class=\"table-options__item\"\n :class=\"{\n 'table-options__item--disabled': col.primary,\n 'table-options__item--selected': orderable && selectedCardHeaderIndex === index,\n 'table-options__item--dragging': orderable && cardHeaderDragIndex === index,\n }\"\n :draggable=\"orderable\"\n @dragstart.stop=\"orderable && onCardHeaderDragStart(index)\"\n @dragover.prevent=\"orderable && onCardHeaderDragOver($event, index)\"\n @drop.prevent\n @dragend=\"orderable && onCardHeaderDragEnd()\"\n @click.prevent=\"\n orderable\n ? selectCardHeader(index)\n : !col.primary && toggleCardHeaderColumn(col.property)\n \"\n >\n <i v-if=\"orderable\" class=\"fa-solid fa-grip-vertical table-options__drag-handle\"></i>\n <span\n class=\"table-options__toggle\"\n @click.stop=\"!col.primary && toggleCardHeaderColumn(col.property)\"\n >\n <span\n class=\"c-checkbox\"\n :class=\"{ 'c-checkbox--checked': local.cardHeaderColumns[col.property] }\"\n ></span>\n <span>{{ col.label }}</span>\n </span>\n </li>\n </ul>\n <div\n v-if=\"orderable && selectedCardHeaderIndex !== null\"\n class=\"table-options__move-actions\"\n >\n <button\n class=\"table-options__move-btn\"\n :disabled=\"selectedCardHeaderIndex === 0\"\n @click=\"moveCardHeader(-1)\"\n >\n <i class=\"fa-solid fa-arrow-up\"></i>\n </button>\n <button\n class=\"table-options__move-btn\"\n :disabled=\"selectedCardHeaderIndex === orderedCardHeaderColumns.length - 1\"\n @click=\"moveCardHeader(1)\"\n >\n <i class=\"fa-solid fa-arrow-down\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"table-options__footer\">\n <Button\n icon=\"fa-solid fa-triangle-exclamation\"\n :disabled=\"!hasCustomSettings\"\n label=\"Alapértelmezés visszaállítása\"\n size=\"small\"\n @click=\"reset\"\n />\n <Button label=\"OK\" @click=\"emit('close')\" />\n </div>\n </Sidebar>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-list-options.scss\"></style>\n"],"mappings":""}
1
+ {"version":3,"file":"admins-components74.js","names":[],"sources":["../src/components/data-table/DataListOptions.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { Column, DataListSettings } from '@/types/data-list'\nimport {\n dataTableSettingsDefaults,\n dataCardsSettingsDefaults,\n dataListSettingsDefaults,\n} from '@/types/data-list'\nimport { deepMerge } from '@/utils/objects'\nimport Button from '@/components/Button.vue'\n\nexport interface DataListOptionsProps {\n open?: boolean\n columns: Column[]\n settings: Partial<DataListSettings>\n position?: SidebarPosition\n storageKey: string\n orderable?: boolean\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, watch } from 'vue'\nimport Sidebar, { type SidebarPosition } from '@/components/Sidebar.vue'\n\nconst props = withDefaults(defineProps<DataListOptionsProps>(), {\n orderable: false,\n})\n\nconst emit = defineEmits<{\n close: []\n change: [settings: DataListSettings]\n}>()\n\nconst local = ref<DataListSettings>(getDefaults())\n\nconst storageKey = computed(() => `data-list-${props.storageKey}`)\n\nconst hasCustomSettings = computed(\n () => JSON.stringify(local.value) !== JSON.stringify(getDefaults()),\n)\n\nfunction isColumnLocked(col: Column): boolean {\n return col.primary === true || col.hideable === false\n}\n\n// Force locked columns to true in both column maps, regardless of saved state.\nfunction applyLockedOverrides(s: DataListSettings) {\n for (const col of props.columns) {\n if (isColumnLocked(col)) {\n s.columns[col.property] = true\n s.cardHeaderColumns[col.property] = true\n }\n }\n}\n\nfunction getDefaults(): DataListSettings {\n return {\n ...dataCardsSettingsDefaults,\n ...dataTableSettingsDefaults,\n ...dataListSettingsDefaults,\n ...props.settings,\n columns: Object.fromEntries(\n props.columns.map((c) => [\n c.property,\n props.settings.columns?.[c.property] ?? c.visible !== false,\n ]),\n ),\n cardHeaderColumns: Object.fromEntries(\n props.columns.map((c) => [\n c.property,\n props.settings.cardHeaderColumns?.[c.property] ?? (c.primary === true || c.hideable === false),\n ]),\n ),\n columnOrder: props.settings.columnOrder ?? props.columns.map((c) => c.property),\n cardHeaderOrder: props.settings.cardHeaderOrder ?? props.columns.map((c) => c.property),\n } as DataListSettings\n}\n\nfunction load() {\n try {\n const raw = localStorage.getItem(storageKey.value)\n const defaults = getDefaults()\n if (raw) {\n const data = JSON.parse(raw)\n local.value = data.settings\n ? reconcileOrders(deepMerge(defaults, data.settings) as DataListSettings, props.columns)\n : defaults\n } else {\n local.value = defaults\n }\n } catch {\n local.value = getDefaults()\n }\n applyLockedOverrides(local.value)\n emit('change', local.value)\n}\n\nfunction reconcileOrders(settings: DataListSettings, columns: Column[]): DataListSettings {\n const sourceOrder = columns.map((c) => c.property)\n const reconcile = (order: string[] | undefined): string[] => {\n // Saved order, restricted to columns that still exist in the source config.\n const saved = (order ?? []).filter((p) => sourceOrder.includes(p))\n const savedSet = new Set(saved)\n // Walk the source-code order. For each property:\n // - if it was saved, pull it from the saved sequence in saved order\n // - if it's new, insert it at its source-code position\n const merged: string[] = []\n let savedIdx = 0\n for (const property of sourceOrder) {\n if (savedSet.has(property)) {\n merged.push(saved[savedIdx++]!)\n } else {\n merged.push(property)\n }\n }\n return merged\n }\n return {\n ...settings,\n columnOrder: reconcile(settings.columnOrder),\n cardHeaderOrder: reconcile(settings.cardHeaderOrder),\n }\n}\n\nfunction save() {\n try {\n const key = storageKey.value\n const raw = localStorage.getItem(key)\n const data = raw ? JSON.parse(raw) : {}\n data.settings = local.value\n localStorage.setItem(key, JSON.stringify(data))\n } catch {\n /* ignore */\n }\n emit('change', local.value)\n}\n\nfunction update<K extends keyof DataListSettings>(key: K, value: DataListSettings[K]) {\n local.value = { ...local.value, [key]: value }\n save()\n}\n\nfunction toggleColumn(property: string) {\n update('columns', { ...local.value.columns, [property]: !local.value.columns[property] })\n}\n\nfunction toggleCardHeaderColumn(property: string) {\n update('cardHeaderColumns', {\n ...local.value.cardHeaderColumns,\n [property]: !local.value.cardHeaderColumns[property],\n })\n}\n\nfunction toggle(key: 'striped' | 'compact') {\n update(key, !local.value[key])\n}\n\nfunction sortByOrder(cols: Column[], order: string[]) {\n return [...cols].sort((a, b) => {\n const ai = order.indexOf(a.property)\n const bi = order.indexOf(b.property)\n return (ai === -1 ? 999 : ai) - (bi === -1 ? 999 : bi)\n })\n}\n\nconst orderedColumns = computed(() => sortByOrder(props.columns, local.value.columnOrder))\n\nconst orderedCardHeaderColumns = computed(() =>\n sortByOrder(props.columns, local.value.cardHeaderOrder),\n)\n\nconst dragIndex = ref<number | null>(null)\nconst selectedReorderIndex = ref<number | null>(null)\n\nconst cardHeaderDragIndex = ref<number | null>(null)\nconst selectedCardHeaderIndex = ref<number | null>(null)\n\nfunction onDragStart(index: number) {\n dragIndex.value = index\n}\n\nfunction onDragOver(e: DragEvent, index: number) {\n e.preventDefault()\n if (dragIndex.value === null || dragIndex.value === index) return\n const order = [...local.value.columnOrder]\n const moved = order.splice(dragIndex.value, 1)[0]\n if (!moved) return\n order.splice(index, 0, moved)\n dragIndex.value = index\n update('columnOrder', order)\n}\n\nfunction onDragEnd() {\n dragIndex.value = null\n}\n\nfunction selectForReorder(index: number) {\n selectedReorderIndex.value = selectedReorderIndex.value === index ? null : index\n}\n\nfunction moveSelected(direction: -1 | 1) {\n if (selectedReorderIndex.value === null) return\n const target = selectedReorderIndex.value + direction\n if (target < 0 || target >= local.value.columnOrder.length) return\n const order = [...local.value.columnOrder]\n const tmp = order[selectedReorderIndex.value]!\n order[selectedReorderIndex.value] = order[target]!\n order[target] = tmp\n update('columnOrder', order)\n selectedReorderIndex.value = target\n}\n\nfunction onCardHeaderDragStart(index: number) {\n cardHeaderDragIndex.value = index\n}\n\nfunction onCardHeaderDragOver(e: DragEvent, index: number) {\n e.preventDefault()\n if (cardHeaderDragIndex.value === null || cardHeaderDragIndex.value === index) return\n const order = [...local.value.cardHeaderOrder]\n const moved = order.splice(cardHeaderDragIndex.value, 1)[0]\n if (!moved) return\n order.splice(index, 0, moved)\n cardHeaderDragIndex.value = index\n update('cardHeaderOrder', order)\n}\n\nfunction onCardHeaderDragEnd() {\n cardHeaderDragIndex.value = null\n}\n\nfunction selectCardHeader(index: number) {\n selectedCardHeaderIndex.value = selectedCardHeaderIndex.value === index ? null : index\n}\n\nfunction moveCardHeader(direction: -1 | 1) {\n if (selectedCardHeaderIndex.value === null) return\n const target = selectedCardHeaderIndex.value + direction\n if (target < 0 || target >= local.value.cardHeaderOrder.length) return\n const order = [...local.value.cardHeaderOrder]\n const tmp = order[selectedCardHeaderIndex.value]!\n order[selectedCardHeaderIndex.value] = order[target]!\n order[target] = tmp\n update('cardHeaderOrder', order)\n selectedCardHeaderIndex.value = target\n}\n\nfunction reset() {\n localStorage.removeItem(storageKey.value)\n local.value = getDefaults()\n emit('change', local.value)\n}\n\nonMounted(load)\n\n// If the columns prop changes at runtime, re-reconcile the orders so new\n// columns appear at their source-code position, and re-apply locked overrides.\nwatch(() => props.columns, () => {\n local.value = reconcileOrders(local.value, props.columns)\n applyLockedOverrides(local.value)\n})\n</script>\n\n<template>\n <Sidebar :open=\"open\" title=\"Lista beállítások\" :position=\"props.position\" @close=\"emit('close')\">\n <div class=\"table-options\">\n <div class=\"table-options__col\">\n <h4 class=\"table-options__title\">\n Elrendezés\n <span class=\"table-options__title-value\"\n >—\n {{\n local.layout === 'screen' ? 'Auto' : local.layout === 'table' ? 'Táblázat' : 'Kártyák'\n }}</span\n >\n </h4>\n <div class=\"layout-switch\">\n <button\n class=\"layout-switch__btn\"\n :class=\"{ 'layout-switch__btn--active': local.layout === 'screen' }\"\n title=\"Kijelző méretéhez igazodó elrendezés\"\n @click=\"update('layout', 'screen')\"\n >\n <i class=\"fa-solid fa-display\"></i>\n </button>\n <button\n class=\"layout-switch__btn\"\n :class=\"{ 'layout-switch__btn--active': local.layout === 'table' }\"\n title=\"Táblázat nézet\"\n @click=\"update('layout', 'table')\"\n >\n <i class=\"fa-solid fa-table-list\"></i>\n </button>\n <button\n class=\"layout-switch__btn\"\n :class=\"{ 'layout-switch__btn--active': local.layout === 'cards' }\"\n title=\"Kártya nézet\"\n @click=\"update('layout', 'cards')\"\n >\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n </div>\n <div class=\"table-options__col\">\n <h4\n class=\"table-options__title\"\n v-tooltip.html=\"\n '<b>Kompakt</b>: A sorok közötti térköz csökkentése<br><br><b>Sávos</b> (csak táblázat nézetben): A páros sorok háttere kicsit sötétebb '\"\n >\n Megjelenés <i class=\"fa-regular fa-question-circle\"></i>\n </h4>\n <ul class=\"table-options__list\">\n <li\n class=\"table-options__item\"\n @click=\"toggle('compact')\"\n title=\"A sorok közötti térköz csökkentése\"\n >\n <span\n class=\"c-checkbox\"\n :class=\"{ 'c-checkbox--checked': local.compact }\"\n @click.stop=\"toggle('compact')\"\n ></span>\n <span>Kompakt</span>\n </li>\n <li\n class=\"table-options__item\"\n @click=\"toggle('striped')\"\n title=\"A páros sorok háttere kicsit sötétebb (csak táblázat nézetben)\"\n >\n <span\n class=\"c-checkbox\"\n :class=\"{ 'c-checkbox--checked': local.striped }\"\n @click.stop=\"toggle('striped')\"\n ></span>\n <span>Sávos (striped)</span>\n </li>\n </ul>\n </div>\n <div class=\"table-options__col\">\n <h4 class=\"table-options__title\" v-tooltip=\"'Táblázat nézetben megjelenő oszlopok'\">\n Táblázat oszlopok <i class=\"fa-regular fa-question-circle\"></i>\n </h4>\n <ul class=\"table-options__list\">\n <li\n v-for=\"(col, index) in orderedColumns\"\n :key=\"col.property\"\n class=\"table-options__item\"\n :class=\"{\n 'table-options__item--disabled': isColumnLocked(col),\n 'table-options__item--selected': orderable && selectedReorderIndex === index,\n 'table-options__item--dragging': orderable && dragIndex === index,\n }\"\n :draggable=\"orderable\"\n @dragstart.stop=\"orderable && onDragStart(index)\"\n @dragover.prevent=\"orderable && onDragOver($event, index)\"\n @drop.prevent\n @dragend=\"orderable && onDragEnd()\"\n @click.prevent=\"\n orderable ? selectForReorder(index) : !isColumnLocked(col) && toggleColumn(col.property)\n \"\n >\n <i v-if=\"orderable\" class=\"fa-solid fa-grip-vertical table-options__drag-handle\"></i>\n <span\n class=\"table-options__toggle\"\n @click.stop=\"!isColumnLocked(col) && toggleColumn(col.property)\"\n >\n <span\n class=\"c-checkbox\"\n :class=\"{ 'c-checkbox--checked': local.columns[col.property] }\"\n ></span>\n <span>{{ col.label }}</span>\n </span>\n </li>\n </ul>\n <div v-if=\"orderable && selectedReorderIndex !== null\" class=\"table-options__move-actions\">\n <button\n class=\"table-options__move-btn\"\n :disabled=\"selectedReorderIndex === 0\"\n @click=\"moveSelected(-1)\"\n >\n <i class=\"fa-solid fa-arrow-up\"></i>\n </button>\n <button\n class=\"table-options__move-btn\"\n :disabled=\"selectedReorderIndex === orderedColumns.length - 1\"\n @click=\"moveSelected(1)\"\n >\n <i class=\"fa-solid fa-arrow-down\"></i>\n </button>\n </div>\n </div>\n <div class=\"table-options__col\">\n <h4\n class=\"table-options__title flex-center gap-1\"\n v-tooltip=\"'Kártya nézetben, a sorok fejlécén megjelenő oszlopok'\"\n >\n Kártya fejléc <i class=\"fa-regular fa-question-circle\"></i>\n </h4>\n <ul class=\"table-options__list\">\n <li\n v-for=\"(col, index) in orderedCardHeaderColumns\"\n :key=\"'ch-' + col.property\"\n class=\"table-options__item\"\n :class=\"{\n 'table-options__item--disabled': isColumnLocked(col),\n 'table-options__item--selected': orderable && selectedCardHeaderIndex === index,\n 'table-options__item--dragging': orderable && cardHeaderDragIndex === index,\n }\"\n :draggable=\"orderable\"\n @dragstart.stop=\"orderable && onCardHeaderDragStart(index)\"\n @dragover.prevent=\"orderable && onCardHeaderDragOver($event, index)\"\n @drop.prevent\n @dragend=\"orderable && onCardHeaderDragEnd()\"\n @click.prevent=\"\n orderable\n ? selectCardHeader(index)\n : !isColumnLocked(col) && toggleCardHeaderColumn(col.property)\n \"\n >\n <i v-if=\"orderable\" class=\"fa-solid fa-grip-vertical table-options__drag-handle\"></i>\n <span\n class=\"table-options__toggle\"\n @click.stop=\"!isColumnLocked(col) && toggleCardHeaderColumn(col.property)\"\n >\n <span\n class=\"c-checkbox\"\n :class=\"{ 'c-checkbox--checked': local.cardHeaderColumns[col.property] }\"\n ></span>\n <span>{{ col.label }}</span>\n </span>\n </li>\n </ul>\n <div\n v-if=\"orderable && selectedCardHeaderIndex !== null\"\n class=\"table-options__move-actions\"\n >\n <button\n class=\"table-options__move-btn\"\n :disabled=\"selectedCardHeaderIndex === 0\"\n @click=\"moveCardHeader(-1)\"\n >\n <i class=\"fa-solid fa-arrow-up\"></i>\n </button>\n <button\n class=\"table-options__move-btn\"\n :disabled=\"selectedCardHeaderIndex === orderedCardHeaderColumns.length - 1\"\n @click=\"moveCardHeader(1)\"\n >\n <i class=\"fa-solid fa-arrow-down\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"table-options__footer\">\n <Button\n icon=\"fa-solid fa-triangle-exclamation\"\n :disabled=\"!hasCustomSettings\"\n label=\"Alapértelmezés visszaállítása\"\n size=\"small\"\n @click=\"reset\"\n />\n <Button label=\"OK\" @click=\"emit('close')\" />\n </div>\n </Sidebar>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-list-options.scss\"></style>\n"],"mappings":""}
@@ -1,127 +1,37 @@
1
- import e from "./admins-components6.js";
2
- import { getFullStorageKey as t } from "./admins-components75.js";
3
- import { Fragment as n, computed as r, createElementBlock as i, createElementVNode as a, createVNode as o, defineComponent as s, normalizeClass as c, openBlock as l, renderList as u, toDisplayString as d } from "vue";
4
- //#region src/components/data-table/DataPaginator.vue?vue&type=script&setup=true&lang.ts
5
- var f = { class: "ac-component" }, p = { class: "c-paginator-wrapper" }, m = { class: "c-paginator" }, h = { class: "c-paginator__info" }, g = { class: "c-paginator__range" }, _ = { class: "c-paginator__total" }, v = {
6
- class: "c-paginator__nav",
7
- "aria-label": "Pagination"
8
- }, y = {
9
- key: 0,
10
- class: "c-paginator__ellipsis"
11
- }, b = ["onClick"], x = { class: "c-paginator__size" }, S = ["value"], C = ["value"], w = [
12
- 10,
13
- 25,
14
- 50,
15
- 100
16
- ], T = 100;
17
- function E(e) {
18
- try {
19
- let n = t("pagination", e), r = localStorage.getItem(n);
20
- if (r) {
21
- let e = Number(r);
22
- if (e > 0) return e;
23
- }
24
- } catch {
25
- console.warn("Failed to read page size from localStorage");
26
- }
27
- return T;
1
+ //#region src/utils/url.ts
2
+ function e(e) {
3
+ return new URLSearchParams(window.location.search).get(e);
28
4
  }
29
- function D(e) {
30
- return {
31
- total: 0,
32
- page: 1,
33
- pageSize: E(e)
34
- };
5
+ function t(e) {
6
+ let t = new URLSearchParams(e.search), n = t.get("page"), r = t.get("pageSize");
7
+ n == null && r == null || (t.delete("page"), t.delete("pageSize"), r != null && t.append("pageSize", r), n != null && t.append("page", n), e.search = t.toString());
35
8
  }
36
- var O = /* @__PURE__ */ s({
37
- __name: "DataPaginator",
38
- props: {
39
- settings: {},
40
- storageKey: {}
41
- },
42
- emits: ["update:pagination"],
43
- setup(s, { emit: T }) {
44
- let E = s, D = T;
45
- function O(e) {
46
- try {
47
- let n = t("pagination", E.storageKey);
48
- localStorage.setItem(n, String(e));
49
- } catch {
50
- console.warn("Failed to save page size to localStorage");
51
- }
52
- }
53
- let k = r(() => Math.max(1, Math.ceil(E.settings.total / E.settings.pageSize))), A = r(() => E.settings.total === 0 ? 0 : (E.settings.page - 1) * E.settings.pageSize + 1), j = r(() => Math.min(E.settings.page * E.settings.pageSize, E.settings.total)), M = r(() => {
54
- let e = k.value, t = E.settings.page;
55
- if (e <= N) {
56
- let t = [];
57
- for (let n = 1; n <= e; n++) t.push(n);
58
- return t;
59
- }
60
- let n = N - 2, r = t - 1, i = t + 1;
61
- for (r < 2 && (i = Math.min(e - 1, i + (2 - r)), r = 2), i > e - 1 && (r = Math.max(2, r - (i - (e - 1))), i = e - 1); i - r + 1 < n;) {
62
- let t = r > 2, a = i < e - 1;
63
- if (!t && !a) break;
64
- let o = r - 2, s = e - 1 - i, c = +((t ? r - 1 : 0) > 2) + +(i < e - 1), l = +(r > 2) + +((a ? i + 1 : 0) < e - 1), u = i - r + 2, d = !1;
65
- if (t && (o >= s || !a) && u + c <= n ? (r--, d = !0) : a && u + l <= n && (i++, d = !0), !d) break;
66
- }
67
- let a = r > 2, o = i < e - 1, s = [];
68
- s.push(1), a && s.push("...");
69
- for (let e = r; e <= i; e++) s.push(e);
70
- return o && s.push("..."), s.push(e), s;
71
- }), N = 7;
72
- function P(e) {
73
- let t = E.settings.page, n = k.value, r = e === 1 || e === n, i = e === t;
74
- return t > 3 && t < n - 2 && !r && !i;
75
- }
76
- function F(e) {
77
- e < 1 || e > k.value || e === E.settings.page || D("update:pagination", {
78
- page: e,
79
- pageSize: E.settings.pageSize
80
- });
81
- }
82
- function I(e) {
83
- let t = Number(e.target.value);
84
- O(t), D("update:pagination", {
85
- page: 1,
86
- pageSize: t
87
- });
9
+ function n(e, n) {
10
+ let r = new URL(window.location.href);
11
+ r.searchParams.set(e, String(n)), t(r), window.history.replaceState({}, "", r.toString());
12
+ }
13
+ function r(e) {
14
+ let n = new URL(window.location.href);
15
+ e ? n.searchParams.delete(e) : n.search = "", t(n), window.history.replaceState({}, "", n.toString());
16
+ }
17
+ function i(t) {
18
+ let n = e(t);
19
+ if (n == null) return null;
20
+ let r = Number(n);
21
+ return Number.isFinite(r) && r > 0 ? r : null;
22
+ }
23
+ function a(e, t, i) {
24
+ let { handleUrl: a, removeWhenDefault: o = !0, default: s } = i;
25
+ if (a) {
26
+ if ((t == null || t === "" || s !== void 0 && t === s) && o) {
27
+ r(e);
28
+ return;
88
29
  }
89
- return (t, r) => (l(), i("div", f, [a("div", p, [a("div", m, [
90
- a("div", h, [a("span", g, d(A.value) + "–" + d(j.value), 1), a("span", _, " / " + d(s.settings.total), 1)]),
91
- a("nav", v, [
92
- o(e, {
93
- icon: "fa-solid fa-chevron-left",
94
- rel: "prev",
95
- disabled: s.settings.page <= 1,
96
- callback: () => F(s.settings.page - 1)
97
- }, null, 8, ["disabled", "callback"]),
98
- (l(!0), i(n, null, u(M.value, (e, t) => (l(), i(n, { key: t }, [e === "..." ? (l(), i("span", y, "…")) : (l(), i("button", {
99
- key: 1,
100
- type: "button",
101
- class: c(["c-paginator__page", {
102
- "is-active": e === s.settings.page,
103
- "is-hidden-sm": P(e)
104
- }]),
105
- onClick: (t) => F(e)
106
- }, d(e), 11, b))], 64))), 128)),
107
- o(e, {
108
- icon: "fa-solid fa-chevron-right",
109
- rel: "next",
110
- disabled: s.settings.page >= k.value,
111
- callback: () => F(s.settings.page + 1)
112
- }, null, 8, ["disabled", "callback"])
113
- ]),
114
- a("div", x, [a("select", {
115
- class: "c-paginator__select",
116
- id: "page-size-select",
117
- value: s.settings.pageSize,
118
- onChange: I
119
- }, [(l(), i(n, null, u(w, (e) => a("option", {
120
- key: e,
121
- value: e
122
- }, d(e) + " elem / oldal", 9, C)), 64))], 40, S)])
123
- ])])]));
30
+ n(e, String(t));
124
31
  }
125
- });
32
+ }
33
+ function o(...e) {
34
+ return e.map((e, t) => t === 0 ? e.replace(/\/+$/, "") : e.replace(/^\/+|\/+$/g, "")).filter(Boolean).join("/");
35
+ }
126
36
  //#endregion
127
- export { O as default, D as getDefaultPaginator, E as getPageSize };
37
+ export { e as getUrlParam, o as joinUrl, i as readUrlNumber, r as removeUrlParam, n as setUrlParam, a as writeUrlOrRemove };
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components76.js","names":[],"sources":["../src/components/data-table/DataPaginator.vue"],"sourcesContent":["<script lang=\"ts\">\nconst SIZE_OPTIONS = [10, 25, 50, 100]\nconst DEFAULT_PAGE_SIZE = 100\n\nexport function getPageSize(storageKey: string): number {\n try {\n const fullStorageKey = getFullStorageKey('pagination', storageKey)\n const raw = localStorage.getItem(fullStorageKey)\n if (raw) {\n const size = Number(raw)\n if (size > 0) return size\n }\n } catch {\n console.warn('Failed to read page size from localStorage')\n }\n return DEFAULT_PAGE_SIZE\n}\n\nexport function getDefaultPaginator(storageKey: string) {\n return {\n total: 0,\n page: 1,\n pageSize: getPageSize(storageKey),\n } as PaginatorSettings\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport Button from '@/components/Button.vue'\nimport type { PaginatorSettings, PageSettings } from '@/types/data-list'\nimport { getFullStorageKey } from '@/utils/storageKey'\n\nconst props = defineProps<{ settings: PaginatorSettings; storageKey: string }>()\n\nconst emit = defineEmits<{\n 'update:pagination': [pagination: PageSettings]\n}>()\n\nfunction savePageSize(size: number) {\n try {\n const fullStorageKey = getFullStorageKey('pagination', props.storageKey)\n localStorage.setItem(fullStorageKey, String(size))\n } catch {\n console.warn('Failed to save page size to localStorage')\n }\n}\n\nconst totalPages = computed(() =>\n Math.max(1, Math.ceil(props.settings.total / props.settings.pageSize)),\n)\n\nconst rangeStart = computed(() =>\n props.settings.total === 0 ? 0 : (props.settings.page - 1) * props.settings.pageSize + 1,\n)\nconst rangeEnd = computed(() =>\n Math.min(props.settings.page * props.settings.pageSize, props.settings.total),\n)\n\nconst visiblePages = computed<(number | '...')[]>(() => {\n const total = totalPages.value\n const current = props.settings.page\n\n if (total <= SLOT_COUNT) {\n const pages: number[] = []\n for (let i = 1; i <= total; i++) pages.push(i)\n return pages\n }\n\n const inner = SLOT_COUNT - 2\n let winStart = current - 1\n let winEnd = current + 1\n if (winStart < 2) {\n winEnd = Math.min(total - 1, winEnd + (2 - winStart))\n winStart = 2\n }\n if (winEnd > total - 1) {\n winStart = Math.max(2, winStart - (winEnd - (total - 1)))\n winEnd = total - 1\n }\n\n while (winEnd - winStart + 1 < inner) {\n const canExtendLeft = winStart > 2\n const canExtendRight = winEnd < total - 1\n if (!canExtendLeft && !canExtendRight) break\n\n const roomLeft = winStart - 2\n const roomRight = total - 1 - winEnd\n\n const ellipsisIfExtendLeft =\n ((canExtendLeft ? winStart - 1 : 0) > 2 ? 1 : 0) + (winEnd < total - 1 ? 1 : 0)\n const ellipsisIfExtendRight =\n (winStart > 2 ? 1 : 0) + ((canExtendRight ? winEnd + 1 : 0) < total - 1 ? 1 : 0)\n\n const newSize = winEnd - winStart + 2\n\n let extended = false\n if (\n canExtendLeft &&\n (roomLeft >= roomRight || !canExtendRight) &&\n newSize + ellipsisIfExtendLeft <= inner\n ) {\n winStart--\n extended = true\n } else if (canExtendRight && newSize + ellipsisIfExtendRight <= inner) {\n winEnd++\n extended = true\n }\n if (!extended) break\n }\n const showLeftEllipsis = winStart > 2\n const showRightEllipsis = winEnd < total - 1\n\n const pages: (number | '...')[] = []\n pages.push(1)\n if (showLeftEllipsis) pages.push('...')\n for (let p = winStart; p <= winEnd; p++) pages.push(p)\n if (showRightEllipsis) pages.push('...')\n pages.push(total)\n\n return pages\n})\n\nconst SLOT_COUNT = 7\n\nfunction shouldHideOnSmall(page: number) {\n const current = props.settings.page\n const total = totalPages.value\n\n const isEdge = page === 1 || page === total\n const isCurrent = page === current\n\n const isMiddleRange = current > 3 && current < total - 2\n\n return isMiddleRange && !isEdge && !isCurrent\n}\n\nfunction goToPage(page: number) {\n if (page < 1 || page > totalPages.value || page === props.settings.page) return\n emit('update:pagination', { page, pageSize: props.settings.pageSize })\n}\n\nfunction changePageSize(event: Event) {\n const size = Number((event.target as HTMLSelectElement).value)\n savePageSize(size)\n emit('update:pagination', { page: 1, pageSize: size })\n}\n</script>\n\n<template>\n <div class=\"ac-component\">\n <div class=\"c-paginator-wrapper\">\n <div class=\"c-paginator\">\n <div class=\"c-paginator__info\">\n <span class=\"c-paginator__range\">{{ rangeStart }}&ndash;{{ rangeEnd }}</span>\n <span class=\"c-paginator__total\"> / {{ settings.total }}</span>\n </div>\n\n <nav class=\"c-paginator__nav\" aria-label=\"Pagination\">\n <Button\n icon=\"fa-solid fa-chevron-left\"\n rel=\"prev\"\n :disabled=\"settings.page <= 1\"\n :callback=\"() => goToPage(settings.page - 1)\"\n />\n\n <template v-for=\"(p, i) in visiblePages\" :key=\"i\">\n <span v-if=\"p === '...'\" class=\"c-paginator__ellipsis\">&hellip;</span>\n <button\n v-else\n type=\"button\"\n class=\"c-paginator__page\"\n :class=\"{\n 'is-active': p === settings.page,\n 'is-hidden-sm': shouldHideOnSmall(p),\n }\"\n @click=\"goToPage(p)\"\n >\n {{ p }}\n </button>\n </template>\n\n <Button\n icon=\"fa-solid fa-chevron-right\"\n rel=\"next\"\n :disabled=\"settings.page >= totalPages\"\n :callback=\"() => goToPage(settings.page + 1)\"\n />\n </nav>\n\n <div class=\"c-paginator__size\">\n <select\n class=\"c-paginator__select\"\n id=\"page-size-select\"\n :value=\"settings.pageSize\"\n @change=\"changePageSize\"\n >\n <option v-for=\"s in SIZE_OPTIONS\" :key=\"s\" :value=\"s\">{{ s }} elem / oldal</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-paginator.scss\"></style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"admins-components76.js","names":[],"sources":["../src/utils/url.ts"],"sourcesContent":["export function getUrlParam(key: string): string | null {\n return new URLSearchParams(window.location.search).get(key)\n}\n\nfunction paginationAtEnd(url: URL) {\n const params = new URLSearchParams(url.search)\n const page = params.get('page')\n const pageSize = params.get('pageSize')\n if (page == null && pageSize == null) return\n params.delete('page')\n params.delete('pageSize')\n if (pageSize != null) params.append('pageSize', pageSize)\n if (page != null) params.append('page', page)\n url.search = params.toString()\n}\n\nexport function setUrlParam(key: string, value: string | number): void {\n const url = new URL(window.location.href)\n url.searchParams.set(key, String(value))\n paginationAtEnd(url)\n window.history.replaceState({}, '', url.toString())\n}\n\nexport function removeUrlParam(key?: string): void {\n const url = new URL(window.location.href)\n if (key) {\n url.searchParams.delete(key)\n } else {\n url.search = ''\n }\n paginationAtEnd(url)\n window.history.replaceState({}, '', url.toString())\n}\n\n/** Read a URL param as a positive number. Returns `null` if missing or invalid. */\nexport function readUrlNumber(key: string): number | null {\n const raw = getUrlParam(key)\n if (raw == null) return null\n const n = Number(raw)\n return Number.isFinite(n) && n > 0 ? n : null\n}\n\n/** Read a URL param as a boolean. Accepts `'true' | '1' | 'false' | '0'`. Returns `null` otherwise. */\nexport function readUrlBool(key: string): boolean | null {\n const raw = getUrlParam(key)\n if (raw === 'true' || raw === '1') return true\n if (raw === 'false' || raw === '0') return false\n return null\n}\n\n/** Read a URL param as a non-empty string. Returns `null` if missing or empty. */\nexport function readUrlString(key: string): string | null {\n const raw = getUrlParam(key)\n return raw ? raw : null\n}\n\ninterface WriteUrlOptions {\n handleUrl: boolean\n /**\n * If the new value equals the default (or is `''` / `null`), the URL param\n * is *removed* rather than set. Keeps URLs clean. Defaults to `true`.\n */\n removeWhenDefault?: boolean\n default?: unknown\n}\n\n/**\n * Write a value to the URL or remove the param if `handleUrl` is `false`,\n * or if the value matches the default / is empty.\n */\nexport function writeUrlOrRemove(\n key: string,\n value: string | number | boolean | null | undefined,\n options: WriteUrlOptions,\n): void {\n const { handleUrl, removeWhenDefault = true, default: defaultValue } = options\n if (!handleUrl) return\n const isEmpty = value == null || value === ''\n const isDefault = defaultValue !== undefined && value === defaultValue\n if ((isEmpty || isDefault) && removeWhenDefault) {\n removeUrlParam(key)\n return\n }\n setUrlParam(key, String(value))\n}\n\nexport function joinUrl(...parts: string[]): string {\n return parts\n .map((part, i) => {\n if (i === 0) return part.replace(/\\/+$/, '')\n return part.replace(/^\\/+|\\/+$/g, '')\n })\n .filter(Boolean)\n .join('/')\n}\n"],"mappings":";AAAA,SAAgB,EAAY,GAA4B;CACtD,OAAO,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,CAAG;AAC5D;AAEA,SAAS,EAAgB,GAAU;CACjC,IAAM,IAAS,IAAI,gBAAgB,EAAI,MAAM,GACvC,IAAO,EAAO,IAAI,MAAM,GACxB,IAAW,EAAO,IAAI,UAAU;CAClC,KAAQ,QAAQ,KAAY,SAChC,EAAO,OAAO,MAAM,GACpB,EAAO,OAAO,UAAU,GACpB,KAAY,QAAM,EAAO,OAAO,YAAY,CAAQ,GACpD,KAAQ,QAAM,EAAO,OAAO,QAAQ,CAAI,GAC5C,EAAI,SAAS,EAAO,SAAS;AAC/B;AAEA,SAAgB,EAAY,GAAa,GAA8B;CACrE,IAAM,IAAM,IAAI,IAAI,OAAO,SAAS,IAAI;CAGxC,AAFA,EAAI,aAAa,IAAI,GAAK,OAAO,CAAK,CAAC,GACvC,EAAgB,CAAG,GACnB,OAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,EAAI,SAAS,CAAC;AACpD;AAEA,SAAgB,EAAe,GAAoB;CACjD,IAAM,IAAM,IAAI,IAAI,OAAO,SAAS,IAAI;CAOxC,AANI,IACF,EAAI,aAAa,OAAO,CAAG,IAE3B,EAAI,SAAS,IAEf,EAAgB,CAAG,GACnB,OAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,EAAI,SAAS,CAAC;AACpD;AAGA,SAAgB,EAAc,GAA4B;CACxD,IAAM,IAAM,EAAY,CAAG;CAC3B,IAAI,KAAO,MAAM,OAAO;CACxB,IAAM,IAAI,OAAO,CAAG;CACpB,OAAO,OAAO,SAAS,CAAC,KAAK,IAAI,IAAI,IAAI;AAC3C;AA8BA,SAAgB,EACd,GACA,GACA,GACM;CACN,IAAM,EAAE,cAAW,uBAAoB,IAAM,SAAS,MAAiB;CAClE,OAGL;OAFgB,KAAS,QAAQ,MAAU,MACzB,MAAiB,KAAA,KAAa,MAAU,MAC5B,GAAmB;GAC/C,EAAe,CAAG;GAClB;EACF;EACA,EAAY,GAAK,OAAO,CAAK,CAAC;CAD9B;AAEF;AAEA,SAAgB,EAAQ,GAAG,GAAyB;CAClD,OAAO,EACJ,KAAK,GAAM,MACN,MAAM,IAAU,EAAK,QAAQ,QAAQ,EAAE,IACpC,EAAK,QAAQ,cAAc,EAAE,CACrC,EACA,OAAO,OAAO,EACd,KAAK,GAAG;AACb"}
@@ -0,0 +1,146 @@
1
+ import e from "./admins-components6.js";
2
+ import { getFullStorageKey as t } from "./admins-components75.js";
3
+ import { readUrlNumber as n, writeUrlOrRemove as r } from "./admins-components76.js";
4
+ import { Fragment as i, computed as a, createElementBlock as o, createElementVNode as s, createVNode as c, defineComponent as l, normalizeClass as u, onMounted as d, openBlock as f, renderList as p, toDisplayString as m } from "vue";
5
+ //#region src/components/data-table/DataPaginator.vue?vue&type=script&setup=true&lang.ts
6
+ var h = { class: "ac-component" }, g = { class: "c-paginator-wrapper" }, _ = { class: "c-paginator" }, v = { class: "c-paginator__info" }, y = { class: "c-paginator__range" }, b = { class: "c-paginator__total" }, x = {
7
+ class: "c-paginator__nav",
8
+ "aria-label": "Pagination"
9
+ }, S = {
10
+ key: 0,
11
+ class: "c-paginator__ellipsis"
12
+ }, C = ["onClick"], w = { class: "c-paginator__size" }, T = ["value"], E = ["value"], D = [
13
+ 10,
14
+ 25,
15
+ 50,
16
+ 100
17
+ ], O = 100;
18
+ function k(e) {
19
+ let r = n("pageSize");
20
+ if (r != null) return r;
21
+ try {
22
+ let n = t("pagination", e), r = localStorage.getItem(n);
23
+ if (r) {
24
+ let e = Number(r);
25
+ if (e > 0) return e;
26
+ }
27
+ } catch {
28
+ console.warn("Failed to read page size from localStorage");
29
+ }
30
+ return O;
31
+ }
32
+ function A(e) {
33
+ return {
34
+ total: 0,
35
+ page: n("page") ?? 1,
36
+ pageSize: k(e)
37
+ };
38
+ }
39
+ var j = /* @__PURE__ */ l({
40
+ __name: "DataPaginator",
41
+ props: {
42
+ settings: {},
43
+ storageKey: {},
44
+ handleUrl: {
45
+ type: Boolean,
46
+ default: !1
47
+ }
48
+ },
49
+ emits: ["update:pagination"],
50
+ setup(l, { emit: O }) {
51
+ let k = l, A = O;
52
+ function j(e) {
53
+ try {
54
+ localStorage.setItem(t("pagination", k.storageKey), String(e));
55
+ } catch {
56
+ console.warn("Failed to save page size to localStorage");
57
+ }
58
+ }
59
+ let M = a(() => Math.max(1, Math.ceil(k.settings.total / k.settings.pageSize))), N = a(() => k.settings.total === 0 ? 0 : (k.settings.page - 1) * k.settings.pageSize + 1), P = a(() => Math.min(k.settings.page * k.settings.pageSize, k.settings.total)), F = a(() => {
60
+ let e = M.value, t = k.settings.page;
61
+ if (e <= I) {
62
+ let t = [];
63
+ for (let n = 1; n <= e; n++) t.push(n);
64
+ return t;
65
+ }
66
+ let n = I - 2, r = t - 1, i = t + 1;
67
+ for (r < 2 && (i = Math.min(e - 1, i + (2 - r)), r = 2), i > e - 1 && (r = Math.max(2, r - (i - (e - 1))), i = e - 1); i - r + 1 < n;) {
68
+ let t = r > 2, a = i < e - 1;
69
+ if (!t && !a) break;
70
+ let o = r - 2, s = e - 1 - i, c = +((t ? r - 1 : 0) > 2) + +(i < e - 1), l = +(r > 2) + +((a ? i + 1 : 0) < e - 1), u = i - r + 2, d = !1;
71
+ if (t && (o >= s || !a) && u + c <= n ? (r--, d = !0) : a && u + l <= n && (i++, d = !0), !d) break;
72
+ }
73
+ let a = r > 2, o = i < e - 1, s = [];
74
+ s.push(1), a && s.push("...");
75
+ for (let e = r; e <= i; e++) s.push(e);
76
+ return o && s.push("..."), s.push(e), s;
77
+ }), I = 7;
78
+ function L(e) {
79
+ let t = k.settings.page, n = M.value, r = e === 1 || e === n, i = e === t;
80
+ return t > 3 && t < n - 2 && !r && !i;
81
+ }
82
+ function R(e) {
83
+ e < 1 || e > M.value || e === k.settings.page || (r("page", e, {
84
+ handleUrl: k.handleUrl,
85
+ default: 1
86
+ }), r("pageSize", k.settings.pageSize, { handleUrl: k.handleUrl }), A("update:pagination", {
87
+ page: e,
88
+ pageSize: k.settings.pageSize
89
+ }));
90
+ }
91
+ function z(e) {
92
+ let t = Number(e.target.value);
93
+ j(t), r("pageSize", t, { handleUrl: k.handleUrl }), r("page", 1, {
94
+ handleUrl: k.handleUrl,
95
+ default: 1
96
+ }), A("update:pagination", {
97
+ page: 1,
98
+ pageSize: t
99
+ });
100
+ }
101
+ return d(() => {
102
+ if (!k.handleUrl) return;
103
+ let e = n("pageSize"), t = n("page");
104
+ e == null || t == null || e === k.settings.pageSize && t === k.settings.page || A("update:pagination", {
105
+ page: t,
106
+ pageSize: e
107
+ });
108
+ }), (t, n) => (f(), o("div", h, [s("div", g, [s("div", _, [
109
+ s("div", v, [s("span", y, m(N.value) + "–" + m(P.value), 1), s("span", b, " / " + m(l.settings.total), 1)]),
110
+ s("nav", x, [
111
+ c(e, {
112
+ icon: "fa-solid fa-chevron-left",
113
+ rel: "prev",
114
+ disabled: l.settings.page <= 1,
115
+ callback: () => R(l.settings.page - 1)
116
+ }, null, 8, ["disabled", "callback"]),
117
+ (f(!0), o(i, null, p(F.value, (e, t) => (f(), o(i, { key: t }, [e === "..." ? (f(), o("span", S, "…")) : (f(), o("button", {
118
+ key: 1,
119
+ type: "button",
120
+ class: u(["c-paginator__page", {
121
+ "is-active": e === l.settings.page,
122
+ "is-hidden-sm": L(e)
123
+ }]),
124
+ onClick: (t) => R(e)
125
+ }, m(e), 11, C))], 64))), 128)),
126
+ c(e, {
127
+ icon: "fa-solid fa-chevron-right",
128
+ rel: "next",
129
+ disabled: l.settings.page >= M.value,
130
+ callback: () => R(l.settings.page + 1)
131
+ }, null, 8, ["disabled", "callback"])
132
+ ]),
133
+ s("div", w, [s("select", {
134
+ class: "c-paginator__select",
135
+ id: "page-size-select",
136
+ value: l.settings.pageSize,
137
+ onChange: z
138
+ }, [(f(), o(i, null, p(D, (e) => s("option", {
139
+ key: e,
140
+ value: e
141
+ }, m(e) + " elem / oldal", 9, E)), 64))], 40, T)])
142
+ ])])]));
143
+ }
144
+ });
145
+ //#endregion
146
+ export { j as default, A as getDefaultPaginator, k as getPageSize };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admins-components77.js","names":[],"sources":["../src/components/data-table/DataPaginator.vue"],"sourcesContent":["<script lang=\"ts\">\nconst SIZE_OPTIONS = [10, 25, 50, 100]\nconst DEFAULT_PAGE_SIZE = 100\n\nexport function getPageSize(storageKey: string): number {\n // URL > localStorage > default\n const urlSize = readUrlNumber('pageSize')\n if (urlSize != null) return urlSize\n try {\n const fullStorageKey = getFullStorageKey('pagination', storageKey)\n const raw = localStorage.getItem(fullStorageKey)\n if (raw) {\n const size = Number(raw)\n if (size > 0) return size\n }\n } catch {\n console.warn('Failed to read page size from localStorage')\n }\n return DEFAULT_PAGE_SIZE\n}\n\nexport function getDefaultPaginator(storageKey: string) {\n return {\n total: 0,\n page: readUrlNumber('page') ?? 1,\n pageSize: getPageSize(storageKey),\n } as PaginatorSettings\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted } from 'vue'\nimport Button from '@/components/Button.vue'\nimport type { PaginatorSettings, PageSettings } from '@/types/data-list'\nimport { getFullStorageKey } from '@/utils/storageKey'\nimport { readUrlNumber, writeUrlOrRemove } from '@/utils/url'\n\nconst props = withDefaults(\n defineProps<{ settings: PaginatorSettings; storageKey: string; handleUrl?: boolean }>(),\n { handleUrl: false },\n)\n\nconst emit = defineEmits<{\n 'update:pagination': [pagination: PageSettings]\n}>()\n\nfunction savePageSize(size: number) {\n try {\n localStorage.setItem(\n getFullStorageKey('pagination', props.storageKey),\n String(size),\n )\n } catch {\n console.warn('Failed to save page size to localStorage')\n }\n}\n\nconst totalPages = computed(() =>\n Math.max(1, Math.ceil(props.settings.total / props.settings.pageSize)),\n)\n\nconst rangeStart = computed(() =>\n props.settings.total === 0 ? 0 : (props.settings.page - 1) * props.settings.pageSize + 1,\n)\nconst rangeEnd = computed(() =>\n Math.min(props.settings.page * props.settings.pageSize, props.settings.total),\n)\n\nconst visiblePages = computed<(number | '...')[]>(() => {\n const total = totalPages.value\n const current = props.settings.page\n\n if (total <= SLOT_COUNT) {\n const pages: number[] = []\n for (let i = 1; i <= total; i++) pages.push(i)\n return pages\n }\n\n const inner = SLOT_COUNT - 2\n let winStart = current - 1\n let winEnd = current + 1\n if (winStart < 2) {\n winEnd = Math.min(total - 1, winEnd + (2 - winStart))\n winStart = 2\n }\n if (winEnd > total - 1) {\n winStart = Math.max(2, winStart - (winEnd - (total - 1)))\n winEnd = total - 1\n }\n\n while (winEnd - winStart + 1 < inner) {\n const canExtendLeft = winStart > 2\n const canExtendRight = winEnd < total - 1\n if (!canExtendLeft && !canExtendRight) break\n\n const roomLeft = winStart - 2\n const roomRight = total - 1 - winEnd\n\n const ellipsisIfExtendLeft =\n ((canExtendLeft ? winStart - 1 : 0) > 2 ? 1 : 0) + (winEnd < total - 1 ? 1 : 0)\n const ellipsisIfExtendRight =\n (winStart > 2 ? 1 : 0) + ((canExtendRight ? winEnd + 1 : 0) < total - 1 ? 1 : 0)\n\n const newSize = winEnd - winStart + 2\n\n let extended = false\n if (\n canExtendLeft &&\n (roomLeft >= roomRight || !canExtendRight) &&\n newSize + ellipsisIfExtendLeft <= inner\n ) {\n winStart--\n extended = true\n } else if (canExtendRight && newSize + ellipsisIfExtendRight <= inner) {\n winEnd++\n extended = true\n }\n if (!extended) break\n }\n const showLeftEllipsis = winStart > 2\n const showRightEllipsis = winEnd < total - 1\n\n const pages: (number | '...')[] = []\n pages.push(1)\n if (showLeftEllipsis) pages.push('...')\n for (let p = winStart; p <= winEnd; p++) pages.push(p)\n if (showRightEllipsis) pages.push('...')\n pages.push(total)\n\n return pages\n})\n\nconst SLOT_COUNT = 7\n\nfunction shouldHideOnSmall(page: number) {\n const current = props.settings.page\n const total = totalPages.value\n\n const isEdge = page === 1 || page === total\n const isCurrent = page === current\n\n const isMiddleRange = current > 3 && current < total - 2\n\n return isMiddleRange && !isEdge && !isCurrent\n}\n\nfunction goToPage(page: number) {\n if (page < 1 || page > totalPages.value || page === props.settings.page) return\n writeUrlOrRemove('page', page, { handleUrl: props.handleUrl, default: 1 })\n writeUrlOrRemove('pageSize', props.settings.pageSize, { handleUrl: props.handleUrl })\n emit('update:pagination', { page, pageSize: props.settings.pageSize })\n}\n\nfunction changePageSize(event: Event) {\n const size = Number((event.target as HTMLSelectElement).value)\n savePageSize(size)\n writeUrlOrRemove('pageSize', size, { handleUrl: props.handleUrl })\n writeUrlOrRemove('page', 1, { handleUrl: props.handleUrl, default: 1 })\n emit('update:pagination', { page: 1, pageSize: size })\n}\n\nonMounted(() => {\n if (!props.handleUrl) return\n // URL only counts if BOTH `page` and `pageSize` are present and valid.\n // It wins for this load but is intentionally NOT written to localStorage —\n // localStorage holds the user's persistent preference and must not be\n // polluted by transient URL state.\n const urlSize = readUrlNumber('pageSize')\n const urlPage = readUrlNumber('page')\n if (urlSize == null || urlPage == null) return\n if (urlSize === props.settings.pageSize && urlPage === props.settings.page) return\n emit('update:pagination', { page: urlPage, pageSize: urlSize })\n})\n</script>\n\n<template>\n <div class=\"ac-component\">\n <div class=\"c-paginator-wrapper\">\n <div class=\"c-paginator\">\n <div class=\"c-paginator__info\">\n <span class=\"c-paginator__range\">{{ rangeStart }}&ndash;{{ rangeEnd }}</span>\n <span class=\"c-paginator__total\"> / {{ settings.total }}</span>\n </div>\n\n <nav class=\"c-paginator__nav\" aria-label=\"Pagination\">\n <Button\n icon=\"fa-solid fa-chevron-left\"\n rel=\"prev\"\n :disabled=\"settings.page <= 1\"\n :callback=\"() => goToPage(settings.page - 1)\"\n />\n\n <template v-for=\"(p, i) in visiblePages\" :key=\"i\">\n <span v-if=\"p === '...'\" class=\"c-paginator__ellipsis\">&hellip;</span>\n <button\n v-else\n type=\"button\"\n class=\"c-paginator__page\"\n :class=\"{\n 'is-active': p === settings.page,\n 'is-hidden-sm': shouldHideOnSmall(p),\n }\"\n @click=\"goToPage(p)\"\n >\n {{ p }}\n </button>\n </template>\n\n <Button\n icon=\"fa-solid fa-chevron-right\"\n rel=\"next\"\n :disabled=\"settings.page >= totalPages\"\n :callback=\"() => goToPage(settings.page + 1)\"\n />\n </nav>\n\n <div class=\"c-paginator__size\">\n <select\n class=\"c-paginator__select\"\n id=\"page-size-select\"\n :value=\"settings.pageSize\"\n @change=\"changePageSize\"\n >\n <option v-for=\"s in SIZE_OPTIONS\" :key=\"s\" :value=\"s\">{{ s }} elem / oldal</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-paginator.scss\"></style>\n"],"mappings":"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"}
@@ -1,60 +1,7 @@
1
- import { formatDate as e } from "./admins-components3.js";
2
- //#region src/utils/filterDisplay.ts
3
- function t(t, r, i) {
4
- if (i == null || i === "") return "";
5
- let a = t.find((e) => e.key === r);
6
- if (a?.type === "dropdown" && a.options) {
7
- let e = n(i);
8
- if (Array.isArray(e)) return e.map((e) => {
9
- let t = a.options?.find((t) => t.value === e);
10
- return t ? t.label : String(e);
11
- }).join(", ");
12
- let t = a.options.find((t) => t.value === e);
13
- if (t) return t.label;
14
- }
15
- if (a?.type === "checkbox") return i ? "Bekapcsolva" : "";
16
- if (a?.type === "date" || a?.type === "datetime") {
17
- if (typeof i == "object" && i) {
18
- let t = i.local ?? i.utc ?? null;
19
- if (t == null) return "";
20
- let n = t instanceof Date ? t : new Date(t);
21
- if (!isNaN(n.getTime())) return e(n, a.type === "datetime" ? "YYYY-MM-DD HH:mm" : "YYYY-MM-DD");
22
- }
23
- if (typeof i == "string" && i) {
24
- let t = new Date(i);
25
- if (!isNaN(t.getTime())) return e(t, a.type === "datetime" ? "YYYY-MM-DD HH:mm" : "YYYY-MM-DD");
26
- }
27
- }
28
- if ((a?.type === "daterange" || a?.type === "datetimerange") && typeof i == "object") {
29
- let t = a.type === "datetimerange" ? "YYYY-MM-DD HH:mm" : "YYYY-MM-DD";
30
- return `${i.fromUtc ? e(new Date(i.fromUtc), t) : "…"} - ${i.toUtc ? e(new Date(i.toUtc), t) : "…"}`;
31
- }
32
- return typeof i == "object" ? JSON.stringify(i) : String(i);
33
- }
34
- function n(e) {
35
- if (Array.isArray(e)) return e;
36
- if (typeof e == "string") {
37
- if (e.startsWith("[") && e.endsWith("]")) try {
38
- let t = JSON.parse(e);
39
- if (Array.isArray(t)) return t;
40
- } catch {}
41
- return e;
42
- }
43
- return e;
44
- }
45
- function r(e, n) {
46
- let r = [];
47
- for (let [i, a] of Object.entries(n)) {
48
- let n = t(e, i, a);
49
- if (!n) continue;
50
- let o = e.find((e) => e.key === i), s = o?.label ?? i;
51
- r.push({
52
- key: i,
53
- text: `${s}: ${n}`,
54
- displayClass: o?.displayClass
55
- });
56
- }
57
- return r;
58
- }
1
+ import './src/styles/components/data-table/data-paginator.scss_vue_type_style_index_0_src_true_lang.css';
2
+ import e from "./admins-components77.js";
3
+ /* empty css */
4
+ //#region src/components/data-table/DataPaginator.vue
5
+ var t = e;
59
6
  //#endregion
60
- export { r as buildFilterDisplay, t as displayFilterValue, n as parseDropdownValue };
7
+ export { t as default };
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components79.js","names":[],"sources":["../src/utils/filterDisplay.ts"],"sourcesContent":["import { formatDate } from '@/utils/date'\nimport type { FilterItem } from '@/components/data-table/DataFilters.vue'\n\nexport function displayFilterValue(items: FilterItem[], key: string, value: any): string {\n if (value === null || value === undefined || value === '') return ''\n\n const item = items.find((i) => i.key === key)\n\n if (item?.type === 'dropdown' && item.options) {\n const parsedValue = parseDropdownValue(value)\n\n if (Array.isArray(parsedValue)) {\n const labels = parsedValue.map((v) => {\n const opt = item.options?.find((o) => o.value === v)\n return opt ? opt.label : String(v)\n })\n return labels.join(', ')\n }\n\n const opt = item.options.find((o) => o.value === parsedValue)\n if (opt) return opt.label\n }\n if (item?.type === 'checkbox') {\n return value ? 'Bekapcsolva' : ''\n }\n\n if (item?.type === 'date' || item?.type === 'datetime') {\n if (typeof value === 'object' && value !== null) {\n const local: Date | string | null | undefined = value.local ?? value.utc ?? null\n if (local == null) return ''\n const d = local instanceof Date ? local : new Date(local)\n if (!isNaN(d.getTime())) {\n return formatDate(d, item.type === 'datetime' ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD')\n }\n }\n if (typeof value === 'string' && value) {\n const d = new Date(value)\n if (!isNaN(d.getTime())) {\n return formatDate(d, item.type === 'datetime' ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD')\n }\n }\n }\n\n if ((item?.type === 'daterange' || item?.type === 'datetimerange') && typeof value === 'object') {\n const showTime = item.type === 'datetimerange'\n const fmt = showTime ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD'\n const from = value.fromUtc ? formatDate(new Date(value.fromUtc), fmt) : '…'\n const to = value.toUtc ? formatDate(new Date(value.toUtc), fmt) : '…'\n return `${from} - ${to}`\n }\n\n if (typeof value === 'object') return JSON.stringify(value)\n\n return String(value)\n}\n\nexport function parseDropdownValue(value: any): unknown {\n if (Array.isArray(value)) {\n return value\n }\n\n if (typeof value === 'string') {\n if (value.startsWith('[') && value.endsWith(']')) {\n try {\n const parsed = JSON.parse(value)\n if (Array.isArray(parsed)) {\n return parsed\n }\n } catch {\n // If parsing fails, treat as string\n }\n }\n return value\n }\n\n return value\n}\n\nexport interface FilterDisplayPart {\n key: string\n text: string\n displayClass?: string\n}\n\nexport function buildFilterDisplay(\n items: FilterItem[],\n values: Record<string, any>,\n): FilterDisplayPart[] {\n const parts: FilterDisplayPart[] = []\n for (const [key, rawValue] of Object.entries(values)) {\n const v = displayFilterValue(items, key, rawValue)\n if (!v) continue\n const item = items.find((i) => i.key === key)\n const labelText = item?.label ?? key\n parts.push({ key, text: `${labelText}: ${v}`, displayClass: item?.displayClass })\n }\n\n return parts\n}\n\nexport function buildFilterValues(items: FilterItem[], values: Record<string, any>): string[] {\n return buildFilterDisplay(items, values).map((p) => p.text)\n}\n"],"mappings":";;AAGA,SAAgB,EAAmB,GAAqB,GAAa,GAAoB;CACvF,IAAI,KAAU,QAA+B,MAAU,IAAI,OAAO;CAElE,IAAM,IAAO,EAAM,MAAM,MAAM,EAAE,QAAQ,CAAG;CAE5C,IAAI,GAAM,SAAS,cAAc,EAAK,SAAS;EAC7C,IAAM,IAAc,EAAmB,CAAK;EAE5C,IAAI,MAAM,QAAQ,CAAW,GAK3B,OAJe,EAAY,KAAK,MAAM;GACpC,IAAM,IAAM,EAAK,SAAS,MAAM,MAAM,EAAE,UAAU,CAAC;GACnD,OAAO,IAAM,EAAI,QAAQ,OAAO,CAAC;EACnC,CACO,EAAO,KAAK,IAAI;EAGzB,IAAM,IAAM,EAAK,QAAQ,MAAM,MAAM,EAAE,UAAU,CAAW;EAC5D,IAAI,GAAK,OAAO,EAAI;CACtB;CACA,IAAI,GAAM,SAAS,YACjB,OAAO,IAAQ,gBAAgB;CAGjC,IAAI,GAAM,SAAS,UAAU,GAAM,SAAS,YAAY;EACtD,IAAI,OAAO,KAAU,YAAY,GAAgB;GAC/C,IAAM,IAA0C,EAAM,SAAS,EAAM,OAAO;GAC5E,IAAI,KAAS,MAAM,OAAO;GAC1B,IAAM,IAAI,aAAiB,OAAO,IAAQ,IAAI,KAAK,CAAK;GACxD,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,GACpB,OAAO,EAAW,GAAG,EAAK,SAAS,aAAa,qBAAqB,YAAY;EAErF;EACA,IAAI,OAAO,KAAU,YAAY,GAAO;GACtC,IAAM,IAAI,IAAI,KAAK,CAAK;GACxB,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,GACpB,OAAO,EAAW,GAAG,EAAK,SAAS,aAAa,qBAAqB,YAAY;EAErF;CACF;CAEA,KAAK,GAAM,SAAS,eAAe,GAAM,SAAS,oBAAoB,OAAO,KAAU,UAAU;EAE/F,IAAM,IADW,EAAK,SAAS,kBACR,qBAAqB;EAG5C,OAAO,GAFM,EAAM,UAAU,EAAW,IAAI,KAAK,EAAM,OAAO,GAAG,CAAG,IAAI,IAEzD,KADJ,EAAM,QAAQ,EAAW,IAAI,KAAK,EAAM,KAAK,GAAG,CAAG,IAAI;CAEpE;CAIA,OAFI,OAAO,KAAU,WAAiB,KAAK,UAAU,CAAK,IAEnD,OAAO,CAAK;AACrB;AAEA,SAAgB,EAAmB,GAAqB;CACtD,IAAI,MAAM,QAAQ,CAAK,GACrB,OAAO;CAGT,IAAI,OAAO,KAAU,UAAU;EAC7B,IAAI,EAAM,WAAW,GAAG,KAAK,EAAM,SAAS,GAAG,GAC7C,IAAI;GACF,IAAM,IAAS,KAAK,MAAM,CAAK;GAC/B,IAAI,MAAM,QAAQ,CAAM,GACtB,OAAO;EAEX,QAAQ,CAER;EAEF,OAAO;CACT;CAEA,OAAO;AACT;AAQA,SAAgB,EACd,GACA,GACqB;CACrB,IAAM,IAA6B,CAAC;CACpC,KAAK,IAAM,CAAC,GAAK,MAAa,OAAO,QAAQ,CAAM,GAAG;EACpD,IAAM,IAAI,EAAmB,GAAO,GAAK,CAAQ;EACjD,IAAI,CAAC,GAAG;EACR,IAAM,IAAO,EAAM,MAAM,MAAM,EAAE,QAAQ,CAAG,GACtC,IAAY,GAAM,SAAS;EACjC,EAAM,KAAK;GAAE;GAAK,MAAM,GAAG,EAAU,IAAI;GAAK,cAAc,GAAM;EAAa,CAAC;CAClF;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"admins-components79.js","names":[],"sources":["../src/components/data-table/DataPaginator.vue"],"sourcesContent":["<script lang=\"ts\">\nconst SIZE_OPTIONS = [10, 25, 50, 100]\nconst DEFAULT_PAGE_SIZE = 100\n\nexport function getPageSize(storageKey: string): number {\n // URL > localStorage > default\n const urlSize = readUrlNumber('pageSize')\n if (urlSize != null) return urlSize\n try {\n const fullStorageKey = getFullStorageKey('pagination', storageKey)\n const raw = localStorage.getItem(fullStorageKey)\n if (raw) {\n const size = Number(raw)\n if (size > 0) return size\n }\n } catch {\n console.warn('Failed to read page size from localStorage')\n }\n return DEFAULT_PAGE_SIZE\n}\n\nexport function getDefaultPaginator(storageKey: string) {\n return {\n total: 0,\n page: readUrlNumber('page') ?? 1,\n pageSize: getPageSize(storageKey),\n } as PaginatorSettings\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted } from 'vue'\nimport Button from '@/components/Button.vue'\nimport type { PaginatorSettings, PageSettings } from '@/types/data-list'\nimport { getFullStorageKey } from '@/utils/storageKey'\nimport { readUrlNumber, writeUrlOrRemove } from '@/utils/url'\n\nconst props = withDefaults(\n defineProps<{ settings: PaginatorSettings; storageKey: string; handleUrl?: boolean }>(),\n { handleUrl: false },\n)\n\nconst emit = defineEmits<{\n 'update:pagination': [pagination: PageSettings]\n}>()\n\nfunction savePageSize(size: number) {\n try {\n localStorage.setItem(\n getFullStorageKey('pagination', props.storageKey),\n String(size),\n )\n } catch {\n console.warn('Failed to save page size to localStorage')\n }\n}\n\nconst totalPages = computed(() =>\n Math.max(1, Math.ceil(props.settings.total / props.settings.pageSize)),\n)\n\nconst rangeStart = computed(() =>\n props.settings.total === 0 ? 0 : (props.settings.page - 1) * props.settings.pageSize + 1,\n)\nconst rangeEnd = computed(() =>\n Math.min(props.settings.page * props.settings.pageSize, props.settings.total),\n)\n\nconst visiblePages = computed<(number | '...')[]>(() => {\n const total = totalPages.value\n const current = props.settings.page\n\n if (total <= SLOT_COUNT) {\n const pages: number[] = []\n for (let i = 1; i <= total; i++) pages.push(i)\n return pages\n }\n\n const inner = SLOT_COUNT - 2\n let winStart = current - 1\n let winEnd = current + 1\n if (winStart < 2) {\n winEnd = Math.min(total - 1, winEnd + (2 - winStart))\n winStart = 2\n }\n if (winEnd > total - 1) {\n winStart = Math.max(2, winStart - (winEnd - (total - 1)))\n winEnd = total - 1\n }\n\n while (winEnd - winStart + 1 < inner) {\n const canExtendLeft = winStart > 2\n const canExtendRight = winEnd < total - 1\n if (!canExtendLeft && !canExtendRight) break\n\n const roomLeft = winStart - 2\n const roomRight = total - 1 - winEnd\n\n const ellipsisIfExtendLeft =\n ((canExtendLeft ? winStart - 1 : 0) > 2 ? 1 : 0) + (winEnd < total - 1 ? 1 : 0)\n const ellipsisIfExtendRight =\n (winStart > 2 ? 1 : 0) + ((canExtendRight ? winEnd + 1 : 0) < total - 1 ? 1 : 0)\n\n const newSize = winEnd - winStart + 2\n\n let extended = false\n if (\n canExtendLeft &&\n (roomLeft >= roomRight || !canExtendRight) &&\n newSize + ellipsisIfExtendLeft <= inner\n ) {\n winStart--\n extended = true\n } else if (canExtendRight && newSize + ellipsisIfExtendRight <= inner) {\n winEnd++\n extended = true\n }\n if (!extended) break\n }\n const showLeftEllipsis = winStart > 2\n const showRightEllipsis = winEnd < total - 1\n\n const pages: (number | '...')[] = []\n pages.push(1)\n if (showLeftEllipsis) pages.push('...')\n for (let p = winStart; p <= winEnd; p++) pages.push(p)\n if (showRightEllipsis) pages.push('...')\n pages.push(total)\n\n return pages\n})\n\nconst SLOT_COUNT = 7\n\nfunction shouldHideOnSmall(page: number) {\n const current = props.settings.page\n const total = totalPages.value\n\n const isEdge = page === 1 || page === total\n const isCurrent = page === current\n\n const isMiddleRange = current > 3 && current < total - 2\n\n return isMiddleRange && !isEdge && !isCurrent\n}\n\nfunction goToPage(page: number) {\n if (page < 1 || page > totalPages.value || page === props.settings.page) return\n writeUrlOrRemove('page', page, { handleUrl: props.handleUrl, default: 1 })\n writeUrlOrRemove('pageSize', props.settings.pageSize, { handleUrl: props.handleUrl })\n emit('update:pagination', { page, pageSize: props.settings.pageSize })\n}\n\nfunction changePageSize(event: Event) {\n const size = Number((event.target as HTMLSelectElement).value)\n savePageSize(size)\n writeUrlOrRemove('pageSize', size, { handleUrl: props.handleUrl })\n writeUrlOrRemove('page', 1, { handleUrl: props.handleUrl, default: 1 })\n emit('update:pagination', { page: 1, pageSize: size })\n}\n\nonMounted(() => {\n if (!props.handleUrl) return\n // URL only counts if BOTH `page` and `pageSize` are present and valid.\n // It wins for this load but is intentionally NOT written to localStorage —\n // localStorage holds the user's persistent preference and must not be\n // polluted by transient URL state.\n const urlSize = readUrlNumber('pageSize')\n const urlPage = readUrlNumber('page')\n if (urlSize == null || urlPage == null) return\n if (urlSize === props.settings.pageSize && urlPage === props.settings.page) return\n emit('update:pagination', { page: urlPage, pageSize: urlSize })\n})\n</script>\n\n<template>\n <div class=\"ac-component\">\n <div class=\"c-paginator-wrapper\">\n <div class=\"c-paginator\">\n <div class=\"c-paginator__info\">\n <span class=\"c-paginator__range\">{{ rangeStart }}&ndash;{{ rangeEnd }}</span>\n <span class=\"c-paginator__total\"> / {{ settings.total }}</span>\n </div>\n\n <nav class=\"c-paginator__nav\" aria-label=\"Pagination\">\n <Button\n icon=\"fa-solid fa-chevron-left\"\n rel=\"prev\"\n :disabled=\"settings.page <= 1\"\n :callback=\"() => goToPage(settings.page - 1)\"\n />\n\n <template v-for=\"(p, i) in visiblePages\" :key=\"i\">\n <span v-if=\"p === '...'\" class=\"c-paginator__ellipsis\">&hellip;</span>\n <button\n v-else\n type=\"button\"\n class=\"c-paginator__page\"\n :class=\"{\n 'is-active': p === settings.page,\n 'is-hidden-sm': shouldHideOnSmall(p),\n }\"\n @click=\"goToPage(p)\"\n >\n {{ p }}\n </button>\n </template>\n\n <Button\n icon=\"fa-solid fa-chevron-right\"\n rel=\"next\"\n :disabled=\"settings.page >= totalPages\"\n :callback=\"() => goToPage(settings.page + 1)\"\n />\n </nav>\n\n <div class=\"c-paginator__size\">\n <select\n class=\"c-paginator__select\"\n id=\"page-size-select\"\n :value=\"settings.pageSize\"\n @change=\"changePageSize\"\n >\n <option v-for=\"s in SIZE_OPTIONS\" :key=\"s\" :value=\"s\">{{ s }} elem / oldal</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-paginator.scss\"></style>\n"],"mappings":""}