vome-core 0.3.8 → 0.3.10
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/components/ui/avatar/index.js +1 -1
- package/dist/admin/components/ui/checkbox/index.js +1 -1
- package/dist/admin/components/ui/dialog/DialogContent.vue +132 -0
- 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 +12 -0
- 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/SelectItem.vue +9 -0
- package/dist/admin/components/ui/select/SelectTrigger.vue +11 -0
- 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-dept-tree.vue +79 -74
- package/dist/admin/components/vm-form-dialog.vue +630 -0
- package/dist/admin/crud/auto-fields.js +1 -1
- package/dist/admin/crud/components/vm-richtext-extensions.js +1 -1
- 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.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/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/import-excel.js +1 -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.js +1 -1
- package/dist/admin/lib/tree.js +1 -1
- 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/admin/styles/base.css +2 -152
- 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
|
@@ -69,42 +69,22 @@
|
|
|
69
69
|
</div>
|
|
70
70
|
</vm-aside>
|
|
71
71
|
|
|
72
|
-
<
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
<Label>上级部门</Label>
|
|
80
|
-
<Input :model-value="parentName" disabled />
|
|
81
|
-
</div>
|
|
82
|
-
<div class="vm-dept-tree__field">
|
|
83
|
-
<Label>名称 <span class="vm-dept-tree__req">*</span></Label>
|
|
84
|
-
<Input v-model="form.name" placeholder="部门名称" />
|
|
85
|
-
</div>
|
|
86
|
-
<div class="vm-dept-tree__field">
|
|
87
|
-
<Label>排序</Label>
|
|
88
|
-
<Input v-model="form.orderNum" type="number" placeholder="0" />
|
|
89
|
-
</div>
|
|
90
|
-
</div>
|
|
91
|
-
<DialogFooter>
|
|
92
|
-
<Button variant="outline" :disabled="submitting" @click="formOpen = false">
|
|
93
|
-
取消
|
|
94
|
-
</Button>
|
|
95
|
-
<Button :disabled="submitting" @click="submitForm">
|
|
96
|
-
{{ submitting ? '保存中…' : '确定' }}
|
|
97
|
-
</Button>
|
|
98
|
-
</DialogFooter>
|
|
99
|
-
</DialogContent>
|
|
100
|
-
</Dialog>
|
|
72
|
+
<vm-form-dialog
|
|
73
|
+
v-model:open="formOpen"
|
|
74
|
+
v-model="formData"
|
|
75
|
+
:title="formMode === 'add' ? '新增部门' : '编辑部门'"
|
|
76
|
+
:items="dialogItems"
|
|
77
|
+
@submit="onFormSubmit"
|
|
78
|
+
/>
|
|
101
79
|
</template>
|
|
102
80
|
|
|
103
81
|
<script setup lang="ts">
|
|
104
82
|
import { ref, computed, watch } from 'vue'
|
|
105
|
-
import { toast } from 'vue-sonner'
|
|
106
83
|
import { flattenTree } from '../lib/tree'
|
|
107
84
|
import { vmConfirm } from '../crud/confirm'
|
|
85
|
+
import { mergeByProp } from '../crud/auto-fields'
|
|
86
|
+
import type { CrudFormItem } from '../../../typings/admin/comm/crud'
|
|
87
|
+
import type { VmFormDialogSubmitHelpers } from './vm-form-dialog.vue'
|
|
108
88
|
|
|
109
89
|
defineOptions({ name: 'vm-dept-tree' })
|
|
110
90
|
|
|
@@ -127,6 +107,13 @@ type FlatRow = {
|
|
|
127
107
|
orderNum: number
|
|
128
108
|
}
|
|
129
109
|
|
|
110
|
+
export type DeptFormPayload = {
|
|
111
|
+
name: string
|
|
112
|
+
orderNum: number
|
|
113
|
+
parentId: number | null
|
|
114
|
+
id?: number
|
|
115
|
+
} & Record<string, unknown>
|
|
116
|
+
|
|
130
117
|
const props = withDefaults(
|
|
131
118
|
defineProps<{
|
|
132
119
|
/** 已是树形结构的部门数据 */
|
|
@@ -140,6 +127,11 @@ const props = withDefaults(
|
|
|
140
127
|
canUpdate?: boolean
|
|
141
128
|
canDelete?: boolean
|
|
142
129
|
canRestore?: boolean
|
|
130
|
+
/**
|
|
131
|
+
* 追加/覆盖表单字段(CrudFormItem);与内置「上级/名称/排序」合并,同 prop 以传入为准。
|
|
132
|
+
* 任意控件:`component: { name: 'vm-select', props: {…} }`
|
|
133
|
+
*/
|
|
134
|
+
formItems?: CrudFormItem[]
|
|
143
135
|
}>(),
|
|
144
136
|
{
|
|
145
137
|
data: () => [],
|
|
@@ -151,6 +143,7 @@ const props = withDefaults(
|
|
|
151
143
|
canUpdate: false,
|
|
152
144
|
canDelete: false,
|
|
153
145
|
canRestore: false,
|
|
146
|
+
formItems: () => [],
|
|
154
147
|
},
|
|
155
148
|
)
|
|
156
149
|
|
|
@@ -158,19 +151,17 @@ const emit = defineEmits<{
|
|
|
158
151
|
'update:modelValue': [v: number | null]
|
|
159
152
|
change: [v: number | null, meta: { name: string; ids: number[] }]
|
|
160
153
|
refresh: []
|
|
161
|
-
add: [payload:
|
|
162
|
-
update: [payload:
|
|
154
|
+
add: [payload: DeptFormPayload]
|
|
155
|
+
update: [payload: DeptFormPayload]
|
|
163
156
|
delete: [payload: { id: number }]
|
|
164
157
|
restore: [payload: { id: number }]
|
|
165
158
|
forceDelete: [payload: { id: number }]
|
|
166
159
|
}>()
|
|
167
160
|
|
|
168
|
-
const submitting = ref(false)
|
|
169
161
|
const expanded = ref(new Set<number>())
|
|
170
162
|
const formOpen = ref(false)
|
|
171
163
|
const formMode = ref<'add' | 'edit'>('add')
|
|
172
|
-
const
|
|
173
|
-
const parentName = ref('顶级')
|
|
164
|
+
const formData = ref<Record<string, unknown>>({})
|
|
174
165
|
const trashBusyId = ref<number | null>(null)
|
|
175
166
|
|
|
176
167
|
const canManage = computed(
|
|
@@ -178,6 +169,33 @@ const canManage = computed(
|
|
|
178
169
|
)
|
|
179
170
|
const canTrashOps = computed(() => props.canRestore || props.canDelete)
|
|
180
171
|
|
|
172
|
+
const builtinFormItems = computed((): CrudFormItem[] => [
|
|
173
|
+
{
|
|
174
|
+
prop: 'parentLabel',
|
|
175
|
+
label: '上级部门',
|
|
176
|
+
span: 12,
|
|
177
|
+
disabled: true,
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
prop: 'name',
|
|
181
|
+
label: '名称',
|
|
182
|
+
span: 12,
|
|
183
|
+
required: true,
|
|
184
|
+
placeholder: '部门名称',
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
prop: 'orderNum',
|
|
188
|
+
label: '排序',
|
|
189
|
+
span: 12,
|
|
190
|
+
type: 'number',
|
|
191
|
+
value: 0,
|
|
192
|
+
},
|
|
193
|
+
])
|
|
194
|
+
|
|
195
|
+
const dialogItems = computed(() =>
|
|
196
|
+
mergeByProp(builtinFormItems.value, props.formItems || []),
|
|
197
|
+
)
|
|
198
|
+
|
|
181
199
|
const idNameMap = computed(() => {
|
|
182
200
|
const map = new Map<number, string>()
|
|
183
201
|
const walk = (list: DeptTreeNode[]) => {
|
|
@@ -272,46 +290,51 @@ watch(
|
|
|
272
290
|
},
|
|
273
291
|
)
|
|
274
292
|
|
|
293
|
+
function parentLabelOf(parentId: number | null) {
|
|
294
|
+
return parentId == null ? '顶级' : idNameMap.value.get(parentId) || String(parentId)
|
|
295
|
+
}
|
|
296
|
+
|
|
275
297
|
function openAdd(parentId: number | null) {
|
|
276
298
|
formMode.value = 'add'
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
299
|
+
formData.value = {
|
|
300
|
+
id: 0,
|
|
301
|
+
name: '',
|
|
302
|
+
orderNum: 0,
|
|
303
|
+
parentId,
|
|
304
|
+
parentLabel: parentLabelOf(parentId),
|
|
305
|
+
}
|
|
280
306
|
formOpen.value = true
|
|
281
307
|
}
|
|
282
308
|
|
|
283
309
|
function openEdit(row: FlatRow) {
|
|
284
310
|
formMode.value = 'edit'
|
|
285
|
-
|
|
311
|
+
formData.value = {
|
|
286
312
|
id: row.id,
|
|
287
313
|
name: row.label,
|
|
288
|
-
orderNum:
|
|
314
|
+
orderNum: row.orderNum ?? 0,
|
|
289
315
|
parentId: row.parentId,
|
|
316
|
+
parentLabel: parentLabelOf(row.parentId),
|
|
290
317
|
}
|
|
291
|
-
parentName.value =
|
|
292
|
-
row.parentId == null ? '顶级' : idNameMap.value.get(row.parentId) || String(row.parentId)
|
|
293
318
|
formOpen.value = true
|
|
294
319
|
}
|
|
295
320
|
|
|
296
|
-
function
|
|
297
|
-
const
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
parentId: form.value.parentId,
|
|
321
|
+
function onFormSubmit(data: Record<string, unknown>, helpers: VmFormDialogSubmitHelpers) {
|
|
322
|
+
const { parentLabel: _pl, ...rest } = data
|
|
323
|
+
const payload: DeptFormPayload = {
|
|
324
|
+
...rest,
|
|
325
|
+
name: String(data.name ?? '').trim(),
|
|
326
|
+
orderNum: Number(data.orderNum ?? 0),
|
|
327
|
+
parentId:
|
|
328
|
+
data.parentId == null || data.parentId === ''
|
|
329
|
+
? null
|
|
330
|
+
: Number(data.parentId),
|
|
307
331
|
}
|
|
308
332
|
if (formMode.value === 'add') {
|
|
309
333
|
emit('add', payload)
|
|
310
334
|
} else {
|
|
311
|
-
emit('update', { ...payload, id:
|
|
335
|
+
emit('update', { ...payload, id: Number(data.id) })
|
|
312
336
|
}
|
|
313
|
-
|
|
314
|
-
submitting.value = false
|
|
337
|
+
helpers.close()
|
|
315
338
|
}
|
|
316
339
|
|
|
317
340
|
async function remove(row: FlatRow) {
|
|
@@ -469,22 +492,4 @@ defineExpose({ idNameMap })
|
|
|
469
492
|
}
|
|
470
493
|
}
|
|
471
494
|
}
|
|
472
|
-
|
|
473
|
-
.vm-dept-tree__dialog {
|
|
474
|
-
width: min(420px, calc(100vw - 32px));
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
.vm-dept-tree__form {
|
|
478
|
-
display: grid;
|
|
479
|
-
gap: 12px;
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
.vm-dept-tree__field {
|
|
483
|
-
display: grid;
|
|
484
|
-
gap: 6px;
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
.vm-dept-tree__req {
|
|
488
|
-
color: var(--destructive);
|
|
489
|
-
}
|
|
490
495
|
</style>
|