@medyat/vue-data-table 0.0.0-stage → 1.0.1

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.
@@ -0,0 +1,330 @@
1
+ import { I as e, L as t, R as n, W as r, Y as i } from "./query-CGNWUi2E.js";
2
+ import { Fragment as a, computed as o, createBlock as s, createCommentVNode as c, createElementBlock as l, createElementVNode as u, createTextVNode as d, createVNode as f, defineComponent as p, normalizeClass as m, normalizeStyle as h, onBeforeUnmount as g, onMounted as _, openBlock as v, ref as y, renderList as b, toDisplayString as x, unref as S, vModelText as C, watch as w, withCtx as T, withDirectives as E, withKeys as D, withModifiers as O } from "vue";
3
+ import { PhBracketsCurly as k, PhCalendarBlank as A, PhCheckSquare as j, PhClock as M, PhCreditCard as N, PhEnvelope as P, PhHash as F, PhLink as I, PhLinkSimple as L, PhListBullets as R, PhListChecks as z, PhMagnifyingGlass as B, PhPalette as V, PhPercent as H, PhPhone as U, PhRadioButton as W, PhStar as G, PhTextAlignLeft as K, PhTextT as q, PhUser as J } from "@phosphor-icons/vue";
4
+ import { ToggleGroupItem as Y, ToggleGroupRoot as X } from "reka-ui";
5
+ //#region src/core/filters/typeIcons.ts
6
+ var Z = {
7
+ int: F,
8
+ float: F,
9
+ percentage: H,
10
+ star: G,
11
+ currency: N,
12
+ string: q,
13
+ text: K,
14
+ uppercase: q,
15
+ lowercase: q,
16
+ phone: U,
17
+ color: V,
18
+ email: P,
19
+ url: I,
20
+ id: F,
21
+ boolean: j,
22
+ select: W,
23
+ multiselect: z,
24
+ ajax: L,
25
+ user: J,
26
+ date: A,
27
+ datetime: M,
28
+ object: k,
29
+ array: R
30
+ }, Q = { class: "dt-editor-number" }, $ = { class: "dt-editor-fields" }, ee = { class: "dt-editor-field" }, te = {
31
+ key: 0,
32
+ class: "dt-editor-label"
33
+ }, ne = ["onKeydown"], re = {
34
+ key: 0,
35
+ class: "dt-input-end dt-input-suffix"
36
+ }, ie = { class: "dt-editor-and" }, ae = { class: "dt-editor-field" }, oe = { class: "dt-editor-label" }, se = ["onKeydown"], ce = {
37
+ key: 0,
38
+ class: "dt-input-end dt-input-suffix"
39
+ }, le = /* @__PURE__ */ p({
40
+ __name: "NumberEditor",
41
+ props: {
42
+ column: {},
43
+ op: {},
44
+ modelValue: {},
45
+ currency: {},
46
+ currencies: {}
47
+ },
48
+ emits: [
49
+ "update:modelValue",
50
+ "update:currency",
51
+ "done"
52
+ ],
53
+ setup(t, { emit: n }) {
54
+ let i = t, f = n, { i18n: p, locale: h } = r(), k = o(() => i.op === "between"), A = new Intl.NumberFormat(h, { maximumFractionDigits: 6 }), j = (e) => typeof e == "number" && Number.isFinite(e) ? A.format(e) : "", M = () => {
55
+ let e = i.modelValue;
56
+ return k.value ? [j(Array.isArray(e) ? e[0] : void 0), j(Array.isArray(e) ? e[1] : void 0)] : [j(e), ""];
57
+ }, [N, P] = M(), F = y(N ?? ""), I = y(P ?? "");
58
+ w(() => [i.modelValue, i.op], () => {
59
+ let [t, n] = M();
60
+ e(h, F.value) !== e(h, t ?? "") && (F.value = t ?? ""), e(h, I.value) !== e(h, n ?? "") && (I.value = n ?? "");
61
+ });
62
+ let L = y(null);
63
+ _(() => L.value?.focus());
64
+ let R = () => {
65
+ let t = e(h, F.value);
66
+ if (k.value) {
67
+ let n = e(h, I.value);
68
+ f("update:modelValue", t === null && n === null ? void 0 : [t, n]);
69
+ } else f("update:modelValue", t ?? void 0);
70
+ }, z, B = () => {
71
+ clearTimeout(z), z = setTimeout(R, 250);
72
+ }, V = () => {
73
+ clearTimeout(z), R(), f("done");
74
+ };
75
+ g(() => clearTimeout(z));
76
+ let H = i.column.type === "percentage" ? "%" : "";
77
+ return (e, n) => (v(), l("div", Q, [t.currencies.length > 1 ? (v(), s(S(X), {
78
+ key: 0,
79
+ class: "dt-seg dt-seg-xs",
80
+ type: "single",
81
+ "model-value": t.currency,
82
+ "onUpdate:modelValue": n[0] ||= (e) => e && f("update:currency", String(e))
83
+ }, {
84
+ default: T(() => [(v(!0), l(a, null, b(t.currencies, (e) => (v(), s(S(Y), {
85
+ key: e,
86
+ class: "dt-seg-item",
87
+ value: e
88
+ }, {
89
+ default: T(() => [d(x(e), 1)]),
90
+ _: 2
91
+ }, 1032, ["value"]))), 128))]),
92
+ _: 1
93
+ }, 8, ["model-value"])) : c("", !0), u("div", $, [u("label", ee, [k.value ? (v(), l("span", te, x(S(p).t("number.min")), 1)) : c("", !0), u("span", { class: m(["dt-input", { "has-suffix": S(H) }]) }, [E(u("input", {
94
+ ref_key: "first",
95
+ ref: L,
96
+ "onUpdate:modelValue": n[1] ||= (e) => F.value = e,
97
+ type: "text",
98
+ inputmode: "decimal",
99
+ autocomplete: "off",
100
+ onInput: B,
101
+ onKeydown: D(O(V, ["prevent"]), ["enter"])
102
+ }, null, 40, ne), [[C, F.value]]), S(H) ? (v(), l("span", re, x(S(H)), 1)) : c("", !0)], 2)]), k.value ? (v(), l(a, { key: 0 }, [u("span", ie, x(S(p).t("number.and")), 1), u("label", ae, [u("span", oe, x(S(p).t("number.max")), 1), u("span", { class: m(["dt-input", { "has-suffix": S(H) }]) }, [E(u("input", {
103
+ "onUpdate:modelValue": n[2] ||= (e) => I.value = e,
104
+ type: "text",
105
+ inputmode: "decimal",
106
+ autocomplete: "off",
107
+ onInput: B,
108
+ onKeydown: D(O(V, ["prevent"]), ["enter"])
109
+ }, null, 40, se), [[C, I.value]]), S(H) ? (v(), l("span", ce, x(S(H)), 1)) : c("", !0)], 2)])], 64)) : c("", !0)])]));
110
+ }
111
+ }), ue = { class: "dt-options" }, de = {
112
+ key: 0,
113
+ class: "dt-input has-icon dt-options-search"
114
+ }, fe = { class: "dt-input-icon" }, pe = ["placeholder", "aria-label"], me = {
115
+ class: "dt-options-list",
116
+ role: "group"
117
+ }, he = ["checked"], ge = { class: "dt-option-body" }, _e = {
118
+ class: "dt-avatar dt-tone-blue",
119
+ "aria-hidden": "true"
120
+ }, ve = ["checked"], ye = { class: "dt-option-body" }, be = ["checked", "onChange"], xe = { class: "dt-option-body" }, Se = { class: "dt-mono" }, Ce = ["onClick"], we = {
121
+ key: 1,
122
+ class: "dt-options-empty"
123
+ }, Te = {
124
+ key: 2,
125
+ class: "dt-options-empty"
126
+ }, Ee = {
127
+ key: 3,
128
+ class: "dt-options-empty"
129
+ }, De = /* @__PURE__ */ p({
130
+ __name: "OptionsEditor",
131
+ props: {
132
+ column: {},
133
+ op: {},
134
+ modelValue: {},
135
+ rows: {},
136
+ labels: {}
137
+ },
138
+ emits: ["update:modelValue", "unassigned"],
139
+ setup(e, { emit: p }) {
140
+ let _ = e, T = p, { i18n: D } = r(), k = o(() => _.column), A = o(() => k.value.type === "ajax" || k.value.type === "user" ? k.value.remote : void 0), j = o(() => k.value.type === "user"), M = y(""), N = () => {
141
+ let e = /* @__PURE__ */ new Set();
142
+ for (let t of _.rows) {
143
+ let n = k.value.accessor ? k.value.accessor(t) : i(t, k.value.id);
144
+ for (let t of Array.isArray(n) ? n : [n]) t != null && t !== "" && e.add(t);
145
+ }
146
+ return [...e].sort((e, t) => String(e).localeCompare(String(t))).map((e) => ({
147
+ value: e,
148
+ label: String(e)
149
+ }));
150
+ }, P = o(() => {
151
+ let e = k.value;
152
+ return e.type === "select" || e.type === "multiselect" ? e.options : e.type === "user" && e.options ? [...e.options].sort((e, t) => e.label.localeCompare(t.label)) : e.type === "color" && e.palette ? e.palette.map((e) => ({
153
+ value: e,
154
+ label: e
155
+ })) : e.type === "color" ? N() : [];
156
+ }), F = y([]), I = y(!1), L = y(!1), R = 1, z = null, V, H = async (e) => {
157
+ let t = A.value;
158
+ if (t) {
159
+ z?.abort(), z = new AbortController(), L.value = !0;
160
+ try {
161
+ let n = await t.search(M.value, R, { signal: z.signal });
162
+ F.value = e ? [...F.value, ...n.items] : n.items, I.value = n.hasMore, _.labels.seed(k.value.id, n.items);
163
+ } catch {} finally {
164
+ L.value = !1;
165
+ }
166
+ }
167
+ };
168
+ A.value && H(!1), w(M, () => {
169
+ A.value && (clearTimeout(V), V = setTimeout(() => {
170
+ R = 1, H(!1);
171
+ }, 250));
172
+ });
173
+ let U = () => {
174
+ R += 1, H(!0);
175
+ };
176
+ g(() => {
177
+ clearTimeout(V), z?.abort();
178
+ });
179
+ let W = o(() => {
180
+ if (A.value) return F.value;
181
+ let e = M.value.trim().toLocaleLowerCase();
182
+ return e ? P.value.filter((t) => t.label.toLocaleLowerCase().includes(e)) : P.value;
183
+ }), G = o(() => !!A.value || P.value.length > 7), K = o(() => k.value.filterNoun ? D.t("option.searchNoun", { noun: k.value.filterNoun }) : D.t("option.search")), q = o(() => new Set(_.modelValue.map(String))), J = (e) => q.value.has(String(e)), Y = (e) => {
184
+ let t = J(e) ? _.modelValue.filter((t) => String(t) !== String(e)) : [..._.modelValue, e];
185
+ T("update:modelValue", t);
186
+ }, X = (e) => T("update:modelValue", [e]), Z = o(() => _.op === "is_empty"), Q = o(() => [
187
+ "select",
188
+ "multiselect",
189
+ "user"
190
+ ].includes(k.value.type)), $ = (e) => k.value.type === "user" ? [
191
+ t(e.o),
192
+ " ",
193
+ e.o.label
194
+ ] : n(e.o.tone ?? "gray", e.o.label);
195
+ return (e, t) => (v(), l("div", ue, [G.value ? (v(), l("label", de, [u("span", fe, [f(S(B), {
196
+ size: 14,
197
+ "aria-hidden": "true"
198
+ })]), E(u("input", {
199
+ "onUpdate:modelValue": t[0] ||= (e) => M.value = e,
200
+ type: "search",
201
+ placeholder: K.value,
202
+ "aria-label": K.value,
203
+ autofocus: ""
204
+ }, null, 8, pe), [[C, M.value]])])) : c("", !0), u("div", me, [
205
+ j.value && !M.value ? (v(), l(a, { key: 0 }, [
206
+ u("label", { class: m(["dt-option", { "is-on": J("@me") }]) }, [u("input", {
207
+ type: "checkbox",
208
+ class: "dt-checkbox",
209
+ checked: J("@me"),
210
+ onChange: t[1] ||= (e) => Y("@me")
211
+ }, null, 40, he), u("span", ge, [u("span", _e, x(S(D).t("common.me").slice(0, 2)), 1), d(" " + x(S(D).t("common.me")), 1)])], 2),
212
+ u("label", { class: m(["dt-option is-unassigned", { "is-on": Z.value }]) }, [u("input", {
213
+ type: "checkbox",
214
+ class: "dt-checkbox",
215
+ checked: Z.value,
216
+ onChange: t[2] ||= (e) => T("unassigned")
217
+ }, null, 40, ve), u("span", ye, [t[3] ||= u("span", {
218
+ class: "dt-avatar is-empty",
219
+ "aria-hidden": "true"
220
+ }, null, -1), d(" " + x(S(D).t("common.unassigned")), 1)])], 2),
221
+ t[4] ||= u("div", { class: "dt-pop-sep" }, null, -1)
222
+ ], 64)) : c("", !0),
223
+ (v(!0), l(a, null, b(W.value, (e) => (v(), l("label", {
224
+ key: String(e.value),
225
+ class: m(["dt-option", { "is-on": J(e.value) }])
226
+ }, [
227
+ u("input", {
228
+ type: "checkbox",
229
+ class: "dt-checkbox",
230
+ checked: J(e.value),
231
+ onChange: (t) => Y(e.value)
232
+ }, null, 40, be),
233
+ u("span", xe, [Q.value ? (v(), s($, {
234
+ key: 0,
235
+ o: e
236
+ }, null, 8, ["o"])) : k.value.type === "color" ? (v(), l(a, { key: 1 }, [u("span", {
237
+ class: "dt-swatch",
238
+ style: h({ background: String(e.value) }),
239
+ "aria-hidden": "true"
240
+ }, null, 4), u("span", Se, x(e.label), 1)], 64)) : (v(), l(a, { key: 2 }, [d(x(e.label), 1)], 64))]),
241
+ u("button", {
242
+ type: "button",
243
+ class: "dt-btn dt-btn-xs dt-option-only",
244
+ tabindex: "-1",
245
+ onClick: O((t) => X(e.value), ["prevent"])
246
+ }, x(S(D).t("option.only")), 9, Ce)
247
+ ], 2))), 128)),
248
+ A.value && !L.value && W.value.length === 0 ? (v(), l("div", we, x(S(D).t("remote.noResults")), 1)) : !A.value && W.value.length === 0 ? (v(), l("div", Te, x(S(D).t("picker.noMatch")), 1)) : c("", !0),
249
+ L.value ? (v(), l("div", Ee, x(S(D).t("common.loading")), 1)) : c("", !0),
250
+ A.value && I.value && !L.value ? (v(), l("button", {
251
+ key: 4,
252
+ type: "button",
253
+ class: "dt-btn dt-btn-ghost dt-btn-sm dt-options-more",
254
+ onClick: U
255
+ }, x(S(D).t("remote.loadMore")), 1)) : c("", !0)
256
+ ])]));
257
+ }
258
+ }), Oe = {
259
+ class: "dt-editor-stars",
260
+ role: "radiogroup"
261
+ }, ke = [
262
+ "aria-checked",
263
+ "aria-label",
264
+ "onClick"
265
+ ], Ae = /* @__PURE__ */ p({
266
+ __name: "StarEditor",
267
+ props: {
268
+ column: {},
269
+ modelValue: {}
270
+ },
271
+ emits: ["update:modelValue", "done"],
272
+ setup(e, { emit: t }) {
273
+ let n = e, r = t, i = n.column.max ?? 5, o = (e) => {
274
+ r("update:modelValue", e), r("done");
275
+ };
276
+ return (t, n) => (v(), l("div", Oe, [(v(!0), l(a, null, b(S(i), (t) => (v(), l("button", {
277
+ key: t,
278
+ type: "button",
279
+ class: m(["dt-star-btn", { "is-on": typeof e.modelValue == "number" && t <= e.modelValue }]),
280
+ role: "radio",
281
+ "aria-checked": e.modelValue === t,
282
+ "aria-label": String(t),
283
+ onClick: (e) => o(t)
284
+ }, [f(S(G), {
285
+ size: 18,
286
+ weight: typeof e.modelValue == "number" && t <= e.modelValue ? "fill" : "regular",
287
+ "aria-hidden": "true"
288
+ }, null, 8, ["weight"])], 10, ke))), 128))]));
289
+ }
290
+ }), je = { class: "dt-input dt-editor-text" }, Me = ["value", "onKeydown"], Ne = /* @__PURE__ */ p({
291
+ __name: "TextEditor",
292
+ props: {
293
+ column: {},
294
+ op: {},
295
+ modelValue: {}
296
+ },
297
+ emits: ["update:modelValue", "done"],
298
+ setup(e, { emit: t }) {
299
+ let n = e, r = t, i = (e) => Array.isArray(e) ? e.join(", ") : typeof e == "string" ? e : "", a = y(i(n.modelValue));
300
+ w(() => n.modelValue, (e) => {
301
+ i(e) !== a.value && (a.value = i(e));
302
+ });
303
+ let o = y(null);
304
+ _(() => o.value?.focus());
305
+ let s = () => n.op === "in" || n.op === "not_in", c = (e) => n.column.type === "uppercase" ? e.toLocaleUpperCase() : n.column.type === "lowercase" ? e.toLocaleLowerCase() : e, d = () => {
306
+ let e = c(a.value).trim();
307
+ if (s()) {
308
+ let t = e.split(/[\n,;]+/).map((e) => e.trim()).filter(Boolean);
309
+ r("update:modelValue", t);
310
+ } else r("update:modelValue", e);
311
+ }, f, p = (e) => {
312
+ a.value = c(e.target.value), clearTimeout(f), f = setTimeout(d, 250);
313
+ }, m = () => {
314
+ clearTimeout(f), d(), r("done");
315
+ };
316
+ return g(() => clearTimeout(f)), (e, t) => (v(), l("label", je, [u("input", {
317
+ ref_key: "input",
318
+ ref: o,
319
+ value: a.value,
320
+ type: "text",
321
+ autocomplete: "off",
322
+ onInput: p,
323
+ onKeydown: D(O(m, ["prevent"]), ["enter"])
324
+ }, null, 40, Me)]));
325
+ }
326
+ });
327
+ //#endregion
328
+ export { Z as a, le as i, Ae as n, De as r, Ne as t };
329
+
330
+ //# sourceMappingURL=TextEditor-CHLM6u-l.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextEditor-CHLM6u-l.js","names":["_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_openBlock","_createElementBlock","_createBlock","_unref","_withCtx","_Fragment","_renderList","_createTextVNode","_toDisplayString","_createCommentVNode","_createElementVNode","_normalizeClass","_withDirectives","_withKeys","_withModifiers","_vModelText","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_createElementVNode","_createVNode","_unref","_withDirectives","_vModelText","_createCommentVNode","_Fragment","_normalizeClass","_toDisplayString","_createTextVNode","_renderList","_createBlock","_normalizeStyle","_withModifiers","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_Fragment","_renderList","_unref","_normalizeClass","_createVNode","_sfc_main","_openBlock","_createElementBlock","_createElementVNode","_withKeys","_withModifiers","_sfc_main","parseNumber","avatar","badge","useDataTableContext","readPath","TYPE_ICONS","PhHash","PhPercent","PhStar","PhCreditCard","PhTextT","PhTextAlignLeft","PhPhone","PhPalette","PhEnvelope","PhLink","PhCheckSquare","PhRadioButton","PhListChecks","PhLinkSimple","PhUser","PhCalendarBlank","PhClock","PhBracketsCurly","PhListBullets","_hoisted_1$3","_hoisted_2$3","_hoisted_3$1","_hoisted_4$1","_hoisted_5$1","_hoisted_6$1","_hoisted_7$1","_hoisted_8$1","_hoisted_9$1","_hoisted_10$1","_hoisted_11$1","NumberEditor_default","defineComponent","__emit","props","__props","emit","range","computed","nf","locale","show","n","fromModel","v","a0","b0","a","ref","b","x","y","first","commit","min","max","timer","onInput","onEnter","suffix","openBlock","createElementBlock","createBlock","unref","ToggleGroupRoot","_cache","withCtx","Fragment","renderList","ToggleGroupItem","c","createTextVNode","toDisplayString","createCommentVNode","createElementVNode","i18n","normalizeClass","withDirectives","$event","withKeys","withModifiers","vModelText","_hoisted_1$2","_hoisted_2$2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","OptionsEditor_default","def","remote","isUser","q","distinctFromRows","seen","row","raw","value","staticOptions","d","items","hasMore","loading","page","ctl","load","r","res","append","watch","loadMore","options","needle","o","showSearch","searchPlaceholder","selected","isOn","toggle","next","only","unassigned","rich","Opt","p","createVNode","PhMagnifyingGlass","normalizeStyle","_hoisted_1$1","_hoisted_2$1","StarEditor_default","pick","_hoisted_1","_hoisted_2","TextEditor_default","asText","draft","input","isList","normalize","s","parts","onBeforeUnmount"],"sources":["../src/core/filters/typeIcons.ts","../src/core/editors/NumberEditor.vue","../src/core/editors/NumberEditor.vue","../src/core/editors/OptionsEditor.vue","../src/core/editors/OptionsEditor.vue","../src/core/editors/StarEditor.vue","../src/core/editors/StarEditor.vue","../src/core/editors/TextEditor.vue","../src/core/editors/TextEditor.vue"],"sourcesContent":["// Sütun tipi ikonları (column picker ve çip; handoff 03 §3.2): Phosphor regular, 14 px.\nimport {\n PhBracketsCurly,\n PhCalendarBlank,\n PhCheckSquare,\n PhClock,\n PhCreditCard,\n PhEnvelope,\n PhHash,\n PhLink,\n PhLinkSimple,\n PhListBullets,\n PhListChecks,\n PhPalette,\n PhPercent,\n PhPhone,\n PhRadioButton,\n PhStar,\n PhTextAlignLeft,\n PhTextT,\n PhUser,\n} from '@phosphor-icons/vue'\nimport type { Component } from 'vue'\nimport type { ColumnType } from '../../types/columns'\n\nexport const TYPE_ICONS: Record<ColumnType, Component> = {\n int: PhHash,\n float: PhHash,\n percentage: PhPercent,\n star: PhStar,\n currency: PhCreditCard,\n string: PhTextT,\n text: PhTextAlignLeft,\n uppercase: PhTextT,\n lowercase: PhTextT,\n phone: PhPhone,\n color: PhPalette,\n email: PhEnvelope,\n url: PhLink,\n id: PhHash,\n boolean: PhCheckSquare,\n select: PhRadioButton,\n multiselect: PhListChecks,\n ajax: PhLinkSimple,\n user: PhUser,\n date: PhCalendarBlank,\n datetime: PhClock,\n object: PhBracketsCurly,\n array: PhListBullets,\n}\n","<script setup lang=\"ts\">\n// Sayı editörü (04 §3, T2-05): tek değer ya da Min / Max (\"and\"); 250 ms sonra ve Enter'da uygular; `currency` sütununda\n// para birimi segmented (değer düz sayı, para birimi ayrı alan); percentage `%` son eki; yerel ayara göre okunur.\nimport { ToggleGroupItem, ToggleGroupRoot } from 'reka-ui'\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport type { FilterOp } from '../../types/query'\nimport { parseNumber } from '../format/parse'\nimport { useDataTableContext } from '../plugin'\n\nconst props = defineProps<{\n column: ColumnDef\n op: FilterOp\n modelValue: unknown\n currency?: string\n /** `currency` sütunu: seçilebilir kodlar (sabit kod veya yüklü satırlardan). */\n currencies: string[]\n}>()\nconst emit = defineEmits<{\n 'update:modelValue': [value: number | [number | null, number | null] | undefined]\n 'update:currency': [code: string]\n done: []\n}>()\nconst { i18n, locale } = useDataTableContext()\nconst range = computed(() => props.op === 'between')\nconst nf = new Intl.NumberFormat(locale, { maximumFractionDigits: 6 })\nconst show = (n: unknown) => (typeof n === 'number' && Number.isFinite(n) ? nf.format(n) : '')\nconst fromModel = () => {\n const v = props.modelValue\n if (range.value) return [show(Array.isArray(v) ? v[0] : undefined), show(Array.isArray(v) ? v[1] : undefined)]\n return [show(v), '']\n}\nconst [a0, b0] = fromModel()\nconst a = ref(a0 ?? '')\nconst b = ref(b0 ?? '')\nwatch(\n () => [props.modelValue, props.op],\n () => {\n const [x, y] = fromModel()\n if (parseNumber(locale, a.value) !== parseNumber(locale, x ?? '')) a.value = x ?? ''\n if (parseNumber(locale, b.value) !== parseNumber(locale, y ?? '')) b.value = y ?? ''\n },\n)\nconst first = ref<HTMLInputElement | null>(null)\nonMounted(() => first.value?.focus())\n\nconst commit = () => {\n const min = parseNumber(locale, a.value)\n if (range.value) {\n const max = parseNumber(locale, b.value)\n emit('update:modelValue', min === null && max === null ? undefined : [min, max])\n } else emit('update:modelValue', min ?? undefined)\n}\nlet timer: ReturnType<typeof setTimeout> | undefined\nconst onInput = () => {\n clearTimeout(timer)\n timer = setTimeout(commit, 250)\n}\nconst onEnter = () => {\n clearTimeout(timer)\n commit()\n emit('done')\n}\nonBeforeUnmount(() => clearTimeout(timer))\nconst suffix = props.column.type === 'percentage' ? '%' : ''\n</script>\n\n<template>\n <div class=\"dt-editor-number\">\n <ToggleGroupRoot\n v-if=\"currencies.length > 1\"\n class=\"dt-seg dt-seg-xs\"\n type=\"single\"\n :model-value=\"currency\"\n @update:model-value=\"(v) => v && emit('update:currency', String(v))\"\n >\n <ToggleGroupItem v-for=\"c in currencies\" :key=\"c\" class=\"dt-seg-item\" :value=\"c\">{{ c }}</ToggleGroupItem>\n </ToggleGroupRoot>\n <div class=\"dt-editor-fields\">\n <label class=\"dt-editor-field\">\n <span v-if=\"range\" class=\"dt-editor-label\">{{ i18n.t('number.min') }}</span>\n <span class=\"dt-input\" :class=\"{ 'has-suffix': suffix }\">\n <input\n ref=\"first\"\n v-model=\"a\"\n type=\"text\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n @input=\"onInput\"\n @keydown.enter.prevent=\"onEnter\"\n />\n <span v-if=\"suffix\" class=\"dt-input-end dt-input-suffix\">{{ suffix }}</span>\n </span>\n </label>\n <template v-if=\"range\">\n <span class=\"dt-editor-and\">{{ i18n.t('number.and') }}</span>\n <label class=\"dt-editor-field\">\n <span class=\"dt-editor-label\">{{ i18n.t('number.max') }}</span>\n <span class=\"dt-input\" :class=\"{ 'has-suffix': suffix }\">\n <input\n v-model=\"b\"\n type=\"text\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n @input=\"onInput\"\n @keydown.enter.prevent=\"onEnter\"\n />\n <span v-if=\"suffix\" class=\"dt-input-end dt-input-suffix\">{{ suffix }}</span>\n </span>\n </label>\n </template>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Sayı editörü (04 §3, T2-05): tek değer ya da Min / Max (\"and\"); 250 ms sonra ve Enter'da uygular; `currency` sütununda\n// para birimi segmented (değer düz sayı, para birimi ayrı alan); percentage `%` son eki; yerel ayara göre okunur.\nimport { ToggleGroupItem, ToggleGroupRoot } from 'reka-ui'\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport type { FilterOp } from '../../types/query'\nimport { parseNumber } from '../format/parse'\nimport { useDataTableContext } from '../plugin'\n\nconst props = defineProps<{\n column: ColumnDef\n op: FilterOp\n modelValue: unknown\n currency?: string\n /** `currency` sütunu: seçilebilir kodlar (sabit kod veya yüklü satırlardan). */\n currencies: string[]\n}>()\nconst emit = defineEmits<{\n 'update:modelValue': [value: number | [number | null, number | null] | undefined]\n 'update:currency': [code: string]\n done: []\n}>()\nconst { i18n, locale } = useDataTableContext()\nconst range = computed(() => props.op === 'between')\nconst nf = new Intl.NumberFormat(locale, { maximumFractionDigits: 6 })\nconst show = (n: unknown) => (typeof n === 'number' && Number.isFinite(n) ? nf.format(n) : '')\nconst fromModel = () => {\n const v = props.modelValue\n if (range.value) return [show(Array.isArray(v) ? v[0] : undefined), show(Array.isArray(v) ? v[1] : undefined)]\n return [show(v), '']\n}\nconst [a0, b0] = fromModel()\nconst a = ref(a0 ?? '')\nconst b = ref(b0 ?? '')\nwatch(\n () => [props.modelValue, props.op],\n () => {\n const [x, y] = fromModel()\n if (parseNumber(locale, a.value) !== parseNumber(locale, x ?? '')) a.value = x ?? ''\n if (parseNumber(locale, b.value) !== parseNumber(locale, y ?? '')) b.value = y ?? ''\n },\n)\nconst first = ref<HTMLInputElement | null>(null)\nonMounted(() => first.value?.focus())\n\nconst commit = () => {\n const min = parseNumber(locale, a.value)\n if (range.value) {\n const max = parseNumber(locale, b.value)\n emit('update:modelValue', min === null && max === null ? undefined : [min, max])\n } else emit('update:modelValue', min ?? undefined)\n}\nlet timer: ReturnType<typeof setTimeout> | undefined\nconst onInput = () => {\n clearTimeout(timer)\n timer = setTimeout(commit, 250)\n}\nconst onEnter = () => {\n clearTimeout(timer)\n commit()\n emit('done')\n}\nonBeforeUnmount(() => clearTimeout(timer))\nconst suffix = props.column.type === 'percentage' ? '%' : ''\n</script>\n\n<template>\n <div class=\"dt-editor-number\">\n <ToggleGroupRoot\n v-if=\"currencies.length > 1\"\n class=\"dt-seg dt-seg-xs\"\n type=\"single\"\n :model-value=\"currency\"\n @update:model-value=\"(v) => v && emit('update:currency', String(v))\"\n >\n <ToggleGroupItem v-for=\"c in currencies\" :key=\"c\" class=\"dt-seg-item\" :value=\"c\">{{ c }}</ToggleGroupItem>\n </ToggleGroupRoot>\n <div class=\"dt-editor-fields\">\n <label class=\"dt-editor-field\">\n <span v-if=\"range\" class=\"dt-editor-label\">{{ i18n.t('number.min') }}</span>\n <span class=\"dt-input\" :class=\"{ 'has-suffix': suffix }\">\n <input\n ref=\"first\"\n v-model=\"a\"\n type=\"text\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n @input=\"onInput\"\n @keydown.enter.prevent=\"onEnter\"\n />\n <span v-if=\"suffix\" class=\"dt-input-end dt-input-suffix\">{{ suffix }}</span>\n </span>\n </label>\n <template v-if=\"range\">\n <span class=\"dt-editor-and\">{{ i18n.t('number.and') }}</span>\n <label class=\"dt-editor-field\">\n <span class=\"dt-editor-label\">{{ i18n.t('number.max') }}</span>\n <span class=\"dt-input\" :class=\"{ 'has-suffix': suffix }\">\n <input\n v-model=\"b\"\n type=\"text\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n @input=\"onInput\"\n @keydown.enter.prevent=\"onEnter\"\n />\n <span v-if=\"suffix\" class=\"dt-input-end dt-input-suffix\">{{ suffix }}</span>\n </span>\n </label>\n </template>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Seçenek editörü (04 §3, T2-02/03): select · multiselect · color · ajax · user. Her işaretleme anında uygulanır;\n// hover'da \"Only\"; `user`'da Me ve Unassigned en üstte; uzak kaynaklar yazdıkça arar ve 20'şer yükler (03).\nimport { PhMagnifyingGlass } from '@phosphor-icons/vue'\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport type { ColumnDef, OptionDef, RemoteOptions, UserOption } from '../../types/columns'\nimport type { FilterOp } from '../../types/query'\nimport { avatar, badge } from '../cells/renderCell'\nimport type { RemoteLabels } from '../cells/remoteLabels'\nimport { readPath } from '../columns/readPath'\nimport { useDataTableContext } from '../plugin'\n\nconst props = defineProps<{\n column: ColumnDef\n op: FilterOp\n modelValue: Array<string | number>\n /** color: yüklü satırlardaki mevcut değerler (uzaktan öneri yok, D3). */\n rows: object[]\n labels: RemoteLabels\n}>()\nconst emit = defineEmits<{ 'update:modelValue': [values: Array<string | number>]; unassigned: [] }>()\nconst { i18n } = useDataTableContext()\n\nconst def = computed(() => props.column)\nconst remote = computed<RemoteOptions | undefined>(() =>\n def.value.type === 'ajax' || def.value.type === 'user' ? (def.value as { remote?: RemoteOptions }).remote : undefined,\n)\nconst isUser = computed(() => def.value.type === 'user')\nconst q = ref('')\n\nconst distinctFromRows = (): OptionDef[] => {\n const seen = new Set<string | number>()\n for (const row of props.rows) {\n const raw = def.value.accessor ? def.value.accessor(row) : readPath(row, def.value.id as string)\n for (const v of Array.isArray(raw) ? raw : [raw])\n if (v !== null && v !== undefined && v !== '') seen.add(v as string | number)\n }\n return [...seen].sort((a, b) => String(a).localeCompare(String(b))).map((value) => ({ value, label: String(value) }))\n}\nconst staticOptions = computed<OptionDef[]>(() => {\n const d = def.value\n if (d.type === 'select' || d.type === 'multiselect') return d.options\n if (d.type === 'user' && d.options) return [...d.options].sort((a, b) => a.label.localeCompare(b.label))\n if (d.type === 'color' && d.palette) return d.palette.map((value) => ({ value, label: value }))\n if (d.type === 'color') return distinctFromRows()\n return []\n})\n\n// Uzak kaynak: 250 ms sonra arar; sayfa sayfa ekler.\nconst items = ref<OptionDef[]>([])\nconst hasMore = ref(false)\nconst loading = ref(false)\nlet page = 1\nlet ctl: AbortController | null = null\nlet timer: ReturnType<typeof setTimeout> | undefined\nconst load = async (append: boolean) => {\n const r = remote.value\n if (!r) return\n ctl?.abort()\n ctl = new AbortController()\n loading.value = true\n try {\n const res = await r.search(q.value, page, { signal: ctl.signal })\n items.value = append ? [...items.value, ...res.items] : res.items\n hasMore.value = res.hasMore\n props.labels.seed(def.value.id as string, res.items)\n } catch {\n /* abort veya ağ hatası: liste olduğu gibi kalır (D18) */\n } finally {\n loading.value = false\n }\n}\nif (remote.value) void load(false)\nwatch(q, () => {\n if (!remote.value) return\n clearTimeout(timer)\n timer = setTimeout(() => {\n page = 1\n void load(false)\n }, 250)\n})\nconst loadMore = () => {\n page += 1\n void load(true)\n}\nonBeforeUnmount(() => {\n clearTimeout(timer)\n ctl?.abort()\n})\n\nconst options = computed<OptionDef[]>(() => {\n if (remote.value) return items.value\n const needle = q.value.trim().toLocaleLowerCase()\n return needle ? staticOptions.value.filter((o) => o.label.toLocaleLowerCase().includes(needle)) : staticOptions.value\n})\nconst showSearch = computed(() => !!remote.value || staticOptions.value.length > 7)\nconst searchPlaceholder = computed(() =>\n def.value.filterNoun ? i18n.t('option.searchNoun', { noun: def.value.filterNoun }) : i18n.t('option.search'),\n)\n\nconst selected = computed(() => new Set(props.modelValue.map(String)))\nconst isOn = (v: string | number) => selected.value.has(String(v))\nconst toggle = (v: string | number) => {\n const next = isOn(v) ? props.modelValue.filter((x) => String(x) !== String(v)) : [...props.modelValue, v]\n emit('update:modelValue', next)\n}\nconst only = (v: string | number) => emit('update:modelValue', [v])\nconst unassigned = computed(() => props.op === 'is_empty')\n\n// Sabit bileşen: her render'da yeni bileşen üretmek rozeti DOM'da değiştirir ve tıkı yutabilir (bkz. sheet/editors/OptionCell).\nconst rich = computed(() => ['select', 'multiselect', 'user'].includes(def.value.type))\nconst Opt = (p: { o: OptionDef }) =>\n def.value.type === 'user' ? [avatar(p.o as UserOption), ' ', p.o.label] : badge(p.o.tone ?? 'gray', p.o.label)\n</script>\n\n<template>\n <div class=\"dt-options\">\n <label v-if=\"showSearch\" class=\"dt-input has-icon dt-options-search\">\n <span class=\"dt-input-icon\"><PhMagnifyingGlass :size=\"14\" aria-hidden=\"true\" /></span>\n <input v-model=\"q\" type=\"search\" :placeholder=\"searchPlaceholder\" :aria-label=\"searchPlaceholder\" autofocus />\n </label>\n <div class=\"dt-options-list\" role=\"group\">\n <template v-if=\"isUser && !q\">\n <label class=\"dt-option\" :class=\"{ 'is-on': isOn('@me') }\">\n <input type=\"checkbox\" class=\"dt-checkbox\" :checked=\"isOn('@me')\" @change=\"toggle('@me')\" />\n <span class=\"dt-option-body\">\n <span class=\"dt-avatar dt-tone-blue\" aria-hidden=\"true\">{{ i18n.t('common.me').slice(0, 2) }}</span>\n {{ i18n.t('common.me') }}\n </span>\n </label>\n <label class=\"dt-option is-unassigned\" :class=\"{ 'is-on': unassigned }\">\n <input type=\"checkbox\" class=\"dt-checkbox\" :checked=\"unassigned\" @change=\"emit('unassigned')\" />\n <span class=\"dt-option-body\">\n <span class=\"dt-avatar is-empty\" aria-hidden=\"true\" />\n {{ i18n.t('common.unassigned') }}\n </span>\n </label>\n <div class=\"dt-pop-sep\" />\n </template>\n <label v-for=\"o in options\" :key=\"String(o.value)\" class=\"dt-option\" :class=\"{ 'is-on': isOn(o.value) }\">\n <input type=\"checkbox\" class=\"dt-checkbox\" :checked=\"isOn(o.value)\" @change=\"toggle(o.value)\" />\n <span class=\"dt-option-body\">\n <Opt v-if=\"rich\" :o=\"o\" />\n <template v-else-if=\"def.type === 'color'\">\n <span class=\"dt-swatch\" :style=\"{ background: String(o.value) }\" aria-hidden=\"true\" />\n <span class=\"dt-mono\">{{ o.label }}</span>\n </template>\n <template v-else>{{ o.label }}</template>\n </span>\n <button type=\"button\" class=\"dt-btn dt-btn-xs dt-option-only\" tabindex=\"-1\" @click.prevent=\"only(o.value)\">\n {{ i18n.t('option.only') }}\n </button>\n </label>\n <div v-if=\"remote && !loading && options.length === 0\" class=\"dt-options-empty\">\n {{ i18n.t('remote.noResults') }}\n </div>\n <div v-else-if=\"!remote && options.length === 0\" class=\"dt-options-empty\">{{ i18n.t('picker.noMatch') }}</div>\n <div v-if=\"loading\" class=\"dt-options-empty\">{{ i18n.t('common.loading') }}</div>\n <button\n v-if=\"remote && hasMore && !loading\"\n type=\"button\"\n class=\"dt-btn dt-btn-ghost dt-btn-sm dt-options-more\"\n @click=\"loadMore\"\n >\n {{ i18n.t('remote.loadMore') }}\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Seçenek editörü (04 §3, T2-02/03): select · multiselect · color · ajax · user. Her işaretleme anında uygulanır;\n// hover'da \"Only\"; `user`'da Me ve Unassigned en üstte; uzak kaynaklar yazdıkça arar ve 20'şer yükler (03).\nimport { PhMagnifyingGlass } from '@phosphor-icons/vue'\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport type { ColumnDef, OptionDef, RemoteOptions, UserOption } from '../../types/columns'\nimport type { FilterOp } from '../../types/query'\nimport { avatar, badge } from '../cells/renderCell'\nimport type { RemoteLabels } from '../cells/remoteLabels'\nimport { readPath } from '../columns/readPath'\nimport { useDataTableContext } from '../plugin'\n\nconst props = defineProps<{\n column: ColumnDef\n op: FilterOp\n modelValue: Array<string | number>\n /** color: yüklü satırlardaki mevcut değerler (uzaktan öneri yok, D3). */\n rows: object[]\n labels: RemoteLabels\n}>()\nconst emit = defineEmits<{ 'update:modelValue': [values: Array<string | number>]; unassigned: [] }>()\nconst { i18n } = useDataTableContext()\n\nconst def = computed(() => props.column)\nconst remote = computed<RemoteOptions | undefined>(() =>\n def.value.type === 'ajax' || def.value.type === 'user' ? (def.value as { remote?: RemoteOptions }).remote : undefined,\n)\nconst isUser = computed(() => def.value.type === 'user')\nconst q = ref('')\n\nconst distinctFromRows = (): OptionDef[] => {\n const seen = new Set<string | number>()\n for (const row of props.rows) {\n const raw = def.value.accessor ? def.value.accessor(row) : readPath(row, def.value.id as string)\n for (const v of Array.isArray(raw) ? raw : [raw])\n if (v !== null && v !== undefined && v !== '') seen.add(v as string | number)\n }\n return [...seen].sort((a, b) => String(a).localeCompare(String(b))).map((value) => ({ value, label: String(value) }))\n}\nconst staticOptions = computed<OptionDef[]>(() => {\n const d = def.value\n if (d.type === 'select' || d.type === 'multiselect') return d.options\n if (d.type === 'user' && d.options) return [...d.options].sort((a, b) => a.label.localeCompare(b.label))\n if (d.type === 'color' && d.palette) return d.palette.map((value) => ({ value, label: value }))\n if (d.type === 'color') return distinctFromRows()\n return []\n})\n\n// Uzak kaynak: 250 ms sonra arar; sayfa sayfa ekler.\nconst items = ref<OptionDef[]>([])\nconst hasMore = ref(false)\nconst loading = ref(false)\nlet page = 1\nlet ctl: AbortController | null = null\nlet timer: ReturnType<typeof setTimeout> | undefined\nconst load = async (append: boolean) => {\n const r = remote.value\n if (!r) return\n ctl?.abort()\n ctl = new AbortController()\n loading.value = true\n try {\n const res = await r.search(q.value, page, { signal: ctl.signal })\n items.value = append ? [...items.value, ...res.items] : res.items\n hasMore.value = res.hasMore\n props.labels.seed(def.value.id as string, res.items)\n } catch {\n /* abort veya ağ hatası: liste olduğu gibi kalır (D18) */\n } finally {\n loading.value = false\n }\n}\nif (remote.value) void load(false)\nwatch(q, () => {\n if (!remote.value) return\n clearTimeout(timer)\n timer = setTimeout(() => {\n page = 1\n void load(false)\n }, 250)\n})\nconst loadMore = () => {\n page += 1\n void load(true)\n}\nonBeforeUnmount(() => {\n clearTimeout(timer)\n ctl?.abort()\n})\n\nconst options = computed<OptionDef[]>(() => {\n if (remote.value) return items.value\n const needle = q.value.trim().toLocaleLowerCase()\n return needle ? staticOptions.value.filter((o) => o.label.toLocaleLowerCase().includes(needle)) : staticOptions.value\n})\nconst showSearch = computed(() => !!remote.value || staticOptions.value.length > 7)\nconst searchPlaceholder = computed(() =>\n def.value.filterNoun ? i18n.t('option.searchNoun', { noun: def.value.filterNoun }) : i18n.t('option.search'),\n)\n\nconst selected = computed(() => new Set(props.modelValue.map(String)))\nconst isOn = (v: string | number) => selected.value.has(String(v))\nconst toggle = (v: string | number) => {\n const next = isOn(v) ? props.modelValue.filter((x) => String(x) !== String(v)) : [...props.modelValue, v]\n emit('update:modelValue', next)\n}\nconst only = (v: string | number) => emit('update:modelValue', [v])\nconst unassigned = computed(() => props.op === 'is_empty')\n\n// Sabit bileşen: her render'da yeni bileşen üretmek rozeti DOM'da değiştirir ve tıkı yutabilir (bkz. sheet/editors/OptionCell).\nconst rich = computed(() => ['select', 'multiselect', 'user'].includes(def.value.type))\nconst Opt = (p: { o: OptionDef }) =>\n def.value.type === 'user' ? [avatar(p.o as UserOption), ' ', p.o.label] : badge(p.o.tone ?? 'gray', p.o.label)\n</script>\n\n<template>\n <div class=\"dt-options\">\n <label v-if=\"showSearch\" class=\"dt-input has-icon dt-options-search\">\n <span class=\"dt-input-icon\"><PhMagnifyingGlass :size=\"14\" aria-hidden=\"true\" /></span>\n <input v-model=\"q\" type=\"search\" :placeholder=\"searchPlaceholder\" :aria-label=\"searchPlaceholder\" autofocus />\n </label>\n <div class=\"dt-options-list\" role=\"group\">\n <template v-if=\"isUser && !q\">\n <label class=\"dt-option\" :class=\"{ 'is-on': isOn('@me') }\">\n <input type=\"checkbox\" class=\"dt-checkbox\" :checked=\"isOn('@me')\" @change=\"toggle('@me')\" />\n <span class=\"dt-option-body\">\n <span class=\"dt-avatar dt-tone-blue\" aria-hidden=\"true\">{{ i18n.t('common.me').slice(0, 2) }}</span>\n {{ i18n.t('common.me') }}\n </span>\n </label>\n <label class=\"dt-option is-unassigned\" :class=\"{ 'is-on': unassigned }\">\n <input type=\"checkbox\" class=\"dt-checkbox\" :checked=\"unassigned\" @change=\"emit('unassigned')\" />\n <span class=\"dt-option-body\">\n <span class=\"dt-avatar is-empty\" aria-hidden=\"true\" />\n {{ i18n.t('common.unassigned') }}\n </span>\n </label>\n <div class=\"dt-pop-sep\" />\n </template>\n <label v-for=\"o in options\" :key=\"String(o.value)\" class=\"dt-option\" :class=\"{ 'is-on': isOn(o.value) }\">\n <input type=\"checkbox\" class=\"dt-checkbox\" :checked=\"isOn(o.value)\" @change=\"toggle(o.value)\" />\n <span class=\"dt-option-body\">\n <Opt v-if=\"rich\" :o=\"o\" />\n <template v-else-if=\"def.type === 'color'\">\n <span class=\"dt-swatch\" :style=\"{ background: String(o.value) }\" aria-hidden=\"true\" />\n <span class=\"dt-mono\">{{ o.label }}</span>\n </template>\n <template v-else>{{ o.label }}</template>\n </span>\n <button type=\"button\" class=\"dt-btn dt-btn-xs dt-option-only\" tabindex=\"-1\" @click.prevent=\"only(o.value)\">\n {{ i18n.t('option.only') }}\n </button>\n </label>\n <div v-if=\"remote && !loading && options.length === 0\" class=\"dt-options-empty\">\n {{ i18n.t('remote.noResults') }}\n </div>\n <div v-else-if=\"!remote && options.length === 0\" class=\"dt-options-empty\">{{ i18n.t('picker.noMatch') }}</div>\n <div v-if=\"loading\" class=\"dt-options-empty\">{{ i18n.t('common.loading') }}</div>\n <button\n v-if=\"remote && hasMore && !loading\"\n type=\"button\"\n class=\"dt-btn dt-btn-ghost dt-btn-sm dt-options-more\"\n @click=\"loadMore\"\n >\n {{ i18n.t('remote.loadMore') }}\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Puan editörü (03): 1–max yıldız; tıklanınca uygulanır ve popover kapanır.\nimport { PhStar } from '@phosphor-icons/vue'\nimport type { ColumnDef } from '../../types/columns'\n\nconst props = defineProps<{ column: ColumnDef; modelValue: unknown }>()\nconst emit = defineEmits<{ 'update:modelValue': [value: number]; done: [] }>()\nconst max = (props.column as { max?: number }).max ?? 5\nconst pick = (n: number) => {\n emit('update:modelValue', n)\n emit('done')\n}\n</script>\n\n<template>\n <div class=\"dt-editor-stars\" role=\"radiogroup\">\n <button\n v-for=\"n in max\"\n :key=\"n\"\n type=\"button\"\n class=\"dt-star-btn\"\n role=\"radio\"\n :aria-checked=\"modelValue === n\"\n :aria-label=\"String(n)\"\n :class=\"{ 'is-on': typeof modelValue === 'number' && n <= modelValue }\"\n @click=\"pick(n)\"\n >\n <PhStar\n :size=\"18\"\n :weight=\"typeof modelValue === 'number' && n <= modelValue ? 'fill' : 'regular'\"\n aria-hidden=\"true\"\n />\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Puan editörü (03): 1–max yıldız; tıklanınca uygulanır ve popover kapanır.\nimport { PhStar } from '@phosphor-icons/vue'\nimport type { ColumnDef } from '../../types/columns'\n\nconst props = defineProps<{ column: ColumnDef; modelValue: unknown }>()\nconst emit = defineEmits<{ 'update:modelValue': [value: number]; done: [] }>()\nconst max = (props.column as { max?: number }).max ?? 5\nconst pick = (n: number) => {\n emit('update:modelValue', n)\n emit('done')\n}\n</script>\n\n<template>\n <div class=\"dt-editor-stars\" role=\"radiogroup\">\n <button\n v-for=\"n in max\"\n :key=\"n\"\n type=\"button\"\n class=\"dt-star-btn\"\n role=\"radio\"\n :aria-checked=\"modelValue === n\"\n :aria-label=\"String(n)\"\n :class=\"{ 'is-on': typeof modelValue === 'number' && n <= modelValue }\"\n @click=\"pick(n)\"\n >\n <PhStar\n :size=\"18\"\n :weight=\"typeof modelValue === 'number' && n <= modelValue ? 'fill' : 'regular'\"\n aria-hidden=\"true\"\n />\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// Metin editörü (04 §3): 250 ms sonra ve Enter'da uygular; Enter popover'ı kapatır. `id` sütununda `in`/`not_in` için\n// yapıştırılan liste (satır sonu / virgül / noktalı virgül) değer dizisine ayrılır (03); uppercase/lowercase çevirir.\nimport { onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport type { FilterOp } from '../../types/query'\n\nconst props = defineProps<{ column: ColumnDef; op: FilterOp; modelValue: unknown }>()\nconst emit = defineEmits<{ 'update:modelValue': [value: string | Array<string | number>]; done: [] }>()\n\nconst asText = (v: unknown) => (Array.isArray(v) ? v.join(', ') : typeof v === 'string' ? v : '')\nconst draft = ref(asText(props.modelValue))\nwatch(\n () => props.modelValue,\n (v) => {\n if (asText(v) !== draft.value) draft.value = asText(v)\n },\n)\nconst input = ref<HTMLInputElement | null>(null)\nonMounted(() => input.value?.focus())\n\nconst isList = () => props.op === 'in' || props.op === 'not_in'\nconst normalize = (s: string) =>\n props.column.type === 'uppercase'\n ? s.toLocaleUpperCase()\n : props.column.type === 'lowercase'\n ? s.toLocaleLowerCase()\n : s\nconst commit = () => {\n const s = normalize(draft.value).trim()\n if (isList()) {\n const parts = s\n .split(/[\\n,;]+/)\n .map((p) => p.trim())\n .filter(Boolean)\n emit('update:modelValue', parts)\n } else emit('update:modelValue', s)\n}\nlet timer: ReturnType<typeof setTimeout> | undefined\nconst onInput = (e: Event) => {\n draft.value = normalize((e.target as HTMLInputElement).value)\n clearTimeout(timer)\n timer = setTimeout(commit, 250)\n}\nconst onEnter = () => {\n clearTimeout(timer)\n commit()\n emit('done')\n}\nonBeforeUnmount(() => clearTimeout(timer))\n</script>\n\n<template>\n <label class=\"dt-input dt-editor-text\">\n <input\n ref=\"input\"\n :value=\"draft\"\n type=\"text\"\n autocomplete=\"off\"\n @input=\"onInput\"\n @keydown.enter.prevent=\"onEnter\"\n />\n </label>\n</template>\n","<script setup lang=\"ts\">\n// Metin editörü (04 §3): 250 ms sonra ve Enter'da uygular; Enter popover'ı kapatır. `id` sütununda `in`/`not_in` için\n// yapıştırılan liste (satır sonu / virgül / noktalı virgül) değer dizisine ayrılır (03); uppercase/lowercase çevirir.\nimport { onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport type { ColumnDef } from '../../types/columns'\nimport type { FilterOp } from '../../types/query'\n\nconst props = defineProps<{ column: ColumnDef; op: FilterOp; modelValue: unknown }>()\nconst emit = defineEmits<{ 'update:modelValue': [value: string | Array<string | number>]; done: [] }>()\n\nconst asText = (v: unknown) => (Array.isArray(v) ? v.join(', ') : typeof v === 'string' ? v : '')\nconst draft = ref(asText(props.modelValue))\nwatch(\n () => props.modelValue,\n (v) => {\n if (asText(v) !== draft.value) draft.value = asText(v)\n },\n)\nconst input = ref<HTMLInputElement | null>(null)\nonMounted(() => input.value?.focus())\n\nconst isList = () => props.op === 'in' || props.op === 'not_in'\nconst normalize = (s: string) =>\n props.column.type === 'uppercase'\n ? s.toLocaleUpperCase()\n : props.column.type === 'lowercase'\n ? s.toLocaleLowerCase()\n : s\nconst commit = () => {\n const s = normalize(draft.value).trim()\n if (isList()) {\n const parts = s\n .split(/[\\n,;]+/)\n .map((p) => p.trim())\n .filter(Boolean)\n emit('update:modelValue', parts)\n } else emit('update:modelValue', s)\n}\nlet timer: ReturnType<typeof setTimeout> | undefined\nconst onInput = (e: Event) => {\n draft.value = normalize((e.target as HTMLInputElement).value)\n clearTimeout(timer)\n timer = setTimeout(commit, 250)\n}\nconst onEnter = () => {\n clearTimeout(timer)\n commit()\n emit('done')\n}\nonBeforeUnmount(() => clearTimeout(timer))\n</script>\n\n<template>\n <label class=\"dt-input dt-editor-text\">\n <input\n ref=\"input\"\n :value=\"draft\"\n type=\"text\"\n autocomplete=\"off\"\n @input=\"onInput\"\n @keydown.enter.prevent=\"onEnter\"\n />\n </label>\n</template>\n"],"mappings":"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"}