admins-components 9.0.65 → 9.0.67

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 (267) hide show
  1. package/dist/admins-components.js +41 -41
  2. package/dist/admins-components100.js +75 -244
  3. package/dist/admins-components100.js.map +1 -1
  4. package/dist/admins-components102.js +2 -2
  5. package/dist/admins-components102.js.map +1 -1
  6. package/dist/admins-components103.js +256 -3
  7. package/dist/admins-components103.js.map +1 -1
  8. package/dist/admins-components105.js +6 -52
  9. package/dist/admins-components105.js.map +1 -1
  10. package/dist/admins-components106.js +3 -82
  11. package/dist/admins-components106.js.map +1 -1
  12. package/dist/admins-components107.js +3 -113
  13. package/dist/admins-components107.js.map +1 -1
  14. package/dist/admins-components108.js +49 -44
  15. package/dist/admins-components108.js.map +1 -1
  16. package/dist/admins-components109.js +80 -104
  17. package/dist/admins-components109.js.map +1 -1
  18. package/dist/admins-components110.js +109 -16
  19. package/dist/admins-components110.js.map +1 -1
  20. package/dist/admins-components111.js +46 -6
  21. package/dist/admins-components111.js.map +1 -1
  22. package/dist/admins-components112.js +100 -246
  23. package/dist/admins-components112.js.map +1 -1
  24. package/dist/admins-components113.js +19 -26
  25. package/dist/admins-components113.js.map +1 -1
  26. package/dist/admins-components114.js +6 -27
  27. package/dist/admins-components114.js.map +1 -1
  28. package/dist/admins-components115.js +239 -159
  29. package/dist/admins-components115.js.map +1 -1
  30. package/dist/admins-components116.js +26 -67
  31. package/dist/admins-components116.js.map +1 -1
  32. package/dist/admins-components117.js +25 -64
  33. package/dist/admins-components117.js.map +1 -1
  34. package/dist/admins-components118.js +169 -27
  35. package/dist/admins-components118.js.map +1 -1
  36. package/dist/admins-components119.js +65 -13
  37. package/dist/admins-components119.js.map +1 -1
  38. package/dist/admins-components120.js +64 -24
  39. package/dist/admins-components120.js.map +1 -1
  40. package/dist/admins-components121.js +29 -8
  41. package/dist/admins-components121.js.map +1 -1
  42. package/dist/admins-components122.js +16 -4
  43. package/dist/admins-components122.js.map +1 -1
  44. package/dist/admins-components123.js +27 -3
  45. package/dist/admins-components123.js.map +1 -1
  46. package/dist/admins-components124.js +8 -2
  47. package/dist/admins-components124.js.map +1 -1
  48. package/dist/admins-components125.js +4 -21
  49. package/dist/admins-components125.js.map +1 -1
  50. package/dist/admins-components126.js +3 -14
  51. package/dist/admins-components126.js.map +1 -1
  52. package/dist/admins-components127.js +3 -8
  53. package/dist/admins-components127.js.map +1 -1
  54. package/dist/admins-components128.js +19 -11
  55. package/dist/admins-components128.js.map +1 -1
  56. package/dist/admins-components129.js +14 -26
  57. package/dist/admins-components129.js.map +1 -1
  58. package/dist/admins-components130.js +7 -82
  59. package/dist/admins-components130.js.map +1 -1
  60. package/dist/admins-components131.js +9 -7
  61. package/dist/admins-components131.js.map +1 -1
  62. package/dist/admins-components132.js +25 -4
  63. package/dist/admins-components132.js.map +1 -1
  64. package/dist/admins-components133.js +81 -6
  65. package/dist/admins-components133.js.map +1 -1
  66. package/dist/admins-components134.js +10 -6
  67. package/dist/admins-components134.js.map +1 -1
  68. package/dist/admins-components135.js +2 -3
  69. package/dist/admins-components135.js.map +1 -1
  70. package/dist/admins-components136.js +8 -15
  71. package/dist/admins-components136.js.map +1 -1
  72. package/dist/admins-components137.js +6 -12
  73. package/dist/admins-components137.js.map +1 -1
  74. package/dist/admins-components138.js +6 -30
  75. package/dist/admins-components138.js.map +1 -1
  76. package/dist/admins-components139.js +15 -4
  77. package/dist/admins-components139.js.map +1 -1
  78. package/dist/admins-components140.js +13 -29
  79. package/dist/admins-components140.js.map +1 -1
  80. package/dist/admins-components141.js +30 -5
  81. package/dist/admins-components141.js.map +1 -1
  82. package/dist/admins-components142.js +4 -5
  83. package/dist/admins-components142.js.map +1 -1
  84. package/dist/admins-components143.js +28 -7
  85. package/dist/admins-components143.js.map +1 -1
  86. package/dist/admins-components144.js +4 -73
  87. package/dist/admins-components144.js.map +1 -1
  88. package/dist/admins-components145.js +4 -28
  89. package/dist/admins-components145.js.map +1 -1
  90. package/dist/admins-components146.js +8 -59
  91. package/dist/admins-components146.js.map +1 -1
  92. package/dist/admins-components147.js +72 -22
  93. package/dist/admins-components147.js.map +1 -1
  94. package/dist/admins-components148.js +26 -47
  95. package/dist/admins-components148.js.map +1 -1
  96. package/dist/admins-components149.js +58 -30
  97. package/dist/admins-components149.js.map +1 -1
  98. package/dist/admins-components150.js +24 -3
  99. package/dist/admins-components150.js.map +1 -1
  100. package/dist/admins-components151.js +44 -173
  101. package/dist/admins-components151.js.map +1 -1
  102. package/dist/admins-components152.js +28 -43
  103. package/dist/admins-components152.js.map +1 -1
  104. package/dist/admins-components153.js +3 -37
  105. package/dist/admins-components153.js.map +1 -1
  106. package/dist/admins-components154.js +176 -43
  107. package/dist/admins-components154.js.map +1 -1
  108. package/dist/admins-components155.js +41 -136
  109. package/dist/admins-components155.js.map +1 -1
  110. package/dist/admins-components156.js +36 -57
  111. package/dist/admins-components156.js.map +1 -1
  112. package/dist/admins-components157.js +44 -5
  113. package/dist/admins-components157.js.map +1 -1
  114. package/dist/admins-components158.js +141 -6
  115. package/dist/admins-components158.js.map +1 -1
  116. package/dist/admins-components159.js +57 -75
  117. package/dist/admins-components159.js.map +1 -1
  118. package/dist/admins-components160.js +6 -28
  119. package/dist/admins-components160.js.map +1 -1
  120. package/dist/admins-components161.js +5 -1930
  121. package/dist/admins-components161.js.map +1 -1
  122. package/dist/admins-components162.js +75 -24810
  123. package/dist/admins-components162.js.map +1 -1
  124. package/dist/admins-components163.js +28 -8
  125. package/dist/admins-components163.js.map +1 -1
  126. package/dist/admins-components164.js +1929 -5
  127. package/dist/admins-components164.js.map +1 -0
  128. package/dist/admins-components165.js +24809 -140
  129. package/dist/admins-components165.js.map +1 -1
  130. package/dist/admins-components166.js +3 -3
  131. package/dist/admins-components166.js.map +1 -1
  132. package/dist/admins-components167.js +7 -9
  133. package/dist/admins-components168.js +143 -0
  134. package/dist/admins-components168.js.map +1 -0
  135. package/dist/admins-components169.js +8 -167
  136. package/dist/admins-components169.js.map +1 -1
  137. package/dist/admins-components170.js +8 -52
  138. package/dist/admins-components170.js.map +1 -1
  139. package/dist/admins-components172.js +161 -43
  140. package/dist/admins-components172.js.map +1 -1
  141. package/dist/admins-components173.js +53 -6
  142. package/dist/admins-components173.js.map +1 -1
  143. package/dist/admins-components174.js +8 -79
  144. package/dist/admins-components174.js.map +1 -1
  145. package/dist/admins-components175.js +35 -43
  146. package/dist/admins-components175.js.map +1 -1
  147. package/dist/admins-components176.js +6 -63
  148. package/dist/admins-components176.js.map +1 -1
  149. package/dist/admins-components177.js +79 -8
  150. package/dist/admins-components177.js.map +1 -1
  151. package/dist/admins-components178.js +43 -37
  152. package/dist/admins-components178.js.map +1 -1
  153. package/dist/admins-components179.js +62 -8
  154. package/dist/admins-components179.js.map +1 -1
  155. package/dist/admins-components180.js +10 -0
  156. package/dist/admins-components180.js.map +1 -0
  157. package/dist/admins-components181.js +44 -50
  158. package/dist/admins-components181.js.map +1 -1
  159. package/dist/admins-components182.js +10 -0
  160. package/dist/admins-components182.js.map +1 -0
  161. package/dist/admins-components184.js +59 -0
  162. package/dist/admins-components184.js.map +1 -0
  163. package/dist/admins-components21.js +2 -2
  164. package/dist/admins-components21.js.map +1 -1
  165. package/dist/admins-components22.js.map +1 -1
  166. package/dist/admins-components29.js +6 -3
  167. package/dist/admins-components29.js.map +1 -1
  168. package/dist/admins-components30.js.map +1 -1
  169. package/dist/admins-components5.js +4 -2
  170. package/dist/admins-components5.js.map +1 -1
  171. package/dist/admins-components58.js.map +1 -1
  172. package/dist/admins-components6.js.map +1 -1
  173. package/dist/admins-components60.js +28 -73
  174. package/dist/admins-components60.js.map +1 -1
  175. package/dist/admins-components62.js +4 -2
  176. package/dist/admins-components62.js.map +1 -1
  177. package/dist/admins-components63.js +95 -83
  178. package/dist/admins-components63.js.map +1 -1
  179. package/dist/admins-components64.js +70 -4
  180. package/dist/admins-components64.js.map +1 -1
  181. package/dist/admins-components65.js +4 -157
  182. package/dist/admins-components65.js.map +1 -1
  183. package/dist/admins-components66.js +90 -0
  184. package/dist/admins-components66.js.map +1 -0
  185. package/dist/admins-components67.js +2 -5
  186. package/dist/admins-components67.js.map +1 -1
  187. package/dist/admins-components68.js +130 -136
  188. package/dist/admins-components68.js.map +1 -1
  189. package/dist/admins-components70.js +2 -2
  190. package/dist/admins-components70.js.map +1 -1
  191. package/dist/admins-components71.js +163 -7
  192. package/dist/admins-components71.js.map +1 -1
  193. package/dist/admins-components73.js +8 -0
  194. package/dist/admins-components73.js.map +1 -0
  195. package/dist/admins-components74.js +7 -6
  196. package/dist/admins-components74.js.map +1 -1
  197. package/dist/admins-components75.js +289 -8
  198. package/dist/admins-components75.js.map +1 -1
  199. package/dist/admins-components77.js +6 -145
  200. package/dist/admins-components77.js.map +1 -1
  201. package/dist/admins-components78.js +10 -0
  202. package/dist/admins-components78.js.map +1 -0
  203. package/dist/admins-components79.js +43 -6
  204. package/dist/admins-components79.js.map +1 -1
  205. package/dist/admins-components80.js +130 -121
  206. package/dist/admins-components80.js.map +1 -1
  207. package/dist/admins-components82.js +2 -2
  208. package/dist/admins-components82.js.map +1 -1
  209. package/dist/admins-components83.js +133 -56
  210. package/dist/admins-components83.js.map +1 -1
  211. package/dist/admins-components85.js +6 -238
  212. package/dist/admins-components85.js.map +1 -1
  213. package/dist/admins-components86.js +60 -0
  214. package/dist/admins-components86.js.map +1 -0
  215. package/dist/admins-components87.js +67 -6
  216. package/dist/admins-components87.js.map +1 -1
  217. package/dist/admins-components88.js +216 -208
  218. package/dist/admins-components88.js.map +1 -1
  219. package/dist/admins-components90.js +2 -2
  220. package/dist/admins-components90.js.map +1 -1
  221. package/dist/admins-components91.js +225 -32
  222. package/dist/admins-components91.js.map +1 -1
  223. package/dist/admins-components93.js +2 -2
  224. package/dist/admins-components93.js.map +1 -1
  225. package/dist/admins-components94.js +65 -194
  226. package/dist/admins-components94.js.map +1 -1
  227. package/dist/admins-components96.js +2 -2
  228. package/dist/admins-components96.js.map +1 -1
  229. package/dist/admins-components97.js +188 -71
  230. package/dist/admins-components97.js.map +1 -1
  231. package/dist/admins-components99.js +2 -2
  232. package/dist/admins-components99.js.map +1 -1
  233. package/dist/main.css +1 -1
  234. package/dist/main.css.map +1 -1
  235. package/dist/src/components/Button.vue.d.ts +2 -1
  236. package/dist/src/components/DropdownMenu.vue.d.ts +2 -0
  237. package/dist/src/components/data-table/DataList.vue.d.ts +3 -0
  238. package/dist/src/components/data-table/DataSearch.vue.d.ts +0 -4
  239. package/dist/src/components/data-table/DataSort.vue.d.ts +0 -5
  240. package/dist/src/components/data-table/FilterTags.vue.d.ts +1 -0
  241. package/dist/src/components/data-table/TagList.vue.d.ts +18 -0
  242. package/dist/src/index.d.ts +2 -2
  243. package/dist/src/styles/components/data-table/data-cards.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  244. package/dist/src/styles/components/data-table/data-list.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  245. package/dist/src/styles/components/data-table/data-paginator.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  246. package/dist/src/styles/components/data-table/filter-tags.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  247. package/dist/src/styles/components/data-table/tag-list.scss_vue_type_style_index_0_src_true_lang.css +1 -0
  248. package/dist/src/styles/components/datepickers.scss_vue_type_style_index_1_src_true_lang.css +1 -1
  249. package/dist/src/styles/components/header.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  250. package/dist/src/styles/components/sidebar.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  251. package/dist/src/types/data-list.d.ts +2 -0
  252. package/dist/src/utils/dataListConverters.d.ts +16 -1
  253. package/dist/src/utils/url.d.ts +1 -0
  254. package/package.json +1 -1
  255. package/dist/admins-components104.js +0 -4
  256. package/dist/admins-components104.js.map +0 -1
  257. package/dist/admins-components167.js.map +0 -1
  258. package/dist/admins-components171.js +0 -10
  259. package/dist/admins-components171.js.map +0 -1
  260. package/dist/admins-components61.js +0 -71
  261. package/dist/admins-components61.js.map +0 -1
  262. package/dist/admins-components72.js +0 -289
  263. package/dist/admins-components72.js.map +0 -1
  264. package/dist/admins-components76.js +0 -37
  265. package/dist/admins-components76.js.map +0 -1
  266. package/dist/admins-components84.js +0 -68
  267. package/dist/admins-components84.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components83.js","names":[],"sources":["../src/utils/filterDisplay.ts"],"sourcesContent":["import { formatDate } from '@/utils/date'\nimport type { FilterItem } from '@/components/data-table/DataFilters.vue'\n\nexport function displayFilterValue(items: FilterItem[], key: string, value: any): string {\n if (value === null || value === undefined || value === '') return ''\n\n const item = items.find((i) => i.key === key)\n\n if (item?.type === 'dropdown' && item.options) {\n const parsedValue = parseDropdownValue(value)\n\n if (Array.isArray(parsedValue)) {\n const labels = parsedValue.map((v) => {\n const opt = item.options?.find((o) => o.value === v)\n return opt ? opt.label : String(v)\n })\n return labels.join(', ')\n }\n\n const opt = item.options.find((o) => o.value === parsedValue)\n if (opt) return opt.label\n }\n if (item?.type === 'checkbox') {\n return value ? 'Bekapcsolva' : ''\n }\n\n if (item?.type === 'date' || item?.type === 'datetime') {\n if (typeof value === 'object' && value !== null) {\n const local: Date | string | null | undefined = value.local ?? value.utc ?? null\n if (local == null) return ''\n const d = local instanceof Date ? local : new Date(local)\n if (!isNaN(d.getTime())) {\n return formatDate(d, item.type === 'datetime' ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD')\n }\n }\n if (typeof value === 'string' && value) {\n const d = new Date(value)\n if (!isNaN(d.getTime())) {\n return formatDate(d, item.type === 'datetime' ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD')\n }\n }\n }\n\n if ((item?.type === 'daterange' || item?.type === 'datetimerange') && typeof value === 'object') {\n const showTime = item.type === 'datetimerange'\n const fmt = showTime ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD'\n const from = value.fromUtc ? formatDate(new Date(value.fromUtc), fmt) : '…'\n const to = value.toUtc ? formatDate(new Date(value.toUtc), fmt) : '…'\n return `${from} - ${to}`\n }\n\n if (typeof value === 'object') return JSON.stringify(value)\n\n return String(value)\n}\n\nexport function parseDropdownValue(value: any): unknown {\n if (Array.isArray(value)) {\n return value\n }\n\n if (typeof value === 'string') {\n if (value.startsWith('[') && value.endsWith(']')) {\n try {\n const parsed = JSON.parse(value)\n if (Array.isArray(parsed)) {\n return parsed\n }\n } catch {\n // If parsing fails, treat as string\n }\n }\n return value\n }\n\n return value\n}\n\nexport interface FilterDisplayPart {\n key: string\n text: string\n displayClass?: string\n}\n\nexport function buildFilterDisplay(\n items: FilterItem[],\n values: Record<string, any>,\n): FilterDisplayPart[] {\n const parts: FilterDisplayPart[] = []\n for (const [key, rawValue] of Object.entries(values)) {\n const v = displayFilterValue(items, key, rawValue)\n if (!v) continue\n const item = items.find((i) => i.key === key)\n const labelText = item?.label ?? key\n parts.push({ key, text: `${labelText}: ${v}`, displayClass: item?.displayClass })\n }\n\n return parts\n}\n\nexport function buildFilterValues(items: FilterItem[], values: Record<string, any>): string[] {\n return buildFilterDisplay(items, values).map((p) => p.text)\n}\n"],"mappings":";;AAGA,SAAgB,EAAmB,GAAqB,GAAa,GAAoB;CACvF,IAAI,KAAU,QAA+B,MAAU,IAAI,OAAO;CAElE,IAAM,IAAO,EAAM,MAAM,MAAM,EAAE,QAAQ,CAAG;CAE5C,IAAI,GAAM,SAAS,cAAc,EAAK,SAAS;EAC7C,IAAM,IAAc,EAAmB,CAAK;EAE5C,IAAI,MAAM,QAAQ,CAAW,GAK3B,OAJe,EAAY,KAAK,MAAM;GACpC,IAAM,IAAM,EAAK,SAAS,MAAM,MAAM,EAAE,UAAU,CAAC;GACnD,OAAO,IAAM,EAAI,QAAQ,OAAO,CAAC;EACnC,CACO,EAAO,KAAK,IAAI;EAGzB,IAAM,IAAM,EAAK,QAAQ,MAAM,MAAM,EAAE,UAAU,CAAW;EAC5D,IAAI,GAAK,OAAO,EAAI;CACtB;CACA,IAAI,GAAM,SAAS,YACjB,OAAO,IAAQ,gBAAgB;CAGjC,IAAI,GAAM,SAAS,UAAU,GAAM,SAAS,YAAY;EACtD,IAAI,OAAO,KAAU,YAAY,GAAgB;GAC/C,IAAM,IAA0C,EAAM,SAAS,EAAM,OAAO;GAC5E,IAAI,KAAS,MAAM,OAAO;GAC1B,IAAM,IAAI,aAAiB,OAAO,IAAQ,IAAI,KAAK,CAAK;GACxD,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,GACpB,OAAO,EAAW,GAAG,EAAK,SAAS,aAAa,qBAAqB,YAAY;EAErF;EACA,IAAI,OAAO,KAAU,YAAY,GAAO;GACtC,IAAM,IAAI,IAAI,KAAK,CAAK;GACxB,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,GACpB,OAAO,EAAW,GAAG,EAAK,SAAS,aAAa,qBAAqB,YAAY;EAErF;CACF;CAEA,KAAK,GAAM,SAAS,eAAe,GAAM,SAAS,oBAAoB,OAAO,KAAU,UAAU;EAE/F,IAAM,IADW,EAAK,SAAS,kBACR,qBAAqB;EAG5C,OAAO,GAFM,EAAM,UAAU,EAAW,IAAI,KAAK,EAAM,OAAO,GAAG,CAAG,IAAI,IAEzD,KADJ,EAAM,QAAQ,EAAW,IAAI,KAAK,EAAM,KAAK,GAAG,CAAG,IAAI;CAEpE;CAIA,OAFI,OAAO,KAAU,WAAiB,KAAK,UAAU,CAAK,IAEnD,OAAO,CAAK;AACrB;AAEA,SAAgB,EAAmB,GAAqB;CACtD,IAAI,MAAM,QAAQ,CAAK,GACrB,OAAO;CAGT,IAAI,OAAO,KAAU,UAAU;EAC7B,IAAI,EAAM,WAAW,GAAG,KAAK,EAAM,SAAS,GAAG,GAC7C,IAAI;GACF,IAAM,IAAS,KAAK,MAAM,CAAK;GAC/B,IAAI,MAAM,QAAQ,CAAM,GACtB,OAAO;EAEX,QAAQ,CAER;EAEF,OAAO;CACT;CAEA,OAAO;AACT;AAQA,SAAgB,EACd,GACA,GACqB;CACrB,IAAM,IAA6B,CAAC;CACpC,KAAK,IAAM,CAAC,GAAK,MAAa,OAAO,QAAQ,CAAM,GAAG;EACpD,IAAM,IAAI,EAAmB,GAAO,GAAK,CAAQ;EACjD,IAAI,CAAC,GAAG;EACR,IAAM,IAAO,EAAM,MAAM,MAAM,EAAE,QAAQ,CAAG,GACtC,IAAY,GAAM,SAAS;EACjC,EAAM,KAAK;GAAE;GAAK,MAAM,GAAG,EAAU,IAAI;GAAK,cAAc,GAAM;EAAa,CAAC;CAClF;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"admins-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 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 emitChange(v, 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\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=\"(v) => (sortBy = v)\"\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,239 +1,7 @@
1
- import { formatDate as e } from "./admins-components3.js";
2
- import t from "./admins-components6.js";
3
- import n from "./admins-components42.js";
4
- import { getFullStorageKey as r } from "./admins-components75.js";
5
- import { buildFilterDisplay as i } from "./admins-components83.js";
6
- import { getSavedFilters as ee } from "./admins-components84.js";
7
- import { Fragment as a, computed as o, createBlock as s, createCommentVNode as c, createElementBlock as l, createElementVNode as u, createTextVNode as d, createVNode as te, defineComponent as f, nextTick as p, normalizeClass as m, onMounted as ne, openBlock as h, ref as g, renderList as _, resolveDirective as v, toDisplayString as y, vModelText as b, watch as re, withDirectives as x, withKeys as S, withModifiers as C } from "vue";
8
- //#region src/components/data-table/FiltersHistory.vue?vue&type=script&setup=true&lang.ts
9
- var ie = { class: "ac-component" }, ae = { class: "filters-history" }, oe = ["aria-expanded"], se = {
10
- key: 0,
11
- class: "c-indicator"
12
- }, ce = { key: 1 }, le = {
13
- key: 0,
14
- class: "filters-history__panel c-scroll"
15
- }, ue = { class: "filters-history__save-row" }, de = {
16
- key: 0,
17
- class: "filters-history__hint"
18
- }, fe = {
19
- key: 1,
20
- class: "filters-history__hint"
21
- }, w = {
22
- key: 2,
23
- class: "filters-history__list"
24
- }, T = [
25
- "aria-expanded",
26
- "onClick",
27
- "onKeydown"
28
- ], E = { class: "filters-history__item-header-text" }, D = { class: "filters-history__item-name" }, O = {
29
- key: 0,
30
- class: "filters-history__item-date"
31
- }, k = [
32
- "onClick",
33
- "aria-label",
34
- "title"
35
- ], A = ["onClick"], j = ["onClick"], M = ["onClick"], N = {
36
- key: 0,
37
- class: "filters-history__item-content"
38
- }, P = {
39
- key: 0,
40
- class: "filters-history__item-body"
41
- }, F = {
42
- key: 1,
43
- class: "filters-history__item-empty"
44
- }, I = { key: 3 }, L = /* @__PURE__ */ f({
45
- __name: "FiltersHistory",
46
- props: {
47
- items: {},
48
- values: {},
49
- storageKey: {}
50
- },
51
- emits: ["load"],
52
- setup(f, { emit: L }) {
53
- let R = f, z = L, B = g(!1), V = g([]), H = g(""), U = g(/* @__PURE__ */ new Set()), W = g(!1);
54
- function G(e) {
55
- return U.value.has(e);
56
- }
57
- function K(e) {
58
- let t = new Set(U.value);
59
- t.has(e) ? t.delete(e) : t.add(e), U.value = t;
60
- }
61
- function pe() {
62
- V.value = ee(R.storageKey);
63
- }
64
- function q() {
65
- try {
66
- let e = r("filters", R.storageKey);
67
- localStorage.setItem(e, JSON.stringify(V.value));
68
- } catch {
69
- console.warn("Failed to persist saved filters to localStorage");
70
- }
71
- }
72
- ne(pe);
73
- let J = o(() => Object.values(R.values).some((e) => e !== null && e !== "" && e !== void 0));
74
- function me() {
75
- return Date.now().toString(36);
76
- }
77
- re(() => [R.values, H.value], () => {
78
- Y.value &&= !1;
79
- }, { deep: !0 });
80
- let Y = g(!1);
81
- function X() {
82
- if (!J.value) return;
83
- let e = H.value.trim();
84
- V.value = [{
85
- id: me(),
86
- savedAt: (/* @__PURE__ */ new Date()).toISOString(),
87
- name: e || void 0,
88
- values: { ...R.values }
89
- }, ...V.value].slice(0, 50), H.value = "", q(), p(() => {
90
- Y.value = !0;
91
- });
92
- }
93
- function he(e) {
94
- z("load", { ...e.values });
95
- }
96
- function Z(e) {
97
- if (V.value = V.value.filter((t) => t.id !== e.id), U.value.has(e.id)) {
98
- let t = new Set(U.value);
99
- t.delete(e.id), U.value = t;
100
- }
101
- q();
102
- }
103
- function ge() {
104
- V.value = [], U.value = /* @__PURE__ */ new Set(), q(), W.value = !1;
105
- }
106
- function Q(e) {
107
- return i(R.items, e.values);
108
- }
109
- let _e = o(() => {
110
- let e = /* @__PURE__ */ new Map();
111
- for (let t of V.value) e.set(t.id, Q(t));
112
- return e;
113
- });
114
- function $(e) {
115
- return _e.value.get(e.id) ?? Q(e);
116
- }
117
- let ve = o(() => {
118
- let e = V.value.find((e) => e.isDefault);
119
- return e ? [e, ...V.value.filter((e) => !e.isDefault)] : V.value;
120
- }), ye = o(() => V.value.length >= 43);
121
- function be(t) {
122
- let n = new Date(t);
123
- return isNaN(n.getTime()) ? t : e(n, "YYYY-MM-DD HH:mm");
124
- }
125
- function xe(e) {
126
- e.isDefault ? e.isDefault = !1 : (V.value.forEach((e) => {
127
- e.isDefault = !1;
128
- }), e.isDefault = !0), q();
129
- }
130
- return (e, r) => {
131
- let i = v("tooltip");
132
- return h(), l("div", ie, [u("div", ae, [u("button", {
133
- type: "button",
134
- class: m(["filters-history__toggle", { "is-open": B.value }]),
135
- "aria-expanded": B.value,
136
- onClick: r[0] ||= (e) => B.value = !B.value
137
- }, [
138
- r[6] ||= u("i", { class: "fa-solid fa-sliders filters-history__toggle-icon" }, null, -1),
139
- r[7] ||= u("span", { class: "filters-history__toggle-label" }, "Mentett szűrők", -1),
140
- V.value.length ? (h(), l("span", se, y(V.value.length), 1)) : c("", !0),
141
- ye.value ? x((h(), l("span", ce, [d("/ " + y(50))])), [[i, "Maximum 50 szűrő menthető"]]) : c("", !0),
142
- u("i", { class: m(["fa-solid filters-history__chevron", B.value ? "fa-chevron-up" : "fa-chevron-down"]) }, null, 2)
143
- ], 10, oe), B.value ? (h(), l("div", le, [
144
- u("div", ue, [x(u("input", {
145
- "onUpdate:modelValue": r[1] ||= (e) => H.value = e,
146
- type: "text",
147
- class: "c-input-row c-input-row--sm",
148
- placeholder: "Elnevezés",
149
- onKeydown: S(X, ["enter"])
150
- }, null, 544), [[b, H.value]]), te(t, {
151
- icon: "fa-solid fa-bookmark",
152
- label: "Mentés",
153
- size: "small",
154
- type: "info",
155
- disabled: !J.value || Y.value,
156
- onClick: X
157
- }, null, 8, ["disabled"])]),
158
- !J.value && V.value.length === 0 ? (h(), l("p", de, " Nincs aktív szűrő. Adj meg értékeket a mentéshez. ")) : V.value.length === 0 ? (h(), l("p", fe, [...r[8] ||= [
159
- d(" Még nincs mentett szűrő.", -1),
160
- u("br", null, null, -1),
161
- d(" Az aktuális beállítások a „Mentés\" gombbal menthetők.", -1),
162
- u("br", null, null, -1),
163
- d(" Az „Elnevezés\" mező csak a könnyebb azonosítás miatt van, megadása nem kötelező. ", -1)
164
- ]])) : c("", !0),
165
- V.value.length > 0 ? (h(), l("ul", w, [(h(!0), l(a, null, _(ve.value, (e) => (h(), l("li", {
166
- key: e.id,
167
- class: m(["filters-history__item", {
168
- "is-open": G(e.id),
169
- "is-default": e.isDefault
170
- }])
171
- }, [u("div", {
172
- class: "filters-history__item-header",
173
- role: "button",
174
- tabindex: "0",
175
- "aria-expanded": G(e.id),
176
- onClick: (t) => K(e.id),
177
- onKeydown: [S(C((t) => K(e.id), ["prevent"]), ["enter"]), S(C((t) => K(e.id), ["prevent"]), ["space"])]
178
- }, [
179
- u("i", { class: m(["fa-solid filters-history__item-chevron", G(e.id) ? "fa-chevron-down" : "fa-chevron-right"]) }, null, 2),
180
- u("span", E, [u("span", D, y(e.name), 1), e.name ? (h(), l("span", O, y(be(e.savedAt)), 1)) : c("", !0)]),
181
- u("div", {
182
- class: "filters-history__item-actions",
183
- onClick: r[2] ||= C(() => {}, ["stop"])
184
- }, [
185
- u("button", {
186
- type: "button",
187
- class: m(["c-indicator filters-history__item-btn filters-history__item-default", { active: e.isDefault }]),
188
- onClick: (t) => xe(e),
189
- "aria-label": e.isDefault ? "Alapértelmezett szűrő törlése" : "Alapértelmezett szűrő beállítása",
190
- title: e.isDefault ? "Alapértelmezett szűrő törlése" : "Alapértelmezett szűrő beállítása"
191
- }, [u("i", { class: m(["fa-star fix-icon-pos", e.isDefault ? "fa-solid" : "fa-regular"]) }, null, 2)], 10, k),
192
- u("button", {
193
- type: "button",
194
- class: "c-indicator filters-history__item-btn filters-history__item-load",
195
- "aria-label": "Betöltés",
196
- title: "Betöltés",
197
- onClick: (t) => he(e)
198
- }, [...r[9] ||= [u("i", { class: "fa-solid fa-check" }, null, -1)]], 8, A),
199
- $(e).length ? x((h(), l("span", {
200
- key: 0,
201
- class: "c-indicator",
202
- onClick: C((t) => K(e.id), ["stop"])
203
- }, [d(y($(e).length), 1)], 8, j)), [[i, `${$(e).length} szűrési feltétel`]]) : c("", !0),
204
- u("button", {
205
- type: "button",
206
- class: "c-indicator filters-history__item-btn filters-history__item-remove",
207
- "aria-label": "Törlés",
208
- title: "Törlés",
209
- onClick: (t) => Z(e)
210
- }, [...r[10] ||= [u("i", { class: "fa-solid fa-xmark" }, null, -1)]], 8, M)
211
- ])
212
- ], 40, T), G(e.id) ? (h(), l("div", N, [$(e).length ? (h(), l("div", P, [(h(!0), l(a, null, _($(e), (e, t) => (h(), l("span", {
213
- key: t,
214
- class: m(["c-chip", e.displayClass])
215
- }, y(e.text), 3))), 128))])) : (h(), l("p", F, "Nincs megjeleníthető szűrő."))])) : c("", !0)], 2))), 128))])) : c("", !0),
216
- V.value.length > 3 ? (h(), l("div", I, [
217
- r[11] ||= u("hr", { class: "separator my-1" }, null, -1),
218
- V.value.length ? (h(), l("a", {
219
- key: 0,
220
- class: "filters-history__clear-all px-2",
221
- onClick: r[3] ||= (e) => W.value = !0
222
- }, "Összes törlése")) : c("", !0),
223
- W.value ? (h(), s(n, {
224
- key: 1,
225
- title: "Mentett szűrők törlése",
226
- message: "Biztosan törlöd az összes mentett szűrőt?",
227
- "confirm-label": "Törlés",
228
- "cancel-label": "Mégse",
229
- type: "error",
230
- onConfirm: r[4] ||= (e) => ge(),
231
- onCancel: r[5] ||= (e) => W.value = !1
232
- })) : c("", !0)
233
- ])) : c("", !0)
234
- ])) : c("", !0)])]);
235
- };
236
- }
237
- });
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";
3
+ /* empty css */
4
+ //#region src/components/data-table/DataSort.vue
5
+ var t = e;
238
6
  //#endregion
239
- export { L as default };
7
+ export { t as default };
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components85.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
+ {"version":3,"file":"admins-components85.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 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 emitChange(v, 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\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=\"(v) => (sortBy = v)\"\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":""}
@@ -0,0 +1,60 @@
1
+ import { formatDate as e } from "./admins-components3.js";
2
+ //#region src/utils/filterDisplay.ts
3
+ function t(t, r, i) {
4
+ if (i == null || i === "") return "";
5
+ let a = t.find((e) => e.key === r);
6
+ if (a?.type === "dropdown" && a.options) {
7
+ let e = n(i);
8
+ if (Array.isArray(e)) return e.map((e) => {
9
+ let t = a.options?.find((t) => t.value === e);
10
+ return t ? t.label : String(e);
11
+ }).join(", ");
12
+ let t = a.options.find((t) => t.value === e);
13
+ if (t) return t.label;
14
+ }
15
+ if (a?.type === "checkbox") return i ? "Bekapcsolva" : "";
16
+ if (a?.type === "date" || a?.type === "datetime") {
17
+ if (typeof i == "object" && i) {
18
+ let t = i.local ?? i.utc ?? null;
19
+ if (t == null) return "";
20
+ let n = t instanceof Date ? t : new Date(t);
21
+ if (!isNaN(n.getTime())) return e(n, a.type === "datetime" ? "YYYY-MM-DD HH:mm" : "YYYY-MM-DD");
22
+ }
23
+ if (typeof i == "string" && i) {
24
+ let t = new Date(i);
25
+ if (!isNaN(t.getTime())) return e(t, a.type === "datetime" ? "YYYY-MM-DD HH:mm" : "YYYY-MM-DD");
26
+ }
27
+ }
28
+ if ((a?.type === "daterange" || a?.type === "datetimerange") && typeof i == "object") {
29
+ let t = a.type === "datetimerange" ? "YYYY-MM-DD HH:mm" : "YYYY-MM-DD";
30
+ return `${i.fromUtc ? e(new Date(i.fromUtc), t) : "…"} - ${i.toUtc ? e(new Date(i.toUtc), t) : "…"}`;
31
+ }
32
+ return typeof i == "object" ? JSON.stringify(i) : String(i);
33
+ }
34
+ function n(e) {
35
+ if (Array.isArray(e)) return e;
36
+ if (typeof e == "string") {
37
+ if (e.startsWith("[") && e.endsWith("]")) try {
38
+ let t = JSON.parse(e);
39
+ if (Array.isArray(t)) return t;
40
+ } catch {}
41
+ return e;
42
+ }
43
+ return e;
44
+ }
45
+ function r(e, n) {
46
+ let r = [];
47
+ for (let [i, a] of Object.entries(n)) {
48
+ let n = t(e, i, a);
49
+ if (!n) continue;
50
+ let o = e.find((e) => e.key === i), s = o?.label ?? i;
51
+ r.push({
52
+ key: i,
53
+ text: `${s}: ${n}`,
54
+ displayClass: o?.displayClass
55
+ });
56
+ }
57
+ return r;
58
+ }
59
+ //#endregion
60
+ export { r as buildFilterDisplay, t as displayFilterValue, n as parseDropdownValue };
@@ -0,0 +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'\n\nexport function displayFilterValue(items: FilterItem[], key: string, value: any): string {\n if (value === null || value === undefined || value === '') return ''\n\n const item = items.find((i) => i.key === key)\n\n if (item?.type === 'dropdown' && item.options) {\n const parsedValue = parseDropdownValue(value)\n\n if (Array.isArray(parsedValue)) {\n const labels = parsedValue.map((v) => {\n const opt = item.options?.find((o) => o.value === v)\n return opt ? opt.label : String(v)\n })\n return labels.join(', ')\n }\n\n const opt = item.options.find((o) => o.value === parsedValue)\n if (opt) return opt.label\n }\n if (item?.type === 'checkbox') {\n return value ? 'Bekapcsolva' : ''\n }\n\n if (item?.type === 'date' || item?.type === 'datetime') {\n if (typeof value === 'object' && value !== null) {\n const local: Date | string | null | undefined = value.local ?? value.utc ?? null\n if (local == null) return ''\n const d = local instanceof Date ? local : new Date(local)\n if (!isNaN(d.getTime())) {\n return formatDate(d, item.type === 'datetime' ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD')\n }\n }\n if (typeof value === 'string' && value) {\n const d = new Date(value)\n if (!isNaN(d.getTime())) {\n return formatDate(d, item.type === 'datetime' ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD')\n }\n }\n }\n\n if ((item?.type === 'daterange' || item?.type === 'datetimerange') && typeof value === 'object') {\n const showTime = item.type === 'datetimerange'\n const fmt = showTime ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD'\n const from = value.fromUtc ? formatDate(new Date(value.fromUtc), fmt) : '…'\n const to = value.toUtc ? formatDate(new Date(value.toUtc), fmt) : '…'\n return `${from} - ${to}`\n }\n\n if (typeof value === 'object') return JSON.stringify(value)\n\n return String(value)\n}\n\nexport function parseDropdownValue(value: any): unknown {\n if (Array.isArray(value)) {\n return value\n }\n\n if (typeof value === 'string') {\n if (value.startsWith('[') && value.endsWith(']')) {\n try {\n const parsed = JSON.parse(value)\n if (Array.isArray(parsed)) {\n return parsed\n }\n } catch {\n // If parsing fails, treat as string\n }\n }\n return value\n }\n\n return value\n}\n\nexport interface FilterDisplayPart {\n key: string\n text: string\n displayClass?: string\n}\n\nexport function buildFilterDisplay(\n items: FilterItem[],\n values: Record<string, any>,\n): FilterDisplayPart[] {\n const parts: FilterDisplayPart[] = []\n for (const [key, rawValue] of Object.entries(values)) {\n const v = displayFilterValue(items, key, rawValue)\n if (!v) continue\n const item = items.find((i) => i.key === key)\n const labelText = item?.label ?? key\n parts.push({ key, text: `${labelText}: ${v}`, displayClass: item?.displayClass })\n }\n\n return parts\n}\n\nexport function buildFilterValues(items: FilterItem[], values: Record<string, any>): string[] {\n return buildFilterDisplay(items, values).map((p) => p.text)\n}\n"],"mappings":";;AAGA,SAAgB,EAAmB,GAAqB,GAAa,GAAoB;CACvF,IAAI,KAAU,QAA+B,MAAU,IAAI,OAAO;CAElE,IAAM,IAAO,EAAM,MAAM,MAAM,EAAE,QAAQ,CAAG;CAE5C,IAAI,GAAM,SAAS,cAAc,EAAK,SAAS;EAC7C,IAAM,IAAc,EAAmB,CAAK;EAE5C,IAAI,MAAM,QAAQ,CAAW,GAK3B,OAJe,EAAY,KAAK,MAAM;GACpC,IAAM,IAAM,EAAK,SAAS,MAAM,MAAM,EAAE,UAAU,CAAC;GACnD,OAAO,IAAM,EAAI,QAAQ,OAAO,CAAC;EACnC,CACO,EAAO,KAAK,IAAI;EAGzB,IAAM,IAAM,EAAK,QAAQ,MAAM,MAAM,EAAE,UAAU,CAAW;EAC5D,IAAI,GAAK,OAAO,EAAI;CACtB;CACA,IAAI,GAAM,SAAS,YACjB,OAAO,IAAQ,gBAAgB;CAGjC,IAAI,GAAM,SAAS,UAAU,GAAM,SAAS,YAAY;EACtD,IAAI,OAAO,KAAU,YAAY,GAAgB;GAC/C,IAAM,IAA0C,EAAM,SAAS,EAAM,OAAO;GAC5E,IAAI,KAAS,MAAM,OAAO;GAC1B,IAAM,IAAI,aAAiB,OAAO,IAAQ,IAAI,KAAK,CAAK;GACxD,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,GACpB,OAAO,EAAW,GAAG,EAAK,SAAS,aAAa,qBAAqB,YAAY;EAErF;EACA,IAAI,OAAO,KAAU,YAAY,GAAO;GACtC,IAAM,IAAI,IAAI,KAAK,CAAK;GACxB,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,GACpB,OAAO,EAAW,GAAG,EAAK,SAAS,aAAa,qBAAqB,YAAY;EAErF;CACF;CAEA,KAAK,GAAM,SAAS,eAAe,GAAM,SAAS,oBAAoB,OAAO,KAAU,UAAU;EAE/F,IAAM,IADW,EAAK,SAAS,kBACR,qBAAqB;EAG5C,OAAO,GAFM,EAAM,UAAU,EAAW,IAAI,KAAK,EAAM,OAAO,GAAG,CAAG,IAAI,IAEzD,KADJ,EAAM,QAAQ,EAAW,IAAI,KAAK,EAAM,KAAK,GAAG,CAAG,IAAI;CAEpE;CAIA,OAFI,OAAO,KAAU,WAAiB,KAAK,UAAU,CAAK,IAEnD,OAAO,CAAK;AACrB;AAEA,SAAgB,EAAmB,GAAqB;CACtD,IAAI,MAAM,QAAQ,CAAK,GACrB,OAAO;CAGT,IAAI,OAAO,KAAU,UAAU;EAC7B,IAAI,EAAM,WAAW,GAAG,KAAK,EAAM,SAAS,GAAG,GAC7C,IAAI;GACF,IAAM,IAAS,KAAK,MAAM,CAAK;GAC/B,IAAI,MAAM,QAAQ,CAAM,GACtB,OAAO;EAEX,QAAQ,CAER;EAEF,OAAO;CACT;CAEA,OAAO;AACT;AAQA,SAAgB,EACd,GACA,GACqB;CACrB,IAAM,IAA6B,CAAC;CACpC,KAAK,IAAM,CAAC,GAAK,MAAa,OAAO,QAAQ,CAAM,GAAG;EACpD,IAAM,IAAI,EAAmB,GAAO,GAAK,CAAQ;EACjD,IAAI,CAAC,GAAG;EACR,IAAM,IAAO,EAAM,MAAM,MAAM,EAAE,QAAQ,CAAG,GACtC,IAAY,GAAM,SAAS;EACjC,EAAM,KAAK;GAAE;GAAK,MAAM,GAAG,EAAU,IAAI;GAAK,cAAc,GAAM;EAAa,CAAC;CAClF;CAEA,OAAO;AACT"}
@@ -1,7 +1,68 @@
1
- import './src/styles/components/data-table/filters-history.scss_vue_type_style_index_0_src_true_lang.css';
2
- import e from "./admins-components85.js";
3
- /* empty css */
4
- //#region src/components/data-table/FiltersHistory.vue
5
- var t = e;
1
+ import { getFullStorageKey as e } from "./admins-components78.js";
2
+ import { getUrlParam as t, removeUrlParam as n, setUrlParam as r } from "./admins-components79.js";
3
+ import { parseDropdownValue as i } from "./admins-components86.js";
4
+ //#region src/utils/dataFilters.ts
5
+ function a(e, t, n = !0) {
6
+ let r = o(e), i = Object.keys(r).length > 0, a = (i ? null : c(t))?.values ?? {}, s = {};
7
+ for (let t of e) {
8
+ if (t.type === "separator") continue;
9
+ let e;
10
+ if (t.key in r) e = r[t.key];
11
+ else if (i) continue;
12
+ else if (t.key in a) e = a[t.key];
13
+ else if (t.value !== void 0) e = t.value;
14
+ else continue;
15
+ if (e != null) if (n && t.transformer) {
16
+ let n = t.transformer(e);
17
+ n && Object.assign(s, n);
18
+ } else s[t.key] = e;
19
+ }
20
+ return s;
21
+ }
22
+ function o(e) {
23
+ let n = {};
24
+ for (let r of e) {
25
+ if (r.type === "separator") continue;
26
+ let e = t(r.key);
27
+ e && (n[r.key] = u(r.type, e, r.value));
28
+ }
29
+ return n;
30
+ }
31
+ function s(t) {
32
+ try {
33
+ let n = e("filters", t), r = JSON.parse(localStorage.getItem(n) ?? "[]");
34
+ return Array.isArray(r) ? r.filter((e) => e && typeof e == "object" && typeof e.id == "string" && e.values && typeof e.savedAt == "string") : [];
35
+ } catch {
36
+ return [];
37
+ }
38
+ }
39
+ function c(e) {
40
+ return s(e).find((e) => e.isDefault) ?? null;
41
+ }
42
+ function l(e) {
43
+ return Object.fromEntries(Object.entries(e).filter(([e, t]) => t !== null && t !== "" && t !== void 0));
44
+ }
45
+ function u(e, t, n) {
46
+ if (e === "number") {
47
+ let e = Number(t);
48
+ return isNaN(e) ? n ?? null : e;
49
+ }
50
+ return e === "date" || e === "datetime" ? { utc: t } : e === "daterange" || e === "datetimerange" ? d(t, n) : e === "dropdown" ? i(t) : e === "checkbox" ? t === "true" : t;
51
+ }
52
+ function d(e, t) {
53
+ try {
54
+ let t = JSON.parse(e);
55
+ return t && typeof t == "object" && "local" in t && t.local && (t.local = new Date(t.local)), t;
56
+ } catch {
57
+ return t ?? null;
58
+ }
59
+ }
60
+ function f(e, t) {
61
+ for (let i of e) {
62
+ if (i.type === "separator") continue;
63
+ let e = t[i.key];
64
+ e == null || e === "" ? n(i.key) : i.type === "date" || i.type === "datetime" ? r(i.key, e.utc) : typeof e == "object" ? r(i.key, JSON.stringify(e)) : r(i.key, String(e));
65
+ }
66
+ }
6
67
  //#endregion
7
- export { t as default };
68
+ export { l as filterEmptyValues, a as getDefaultFilters, c as getDefaultSavedFilter, o as getFilterUrlParams, s as getSavedFilters, f as writeFilterParams };
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components87.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":""}
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 { parseDropdownValue } from '@/utils/filterDisplay'\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\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 parseDropdownValue(raw)\n }\n if (type === 'checkbox') {\n return raw === 'true'\n }\n\n return raw\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 (typeof v === 'object') {\n setUrlParam(item.key, JSON.stringify(v))\n } else {\n setUrlParam(item.key, String(v))\n }\n }\n}\n"],"mappings":"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"}