admins-components 9.0.76 → 9.0.78
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.
- package/dist/admins-components100.js.map +1 -1
- package/dist/admins-components102.js.map +1 -1
- package/dist/admins-components103.js.map +1 -1
- package/dist/admins-components105.js.map +1 -1
- package/dist/admins-components109.js.map +1 -1
- package/dist/admins-components11.js.map +1 -1
- package/dist/admins-components112.js.map +1 -1
- package/dist/admins-components12.js +44 -29
- package/dist/admins-components12.js.map +1 -1
- package/dist/admins-components13.js.map +1 -1
- package/dist/admins-components14.js.map +1 -1
- package/dist/admins-components169.js.map +1 -1
- package/dist/admins-components173.js +2 -2
- package/dist/admins-components173.js.map +1 -1
- package/dist/admins-components174.js.map +1 -1
- package/dist/admins-components179.js.map +1 -1
- package/dist/admins-components21.js.map +1 -1
- package/dist/admins-components22.js.map +1 -1
- package/dist/admins-components26.js +88 -82
- package/dist/admins-components26.js.map +1 -1
- package/dist/admins-components28.js.map +1 -1
- package/dist/admins-components31.js.map +1 -1
- package/dist/admins-components35.js +25 -23
- package/dist/admins-components35.js.map +1 -1
- package/dist/admins-components37.js.map +1 -1
- package/dist/admins-components46.js.map +1 -1
- package/dist/admins-components48.js.map +1 -1
- package/dist/admins-components54.js.map +1 -1
- package/dist/admins-components56.js.map +1 -1
- package/dist/admins-components65.js.map +1 -1
- package/dist/admins-components68.js.map +1 -1
- package/dist/admins-components70.js.map +1 -1
- package/dist/admins-components75.js.map +1 -1
- package/dist/admins-components77.js.map +1 -1
- package/dist/admins-components79.js.map +1 -1
- package/dist/admins-components8.js.map +1 -1
- package/dist/admins-components80.js.map +1 -1
- package/dist/admins-components82.js.map +1 -1
- package/dist/admins-components83.js.map +1 -1
- package/dist/admins-components85.js.map +1 -1
- package/dist/admins-components86.js.map +1 -1
- package/dist/admins-components87.js.map +1 -1
- package/dist/admins-components91.js.map +1 -1
- package/dist/admins-components93.js.map +1 -1
- package/dist/main.css +1 -1
- package/dist/main.css.map +1 -1
- package/dist/src/components/HeaderComponent.vue.d.ts +3 -0
- package/dist/src/composables/useDropdownAnchor.d.ts +2 -0
- package/dist/src/composables/useSwipeToClose.d.ts +0 -31
- package/dist/src/utils/dataFilters.d.ts +0 -8
- package/dist/src/utils/dataListConverters.d.ts +0 -10
- package/dist/src/utils/url.d.ts +0 -11
- package/dist/styles/components/dropdown-select.scss_vue_type_style_index_0_src_true_lang.css +1 -1
- package/dist/styles/components/header.scss_vue_type_style_index_0_src_true_lang.css +1 -1
- package/dist/vueformelements/ArticlePickerElement.vue_vue_type_style_index_0_scoped_54217a66_lang.css +1 -0
- package/package.json +1 -1
- package/dist/vueformelements/ArticlePickerElement.vue_vue_type_style_index_0_scoped_43c54caa_lang.css +0 -1
|
@@ -1,39 +1,41 @@
|
|
|
1
1
|
import e from "./admins-components6.js";
|
|
2
2
|
import { Fragment as t, computed as n, createBlock as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, defineComponent as s, mergeDefaults as c, mergeProps as l, normalizeClass as u, openBlock as d, renderList as f, renderSlot as p, toDisplayString as m } from "vue";
|
|
3
3
|
//#region src/components/HeaderComponent.vue?vue&type=script&setup=true&lang.ts
|
|
4
|
-
var h = { class: "ac-component" }, g = { class: "hc-
|
|
4
|
+
var h = { class: "ac-component" }, g = { class: "hc-left" }, _ = { class: "hc-title-group" }, v = { class: "hc-title" }, y = {
|
|
5
5
|
key: 1,
|
|
6
6
|
class: "hc-slot hc-slot--left"
|
|
7
|
-
},
|
|
7
|
+
}, b = {
|
|
8
8
|
key: 0,
|
|
9
9
|
class: "hc-slot hc-slot--center"
|
|
10
|
-
},
|
|
10
|
+
}, x = {
|
|
11
11
|
key: 1,
|
|
12
12
|
class: "hc-slot hc-slot--right"
|
|
13
|
-
},
|
|
13
|
+
}, S = {
|
|
14
14
|
icon: void 0,
|
|
15
15
|
backButton: () => ({
|
|
16
16
|
icon: "fa-solid fa-chevron-left",
|
|
17
17
|
ariaLabel: "Vissza",
|
|
18
18
|
callback: () => {}
|
|
19
19
|
}),
|
|
20
|
-
toolbars: () => []
|
|
21
|
-
|
|
20
|
+
toolbars: () => [],
|
|
21
|
+
isSticky: !1
|
|
22
|
+
}, C = /*@__PURE__*/ s({
|
|
22
23
|
__name: "HeaderComponent",
|
|
23
24
|
props: /*@__PURE__*/ c({
|
|
24
25
|
title: {},
|
|
25
26
|
icon: {},
|
|
26
27
|
showBackButton: { type: Boolean },
|
|
27
28
|
backButton: {},
|
|
28
|
-
toolbars: {}
|
|
29
|
-
|
|
29
|
+
toolbars: {},
|
|
30
|
+
isSticky: { type: Boolean }
|
|
31
|
+
}, { ...S }),
|
|
30
32
|
setup(s) {
|
|
31
|
-
let c = s,
|
|
33
|
+
let c = s, C = n(() => {
|
|
32
34
|
if (c.backButton) return {
|
|
33
|
-
...
|
|
35
|
+
...S.backButton(),
|
|
34
36
|
...c.backButton
|
|
35
37
|
};
|
|
36
|
-
}),
|
|
38
|
+
}), w = n(() => {
|
|
37
39
|
let e = {
|
|
38
40
|
left: 0,
|
|
39
41
|
center: 1,
|
|
@@ -41,32 +43,32 @@ var h = { class: "ac-component" }, g = { class: "hc-header" }, _ = { class: "hc-
|
|
|
41
43
|
};
|
|
42
44
|
return [...c.toolbars].sort((t, n) => e[t.align] - e[n.align]);
|
|
43
45
|
});
|
|
44
|
-
return (n, c) => (d(), a("div", h, [o("header",
|
|
45
|
-
o("div",
|
|
46
|
-
s.showBackButton &&
|
|
46
|
+
return (n, c) => (d(), a("div", h, [o("header", { class: u(["hc-header", { "hc-header--sticky": s.isSticky }]) }, [
|
|
47
|
+
o("div", g, [
|
|
48
|
+
s.showBackButton && C.value ? (d(), r(e, l({
|
|
47
49
|
key: 0,
|
|
48
50
|
class: "hc-back-btn"
|
|
49
|
-
},
|
|
50
|
-
o("div",
|
|
51
|
+
}, C.value), null, 16)) : i("", !0),
|
|
52
|
+
o("div", _, [s.icon ? (d(), a("i", {
|
|
51
53
|
key: 0,
|
|
52
54
|
class: u([s.icon, "hc-title-icon"])
|
|
53
|
-
}, null, 2)) : i("", !0), o("h1",
|
|
54
|
-
n.$slots.left ? (d(), a("div",
|
|
55
|
-
(d(!0), a(t, null, f(
|
|
55
|
+
}, null, 2)) : i("", !0), o("h1", v, m(s.title), 1)]),
|
|
56
|
+
n.$slots.left ? (d(), a("div", y, [p(n.$slots, "left")])) : i("", !0),
|
|
57
|
+
(d(!0), a(t, null, f(w.value.filter((e) => e.align === "left"), (n, i) => (d(), a("div", {
|
|
56
58
|
key: `l-${i}`,
|
|
57
59
|
class: "hc-buttons hc-buttons--left"
|
|
58
60
|
}, [(d(!0), a(t, null, f(n.buttons, (t, n) => (d(), r(e, l({ key: n }, { ref_for: !0 }, t), null, 16))), 128))]))), 128))
|
|
59
61
|
]),
|
|
60
|
-
n.$slots.center ||
|
|
62
|
+
n.$slots.center || w.value.some((e) => e.align === "center") ? (d(), a("div", b, [p(n.$slots, "center"), (d(!0), a(t, null, f(w.value.filter((e) => e.align === "center"), (n, i) => (d(), a("div", {
|
|
61
63
|
key: `c-${i}`,
|
|
62
64
|
class: "hc-buttons"
|
|
63
65
|
}, [(d(!0), a(t, null, f(n.buttons, (t, n) => (d(), r(e, l({ key: n }, { ref_for: !0 }, t), null, 16))), 128))]))), 128))])) : i("", !0),
|
|
64
|
-
n.$slots.right ||
|
|
66
|
+
n.$slots.right || w.value.some((e) => e.align === "right") ? (d(), a("div", x, [p(n.$slots, "right"), (d(!0), a(t, null, f(w.value.filter((e) => e.align === "right"), (n, i) => (d(), a("div", {
|
|
65
67
|
key: `r-${i}`,
|
|
66
68
|
class: "hc-buttons"
|
|
67
69
|
}, [(d(!0), a(t, null, f(n.buttons, (t, n) => (d(), r(e, l({ key: n }, { ref_for: !0 }, t), null, 16))), 128))]))), 128))])) : i("", !0)
|
|
68
|
-
])]));
|
|
70
|
+
], 2)]));
|
|
69
71
|
}
|
|
70
72
|
});
|
|
71
73
|
//#endregion
|
|
72
|
-
export {
|
|
74
|
+
export { C as default, S as headerComponentDefaults };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admins-components35.js","names":["$slots"],"sources":["../src/components/HeaderComponent.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ButtonProps } from '@/components/Button.vue'\nimport type { HorizontalAlignment } from '@/types/types'\n\nexport interface HeaderToolbar {\n align: HorizontalAlignment\n buttons: ButtonProps[]\n}\n\nexport interface HeaderComponentProps {\n title: string\n icon?: string\n showBackButton?: boolean\n backButton?: ButtonProps\n toolbars?: HeaderToolbar[]\n}\n\nexport const headerComponentDefaults = {\n icon: undefined,\n backButton: () => ({\n icon: 'fa-solid fa-chevron-left',\n ariaLabel: 'Vissza',\n callback: () => {},\n }),\n toolbars: () => [],\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport Button from '@/components/Button.vue'\n\nconst props = withDefaults(defineProps<HeaderComponentProps>(), {\n ...headerComponentDefaults,\n})\n\nconst mergedBackButton = computed<ButtonProps | undefined>(() => {\n if (!props.backButton) return undefined\n return { ...headerComponentDefaults.backButton(), ...props.backButton }\n})\n\nconst sortedToolbars = computed(() => {\n const order: Record<HorizontalAlignment, number> = { left: 0, center: 1, right: 2 }\n return [...props.toolbars].sort((a, b) => order[a.align] - order[b.align])\n})\n</script>\n\n<template>\n <div class=\"ac-component\">\n <header class=\"hc-header\">\n <div class=\"hc-left\">\n <Button\n v-if=\"showBackButton && mergedBackButton\"\n class=\"hc-back-btn\"\n v-bind=\"mergedBackButton\"\n />\n\n <div class=\"hc-title-group\">\n <i v-if=\"icon\" :class=\"icon\" class=\"hc-title-icon\"></i>\n <h1 class=\"hc-title\">{{ title }}</h1>\n </div>\n\n <div v-if=\"$slots.left\" class=\"hc-slot hc-slot--left\">\n <slot name=\"left\" />\n </div>\n\n <div\n v-for=\"(toolbar, ti) in sortedToolbars.filter((t) => t.align === 'left')\"\n :key=\"`l-${ti}`\"\n class=\"hc-buttons hc-buttons--left\"\n >\n <Button v-for=\"(btn, i) in toolbar.buttons\" :key=\"i\" v-bind=\"btn\" />\n </div>\n </div>\n\n <div\n v-if=\"$slots.center || sortedToolbars.some((t) => t.align === 'center')\"\n class=\"hc-slot hc-slot--center\"\n >\n <slot name=\"center\" />\n <div\n v-for=\"(toolbar, ti) in sortedToolbars.filter((t) => t.align === 'center')\"\n :key=\"`c-${ti}`\"\n class=\"hc-buttons\"\n >\n <Button v-for=\"(btn, i) in toolbar.buttons\" :key=\"i\" v-bind=\"btn\" />\n </div>\n </div>\n\n <div\n v-if=\"$slots.right || sortedToolbars.some((t) => t.align === 'right')\"\n class=\"hc-slot hc-slot--right\"\n >\n <slot name=\"right\" />\n <div\n v-for=\"(toolbar, ti) in sortedToolbars.filter((t) => t.align === 'right')\"\n :key=\"`r-${ti}`\"\n class=\"hc-buttons\"\n >\n <Button v-for=\"(btn, i) in toolbar.buttons\" :key=\"i\" v-bind=\"btn\" />\n </div>\n </div>\n </header>\n </div>\n</template>\n<style lang=\"scss\" src=\"@/styles/components/header.scss\"></style>\n"],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"admins-components35.js","names":["$slots"],"sources":["../src/components/HeaderComponent.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ButtonProps } from '@/components/Button.vue'\nimport type { HorizontalAlignment } from '@/types/types'\n\nexport interface HeaderToolbar {\n align: HorizontalAlignment\n buttons: ButtonProps[]\n}\n\nexport interface HeaderComponentProps {\n title: string\n icon?: string\n showBackButton?: boolean\n backButton?: ButtonProps\n toolbars?: HeaderToolbar[]\n isSticky?: boolean\n}\n\nexport const headerComponentDefaults = {\n icon: undefined,\n backButton: () => ({\n icon: 'fa-solid fa-chevron-left',\n ariaLabel: 'Vissza',\n callback: () => {},\n }),\n toolbars: () => [],\n isSticky: false,\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport Button from '@/components/Button.vue'\n\nconst props = withDefaults(defineProps<HeaderComponentProps>(), {\n ...headerComponentDefaults,\n})\n\nconst mergedBackButton = computed<ButtonProps | undefined>(() => {\n if (!props.backButton) return undefined\n return { ...headerComponentDefaults.backButton(), ...props.backButton }\n})\n\nconst sortedToolbars = computed(() => {\n const order: Record<HorizontalAlignment, number> = { left: 0, center: 1, right: 2 }\n return [...props.toolbars].sort((a, b) => order[a.align] - order[b.align])\n})\n</script>\n\n<template>\n <div class=\"ac-component\">\n <header class=\"hc-header\" :class=\"{ 'hc-header--sticky': isSticky }\">\n <div class=\"hc-left\">\n <Button\n v-if=\"showBackButton && mergedBackButton\"\n class=\"hc-back-btn\"\n v-bind=\"mergedBackButton\"\n />\n\n <div class=\"hc-title-group\">\n <i v-if=\"icon\" :class=\"icon\" class=\"hc-title-icon\"></i>\n <h1 class=\"hc-title\">{{ title }}</h1>\n </div>\n\n <div v-if=\"$slots.left\" class=\"hc-slot hc-slot--left\">\n <slot name=\"left\" />\n </div>\n\n <div\n v-for=\"(toolbar, ti) in sortedToolbars.filter((t) => t.align === 'left')\"\n :key=\"`l-${ti}`\"\n class=\"hc-buttons hc-buttons--left\"\n >\n <Button v-for=\"(btn, i) in toolbar.buttons\" :key=\"i\" v-bind=\"btn\" />\n </div>\n </div>\n\n <div\n v-if=\"$slots.center || sortedToolbars.some((t) => t.align === 'center')\"\n class=\"hc-slot hc-slot--center\"\n >\n <slot name=\"center\" />\n <div\n v-for=\"(toolbar, ti) in sortedToolbars.filter((t) => t.align === 'center')\"\n :key=\"`c-${ti}`\"\n class=\"hc-buttons\"\n >\n <Button v-for=\"(btn, i) in toolbar.buttons\" :key=\"i\" v-bind=\"btn\" />\n </div>\n </div>\n\n <div\n v-if=\"$slots.right || sortedToolbars.some((t) => t.align === 'right')\"\n class=\"hc-slot hc-slot--right\"\n >\n <slot name=\"right\" />\n <div\n v-for=\"(toolbar, ti) in sortedToolbars.filter((t) => t.align === 'right')\"\n :key=\"`r-${ti}`\"\n class=\"hc-buttons\"\n >\n <Button v-for=\"(btn, i) in toolbar.buttons\" :key=\"i\" v-bind=\"btn\" />\n </div>\n </div>\n </header>\n </div>\n</template>\n<style lang=\"scss\" src=\"@/styles/components/header.scss\"></style>\n"],"mappings":";;;;;;;;;;;;GAkBa,IAA0B;CACrC,MAAM,KAAA;CACN,mBAAmB;EACjB,MAAM;EACN,WAAW;EACX,gBAAgB,CAAC;CACnB;CACA,gBAAgB,CAAC;CACjB,UAAU;AACZ;;;;;;;;;;;EAOA,IAAM,IAAQ,GAIR,IAAmB,QAAwC;GAC1D,MAAM,YACX,OAAO;IAAE,GAAG,EAAwB,WAAW;IAAG,GAAG,EAAM;GAAW;EACxE,CAAC,GAEK,IAAiB,QAAe;GACpC,IAAM,IAA6C;IAAE,MAAM;IAAG,QAAQ;IAAG,OAAO;GAAE;GAClF,OAAO,CAAC,GAAG,EAAM,QAAQ,CAAC,CAAC,MAAM,GAAG,MAAM,EAAM,EAAE,SAAS,EAAM,EAAE,MAAM;EAC3E,CAAC;oBAIC,EAAA,GAAA,EAuDM,OAvDN,GAuDM,CAtDJ,EAqDS,UAAA,EArDD,OAAK,EAAA,CAAC,aAAW,EAAA,qBAAgC,EAAA,SAAQ,CAAA,CAAA,EAAA,GAAA;GAC/D,EAuBM,OAvBN,GAuBM;IArBI,EAAA,kBAAkB,EAAA,SAD1B,EAAA,GAAA,EAIE,GAJF,EAIE;;KAFA,OAAM;IACE,GAAA,EAAA,KAAgB,GAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA;IAG1B,EAGM,OAHN,GAGM,CAFK,EAAA,QAAT,EAAA,GAAA,EAAuD,KAAA;;KAAvC,OAAK,EAAA,CAAE,EAAA,MAAY,eAAe,CAAA;IAClD,GAAA,MAAA,CAAA,KAAA,EAAA,IAAA,EAAA,GAAA,EAAqC,MAArC,GAAqC,EAAb,EAAA,KAAK,GAAA,CAAA,CAAA,CAAA;IAGpBA,EAAAA,OAAO,QAAlB,EAAA,GAAA,EAEM,OAFN,GAEM,CADJ,EAAoB,EAAA,QAAA,MAAA,CAAA,CAAA,KAAA,EAAA,IAAA,EAAA;KAGtB,EAAA,EAAA,GAAA,EAMM,GAAA,MAAA,EALoB,EAAA,MAAe,QAAQ,MAAM,EAAE,UAAK,MAAA,IAApD,GAAS,OADnB,EAAA,GAAA,EAMM,OAAA;KAJH,KAAG,KAAO;KACX,OAAM;IAEN,GAAA,EAAA,EAAA,EAAA,GAAA,EAAoE,GAAA,MAAA,EAAzC,EAAQ,UAAnB,GAAK,OAArB,EAAA,GAAA,EAAoE,GAApE,EAAoE,EAAvB,KAAK,EAAC,GAAA,EAAA,SAAA,GAAA,GAAU,CAAG,GAAA,MAAA,EAAA;;GAK5DA,EAAAA,OAAO,UAAU,EAAA,MAAe,MAAM,MAAM,EAAE,UAAK,QAAA,KAD3D,EAAA,GAAA,EAYM,OAZN,GAYM,CARJ,EAAsB,EAAA,QAAA,QAAA,IACtB,EAAA,EAAA,GAAA,EAMM,GAAA,MAAA,EALoB,EAAA,MAAe,QAAQ,MAAM,EAAE,UAAK,QAAA,IAApD,GAAS,OADnB,EAAA,GAAA,EAMM,OAAA;IAJH,KAAG,KAAO;IACX,OAAM;GAEN,GAAA,EAAA,EAAA,EAAA,GAAA,EAAoE,GAAA,MAAA,EAAzC,EAAQ,UAAnB,GAAK,OAArB,EAAA,GAAA,EAAoE,GAApE,EAAoE,EAAvB,KAAK,EAAC,GAAA,EAAA,SAAA,GAAA,GAAU,CAAG,GAAA,MAAA,EAAA;GAK5DA,EAAAA,OAAO,SAAS,EAAA,MAAe,MAAM,MAAM,EAAE,UAAK,OAAA,KAD1D,EAAA,GAAA,EAYM,OAZN,GAYM,CARJ,EAAqB,EAAA,QAAA,OAAA,IACrB,EAAA,EAAA,GAAA,EAMM,GAAA,MAAA,EALoB,EAAA,MAAe,QAAQ,MAAM,EAAE,UAAK,OAAA,IAApD,GAAS,OADnB,EAAA,GAAA,EAMM,OAAA;IAJH,KAAG,KAAO;IACX,OAAM;GAEN,GAAA,EAAA,EAAA,EAAA,GAAA,EAAoE,GAAA,MAAA,EAAzC,EAAQ,UAAnB,GAAK,OAArB,EAAA,GAAA,EAAoE,GAApE,EAAoE,EAAvB,KAAK,EAAC,GAAA,EAAA,SAAA,GAAA,GAAU,CAAG,GAAA,MAAA,EAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admins-components37.js","names":[],"sources":["../src/components/HeaderComponent.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ButtonProps } from '@/components/Button.vue'\nimport type { HorizontalAlignment } from '@/types/types'\n\nexport interface HeaderToolbar {\n align: HorizontalAlignment\n buttons: ButtonProps[]\n}\n\nexport interface HeaderComponentProps {\n title: string\n icon?: string\n showBackButton?: boolean\n backButton?: ButtonProps\n toolbars?: HeaderToolbar[]\n}\n\nexport const headerComponentDefaults = {\n icon: undefined,\n backButton: () => ({\n icon: 'fa-solid fa-chevron-left',\n ariaLabel: 'Vissza',\n callback: () => {},\n }),\n toolbars: () => [],\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport Button from '@/components/Button.vue'\n\nconst props = withDefaults(defineProps<HeaderComponentProps>(), {\n ...headerComponentDefaults,\n})\n\nconst mergedBackButton = computed<ButtonProps | undefined>(() => {\n if (!props.backButton) return undefined\n return { ...headerComponentDefaults.backButton(), ...props.backButton }\n})\n\nconst sortedToolbars = computed(() => {\n const order: Record<HorizontalAlignment, number> = { left: 0, center: 1, right: 2 }\n return [...props.toolbars].sort((a, b) => order[a.align] - order[b.align])\n})\n</script>\n\n<template>\n <div class=\"ac-component\">\n <header class=\"hc-header\">\n <div class=\"hc-left\">\n <Button\n v-if=\"showBackButton && mergedBackButton\"\n class=\"hc-back-btn\"\n v-bind=\"mergedBackButton\"\n />\n\n <div class=\"hc-title-group\">\n <i v-if=\"icon\" :class=\"icon\" class=\"hc-title-icon\"></i>\n <h1 class=\"hc-title\">{{ title }}</h1>\n </div>\n\n <div v-if=\"$slots.left\" class=\"hc-slot hc-slot--left\">\n <slot name=\"left\" />\n </div>\n\n <div\n v-for=\"(toolbar, ti) in sortedToolbars.filter((t) => t.align === 'left')\"\n :key=\"`l-${ti}`\"\n class=\"hc-buttons hc-buttons--left\"\n >\n <Button v-for=\"(btn, i) in toolbar.buttons\" :key=\"i\" v-bind=\"btn\" />\n </div>\n </div>\n\n <div\n v-if=\"$slots.center || sortedToolbars.some((t) => t.align === 'center')\"\n class=\"hc-slot hc-slot--center\"\n >\n <slot name=\"center\" />\n <div\n v-for=\"(toolbar, ti) in sortedToolbars.filter((t) => t.align === 'center')\"\n :key=\"`c-${ti}`\"\n class=\"hc-buttons\"\n >\n <Button v-for=\"(btn, i) in toolbar.buttons\" :key=\"i\" v-bind=\"btn\" />\n </div>\n </div>\n\n <div\n v-if=\"$slots.right || sortedToolbars.some((t) => t.align === 'right')\"\n class=\"hc-slot hc-slot--right\"\n >\n <slot name=\"right\" />\n <div\n v-for=\"(toolbar, ti) in sortedToolbars.filter((t) => t.align === 'right')\"\n :key=\"`r-${ti}`\"\n class=\"hc-buttons\"\n >\n <Button v-for=\"(btn, i) in toolbar.buttons\" :key=\"i\" v-bind=\"btn\" />\n </div>\n </div>\n </header>\n </div>\n</template>\n<style lang=\"scss\" src=\"@/styles/components/header.scss\"></style>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"admins-components37.js","names":[],"sources":["../src/components/HeaderComponent.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { ButtonProps } from '@/components/Button.vue'\nimport type { HorizontalAlignment } from '@/types/types'\n\nexport interface HeaderToolbar {\n align: HorizontalAlignment\n buttons: ButtonProps[]\n}\n\nexport interface HeaderComponentProps {\n title: string\n icon?: string\n showBackButton?: boolean\n backButton?: ButtonProps\n toolbars?: HeaderToolbar[]\n isSticky?: boolean\n}\n\nexport const headerComponentDefaults = {\n icon: undefined,\n backButton: () => ({\n icon: 'fa-solid fa-chevron-left',\n ariaLabel: 'Vissza',\n callback: () => {},\n }),\n toolbars: () => [],\n isSticky: false,\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport Button from '@/components/Button.vue'\n\nconst props = withDefaults(defineProps<HeaderComponentProps>(), {\n ...headerComponentDefaults,\n})\n\nconst mergedBackButton = computed<ButtonProps | undefined>(() => {\n if (!props.backButton) return undefined\n return { ...headerComponentDefaults.backButton(), ...props.backButton }\n})\n\nconst sortedToolbars = computed(() => {\n const order: Record<HorizontalAlignment, number> = { left: 0, center: 1, right: 2 }\n return [...props.toolbars].sort((a, b) => order[a.align] - order[b.align])\n})\n</script>\n\n<template>\n <div class=\"ac-component\">\n <header class=\"hc-header\" :class=\"{ 'hc-header--sticky': isSticky }\">\n <div class=\"hc-left\">\n <Button\n v-if=\"showBackButton && mergedBackButton\"\n class=\"hc-back-btn\"\n v-bind=\"mergedBackButton\"\n />\n\n <div class=\"hc-title-group\">\n <i v-if=\"icon\" :class=\"icon\" class=\"hc-title-icon\"></i>\n <h1 class=\"hc-title\">{{ title }}</h1>\n </div>\n\n <div v-if=\"$slots.left\" class=\"hc-slot hc-slot--left\">\n <slot name=\"left\" />\n </div>\n\n <div\n v-for=\"(toolbar, ti) in sortedToolbars.filter((t) => t.align === 'left')\"\n :key=\"`l-${ti}`\"\n class=\"hc-buttons hc-buttons--left\"\n >\n <Button v-for=\"(btn, i) in toolbar.buttons\" :key=\"i\" v-bind=\"btn\" />\n </div>\n </div>\n\n <div\n v-if=\"$slots.center || sortedToolbars.some((t) => t.align === 'center')\"\n class=\"hc-slot hc-slot--center\"\n >\n <slot name=\"center\" />\n <div\n v-for=\"(toolbar, ti) in sortedToolbars.filter((t) => t.align === 'center')\"\n :key=\"`c-${ti}`\"\n class=\"hc-buttons\"\n >\n <Button v-for=\"(btn, i) in toolbar.buttons\" :key=\"i\" v-bind=\"btn\" />\n </div>\n </div>\n\n <div\n v-if=\"$slots.right || sortedToolbars.some((t) => t.align === 'right')\"\n class=\"hc-slot hc-slot--right\"\n >\n <slot name=\"right\" />\n <div\n v-for=\"(toolbar, ti) in sortedToolbars.filter((t) => t.align === 'right')\"\n :key=\"`r-${ti}`\"\n class=\"hc-buttons\"\n >\n <Button v-for=\"(btn, i) in toolbar.buttons\" :key=\"i\" v-bind=\"btn\" />\n </div>\n </div>\n </header>\n </div>\n</template>\n<style lang=\"scss\" src=\"@/styles/components/header.scss\"></style>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admins-components46.js","names":[],"sources":["../src/components/custom/ImagePicker.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface ImagePickerModel {\n id: string\n url: string\n source: string\n title: string\n isAdult: boolean\n}\n\nexport interface ImagePickerProps {\n modelValue?: ImagePickerModel\n details?: boolean\n editable?: boolean\n direction?: 'horizontal' | 'vertical'\n articleEditorUrl: string\n environment: string\n searchImageWidgetUrl: string\n imageBaseUrl: string\n imageViewId: string\n}\n\nconst defaultValue: ImagePickerModel = {\n id: '',\n url: '',\n isAdult: false,\n source: '',\n title: '',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted, ref, watch } from 'vue'\nimport Modal from '@/components/Modal.vue'\nimport Button from '@/components/Button.vue'\nimport Checkbox from '@/components/Checkbox.vue'\n\nconst props = withDefaults(defineProps<ImagePickerProps>(), {\n modelValue: undefined,\n details: false,\n editable: false,\n direction: 'vertical',\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: ImagePickerModel): void\n}>()\n\nconst local = ref<ImagePickerModel>(defaultValue)\nconst showImageModal = ref(false)\n\nwatch(\n () => local.value,\n () => {\n emit('update:modelValue', local.value)\n },\n { deep: true },\n)\n\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (newValue) {\n local.value = newValue\n }\n },\n { deep: true, immediate: true },\n)\n\
|
|
1
|
+
{"version":3,"file":"admins-components46.js","names":[],"sources":["../src/components/custom/ImagePicker.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface ImagePickerModel {\n id: string\n url: string\n source: string\n title: string\n isAdult: boolean\n}\n\nexport interface ImagePickerProps {\n modelValue?: ImagePickerModel\n details?: boolean\n editable?: boolean\n direction?: 'horizontal' | 'vertical'\n articleEditorUrl: string\n environment: string\n searchImageWidgetUrl: string\n imageBaseUrl: string\n imageViewId: string\n}\n\nconst defaultValue: ImagePickerModel = {\n id: '',\n url: '',\n isAdult: false,\n source: '',\n title: '',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted, ref, watch } from 'vue'\nimport Modal from '@/components/Modal.vue'\nimport Button from '@/components/Button.vue'\nimport Checkbox from '@/components/Checkbox.vue'\n\nconst props = withDefaults(defineProps<ImagePickerProps>(), {\n modelValue: undefined,\n details: false,\n editable: false,\n direction: 'vertical',\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: ImagePickerModel): void\n}>()\n\nconst local = ref<ImagePickerModel>(defaultValue)\nconst showImageModal = ref(false)\n\nwatch(\n () => local.value,\n () => {\n emit('update:modelValue', local.value)\n },\n { deep: true },\n)\n\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (newValue) {\n local.value = newValue\n }\n },\n { deep: true, immediate: true },\n)\n\nconst uniqueId = (() => {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) return crypto.randomUUID()\n return `ip-${Date.now()}-${Math.random().toString(36).slice(2)}`\n})()\n\nconst imageCausationId = `${uniqueId}-image-picker-causation`\n\nonMounted(() => {\n if (!customElements.get('hvg-search-image')) {\n if (!document.querySelector(`script[src=\"${props.searchImageWidgetUrl}\"]`)) {\n const script = document.createElement('script')\n script.type = 'text/javascript'\n script.src = props.searchImageWidgetUrl\n script.async = true\n document.head.appendChild(script)\n }\n }\n})\n\nconst hasImage = computed(() => {\n return (\n local.value &&\n ((local.value.url && local.value.url.length > 0) ||\n (local.value.id && local.value.id.length > 0))\n )\n})\n\nconst imageUrl = computed(() => {\n if (!hasImage.value) return undefined\n if (local.value.url && local.value.url.length > 0) return local.value.url\n return `${props.imageBaseUrl}/${props.imageViewId}/${local.value.id}.img`\n})\n\nconst isHorizontal = computed(() => props.direction === 'horizontal')\n\nconst selectImage = (event: MouseEvent) => {\n event.preventDefault()\n showImageModal.value = true\n}\n\nconst resetImage = (event: MouseEvent) => {\n event.preventDefault()\n local.value = { ...defaultValue }\n}\n\nconst onImageSelected = (e: CustomEvent) => {\n if (e?.detail?.causationid === imageCausationId) {\n showImageModal.value = false\n\n if (e.detail?.image) {\n local.value = {\n id: e.detail.image.id,\n url: '',\n isAdult: e.detail.image.isAdult,\n source: e.detail.image.source,\n title: e.detail.image.title,\n }\n }\n }\n}\n\nonMounted(() => {\n window.addEventListener('image-selected', onImageSelected as EventListener)\n})\n\nonUnmounted(() => {\n window.removeEventListener('image-selected', onImageSelected as EventListener)\n})\n</script>\n\n<template>\n <div class=\"ac-component\">\n <div class=\"c-image-picker\">\n <div\n class=\"c-image-picker__container\"\n :class=\"{ 'c-image-picker__container--horizontal': isHorizontal }\"\n >\n <div class=\"c-image-picker__preview-section\">\n <div class=\"c-image-picker__preview\">\n <img\n v-if=\"hasImage\"\n :src=\"imageUrl\"\n :alt=\"local.title || 'Selected image'\"\n class=\"c-image-picker__img\"\n />\n <p v-else class=\"c-image-picker__placeholder\">Nincs kiválasztott kép</p>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"c-image-picker__buttons\">\n <Button\n type=\"success\"\n label=\"Kép kiválasztása\"\n class=\"nowrap\"\n @click=\"selectImage\"\n icon=\"fa-solid fa-image\"\n ></Button>\n <Button\n type=\"error\"\n label=\"Eltávolítás\"\n class=\"nowrap\"\n @click=\"resetImage\"\n icon=\"fa-solid fa-trash\"\n ></Button>\n </div>\n </div>\n\n <!-- Details Section -->\n <div v-if=\"details && local.id\" class=\"c-image-picker__details\">\n <!-- Source Input -->\n <div>\n <label for=\"image-source\" class=\"c-label\">Forrás</label>\n <div class=\"c-input-row\">\n <input\n v-model=\"local.source\"\n id=\"image-source\"\n type=\"text\"\n class=\"c-input\"\n placeholder=\"Kép forrása\"\n :disabled=\"!editable\"\n />\n </div>\n </div>\n\n <!-- Title/Alt Text Input -->\n <div>\n <label for=\"image-title\" class=\"c-label\">Cím / Alt szöveg</label>\n <div class=\"c-input-row\">\n <textarea\n v-model=\"local.title\"\n id=\"image-title\"\n class=\"c-input c-image-picker__textarea\"\n placeholder=\"Cím vagy alt szöveg\"\n :disabled=\"!editable\"\n />\n </div>\n </div>\n\n <!-- Adult Content Checkbox -->\n <Checkbox v-model=\"local.isAdult\" label=\"Felnőtt tartalom\" :disabled=\"!editable\" />\n </div>\n </div>\n\n <!-- Image Search Modal Dialog -->\n <Modal v-if=\"showImageModal\" @close=\"showImageModal = false\">\n <hvg-search-image\n :causationid=\"imageCausationId\"\n :viewid=\"imageViewId\"\n :environment=\"environment\"\n :aeurl=\"articleEditorUrl\"\n selectonly=\"true\"\n />\n </Modal>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/image-picker.scss\"></style>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admins-components48.js","names":[],"sources":["../src/components/custom/ImagePicker.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface ImagePickerModel {\n id: string\n url: string\n source: string\n title: string\n isAdult: boolean\n}\n\nexport interface ImagePickerProps {\n modelValue?: ImagePickerModel\n details?: boolean\n editable?: boolean\n direction?: 'horizontal' | 'vertical'\n articleEditorUrl: string\n environment: string\n searchImageWidgetUrl: string\n imageBaseUrl: string\n imageViewId: string\n}\n\nconst defaultValue: ImagePickerModel = {\n id: '',\n url: '',\n isAdult: false,\n source: '',\n title: '',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted, ref, watch } from 'vue'\nimport Modal from '@/components/Modal.vue'\nimport Button from '@/components/Button.vue'\nimport Checkbox from '@/components/Checkbox.vue'\n\nconst props = withDefaults(defineProps<ImagePickerProps>(), {\n modelValue: undefined,\n details: false,\n editable: false,\n direction: 'vertical',\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: ImagePickerModel): void\n}>()\n\nconst local = ref<ImagePickerModel>(defaultValue)\nconst showImageModal = ref(false)\n\nwatch(\n () => local.value,\n () => {\n emit('update:modelValue', local.value)\n },\n { deep: true },\n)\n\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (newValue) {\n local.value = newValue\n }\n },\n { deep: true, immediate: true },\n)\n\
|
|
1
|
+
{"version":3,"file":"admins-components48.js","names":[],"sources":["../src/components/custom/ImagePicker.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface ImagePickerModel {\n id: string\n url: string\n source: string\n title: string\n isAdult: boolean\n}\n\nexport interface ImagePickerProps {\n modelValue?: ImagePickerModel\n details?: boolean\n editable?: boolean\n direction?: 'horizontal' | 'vertical'\n articleEditorUrl: string\n environment: string\n searchImageWidgetUrl: string\n imageBaseUrl: string\n imageViewId: string\n}\n\nconst defaultValue: ImagePickerModel = {\n id: '',\n url: '',\n isAdult: false,\n source: '',\n title: '',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted, ref, watch } from 'vue'\nimport Modal from '@/components/Modal.vue'\nimport Button from '@/components/Button.vue'\nimport Checkbox from '@/components/Checkbox.vue'\n\nconst props = withDefaults(defineProps<ImagePickerProps>(), {\n modelValue: undefined,\n details: false,\n editable: false,\n direction: 'vertical',\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: ImagePickerModel): void\n}>()\n\nconst local = ref<ImagePickerModel>(defaultValue)\nconst showImageModal = ref(false)\n\nwatch(\n () => local.value,\n () => {\n emit('update:modelValue', local.value)\n },\n { deep: true },\n)\n\nwatch(\n () => props.modelValue,\n (newValue) => {\n if (newValue) {\n local.value = newValue\n }\n },\n { deep: true, immediate: true },\n)\n\nconst uniqueId = (() => {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) return crypto.randomUUID()\n return `ip-${Date.now()}-${Math.random().toString(36).slice(2)}`\n})()\n\nconst imageCausationId = `${uniqueId}-image-picker-causation`\n\nonMounted(() => {\n if (!customElements.get('hvg-search-image')) {\n if (!document.querySelector(`script[src=\"${props.searchImageWidgetUrl}\"]`)) {\n const script = document.createElement('script')\n script.type = 'text/javascript'\n script.src = props.searchImageWidgetUrl\n script.async = true\n document.head.appendChild(script)\n }\n }\n})\n\nconst hasImage = computed(() => {\n return (\n local.value &&\n ((local.value.url && local.value.url.length > 0) ||\n (local.value.id && local.value.id.length > 0))\n )\n})\n\nconst imageUrl = computed(() => {\n if (!hasImage.value) return undefined\n if (local.value.url && local.value.url.length > 0) return local.value.url\n return `${props.imageBaseUrl}/${props.imageViewId}/${local.value.id}.img`\n})\n\nconst isHorizontal = computed(() => props.direction === 'horizontal')\n\nconst selectImage = (event: MouseEvent) => {\n event.preventDefault()\n showImageModal.value = true\n}\n\nconst resetImage = (event: MouseEvent) => {\n event.preventDefault()\n local.value = { ...defaultValue }\n}\n\nconst onImageSelected = (e: CustomEvent) => {\n if (e?.detail?.causationid === imageCausationId) {\n showImageModal.value = false\n\n if (e.detail?.image) {\n local.value = {\n id: e.detail.image.id,\n url: '',\n isAdult: e.detail.image.isAdult,\n source: e.detail.image.source,\n title: e.detail.image.title,\n }\n }\n }\n}\n\nonMounted(() => {\n window.addEventListener('image-selected', onImageSelected as EventListener)\n})\n\nonUnmounted(() => {\n window.removeEventListener('image-selected', onImageSelected as EventListener)\n})\n</script>\n\n<template>\n <div class=\"ac-component\">\n <div class=\"c-image-picker\">\n <div\n class=\"c-image-picker__container\"\n :class=\"{ 'c-image-picker__container--horizontal': isHorizontal }\"\n >\n <div class=\"c-image-picker__preview-section\">\n <div class=\"c-image-picker__preview\">\n <img\n v-if=\"hasImage\"\n :src=\"imageUrl\"\n :alt=\"local.title || 'Selected image'\"\n class=\"c-image-picker__img\"\n />\n <p v-else class=\"c-image-picker__placeholder\">Nincs kiválasztott kép</p>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"c-image-picker__buttons\">\n <Button\n type=\"success\"\n label=\"Kép kiválasztása\"\n class=\"nowrap\"\n @click=\"selectImage\"\n icon=\"fa-solid fa-image\"\n ></Button>\n <Button\n type=\"error\"\n label=\"Eltávolítás\"\n class=\"nowrap\"\n @click=\"resetImage\"\n icon=\"fa-solid fa-trash\"\n ></Button>\n </div>\n </div>\n\n <!-- Details Section -->\n <div v-if=\"details && local.id\" class=\"c-image-picker__details\">\n <!-- Source Input -->\n <div>\n <label for=\"image-source\" class=\"c-label\">Forrás</label>\n <div class=\"c-input-row\">\n <input\n v-model=\"local.source\"\n id=\"image-source\"\n type=\"text\"\n class=\"c-input\"\n placeholder=\"Kép forrása\"\n :disabled=\"!editable\"\n />\n </div>\n </div>\n\n <!-- Title/Alt Text Input -->\n <div>\n <label for=\"image-title\" class=\"c-label\">Cím / Alt szöveg</label>\n <div class=\"c-input-row\">\n <textarea\n v-model=\"local.title\"\n id=\"image-title\"\n class=\"c-input c-image-picker__textarea\"\n placeholder=\"Cím vagy alt szöveg\"\n :disabled=\"!editable\"\n />\n </div>\n </div>\n\n <!-- Adult Content Checkbox -->\n <Checkbox v-model=\"local.isAdult\" label=\"Felnőtt tartalom\" :disabled=\"!editable\" />\n </div>\n </div>\n\n <!-- Image Search Modal Dialog -->\n <Modal v-if=\"showImageModal\" @close=\"showImageModal = false\">\n <hvg-search-image\n :causationid=\"imageCausationId\"\n :viewid=\"imageViewId\"\n :environment=\"environment\"\n :aeurl=\"articleEditorUrl\"\n selectonly=\"true\"\n />\n </Modal>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/image-picker.scss\"></style>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admins-components54.js","names":[],"sources":["../src/components/ToastNotification.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type ToastType = 'info' | 'success' | 'warning' | 'error'\n\nexport type ToastPosition =\n | 'top-right'\n | 'top-center'\n | 'top-left'\n | 'middle-right'\n | 'middle-center'\n | 'middle-left'\n | 'bottom-right'\n | 'bottom-center'\n | 'bottom-left'\n\nexport interface ToastInput {\n title: string\n message: string\n type?: ToastType\n displayDuration?: number\n position?: ToastPosition\n id?: number\n}\n\nexport interface Toast extends Required<ToastInput> {\n id: number\n addedAt: number\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { getCurrentInstance, onBeforeUnmount, onMounted, ref } from 'vue'\nimport { __setToastInstance, type ToastExposed } from '@/services/toast'\n\nexport interface ToastNotificationProps {\n defaultPosition?: ToastPosition\n defaultDisplayDuration?: number\n}\n\nconst props = withDefaults(defineProps<ToastNotificationProps>(), {\n defaultPosition: 'bottom-right',\n defaultDisplayDuration: 5000,\n})\n\nconst TICK_MS = 500\nlet timer: ReturnType<typeof setInterval> | null = null\nlet nextId = 0\n\nconst toasts = ref<Toast[]>([])\n\nfunction addToast(input: ToastInput): number {\n const id = input.id ?? ++nextId\n const toast: Toast = {\n id,\n title: input.title,\n message: input.message,\n type: input.type ?? 'info',\n displayDuration: input.displayDuration ?? props.defaultDisplayDuration,\n position: input.position ?? props.defaultPosition,\n addedAt: Date.now(),\n }\n toasts.value.push(toast)\n return id\n}\n\nfunction dismiss(id: number): void {\n toasts.value = toasts.value.filter((t) => t.id !== id)\n}\n\
|
|
1
|
+
{"version":3,"file":"admins-components54.js","names":[],"sources":["../src/components/ToastNotification.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type ToastType = 'info' | 'success' | 'warning' | 'error'\n\nexport type ToastPosition =\n | 'top-right'\n | 'top-center'\n | 'top-left'\n | 'middle-right'\n | 'middle-center'\n | 'middle-left'\n | 'bottom-right'\n | 'bottom-center'\n | 'bottom-left'\n\nexport interface ToastInput {\n title: string\n message: string\n type?: ToastType\n displayDuration?: number\n position?: ToastPosition\n id?: number\n}\n\nexport interface Toast extends Required<ToastInput> {\n id: number\n addedAt: number\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { getCurrentInstance, onBeforeUnmount, onMounted, ref } from 'vue'\nimport { __setToastInstance, type ToastExposed } from '@/services/toast'\n\nexport interface ToastNotificationProps {\n defaultPosition?: ToastPosition\n defaultDisplayDuration?: number\n}\n\nconst props = withDefaults(defineProps<ToastNotificationProps>(), {\n defaultPosition: 'bottom-right',\n defaultDisplayDuration: 5000,\n})\n\nconst TICK_MS = 500\nlet timer: ReturnType<typeof setInterval> | null = null\nlet nextId = 0\n\nconst toasts = ref<Toast[]>([])\n\nfunction addToast(input: ToastInput): number {\n const id = input.id ?? ++nextId\n const toast: Toast = {\n id,\n title: input.title,\n message: input.message,\n type: input.type ?? 'info',\n displayDuration: input.displayDuration ?? props.defaultDisplayDuration,\n position: input.position ?? props.defaultPosition,\n addedAt: Date.now(),\n }\n toasts.value.push(toast)\n return id\n}\n\nfunction dismiss(id: number): void {\n toasts.value = toasts.value.filter((t) => t.id !== id)\n}\n\nfunction tick(): void {\n const now = Date.now()\n toasts.value = toasts.value.filter((t) => now - t.addedAt < t.displayDuration)\n}\n\nif (!timer) {\n timer = setInterval(tick, TICK_MS)\n}\n\nonBeforeUnmount(() => {\n if (timer) {\n clearInterval(timer)\n timer = null\n }\n})\n\ndefineExpose({ addToast, dismiss })\n\n//Singleton\nconst ownInstance = getCurrentInstance()\nonMounted(() => {\n __setToastInstance((ownInstance?.exposed as ToastExposed | null) ?? null)\n})\nonBeforeUnmount(() => {\n __setToastInstance(null)\n})\n\nfunction iconFor(type: ToastType): string {\n switch (type) {\n case 'success':\n return 'fa-solid fa-circle-check'\n case 'warning':\n return 'fa-solid fa-triangle-exclamation'\n case 'error':\n return 'fa-solid fa-circle-xmark'\n case 'info':\n default:\n return 'fa-solid fa-circle-info'\n }\n}\n\nfunction getStackIndex(toast: Toast): number {\n let index = 0\n for (const t of toasts.value) {\n if (t.id === toast.id) break\n if (t.position === toast.position) index++\n }\n return index\n}\n</script>\n\n<template>\n <div class=\"ac-component\">\n <TransitionGroup tag=\"div\" class=\"c-toast-container\" name=\"c-toast\">\n <div\n v-for=\"toast in toasts\"\n :key=\"toast.id\"\n class=\"c-toast\"\n :class=\"[`c-toast--${toast.type}`, `c-toast--pos-${toast.position}`]\"\n :style=\"{ '--stack-index': getStackIndex(toast) }\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <i class=\"c-toast__icon\" :class=\"iconFor(toast.type)\" aria-hidden=\"true\"></i>\n <div class=\"c-toast__body\">\n <div v-if=\"toast.title\" class=\"c-toast__title\">{{ toast.title }}</div>\n <div class=\"c-toast__message\">{{ toast.message }}</div>\n </div>\n <button\n type=\"button\"\n class=\"c-toast__close\"\n aria-label=\"Bezárás\"\n @click=\"dismiss(toast.id)\"\n >\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </TransitionGroup>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/toast-notification.scss\"></style>\n"],"mappings":";;;;;;;;;;;;;EAsCA,IAAM,IAAQ,GAMV,IAA+C,MAC/C,IAAS,GAEP,IAAS,EAAa,CAAC,CAAC;EAE9B,SAAS,EAAS,GAA2B;GAC3C,IAAM,IAAK,EAAM,MAAM,EAAE,GACnB,IAAe;IACnB;IACA,OAAO,EAAM;IACb,SAAS,EAAM;IACf,MAAM,EAAM,QAAQ;IACpB,iBAAiB,EAAM,mBAAmB,EAAM;IAChD,UAAU,EAAM,YAAY,EAAM;IAClC,SAAS,KAAK,IAAI;GACpB;GAEA,OADA,EAAO,MAAM,KAAK,CAAK,GAChB;EACT;EAEA,SAAS,EAAQ,GAAkB;GACjC,EAAO,QAAQ,EAAO,MAAM,QAAQ,MAAM,EAAE,OAAO,CAAE;EACvD;EAEA,SAAS,IAAa;GACpB,IAAM,IAAM,KAAK,IAAI;GACrB,EAAO,QAAQ,EAAO,MAAM,QAAQ,MAAM,IAAM,EAAE,UAAU,EAAE,eAAe;EAC/E;EAaA,AAXA,AACE,MAAQ,YAAY,GAAM,GAAO,GAGnC,QAAsB;GACpB,AAEE,OADA,cAAc,CAAK,GACX;EAEZ,CAAC,GAED,EAAa;GAAE;GAAU;EAAQ,CAAC;EAGlC,IAAM,IAAc,EAAmB;EAIvC,AAHA,QAAgB;GACd,EAAoB,GAAa,WAAmC,IAAI;EAC1E,CAAC,GACD,QAAsB;GACpB,EAAmB,IAAI;EACzB,CAAC;EAED,SAAS,EAAQ,GAAyB;GACxC,QAAQ,GAAR;IACE,KAAK,WACH,OAAO;IACT,KAAK,WACH,OAAO;IACT,KAAK,SACH,OAAO;IAET,SACE,OAAO;GACX;EACF;EAEA,SAAS,EAAc,GAAsB;GAC3C,IAAI,IAAQ;GACZ,KAAK,IAAM,KAAK,EAAO,OAAO;IAC5B,IAAI,EAAE,OAAO,EAAM,IAAI;IACvB,AAAI,EAAE,aAAa,EAAM,YAAU;GACrC;GACA,OAAO;EACT;oBAIE,EAAA,GAAA,EA0BM,OA1BN,GA0BM,CAzBJ,EAwBkB,GAAA;GAxBD,KAAI;GAAM,OAAM;GAAoB,MAAK;;GAEtD,SAAA,QAAuB,EADzB,EAAA,EAAA,GAAA,EAsBM,GAAA,MAAA,EArBY,EAAA,QAAT,OADT,EAAA,GAAA,EAsBM,OAAA;IApBH,KAAK,EAAM;IACZ,OAAK,EAAA,CAAC,WAAS,CAAA,YACM,EAAM,QAAI,gBAAoB,EAAM,UAAQ,CAAA,CAAA;IAChE,OAAK,EAAA,EAAA,iBAAqB,EAAc,CAAK,EAAA,CAAA;IAC9C,MAAK;IACL,aAAU;;IAEV,EAA6E,KAAA;KAA1E,OAAK,EAAA,CAAC,iBAAwB,EAAQ,EAAM,IAAI,CAAA,CAAA;KAAG,eAAY;;IAClE,EAGM,OAHN,GAGM,CAFO,EAAM,SAAjB,EAAA,GAAA,EAAsE,OAAtE,GAAsE,EAApB,EAAM,KAAK,GAAA,CAAA,KAAA,EAAA,IAAA,EAAA,GAC7D,EAAuD,OAAvD,GAAuD,EAAtB,EAAM,OAAO,GAAA,CAAA,CAAA,CAAA;IAEhD,EAOS,UAAA;KANP,MAAK;KACL,OAAM;KACN,cAAW;KACV,UAAK,MAAE,EAAQ,EAAM,EAAE;IAExB,GAAA,CAAA,GAAA,AAAA,EAAA,OAAA,CAAA,EAAoD,KAAA;KAAjD,OAAM;KAAoB,eAAY"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admins-components56.js","names":[],"sources":["../src/components/ToastNotification.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type ToastType = 'info' | 'success' | 'warning' | 'error'\n\nexport type ToastPosition =\n | 'top-right'\n | 'top-center'\n | 'top-left'\n | 'middle-right'\n | 'middle-center'\n | 'middle-left'\n | 'bottom-right'\n | 'bottom-center'\n | 'bottom-left'\n\nexport interface ToastInput {\n title: string\n message: string\n type?: ToastType\n displayDuration?: number\n position?: ToastPosition\n id?: number\n}\n\nexport interface Toast extends Required<ToastInput> {\n id: number\n addedAt: number\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { getCurrentInstance, onBeforeUnmount, onMounted, ref } from 'vue'\nimport { __setToastInstance, type ToastExposed } from '@/services/toast'\n\nexport interface ToastNotificationProps {\n defaultPosition?: ToastPosition\n defaultDisplayDuration?: number\n}\n\nconst props = withDefaults(defineProps<ToastNotificationProps>(), {\n defaultPosition: 'bottom-right',\n defaultDisplayDuration: 5000,\n})\n\nconst TICK_MS = 500\nlet timer: ReturnType<typeof setInterval> | null = null\nlet nextId = 0\n\nconst toasts = ref<Toast[]>([])\n\nfunction addToast(input: ToastInput): number {\n const id = input.id ?? ++nextId\n const toast: Toast = {\n id,\n title: input.title,\n message: input.message,\n type: input.type ?? 'info',\n displayDuration: input.displayDuration ?? props.defaultDisplayDuration,\n position: input.position ?? props.defaultPosition,\n addedAt: Date.now(),\n }\n toasts.value.push(toast)\n return id\n}\n\nfunction dismiss(id: number): void {\n toasts.value = toasts.value.filter((t) => t.id !== id)\n}\n\
|
|
1
|
+
{"version":3,"file":"admins-components56.js","names":[],"sources":["../src/components/ToastNotification.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type ToastType = 'info' | 'success' | 'warning' | 'error'\n\nexport type ToastPosition =\n | 'top-right'\n | 'top-center'\n | 'top-left'\n | 'middle-right'\n | 'middle-center'\n | 'middle-left'\n | 'bottom-right'\n | 'bottom-center'\n | 'bottom-left'\n\nexport interface ToastInput {\n title: string\n message: string\n type?: ToastType\n displayDuration?: number\n position?: ToastPosition\n id?: number\n}\n\nexport interface Toast extends Required<ToastInput> {\n id: number\n addedAt: number\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { getCurrentInstance, onBeforeUnmount, onMounted, ref } from 'vue'\nimport { __setToastInstance, type ToastExposed } from '@/services/toast'\n\nexport interface ToastNotificationProps {\n defaultPosition?: ToastPosition\n defaultDisplayDuration?: number\n}\n\nconst props = withDefaults(defineProps<ToastNotificationProps>(), {\n defaultPosition: 'bottom-right',\n defaultDisplayDuration: 5000,\n})\n\nconst TICK_MS = 500\nlet timer: ReturnType<typeof setInterval> | null = null\nlet nextId = 0\n\nconst toasts = ref<Toast[]>([])\n\nfunction addToast(input: ToastInput): number {\n const id = input.id ?? ++nextId\n const toast: Toast = {\n id,\n title: input.title,\n message: input.message,\n type: input.type ?? 'info',\n displayDuration: input.displayDuration ?? props.defaultDisplayDuration,\n position: input.position ?? props.defaultPosition,\n addedAt: Date.now(),\n }\n toasts.value.push(toast)\n return id\n}\n\nfunction dismiss(id: number): void {\n toasts.value = toasts.value.filter((t) => t.id !== id)\n}\n\nfunction tick(): void {\n const now = Date.now()\n toasts.value = toasts.value.filter((t) => now - t.addedAt < t.displayDuration)\n}\n\nif (!timer) {\n timer = setInterval(tick, TICK_MS)\n}\n\nonBeforeUnmount(() => {\n if (timer) {\n clearInterval(timer)\n timer = null\n }\n})\n\ndefineExpose({ addToast, dismiss })\n\n//Singleton\nconst ownInstance = getCurrentInstance()\nonMounted(() => {\n __setToastInstance((ownInstance?.exposed as ToastExposed | null) ?? null)\n})\nonBeforeUnmount(() => {\n __setToastInstance(null)\n})\n\nfunction iconFor(type: ToastType): string {\n switch (type) {\n case 'success':\n return 'fa-solid fa-circle-check'\n case 'warning':\n return 'fa-solid fa-triangle-exclamation'\n case 'error':\n return 'fa-solid fa-circle-xmark'\n case 'info':\n default:\n return 'fa-solid fa-circle-info'\n }\n}\n\nfunction getStackIndex(toast: Toast): number {\n let index = 0\n for (const t of toasts.value) {\n if (t.id === toast.id) break\n if (t.position === toast.position) index++\n }\n return index\n}\n</script>\n\n<template>\n <div class=\"ac-component\">\n <TransitionGroup tag=\"div\" class=\"c-toast-container\" name=\"c-toast\">\n <div\n v-for=\"toast in toasts\"\n :key=\"toast.id\"\n class=\"c-toast\"\n :class=\"[`c-toast--${toast.type}`, `c-toast--pos-${toast.position}`]\"\n :style=\"{ '--stack-index': getStackIndex(toast) }\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <i class=\"c-toast__icon\" :class=\"iconFor(toast.type)\" aria-hidden=\"true\"></i>\n <div class=\"c-toast__body\">\n <div v-if=\"toast.title\" class=\"c-toast__title\">{{ toast.title }}</div>\n <div class=\"c-toast__message\">{{ toast.message }}</div>\n </div>\n <button\n type=\"button\"\n class=\"c-toast__close\"\n aria-label=\"Bezárás\"\n @click=\"dismiss(toast.id)\"\n >\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </TransitionGroup>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/toast-notification.scss\"></style>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admins-components65.js","names":[],"sources":["../src/utils/dataListConverters.ts"],"sourcesContent":["import { h } from 'vue'\nimport { castToDate, formatDate } from '@/utils/date'\nimport TagList from '@/components/data-table/TagList.vue'\n\ntype Converter = (value: unknown, item?: unknown) => unknown\n\nexport function utcToLocalString(time = false, format?: string): Converter {\n return (value) => {\n const d = castToDate(value)\n if (!d) return ''\n if (format) return formatDate(d, format)\n if (time) return formatDate(d, 'YYYY-MM-DD HH:mm')\n return formatDate(d, 'YYYY-MM-DD');\n }\n}\nexport function shortUuid(length = 3): Converter {\n return (value) => {\n if (!value) return ''\n const s = typeof value === 'string' ? value : String(value)\n return `${s.slice(0, length)}...${s.slice(-length)}`\n }\n}\n\nexport function localToLocalString(format = 'YYYY-MM-DD'): Converter {\n return (value) => {\n const d = castToDate(value)\n return d ? formatDate(d, format) : ''\n }\n}\n\nexport function textEllipse(max = 60, suffix = '…'): Converter {\n return (value) => {\n const s = typeof value === 'string' ? value : value == null ? '' : String(value)\n if (s.length <= max) return s\n return s.slice(0, max).trimEnd() + suffix\n }\n}\n\nexport function booleanToString(trueLabel = 'Igen', falseLabel = 'Nem', fallback = ''): Converter {\n return (value) => {\n if (value === true) return trueLabel\n if (value === false) return falseLabel\n return fallback\n }\n}\n\nexport function enumMap<T = unknown>(map: Record<string, T>, fallback?: T): Converter {\n return (value) => {\n if (value == null) return fallback ?? ''\n const key = String(value)\n return key in map ? map[key] : (fallback ?? value)\n }\n}\n\nexport function formatNumber(decimals = 0, locale = 'hu-HU'): Converter {\n return (value) => {\n const n = typeof value === 'number' ? value : Number(value)\n if (!Number.isFinite(n)) return value\n return n.toLocaleString(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n })\n }\n}\n\nexport function formatCurrency(currencyCode = 'HUF', locale = 'hu-HU', decimals = 0): Converter {\n return (value) => {\n const n = typeof value === 'number' ? value : Number(value)\n if (!Number.isFinite(n)) return value\n return n.toLocaleString(locale, {\n style: 'currency',\n currency: currencyCode,\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n })\n }\n}\n\nexport function listToString(\n separator = ', ',\n boldFirstItem = false,\n): Converter {\n return (value) => {\n if (Array.isArray(value)) {\n const parts = value.map(String)\n if (!boldFirstItem || parts.length === 0) {\n return parts.join(separator)\n }\n const [head, ...rest] = parts\n return `<strong>${head}</strong>${rest.length ? separator + rest.join(separator) : ''}`\n }\n if (value == null) return ''\n return String(value)\n }\n}\n
|
|
1
|
+
{"version":3,"file":"admins-components65.js","names":[],"sources":["../src/utils/dataListConverters.ts"],"sourcesContent":["import { h } from 'vue'\nimport { castToDate, formatDate } from '@/utils/date'\nimport TagList from '@/components/data-table/TagList.vue'\n\ntype Converter = (value: unknown, item?: unknown) => unknown\n\nexport function utcToLocalString(time = false, format?: string): Converter {\n return (value) => {\n const d = castToDate(value)\n if (!d) return ''\n if (format) return formatDate(d, format)\n if (time) return formatDate(d, 'YYYY-MM-DD HH:mm')\n return formatDate(d, 'YYYY-MM-DD');\n }\n}\nexport function shortUuid(length = 3): Converter {\n return (value) => {\n if (!value) return ''\n const s = typeof value === 'string' ? value : String(value)\n return `${s.slice(0, length)}...${s.slice(-length)}`\n }\n}\n\nexport function localToLocalString(format = 'YYYY-MM-DD'): Converter {\n return (value) => {\n const d = castToDate(value)\n return d ? formatDate(d, format) : ''\n }\n}\n\nexport function textEllipse(max = 60, suffix = '…'): Converter {\n return (value) => {\n const s = typeof value === 'string' ? value : value == null ? '' : String(value)\n if (s.length <= max) return s\n return s.slice(0, max).trimEnd() + suffix\n }\n}\n\nexport function booleanToString(trueLabel = 'Igen', falseLabel = 'Nem', fallback = ''): Converter {\n return (value) => {\n if (value === true) return trueLabel\n if (value === false) return falseLabel\n return fallback\n }\n}\n\nexport function enumMap<T = unknown>(map: Record<string, T>, fallback?: T): Converter {\n return (value) => {\n if (value == null) return fallback ?? ''\n const key = String(value)\n return key in map ? map[key] : (fallback ?? value)\n }\n}\n\nexport function formatNumber(decimals = 0, locale = 'hu-HU'): Converter {\n return (value) => {\n const n = typeof value === 'number' ? value : Number(value)\n if (!Number.isFinite(n)) return value\n return n.toLocaleString(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n })\n }\n}\n\nexport function formatCurrency(currencyCode = 'HUF', locale = 'hu-HU', decimals = 0): Converter {\n return (value) => {\n const n = typeof value === 'number' ? value : Number(value)\n if (!Number.isFinite(n)) return value\n return n.toLocaleString(locale, {\n style: 'currency',\n currency: currencyCode,\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n })\n }\n}\n\nexport function listToString(\n separator = ', ',\n boldFirstItem = false,\n): Converter {\n return (value) => {\n if (Array.isArray(value)) {\n const parts = value.map(String)\n if (!boldFirstItem || parts.length === 0) {\n return parts.join(separator)\n }\n const [head, ...rest] = parts\n return `<strong>${head}</strong>${rest.length ? separator + rest.join(separator) : ''}`\n }\n if (value == null) return ''\n return String(value)\n }\n}\n\nexport function tagList(\n options: { visibleCount?: number; class?: string } = {},\n): Converter {\n const { visibleCount = 3, class: cls } = options\n return (value) => {\n if (!Array.isArray(value)) return h(TagList, { items: [], visibleCount, class: cls })\n const items = value as Array<string | { label?: string; id?: string | number }>\n return h(TagList, { items, visibleCount, class: cls })\n }\n}\nexport const identity: Converter = (value) => value\n\nexport const dataListConverters = {\n utcToLocalString,\n localToLocalString,\n shortUuid,\n textEllipse,\n booleanToString,\n enumMap,\n formatNumber,\n formatCurrency,\n listToString,\n tagList,\n identity,\n} as const\n"],"mappings":";;;;AAMA,SAAgB,EAAiB,IAAO,IAAO,GAA4B;CACzE,QAAQ,MAAU;EAChB,IAAM,IAAI,EAAW,CAAK;EAI1B,OAHK,IACD,IAAe,EAAW,GAAG,CAAM,IACnC,IAAa,EAAW,GAAG,kBAAkB,IAC1C,EAAW,GAAG,YAAY,IAHlB;CAIjB;AACF;AACA,SAAgB,EAAU,IAAS,GAAc;CAC/C,QAAQ,MAAU;EAChB,IAAI,CAAC,GAAO,OAAO;EACnB,IAAM,IAAI,OAAO,KAAU,WAAW,IAAQ,OAAO,CAAK;EAC1D,OAAO,GAAG,EAAE,MAAM,GAAG,CAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAM;CACnD;AACF;AAEA,SAAgB,EAAmB,IAAS,cAAyB;CACnE,QAAQ,MAAU;EAChB,IAAM,IAAI,EAAW,CAAK;EAC1B,OAAO,IAAI,EAAW,GAAG,CAAM,IAAI;CACrC;AACF;AAEA,SAAgB,EAAY,IAAM,IAAI,IAAS,KAAgB;CAC7D,QAAQ,MAAU;EAChB,IAAM,IAAI,OAAO,KAAU,WAAW,IAAQ,KAAS,OAAO,KAAK,OAAO,CAAK;EAE/E,OADI,EAAE,UAAU,IAAY,IACrB,EAAE,MAAM,GAAG,CAAG,CAAC,CAAC,QAAQ,IAAI;CACrC;AACF;AAEA,SAAgB,EAAgB,IAAY,QAAQ,IAAa,OAAO,IAAW,IAAe;CAChG,QAAQ,MACF,MAAU,KAAa,IACvB,MAAU,KAAc,IACrB;AAEX;AAEA,SAAgB,EAAqB,GAAwB,GAAyB;CACpF,QAAQ,MAAU;EAChB,IAAI,KAAS,MAAM,OAAO,KAAY;EACtC,IAAM,IAAM,OAAO,CAAK;EACxB,OAAO,KAAO,IAAM,EAAI,KAAQ,KAAY;CAC9C;AACF;AAEA,SAAgB,EAAa,IAAW,GAAG,IAAS,SAAoB;CACtE,QAAQ,MAAU;EAChB,IAAM,IAAI,OAAO,KAAU,WAAW,IAAQ,OAAO,CAAK;EAE1D,OADK,OAAO,SAAS,CAAC,IACf,EAAE,eAAe,GAAQ;GAC9B,uBAAuB;GACvB,uBAAuB;EACzB,CAAC,IAJ+B;CAKlC;AACF;AAEA,SAAgB,EAAe,IAAe,OAAO,IAAS,SAAS,IAAW,GAAc;CAC9F,QAAQ,MAAU;EAChB,IAAM,IAAI,OAAO,KAAU,WAAW,IAAQ,OAAO,CAAK;EAE1D,OADK,OAAO,SAAS,CAAC,IACf,EAAE,eAAe,GAAQ;GAC9B,OAAO;GACP,UAAU;GACV,uBAAuB;GACvB,uBAAuB;EACzB,CAAC,IAN+B;CAOlC;AACF;AAEA,SAAgB,EACd,IAAY,MACZ,IAAgB,IACL;CACX,QAAQ,MAAU;EAChB,IAAI,MAAM,QAAQ,CAAK,GAAG;GACxB,IAAM,IAAQ,EAAM,IAAI,MAAM;GAC9B,IAAI,CAAC,KAAiB,EAAM,WAAW,GACrC,OAAO,EAAM,KAAK,CAAS;GAE7B,IAAM,CAAC,GAAM,GAAG,KAAQ;GACxB,OAAO,WAAW,EAAK,WAAW,EAAK,SAAS,IAAY,EAAK,KAAK,CAAS,IAAI;EACrF;EAEA,OADI,KAAS,OAAa,KACnB,OAAO,CAAK;CACrB;AACF;AAEA,SAAgB,EACd,IAAqD,CAAC,GAC3C;CACX,IAAM,EAAE,kBAAe,GAAG,OAAO,MAAQ;CACzC,QAAQ,MACD,MAAM,QAAQ,CAAK,IAEjB,EAAE,GAAS;EAAE,OAAA;EAAO;EAAc,OAAO;CAAI,CAAC,IAFnB,EAAE,GAAS;EAAE,OAAO,CAAC;EAAG;EAAc,OAAO;CAAI,CAAC;AAIxF;AACA,IAAa,KAAuB,MAAU,GAEjC,IAAqB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admins-components68.js","names":["$slots"],"sources":["../src/components/data-table/DataTable.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type {\n LayoutMode,\n DataListConfig,\n DataListSettings,\n DataTableSettings,\n DataCardsSettings,\n Column,\n Sort,\n Action,\n ActionGroup,\n FilterConfig,\n FilterValue,\n} from '@/types/data-list'\n\nexport {\n dataTableSettingsDefaults,\n dataCardsSettingsDefaults,\n dataListSettingsDefaults,\n} from '@/types/data-list'\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref, onMounted, watch, nextTick } from 'vue'\nimport Checkbox from '@/components/Checkbox.vue'\nimport { useSelection } from '@/composables/useSelection'\nimport { dataTableSettingsDefaults } from '@/types/data-list'\nimport type { Column, DataListConfig, DataTableSettings, Sort } from '@/types/data-list'\nimport Loader from '@/components/Loader.vue'\nimport DataCell from './DataCell.vue'\nimport DataListActions from './DataListActions.vue'\n\ntype SortDirection = 'asc' | 'desc'\n\nconst props = withDefaults(\n defineProps<{\n config: DataListConfig\n items: Record<string, unknown>[]\n settings?: DataTableSettings\n loading?: boolean\n initialSort?: { key: string; direction: SortDirection } | null\n }>(),\n {\n settings: () => ({ ...dataTableSettingsDefaults }),\n loading: false,\n initialSort: null,\n },\n)\n\nconst emit = defineEmits<{\n 'selection-change': [selected: unknown[]]\n 'sort-change': [sort: { key: string; direction: SortDirection }]\n}>()\n\n//const CHARACTER_BREAKPOINT = 20\n\nconst activeSort = ref<{\n key: string\n direction: SortDirection\n} | null>(null)\n\nconst tableWrapperRef = ref<HTMLElement | null>(null)\n\nwatch(\n () => props.loading,\n async (isLoading) => {\n if (isLoading) {\n await nextTick()\n tableWrapperRef.value?.scrollTo({ top: 0, behavior: 'smooth' })\n }\n },\n)\n\nconst {\n selectedKeys,\n allSelected,\n toggle: toggleRow,\n toggleAll,\n} = useSelection(\n () => props.items,\n () => props.config.selectableAttr,\n (s) => emit('selection-change', s),\n)\n\nconst visibleColumns = computed(() => props.config.columns.filter((c) => c.visible !== false))\n\nfunction getSortConfig(col: Column): Sort | null {\n if (!col.sort) return null\n return typeof col.sort === 'boolean' ? null : col.sort\n}\n\nfunction isSortable(col: Column): boolean {\n return !!col.sort\n}\n\nfunction handleSort(col: Column) {\n const key = col.property\n const direction: SortDirection =\n activeSort.value?.key === key && activeSort.value.direction === 'asc' ? 'desc' : 'asc'\n\n activeSort.value = { key, direction }\n getSortConfig(col)?.callback?.(key, direction)\n\n emit('sort-change', { key, direction })\n}\n\nfunction applyInitialSort(sort: { key: string; direction: SortDirection } | null | undefined) {\n if (!sort) {\n if (activeSort.value !== null) activeSort.value = null\n return\n }\n const col = props.config.columns.find((c) => c.property === sort.key)\n if (!col) return\n if (activeSort.value?.key === sort.key && activeSort.value.direction === sort.direction) return\n activeSort.value = { key: sort.key, direction: sort.direction }\n getSortConfig(col)?.callback?.(sort.key, sort.direction)\n emit('sort-change', { key: sort.key, direction: sort.direction })\n}\n\nonMounted(() => applyInitialSort(props.initialSort))\nwatch(\n () => props.initialSort,\n (s) => {\n // When initialSort changes, sync the visual indicator only.\n // Don't re-emit sort-change — that would cause an infinite loop with\n // parents that re-assign the prop from the emitted value.\n if (!s) {\n if (activeSort.value !== null) activeSort.value = null\n return\n }\n const col = props.config.columns.find((c) => c.property === s.key)\n if (!col) return\n if (activeSort.value?.key === s.key && activeSort.value.direction === s.direction) return\n activeSort.value = { key: s.key, direction: s.direction }\n },\n)\n</script>\n\n<template>\n <div\n ref=\"tableWrapperRef\"\n class=\"ac-component c-table-wrapper list-table-view\"\n :class=\"{ 'is-loading': loading }\"\n >\n <!-- :style=\"{ '--action-count': config.actions?.length ?? 0 }\" -->\n <table class=\"c-table\" :class=\"{ 'is-compact': settings.compact }\">\n <thead>\n <tr>\n <th v-if=\"config.selectableAttr\">\n <Checkbox :model-value=\"allSelected\" @update:model-value=\"toggleAll\" />\n </th>\n\n <th\n v-for=\"col in visibleColumns\"\n :key=\"col.property\"\n :class=\"[\n {\n 'c-sortable': isSortable(col),\n 'c-sortable--sorted': activeSort?.key === col.property,\n 'primary-col': col.primary,\n },\n col.headerClass,\n ]\"\n :title=\"isSortable(col) ? `Sorrendezés ${col.label} alapján` : undefined\"\n @click=\"isSortable(col) ? handleSort(col) : undefined\"\n >\n {{ !col.hideHeader ? col.label : '' }}\n\n <span\n v-if=\"isSortable(col)\"\n class=\"c-sort-icon fa-solid\"\n :class=\"{\n 'fa-sort': activeSort?.key !== col.property,\n 'fa-sort-down': activeSort?.key === col.property && activeSort.direction === 'desc',\n 'fa-sort-up': activeSort?.key === col.property && activeSort.direction === 'asc',\n 'c-sort-icon--active': activeSort?.key === col.property,\n 'is-asc': activeSort?.key === col.property && activeSort.direction === 'asc',\n 'is-desc': activeSort?.key === col.property && activeSort.direction === 'desc',\n }\"\n ></span>\n </th>\n\n <th v-if=\"config.actions\" class=\"c-actions-header\">\n {{ config.actionHeader ?? '' }}\n </th>\n </tr>\n </thead>\n\n <tbody v-if=\"!loading || items.length > 0\">\n <tr\n v-for=\"(item, index) in items\"\n :key=\"index\"\n :class=\"{\n 'is-selected': config.selectableAttr && selectedKeys.has(item[config.selectableAttr]),\n 'is-striped': settings.striped && index % 2 === 1,\n }\"\n >\n <td v-if=\"config.selectableAttr\" class=\"pointer\" @click.stop=\"toggleRow(item)\">\n <Checkbox\n :model-value=\"!!selectedKeys.has(item[config.selectableAttr])\"\n @update:model-value=\"toggleRow(item)\"\n @click.stop\n />\n </td>\n\n <td\n v-for=\"col in visibleColumns\"\n :key=\"col.property\"\n class=\"c-table__cell\"\n :class=\"[\n col.class,\n { 'primary-col': col.primary },\n /* { 'is-nowrap': String(getColumnValue(item, col) ?? '').length < CHARACTER_BREAKPOINT}, */\n ]\"\n >\n <slot :name=\"`cell:${col.property}`\" :item=\"item\" :col=\"col\">\n <DataCell :item=\"item\" :col=\"col\" :copy=\"!col.hideCopyToClipboard\" />\n </slot>\n </td>\n\n <td v-if=\"config.actions\" class=\"c-actions-cell\">\n <slot\n v-if=\"$slots.actions\"\n name=\"actions\"\n :item=\"item\"\n :index=\"index\"\n :actions=\"config.actions\"\n />\n <div v-else class=\"c-actions-wrap\">\n <DataListActions :actions=\"config.actions\" :item=\"item\" />\n </div>\n </td>\n </tr>\n </tbody>\n <tbody v-else>\n <tr class=\"c-table__loading-row\">\n <td\n :colspan=\"\n visibleColumns.length + (config.selectableAttr ? 1 : 0) + (config.actions ? 1 : 0)\n \"\n class=\"c-table__loading-cell\"\n >\n <div class=\"c-table__loading-wrap\">\n <Loader :loading=\"true\" size=\"2.5rem\" />\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <div v-if=\"loading && items.length > 0\" class=\"c-table__backdrop\" aria-hidden=\"true\">\n <Loader :loading=\"true\" size=\"2.5rem\" />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-table.scss\"></style>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admins-components68.js","names":["$slots"],"sources":["../src/components/data-table/DataTable.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type {\n LayoutMode,\n DataListConfig,\n DataListSettings,\n DataTableSettings,\n DataCardsSettings,\n Column,\n Sort,\n Action,\n ActionGroup,\n FilterConfig,\n FilterValue,\n} from '@/types/data-list'\n\nexport {\n dataTableSettingsDefaults,\n dataCardsSettingsDefaults,\n dataListSettingsDefaults,\n} from '@/types/data-list'\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref, onMounted, watch, nextTick } from 'vue'\nimport Checkbox from '@/components/Checkbox.vue'\nimport { useSelection } from '@/composables/useSelection'\nimport { dataTableSettingsDefaults } from '@/types/data-list'\nimport type { Column, DataListConfig, DataTableSettings, Sort } from '@/types/data-list'\nimport Loader from '@/components/Loader.vue'\nimport DataCell from './DataCell.vue'\nimport DataListActions from './DataListActions.vue'\n\ntype SortDirection = 'asc' | 'desc'\n\nconst props = withDefaults(\n defineProps<{\n config: DataListConfig\n items: Record<string, unknown>[]\n settings?: DataTableSettings\n loading?: boolean\n initialSort?: { key: string; direction: SortDirection } | null\n }>(),\n {\n settings: () => ({ ...dataTableSettingsDefaults }),\n loading: false,\n initialSort: null,\n },\n)\n\nconst emit = defineEmits<{\n 'selection-change': [selected: unknown[]]\n 'sort-change': [sort: { key: string; direction: SortDirection }]\n}>()\n\n//const CHARACTER_BREAKPOINT = 20\n\nconst activeSort = ref<{\n key: string\n direction: SortDirection\n} | null>(null)\n\nconst tableWrapperRef = ref<HTMLElement | null>(null)\n\nwatch(\n () => props.loading,\n async (isLoading) => {\n if (isLoading) {\n await nextTick()\n tableWrapperRef.value?.scrollTo({ top: 0, behavior: 'smooth' })\n }\n },\n)\n\nconst {\n selectedKeys,\n allSelected,\n toggle: toggleRow,\n toggleAll,\n} = useSelection(\n () => props.items,\n () => props.config.selectableAttr,\n (s) => emit('selection-change', s),\n)\n\nconst visibleColumns = computed(() => props.config.columns.filter((c) => c.visible !== false))\n\nfunction getSortConfig(col: Column): Sort | null {\n if (!col.sort) return null\n return typeof col.sort === 'boolean' ? null : col.sort\n}\n\nfunction isSortable(col: Column): boolean {\n return !!col.sort\n}\n\nfunction handleSort(col: Column) {\n const key = col.property\n const direction: SortDirection =\n activeSort.value?.key === key && activeSort.value.direction === 'asc' ? 'desc' : 'asc'\n\n activeSort.value = { key, direction }\n getSortConfig(col)?.callback?.(key, direction)\n\n emit('sort-change', { key, direction })\n}\n\nfunction applyInitialSort(sort: { key: string; direction: SortDirection } | null | undefined) {\n if (!sort) {\n if (activeSort.value !== null) activeSort.value = null\n return\n }\n const col = props.config.columns.find((c) => c.property === sort.key)\n if (!col) return\n if (activeSort.value?.key === sort.key && activeSort.value.direction === sort.direction) return\n activeSort.value = { key: sort.key, direction: sort.direction }\n getSortConfig(col)?.callback?.(sort.key, sort.direction)\n emit('sort-change', { key: sort.key, direction: sort.direction })\n}\n\nonMounted(() => applyInitialSort(props.initialSort))\nwatch(\n () => props.initialSort,\n (s) => {\n if (!s) {\n if (activeSort.value !== null) activeSort.value = null\n return\n }\n const col = props.config.columns.find((c) => c.property === s.key)\n if (!col) return\n if (activeSort.value?.key === s.key && activeSort.value.direction === s.direction) return\n activeSort.value = { key: s.key, direction: s.direction }\n },\n)\n</script>\n\n<template>\n <div\n ref=\"tableWrapperRef\"\n class=\"ac-component c-table-wrapper list-table-view\"\n :class=\"{ 'is-loading': loading }\"\n >\n <!-- :style=\"{ '--action-count': config.actions?.length ?? 0 }\" -->\n <table class=\"c-table\" :class=\"{ 'is-compact': settings.compact }\">\n <thead>\n <tr>\n <th v-if=\"config.selectableAttr\">\n <Checkbox :model-value=\"allSelected\" @update:model-value=\"toggleAll\" />\n </th>\n\n <th\n v-for=\"col in visibleColumns\"\n :key=\"col.property\"\n :class=\"[\n {\n 'c-sortable': isSortable(col),\n 'c-sortable--sorted': activeSort?.key === col.property,\n 'primary-col': col.primary,\n },\n col.headerClass,\n ]\"\n :title=\"isSortable(col) ? `Sorrendezés ${col.label} alapján` : undefined\"\n @click=\"isSortable(col) ? handleSort(col) : undefined\"\n >\n {{ !col.hideHeader ? col.label : '' }}\n\n <span\n v-if=\"isSortable(col)\"\n class=\"c-sort-icon fa-solid\"\n :class=\"{\n 'fa-sort': activeSort?.key !== col.property,\n 'fa-sort-down': activeSort?.key === col.property && activeSort.direction === 'desc',\n 'fa-sort-up': activeSort?.key === col.property && activeSort.direction === 'asc',\n 'c-sort-icon--active': activeSort?.key === col.property,\n 'is-asc': activeSort?.key === col.property && activeSort.direction === 'asc',\n 'is-desc': activeSort?.key === col.property && activeSort.direction === 'desc',\n }\"\n ></span>\n </th>\n\n <th v-if=\"config.actions\" class=\"c-actions-header\">\n {{ config.actionHeader ?? '' }}\n </th>\n </tr>\n </thead>\n\n <tbody v-if=\"!loading || items.length > 0\">\n <tr\n v-for=\"(item, index) in items\"\n :key=\"index\"\n :class=\"{\n 'is-selected': config.selectableAttr && selectedKeys.has(item[config.selectableAttr]),\n 'is-striped': settings.striped && index % 2 === 1,\n }\"\n >\n <td v-if=\"config.selectableAttr\" class=\"pointer\" @click.stop=\"toggleRow(item)\">\n <Checkbox\n :model-value=\"!!selectedKeys.has(item[config.selectableAttr])\"\n @update:model-value=\"toggleRow(item)\"\n @click.stop\n />\n </td>\n\n <td\n v-for=\"col in visibleColumns\"\n :key=\"col.property\"\n class=\"c-table__cell\"\n :class=\"[\n col.class,\n { 'primary-col': col.primary },\n /* { 'is-nowrap': String(getColumnValue(item, col) ?? '').length < CHARACTER_BREAKPOINT}, */\n ]\"\n >\n <slot :name=\"`cell:${col.property}`\" :item=\"item\" :col=\"col\">\n <DataCell :item=\"item\" :col=\"col\" :copy=\"!col.hideCopyToClipboard\" />\n </slot>\n </td>\n\n <td v-if=\"config.actions\" class=\"c-actions-cell\">\n <slot\n v-if=\"$slots.actions\"\n name=\"actions\"\n :item=\"item\"\n :index=\"index\"\n :actions=\"config.actions\"\n />\n <div v-else class=\"c-actions-wrap\">\n <DataListActions :actions=\"config.actions\" :item=\"item\" />\n </div>\n </td>\n </tr>\n </tbody>\n <tbody v-else>\n <tr class=\"c-table__loading-row\">\n <td\n :colspan=\"\n visibleColumns.length + (config.selectableAttr ? 1 : 0) + (config.actions ? 1 : 0)\n \"\n class=\"c-table__loading-cell\"\n >\n <div class=\"c-table__loading-wrap\">\n <Loader :loading=\"true\" size=\"2.5rem\" />\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <div v-if=\"loading && items.length > 0\" class=\"c-table__backdrop\" aria-hidden=\"true\">\n <Loader :loading=\"true\" size=\"2.5rem\" />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-table.scss\"></style>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admins-components70.js","names":[],"sources":["../src/components/data-table/DataTable.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type {\n LayoutMode,\n DataListConfig,\n DataListSettings,\n DataTableSettings,\n DataCardsSettings,\n Column,\n Sort,\n Action,\n ActionGroup,\n FilterConfig,\n FilterValue,\n} from '@/types/data-list'\n\nexport {\n dataTableSettingsDefaults,\n dataCardsSettingsDefaults,\n dataListSettingsDefaults,\n} from '@/types/data-list'\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref, onMounted, watch, nextTick } from 'vue'\nimport Checkbox from '@/components/Checkbox.vue'\nimport { useSelection } from '@/composables/useSelection'\nimport { dataTableSettingsDefaults } from '@/types/data-list'\nimport type { Column, DataListConfig, DataTableSettings, Sort } from '@/types/data-list'\nimport Loader from '@/components/Loader.vue'\nimport DataCell from './DataCell.vue'\nimport DataListActions from './DataListActions.vue'\n\ntype SortDirection = 'asc' | 'desc'\n\nconst props = withDefaults(\n defineProps<{\n config: DataListConfig\n items: Record<string, unknown>[]\n settings?: DataTableSettings\n loading?: boolean\n initialSort?: { key: string; direction: SortDirection } | null\n }>(),\n {\n settings: () => ({ ...dataTableSettingsDefaults }),\n loading: false,\n initialSort: null,\n },\n)\n\nconst emit = defineEmits<{\n 'selection-change': [selected: unknown[]]\n 'sort-change': [sort: { key: string; direction: SortDirection }]\n}>()\n\n//const CHARACTER_BREAKPOINT = 20\n\nconst activeSort = ref<{\n key: string\n direction: SortDirection\n} | null>(null)\n\nconst tableWrapperRef = ref<HTMLElement | null>(null)\n\nwatch(\n () => props.loading,\n async (isLoading) => {\n if (isLoading) {\n await nextTick()\n tableWrapperRef.value?.scrollTo({ top: 0, behavior: 'smooth' })\n }\n },\n)\n\nconst {\n selectedKeys,\n allSelected,\n toggle: toggleRow,\n toggleAll,\n} = useSelection(\n () => props.items,\n () => props.config.selectableAttr,\n (s) => emit('selection-change', s),\n)\n\nconst visibleColumns = computed(() => props.config.columns.filter((c) => c.visible !== false))\n\nfunction getSortConfig(col: Column): Sort | null {\n if (!col.sort) return null\n return typeof col.sort === 'boolean' ? null : col.sort\n}\n\nfunction isSortable(col: Column): boolean {\n return !!col.sort\n}\n\nfunction handleSort(col: Column) {\n const key = col.property\n const direction: SortDirection =\n activeSort.value?.key === key && activeSort.value.direction === 'asc' ? 'desc' : 'asc'\n\n activeSort.value = { key, direction }\n getSortConfig(col)?.callback?.(key, direction)\n\n emit('sort-change', { key, direction })\n}\n\nfunction applyInitialSort(sort: { key: string; direction: SortDirection } | null | undefined) {\n if (!sort) {\n if (activeSort.value !== null) activeSort.value = null\n return\n }\n const col = props.config.columns.find((c) => c.property === sort.key)\n if (!col) return\n if (activeSort.value?.key === sort.key && activeSort.value.direction === sort.direction) return\n activeSort.value = { key: sort.key, direction: sort.direction }\n getSortConfig(col)?.callback?.(sort.key, sort.direction)\n emit('sort-change', { key: sort.key, direction: sort.direction })\n}\n\nonMounted(() => applyInitialSort(props.initialSort))\nwatch(\n () => props.initialSort,\n (s) => {\n
|
|
1
|
+
{"version":3,"file":"admins-components70.js","names":[],"sources":["../src/components/data-table/DataTable.vue"],"sourcesContent":["<script lang=\"ts\">\nexport type {\n LayoutMode,\n DataListConfig,\n DataListSettings,\n DataTableSettings,\n DataCardsSettings,\n Column,\n Sort,\n Action,\n ActionGroup,\n FilterConfig,\n FilterValue,\n} from '@/types/data-list'\n\nexport {\n dataTableSettingsDefaults,\n dataCardsSettingsDefaults,\n dataListSettingsDefaults,\n} from '@/types/data-list'\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref, onMounted, watch, nextTick } from 'vue'\nimport Checkbox from '@/components/Checkbox.vue'\nimport { useSelection } from '@/composables/useSelection'\nimport { dataTableSettingsDefaults } from '@/types/data-list'\nimport type { Column, DataListConfig, DataTableSettings, Sort } from '@/types/data-list'\nimport Loader from '@/components/Loader.vue'\nimport DataCell from './DataCell.vue'\nimport DataListActions from './DataListActions.vue'\n\ntype SortDirection = 'asc' | 'desc'\n\nconst props = withDefaults(\n defineProps<{\n config: DataListConfig\n items: Record<string, unknown>[]\n settings?: DataTableSettings\n loading?: boolean\n initialSort?: { key: string; direction: SortDirection } | null\n }>(),\n {\n settings: () => ({ ...dataTableSettingsDefaults }),\n loading: false,\n initialSort: null,\n },\n)\n\nconst emit = defineEmits<{\n 'selection-change': [selected: unknown[]]\n 'sort-change': [sort: { key: string; direction: SortDirection }]\n}>()\n\n//const CHARACTER_BREAKPOINT = 20\n\nconst activeSort = ref<{\n key: string\n direction: SortDirection\n} | null>(null)\n\nconst tableWrapperRef = ref<HTMLElement | null>(null)\n\nwatch(\n () => props.loading,\n async (isLoading) => {\n if (isLoading) {\n await nextTick()\n tableWrapperRef.value?.scrollTo({ top: 0, behavior: 'smooth' })\n }\n },\n)\n\nconst {\n selectedKeys,\n allSelected,\n toggle: toggleRow,\n toggleAll,\n} = useSelection(\n () => props.items,\n () => props.config.selectableAttr,\n (s) => emit('selection-change', s),\n)\n\nconst visibleColumns = computed(() => props.config.columns.filter((c) => c.visible !== false))\n\nfunction getSortConfig(col: Column): Sort | null {\n if (!col.sort) return null\n return typeof col.sort === 'boolean' ? null : col.sort\n}\n\nfunction isSortable(col: Column): boolean {\n return !!col.sort\n}\n\nfunction handleSort(col: Column) {\n const key = col.property\n const direction: SortDirection =\n activeSort.value?.key === key && activeSort.value.direction === 'asc' ? 'desc' : 'asc'\n\n activeSort.value = { key, direction }\n getSortConfig(col)?.callback?.(key, direction)\n\n emit('sort-change', { key, direction })\n}\n\nfunction applyInitialSort(sort: { key: string; direction: SortDirection } | null | undefined) {\n if (!sort) {\n if (activeSort.value !== null) activeSort.value = null\n return\n }\n const col = props.config.columns.find((c) => c.property === sort.key)\n if (!col) return\n if (activeSort.value?.key === sort.key && activeSort.value.direction === sort.direction) return\n activeSort.value = { key: sort.key, direction: sort.direction }\n getSortConfig(col)?.callback?.(sort.key, sort.direction)\n emit('sort-change', { key: sort.key, direction: sort.direction })\n}\n\nonMounted(() => applyInitialSort(props.initialSort))\nwatch(\n () => props.initialSort,\n (s) => {\n if (!s) {\n if (activeSort.value !== null) activeSort.value = null\n return\n }\n const col = props.config.columns.find((c) => c.property === s.key)\n if (!col) return\n if (activeSort.value?.key === s.key && activeSort.value.direction === s.direction) return\n activeSort.value = { key: s.key, direction: s.direction }\n },\n)\n</script>\n\n<template>\n <div\n ref=\"tableWrapperRef\"\n class=\"ac-component c-table-wrapper list-table-view\"\n :class=\"{ 'is-loading': loading }\"\n >\n <!-- :style=\"{ '--action-count': config.actions?.length ?? 0 }\" -->\n <table class=\"c-table\" :class=\"{ 'is-compact': settings.compact }\">\n <thead>\n <tr>\n <th v-if=\"config.selectableAttr\">\n <Checkbox :model-value=\"allSelected\" @update:model-value=\"toggleAll\" />\n </th>\n\n <th\n v-for=\"col in visibleColumns\"\n :key=\"col.property\"\n :class=\"[\n {\n 'c-sortable': isSortable(col),\n 'c-sortable--sorted': activeSort?.key === col.property,\n 'primary-col': col.primary,\n },\n col.headerClass,\n ]\"\n :title=\"isSortable(col) ? `Sorrendezés ${col.label} alapján` : undefined\"\n @click=\"isSortable(col) ? handleSort(col) : undefined\"\n >\n {{ !col.hideHeader ? col.label : '' }}\n\n <span\n v-if=\"isSortable(col)\"\n class=\"c-sort-icon fa-solid\"\n :class=\"{\n 'fa-sort': activeSort?.key !== col.property,\n 'fa-sort-down': activeSort?.key === col.property && activeSort.direction === 'desc',\n 'fa-sort-up': activeSort?.key === col.property && activeSort.direction === 'asc',\n 'c-sort-icon--active': activeSort?.key === col.property,\n 'is-asc': activeSort?.key === col.property && activeSort.direction === 'asc',\n 'is-desc': activeSort?.key === col.property && activeSort.direction === 'desc',\n }\"\n ></span>\n </th>\n\n <th v-if=\"config.actions\" class=\"c-actions-header\">\n {{ config.actionHeader ?? '' }}\n </th>\n </tr>\n </thead>\n\n <tbody v-if=\"!loading || items.length > 0\">\n <tr\n v-for=\"(item, index) in items\"\n :key=\"index\"\n :class=\"{\n 'is-selected': config.selectableAttr && selectedKeys.has(item[config.selectableAttr]),\n 'is-striped': settings.striped && index % 2 === 1,\n }\"\n >\n <td v-if=\"config.selectableAttr\" class=\"pointer\" @click.stop=\"toggleRow(item)\">\n <Checkbox\n :model-value=\"!!selectedKeys.has(item[config.selectableAttr])\"\n @update:model-value=\"toggleRow(item)\"\n @click.stop\n />\n </td>\n\n <td\n v-for=\"col in visibleColumns\"\n :key=\"col.property\"\n class=\"c-table__cell\"\n :class=\"[\n col.class,\n { 'primary-col': col.primary },\n /* { 'is-nowrap': String(getColumnValue(item, col) ?? '').length < CHARACTER_BREAKPOINT}, */\n ]\"\n >\n <slot :name=\"`cell:${col.property}`\" :item=\"item\" :col=\"col\">\n <DataCell :item=\"item\" :col=\"col\" :copy=\"!col.hideCopyToClipboard\" />\n </slot>\n </td>\n\n <td v-if=\"config.actions\" class=\"c-actions-cell\">\n <slot\n v-if=\"$slots.actions\"\n name=\"actions\"\n :item=\"item\"\n :index=\"index\"\n :actions=\"config.actions\"\n />\n <div v-else class=\"c-actions-wrap\">\n <DataListActions :actions=\"config.actions\" :item=\"item\" />\n </div>\n </td>\n </tr>\n </tbody>\n <tbody v-else>\n <tr class=\"c-table__loading-row\">\n <td\n :colspan=\"\n visibleColumns.length + (config.selectableAttr ? 1 : 0) + (config.actions ? 1 : 0)\n \"\n class=\"c-table__loading-cell\"\n >\n <div class=\"c-table__loading-wrap\">\n <Loader :loading=\"true\" size=\"2.5rem\" />\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <div v-if=\"loading && items.length > 0\" class=\"c-table__backdrop\" aria-hidden=\"true\">\n <Loader :loading=\"true\" size=\"2.5rem\" />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/data-table/data-table.scss\"></style>\n"],"mappings":""}
|