|
7 | 7 | <span class="color-danger">*</span> |
8 | 8 | </span> |
9 | 9 | <div class="flex"> |
10 | | - <el-checkbox v-model="formValue.multiple" label="允许多选" size="large" class="pr-8" /> |
| 10 | + <el-checkbox |
| 11 | + v-model="formValue.multiple" |
| 12 | + :label="$t('dynamicsForm.TreeSelect.allowMultipleSelections')" |
| 13 | + size="large" |
| 14 | + class="pr-8" |
| 15 | + /> |
11 | 16 | <el-button link type="primary" @click="openAddRootDialog"> |
12 | 17 | <AppIcon iconName="app-add-outlined" class="mr-4"></AppIcon> |
13 | | - {{ $t('common.add') }} |
14 | 18 | </el-button> |
15 | 19 | </div> |
16 | 20 | </div> |
17 | 21 | </template> |
18 | | - |
19 | | - <el-tree |
20 | | - :data="treeData" |
21 | | - node-key="id" |
22 | | - default-expand-all |
23 | | - :expand-on-click-node="false" |
24 | | - :props="treeProps" |
25 | | - class="option-tree" |
26 | | - > |
27 | | - <template #default="{ data }"> |
28 | | - <div class="tree-node"> |
29 | | - <div class="tree-node__main"> |
30 | | - <span class="tree-node__label">{{ data.label }}</span> |
31 | | - <span class="tree-node__colon">:</span> |
32 | | - <span class="tree-node__value">{{ data.value }}</span> |
33 | | - </div> |
34 | | - |
35 | | - <div class="tree-node__actions"> |
36 | | - <el-button link type="primary" @click.stop="openAddChildDialog(data)"> |
37 | | - <el-icon class="action-btn"> |
38 | | - <Plus /> |
39 | | - </el-icon> |
40 | | - </el-button> |
41 | | - |
42 | | - <el-button link type="primary" @click.stop="openEditDialog(data)"> |
43 | | - <el-icon class="action-btn"> <Edit /></el-icon> |
44 | | - </el-button> |
45 | | - |
46 | | - <el-button link type="danger" @click.stop="handleDelete(data)"> |
47 | | - <el-icon class="action-btn"> <Delete /></el-icon> |
48 | | - </el-button> |
| 22 | + <el-card shadow="never" class="border-r-6 w-full" style="--el-card-padding: 8px"> |
| 23 | + <el-tree |
| 24 | + :data="treeData" |
| 25 | + node-key="id" |
| 26 | + default-expand-all |
| 27 | + :expand-on-click-node="false" |
| 28 | + :props="treeProps" |
| 29 | + class="option-tree" |
| 30 | + > |
| 31 | + <template #default="{ data }"> |
| 32 | + <div class="flex-between w-full"> |
| 33 | + <div class="ellipsis" :title="`${data.label}-${data.value}`" style="max-width: 350px"> |
| 34 | + <span>{{ data.label }}-{{ data.value }}</span> |
| 35 | + </div> |
| 36 | + |
| 37 | + <div> |
| 38 | + <span class="mr-4"> |
| 39 | + <el-button link @click.stop="openAddChildDialog(data)"> |
| 40 | + <AppIcon iconName="app-add-outlined" class="color-secondary"></AppIcon> |
| 41 | + </el-button> |
| 42 | + </span> |
| 43 | + <span class="mr-4"> |
| 44 | + <el-button link @click.stop="openEditDialog(data)"> |
| 45 | + <AppIcon iconName="app-edit" class="color-secondary"></AppIcon> |
| 46 | + </el-button> |
| 47 | + </span> |
| 48 | + <span> |
| 49 | + <el-button link @click.stop="handleDelete(data)"> |
| 50 | + <AppIcon iconName="app-delete" class="color-secondary"></AppIcon> |
| 51 | + </el-button> |
| 52 | + </span> |
| 53 | + </div> |
49 | 54 | </div> |
50 | | - </div> |
51 | | - </template> |
52 | | - </el-tree> |
| 55 | + </template> |
| 56 | + </el-tree> |
| 57 | + </el-card> |
53 | 58 | </el-form-item> |
54 | 59 |
|
55 | 60 | <el-form-item |
|
86 | 91 | " |
87 | 92 | width="520px" |
88 | 93 | destroy-on-close |
| 94 | + label-position="top" |
| 95 | + require-asterisk-position="right" |
| 96 | + @submit.prevent |
89 | 97 | > |
90 | | - <div class="dialog-body"> |
91 | | - <div v-for="(item, index) in addDialog.formList" :key="item.key" class="dialog-row"> |
92 | | - <el-input |
93 | | - v-model.trim="item.label" |
94 | | - :placeholder="$t('dynamicsForm.tag.placeholder')" |
95 | | - maxlength="50" |
96 | | - /> |
97 | | - <el-input |
98 | | - v-model.trim="item.value" |
99 | | - :placeholder="$t('dynamicsForm.Select.placeholder')" |
100 | | - maxlength="100" |
101 | | - /> |
102 | | - <el-button |
103 | | - link |
104 | | - type="danger" |
105 | | - :disabled="addDialog.formList.length === 1" |
106 | | - @click="removeAddRow(index)" |
107 | | - > |
108 | | - <el-icon class="action-btn"> <Delete /></el-icon> |
109 | | - </el-button> |
110 | | - </div> |
111 | | - |
112 | | - <el-button link type="primary" @click="appendAddRow"> |
113 | | - <AppIcon iconName="app-add-outlined" class="mr-4" /> |
114 | | - {{ $t('common.add') }} |
115 | | - </el-button> |
116 | | - </div> |
117 | | - |
| 98 | + <el-scrollbar> |
| 99 | + <el-row :gutter="8" style="margin-right: 10px" class="tag-list-max-list"> |
| 100 | + <template v-for="(item, index) in addDialog.formList" :key="index"> |
| 101 | + <el-col :span="12"> |
| 102 | + <el-form-item> |
| 103 | + <template #label> |
| 104 | + {{ index === 0 ? $t('dynamicsForm.tag.label') : '' }} |
| 105 | + <span class="color-danger" v-if="index === 0"> *</span> |
| 106 | + </template> |
| 107 | + <el-input |
| 108 | + v-model.trim="item.label" |
| 109 | + class="w-full" |
| 110 | + :placeholder="$t('dynamicsForm.tag.placeholder')" |
| 111 | + maxlength="50" |
| 112 | + ></el-input> |
| 113 | + </el-form-item> |
| 114 | + </el-col> |
| 115 | + <el-col :span="11"> |
| 116 | + <el-form-item class="w-full"> |
| 117 | + <template #label> |
| 118 | + {{ index === 0 ? $t('dynamicsForm.Select.label') : '' }} |
| 119 | + <span class="color-danger" v-if="index === 0">*</span> |
| 120 | + </template> |
| 121 | + <el-input |
| 122 | + v-model.trim="item.value" |
| 123 | + :placeholder="$t('dynamicsForm.Select.placeholder')" |
| 124 | + maxlength="100" |
| 125 | + ></el-input> |
| 126 | + </el-form-item> |
| 127 | + </el-col> |
| 128 | + <el-col :span="1"> |
| 129 | + <el-button |
| 130 | + :disabled="addDialog.formList.length === 1" |
| 131 | + link |
| 132 | + @click="removeAddRow(index)" |
| 133 | + :style="{ marginTop: index === 0 ? '35px' : '12px' }" |
| 134 | + > |
| 135 | + <AppIcon iconName="app-delete"></AppIcon> |
| 136 | + </el-button> |
| 137 | + </el-col> |
| 138 | + </template> |
| 139 | + </el-row> |
| 140 | + </el-scrollbar> |
| 141 | + <el-button link type="primary" @click="appendAddRow"> |
| 142 | + <AppIcon iconName="app-add-outlined" class="mr-4" /> |
| 143 | + {{ $t('common.add') }} |
| 144 | + </el-button> |
118 | 145 | <template #footer> |
119 | 146 | <el-button @click="closeAddDialog">{{ $t('common.cancel') }}</el-button> |
120 | 147 | <el-button type="primary" @click="submitAdd">{{ $t('common.add') }}</el-button> |
121 | 148 | </template> |
122 | 149 | </el-dialog> |
123 | 150 |
|
124 | 151 | <!-- 编辑弹窗 --> |
125 | | - <el-dialog v-model="editDialog.visible" :title="$t('common.edit')" width="520px" destroy-on-close> |
126 | | - <div class="dialog-body"> |
127 | | - <div class="dialog-row dialog-row--edit"> |
128 | | - <el-input |
129 | | - v-model.trim="editDialog.form.label" |
130 | | - :placeholder="$t('dynamicsForm.tag.placeholder')" |
131 | | - maxlength="50" |
132 | | - /> |
133 | | - <el-input |
134 | | - v-model.trim="editDialog.form.value" |
135 | | - :placeholder="$t('dynamicsForm.Select.placeholder')" |
136 | | - maxlength="100" |
137 | | - /> |
138 | | - </div> |
139 | | - </div> |
| 152 | + <el-dialog |
| 153 | + v-model="editDialog.visible" |
| 154 | + :title="$t('common.edit')" |
| 155 | + width="520px" |
| 156 | + destroy-on-close |
| 157 | + label-position="top" |
| 158 | + require-asterisk-position="right" |
| 159 | + @submit.prevent |
| 160 | + > |
| 161 | + <el-row :gutter="8"> |
| 162 | + <el-col :span="12"> |
| 163 | + <el-form-item> |
| 164 | + <template #label> |
| 165 | + {{ $t('dynamicsForm.tag.label') }} |
| 166 | + <span class="color-danger"> *</span> |
| 167 | + </template> |
| 168 | + <el-input |
| 169 | + v-model.trim="editDialog.form.label" |
| 170 | + :placeholder="$t('dynamicsForm.tag.placeholder')" |
| 171 | + maxlength="50" |
| 172 | + /> |
| 173 | + </el-form-item> |
| 174 | + </el-col> |
| 175 | + <el-col :span="12"> |
| 176 | + <el-form-item class="w-full"> |
| 177 | + <template #label> |
| 178 | + {{ $t('dynamicsForm.Select.label') }} |
| 179 | + <span class="color-danger">*</span> |
| 180 | + </template> |
| 181 | + <el-input |
| 182 | + v-model.trim="editDialog.form.value" |
| 183 | + :placeholder="$t('dynamicsForm.Select.placeholder')" |
| 184 | + maxlength="100" |
| 185 | + /> |
| 186 | + </el-form-item> |
| 187 | + </el-col> |
| 188 | + </el-row> |
140 | 189 |
|
141 | 190 | <template #footer> |
142 | 191 | <el-button @click="closeEditDialog">{{ $t('common.cancel') }}</el-button> |
|
146 | 195 | </template> |
147 | 196 | <script setup lang="ts"> |
148 | 197 | import { computed, onMounted, watch, ref, reactive } from 'vue' |
149 | | -import { Edit, Plus, Delete } from '@element-plus/icons-vue' |
150 | 198 | import { t } from '@/locales/' |
151 | 199 |
|
152 | 200 | import { ElMessage, ElMessageBox } from 'element-plus' |
@@ -396,100 +444,7 @@ function removeNodeById(list: TreeNode[], targetId: string): boolean { |
396 | 444 | } |
397 | 445 | </script> |
398 | 446 | <style lang="scss" scoped> |
399 | | -.defaultValueItem { |
400 | | - position: relative; |
401 | | - .defaultValueCheckbox { |
402 | | - position: absolute; |
403 | | - right: 0; |
404 | | - top: -35px; |
405 | | - } |
406 | | -} |
407 | | -.dynamic-option-tree { |
408 | | - width: 100%; |
409 | | -} |
410 | | -
|
411 | | -.tree-header { |
412 | | - display: flex; |
413 | | - align-items: center; |
414 | | - justify-content: space-between; |
415 | | - margin-bottom: 12px; |
416 | | -} |
417 | | -
|
418 | | -.tree-header__title { |
419 | | - display: flex; |
420 | | - align-items: center; |
421 | | - gap: 4px; |
422 | | - color: var(--el-text-color-primary); |
423 | | - font-size: 14px; |
424 | | -} |
425 | | -
|
426 | | -.required { |
427 | | - color: var(--el-color-danger); |
428 | | -} |
429 | | -
|
430 | | -.tree-empty { |
431 | | - width: 100%; |
432 | | - padding: 24px 0; |
433 | | - border: 1px dashed var(--el-border-color); |
434 | | - border-radius: 8px; |
435 | | -} |
436 | | -.option-tree { |
437 | | - width: 100%; |
438 | | -} |
439 | | -.option-tree :deep(.el-tree-node__content) { |
440 | | - height: 18px; |
441 | | -} |
442 | | -
|
443 | | -.tree-node { |
444 | | - width: 100%; |
445 | | - display: flex; |
446 | | - align-items: center; |
447 | | - justify-content: space-between; |
448 | | - gap: 12px; |
449 | | - padding-right: 8px; |
450 | | -} |
451 | | -
|
452 | | -.tree-node__main { |
453 | | - display: flex; |
454 | | - align-items: center; |
455 | | - min-width: 0; |
456 | | - overflow: hidden; |
457 | | - white-space: nowrap; |
458 | | -} |
459 | | -
|
460 | | -.tree-node__label, |
461 | | -.tree-node__colon, |
462 | | -.tree-node__value { |
463 | | - font-size: 14px; |
464 | | - color: var(--el-text-color-primary); |
465 | | -} |
466 | | -
|
467 | | -.tree-node__actions { |
468 | | - display: flex; |
469 | | - align-items: center; |
470 | | - gap: 4px; |
471 | | - flex-shrink: 0; |
472 | | - opacity: 0; |
473 | | - transition: opacity 0.2s ease; |
474 | | -} |
475 | | -
|
476 | | -.tree-node:hover .tree-node__actions { |
477 | | - opacity: 1; |
478 | | -} |
479 | | -
|
480 | | -.dialog-body { |
481 | | - padding-top: 8px; |
482 | | -} |
483 | | -
|
484 | | -.dialog-row { |
485 | | - display: grid; |
486 | | - grid-template-columns: 1fr 1fr 40px; |
487 | | - gap: 12px; |
488 | | - align-items: center; |
489 | | - margin-bottom: 12px; |
490 | | -} |
491 | | -
|
492 | | -.dialog-row--edit { |
493 | | - grid-template-columns: 1fr 1fr; |
| 447 | +.tag-list-max-list { |
| 448 | + max-height: calc(100vh - 260px); |
494 | 449 | } |
495 | 450 | </style> |
0 commit comments