admins-components 9.0.35 → 9.0.37
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-components.js +32 -32
- package/dist/admins-components23.js +108 -99
- package/dist/admins-components23.js.map +1 -1
- package/dist/admins-components25.js.map +1 -1
- package/dist/admins-components78.js +23 -26
- package/dist/admins-components78.js.map +1 -1
- package/dist/admins-components82.js +85 -101
- package/dist/admins-components82.js.map +1 -1
- package/dist/admins-components84.js.map +1 -1
- package/dist/admins-components95.js +4 -3
- package/dist/admins-components95.js.map +1 -1
- package/dist/admins-components97.js.map +1 -1
- package/dist/src/components/DropdownSelect.vue.d.ts +2 -0
- package/dist/src/components/data-table/DataFilters.vue.d.ts +1 -0
- package/dist/src/components/data-table/DataList.vue.d.ts +2 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/utils/dataFilters.d.ts +1 -2
- package/package.json +1 -1
|
@@ -29,35 +29,35 @@ import Y from "./admins-components72.js";
|
|
|
29
29
|
import { getFullStorageKey as X } from "./admins-components73.js";
|
|
30
30
|
import { getDefaultPaginator as Z } from "./admins-components74.js";
|
|
31
31
|
import Q from "./admins-components76.js";
|
|
32
|
-
import { filterEmptyValues as $,
|
|
33
|
-
import
|
|
34
|
-
import
|
|
35
|
-
import
|
|
36
|
-
import { getUrlParam as
|
|
37
|
-
import { dataListDefaults as
|
|
38
|
-
import
|
|
39
|
-
import { isIpInUrl as
|
|
40
|
-
import { getCurrentSite as
|
|
41
|
-
import { vTooltip as
|
|
42
|
-
import { createNativeFetch as
|
|
43
|
-
import { FetchDetails as
|
|
44
|
-
import { useArticleEditorService as
|
|
45
|
-
import { useCurrentUser as
|
|
46
|
-
import { BackendService as
|
|
47
|
-
import { aoeConfig as
|
|
48
|
-
import
|
|
49
|
-
import { apeConfig as
|
|
50
|
-
import { configureImagePickerElement as
|
|
51
|
-
import
|
|
52
|
-
import
|
|
53
|
-
import { configureExternalArticleOfferElement as
|
|
54
|
-
import
|
|
55
|
-
import { configureGalleryImageSelectorElement as
|
|
56
|
-
import
|
|
57
|
-
import
|
|
58
|
-
import
|
|
59
|
-
import { configureInternalArticleOfferElement as
|
|
60
|
-
import
|
|
61
|
-
import { configurePartnerPickerElement as
|
|
62
|
-
import
|
|
63
|
-
export {
|
|
32
|
+
import { filterEmptyValues as $, getDefaultFilters as ee, getDefaultSavedFilter as te, getFilterUrlParams as ne, getSavedFilters as re, writeFilterParams as ie } from "./admins-components78.js";
|
|
33
|
+
import ae from "./admins-components81.js";
|
|
34
|
+
import oe from "./admins-components84.js";
|
|
35
|
+
import se from "./admins-components87.js";
|
|
36
|
+
import { getUrlParam as ce, joinUrl as le, removeUrlParam as ue, setUrlParam as de } from "./admins-components91.js";
|
|
37
|
+
import { dataListDefaults as fe } from "./admins-components95.js";
|
|
38
|
+
import pe from "./admins-components97.js";
|
|
39
|
+
import { isIpInUrl as me } from "./admins-components98.js";
|
|
40
|
+
import { getCurrentSite as he } from "./admins-components99.js";
|
|
41
|
+
import { vTooltip as ge } from "./admins-components100.js";
|
|
42
|
+
import { createNativeFetch as _e } from "./admins-components101.js";
|
|
43
|
+
import { FetchDetails as ve, FetchError as ye, Methods as be, initRequest as xe } from "./admins-components102.js";
|
|
44
|
+
import { useArticleEditorService as Se } from "./admins-components103.js";
|
|
45
|
+
import { useCurrentUser as Ce } from "./admins-components104.js";
|
|
46
|
+
import { BackendService as we, useBackendService as Te } from "./admins-components105.js";
|
|
47
|
+
import { aoeConfig as Ee, configureArticleOfferElement as De } from "./admins-components158.js";
|
|
48
|
+
import Oe from "./admins-components160.js";
|
|
49
|
+
import { apeConfig as ke, configureArticlePickerElement as Ae } from "./admins-components161.js";
|
|
50
|
+
import { configureImagePickerElement as je, ipeConfig as Me } from "./admins-components162.js";
|
|
51
|
+
import Ne from "./admins-components164.js";
|
|
52
|
+
import Pe from "./admins-components165.js";
|
|
53
|
+
import { configureExternalArticleOfferElement as Fe, eaoeConfig as Ie } from "./admins-components166.js";
|
|
54
|
+
import Le from "./admins-components167.js";
|
|
55
|
+
import { configureGalleryImageSelectorElement as Re, gisConfig as ze } from "./admins-components168.js";
|
|
56
|
+
import Be from "./admins-components169.js";
|
|
57
|
+
import Ve from "./admins-components170.js";
|
|
58
|
+
import He from "./admins-components171.js";
|
|
59
|
+
import { configureInternalArticleOfferElement as Ue, iaoeConfig as We } from "./admins-components172.js";
|
|
60
|
+
import Ge from "./admins-components173.js";
|
|
61
|
+
import { configurePartnerPickerElement as Ke, ppeconfig as qe } from "./admins-components174.js";
|
|
62
|
+
import Je from "./admins-components176.js";
|
|
63
|
+
export { Oe as ArticleOfferElement, Ne as ArticlePickerElement, we as BackendService, l as Button, p as Calendar, _ as Checkbox, w as ConfirmModal, T as CopyToClipboard, q as DataCards, oe as DataFilters, pe as DataList, Y as DataListOptions, Q as DataPaginator, K as DataTable, m as DatePicker, v as DateRangePicker, Pe as DateTimePickerElement, b as DropdownMenu, y as DropdownSelect, D as ExternalArticleOffer, Le as ExternalArticleOfferElement, ve as FetchDetails, ye as FetchError, se as FilterTags, ae as FiltersHistory, Be as GalleryImageSelectorElement, S as HeaderComponent, E as ImagePicker, He as ImagePickerDetailsElement, Ve as ImagePickerElement, O as InternalArticleOffer, Ge as InternalArticleOfferElement, k as Loader, be as Methods, C as Modal, Je as PartnerPickerElement, x as Sidebar, g as TextInput, j as ToastNotification, Ee as aoeConfig, ke as apeConfig, F as booleanToString, u as calendarConfigDefaults, e as castToDate, De as configureArticleOfferElement, Ae as configureArticlePickerElement, Fe as configureExternalArticleOfferElement, Re as configureGalleryImageSelectorElement, je as configureImagePickerElement, Ue as configureInternalArticleOfferElement, Ke as configurePartnerPickerElement, _e as createNativeFetch, M as dataCardsSettingsDefaults, I as dataListConverters, fe as dataListDefaults, N as dataListSettingsDefaults, P as dataTableSettingsDefaults, d as datePickerConfigDefaults, f as dateRangePickerConfigDefaults, h as debounce, J as deepMerge, Ie as eaoeConfig, t as earlierOf, n as endOfDay, L as enumMap, $ as filterEmptyValues, R as formatCurrency, r as formatDate, z as formatNumber, he as getCurrentSite, ee as getDefaultFilters, Z as getDefaultPaginator, te as getDefaultSavedFilter, ne as getFilterUrlParams, X as getFullStorageKey, re as getSavedFilters, ce as getUrlParam, ze as gisConfig, We as iaoeConfig, B as identity, xe as initRequest, Me as ipeConfig, me as isIpInUrl, le as joinUrl, i as laterOf, V as listToString, H as localToLocalString, a as localToUTCString, o as parseDate, qe as ppeconfig, ue as removeUrlParam, de as setUrlParam, U as shortUuid, s as startOfDay, c as startOfWeek, W as textEllipse, A as toast, Se as useArticleEditorService, Te as useBackendService, Ce as useCurrentUser, G as utcToLocalString, ge as vTooltip, ie as writeFilterParams };
|
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
import e from "./admins-components6.js";
|
|
2
|
-
import {
|
|
2
|
+
import { debounce as t } from "./admins-components15.js";
|
|
3
|
+
import { Fragment as n, computed as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, defineComponent as c, nextTick as l, normalizeClass as u, onBeforeUnmount as d, onMounted as f, openBlock as p, ref as m, renderList as h, toDisplayString as g, watch as _, withModifiers as v } from "vue";
|
|
3
4
|
//#region src/components/DropdownSelect.vue?vue&type=script&setup=true&lang.ts
|
|
4
|
-
var
|
|
5
|
+
var y = { class: "ac-component" }, b = {
|
|
5
6
|
key: 0,
|
|
6
7
|
class: "c-truncate ds-value"
|
|
7
|
-
},
|
|
8
|
+
}, x = {
|
|
8
9
|
key: 1,
|
|
9
10
|
class: "c-placeholder"
|
|
10
|
-
},
|
|
11
|
+
}, S = {
|
|
11
12
|
key: 0,
|
|
12
13
|
class: "ds-filter"
|
|
13
|
-
},
|
|
14
|
+
}, ee = ["title"], C = ["value"], w = { class: "ds-options c-scroll" }, T = ["onClick", "onKeydown"], E = {
|
|
14
15
|
key: 0,
|
|
15
16
|
class: "ds-option ds-option--empty"
|
|
16
|
-
},
|
|
17
|
+
}, D = {
|
|
17
18
|
key: 1,
|
|
18
19
|
class: "c-footer"
|
|
19
|
-
},
|
|
20
|
+
}, O = {
|
|
20
21
|
placeholder: "Select...",
|
|
21
22
|
filterable: !0,
|
|
22
23
|
clearable: !0,
|
|
@@ -24,160 +25,168 @@ var b = { class: "ac-component" }, x = {
|
|
|
24
25
|
multiple: !1,
|
|
25
26
|
lazy: !1,
|
|
26
27
|
size: "normal"
|
|
27
|
-
},
|
|
28
|
+
}, k = /* @__PURE__ */ c({
|
|
28
29
|
__name: "DropdownSelect",
|
|
29
30
|
props: {
|
|
30
31
|
modelValue: { default: null },
|
|
31
32
|
options: {},
|
|
32
|
-
config: { default: () => ({ ...
|
|
33
|
+
config: { default: () => ({ ...O }) }
|
|
33
34
|
},
|
|
34
|
-
emits: ["update:modelValue"],
|
|
35
|
-
setup(
|
|
36
|
-
let
|
|
37
|
-
...
|
|
38
|
-
...
|
|
39
|
-
})),
|
|
40
|
-
function
|
|
35
|
+
emits: ["update:modelValue", "filter-input"],
|
|
36
|
+
setup(c, { expose: k, emit: A }) {
|
|
37
|
+
let j = c, M = r(() => ({
|
|
38
|
+
...O,
|
|
39
|
+
...j.config
|
|
40
|
+
})), N = A, P = m(!1), F = m(""), I = m(null), L = m(null), R = m([]), z = m(B(j.modelValue));
|
|
41
|
+
function B(e) {
|
|
41
42
|
return e == null ? [] : Array.isArray(e) ? [...e] : [e];
|
|
42
43
|
}
|
|
43
|
-
_(() =>
|
|
44
|
-
|
|
45
|
-
}), _(
|
|
46
|
-
e && (
|
|
44
|
+
_(() => j.modelValue, (e) => {
|
|
45
|
+
z.value = B(e);
|
|
46
|
+
}), _(P, (e) => {
|
|
47
|
+
e && (F.value = "", M.value.filterable && l(() => L.value?.focus()), M.value.lazy && (R.value = [...z.value]));
|
|
47
48
|
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
49
|
+
function V(e) {
|
|
50
|
+
F.value = e, H(e);
|
|
51
|
+
}
|
|
52
|
+
let H = t((e) => {
|
|
53
|
+
N("filter-input", e);
|
|
54
|
+
}), U = r(() => z.value.length === 0 ? null : M.value.multiple ? z.value.length > 2 ? `${z.value.length} kiválasztva` : z.value.map((e) => j.options.find((t) => t.value === e)?.label ?? e).join(", ") : j.options.find((e) => e.value === z.value[0])?.label ?? null), W = r(() => {
|
|
55
|
+
let e = F.value.toLowerCase();
|
|
56
|
+
return e ? j.options.filter((t) => t.label.toLowerCase().includes(e)) : j.options;
|
|
57
|
+
}), G = r(() => W.value.filter((e) => e.value)), K = r(() => {
|
|
58
|
+
if (G.value.length === 0) return !1;
|
|
59
|
+
let e = M.value.lazy && P.value ? R.value : z.value;
|
|
60
|
+
return G.value.every((t) => t.value && e.includes(t.value));
|
|
55
61
|
});
|
|
56
|
-
function
|
|
57
|
-
return (
|
|
62
|
+
function q(e) {
|
|
63
|
+
return (M.value.lazy && P.value ? R : z).value.includes(e);
|
|
58
64
|
}
|
|
59
|
-
function
|
|
60
|
-
let e =
|
|
61
|
-
if (
|
|
65
|
+
function J() {
|
|
66
|
+
let e = M.value.lazy && P.value ? R : z, t = G.value.map((e) => e.value);
|
|
67
|
+
if (K.value) e.value = e.value.filter((e) => !t.includes(e));
|
|
62
68
|
else {
|
|
63
69
|
let n = t.filter((t) => !e.value.includes(t));
|
|
64
70
|
e.value = [...e.value, ...n];
|
|
65
71
|
}
|
|
66
|
-
|
|
72
|
+
M.value.lazy || N("update:modelValue", z.value.length > 0 ? [...z.value] : null);
|
|
67
73
|
}
|
|
68
|
-
function
|
|
74
|
+
function Y(e, t) {
|
|
69
75
|
let n = e.indexOf(t);
|
|
70
76
|
return n >= 0 ? e.filter((e, t) => t !== n) : [...e, t];
|
|
71
77
|
}
|
|
72
|
-
function
|
|
78
|
+
function X(e) {
|
|
73
79
|
if (e.callback) {
|
|
74
|
-
e.callback(),
|
|
80
|
+
e.callback(), P.value = !1;
|
|
75
81
|
return;
|
|
76
82
|
}
|
|
77
83
|
let t = e.value;
|
|
78
|
-
t && (
|
|
79
|
-
}
|
|
80
|
-
function X() {
|
|
81
|
-
N.value.lazy && (B.value = [...z.value], P("update:modelValue", z.value.length > 0 ? [...z.value] : null)), F.value = !1;
|
|
84
|
+
t && (M.value.multiple ? M.value.lazy ? R.value = Y(R.value, t) : (z.value = Y(z.value, t), N("update:modelValue", z.value.length > 0 ? [...z.value] : null)) : (z.value = [t], N("update:modelValue", t), P.value = !1));
|
|
82
85
|
}
|
|
83
86
|
function Z() {
|
|
84
|
-
|
|
87
|
+
M.value.lazy && (z.value = [...R.value], N("update:modelValue", R.value.length > 0 ? [...R.value] : null)), P.value = !1;
|
|
88
|
+
}
|
|
89
|
+
function Q() {
|
|
90
|
+
M.value.lazy ? R.value = [] : (z.value = [], N("update:modelValue", null));
|
|
85
91
|
}
|
|
86
|
-
function
|
|
87
|
-
e.key === " " ? (e.preventDefault(),
|
|
92
|
+
function te(e, t) {
|
|
93
|
+
e.key === " " ? (e.preventDefault(), X(t)) : e.key === "Enter" && (e.preventDefault(), Z());
|
|
88
94
|
}
|
|
89
95
|
function $(e) {
|
|
90
|
-
|
|
96
|
+
I.value && !I.value.contains(e.target) && (P.value = !1);
|
|
91
97
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
98
|
+
f(() => document.addEventListener("mousedown", $)), d(() => {
|
|
99
|
+
document.removeEventListener("mousedown", $);
|
|
100
|
+
});
|
|
101
|
+
function ne() {
|
|
102
|
+
P.value = !P.value, P.value && (F.value = "");
|
|
95
103
|
}
|
|
96
|
-
function
|
|
97
|
-
|
|
104
|
+
function re() {
|
|
105
|
+
z.value = [], N("update:modelValue", null), P.value = !1;
|
|
98
106
|
}
|
|
99
|
-
function
|
|
100
|
-
|
|
107
|
+
function ie() {
|
|
108
|
+
P.value = !0, M.value.filterable && l(() => L.value?.focus());
|
|
101
109
|
}
|
|
102
|
-
return
|
|
110
|
+
return k({ focusAndOpen: ie }), (t, r) => (p(), o("div", y, [s("div", {
|
|
103
111
|
ref_key: "wrapperRef",
|
|
104
|
-
ref:
|
|
112
|
+
ref: I,
|
|
105
113
|
class: "c-wrapper ds-wrapper"
|
|
106
|
-
}, [
|
|
107
|
-
class:
|
|
108
|
-
"c-input-row--sm":
|
|
109
|
-
"c-input-row--lg":
|
|
114
|
+
}, [s("div", {
|
|
115
|
+
class: u(["c-input-row pointer", {
|
|
116
|
+
"c-input-row--sm": M.value.size === "small",
|
|
117
|
+
"c-input-row--lg": M.value.size === "large"
|
|
110
118
|
}]),
|
|
111
|
-
onClick:
|
|
119
|
+
onClick: r[1] ||= (e) => ne()
|
|
112
120
|
}, [
|
|
113
|
-
|
|
114
|
-
|
|
121
|
+
U.value ? (p(), o("span", b, g(U.value), 1)) : (p(), o("span", x, g(M.value.placeholder), 1)),
|
|
122
|
+
M.value.clearable && z.value.length > 0 ? (p(), o("button", {
|
|
115
123
|
key: 2,
|
|
116
124
|
type: "button",
|
|
117
125
|
class: "c-icon-btn c-icon-btn--clear ds-clear-btn",
|
|
118
|
-
onClick:
|
|
126
|
+
onClick: r[0] ||= v((e) => re(), ["stop"]),
|
|
119
127
|
"aria-label": "Törlés"
|
|
120
|
-
}, [...
|
|
121
|
-
|
|
122
|
-
], 2),
|
|
128
|
+
}, [...r[6] ||= [s("i", { class: "fa-solid fa-fw fa-xmark" }, null, -1)]])) : a("", !0),
|
|
129
|
+
s("span", { class: u(["c-icon-btn c-icon-btn--chevron mr-2", { "c-icon-btn--chevron-open": P.value }]) }, [...r[7] ||= [s("i", { class: "fa-solid fa-fw fa-chevron-down" }, null, -1)]], 2)
|
|
130
|
+
], 2), P.value ? (p(), o("div", {
|
|
123
131
|
key: 0,
|
|
124
|
-
class:
|
|
132
|
+
class: u(["c-dropdown ds-dropdown ac-component", { "ds-dropdown--multiple": M.value.multiple }])
|
|
125
133
|
}, [
|
|
126
|
-
|
|
127
|
-
|
|
134
|
+
M.value.filterable ? (p(), o("div", S, [
|
|
135
|
+
M.value.multiple ? (p(), o("span", {
|
|
128
136
|
key: 0,
|
|
129
|
-
class:
|
|
130
|
-
onClick:
|
|
131
|
-
title:
|
|
132
|
-
}, null, 10,
|
|
133
|
-
|
|
137
|
+
class: u(["c-checkbox ds-select-all-checkbox", { "c-checkbox--checked": K.value }]),
|
|
138
|
+
onClick: r[2] ||= v((e) => J(), ["stop"]),
|
|
139
|
+
title: K.value ? "Összes kijelölés törlése" : "Összes kijelölése"
|
|
140
|
+
}, null, 10, ee)) : a("", !0),
|
|
141
|
+
s("input", {
|
|
134
142
|
ref_key: "filterInputRef",
|
|
135
|
-
ref:
|
|
143
|
+
ref: L,
|
|
136
144
|
type: "text",
|
|
137
145
|
id: "ds-filter-input",
|
|
138
146
|
class: "c-focus ds-filter-input",
|
|
139
|
-
|
|
147
|
+
value: F.value,
|
|
148
|
+
onInput: r[3] ||= (e) => V(e.target.value),
|
|
140
149
|
placeholder: "Filter...",
|
|
141
|
-
onClick:
|
|
142
|
-
}, null,
|
|
143
|
-
|
|
150
|
+
onClick: r[4] ||= v(() => {}, ["stop"])
|
|
151
|
+
}, null, 40, C),
|
|
152
|
+
F.value ? (p(), o("button", {
|
|
144
153
|
key: 1,
|
|
145
154
|
type: "button",
|
|
146
155
|
class: "c-icon-btn c-icon-btn--clear ds-filter-clear",
|
|
147
|
-
onClick:
|
|
156
|
+
onClick: r[5] ||= v((e) => F.value = "", ["stop"]),
|
|
148
157
|
"aria-label": "Szűrők törlése"
|
|
149
|
-
}, [...
|
|
150
|
-
])) :
|
|
151
|
-
|
|
158
|
+
}, [...r[8] ||= [s("i", { class: "fa-solid fa-xmark" }, null, -1)]])) : a("", !0)
|
|
159
|
+
])) : a("", !0),
|
|
160
|
+
s("ul", w, [(p(!0), o(n, null, h(W.value, (e, t) => (p(), o("li", {
|
|
152
161
|
key: e.value ?? `cb-${t}`,
|
|
153
|
-
class:
|
|
162
|
+
class: u(["d-option ds-option", { "ds-option--selected": e.value && q(e.value) }]),
|
|
154
163
|
tabindex: "0",
|
|
155
|
-
onClick: (t) =>
|
|
156
|
-
onKeydown: (t) =>
|
|
164
|
+
onClick: (t) => X(e),
|
|
165
|
+
onKeydown: (t) => te(t, e)
|
|
157
166
|
}, [
|
|
158
|
-
|
|
167
|
+
M.value.multiple && e.value ? (p(), o("span", {
|
|
159
168
|
key: 0,
|
|
160
|
-
class:
|
|
161
|
-
}, null, 2)) :
|
|
162
|
-
e.icon ? (
|
|
169
|
+
class: u(["c-checkbox", { "c-checkbox--checked": q(e.value) }])
|
|
170
|
+
}, null, 2)) : a("", !0),
|
|
171
|
+
e.icon ? (p(), o("i", {
|
|
163
172
|
key: 1,
|
|
164
|
-
class:
|
|
165
|
-
}, null, 2)) :
|
|
166
|
-
|
|
167
|
-
], 42,
|
|
168
|
-
|
|
173
|
+
class: u(["fa-fw", e.icon])
|
|
174
|
+
}, null, 2)) : a("", !0),
|
|
175
|
+
s("span", { class: u(["d-option__label", { "c-truncate": M.value.textEllipsis }]) }, g(e.label), 3)
|
|
176
|
+
], 42, T))), 128)), W.value.length === 0 ? (p(), o("li", E, " Nincs találat ")) : a("", !0)]),
|
|
177
|
+
M.value.multiple || M.value.clearable && z.value.length > 0 ? (p(), o("div", D, [M.value.clearable ? (p(), i(e, {
|
|
169
178
|
key: 0,
|
|
170
179
|
label: "Törlés",
|
|
171
180
|
outline: "",
|
|
172
|
-
onClick:
|
|
173
|
-
})) :
|
|
181
|
+
onClick: Q
|
|
182
|
+
})) : a("", !0), M.value.multiple ? (p(), i(e, {
|
|
174
183
|
key: 1,
|
|
175
184
|
label: "OK",
|
|
176
185
|
type: "success",
|
|
177
|
-
onClick:
|
|
178
|
-
})) :
|
|
179
|
-
], 2)) :
|
|
186
|
+
onClick: Z
|
|
187
|
+
})) : a("", !0)])) : a("", !0)
|
|
188
|
+
], 2)) : a("", !0)], 512)]));
|
|
180
189
|
}
|
|
181
190
|
});
|
|
182
191
|
//#endregion
|
|
183
|
-
export {
|
|
192
|
+
export { k as default, O as dropdownSelectConfigDefaults };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admins-components23.js","names":[],"sources":["../src/components/DropdownSelect.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface DropdownSelectConfig {\n placeholder?: string\n filterable?: boolean\n clearable?: boolean\n textEllipsis?: boolean\n multiple?: boolean\n lazy?: boolean\n size?: ControlSize\n}\n\nexport const dropdownSelectConfigDefaults: DropdownSelectConfig = {\n placeholder: 'Select...',\n filterable: true,\n clearable: true,\n textEllipsis: true,\n multiple: false,\n lazy: false,\n size: 'normal' as ControlSize,\n}\n\nexport interface DropdownOption {\n icon?: string\n value?: string\n label: string\n callback?: () => void\n}\n\nexport interface DropdownSelectProps {\n modelValue?: string | string[] | null\n options: DropdownOption[]\n config?: DropdownSelectConfig\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, nextTick, onMounted, onBeforeUnmount } from 'vue'\nimport Button from '@/components/Button.vue'\nimport type { ControlSize } from '@/types/types'\n\nconst props = withDefaults(defineProps<DropdownSelectProps>(), {\n modelValue: null,\n config: () => ({ ...dropdownSelectConfigDefaults }),\n})\n\nconst cfg = computed(() => ({ ...dropdownSelectConfigDefaults, ...props.config }))\n\nconst emit = defineEmits<{ 'update:modelValue': [value: string | string[] | null] }>()\n\n\n\nconst isOpen = ref(false)\nconst filterText = ref('')\nconst wrapperRef = ref<HTMLElement | null>(null)\nconst filterInputRef = ref<HTMLInputElement | null>(null)\nconst buffer = ref<string[]>([])\nconst selection = ref<string[]>(toArray(props.modelValue))\n\nfunction toArray(val: string | string[] | null | undefined): string[] {\n if (val == null) return []\n return Array.isArray(val) ? [...val] : [val]\n}\n\nwatch(\n () => props.modelValue,\n (v) => {\n selection.value = toArray(v)\n },\n)\n\nwatch(isOpen, (open) => {\n if (open) {\n filterText.value = ''\n if (cfg.value.filterable) nextTick(() => filterInputRef.value?.focus())\n if (cfg.value.lazy) buffer.value = [...selection.value]\n }\n})\n\n// Display\nconst selectedLabel = computed(() => {\n if (selection.value.length === 0) return null\n if (!cfg.value.multiple)\n return props.options.find((o) => o.value === selection.value[0])?.label ?? null\n if (selection.value.length > 2) return `${selection.value.length} kiválasztva`\n return selection.value.map((v) => props.options.find((o) => o.value === v)?.label ?? v).join(', ')\n})\n\nconst filteredOptions = computed(() => {\n const q = filterText.value.toLowerCase()\n return q ? props.options.filter((o) => o.label.toLowerCase().includes(q)) : props.options\n})\n\nconst selectableOptions = computed(() => {\n return filteredOptions.value.filter((o) => o.value)\n})\n\nconst allOptionsSelected = computed(() => {\n if (selectableOptions.value.length === 0) return false\n const currentList = cfg.value.lazy && isOpen.value ? buffer.value : selection.value\n return selectableOptions.value.every((o) => o.value && currentList.includes(o.value))\n})\n\nfunction isSelected(value: string): boolean {\n return (cfg.value.lazy && isOpen.value ? buffer : selection).value.includes(value)\n}\n\nfunction toggleAllOptions() {\n const currentList = cfg.value.lazy && isOpen.value ? buffer : selection\n const selectableValues = selectableOptions.value.map((o) => o.value as string)\n\n if (allOptionsSelected.value) {\n currentList.value = currentList.value.filter((v) => !selectableValues.includes(v))\n } else {\n const toAdd = selectableValues.filter((v) => !currentList.value.includes(v))\n currentList.value = [...currentList.value, ...toAdd]\n }\n\n if (!cfg.value.lazy) {\n emit('update:modelValue', selection.value.length > 0 ? [...selection.value] : null)\n }\n}\n\n// Actions\nfunction toggleList(list: string[], value: string): string[] {\n const idx = list.indexOf(value)\n return idx >= 0 ? list.filter((_, i) => i !== idx) : [...list, value]\n}\n\nfunction selectOption(opt: DropdownOption) {\n if (opt.callback) {\n opt.callback()\n isOpen.value = false\n return\n }\n\n const value = opt.value\n if (!value) return\n\n if (cfg.value.multiple) {\n if (cfg.value.lazy) {\n buffer.value = toggleList(buffer.value, value)\n } else {\n selection.value = toggleList(selection.value, value)\n emit('update:modelValue', selection.value.length > 0 ? [...selection.value] : null)\n }\n } else {\n selection.value = [value]\n emit('update:modelValue', value)\n isOpen.value = false\n }\n}\n\nfunction confirm() {\n if (cfg.value.lazy) {\n selection.value = [...buffer.value]\n emit('update:modelValue', buffer.value.length > 0 ? [...buffer.value] : null)\n }\n isOpen.value = false\n}\n\nfunction clear() {\n if (cfg.value.lazy) {\n buffer.value = []\n } else {\n selection.value = []\n emit('update:modelValue', null)\n }\n}\n\nfunction onOptionKeydown(e: KeyboardEvent, opt: DropdownOption) {\n if (e.key === ' ') {\n e.preventDefault()\n selectOption(opt)\n } else if (e.key === 'Enter') {\n e.preventDefault()\n confirm()\n }\n}\n\nfunction onClickOutside(e: MouseEvent) {\n if (wrapperRef.value && !wrapperRef.value.contains(e.target as Node)) isOpen.value = false\n}\n\nonMounted(() => document.addEventListener('mousedown', onClickOutside))\nonBeforeUnmount(() => document.removeEventListener('mousedown', onClickOutside))\n\nfunction toggleOpen() {\n isOpen.value = !isOpen.value\n if (isOpen.value) filterText.value = ''\n}\n\nfunction clearInput() {\n selection.value = []\n emit('update:modelValue', null)\n isOpen.value = false\n}\n\nfunction focusAndOpen() {\n isOpen.value = true\n if (cfg.value.filterable) nextTick(() => filterInputRef.value?.focus())\n}\n\ndefineExpose({ focusAndOpen })\n</script>\n\n<template>\n <div class=\"ac-component\">\n <div ref=\"wrapperRef\" class=\"c-wrapper ds-wrapper\">\n <div\n class=\"c-input-row pointer\"\n :class=\"{\n 'c-input-row--sm': cfg.size === 'small',\n 'c-input-row--lg': cfg.size === 'large',\n }\"\n @click=\"toggleOpen()\"\n >\n <span v-if=\"selectedLabel\" class=\"c-truncate ds-value\">{{ selectedLabel }}</span>\n <span v-else class=\"c-placeholder\">{{ cfg.placeholder }}</span>\n <button\n v-if=\"cfg.clearable && selection.length > 0\"\n type=\"button\"\n class=\"c-icon-btn c-icon-btn--clear ds-clear-btn\"\n @click.stop=\"clearInput()\"\n aria-label=\"Törlés\"\n >\n <i class=\"fa-solid fa-fw fa-xmark\"></i>\n </button>\n <span\n class=\"c-icon-btn c-icon-btn--chevron mr-2\"\n :class=\"{ 'c-icon-btn--chevron-open': isOpen }\"\n >\n <i class=\"fa-solid fa-fw fa-chevron-down\"></i>\n </span>\n </div>\n\n <div\n v-if=\"isOpen\"\n class=\"c-dropdown ds-dropdown ac-component\"\n :class=\"{ 'ds-dropdown--multiple': cfg.multiple }\"\n >\n <div v-if=\"cfg.filterable\" class=\"ds-filter\">\n <span\n v-if=\"cfg.multiple\"\n class=\"c-checkbox ds-select-all-checkbox\"\n :class=\"{ 'c-checkbox--checked': allOptionsSelected }\"\n @click.stop=\"toggleAllOptions()\"\n :title=\"allOptionsSelected ? 'Összes kijelölés törlése' : 'Összes kijelölése'\"\n ></span>\n <input\n ref=\"filterInputRef\"\n type=\"text\"\n id=\"ds-filter-input\"\n class=\"c-focus ds-filter-input\"\n v-model=\"filterText\"\n placeholder=\"Filter...\"\n @click.stop\n />\n <button\n v-if=\"filterText\"\n type=\"button\"\n class=\"c-icon-btn c-icon-btn--clear ds-filter-clear\"\n @click.stop=\"filterText = ''\"\n aria-label=\"Szűrők törlése\"\n >\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <ul class=\"ds-options c-scroll\">\n <li\n v-for=\"(opt, idx) in filteredOptions\"\n :key=\"opt.value ?? `cb-${idx}`\"\n class=\"d-option ds-option\"\n :class=\"{ 'ds-option--selected': opt.value && isSelected(opt.value) }\"\n tabindex=\"0\"\n @click=\"selectOption(opt)\"\n @keydown=\"onOptionKeydown($event, opt)\"\n >\n <span\n v-if=\"cfg.multiple && opt.value\"\n class=\"c-checkbox\"\n :class=\"{ 'c-checkbox--checked': isSelected(opt.value) }\"\n ></span>\n <i v-if=\"opt.icon\" class=\"fa-fw\" :class=\"opt.icon\"></i>\n <span class=\"d-option__label\" :class=\"{ 'c-truncate': cfg.textEllipsis }\">{{\n opt.label\n }}</span>\n </li>\n <li v-if=\"filteredOptions.length === 0\" class=\"ds-option ds-option--empty\">\n Nincs találat\n </li>\n </ul>\n\n <div v-if=\"cfg.multiple || (cfg.clearable && selection.length > 0)\" class=\"c-footer\">\n <Button v-if=\"cfg.clearable\" label=\"Törlés\" outline @click=\"clear\" />\n <Button v-if=\"cfg.multiple\" label=\"OK\" type=\"success\" @click=\"confirm\" />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/dropdown-select.scss\"></style>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admins-components23.js","names":[],"sources":["../src/components/DropdownSelect.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface DropdownSelectConfig {\n placeholder?: string\n filterable?: boolean\n clearable?: boolean\n textEllipsis?: boolean\n multiple?: boolean\n lazy?: boolean\n size?: ControlSize\n}\n\nexport const dropdownSelectConfigDefaults: DropdownSelectConfig = {\n placeholder: 'Select...',\n filterable: true,\n clearable: true,\n textEllipsis: true,\n multiple: false,\n lazy: false,\n size: 'normal' as ControlSize\n}\n\nexport interface DropdownOption {\n icon?: string\n value?: string\n label: string\n callback?: () => void\n}\n\nexport interface DropdownSelectProps {\n modelValue?: string | string[] | null\n options: DropdownOption[]\n config?: DropdownSelectConfig\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, nextTick, onMounted, onBeforeUnmount } from 'vue'\nimport Button from '@/components/Button.vue'\nimport type { ControlSize } from '@/types/types'\nimport { debounce } from '@/utils/debounce'\n\nconst props = withDefaults(defineProps<DropdownSelectProps>(), {\n modelValue: null,\n config: () => ({ ...dropdownSelectConfigDefaults }),\n})\n\nconst cfg = computed(() => ({ ...dropdownSelectConfigDefaults, ...props.config }))\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | string[] | null]\n 'filter-input': [filterText: string]\n}>()\n\nconst isOpen = ref(false)\nconst filterText = ref('')\nconst wrapperRef = ref<HTMLElement | null>(null)\nconst filterInputRef = ref<HTMLInputElement | null>(null)\nconst buffer = ref<string[]>([])\nconst selection = ref<string[]>(toArray(props.modelValue))\n\nfunction toArray(val: string | string[] | null | undefined): string[] {\n if (val == null) return []\n return Array.isArray(val) ? [...val] : [val]\n}\n\nwatch(\n () => props.modelValue,\n (v) => {\n selection.value = toArray(v)\n },\n)\n\nwatch(isOpen, (open) => {\n if (open) {\n filterText.value = ''\n if (cfg.value.filterable) nextTick(() => filterInputRef.value?.focus())\n if (cfg.value.lazy) buffer.value = [...selection.value]\n }\n})\n\nfunction onFilterInput(text: string) {\n filterText.value = text\n debouncedEmit(text)\n}\n\nconst debouncedEmit = debounce((raw: string) => {\n emit('filter-input', raw)\n})\n\n// Display\nconst selectedLabel = computed(() => {\n if (selection.value.length === 0) return null\n if (!cfg.value.multiple)\n return props.options.find((o) => o.value === selection.value[0])?.label ?? null\n if (selection.value.length > 2) return `${selection.value.length} kiválasztva`\n return selection.value.map((v) => props.options.find((o) => o.value === v)?.label ?? v).join(', ')\n})\n\nconst filteredOptions = computed(() => {\n const q = filterText.value.toLowerCase()\n return q ? props.options.filter((o) => o.label.toLowerCase().includes(q)) : props.options\n})\n\nconst selectableOptions = computed(() => {\n return filteredOptions.value.filter((o) => o.value)\n})\n\nconst allOptionsSelected = computed(() => {\n if (selectableOptions.value.length === 0) return false\n const currentList = cfg.value.lazy && isOpen.value ? buffer.value : selection.value\n return selectableOptions.value.every((o) => o.value && currentList.includes(o.value))\n})\n\nfunction isSelected(value: string): boolean {\n return (cfg.value.lazy && isOpen.value ? buffer : selection).value.includes(value)\n}\n\nfunction toggleAllOptions() {\n const currentList = cfg.value.lazy && isOpen.value ? buffer : selection\n const selectableValues = selectableOptions.value.map((o) => o.value as string)\n\n if (allOptionsSelected.value) {\n currentList.value = currentList.value.filter((v) => !selectableValues.includes(v))\n } else {\n const toAdd = selectableValues.filter((v) => !currentList.value.includes(v))\n currentList.value = [...currentList.value, ...toAdd]\n }\n\n if (!cfg.value.lazy) {\n emit('update:modelValue', selection.value.length > 0 ? [...selection.value] : null)\n }\n}\n\n// Actions\nfunction toggleList(list: string[], value: string): string[] {\n const idx = list.indexOf(value)\n return idx >= 0 ? list.filter((_, i) => i !== idx) : [...list, value]\n}\n\nfunction selectOption(opt: DropdownOption) {\n if (opt.callback) {\n opt.callback()\n isOpen.value = false\n return\n }\n\n const value = opt.value\n if (!value) return\n\n if (cfg.value.multiple) {\n if (cfg.value.lazy) {\n buffer.value = toggleList(buffer.value, value)\n } else {\n selection.value = toggleList(selection.value, value)\n emit('update:modelValue', selection.value.length > 0 ? [...selection.value] : null)\n }\n } else {\n selection.value = [value]\n emit('update:modelValue', value)\n isOpen.value = false\n }\n}\n\nfunction confirm() {\n if (cfg.value.lazy) {\n selection.value = [...buffer.value]\n emit('update:modelValue', buffer.value.length > 0 ? [...buffer.value] : null)\n }\n isOpen.value = false\n}\n\nfunction clear() {\n if (cfg.value.lazy) {\n buffer.value = []\n } else {\n selection.value = []\n emit('update:modelValue', null)\n }\n}\n\nfunction onOptionKeydown(e: KeyboardEvent, opt: DropdownOption) {\n if (e.key === ' ') {\n e.preventDefault()\n selectOption(opt)\n } else if (e.key === 'Enter') {\n e.preventDefault()\n confirm()\n }\n}\n\nfunction onClickOutside(e: MouseEvent) {\n if (wrapperRef.value && !wrapperRef.value.contains(e.target as Node)) isOpen.value = false\n}\n\nonMounted(() => document.addEventListener('mousedown', onClickOutside))\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', onClickOutside)\n})\n\nfunction toggleOpen() {\n isOpen.value = !isOpen.value\n if (isOpen.value) filterText.value = ''\n}\n\nfunction clearInput() {\n selection.value = []\n emit('update:modelValue', null)\n isOpen.value = false\n}\n\nfunction focusAndOpen() {\n isOpen.value = true\n if (cfg.value.filterable) nextTick(() => filterInputRef.value?.focus())\n}\n\ndefineExpose({ focusAndOpen })\n</script>\n\n<template>\n <div class=\"ac-component\">\n <div ref=\"wrapperRef\" class=\"c-wrapper ds-wrapper\">\n <div\n class=\"c-input-row pointer\"\n :class=\"{\n 'c-input-row--sm': cfg.size === 'small',\n 'c-input-row--lg': cfg.size === 'large',\n }\"\n @click=\"toggleOpen()\"\n >\n <span v-if=\"selectedLabel\" class=\"c-truncate ds-value\">{{ selectedLabel }}</span>\n <span v-else class=\"c-placeholder\">{{ cfg.placeholder }}</span>\n <button\n v-if=\"cfg.clearable && selection.length > 0\"\n type=\"button\"\n class=\"c-icon-btn c-icon-btn--clear ds-clear-btn\"\n @click.stop=\"clearInput()\"\n aria-label=\"Törlés\"\n >\n <i class=\"fa-solid fa-fw fa-xmark\"></i>\n </button>\n <span\n class=\"c-icon-btn c-icon-btn--chevron mr-2\"\n :class=\"{ 'c-icon-btn--chevron-open': isOpen }\"\n >\n <i class=\"fa-solid fa-fw fa-chevron-down\"></i>\n </span>\n </div>\n\n <div\n v-if=\"isOpen\"\n class=\"c-dropdown ds-dropdown ac-component\"\n :class=\"{ 'ds-dropdown--multiple': cfg.multiple }\"\n >\n <div v-if=\"cfg.filterable\" class=\"ds-filter\">\n <span\n v-if=\"cfg.multiple\"\n class=\"c-checkbox ds-select-all-checkbox\"\n :class=\"{ 'c-checkbox--checked': allOptionsSelected }\"\n @click.stop=\"toggleAllOptions()\"\n :title=\"allOptionsSelected ? 'Összes kijelölés törlése' : 'Összes kijelölése'\"\n ></span>\n <input\n ref=\"filterInputRef\"\n type=\"text\"\n id=\"ds-filter-input\"\n class=\"c-focus ds-filter-input\"\n :value=\"filterText\"\n @input=\"onFilterInput(($event.target as HTMLInputElement).value)\"\n placeholder=\"Filter...\"\n @click.stop\n />\n <button\n v-if=\"filterText\"\n type=\"button\"\n class=\"c-icon-btn c-icon-btn--clear ds-filter-clear\"\n @click.stop=\"filterText = ''\"\n aria-label=\"Szűrők törlése\"\n >\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <ul class=\"ds-options c-scroll\">\n <li\n v-for=\"(opt, idx) in filteredOptions\"\n :key=\"opt.value ?? `cb-${idx}`\"\n class=\"d-option ds-option\"\n :class=\"{ 'ds-option--selected': opt.value && isSelected(opt.value) }\"\n tabindex=\"0\"\n @click=\"selectOption(opt)\"\n @keydown=\"onOptionKeydown($event, opt)\"\n >\n <span\n v-if=\"cfg.multiple && opt.value\"\n class=\"c-checkbox\"\n :class=\"{ 'c-checkbox--checked': isSelected(opt.value) }\"\n ></span>\n <i v-if=\"opt.icon\" class=\"fa-fw\" :class=\"opt.icon\"></i>\n <span class=\"d-option__label\" :class=\"{ 'c-truncate': cfg.textEllipsis }\">{{\n opt.label\n }}</span>\n </li>\n <li v-if=\"filteredOptions.length === 0\" class=\"ds-option ds-option--empty\">\n Nincs találat\n </li>\n </ul>\n\n <div v-if=\"cfg.multiple || (cfg.clearable && selection.length > 0)\" class=\"c-footer\">\n <Button v-if=\"cfg.clearable\" label=\"Törlés\" outline @click=\"clear\" />\n <Button v-if=\"cfg.multiple\" label=\"OK\" type=\"success\" @click=\"confirm\" />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/dropdown-select.scss\"></style>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admins-components25.js","names":[],"sources":["../src/components/DropdownSelect.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface DropdownSelectConfig {\n placeholder?: string\n filterable?: boolean\n clearable?: boolean\n textEllipsis?: boolean\n multiple?: boolean\n lazy?: boolean\n size?: ControlSize\n}\n\nexport const dropdownSelectConfigDefaults: DropdownSelectConfig = {\n placeholder: 'Select...',\n filterable: true,\n clearable: true,\n textEllipsis: true,\n multiple: false,\n lazy: false,\n size: 'normal' as ControlSize
|
|
1
|
+
{"version":3,"file":"admins-components25.js","names":[],"sources":["../src/components/DropdownSelect.vue"],"sourcesContent":["<script lang=\"ts\">\nexport interface DropdownSelectConfig {\n placeholder?: string\n filterable?: boolean\n clearable?: boolean\n textEllipsis?: boolean\n multiple?: boolean\n lazy?: boolean\n size?: ControlSize\n}\n\nexport const dropdownSelectConfigDefaults: DropdownSelectConfig = {\n placeholder: 'Select...',\n filterable: true,\n clearable: true,\n textEllipsis: true,\n multiple: false,\n lazy: false,\n size: 'normal' as ControlSize\n}\n\nexport interface DropdownOption {\n icon?: string\n value?: string\n label: string\n callback?: () => void\n}\n\nexport interface DropdownSelectProps {\n modelValue?: string | string[] | null\n options: DropdownOption[]\n config?: DropdownSelectConfig\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, nextTick, onMounted, onBeforeUnmount } from 'vue'\nimport Button from '@/components/Button.vue'\nimport type { ControlSize } from '@/types/types'\nimport { debounce } from '@/utils/debounce'\n\nconst props = withDefaults(defineProps<DropdownSelectProps>(), {\n modelValue: null,\n config: () => ({ ...dropdownSelectConfigDefaults }),\n})\n\nconst cfg = computed(() => ({ ...dropdownSelectConfigDefaults, ...props.config }))\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | string[] | null]\n 'filter-input': [filterText: string]\n}>()\n\nconst isOpen = ref(false)\nconst filterText = ref('')\nconst wrapperRef = ref<HTMLElement | null>(null)\nconst filterInputRef = ref<HTMLInputElement | null>(null)\nconst buffer = ref<string[]>([])\nconst selection = ref<string[]>(toArray(props.modelValue))\n\nfunction toArray(val: string | string[] | null | undefined): string[] {\n if (val == null) return []\n return Array.isArray(val) ? [...val] : [val]\n}\n\nwatch(\n () => props.modelValue,\n (v) => {\n selection.value = toArray(v)\n },\n)\n\nwatch(isOpen, (open) => {\n if (open) {\n filterText.value = ''\n if (cfg.value.filterable) nextTick(() => filterInputRef.value?.focus())\n if (cfg.value.lazy) buffer.value = [...selection.value]\n }\n})\n\nfunction onFilterInput(text: string) {\n filterText.value = text\n debouncedEmit(text)\n}\n\nconst debouncedEmit = debounce((raw: string) => {\n emit('filter-input', raw)\n})\n\n// Display\nconst selectedLabel = computed(() => {\n if (selection.value.length === 0) return null\n if (!cfg.value.multiple)\n return props.options.find((o) => o.value === selection.value[0])?.label ?? null\n if (selection.value.length > 2) return `${selection.value.length} kiválasztva`\n return selection.value.map((v) => props.options.find((o) => o.value === v)?.label ?? v).join(', ')\n})\n\nconst filteredOptions = computed(() => {\n const q = filterText.value.toLowerCase()\n return q ? props.options.filter((o) => o.label.toLowerCase().includes(q)) : props.options\n})\n\nconst selectableOptions = computed(() => {\n return filteredOptions.value.filter((o) => o.value)\n})\n\nconst allOptionsSelected = computed(() => {\n if (selectableOptions.value.length === 0) return false\n const currentList = cfg.value.lazy && isOpen.value ? buffer.value : selection.value\n return selectableOptions.value.every((o) => o.value && currentList.includes(o.value))\n})\n\nfunction isSelected(value: string): boolean {\n return (cfg.value.lazy && isOpen.value ? buffer : selection).value.includes(value)\n}\n\nfunction toggleAllOptions() {\n const currentList = cfg.value.lazy && isOpen.value ? buffer : selection\n const selectableValues = selectableOptions.value.map((o) => o.value as string)\n\n if (allOptionsSelected.value) {\n currentList.value = currentList.value.filter((v) => !selectableValues.includes(v))\n } else {\n const toAdd = selectableValues.filter((v) => !currentList.value.includes(v))\n currentList.value = [...currentList.value, ...toAdd]\n }\n\n if (!cfg.value.lazy) {\n emit('update:modelValue', selection.value.length > 0 ? [...selection.value] : null)\n }\n}\n\n// Actions\nfunction toggleList(list: string[], value: string): string[] {\n const idx = list.indexOf(value)\n return idx >= 0 ? list.filter((_, i) => i !== idx) : [...list, value]\n}\n\nfunction selectOption(opt: DropdownOption) {\n if (opt.callback) {\n opt.callback()\n isOpen.value = false\n return\n }\n\n const value = opt.value\n if (!value) return\n\n if (cfg.value.multiple) {\n if (cfg.value.lazy) {\n buffer.value = toggleList(buffer.value, value)\n } else {\n selection.value = toggleList(selection.value, value)\n emit('update:modelValue', selection.value.length > 0 ? [...selection.value] : null)\n }\n } else {\n selection.value = [value]\n emit('update:modelValue', value)\n isOpen.value = false\n }\n}\n\nfunction confirm() {\n if (cfg.value.lazy) {\n selection.value = [...buffer.value]\n emit('update:modelValue', buffer.value.length > 0 ? [...buffer.value] : null)\n }\n isOpen.value = false\n}\n\nfunction clear() {\n if (cfg.value.lazy) {\n buffer.value = []\n } else {\n selection.value = []\n emit('update:modelValue', null)\n }\n}\n\nfunction onOptionKeydown(e: KeyboardEvent, opt: DropdownOption) {\n if (e.key === ' ') {\n e.preventDefault()\n selectOption(opt)\n } else if (e.key === 'Enter') {\n e.preventDefault()\n confirm()\n }\n}\n\nfunction onClickOutside(e: MouseEvent) {\n if (wrapperRef.value && !wrapperRef.value.contains(e.target as Node)) isOpen.value = false\n}\n\nonMounted(() => document.addEventListener('mousedown', onClickOutside))\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', onClickOutside)\n})\n\nfunction toggleOpen() {\n isOpen.value = !isOpen.value\n if (isOpen.value) filterText.value = ''\n}\n\nfunction clearInput() {\n selection.value = []\n emit('update:modelValue', null)\n isOpen.value = false\n}\n\nfunction focusAndOpen() {\n isOpen.value = true\n if (cfg.value.filterable) nextTick(() => filterInputRef.value?.focus())\n}\n\ndefineExpose({ focusAndOpen })\n</script>\n\n<template>\n <div class=\"ac-component\">\n <div ref=\"wrapperRef\" class=\"c-wrapper ds-wrapper\">\n <div\n class=\"c-input-row pointer\"\n :class=\"{\n 'c-input-row--sm': cfg.size === 'small',\n 'c-input-row--lg': cfg.size === 'large',\n }\"\n @click=\"toggleOpen()\"\n >\n <span v-if=\"selectedLabel\" class=\"c-truncate ds-value\">{{ selectedLabel }}</span>\n <span v-else class=\"c-placeholder\">{{ cfg.placeholder }}</span>\n <button\n v-if=\"cfg.clearable && selection.length > 0\"\n type=\"button\"\n class=\"c-icon-btn c-icon-btn--clear ds-clear-btn\"\n @click.stop=\"clearInput()\"\n aria-label=\"Törlés\"\n >\n <i class=\"fa-solid fa-fw fa-xmark\"></i>\n </button>\n <span\n class=\"c-icon-btn c-icon-btn--chevron mr-2\"\n :class=\"{ 'c-icon-btn--chevron-open': isOpen }\"\n >\n <i class=\"fa-solid fa-fw fa-chevron-down\"></i>\n </span>\n </div>\n\n <div\n v-if=\"isOpen\"\n class=\"c-dropdown ds-dropdown ac-component\"\n :class=\"{ 'ds-dropdown--multiple': cfg.multiple }\"\n >\n <div v-if=\"cfg.filterable\" class=\"ds-filter\">\n <span\n v-if=\"cfg.multiple\"\n class=\"c-checkbox ds-select-all-checkbox\"\n :class=\"{ 'c-checkbox--checked': allOptionsSelected }\"\n @click.stop=\"toggleAllOptions()\"\n :title=\"allOptionsSelected ? 'Összes kijelölés törlése' : 'Összes kijelölése'\"\n ></span>\n <input\n ref=\"filterInputRef\"\n type=\"text\"\n id=\"ds-filter-input\"\n class=\"c-focus ds-filter-input\"\n :value=\"filterText\"\n @input=\"onFilterInput(($event.target as HTMLInputElement).value)\"\n placeholder=\"Filter...\"\n @click.stop\n />\n <button\n v-if=\"filterText\"\n type=\"button\"\n class=\"c-icon-btn c-icon-btn--clear ds-filter-clear\"\n @click.stop=\"filterText = ''\"\n aria-label=\"Szűrők törlése\"\n >\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <ul class=\"ds-options c-scroll\">\n <li\n v-for=\"(opt, idx) in filteredOptions\"\n :key=\"opt.value ?? `cb-${idx}`\"\n class=\"d-option ds-option\"\n :class=\"{ 'ds-option--selected': opt.value && isSelected(opt.value) }\"\n tabindex=\"0\"\n @click=\"selectOption(opt)\"\n @keydown=\"onOptionKeydown($event, opt)\"\n >\n <span\n v-if=\"cfg.multiple && opt.value\"\n class=\"c-checkbox\"\n :class=\"{ 'c-checkbox--checked': isSelected(opt.value) }\"\n ></span>\n <i v-if=\"opt.icon\" class=\"fa-fw\" :class=\"opt.icon\"></i>\n <span class=\"d-option__label\" :class=\"{ 'c-truncate': cfg.textEllipsis }\">{{\n opt.label\n }}</span>\n </li>\n <li v-if=\"filteredOptions.length === 0\" class=\"ds-option ds-option--empty\">\n Nincs találat\n </li>\n </ul>\n\n <div v-if=\"cfg.multiple || (cfg.clearable && selection.length > 0)\" class=\"c-footer\">\n <Button v-if=\"cfg.clearable\" label=\"Törlés\" outline @click=\"clear\" />\n <Button v-if=\"cfg.multiple\" label=\"OK\" type=\"success\" @click=\"confirm\" />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" src=\"@/styles/components/dropdown-select.scss\"></style>\n"],"mappings":""}
|
|
@@ -1,36 +1,33 @@
|
|
|
1
1
|
import { getFullStorageKey as e } from "./admins-components73.js";
|
|
2
2
|
import { parseDropdownValue as t } from "./admins-components77.js";
|
|
3
3
|
//#region src/utils/dataFilters.ts
|
|
4
|
-
function n(e, t) {
|
|
5
|
-
let
|
|
6
|
-
for (let t of e) if (t.type !== "separator") if (t.key in r) a[t.key] = r[t.key];
|
|
7
|
-
else if (t.key in n) a[t.key] = n[t.key];
|
|
8
|
-
else if (t.value !== void 0) a[t.key] = t.value;
|
|
9
|
-
else continue;
|
|
10
|
-
return a;
|
|
11
|
-
}
|
|
12
|
-
function r(e, t) {
|
|
13
|
-
let r = n(e, t), i = {};
|
|
4
|
+
function n(e, t, n = !0) {
|
|
5
|
+
let i = r(e), o = Object.keys(i).length > 0, s = (o ? null : a(t))?.values ?? {}, c = {};
|
|
14
6
|
for (let t of e) {
|
|
15
7
|
if (t.type === "separator") continue;
|
|
16
|
-
let e
|
|
17
|
-
if (
|
|
8
|
+
let e;
|
|
9
|
+
if (t.key in i) e = i[t.key];
|
|
10
|
+
else if (o) continue;
|
|
11
|
+
else if (t.key in s) e = s[t.key];
|
|
12
|
+
else if (t.value !== void 0) e = t.value;
|
|
13
|
+
else continue;
|
|
14
|
+
if (e != null) if (n && t.transformer) {
|
|
18
15
|
let n = t.transformer(e);
|
|
19
|
-
n && Object.assign(
|
|
20
|
-
} else
|
|
16
|
+
n && Object.assign(c, n);
|
|
17
|
+
} else c[t.key] = e;
|
|
21
18
|
}
|
|
22
|
-
return
|
|
19
|
+
return c;
|
|
23
20
|
}
|
|
24
|
-
function
|
|
21
|
+
function r(e) {
|
|
25
22
|
let t = new URLSearchParams(window.location.search), n = {};
|
|
26
23
|
for (let r of e) {
|
|
27
24
|
if (r.type === "separator") continue;
|
|
28
25
|
let e = window.location.search ? t.get(r.key) : null;
|
|
29
|
-
e && (n[r.key] =
|
|
26
|
+
e && (n[r.key] = s(r.type, e, r.value));
|
|
30
27
|
}
|
|
31
28
|
return n;
|
|
32
29
|
}
|
|
33
|
-
function
|
|
30
|
+
function i(t) {
|
|
34
31
|
try {
|
|
35
32
|
let n = e("filters", t), r = JSON.parse(localStorage.getItem(n) ?? "[]");
|
|
36
33
|
return Array.isArray(r) ? r.filter((e) => e && typeof e == "object" && typeof e.id == "string" && e.values && typeof e.savedAt == "string") : [];
|
|
@@ -38,20 +35,20 @@ function a(t) {
|
|
|
38
35
|
return [];
|
|
39
36
|
}
|
|
40
37
|
}
|
|
41
|
-
function
|
|
42
|
-
return
|
|
38
|
+
function a(e) {
|
|
39
|
+
return i(e).find((e) => e.isDefault) ?? null;
|
|
43
40
|
}
|
|
44
|
-
function
|
|
41
|
+
function o(e) {
|
|
45
42
|
return Object.fromEntries(Object.entries(e).filter(([e, t]) => t !== null && t !== "" && t !== void 0));
|
|
46
43
|
}
|
|
47
|
-
function
|
|
44
|
+
function s(e, n, r) {
|
|
48
45
|
if (e === "number") {
|
|
49
46
|
let e = Number(n);
|
|
50
47
|
return isNaN(e) ? r ?? null : e;
|
|
51
48
|
}
|
|
52
|
-
return e === "date" || e === "datetime" ? { utc: n } : e === "daterange" || e === "datetimerange" ?
|
|
49
|
+
return e === "date" || e === "datetime" ? { utc: n } : e === "daterange" || e === "datetimerange" ? c(n, r) : e === "dropdown" ? t(n) : e === "checkbox" ? n === "true" : n;
|
|
53
50
|
}
|
|
54
|
-
function
|
|
51
|
+
function c(e, t) {
|
|
55
52
|
try {
|
|
56
53
|
let t = JSON.parse(e);
|
|
57
54
|
return t && typeof t == "object" && "local" in t && t.local && (t.local = new Date(t.local)), t;
|
|
@@ -59,7 +56,7 @@ function l(e, t) {
|
|
|
59
56
|
return t ?? null;
|
|
60
57
|
}
|
|
61
58
|
}
|
|
62
|
-
function
|
|
59
|
+
function l(e, t) {
|
|
63
60
|
let n = new URLSearchParams(window.location.search);
|
|
64
61
|
for (let r of e) {
|
|
65
62
|
if (r.type === "separator") continue;
|
|
@@ -70,4 +67,4 @@ function u(e, t) {
|
|
|
70
67
|
window.history.replaceState(null, "", i);
|
|
71
68
|
}
|
|
72
69
|
//#endregion
|
|
73
|
-
export {
|
|
70
|
+
export { o as filterEmptyValues, n as getDefaultFilters, a as getDefaultSavedFilter, r as getFilterUrlParams, i as getSavedFilters, l as writeFilterParams };
|