Showing
3 changed files
with
83 additions
and
23 deletions
| ... | @@ -13,7 +13,9 @@ | ... | @@ -13,7 +13,9 @@ |
| 13 | :afterDelete="handleAfterDelete" | 13 | :afterDelete="handleAfterDelete" |
| 14 | :beforeAdd="handleBeforeAdd" | 14 | :beforeAdd="handleBeforeAdd" |
| 15 | :afterAdd="handleAfterAdd" | 15 | :afterAdd="handleAfterAdd" |
| 16 | + @click-canvas="onClickCanvas" | ||
| 16 | @dragend-node="onDragEndNode" | 17 | @dragend-node="onDragEndNode" |
| 18 | + @click-node="onClickNode" | ||
| 17 | @dblclick-node="onDblClickNode" | 19 | @dblclick-node="onDblClickNode" |
| 18 | @dblclick-edge="onDblClickEdge" | 20 | @dblclick-edge="onDblClickEdge" |
| 19 | :controlConfig="state.controlConfig" | 21 | :controlConfig="state.controlConfig" |
| ... | @@ -69,12 +71,13 @@ | ... | @@ -69,12 +71,13 @@ |
| 69 | <template v-slot:model> | 71 | <template v-slot:model> |
| 70 | <el-form | 72 | <el-form |
| 71 | v-if="!!state.detailModel" | 73 | v-if="!!state.detailModel" |
| 72 | - ref="form" | 74 | + ref="formRef" |
| 75 | + :rules="rules" | ||
| 73 | :model="state.detailModel" | 76 | :model="state.detailModel" |
| 74 | label-position="top" | 77 | label-position="top" |
| 75 | label-width="100px" | 78 | label-width="100px" |
| 76 | > | 79 | > |
| 77 | - <template v-if="state.detailModel.activity === undefined"> | 80 | + <!-- <template v-if="state.detailModel.activity === undefined"> --> |
| 78 | <el-tabs | 81 | <el-tabs |
| 79 | v-model="state.activeName" | 82 | v-model="state.activeName" |
| 80 | class="" | 83 | class="" |
| ... | @@ -86,7 +89,7 @@ | ... | @@ -86,7 +89,7 @@ |
| 86 | <div slot="label"> | 89 | <div slot="label"> |
| 87 | 节点名称 <span style="color: red;">*</span> | 90 | 节点名称 <span style="color: red;">*</span> |
| 88 | </div> | 91 | </div> |
| 89 | - <el-input v-model="state.detailModel.label" /> | 92 | + <el-input v-model="state.node_name" /> |
| 90 | </el-form-item> | 93 | </el-form-item> |
| 91 | <div> | 94 | <div> |
| 92 | <div style="font-size: 14px; margin-bottom: 10px;"> | 95 | <div style="font-size: 14px; margin-bottom: 10px;"> |
| ... | @@ -192,14 +195,14 @@ | ... | @@ -192,14 +195,14 @@ |
| 192 | 设置人员配置 | 195 | 设置人员配置 |
| 193 | </el-button> | 196 | </el-button> |
| 194 | </div> --> | 197 | </div> --> |
| 195 | - </template> | 198 | + <!-- </template> --> |
| 196 | - <template v-else> | 199 | + <!-- <template v-else> --> |
| 197 | - <el-form-item label="活动标题"> | 200 | + <!-- <el-form-item label="活动标题"> |
| 198 | <el-input v-model="state.detailModel.text" /> | 201 | <el-input v-model="state.detailModel.text" /> |
| 199 | </el-form-item> | 202 | </el-form-item> |
| 200 | <el-form-item label="活动副标题"> | 203 | <el-form-item label="活动副标题"> |
| 201 | <el-input v-model="state.detailModel.desc" /> | 204 | <el-input v-model="state.detailModel.desc" /> |
| 202 | - </el-form-item> | 205 | + </el-form-item> --> |
| 203 | <!-- <el-form-item label="活动类型"> | 206 | <!-- <el-form-item label="活动类型"> |
| 204 | <el-select v-model="state.detailModel.activity"> | 207 | <el-select v-model="state.detailModel.activity"> |
| 205 | <el-option | 208 | <el-option |
| ... | @@ -210,7 +213,7 @@ | ... | @@ -210,7 +213,7 @@ |
| 210 | /> | 213 | /> |
| 211 | </el-select> | 214 | </el-select> |
| 212 | </el-form-item> --> | 215 | </el-form-item> --> |
| 213 | - </template> | 216 | + <!-- </template> --> |
| 214 | </el-form> | 217 | </el-form> |
| 215 | </template> | 218 | </template> |
| 216 | <!-- 工具栏 --> | 219 | <!-- 工具栏 --> |
| ... | @@ -224,7 +227,7 @@ | ... | @@ -224,7 +227,7 @@ |
| 224 | </template> | 227 | </template> |
| 225 | <!-- 表单底部按钮 --> | 228 | <!-- 表单底部按钮 --> |
| 226 | <template v-slot:foot> | 229 | <template v-slot:foot> |
| 227 | - <el-button type="primary" @click="save">保存</el-button> | 230 | + <el-button type="primary" @click="saveForm">保存</el-button> |
| 228 | <el-button @click="cancel">取消</el-button> | 231 | <el-button @click="cancel">取消</el-button> |
| 229 | </template> | 232 | </template> |
| 230 | </vue-flow-editor> | 233 | </vue-flow-editor> |
| ... | @@ -238,7 +241,7 @@ | ... | @@ -238,7 +241,7 @@ |
| 238 | </template> | 241 | </template> |
| 239 | 242 | ||
| 240 | <script lang="ts"> | 243 | <script lang="ts"> |
| 241 | -import { reactive, onMounted, watch, nextTick } from 'vue' | 244 | +import { ref, reactive, onMounted, watch, nextTick } from 'vue' |
| 242 | import { AppData } from './data.js' | 245 | import { AppData } from './data.js' |
| 243 | import { staticPath } from './utils' | 246 | import { staticPath } from './utils' |
| 244 | import { ElNotification } from 'element-plus' | 247 | import { ElNotification } from 'element-plus' |
| ... | @@ -248,6 +251,7 @@ import { Calendar, Search } from '@element-plus/icons-vue' | ... | @@ -248,6 +251,7 @@ import { Calendar, Search } from '@element-plus/icons-vue' |
| 248 | import SelectUserView from './selectUserView.vue' | 251 | import SelectUserView from './selectUserView.vue' |
| 249 | import { Function } from 'lodash' | 252 | import { Function } from 'lodash' |
| 250 | import { extend } from '@vue/shared' | 253 | import { extend } from '@vue/shared' |
| 254 | +import type { FormInstance, FormRules } from 'element-plus' | ||
| 251 | 255 | ||
| 252 | const G6 = (window as any).G6.default as any | 256 | const G6 = (window as any).G6.default as any |
| 253 | 257 | ||
| ... | @@ -255,6 +259,10 @@ function delay(time: number) { | ... | @@ -255,6 +259,10 @@ function delay(time: number) { |
| 255 | return new Promise((resolve) => setTimeout(resolve, time)) | 259 | return new Promise((resolve) => setTimeout(resolve, time)) |
| 256 | } | 260 | } |
| 257 | 261 | ||
| 262 | +interface RuleForm { | ||
| 263 | + label: string | ||
| 264 | +} | ||
| 265 | + | ||
| 258 | interface myObj { | 266 | interface myObj { |
| 259 | source: string | 267 | source: string |
| 260 | id: string | 268 | id: string |
| ... | @@ -284,6 +292,16 @@ export default { | ... | @@ -284,6 +292,16 @@ export default { |
| 284 | SelectUserView, | 292 | SelectUserView, |
| 285 | }, | 293 | }, |
| 286 | setup(props, context) { | 294 | setup(props, context) { |
| 295 | + | ||
| 296 | + const formRef = ref<any>(null); | ||
| 297 | + | ||
| 298 | + const rules = reactive<FormRules<RuleForm>>({ | ||
| 299 | + label: [ | ||
| 300 | + { required: true, message: '请输入名称', trigger: 'blur' }, | ||
| 301 | + { min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' }, | ||
| 302 | + ], | ||
| 303 | + }) | ||
| 304 | + | ||
| 287 | const state = reactive({ | 305 | const state = reactive({ |
| 288 | data: AppData, // 渲染的数据,数据格式参考G6文档 | 306 | data: AppData, // 渲染的数据,数据格式参考G6文档 |
| 289 | detailModel: null, | 307 | detailModel: null, |
| ... | @@ -361,9 +379,13 @@ export default { | ... | @@ -361,9 +379,13 @@ export default { |
| 361 | dialogUserFormVisible: false, | 379 | dialogUserFormVisible: false, |
| 362 | activeName: 'node', | 380 | activeName: 'node', |
| 363 | attr_radio: '基础属性', | 381 | attr_radio: '基础属性', |
| 382 | + node_name: '', // 节点名称 | ||
| 383 | + userTags: [ // 节点负责人 | ||
| 384 | + { id: "user-1-1", name: "用户1-1" } | ||
| 385 | + ], | ||
| 364 | auth_all_checked: false, | 386 | auth_all_checked: false, |
| 365 | auth_all_edit: false, | 387 | auth_all_edit: false, |
| 366 | - field_auths: [ | 388 | + field_auths: [ // 字段权限 |
| 367 | { | 389 | { |
| 368 | name: '字段1', | 390 | name: '字段1', |
| 369 | visible: { | 391 | visible: { |
| ... | @@ -398,7 +420,6 @@ export default { | ... | @@ -398,7 +420,6 @@ export default { |
| 398 | }, | 420 | }, |
| 399 | }, | 421 | }, |
| 400 | ], | 422 | ], |
| 401 | - userTags: [{ id: "user-1-1", name: "用户1-1" }] | ||
| 402 | }) | 423 | }) |
| 403 | 424 | ||
| 404 | onMounted(() => { | 425 | onMounted(() => { |
| ... | @@ -487,10 +508,21 @@ export default { | ... | @@ -487,10 +508,21 @@ export default { |
| 487 | model.labelCfg = model.labelCfg || { style: {} } | 508 | model.labelCfg = model.labelCfg || { style: {} } |
| 488 | 509 | ||
| 489 | model.data = model.data ? model.data : {} | 510 | model.data = model.data ? model.data : {} |
| 490 | - state.detailModel = model | 511 | + |
| 491 | - editor.openModel() | 512 | + // 判断是否是流程节点 |
| 513 | + let model_id = model.id | ||
| 514 | + if (model_id !== 'start-node' && model_id!== 'end-node') { | ||
| 515 | + state.detailModel = model | ||
| 516 | + editor.openModel() | ||
| 517 | + } | ||
| 518 | + | ||
| 492 | } | 519 | } |
| 493 | 520 | ||
| 521 | + /** | ||
| 522 | + * 点击节点回调 | ||
| 523 | + * | ||
| 524 | + * @param {Event} e - The event object representing the click event. | ||
| 525 | + */ | ||
| 494 | function onClickNode(e: myEvent) { | 526 | function onClickNode(e: myEvent) { |
| 495 | const model = G6.Util.clone(e.item.get('model')) | 527 | const model = G6.Util.clone(e.item.get('model')) |
| 496 | model.style = model.style || {} | 528 | model.style = model.style || {} |
| ... | @@ -498,7 +530,15 @@ export default { | ... | @@ -498,7 +530,15 @@ export default { |
| 498 | 530 | ||
| 499 | model.data = model.data ? model.data : {} | 531 | model.data = model.data ? model.data : {} |
| 500 | state.detailModel = model | 532 | state.detailModel = model |
| 501 | - editor.openModel() | 533 | + |
| 534 | + // 判断是否是流程节点 | ||
| 535 | + let model_id = model.id | ||
| 536 | + if (model_id !== 'start-node' && model_id!== 'end-node') { | ||
| 537 | + state.detailModel = model | ||
| 538 | + editor.openModel() | ||
| 539 | + } else { | ||
| 540 | + editor.closeModel() | ||
| 541 | + } | ||
| 502 | } | 542 | } |
| 503 | 543 | ||
| 504 | /** | 544 | /** |
| ... | @@ -533,12 +573,21 @@ export default { | ... | @@ -533,12 +573,21 @@ export default { |
| 533 | } | 573 | } |
| 534 | 574 | ||
| 535 | /** | 575 | /** |
| 536 | - * Saves the changes made in the editor. | 576 | + * 保存表单信息 |
| 537 | * | 577 | * |
| 538 | */ | 578 | */ |
| 539 | - function save() { | 579 | + async function saveForm() { |
| 540 | - editor.updateModel(state.detailModel) | 580 | + // if (!formRef.value) return |
| 541 | - editor.closeModel() | 581 | + // await formRef.value.validate((valid) => { |
| 582 | + // if (!valid) { | ||
| 583 | + // return false | ||
| 584 | + // } | ||
| 585 | + // }) | ||
| 586 | + // editor.updateModel(state.detailModel) | ||
| 587 | + // editor.closeModel() | ||
| 588 | + console.log(state.node_name) | ||
| 589 | + console.log(state.userTags) | ||
| 590 | + console.log(state.field_auths) | ||
| 542 | } | 591 | } |
| 543 | 592 | ||
| 544 | /** | 593 | /** |
| ... | @@ -639,6 +688,11 @@ export default { | ... | @@ -639,6 +688,11 @@ export default { |
| 639 | state.data.edges = editor.editorState.graph.save().edges | 688 | state.data.edges = editor.editorState.graph.save().edges |
| 640 | } | 689 | } |
| 641 | 690 | ||
| 691 | + function onClickCanvas(e: myEvent) { | ||
| 692 | + console.log('单击画布'); | ||
| 693 | + editor.closeModel() | ||
| 694 | + } | ||
| 695 | + | ||
| 642 | /** | 696 | /** |
| 643 | * 拖动节点结束回调 | 697 | * 拖动节点结束回调 |
| 644 | * | 698 | * |
| ... | @@ -709,17 +763,20 @@ export default { | ... | @@ -709,17 +763,20 @@ export default { |
| 709 | 763 | ||
| 710 | return { | 764 | return { |
| 711 | state, | 765 | state, |
| 766 | + rules, | ||
| 767 | + formRef, | ||
| 712 | 768 | ||
| 713 | showGrid: true, // 是否开启网格 | 769 | showGrid: true, // 是否开启网格 |
| 714 | showMiniMap: false, // 是否开启缩略图 | 770 | showMiniMap: false, // 是否开启缩略图 |
| 715 | showMultipleSelect: true, // 编辑器是否可以多选 | 771 | showMultipleSelect: true, // 编辑器是否可以多选 |
| 716 | 772 | ||
| 773 | + onClickCanvas, | ||
| 717 | onClickNode, | 774 | onClickNode, |
| 718 | onDblClickNode, | 775 | onDblClickNode, |
| 719 | onDragEndNode, | 776 | onDragEndNode, |
| 720 | onDblClickEdge, | 777 | onDblClickEdge, |
| 721 | cancel, | 778 | cancel, |
| 722 | - save, | 779 | + saveForm, |
| 723 | handleBeforeDelete, | 780 | handleBeforeDelete, |
| 724 | handleAfterDelete, | 781 | handleAfterDelete, |
| 725 | handleBeforeAdd, | 782 | handleBeforeAdd, | ... | ... |
| ... | @@ -192,7 +192,7 @@ $transition: all 300ms cubic-bezier(0.23, 1, 0.32, 1); | ... | @@ -192,7 +192,7 @@ $transition: all 300ms cubic-bezier(0.23, 1, 0.32, 1); |
| 192 | } | 192 | } |
| 193 | 193 | ||
| 194 | .vue-flow-editor-model { | 194 | .vue-flow-editor-model { |
| 195 | - position: absolute; | 195 | + // position: absolute; |
| 196 | top: 0; | 196 | top: 0; |
| 197 | left: 0; | 197 | left: 0; |
| 198 | right: 0; | 198 | right: 0; |
| ... | @@ -202,7 +202,7 @@ $transition: all 300ms cubic-bezier(0.23, 1, 0.32, 1); | ... | @@ -202,7 +202,7 @@ $transition: all 300ms cubic-bezier(0.23, 1, 0.32, 1); |
| 202 | transition-duration: 500ms; | 202 | transition-duration: 500ms; |
| 203 | 203 | ||
| 204 | &:before { | 204 | &:before { |
| 205 | - position: absolute; | 205 | + // position: absolute; |
| 206 | top: 0; | 206 | top: 0; |
| 207 | bottom: 0; | 207 | bottom: 0; |
| 208 | left: 0; | 208 | left: 0; |
| ... | @@ -350,4 +350,4 @@ $transition: all 300ms cubic-bezier(0.23, 1, 0.32, 1); | ... | @@ -350,4 +350,4 @@ $transition: all 300ms cubic-bezier(0.23, 1, 0.32, 1); |
| 350 | } | 350 | } |
| 351 | } | 351 | } |
| 352 | } | 352 | } |
| 353 | -} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 353 | +} | ... | ... |
| ... | @@ -56,6 +56,9 @@ export default { | ... | @@ -56,6 +56,9 @@ export default { |
| 56 | editorState.graph = graph | 56 | editorState.graph = graph |
| 57 | commander.init(graph) | 57 | commander.init(graph) |
| 58 | 58 | ||
| 59 | + graph.on('canvas:click', (e) => { | ||
| 60 | + context.emit('click-canvas', e) | ||
| 61 | + }) | ||
| 59 | graph.on('node:click', (e) => { | 62 | graph.on('node:click', (e) => { |
| 60 | context.emit('click-node', e) | 63 | context.emit('click-node', e) |
| 61 | }) | 64 | }) | ... | ... |
-
Please register or login to post a comment