11<script setup lang="ts">
2- import { computed , nextTick , reactive , ref , useTemplateRef } from ' vue'
2+ import { reactive , ref , useTemplateRef } from ' vue'
33import type { FormInstance , FormRules } from ' element-plus'
4- import type { WorkspaceFolder } from ' @/api/types'
5- import type { FolderFormSubmit } from ' ./types'
4+ import FolderApi from ' @/api/admin/workspace/folder'
5+ import type { FolderItem , FolderSource } from ' @/api/types'
6+ import { MsgSuccess } from ' @/utils/message'
67
78defineOptions ({ name: ' FolderFormDialog' })
89
9- defineProps <{
10- loading: boolean
10+ const props = defineProps <{
11+ title: string
12+ source: FolderSource
1113}>()
1214
1315const emit = defineEmits <{
14- submit : [form : FolderFormSubmit ]
16+ refresh : [folder : FolderItem , isEdit : boolean ]
1517}>()
1618
17- interface FolderForm {
18- desc: string
19- name: string
20- parent_id: string
21- }
22-
2319const folderFormRef = useTemplateRef <FormInstance >(' folderFormRef' )
2420const visible = ref (false )
25- const editingFolderId = ref (' ' )
26- const folderForm = reactive < FolderForm > ({
21+ const editId = ref (' ' )
22+ const folderForm = reactive ({
2723 desc: ' ' ,
2824 name: ' ' ,
2925 parent_id: ' ' ,
3026})
3127
32- const dialogTitle = computed (() => (editingFolderId .value ? ' 编辑文件夹' : ' 创建文件夹' ))
33- const rules: FormRules <FolderForm > = {
28+ const rules: FormRules <typeof folderForm > = {
3429 name: [{ message: ' 请输入文件夹名称' , required: true , trigger: ' blur' }],
3530}
3631
37- function resetData() {
38- editingFolderId .value = ' '
39- folderForm .desc = ' '
40- folderForm .name = ' '
41- folderForm .parent_id = ' '
42- folderFormRef .value ?.clearValidate ()
32+ const loading = ref (false )
33+ function handleSubmit() {
34+ folderFormRef .value ?.validate ((valid ) => {
35+ if (! valid ) return
36+ loading .value = true
37+ const isEdit = Boolean (editId .value )
38+ const request = isEdit
39+ ? FolderApi .putFolder (editId .value , props .source , folderForm )
40+ : FolderApi .postFolder (props .source , folderForm )
41+
42+ return request
43+ .then ((folder ) => {
44+ MsgSuccess (isEdit ? ' 保存成功' : ' 创建成功' )
45+ visible .value = false
46+ emit (' refresh' , folder , isEdit )
47+ })
48+ .finally (() => {
49+ loading .value = false
50+ })
51+ })
4352}
4453
45- function open(parentId : string , folder ? : WorkspaceFolder ) {
46- resetData ()
47- editingFolderId .value = folder ?.id ?? ' '
48- folderForm .desc = folder ?.desc ?? ' '
49- folderForm .name = folder ?.name ?? ' '
50- folderForm .parent_id = folder ?.parent_id ?? parentId
54+ function open(id : string , folder ? : FolderItem ) {
55+ if (folder ) {
56+ // 编辑当前id
57+ editId .value = folder ?.id
58+ folderForm .name = folder ?.name ?? ' '
59+ folderForm .desc = folder ?.desc ?? ' '
60+ folderForm .parent_id = folder .parent_id ?? ' '
61+ } else {
62+ // 给当前id添加子id
63+ folderForm .parent_id = id
64+ }
65+
5166 visible .value = true
52- nextTick (() => folderFormRef .value ?.clearValidate ())
5367}
5468
5569function close() {
5670 visible .value = false
5771 resetData ()
5872}
59-
60- function handleSubmit() {
61- folderFormRef .value ?.validate ((valid ) => {
62- if (! valid ) return
63- emit (' submit' , {
64- folderId: editingFolderId .value || undefined ,
65- payload: {
66- desc: folderForm .desc .trim (),
67- name: folderForm .name .trim (),
68- parent_id: folderForm .parent_id ,
69- },
70- })
71- })
73+ function resetData() {
74+ editId .value = ' '
75+ folderForm .desc = ' '
76+ folderForm .name = ' '
77+ folderForm .parent_id = ' '
78+ folderFormRef .value ?.clearValidate ()
7279}
7380
7481defineExpose ({ close , open })
7582 </script >
7683
7784<template >
78- <MkDialog v-model =" visible " :title =" dialogTitle " width="600 " @closed =" resetData " >
85+ <MkDialog v-model =" visible " :title =" title " @closed =" resetData " >
7986 <el-form
8087 ref =" folderFormRef"
8188 :model =" folderForm"
8289 :rules =" rules"
8390 label-position =" top"
91+ require-asterisk-position =" right"
8492 @submit.prevent
8593 >
8694 <el-form-item label =" 名称" prop =" name" >
8795 <el-input
8896 v-model =" folderForm.name"
8997 maxlength =" 64"
90- placeholder =" 请输入文件夹名称 "
98+ placeholder =" 请输入名称 "
9199 show-word-limit
92100 @blur =" folderForm.name = folderForm.name.trim()"
93101 />
94102 </el-form-item >
95103 <el-form-item label =" 描述" prop =" desc" >
96104 <el-input
97105 v-model =" folderForm.desc"
98- :autosize =" { minRows: 3 }"
99- maxlength =" 200"
100- placeholder =" 请输入文件夹描述"
106+ placeholder =" 请输入描述"
107+ maxlength =" 128"
101108 show-word-limit
109+ :autosize =" { minRows: 3 }"
102110 type =" textarea"
103111 @blur =" folderForm.desc = folderForm.desc.trim()"
104112 />
@@ -108,7 +116,7 @@ defineExpose({ close, open })
108116 <template #footer >
109117 <el-button :disabled =" loading" @click =" close" >取消</el-button >
110118 <el-button type =" primary" :loading =" loading" @click =" handleSubmit" >
111- {{ editingFolderId ? '保存' : '创建' }}
119+ {{ editId ? '保存' : '创建' }}
112120 </el-button >
113121 </template >
114122 </MkDialog >
0 commit comments