update 优化面板工具

This commit is contained in:
LiuHao 2024-01-21 22:35:34 +08:00
parent d27bc8be46
commit aadc43d5dc
9 changed files with 192 additions and 18 deletions

View File

@ -9,6 +9,9 @@
import { NodeName } from './assets/lang/zh';
import TaskPanel from './panel/TaskPanel.vue';
import ProcessPanel from './panel/ProcessPanel.vue';
import StartEndPanel from './panel/StartEndPanel.vue';
import GatewayPanel from './panel/GatewayPanel.vue';
import SequenceFlowPanel from './panel/SequenceFlowPanel.vue';
interface propsType {
users: Array<any>;
groups: Array<any>;
@ -49,10 +52,10 @@ const processType = ['bpmn:Process'];
const component = computed(() => {
if (!element.value) return null;
const type = element.value.type;
if (startEndType.includes(type)) return 'startEndPanel';
if (startEndType.includes(type)) return StartEndPanel;
if (taskType.includes(type)) return TaskPanel;
if (sequenceType.includes(type)) return 'sequenceFlowPanel';
if (gatewayType.includes(type)) return 'gatewayPanel';
if (sequenceType.includes(type)) return SequenceFlowPanel;
if (gatewayType.includes(type)) return GatewayPanel;
if (processType.includes(type)) return ProcessPanel;
return console.error('no ' + type + ' type panel');
});

View File

@ -36,9 +36,7 @@ export default (ops: Options) => {
const documentationElement = modeler.get('moddle').create('bpmn:Documentation', { text: newVal });
updateProperties({ documentation: [documentationElement] });
} else {
const elements = element.businessObject;
delete elements.documentation;
updateProperties({ process: elements });
updateProperties({ documentation: null });
}
};

View File

@ -50,9 +50,11 @@
<el-main style="padding: 0">
<div ref="canvas" class="canvas" />
</el-main>
<el-aside style="width: 400px; min-height: 650px; background-color: #f0f2f5">
<PropertyPanel v-if="bpmnModeler" :modeler="bpmnModeler" :users="users" :groups="groups" :categorys="categorys" />
</el-aside>
<el-scrollbar height="650px">
<el-aside style="width: 400px; min-height: 650px; background-color: #f0f2f5">
<PropertyPanel v-if="bpmnModeler" :modeler="bpmnModeler" :users="users" :groups="groups" :categorys="categorys" />
</el-aside>
</el-scrollbar>
</el-container>
</el-container>
</div>

View File

@ -0,0 +1,47 @@
<template>
<div>
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="80px">
<el-form-item prop="id" label="节点 ID">
<el-input v-model="formData.id" @change="idChange"> </el-input>
</el-form-item>
<el-form-item prop="name" label="节点名称">
<el-input v-model="formData.name" @change="nameChange"> </el-input>
</el-form-item>
<el-form-item prop="documentation" label="节点描述">
<el-input v-model="formData.documentation" @change="documentationChange"> </el-input>
</el-form-item>
<el-form-item label="执行监听器" style="margin-bottom: 0"> </el-form-item>
<ExecutionListener :modeler="modeler" :element="element"></ExecutionListener>
</el-form>
</div>
</template>
<script setup lang="ts">
import { GatewayPanel } from 'bpmnDesign';
import useParseElement from '@/components/BpmnDesign/hooks/useParseElement';
import usePanel from '@/components/BpmnDesign/hooks/usePanel';
interface PropType {
modeler: any;
element: any;
categorys?: any[];
}
const props = withDefaults(defineProps<PropType>(), {
categorys: () => []
});
const { documentationChange, nameChange, idChange } = usePanel({
modeler: props.modeler,
element: toRaw(props.element)
});
const { parse, formData } = useParseElement<GatewayPanel>({
modeler: props.modeler,
element: toRaw(props.element)
});
const formRules = ref<ElFormRules>({
processCategory: [{ required: true, message: '请选择', trigger: 'blur' }],
id: [{ required: true, message: '请输入', trigger: 'blur' }],
name: [{ required: true, message: '请输入', trigger: 'blur' }]
});
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,66 @@
<template>
<div>
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="80px">
<el-form-item prop="id" label="节点 ID">
<el-input v-model="formData.id" @change="idChange"> </el-input>
</el-form-item>
<el-form-item prop="name" label="节点名称">
<el-input v-model="formData.name" @change="nameChange"> </el-input>
</el-form-item>
<el-form-item prop="documentation" label="节点描述">
<el-input v-model="formData.documentation" @change="documentationChange"> </el-input>
</el-form-item>
<el-form-item prop="conditionExpression" label="跳过条件">
<el-input v-model="formData.conditionExpression" @change="conditionExpressionChange"> </el-input>
</el-form-item>
<el-form-item prop="skipExpression" label="跳过表达式">
<el-input v-model="formData.skipExpression" @change="skipExpressionChange"> </el-input>
</el-form-item>
<el-form-item label="执行监听器" style="margin-bottom: 0"> </el-form-item>
<ExecutionListener :modeler="modeler" :element="element"></ExecutionListener>
</el-form>
</div>
</template>
<script setup lang="ts">
import { SequenceFlowPanel } from 'bpmnDesign';
import useParseElement from '@/components/BpmnDesign/hooks/useParseElement';
import usePanel from '@/components/BpmnDesign/hooks/usePanel';
interface PropType {
modeler: any;
element: any;
categorys?: any[];
}
const props = withDefaults(defineProps<PropType>(), {
categorys: () => []
});
const { documentationChange, nameChange, idChange, updateProperties } = usePanel({
modeler: props.modeler,
element: toRaw(props.element)
});
const { parse, formData } = useParseElement<SequenceFlowPanel>({
modeler: props.modeler,
element: toRaw(props.element)
});
const formRules = ref<ElFormRules>({
processCategory: [{ required: true, message: '请选择', trigger: 'blur' }],
id: [{ required: true, message: '请输入', trigger: 'blur' }],
name: [{ required: true, message: '请输入', trigger: 'blur' }]
});
const conditionExpressionChange = (val: string) => {
if (val) {
const newCondition = props.modeler.get('moddle').create('bpmn:FormalExpression', { body: val });
updateProperties({ conditionExpression: newCondition });
} else {
updateProperties({ conditionExpression: null });
}
};
const skipExpressionChange = (val: string) => {
updateProperties({ 'flowable:skipExpression': val });
};
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,47 @@
<template>
<div>
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="80px">
<el-form-item prop="id" label="节点 ID">
<el-input v-model="formData.id" @change="idChange"> </el-input>
</el-form-item>
<el-form-item prop="name" label="节点名称">
<el-input v-model="formData.name" @change="nameChange"> </el-input>
</el-form-item>
<el-form-item prop="documentation" label="节点描述">
<el-input v-model="formData.documentation" @change="documentationChange"> </el-input>
</el-form-item>
<el-form-item label="执行监听器" style="margin-bottom: 0"> </el-form-item>
<ExecutionListener :modeler="modeler" :element="element"></ExecutionListener>
</el-form>
</div>
</template>
<script setup lang="ts">
import { StartEndPanel } from 'bpmnDesign';
import useParseElement from '@/components/BpmnDesign/hooks/useParseElement';
import usePanel from '@/components/BpmnDesign/hooks/usePanel';
interface PropType {
modeler: any;
element: any;
categorys?: any[];
}
const props = withDefaults(defineProps<PropType>(), {
categorys: () => []
});
const { documentationChange, nameChange, idChange } = usePanel({
modeler: props.modeler,
element: toRaw(props.element)
});
const { parse, formData } = useParseElement<StartEndPanel>({
modeler: props.modeler,
element: toRaw(props.element)
});
const formRules = ref<ElFormRules>({
processCategory: [{ required: true, message: '请选择', trigger: 'blur' }],
id: [{ required: true, message: '请输入', trigger: 'blur' }],
name: [{ required: true, message: '请输入', trigger: 'blur' }]
});
</script>
<style lang="scss" scoped></style>

View File

@ -1,6 +1,6 @@
<template>
<div>
<el-form ref="formRef" v-model="formData" label-width="80px">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="80px">
<el-form-item prop="id" label="节点 ID">
<el-input v-model="formData.id" @change="idChange"> </el-input>
</el-form-item>
@ -41,6 +41,12 @@ const { parse, formData } = useParseElement<TaskPanel>({
modeler: props.modeler,
element: toRaw(props.element)
});
const formRules = ref<ElFormRules>({
processCategory: [{ required: true, message: '请选择', trigger: 'blur' }],
id: [{ required: true, message: '请输入', trigger: 'blur' }],
name: [{ required: true, message: '请输入', trigger: 'blur' }]
});
</script>
<style lang="scss" scoped></style>

View File

@ -286,7 +286,6 @@ const initTableData = () => {
onMounted(() => {
initTableData();
console.log(2222);
});
</script>

20
src/types/bpmn.d.ts vendored
View File

@ -20,21 +20,27 @@ declare module 'bpmnDesign' {
params: ParamVO[];
}
export interface ProcessPanel {
processCategory: string;
interface BasePanel {
id: string;
name: string;
documentation?: string;
}
export interface TaskPanel {
export interface ProcessPanel extends BasePanel {
processCategory: string;
}
export interface TaskPanel extends BasePanel {
processCategory: string;
id: string;
name: string;
documentation: string;
userType: string;
assignee: string;
candidateUsers: string;
candidateGroups: string;
}
export interface StartEndPanel extends BasePanel {}
export interface GatewayPanel extends BasePanel {}
export interface SequenceFlowPanel extends BasePanel {
conditionExpression: string;
skipExpression: string;
}
}