admins-components 9.0.27 → 9.0.29

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 (322) hide show
  1. package/README.md +4 -22
  2. package/dist/admins-components.js +53 -52
  3. package/dist/admins-components100.js +79 -249
  4. package/dist/admins-components100.js.map +1 -1
  5. package/dist/admins-components101.js +112 -26
  6. package/dist/admins-components101.js.map +1 -1
  7. package/dist/admins-components102.js +45 -26
  8. package/dist/admins-components102.js.map +1 -1
  9. package/dist/admins-components103.js +102 -168
  10. package/dist/admins-components103.js.map +1 -1
  11. package/dist/admins-components104.js +17 -65
  12. package/dist/admins-components104.js.map +1 -1
  13. package/dist/admins-components105.js +6 -66
  14. package/dist/admins-components105.js.map +1 -1
  15. package/dist/admins-components106.js +247 -25
  16. package/dist/admins-components106.js.map +1 -1
  17. package/dist/admins-components107.js +27 -16
  18. package/dist/admins-components107.js.map +1 -1
  19. package/dist/admins-components108.js +26 -25
  20. package/dist/admins-components108.js.map +1 -1
  21. package/dist/admins-components109.js +171 -8
  22. package/dist/admins-components109.js.map +1 -1
  23. package/dist/admins-components110.js +67 -3
  24. package/dist/admins-components110.js.map +1 -1
  25. package/dist/admins-components111.js +67 -3
  26. package/dist/admins-components111.js.map +1 -1
  27. package/dist/admins-components112.js +30 -3
  28. package/dist/admins-components112.js.map +1 -1
  29. package/dist/admins-components113.js +15 -20
  30. package/dist/admins-components113.js.map +1 -1
  31. package/dist/admins-components114.js +27 -14
  32. package/dist/admins-components114.js.map +1 -1
  33. package/dist/admins-components115.js +8 -7
  34. package/dist/admins-components115.js.map +1 -1
  35. package/dist/admins-components116.js +4 -13
  36. package/dist/admins-components116.js.map +1 -1
  37. package/dist/admins-components117.js +3 -26
  38. package/dist/admins-components117.js.map +1 -1
  39. package/dist/admins-components118.js +3 -83
  40. package/dist/admins-components118.js.map +1 -1
  41. package/dist/admins-components119.js +19 -9
  42. package/dist/admins-components119.js.map +1 -1
  43. package/dist/admins-components120.js +14 -5
  44. package/dist/admins-components120.js.map +1 -1
  45. package/dist/admins-components121.js +7 -7
  46. package/dist/admins-components121.js.map +1 -1
  47. package/dist/admins-components122.js +12 -6
  48. package/dist/admins-components122.js.map +1 -1
  49. package/dist/admins-components123.js +25 -5
  50. package/dist/admins-components123.js.map +1 -1
  51. package/dist/admins-components124.js +82 -14
  52. package/dist/admins-components124.js.map +1 -1
  53. package/dist/admins-components125.js +10 -12
  54. package/dist/admins-components125.js.map +1 -1
  55. package/dist/admins-components126.js +5 -30
  56. package/dist/admins-components126.js.map +1 -1
  57. package/dist/admins-components127.js +7 -3
  58. package/dist/admins-components127.js.map +1 -1
  59. package/dist/admins-components128.js +7 -29
  60. package/dist/admins-components128.js.map +1 -1
  61. package/dist/admins-components129.js +3 -2
  62. package/dist/admins-components129.js.map +1 -1
  63. package/dist/admins-components130.js +12 -2
  64. package/dist/admins-components130.js.map +1 -1
  65. package/dist/admins-components131.js +12 -7
  66. package/dist/admins-components131.js.map +1 -1
  67. package/dist/admins-components132.js +30 -74
  68. package/dist/admins-components132.js.map +1 -1
  69. package/dist/admins-components133.js +4 -29
  70. package/dist/admins-components133.js.map +1 -1
  71. package/dist/admins-components134.js +27 -57
  72. package/dist/admins-components134.js.map +1 -1
  73. package/dist/admins-components135.js +5 -24
  74. package/dist/admins-components135.js.map +1 -1
  75. package/dist/admins-components136.js +5 -50
  76. package/dist/admins-components136.js.map +1 -1
  77. package/dist/admins-components137.js +7 -30
  78. package/dist/admins-components137.js.map +1 -1
  79. package/dist/admins-components138.js +74 -3
  80. package/dist/admins-components138.js.map +1 -1
  81. package/dist/admins-components139.js +27 -177
  82. package/dist/admins-components139.js.map +1 -1
  83. package/dist/admins-components140.js +58 -45
  84. package/dist/admins-components140.js.map +1 -1
  85. package/dist/admins-components141.js +23 -36
  86. package/dist/admins-components141.js.map +1 -1
  87. package/dist/admins-components142.js +46 -42
  88. package/dist/admins-components142.js.map +1 -1
  89. package/dist/admins-components143.js +28 -138
  90. package/dist/admins-components143.js.map +1 -1
  91. package/dist/admins-components144.js +3 -58
  92. package/dist/admins-components144.js.map +1 -1
  93. package/dist/admins-components145.js +178 -6
  94. package/dist/admins-components145.js.map +1 -1
  95. package/dist/admins-components146.js +45 -5
  96. package/dist/admins-components146.js.map +1 -1
  97. package/dist/admins-components147.js +37 -76
  98. package/dist/admins-components147.js.map +1 -1
  99. package/dist/admins-components148.js +45 -28
  100. package/dist/admins-components148.js.map +1 -1
  101. package/dist/admins-components149.js +129 -1919
  102. package/dist/admins-components149.js.map +1 -1
  103. package/dist/admins-components15.js +8 -42
  104. package/dist/admins-components15.js.map +1 -1
  105. package/dist/admins-components150.js +54 -24807
  106. package/dist/admins-components150.js.map +1 -1
  107. package/dist/admins-components151.js +6 -8
  108. package/dist/admins-components151.js.map +1 -1
  109. package/dist/admins-components152.js +6 -7
  110. package/dist/admins-components152.js.map +1 -0
  111. package/dist/admins-components153.js +76 -142
  112. package/dist/admins-components153.js.map +1 -1
  113. package/dist/admins-components154.js +28 -8
  114. package/dist/admins-components154.js.map +1 -1
  115. package/dist/admins-components155.js +1930 -8
  116. package/dist/admins-components155.js.map +1 -1
  117. package/dist/admins-components156.js +24812 -0
  118. package/dist/admins-components156.js.map +1 -0
  119. package/dist/admins-components157.js +8 -167
  120. package/dist/admins-components157.js.map +1 -1
  121. package/dist/admins-components158.js +7 -51
  122. package/dist/admins-components159.js +141 -8
  123. package/dist/admins-components159.js.map +1 -1
  124. package/dist/admins-components16.js +89 -4
  125. package/dist/admins-components16.js.map +1 -1
  126. package/dist/admins-components160.js +8 -49
  127. package/dist/admins-components160.js.map +1 -1
  128. package/dist/admins-components161.js +9 -6
  129. package/dist/admins-components161.js.map +1 -1
  130. package/dist/admins-components163.js +160 -50
  131. package/dist/admins-components163.js.map +1 -1
  132. package/dist/admins-components164.js +34 -42
  133. package/dist/admins-components164.js.map +1 -1
  134. package/dist/admins-components165.js +3 -3
  135. package/dist/admins-components165.js.map +1 -1
  136. package/dist/admins-components166.js +18 -20
  137. package/dist/admins-components166.js.map +1 -1
  138. package/dist/admins-components167.js +6 -9
  139. package/dist/admins-components167.js.map +1 -1
  140. package/dist/{admins-components162.js → admins-components168.js} +3 -3
  141. package/dist/{admins-components162.js.map → admins-components168.js.map} +1 -1
  142. package/dist/admins-components169.js +51 -51
  143. package/dist/admins-components169.js.map +1 -1
  144. package/dist/admins-components17.js +4 -94
  145. package/dist/admins-components17.js.map +1 -1
  146. package/dist/admins-components170.js +60 -0
  147. package/dist/admins-components170.js.map +1 -0
  148. package/dist/admins-components171.js +10 -0
  149. package/dist/admins-components171.js.map +1 -0
  150. package/dist/admins-components172.js +53 -0
  151. package/dist/admins-components172.js.map +1 -0
  152. package/dist/admins-components173.js +10 -0
  153. package/dist/admins-components173.js.map +1 -0
  154. package/dist/admins-components175.js +59 -0
  155. package/dist/admins-components175.js.map +1 -0
  156. package/dist/admins-components18.js +37 -239
  157. package/dist/admins-components18.js.map +1 -1
  158. package/dist/admins-components19.js +1 -2
  159. package/dist/admins-components19.js.map +1 -1
  160. package/dist/admins-components20.js +91 -179
  161. package/dist/admins-components20.js.map +1 -1
  162. package/dist/admins-components21.js +245 -0
  163. package/dist/admins-components21.js.map +1 -0
  164. package/dist/admins-components22.js +3 -4
  165. package/dist/admins-components22.js.map +1 -1
  166. package/dist/admins-components23.js +172 -68
  167. package/dist/admins-components23.js.map +1 -1
  168. package/dist/admins-components25.js +6 -58
  169. package/dist/admins-components25.js.map +1 -1
  170. package/dist/admins-components26.js +79 -0
  171. package/dist/{admins-components24.js.map → admins-components26.js.map} +1 -1
  172. package/dist/admins-components27.js +3 -3
  173. package/dist/admins-components27.js.map +1 -1
  174. package/dist/admins-components28.js +50 -64
  175. package/dist/admins-components28.js.map +1 -1
  176. package/dist/admins-components29.js +75 -0
  177. package/dist/admins-components29.js.map +1 -0
  178. package/dist/admins-components31.js +6 -39
  179. package/dist/admins-components31.js.map +1 -1
  180. package/dist/admins-components32.js +66 -0
  181. package/dist/admins-components32.js.map +1 -0
  182. package/dist/admins-components34.js +6 -36
  183. package/dist/admins-components34.js.map +1 -1
  184. package/dist/admins-components35.js +39 -4
  185. package/dist/admins-components35.js.map +1 -1
  186. package/dist/{admins-components33.js → admins-components37.js} +1 -1
  187. package/dist/{admins-components33.js.map → admins-components37.js.map} +1 -1
  188. package/dist/admins-components38.js +36 -6
  189. package/dist/admins-components38.js.map +1 -1
  190. package/dist/admins-components39.js +4 -146
  191. package/dist/admins-components39.js.map +1 -1
  192. package/dist/{admins-components36.js.map → admins-components40.js.map} +1 -1
  193. package/dist/admins-components42.js +6 -124
  194. package/dist/admins-components42.js.map +1 -1
  195. package/dist/admins-components43.js +146 -4
  196. package/dist/admins-components43.js.map +1 -1
  197. package/dist/admins-components45.js +4 -2
  198. package/dist/admins-components45.js.map +1 -1
  199. package/dist/admins-components46.js +120 -15
  200. package/dist/admins-components46.js.map +1 -1
  201. package/dist/admins-components47.js +5 -0
  202. package/dist/admins-components47.js.map +1 -0
  203. package/dist/admins-components48.js +179 -6
  204. package/dist/admins-components48.js.map +1 -1
  205. package/dist/admins-components49.js +4 -54
  206. package/dist/admins-components49.js.map +1 -1
  207. package/dist/admins-components50.js +15 -89
  208. package/dist/admins-components50.js.map +1 -1
  209. package/dist/admins-components52.js +2 -2
  210. package/dist/admins-components52.js.map +1 -1
  211. package/dist/admins-components53.js +52 -23
  212. package/dist/admins-components53.js.map +1 -1
  213. package/dist/admins-components54.js +93 -9
  214. package/dist/admins-components54.js.map +1 -1
  215. package/dist/admins-components56.js +6 -73
  216. package/dist/admins-components56.js.map +1 -1
  217. package/dist/admins-components57.js +24 -65
  218. package/dist/admins-components57.js.map +1 -1
  219. package/dist/admins-components58.js +9 -4
  220. package/dist/admins-components58.js.map +1 -1
  221. package/dist/admins-components59.js +19 -138
  222. package/dist/admins-components59.js.map +1 -1
  223. package/dist/admins-components60.js +74 -0
  224. package/dist/admins-components60.js.map +1 -0
  225. package/dist/admins-components61.js +66 -7
  226. package/dist/admins-components61.js.map +1 -1
  227. package/dist/admins-components62.js +4 -170
  228. package/dist/admins-components62.js.map +1 -1
  229. package/dist/admins-components63.js +140 -0
  230. package/dist/admins-components63.js.map +1 -0
  231. package/dist/admins-components65.js +7 -7
  232. package/dist/admins-components65.js.map +1 -1
  233. package/dist/admins-components66.js +155 -259
  234. package/dist/admins-components66.js.map +1 -1
  235. package/dist/admins-components68.js +3 -2
  236. package/dist/admins-components68.js.map +1 -1
  237. package/dist/admins-components69.js +6 -119
  238. package/dist/admins-components69.js.map +1 -1
  239. package/dist/admins-components70.js +280 -0
  240. package/dist/admins-components70.js.map +1 -0
  241. package/dist/admins-components72.js +6 -59
  242. package/dist/admins-components72.js.map +1 -1
  243. package/dist/admins-components73.js +110 -207
  244. package/dist/admins-components73.js.map +1 -1
  245. package/dist/admins-components75.js +2 -2
  246. package/dist/admins-components75.js.map +1 -1
  247. package/dist/admins-components76.js +58 -7
  248. package/dist/admins-components76.js.map +1 -1
  249. package/dist/admins-components77.js +220 -51
  250. package/dist/admins-components77.js.map +1 -1
  251. package/dist/admins-components79.js +7 -0
  252. package/dist/admins-components79.js.map +1 -0
  253. package/dist/admins-components80.js +52 -6
  254. package/dist/admins-components80.js.map +1 -1
  255. package/dist/admins-components81.js +246 -32
  256. package/dist/admins-components81.js.map +1 -1
  257. package/dist/admins-components83.js +2 -2
  258. package/dist/admins-components83.js.map +1 -1
  259. package/dist/admins-components84.js +31 -192
  260. package/dist/admins-components84.js.map +1 -1
  261. package/dist/admins-components86.js +2 -2
  262. package/dist/admins-components86.js.map +1 -1
  263. package/dist/admins-components87.js +195 -184
  264. package/dist/admins-components87.js.map +1 -1
  265. package/dist/admins-components89.js +2 -2
  266. package/dist/admins-components89.js.map +1 -1
  267. package/dist/admins-components90.js +16 -3
  268. package/dist/admins-components90.js.map +1 -1
  269. package/dist/admins-components91.js +77 -16
  270. package/dist/admins-components91.js.map +1 -1
  271. package/dist/admins-components93.js +6 -52
  272. package/dist/admins-components93.js.map +1 -1
  273. package/dist/admins-components94.js +195 -81
  274. package/dist/admins-components94.js.map +1 -1
  275. package/dist/admins-components96.js +6 -47
  276. package/dist/admins-components96.js.map +1 -1
  277. package/dist/admins-components97.js +3 -106
  278. package/dist/admins-components97.js.map +1 -1
  279. package/dist/admins-components98.js +3 -20
  280. package/dist/admins-components98.js.map +1 -1
  281. package/dist/admins-components99.js +51 -6
  282. package/dist/admins-components99.js.map +1 -1
  283. package/dist/main.css +1 -1
  284. package/dist/main.css.map +1 -1
  285. package/dist/src/components/Checkbox.vue.d.ts +11 -1
  286. package/dist/src/components/TextInput.vue.d.ts +33 -0
  287. package/dist/src/components/data-table/DataFilters.vue.d.ts +7 -14
  288. package/dist/src/components/data-table/DataList.vue.d.ts +10 -7
  289. package/dist/src/components/data-table/DataSearch.vue.d.ts +26 -0
  290. package/dist/src/composables/useSwipeToClose.d.ts +50 -0
  291. package/dist/src/index.d.ts +5 -1
  292. package/dist/src/styles/components/data-table/data-cards.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  293. package/dist/src/styles/components/data-table/data-list.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  294. package/dist/src/styles/components/data-table/data-paginator.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  295. package/dist/src/styles/components/data-table/data-search.scss_vue_type_style_index_0_src_true_lang.css +1 -0
  296. package/dist/src/styles/components/data-table/data-table.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  297. package/dist/src/styles/components/dropdown-select.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  298. package/dist/src/styles/components/image-picker.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  299. package/dist/src/styles/components/sidebar.scss_vue_type_style_index_0_src_true_lang.css +1 -1
  300. package/dist/src/types/data-list.d.ts +0 -1
  301. package/package.json +1 -1
  302. package/dist/admins-components158.js.map +0 -1
  303. package/dist/admins-components24.js +0 -7
  304. package/dist/admins-components30.js +0 -7
  305. package/dist/admins-components30.js.map +0 -1
  306. package/dist/admins-components41.js +0 -7
  307. package/dist/admins-components41.js.map +0 -1
  308. package/dist/admins-components44.js +0 -180
  309. package/dist/admins-components44.js.map +0 -1
  310. package/dist/admins-components55.js +0 -20
  311. package/dist/admins-components55.js.map +0 -1
  312. package/dist/admins-components64.js +0 -8
  313. package/dist/admins-components64.js.map +0 -1
  314. package/dist/admins-components71.js +0 -7
  315. package/dist/admins-components71.js.map +0 -1
  316. package/dist/admins-components78.js +0 -276
  317. package/dist/admins-components78.js.map +0 -1
  318. package/dist/admins-components92.js +0 -4
  319. package/dist/admins-components92.js.map +0 -1
  320. package/dist/admins-components95.js +0 -114
  321. package/dist/admins-components95.js.map +0 -1
  322. /package/dist/{admins-components36.js → admins-components40.js} +0 -0
@@ -1,53 +1,222 @@
1
- import { parseDropdownValue as e } from "./admins-components72.js";
2
- //#region src/utils/dataFilters.ts
3
- function t(e) {
4
- let t = new URLSearchParams(window.location.search), n = {};
5
- for (let r of e) {
6
- if (r.type === "separator") continue;
7
- let e = window.location.search ? t.get(r.key) : null;
8
- n[r.key] = e === null ? r.value ?? null : i(r.type, e, r.value);
1
+ import { formatDate as e } from "./admins-components3.js";
2
+ import t from "./admins-components6.js";
3
+ import n from "./admins-components39.js";
4
+ import { buildFilterDisplay as r } from "./admins-components76.js";
5
+ import { Fragment as i, computed as a, createBlock as o, createCommentVNode as s, createElementBlock as c, createElementVNode as l, createTextVNode as u, createVNode as ee, defineComponent as d, nextTick as f, normalizeClass as p, onMounted as m, openBlock as h, ref as g, renderList as _, resolveDirective as v, toDisplayString as y, vModelText as b, watch as x, withDirectives as S, withKeys as C, withModifiers as w } from "vue";
6
+ //#region src/components/data-table/FiltersHistory.vue?vue&type=script&setup=true&lang.ts
7
+ var te = { class: "ac-component" }, ne = { class: "filters-history" }, re = ["aria-expanded"], ie = {
8
+ key: 0,
9
+ class: "c-indicator"
10
+ }, ae = { key: 1 }, oe = {
11
+ key: 0,
12
+ class: "filters-history__panel c-scroll"
13
+ }, se = { class: "filters-history__save-row" }, ce = {
14
+ key: 0,
15
+ class: "filters-history__hint"
16
+ }, le = {
17
+ key: 1,
18
+ class: "filters-history__hint"
19
+ }, ue = {
20
+ key: 2,
21
+ class: "filters-history__list"
22
+ }, de = [
23
+ "aria-expanded",
24
+ "onClick",
25
+ "onKeydown"
26
+ ], fe = { class: "filters-history__item-header-text" }, T = { class: "filters-history__item-date" }, E = {
27
+ key: 0,
28
+ class: "filters-history__item-name"
29
+ }, D = ["onClick"], O = ["onClick"], k = ["onClick"], A = {
30
+ key: 0,
31
+ class: "filters-history__item-content"
32
+ }, j = {
33
+ key: 0,
34
+ class: "filters-history__item-body"
35
+ }, M = {
36
+ key: 1,
37
+ class: "filters-history__item-empty"
38
+ }, N = { key: 3 }, P = 50, F = 7, I = /* @__PURE__ */ d({
39
+ __name: "FiltersHistory",
40
+ props: {
41
+ items: {},
42
+ values: {},
43
+ storageKey: {}
44
+ },
45
+ emits: ["load", "change"],
46
+ setup(d, { emit: I }) {
47
+ let L = d, R = a(() => `data-filters-${L.storageKey}`), z = I, B = g(!1), V = g([]), H = g(""), U = g(/* @__PURE__ */ new Set()), W = g(!1);
48
+ function G(e) {
49
+ return U.value.has(e);
50
+ }
51
+ function K(e) {
52
+ let t = new Set(U.value);
53
+ t.has(e) ? t.delete(e) : t.add(e), U.value = t;
54
+ }
55
+ function pe() {
56
+ try {
57
+ let e = localStorage.getItem(R.value);
58
+ if (!e) {
59
+ V.value = [];
60
+ return;
61
+ }
62
+ let t = JSON.parse(e);
63
+ Array.isArray(t) ? V.value = t.filter((e) => e && typeof e == "object" && typeof e.id == "string" && e.values && typeof e.savedAt == "string") : V.value = [];
64
+ } catch {
65
+ V.value = [];
66
+ }
67
+ }
68
+ function q() {
69
+ try {
70
+ localStorage.setItem(R.value, JSON.stringify(V.value));
71
+ } catch {}
72
+ }
73
+ m(pe);
74
+ let J = a(() => Object.values(L.values).some((e) => e !== null && e !== "" && e !== void 0));
75
+ function me() {
76
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
77
+ }
78
+ x(() => [L.values, H.value], () => {
79
+ Y.value &&= !1;
80
+ }, { deep: !0 });
81
+ let Y = g(!1);
82
+ function X() {
83
+ if (!J.value) return;
84
+ let e = H.value.trim();
85
+ V.value = [{
86
+ id: me(),
87
+ savedAt: (/* @__PURE__ */ new Date()).toISOString(),
88
+ name: e || void 0,
89
+ values: { ...L.values }
90
+ }, ...V.value].slice(0, P), H.value = "", q(), f(() => {
91
+ Y.value = !0;
92
+ });
93
+ }
94
+ function he(e) {
95
+ z("load", { ...e.values }), z("change", { ...e.values });
96
+ }
97
+ function Z(e) {
98
+ if (V.value = V.value.filter((t) => t.id !== e.id), U.value.has(e.id)) {
99
+ let t = new Set(U.value);
100
+ t.delete(e.id), U.value = t;
101
+ }
102
+ q();
103
+ }
104
+ function ge() {
105
+ V.value = [], U.value = /* @__PURE__ */ new Set(), q(), W.value = !1;
106
+ }
107
+ function Q(e) {
108
+ return r(L.items, e.values);
109
+ }
110
+ let _e = a(() => {
111
+ let e = /* @__PURE__ */ new Map();
112
+ for (let t of V.value) e.set(t.id, Q(t));
113
+ return e;
114
+ });
115
+ function $(e) {
116
+ return _e.value.get(e.id) ?? Q(e);
117
+ }
118
+ let ve = a(() => V.value.length >= P - F);
119
+ function ye(t) {
120
+ let n = new Date(t);
121
+ return isNaN(n.getTime()) ? t : e(n, "YYYY-MM-DD HH:mm");
122
+ }
123
+ return (e, r) => {
124
+ let a = v("tooltip");
125
+ return h(), c("div", te, [l("div", ne, [l("button", {
126
+ type: "button",
127
+ class: p(["filters-history__toggle", { "is-open": B.value }]),
128
+ "aria-expanded": B.value,
129
+ onClick: r[0] ||= (e) => B.value = !B.value
130
+ }, [
131
+ r[6] ||= l("i", { class: "fa-solid fa-sliders filters-history__toggle-icon" }, null, -1),
132
+ r[7] ||= l("span", { class: "filters-history__toggle-label" }, "Mentett szűrők", -1),
133
+ V.value.length ? (h(), c("span", ie, y(V.value.length), 1)) : s("", !0),
134
+ ve.value ? S((h(), c("span", ae, [u("/ " + y(P))])), [[a, `Maximum ${P} szűrő menthető`]]) : s("", !0),
135
+ l("i", { class: p(["fa-solid filters-history__chevron", B.value ? "fa-chevron-up" : "fa-chevron-down"]) }, null, 2)
136
+ ], 10, re), B.value ? (h(), c("div", oe, [
137
+ l("div", se, [S(l("input", {
138
+ "onUpdate:modelValue": r[1] ||= (e) => H.value = e,
139
+ type: "text",
140
+ class: "c-input-row c-input-row--sm",
141
+ placeholder: "Elnevezés",
142
+ onKeydown: C(X, ["enter"])
143
+ }, null, 544), [[b, H.value]]), ee(t, {
144
+ icon: "fa-solid fa-bookmark",
145
+ label: "Mentés",
146
+ size: "small",
147
+ type: "info",
148
+ disabled: !J.value || Y.value,
149
+ onClick: X
150
+ }, null, 8, ["disabled"])]),
151
+ !J.value && V.value.length === 0 ? (h(), c("p", ce, " Nincs aktív szűrő. Adj meg értékeket a mentéshez. ")) : V.value.length === 0 ? (h(), c("p", le, [...r[8] ||= [
152
+ u(" Még nincs mentett szűrő.", -1),
153
+ l("br", null, null, -1),
154
+ u(" Az aktuális beállítások a „Mentés\" gombbal menthetők.", -1),
155
+ l("br", null, null, -1),
156
+ u(" Az „Elnevezés\" mező csak a könnyebb azonosítás miatt van, megadása nem kötelező. ", -1)
157
+ ]])) : s("", !0),
158
+ V.value.length > 0 ? (h(), c("ul", ue, [(h(!0), c(i, null, _(V.value, (e) => (h(), c("li", {
159
+ key: e.id,
160
+ class: p(["filters-history__item", { "is-open": G(e.id) }])
161
+ }, [l("div", {
162
+ class: p(["filters-history__item-header", { "is-open": G(e.id) }]),
163
+ role: "button",
164
+ tabindex: "0",
165
+ "aria-expanded": G(e.id),
166
+ onClick: (t) => K(e.id),
167
+ onKeydown: [C(w((t) => K(e.id), ["prevent"]), ["enter"]), C(w((t) => K(e.id), ["prevent"]), ["space"])]
168
+ }, [
169
+ l("i", { class: p(["fa-solid filters-history__item-chevron", G(e.id) ? "fa-chevron-down" : "fa-chevron-right"]) }, null, 2),
170
+ l("span", fe, [l("span", T, y(ye(e.savedAt)), 1), e.name ? (h(), c("span", E, y(e.name), 1)) : s("", !0)]),
171
+ l("div", {
172
+ class: "filters-history__item-actions",
173
+ onClick: r[2] ||= w(() => {}, ["stop"])
174
+ }, [
175
+ l("button", {
176
+ type: "button",
177
+ class: "c-indicator filters-history__item-btn filters-history__item-load",
178
+ "aria-label": "Betöltés",
179
+ title: "Betöltés",
180
+ onClick: (t) => he(e)
181
+ }, [...r[9] ||= [l("i", { class: "fa-solid fa-check" }, null, -1)]], 8, D),
182
+ $(e).length ? S((h(), c("span", {
183
+ key: 0,
184
+ class: "c-indicator",
185
+ onClick: w((t) => K(e.id), ["stop"])
186
+ }, [u(y($(e).length), 1)], 8, O)), [[a, `${$(e).length} szűrési feltétel`]]) : s("", !0),
187
+ l("button", {
188
+ type: "button",
189
+ class: "c-indicator filters-history__item-btn filters-history__item-remove",
190
+ "aria-label": "Törlés",
191
+ title: "Törlés",
192
+ onClick: (t) => Z(e)
193
+ }, [...r[10] ||= [l("i", { class: "fa-solid fa-xmark" }, null, -1)]], 8, k)
194
+ ])
195
+ ], 42, de), G(e.id) ? (h(), c("div", A, [$(e).length ? (h(), c("div", j, [(h(!0), c(i, null, _($(e), (e, t) => (h(), c("span", {
196
+ key: t,
197
+ class: p(["c-chip", e.displayClass])
198
+ }, y(e.text), 3))), 128))])) : (h(), c("p", M, "Nincs megjeleníthető szűrő."))])) : s("", !0)], 2))), 128))])) : s("", !0),
199
+ V.value.length > 3 ? (h(), c("div", N, [
200
+ r[11] ||= l("hr", { class: "separator my-1" }, null, -1),
201
+ V.value.length ? (h(), c("a", {
202
+ key: 0,
203
+ class: "filters-history__clear-all px-2",
204
+ onClick: r[3] ||= (e) => W.value = !0
205
+ }, "Összes törlése")) : s("", !0),
206
+ W.value ? (h(), o(n, {
207
+ key: 1,
208
+ title: "Mentett szűrők törlése",
209
+ message: "Biztosan törlöd az összes mentett szűrőt?",
210
+ "confirm-label": "Törlés",
211
+ "cancel-label": "Mégse",
212
+ type: "error",
213
+ onConfirm: r[4] ||= (e) => ge(),
214
+ onCancel: r[5] ||= (e) => W.value = !1
215
+ })) : s("", !0)
216
+ ])) : s("", !0)
217
+ ])) : s("", !0)])]);
218
+ };
9
219
  }
10
- return n;
11
- }
12
- function n(e) {
13
- let n = t(e) ?? {}, i = {};
14
- for (let t of e) {
15
- if (t.type === "separator") continue;
16
- let e = n[t.key];
17
- if (t.transformer) {
18
- let n = t.transformer(e);
19
- n && Object.assign(i, n);
20
- } else i[t.key] = e;
21
- }
22
- return r(i);
23
- }
24
- function r(e) {
25
- return Object.fromEntries(Object.entries(e).filter(([e, t]) => t !== null && t !== "" && t !== void 0));
26
- }
27
- function i(t, n, r) {
28
- if (t === "number") {
29
- let e = Number(n);
30
- return isNaN(e) ? r ?? null : e;
31
- }
32
- return t === "date" || t === "datetime" ? { utc: n } : t === "daterange" || t === "datetimerange" ? a(n, r) : t === "dropdown" ? e(n) : t === "checkbox" ? n === "true" : n;
33
- }
34
- function a(e, t) {
35
- try {
36
- let t = JSON.parse(e);
37
- return t && typeof t == "object" && "local" in t && t.local && (t.local = new Date(t.local)), t;
38
- } catch {
39
- return t ?? null;
40
- }
41
- }
42
- function o(e, t) {
43
- let n = new URLSearchParams(window.location.search);
44
- for (let r of e) {
45
- if (r.type === "separator") continue;
46
- let e = t[r.key];
47
- e == null || e === "" ? n.delete(r.key) : r.type === "date" || r.type === "datetime" ? n.set(r.key, e.utc) : typeof e == "object" ? n.set(r.key, JSON.stringify(e)) : n.set(r.key, String(e));
48
- }
49
- let r = n.toString(), i = window.location.pathname + (r ? `?${r}` : "");
50
- window.history.replaceState(null, "", i);
51
- }
220
+ });
52
221
  //#endregion
53
- export { r as filterEmptyValues, n as getDefaultFilters, t as getFilterParams, o as writeFilterParams };
222
+ export { I as default };
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components77.js","names":[],"sources":["../src/utils/dataFilters.ts"],"sourcesContent":["import type { FilterItem } from '@/components/data-table/DataFilters.vue'\nimport { parseDropdownValue } from '@/utils/filterDisplay'\n\nexport function getFilterParams(items: FilterItem[]): Record<string, unknown> | null {\n const params = new URLSearchParams(window.location.search)\n const result: Record<string, unknown> = {}\n\n for (const item of items) {\n if (item.type === 'separator') continue\n\n const raw = window.location.search ? params.get(item.key) : null\n result[item.key] =\n raw === null ? (item.value ?? null) : parseFilterValue(item.type, raw, item.value)\n }\n return result\n}\n\nexport function getDefaultFilters(items: FilterItem[]): Record<string, unknown> {\n const raw = getFilterParams(items) ?? {}\n const result: Record<string, unknown> = {}\n\n for (const item of items) {\n if (item.type === 'separator') continue\n const val = raw[item.key]\n\n if (item.transformer) {\n const t = item.transformer(val)\n if (t) Object.assign(result, t)\n } else {\n result[item.key] = val\n }\n }\n\n return filterEmptyValues(result)\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\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 const params = new URLSearchParams(window.location.search)\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 params.delete(item.key)\n } else if (item.type === 'date' || item.type === 'datetime') {\n params.set(item.key, (v as { utc: string }).utc)\n } else if (typeof v === 'object') {\n params.set(item.key, JSON.stringify(v))\n } else {\n params.set(item.key, String(v))\n }\n }\n const qs = params.toString()\n const url = window.location.pathname + (qs ? `?${qs}` : '')\n window.history.replaceState(null, '', url)\n}\n"],"mappings":";;AAGA,SAAgB,EAAgB,GAAqD;CACnF,IAAM,IAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM,GACnD,IAAkC,CAAC;CAEzC,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAI,EAAK,SAAS,aAAa;EAE/B,IAAM,IAAM,OAAO,SAAS,SAAS,EAAO,IAAI,EAAK,GAAG,IAAI;EAC5D,EAAO,EAAK,OACV,MAAQ,OAAQ,EAAK,SAAS,OAAQ,EAAiB,EAAK,MAAM,GAAK,EAAK,KAAK;CACrF;CACA,OAAO;AACT;AAEA,SAAgB,EAAkB,GAA8C;CAC9E,IAAM,IAAM,EAAgB,CAAK,KAAK,CAAC,GACjC,IAAkC,CAAC;CAEzC,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAI,EAAK,SAAS,aAAa;EAC/B,IAAM,IAAM,EAAI,EAAK;EAErB,IAAI,EAAK,aAAa;GACpB,IAAM,IAAI,EAAK,YAAY,CAAG;GAC9B,AAAI,KAAG,OAAO,OAAO,GAAQ,CAAC;EAChC,OACE,EAAO,EAAK,OAAO;CAEvB;CAEA,OAAO,EAAkB,CAAM;AACjC;AAEA,SAAgB,EAAkB,GAAmD;CACnF,OAAO,OAAO,YAEZ,OAAO,QAAQ,CAAO,EAAE,QAAQ,CAAC,GAAG,OAAS,MAAQ,QAAQ,MAAQ,MAAM,MAAQ,KAAA,CAAS,CAC9F;AACF;AAGA,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,EAAmB,CAAG,IAE3B,MAAS,aACJ,MAAQ,SAGV;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,IAAM,IAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;CACzD,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAI,EAAK,SAAS,aAAa;EAC/B,IAAM,IAAI,EAAK,EAAK;EACpB,AAAI,KAAM,QAA2B,MAAM,KACzC,EAAO,OAAO,EAAK,GAAG,IACb,EAAK,SAAS,UAAU,EAAK,SAAS,aAC/C,EAAO,IAAI,EAAK,KAAM,EAAsB,GAAG,IACtC,OAAO,KAAM,WACtB,EAAO,IAAI,EAAK,KAAK,KAAK,UAAU,CAAC,CAAC,IAEtC,EAAO,IAAI,EAAK,KAAK,OAAO,CAAC,CAAC;CAElC;CACA,IAAM,IAAK,EAAO,SAAS,GACrB,IAAM,OAAO,SAAS,YAAY,IAAK,IAAI,MAAO;CACxD,OAAO,QAAQ,aAAa,MAAM,IAAI,CAAG;AAC3C"}
1
+ {"version":3,"file":"admins-components77.js","names":[],"sources":["../src/components/data-table/FiltersHistory.vue"],"sourcesContent":["<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'\n\nexport interface SavedFilter {\n id: string\n savedAt: string\n name?: string\n values: Record<string, any>\n}\n\nconst props = defineProps<{\n items: FilterItem[]\n values: Record<string, any>\n storageKey?: string\n}>()\n\nconst storageKey = computed(() => `data-filters-${props.storageKey}`)\n\nconst MAX_ITEM_LIMIT = 50\nconst MAX_ITEM_WARNING_THRESHOLD = 7\n\nconst emit = defineEmits<{\n load: [values: Record<string, any>]\n change: [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 try {\n const raw = localStorage.getItem(storageKey.value)\n if (!raw) {\n entries.value = []\n return\n }\n const parsed = JSON.parse(raw)\n if (Array.isArray(parsed)) {\n entries.value = 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 } else {\n entries.value = []\n }\n } catch {\n entries.value = []\n }\n}\n\nfunction persist() {\n try {\n localStorage.setItem(storageKey.value, JSON.stringify(entries.value))\n } catch {\n /* quota / privacy mode - ignore */\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()}-${Math.random().toString(36).slice(2, 8)}`\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 emit('change', { ...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 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</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\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 entries\"\n :key=\"entry.id\"\n class=\"filters-history__item\"\n :class=\"{ 'is-open': isExpanded(entry.id) }\"\n >\n <div\n class=\"filters-history__item-header\"\n :class=\"{ 'is-open': isExpanded(entry.id) }\"\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-date\">{{ formatSavedAt(entry.savedAt) }}</span>\n <span v-if=\"entry.name\" class=\"filters-history__item-name\">{{ entry.name }}</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-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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"}
@@ -0,0 +1,7 @@
1
+ import './src/styles/components/data-table/filters-history.scss_vue_type_style_index_0_src_true_lang.css';
2
+ import e from "./admins-components77.js";
3
+ /* empty css */
4
+ //#region src/components/data-table/FiltersHistory.vue
5
+ var t = e;
6
+ //#endregion
7
+ export { t as default };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admins-components79.js","names":[],"sources":["../src/components/data-table/FiltersHistory.vue"],"sourcesContent":["<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'\n\nexport interface SavedFilter {\n id: string\n savedAt: string\n name?: string\n values: Record<string, any>\n}\n\nconst props = defineProps<{\n items: FilterItem[]\n values: Record<string, any>\n storageKey?: string\n}>()\n\nconst storageKey = computed(() => `data-filters-${props.storageKey}`)\n\nconst MAX_ITEM_LIMIT = 50\nconst MAX_ITEM_WARNING_THRESHOLD = 7\n\nconst emit = defineEmits<{\n load: [values: Record<string, any>]\n change: [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 try {\n const raw = localStorage.getItem(storageKey.value)\n if (!raw) {\n entries.value = []\n return\n }\n const parsed = JSON.parse(raw)\n if (Array.isArray(parsed)) {\n entries.value = 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 } else {\n entries.value = []\n }\n } catch {\n entries.value = []\n }\n}\n\nfunction persist() {\n try {\n localStorage.setItem(storageKey.value, JSON.stringify(entries.value))\n } catch {\n /* quota / privacy mode - ignore */\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()}-${Math.random().toString(36).slice(2, 8)}`\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 emit('change', { ...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 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</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\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 entries\"\n :key=\"entry.id\"\n class=\"filters-history__item\"\n :class=\"{ 'is-open': isExpanded(entry.id) }\"\n >\n <div\n class=\"filters-history__item-header\"\n :class=\"{ 'is-open': isExpanded(entry.id) }\"\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-date\">{{ formatSavedAt(entry.savedAt) }}</span>\n <span v-if=\"entry.name\" class=\"filters-history__item-name\">{{ entry.name }}</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-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,7 +1,53 @@
1
- import './src/styles/components/data-table/data-filters.scss_vue_type_style_index_0_src_true_lang.css';
2
- import e from "./admins-components78.js";
3
- /* empty css */
4
- //#region src/components/data-table/DataFilters.vue
5
- var t = e;
1
+ import { parseDropdownValue as e } from "./admins-components76.js";
2
+ //#region src/utils/dataFilters.ts
3
+ function t(e) {
4
+ let t = new URLSearchParams(window.location.search), n = {};
5
+ for (let r of e) {
6
+ if (r.type === "separator") continue;
7
+ let e = window.location.search ? t.get(r.key) : null;
8
+ n[r.key] = e === null ? r.value ?? null : i(r.type, e, r.value);
9
+ }
10
+ return n;
11
+ }
12
+ function n(e) {
13
+ let n = t(e) ?? {}, i = {};
14
+ for (let t of e) {
15
+ if (t.type === "separator") continue;
16
+ let e = n[t.key];
17
+ if (t.transformer) {
18
+ let n = t.transformer(e);
19
+ n && Object.assign(i, n);
20
+ } else i[t.key] = e;
21
+ }
22
+ return r(i);
23
+ }
24
+ function r(e) {
25
+ return Object.fromEntries(Object.entries(e).filter(([e, t]) => t !== null && t !== "" && t !== void 0));
26
+ }
27
+ function i(t, n, r) {
28
+ if (t === "number") {
29
+ let e = Number(n);
30
+ return isNaN(e) ? r ?? null : e;
31
+ }
32
+ return t === "date" || t === "datetime" ? { utc: n } : t === "daterange" || t === "datetimerange" ? a(n, r) : t === "dropdown" ? e(n) : t === "checkbox" ? n === "true" : n;
33
+ }
34
+ function a(e, t) {
35
+ try {
36
+ let t = JSON.parse(e);
37
+ return t && typeof t == "object" && "local" in t && t.local && (t.local = new Date(t.local)), t;
38
+ } catch {
39
+ return t ?? null;
40
+ }
41
+ }
42
+ function o(e, t) {
43
+ let n = new URLSearchParams(window.location.search);
44
+ for (let r of e) {
45
+ if (r.type === "separator") continue;
46
+ let e = t[r.key];
47
+ e == null || e === "" ? n.delete(r.key) : r.type === "date" || r.type === "datetime" ? n.set(r.key, e.utc) : typeof e == "object" ? n.set(r.key, JSON.stringify(e)) : n.set(r.key, String(e));
48
+ }
49
+ let r = n.toString(), i = window.location.pathname + (r ? `?${r}` : "");
50
+ window.history.replaceState(null, "", i);
51
+ }
6
52
  //#endregion
7
- export { t as default };
53
+ export { r as filterEmptyValues, n as getDefaultFilters, t as getFilterParams, o as writeFilterParams };
@@ -1 +1 @@
1
- {"version":3,"file":"admins-components80.js","names":[],"sources":["../src/components/data-table/DataFilters.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { DropdownOption } from '@/components/DropdownSelect.vue'\n\nexport interface FilterItem {\n type: FilterItemType\n key: string\n label?: string\n placeholder?: string\n value?: any\n options?: DropdownOption[]\n fullWidth?: boolean\n config?: Record<string, any>\n displayClass?: string\n transformer?: (value: any) => Record<string, any> | null | undefined\n}\n\nexport interface FilterResponse {\n values: Record<string, any>\n transformed: Record<string, any>\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted } from 'vue'\nimport Sidebar, { type SidebarPosition } from '@/components/Sidebar.vue'\nimport DatePicker from '@/components/DatePicker.vue'\nimport DateRangePicker from '@/components/DateRangePicker.vue'\nimport DropdownSelect from '@/components/DropdownSelect.vue'\nimport Button from '@/components/Button.vue'\nimport Checkbox from '@/components/Checkbox.vue'\nimport FiltersHistory from '@/components/data-table/FiltersHistory.vue'\nimport { debounce } from '@/utils/debounce'\nimport type { DatePickerConfig, DateRangePickerConfig } from '@/types/datepickers'\nimport type { FilterItemType, PickedDate, PickedUtcRange } from '@/types/types'\nimport { filterEmptyValues, getFilterParams, writeFilterParams } from '@/utils/dataFilters'\n\nconst props = withDefaults(\n defineProps<{\n open?: boolean\n items: FilterItem[]\n position?: SidebarPosition\n lazy?: boolean\n handleUrl?: boolean\n historyEnabled?: boolean\n storageKey?: string\n }>(),\n {\n open: false,\n position: 'left',\n lazy: true,\n handleUrl: false,\n historyEnabled: true,\n },\n)\n\nconst emit = defineEmits<{\n close: []\n change: [response: FilterResponse]\n}>()\n\nconst values = ref<Record<string, any>>(getFilterParams(props.items) ?? {})\nconst filterRefs = ref<Record<string, any>>({})\n\nfunction setFilterRef(key: string, el: any) {\n if (el) {\n filterRefs.value[key] = el\n } else {\n delete filterRefs.value[key]\n }\n}\n\nfunction buildDatePickerConfig(item: FilterItem): DatePickerConfig {\n return {\n ...(item.config ?? {}),\n showTime: item.type === 'datetime',\n placeholder: item.placeholder ?? (item.type === 'datetime' ? 'Időpont' : 'Dátum'),\n }\n}\n\nfunction buildDateRangePickerConfig(item: FilterItem): DateRangePickerConfig {\n return {\n ...(item.config ?? {}),\n ...(!item.fullWidth ? { compact: true } : {}),\n showTime: item.type === 'datetimerange',\n }\n}\n\nonMounted(() => {\n if (!props.handleUrl) return\n const fromUrl = getFilterParams(props.items)\n if (fromUrl && Object.keys(fromUrl).length > 0) {\n values.value = { ...values.value, ...fromUrl }\n }\n})\n\nfunction update(key: string, value: any) {\n values.value = { ...values.value, [key]: value }\n\n if (!props.lazy) {\n if (props.handleUrl) writeFilterParams(props.items, values.value)\n emit('change', buildResponseEmit())\n }\n}\n\nfunction buildResponseEmit() {\n const transformedValues = props.items.reduce((acc, item) => {\n const val = values.value[item.key]\n if (item.transformer) {\n return { ...acc, ...(item.transformer(val) ?? {}) }\n }\n return { ...acc, [item.key]: val }\n }, {})\n return {\n values: filterEmptyValues(values.value),\n transformed: filterEmptyValues(transformedValues),\n }\n}\n\nconst debouncedUpdate = debounce((key: string, value: any) => {\n update(key, value)\n})\n\nfunction confirm() {\n if (props.handleUrl) writeFilterParams(props.items, values.value)\n\n emit('change', buildResponseEmit())\n emit('close')\n}\n\n/* function reset() {\n values.value = getDefaults()\n if (props.handleUrl) writeFilterParams(props.items, values.value)\n emit('change', filterEmptyValues(values.value))\n} */\n\nfunction clearAll() {\n values.value = {}\n if (props.handleUrl) writeFilterParams(props.items, values.value)\n\n emit('change', buildResponseEmit())\n}\n\nconst hasActiveFilters = ref(false)\nwatch(\n values,\n (v) => {\n hasActiveFilters.value = Object.values(v).some(\n (val) => val !== null && val !== '' && val !== undefined,\n )\n },\n { deep: true, immediate: true },\n)\n\nfunction clearFilter(key: string) {\n values.value = { ...values.value, [key]: null }\n if (props.handleUrl) writeFilterParams(props.items, values.value)\n emit('change', buildResponseEmit())\n}\n\nfunction focusFilter(key: string) {\n const ref = (filterRefs.value as Record<string, any>)[key]\n if (!ref) return\n\n if (typeof ref.focusAndOpen === 'function') {\n ref.focusAndOpen()\n return\n }\n if (typeof ref.focus === 'function') {\n ref.focus()\n }\n}\n\nfunction onHistoryLoad(loaded: Record<string, any>) {\n const next: Record<string, any> = { ...values.value }\n for (const item of props.items) {\n if (item.type === 'separator') continue\n if (item.key in loaded) {\n next[item.key] = loaded[item.key] ?? null\n }\n }\n values.value = next\n if (props.handleUrl) writeFilterParams(props.items, values.value)\n emit('change', buildResponseEmit())\n}\n\ndefineExpose({ clearFilter, focusFilter })\n</script>\n\n<template>\n <Sidebar :open=\"open\" title=\"Szűrők\" :position=\"position\" @close=\"emit('close')\">\n <div class=\"data-filters\">\n <div\n v-for=\"item in items\"\n :key=\"item.key\"\n class=\"data-filters__field\"\n :class=\"{ 'data-filters__field--full': item.fullWidth || item.type === 'separator' }\"\n >\n <hr v-if=\"item.type === 'separator'\" class=\"data-filters__separator\" />\n <template v-else-if=\"item.type === 'checkbox'\">\n <Checkbox\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as boolean) ?? false\"\n :label=\"item.label ?? item.key\"\n @update:model-value=\"(val) => update(item.key, val)\"\n v-bind=\"item.config\"\n />\n </template>\n <template v-else>\n <template v-if=\"item.type === 'text'\">\n <label class=\"c-label\" :for=\"`df-${item.key}`\">{{ item.label ?? item.key }}</label>\n <input\n v-if=\"item.type === 'text'\"\n type=\"text\"\n class=\"c-input-row\"\n :placeholder=\"item.placeholder\"\n :value=\"values[item.key] ?? ''\"\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :id=\"`df-${item.key}`\"\n @input=\"debouncedUpdate(item.key, ($event.target as HTMLInputElement).value || null)\"\n v-bind=\"item.config\"\n />\n </template>\n <template v-else-if=\"item.type === 'textarea'\">\n <label class=\"c-label\" :for=\"`df-${item.key}`\">{{ item.label ?? item.key }}</label>\n <textarea\n class=\"c-input-row data-filters__textarea\"\n :placeholder=\"item.placeholder\"\n :value=\"values[item.key] ?? ''\"\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :id=\"`df-${item.key}`\"\n v-bind=\"item.config\"\n @input=\"\n debouncedUpdate(item.key, ($event.target as HTMLTextAreaElement).value || null)\n \"\n />\n </template>\n <template v-else-if=\"item.type === 'number'\">\n <label class=\"c-label\" :for=\"`df-${item.key}`\">{{ item.label ?? item.key }}</label>\n <input\n type=\"number\"\n class=\"c-input-row\"\n :placeholder=\"item.placeholder\"\n :value=\"values[item.key] ?? ''\"\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :id=\"`df-${item.key}`\"\n v-bind=\"item.config\"\n @input=\"\n debouncedUpdate(\n item.key,\n ($event.target as HTMLInputElement).value\n ? Number(($event.target as HTMLInputElement).value)\n : null,\n )\n \"\n />\n </template>\n <template v-else-if=\"item.type === 'date' || item.type === 'datetime'\">\n <label class=\"c-label\" :for=\"`df-${item.key}`\">{{ item.label ?? item.key }}</label>\n <DatePicker\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :id=\"`df-${item.key}`\"\n :model-value=\"(values[item.key] as PickedDate) ?? null\"\n :config=\"buildDatePickerConfig(item)\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n <template v-else-if=\"item.type === 'daterange' || item.type === 'datetimerange'\">\n <span class=\"c-label\">{{ item.label ?? item.key }}</span>\n <DateRangePicker\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as PickedUtcRange) ?? null\"\n :config=\"buildDateRangePickerConfig(item)\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n <template v-else-if=\"item.type === 'dropdown'\">\n <span class=\"c-label\">{{ item.label ?? item.key }}</span>\n <DropdownSelect\n :ref=\"(el: any) => setFilterRef(item.key, el)\"\n :model-value=\"(values[item.key] as string) ?? null\"\n :options=\"item.options ?? []\"\n :config=\"{\n ...(item.config ?? {}),\n placeholder: item.placeholder ?? 'Válassz...',\n clearable: true,\n filterable: true,\n }\"\n @update:model-value=\"update(item.key, $event)\"\n />\n </template>\n </template>\n </div>\n </div>\n <div class=\"data-filters__footer\">\n <!-- <Button\n icon=\"fa-solid fa-trash-can\"\n :disabled=\"!hasActiveFilters\"\n label=\"Alaphelyzet visszaállítása\"\n size=\"small\"\n @click=\"reset\"\n /> -->\n <Button\n icon=\"fa-solid fa-trash-can\"\n :disabled=\"!hasActiveFilters\"\n label=\"Szűrők törlése\"\n aria-label=\"Szűrők törlése\"\n size=\"small\"\n @click=\"clearAll\"\n />\n <Button label=\"Szűrés\" aria-label=\"Szűrés\" type=\"success\" @click=\"confirm\" />\n </div>\n <hr v-if=\"historyEnabled\" class=\"separator my-3\" />\n <FiltersHistory\n v-if=\"historyEnabled\"\n :items=\"items\"\n :values=\"values\"\n :storage-key=\"storageKey\"\n @load=\"onHistoryLoad\"\n @change=\"onHistoryLoad\"\n />\n </Sidebar>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-filters.scss\"></style>\n"],"mappings":""}
1
+ {"version":3,"file":"admins-components80.js","names":[],"sources":["../src/utils/dataFilters.ts"],"sourcesContent":["import type { FilterItem } from '@/components/data-table/DataFilters.vue'\nimport { parseDropdownValue } from '@/utils/filterDisplay'\n\nexport function getFilterParams(items: FilterItem[]): Record<string, unknown> | null {\n const params = new URLSearchParams(window.location.search)\n const result: Record<string, unknown> = {}\n\n for (const item of items) {\n if (item.type === 'separator') continue\n\n const raw = window.location.search ? params.get(item.key) : null\n result[item.key] =\n raw === null ? (item.value ?? null) : parseFilterValue(item.type, raw, item.value)\n }\n return result\n}\n\nexport function getDefaultFilters(items: FilterItem[]): Record<string, unknown> {\n const raw = getFilterParams(items) ?? {}\n const result: Record<string, unknown> = {}\n\n for (const item of items) {\n if (item.type === 'separator') continue\n const val = raw[item.key]\n\n if (item.transformer) {\n const t = item.transformer(val)\n if (t) Object.assign(result, t)\n } else {\n result[item.key] = val\n }\n }\n\n return filterEmptyValues(result)\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\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 const params = new URLSearchParams(window.location.search)\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 params.delete(item.key)\n } else if (item.type === 'date' || item.type === 'datetime') {\n params.set(item.key, (v as { utc: string }).utc)\n } else if (typeof v === 'object') {\n params.set(item.key, JSON.stringify(v))\n } else {\n params.set(item.key, String(v))\n }\n }\n const qs = params.toString()\n const url = window.location.pathname + (qs ? `?${qs}` : '')\n window.history.replaceState(null, '', url)\n}\n"],"mappings":";;AAGA,SAAgB,EAAgB,GAAqD;CACnF,IAAM,IAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM,GACnD,IAAkC,CAAC;CAEzC,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAI,EAAK,SAAS,aAAa;EAE/B,IAAM,IAAM,OAAO,SAAS,SAAS,EAAO,IAAI,EAAK,GAAG,IAAI;EAC5D,EAAO,EAAK,OACV,MAAQ,OAAQ,EAAK,SAAS,OAAQ,EAAiB,EAAK,MAAM,GAAK,EAAK,KAAK;CACrF;CACA,OAAO;AACT;AAEA,SAAgB,EAAkB,GAA8C;CAC9E,IAAM,IAAM,EAAgB,CAAK,KAAK,CAAC,GACjC,IAAkC,CAAC;CAEzC,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAI,EAAK,SAAS,aAAa;EAC/B,IAAM,IAAM,EAAI,EAAK;EAErB,IAAI,EAAK,aAAa;GACpB,IAAM,IAAI,EAAK,YAAY,CAAG;GAC9B,AAAI,KAAG,OAAO,OAAO,GAAQ,CAAC;EAChC,OACE,EAAO,EAAK,OAAO;CAEvB;CAEA,OAAO,EAAkB,CAAM;AACjC;AAEA,SAAgB,EAAkB,GAAmD;CACnF,OAAO,OAAO,YAEZ,OAAO,QAAQ,CAAO,EAAE,QAAQ,CAAC,GAAG,OAAS,MAAQ,QAAQ,MAAQ,MAAM,MAAQ,KAAA,CAAS,CAC9F;AACF;AAGA,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,EAAmB,CAAG,IAE3B,MAAS,aACJ,MAAQ,SAGV;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,IAAM,IAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;CACzD,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAI,EAAK,SAAS,aAAa;EAC/B,IAAM,IAAI,EAAK,EAAK;EACpB,AAAI,KAAM,QAA2B,MAAM,KACzC,EAAO,OAAO,EAAK,GAAG,IACb,EAAK,SAAS,UAAU,EAAK,SAAS,aAC/C,EAAO,IAAI,EAAK,KAAM,EAAsB,GAAG,IACtC,OAAO,KAAM,WACtB,EAAO,IAAI,EAAK,KAAK,KAAK,UAAU,CAAC,CAAC,IAEtC,EAAO,IAAI,EAAK,KAAK,OAAO,CAAC,CAAC;CAElC;CACA,IAAM,IAAK,EAAO,SAAS,GACrB,IAAM,OAAO,SAAS,YAAY,IAAK,IAAI,MAAO;CACxD,OAAO,QAAQ,aAAa,MAAM,IAAI,CAAG;AAC3C"}