@shwfed/config 2.10.12 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mcp.mjs +46 -49
- package/dist/module.json +1 -1
- package/dist/preview/assets/{FieldGroup.vue_vue_type_script_setup_true_lang-BeqytPDr.js → FieldGroup.vue_vue_type_script_setup_true_lang-UfhMyymD.js} +1 -1
- package/dist/preview/assets/{badge-DkHwLDps.js → badge-CJ9IQ3Jx.js} +1 -1
- package/dist/preview/assets/{config-Cft-srKd.js → config--Vx4fL61.js} +1 -1
- package/dist/preview/assets/{config-DJQ2LOWo.js → config-5PPug5mk.js} +1 -1
- package/dist/preview/assets/{config-Dx1SXsSf.js → config-7V1qHjUk.js} +1 -1
- package/dist/preview/assets/{config-Cedm-E2H.js → config-BYktCefJ.js} +1 -1
- package/dist/preview/assets/{config-DAZ2Uj6B.js → config-BeRYF_cz.js} +1 -1
- package/dist/preview/assets/{config-DCANpbtq.js → config-BldsYfGM.js} +1 -1
- package/dist/preview/assets/{config-Uw4cvZGX.js → config-CQrDCzYN.js} +1 -1
- package/dist/preview/assets/{config-7KeAl8UU.js → config-C_g-FYCR.js} +1 -1
- package/dist/preview/assets/{config-CZ1e9utV.js → config-DIsAIc7H.js} +1 -1
- package/dist/preview/assets/{config-OPQWANCx.js → config-DPX7vGqV.js} +1 -1
- package/dist/preview/assets/{config-DQVKd54J.js → config-DpLMetys.js} +1 -1
- package/dist/preview/assets/{config-CVPVYMuh.js → config-IMd4FZi8.js} +1 -1
- package/dist/preview/assets/{config-Cy6Eix27.js → config-N-FdgfwK.js} +1 -1
- package/dist/preview/assets/{config-DbV3RlZz.js → config-uUF-UHPt.js} +1 -1
- package/dist/preview/assets/{definition.vue_vue_type_script_setup_true_lang-D4Gh9PzS.js → definition.vue_vue_type_script_setup_true_lang-B_PKfe3G.js} +1 -1
- package/dist/preview/assets/index-8Ph-sFDI.css +1 -0
- package/dist/preview/assets/index-BCl1NN6k.js +763 -0
- package/dist/preview/assets/index-Core7vRW.js +1 -0
- package/dist/preview/assets/{index-Cum0oK9u.js → index-DKWp47QP.js} +1 -1
- package/dist/preview/assets/{item-H4QeOpnC.js → item-XsW7swFt.js} +1 -1
- package/dist/preview/assets/{runtime-CTnwTJlw.js → runtime-B-ABO0r0.js} +1 -1
- package/dist/preview/assets/{runtime-C3532B0Y.js → runtime-BeHohaOZ.js} +1 -1
- package/dist/preview/assets/{runtime-CNMjRr9Y.js → runtime-BiFFwOIl.js} +1 -1
- package/dist/preview/assets/{runtime-ibuFFD1K.js → runtime-ByArW-jJ.js} +1 -1
- package/dist/preview/assets/{runtime-DvCHNIPq.js → runtime-CpVTGNFZ.js} +1 -1
- package/dist/preview/assets/{runtime-sPGVp7yA.js → runtime-DQ1TnQ7n.js} +1 -1
- package/dist/preview/assets/{runtime-CwgX0PuH.js → runtime-DY7hr7v1.js} +1 -1
- package/dist/preview/assets/{runtime-BotFX6qJ.js → runtime-Dn172S7t.js} +1 -1
- package/dist/preview/assets/{runtime-D5HcLLLR.js → runtime-JxBzvGnw.js} +1 -1
- package/dist/preview/assets/{runtime-cKOD2A6u.js → runtime-bq0hmEXY.js} +1 -1
- package/dist/preview/assets/{schema-meta-DtZNwp3h.js → schema-meta-CZ9yXnsa.js} +1 -1
- package/dist/preview/index.html +2 -2
- package/dist/runtime/components/form/fields/2026-06-09/com.shwfed.form.field.upload/runtime.vue +23 -1
- package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.date/config.vue +30 -0
- package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.date/schema.d.ts +2 -1
- package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.date/schema.js +1 -1
- package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.icon/config.vue +30 -0
- package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.icon/schema.d.ts +2 -1
- package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.icon/schema.js +7 -4
- package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.number/config.vue +30 -0
- package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.number/schema.d.ts +2 -1
- package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.number/schema.js +1 -1
- package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.text/config.vue +30 -0
- package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.text/schema.d.ts +2 -1
- package/dist/runtime/components/table/columns/2026-04-14/com.shwfed.table.column.text/schema.js +1 -1
- package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch/schema.d.ts +2 -1
- package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch/schema.js +1 -0
- package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch.remote/config.vue +30 -0
- package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch.remote/schema.d.ts +2 -1
- package/dist/runtime/components/table/columns/2026-05-13/com.shwfed.table.column.switch.remote/schema.js +1 -1
- package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.number-input/config.vue +60 -32
- package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.number-input/runtime.vue +7 -9
- package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.number-input/schema.d.ts +4 -1
- package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.number-input/schema.js +2 -5
- package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch.local/config.vue +67 -32
- package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch.local/runtime.vue +6 -9
- package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch.local/schema.d.ts +4 -1
- package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.switch.local/schema.js +2 -5
- package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.text-input/config.vue +66 -31
- package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.text-input/runtime.vue +7 -9
- package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.text-input/schema.d.ts +4 -1
- package/dist/runtime/components/table/columns/2026-05-20/com.shwfed.table.column.text-input/schema.js +2 -5
- package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.d.vue.ts +2 -2
- package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.vue.d.ts +2 -2
- package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/schema.d.ts +1 -1
- package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/schema.js +1 -0
- package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/config.d.vue.ts +2 -2
- package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/config.vue.d.ts +2 -2
- package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/schema.d.ts +1 -1
- package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/schema.js +1 -0
- package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.d.vue.ts +2 -2
- package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.vue.d.ts +2 -2
- package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/schema.d.ts +1 -1
- package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/schema.js +1 -0
- package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/config.d.vue.ts +2 -2
- package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/config.vue.d.ts +2 -2
- package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/schema.d.ts +1 -1
- package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/schema.js +1 -0
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/config.d.vue.ts +2 -2
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/config.vue.d.ts +2 -2
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/schema.d.ts +1 -1
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/schema.js +1 -0
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/config.d.vue.ts +2 -2
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/config.vue.d.ts +2 -2
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/schema.d.ts +1 -1
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/schema.js +1 -0
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.d.vue.ts +4 -2
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.vue +61 -22
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/config.vue.d.ts +4 -2
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/runtime.vue +6 -9
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/schema.d.ts +4 -1
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-multi/schema.js +3 -4
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.d.vue.ts +4 -2
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.vue +61 -22
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/config.vue.d.ts +4 -2
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/runtime.vue +6 -9
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/schema.d.ts +4 -1
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.combobox-single/schema.js +3 -4
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.d.vue.ts +4 -2
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.vue +67 -23
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/config.vue.d.ts +4 -2
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/runtime.vue +6 -9
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/schema.d.ts +4 -1
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-multi/schema.js +2 -4
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.d.vue.ts +4 -2
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.vue +67 -23
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/config.vue.d.ts +4 -2
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/runtime.vue +6 -9
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/schema.d.ts +4 -1
- package/dist/runtime/components/table/columns/2026-06-14/com.shwfed.table.column.tree-combobox-single/schema.js +2 -4
- package/dist/runtime/components/table/columns/2026-06-17/com.shwfed.table.column.date-input/config.vue +67 -32
- package/dist/runtime/components/table/columns/2026-06-17/com.shwfed.table.column.date-input/runtime.vue +7 -9
- package/dist/runtime/components/table/columns/2026-06-17/com.shwfed.table.column.date-input/schema.d.ts +4 -1
- package/dist/runtime/components/table/columns/2026-06-17/com.shwfed.table.column.date-input/schema.js +2 -5
- package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/config.vue +66 -31
- package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/runtime.vue +5 -8
- package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/schema.d.ts +4 -1
- package/dist/runtime/components/table/columns/2026-06-22/com.shwfed.table.column.date-range-input/schema.js +2 -5
- package/dist/runtime/components/table/index.vue +46 -7
- package/dist/runtime/components/table/utils/runtime.d.ts +1 -0
- package/dist/runtime/components/table/utils/runtime.js +5 -0
- package/dist/runtime/components/table/utils/shared.d.ts +3 -1
- package/dist/runtime/components/table/utils/shared.js +17 -5
- package/package.json +1 -1
- package/dist/preview/assets/index-B3HnlKis.js +0 -763
- package/dist/preview/assets/index-BAY6NLoo.css +0 -1
- package/dist/preview/assets/index-CxUuhfsO.js +0 -1
|
@@ -4,6 +4,7 @@ import { Icon } from "@iconify/vue";
|
|
|
4
4
|
import { format as formatDate } from "date-fns";
|
|
5
5
|
import { ExpressionEditor } from "../../../../ui/expression-editor";
|
|
6
6
|
import { Separator } from "../../../../ui/separator";
|
|
7
|
+
import { Switch } from "../../../../ui/switch";
|
|
7
8
|
import { Button } from "../../../../ui/button";
|
|
8
9
|
import { Field, FieldLabel } from "../../../../ui/field";
|
|
9
10
|
import { Locale } from "../../../../ui/locale";
|
|
@@ -15,6 +16,12 @@ import {
|
|
|
15
16
|
InputGroupNumberField,
|
|
16
17
|
InputGroupText
|
|
17
18
|
} from "../../../../ui/input-group";
|
|
19
|
+
import {
|
|
20
|
+
DropdownMenu,
|
|
21
|
+
DropdownMenuContent,
|
|
22
|
+
DropdownMenuItem,
|
|
23
|
+
DropdownMenuTrigger
|
|
24
|
+
} from "../../../../ui/dropdown-menu";
|
|
18
25
|
import { getStructFieldDescription, getStructFieldTitle } from "../../../utils/schema-meta";
|
|
19
26
|
import { Markdown } from "../../../../ui/markdown";
|
|
20
27
|
import DerivedValueEditor from "../../../../form/DerivedValueEditor.vue";
|
|
@@ -29,6 +36,14 @@ const presetFieldSchema = presetSchema(() => {
|
|
|
29
36
|
});
|
|
30
37
|
const presetFieldTitle = (field) => getStructFieldTitle(presetFieldSchema, field) ?? field;
|
|
31
38
|
const presetFieldDescription = (field) => getStructFieldDescription(presetFieldSchema, field);
|
|
39
|
+
const ALIGN_OPTIONS = [
|
|
40
|
+
{ value: "left", label: "\u5DE6\u5BF9\u9F50", icon: "fluent:text-align-left-20-regular" },
|
|
41
|
+
{ value: "center", label: "\u5C45\u4E2D", icon: "fluent:text-align-center-20-regular" },
|
|
42
|
+
{ value: "right", label: "\u53F3\u5BF9\u9F50", icon: "fluent:text-align-right-20-regular" }
|
|
43
|
+
];
|
|
44
|
+
const currentAlignIcon = computed(
|
|
45
|
+
() => (ALIGN_OPTIONS.find((o) => o.value === (value.value.align ?? "left")) ?? ALIGN_OPTIONS[0]).icon
|
|
46
|
+
);
|
|
32
47
|
const ROW_VARS = {
|
|
33
48
|
row: { type: "dyn", label: "\u5F53\u524D\u884C\u6570\u636E" },
|
|
34
49
|
index: { type: "number", label: "\u884C\u7D22\u5F15" }
|
|
@@ -77,6 +92,14 @@ const bindingText = computed({
|
|
|
77
92
|
}
|
|
78
93
|
}
|
|
79
94
|
});
|
|
95
|
+
function onHiddenChange(v) {
|
|
96
|
+
if (v) {
|
|
97
|
+
value.value = { ...value.value, hidden: true };
|
|
98
|
+
} else {
|
|
99
|
+
const { hidden: _drop, ...rest } = value.value;
|
|
100
|
+
value.value = rest;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
80
103
|
const formatText = computed({
|
|
81
104
|
get: () => value.value.format ?? "",
|
|
82
105
|
set: (v) => {
|
|
@@ -111,17 +134,6 @@ function previewFormat(fmt) {
|
|
|
111
134
|
}
|
|
112
135
|
const formatExample = computed(() => previewFormat(value.value.format ?? ""));
|
|
113
136
|
const valueFormatExample = computed(() => previewFormat(value.value.valueFormat ?? ""));
|
|
114
|
-
const hiddenModel = computed({
|
|
115
|
-
get: () => value.value.hidden ?? "",
|
|
116
|
-
set: (v) => {
|
|
117
|
-
if (v === "") {
|
|
118
|
-
const { hidden: _drop, ...rest } = value.value;
|
|
119
|
-
value.value = rest;
|
|
120
|
-
} else {
|
|
121
|
-
value.value = { ...value.value, hidden: v };
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
137
|
const disabledModel = computed({
|
|
126
138
|
get: () => value.value.disabled ?? "",
|
|
127
139
|
set: (v) => {
|
|
@@ -311,6 +323,29 @@ const derivedModel = computed({
|
|
|
311
323
|
{{ fieldTitle("size") }}
|
|
312
324
|
</FieldLabel>
|
|
313
325
|
<InputGroup>
|
|
326
|
+
<InputGroupAddon align="inline-start">
|
|
327
|
+
<DropdownMenu>
|
|
328
|
+
<DropdownMenuTrigger as-child>
|
|
329
|
+
<InputGroupButton
|
|
330
|
+
variant="ghost"
|
|
331
|
+
size="xs"
|
|
332
|
+
:title="fieldTitle('align')"
|
|
333
|
+
>
|
|
334
|
+
<Icon :icon="currentAlignIcon" />
|
|
335
|
+
</InputGroupButton>
|
|
336
|
+
</DropdownMenuTrigger>
|
|
337
|
+
<DropdownMenuContent align="start">
|
|
338
|
+
<DropdownMenuItem
|
|
339
|
+
v-for="opt in ALIGN_OPTIONS"
|
|
340
|
+
:key="opt.value"
|
|
341
|
+
@select="value = { ...value, align: opt.value }"
|
|
342
|
+
>
|
|
343
|
+
<Icon :icon="opt.icon" />
|
|
344
|
+
{{ opt.label }}
|
|
345
|
+
</DropdownMenuItem>
|
|
346
|
+
</DropdownMenuContent>
|
|
347
|
+
</DropdownMenu>
|
|
348
|
+
</InputGroupAddon>
|
|
314
349
|
<InputGroupNumberField
|
|
315
350
|
:model-value="value.size"
|
|
316
351
|
:disabled="value.grow"
|
|
@@ -329,27 +364,6 @@ const derivedModel = computed({
|
|
|
329
364
|
</InputGroupAddon>
|
|
330
365
|
</InputGroup>
|
|
331
366
|
</Field>
|
|
332
|
-
<Field orientation="vertical">
|
|
333
|
-
<FieldLabel class="text-xs text-zinc-500">
|
|
334
|
-
<template
|
|
335
|
-
v-if="fieldDescription('hidden')"
|
|
336
|
-
#tooltip
|
|
337
|
-
>
|
|
338
|
-
<Markdown
|
|
339
|
-
:source="fieldDescription('hidden')"
|
|
340
|
-
block
|
|
341
|
-
class="prose prose-sm prose-zinc"
|
|
342
|
-
/>
|
|
343
|
-
</template>
|
|
344
|
-
{{ fieldTitle("hidden") }}
|
|
345
|
-
</FieldLabel>
|
|
346
|
-
<ExpressionEditor
|
|
347
|
-
v-model="hiddenModel"
|
|
348
|
-
placeholder="例:row.archived"
|
|
349
|
-
result-type="bool"
|
|
350
|
-
:extra-vars="ROW_VARS"
|
|
351
|
-
/>
|
|
352
|
-
</Field>
|
|
353
367
|
<Field orientation="vertical">
|
|
354
368
|
<FieldLabel class="text-xs text-zinc-500">
|
|
355
369
|
<template
|
|
@@ -538,6 +552,27 @@ const derivedModel = computed({
|
|
|
538
552
|
</InputGroupAddon>
|
|
539
553
|
</InputGroup>
|
|
540
554
|
</Field>
|
|
555
|
+
<Field orientation="vertical">
|
|
556
|
+
<FieldLabel class="text-xs text-zinc-500">
|
|
557
|
+
<template
|
|
558
|
+
v-if="fieldDescription('hidden')"
|
|
559
|
+
#tooltip
|
|
560
|
+
>
|
|
561
|
+
<Markdown
|
|
562
|
+
:source="fieldDescription('hidden')"
|
|
563
|
+
block
|
|
564
|
+
class="prose prose-sm prose-zinc"
|
|
565
|
+
/>
|
|
566
|
+
</template>
|
|
567
|
+
{{ fieldTitle("hidden") }}
|
|
568
|
+
</FieldLabel>
|
|
569
|
+
<div>
|
|
570
|
+
<Switch
|
|
571
|
+
:model-value="value.hidden ?? false"
|
|
572
|
+
@update:model-value="onHiddenChange"
|
|
573
|
+
/>
|
|
574
|
+
</div>
|
|
575
|
+
</Field>
|
|
541
576
|
</div>
|
|
542
577
|
</div>
|
|
543
578
|
</template>
|
|
@@ -9,6 +9,7 @@ import { useFormReadonly } from "../../../../form/utils/readonly";
|
|
|
9
9
|
import { getLocalizedText } from "../../../../../share/locale";
|
|
10
10
|
import { DATE_PICKER_DEFAULT_FORMATS, DatePicker } from "../../../../ui/date-picker";
|
|
11
11
|
import { useFormState } from "../../../../form/utils/state";
|
|
12
|
+
import { JUSTIFY_CLASS, TEXT_ALIGN_CLASS } from "../../../utils/runtime";
|
|
12
13
|
defineOptions({ name: "ShwfedTableDateInputRendererRuntime" });
|
|
13
14
|
const props = defineProps({
|
|
14
15
|
column: { type: null, required: true },
|
|
@@ -29,7 +30,6 @@ function evalBool(expression, label) {
|
|
|
29
30
|
return false;
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
|
-
const isHidden = computed(() => evalBool(props.column.hidden, "hidden"));
|
|
33
33
|
const isDisabled = computed(() => evalBool(props.column.disabled, "disabled"));
|
|
34
34
|
const formReadonly = useFormReadonly();
|
|
35
35
|
const isReadonly = computed(
|
|
@@ -41,6 +41,8 @@ const effectiveReadonly = computed(
|
|
|
41
41
|
const resolvedValueFormat = computed(
|
|
42
42
|
() => props.column.valueFormat ?? DATE_PICKER_DEFAULT_FORMATS.date.value
|
|
43
43
|
);
|
|
44
|
+
const justifyClass = computed(() => JUSTIFY_CLASS[props.column.align ?? "left"] ?? JUSTIFY_CLASS.left);
|
|
45
|
+
const textAlignClass = computed(() => TEXT_ALIGN_CLASS[props.column.align ?? "left"] ?? TEXT_ALIGN_CLASS.left);
|
|
44
46
|
const shortcuts = computed(() => {
|
|
45
47
|
const list = props.column.presets;
|
|
46
48
|
if (!list || list.length === 0) return void 0;
|
|
@@ -71,14 +73,10 @@ const model = computed({
|
|
|
71
73
|
<template>
|
|
72
74
|
<!--
|
|
73
75
|
Row budget matches the editable input columns: 2px outer inset around a 28px
|
|
74
|
-
(`h-7`) control — total 32px. Every branch (
|
|
76
|
+
(`h-7`) control — total 32px. Every branch (readonly / editable) is
|
|
75
77
|
sized identically so rows do not jump when a CEL condition flips.
|
|
76
78
|
-->
|
|
77
79
|
<div class="p-[0.125rem] w-full">
|
|
78
|
-
<span
|
|
79
|
-
v-if="isHidden"
|
|
80
|
-
class="block h-7 w-full"
|
|
81
|
-
/>
|
|
82
80
|
<!--
|
|
83
81
|
Readonly empty state mirrors the `text-input` column: a centered, faded,
|
|
84
82
|
non-selectable `-` so a readonly grid reads uniformly regardless of which
|
|
@@ -86,10 +84,10 @@ const model = computed({
|
|
|
86
84
|
dark text.
|
|
87
85
|
-->
|
|
88
86
|
<span
|
|
89
|
-
v-
|
|
87
|
+
v-if="effectiveReadonly"
|
|
90
88
|
:class="[
|
|
91
89
|
'flex items-center h-7 w-full px-2 text-[0.75rem] truncate',
|
|
92
|
-
model ? 'text-zinc-700' : 'justify-center font-mono text-zinc-300 select-none'
|
|
90
|
+
model ? ['text-zinc-700', justifyClass] : 'justify-center font-mono text-zinc-300 select-none'
|
|
93
91
|
]"
|
|
94
92
|
>
|
|
95
93
|
{{ model || "-" }}
|
|
@@ -107,7 +105,7 @@ const model = computed({
|
|
|
107
105
|
type="date"
|
|
108
106
|
size="sm"
|
|
109
107
|
class="w-full"
|
|
110
|
-
input-class="border-zinc-200/30 hover:border-zinc-200 focus-within:border-zinc-200 transition-colors ease-out duration-180"
|
|
108
|
+
:input-class="['border-zinc-200/30 hover:border-zinc-200 focus-within:border-zinc-200 transition-colors ease-out duration-180', textAlignClass]"
|
|
111
109
|
:format="column.format"
|
|
112
110
|
:value-format="column.valueFormat"
|
|
113
111
|
:placeholder="placeholderText"
|
|
@@ -20,6 +20,9 @@ export declare function presetSchema(configure: (env: Environment) => void): Sch
|
|
|
20
20
|
value: Schema.Schema<string, string, never>;
|
|
21
21
|
}>;
|
|
22
22
|
export declare function schema(configure: (env: Environment) => void): Schema.Struct<{
|
|
23
|
+
align: Schema.optionalWith<Schema.Literal<["left", "center", "right"]>, {
|
|
24
|
+
default: () => "left";
|
|
25
|
+
}>;
|
|
23
26
|
placeholder: Schema.optional<Schema.TupleType<readonly [Schema.Struct<{
|
|
24
27
|
locale: Schema.Literal<["zh"]>;
|
|
25
28
|
message: Schema.SchemaClass<string, string, never>;
|
|
@@ -27,7 +30,6 @@ export declare function schema(configure: (env: Environment) => void): Schema.St
|
|
|
27
30
|
locale: Schema.Literal<["ja", "en", "ko"]>;
|
|
28
31
|
message: Schema.SchemaClass<string, string, never>;
|
|
29
32
|
}>]>>;
|
|
30
|
-
hidden: Schema.optional<Schema.Schema<string, string, never>>;
|
|
31
33
|
disabled: Schema.optional<Schema.Schema<string, string, never>>;
|
|
32
34
|
readonly: Schema.optional<Schema.Schema<string, string, never>>;
|
|
33
35
|
derived: Schema.optional<Schema.Struct<{
|
|
@@ -66,6 +68,7 @@ export declare function schema(configure: (env: Environment) => void): Schema.St
|
|
|
66
68
|
locale: Schema.Literal<["ja", "en", "ko"]>;
|
|
67
69
|
message: Schema.SchemaClass<string, string, never>;
|
|
68
70
|
}>]>>;
|
|
71
|
+
hidden: Schema.optional<Schema.SchemaClass<boolean, boolean, never>>;
|
|
69
72
|
id: Schema.refine<string, typeof Schema.String>;
|
|
70
73
|
groupId: Schema.optional<typeof Schema.UUID>;
|
|
71
74
|
type: Schema.Literal<["com.shwfed.table.column.date-input"]>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
2
|
import { getProperty } from "dot-prop";
|
|
3
3
|
import { Locale } from "../../../../../share/locale.js";
|
|
4
|
-
import { CelRowAccess, derivedRowField, editableColumnFields, editableHeader } from "../../../utils/shared.js";
|
|
4
|
+
import { Align, CelRowAccess, derivedRowField, editableColumnFields, editableHeader } from "../../../utils/shared.js";
|
|
5
5
|
export const type = "com.shwfed.table.column.date-input";
|
|
6
6
|
export const compatibilityDate = "2026-06-17";
|
|
7
7
|
export const metadata = {
|
|
@@ -31,14 +31,11 @@ export function schema(configure) {
|
|
|
31
31
|
type: Schema.Literal(type),
|
|
32
32
|
compatibilityDate: Schema.Literal(compatibilityDate),
|
|
33
33
|
...editableColumnFields(),
|
|
34
|
+
align: Schema.optionalWith(Align.annotations({ title: "\u5BF9\u9F50" }), { default: () => "left" }),
|
|
34
35
|
placeholder: Schema.optional(Locale.annotations({
|
|
35
36
|
title: "\u5360\u4F4D\u7B26",
|
|
36
37
|
description: "\u672A\u9009\u4E2D\u65E5\u671F\u65F6\u8F93\u5165\u6846\u4E2D\u7684\u5360\u4F4D\u6587\u672C"
|
|
37
38
|
})),
|
|
38
|
-
hidden: Schema.optional(CelBool.annotations({
|
|
39
|
-
title: "\u9690\u85CF\u6761\u4EF6",
|
|
40
|
-
description: "\u8FD4\u56DE `true` \u65F6\u8BE5\u884C\u7684\u8F93\u5165\u6846\u4E0D\u6E32\u67D3\uFF08\u5176\u4F59\u884C\u4E0D\u53D7\u5F71\u54CD\uFF09"
|
|
41
|
-
})),
|
|
42
39
|
disabled: Schema.optional(CelBool.annotations({
|
|
43
40
|
title: "\u7981\u7528\u6761\u4EF6",
|
|
44
41
|
description: "\u8FD4\u56DE `true` \u65F6\u8F93\u5165\u6846\u4ECD\u7136\u6E32\u67D3\u4F46\u4E0D\u53EF\u7F16\u8F91"
|
|
@@ -4,6 +4,7 @@ import { Icon } from "@iconify/vue";
|
|
|
4
4
|
import { format as formatDate } from "date-fns";
|
|
5
5
|
import { ExpressionEditor } from "../../../../ui/expression-editor";
|
|
6
6
|
import { Separator } from "../../../../ui/separator";
|
|
7
|
+
import { Switch } from "../../../../ui/switch";
|
|
7
8
|
import { Button } from "../../../../ui/button";
|
|
8
9
|
import { Field, FieldLabel } from "../../../../ui/field";
|
|
9
10
|
import { IconPicker } from "../../../../ui/icon-picker";
|
|
@@ -16,6 +17,12 @@ import {
|
|
|
16
17
|
InputGroupNumberField,
|
|
17
18
|
InputGroupText
|
|
18
19
|
} from "../../../../ui/input-group";
|
|
20
|
+
import {
|
|
21
|
+
DropdownMenu,
|
|
22
|
+
DropdownMenuContent,
|
|
23
|
+
DropdownMenuItem,
|
|
24
|
+
DropdownMenuTrigger
|
|
25
|
+
} from "../../../../ui/dropdown-menu";
|
|
19
26
|
import { getStructFieldDescription, getStructFieldTitle } from "../../../utils/schema-meta";
|
|
20
27
|
import { Markdown } from "../../../../ui/markdown";
|
|
21
28
|
import DerivedValueEditor from "../../../../form/DerivedValueEditor.vue";
|
|
@@ -30,6 +37,14 @@ const presetFieldSchema = presetSchema(() => {
|
|
|
30
37
|
});
|
|
31
38
|
const presetFieldTitle = (field) => getStructFieldTitle(presetFieldSchema, field) ?? field;
|
|
32
39
|
const presetFieldDescription = (field) => getStructFieldDescription(presetFieldSchema, field);
|
|
40
|
+
const ALIGN_OPTIONS = [
|
|
41
|
+
{ value: "left", label: "\u5DE6\u5BF9\u9F50", icon: "fluent:text-align-left-20-regular" },
|
|
42
|
+
{ value: "center", label: "\u5C45\u4E2D", icon: "fluent:text-align-center-20-regular" },
|
|
43
|
+
{ value: "right", label: "\u53F3\u5BF9\u9F50", icon: "fluent:text-align-right-20-regular" }
|
|
44
|
+
];
|
|
45
|
+
const currentAlignIcon = computed(
|
|
46
|
+
() => (ALIGN_OPTIONS.find((o) => o.value === (value.value.align ?? "left")) ?? ALIGN_OPTIONS[0]).icon
|
|
47
|
+
);
|
|
33
48
|
const ROW_VARS = {
|
|
34
49
|
row: { type: "dyn", label: "\u5F53\u524D\u884C\u6570\u636E" },
|
|
35
50
|
index: { type: "number", label: "\u884C\u7D22\u5F15" }
|
|
@@ -156,17 +171,14 @@ function previewFormat(fmt) {
|
|
|
156
171
|
}
|
|
157
172
|
const formatExample = computed(() => previewFormat(value.value.format ?? ""));
|
|
158
173
|
const valueFormatExample = computed(() => previewFormat(value.value.valueFormat ?? ""));
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
} else {
|
|
166
|
-
value.value = { ...value.value, hidden: v };
|
|
167
|
-
}
|
|
174
|
+
function onHiddenChange(v) {
|
|
175
|
+
if (v) {
|
|
176
|
+
value.value = { ...value.value, hidden: true };
|
|
177
|
+
} else {
|
|
178
|
+
const { hidden: _drop, ...rest } = value.value;
|
|
179
|
+
value.value = rest;
|
|
168
180
|
}
|
|
169
|
-
}
|
|
181
|
+
}
|
|
170
182
|
const disabledModel = computed({
|
|
171
183
|
get: () => value.value.disabled ?? "",
|
|
172
184
|
set: (v) => {
|
|
@@ -462,6 +474,29 @@ const derivedModel = computed({
|
|
|
462
474
|
{{ fieldTitle("size") }}
|
|
463
475
|
</FieldLabel>
|
|
464
476
|
<InputGroup>
|
|
477
|
+
<InputGroupAddon align="inline-start">
|
|
478
|
+
<DropdownMenu>
|
|
479
|
+
<DropdownMenuTrigger as-child>
|
|
480
|
+
<InputGroupButton
|
|
481
|
+
variant="ghost"
|
|
482
|
+
size="xs"
|
|
483
|
+
:title="fieldTitle('align')"
|
|
484
|
+
>
|
|
485
|
+
<Icon :icon="currentAlignIcon" />
|
|
486
|
+
</InputGroupButton>
|
|
487
|
+
</DropdownMenuTrigger>
|
|
488
|
+
<DropdownMenuContent align="start">
|
|
489
|
+
<DropdownMenuItem
|
|
490
|
+
v-for="opt in ALIGN_OPTIONS"
|
|
491
|
+
:key="opt.value"
|
|
492
|
+
@select="value = { ...value, align: opt.value }"
|
|
493
|
+
>
|
|
494
|
+
<Icon :icon="opt.icon" />
|
|
495
|
+
{{ opt.label }}
|
|
496
|
+
</DropdownMenuItem>
|
|
497
|
+
</DropdownMenuContent>
|
|
498
|
+
</DropdownMenu>
|
|
499
|
+
</InputGroupAddon>
|
|
465
500
|
<InputGroupNumberField
|
|
466
501
|
:model-value="value.size"
|
|
467
502
|
:disabled="value.grow"
|
|
@@ -480,27 +515,6 @@ const derivedModel = computed({
|
|
|
480
515
|
</InputGroupAddon>
|
|
481
516
|
</InputGroup>
|
|
482
517
|
</Field>
|
|
483
|
-
<Field orientation="vertical">
|
|
484
|
-
<FieldLabel class="text-xs text-zinc-500">
|
|
485
|
-
<template
|
|
486
|
-
v-if="fieldDescription('hidden')"
|
|
487
|
-
#tooltip
|
|
488
|
-
>
|
|
489
|
-
<Markdown
|
|
490
|
-
:source="fieldDescription('hidden')"
|
|
491
|
-
block
|
|
492
|
-
class="prose prose-sm prose-zinc"
|
|
493
|
-
/>
|
|
494
|
-
</template>
|
|
495
|
-
{{ fieldTitle("hidden") }}
|
|
496
|
-
</FieldLabel>
|
|
497
|
-
<ExpressionEditor
|
|
498
|
-
v-model="hiddenModel"
|
|
499
|
-
placeholder="例:row.archived"
|
|
500
|
-
result-type="bool"
|
|
501
|
-
:extra-vars="ROW_VARS"
|
|
502
|
-
/>
|
|
503
|
-
</Field>
|
|
504
518
|
<Field orientation="vertical">
|
|
505
519
|
<FieldLabel class="text-xs text-zinc-500">
|
|
506
520
|
<template
|
|
@@ -712,6 +726,27 @@ const derivedModel = computed({
|
|
|
712
726
|
</InputGroupAddon>
|
|
713
727
|
</InputGroup>
|
|
714
728
|
</Field>
|
|
729
|
+
<Field orientation="vertical">
|
|
730
|
+
<FieldLabel class="text-xs text-zinc-500">
|
|
731
|
+
<template
|
|
732
|
+
v-if="fieldDescription('hidden')"
|
|
733
|
+
#tooltip
|
|
734
|
+
>
|
|
735
|
+
<Markdown
|
|
736
|
+
:source="fieldDescription('hidden')"
|
|
737
|
+
block
|
|
738
|
+
class="prose prose-sm prose-zinc"
|
|
739
|
+
/>
|
|
740
|
+
</template>
|
|
741
|
+
{{ fieldTitle("hidden") }}
|
|
742
|
+
</FieldLabel>
|
|
743
|
+
<div>
|
|
744
|
+
<Switch
|
|
745
|
+
:model-value="value.hidden ?? false"
|
|
746
|
+
@update:model-value="onHiddenChange"
|
|
747
|
+
/>
|
|
748
|
+
</div>
|
|
749
|
+
</Field>
|
|
715
750
|
</div>
|
|
716
751
|
</div>
|
|
717
752
|
</template>
|
|
@@ -9,6 +9,7 @@ import { useFormReadonly } from "../../../../form/utils/readonly";
|
|
|
9
9
|
import { getLocalizedText } from "../../../../../share/locale";
|
|
10
10
|
import { DATE_RANGE_PICKER_DEFAULT_FORMATS, DateRangePicker } from "../../../../ui/date-range-picker";
|
|
11
11
|
import { useFormState } from "../../../../form/utils/state";
|
|
12
|
+
import { JUSTIFY_CLASS } from "../../../utils/runtime";
|
|
12
13
|
defineOptions({ name: "ShwfedTableDateRangeInputRendererRuntime" });
|
|
13
14
|
const props = defineProps({
|
|
14
15
|
column: { type: null, required: true },
|
|
@@ -32,7 +33,6 @@ function evalBool(expression, label) {
|
|
|
32
33
|
return false;
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
|
-
const isHidden = computed(() => evalBool(props.column.hidden, "hidden"));
|
|
36
36
|
const isDisabled = computed(() => evalBool(props.column.disabled, "disabled"));
|
|
37
37
|
const formReadonly = useFormReadonly();
|
|
38
38
|
const isReadonly = computed(
|
|
@@ -44,6 +44,7 @@ const effectiveReadonly = computed(
|
|
|
44
44
|
const resolvedValueFormat = computed(
|
|
45
45
|
() => props.column.valueFormat ?? DATE_RANGE_PICKER_DEFAULT_FORMATS.daterange.value
|
|
46
46
|
);
|
|
47
|
+
const justifyClass = computed(() => JUSTIFY_CLASS[props.column.align ?? "left"] ?? JUSTIFY_CLASS.left);
|
|
47
48
|
const shortcuts = computed(() => {
|
|
48
49
|
const list = props.column.presets;
|
|
49
50
|
if (!list || list.length === 0) return void 0;
|
|
@@ -103,24 +104,20 @@ const readonlyText = computed(() => {
|
|
|
103
104
|
<template>
|
|
104
105
|
<!--
|
|
105
106
|
Row budget matches the editable input columns: 2px outer inset around a 28px
|
|
106
|
-
(`h-7`) control — total 32px. Every branch (
|
|
107
|
+
(`h-7`) control — total 32px. Every branch (readonly / editable) is
|
|
107
108
|
sized identically so rows do not jump when a CEL condition flips.
|
|
108
109
|
-->
|
|
109
110
|
<div class="p-[0.125rem] w-full">
|
|
110
|
-
<span
|
|
111
|
-
v-if="isHidden"
|
|
112
|
-
class="block h-7 w-full"
|
|
113
|
-
/>
|
|
114
111
|
<!--
|
|
115
112
|
Readonly empty state mirrors the other editable columns: a centered, faded,
|
|
116
113
|
non-selectable `-` so a readonly grid reads uniformly. A non-empty readonly
|
|
117
114
|
range keeps left-aligned dark text joined by `~`.
|
|
118
115
|
-->
|
|
119
116
|
<span
|
|
120
|
-
v-
|
|
117
|
+
v-if="effectiveReadonly"
|
|
121
118
|
:class="[
|
|
122
119
|
'flex items-center h-7 w-full px-2 text-[0.75rem] truncate',
|
|
123
|
-
readonlyText ? 'text-zinc-700' : 'justify-center font-mono text-zinc-300 select-none'
|
|
120
|
+
readonlyText ? ['text-zinc-700', justifyClass] : 'justify-center font-mono text-zinc-300 select-none'
|
|
124
121
|
]"
|
|
125
122
|
>
|
|
126
123
|
{{ readonlyText || "-" }}
|
|
@@ -21,6 +21,9 @@ export declare function presetSchema(configure: (env: Environment) => void): Sch
|
|
|
21
21
|
end: Schema.Schema<string, string, never>;
|
|
22
22
|
}>;
|
|
23
23
|
export declare function schema(configure: (env: Environment) => void): Schema.Struct<{
|
|
24
|
+
align: Schema.optionalWith<Schema.Literal<["left", "center", "right"]>, {
|
|
25
|
+
default: () => "left";
|
|
26
|
+
}>;
|
|
24
27
|
binding: Schema.Union<[Schema.filter<typeof Schema.String>, Schema.filter<Schema.Tuple2<Schema.filter<typeof Schema.String>, Schema.filter<typeof Schema.String>>>]>;
|
|
25
28
|
startPlaceholder: Schema.optional<Schema.TupleType<readonly [Schema.Struct<{
|
|
26
29
|
locale: Schema.Literal<["zh"]>;
|
|
@@ -36,7 +39,6 @@ export declare function schema(configure: (env: Environment) => void): Schema.St
|
|
|
36
39
|
locale: Schema.Literal<["ja", "en", "ko"]>;
|
|
37
40
|
message: Schema.SchemaClass<string, string, never>;
|
|
38
41
|
}>]>>;
|
|
39
|
-
hidden: Schema.optional<Schema.Schema<string, string, never>>;
|
|
40
42
|
disabled: Schema.optional<Schema.Schema<string, string, never>>;
|
|
41
43
|
readonly: Schema.optional<Schema.Schema<string, string, never>>;
|
|
42
44
|
derived: Schema.optional<Schema.Struct<{
|
|
@@ -77,6 +79,7 @@ export declare function schema(configure: (env: Environment) => void): Schema.St
|
|
|
77
79
|
locale: Schema.Literal<["ja", "en", "ko"]>;
|
|
78
80
|
message: Schema.SchemaClass<string, string, never>;
|
|
79
81
|
}>]>>;
|
|
82
|
+
hidden: Schema.optional<Schema.SchemaClass<boolean, boolean, never>>;
|
|
80
83
|
id: Schema.refine<string, typeof Schema.String>;
|
|
81
84
|
groupId: Schema.optional<typeof Schema.UUID>;
|
|
82
85
|
type: Schema.Literal<["com.shwfed.table.column.date-range-input"]>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
2
|
import { getProperty } from "dot-prop";
|
|
3
3
|
import { Locale } from "../../../../../share/locale.js";
|
|
4
|
-
import { CelRowAccess, derivedRowField, editableColumnFields, editableHeader } from "../../../utils/shared.js";
|
|
4
|
+
import { Align, CelRowAccess, derivedRowField, editableColumnFields, editableHeader } from "../../../utils/shared.js";
|
|
5
5
|
export const type = "com.shwfed.table.column.date-range-input";
|
|
6
6
|
export const compatibilityDate = "2026-06-22";
|
|
7
7
|
export const metadata = {
|
|
@@ -45,6 +45,7 @@ export function schema(configure) {
|
|
|
45
45
|
type: Schema.Literal(type),
|
|
46
46
|
compatibilityDate: Schema.Literal(compatibilityDate),
|
|
47
47
|
...editableColumnFields(),
|
|
48
|
+
align: Schema.optionalWith(Align.annotations({ title: "\u5BF9\u9F50" }), { default: () => "left" }),
|
|
48
49
|
// Swap the inherited single-string `binding` for the range union.
|
|
49
50
|
binding: bindingSchema,
|
|
50
51
|
startPlaceholder: Schema.optional(Locale.annotations({
|
|
@@ -55,10 +56,6 @@ export function schema(configure) {
|
|
|
55
56
|
title: "\u7ED3\u675F\u5360\u4F4D\u7B26",
|
|
56
57
|
description: "\u672A\u9009\u4E2D\u7ED3\u675F\u65E5\u671F\u65F6\u8F93\u5165\u6846\u4E2D\u7684\u5360\u4F4D\u6587\u672C"
|
|
57
58
|
})),
|
|
58
|
-
hidden: Schema.optional(CelBool.annotations({
|
|
59
|
-
title: "\u9690\u85CF\u6761\u4EF6",
|
|
60
|
-
description: "\u8FD4\u56DE `true` \u65F6\u8BE5\u884C\u7684\u8F93\u5165\u6846\u4E0D\u6E32\u67D3\uFF08\u5176\u4F59\u884C\u4E0D\u53D7\u5F71\u54CD\uFF09"
|
|
61
|
-
})),
|
|
62
59
|
disabled: Schema.optional(CelBool.annotations({
|
|
63
60
|
title: "\u7981\u7528\u6761\u4EF6",
|
|
64
61
|
description: "\u8FD4\u56DE `true` \u65F6\u8F93\u5165\u6846\u4ECD\u7136\u6E32\u67D3\u4F46\u4E0D\u53EF\u7F16\u8F91"
|
|
@@ -100,6 +100,34 @@ const { t, locale } = useI18n({
|
|
|
100
100
|
const inheritedContext = injectCELContext();
|
|
101
101
|
const containerRef = ref(null);
|
|
102
102
|
const appliedInitialStateKey = ref("");
|
|
103
|
+
const frozenGrowColumns = ref(/* @__PURE__ */ new Set());
|
|
104
|
+
function isEffectiveGrow(column) {
|
|
105
|
+
return !!column.columnDef.meta?.grow && !frozenGrowColumns.value.has(column.id);
|
|
106
|
+
}
|
|
107
|
+
function freezeGrowColumns() {
|
|
108
|
+
const grows = tableApi.getVisibleLeafColumns().filter(isEffectiveGrow);
|
|
109
|
+
if (grows.length === 0) return;
|
|
110
|
+
const measured = {};
|
|
111
|
+
for (const column of grows) {
|
|
112
|
+
const el = containerRef.value?.querySelector(`thead [data-col-id="${column.id}"]`);
|
|
113
|
+
if (el) measured[column.id] = el.offsetWidth;
|
|
114
|
+
}
|
|
115
|
+
tableApi.setColumnSizing((prev) => ({ ...prev, ...measured }));
|
|
116
|
+
const next = new Set(frozenGrowColumns.value);
|
|
117
|
+
grows.forEach((column) => next.add(column.id));
|
|
118
|
+
frozenGrowColumns.value = next;
|
|
119
|
+
}
|
|
120
|
+
function onResizeMouseDown(header, event) {
|
|
121
|
+
freezeGrowColumns();
|
|
122
|
+
header.getResizeHandler()(event);
|
|
123
|
+
}
|
|
124
|
+
function growLeafCount(header) {
|
|
125
|
+
return header.getLeafHeaders().filter((h2) => isEffectiveGrow(h2.column)).length;
|
|
126
|
+
}
|
|
127
|
+
function headerGrowStyle(header) {
|
|
128
|
+
const n = growLeafCount(header);
|
|
129
|
+
return n > 0 ? { flex: `${n} 1 auto` } : {};
|
|
130
|
+
}
|
|
103
131
|
const formReadonly = useFormReadonly();
|
|
104
132
|
function isHeaderReadonly(readonlyExpr) {
|
|
105
133
|
if (readonlyExpr == null) return formReadonly.value;
|
|
@@ -494,13 +522,19 @@ function getDisplayIndex(row) {
|
|
|
494
522
|
watch(config, (config2) => {
|
|
495
523
|
if (!config2) return;
|
|
496
524
|
const initialState = config2.initialState;
|
|
497
|
-
const
|
|
498
|
-
|
|
525
|
+
const hiddenSeed = {};
|
|
526
|
+
for (const col of config2.columns) {
|
|
527
|
+
if (col.hidden) hiddenSeed[col.id] = false;
|
|
528
|
+
}
|
|
529
|
+
const hasSeed = Object.keys(hiddenSeed).length > 0;
|
|
530
|
+
const effective = initialState || hasSeed ? { ...initialState ?? {}, columnVisibility: { ...hiddenSeed, ...initialState?.columnVisibility ?? {} } } : void 0;
|
|
531
|
+
const nextKey = effective ? JSON.stringify(effective) : "";
|
|
532
|
+
if (appliedInitialStateKey.value === nextKey || !effective) {
|
|
499
533
|
appliedInitialStateKey.value = nextKey;
|
|
500
534
|
syncPaginationPageSize();
|
|
501
535
|
return;
|
|
502
536
|
}
|
|
503
|
-
tableApi.initialState = mergeInitialState(tableApi.initialState,
|
|
537
|
+
tableApi.initialState = mergeInitialState(tableApi.initialState, effective);
|
|
504
538
|
tableApi.reset();
|
|
505
539
|
appliedInitialStateKey.value = nextKey;
|
|
506
540
|
syncPaginationPageSize();
|
|
@@ -712,8 +746,8 @@ export { TableConfig, createTableConfig, getColumnTechnicalKey } from "./schema"
|
|
|
712
746
|
v-for="header in group.headers"
|
|
713
747
|
:key="header.id"
|
|
714
748
|
:colspan="header.colSpan"
|
|
749
|
+
:data-col-id="header.column.id"
|
|
715
750
|
:class="[
|
|
716
|
-
header.column.columnDef.meta?.grow && 'flex-1',
|
|
717
751
|
'flex items-center gap-2 border-zinc-300 py-2 text-zinc-600',
|
|
718
752
|
'text-xs flex items-center justify-center relative',
|
|
719
753
|
'bg-[color-mix(in_srgb,var(--primary)_7%,white)] group',
|
|
@@ -722,7 +756,12 @@ export { TableConfig, createTableConfig, getColumnTechnicalKey } from "./schema"
|
|
|
722
756
|
shouldHaveLeftBorder(header.column) && 'border-l'
|
|
723
757
|
]"
|
|
724
758
|
:style="{
|
|
759
|
+
// Grow until first resize (see freezeGrowColumns): fill the
|
|
760
|
+
// remaining space, with `width` as the flex-basis so the
|
|
761
|
+
// configured size acts as a floor. Group headers grow by
|
|
762
|
+
// the count of grow leaves they span (see headerGrowStyle).
|
|
725
763
|
width: `${header.getSize()}px`,
|
|
764
|
+
...headerGrowStyle(header),
|
|
726
765
|
...pinnedStyle(header.column)
|
|
727
766
|
}"
|
|
728
767
|
>
|
|
@@ -816,7 +855,7 @@ export { TableConfig, createTableConfig, getColumnTechnicalKey } from "./schema"
|
|
|
816
855
|
'hover:opacity-100',
|
|
817
856
|
'cursor-col-resize'
|
|
818
857
|
]"
|
|
819
|
-
@mousedown="header
|
|
858
|
+
@mousedown="onResizeMouseDown(header, $event)"
|
|
820
859
|
>
|
|
821
860
|
<div class="w-2pt h-full translate-x-1pt transform-3d bg-[color-mix(in_srgb,var(--primary)_80%,white)]" />
|
|
822
861
|
</div>
|
|
@@ -875,7 +914,7 @@ export { TableConfig, createTableConfig, getColumnTechnicalKey } from "./schema"
|
|
|
875
914
|
:key="cell.id"
|
|
876
915
|
:class="[
|
|
877
916
|
'border-zinc-300',
|
|
878
|
-
cell.column
|
|
917
|
+
isEffectiveGrow(cell.column) && 'flex-[1_1_auto]',
|
|
879
918
|
cell.column.getIsPinned() && 'sticky z-15',
|
|
880
919
|
shouldHaveRightBorder(cell.column) && 'border-r',
|
|
881
920
|
shouldHaveLeftBorder(cell.column) && 'border-l'
|
|
@@ -908,7 +947,6 @@ export { TableConfig, createTableConfig, getColumnTechnicalKey } from "./schema"
|
|
|
908
947
|
:key="header.id"
|
|
909
948
|
:colspan="header.colSpan"
|
|
910
949
|
:class="[
|
|
911
|
-
header.column.columnDef.meta?.grow && 'flex-1',
|
|
912
950
|
'flex items-center gap-2 border-zinc-300 text-zinc-600 p-0',
|
|
913
951
|
'text-xs flex items-center justify-center relative',
|
|
914
952
|
'bg-[color-mix(in_srgb,var(--primary)_7%,white)] group',
|
|
@@ -918,6 +956,7 @@ export { TableConfig, createTableConfig, getColumnTechnicalKey } from "./schema"
|
|
|
918
956
|
]"
|
|
919
957
|
:style="{
|
|
920
958
|
width: `${header.getSize()}px`,
|
|
959
|
+
...headerGrowStyle(header),
|
|
921
960
|
...pinnedStyle(header.column)
|
|
922
961
|
}"
|
|
923
962
|
>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Effect as EffectType } from 'effect';
|
|
2
2
|
export declare const JUSTIFY_CLASS: Record<string, string>;
|
|
3
|
+
export declare const TEXT_ALIGN_CLASS: Record<string, string>;
|
|
3
4
|
type CelEvaluator = <T>(expression: string, context?: Record<string, unknown>) => EffectType.Effect<T, any>;
|
|
4
5
|
export declare function interpolateMarkdown(template: string, $cel: CelEvaluator, context: Record<string, unknown>): string;
|
|
5
6
|
export declare function evaluateMarkdown(template: string, $cel: CelEvaluator, context: Record<string, unknown>): string;
|
|
@@ -5,6 +5,11 @@ export const JUSTIFY_CLASS = {
|
|
|
5
5
|
center: "justify-center",
|
|
6
6
|
right: "justify-end"
|
|
7
7
|
};
|
|
8
|
+
export const TEXT_ALIGN_CLASS = {
|
|
9
|
+
left: "text-left",
|
|
10
|
+
center: "text-center",
|
|
11
|
+
right: "text-right"
|
|
12
|
+
};
|
|
8
13
|
const INTERPOLATION_RE = /\{\{(.*?)\}\}/gs;
|
|
9
14
|
function stringifyCelResult(value) {
|
|
10
15
|
if (value === null || value === void 0) return "";
|