update 修改面板formData来源

This commit is contained in:
LiuHao 2024-01-29 18:11:11 +08:00
parent dc889fd1d5
commit dba1b6ced9
7 changed files with 103 additions and 159 deletions

View File

@ -21,20 +21,17 @@ import { GatewayPanel } from 'bpmnDesign';
interface PropType { interface PropType {
modeler: Modeler; modeler: Modeler;
element: Element; element: Element;
categorys?: any[];
} }
const props = withDefaults(defineProps<PropType>(), { const props = withDefaults(defineProps<PropType>(), {});
categorys: () => []
});
const { nameChange, idChange } = usePanel({ const { nameChange, idChange } = usePanel({
modeler: props.modeler,
element: toRaw(props.element) element: toRaw(props.element)
}); });
const { parse, formData } = useParseElement<GatewayPanel>({ const { parseData } = useParseElement({
modeler: props.modeler,
element: toRaw(props.element) element: toRaw(props.element)
}); });
const formData = ref(parseData<GatewayPanel>());
const formRules = ref<ElFormRules>({ const formRules = ref<ElFormRules>({
processCategory: [{ required: true, message: '请选择', trigger: 'blur' }], processCategory: [{ required: true, message: '请选择', trigger: 'blur' }],
id: [{ required: true, message: '请输入', trigger: 'blur' }], id: [{ required: true, message: '请输入', trigger: 'blur' }],

View File

@ -28,27 +28,23 @@ interface PropType {
} }
const props = withDefaults(defineProps<PropType>(), {}); const props = withDefaults(defineProps<PropType>(), {});
const { parse, formData } = useParseElement<ProcessPanel>({ const { parseData } = useParseElement({
modeler: props.modeler, element: toRaw(props.element)
element: toRaw(props.element),
initData: {} as any
}); });
const { idChange, nameChange } = usePanel({ const { idChange, nameChange } = usePanel({
modeler: props.modeler,
element: toRaw(props.element) element: toRaw(props.element)
}); });
// const formData = ref<ProcessPanel>({ const formData = ref<ProcessPanel>();
// processCategory: '',
// id: '',
// name: '',
// documentation: ''
// });
const formRules = ref<ElFormRules>({ const formRules = ref<ElFormRules>({
id: [{ required: true, message: '请输入', trigger: 'blur' }], id: [{ required: true, message: '请输入', trigger: 'blur' }],
name: [{ required: true, message: '请输入', trigger: 'blur' }] name: [{ required: true, message: '请输入', trigger: 'blur' }]
}); });
onBeforeMount(() => {
formData.value = parseData<ProcessPanel>();
});
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -27,20 +27,17 @@ import { SequenceFlowPanel } from 'bpmnDesign';
interface PropType { interface PropType {
modeler: Modeler; modeler: Modeler;
element: Element; element: Element;
categorys?: any[];
} }
const props = withDefaults(defineProps<PropType>(), { const props = withDefaults(defineProps<PropType>(), {});
categorys: () => []
});
const { nameChange, idChange, updateProperties } = usePanel({ const { nameChange, idChange, updateProperties } = usePanel({
modeler: props.modeler,
element: toRaw(props.element) element: toRaw(props.element)
}); });
const { parse, formData } = useParseElement<SequenceFlowPanel>({ const { parseData } = useParseElement({
modeler: props.modeler,
element: toRaw(props.element) element: toRaw(props.element)
}); });
const formData = ref(parseData<SequenceFlowPanel>());
const formRules = ref<ElFormRules>({ const formRules = ref<ElFormRules>({
processCategory: [{ required: true, message: '请选择', trigger: 'blur' }], processCategory: [{ required: true, message: '请选择', trigger: 'blur' }],
id: [{ required: true, message: '请输入', trigger: 'blur' }], id: [{ required: true, message: '请输入', trigger: 'blur' }],

View File

@ -8,7 +8,7 @@
<el-input v-model="formData.name" @change="nameChange"> </el-input> <el-input v-model="formData.name" @change="nameChange"> </el-input>
</el-form-item> </el-form-item>
<el-form-item label="执行监听器" style="margin-bottom: 0"> </el-form-item> <el-form-item label="执行监听器" style="margin-bottom: 0"> </el-form-item>
<ExecutionListener :modeler="modeler" :element="element"></ExecutionListener> <ExecutionListener :element="element"></ExecutionListener>
</el-form> </el-form>
</div> </div>
</template> </template>
@ -19,24 +19,19 @@ import { Modeler, Element } from 'bpmn';
import { StartEndPanel } from 'bpmnDesign'; import { StartEndPanel } from 'bpmnDesign';
interface PropType { interface PropType {
modeler: Modeler;
element: Element; element: Element;
categorys?: any[];
} }
const props = withDefaults(defineProps<PropType>(), { const props = withDefaults(defineProps<PropType>(), {});
categorys: () => []
});
const { nameChange, idChange } = usePanel({ const { nameChange, idChange } = usePanel({
modeler: props.modeler,
element: toRaw(props.element) element: toRaw(props.element)
}); });
const { parse, formData } = useParseElement<StartEndPanel>({ const { parseData } = useParseElement({
modeler: props.modeler,
element: toRaw(props.element) element: toRaw(props.element)
}); });
const formData = ref(parseData<StartEndPanel>());
const formRules = ref<ElFormRules>({ const formRules = ref<ElFormRules>({
processCategory: [{ required: true, message: '请选择', trigger: 'blur' }],
id: [{ required: true, message: '请输入', trigger: 'blur' }], id: [{ required: true, message: '请输入', trigger: 'blur' }],
name: [{ required: true, message: '请输入', trigger: 'blur' }] name: [{ required: true, message: '请输入', trigger: 'blur' }]
}); });

View File

@ -115,7 +115,7 @@
</div> </div>
</template> </template>
<div> <div>
<TaskListener v-if="showConfig.taskListener" :modeler="modeler" :element="element"></TaskListener> <TaskListener v-if="showConfig.taskListener" :element="element"></TaskListener>
</div> </div>
</el-collapse-item> </el-collapse-item>
<el-collapse-item v-if="showConfig.executionListener" name="4"> <el-collapse-item v-if="showConfig.executionListener" name="4">
@ -128,7 +128,7 @@
</div> </div>
</template> </template>
<div> <div>
<ExecutionListener v-if="showConfig.executionListener" :modeler="modeler" :element="element"></ExecutionListener> <ExecutionListener v-if="showConfig.executionListener" :element="element"></ExecutionListener>
</div> </div>
</el-collapse-item> </el-collapse-item>
<el-form-item v-if="showConfig.isForCompensation" prop="isForCompensation" label="是否为补偿"> <el-form-item v-if="showConfig.isForCompensation" prop="isForCompensation" label="是否为补偿">
@ -163,7 +163,7 @@ import usePanel from '@/components/BpmnDesign/hooks/usePanel';
import UserSelect from '@/components/UserSelect'; import UserSelect from '@/components/UserSelect';
import RoleSelect from '@/components/RoleSelect'; import RoleSelect from '@/components/RoleSelect';
import DueDate from '@/components/BpmnDesign/panel/property/DueDate.vue'; import DueDate from '@/components/BpmnDesign/panel/property/DueDate.vue';
import { Element, Moddle, Modeler, Modeling } from 'bpmn'; import { Element } from 'bpmn';
import { TaskPanel } from 'bpmnDesign'; import { TaskPanel } from 'bpmnDesign';
import { AllocationTypeEnum, MultipleUserAuditTypeEnum, SpecifyDescEnum } from '@/enums/bpmn/IndexEnums'; import { AllocationTypeEnum, MultipleUserAuditTypeEnum, SpecifyDescEnum } from '@/enums/bpmn/IndexEnums';
import { BellFilled, Checked, InfoFilled } from '@element-plus/icons-vue'; import { BellFilled, Checked, InfoFilled } from '@element-plus/icons-vue';
@ -172,27 +172,24 @@ import { UserVO } from '@/api/system/user/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
interface PropType { interface PropType {
modeler: Modeler;
element: Element; element: Element;
} }
const props = withDefaults(defineProps<PropType>(), {}); const props = withDefaults(defineProps<PropType>(), {});
const { nameChange, idChange, showConfig, updateProperties, createModdleElement } = usePanel({ const { nameChange, idChange, showConfig, updateProperties, updateProperty } = usePanel({
modeler: props.modeler,
element: toRaw(props.element) element: toRaw(props.element)
}); });
const { parse, formData } = useParseElement<TaskPanel>({ const { parseData } = useParseElement({
modeler: props.modeler, element: toRaw(props.element)
element: toRaw(props.element),
initData: {
id: '',
name: '',
dueDate: '',
multipleUserAuditType: MultipleUserAuditTypeEnum.SERIAL,
allocationType: AllocationTypeEnum.USER,
specifyDesc: SpecifyDescEnum.SPECIFY_SINGLE
}
}); });
const initData = {
id: '',
name: '',
dueDate: '',
multipleUserAuditType: MultipleUserAuditTypeEnum.SERIAL,
allocationType: AllocationTypeEnum.USER,
specifyDesc: SpecifyDescEnum.SPECIFY_SINGLE
};
const formData = ref({ ...initData, ...parseData<TaskPanel>() });
const currentCollapseItem = ref(['1', '2']); const currentCollapseItem = ref(['1', '2']);
const userSelectRef = ref<InstanceType<typeof UserSelect>>(); const userSelectRef = ref<InstanceType<typeof UserSelect>>();
const singleUserSelectRef = ref<InstanceType<typeof UserSelect>>(); const singleUserSelectRef = ref<InstanceType<typeof UserSelect>>();
@ -214,43 +211,11 @@ const openDueDate = () => {
}; };
const singleUserSelectCallBack = (data: UserVO[]) => { const singleUserSelectCallBack = (data: UserVO[]) => {
const modeling = props.modeler.get<Modeling>('modeling');
if (data.length !== 0) { if (data.length !== 0) {
const user = data[0]; const user = data[0];
formData.value.userName = user.userName; formData.value.userName = user.userName;
const userId = user.userId; const userId = user.userId;
updateProperties({ 'flowable:assignee': userId }); updateProperties({ 'flowable:assignee': userId });
let extensionElements = props.element.businessObject.get('extensionElements');
if (!extensionElements) {
extensionElements = createModdleElement('bpmn:ExtensionElements', {}, props.element.businessObject);
modeling.updateModdleProperties(toRaw(props.element), toRaw(props.element.businessObject), { extensionElements });
}
let propertiesElements;
if (!extensionElements.values) {
propertiesElements = createModdleElement('flowable:properties', {}, extensionElements);
modeling.updateModdleProperties(toRaw(props.element), extensionElements, {
values: [...extensionElements.get('values'), propertiesElements]
});
} else {
propertiesElements = extensionElements.values.find((item) => item.$type === 'flowable:properties');
}
let userNameProperty;
if (propertiesElements.values) {
userNameProperty = propertiesElements.values.find((item) => {
if (item['name'] === 'userName') {
return true;
}
return false;
});
userNameProperty['name'] = 'userName';
userNameProperty['value'] = user.userName;
} else {
userNameProperty = createModdleElement('flowable:property', { name: 'userName', value: user.userName }, propertiesElements);
modeling.updateModdleProperties(toRaw(props.element), propertiesElements, {
values: [...propertiesElements.get('values'), userNameProperty]
});
}
} else { } else {
updateProperties({ 'flowable:assignee': undefined }); updateProperties({ 'flowable:assignee': undefined });
} }
@ -288,59 +253,63 @@ const selectRoleLength = computed(() => {
return 0; return 0;
} }
}); });
watch( // watch(
() => formData.value.roles, // () => formData.value.roles,
(newVal: Record<string, any>[]) => { // (newVal: Record<string, any>[]) => {
if (newVal?.length > 0) { // if (newVal?.length > 0) {
// userId , // // userId ,
const roleIds = newVal.map((item) => item.roleId).join(','); // const roleIds = newVal.map((item) => item.roleId).join(',');
updateProperties({ 'flowable:candidateGroups': roleIds }); // updateProperties({ 'flowable:candidateGroups': roleIds });
} else { // } else {
updateProperties({ 'flowable:candidateGroups': undefined }); // updateProperties({ 'flowable:candidateGroups': undefined });
} // }
}, // },
{ deep: true } // { deep: true }
); // );
watch( // watch(
() => formData.value.async, // () => formData.value.async,
(newVal: boolean) => { // (newVal: boolean) => {
if (newVal) { // if (newVal) {
updateProperties({ 'flowable:async': true }); // updateProperties({ 'flowable:async': true });
} else { // } else {
updateProperties({ 'flowable:async': undefined }); // updateProperties({ 'flowable:async': undefined });
} // }
} // }
); // );
watch( // watch(
() => formData.value.skipExpression, // () => formData.value.skipExpression,
(newVal: string) => { // (newVal: string) => {
if (newVal) { // if (newVal) {
updateProperties({ 'flowable:skipExpression': newVal }); // updateProperties({ 'flowable:skipExpression': newVal });
} else { // } else {
updateProperties({ 'flowable:skipExpression': undefined }); // updateProperties({ 'flowable:skipExpression': undefined });
} // }
} // }
); // );
watch( // watch(
() => formData.value.priority, // () => formData.value.priority,
(newVal: number) => { // (newVal: number) => {
if (newVal) { // if (newVal) {
updateProperties({ 'flowable:priority': newVal }); // updateProperties({ 'flowable:priority': newVal });
} else { // } else {
updateProperties({ 'flowable:priority': undefined }); // updateProperties({ 'flowable:priority': undefined });
} // }
} // }
); // );
watch( // watch(
() => formData.value.dueDate, // () => formData.value.dueDate,
(newVal: string) => { // (newVal: string) => {
if (newVal) { // if (newVal) {
updateProperties({ 'flowable:dueDate': newVal }); // updateProperties({ 'flowable:dueDate': newVal });
} else { // } else {
updateProperties({ 'flowable:dueDate': undefined }); // updateProperties({ 'flowable:dueDate': undefined });
} // }
} // }
); // );
onBeforeMount(() => {
// formData.value = { ...initData, ...parseData<TaskPanel>() };
});
const formRules = ref<ElFormRules>({ const formRules = ref<ElFormRules>({
id: [{ required: true, message: '请输入', trigger: 'blur' }], id: [{ required: true, message: '请输入', trigger: 'blur' }],

View File

@ -82,13 +82,9 @@ import useDialog from '@/hooks/useDialog';
const emit = defineEmits(['close']); const emit = defineEmits(['close']);
interface PropType { interface PropType {
modeler: Modeler;
element: Element; element: Element;
categorys?: any[];
} }
const props = withDefaults(defineProps<PropType>(), { const props = withDefaults(defineProps<PropType>(), {});
categorys: () => []
});
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@ -97,8 +93,7 @@ const formDialog = useDialog({
title: selectRow.value ? '编辑&保存' : '新增&保存' title: selectRow.value ? '编辑&保存' : '新增&保存'
}); });
const { showConfig, elementType, updateProperties } = usePanel({ const { showConfig, elementType, updateProperties, moddle } = usePanel({
modeler: props.modeler,
element: toRaw(props.element) element: toRaw(props.element)
}); });
@ -177,17 +172,17 @@ const updateElement = () => {
if (data.length) { if (data.length) {
let extensionElements = props.element.businessObject.get('extensionElements'); let extensionElements = props.element.businessObject.get('extensionElements');
if (!extensionElements) { if (!extensionElements) {
extensionElements = props.modeler.get<Moddle>('moddle').create('bpmn:ExtensionElements'); extensionElements = moddle.create('bpmn:ExtensionElements');
} }
// //
extensionElements.values = extensionElements.values?.filter((item) => item.$type !== 'flowable:ExecutionListener') ?? []; extensionElements.values = extensionElements.values?.filter((item) => item.$type !== 'flowable:ExecutionListener') ?? [];
data.forEach((item) => { data.forEach((item) => {
const executionListener = props.modeler.get<Moddle>('moddle').create('flowable:ExecutionListener'); const executionListener = moddle.create('flowable:ExecutionListener');
executionListener['event'] = item.event; executionListener['event'] = item.event;
executionListener[item.type] = item.className; executionListener[item.type] = item.className;
if (item.params && item.params.length) { if (item.params && item.params.length) {
item.params.forEach((field) => { item.params.forEach((field) => {
const fieldElement = props.modeler.get<Moddle>('moddle').create('flowable:Field'); const fieldElement = moddle.create('flowable:Field');
fieldElement['name'] = field.name; fieldElement['name'] = field.name;
fieldElement[field.type] = field.value; fieldElement[field.type] = field.value;
executionListener.get('fields').push(fieldElement); executionListener.get('fields').push(fieldElement);

View File

@ -75,7 +75,7 @@
import ListenerParam from './ListenerParam.vue'; import ListenerParam from './ListenerParam.vue';
import { VxeTableEvents, VxeTableInstance, VxeTablePropTypes } from 'vxe-table'; import { VxeTableEvents, VxeTableInstance, VxeTablePropTypes } from 'vxe-table';
import { TaskListenerVO } from 'bpmnDesign'; import { TaskListenerVO } from 'bpmnDesign';
import { Moddle, Modeler, Element } from 'bpmn'; import { Element } from 'bpmn';
import usePanel from '@/components/BpmnDesign/hooks/usePanel'; import usePanel from '@/components/BpmnDesign/hooks/usePanel';
import useDialog from '@/hooks/useDialog'; import useDialog from '@/hooks/useDialog';
@ -83,20 +83,15 @@ import useDialog from '@/hooks/useDialog';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
interface PropType { interface PropType {
modeler: Modeler;
element: Element; element: Element;
categorys?: any[];
} }
const props = withDefaults(defineProps<PropType>(), { const props = withDefaults(defineProps<PropType>(), {});
categorys: () => []
});
const selectRow = ref<TaskListenerVO | null>(); const selectRow = ref<TaskListenerVO | null>();
const formDialog = useDialog({ const formDialog = useDialog({
title: selectRow.value ? '编辑&保存' : '新增&保存' title: selectRow.value ? '编辑&保存' : '新增&保存'
}); });
const { showConfig, elementType, updateProperties } = usePanel({ const { showConfig, elementType, updateProperties, moddle } = usePanel({
modeler: props.modeler,
element: toRaw(props.element) element: toRaw(props.element)
}); });
@ -178,17 +173,17 @@ const updateElement = () => {
if (data.length) { if (data.length) {
let extensionElements = props.element.businessObject.get('extensionElements'); let extensionElements = props.element.businessObject.get('extensionElements');
if (!extensionElements) { if (!extensionElements) {
extensionElements = props.modeler.get<Moddle>('moddle').create('bpmn:ExtensionElements'); extensionElements = moddle.create('bpmn:ExtensionElements');
} }
// //
extensionElements.values = extensionElements.values?.filter((item) => item.$type !== 'flowable:TaskListener') ?? []; extensionElements.values = extensionElements.values?.filter((item) => item.$type !== 'flowable:TaskListener') ?? [];
data.forEach((item) => { data.forEach((item) => {
const taskListener = props.modeler.get<Moddle>('moddle').create('flowable:TaskListener'); const taskListener = moddle.create('flowable:TaskListener');
taskListener['event'] = item.event; taskListener['event'] = item.event;
taskListener[item.type] = item.className; taskListener[item.type] = item.className;
if (item.params && item.params.length) { if (item.params && item.params.length) {
item.params.forEach((field) => { item.params.forEach((field) => {
const fieldElement = props.modeler.get<Moddle>('moddle').create('flowable:Field'); const fieldElement = moddle.create('flowable:Field');
fieldElement['name'] = field.name; fieldElement['name'] = field.name;
fieldElement[field.type] = field.value; fieldElement[field.type] = field.value;
taskListener.get('fields').push(fieldElement); taskListener.get('fields').push(fieldElement);