@medyat/vue-data-table 1.0.0 → 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.
@@ -1 +1 @@
1
- {"version":3,"file":"TextEditor-DPqiiRau.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","badge","parseNumber","readPath","avatar","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","useDataTableContext","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":";;;;;;AAyBA,IAAamE,IAA4C;CACvD,KAAKC;CACL,OAAOA;CACP,YAAYC;CACZ,MAAMC;CACN,UAAUC;CACV,QAAQC;CACR,MAAMC;CACN,WAAWD;CACX,WAAWA;CACX,OAAOE;CACP,OAAOC;CACP,OAAOC;CACP,KAAKC;CACL,IAAIT;CACJ,SAASU;CACT,QAAQC;CACR,aAAaC;CACb,MAAMC;CACN,MAAMC;CACN,MAAMC;CACN,UAAUC;CACV,QAAQC;CACR,OAAOC;AACT,G;;;;;;;;;;;;;;;;;;;;;;;;ECvCA,IAAMe,IAAQC,GAQRC,IAAOH,GAKP,EAAE,SAAM,cAAWI,EAAoB,GACvCC,IAAQC,QAAeL,EAAM,OAAO,SAAS,GAC7CM,IAAK,IAAI,KAAK,aAAaC,GAAQ,EAAE,uBAAuB,EAAE,CAAC,GAC/DC,KAAQ,MAAgB,OAAOC,KAAM,YAAY,OAAO,SAASA,CAAC,IAAIH,EAAG,OAAOG,CAAC,IAAI,IACrFC,UAAkB;GACtB,IAAMC,IAAIX,EAAM;GAEhB,OADII,EAAM,QAAc,CAACI,EAAK,MAAM,QAAQG,CAAC,IAAIA,EAAE,KAAK,KAAA,CAAS,GAAGH,EAAK,MAAM,QAAQG,CAAC,IAAIA,EAAE,KAAK,KAAA,CAAS,CAAC,IACtG,CAACH,EAAKG,CAAC,GAAG,EAAE;EACrB,GACM,CAACC,GAAIC,KAAMH,EAAU,GACrBI,IAAIC,EAAIH,KAAM,EAAE,GAChBI,IAAID,EAAIF,KAAM,EAAE;EACtB,QACQ,CAACb,EAAM,YAAYA,EAAM,EAAE,SAC3B;GACJ,IAAM,CAACiB,GAAGC,KAAKR,EAAU;GAEzB,AADI/C,EAAY4C,GAAQO,EAAE,KAAK,MAAMnD,EAAY4C,GAAQU,KAAK,EAAE,MAAG,EAAE,QAAQA,KAAK,KAC9EtD,EAAY4C,GAAQS,EAAE,KAAK,MAAMrD,EAAY4C,GAAQW,KAAK,EAAE,MAAG,EAAE,QAAQA,KAAK;EACpF,CACF;EACA,IAAMC,IAAQJ,EAA6B,IAAI;EAC/C,QAAgBI,EAAM,OAAO,MAAM,CAAC;EAEpC,IAAMC,UAAe;GACnB,IAAMC,IAAM1D,EAAY4C,GAAQO,EAAE,KAAK;GACvC,IAAIV,EAAM,OAAO;IACf,IAAMkB,IAAM3D,EAAY4C,GAAQS,EAAE,KAAK;IACvC,EAAK,qBAAqBK,MAAQ,QAAQC,MAAQ,OAAO,KAAA,IAAY,CAACD,GAAKC,CAAG,CAAC;GACjF,OAAO,EAAK,qBAAqBD,KAAO,KAAA,CAAS;EACnD,GACIE,GACEC,UAAgB;GAEpB,AADA,aAAaD,CAAK,GAClB,IAAQ,WAAWH,GAAQ,GAAG;EAChC,GACMK,UAAgB;GAGpB,AAFA,aAAaF,CAAK,GAClBH,EAAO,GACPlB,EAAK,MAAM;EACb;EACA,QAAsB,aAAaqB,CAAK,CAAC;EACzC,IAAMG,IAAS1B,EAAM,OAAO,SAAS,eAAe,MAAM;E,kBAIxD1F,EAAA,GAAAC,EA4CM,OA5CNZ,GA4CM,CA1CIsG,EAAA,WAAW,SAAM,KADzB3F,EAAA,GAAAE,EAQkBC,EAAAsH,CAAA,GAAA;;GANhB,OAAM;GACN,MAAK;GACJ,eAAa9B,EAAA;GACb,uBAAkB,AAAA+B,EAAA,QAAG,MAAMrB,KAAKT,EAAI,mBAAoB,OAAOS,CAAC,CAAA;;GAEhD,SAAAjG,QAAuB,EAAxCJ,EAAA,EAAA,GAAAC,EAA0GI,GAAA,MAAAC,EAA7EqF,EAAA,aAAL,OAAxB3F,EAAA,GAAAE,EAA0GC,EAAA2H,CAAA,GAAA;IAAhE,KAAKC;IAAG,OAAM;IAAe,OAAOA;;IAAG,SAAA3H,QAAO,CAAJG,EAAAC,EAAAuH,CAAC,GAAA,CAAA,C;;;;E,qCAEvFrH,EAiCM,OAjCNpB,GAiCM,CAhCJoB,EAcQ,SAdRnB,IAcQ,CAbMuG,EAAA,SAAZ9F,EAAA,GAAAC,EAA4E,QAA5ET,IAA4EgB,EAA9BL,EAAAiI,CAAA,CAAI,CAAC,EAAC,YAAA,CAAA,GAAA,CAAA,K,WACpD1H,EAWO,QAAA,EAXD,OAAKC,EAAA,CAAC,YAAU,EAAA,cAAyBR,EAAAiH,CAAA,EAAM,CAAA,CAAA,E,IACnDxG,EAAAF,EAQE,SAAA;GAPI,SAAA;GAAJ,KAAImG;GACK,uBAAA,AAAAa,EAAA,QAAA,MAAA,EAAC,QAAAa;GACV,MAAK;GACL,WAAU;GACV,cAAa;GACL;GACP,WAAO1H,EAAAC,EAAgBqG,GAAO,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;E,mBALtB,CAAApG,GAAAyF,EAAA,KAAC,C,IAOArG,EAAAiH,CAAA,KAAZpH,EAAA,GAAAC,EAA4E,QAA5EP,IAA4Ec,EAAhBL,EAAAiH,CAAA,CAAM,GAAA,CAAA,K,kBAGtDtB,EAAA,SAAhB9F,EAAA,GAAAC,EAgBWI,GAAA,EAAA,KAAA,EAAA,GAAA,CAfTK,EAA6D,QAA7Df,IAA6Da,EAA9BL,EAAAiI,CAAA,CAAI,CAAC,EAAC,YAAA,CAAA,GAAA,CAAA,GACrC1H,EAaQ,SAbRd,IAaQ,CAZNc,EAA+D,QAA/Db,IAA+DW,EAA9BL,EAAAiI,CAAA,CAAI,CAAC,EAAC,YAAA,CAAA,GAAA,CAAA,GACvC1H,EAUO,QAAA,EAVD,OAAKC,EAAA,CAAC,YAAU,EAAA,cAAyBR,EAAAiH,CAAA,EAAM,CAAA,CAAA,E,IACnDxG,EAAAF,EAOE,SAAA;GANS,uBAAA,AAAAgH,EAAA,QAAA,MAAA,EAAC,QAAAa;GACV,MAAK;GACL,WAAU;GACV,cAAa;GACL;GACP,WAAO1H,EAAAC,EAAgBqG,GAAO,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;E,mBALtB,CAAApG,GAAA2F,EAAA,KAAC,C,IAOAvG,EAAAiH,CAAA,KAAZpH,EAAA,GAAAC,EAA4E,QAA5EF,IAA4ES,EAAhBL,EAAAiH,CAAA,CAAM,GAAA,CAAA,K;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EE/F9E,IAAM1B,IAAQC,GAQRC,IAAOH,GACP,EAAE,YAASI,EAAoB,GAE/BgE,IAAM9D,QAAeL,EAAM,MAAM,GACjCoE,IAAS/D,QACb8D,EAAI,MAAM,SAAS,UAAUA,EAAI,MAAM,SAAS,SAAUA,EAAI,MAAqC,SAAS,KAAA,CAC9G,GACME,IAAShE,QAAe8D,EAAI,MAAM,SAAS,MAAM,GACjDG,IAAIvD,EAAI,EAAE,GAEVwD,UAAsC;GAC1C,IAAMC,oBAAO,IAAI,IAAqB;GACtC,KAAK,IAAMC,KAAOzE,EAAM,MAAM;IAC5B,IAAM0E,IAAMP,EAAI,MAAM,WAAWA,EAAI,MAAM,SAASM,CAAG,IAAI7G,EAAS6G,GAAKN,EAAI,MAAM,EAAY;IAC/F,KAAK,IAAMxD,KAAK,MAAM,QAAQ+D,CAAG,IAAIA,IAAM,CAACA,CAAG,GAC7C,AAAI/D,KAAM,QAA2BA,MAAM,MAAI6D,EAAK,IAAI7D,CAAoB;GAChF;GACA,OAAO,CAAC,GAAG6D,CAAI,CAAC,CAAC,MAAM,GAAG,MAAM,OAAO1D,CAAC,CAAC,CAAC,cAAc,OAAOE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAW;IAAE;IAAO,OAAO,OAAO2D,CAAK;GAAE,EAAE;EACtH,GACMC,IAAgBvE,QAA4B;GAChD,IAAMwE,IAAIV,EAAI;GAKd,OAJIU,EAAE,SAAS,YAAYA,EAAE,SAAS,gBAAsBA,EAAE,UAC1DA,EAAE,SAAS,UAAUA,EAAE,UAAgB,CAAC,GAAGA,EAAE,OAAO,CAAC,CAAC,MAAM,GAAG,MAAM/D,EAAE,MAAM,cAAcE,EAAE,KAAK,CAAC,IACnG6D,EAAE,SAAS,WAAWA,EAAE,UAAgBA,EAAE,QAAQ,KAAK,OAAW;IAAE;IAAO,OAAOF;GAAM,EAAE,IAC1FE,EAAE,SAAS,UAAgBN,EAAiB,IACzC,CAAC;EACV,CAAC,GAGKO,IAAQ/D,EAAiB,CAAC,CAAC,GAC3BgE,IAAUhE,EAAI,EAAK,GACnBiE,IAAUjE,EAAI,EAAK,GACrBkE,IAAO,GACPC,IAA8B,MAC9B3D,GACE4D,IAAO,OAAO,MAAoB;GACtC,IAAMC,IAAIhB,EAAO;GACjB,IAAKgB,GACL;IAEA,AAFAF,GAAK,MAAM,GACX,IAAM,IAAI,gBAAgB,GAC1B,EAAQ,QAAQ;IAChB,IAAI;KACF,IAAMG,IAAM,MAAMD,EAAE,OAAOd,EAAE,OAAOW,GAAM,EAAE,QAAQC,EAAI,OAAO,CAAC;KAGhE,AAFA,EAAM,QAAQI,IAAS,CAAC,GAAGR,EAAM,OAAO,GAAGO,EAAI,KAAK,IAAIA,EAAI,OAC5D,EAAQ,QAAQA,EAAI,SACpBrF,EAAM,OAAO,KAAKmE,EAAI,MAAM,IAAckB,EAAI,KAAK;IACrD,QAAQ,CAER,UAAU;KACR,EAAQ,QAAQ;IAClB;GAZW;EAab;EAEA,AADIjB,EAAO,SAAOe,EAAU,EAAK,GACjCI,EAAMjB,SAAS;GACb,AAAKF,EAAO,UACZ,aAAa7C,CAAK,GAClB,IAAQ,iBAAiB;IAEvB,AADA,IAAO,GACP4D,EAAU,EAAK;GACjB,GAAG,GAAG;EACR,CAAC;EACD,IAAMK,UAAiB;GAErB,AADA,KAAQ,GACRL,EAAU,EAAI;EAChB;EACA,QAAsB;GAEpB,AADA,aAAa5D,CAAK,GAClB2D,GAAK,MAAM;EACb,CAAC;EAED,IAAMO,IAAUpF,QAA4B;GAC1C,IAAI+D,EAAO,OAAO,OAAOU,EAAM;GAC/B,IAAMY,IAASpB,EAAE,MAAM,KAAK,CAAC,CAAC,kBAAkB;GAChD,OAAOoB,IAASd,EAAc,MAAM,QAAQ,MAAMe,EAAE,MAAM,kBAAkB,CAAC,CAAC,SAASD,CAAM,CAAC,IAAId,EAAc;EAClH,CAAC,GACKgB,IAAavF,QAAe,CAAC,CAAC+D,EAAO,SAASQ,EAAc,MAAM,SAAS,CAAC,GAC5EiB,IAAoBxF,QACxB8D,EAAI,MAAM,aAAazB,EAAK,EAAE,qBAAqB,EAAE,MAAMyB,EAAI,MAAM,WAAW,CAAC,IAAIzB,EAAK,EAAE,eAAe,CAC7G,GAEMoD,IAAWzF,QAAe,IAAI,IAAIL,EAAM,WAAW,IAAI,MAAM,CAAC,CAAC,GAC/D+F,KAAQ,MAAuBD,EAAS,MAAM,IAAI,OAAOnF,CAAC,CAAC,GAC3DqF,KAAU,MAAuB;GACrC,IAAMC,IAAOF,EAAKpF,CAAC,IAAIX,EAAM,WAAW,QAAQ,MAAM,OAAOiB,CAAC,MAAM,OAAON,CAAC,CAAC,IAAI,CAAC,GAAGX,EAAM,YAAYW,CAAC;GACxG,EAAK,qBAAqBsF,CAAI;EAChC,GACMC,KAAQ,MAAuBhG,EAAK,qBAAqB,CAACS,CAAC,CAAC,GAC5DwF,IAAa9F,QAAeL,EAAM,OAAO,UAAU,GAGnDoG,IAAO/F,QAAe;GAAC;GAAU;GAAe;EAAM,CAAC,CAAC,SAAS8D,EAAI,MAAM,IAAI,CAAC,GAChFkC,KAAO,MACXlC,EAAI,MAAM,SAAS,SAAS;GAACtG,EAAOyI,EAAE,CAAe;GAAG;GAAKA,EAAE,EAAE;EAAK,IAAI5I,EAAM4I,EAAE,EAAE,QAAQ,QAAQA,EAAE,EAAE,KAAK;E,kBAI7G7K,EAAA,GAAAC,EAmDM,OAnDNH,IAmDM,CAlDSqK,EAAA,SAAbnK,EAAA,GAAAC,EAGQ,SAHRF,IAGQ,CAFNG,EAAsF,QAAtFwH,IAAsF,CAA1DvH,EAAmDC,EAAA2K,CAAA,GAAA;GAA/B,MAAM;GAAI,eAAY;E,MACtE1K,EAAAH,EAA8G,SAAA;GAA9F,uBAAA,AAAAqG,EAAA,QAAA,MAAA,EAAC,QAAAa;GAAE,MAAK;GAAU,aAAagD,EAAA;GAAoB,cAAYA,EAAA;GAAmB,WAAA;E,kBAAlF,CAAA9J,GAAAuI,EAAA,KAAC,C,mBAEnB3I,EA6CM,OA7CN0H,IA6CM;GA5CYgB,EAAA,SAAM,CAAKC,EAAA,SAA3B7I,EAAA,GAAAC,EAgBWO,GAAA,EAAA,KAAA,EAAA,GAAA;IAfTN,EAMQ,SAAA,EAND,OAAKO,EAAA,CAAC,aAAW,EAAA,SAAoB6J,EAAI,KAAA,EAAA,CAAA,CAAA,E,IAC9CpK,EAA4F,SAAA;KAArF,MAAK;KAAW,OAAM;KAAe,SAASoK,EAAI,KAAA;KAAU,UAAM,AAAA/D,EAAA,QAAA,MAAEgE,EAAM,KAAA;I,kBACjFrK,EAGO,QAHP4H,IAGO,CAFL5H,EAAoG,QAApG6H,IAAoGrH,EAAzCN,EAAA6G,CAAA,CAAI,CAAC,EAAC,WAAA,CAAA,CAAc,MAAK,GAAA,CAAA,CAAA,GAAA,CAAA,GAAgBtG,EAAA,MACpGD,EAAGN,EAAA6G,CAAA,CAAI,CAAC,EAAC,WAAA,CAAA,GAAA,CAAA,C;IAGb/G,EAMQ,SAAA,EAND,OAAKO,EAAA,CAAC,2BAAyB,EAAA,SAAoBiK,EAAA,MAAU,CAAA,CAAA,E,IAClExK,EAAgG,SAAA;KAAzF,MAAK;KAAW,OAAM;KAAe,SAASwK,EAAA;KAAa,UAAM,AAAAnE,EAAA,QAAA,MAAE9B,EAAI,YAAA;I,kBAC9EvE,EAGO,QAHP+H,IAGO,CAFL,AAAA1B,EAAA,OAAArG,EAAsD,QAAA;KAAhD,OAAM;KAAqB,eAAY;I,cAASS,EAAA,MACtDD,EAAGN,EAAA6G,CAAA,CAAI,CAAC,EAAC,mBAAA,CAAA,GAAA,CAAA,C;IAGb,AAAAV,EAAA,OAAArG,EAA0B,OAAA,EAArB,OAAM,aAAY,GAAA,MAAA,EAAA;;IAEzBF,EAAA,EAAA,GAAAC,EAaQO,GAAA,MAAAI,EAbWoJ,EAAA,QAAL,OAAdhK,EAAA,GAAAC,EAaQ,SAAA;IAbqB,KAAK,OAAOiK,EAAE,KAAK;IAAG,OAAKzJ,EAAA,CAAC,aAAW,EAAA,SAAoB6J,EAAKJ,EAAE,KAAK,EAAA,CAAA,CAAA;;IAClGhK,EAAgG,SAAA;KAAzF,MAAK;KAAW,OAAM;KAAe,SAASoK,EAAKJ,EAAE,KAAK;KAAI,WAAM,MAAEK,EAAOL,EAAE,KAAK;;IAC3FhK,EAOO,QAPPiI,IAOO,CANMwC,EAAA,SAAX3K,EAAA,GAAAa,EAA0B+J,GAAA;;KAAL;I,sBACAlC,EAAA,MAAI,SAAI,WAA7B1I,EAAA,GAAAC,EAGWO,GAAA,EAAA,KAAA,EAAA,GAAA,CAFTN,EAAsF,QAAA;KAAhF,OAAM;KAAa,OAAKY,EAAA,EAAA,YAAgB,OAAOoJ,EAAE,KAAK,EAAA,CAAA;KAAK,eAAY;I,aAC7EhK,EAA0C,QAA1CkI,IAA0C1H,EAAjBwJ,EAAE,KAAK,GAAA,CAAA,C,WAElClK,EAAA,GAAAC,EAAyCO,GAAA,EAAA,KAAA,EAAA,GAAA,CAArBG,EAAAD,EAAAwJ,EAAE,KAAK,GAAA,CAAA,C;IAE7BhK,EAES,UAAA;KAFD,MAAK;KAAS,OAAM;KAAkC,UAAS;KAAM,SAAKa,GAAA,MAAU0J,EAAKP,EAAE,KAAK,GAAA,CAAA,SAAA,CAAA;IACnG,GAAAxJ,EAAAN,EAAA6G,CAAA,CAAI,CAAC,EAAC,aAAA,CAAA,GAAA,GAAAoB,EAAA;;GAGFM,EAAA,SAAM,CAAKY,EAAA,SAAWS,EAAA,MAAQ,WAAM,KAA/ChK,EAAA,GAAAC,EAEM,OAFNqI,IAEM5H,EADDN,EAAA6G,CAAA,CAAI,CAAC,EAAC,kBAAA,CAAA,GAAA,CAAA,KAEM,CAAA0B,EAAA,SAAUqB,EAAA,MAAQ,WAAM,KAAzChK,EAAA,GAAAC,EAA8G,OAA9GsI,IAA8G7H,EAAjCN,EAAA6G,CAAA,CAAI,CAAC,EAAC,gBAAA,CAAA,GAAA,CAAA,K;GACxEsC,EAAA,SAAXvJ,EAAA,GAAAC,EAAiF,OAAjFuI,IAAiF9H,EAAjCN,EAAA6G,CAAA,CAAI,CAAC,EAAC,gBAAA,CAAA,GAAA,CAAA,K;GAE9C0B,EAAA,SAAUW,EAAA,SAAO,CAAKC,EAAA,SAD9BvJ,EAAA,GAAAC,EAOS,UAAA;;IALP,MAAK;IACL,OAAM;IACL,SAAO8J;GAEL,GAAArJ,EAAAN,EAAA6G,CAAA,CAAI,CAAC,EAAC,iBAAA,CAAA,GAAA,CAAA,K;;;;;;;;;;;;;;;;;;EE/JjB,IAAM1C,IAAQC,GACRC,IAAOH,GACPuB,IAAOtB,EAAM,OAA4B,OAAO,GAChD6G,KAAQ,MAAc;GAE1B,AADA3G,EAAK,qBAAqBO,CAAC,GAC3BP,EAAK,MAAM;EACb;E,kBAIEtD,EAAA,GAAAC,EAkBM,OAlBNH,IAkBM,EAjBJE,EAAA,EAAA,GAAAC,EAgBSC,GAAA,MAAAC,EAfKC,EAAAsE,CAAA,IAAL,OADT1E,EAAA,GAAAC,EAgBS,UAAA;GAdN,KAAK4D;GACN,MAAK;GACL,OAAKxD,EAAA,CAAC,eAAa,EAAA,SAAA,OAIOgD,EAAA,cAAU,YAAiBQ,KAAKR,EAAA,WAAU,CAAA,CAAA;GAHpE,MAAK;GACJ,gBAAcA,EAAA,eAAeQ;GAC7B,cAAY,OAAOA,CAAC;GAEpB,UAAK,MAAEoG,EAAKpG,CAAC;E,IAEdvD,EAIEF,EAAAiB,CAAA,GAAA;GAHC,MAAM;GACN,QAAM,OAASgC,EAAA,cAAU,YAAiBQ,KAAKR,EAAA,aAAU,SAAA;GAC1D,eAAY;;;;;;;;;;;;EEvBpB,IAAMD,IAAQC,GACRC,IAAOH,GAEPkH,KAAU,MAAgB,MAAM,QAAQtG,CAAC,IAAIA,EAAE,KAAK,IAAI,IAAI,OAAOA,KAAM,WAAWA,IAAI,IACxFuG,IAAQnG,EAAIkG,EAAOjH,EAAM,UAAU,CAAC;EAC1C,QACQA,EAAM,aACX,MAAM;GACL,AAAIiH,EAAOtG,CAAC,MAAMuG,EAAM,UAAO,EAAM,QAAQD,EAAOtG,CAAC;EACvD,CACF;EACA,IAAMwG,IAAQpG,EAA6B,IAAI;EAC/C,QAAgBoG,EAAM,OAAO,MAAM,CAAC;EAEpC,IAAMC,UAAepH,EAAM,OAAO,QAAQA,EAAM,OAAO,UACjDqH,KAAa,MACjBrH,EAAM,OAAO,SAAS,cAClBsH,EAAE,kBAAkB,IACpBtH,EAAM,OAAO,SAAS,cACpBsH,EAAE,kBAAkB,IACpBA,GACFlG,UAAe;GACnB,IAAMkG,IAAID,EAAUH,EAAM,KAAK,CAAC,CAAC,KAAK;GACtC,IAAIE,EAAO,GAAG;IACZ,IAAMG,IAAQD,EACX,MAAM,SAAS,CAAA,CACf,KAAK,MAAMhB,EAAE,KAAK,CAAC,CAAA,CACnB,OAAO,OAAO;IACjB,EAAK,qBAAqBiB,CAAK;GACjC,OAAO,EAAK,qBAAqBD,CAAC;EACpC,GACI/F,GACEC,KAAW,MAAa;GAG5B,AAFA,EAAM,QAAQ6F,EAAW,EAAE,OAA4B,KAAK,GAC5D,aAAa9F,CAAK,GAClB,IAAQ,WAAWH,GAAQ,GAAG;EAChC,GACMK,UAAgB;GAGpB,AAFA,aAAaF,CAAK,GAClBH,EAAO,GACPlB,EAAK,MAAM;EACb;E,OACAsH,QAAsB,aAAajG,CAAK,CAAC,I,UAIvCnE,EAAA,GAAAC,EASQ,SATRyJ,IASQ,CARNxJ,EAOE,SAAA;GANI,SAAA;GAAJ,KAAI6J;GACH,OAAOD,EAAA;GACR,MAAK;GACL,cAAa;GACL;GACP,WAAO3J,EAAAC,EAAgBiE,GAAO,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA"}
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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"}
package/dist/index.d.ts CHANGED
@@ -53,6 +53,8 @@ declare const __VLS_export: <Row extends object>(__VLS_props: NonNullable<Awaite
53
53
  expand?: boolean | ExpandOptions<Row>;
54
54
  /** Satır hatası (D35): metin/metin listesi → `--dt-r-bg` + ⋯ hücresinde uyarı ikonu + satırda tooltip. Harita uygulamanın. */
55
55
  rowError?: (row: Row) => string | string[] | null | undefined;
56
+ /** More › Export (D46). Varsayılan açık; `false` gizler (ör. yetki). */
57
+ exportable?: boolean;
56
58
  } & {
57
59
  onCount?: ((request: CountRequest) => any) | undefined;
58
60
  "onRow-click"?: ((payload: {
@@ -68,6 +70,7 @@ declare const __VLS_export: <Row extends object>(__VLS_props: NonNullable<Awaite
68
70
  format: "csv" | "xlsx";
69
71
  query: QueryWithoutPage;
70
72
  selection: Row[];
73
+ rows: Row[];
71
74
  visibleColumns: string[];
72
75
  }) => any) | undefined;
73
76
  onImport?: (() => any) | undefined;
@@ -116,6 +119,7 @@ declare const __VLS_export: <Row extends object>(__VLS_props: NonNullable<Awaite
116
119
  format: "csv" | "xlsx";
117
120
  query: QueryWithoutPage;
118
121
  selection: Row[];
122
+ rows: Row[];
119
123
  visibleColumns: string[];
120
124
  }) => void) & ((evt: "import") => void) & ((evt: "print", payload: {
121
125
  query: QueryWithoutPage;
@@ -141,7 +145,7 @@ export declare interface BaseColumn<Row, V = unknown> {
141
145
  header: string;
142
146
  /** Dar alanlarda (telefon) kısa header. */
143
147
  headerShort?: string;
144
- /** Sütun açıklaması: header tooltip'inde ad altında ikinci satır, Columns panelinde ad altında; hücrede gösterilmez. */
148
+ /** Sütun açıklaması: header tooltip'inde ad altında ikinci satır, Columns dialog'unda ad altında; hücrede gösterilmez. */
145
149
  description?: string;
146
150
  /** Hesaplanan değer. Verilirse `fields` ile sunucudan istenecek alanlar bildirilir. */
147
151
  accessor?: (row: Row) => V;
@@ -154,11 +158,10 @@ export declare interface BaseColumn<Row, V = unknown> {
154
158
  /** px. Varsayılan 80. */
155
159
  minWidth?: number;
156
160
  maxWidth?: number;
157
- pinned?: 'left' | 'right';
158
161
  hidden?: boolean;
159
- /** Gizlenemez. Birincil sütun için otomatik true. */
162
+ /** Gizlenemez. Birincil ve `required` sütun için otomatik true. */
160
163
  alwaysVisible?: boolean;
161
- /** Birincil hücre: gerçek <a href> (D6); telefonda sabit. Tabloda en fazla bir tane. */
164
+ /** Birincil hücre: gerçek <a href> (D6); her zaman sola sabit (D45). Tabloda en fazla bir tane. */
162
165
  primary?: boolean;
163
166
  /** Birincil hücre veya `id`/`ajax` tipi için kayıt linki. */
164
167
  href?: (row: Row) => string | undefined;
@@ -576,8 +579,10 @@ export declare interface SheetChangeRow {
576
579
  clientId: string;
577
580
  /** Anahtar sütunun değeri (ör. SKU). */
578
581
  key: string;
579
- /** create: anahtar sunucuda yok → tüm dolu alanlar. update: yalnızca değişen alanlar. Sunucu anahtara göre upsert yapar (D11). */
580
- op: 'create' | 'update';
582
+ /**
583
+ * Değişen alanlar + `required` sütunlar + anahtar (sütun id'leriyle). Eklenen satırda boş değer gitmez. Sunucu anahtara
584
+ * göre upsert eder (D11, D47); paket kaydın sunucuda olup olmadığını bilmez.
585
+ */
581
586
  values: Record<string, unknown>;
582
587
  }
583
588