vome-core 0.3.9 → 0.3.11
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/admin/api/client.js +9 -8
- package/dist/admin/components/ui/avatar/index.js +1 -1
- package/dist/admin/components/ui/badge/index.d.ts +1 -1
- package/dist/admin/components/ui/button/index.d.ts +1 -1
- package/dist/admin/components/ui/checkbox/index.js +1 -1
- package/dist/admin/components/ui/dialog/index.js +1 -1
- package/dist/admin/components/ui/dropdown-menu/index.js +1 -1
- package/dist/admin/components/ui/input/Input.vue +2 -1
- package/dist/admin/components/ui/input/index.js +1 -1
- package/dist/admin/components/ui/label/index.js +1 -1
- package/dist/admin/components/ui/scroll-area/index.js +1 -1
- package/dist/admin/components/ui/select/index.js +1 -1
- package/dist/admin/components/ui/separator/index.js +1 -1
- package/dist/admin/components/ui/sheet/index.js +1 -1
- package/dist/admin/components/ui/sonner/index.js +1 -1
- package/dist/admin/components/ui/table/index.js +1 -1
- package/dist/admin/components/ui/tabs/index.js +1 -1
- package/dist/admin/components/ui/tooltip/index.js +1 -1
- package/dist/admin/components/vm-aside.vue +8 -6
- package/dist/admin/components/vm-auto-perm-dialog.vue +12 -11
- package/dist/admin/components/vm-check-tree.vue +3 -2
- package/dist/admin/components/vm-dept-tree.vue +32 -31
- package/dist/admin/components/vm-empty.vue +16 -2
- package/dist/admin/components/vm-eps-perm-picker.vue +3 -2
- package/dist/admin/components/vm-form-dialog.vue +4 -3
- package/dist/admin/components/vm-group-cascader.vue +5 -4
- package/dist/admin/components/vm-icon-picker.vue +24 -15
- package/dist/admin/components/vm-inline-search.vue +3 -2
- package/dist/admin/components/vm-loading.vue +4 -3
- package/dist/admin/components/vm-markdown.vue +6 -5
- package/dist/admin/components/vm-role-picker.vue +6 -5
- package/dist/admin/components/vm-view-path-picker.vue +3 -2
- package/dist/admin/crud/auto-fields.js +1 -1
- package/dist/admin/crud/components/vm-avatar.vue +2 -1
- package/dist/admin/crud/components/vm-color-picker.vue +8 -8
- package/dist/admin/crud/components/vm-column-custom.vue +6 -5
- package/dist/admin/crud/components/vm-copy-btn.vue +4 -3
- package/dist/admin/crud/components/vm-date-calendar-panel.vue +30 -27
- package/dist/admin/crud/components/vm-date-picker.vue +6 -5
- package/dist/admin/crud/components/vm-date-range.vue +5 -4
- package/dist/admin/crud/components/vm-datetime-field.vue +4 -3
- package/dist/admin/crud/components/vm-json-code.vue +3 -2
- package/dist/admin/crud/components/vm-json-editor.vue +3 -2
- package/dist/admin/crud/components/vm-json-kv-editor.vue +13 -12
- package/dist/admin/crud/components/vm-multi-select.vue +5 -4
- package/dist/admin/crud/components/vm-number-range.vue +5 -4
- package/dist/admin/crud/components/vm-preview-viewer.vue +33 -29
- package/dist/admin/crud/components/vm-richtext-extensions.js +1 -1
- package/dist/admin/crud/components/vm-richtext.vue +33 -30
- package/dist/admin/crud/components/vm-select.vue +4 -3
- package/dist/admin/crud/components/vm-status-tag.vue +2 -1
- package/dist/admin/crud/components/vm-switch.vue +5 -4
- package/dist/admin/crud/components/vm-text-link.vue +3 -2
- package/dist/admin/crud/components/vm-tree-select.vue +3 -2
- package/dist/admin/crud/components/vm-upload-item.vue +6 -4
- package/dist/admin/crud/components/vm-upload.vue +6 -5
- package/dist/admin/crud/config.js +1 -1
- package/dist/admin/crud/confirm.js +1 -1
- package/dist/admin/crud/crud-page-request.js +1 -1
- package/dist/admin/crud/data-i18n.js +1 -1
- package/dist/admin/crud/dict.d.ts +1 -1
- package/dist/admin/crud/dict.js +1 -1
- package/dist/admin/crud/export-fetch.js +1 -1
- package/dist/admin/crud/key.js +1 -1
- package/dist/admin/crud/plugins.js +1 -1
- package/dist/admin/crud/span.js +1 -1
- package/dist/admin/crud/style.js +1 -1
- package/dist/admin/crud/validate.js +1 -1
- package/dist/admin/crud/vm-crud.vue +15 -15
- package/dist/admin/crud/vm-data-i18n-btn.vue +1 -1
- package/dist/admin/crud/vm-export-btn.vue +7 -7
- package/dist/admin/crud/vm-import-btn.vue +33 -27
- package/dist/admin/crud/vm-table.vue +7 -2
- package/dist/admin/crud/vm-upsert.vue +1 -0
- package/dist/admin/directives/perm.js +1 -1
- package/dist/admin/hooks/useUpload.js +1 -1
- package/dist/admin/lib/browser.js +1 -1
- package/dist/admin/lib/cn.js +1 -1
- package/dist/admin/lib/dialog-float.js +1 -1
- package/dist/admin/lib/export-excel.js +1 -1
- package/dist/admin/lib/file-preview.js +8 -6
- package/dist/admin/lib/import-excel.js +1 -1
- package/dist/admin/lib/json.d.ts +0 -1
- package/dist/admin/lib/json.js +1 -1
- package/dist/admin/lib/menu.js +1 -1
- package/dist/admin/lib/micro-locale.js +1 -1
- package/dist/admin/lib/micro-theme.js +1 -1
- package/dist/admin/lib/shell.js +1 -1
- package/dist/admin/lib/theme-color-options.d.ts +1 -2
- package/dist/admin/lib/theme-color-options.js +1 -1
- package/dist/admin/lib/tree.js +1 -1
- package/dist/admin/lib/upload.d.ts +5 -0
- package/dist/admin/lib/upload.js +1 -1
- package/dist/admin/lib/video-frame.js +1 -1
- package/dist/admin/router/create.js +1 -1
- package/dist/admin/router/guards.js +1 -1
- package/dist/ai/index.js +1 -1
- package/dist/client/ai-model-registry.js +1 -1
- package/dist/client/base.js +1 -1
- package/dist/client/configure.js +1 -1
- package/dist/client/dict.js +1 -1
- package/dist/client/eps-payload.js +1 -1
- package/dist/client/eps.js +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/locale-store.js +1 -1
- package/dist/client/service.js +1 -1
- package/dist/client/vite-admin.js +1 -1
- package/dist/client/vite-auto-import.js +1 -1
- package/dist/client/vite-micro-proxy.js +1 -1
- package/dist/client/vite-plugin-eps.js +1 -1
- package/dist/client/vite-resolve.js +1 -1
- package/dist/config/index.js +1 -1
- package/dist/index.js +1 -1
- package/dist/server/index.js +1 -1
- package/dist/shared/datetime-picker.js +1 -1
- package/dist/shared/excel.js +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/locale-json.js +1 -1
- package/dist/shared/tree.js +1 -1
- package/package.json +1 -1
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
</template>
|
|
26
26
|
|
|
27
27
|
<script setup lang="ts">
|
|
28
|
+
import { crudLabel } from '../style'
|
|
28
29
|
import { computed, ref } from 'vue'
|
|
29
30
|
import VmPreviewViewer from './vm-preview-viewer.vue'
|
|
30
31
|
|
|
@@ -59,7 +60,7 @@ const displayName = computed(() => {
|
|
|
59
60
|
|
|
60
61
|
const fallbackText = computed(() => displayName.value.slice(0, 1).toUpperCase())
|
|
61
62
|
|
|
62
|
-
const title = computed(() => displayName.value || '
|
|
63
|
+
const title = computed(() => displayName.value || crudLabel('avatar'))
|
|
63
64
|
const boxStyle = computed(() => ({
|
|
64
65
|
width: `${props.size}px`,
|
|
65
66
|
height: `${props.size}px`,
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
type="button"
|
|
10
10
|
class="vm-color-picker__swatch"
|
|
11
11
|
:disabled="disabled"
|
|
12
|
-
:title="disabled ? undefined : '
|
|
12
|
+
:title="disabled ? undefined : crudLabel('pickColor')"
|
|
13
13
|
@click="toggle"
|
|
14
14
|
>
|
|
15
15
|
<span
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
role="tab"
|
|
62
62
|
@click="panelMode = 'theme'"
|
|
63
63
|
>
|
|
64
|
-
|
|
64
|
+
{{ crudLabel('theme') }}
|
|
65
65
|
</button>
|
|
66
66
|
<button
|
|
67
67
|
type="button"
|
|
@@ -70,15 +70,15 @@
|
|
|
70
70
|
role="tab"
|
|
71
71
|
@click="panelMode = 'picker'"
|
|
72
72
|
>
|
|
73
|
-
|
|
73
|
+
{{ crudLabel('colorPickerTab') }}
|
|
74
74
|
</button>
|
|
75
75
|
</div>
|
|
76
76
|
<span v-else class="vm-color-picker__toolbar-spacer" />
|
|
77
77
|
<button
|
|
78
78
|
type="button"
|
|
79
79
|
class="vm-color-picker__close"
|
|
80
|
-
title="
|
|
81
|
-
aria-label="
|
|
80
|
+
:title="crudLabel('dismiss')"
|
|
81
|
+
:aria-label="crudLabel('dismiss')"
|
|
82
82
|
@click="closePanel"
|
|
83
83
|
>
|
|
84
84
|
<svg viewBox="0 0 24 24" width="16" height="16" aria-hidden="true">
|
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
v-if="hasEyeDropper"
|
|
129
129
|
type="button"
|
|
130
130
|
class="vm-color-picker__eyedropper"
|
|
131
|
-
title="
|
|
131
|
+
:title="crudLabel('eyedropper')"
|
|
132
132
|
@click="pickEyeDropper"
|
|
133
133
|
>
|
|
134
134
|
<!-- 内联 SVG:不依赖 remixicon 字体是否已加载 -->
|
|
@@ -179,7 +179,7 @@
|
|
|
179
179
|
type="button"
|
|
180
180
|
class="vm-color-picker__format"
|
|
181
181
|
:class="{ 'is-open': formatOpen }"
|
|
182
|
-
title="
|
|
182
|
+
:title="crudLabel('colorFormat')"
|
|
183
183
|
@click.stop="toggleFormatMenu"
|
|
184
184
|
>
|
|
185
185
|
{{ formatLabel }}
|
|
@@ -247,7 +247,7 @@ import {
|
|
|
247
247
|
resolveCssThemeColorOptions,
|
|
248
248
|
type VmColorThemeOption,
|
|
249
249
|
} from '../../lib/theme-color-options'
|
|
250
|
-
import { getCrudConfig } from '../style'
|
|
250
|
+
import { crudLabel, getCrudConfig } from '../style'
|
|
251
251
|
|
|
252
252
|
defineOptions({ name: 'vm-color-picker' })
|
|
253
253
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div>
|
|
3
3
|
<Button size="sm" variant="outline" class="h-8" @click="open = true">
|
|
4
|
-
|
|
4
|
+
{{ crudLabel('customColumns') }}
|
|
5
5
|
</Button>
|
|
6
6
|
<Dialog :open="open" @update:open="onOpenChange">
|
|
7
7
|
<DialogContent
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
@interact-outside="preventDialogOutsideClose"
|
|
13
13
|
>
|
|
14
14
|
<DialogHeader class="vm-crud-shell__head">
|
|
15
|
-
<DialogTitle class="vm-crud-shell__title"
|
|
15
|
+
<DialogTitle class="vm-crud-shell__title">{{ crudLabel('customColumns') }}</DialogTitle>
|
|
16
16
|
</DialogHeader>
|
|
17
17
|
<div class="vm-crud-shell__body">
|
|
18
18
|
<div class="vm-col-custom">
|
|
@@ -38,13 +38,13 @@
|
|
|
38
38
|
</div>
|
|
39
39
|
<DialogFooter class="vm-crud-shell__foot">
|
|
40
40
|
<button type="button" class="vm-crud-shell__btn is-ghost" @click="open = false">
|
|
41
|
-
|
|
41
|
+
{{ crudLabel('close') }}
|
|
42
42
|
</button>
|
|
43
43
|
<button type="button" class="vm-crud-shell__btn is-danger" @click="reset">
|
|
44
|
-
|
|
44
|
+
{{ crudLabel('reset') }}
|
|
45
45
|
</button>
|
|
46
46
|
<button type="button" class="vm-crud-shell__btn is-primary" @click="save">
|
|
47
|
-
|
|
47
|
+
{{ crudLabel('save') }}
|
|
48
48
|
</button>
|
|
49
49
|
</DialogFooter>
|
|
50
50
|
</DialogContent>
|
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
</template>
|
|
54
54
|
|
|
55
55
|
<script setup lang="ts">
|
|
56
|
+
import { crudLabel } from '../style'
|
|
56
57
|
import { ref, watch, inject } from 'vue'
|
|
57
58
|
import { preventDialogOutsideClose } from '../../lib/dialog-float'
|
|
58
59
|
import { injectTableOptions, TABLE_API_KEY } from '../key'
|
|
@@ -7,11 +7,12 @@
|
|
|
7
7
|
@click="copy"
|
|
8
8
|
>
|
|
9
9
|
<i :class="copying ? 'ri-loader-4-line is-spin' : icon" aria-hidden="true" />
|
|
10
|
-
<span>{{ copying ? copyingText : label }}</span>
|
|
10
|
+
<span>{{ copying ? (copyingText ?? crudLabel('copying')) : (label ?? crudLabel('copy')) }}</span>
|
|
11
11
|
</button>
|
|
12
12
|
</template>
|
|
13
13
|
|
|
14
14
|
<script setup lang="ts">
|
|
15
|
+
import { crudLabel } from '../style'
|
|
15
16
|
import { ref } from 'vue'
|
|
16
17
|
|
|
17
18
|
defineOptions({ name: 'vm-copy-btn' })
|
|
@@ -26,8 +27,8 @@ const props = withDefaults(
|
|
|
26
27
|
disabled?: boolean
|
|
27
28
|
}>(),
|
|
28
29
|
{
|
|
29
|
-
label:
|
|
30
|
-
copyingText:
|
|
30
|
+
label: undefined,
|
|
31
|
+
copyingText: undefined,
|
|
31
32
|
icon: 'ri-file-copy-line',
|
|
32
33
|
size: 'md',
|
|
33
34
|
disabled: false,
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
/>
|
|
11
11
|
</button>
|
|
12
12
|
<div class="vm-dt-cal__nav">
|
|
13
|
-
<button type="button" class="vm-dt-cal__nav-btn" title="
|
|
13
|
+
<button type="button" class="vm-dt-cal__nav-btn" :title="crudLabel('prevPage')" @click="prevPage">
|
|
14
14
|
<i class="ri-arrow-up-s-line" aria-hidden="true" />
|
|
15
15
|
</button>
|
|
16
|
-
<button type="button" class="vm-dt-cal__nav-btn" title="
|
|
16
|
+
<button type="button" class="vm-dt-cal__nav-btn" :title="crudLabel('nextPage')" @click="nextPage">
|
|
17
17
|
<i class="ri-arrow-down-s-line" aria-hidden="true" />
|
|
18
18
|
</button>
|
|
19
19
|
</div>
|
|
@@ -88,14 +88,15 @@
|
|
|
88
88
|
</div>
|
|
89
89
|
|
|
90
90
|
<footer class="vm-dt-cal__foot">
|
|
91
|
-
<button type="button" class="vm-dt-cal__link" @click="emit('clear')"
|
|
92
|
-
<button type="button" class="vm-dt-cal__link" @click="pickToday"
|
|
91
|
+
<button type="button" class="vm-dt-cal__link" @click="emit('clear')">{{ crudLabel('clear') }}</button>
|
|
92
|
+
<button type="button" class="vm-dt-cal__link" @click="pickToday">{{ crudLabel('today') }}</button>
|
|
93
93
|
</footer>
|
|
94
94
|
</div>
|
|
95
95
|
</template>
|
|
96
96
|
|
|
97
97
|
<script setup lang="ts">
|
|
98
98
|
import { computed, reactive, ref, watch } from 'vue'
|
|
99
|
+
import { crudFormat, crudLabel } from '../style'
|
|
99
100
|
import {
|
|
100
101
|
buildMonthGrid,
|
|
101
102
|
clampTimePart,
|
|
@@ -125,26 +126,23 @@ const emit = defineEmits<{
|
|
|
125
126
|
|
|
126
127
|
const precision = computed(() => normalizeDateTimePrecision(props.precision))
|
|
127
128
|
const isDatetime = computed(() => precision.value === 'datetime')
|
|
128
|
-
const weekdays =
|
|
129
|
-
|
|
130
|
-
'
|
|
131
|
-
'
|
|
132
|
-
'
|
|
133
|
-
'
|
|
134
|
-
'
|
|
135
|
-
'
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
'
|
|
142
|
-
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
{ key: 'm' as const, label: '分', max: 59 },
|
|
146
|
-
{ key: 's' as const, label: '秒', max: 59 },
|
|
147
|
-
]
|
|
129
|
+
const weekdays = computed(() => [
|
|
130
|
+
crudLabel('weekdaySun'),
|
|
131
|
+
crudLabel('weekdayMon'),
|
|
132
|
+
crudLabel('weekdayTue'),
|
|
133
|
+
crudLabel('weekdayWed'),
|
|
134
|
+
crudLabel('weekdayThu'),
|
|
135
|
+
crudLabel('weekdayFri'),
|
|
136
|
+
crudLabel('weekdaySat'),
|
|
137
|
+
])
|
|
138
|
+
const monthLabels = computed(() =>
|
|
139
|
+
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].map((n) => crudLabel(`month${n}`)),
|
|
140
|
+
)
|
|
141
|
+
const timeFields = computed(() => [
|
|
142
|
+
{ key: 'h' as const, label: crudLabel('hour'), max: 23 },
|
|
143
|
+
{ key: 'm' as const, label: crudLabel('minute'), max: 59 },
|
|
144
|
+
{ key: 's' as const, label: crudLabel('second'), max: 59 },
|
|
145
|
+
])
|
|
148
146
|
|
|
149
147
|
type PanelView = 'date' | 'month' | 'year'
|
|
150
148
|
const view = ref<PanelView>('date')
|
|
@@ -179,9 +177,14 @@ const yearCells = computed(() =>
|
|
|
179
177
|
)
|
|
180
178
|
|
|
181
179
|
const headTitle = computed(() => {
|
|
182
|
-
if (view.value === 'year')
|
|
183
|
-
|
|
184
|
-
|
|
180
|
+
if (view.value === 'year')
|
|
181
|
+
return crudFormat(crudLabel('yearRange'), yearStart.value, yearStart.value + 11)
|
|
182
|
+
if (view.value === 'month') return crudFormat(crudLabel('yearLabel'), viewYear.value)
|
|
183
|
+
return crudFormat(
|
|
184
|
+
crudLabel('yearMonth'),
|
|
185
|
+
viewYear.value,
|
|
186
|
+
String(viewMonth.value + 1).padStart(2, '0'),
|
|
187
|
+
)
|
|
185
188
|
})
|
|
186
189
|
|
|
187
190
|
function currentTime() {
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
</template>
|
|
11
11
|
|
|
12
12
|
<script setup lang="ts">
|
|
13
|
+
import { crudLabel } from '../style'
|
|
13
14
|
import { computed } from 'vue'
|
|
14
15
|
import { useCrud } from '../useCrud'
|
|
15
16
|
import VmDatetimeField from './vm-datetime-field.vue'
|
|
@@ -49,10 +50,10 @@ const TYPE_PRECISION: Record<string, DateTimePrecision> = {
|
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
const TYPE_PLACEHOLDER: Record<string, string> = {
|
|
52
|
-
date: '
|
|
53
|
-
datetime: '
|
|
54
|
-
month: '
|
|
55
|
-
year: '
|
|
53
|
+
date: 'pickDate',
|
|
54
|
+
datetime: 'pickDateTime',
|
|
55
|
+
month: 'pickMonth',
|
|
56
|
+
year: 'pickYear',
|
|
56
57
|
}
|
|
57
58
|
|
|
58
59
|
const precision = computed(
|
|
@@ -60,7 +61,7 @@ const precision = computed(
|
|
|
60
61
|
)
|
|
61
62
|
|
|
62
63
|
const placeholderText = computed(
|
|
63
|
-
() => props.placeholder || TYPE_PLACEHOLDER[props.type] || '
|
|
64
|
+
() => props.placeholder || crudLabel(TYPE_PLACEHOLDER[props.type] || 'pickDate'),
|
|
64
65
|
)
|
|
65
66
|
|
|
66
67
|
function onUpdate(v: string | null) {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
class="vm-date-range__field"
|
|
5
5
|
:model-value="modelValue?.[0] ?? null"
|
|
6
6
|
:precision="precision"
|
|
7
|
-
:placeholder="startPlaceholder"
|
|
7
|
+
:placeholder="startPlaceholder ?? crudLabel('startTime')"
|
|
8
8
|
:disabled="disabled"
|
|
9
9
|
@update:model-value="(v) => set(0, v)"
|
|
10
10
|
/>
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
class="vm-date-range__field"
|
|
14
14
|
:model-value="modelValue?.[1] ?? null"
|
|
15
15
|
:precision="precision"
|
|
16
|
-
:placeholder="endPlaceholder"
|
|
16
|
+
:placeholder="endPlaceholder ?? crudLabel('endTime')"
|
|
17
17
|
:disabled="disabled"
|
|
18
18
|
@update:model-value="(v) => set(1, v)"
|
|
19
19
|
/>
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
</template>
|
|
22
22
|
|
|
23
23
|
<script setup lang="ts">
|
|
24
|
+
import { crudLabel } from '../style'
|
|
24
25
|
import VmDatetimeField from './vm-datetime-field.vue'
|
|
25
26
|
import type { DateTimePrecision } from '../../../shared/datetime-picker'
|
|
26
27
|
|
|
@@ -37,8 +38,8 @@ const props = withDefaults(
|
|
|
37
38
|
}>(),
|
|
38
39
|
{
|
|
39
40
|
precision: 'day',
|
|
40
|
-
startPlaceholder:
|
|
41
|
-
endPlaceholder:
|
|
41
|
+
startPlaceholder: undefined,
|
|
42
|
+
endPlaceholder: undefined,
|
|
42
43
|
},
|
|
43
44
|
)
|
|
44
45
|
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
@click="onRootClick"
|
|
7
7
|
>
|
|
8
8
|
<div class="vm-dt-field__box">
|
|
9
|
-
<span v-if="!displayText
|
|
10
|
-
placeholder
|
|
9
|
+
<span v-if="!displayText" class="vm-dt-field__ph">{{
|
|
10
|
+
placeholder ?? crudLabel('pickDateTime')
|
|
11
11
|
}}</span>
|
|
12
12
|
<span class="vm-dt-field__val">{{ displayText }}</span>
|
|
13
13
|
</div>
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
</template>
|
|
43
43
|
|
|
44
44
|
<script setup lang="ts">
|
|
45
|
+
import { crudLabel } from '../style'
|
|
45
46
|
import { computed, onBeforeUnmount, onMounted, ref } from 'vue'
|
|
46
47
|
import { FocusScope } from 'reka-ui'
|
|
47
48
|
import VmDateCalendarPanel from './vm-date-calendar-panel.vue'
|
|
@@ -64,7 +65,7 @@ const props = withDefaults(
|
|
|
64
65
|
{
|
|
65
66
|
modelValue: null,
|
|
66
67
|
precision: 'day',
|
|
67
|
-
placeholder:
|
|
68
|
+
placeholder: undefined,
|
|
68
69
|
disabled: false,
|
|
69
70
|
},
|
|
70
71
|
)
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
</template>
|
|
4
4
|
|
|
5
5
|
<script setup lang="ts">
|
|
6
|
+
import { crudLabel } from '../style'
|
|
6
7
|
import { computed } from 'vue'
|
|
7
8
|
import { prettyJson } from '../../lib/json'
|
|
8
9
|
|
|
@@ -14,11 +15,11 @@ const props = withDefaults(
|
|
|
14
15
|
empty?: string
|
|
15
16
|
}>(),
|
|
16
17
|
{
|
|
17
|
-
empty:
|
|
18
|
+
empty: undefined,
|
|
18
19
|
},
|
|
19
20
|
)
|
|
20
21
|
|
|
21
|
-
const body = computed(() => prettyJson(props.modelValue, props.empty))
|
|
22
|
+
const body = computed(() => prettyJson(props.modelValue, props.empty ?? crudLabel('jsonEmpty')))
|
|
22
23
|
</script>
|
|
23
24
|
|
|
24
25
|
<style lang="scss" scoped>
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
:class="{ 'is-error': Boolean(error) }"
|
|
6
6
|
:value="inner"
|
|
7
7
|
:disabled="disabled"
|
|
8
|
-
:placeholder="placeholder"
|
|
8
|
+
:placeholder="placeholder ?? crudLabel('jsonPlaceholder')"
|
|
9
9
|
:rows="fill ? undefined : rows"
|
|
10
10
|
@input="onInput"
|
|
11
11
|
@blur="validate"
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
</template>
|
|
16
16
|
|
|
17
17
|
<script setup lang="ts">
|
|
18
|
+
import { crudLabel } from '../style'
|
|
18
19
|
import { ref, watch } from 'vue'
|
|
19
20
|
import { parseJsonInput, prettyJson, textOfJson } from '../../lib/json'
|
|
20
21
|
|
|
@@ -32,7 +33,7 @@ const props = withDefaults(
|
|
|
32
33
|
fill?: boolean
|
|
33
34
|
}>(),
|
|
34
35
|
{
|
|
35
|
-
placeholder:
|
|
36
|
+
placeholder: undefined,
|
|
36
37
|
rows: 8,
|
|
37
38
|
formatOnBlur: true,
|
|
38
39
|
fill: false,
|
|
@@ -25,14 +25,14 @@
|
|
|
25
25
|
:filterable="false"
|
|
26
26
|
:refresh-on-change="false"
|
|
27
27
|
width="110px"
|
|
28
|
-
placeholder="
|
|
28
|
+
:placeholder="crudLabel('jsonType')"
|
|
29
29
|
@update:model-value="(v) => onKindChange(index, String(v))"
|
|
30
30
|
/>
|
|
31
31
|
<input
|
|
32
32
|
v-if="row.valueKind === 'string' || row.valueKind === 'number'"
|
|
33
33
|
class="vm-json-kv__value"
|
|
34
34
|
:value="row.stringValue"
|
|
35
|
-
:placeholder="row.valueKind === 'number' ? '
|
|
35
|
+
:placeholder="row.valueKind === 'number' ? crudLabel('jsonNumber') : 'value'"
|
|
36
36
|
:type="row.valueKind === 'number' ? 'number' : 'text'"
|
|
37
37
|
@input="
|
|
38
38
|
patchRow(index, {
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
@update:model-value="(v) => patchRow(index, { stringValue: String(v) })"
|
|
52
52
|
/>
|
|
53
53
|
<div v-else class="vm-json-kv__value-spacer" />
|
|
54
|
-
<div class="vm-json-kv__app" title="
|
|
54
|
+
<div class="vm-json-kv__app" :title="crudLabel('openToApp')">
|
|
55
55
|
<vm-switch
|
|
56
56
|
:model-value="row.openToApp"
|
|
57
57
|
:active-value="true"
|
|
@@ -62,13 +62,13 @@
|
|
|
62
62
|
<vm-icon-btn
|
|
63
63
|
v-if="row.valueKind === 'object'"
|
|
64
64
|
icon="ri-add-line"
|
|
65
|
-
title="
|
|
65
|
+
:title="crudLabel('addChildKv')"
|
|
66
66
|
size="sm"
|
|
67
67
|
@click="addChild(index)"
|
|
68
68
|
/>
|
|
69
69
|
<vm-icon-btn
|
|
70
70
|
icon="ri-delete-bin-line"
|
|
71
|
-
title="
|
|
71
|
+
:title="crudLabel('delete')"
|
|
72
72
|
size="sm"
|
|
73
73
|
variant="danger"
|
|
74
74
|
@click="removeRow(index)"
|
|
@@ -87,6 +87,7 @@
|
|
|
87
87
|
</template>
|
|
88
88
|
|
|
89
89
|
<script setup lang="ts">
|
|
90
|
+
import { crudLabel } from '../style'
|
|
90
91
|
import { computed, toValue, type MaybeRefOrGetter } from 'vue'
|
|
91
92
|
import type { JsonKvNode, JsonValueKind } from '../json-kv'
|
|
92
93
|
import VmSelect from './vm-select.vue'
|
|
@@ -109,17 +110,17 @@ const emit = defineEmits<{
|
|
|
109
110
|
'update:modelValue': [JsonKvNode[]]
|
|
110
111
|
}>()
|
|
111
112
|
|
|
112
|
-
const defaultKindOptions = [
|
|
113
|
-
{ label: '
|
|
114
|
-
{ label: '
|
|
115
|
-
{ label: '
|
|
116
|
-
{ label: '
|
|
117
|
-
]
|
|
113
|
+
const defaultKindOptions = computed(() => [
|
|
114
|
+
{ label: crudLabel('jsonText'), value: 'string' },
|
|
115
|
+
{ label: crudLabel('jsonNumber'), value: 'number' },
|
|
116
|
+
{ label: crudLabel('jsonBoolean'), value: 'boolean' },
|
|
117
|
+
{ label: crudLabel('jsonObject'), value: 'object' },
|
|
118
|
+
])
|
|
118
119
|
|
|
119
120
|
/** 平铺为 label/value;不走索引搜索(filterable=false) */
|
|
120
121
|
const kindOptions = computed(() => {
|
|
121
122
|
const list = toValue(props.kindOptions)
|
|
122
|
-
const raw = list?.length ? list : defaultKindOptions
|
|
123
|
+
const raw = list?.length ? list : defaultKindOptions.value
|
|
123
124
|
return raw.map((opt) => ({
|
|
124
125
|
label: String(opt.label ?? opt.name ?? opt.value ?? ''),
|
|
125
126
|
value: opt.value as string | number,
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
/>
|
|
45
45
|
<span>{{ opt.label }}</span>
|
|
46
46
|
</label>
|
|
47
|
-
<div v-if="!options.length" class="vm-multi-select__empty"
|
|
47
|
+
<div v-if="!options.length" class="vm-multi-select__empty">{{ crudLabel('noOptions') }}</div>
|
|
48
48
|
</div>
|
|
49
49
|
</FocusScope>
|
|
50
50
|
</Teleport>
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
</template>
|
|
53
53
|
|
|
54
54
|
<script setup lang="ts">
|
|
55
|
+
import { crudFormat, crudLabel } from '../style'
|
|
55
56
|
import { ref, computed, nextTick, onMounted, onUnmounted } from 'vue'
|
|
56
57
|
import { FocusScope } from 'reka-ui'
|
|
57
58
|
import { POPUP_TRIGGER_GAP } from '../../lib/dialog-float'
|
|
@@ -69,7 +70,7 @@ const props = withDefaults(
|
|
|
69
70
|
{
|
|
70
71
|
modelValue: () => [],
|
|
71
72
|
options: () => [],
|
|
72
|
-
placeholder:
|
|
73
|
+
placeholder: undefined,
|
|
73
74
|
},
|
|
74
75
|
)
|
|
75
76
|
|
|
@@ -96,13 +97,13 @@ function normalizeMulti(
|
|
|
96
97
|
const selected = computed(() => normalizeMulti(props.modelValue))
|
|
97
98
|
|
|
98
99
|
const triggerText = computed(() => {
|
|
99
|
-
if (!selected.value.length) return props.placeholder
|
|
100
|
+
if (!selected.value.length) return props.placeholder ?? crudLabel('pleaseSelect')
|
|
100
101
|
const labels = selected.value.map((v) => {
|
|
101
102
|
const hit = props.options.find((o) => String(o.value) === String(v))
|
|
102
103
|
return hit?.label ?? String(v)
|
|
103
104
|
})
|
|
104
105
|
if (labels.length <= 2) return labels.join('、')
|
|
105
|
-
return
|
|
106
|
+
return crudFormat(crudLabel('selectedCount'), labels.length)
|
|
106
107
|
})
|
|
107
108
|
|
|
108
109
|
function isChecked(v: string | number | boolean) {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
class="vm-number-range__input"
|
|
6
6
|
:type="mode === 'float' ? 'text' : 'number'"
|
|
7
7
|
inputmode="decimal"
|
|
8
|
-
:placeholder="startPlaceholder"
|
|
8
|
+
:placeholder="startPlaceholder ?? crudLabel('min')"
|
|
9
9
|
:disabled="disabled"
|
|
10
10
|
:value="display(0)"
|
|
11
11
|
@input="(e) => onInput(0, e)"
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
class="vm-number-range__input"
|
|
20
20
|
:type="mode === 'float' ? 'text' : 'number'"
|
|
21
21
|
inputmode="decimal"
|
|
22
|
-
:placeholder="endPlaceholder"
|
|
22
|
+
:placeholder="endPlaceholder ?? crudLabel('max')"
|
|
23
23
|
:disabled="disabled"
|
|
24
24
|
:value="display(1)"
|
|
25
25
|
@input="(e) => onInput(1, e)"
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
</template>
|
|
32
32
|
|
|
33
33
|
<script setup lang="ts">
|
|
34
|
+
import { crudLabel } from '../style'
|
|
34
35
|
defineOptions({ name: 'vm-number-range' })
|
|
35
36
|
|
|
36
37
|
const props = withDefaults(
|
|
@@ -44,8 +45,8 @@ const props = withDefaults(
|
|
|
44
45
|
}>(),
|
|
45
46
|
{
|
|
46
47
|
mode: 'int',
|
|
47
|
-
startPlaceholder:
|
|
48
|
-
endPlaceholder:
|
|
48
|
+
startPlaceholder: undefined,
|
|
49
|
+
endPlaceholder: undefined,
|
|
49
50
|
},
|
|
50
51
|
)
|
|
51
52
|
|