Showing
1 changed file
with
259 additions
and
88 deletions
| ... | @@ -84,96 +84,129 @@ | ... | @@ -84,96 +84,129 @@ |
| 84 | stretch | 84 | stretch |
| 85 | > | 85 | > |
| 86 | <el-tab-pane label="节点属性" name="node" style="padding: 0 1rem"> | 86 | <el-tab-pane label="节点属性" name="node" style="padding: 0 1rem"> |
| 87 | - <el-form-item prop="label"> | 87 | + <div v-if="state.main_attr_set" class="main-attr-set"> |
| 88 | - <div slot="label"> | 88 | + <el-form-item prop="label"> |
| 89 | - 节点名称 <span style="color: red;">*</span> | 89 | + <div slot="label"> |
| 90 | + 节点名称 <span style="color: red;">*</span> | ||
| 91 | + </div> | ||
| 92 | + <el-input v-model="state.node_name" /> | ||
| 93 | + </el-form-item> | ||
| 94 | + <div class="node-user"> | ||
| 95 | + <div style="font-size: 14px; margin-bottom: 10px;"> | ||
| 96 | + 节点负责人 <span style="color: red;">*</span> | ||
| 97 | + </div> | ||
| 98 | + <div class="flow-tag__wrapper" @click="openUserForm"> | ||
| 99 | + <el-tag | ||
| 100 | + v-if="state.userTags.length" | ||
| 101 | + v-for="tag in state.userTags" | ||
| 102 | + :key="tag.name" | ||
| 103 | + style="margin-left: 0.25rem; margin-right: 0.25rem;" | ||
| 104 | + > | ||
| 105 | + {{ tag.name }} | ||
| 106 | + </el-tag> | ||
| 107 | + <div v-else class="text-empty">请选择成员</div> | ||
| 108 | + </div> | ||
| 90 | </div> | 109 | </div> |
| 91 | - <el-input v-model="state.node_name" /> | 110 | + <el-form-item prop="attr"> |
| 92 | - </el-form-item> | 111 | + <el-radio-group |
| 93 | - <div class="node-user"> | 112 | + v-model="state.attr_radio" |
| 94 | - <div style="font-size: 14px; margin-bottom: 10px;"> | 113 | + size="large" |
| 95 | - 节点负责人 <span style="color: red;">*</span> | 114 | + class="attr-radio-group" |
| 96 | - </div> | 115 | + > |
| 97 | - <div class="flow-tag__wrapper" @click="openUserForm"> | 116 | + <el-radio-button label="基础属性" /> |
| 98 | - <el-tag | 117 | + <el-radio-button label="更多属性" /> |
| 99 | - v-if="state.userTags.length" | 118 | + </el-radio-group> |
| 100 | - v-for="tag in state.userTags" | 119 | + </el-form-item> |
| 101 | - :key="tag.name" | 120 | + <el-form-item v-if="state.attr_radio === '基础属性'" prop=""> |
| 102 | - style="margin-left: 0.25rem; margin-right: 0.25rem;" | 121 | + <div slot="label"> |
| 122 | + 字段权限 <span style="color: red;">*</span> | ||
| 123 | + </div> | ||
| 124 | + <el-row | ||
| 125 | + style="width: 100%; background-color: #f0f1f4; padding-left: 10px;" | ||
| 103 | > | 126 | > |
| 104 | - {{ tag.name }} | 127 | + <el-col :span="12">字段</el-col> |
| 105 | - </el-tag> | 128 | + <el-col :span="6">可见</el-col> |
| 106 | - <div v-else class="text-empty">请选择成员</div> | 129 | + <el-col :span="6">可编辑</el-col> |
| 130 | + </el-row> | ||
| 131 | + <el-row style="width: 100%; padding-left: 10px;"> | ||
| 132 | + <el-col :span="12" style="color: #409eff;">全选</el-col> | ||
| 133 | + <el-col :span="6" style="padding-left: 5px;" | ||
| 134 | + ><el-checkbox | ||
| 135 | + @change="onAuthAllChange" | ||
| 136 | + v-model="state.auth_all_checked" | ||
| 137 | + label="" | ||
| 138 | + size="large" | ||
| 139 | + /></el-col> | ||
| 140 | + <el-col :span="6" style="padding-left: 5px;" | ||
| 141 | + ><el-checkbox | ||
| 142 | + @change="onAuthAllEditChange" | ||
| 143 | + v-model="state.auth_all_edit" | ||
| 144 | + label="" | ||
| 145 | + size="large" | ||
| 146 | + /></el-col> | ||
| 147 | + </el-row> | ||
| 148 | + <el-row | ||
| 149 | + v-for="(field, index) in state.field_auths" | ||
| 150 | + :key="index" | ||
| 151 | + style="width: 100%; padding-left: 10px;" | ||
| 152 | + > | ||
| 153 | + <el-col :span="12" style="">{{ field.name }}</el-col> | ||
| 154 | + <el-col :span="6" style="padding-left: 5px;" | ||
| 155 | + ><el-checkbox | ||
| 156 | + v-model="field.visible.checked" | ||
| 157 | + :disabled="field.visible.disabled" | ||
| 158 | + label="" | ||
| 159 | + size="large" | ||
| 160 | + @change="onAuthVisibleChange(field, index)" | ||
| 161 | + /></el-col> | ||
| 162 | + <el-col :span="6" style="padding-left: 5px;" | ||
| 163 | + ><el-checkbox | ||
| 164 | + v-model="field.editable.checked" | ||
| 165 | + :disabled="field.editable.disabled" | ||
| 166 | + label="" | ||
| 167 | + size="large" | ||
| 168 | + @change="onAuthEditableChange(field, index)" | ||
| 169 | + /></el-col> | ||
| 170 | + </el-row> | ||
| 171 | + </el-form-item> | ||
| 172 | + <div v-if="state.attr_radio === '更多属性'"> | ||
| 173 | + <div class="more-attr"> | ||
| 174 | + <div v-for="(attr, index) in state.more_attr" :key="index" class="more-attr-item"> | ||
| 175 | + <p class="title">{{ attr.label }}</p> | ||
| 176 | + <div v-for="(item, idx) in attr.data" :key="idx" class="content"> | ||
| 177 | + <div v-if="item.btnText" class="left"> | ||
| 178 | + <span v-if="item.label === item.btnText">{{ item.label }}</span> | ||
| 179 | + <span v-else> | ||
| 180 | + {{ item.btnText }} <span style="color: #838892;">| 原名:{{ item.label }}</span> | ||
| 181 | + </span> | ||
| 182 | + </div> | ||
| 183 | + <div v-else class="left"> | ||
| 184 | + <span> | ||
| 185 | + {{ item.label }} | ||
| 186 | + </span> | ||
| 187 | + </div> | ||
| 188 | + <div :class="['right', item.show ? 'active' : '']">{{ item.show? '已开启' : '未开启' }}</div> | ||
| 189 | + <div class="btn-action" @click="setMoreAttr(attr, idx)"> | ||
| 190 | + <el-icon :size="14"><Edit /></el-icon> <span>编辑</span> | ||
| 191 | + </div> | ||
| 192 | + </div> | ||
| 193 | + </div> | ||
| 194 | + <!-- <div class="more-attr-item"> | ||
| 195 | + <p class="title">节点操作</p> | ||
| 196 | + </div> --> | ||
| 197 | + </div> | ||
| 107 | </div> | 198 | </div> |
| 108 | </div> | 199 | </div> |
| 109 | - <el-form-item prop="attr"> | 200 | + <div v-else class="more-attr-set"> |
| 110 | - <el-radio-group | 201 | + <el-button @click="onConfirmMoreAttr(state.more_attr_data)" type="primary" style="width: 100%;">完成</el-button> |
| 111 | - v-model="state.attr_radio" | 202 | + <div class="more-attr-switch"> |
| 112 | - size="large" | 203 | + <div class="more-attr-title">{{ state.more_attr_data.label }}</div> |
| 113 | - class="attr-radio-group" | 204 | + <div><el-switch v-model="state.more_attr_data.show" /></div> |
| 114 | - > | ||
| 115 | - <el-radio-button label="基础属性" /> | ||
| 116 | - <el-radio-button label="更多属性" /> | ||
| 117 | - </el-radio-group> | ||
| 118 | - </el-form-item> | ||
| 119 | - <el-form-item v-if="state.attr_radio === '基础属性'" prop=""> | ||
| 120 | - <div slot="label"> | ||
| 121 | - 字段权限 <span style="color: red;">*</span> | ||
| 122 | - </div> | ||
| 123 | - <el-row | ||
| 124 | - style="width: 100%; background-color: #f0f1f4; padding-left: 10px;" | ||
| 125 | - > | ||
| 126 | - <el-col :span="12">字段</el-col> | ||
| 127 | - <el-col :span="6">可见</el-col> | ||
| 128 | - <el-col :span="6">可编辑</el-col> | ||
| 129 | - </el-row> | ||
| 130 | - <el-row style="width: 100%; padding-left: 10px;"> | ||
| 131 | - <el-col :span="12" style="color: #409eff;">全选</el-col> | ||
| 132 | - <el-col :span="6" style="padding-left: 5px;" | ||
| 133 | - ><el-checkbox | ||
| 134 | - @change="onAuthAllChange" | ||
| 135 | - v-model="state.auth_all_checked" | ||
| 136 | - label="" | ||
| 137 | - size="large" | ||
| 138 | - /></el-col> | ||
| 139 | - <el-col :span="6" style="padding-left: 5px;" | ||
| 140 | - ><el-checkbox | ||
| 141 | - @change="onAuthAllEditChange" | ||
| 142 | - v-model="state.auth_all_edit" | ||
| 143 | - label="" | ||
| 144 | - size="large" | ||
| 145 | - /></el-col> | ||
| 146 | - </el-row> | ||
| 147 | - <el-row | ||
| 148 | - v-for="(field, index) in state.field_auths" | ||
| 149 | - :key="index" | ||
| 150 | - style="width: 100%; padding-left: 10px;" | ||
| 151 | - > | ||
| 152 | - <el-col :span="12" style="">{{ field.name }}</el-col> | ||
| 153 | - <el-col :span="6" style="padding-left: 5px;" | ||
| 154 | - ><el-checkbox | ||
| 155 | - v-model="field.visible.checked" | ||
| 156 | - :disabled="field.visible.disabled" | ||
| 157 | - label="" | ||
| 158 | - size="large" | ||
| 159 | - @change="onAuthVisibleChange(field, index)" | ||
| 160 | - /></el-col> | ||
| 161 | - <el-col :span="6" style="padding-left: 5px;" | ||
| 162 | - ><el-checkbox | ||
| 163 | - v-model="field.editable.checked" | ||
| 164 | - :disabled="field.editable.disabled" | ||
| 165 | - label="" | ||
| 166 | - size="large" | ||
| 167 | - @change="onAuthEditableChange(field, index)" | ||
| 168 | - /></el-col> | ||
| 169 | - </el-row> | ||
| 170 | - </el-form-item> | ||
| 171 | - <div v-if="state.attr_radio === '更多属性'"> | ||
| 172 | - <div> | ||
| 173 | - <p style="font-size: 14px;">审批意见</p> | ||
| 174 | </div> | 205 | </div> |
| 175 | - <div> | 206 | + <p class="more-attr-tip">{{ state.more_attr_data.desc }}</p> |
| 176 | - <p style="font-size: 14px;">节点操作</p> | 207 | + <div v-if="state.more_attr_data.btnText"> |
| 208 | + <p style="font-size: 14px; font-weight: bold;">按钮文字</p> | ||
| 209 | + <el-input v-model="state.more_attr_data.btnText" /> | ||
| 177 | </div> | 210 | </div> |
| 178 | </div> | 211 | </div> |
| 179 | </el-tab-pane> | 212 | </el-tab-pane> |
| ... | @@ -236,8 +269,10 @@ | ... | @@ -236,8 +269,10 @@ |
| 236 | </template> | 269 | </template> |
| 237 | <!-- 表单底部按钮 --> | 270 | <!-- 表单底部按钮 --> |
| 238 | <template v-slot:foot> | 271 | <template v-slot:foot> |
| 239 | - <el-button type="primary" @click="saveForm">保存</el-button> | 272 | + <div v-if="state.main_attr_set"> |
| 240 | - <el-button @click="cancel">取消</el-button> | 273 | + <el-button type="primary" @click="saveForm">保存</el-button> |
| 274 | + <el-button @click="cancel">取消</el-button> | ||
| 275 | + </div> | ||
| 241 | </template> | 276 | </template> |
| 242 | </vue-flow-editor> | 277 | </vue-flow-editor> |
| 243 | </div> | 278 | </div> |
| ... | @@ -388,6 +423,70 @@ export default { | ... | @@ -388,6 +423,70 @@ export default { |
| 388 | dialogUserFormVisible: false, | 423 | dialogUserFormVisible: false, |
| 389 | activeName: 'node', | 424 | activeName: 'node', |
| 390 | attr_radio: '基础属性', | 425 | attr_radio: '基础属性', |
| 426 | + main_attr_set: true, | ||
| 427 | + more_attr_switch: false, | ||
| 428 | + more_attr: [ // 更多属性 | ||
| 429 | + { | ||
| 430 | + id: 'no-1', | ||
| 431 | + label: '审批意见', | ||
| 432 | + data: [ | ||
| 433 | + { | ||
| 434 | + id: 'text-1', | ||
| 435 | + label: '文本意见', | ||
| 436 | + show: true, | ||
| 437 | + desc: '用户在处理流程时,可通过输入框或快捷选项录入文本意见。', | ||
| 438 | + btnText: '', | ||
| 439 | + }, | ||
| 440 | + { | ||
| 441 | + id: 'signature-1', | ||
| 442 | + label: '手写签名', | ||
| 443 | + show: false, | ||
| 444 | + desc: '用户在处理流程时,需要签名确认。', | ||
| 445 | + btnText: '' | ||
| 446 | + }, | ||
| 447 | + ] | ||
| 448 | + }, | ||
| 449 | + { | ||
| 450 | + id: 'no-2', | ||
| 451 | + label: '节点操作', | ||
| 452 | + data: [ | ||
| 453 | + { | ||
| 454 | + id: 'node-1', | ||
| 455 | + label: '提交', | ||
| 456 | + show: true, | ||
| 457 | + desc: '用户在处理流程时点击此按钮,将保存用户在此节点中对数据的更改,流程数据流转至后续节点。', | ||
| 458 | + btnText: '提交' | ||
| 459 | + }, | ||
| 460 | + { | ||
| 461 | + id: 'node-2', | ||
| 462 | + label: '暂存', | ||
| 463 | + show: false, | ||
| 464 | + desc: '暂存后将保存在此节点中对数据的更改,流程不发生流转。', | ||
| 465 | + btnText: '暂存' | ||
| 466 | + }, | ||
| 467 | + { | ||
| 468 | + id: 'node-3', | ||
| 469 | + label: '撤回', | ||
| 470 | + show: false, | ||
| 471 | + desc: '开启后,用户在处理流程时点击此按钮,将保存用户在此节点中对数据的更改,同时流程退回到指定的节点中。', | ||
| 472 | + btnText: '撤回' | ||
| 473 | + }, | ||
| 474 | + { | ||
| 475 | + id: 'node-4', | ||
| 476 | + label: '回退', | ||
| 477 | + show: false, | ||
| 478 | + desc: '开启后,用户在处理流程时点击此按钮,将保存用户在此节点中对数据的更改,同时流程退回到指定的节点中。', | ||
| 479 | + btnText: '回退' | ||
| 480 | + }, | ||
| 481 | + ], | ||
| 482 | + } | ||
| 483 | + ], | ||
| 484 | + more_attr_data: { | ||
| 485 | + label: '', | ||
| 486 | + show: false, | ||
| 487 | + desc: '', | ||
| 488 | + btnText: '', | ||
| 489 | + }, | ||
| 391 | node_name: '', // 节点名称 | 490 | node_name: '', // 节点名称 |
| 392 | userTags: [ // 节点负责人 | 491 | userTags: [ // 节点负责人 |
| 393 | { id: "user-1-1", name: "用户1-1" } | 492 | { id: "user-1-1", name: "用户1-1" } |
| ... | @@ -666,6 +765,14 @@ export default { | ... | @@ -666,6 +765,14 @@ export default { |
| 666 | editor.closeModel() | 765 | editor.closeModel() |
| 667 | } | 766 | } |
| 668 | 767 | ||
| 768 | + const setMoreAttr = (attr: any, index: any) => { // 打开更多属性细节回调 | ||
| 769 | + state.main_attr_set = false; | ||
| 770 | + state.more_attr_data = attr['data'][index]; // 同步数据 | ||
| 771 | + } | ||
| 772 | + const onConfirmMoreAttr = (item: any) => { // 保存更多属性细节回调 | ||
| 773 | + state.main_attr_set = true; | ||
| 774 | + } | ||
| 775 | + | ||
| 669 | /** | 776 | /** |
| 670 | * 保存表单信息 | 777 | * 保存表单信息 |
| 671 | * | 778 | * |
| ... | @@ -678,7 +785,6 @@ export default { | ... | @@ -678,7 +785,6 @@ export default { |
| 678 | // } | 785 | // } |
| 679 | // }) | 786 | // }) |
| 680 | state.detailModel.text = state.node_name | 787 | state.detailModel.text = state.node_name |
| 681 | - | ||
| 682 | // state.detailModel.label = state.node_name | 788 | // state.detailModel.label = state.node_name |
| 683 | // 更新流程图信息 | 789 | // 更新流程图信息 |
| 684 | editor.updateModel(state.detailModel) | 790 | editor.updateModel(state.detailModel) |
| ... | @@ -686,6 +792,7 @@ export default { | ... | @@ -686,6 +792,7 @@ export default { |
| 686 | console.log('节点名称', state.node_name) | 792 | console.log('节点名称', state.node_name) |
| 687 | console.log('节点负责人', state.userTags) | 793 | console.log('节点负责人', state.userTags) |
| 688 | console.log('字段权限', state.field_auths) | 794 | console.log('字段权限', state.field_auths) |
| 795 | + console.log('更多属性', state.more_attr) | ||
| 689 | } | 796 | } |
| 690 | 797 | ||
| 691 | /** | 798 | /** |
| ... | @@ -916,6 +1023,8 @@ export default { | ... | @@ -916,6 +1023,8 @@ export default { |
| 916 | onDragEndNode, | 1023 | onDragEndNode, |
| 917 | onDblClickEdge, | 1024 | onDblClickEdge, |
| 918 | cancel, | 1025 | cancel, |
| 1026 | + setMoreAttr, | ||
| 1027 | + onConfirmMoreAttr, | ||
| 919 | saveForm, | 1028 | saveForm, |
| 920 | handleBeforeDelete, | 1029 | handleBeforeDelete, |
| 921 | handleAfterDelete, | 1030 | handleAfterDelete, |
| ... | @@ -986,4 +1095,66 @@ body { | ... | @@ -986,4 +1095,66 @@ body { |
| 986 | color: #dcdfe6; | 1095 | color: #dcdfe6; |
| 987 | } | 1096 | } |
| 988 | } | 1097 | } |
| 1098 | + | ||
| 1099 | +.more-attr { | ||
| 1100 | + .more-attr-item { | ||
| 1101 | + .title { | ||
| 1102 | + font-size: 14px; | ||
| 1103 | + color: #000; | ||
| 1104 | + margin-bottom: 8px; | ||
| 1105 | + } | ||
| 1106 | + .content { | ||
| 1107 | + font-size: 14px; | ||
| 1108 | + background: #f0f1f4; | ||
| 1109 | + border: 1px solid #e6e8ed; | ||
| 1110 | + border-radius: 2px; | ||
| 1111 | + padding: 10px; | ||
| 1112 | + position: relative; | ||
| 1113 | + display: flex; | ||
| 1114 | + justify-content: space-between; | ||
| 1115 | + align-items: center; | ||
| 1116 | + .left { | ||
| 1117 | + } | ||
| 1118 | + .right { | ||
| 1119 | + } | ||
| 1120 | + .active { | ||
| 1121 | + color: #409eff; | ||
| 1122 | + } | ||
| 1123 | + } | ||
| 1124 | + .content:hover .btn-action { | ||
| 1125 | + display: flex; | ||
| 1126 | + } | ||
| 1127 | + .btn-action { | ||
| 1128 | + background: hsla(0, 0%, 94%, 0.8); | ||
| 1129 | + display: none; | ||
| 1130 | + font-size: 14px; | ||
| 1131 | + height: 100%; | ||
| 1132 | + left: 0; | ||
| 1133 | + position: absolute; | ||
| 1134 | + text-align: center; | ||
| 1135 | + top: 0; | ||
| 1136 | + width: 100%; | ||
| 1137 | + cursor: pointer; | ||
| 1138 | + align-items: center; | ||
| 1139 | + justify-content: center; | ||
| 1140 | + } | ||
| 1141 | + } | ||
| 1142 | +} | ||
| 1143 | +.more-attr-set { | ||
| 1144 | + .more-attr-switch { | ||
| 1145 | + display: flex; | ||
| 1146 | + justify-content: space-between; | ||
| 1147 | + margin-top: 10px; | ||
| 1148 | + align-items: center; | ||
| 1149 | + .more-attr-title { | ||
| 1150 | + font-size: 14px; | ||
| 1151 | + font-weight: bold; | ||
| 1152 | + } | ||
| 1153 | + } | ||
| 1154 | + .more-attr-tip { | ||
| 1155 | + color: #525967; | ||
| 1156 | + margin-top: 10px; | ||
| 1157 | + font-size: 14px; | ||
| 1158 | + } | ||
| 1159 | +} | ||
| 989 | </style> | 1160 | </style> | ... | ... |
-
Please register or login to post a comment