vome-core 0.3.8 → 0.3.9

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.
Files changed (76) hide show
  1. package/dist/admin/components/ui/avatar/index.js +1 -1
  2. package/dist/admin/components/ui/checkbox/index.js +1 -1
  3. package/dist/admin/components/ui/dialog/DialogContent.vue +132 -0
  4. package/dist/admin/components/ui/dialog/index.js +1 -1
  5. package/dist/admin/components/ui/dropdown-menu/index.js +1 -1
  6. package/dist/admin/components/ui/input/Input.vue +12 -0
  7. package/dist/admin/components/ui/input/index.js +1 -1
  8. package/dist/admin/components/ui/label/index.js +1 -1
  9. package/dist/admin/components/ui/scroll-area/index.js +1 -1
  10. package/dist/admin/components/ui/select/SelectItem.vue +9 -0
  11. package/dist/admin/components/ui/select/SelectTrigger.vue +11 -0
  12. package/dist/admin/components/ui/select/index.js +1 -1
  13. package/dist/admin/components/ui/separator/index.js +1 -1
  14. package/dist/admin/components/ui/sheet/index.js +1 -1
  15. package/dist/admin/components/ui/sonner/index.js +1 -1
  16. package/dist/admin/components/ui/table/index.js +1 -1
  17. package/dist/admin/components/ui/tabs/index.js +1 -1
  18. package/dist/admin/components/ui/tooltip/index.js +1 -1
  19. package/dist/admin/components/vm-dept-tree.vue +79 -74
  20. package/dist/admin/components/vm-form-dialog.vue +630 -0
  21. package/dist/admin/crud/auto-fields.js +1 -1
  22. package/dist/admin/crud/components/vm-richtext-extensions.js +1 -1
  23. package/dist/admin/crud/config.js +1 -1
  24. package/dist/admin/crud/confirm.js +1 -1
  25. package/dist/admin/crud/crud-page-request.js +1 -1
  26. package/dist/admin/crud/data-i18n.js +1 -1
  27. package/dist/admin/crud/dict.js +1 -1
  28. package/dist/admin/crud/export-fetch.js +1 -1
  29. package/dist/admin/crud/key.js +1 -1
  30. package/dist/admin/crud/plugins.js +1 -1
  31. package/dist/admin/crud/span.js +1 -1
  32. package/dist/admin/crud/style.js +1 -1
  33. package/dist/admin/crud/validate.js +1 -1
  34. package/dist/admin/directives/perm.js +1 -1
  35. package/dist/admin/hooks/useUpload.js +1 -1
  36. package/dist/admin/lib/browser.js +1 -1
  37. package/dist/admin/lib/cn.js +1 -1
  38. package/dist/admin/lib/dialog-float.js +1 -1
  39. package/dist/admin/lib/export-excel.js +1 -1
  40. package/dist/admin/lib/import-excel.js +1 -1
  41. package/dist/admin/lib/json.js +1 -1
  42. package/dist/admin/lib/menu.js +1 -1
  43. package/dist/admin/lib/micro-locale.js +1 -1
  44. package/dist/admin/lib/micro-theme.js +1 -1
  45. package/dist/admin/lib/shell.js +1 -1
  46. package/dist/admin/lib/theme-color-options.js +1 -1
  47. package/dist/admin/lib/tree.js +1 -1
  48. package/dist/admin/lib/upload.js +1 -1
  49. package/dist/admin/lib/video-frame.js +1 -1
  50. package/dist/admin/router/create.js +1 -1
  51. package/dist/admin/router/guards.js +1 -1
  52. package/dist/admin/styles/base.css +2 -152
  53. package/dist/ai/index.js +1 -1
  54. package/dist/client/ai-model-registry.js +1 -1
  55. package/dist/client/base.js +1 -1
  56. package/dist/client/configure.js +1 -1
  57. package/dist/client/dict.js +1 -1
  58. package/dist/client/eps-payload.js +1 -1
  59. package/dist/client/eps.js +1 -1
  60. package/dist/client/index.js +1 -1
  61. package/dist/client/locale-store.js +1 -1
  62. package/dist/client/service.js +1 -1
  63. package/dist/client/vite-admin.js +1 -1
  64. package/dist/client/vite-auto-import.js +1 -1
  65. package/dist/client/vite-micro-proxy.js +1 -1
  66. package/dist/client/vite-plugin-eps.js +1 -1
  67. package/dist/client/vite-resolve.js +1 -1
  68. package/dist/config/index.js +1 -1
  69. package/dist/index.js +1 -1
  70. package/dist/server/index.js +1 -1
  71. package/dist/shared/datetime-picker.js +1 -1
  72. package/dist/shared/excel.js +1 -1
  73. package/dist/shared/index.js +1 -1
  74. package/dist/shared/locale-json.js +1 -1
  75. package/dist/shared/tree.js +1 -1
  76. package/package.json +1 -1
@@ -69,42 +69,22 @@
69
69
  </div>
70
70
  </vm-aside>
71
71
 
72
- <Dialog v-model:open="formOpen">
73
- <DialogContent class="vm-dept-tree__dialog">
74
- <DialogHeader>
75
- <DialogTitle>{{ formMode === 'add' ? '新增部门' : '编辑部门' }}</DialogTitle>
76
- </DialogHeader>
77
- <div class="vm-dept-tree__form">
78
- <div class="vm-dept-tree__field">
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: { name: string; orderNum: number; parentId: number | null }]
162
- update: [payload: { id: number; name: string; orderNum: number; parentId: number | null }]
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 form = ref({ id: 0, name: '', orderNum: '0', parentId: null as number | null })
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: 24,
177
+ disabled: true,
178
+ },
179
+ {
180
+ prop: 'name',
181
+ label: '名称',
182
+ span: 24,
183
+ required: true,
184
+ placeholder: '部门名称',
185
+ },
186
+ {
187
+ prop: 'orderNum',
188
+ label: '排序',
189
+ span: 24,
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
- form.value = { id: 0, name: '', orderNum: '0', parentId }
278
- parentName.value =
279
- parentId == null ? '顶级' : idNameMap.value.get(parentId) || String(parentId)
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
- form.value = {
311
+ formData.value = {
286
312
  id: row.id,
287
313
  name: row.label,
288
- orderNum: String(row.orderNum ?? 0),
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 submitForm() {
297
- const name = form.value.name.trim()
298
- if (!name) {
299
- toast.error('请填写部门名称')
300
- return
301
- }
302
- submitting.value = true
303
- const payload = {
304
- name,
305
- orderNum: Number(form.value.orderNum || 0),
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: form.value.id })
335
+ emit('update', { ...payload, id: Number(data.id) })
312
336
  }
313
- formOpen.value = false
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>