admins-components 9.0.75 → 9.0.76

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 (254) hide show
  1. package/dist/admins-components.js +16 -16
  2. package/dist/admins-components100.js +1 -1
  3. package/dist/admins-components100.js.map +1 -1
  4. package/dist/admins-components102.js +4 -4
  5. package/dist/admins-components103.js +2 -2
  6. package/dist/admins-components103.js.map +1 -1
  7. package/dist/admins-components105.js +4 -4
  8. package/dist/admins-components11.js +6 -6
  9. package/dist/admins-components110.js +1 -1
  10. package/dist/admins-components110.js.map +1 -1
  11. package/dist/admins-components111.js +2 -2
  12. package/dist/admins-components111.js.map +1 -1
  13. package/dist/admins-components112.js.map +1 -1
  14. package/dist/admins-components113.js +1 -1
  15. package/dist/admins-components113.js.map +1 -1
  16. package/dist/admins-components115.js +144 -126
  17. package/dist/admins-components115.js.map +1 -1
  18. package/dist/admins-components116.js +7 -5
  19. package/dist/admins-components116.js.map +1 -1
  20. package/dist/admins-components117.js +1 -1
  21. package/dist/admins-components117.js.map +1 -1
  22. package/dist/admins-components118.js +75 -27
  23. package/dist/admins-components118.js.map +1 -1
  24. package/dist/admins-components119.js +30 -6
  25. package/dist/admins-components119.js.map +1 -1
  26. package/dist/admins-components12.js.map +1 -1
  27. package/dist/admins-components120.js +34 -20
  28. package/dist/admins-components120.js.map +1 -1
  29. package/dist/admins-components121.js +1 -3
  30. package/dist/admins-components121.js.map +1 -1
  31. package/dist/admins-components122.js +4 -3
  32. package/dist/admins-components122.js.map +1 -1
  33. package/dist/admins-components124.js +2 -1
  34. package/dist/admins-components124.js.map +1 -1
  35. package/dist/admins-components129.js +1 -1
  36. package/dist/admins-components129.js.map +1 -1
  37. package/dist/admins-components13.js +2 -2
  38. package/dist/admins-components13.js.map +1 -1
  39. package/dist/admins-components132.js +23 -15
  40. package/dist/admins-components132.js.map +1 -1
  41. package/dist/admins-components133.js.map +1 -1
  42. package/dist/admins-components14.js +4 -4
  43. package/dist/admins-components141.js +2 -2
  44. package/dist/admins-components141.js.map +1 -1
  45. package/dist/admins-components142.js.map +1 -1
  46. package/dist/admins-components143.js +5 -1
  47. package/dist/admins-components143.js.map +1 -1
  48. package/dist/admins-components144.js +1 -1
  49. package/dist/admins-components144.js.map +1 -1
  50. package/dist/admins-components145.js +4 -1
  51. package/dist/admins-components145.js.map +1 -1
  52. package/dist/admins-components146.js +30 -6
  53. package/dist/admins-components146.js.map +1 -1
  54. package/dist/admins-components147.js +64 -54
  55. package/dist/admins-components147.js.map +1 -1
  56. package/dist/admins-components148.js +8 -25
  57. package/dist/admins-components148.js.map +1 -1
  58. package/dist/admins-components149.js +26 -56
  59. package/dist/admins-components149.js.map +1 -1
  60. package/dist/admins-components150.js +56 -21
  61. package/dist/admins-components150.js.map +1 -1
  62. package/dist/admins-components151.js +27 -45
  63. package/dist/admins-components151.js.map +1 -1
  64. package/dist/admins-components152.js +48 -29
  65. package/dist/admins-components152.js.map +1 -1
  66. package/dist/admins-components153.js +48 -3
  67. package/dist/admins-components153.js.map +1 -1
  68. package/dist/admins-components154.js +3 -179
  69. package/dist/admins-components154.js.map +1 -1
  70. package/dist/admins-components155.js +200 -42
  71. package/dist/admins-components155.js.map +1 -1
  72. package/dist/admins-components156.js +44 -35
  73. package/dist/admins-components156.js.map +1 -1
  74. package/dist/admins-components157.js +35 -44
  75. package/dist/admins-components157.js.map +1 -1
  76. package/dist/admins-components158.js +42 -137
  77. package/dist/admins-components158.js.map +1 -1
  78. package/dist/admins-components159.js +146 -51
  79. package/dist/admins-components159.js.map +1 -1
  80. package/dist/admins-components16.js +2 -2
  81. package/dist/admins-components16.js.map +1 -1
  82. package/dist/admins-components160.js +58 -7
  83. package/dist/admins-components160.js.map +1 -1
  84. package/dist/admins-components161.js +6 -5
  85. package/dist/admins-components161.js.map +1 -1
  86. package/dist/admins-components162.js +6 -76
  87. package/dist/admins-components162.js.map +1 -1
  88. package/dist/admins-components163.js +77 -29
  89. package/dist/admins-components163.js.map +1 -1
  90. package/dist/admins-components164.js +29 -1931
  91. package/dist/admins-components164.js.map +1 -1
  92. package/dist/admins-components165.js +1743 -24631
  93. package/dist/admins-components165.js.map +1 -1
  94. package/dist/admins-components166.js +24788 -8
  95. package/dist/admins-components166.js.map +1 -1
  96. package/dist/admins-components167.js +9 -7
  97. package/dist/admins-components167.js.map +1 -0
  98. package/dist/admins-components168.js +7 -142
  99. package/dist/admins-components169.js +141 -8
  100. package/dist/admins-components169.js.map +1 -1
  101. package/dist/admins-components17.js +3 -3
  102. package/dist/admins-components170.js +3 -3
  103. package/dist/admins-components170.js.map +1 -1
  104. package/dist/admins-components171.js +10 -0
  105. package/dist/admins-components171.js.map +1 -0
  106. package/dist/admins-components173.js +160 -45
  107. package/dist/admins-components173.js.map +1 -1
  108. package/dist/admins-components174.js +52 -8
  109. package/dist/admins-components174.js.map +1 -1
  110. package/dist/admins-components175.js +8 -49
  111. package/dist/admins-components175.js.map +1 -1
  112. package/dist/admins-components176.js +50 -6
  113. package/dist/admins-components176.js.map +1 -1
  114. package/dist/admins-components177.js +6 -80
  115. package/dist/admins-components177.js.map +1 -1
  116. package/dist/admins-components178.js +71 -48
  117. package/dist/admins-components178.js.map +1 -1
  118. package/dist/admins-components179.js +30 -35
  119. package/dist/admins-components179.js.map +1 -1
  120. package/dist/admins-components18.js +1 -1
  121. package/dist/admins-components18.js.map +1 -1
  122. package/dist/admins-components180.js +62 -8
  123. package/dist/admins-components180.js.map +1 -1
  124. package/dist/admins-components181.js +8 -51
  125. package/dist/admins-components181.js.map +1 -1
  126. package/dist/admins-components182.js +51 -8
  127. package/dist/admins-components182.js.map +1 -1
  128. package/dist/admins-components183.js +10 -0
  129. package/dist/admins-components183.js.map +1 -0
  130. package/dist/{admins-components184.js → admins-components185.js} +5 -5
  131. package/dist/{admins-components184.js.map → admins-components185.js.map} +1 -1
  132. package/dist/admins-components20.js +1 -1
  133. package/dist/admins-components21.js +10 -6
  134. package/dist/admins-components21.js.map +1 -1
  135. package/dist/admins-components22.js +4 -4
  136. package/dist/admins-components23.js +1 -1
  137. package/dist/admins-components23.js.map +1 -1
  138. package/dist/admins-components25.js +1 -1
  139. package/dist/admins-components26.js +107 -106
  140. package/dist/admins-components26.js.map +1 -1
  141. package/dist/admins-components28.js +4 -4
  142. package/dist/admins-components28.js.map +1 -1
  143. package/dist/admins-components29.js +1 -1
  144. package/dist/admins-components29.js.map +1 -1
  145. package/dist/admins-components3.js +1 -3
  146. package/dist/admins-components3.js.map +1 -1
  147. package/dist/admins-components30.js +1 -1
  148. package/dist/admins-components31.js.map +1 -1
  149. package/dist/admins-components32.js +2 -2
  150. package/dist/admins-components32.js.map +1 -1
  151. package/dist/admins-components34.js +4 -4
  152. package/dist/admins-components35.js +2 -2
  153. package/dist/admins-components35.js.map +1 -1
  154. package/dist/admins-components37.js +4 -4
  155. package/dist/admins-components38.js +1 -1
  156. package/dist/admins-components38.js.map +1 -1
  157. package/dist/admins-components40.js +1 -1
  158. package/dist/admins-components41.js +1 -1
  159. package/dist/admins-components41.js.map +1 -1
  160. package/dist/admins-components43.js +1 -1
  161. package/dist/admins-components43.js.map +1 -1
  162. package/dist/admins-components45.js +1 -1
  163. package/dist/admins-components46.js +1 -1
  164. package/dist/admins-components46.js.map +1 -1
  165. package/dist/admins-components48.js +1 -1
  166. package/dist/admins-components49.js +1 -1
  167. package/dist/admins-components49.js.map +1 -1
  168. package/dist/admins-components5.js +2 -2
  169. package/dist/admins-components5.js.map +1 -1
  170. package/dist/admins-components51.js +1 -1
  171. package/dist/admins-components51.js.map +1 -1
  172. package/dist/admins-components54.js +1 -1
  173. package/dist/admins-components54.js.map +1 -1
  174. package/dist/admins-components56.js +1 -1
  175. package/dist/admins-components57.js +1 -1
  176. package/dist/admins-components57.js.map +1 -1
  177. package/dist/admins-components6.js +3 -3
  178. package/dist/admins-components62.js +1 -1
  179. package/dist/admins-components62.js.map +1 -1
  180. package/dist/admins-components64.js +1 -1
  181. package/dist/admins-components65.js.map +1 -1
  182. package/dist/admins-components66.js +1 -1
  183. package/dist/admins-components66.js.map +1 -1
  184. package/dist/admins-components68.js +5 -5
  185. package/dist/admins-components68.js.map +1 -1
  186. package/dist/admins-components7.js +1 -1
  187. package/dist/admins-components7.js.map +1 -1
  188. package/dist/admins-components70.js +1 -1
  189. package/dist/admins-components71.js +1 -1
  190. package/dist/admins-components71.js.map +1 -1
  191. package/dist/admins-components73.js +1 -1
  192. package/dist/admins-components74.js +1 -1
  193. package/dist/admins-components74.js.map +1 -1
  194. package/dist/admins-components75.js +1 -1
  195. package/dist/admins-components75.js.map +1 -1
  196. package/dist/admins-components77.js +1 -1
  197. package/dist/admins-components78.js +1 -1
  198. package/dist/admins-components79.js +1 -1
  199. package/dist/admins-components79.js.map +1 -1
  200. package/dist/admins-components8.js +2 -2
  201. package/dist/admins-components8.js.map +1 -1
  202. package/dist/admins-components80.js +2 -2
  203. package/dist/admins-components80.js.map +1 -1
  204. package/dist/admins-components82.js +4 -4
  205. package/dist/admins-components83.js +1 -1
  206. package/dist/admins-components83.js.map +1 -1
  207. package/dist/admins-components85.js +4 -4
  208. package/dist/admins-components86.js.map +1 -1
  209. package/dist/admins-components87.js +6 -4
  210. package/dist/admins-components87.js.map +1 -1
  211. package/dist/admins-components88.js +4 -4
  212. package/dist/admins-components88.js.map +1 -1
  213. package/dist/admins-components90.js +1 -1
  214. package/dist/admins-components91.js +1 -1
  215. package/dist/admins-components91.js.map +1 -1
  216. package/dist/admins-components93.js +1 -1
  217. package/dist/admins-components94.js +1 -1
  218. package/dist/admins-components94.js.map +1 -1
  219. package/dist/admins-components96.js +1 -1
  220. package/dist/admins-components97.js +1 -1
  221. package/dist/admins-components97.js.map +1 -1
  222. package/dist/admins-components99.js +1 -1
  223. package/dist/main.css +1 -1
  224. package/dist/main.css.map +1 -1
  225. package/dist/src/composables/useDropdownAnchor.d.ts +0 -11
  226. package/dist/{src/styles → styles}/components/data-table/filter-tags.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  227. package/dist/styles/components/dropdown-select.scss_vue_type_style_index_0_src_true_lang.css +1 -0
  228. package/package.json +1 -1
  229. package/dist/admins-components168.js.map +0 -1
  230. package/dist/admins-components172.js +0 -169
  231. package/dist/admins-components172.js.map +0 -1
  232. package/dist/src/styles/components/dropdown-select.scss_vue_type_style_index_0_src_true_lang.css +0 -1
  233. /package/dist/{src/styles → styles}/components/calendar.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  234. /package/dist/{src/styles → styles}/components/copy-to-clipboard.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  235. /package/dist/{src/styles → styles}/components/data-table/data-cards.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  236. /package/dist/{src/styles → styles}/components/data-table/data-filters.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  237. /package/dist/{src/styles → styles}/components/data-table/data-list-guide.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  238. /package/dist/{src/styles → styles}/components/data-table/data-list-options.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  239. /package/dist/{src/styles → styles}/components/data-table/data-list.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  240. /package/dist/{src/styles → styles}/components/data-table/data-paginator.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  241. /package/dist/{src/styles → styles}/components/data-table/data-search.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  242. /package/dist/{src/styles → styles}/components/data-table/data-sort.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  243. /package/dist/{src/styles → styles}/components/data-table/data-table.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  244. /package/dist/{src/styles → styles}/components/data-table/filters-history.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  245. /package/dist/{src/styles → styles}/components/data-table/tag-list.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  246. /package/dist/{src/styles → styles}/components/datepickers.scss_vue_type_style_index_1_src_true_lang.css +0 -0
  247. /package/dist/{src/styles → styles}/components/header.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  248. /package/dist/{src/styles → styles}/components/image-picker.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  249. /package/dist/{src/styles → styles}/components/loader.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  250. /package/dist/{src/styles → styles}/components/modal.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  251. /package/dist/{src/styles → styles}/components/sidebar.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  252. /package/dist/{src/styles → styles}/components/toast-notification.scss_vue_type_style_index_0_src_true_lang.css +0 -0
  253. /package/dist/{src/vueformelements → vueformelements}/ArticlePickerElement.vue_vue_type_style_index_0_scoped_43c54caa_lang.css +0 -0
  254. /package/dist/{src/vueformelements → vueformelements}/PartnerPickerElement.vue_vue_type_style_index_0_scoped_09bea4ae_lang.css +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components79.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\nexport function navigateIframe(url: string, target?: string): void {\n if (target === '_blank') {\n window.open(url, '_blank')\n return\n }\n\n const isIframe = window.self !== window.top\n\n if (isIframe) {\n window.top!.location.href = url\n } else {\n window.location.href = url\n }\n}\n/* export function navigateIframe(url: string, target?: string): void {\n const isIframe = window.self !== window.top\n if (target === '_blank') {\n window.open(url, '_blank')\n return\n }\n if (!isIframe) {\n window.location.href = url\n return\n }\n top!.window.location.href = url\n} */\n/*\nexport function setupIframeNavigation(element: HTMLAnchorElement): () => void {\n const handleClick = (event: MouseEvent) => {\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault()\n navigateIframe(element.getAttribute('href')!, '_blank')\n return\n }\n\n event.preventDefault()\n navigateIframe(element.getAttribute('href')!)\n }\n\n const handleAuxClick = (event: MouseEvent) => {\n if (event.button !== 1) return\n\n event.preventDefault()\n navigateIframe(element.getAttribute('href')!, '_blank')\n }\n\n element.addEventListener('click', handleClick)\n element.addEventListener('auxclick', handleAuxClick)\n\n return () => {\n element.removeEventListener('click', handleClick)\n element.removeEventListener('auxclick', handleAuxClick)\n }\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;AAEA,SAAgB,EAAe,GAAa,GAAuB;CACjE,IAAI,MAAW,UAAU;EACvB,OAAO,KAAK,GAAK,QAAQ;EACzB;CACF;CAIA,AAFiB,OAAO,SAAS,OAAO,MAKtC,OAAO,SAAS,OAAO,IAFvB,OAAO,IAAK,SAAS,OAAO;AAIhC"}
1
+ {"version":3,"file":"admins-components79.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\nexport function navigateIframe(url: string, target?: string): void {\n if (target === '_blank') {\n window.open(url, '_blank')\n return\n }\n\n const isIframe = window.self !== window.top\n\n if (isIframe) {\n window.top!.location.href = url\n } else {\n window.location.href = url\n }\n}\n/* export function navigateIframe(url: string, target?: string): void {\n const isIframe = window.self !== window.top\n if (target === '_blank') {\n window.open(url, '_blank')\n return\n }\n if (!isIframe) {\n window.location.href = url\n return\n }\n top!.window.location.href = url\n} */\n/*\nexport function setupIframeNavigation(element: HTMLAnchorElement): () => void {\n const handleClick = (event: MouseEvent) => {\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault()\n navigateIframe(element.getAttribute('href')!, '_blank')\n return\n }\n\n event.preventDefault()\n navigateIframe(element.getAttribute('href')!)\n }\n\n const handleAuxClick = (event: MouseEvent) => {\n if (event.button !== 1) return\n\n event.preventDefault()\n navigateIframe(element.getAttribute('href')!, '_blank')\n }\n\n element.addEventListener('click', handleClick)\n element.addEventListener('auxclick', handleAuxClick)\n\n return () => {\n element.removeEventListener('click', handleClick)\n element.removeEventListener('auxclick', handleAuxClick)\n }\n} */\n"],"mappings":";AAAA,SAAgB,EAAY,GAA4B;CACtD,OAAO,IAAI,gBAAgB,OAAO,SAAS,MAAM,CAAC,CAAC,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,MAAQ,QAAQ,KAAY,UAChC,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,CAAC,CACD,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;AACb;AAEA,SAAgB,EAAe,GAAa,GAAuB;CACjE,IAAI,MAAW,UAAU;EACvB,OAAO,KAAK,GAAK,QAAQ;EACzB;CACF;CAIA,AAFiB,OAAO,SAAS,OAAO,MAKtC,OAAO,SAAS,OAAO,IAFvB,OAAO,IAAK,SAAS,OAAO;AAIhC"}
@@ -12,7 +12,7 @@ var ie = { class: "ac-component" }, ae = { class: "dp-calendar" }, oe = { class:
12
12
  }, fe = ["disabled", "onClick"], pe = {
13
13
  key: 0,
14
14
  class: "c-footer"
15
- }, me = { class: "dp-time-inputs" }, x = ["value", "disabled"], he = ["value", "disabled"], S = /* @__PURE__ */ u({
15
+ }, me = { class: "dp-time-inputs" }, x = ["value", "disabled"], he = ["value", "disabled"], S = /*@__PURE__*/ u({
16
16
  __name: "Calendar",
17
17
  props: {
18
18
  modelValue: {},
@@ -250,4 +250,4 @@ var ie = { class: "ac-component" }, ae = { class: "dp-calendar" }, oe = { class:
250
250
  }
251
251
  });
252
252
  //#endregion
253
- export { S as default };
253
+ export { r as calendarConfigDefaults, S as default };
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components8.js","names":[],"sources":["../src/components/Calendar.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { calendarConfigDefaults, type CalendarConfig } from '@/types/datepickers'\n\nexport { calendarConfigDefaults }\nexport type { CalendarConfig }\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, useTemplateRef, nextTick } from 'vue'\nimport { formatDate, parseDate } from '@/utils/date'\nimport Button from '@/components/Button.vue'\n\nconst props = withDefaults(defineProps<{ modelValue: string | null; config?: CalendarConfig }>(), {\n config: () => ({ ...calendarConfigDefaults }),\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | null]\n confirm: [value: string | null]\n}>()\n\nconst cfg = computed(() => ({ ...calendarConfigDefaults, ...props.config }))\n\nconst DAYS_PER_PAGE = 5 * 7\n\nconst outputFormat = computed(\n () => cfg.value.format ?? (cfg.value.showTime ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD'),\n)\n\nfunction parseModelValue(val: string | null): Date | null {\n return val ? parseDate(val, outputFormat.value) : null\n}\n\nconst initial = parseModelValue(props.modelValue)\nconst currentMonth = ref(initial?.getMonth() ?? new Date().getMonth())\nconst currentYear = ref(initial?.getFullYear() ?? new Date().getFullYear())\nconst selectedDate = ref<Date | null>(initial)\nconst hours = ref(initial?.getHours() ?? 0)\nconst minutes = ref(initial?.getMinutes() ?? 0)\nconst activePicker = ref<'year' | 'month' | null>(null)\n\nwatch(\n () => props.modelValue,\n (val) => {\n const parsed = parseModelValue(val ?? null)\n if (parsed) {\n selectedDate.value = parsed\n currentMonth.value = parsed.getMonth()\n currentYear.value = parsed.getFullYear()\n hours.value = parsed.getHours()\n minutes.value = parsed.getMinutes()\n } else {\n selectedDate.value = null\n }\n },\n)\n\n// Locale\nconst weekDays = computed(() =>\n Array.from({ length: 7 }, (_, i) =>\n new Date(2024, 0, i + 1).toLocaleDateString(cfg.value.locale, { weekday: 'narrow' }),\n ),\n)\nconst monthName = computed(() =>\n new Date(currentYear.value, currentMonth.value).toLocaleDateString(cfg.value.locale, {\n month: 'long',\n }),\n)\nconst monthNames = computed(() =>\n Array.from({ length: 12 }, (_, i) =>\n new Date(2024, i).toLocaleDateString(cfg.value.locale, { month: 'long' }),\n ),\n)\n\n// Days grid\nconst calendarDays = computed(() => {\n const first = new Date(currentYear.value, currentMonth.value, 1)\n const last = new Date(currentYear.value, currentMonth.value + 1, 0)\n const offset = (first.getDay() + 6) % 7\n const days: { date: Date; currentMonth: boolean; disabled: boolean }[] = []\n\n for (let i = offset - 1; i >= 0; i--)\n days.push({\n date: new Date(currentYear.value, currentMonth.value, -i),\n currentMonth: false,\n disabled: isDisabled(new Date(currentYear.value, currentMonth.value, -i)),\n })\n for (let i = 1; i <= last.getDate(); i++)\n days.push({\n date: new Date(currentYear.value, currentMonth.value, i),\n currentMonth: true,\n disabled: isDisabled(new Date(currentYear.value, currentMonth.value, i)),\n })\n for (let i = 1; days.length < DAYS_PER_PAGE; i++)\n days.push({\n date: new Date(currentYear.value, currentMonth.value + 1, i),\n currentMonth: false,\n disabled: isDisabled(new Date(currentYear.value, currentMonth.value + 1, i)),\n })\n\n return days\n})\n\n// ISO 8601 week number\nfunction getIsoWeekNumber(d: Date) {\n const target = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()))\n const dayNum = (target.getUTCDay() + 6) % 7\n target.setUTCDate(target.getUTCDate() - dayNum + 3)\n const firstThursday = new Date(Date.UTC(target.getUTCFullYear(), 0, 4))\n const diff = (target.getTime() - firstThursday.getTime()) / 86400000\n return 1 + Math.round((diff - 3 + ((firstThursday.getUTCDay() + 6) % 7)) / 7)\n}\n\nconst weekNumbers = computed(() => {\n const weeks: number[] = []\n for (let row = 0; row < 6; row++) {\n const firstDayOfRow = calendarDays.value[row * 7]?.date\n weeks.push(firstDayOfRow ? getIsoWeekNumber(firstDayOfRow) : 0)\n }\n return weeks\n})\n\n// Helpers\nfunction stripTime(d: Date) {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate())\n}\nfunction isDisabled(d: Date) {\n return (\n (cfg.value.minDate && d < stripTime(cfg.value.minDate)) ||\n (cfg.value.maxDate && d > stripTime(cfg.value.maxDate)) ||\n false\n )\n}\nfunction isWeekend(d: Date) {\n return d.getDay() === 0 || d.getDay() === 6\n}\nfunction isSameDay(a: Date, b: Date | null) {\n return (\n !!b &&\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\nfunction isToday(d: Date) {\n return isSameDay(d, new Date())\n}\n\n// Navigation\nfunction navigate(delta: number) {\n const d = new Date(currentYear.value, currentMonth.value + delta, 1)\n currentYear.value = d.getFullYear()\n currentMonth.value = d.getMonth()\n}\n\nfunction backToDayPicker() {\n activePicker.value = null\n}\n\nfunction onPrev() {\n if (activePicker.value) backToDayPicker()\n else navigate(-1)\n}\n\nfunction onNext() {\n if (activePicker.value) backToDayPicker()\n else navigate(1)\n}\n\n// Pickers\nconst yearList = computed(() =>\n Array.from({ length: new Date().getFullYear() + 3 - 2000 + 1 }, (_, i) => 2000 + i),\n)\nconst yearPickerRef = useTemplateRef<HTMLElement>('yearPickerRef')\n\nfunction togglePicker(picker: 'year' | 'month') {\n activePicker.value = activePicker.value === picker ? null : picker\n if (activePicker.value === 'year') {\n nextTick(() => {\n const container = yearPickerRef.value\n const el = container?.querySelector('.dp-picker-item--selected') as HTMLElement | null\n if (el && container) {\n container.scrollTop = el.offsetTop - container.offsetHeight / 2 + el.offsetHeight / 2\n } else if (container) {\n container.scrollTop = container.scrollHeight\n }\n })\n }\n}\n\nfunction selectYear(year: number) {\n currentYear.value = year\n activePicker.value = null\n}\nfunction selectMonth(month: number) {\n currentMonth.value = month\n activePicker.value = null\n}\n\n// Selection & emit\nfunction selectDay(day: { date: Date; disabled: boolean }) {\n if (day.disabled) return\n selectedDate.value = new Date(day.date)\n emitValue()\n if (cfg.value.showTime) {\n nextTick(() => hoursInput.value?.focus())\n }\n}\n\nfunction emitValue() {\n if (!selectedDate.value) {\n emit('update:modelValue', null)\n return\n }\n const result = new Date(selectedDate.value)\n if (cfg.value.showTime) result.setHours(hours.value, minutes.value, 0, 0)\n else result.setHours(0, 0, 0, 0)\n emit('update:modelValue', formatDate(result, outputFormat.value))\n}\n\nfunction onClear() {\n selectedDate.value = null\n hours.value = 0\n minutes.value = 0\n emit('update:modelValue', null)\n}\n\n// Time input\nfunction createTimeField(max: number, valueRef: { value: number }) {\n return computed({\n get: () => String(valueRef.value).padStart(2, '0'),\n set: (val: string) => {\n valueRef.value = Math.min(max, Math.max(0, parseInt(val) || 0))\n },\n })\n}\n\nconst formattedHours = createTimeField(23, hours)\nconst formattedMinutes = createTimeField(59, minutes)\nconst hoursInput = useTemplateRef<HTMLInputElement>('hoursInput')\nconst minutesInput = useTemplateRef<HTMLInputElement>('minutesInput')\n\nfunction onTimeInput(field: 'hours' | 'minutes', event: Event) {\n const el = event.target as HTMLInputElement\n if (field === 'hours') {\n formattedHours.value = el.value\n if (el.value.length >= 2) {\n minutesInput.value?.focus()\n minutesInput.value?.select()\n }\n } else {\n formattedMinutes.value = el.value\n if (el.value.length >= 2) el.blur()\n }\n emitValue()\n}\n</script>\n\n<template>\n <div class=\"ac-component\">\n <div class=\"dp-calendar\">\n <div class=\"dp-header\">\n <button\n class=\"dp-nav-btn\"\n type=\"button\"\n :aria-label=\"activePicker ? 'Back to days' : 'Previous'\"\n @click=\"onPrev\"\n >\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n <div class=\"dp-header-labels\">\n <span class=\"dp-header-labels--item\" @click=\"togglePicker('year')\">{{\n currentYear\n }}</span>\n <span class=\"dp-header-labels--item\" @click=\"togglePicker('month')\">{{ monthName }}</span>\n </div>\n <button\n class=\"dp-nav-btn\"\n type=\"button\"\n :aria-label=\"activePicker ? 'Back to days' : 'Next'\"\n :class=\"{ 'dp-nav-btn--spacer': activePicker !== null }\"\n :aria-hidden=\"activePicker ? 'true' : 'false'\"\n @click=\"onNext\"\n >\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n\n <div\n class=\"dp-body\"\n :class=\"{ 'dp-body--has-footer': cfg.showTime || cfg.showOkButton || cfg.showClearButton }\"\n >\n <!-- Year picker -->\n <div\n v-if=\"activePicker === 'year'\"\n ref=\"yearPickerRef\"\n class=\"dp-picker-grid dp-picker-grid--4col dp-picker-grid--scrollable c-scroll\"\n >\n <button\n v-for=\"y in yearList\"\n :key=\"y\"\n type=\"button\"\n class=\"dp-picker-item\"\n :class=\"{\n 'dp-picker-item--selected': y === currentYear,\n 'dp-picker-item--today': y === new Date().getFullYear(),\n }\"\n @click=\"selectYear(y)\"\n >\n {{ y }}\n </button>\n </div>\n\n <!-- Month picker -->\n <div\n v-else-if=\"activePicker === 'month'\"\n class=\"dp-picker-grid dp-month-picker dp-picker-grid--3col\"\n >\n <button\n v-for=\"(name, idx) in monthNames\"\n :key=\"idx\"\n type=\"button\"\n class=\"dp-picker-item\"\n :class=\"{\n 'dp-picker-item--selected': idx === currentMonth,\n 'dp-picker-item--today':\n idx === new Date().getMonth() && currentYear === new Date().getFullYear(),\n }\"\n @click=\"selectMonth(idx)\"\n >\n {{ name }}\n </button>\n </div>\n\n <!-- Day picker -->\n <template v-else>\n <div class=\"dp-weekdays\" :class=\"{ 'dp-weekdays--has-week': cfg.showWeekNumber }\">\n <span v-if=\"cfg.showWeekNumber\" class=\"dp-weekday dp-weekday--week\"></span>\n <span v-for=\"d in weekDays\" :key=\"d\" class=\"dp-weekday\">{{ d }}</span>\n </div>\n <div\n class=\"dp-picker-grid\"\n :class=\"cfg.showWeekNumber ? 'dp-picker-grid--8col' : 'dp-picker-grid--7col'\"\n >\n <template v-for=\"(day, i) in calendarDays\" :key=\"i\">\n <span\n v-if=\"cfg.showWeekNumber && Number(i) % 7 === 0\"\n class=\"dp-week-number\"\n :class=\"{\n 'dp-week-number--other':\n !day.currentMonth && !calendarDays[Number(i) + 7]?.currentMonth,\n }\"\n v-tooltip=\"`${weekNumbers[Math.floor(Number(i) / 7)]}. hét`\"\n >\n {{ weekNumbers[Math.floor(Number(i) / 7)] }}.\n </span>\n <button\n type=\"button\"\n class=\"dp-picker-item dp-picker-item--circle\"\n :class=\"{\n 'dp-picker-item--other': !day.currentMonth,\n 'dp-picker-item--selected': isSameDay(day.date, selectedDate),\n 'dp-picker-item--today': isToday(day.date),\n 'dp-picker-item--disabled': day.disabled,\n 'dp-picker-item--weekend': cfg.highlightWeekends && isWeekend(day.date),\n }\"\n :disabled=\"day.disabled\"\n @click=\"selectDay(day)\"\n >\n {{ day.date.getDate() }}\n </button>\n </template>\n </div>\n\n <div v-if=\"cfg.showTime || cfg.showOkButton || cfg.showClearButton\" class=\"c-footer\">\n <template v-if=\"cfg.showTime\">\n <label class=\"dp-time-label\" for=\"dp-hours\">Idő</label>\n <div class=\"dp-time-inputs\">\n <input\n id=\"dp-hours\"\n ref=\"hoursInput\"\n type=\"number\"\n class=\"c-focus dp-time-input\"\n :value=\"formattedHours\"\n :disabled=\"!selectedDate\"\n min=\"0\"\n max=\"23\"\n @input=\"onTimeInput('hours', $event)\"\n @focus=\"($event.target as HTMLInputElement).select()\"\n />\n <span class=\"dp-time-sep\">:</span>\n <input\n id=\"dp-minutes\"\n ref=\"minutesInput\"\n type=\"number\"\n class=\"c-focus dp-time-input\"\n :value=\"formattedMinutes\"\n :disabled=\"!selectedDate\"\n min=\"0\"\n max=\"59\"\n @input=\"onTimeInput('minutes', $event)\"\n @focus=\"($event.target as HTMLInputElement).select()\"\n />\n </div>\n </template>\n <Button\n v-if=\"cfg.showClearButton\"\n label=\"Törlés\"\n @click=\"onClear\"\n outline\n :disabled=\"!selectedDate\"\n />\n <Button\n v-if=\"cfg.showOkButton\"\n label=\"OK\"\n type=\"success\"\n @click=\"emit('confirm', modelValue)\"\n :disabled=\"!selectedDate\"\n />\n </div>\n </template>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/calendar.scss\"></style>\n<style lang=\"scss\" src=\"@/styles/components/datepickers.scss\"></style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAYA,IAAM,IAAQ,GAIR,IAAO,GAKP,IAAM,SAAgB;GAAE,GAAG;GAAwB,GAAG,EAAM;EAAO,EAAE,GAIrE,IAAe,QACb,EAAI,MAAM,WAAW,EAAI,MAAM,WAAW,qBAAqB,aACvE;EAEA,SAAS,EAAgB,GAAiC;GACxD,OAAO,IAAM,EAAU,GAAK,EAAa,KAAK,IAAI;EACpD;EAEA,IAAM,IAAU,EAAgB,EAAM,UAAU,GAC1C,IAAe,EAAI,GAAS,SAAS,sBAAK,IAAI,KAAK,GAAE,SAAS,CAAC,GAC/D,IAAc,EAAI,GAAS,YAAY,sBAAK,IAAI,KAAK,GAAE,YAAY,CAAC,GACpE,IAAe,EAAiB,CAAO,GACvC,IAAQ,EAAI,GAAS,SAAS,KAAK,CAAC,GACpC,IAAU,EAAI,GAAS,WAAW,KAAK,CAAC,GACxC,IAAe,EAA6B,IAAI;EAEtD,SACQ,EAAM,aACX,MAAQ;GACP,IAAM,IAAS,EAAgB,KAAO,IAAI;GAC1C,AAAI,KACF,EAAa,QAAQ,GACrB,EAAa,QAAQ,EAAO,SAAS,GACrC,EAAY,QAAQ,EAAO,YAAY,GACvC,EAAM,QAAQ,EAAO,SAAS,GAC9B,EAAQ,QAAQ,EAAO,WAAW,KAElC,EAAa,QAAQ;EAEzB,CACF;EAGA,IAAM,IAAW,QACf,MAAM,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,MAC5B,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,mBAAmB,EAAI,MAAM,QAAQ,EAAE,SAAS,SAAS,CAAC,CACrF,CACF,GACM,IAAY,QAChB,IAAI,KAAK,EAAY,OAAO,EAAa,KAAK,EAAE,mBAAmB,EAAI,MAAM,QAAQ,EACnF,OAAO,OACT,CAAC,CACH,GACM,IAAa,QACjB,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,MAC7B,IAAI,KAAK,MAAM,CAAC,EAAE,mBAAmB,EAAI,MAAM,QAAQ,EAAE,OAAO,OAAO,CAAC,CAC1E,CACF,GAGM,IAAe,QAAe;GAClC,IAAM,IAAQ,IAAI,KAAK,EAAY,OAAO,EAAa,OAAO,CAAC,GACzD,IAAO,IAAI,KAAK,EAAY,OAAO,EAAa,QAAQ,GAAG,CAAC,GAC5D,KAAU,EAAM,OAAO,IAAI,KAAK,GAChC,IAAmE,CAAC;GAE1E,KAAK,IAAI,IAAI,IAAS,GAAG,KAAK,GAAG,KAC/B,EAAK,KAAK;IACR,MAAM,IAAI,KAAK,EAAY,OAAO,EAAa,OAAO,CAAC,CAAC;IACxD,cAAc;IACd,UAAU,EAAW,IAAI,KAAK,EAAY,OAAO,EAAa,OAAO,CAAC,CAAC,CAAC;GAC1E,CAAC;GACH,KAAK,IAAI,IAAI,GAAG,KAAK,EAAK,QAAQ,GAAG,KACnC,EAAK,KAAK;IACR,MAAM,IAAI,KAAK,EAAY,OAAO,EAAa,OAAO,CAAC;IACvD,cAAc;IACd,UAAU,EAAW,IAAI,KAAK,EAAY,OAAO,EAAa,OAAO,CAAC,CAAC;GACzE,CAAC;GACH,KAAK,IAAI,IAAI,GAAG,EAAK,SAAS,IAAe,KAC3C,EAAK,KAAK;IACR,MAAM,IAAI,KAAK,EAAY,OAAO,EAAa,QAAQ,GAAG,CAAC;IAC3D,cAAc;IACd,UAAU,EAAW,IAAI,KAAK,EAAY,OAAO,EAAa,QAAQ,GAAG,CAAC,CAAC;GAC7E,CAAC;GAEH,OAAO;EACT,CAAC;EAGD,SAAS,GAAiB,GAAS;GACjC,IAAM,IAAS,IAAI,KAAK,KAAK,IAAI,EAAE,YAAY,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,CAAC,CAAC,GACtE,KAAU,EAAO,UAAU,IAAI,KAAK;GAC1C,EAAO,WAAW,EAAO,WAAW,IAAI,IAAS,CAAC;GAClD,IAAM,IAAgB,IAAI,KAAK,KAAK,IAAI,EAAO,eAAe,GAAG,GAAG,CAAC,CAAC,GAChE,KAAQ,EAAO,QAAQ,IAAI,EAAc,QAAQ,KAAK;GAC5D,OAAO,IAAI,KAAK,OAAO,IAAO,KAAM,EAAc,UAAU,IAAI,KAAK,KAAM,CAAC;EAC9E;EAEA,IAAM,IAAc,QAAe;GACjC,IAAM,IAAkB,CAAC;GACzB,KAAK,IAAI,IAAM,GAAG,IAAM,GAAG,KAAO;IAChC,IAAM,IAAgB,EAAa,MAAM,IAAM,IAAI;IACnD,EAAM,KAAK,IAAgB,GAAiB,CAAa,IAAI,CAAC;GAChE;GACA,OAAO;EACT,CAAC;EAGD,SAAS,EAAU,GAAS;GAC1B,OAAO,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,CAAC;EAC5D;EACA,SAAS,EAAW,GAAS;GAC3B,OACG,EAAI,MAAM,WAAW,IAAI,EAAU,EAAI,MAAM,OAAO,KACpD,EAAI,MAAM,WAAW,IAAI,EAAU,EAAI,MAAM,OAAO,KACrD;EAEJ;EACA,SAAS,GAAU,GAAS;GAC1B,OAAO,EAAE,OAAO,MAAM,KAAK,EAAE,OAAO,MAAM;EAC5C;EACA,SAAS,EAAU,GAAS,GAAgB;GAC1C,OACE,CAAC,CAAC,KACF,EAAE,YAAY,MAAM,EAAE,YAAY,KAClC,EAAE,SAAS,MAAM,EAAE,SAAS,KAC5B,EAAE,QAAQ,MAAM,EAAE,QAAQ;EAE9B;EACA,SAAS,GAAQ,GAAS;GACxB,OAAO,EAAU,mBAAG,IAAI,KAAK,CAAC;EAChC;EAGA,SAAS,EAAS,GAAe;GAC/B,IAAM,IAAI,IAAI,KAAK,EAAY,OAAO,EAAa,QAAQ,GAAO,CAAC;GAEnE,AADA,EAAY,QAAQ,EAAE,YAAY,GAClC,EAAa,QAAQ,EAAE,SAAS;EAClC;EAEA,SAAS,IAAkB;GACzB,EAAa,QAAQ;EACvB;EAEA,SAAS,KAAS;GAChB,AAAI,EAAa,QAAO,EAAgB,IACnC,EAAS,EAAE;EAClB;EAEA,SAAS,KAAS;GAChB,AAAI,EAAa,QAAO,EAAgB,IACnC,EAAS,CAAC;EACjB;EAGA,IAAM,KAAW,QACf,MAAM,KAAK,EAAE,yBAAQ,IAAI,KAAK,GAAE,YAAY,IAAI,IAAI,MAAO,EAAE,IAAI,GAAG,MAAM,MAAO,CAAC,CACpF,GACM,IAAgB,EAA4B,eAAe;EAEjE,SAAS,EAAa,GAA0B;GAE9C,AADA,EAAa,QAAQ,EAAa,UAAU,IAAS,OAAO,GACxD,EAAa,UAAU,UACzB,QAAe;IACb,IAAM,IAAY,EAAc,OAC1B,IAAK,GAAW,cAAc,2BAA2B;IAC/D,AAAI,KAAM,IACR,EAAU,YAAY,EAAG,YAAY,EAAU,eAAe,IAAI,EAAG,eAAe,IAC3E,MACT,EAAU,YAAY,EAAU;GAEpC,CAAC;EAEL;EAEA,SAAS,GAAW,GAAc;GAEhC,AADA,EAAY,QAAQ,GACpB,EAAa,QAAQ;EACvB;EACA,SAAS,GAAY,GAAe;GAElC,AADA,EAAa,QAAQ,GACrB,EAAa,QAAQ;EACvB;EAGA,SAAS,GAAU,GAAwC;GACrD,EAAI,aACR,EAAa,QAAQ,IAAI,KAAK,EAAI,IAAI,GACtC,EAAU,GACN,EAAI,MAAM,YACZ,QAAe,EAAW,OAAO,MAAM,CAAC;EAE5C;EAEA,SAAS,IAAY;GACnB,IAAI,CAAC,EAAa,OAAO;IACvB,EAAK,qBAAqB,IAAI;IAC9B;GACF;GACA,IAAM,IAAS,IAAI,KAAK,EAAa,KAAK;GAG1C,AAFI,EAAI,MAAM,WAAU,EAAO,SAAS,EAAM,OAAO,EAAQ,OAAO,GAAG,CAAC,IACnE,EAAO,SAAS,GAAG,GAAG,GAAG,CAAC,GAC/B,EAAK,qBAAqB,EAAW,GAAQ,EAAa,KAAK,CAAC;EAClE;EAEA,SAAS,KAAU;GAIjB,AAHA,EAAa,QAAQ,MACrB,EAAM,QAAQ,GACd,EAAQ,QAAQ,GAChB,EAAK,qBAAqB,IAAI;EAChC;EAGA,SAAS,EAAgB,GAAa,GAA6B;GACjE,OAAO,EAAS;IACd,WAAW,OAAO,EAAS,KAAK,EAAE,SAAS,GAAG,GAAG;IACjD,MAAM,MAAgB;KACpB,EAAS,QAAQ,KAAK,IAAI,GAAK,KAAK,IAAI,GAAG,SAAS,CAAG,KAAK,CAAC,CAAC;IAChE;GACF,CAAC;EACH;EAEA,IAAM,IAAiB,EAAgB,IAAI,CAAK,GAC1C,IAAmB,EAAgB,IAAI,CAAO,GAC9C,IAAa,EAAiC,YAAY,GAC1D,IAAe,EAAiC,cAAc;EAEpE,SAAS,EAAY,GAA4B,GAAc;GAC7D,IAAM,IAAK,EAAM;GAWjB,AAVI,MAAU,WACZ,EAAe,QAAQ,EAAG,OACtB,EAAG,MAAM,UAAU,MACrB,EAAa,OAAO,MAAM,GAC1B,EAAa,OAAO,OAAO,OAG7B,EAAiB,QAAQ,EAAG,OACxB,EAAG,MAAM,UAAU,KAAG,EAAG,KAAK,IAEpC,EAAU;EACZ;;;eAIE,EAoKM,OApKN,IAoKM,CAnKJ,EAkKM,OAlKN,IAkKM,CAjKJ,EAyBM,OAzBN,IAyBM;IAxBJ,EAOS,UAAA;KANP,OAAM;KACN,MAAK;KACJ,cAAY,EAAA,QAAY,iBAAA;KACxB,SAAO;qBAER,EAAwC,KAAA,EAArC,OAAM,2BAA0B,GAAA,MAAA,EAAA,CAAA,CAAA,GAAA,GAAA,EAAA;IAErC,EAKM,OALN,GAKM,CAJJ,EAES,QAAA;KAFH,OAAM;KAA0B,SAAK,AAAA,EAAA,QAAA,MAAE,EAAY,MAAA;SACvD,EAAA,KAAW,GAAA,CAAA,GAEb,EAA0F,QAAA;KAApF,OAAM;KAA0B,SAAK,AAAA,EAAA,QAAA,MAAE,EAAY,OAAA;SAAc,EAAA,KAAS,GAAA,CAAA,CAAA,CAAA;IAElF,EASS,UAAA;KARP,OAAK,EAAA,CAAC,cAAY,EAAA,sBAGc,EAAA,UAAY,KAAA,CAAA,CAAA;KAF5C,MAAK;KACJ,cAAY,EAAA,QAAY,iBAAA;KAExB,eAAa,EAAA,QAAY,SAAA;KACzB,SAAO;qBAER,EAAyC,KAAA,EAAtC,OAAM,4BAA2B,GAAA,MAAA,EAAA,CAAA,CAAA,GAAA,IAAA,EAAA;OAIxC,EAqIM,OAAA,EApIJ,OAAK,EAAA,CAAC,WAAS,EAAA,uBACkB,EAAA,MAAI,YAAY,EAAA,MAAI,gBAAgB,EAAA,MAAI,gBAAe,CAAA,CAAA,EAAA,GAAA,CAIhF,EAAA,UAAY,UAAA,EAAA,GADpB,EAkBM,OAAA;;aAhBA;IAAJ,KAAI;IACJ,OAAM;eAEN,EAYS,GAAA,MAAA,EAXK,GAAA,QAAL,YADT,EAYS,UAAA;IAVN,KAAK;IACN,MAAK;IACL,OAAK,EAAA,CAAC,kBAAgB;iCAC8B,MAAM,EAAA;8BAAoD,uBAAC,IAAS,KAAI,GAAG,YAAW;;IAIzI,UAAK,MAAE,GAAW,CAAC;QAEjB,CAAC,GAAA,IAAA,EAAA,qBAMK,EAAA,UAAY,WAAA,EAAA,GADzB,EAkBM,OAlBN,IAkBM,EAAA,EAAA,EAAA,GAdJ,EAaS,GAAA,MAAA,EAZe,EAAA,QAAd,GAAM,YADhB,EAaS,UAAA;IAXN,KAAK;IACN,MAAK;IACL,OAAK,EAAA,CAAC,kBAAgB;iCAC8B,MAAQ,EAAA;8BAAqE,uBAAG,IAAS,KAAI,GAAG,SAAQ,KAAM,EAAA,2BAAW,IAAS,KAAI,GAAG,YAAW;;IAKvM,UAAK,MAAE,GAAY,CAAG;QAEpB,CAAI,GAAA,IAAA,CAAA,sBAKX,EAqFW,GAAA,EAAA,KAAA,EAAA,GAAA;IApFT,EAGM,OAAA,EAHD,OAAK,EAAA,CAAC,eAAa,EAAA,yBAAoC,EAAA,MAAI,eAAc,CAAA,CAAA,EAAA,GAAA,CAChE,EAAA,MAAI,kBAAA,EAAA,GAAhB,EAA2E,QAA3E,EAA2E,KAAA,EAAA,IAAA,EAAA,IAAA,EAAA,EAAA,GAC3E,EAAsE,GAAA,MAAA,EAApD,EAAA,QAAL,YAAb,EAAsE,QAAA;KAAzC,KAAK;KAAG,OAAM;SAAgB,CAAC,GAAA,CAAA;IAE9D,EAgCM,OAAA,EA/BJ,OAAK,EAAA,CAAC,kBACE,EAAA,MAAI,iBAAc,yBAAA,sBAAA,CAAA,EAAA,GAAA,EAAA,EAAA,EAAA,GAE1B,EA2BW,GAAA,MAAA,EA3BkB,EAAA,QAAX,GAAK,wBAA0B,EAAC,GAAA,CAExC,EAAA,MAAI,kBAAkB,OAAO,CAAC,IAAA,KAAA,IAAA,IAAA,EAAA,GADtC,EAUO,QAAA;;KARL,OAAK,EAAA,CAAC,kBAAgB,EAAA,yBAAA,CACoD,EAAI,gBAAY,CAAK,EAAA,MAAa,OAAO,CAAC,IAAA,IAAQ,aAAA,CAAA,CAAA;aAMzH,EAAA,MAAY,KAAK,MAAM,OAAO,CAAC,IAAA,CAAA,EAAA,IAAU,MAC9C,CAAA,CAAA,GAAA,CAAA,IAAA,CAAA,CAAA,GAAA,GAHgB,EAAA,MAAY,KAAK,MAAM,OAAO,CAAC,IAAA,CAAA,GAAA,MAAA,CAAA,CAAA,IAAA,EAAA,IAAA,EAAA,GAI/C,EAcS,UAAA;KAbP,MAAK;KACL,OAAK,EAAA,CAAC,yCAAuC;gCACS,EAAI;kCAA4D,EAAU,EAAI,MAAM,EAAA,KAAY;+BAA8C,GAAQ,EAAI,IAAI;kCAAiD,EAAI;iCAAuD,EAAA,MAAI,qBAAqB,GAAU,EAAI,IAAI;;KAO1W,UAAU,EAAI;KACd,UAAK,MAAE,GAAU,CAAG;SAElB,EAAI,KAAK,QAAO,CAAA,GAAA,IAAA,EAAA,CAAA,GAAA,EAAA;IAKd,EAAA,MAAI,YAAY,EAAA,MAAI,gBAAgB,EAAA,MAAI,mBAAA,EAAA,GAAnD,EA6CM,OA7CN,IA6CM;KA5CY,EAAA,MAAI,YAAA,EAAA,GAApB,EA6BW,GAAA,EAAA,KAAA,EAAA,GAAA,CAAA,AAAA,EAAA,QA5BT,EAAuD,SAAA;MAAhD,OAAM;MAAgB,KAAI;QAAW,OAAG,EAAA,GAC/C,EA0BM,OA1BN,IA0BM;MAzBJ,EAWE,SAAA;OAVA,IAAG;gBACC;OAAJ,KAAI;OACJ,MAAK;OACL,OAAM;OACL,OAAO,EAAA,CAAA;OACP,UAAQ,CAAG,EAAA;OACZ,KAAI;OACJ,KAAI;OACH,SAAK,AAAA,EAAA,QAAA,MAAE,EAAW,SAAU,CAAM;OAClC,SAAK,AAAA,EAAA,QAAA,MAAG,EAAO,OAA4B,OAAM;;eAEpD,EAAkC,QAAA,EAA5B,OAAM,cAAa,GAAC,KAAC,EAAA;MAC3B,EAWE,SAAA;OAVA,IAAG;gBACC;OAAJ,KAAI;OACJ,MAAK;OACL,OAAM;OACL,OAAO,EAAA,CAAA;OACP,UAAQ,CAAG,EAAA;OACZ,KAAI;OACJ,KAAI;OACH,SAAK,AAAA,EAAA,QAAA,MAAE,EAAW,WAAY,CAAM;OACpC,SAAK,AAAA,EAAA,QAAA,MAAG,EAAO,OAA4B,OAAM;;;KAKhD,EAAA,MAAI,mBAAA,EAAA,GADZ,EAME,GAAA;;MAJA,OAAM;MACL,SAAO;MACR,SAAA;MACC,UAAQ,CAAG,EAAA;;KAGN,EAAA,MAAI,gBAAA,EAAA,GADZ,EAME,GAAA;;MAJA,OAAM;MACN,MAAK;MACJ,SAAK,AAAA,EAAA,QAAA,MAAE,EAAI,WAAY,EAAA,UAAU;MACjC,UAAQ,CAAG,EAAA"}
1
+ {"version":3,"file":"admins-components8.js","names":[],"sources":["../src/components/Calendar.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { calendarConfigDefaults, type CalendarConfig } from '@/types/datepickers'\n\nexport { calendarConfigDefaults }\nexport type { CalendarConfig }\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, useTemplateRef, nextTick } from 'vue'\nimport { formatDate, parseDate } from '@/utils/date'\nimport Button from '@/components/Button.vue'\n\nconst props = withDefaults(defineProps<{ modelValue: string | null; config?: CalendarConfig }>(), {\n config: () => ({ ...calendarConfigDefaults }),\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | null]\n confirm: [value: string | null]\n}>()\n\nconst cfg = computed(() => ({ ...calendarConfigDefaults, ...props.config }))\n\nconst DAYS_PER_PAGE = 5 * 7\n\nconst outputFormat = computed(\n () => cfg.value.format ?? (cfg.value.showTime ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD'),\n)\n\nfunction parseModelValue(val: string | null): Date | null {\n return val ? parseDate(val, outputFormat.value) : null\n}\n\nconst initial = parseModelValue(props.modelValue)\nconst currentMonth = ref(initial?.getMonth() ?? new Date().getMonth())\nconst currentYear = ref(initial?.getFullYear() ?? new Date().getFullYear())\nconst selectedDate = ref<Date | null>(initial)\nconst hours = ref(initial?.getHours() ?? 0)\nconst minutes = ref(initial?.getMinutes() ?? 0)\nconst activePicker = ref<'year' | 'month' | null>(null)\n\nwatch(\n () => props.modelValue,\n (val) => {\n const parsed = parseModelValue(val ?? null)\n if (parsed) {\n selectedDate.value = parsed\n currentMonth.value = parsed.getMonth()\n currentYear.value = parsed.getFullYear()\n hours.value = parsed.getHours()\n minutes.value = parsed.getMinutes()\n } else {\n selectedDate.value = null\n }\n },\n)\n\n// Locale\nconst weekDays = computed(() =>\n Array.from({ length: 7 }, (_, i) =>\n new Date(2024, 0, i + 1).toLocaleDateString(cfg.value.locale, { weekday: 'narrow' }),\n ),\n)\nconst monthName = computed(() =>\n new Date(currentYear.value, currentMonth.value).toLocaleDateString(cfg.value.locale, {\n month: 'long',\n }),\n)\nconst monthNames = computed(() =>\n Array.from({ length: 12 }, (_, i) =>\n new Date(2024, i).toLocaleDateString(cfg.value.locale, { month: 'long' }),\n ),\n)\n\n// Days grid\nconst calendarDays = computed(() => {\n const first = new Date(currentYear.value, currentMonth.value, 1)\n const last = new Date(currentYear.value, currentMonth.value + 1, 0)\n const offset = (first.getDay() + 6) % 7\n const days: { date: Date; currentMonth: boolean; disabled: boolean }[] = []\n\n for (let i = offset - 1; i >= 0; i--)\n days.push({\n date: new Date(currentYear.value, currentMonth.value, -i),\n currentMonth: false,\n disabled: isDisabled(new Date(currentYear.value, currentMonth.value, -i)),\n })\n for (let i = 1; i <= last.getDate(); i++)\n days.push({\n date: new Date(currentYear.value, currentMonth.value, i),\n currentMonth: true,\n disabled: isDisabled(new Date(currentYear.value, currentMonth.value, i)),\n })\n for (let i = 1; days.length < DAYS_PER_PAGE; i++)\n days.push({\n date: new Date(currentYear.value, currentMonth.value + 1, i),\n currentMonth: false,\n disabled: isDisabled(new Date(currentYear.value, currentMonth.value + 1, i)),\n })\n\n return days\n})\n\n// ISO 8601 week number\nfunction getIsoWeekNumber(d: Date) {\n const target = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()))\n const dayNum = (target.getUTCDay() + 6) % 7\n target.setUTCDate(target.getUTCDate() - dayNum + 3)\n const firstThursday = new Date(Date.UTC(target.getUTCFullYear(), 0, 4))\n const diff = (target.getTime() - firstThursday.getTime()) / 86400000\n return 1 + Math.round((diff - 3 + ((firstThursday.getUTCDay() + 6) % 7)) / 7)\n}\n\nconst weekNumbers = computed(() => {\n const weeks: number[] = []\n for (let row = 0; row < 6; row++) {\n const firstDayOfRow = calendarDays.value[row * 7]?.date\n weeks.push(firstDayOfRow ? getIsoWeekNumber(firstDayOfRow) : 0)\n }\n return weeks\n})\n\n// Helpers\nfunction stripTime(d: Date) {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate())\n}\nfunction isDisabled(d: Date) {\n return (\n (cfg.value.minDate && d < stripTime(cfg.value.minDate)) ||\n (cfg.value.maxDate && d > stripTime(cfg.value.maxDate)) ||\n false\n )\n}\nfunction isWeekend(d: Date) {\n return d.getDay() === 0 || d.getDay() === 6\n}\nfunction isSameDay(a: Date, b: Date | null) {\n return (\n !!b &&\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\nfunction isToday(d: Date) {\n return isSameDay(d, new Date())\n}\n\n// Navigation\nfunction navigate(delta: number) {\n const d = new Date(currentYear.value, currentMonth.value + delta, 1)\n currentYear.value = d.getFullYear()\n currentMonth.value = d.getMonth()\n}\n\nfunction backToDayPicker() {\n activePicker.value = null\n}\n\nfunction onPrev() {\n if (activePicker.value) backToDayPicker()\n else navigate(-1)\n}\n\nfunction onNext() {\n if (activePicker.value) backToDayPicker()\n else navigate(1)\n}\n\n// Pickers\nconst yearList = computed(() =>\n Array.from({ length: new Date().getFullYear() + 3 - 2000 + 1 }, (_, i) => 2000 + i),\n)\nconst yearPickerRef = useTemplateRef<HTMLElement>('yearPickerRef')\n\nfunction togglePicker(picker: 'year' | 'month') {\n activePicker.value = activePicker.value === picker ? null : picker\n if (activePicker.value === 'year') {\n nextTick(() => {\n const container = yearPickerRef.value\n const el = container?.querySelector('.dp-picker-item--selected') as HTMLElement | null\n if (el && container) {\n container.scrollTop = el.offsetTop - container.offsetHeight / 2 + el.offsetHeight / 2\n } else if (container) {\n container.scrollTop = container.scrollHeight\n }\n })\n }\n}\n\nfunction selectYear(year: number) {\n currentYear.value = year\n activePicker.value = null\n}\nfunction selectMonth(month: number) {\n currentMonth.value = month\n activePicker.value = null\n}\n\n// Selection & emit\nfunction selectDay(day: { date: Date; disabled: boolean }) {\n if (day.disabled) return\n selectedDate.value = new Date(day.date)\n emitValue()\n if (cfg.value.showTime) {\n nextTick(() => hoursInput.value?.focus())\n }\n}\n\nfunction emitValue() {\n if (!selectedDate.value) {\n emit('update:modelValue', null)\n return\n }\n const result = new Date(selectedDate.value)\n if (cfg.value.showTime) result.setHours(hours.value, minutes.value, 0, 0)\n else result.setHours(0, 0, 0, 0)\n emit('update:modelValue', formatDate(result, outputFormat.value))\n}\n\nfunction onClear() {\n selectedDate.value = null\n hours.value = 0\n minutes.value = 0\n emit('update:modelValue', null)\n}\n\n// Time input\nfunction createTimeField(max: number, valueRef: { value: number }) {\n return computed({\n get: () => String(valueRef.value).padStart(2, '0'),\n set: (val: string) => {\n valueRef.value = Math.min(max, Math.max(0, parseInt(val) || 0))\n },\n })\n}\n\nconst formattedHours = createTimeField(23, hours)\nconst formattedMinutes = createTimeField(59, minutes)\nconst hoursInput = useTemplateRef<HTMLInputElement>('hoursInput')\nconst minutesInput = useTemplateRef<HTMLInputElement>('minutesInput')\n\nfunction onTimeInput(field: 'hours' | 'minutes', event: Event) {\n const el = event.target as HTMLInputElement\n if (field === 'hours') {\n formattedHours.value = el.value\n if (el.value.length >= 2) {\n minutesInput.value?.focus()\n minutesInput.value?.select()\n }\n } else {\n formattedMinutes.value = el.value\n if (el.value.length >= 2) el.blur()\n }\n emitValue()\n}\n</script>\n\n<template>\n <div class=\"ac-component\">\n <div class=\"dp-calendar\">\n <div class=\"dp-header\">\n <button\n class=\"dp-nav-btn\"\n type=\"button\"\n :aria-label=\"activePicker ? 'Back to days' : 'Previous'\"\n @click=\"onPrev\"\n >\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n <div class=\"dp-header-labels\">\n <span class=\"dp-header-labels--item\" @click=\"togglePicker('year')\">{{\n currentYear\n }}</span>\n <span class=\"dp-header-labels--item\" @click=\"togglePicker('month')\">{{ monthName }}</span>\n </div>\n <button\n class=\"dp-nav-btn\"\n type=\"button\"\n :aria-label=\"activePicker ? 'Back to days' : 'Next'\"\n :class=\"{ 'dp-nav-btn--spacer': activePicker !== null }\"\n :aria-hidden=\"activePicker ? 'true' : 'false'\"\n @click=\"onNext\"\n >\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n\n <div\n class=\"dp-body\"\n :class=\"{ 'dp-body--has-footer': cfg.showTime || cfg.showOkButton || cfg.showClearButton }\"\n >\n <!-- Year picker -->\n <div\n v-if=\"activePicker === 'year'\"\n ref=\"yearPickerRef\"\n class=\"dp-picker-grid dp-picker-grid--4col dp-picker-grid--scrollable c-scroll\"\n >\n <button\n v-for=\"y in yearList\"\n :key=\"y\"\n type=\"button\"\n class=\"dp-picker-item\"\n :class=\"{\n 'dp-picker-item--selected': y === currentYear,\n 'dp-picker-item--today': y === new Date().getFullYear(),\n }\"\n @click=\"selectYear(y)\"\n >\n {{ y }}\n </button>\n </div>\n\n <!-- Month picker -->\n <div\n v-else-if=\"activePicker === 'month'\"\n class=\"dp-picker-grid dp-month-picker dp-picker-grid--3col\"\n >\n <button\n v-for=\"(name, idx) in monthNames\"\n :key=\"idx\"\n type=\"button\"\n class=\"dp-picker-item\"\n :class=\"{\n 'dp-picker-item--selected': idx === currentMonth,\n 'dp-picker-item--today':\n idx === new Date().getMonth() && currentYear === new Date().getFullYear(),\n }\"\n @click=\"selectMonth(idx)\"\n >\n {{ name }}\n </button>\n </div>\n\n <!-- Day picker -->\n <template v-else>\n <div class=\"dp-weekdays\" :class=\"{ 'dp-weekdays--has-week': cfg.showWeekNumber }\">\n <span v-if=\"cfg.showWeekNumber\" class=\"dp-weekday dp-weekday--week\"></span>\n <span v-for=\"d in weekDays\" :key=\"d\" class=\"dp-weekday\">{{ d }}</span>\n </div>\n <div\n class=\"dp-picker-grid\"\n :class=\"cfg.showWeekNumber ? 'dp-picker-grid--8col' : 'dp-picker-grid--7col'\"\n >\n <template v-for=\"(day, i) in calendarDays\" :key=\"i\">\n <span\n v-if=\"cfg.showWeekNumber && Number(i) % 7 === 0\"\n class=\"dp-week-number\"\n :class=\"{\n 'dp-week-number--other':\n !day.currentMonth && !calendarDays[Number(i) + 7]?.currentMonth,\n }\"\n v-tooltip=\"`${weekNumbers[Math.floor(Number(i) / 7)]}. hét`\"\n >\n {{ weekNumbers[Math.floor(Number(i) / 7)] }}.\n </span>\n <button\n type=\"button\"\n class=\"dp-picker-item dp-picker-item--circle\"\n :class=\"{\n 'dp-picker-item--other': !day.currentMonth,\n 'dp-picker-item--selected': isSameDay(day.date, selectedDate),\n 'dp-picker-item--today': isToday(day.date),\n 'dp-picker-item--disabled': day.disabled,\n 'dp-picker-item--weekend': cfg.highlightWeekends && isWeekend(day.date),\n }\"\n :disabled=\"day.disabled\"\n @click=\"selectDay(day)\"\n >\n {{ day.date.getDate() }}\n </button>\n </template>\n </div>\n\n <div v-if=\"cfg.showTime || cfg.showOkButton || cfg.showClearButton\" class=\"c-footer\">\n <template v-if=\"cfg.showTime\">\n <label class=\"dp-time-label\" for=\"dp-hours\">Idő</label>\n <div class=\"dp-time-inputs\">\n <input\n id=\"dp-hours\"\n ref=\"hoursInput\"\n type=\"number\"\n class=\"c-focus dp-time-input\"\n :value=\"formattedHours\"\n :disabled=\"!selectedDate\"\n min=\"0\"\n max=\"23\"\n @input=\"onTimeInput('hours', $event)\"\n @focus=\"($event.target as HTMLInputElement).select()\"\n />\n <span class=\"dp-time-sep\">:</span>\n <input\n id=\"dp-minutes\"\n ref=\"minutesInput\"\n type=\"number\"\n class=\"c-focus dp-time-input\"\n :value=\"formattedMinutes\"\n :disabled=\"!selectedDate\"\n min=\"0\"\n max=\"59\"\n @input=\"onTimeInput('minutes', $event)\"\n @focus=\"($event.target as HTMLInputElement).select()\"\n />\n </div>\n </template>\n <Button\n v-if=\"cfg.showClearButton\"\n label=\"Törlés\"\n @click=\"onClear\"\n outline\n :disabled=\"!selectedDate\"\n />\n <Button\n v-if=\"cfg.showOkButton\"\n label=\"OK\"\n type=\"success\"\n @click=\"emit('confirm', modelValue)\"\n :disabled=\"!selectedDate\"\n />\n </div>\n </template>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/calendar.scss\"></style>\n<style lang=\"scss\" src=\"@/styles/components/datepickers.scss\"></style>\n"],"mappings":"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"}
@@ -36,7 +36,7 @@ function k(e) {
36
36
  pageSize: O(e)
37
37
  };
38
38
  }
39
- var A = /* @__PURE__ */ l({
39
+ var A = /*@__PURE__*/ l({
40
40
  __name: "DataPaginator",
41
41
  props: {
42
42
  settings: {},
@@ -101,7 +101,7 @@ var A = /* @__PURE__ */ l({
101
101
  return d(() => {
102
102
  if (!O.handleUrl) return;
103
103
  let e = n("pageSize"), t = n("page");
104
- e == null || t == null || e === O.settings.pageSize && t === O.settings.page || k("update:pagination", {
104
+ e != null && t != null && (e !== O.settings.pageSize || t !== O.settings.page) && k("update:pagination", {
105
105
  page: t,
106
106
  pageSize: e
107
107
  });
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components80.js","names":[],"sources":["../src/components/data-table/DataPaginator.vue"],"sourcesContent":["<script lang=\"ts\">\nconst SIZE_OPTIONS = [10, 25, 50, 100]\nconst DEFAULT_PAGE_SIZE = 25\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(getFullStorageKey('pagination', props.storageKey), 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 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 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</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-components80.js","names":[],"sources":["../src/components/data-table/DataPaginator.vue"],"sourcesContent":["<script lang=\"ts\">\nconst SIZE_OPTIONS = [10, 25, 50, 100]\nconst DEFAULT_PAGE_SIZE = 25\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(getFullStorageKey('pagination', props.storageKey), 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 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 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</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-paginator.scss\"></style>\n"],"mappings":";;;;;;;;;;;sFACM,IAAe;CAAC;CAAI;CAAI;CAAI;AAAG,GAC/B,IAAoB;AAE1B,SAAgB,EAAY,GAA4B;CAEtD,IAAM,IAAU,EAAc,UAAU;CACxC,IAAI,KAAW,MAAM,OAAO;CAC5B,IAAI;EACF,IAAM,IAAiB,EAAkB,cAAc,CAAU,GAC3D,IAAM,aAAa,QAAQ,CAAc;EAC/C,IAAI,GAAK;GACP,IAAM,IAAO,OAAO,CAAG;GACvB,IAAI,IAAO,GAAG,OAAO;EACvB;CACF,QAAQ;EACN,QAAQ,KAAK,4CAA4C;CAC3D;CACA,OAAO;AACT;AAEA,SAAgB,EAAoB,GAAoB;CACtD,OAAO;EACL,OAAO;EACP,MAAM,EAAc,MAAM,KAAK;EAC/B,UAAU,EAAY,CAAU;CAClC;AACF;;;;;;;;;;;;;EAUA,IAAM,IAAQ,GAKR,IAAO;EAIb,SAAS,EAAa,GAAc;GAClC,IAAI;IACF,aAAa,QAAQ,EAAkB,cAAc,EAAM,UAAU,GAAG,OAAO,CAAI,CAAC;GACtF,QAAQ;IACN,QAAQ,KAAK,0CAA0C;GACzD;EACF;EAEA,IAAM,IAAa,QACjB,KAAK,IAAI,GAAG,KAAK,KAAK,EAAM,SAAS,QAAQ,EAAM,SAAS,QAAQ,CAAC,CACvE,GAEM,IAAa,QACjB,EAAM,SAAS,UAAU,IAAI,KAAK,EAAM,SAAS,OAAO,KAAK,EAAM,SAAS,WAAW,CACzF,GACM,IAAW,QACf,KAAK,IAAI,EAAM,SAAS,OAAO,EAAM,SAAS,UAAU,EAAM,SAAS,KAAK,CAC9E,GAEM,IAAe,QAAmC;GACtD,IAAM,IAAQ,EAAW,OACnB,IAAU,EAAM,SAAS;GAE/B,IAAI,KAAS,GAAY;IACvB,IAAM,IAAkB,CAAC;IACzB,KAAK,IAAI,IAAI,GAAG,KAAK,GAAO,KAAK,EAAM,KAAK,CAAC;IAC7C,OAAO;GACT;GAEA,IAAM,IAAQ,IAAa,GACvB,IAAW,IAAU,GACrB,IAAS,IAAU;GAUvB,KATI,IAAW,MACb,IAAS,KAAK,IAAI,IAAQ,GAAG,KAAU,IAAI,EAAS,GACpD,IAAW,IAET,IAAS,IAAQ,MACnB,IAAW,KAAK,IAAI,GAAG,KAAY,KAAU,IAAQ,GAAG,GACxD,IAAS,IAAQ,IAGZ,IAAS,IAAW,IAAI,IAAO;IACpC,IAAM,IAAgB,IAAW,GAC3B,IAAiB,IAAS,IAAQ;IACxC,IAAI,CAAC,KAAiB,CAAC,GAAgB;IAEvC,IAAM,IAAW,IAAW,GACtB,IAAY,IAAQ,IAAI,GAExB,IAAA,GACF,IAAgB,IAAW,IAAI,KAAK,KAAc,MAAS,IAAQ,IACjE,IACH,MAAW,KAAQ,GAAO,IAAiB,IAAS,IAAI,KAAK,IAAQ,IAElE,IAAU,IAAS,IAAW,GAEhC,IAAW;IAYf,IAVE,MACC,KAAY,KAAa,CAAC,MAC3B,IAAU,KAAwB,KAElC,KACA,IAAW,MACF,KAAkB,IAAU,KAAyB,MAC9D,KACA,IAAW,KAET,CAAC,GAAU;GACjB;GACA,IAAM,IAAmB,IAAW,GAC9B,IAAoB,IAAS,IAAQ,GAErC,IAA4B,CAAC;GAEnC,AADA,EAAM,KAAK,CAAC,GACR,KAAkB,EAAM,KAAK,KAAK;GACtC,KAAK,IAAI,IAAI,GAAU,KAAK,GAAQ,KAAK,EAAM,KAAK,CAAC;GAIrD,OAHI,KAAmB,EAAM,KAAK,KAAK,GACvC,EAAM,KAAK,CAAK,GAET;EACT,CAAC,GAEK,IAAa;EAEnB,SAAS,EAAkB,GAAc;GACvC,IAAM,IAAU,EAAM,SAAS,MACzB,IAAQ,EAAW,OAEnB,IAAS,MAAS,KAAK,MAAS,GAChC,IAAY,MAAS;GAI3B,OAFsB,IAAU,KAAK,IAAU,IAAQ,KAE/B,CAAC,KAAU,CAAC;EACtC;EAEA,SAAS,EAAS,GAAc;GAC1B,IAAO,KAAK,IAAO,EAAW,SAAS,MAAS,EAAM,SAAS,SACnE,EAAiB,QAAQ,GAAM;IAAE,WAAW,EAAM;IAAW,SAAS;GAAE,CAAC,GACzE,EAAiB,YAAY,EAAM,SAAS,UAAU,EAAE,WAAW,EAAM,UAAU,CAAC,GACpF,EAAK,qBAAqB;IAAE;IAAM,UAAU,EAAM,SAAS;GAAS,CAAC;EACvE;EAEA,SAAS,EAAe,GAAc;GACpC,IAAM,IAAO,OAAQ,EAAM,OAA6B,KAAK;GAI7D,AAHA,EAAa,CAAI,GACjB,EAAiB,YAAY,GAAM,EAAE,WAAW,EAAM,UAAU,CAAC,GACjE,EAAiB,QAAQ,GAAG;IAAE,WAAW,EAAM;IAAW,SAAS;GAAE,CAAC,GACtE,EAAK,qBAAqB;IAAE,MAAM;IAAG,UAAU;GAAK,CAAC;EACvD;SAEA,QAAgB;GACd,IAAI,CAAC,EAAM,WAAW;GAKtB,IAAM,IAAU,EAAc,UAAU,GAClC,IAAU,EAAc,MAAM;GAChC,KAAW,QAAQ,KAAW,SAC9B,MAAY,EAAM,SAAS,YAAY,MAAY,EAAM,SAAS,SACtE,EAAK,qBAAqB;IAAE,MAAM;IAAS,UAAU;GAAQ,CAAC;EAChE,CAAC,cAIC,EAAA,GAAA,EAkDM,OAlDN,GAkDM,CAjDJ,EAgDM,OAhDN,GAgDM;GA/CJ,EAGM,OAHN,GAGM,CAFJ,EAA6E,QAA7E,GAA6E,EAAzC,EAAA,KAAU,IAAG,MAAO,EAAG,EAAA,KAAQ,GAAA,CAAA,GACnE,EAA+D,QAA/D,GAAiC,QAAG,EAAG,EAAA,SAAS,KAAK,GAAA,CAAA,CAAA,CAAA;GAGvD,EA8BM,OA9BN,GA8BM;IA7BJ,EAKE,GAAA;KAJA,MAAK;KACL,KAAI;KACH,UAAU,EAAA,SAAS,QAAI;KACvB,gBAAgB,EAAS,EAAA,SAAS,OAAI,CAAA;;KAGzC,EAAA,EAAA,GAAA,EAcW,GAAA,MAAA,EAdgB,EAAA,QAAT,GAAG,OAA0B,EAAA,GAAA,EAAA,GAAA,EAAA,KAAA,EAAC,GAAA,CAClC,MAAC,SAAb,EAAA,GAAA,EAAsE,QAAtE,GAAuD,GAAQ,MAC/D,EAAA,GAAA,EAWS,UAAA;;KATP,MAAK;KACL,OAAK,EAAA,CAAC,qBAAmB;MACY,aAAA,MAAM,EAAA,SAAS;MAAoC,gBAAA,EAAkB,CAAC;;KAI1G,UAAK,MAAE,EAAS,CAAC;IAEf,GAAA,EAAA,CAAC,GAAA,IAAA,CAAA,EAAA,GAAA,EAAA;IAIR,EAKE,GAAA;KAJA,MAAK;KACL,KAAI;KACH,UAAU,EAAA,SAAS,QAAQ,EAAA;KAC3B,gBAAgB,EAAS,EAAA,SAAS,OAAI,CAAA;;;GAI3C,EASM,OATN,GASM,CARJ,EAOS,UAAA;IANP,OAAM;IACN,IAAG;IACF,OAAO,EAAA,SAAS;IAChB,UAAQ;GAET,GAAA,EAAA,EAAA,GAAA,EAAmF,GAAA,MAAA,EAA/D,IAAL,MAAf,EAAmF,UAAA;IAAhD,KAAK;IAAI,OAAO;GAAM,GAAA,EAAA,CAAC,IAAG,iBAAa,GAAA,CAAA"}
@@ -1,7 +1,7 @@
1
- import './src/styles/components/data-table/data-paginator.scss_vue_type_style_index_0_src_true_lang.css';
2
- import e from "./admins-components80.js";
1
+ import './styles/components/data-table/data-paginator.scss_vue_type_style_index_0_src_true_lang.css';
2
+ import e, { getDefaultPaginator as t, getPageSize as n } from "./admins-components80.js";
3
3
  /* empty css */
4
4
  //#region src/components/data-table/DataPaginator.vue
5
- var t = e;
5
+ var r = e;
6
6
  //#endregion
7
- export { t as default };
7
+ export { r as default, t as getDefaultPaginator, n as getPageSize };
@@ -17,7 +17,7 @@ function A() {
17
17
  direction: n
18
18
  } : null;
19
19
  }
20
- var j = /* @__PURE__ */ d({
20
+ var j = /*@__PURE__*/ d({
21
21
  __name: "DataSort",
22
22
  props: {
23
23
  modelValue: {},
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components83.js","names":[],"sources":["../src/components/data-table/DataSort.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type SortDirection = 'asc' | 'desc'\n\nexport interface DataSortOption {\n value: string\n label: string\n icon?: string\n}\n\nexport interface DataSortProps {\n modelValue: { key: string; direction: SortDirection } | null\n options: DataSortOption[]\n placeholder?: string\n handleUrl?: boolean\n disabled?: boolean\n}\n\nexport function getDefaultSort(): { key: string; direction: SortDirection } | null {\n if (typeof window === 'undefined') return null\n const params = new URLSearchParams(window.location.search)\n const key = params.get('sortBy')\n const dir = params.get('sortDir')\n if (key && (dir === 'asc' || dir === 'desc')) {\n return { key, direction: dir }\n }\n return null\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport DropdownSelect, { type DropdownOption } from '@/components/DropdownSelect.vue'\nimport { useDropdownAnchor } from '@/composables/useDropdownAnchor'\nimport { writeUrlOrRemove } from '@/utils/url'\nimport Button from '../Button.vue'\n\nconst props = withDefaults(defineProps<DataSortProps>(), {\n placeholder: 'Rendezés...',\n handleUrl: false,\n disabled: false\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [sort: { key: string; direction: SortDirection } | null]\n 'sort-change': [sort: { key: string; direction: SortDirection } | null]\n}>()\n\nconst wrapperRef = ref<HTMLElement | null>(null)\nconst dropdownRef = ref<HTMLElement | null>(null)\nconst { isOpen, dropdownStyle } = useDropdownAnchor(wrapperRef, dropdownRef, {\n extraStyle: (rect) => ({ minWidth: `${Math.max(rect.width, 240)}px` }),\n closeOnScroll: true,\n})\n\nconst sortBy = computed<string | string[] | null>({\n get: () => props.modelValue?.key ?? null,\n set: (v) => {\n if (Array.isArray(v)) return\n const next = typeof v === 'string' ? v : null\n emitChange(next, props.modelValue?.direction ?? 'asc')\n },\n})\n\nconst direction = computed<SortDirection>({\n get: () => props.modelValue?.direction ?? 'asc',\n set: (d) => emitChange(props.modelValue?.key ?? null, d),\n})\n\nconst activeLabel = computed(() => {\n if (!props.modelValue) return props.placeholder\n const opt = props.options.find((o) => o.value === props.modelValue!.key)\n const label = opt?.label ?? props.modelValue.key\n return `${label} (${props.modelValue.direction === 'asc' ? 'növekvő' : 'csökkenő'})`\n})\n\nfunction emitChange(key: string | null, dir: SortDirection) {\n if (key == null) {\n if (props.handleUrl) {\n writeUrlOrRemove('sortBy', null, { handleUrl: true })\n writeUrlOrRemove('sortDir', null, { handleUrl: true })\n }\n emit('update:modelValue', null)\n emit('sort-change', null)\n return\n }\n if (props.handleUrl) {\n writeUrlOrRemove('sortBy', key, { handleUrl: true })\n writeUrlOrRemove('sortDir', dir, { handleUrl: true, default: 'asc' })\n }\n const next = { key, direction: dir }\n emit('update:modelValue', next)\n emit('sort-change', next)\n}\n\nfunction clear() {\n emitChange(null, 'asc')\n isOpen.value = false\n}\n\nfunction onSortColumnChange(v: DropdownOption | DropdownOption[] | null) {\n if (Array.isArray(v)) return\n sortBy.value = v?.value ?? null\n}\n\n// Read initial state from URL on mount when handleUrl is true and modelValue is empty.\nwatch(\n isOpen,\n (open) => {\n if (!open || !props.handleUrl || props.modelValue) return\n const sort = getDefaultSort()\n if (sort) emitChange(sort.key, sort.direction)\n },\n { immediate: true },\n)\n</script>\n\n<template>\n <div class=\"ac-component\">\n <div ref=\"wrapperRef\" class=\"ds-sort-wrapper\">\n <button\n type=\"button\"\n class=\"c-btn ds-sort-trigger lh-1\"\n :class=\"[modelValue && 'is-active', disabled && 'is-disabled', isOpen && 'is-open']\"\n :disabled=\"disabled\"\n :aria-label=\"`Rendezés: ${activeLabel}`\"\n @click=\"isOpen = !isOpen\"\n >\n <i\n class=\"fa-solid fa-fw\"\n :class=\"\n !modelValue || modelValue.direction === 'asc'\n ? 'fa-arrow-up-wide-short'\n : 'fa-arrow-down-wide-short'\n \"\n ></i>\n <span class=\"ds-sort-label c-truncate\">{{ activeLabel }}</span>\n <button\n v-if=\"modelValue\"\n type=\"button\"\n class=\"c-icon-btn c-icon-btn--clear ds-sort-clear\"\n aria-label=\"Rendezés törlése\"\n title=\"Rendezés törlése\"\n @click.stop=\"clear\"\n >\n <i class=\"fa-solid fa-fw fa-xmark\"></i>\n </button>\n <span\n class=\"c-icon-btn c-icon-btn--chevron\"\n :class=\"{ 'c-icon-btn--chevron-open': isOpen }\"\n >\n <i class=\"fa-solid fa-fw fa-chevron-down\"></i>\n </span>\n </button>\n\n <Teleport to=\"body\">\n <div class=\"ac-component\">\n <div v-if=\"isOpen\" ref=\"dropdownRef\" class=\"ds-sort-panel\" :style=\"dropdownStyle\">\n\n <div class=\"ds-sort-panel__row\">\n <label class=\"ds-sort-panel__label\">Oszlop</label>\n <DropdownSelect\n :model-value=\"sortBy\"\n :options=\"options\"\n :config=\"{\n clearable: false,\n placeholder: 'Válassz oszlopot...',\n filterable: false,\n }\"\n @update:model-value=\"onSortColumnChange\"\n />\n </div>\n\n <div class=\"ds-sort-panel__row\">\n <span class=\"ds-sort-panel__label\">Irány</span>\n <div class=\"ds-sort-direction\" role=\"group\" aria-label=\"Rendezés iránya\">\n <button\n type=\"button\"\n class=\"ds-sort-direction__btn\"\n :class=\"{ 'is-active': direction === 'asc' }\"\n :aria-pressed=\"direction === 'asc'\"\n aria-label=\"Növekvő\"\n @click=\"direction = 'asc'\"\n >\n <i class=\"fa-solid fa-fw fa-arrow-up-wide-short\"></i>\n <span>Növekvő</span>\n </button>\n <button\n type=\"button\"\n class=\"ds-sort-direction__btn dir-desc\"\n :class=\"{ 'is-active': direction === 'desc' }\"\n :aria-pressed=\"direction === 'desc'\"\n aria-label=\"Csökkenő\"\n @click=\"direction = 'desc'\"\n >\n <i class=\"fa-solid fa-fw fa-arrow-down-wide-short\"></i>\n <span>Csökkenő</span>\n </button>\n </div>\n </div>\n\n <div class=\"ds-sort-panel__footer\">\n <Button label=\"Rendben\" outline size=\"small\" @click=\"isOpen = false\" />\n </div>\n </div>\n </div>\n </Teleport>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-sort.scss\"></style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"admins-components83.js","names":[],"sources":["../src/components/data-table/DataSort.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type SortDirection = 'asc' | 'desc'\n\nexport interface DataSortOption {\n value: string\n label: string\n icon?: string\n}\n\nexport interface DataSortProps {\n modelValue: { key: string; direction: SortDirection } | null\n options: DataSortOption[]\n placeholder?: string\n handleUrl?: boolean\n disabled?: boolean\n}\n\nexport function getDefaultSort(): { key: string; direction: SortDirection } | null {\n if (typeof window === 'undefined') return null\n const params = new URLSearchParams(window.location.search)\n const key = params.get('sortBy')\n const dir = params.get('sortDir')\n if (key && (dir === 'asc' || dir === 'desc')) {\n return { key, direction: dir }\n }\n return null\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport DropdownSelect, { type DropdownOption } from '@/components/DropdownSelect.vue'\nimport { useDropdownAnchor } from '@/composables/useDropdownAnchor'\nimport { writeUrlOrRemove } from '@/utils/url'\nimport Button from '../Button.vue'\n\nconst props = withDefaults(defineProps<DataSortProps>(), {\n placeholder: 'Rendezés...',\n handleUrl: false,\n disabled: false\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [sort: { key: string; direction: SortDirection } | null]\n 'sort-change': [sort: { key: string; direction: SortDirection } | null]\n}>()\n\nconst wrapperRef = ref<HTMLElement | null>(null)\nconst dropdownRef = ref<HTMLElement | null>(null)\nconst { isOpen, dropdownStyle } = useDropdownAnchor(wrapperRef, dropdownRef, {\n extraStyle: (rect) => ({ minWidth: `${Math.max(rect.width, 240)}px` }),\n closeOnScroll: true,\n})\n\nconst sortBy = computed<string | string[] | null>({\n get: () => props.modelValue?.key ?? null,\n set: (v) => {\n if (Array.isArray(v)) return\n const next = typeof v === 'string' ? v : null\n emitChange(next, props.modelValue?.direction ?? 'asc')\n },\n})\n\nconst direction = computed<SortDirection>({\n get: () => props.modelValue?.direction ?? 'asc',\n set: (d) => emitChange(props.modelValue?.key ?? null, d),\n})\n\nconst activeLabel = computed(() => {\n if (!props.modelValue) return props.placeholder\n const opt = props.options.find((o) => o.value === props.modelValue!.key)\n const label = opt?.label ?? props.modelValue.key\n return `${label} (${props.modelValue.direction === 'asc' ? 'növekvő' : 'csökkenő'})`\n})\n\nfunction emitChange(key: string | null, dir: SortDirection) {\n if (key == null) {\n if (props.handleUrl) {\n writeUrlOrRemove('sortBy', null, { handleUrl: true })\n writeUrlOrRemove('sortDir', null, { handleUrl: true })\n }\n emit('update:modelValue', null)\n emit('sort-change', null)\n return\n }\n if (props.handleUrl) {\n writeUrlOrRemove('sortBy', key, { handleUrl: true })\n writeUrlOrRemove('sortDir', dir, { handleUrl: true, default: 'asc' })\n }\n const next = { key, direction: dir }\n emit('update:modelValue', next)\n emit('sort-change', next)\n}\n\nfunction clear() {\n emitChange(null, 'asc')\n isOpen.value = false\n}\n\nfunction onSortColumnChange(v: DropdownOption | DropdownOption[] | null) {\n if (Array.isArray(v)) return\n sortBy.value = v?.value ?? null\n}\n\n// Read initial state from URL on mount when handleUrl is true and modelValue is empty.\nwatch(\n isOpen,\n (open) => {\n if (!open || !props.handleUrl || props.modelValue) return\n const sort = getDefaultSort()\n if (sort) emitChange(sort.key, sort.direction)\n },\n { immediate: true },\n)\n</script>\n\n<template>\n <div class=\"ac-component\">\n <div ref=\"wrapperRef\" class=\"ds-sort-wrapper\">\n <button\n type=\"button\"\n class=\"c-btn ds-sort-trigger lh-1\"\n :class=\"[modelValue && 'is-active', disabled && 'is-disabled', isOpen && 'is-open']\"\n :disabled=\"disabled\"\n :aria-label=\"`Rendezés: ${activeLabel}`\"\n @click=\"isOpen = !isOpen\"\n >\n <i\n class=\"fa-solid fa-fw\"\n :class=\"\n !modelValue || modelValue.direction === 'asc'\n ? 'fa-arrow-up-wide-short'\n : 'fa-arrow-down-wide-short'\n \"\n ></i>\n <span class=\"ds-sort-label c-truncate\">{{ activeLabel }}</span>\n <button\n v-if=\"modelValue\"\n type=\"button\"\n class=\"c-icon-btn c-icon-btn--clear ds-sort-clear\"\n aria-label=\"Rendezés törlése\"\n title=\"Rendezés törlése\"\n @click.stop=\"clear\"\n >\n <i class=\"fa-solid fa-fw fa-xmark\"></i>\n </button>\n <span\n class=\"c-icon-btn c-icon-btn--chevron\"\n :class=\"{ 'c-icon-btn--chevron-open': isOpen }\"\n >\n <i class=\"fa-solid fa-fw fa-chevron-down\"></i>\n </span>\n </button>\n\n <Teleport to=\"body\">\n <div class=\"ac-component\">\n <div v-if=\"isOpen\" ref=\"dropdownRef\" class=\"ds-sort-panel\" :style=\"dropdownStyle\">\n\n <div class=\"ds-sort-panel__row\">\n <label class=\"ds-sort-panel__label\">Oszlop</label>\n <DropdownSelect\n :model-value=\"sortBy\"\n :options=\"options\"\n :config=\"{\n clearable: false,\n placeholder: 'Válassz oszlopot...',\n filterable: false,\n }\"\n @update:model-value=\"onSortColumnChange\"\n />\n </div>\n\n <div class=\"ds-sort-panel__row\">\n <span class=\"ds-sort-panel__label\">Irány</span>\n <div class=\"ds-sort-direction\" role=\"group\" aria-label=\"Rendezés iránya\">\n <button\n type=\"button\"\n class=\"ds-sort-direction__btn\"\n :class=\"{ 'is-active': direction === 'asc' }\"\n :aria-pressed=\"direction === 'asc'\"\n aria-label=\"Növekvő\"\n @click=\"direction = 'asc'\"\n >\n <i class=\"fa-solid fa-fw fa-arrow-up-wide-short\"></i>\n <span>Növekvő</span>\n </button>\n <button\n type=\"button\"\n class=\"ds-sort-direction__btn dir-desc\"\n :class=\"{ 'is-active': direction === 'desc' }\"\n :aria-pressed=\"direction === 'desc'\"\n aria-label=\"Csökkenő\"\n @click=\"direction = 'desc'\"\n >\n <i class=\"fa-solid fa-fw fa-arrow-down-wide-short\"></i>\n <span>Csökkenő</span>\n </button>\n </div>\n </div>\n\n <div class=\"ds-sort-panel__footer\">\n <Button label=\"Rendben\" outline size=\"small\" @click=\"isOpen = false\" />\n </div>\n </div>\n </div>\n </Teleport>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-sort.scss\"></style>\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import './src/styles/components/data-table/data-sort.scss_vue_type_style_index_0_src_true_lang.css';
2
- import e from "./admins-components83.js";
1
+ import './styles/components/data-table/data-sort.scss_vue_type_style_index_0_src_true_lang.css';
2
+ import e, { getDefaultSort as t } from "./admins-components83.js";
3
3
  /* empty css */
4
4
  //#region src/components/data-table/DataSort.vue
5
- var t = e;
5
+ var n = e;
6
6
  //#endregion
7
- export { t as default };
7
+ export { n as default, t as getDefaultSort };
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components86.js","names":[],"sources":["../src/utils/filterDisplay.ts"],"sourcesContent":["import { formatDate } from '@/utils/date'\nimport type { FilterItem } from '@/components/data-table/DataFilters.vue'\nimport type { DropdownOption } from '@/components/DropdownSelect.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') {\n const labels = extractDropdownLabels(value, item.options)\n if (labels) return labels\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\n/**\n * Extracts display labels from a dropdown filter value.\n * Supports both the new format (`DropdownOption | DropdownOption[]`)\n * and the legacy format (plain string / string[]).\n *\n * Prefers the label from the live `options` list when available,\n * otherwise falls back to the label stored on the option object itself.\n */\nfunction extractDropdownLabels(value: unknown, options?: DropdownOption[]): string | null {\n if (value == null) return null\n\n const labelFor = (entry: unknown): string | null => {\n if (entry == null) return null\n if (typeof entry === 'object' && 'label' in (entry as object)) {\n const obj = entry as DropdownOption\n const fromOptions = options?.find((o) => o.value === obj.value)?.label\n return fromOptions ?? obj.label ?? null\n }\n if (typeof entry === 'string') {\n return options?.find((o) => o.value === entry)?.label ?? entry\n }\n return null\n }\n\n if (Array.isArray(value)) {\n const labels = value.map(labelFor).filter((l): l is string => l !== null)\n return labels.length > 0 ? labels.join(', ') : null\n }\n\n return labelFor(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":";;AAIA,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,YAAY;EAC7B,IAAM,IAAS,EAAsB,GAAO,EAAK,OAAO;EACxD,IAAI,GAAQ,OAAO;CACrB;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;AAUA,SAAS,EAAsB,GAAgB,GAA2C;CACxF,IAAI,KAAS,MAAM,OAAO;CAE1B,IAAM,KAAY,MAAkC;EAClD,IAAI,KAAS,MAAM,OAAO;EAC1B,IAAI,OAAO,KAAU,YAAY,WAAY,GAAkB;GAC7D,IAAM,IAAM;GAEZ,OADoB,GAAS,MAAM,MAAM,EAAE,UAAU,EAAI,KAAK,GAAG,SAC3C,EAAI,SAAS;EACrC;EAIA,OAHI,OAAO,KAAU,WACZ,GAAS,MAAM,MAAM,EAAE,UAAU,CAAK,GAAG,SAAS,IAEpD;CACT;CAEA,IAAI,MAAM,QAAQ,CAAK,GAAG;EACxB,IAAM,IAAS,EAAM,IAAI,CAAQ,EAAE,QAAQ,MAAmB,MAAM,IAAI;EACxE,OAAO,EAAO,SAAS,IAAI,EAAO,KAAK,IAAI,IAAI;CACjD;CAEA,OAAO,EAAS,CAAK;AACvB;AA8BA,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-components86.js","names":[],"sources":["../src/utils/filterDisplay.ts"],"sourcesContent":["import { formatDate } from '@/utils/date'\nimport type { FilterItem } from '@/components/data-table/DataFilters.vue'\nimport type { DropdownOption } from '@/components/DropdownSelect.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') {\n const labels = extractDropdownLabels(value, item.options)\n if (labels) return labels\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\n/**\n * Extracts display labels from a dropdown filter value.\n * Supports both the new format (`DropdownOption | DropdownOption[]`)\n * and the legacy format (plain string / string[]).\n *\n * Prefers the label from the live `options` list when available,\n * otherwise falls back to the label stored on the option object itself.\n */\nfunction extractDropdownLabels(value: unknown, options?: DropdownOption[]): string | null {\n if (value == null) return null\n\n const labelFor = (entry: unknown): string | null => {\n if (entry == null) return null\n if (typeof entry === 'object' && 'label' in (entry as object)) {\n const obj = entry as DropdownOption\n const fromOptions = options?.find((o) => o.value === obj.value)?.label\n return fromOptions ?? obj.label ?? null\n }\n if (typeof entry === 'string') {\n return options?.find((o) => o.value === entry)?.label ?? entry\n }\n return null\n }\n\n if (Array.isArray(value)) {\n const labels = value.map(labelFor).filter((l): l is string => l !== null)\n return labels.length > 0 ? labels.join(', ') : null\n }\n\n return labelFor(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":";;AAIA,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,YAAY;EAC7B,IAAM,IAAS,EAAsB,GAAO,EAAK,OAAO;EACxD,IAAI,GAAQ,OAAO;CACrB;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;AAUA,SAAS,EAAsB,GAAgB,GAA2C;CACxF,IAAI,KAAS,MAAM,OAAO;CAE1B,IAAM,KAAY,MAAkC;EAClD,IAAI,KAAS,MAAM,OAAO;EAC1B,IAAI,OAAO,KAAU,YAAY,WAAY,GAAkB;GAC7D,IAAM,IAAM;GAEZ,OADoB,GAAS,MAAM,MAAM,EAAE,UAAU,EAAI,KAAK,CAAC,EAAE,SAC3C,EAAI,SAAS;EACrC;EAIA,OAHI,OAAO,KAAU,WACZ,GAAS,MAAM,MAAM,EAAE,UAAU,CAAK,CAAC,EAAE,SAAS,IAEpD;CACT;CAEA,IAAI,MAAM,QAAQ,CAAK,GAAG;EACxB,IAAM,IAAS,EAAM,IAAI,CAAQ,CAAC,CAAC,QAAQ,MAAmB,MAAM,IAAI;EACxE,OAAO,EAAO,SAAS,IAAI,EAAO,KAAK,IAAI,IAAI;CACjD;CAEA,OAAO,EAAS,CAAK;AACvB;AA8BA,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"}
@@ -11,10 +11,12 @@ function i(e, t, n = !0) {
11
11
  else if (t.key in a) e = a[t.key];
12
12
  else if (t.value !== void 0) e = t.value;
13
13
  else continue;
14
- if (e != null) if (n && t.transformer) {
15
- let n = t.transformer(e);
16
- n && Object.assign(o, n);
17
- } else o[t.key] = e;
14
+ if (e != null) {
15
+ if (n && t.transformer) {
16
+ let n = t.transformer(e);
17
+ n && Object.assign(o, n);
18
+ } else o[t.key] = e;
19
+ }
18
20
  }
19
21
  return o;
20
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components87.js","names":[],"sources":["../src/utils/dataFilters.ts"],"sourcesContent":["import type { FilterItem } from '@/components/data-table/DataFilters.vue'\nimport type { SavedFilter } from '@/components/data-table/FiltersHistory.vue'\nimport type { DropdownOption } from '@/components/DropdownSelect.vue'\nimport { getFullStorageKey } from '@/utils/storageKey'\nimport { getUrlParam, setUrlParam, removeUrlParam } from '@/utils/url'\n\n export function getDefaultFilters(\n items: FilterItem[],\n storageKey?: string,\n useTransformers = true,\n): Record<string, unknown> {\n const urlFilters = getFilterUrlParams(items)\n const hasUrlParams = Object.keys(urlFilters).length > 0\n const defaultFilter = hasUrlParams ? null : getDefaultSavedFilter(storageKey)\n const defaultSavedValues = defaultFilter?.values ?? {}\n\n const result: Record<string, unknown> = {}\n\n for (const item of items) {\n if (item.type === 'separator') continue\n\n let value: unknown\n\n if (item.key in urlFilters) {\n value = urlFilters[item.key]\n } else if (hasUrlParams) {\n continue\n } else if (item.key in defaultSavedValues) {\n value = defaultSavedValues[item.key]\n } else if (item.value !== undefined) {\n value = item.value\n } else {\n continue\n }\n\n if (value == null) continue\n\n if (useTransformers && item.transformer) {\n const transformed = item.transformer(value)\n if (transformed) {\n Object.assign(result, transformed)\n }\n } else {\n result[item.key] = value\n }\n }\n\n return result\n}\n\n/**\n * Like `getDefaultFilters`, but for `dropdown` items returns plain\n * `string | string[]` values instead of the full `DropdownOption` object(s).\n *\n * Useful for consumers that just want to send the filter payload to an API\n * (e.g. `getDefaultFetchData` callers that prefer not to deal with option\n * objects on the wire).\n */\nexport function getDefaultFilterValues(\n items: FilterItem[],\n storageKey?: string,\n useTransformers = true,\n): Record<string, unknown> {\n const filters = getDefaultFilters(items, storageKey, useTransformers)\n const result: Record<string, unknown> = {}\n\n for (const item of items) {\n if (item.type !== 'dropdown') {\n if (item.key in filters) result[item.key] = filters[item.key]\n continue\n }\n\n const extracted = extractDropdownValues(filters[item.key])\n if (extracted != null) {\n result[item.key] = extracted\n }\n }\n\n return result\n}\n\n/**\n * Extracts plain value(s) from a dropdown filter value.\n * Accepts `DropdownOption | DropdownOption[] | string | string[] | null`\n * and returns `string | string[] | null`.\n */\nfunction extractDropdownValues(val: unknown): string | string[] | null {\n if (val == null) return null\n if (Array.isArray(val)) {\n const values = val\n .map((entry) => {\n if (entry == null) return null\n if (typeof entry === 'object' && 'value' in entry) {\n return (entry as { value?: string }).value ?? null\n }\n if (typeof entry === 'string') return entry\n return null\n })\n .filter((v): v is string => v !== null)\n return values.length > 0 ? values : null\n }\n if (typeof val === 'object' && 'value' in val) {\n return (val as { value?: string }).value ?? null\n }\n if (typeof val === 'string') return val\n return null\n}\n\nexport function getFilterUrlParams(items: FilterItem[]): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n\n for (const item of items) {\n if (item.type === 'separator') continue\n\n const raw = getUrlParam(item.key)\n if (raw) {\n result[item.key] = parseFilterValue(item.type, raw, item.value)\n }\n }\n return result\n}\n\nexport function getSavedFilters(storageKey?: string): SavedFilter[] {\n try {\n const fullStorageKey = getFullStorageKey('filters', storageKey)\n const parsed = JSON.parse(localStorage.getItem(fullStorageKey) ?? '[]')\n return Array.isArray(parsed)\n ? parsed.filter(\n (e) =>\n e &&\n typeof e === 'object' &&\n typeof e.id === 'string' &&\n e.values &&\n typeof e.savedAt === 'string',\n )\n : []\n } catch {\n return []\n }\n}\n\nexport function getDefaultSavedFilter(storageKey?: string): SavedFilter | null {\n const savedFilters = getSavedFilters(storageKey)\n return savedFilters.find((f) => f.isDefault) ?? null\n}\n\nexport function filterEmptyValues(filters: Record<string, any>): Record<string, any> {\n return Object.fromEntries(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Object.entries(filters).filter(([_, val]) => val !== null && val !== '' && val !== undefined),\n )\n}\n\nfunction parseFilterValue(type: FilterItem['type'], raw: string, fallback: unknown): unknown {\n if (type === 'number') {\n const n = Number(raw)\n return isNaN(n) ? (fallback ?? null) : n\n }\n if (type === 'date' || type === 'datetime') {\n return { utc: raw }\n }\n if (type === 'daterange' || type === 'datetimerange') {\n return parseRangeValue(raw, fallback)\n }\n if (type === 'dropdown') {\n return parseDropdownStoredValue(raw)\n }\n if (type === 'checkbox') {\n return raw === 'true'\n }\n\n return raw\n}\n\nfunction parseDropdownStoredValue(raw: string): DropdownOption | DropdownOption[] | null {\n // Try to parse as JSON first (new format or legacy array)\n if (raw.startsWith('[') || raw.startsWith('{')) {\n try {\n const parsed = JSON.parse(raw)\n if (Array.isArray(parsed)) {\n const opts = parsed.map(toDropdownOption).filter((o): o is DropdownOption => o !== null)\n return opts.length > 0 ? opts : null\n }\n if (parsed && typeof parsed === 'object') {\n const opt = toDropdownOption(parsed)\n return opt\n }\n } catch {\n // fall through to legacy handling\n }\n }\n // Legacy: plain string value\n if (raw) return { value: raw, label: raw }\n return null\n}\n\nfunction toDropdownOption(entry: unknown): DropdownOption | null {\n if (entry == null) return null\n if (typeof entry === 'object' && 'label' in (entry as object)) {\n const obj = entry as DropdownOption\n if (obj.value != null && typeof obj.label === 'string') {\n return { value: obj.value, label: obj.label }\n }\n }\n if (typeof entry === 'string') {\n return { value: entry, label: entry }\n }\n return null\n}\n\nfunction parseRangeValue(raw: string, fallback: unknown): unknown {\n try {\n const parsed = JSON.parse(raw)\n if (parsed && typeof parsed === 'object' && 'local' in parsed && parsed.local) {\n parsed.local = new Date(parsed.local)\n }\n return parsed\n } catch {\n return fallback ?? null\n }\n}\n\nexport function writeFilterParams(items: FilterItem[], vals: Record<string, unknown>) {\n for (const item of items) {\n if (item.type === 'separator') continue\n const v = vals[item.key]\n if (v === null || v === undefined || v === '') {\n removeUrlParam(item.key)\n } else if (item.type === 'date' || item.type === 'datetime') {\n setUrlParam(item.key, (v as { utc: string }).utc)\n } else if (item.type === 'dropdown') {\n // Store the full option object(s) so the label is preserved even when\n // the options list hasn't been loaded yet (e.g. lazy onInnerSearch).\n setUrlParam(item.key, JSON.stringify(normalizeDropdownValue(v)))\n } else if (typeof v === 'object') {\n setUrlParam(item.key, JSON.stringify(v))\n } else {\n setUrlParam(item.key, String(v))\n }\n }\n}\n\nfunction normalizeDropdownValue(\n v: unknown,\n options?: DropdownOption[],\n): DropdownOption | DropdownOption[] | null {\n if (v == null) return null\n const toOption = (entry: unknown): DropdownOption | null => {\n if (entry == null) return null\n if (typeof entry === 'object' && 'label' in (entry as object)) {\n return entry as DropdownOption\n }\n const value = String(entry)\n const label = options?.find((o) => o.value === value)?.label ?? value\n return { value, label }\n }\n if (Array.isArray(v)) {\n const opts = v.map(toOption).filter((o): o is DropdownOption => o !== null)\n return opts.length > 0 ? opts : null\n }\n const opt = toOption(v)\n return opt\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"admins-components87.js","names":[],"sources":["../src/utils/dataFilters.ts"],"sourcesContent":["import type { FilterItem } from '@/components/data-table/DataFilters.vue'\nimport type { SavedFilter } from '@/components/data-table/FiltersHistory.vue'\nimport type { DropdownOption } from '@/components/DropdownSelect.vue'\nimport { getFullStorageKey } from '@/utils/storageKey'\nimport { getUrlParam, setUrlParam, removeUrlParam } from '@/utils/url'\n\n export function getDefaultFilters(\n items: FilterItem[],\n storageKey?: string,\n useTransformers = true,\n): Record<string, unknown> {\n const urlFilters = getFilterUrlParams(items)\n const hasUrlParams = Object.keys(urlFilters).length > 0\n const defaultFilter = hasUrlParams ? null : getDefaultSavedFilter(storageKey)\n const defaultSavedValues = defaultFilter?.values ?? {}\n\n const result: Record<string, unknown> = {}\n\n for (const item of items) {\n if (item.type === 'separator') continue\n\n let value: unknown\n\n if (item.key in urlFilters) {\n value = urlFilters[item.key]\n } else if (hasUrlParams) {\n continue\n } else if (item.key in defaultSavedValues) {\n value = defaultSavedValues[item.key]\n } else if (item.value !== undefined) {\n value = item.value\n } else {\n continue\n }\n\n if (value == null) continue\n\n if (useTransformers && item.transformer) {\n const transformed = item.transformer(value)\n if (transformed) {\n Object.assign(result, transformed)\n }\n } else {\n result[item.key] = value\n }\n }\n\n return result\n}\n\n/**\n * Like `getDefaultFilters`, but for `dropdown` items returns plain\n * `string | string[]` values instead of the full `DropdownOption` object(s).\n *\n * Useful for consumers that just want to send the filter payload to an API\n * (e.g. `getDefaultFetchData` callers that prefer not to deal with option\n * objects on the wire).\n */\nexport function getDefaultFilterValues(\n items: FilterItem[],\n storageKey?: string,\n useTransformers = true,\n): Record<string, unknown> {\n const filters = getDefaultFilters(items, storageKey, useTransformers)\n const result: Record<string, unknown> = {}\n\n for (const item of items) {\n if (item.type !== 'dropdown') {\n if (item.key in filters) result[item.key] = filters[item.key]\n continue\n }\n\n const extracted = extractDropdownValues(filters[item.key])\n if (extracted != null) {\n result[item.key] = extracted\n }\n }\n\n return result\n}\n\n/**\n * Extracts plain value(s) from a dropdown filter value.\n * Accepts `DropdownOption | DropdownOption[] | string | string[] | null`\n * and returns `string | string[] | null`.\n */\nfunction extractDropdownValues(val: unknown): string | string[] | null {\n if (val == null) return null\n if (Array.isArray(val)) {\n const values = val\n .map((entry) => {\n if (entry == null) return null\n if (typeof entry === 'object' && 'value' in entry) {\n return (entry as { value?: string }).value ?? null\n }\n if (typeof entry === 'string') return entry\n return null\n })\n .filter((v): v is string => v !== null)\n return values.length > 0 ? values : null\n }\n if (typeof val === 'object' && 'value' in val) {\n return (val as { value?: string }).value ?? null\n }\n if (typeof val === 'string') return val\n return null\n}\n\nexport function getFilterUrlParams(items: FilterItem[]): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n\n for (const item of items) {\n if (item.type === 'separator') continue\n\n const raw = getUrlParam(item.key)\n if (raw) {\n result[item.key] = parseFilterValue(item.type, raw, item.value)\n }\n }\n return result\n}\n\nexport function getSavedFilters(storageKey?: string): SavedFilter[] {\n try {\n const fullStorageKey = getFullStorageKey('filters', storageKey)\n const parsed = JSON.parse(localStorage.getItem(fullStorageKey) ?? '[]')\n return Array.isArray(parsed)\n ? parsed.filter(\n (e) =>\n e &&\n typeof e === 'object' &&\n typeof e.id === 'string' &&\n e.values &&\n typeof e.savedAt === 'string',\n )\n : []\n } catch {\n return []\n }\n}\n\nexport function getDefaultSavedFilter(storageKey?: string): SavedFilter | null {\n const savedFilters = getSavedFilters(storageKey)\n return savedFilters.find((f) => f.isDefault) ?? null\n}\n\nexport function filterEmptyValues(filters: Record<string, any>): Record<string, any> {\n return Object.fromEntries(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Object.entries(filters).filter(([_, val]) => val !== null && val !== '' && val !== undefined),\n )\n}\n\nfunction parseFilterValue(type: FilterItem['type'], raw: string, fallback: unknown): unknown {\n if (type === 'number') {\n const n = Number(raw)\n return isNaN(n) ? (fallback ?? null) : n\n }\n if (type === 'date' || type === 'datetime') {\n return { utc: raw }\n }\n if (type === 'daterange' || type === 'datetimerange') {\n return parseRangeValue(raw, fallback)\n }\n if (type === 'dropdown') {\n return parseDropdownStoredValue(raw)\n }\n if (type === 'checkbox') {\n return raw === 'true'\n }\n\n return raw\n}\n\nfunction parseDropdownStoredValue(raw: string): DropdownOption | DropdownOption[] | null {\n // Try to parse as JSON first (new format or legacy array)\n if (raw.startsWith('[') || raw.startsWith('{')) {\n try {\n const parsed = JSON.parse(raw)\n if (Array.isArray(parsed)) {\n const opts = parsed.map(toDropdownOption).filter((o): o is DropdownOption => o !== null)\n return opts.length > 0 ? opts : null\n }\n if (parsed && typeof parsed === 'object') {\n const opt = toDropdownOption(parsed)\n return opt\n }\n } catch {\n // fall through to legacy handling\n }\n }\n // Legacy: plain string value\n if (raw) return { value: raw, label: raw }\n return null\n}\n\nfunction toDropdownOption(entry: unknown): DropdownOption | null {\n if (entry == null) return null\n if (typeof entry === 'object' && 'label' in (entry as object)) {\n const obj = entry as DropdownOption\n if (obj.value != null && typeof obj.label === 'string') {\n return { value: obj.value, label: obj.label }\n }\n }\n if (typeof entry === 'string') {\n return { value: entry, label: entry }\n }\n return null\n}\n\nfunction parseRangeValue(raw: string, fallback: unknown): unknown {\n try {\n const parsed = JSON.parse(raw)\n if (parsed && typeof parsed === 'object' && 'local' in parsed && parsed.local) {\n parsed.local = new Date(parsed.local)\n }\n return parsed\n } catch {\n return fallback ?? null\n }\n}\n\nexport function writeFilterParams(items: FilterItem[], vals: Record<string, unknown>) {\n for (const item of items) {\n if (item.type === 'separator') continue\n const v = vals[item.key]\n if (v === null || v === undefined || v === '') {\n removeUrlParam(item.key)\n } else if (item.type === 'date' || item.type === 'datetime') {\n setUrlParam(item.key, (v as { utc: string }).utc)\n } else if (item.type === 'dropdown') {\n // Store the full option object(s) so the label is preserved even when\n // the options list hasn't been loaded yet (e.g. lazy onInnerSearch).\n setUrlParam(item.key, JSON.stringify(normalizeDropdownValue(v)))\n } else if (typeof v === 'object') {\n setUrlParam(item.key, JSON.stringify(v))\n } else {\n setUrlParam(item.key, String(v))\n }\n }\n}\n\nfunction normalizeDropdownValue(\n v: unknown,\n options?: DropdownOption[],\n): DropdownOption | DropdownOption[] | null {\n if (v == null) return null\n const toOption = (entry: unknown): DropdownOption | null => {\n if (entry == null) return null\n if (typeof entry === 'object' && 'label' in (entry as object)) {\n return entry as DropdownOption\n }\n const value = String(entry)\n const label = options?.find((o) => o.value === value)?.label ?? value\n return { value, label }\n }\n if (Array.isArray(v)) {\n const opts = v.map(toOption).filter((o): o is DropdownOption => o !== null)\n return opts.length > 0 ? opts : null\n }\n const opt = toOption(v)\n return opt\n}\n"],"mappings":";;;AAMC,SAAgB,EACf,GACA,GACA,IAAkB,IACO;CACzB,IAAM,IAAa,EAAmB,CAAK,GACrC,IAAe,OAAO,KAAK,CAAU,CAAC,CAAC,SAAS,GAEhD,KADgB,IAAe,OAAO,EAAsB,CAAU,EAAA,EAClC,UAAU,CAAC,GAE/C,IAAkC,CAAC;CAEzC,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAI,EAAK,SAAS,aAAa;EAE/B,IAAI;EAEJ,IAAI,EAAK,OAAO,GACd,IAAQ,EAAW,EAAK;OACnB,IAAI,GACT;OACK,IAAI,EAAK,OAAO,GACrB,IAAQ,EAAmB,EAAK;OAC3B,IAAI,EAAK,UAAU,KAAA,GACxB,IAAQ,EAAK;OAEb;EAGE,SAAS,MAEb;OAAI,KAAmB,EAAK,aAAa;IACvC,IAAM,IAAc,EAAK,YAAY,CAAK;IAC1C,AAAI,KACF,OAAO,OAAO,GAAQ,CAAW;GAErC,OACE,EAAO,EAAK,OAAO;EAAA;CAEvB;CAEA,OAAO;AACT;AAUA,SAAgB,EACd,GACA,GACA,IAAkB,IACO;CACzB,IAAM,IAAU,EAAkB,GAAO,GAAY,CAAe,GAC9D,IAAkC,CAAC;CAEzC,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAI,EAAK,SAAS,YAAY;GAC5B,AAAI,EAAK,OAAO,MAAS,EAAO,EAAK,OAAO,EAAQ,EAAK;GACzD;EACF;EAEA,IAAM,IAAY,EAAsB,EAAQ,EAAK,IAAI;EACzD,AAAI,KAAa,SACf,EAAO,EAAK,OAAO;CAEvB;CAEA,OAAO;AACT;AAOA,SAAS,EAAsB,GAAwC;CACrE,IAAI,KAAO,MAAM,OAAO;CACxB,IAAI,MAAM,QAAQ,CAAG,GAAG;EACtB,IAAM,IAAS,EACZ,KAAK,MACA,KAAS,OAAa,OACtB,OAAO,KAAU,YAAY,WAAW,IAClC,EAA6B,SAAS,OAE5C,OAAO,KAAU,WAAiB,IAC/B,IACR,CAAC,CACD,QAAQ,MAAmB,MAAM,IAAI;EACxC,OAAO,EAAO,SAAS,IAAI,IAAS;CACtC;CAKA,OAJI,OAAO,KAAQ,YAAY,WAAW,IAChC,EAA2B,SAAS,OAE1C,OAAO,KAAQ,WAAiB,IAC7B;AACT;AAEA,SAAgB,EAAmB,GAA8C;CAC/E,IAAM,IAAkC,CAAC;CAEzC,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAI,EAAK,SAAS,aAAa;EAE/B,IAAM,IAAM,EAAY,EAAK,GAAG;EAChC,AAAI,MACF,EAAO,EAAK,OAAO,EAAiB,EAAK,MAAM,GAAK,EAAK,KAAK;CAElE;CACA,OAAO;AACT;AAEA,SAAgB,EAAgB,GAAoC;CAClE,IAAI;EACF,IAAM,IAAiB,EAAkB,WAAW,CAAU,GACxD,IAAS,KAAK,MAAM,aAAa,QAAQ,CAAc,KAAK,IAAI;EACtE,OAAO,MAAM,QAAQ,CAAM,IACvB,EAAO,QACJ,MACC,KACA,OAAO,KAAM,YACb,OAAO,EAAE,MAAO,YAChB,EAAE,UACF,OAAO,EAAE,WAAY,QACzB,IACA,CAAC;CACP,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAgB,EAAsB,GAAyC;CAE7E,OADqB,EAAgB,CAC9B,CAAA,CAAa,MAAM,MAAM,EAAE,SAAS,KAAK;AAClD;AAEA,SAAgB,EAAkB,GAAmD;CACnF,OAAO,OAAO,YAEZ,OAAO,QAAQ,CAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,OAAS,MAAQ,QAAQ,MAAQ,MAAM,MAAQ,KAAA,CAAS,CAC9F;AACF;AAEA,SAAS,EAAiB,GAA0B,GAAa,GAA4B;CAC3F,IAAI,MAAS,UAAU;EACrB,IAAM,IAAI,OAAO,CAAG;EACpB,OAAO,MAAM,CAAC,IAAK,KAAY,OAAQ;CACzC;CAcA,OAbI,MAAS,UAAU,MAAS,aACvB,EAAE,KAAK,EAAI,IAEhB,MAAS,eAAe,MAAS,kBAC5B,EAAgB,GAAK,CAAQ,IAElC,MAAS,aACJ,EAAyB,CAAG,IAEjC,MAAS,aACJ,MAAQ,SAGV;AACT;AAEA,SAAS,EAAyB,GAAuD;CAEvF,IAAI,EAAI,WAAW,GAAG,KAAK,EAAI,WAAW,GAAG,GAC3C,IAAI;EACF,IAAM,IAAS,KAAK,MAAM,CAAG;EAC7B,IAAI,MAAM,QAAQ,CAAM,GAAG;GACzB,IAAM,IAAO,EAAO,IAAI,CAAgB,CAAC,CAAC,QAAQ,MAA2B,MAAM,IAAI;GACvF,OAAO,EAAK,SAAS,IAAI,IAAO;EAClC;EACA,IAAI,KAAU,OAAO,KAAW,UAE9B,OADY,EAAiB,CACtB;CAEX,QAAQ,CAER;CAIF,OADI,IAAY;EAAE,OAAO;EAAK,OAAO;CAAI,IAClC;AACT;AAEA,SAAS,EAAiB,GAAuC;CAC/D,IAAI,KAAS,MAAM,OAAO;CAC1B,IAAI,OAAO,KAAU,YAAY,WAAY,GAAkB;EAC7D,IAAM,IAAM;EACZ,IAAI,EAAI,SAAS,QAAQ,OAAO,EAAI,SAAU,UAC5C,OAAO;GAAE,OAAO,EAAI;GAAO,OAAO,EAAI;EAAM;CAEhD;CAIA,OAHI,OAAO,KAAU,WACZ;EAAE,OAAO;EAAO,OAAO;CAAM,IAE/B;AACT;AAEA,SAAS,EAAgB,GAAa,GAA4B;CAChE,IAAI;EACF,IAAM,IAAS,KAAK,MAAM,CAAG;EAI7B,OAHI,KAAU,OAAO,KAAW,YAAY,WAAW,KAAU,EAAO,UACtE,EAAO,QAAQ,IAAI,KAAK,EAAO,KAAK,IAE/B;CACT,QAAQ;EACN,OAAO,KAAY;CACrB;AACF;AAEA,SAAgB,EAAkB,GAAqB,GAA+B;CACpF,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAI,EAAK,SAAS,aAAa;EAC/B,IAAM,IAAI,EAAK,EAAK;EACpB,AAAI,KAAM,QAA2B,MAAM,KACzC,EAAe,EAAK,GAAG,IACd,EAAK,SAAS,UAAU,EAAK,SAAS,aAC/C,EAAY,EAAK,KAAM,EAAsB,GAAG,IACvC,EAAK,SAAS,aAGvB,EAAY,EAAK,KAAK,KAAK,UAAU,EAAuB,CAAC,CAAC,CAAC,IACtD,OAAO,KAAM,WACtB,EAAY,EAAK,KAAK,KAAK,UAAU,CAAC,CAAC,IAEvC,EAAY,EAAK,KAAK,OAAO,CAAC,CAAC;CAEnC;AACF;AAEA,SAAS,EACP,GACA,GAC0C;CAC1C,IAAI,KAAK,MAAM,OAAO;CACtB,IAAM,KAAY,MAA0C;EAC1D,IAAI,KAAS,MAAM,OAAO;EAC1B,IAAI,OAAO,KAAU,YAAY,WAAY,GAC3C,OAAO;EAET,IAAM,IAAQ,OAAO,CAAK;EAE1B,OAAO;GAAE;GAAO,OADF,GAAS,MAAM,MAAM,EAAE,UAAU,CAAK,CAAC,EAAE,SAAS;EAC1C;CACxB;CACA,IAAI,MAAM,QAAQ,CAAC,GAAG;EACpB,IAAM,IAAO,EAAE,IAAI,CAAQ,CAAC,CAAC,QAAQ,MAA2B,MAAM,IAAI;EAC1E,OAAO,EAAK,SAAS,IAAI,IAAO;CAClC;CAEA,OADY,EAAS,CACd;AACT"}
@@ -41,7 +41,7 @@ var ie = { class: "ac-component" }, ae = { class: "filters-history" }, oe = ["ar
41
41
  }, F = {
42
42
  key: 1,
43
43
  class: "filters-history__item-empty"
44
- }, I = { key: 3 }, L = /* @__PURE__ */ f({
44
+ }, I = { key: 3 }, L = /*@__PURE__*/ f({
45
45
  __name: "FiltersHistory",
46
46
  props: {
47
47
  items: {},
@@ -80,13 +80,13 @@ var ie = { class: "ac-component" }, ae = { class: "filters-history" }, oe = ["ar
80
80
  let Y = g(!1);
81
81
  function X() {
82
82
  if (!J.value) return;
83
- let e = H.value.trim();
84
- V.value = [{
83
+ let e = H.value.trim(), t = {
85
84
  id: me(),
86
85
  savedAt: (/* @__PURE__ */ new Date()).toISOString(),
87
86
  name: e || void 0,
88
87
  values: { ...R.values }
89
- }, ...V.value].slice(0, 50), H.value = "", q(), p(() => {
88
+ };
89
+ V.value = [t, ...V.value].slice(0, 50), H.value = "", q(), p(() => {
90
90
  Y.value = !0;
91
91
  });
92
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components88.js","names":[],"sources":["../src/components/data-table/FiltersHistory.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface SavedFilter {\n id: string\n savedAt: string\n name?: string\n values: Record<string, any>\n isDefault?: boolean\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch, nextTick } from 'vue'\nimport Button from '@/components/Button.vue'\nimport ConfirmModal from '@/components/ConfirmModal.vue'\nimport type { FilterItem } from '@/components/data-table/DataFilters.vue'\nimport { formatDate } from '@/utils/date'\nimport { buildFilterDisplay } from '@/utils/filterDisplay'\nimport { getSavedFilters } from '@/utils/dataFilters'\nimport { getFullStorageKey } from '@/utils/storageKey'\n\nconst props = defineProps<{\n items: FilterItem[]\n values: Record<string, any>\n storageKey?: string\n}>()\n\nconst MAX_ITEM_LIMIT = 50\nconst MAX_ITEM_WARNING_THRESHOLD = 7\n\nconst emit = defineEmits<{\n load: [values: Record<string, any>]\n}>()\n\nconst open = ref(false)\nconst entries = ref<SavedFilter[]>([])\nconst filterSetName = ref('')\nconst expandedIds = ref<Set<string>>(new Set())\nconst confirmingClearAll = ref(false)\n\nfunction isExpanded(id: string): boolean {\n return expandedIds.value.has(id)\n}\n\nfunction toggleExpanded(id: string): void {\n const next = new Set(expandedIds.value)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n expandedIds.value = next\n}\n\nfunction loadFromStorage() {\n entries.value = getSavedFilters(props.storageKey)\n}\n\nfunction persist() {\n try {\n const fullStorageKey = getFullStorageKey('filters', props.storageKey)\n localStorage.setItem(fullStorageKey, JSON.stringify(entries.value))\n } catch {\n console.warn('Failed to persist saved filters to localStorage')\n }\n}\n\nonMounted(loadFromStorage)\n\nconst hasActiveFilters = computed(() =>\n Object.values(props.values).some((v) => v !== null && v !== '' && v !== undefined),\n)\n\nfunction makeId(): string {\n return Date.now().toString(36)\n}\n\nwatch(\n () => [props.values, filterSetName.value],\n () => {\n if (justSaved.value) {\n justSaved.value = false\n }\n },\n { deep: true },\n)\n\nconst justSaved = ref(false)\n\nfunction save() {\n if (!hasActiveFilters.value) return\n\n const trimmed = filterSetName.value.trim()\n const entry: SavedFilter = {\n id: makeId(),\n savedAt: new Date().toISOString(),\n name: trimmed || undefined,\n values: { ...props.values },\n }\n entries.value = [entry, ...entries.value].slice(0, MAX_ITEM_LIMIT)\n filterSetName.value = ''\n\n persist()\n nextTick(() => {\n justSaved.value = true\n })\n}\n\nfunction load(entry: SavedFilter) {\n emit('load', { ...entry.values })\n}\n\nfunction remove(entry: SavedFilter) {\n entries.value = entries.value.filter((e) => e.id !== entry.id)\n if (expandedIds.value.has(entry.id)) {\n const next = new Set(expandedIds.value)\n next.delete(entry.id)\n expandedIds.value = next\n }\n persist()\n}\n\nfunction clearAll() {\n entries.value = []\n expandedIds.value = new Set()\n persist()\n confirmingClearAll.value = false\n}\n\nfunction buildEntry(entry: SavedFilter) {\n return buildFilterDisplay(props.items, entry.values)\n}\n\nconst entryDisplays = computed(() => {\n const map = new Map<string, ReturnType<typeof buildEntry>>()\n for (const entry of entries.value) {\n map.set(entry.id, buildEntry(entry))\n }\n return map\n})\n\nfunction getEntryDisplay(entry: SavedFilter) {\n return entryDisplays.value.get(entry.id) ?? buildEntry(entry)\n}\n\nconst sortedEntries = computed(() => {\n const defaultEntry = entries.value.find((e) => e.isDefault)\n if (!defaultEntry) return entries.value\n return [defaultEntry, ...entries.value.filter((e) => !e.isDefault)]\n})\n\nconst hasWarning = computed(() => {\n return entries.value.length >= MAX_ITEM_LIMIT - MAX_ITEM_WARNING_THRESHOLD\n})\n\nfunction formatSavedAt(iso: string): string {\n const d = new Date(iso)\n if (isNaN(d.getTime())) return iso\n return formatDate(d, 'YYYY-MM-DD HH:mm')\n}\n\nfunction toggleDefault(entry: SavedFilter) {\n if (entry.isDefault) {\n entry.isDefault = false\n } else {\n entries.value.forEach((e) => {\n e.isDefault = false\n })\n entry.isDefault = true\n }\n persist()\n}\n</script>\n\n<template>\n <div class=\"ac-component\">\n <div class=\"filters-history\">\n <button\n type=\"button\"\n class=\"filters-history__toggle\"\n :class=\"{ 'is-open': open }\"\n :aria-expanded=\"open\"\n @click=\"open = !open\"\n >\n <i class=\"fa-solid fa-sliders filters-history__toggle-icon\"></i>\n <span class=\"filters-history__toggle-label\">Mentett szűrők</span>\n <span v-if=\"entries.length\" class=\"c-indicator\">{{ entries.length }}</span>\n <span v-if=\"hasWarning\" v-tooltip=\"`Maximum ${MAX_ITEM_LIMIT} szűrő menthető`\"\n >/ {{ MAX_ITEM_LIMIT }}</span\n >\n <i\n class=\"fa-solid filters-history__chevron\"\n :class=\"open ? 'fa-chevron-up' : 'fa-chevron-down'\"\n ></i>\n </button>\n\n <div v-if=\"open\" class=\"filters-history__panel c-scroll\">\n <div class=\"filters-history__save-row\">\n <input\n v-model=\"filterSetName\"\n type=\"text\"\n class=\"c-input-row c-input-row--sm\"\n placeholder=\"Elnevezés\"\n @keydown.enter=\"save\"\n />\n <Button\n icon=\"fa-solid fa-bookmark\"\n label=\"Mentés\"\n size=\"small\"\n type=\"info\"\n :disabled=\"!hasActiveFilters || justSaved\"\n @click=\"save\"\n />\n </div>\n\n <p v-if=\"!hasActiveFilters && entries.length === 0\" class=\"filters-history__hint\">\n Nincs aktív szűrő. Adj meg értékeket a mentéshez.\n </p>\n <p v-else-if=\"entries.length === 0\" class=\"filters-history__hint\">\n Még nincs mentett szűrő.<br />\n Az aktuális beállítások a „Mentés\" gombbal menthetők.<br />\n Az „Elnevezés\" mező csak a könnyebb azonosítás miatt van, megadása nem kötelező.\n </p>\n\n <template v-if=\"entries.length > 0\">\n <ul class=\"filters-history__list\">\n <li\n v-for=\"entry in sortedEntries\"\n :key=\"entry.id\"\n class=\"filters-history__item\"\n :class=\"{ 'is-open': isExpanded(entry.id), 'is-default': entry.isDefault }\"\n >\n <div\n class=\"filters-history__item-header\"\n role=\"button\"\n tabindex=\"0\"\n :aria-expanded=\"isExpanded(entry.id)\"\n @click=\"toggleExpanded(entry.id)\"\n @keydown.enter.prevent=\"toggleExpanded(entry.id)\"\n @keydown.space.prevent=\"toggleExpanded(entry.id)\"\n >\n <i\n class=\"fa-solid filters-history__item-chevron\"\n :class=\"isExpanded(entry.id) ? 'fa-chevron-down' : 'fa-chevron-right'\"\n ></i>\n <span class=\"filters-history__item-header-text\">\n <span class=\"filters-history__item-name\">{{ entry.name }}</span>\n <span v-if=\"entry.name\" class=\"filters-history__item-date\">{{\n formatSavedAt(entry.savedAt)\n }}</span>\n </span>\n <div class=\"filters-history__item-actions\" @click.stop>\n <button\n type=\"button\"\n class=\"c-indicator filters-history__item-btn filters-history__item-default\"\n @click=\"toggleDefault(entry)\"\n :class=\"{ active: entry.isDefault }\"\n :aria-label=\"\n entry.isDefault\n ? 'Alapértelmezett szűrő törlése'\n : 'Alapértelmezett szűrő beállítása'\n \"\n :title=\"\n entry.isDefault\n ? 'Alapértelmezett szűrő törlése'\n : 'Alapértelmezett szűrő beállítása'\n \"\n >\n <i\n class=\"fa-star fix-icon-pos\"\n :class=\"entry.isDefault ? 'fa-solid' : 'fa-regular'\"\n ></i>\n </button>\n <button\n type=\"button\"\n class=\"c-indicator filters-history__item-btn filters-history__item-load\"\n aria-label=\"Betöltés\"\n title=\"Betöltés\"\n @click=\"load(entry)\"\n >\n <i class=\"fa-solid fa-check\"></i>\n </button>\n <span\n v-if=\"getEntryDisplay(entry).length\"\n class=\"c-indicator\"\n @click.stop=\"toggleExpanded(entry.id)\"\n v-tooltip=\"`${getEntryDisplay(entry).length} szűrési feltétel`\"\n >{{ getEntryDisplay(entry).length }}</span\n >\n <button\n type=\"button\"\n class=\"c-indicator filters-history__item-btn filters-history__item-remove\"\n aria-label=\"Törlés\"\n title=\"Törlés\"\n @click=\"remove(entry)\"\n >\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n <div v-if=\"isExpanded(entry.id)\" class=\"filters-history__item-content\">\n <div v-if=\"getEntryDisplay(entry).length\" class=\"filters-history__item-body\">\n <span\n v-for=\"(part, idx) in getEntryDisplay(entry)\"\n :key=\"idx\"\n class=\"c-chip\"\n :class=\"part.displayClass\"\n >\n {{ part.text }}\n </span>\n </div>\n <p v-else class=\"filters-history__item-empty\">Nincs megjeleníthető szűrő.</p>\n </div>\n </li>\n </ul>\n </template>\n\n <div v-if=\"entries.length > 3\">\n <hr class=\"separator my-1\" />\n <a\n v-if=\"entries.length\"\n class=\"filters-history__clear-all px-2\"\n @click=\"confirmingClearAll = true\"\n >Összes törlése</a\n >\n <ConfirmModal\n v-if=\"confirmingClearAll\"\n title=\"Mentett szűrők törlése\"\n message=\"Biztosan törlöd az összes mentett szűrőt?\"\n confirm-label=\"Törlés\"\n cancel-label=\"Mégse\"\n type=\"error\"\n @confirm=\"clearAll()\"\n @cancel=\"confirmingClearAll = false\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/filters-history.scss\"></style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBA,IAAM,IAAQ,GASR,IAAO,GAIP,IAAO,EAAI,EAAK,GAChB,IAAU,EAAmB,CAAC,CAAC,GAC/B,IAAgB,EAAI,EAAE,GACtB,IAAc,kBAAiB,IAAI,IAAI,CAAC,GACxC,IAAqB,EAAI,EAAK;EAEpC,SAAS,EAAW,GAAqB;GACvC,OAAO,EAAY,MAAM,IAAI,CAAE;EACjC;EAEA,SAAS,EAAe,GAAkB;GACxC,IAAM,IAAO,IAAI,IAAI,EAAY,KAAK;GAMtC,AALI,EAAK,IAAI,CAAE,IACb,EAAK,OAAO,CAAE,IAEd,EAAK,IAAI,CAAE,GAEb,EAAY,QAAQ;EACtB;EAEA,SAAS,KAAkB;GACzB,EAAQ,QAAQ,GAAgB,EAAM,UAAU;EAClD;EAEA,SAAS,IAAU;GACjB,IAAI;IACF,IAAM,IAAiB,EAAkB,WAAW,EAAM,UAAU;IACpE,aAAa,QAAQ,GAAgB,KAAK,UAAU,EAAQ,KAAK,CAAC;GACpE,QAAQ;IACN,QAAQ,KAAK,iDAAiD;GAChE;EACF;EAEA,GAAU,EAAe;EAEzB,IAAM,IAAmB,QACvB,OAAO,OAAO,EAAM,MAAM,EAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,MAAM,MAAM,KAAA,CAAS,CACnF;EAEA,SAAS,KAAiB;GACxB,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE;EAC/B;EAEA,SACQ,CAAC,EAAM,QAAQ,EAAc,KAAK,SAClC;GACJ,AACE,EAAU,UAAQ;EAEtB,GACA,EAAE,MAAM,GAAK,CACf;EAEA,IAAM,IAAY,EAAI,EAAK;EAE3B,SAAS,IAAO;GACd,IAAI,CAAC,EAAiB,OAAO;GAE7B,IAAM,IAAU,EAAc,MAAM,KAAK;GAWzC,AAJA,EAAQ,QAAQ,CAAC;IALf,IAAI,GAAO;IACX,0BAAS,IAAI,KAAK,GAAE,YAAY;IAChC,MAAM,KAAW,KAAA;IACjB,QAAQ,EAAE,GAAG,EAAM,OAAO;GAEX,GAAO,GAAG,EAAQ,KAAK,EAAE,MAAM,GAAG,EAAc,GACjE,EAAc,QAAQ,IAEtB,EAAQ,GACR,QAAe;IACb,EAAU,QAAQ;GACpB,CAAC;EACH;EAEA,SAAS,GAAK,GAAoB;GAChC,EAAK,QAAQ,EAAE,GAAG,EAAM,OAAO,CAAC;EAClC;EAEA,SAAS,EAAO,GAAoB;GAElC,IADA,EAAQ,QAAQ,EAAQ,MAAM,QAAQ,MAAM,EAAE,OAAO,EAAM,EAAE,GACzD,EAAY,MAAM,IAAI,EAAM,EAAE,GAAG;IACnC,IAAM,IAAO,IAAI,IAAI,EAAY,KAAK;IAEtC,AADA,EAAK,OAAO,EAAM,EAAE,GACpB,EAAY,QAAQ;GACtB;GACA,EAAQ;EACV;EAEA,SAAS,KAAW;GAIlB,AAHA,EAAQ,QAAQ,CAAC,GACjB,EAAY,wBAAQ,IAAI,IAAI,GAC5B,EAAQ,GACR,EAAmB,QAAQ;EAC7B;EAEA,SAAS,EAAW,GAAoB;GACtC,OAAO,EAAmB,EAAM,OAAO,EAAM,MAAM;EACrD;EAEA,IAAM,KAAgB,QAAe;GACnC,IAAM,oBAAM,IAAI,IAA2C;GAC3D,KAAK,IAAM,KAAS,EAAQ,OAC1B,EAAI,IAAI,EAAM,IAAI,EAAW,CAAK,CAAC;GAErC,OAAO;EACT,CAAC;EAED,SAAS,EAAgB,GAAoB;GAC3C,OAAO,GAAc,MAAM,IAAI,EAAM,EAAE,KAAK,EAAW,CAAK;EAC9D;EAEA,IAAM,KAAgB,QAAe;GACnC,IAAM,IAAe,EAAQ,MAAM,MAAM,MAAM,EAAE,SAAS;GAE1D,OADK,IACE,CAAC,GAAc,GAAG,EAAQ,MAAM,QAAQ,MAAM,CAAC,EAAE,SAAS,CAAC,IADxC,EAAQ;EAEpC,CAAC,GAEK,KAAa,QACV,EAAQ,MAAM,UAAU,EAChC;EAED,SAAS,GAAc,GAAqB;GAC1C,IAAM,IAAI,IAAI,KAAK,CAAG;GAEtB,OADI,MAAM,EAAE,QAAQ,CAAC,IAAU,IACxB,EAAW,GAAG,kBAAkB;EACzC;EAEA,SAAS,GAAc,GAAoB;GASzC,AARI,EAAM,YACR,EAAM,YAAY,MAElB,EAAQ,MAAM,SAAS,MAAM;IAC3B,EAAE,YAAY;GAChB,CAAC,GACD,EAAM,YAAY,KAEpB,EAAQ;EACV;;;eAIE,EAmKM,OAnKN,IAmKM,CAlKJ,EAiKM,OAjKN,IAiKM,CAhKJ,EAiBS,UAAA;IAhBP,MAAK;IACL,OAAK,EAAA,CAAC,2BAAyB,EAAA,WACV,EAAA,MAAI,CAAA,CAAA;IACxB,iBAAe,EAAA;IACf,SAAK,AAAA,EAAA,QAAA,MAAE,EAAA,QAAI,CAAI,EAAA;;aAEhB,EAAgE,KAAA,EAA7D,OAAM,mDAAkD,GAAA,MAAA,EAAA;aAC3D,EAAiE,QAAA,EAA3D,OAAM,gCAA+B,GAAC,kBAAc,EAAA;IAC9C,EAAA,MAAQ,UAAA,EAAA,GAApB,EAA2E,QAA3E,IAA2E,EAAxB,EAAA,MAAQ,MAAM,GAAA,CAAA,KAAA,EAAA,IAAA,EAAA;IACrD,GAAA,QAAA,GAAA,EAAA,GAAZ,EAEC,QAAA,IAAA,CAAA,EADE,OAAE,EAAG,EAAc,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,GAAA,2BADsC,CAAA,CAAA,IAAA,EAAA,IAAA,EAAA;IAG5D,EAGK,KAAA,EAFH,OAAK,EAAA,CAAC,qCACE,EAAA,QAAI,kBAAA,iBAAA,CAAA,EAAA,GAAA,MAAA,CAAA;eAIL,EAAA,SAAA,EAAA,GAAX,EA4IM,OA5IN,IA4IM;IA3IJ,EAgBM,OAhBN,IAgBM,CAAA,EAfJ,EAME,SAAA;8CALsB,QAAA;KACtB,MAAK;KACL,OAAM;KACN,aAAY;KACX,WAAO,EAAQ,GAAI,CAAA,OAAA,CAAA;wBAJX,EAAA,KAAa,CAAA,CAAA,GAMxB,GAOE,GAAA;KANA,MAAK;KACL,OAAM;KACN,MAAK;KACL,MAAK;KACJ,UAAQ,CAAG,EAAA,SAAoB,EAAA;KAC/B,SAAO;;KAIF,EAAA,SAAoB,EAAA,MAAQ,WAAM,KAAA,EAAA,GAA5C,EAEI,KAFJ,IAAkF,qDAElF,KACc,EAAA,MAAQ,WAAM,KAAA,EAAA,GAA5B,EAII,KAJJ,IAII,CAAA,GAAA,AAAA,EAAA,OAAA;OAJ8D,6BACxC,EAAA;KAAA,EAAM,MAAA,MAAA,MAAA,EAAA;OAAA,2DACuB,EAAA;KAAA,EAAM,MAAA,MAAA,MAAA,EAAA;OAAA,uFAE7D,EAAA;;IAEgB,EAAA,MAAQ,SAAM,KAAA,EAAA,GAC5B,EAyFK,MAzFL,GAyFK,EAAA,EAAA,EAAA,GAxFH,EAuFK,GAAA,MAAA,EAtFa,GAAA,QAAT,YADT,EAuFK,MAAA;KArFF,KAAK,EAAM;KACZ,OAAK,EAAA,CAAC,yBAAuB;MAAA,WACR,EAAW,EAAM,EAAE;MAAA,cAAiB,EAAM;KAAS,CAAA,CAAA;QAExE,EAmEM,OAAA;KAlEJ,OAAM;KACN,MAAK;KACL,UAAS;KACR,iBAAe,EAAW,EAAM,EAAE;KAClC,UAAK,MAAE,EAAe,EAAM,EAAE;KAC9B,WAAO,CAAA,EAAA,GAAA,MAAgB,EAAe,EAAM,EAAE,GAAA,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA,GAAA,EAAA,GAAA,MACvB,EAAe,EAAM,EAAE,GAAA,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA,CAAA;;KAE/C,EAGK,KAAA,EAFH,OAAK,EAAA,CAAC,0CACE,EAAW,EAAM,EAAE,IAAA,oBAAA,kBAAA,CAAA,EAAA,GAAA,MAAA,CAAA;KAE7B,EAKO,QALP,GAKO,CAJL,EAAgE,QAAhE,GAAgE,EAApB,EAAM,IAAI,GAAA,CAAA,GAC1C,EAAM,QAAA,EAAA,GAAlB,EAES,QAFT,GAES,EADP,GAAc,EAAM,OAAO,CAAA,GAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,CAAA;KAG/B,EA+CM,OAAA;MA/CD,OAAM;MAAiC,SAAK,AAAA,EAAA,OAAA,QAAN,CAAA,GAAW,CAAA,MAAA,CAAA;;MACpD,EAoBS,UAAA;OAnBP,MAAK;OACL,OAAK,EAAA,CAAC,uEAAqE,EAAA,QAEzD,EAAM,UAAS,CAAA,CAAA;OADhC,UAAK,MAAE,GAAc,CAAK;OAE1B,cAAmC,EAAM,YAAA,kCAAA;OAKzC,OAA8B,EAAM,YAAA,kCAAA;UAMrC,EAGK,KAAA,EAFH,OAAK,EAAA,CAAC,wBACE,EAAM,YAAS,aAAA,YAAA,CAAA,EAAA,GAAA,MAAA,CAAA,CAAA,GAAA,IAAA,CAAA;MAG3B,EAQS,UAAA;OAPP,MAAK;OACL,OAAM;OACN,cAAW;OACX,OAAM;OACL,UAAK,MAAE,GAAK,CAAK;uBAElB,EAAiC,KAAA,EAA9B,OAAM,oBAAmB,GAAA,MAAA,EAAA,CAAA,CAAA,GAAA,GAAA,CAAA;MAGtB,EAAgB,CAAK,EAAE,SAAA,GAAA,EAAA,GAD/B,EAMC,QAAA;;OAJC,OAAM;OACL,SAAK,GAAA,MAAO,EAAe,EAAM,EAAE,GAAA,CAAA,MAAA,CAAA;cAEhC,EAAgB,CAAK,EAAE,MAAM,GAAA,CAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA,CAAA,GAAA,GADnB,EAAgB,CAAK,EAAE,OAAM,kBAAA,CAAA,CAAA,IAAA,EAAA,IAAA,EAAA;MAG7C,EAQS,UAAA;OAPP,MAAK;OACL,OAAM;OACN,cAAW;OACX,OAAM;OACL,UAAK,MAAE,EAAO,CAAK;wBAEpB,EAAiC,KAAA,EAA9B,OAAM,oBAAmB,GAAA,MAAA,EAAA,CAAA,CAAA,GAAA,GAAA,CAAA;;eAIvB,EAAW,EAAM,EAAE,KAAA,EAAA,GAA9B,EAYM,OAZN,GAYM,CAXO,EAAgB,CAAK,EAAE,UAAA,EAAA,GAAlC,EASM,OATN,GASM,EAAA,EAAA,EAAA,GARJ,EAOO,GAAA,MAAA,EANiB,EAAgB,CAAK,IAAnC,GAAM,YADhB,EAOO,QAAA;KALJ,KAAK;KACN,OAAK,EAAA,CAAC,UACE,EAAK,YAAY,CAAA;SAEtB,EAAK,IAAI,GAAA,CAAA,sBAGhB,EAA6E,KAA7E,GAA8C,6BAA2B,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,GAAA,CAAA;IAMtE,EAAA,MAAQ,SAAM,KAAA,EAAA,GAAzB,EAkBM,OAAA,GAAA;eAjBJ,EAA6B,MAAA,EAAzB,OAAM,iBAAgB,GAAA,MAAA,EAAA;KAElB,EAAA,MAAQ,UAAA,EAAA,GADhB,EAKC,KAAA;;MAHC,OAAM;MACL,SAAK,AAAA,EAAA,QAAA,MAAE,EAAA,QAAkB;QACzB,gBAAc,KAAA,EAAA,IAAA,EAAA;KAGT,EAAA,SAAA,EAAA,GADR,EASE,GAAA;;MAPA,OAAM;MACN,SAAQ;MACR,iBAAc;MACd,gBAAa;MACb,MAAK;MACJ,WAAO,AAAA,EAAA,QAAA,MAAE,GAAQ;MACjB,UAAM,AAAA,EAAA,QAAA,MAAE,EAAA,QAAkB"}
1
+ {"version":3,"file":"admins-components88.js","names":[],"sources":["../src/components/data-table/FiltersHistory.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface SavedFilter {\n id: string\n savedAt: string\n name?: string\n values: Record<string, any>\n isDefault?: boolean\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch, nextTick } from 'vue'\nimport Button from '@/components/Button.vue'\nimport ConfirmModal from '@/components/ConfirmModal.vue'\nimport type { FilterItem } from '@/components/data-table/DataFilters.vue'\nimport { formatDate } from '@/utils/date'\nimport { buildFilterDisplay } from '@/utils/filterDisplay'\nimport { getSavedFilters } from '@/utils/dataFilters'\nimport { getFullStorageKey } from '@/utils/storageKey'\n\nconst props = defineProps<{\n items: FilterItem[]\n values: Record<string, any>\n storageKey?: string\n}>()\n\nconst MAX_ITEM_LIMIT = 50\nconst MAX_ITEM_WARNING_THRESHOLD = 7\n\nconst emit = defineEmits<{\n load: [values: Record<string, any>]\n}>()\n\nconst open = ref(false)\nconst entries = ref<SavedFilter[]>([])\nconst filterSetName = ref('')\nconst expandedIds = ref<Set<string>>(new Set())\nconst confirmingClearAll = ref(false)\n\nfunction isExpanded(id: string): boolean {\n return expandedIds.value.has(id)\n}\n\nfunction toggleExpanded(id: string): void {\n const next = new Set(expandedIds.value)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n expandedIds.value = next\n}\n\nfunction loadFromStorage() {\n entries.value = getSavedFilters(props.storageKey)\n}\n\nfunction persist() {\n try {\n const fullStorageKey = getFullStorageKey('filters', props.storageKey)\n localStorage.setItem(fullStorageKey, JSON.stringify(entries.value))\n } catch {\n console.warn('Failed to persist saved filters to localStorage')\n }\n}\n\nonMounted(loadFromStorage)\n\nconst hasActiveFilters = computed(() =>\n Object.values(props.values).some((v) => v !== null && v !== '' && v !== undefined),\n)\n\nfunction makeId(): string {\n return Date.now().toString(36)\n}\n\nwatch(\n () => [props.values, filterSetName.value],\n () => {\n if (justSaved.value) {\n justSaved.value = false\n }\n },\n { deep: true },\n)\n\nconst justSaved = ref(false)\n\nfunction save() {\n if (!hasActiveFilters.value) return\n\n const trimmed = filterSetName.value.trim()\n const entry: SavedFilter = {\n id: makeId(),\n savedAt: new Date().toISOString(),\n name: trimmed || undefined,\n values: { ...props.values },\n }\n entries.value = [entry, ...entries.value].slice(0, MAX_ITEM_LIMIT)\n filterSetName.value = ''\n\n persist()\n nextTick(() => {\n justSaved.value = true\n })\n}\n\nfunction load(entry: SavedFilter) {\n emit('load', { ...entry.values })\n}\n\nfunction remove(entry: SavedFilter) {\n entries.value = entries.value.filter((e) => e.id !== entry.id)\n if (expandedIds.value.has(entry.id)) {\n const next = new Set(expandedIds.value)\n next.delete(entry.id)\n expandedIds.value = next\n }\n persist()\n}\n\nfunction clearAll() {\n entries.value = []\n expandedIds.value = new Set()\n persist()\n confirmingClearAll.value = false\n}\n\nfunction buildEntry(entry: SavedFilter) {\n return buildFilterDisplay(props.items, entry.values)\n}\n\nconst entryDisplays = computed(() => {\n const map = new Map<string, ReturnType<typeof buildEntry>>()\n for (const entry of entries.value) {\n map.set(entry.id, buildEntry(entry))\n }\n return map\n})\n\nfunction getEntryDisplay(entry: SavedFilter) {\n return entryDisplays.value.get(entry.id) ?? buildEntry(entry)\n}\n\nconst sortedEntries = computed(() => {\n const defaultEntry = entries.value.find((e) => e.isDefault)\n if (!defaultEntry) return entries.value\n return [defaultEntry, ...entries.value.filter((e) => !e.isDefault)]\n})\n\nconst hasWarning = computed(() => {\n return entries.value.length >= MAX_ITEM_LIMIT - MAX_ITEM_WARNING_THRESHOLD\n})\n\nfunction formatSavedAt(iso: string): string {\n const d = new Date(iso)\n if (isNaN(d.getTime())) return iso\n return formatDate(d, 'YYYY-MM-DD HH:mm')\n}\n\nfunction toggleDefault(entry: SavedFilter) {\n if (entry.isDefault) {\n entry.isDefault = false\n } else {\n entries.value.forEach((e) => {\n e.isDefault = false\n })\n entry.isDefault = true\n }\n persist()\n}\n</script>\n\n<template>\n <div class=\"ac-component\">\n <div class=\"filters-history\">\n <button\n type=\"button\"\n class=\"filters-history__toggle\"\n :class=\"{ 'is-open': open }\"\n :aria-expanded=\"open\"\n @click=\"open = !open\"\n >\n <i class=\"fa-solid fa-sliders filters-history__toggle-icon\"></i>\n <span class=\"filters-history__toggle-label\">Mentett szűrők</span>\n <span v-if=\"entries.length\" class=\"c-indicator\">{{ entries.length }}</span>\n <span v-if=\"hasWarning\" v-tooltip=\"`Maximum ${MAX_ITEM_LIMIT} szűrő menthető`\"\n >/ {{ MAX_ITEM_LIMIT }}</span\n >\n <i\n class=\"fa-solid filters-history__chevron\"\n :class=\"open ? 'fa-chevron-up' : 'fa-chevron-down'\"\n ></i>\n </button>\n\n <div v-if=\"open\" class=\"filters-history__panel c-scroll\">\n <div class=\"filters-history__save-row\">\n <input\n v-model=\"filterSetName\"\n type=\"text\"\n class=\"c-input-row c-input-row--sm\"\n placeholder=\"Elnevezés\"\n @keydown.enter=\"save\"\n />\n <Button\n icon=\"fa-solid fa-bookmark\"\n label=\"Mentés\"\n size=\"small\"\n type=\"info\"\n :disabled=\"!hasActiveFilters || justSaved\"\n @click=\"save\"\n />\n </div>\n\n <p v-if=\"!hasActiveFilters && entries.length === 0\" class=\"filters-history__hint\">\n Nincs aktív szűrő. Adj meg értékeket a mentéshez.\n </p>\n <p v-else-if=\"entries.length === 0\" class=\"filters-history__hint\">\n Még nincs mentett szűrő.<br />\n Az aktuális beállítások a „Mentés\" gombbal menthetők.<br />\n Az „Elnevezés\" mező csak a könnyebb azonosítás miatt van, megadása nem kötelező.\n </p>\n\n <template v-if=\"entries.length > 0\">\n <ul class=\"filters-history__list\">\n <li\n v-for=\"entry in sortedEntries\"\n :key=\"entry.id\"\n class=\"filters-history__item\"\n :class=\"{ 'is-open': isExpanded(entry.id), 'is-default': entry.isDefault }\"\n >\n <div\n class=\"filters-history__item-header\"\n role=\"button\"\n tabindex=\"0\"\n :aria-expanded=\"isExpanded(entry.id)\"\n @click=\"toggleExpanded(entry.id)\"\n @keydown.enter.prevent=\"toggleExpanded(entry.id)\"\n @keydown.space.prevent=\"toggleExpanded(entry.id)\"\n >\n <i\n class=\"fa-solid filters-history__item-chevron\"\n :class=\"isExpanded(entry.id) ? 'fa-chevron-down' : 'fa-chevron-right'\"\n ></i>\n <span class=\"filters-history__item-header-text\">\n <span class=\"filters-history__item-name\">{{ entry.name }}</span>\n <span v-if=\"entry.name\" class=\"filters-history__item-date\">{{\n formatSavedAt(entry.savedAt)\n }}</span>\n </span>\n <div class=\"filters-history__item-actions\" @click.stop>\n <button\n type=\"button\"\n class=\"c-indicator filters-history__item-btn filters-history__item-default\"\n @click=\"toggleDefault(entry)\"\n :class=\"{ active: entry.isDefault }\"\n :aria-label=\"\n entry.isDefault\n ? 'Alapértelmezett szűrő törlése'\n : 'Alapértelmezett szűrő beállítása'\n \"\n :title=\"\n entry.isDefault\n ? 'Alapértelmezett szűrő törlése'\n : 'Alapértelmezett szűrő beállítása'\n \"\n >\n <i\n class=\"fa-star fix-icon-pos\"\n :class=\"entry.isDefault ? 'fa-solid' : 'fa-regular'\"\n ></i>\n </button>\n <button\n type=\"button\"\n class=\"c-indicator filters-history__item-btn filters-history__item-load\"\n aria-label=\"Betöltés\"\n title=\"Betöltés\"\n @click=\"load(entry)\"\n >\n <i class=\"fa-solid fa-check\"></i>\n </button>\n <span\n v-if=\"getEntryDisplay(entry).length\"\n class=\"c-indicator\"\n @click.stop=\"toggleExpanded(entry.id)\"\n v-tooltip=\"`${getEntryDisplay(entry).length} szűrési feltétel`\"\n >{{ getEntryDisplay(entry).length }}</span\n >\n <button\n type=\"button\"\n class=\"c-indicator filters-history__item-btn filters-history__item-remove\"\n aria-label=\"Törlés\"\n title=\"Törlés\"\n @click=\"remove(entry)\"\n >\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n <div v-if=\"isExpanded(entry.id)\" class=\"filters-history__item-content\">\n <div v-if=\"getEntryDisplay(entry).length\" class=\"filters-history__item-body\">\n <span\n v-for=\"(part, idx) in getEntryDisplay(entry)\"\n :key=\"idx\"\n class=\"c-chip\"\n :class=\"part.displayClass\"\n >\n {{ part.text }}\n </span>\n </div>\n <p v-else class=\"filters-history__item-empty\">Nincs megjeleníthető szűrő.</p>\n </div>\n </li>\n </ul>\n </template>\n\n <div v-if=\"entries.length > 3\">\n <hr class=\"separator my-1\" />\n <a\n v-if=\"entries.length\"\n class=\"filters-history__clear-all px-2\"\n @click=\"confirmingClearAll = true\"\n >Összes törlése</a\n >\n <ConfirmModal\n v-if=\"confirmingClearAll\"\n title=\"Mentett szűrők törlése\"\n message=\"Biztosan törlöd az összes mentett szűrőt?\"\n confirm-label=\"Törlés\"\n cancel-label=\"Mégse\"\n type=\"error\"\n @confirm=\"clearAll()\"\n @cancel=\"confirmingClearAll = false\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/filters-history.scss\"></style>\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import './src/styles/components/data-table/filters-history.scss_vue_type_style_index_0_src_true_lang.css';
1
+ import './styles/components/data-table/filters-history.scss_vue_type_style_index_0_src_true_lang.css';
2
2
  import e from "./admins-components88.js";
3
3
  /* empty css */
4
4
  //#region src/components/data-table/FiltersHistory.vue