refactor: 重构 bpmnProcessDesigner 组件 ele => antd
This commit is contained in:
@@ -7,286 +7,79 @@
|
|||||||
6. 审批类型
|
6. 审批类型
|
||||||
7. 是否需要签名
|
7. 是否需要签名
|
||||||
-->
|
-->
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<el-divider content-position="left">审批类型</el-divider>
|
|
||||||
<el-form-item prop="approveType">
|
|
||||||
<el-radio-group v-model="approveType.value">
|
|
||||||
<el-radio
|
|
||||||
v-for="(item, index) in APPROVE_TYPE"
|
|
||||||
:key="index"
|
|
||||||
:value="item.value"
|
|
||||||
:label="item.value"
|
|
||||||
>
|
|
||||||
{{ item.label }}
|
|
||||||
</el-radio>
|
|
||||||
</el-radio-group>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-divider content-position="left">审批人拒绝时</el-divider>
|
|
||||||
<el-form-item prop="rejectHandlerType">
|
|
||||||
<el-radio-group
|
|
||||||
v-model="rejectHandlerType"
|
|
||||||
:disabled="returnTaskList.length === 0"
|
|
||||||
@change="updateRejectHandlerType"
|
|
||||||
>
|
|
||||||
<div class="flex-col">
|
|
||||||
<div v-for="(item, index) in REJECT_HANDLER_TYPES" :key="index">
|
|
||||||
<el-radio
|
|
||||||
:key="item.value"
|
|
||||||
:value="item.value"
|
|
||||||
:label="item.label"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-radio-group>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item
|
|
||||||
v-if="rejectHandlerType == RejectHandlerType.RETURN_USER_TASK"
|
|
||||||
label="驳回节点"
|
|
||||||
prop="returnNodeId"
|
|
||||||
>
|
|
||||||
<el-select
|
|
||||||
v-model="returnNodeId"
|
|
||||||
clearable
|
|
||||||
style="width: 100%"
|
|
||||||
@change="updateReturnNodeId"
|
|
||||||
>
|
|
||||||
<el-option
|
|
||||||
v-for="item in returnTaskList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.name"
|
|
||||||
:value="item.id"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-divider content-position="left">审批人为空时</el-divider>
|
|
||||||
<el-form-item prop="assignEmptyHandlerType">
|
|
||||||
<el-radio-group
|
|
||||||
v-model="assignEmptyHandlerType"
|
|
||||||
@change="updateAssignEmptyHandlerType"
|
|
||||||
>
|
|
||||||
<div class="flex-col">
|
|
||||||
<div v-for="(item, index) in ASSIGN_EMPTY_HANDLER_TYPES" :key="index">
|
|
||||||
<el-radio
|
|
||||||
:key="item.value"
|
|
||||||
:value="item.value"
|
|
||||||
:label="item.label"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-radio-group>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item
|
|
||||||
v-if="assignEmptyHandlerType == AssignEmptyHandlerType.ASSIGN_USER"
|
|
||||||
label="指定用户"
|
|
||||||
prop="assignEmptyHandlerUserIds"
|
|
||||||
span="24"
|
|
||||||
>
|
|
||||||
<el-select
|
|
||||||
v-model="assignEmptyUserIds"
|
|
||||||
clearable
|
|
||||||
multiple
|
|
||||||
style="width: 100%"
|
|
||||||
@change="updateAssignEmptyUserIds"
|
|
||||||
>
|
|
||||||
<el-option
|
|
||||||
v-for="item in userOptions"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.nickname"
|
|
||||||
:value="item.id"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-divider content-position="left">审批人与提交人为同一人时</el-divider>
|
|
||||||
<el-radio-group
|
|
||||||
v-model="assignStartUserHandlerType"
|
|
||||||
@change="updateAssignStartUserHandlerType"
|
|
||||||
>
|
|
||||||
<div class="flex-col">
|
|
||||||
<div
|
|
||||||
v-for="(item, index) in ASSIGN_START_USER_HANDLER_TYPES"
|
|
||||||
:key="index"
|
|
||||||
>
|
|
||||||
<el-radio :key="item.value" :value="item.value" :label="item.label" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-radio-group>
|
|
||||||
|
|
||||||
<el-divider content-position="left">操作按钮</el-divider>
|
|
||||||
<div class="button-setting-pane">
|
|
||||||
<div class="button-setting-title">
|
|
||||||
<div class="button-title-label">操作按钮</div>
|
|
||||||
<div class="button-title-label pl-4">显示名称</div>
|
|
||||||
<div class="button-title-label">启用</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="button-setting-item"
|
|
||||||
v-for="(item, index) in buttonsSettingEl"
|
|
||||||
:key="index"
|
|
||||||
>
|
|
||||||
<div class="button-setting-item-label">
|
|
||||||
{{ OPERATION_BUTTON_NAME.get(item.id) }}
|
|
||||||
</div>
|
|
||||||
<div class="button-setting-item-label">
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
class="editable-title-input"
|
|
||||||
@blur="btnDisplayNameBlurEvent(index)"
|
|
||||||
v-mountedFocus
|
|
||||||
v-model="item.displayName"
|
|
||||||
:placeholder="item.displayName"
|
|
||||||
v-if="btnDisplayNameEdit[index]"
|
|
||||||
/>
|
|
||||||
<el-button v-else text @click="changeBtnDisplayName(index)"
|
|
||||||
>{{ item.displayName }} <Icon icon="ep:edit"
|
|
||||||
/></el-button>
|
|
||||||
</div>
|
|
||||||
<div class="button-setting-item-label">
|
|
||||||
<el-switch v-model="item.enable" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<el-divider content-position="left">字段权限</el-divider>
|
|
||||||
<div class="field-setting-pane" v-if="formType === BpmModelFormType.NORMAL">
|
|
||||||
<div class="field-permit-title">
|
|
||||||
<div class="setting-title-label first-title">字段名称</div>
|
|
||||||
<div class="other-titles">
|
|
||||||
<span
|
|
||||||
class="setting-title-label cursor-pointer"
|
|
||||||
@click="updatePermission('READ')"
|
|
||||||
>只读</span
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
class="setting-title-label cursor-pointer"
|
|
||||||
@click="updatePermission('WRITE')"
|
|
||||||
>可编辑</span
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
class="setting-title-label cursor-pointer"
|
|
||||||
@click="updatePermission('NONE')"
|
|
||||||
>隐藏</span
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="field-setting-item"
|
|
||||||
v-for="(item, index) in fieldsPermissionEl"
|
|
||||||
:key="index"
|
|
||||||
>
|
|
||||||
<div class="field-setting-item-label">{{ item.title }}</div>
|
|
||||||
<el-radio-group
|
|
||||||
class="field-setting-item-group"
|
|
||||||
v-model="item.permission"
|
|
||||||
>
|
|
||||||
<div class="item-radio-wrap">
|
|
||||||
<el-radio
|
|
||||||
:value="FieldPermissionType.READ"
|
|
||||||
size="large"
|
|
||||||
:label="FieldPermissionType.READ"
|
|
||||||
@change="updateElementExtensions"
|
|
||||||
>
|
|
||||||
<span></span>
|
|
||||||
</el-radio>
|
|
||||||
</div>
|
|
||||||
<div class="item-radio-wrap">
|
|
||||||
<el-radio
|
|
||||||
:value="FieldPermissionType.WRITE"
|
|
||||||
size="large"
|
|
||||||
:label="FieldPermissionType.WRITE"
|
|
||||||
@change="updateElementExtensions"
|
|
||||||
>
|
|
||||||
<span></span>
|
|
||||||
</el-radio>
|
|
||||||
</div>
|
|
||||||
<div class="item-radio-wrap">
|
|
||||||
<el-radio
|
|
||||||
:value="FieldPermissionType.NONE"
|
|
||||||
size="large"
|
|
||||||
:label="FieldPermissionType.NONE"
|
|
||||||
@change="updateElementExtensions"
|
|
||||||
>
|
|
||||||
<span></span>
|
|
||||||
</el-radio>
|
|
||||||
</div>
|
|
||||||
</el-radio-group>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<el-divider content-position="left">是否需要签名</el-divider>
|
|
||||||
<el-form-item prop="signEnable">
|
|
||||||
<el-switch
|
|
||||||
v-model="signEnable.value"
|
|
||||||
active-text="是"
|
|
||||||
inactive-text="否"
|
|
||||||
@change="updateElementExtensions"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-divider content-position="left">审批意见</el-divider>
|
|
||||||
<el-form-item prop="reasonRequire">
|
|
||||||
<el-switch
|
|
||||||
v-model="reasonRequire.value"
|
|
||||||
active-text="必填"
|
|
||||||
inactive-text="非必填"
|
|
||||||
@change="updateElementExtensions"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
import type { SystemUserApi } from '#/api/system/user';
|
||||||
|
import type { ButtonSetting } from '#/components/simple-process-design/consts';
|
||||||
|
|
||||||
|
import { inject, nextTick, onMounted, ref, toRaw, watch } from 'vue';
|
||||||
|
|
||||||
|
import { BpmModelFormType } from '@vben/constants';
|
||||||
|
|
||||||
|
import {
|
||||||
|
Button,
|
||||||
|
Divider,
|
||||||
|
Form,
|
||||||
|
Radio,
|
||||||
|
RadioGroup,
|
||||||
|
Select,
|
||||||
|
SelectOption,
|
||||||
|
Switch,
|
||||||
|
} from 'ant-design-vue';
|
||||||
|
|
||||||
|
import { getSimpleUserList } from '#/api/system/user';
|
||||||
import {
|
import {
|
||||||
ASSIGN_START_USER_HANDLER_TYPES,
|
|
||||||
RejectHandlerType,
|
|
||||||
REJECT_HANDLER_TYPES,
|
|
||||||
ASSIGN_EMPTY_HANDLER_TYPES,
|
|
||||||
AssignEmptyHandlerType,
|
|
||||||
OPERATION_BUTTON_NAME,
|
|
||||||
DEFAULT_BUTTON_SETTING,
|
|
||||||
FieldPermissionType,
|
|
||||||
APPROVE_TYPE,
|
APPROVE_TYPE,
|
||||||
ApproveType,
|
ApproveType,
|
||||||
ButtonSetting,
|
ASSIGN_EMPTY_HANDLER_TYPES,
|
||||||
} from '@/components/SimpleProcessDesignerV2/src/consts';
|
ASSIGN_START_USER_HANDLER_TYPES,
|
||||||
import * as UserApi from '@/api/system/user';
|
AssignEmptyHandlerType,
|
||||||
import { useFormFieldsPermission } from '@/components/SimpleProcessDesignerV2/src/node';
|
DEFAULT_BUTTON_SETTING,
|
||||||
import { BpmModelFormType } from '@/utils/constants';
|
FieldPermissionType,
|
||||||
|
OPERATION_BUTTON_NAME,
|
||||||
|
REJECT_HANDLER_TYPES,
|
||||||
|
RejectHandlerType,
|
||||||
|
} from '#/components/simple-process-design/consts';
|
||||||
|
import { useFormFieldsPermission } from '#/components/simple-process-design/helpers';
|
||||||
|
|
||||||
defineOptions({ name: 'ElementCustomConfig4UserTask' });
|
defineOptions({ name: 'ElementCustomConfig4UserTask' });
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
id: String,
|
id: {
|
||||||
type: String,
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
});
|
});
|
||||||
const prefix = inject('prefix');
|
const prefix = inject('prefix');
|
||||||
|
|
||||||
// 审批人与提交人为同一人时
|
// 审批人与提交人为同一人时
|
||||||
const assignStartUserHandlerTypeEl = ref();
|
const assignStartUserHandlerTypeEl = ref<any>();
|
||||||
const assignStartUserHandlerType = ref();
|
const assignStartUserHandlerType = ref<any>();
|
||||||
|
|
||||||
// 审批人拒绝时
|
// 审批人拒绝时
|
||||||
const rejectHandlerTypeEl = ref();
|
const rejectHandlerTypeEl = ref<any>();
|
||||||
const rejectHandlerType = ref();
|
const rejectHandlerType = ref<any>();
|
||||||
const returnNodeIdEl = ref();
|
const returnNodeIdEl = ref<any>();
|
||||||
const returnNodeId = ref();
|
const returnNodeId = ref<any>();
|
||||||
const returnTaskList = ref([]);
|
const returnTaskList = ref<any[]>([]);
|
||||||
|
|
||||||
// 审批人为空时
|
// 审批人为空时
|
||||||
const assignEmptyHandlerTypeEl = ref();
|
const assignEmptyHandlerTypeEl = ref<any>();
|
||||||
const assignEmptyHandlerType = ref();
|
const assignEmptyHandlerType = ref<any>();
|
||||||
const assignEmptyUserIdsEl = ref();
|
const assignEmptyUserIdsEl = ref<any>();
|
||||||
const assignEmptyUserIds = ref();
|
const assignEmptyUserIds = ref<any>();
|
||||||
|
|
||||||
// 操作按钮
|
// 操作按钮
|
||||||
const buttonsSettingEl = ref();
|
const buttonsSettingEl = ref<any>();
|
||||||
const { btnDisplayNameEdit, changeBtnDisplayName, btnDisplayNameBlurEvent } =
|
const { btnDisplayNameEdit, changeBtnDisplayName, btnDisplayNameBlurEvent } =
|
||||||
useButtonsSetting();
|
useButtonsSetting();
|
||||||
|
|
||||||
// 字段权限
|
// 字段权限
|
||||||
const fieldsPermissionEl = ref([]);
|
const fieldsPermissionEl = ref<any[]>([]);
|
||||||
const { formType, fieldsPermissionConfig, getNodeConfigFormFields } =
|
const { formType, fieldsPermissionConfig, getNodeConfigFormFields } =
|
||||||
useFormFieldsPermission(FieldPermissionType.READ);
|
useFormFieldsPermission(FieldPermissionType.READ);
|
||||||
|
|
||||||
@@ -299,9 +92,9 @@ const signEnable = ref({ value: false });
|
|||||||
// 审批意见
|
// 审批意见
|
||||||
const reasonRequire = ref({ value: false });
|
const reasonRequire = ref({ value: false });
|
||||||
|
|
||||||
const elExtensionElements = ref();
|
const elExtensionElements = ref<any>();
|
||||||
const otherExtensions = ref();
|
const otherExtensions = ref<any>();
|
||||||
const bpmnElement = ref();
|
const bpmnElement = ref<any>();
|
||||||
const bpmnInstances = () => (window as any)?.bpmnInstances;
|
const bpmnInstances = () => (window as any)?.bpmnInstances;
|
||||||
|
|
||||||
const resetCustomConfigList = () => {
|
const resetCustomConfigList = () => {
|
||||||
@@ -320,7 +113,7 @@ const resetCustomConfigList = () => {
|
|||||||
// 审批类型
|
// 审批类型
|
||||||
approveType.value =
|
approveType.value =
|
||||||
elExtensionElements.value.values?.filter(
|
elExtensionElements.value.values?.filter(
|
||||||
(ex) => ex.$type === `${prefix}:ApproveType`,
|
(ex: any) => ex.$type === `${prefix}:ApproveType`,
|
||||||
)?.[0] ||
|
)?.[0] ||
|
||||||
bpmnInstances().moddle.create(`${prefix}:ApproveType`, {
|
bpmnInstances().moddle.create(`${prefix}:ApproveType`, {
|
||||||
value: ApproveType.USER,
|
value: ApproveType.USER,
|
||||||
@@ -329,7 +122,7 @@ const resetCustomConfigList = () => {
|
|||||||
// 审批人与提交人为同一人时
|
// 审批人与提交人为同一人时
|
||||||
assignStartUserHandlerTypeEl.value =
|
assignStartUserHandlerTypeEl.value =
|
||||||
elExtensionElements.value.values?.filter(
|
elExtensionElements.value.values?.filter(
|
||||||
(ex) => ex.$type === `${prefix}:AssignStartUserHandlerType`,
|
(ex: any) => ex.$type === `${prefix}:AssignStartUserHandlerType`,
|
||||||
)?.[0] ||
|
)?.[0] ||
|
||||||
bpmnInstances().moddle.create(`${prefix}:AssignStartUserHandlerType`, {
|
bpmnInstances().moddle.create(`${prefix}:AssignStartUserHandlerType`, {
|
||||||
value: 1,
|
value: 1,
|
||||||
@@ -339,13 +132,13 @@ const resetCustomConfigList = () => {
|
|||||||
// 审批人拒绝时
|
// 审批人拒绝时
|
||||||
rejectHandlerTypeEl.value =
|
rejectHandlerTypeEl.value =
|
||||||
elExtensionElements.value.values?.filter(
|
elExtensionElements.value.values?.filter(
|
||||||
(ex) => ex.$type === `${prefix}:RejectHandlerType`,
|
(ex: any) => ex.$type === `${prefix}:RejectHandlerType`,
|
||||||
)?.[0] ||
|
)?.[0] ||
|
||||||
bpmnInstances().moddle.create(`${prefix}:RejectHandlerType`, { value: 1 });
|
bpmnInstances().moddle.create(`${prefix}:RejectHandlerType`, { value: 1 });
|
||||||
rejectHandlerType.value = rejectHandlerTypeEl.value.value;
|
rejectHandlerType.value = rejectHandlerTypeEl.value.value;
|
||||||
returnNodeIdEl.value =
|
returnNodeIdEl.value =
|
||||||
elExtensionElements.value.values?.filter(
|
elExtensionElements.value.values?.filter(
|
||||||
(ex) => ex.$type === `${prefix}:RejectReturnTaskId`,
|
(ex: any) => ex.$type === `${prefix}:RejectReturnTaskId`,
|
||||||
)?.[0] ||
|
)?.[0] ||
|
||||||
bpmnInstances().moddle.create(`${prefix}:RejectReturnTaskId`, {
|
bpmnInstances().moddle.create(`${prefix}:RejectReturnTaskId`, {
|
||||||
value: '',
|
value: '',
|
||||||
@@ -355,7 +148,7 @@ const resetCustomConfigList = () => {
|
|||||||
// 审批人为空时
|
// 审批人为空时
|
||||||
assignEmptyHandlerTypeEl.value =
|
assignEmptyHandlerTypeEl.value =
|
||||||
elExtensionElements.value.values?.filter(
|
elExtensionElements.value.values?.filter(
|
||||||
(ex) => ex.$type === `${prefix}:AssignEmptyHandlerType`,
|
(ex: any) => ex.$type === `${prefix}:AssignEmptyHandlerType`,
|
||||||
)?.[0] ||
|
)?.[0] ||
|
||||||
bpmnInstances().moddle.create(`${prefix}:AssignEmptyHandlerType`, {
|
bpmnInstances().moddle.create(`${prefix}:AssignEmptyHandlerType`, {
|
||||||
value: 1,
|
value: 1,
|
||||||
@@ -363,16 +156,16 @@ const resetCustomConfigList = () => {
|
|||||||
assignEmptyHandlerType.value = assignEmptyHandlerTypeEl.value.value;
|
assignEmptyHandlerType.value = assignEmptyHandlerTypeEl.value.value;
|
||||||
assignEmptyUserIdsEl.value =
|
assignEmptyUserIdsEl.value =
|
||||||
elExtensionElements.value.values?.filter(
|
elExtensionElements.value.values?.filter(
|
||||||
(ex) => ex.$type === `${prefix}:AssignEmptyUserIds`,
|
(ex: any) => ex.$type === `${prefix}:AssignEmptyUserIds`,
|
||||||
)?.[0] ||
|
)?.[0] ||
|
||||||
bpmnInstances().moddle.create(`${prefix}:AssignEmptyUserIds`, {
|
bpmnInstances().moddle.create(`${prefix}:AssignEmptyUserIds`, {
|
||||||
value: '',
|
value: '',
|
||||||
});
|
});
|
||||||
assignEmptyUserIds.value = assignEmptyUserIdsEl.value.value
|
assignEmptyUserIds.value = assignEmptyUserIdsEl.value.value
|
||||||
?.split(',')
|
?.split(',')
|
||||||
.map((item) => {
|
.map((item: string) => {
|
||||||
// 如果数字超出了最大安全整数范围,则将其作为字符串处理
|
// 如果数字超出了最大安全整数范围,则将其作为字符串处理
|
||||||
let num = Number(item);
|
const num = Number(item);
|
||||||
return num > Number.MAX_SAFE_INTEGER || num < -Number.MAX_SAFE_INTEGER
|
return num > Number.MAX_SAFE_INTEGER || num < -Number.MAX_SAFE_INTEGER
|
||||||
? item
|
? item
|
||||||
: num;
|
: num;
|
||||||
@@ -380,7 +173,7 @@ const resetCustomConfigList = () => {
|
|||||||
|
|
||||||
// 操作按钮
|
// 操作按钮
|
||||||
buttonsSettingEl.value = elExtensionElements.value.values?.filter(
|
buttonsSettingEl.value = elExtensionElements.value.values?.filter(
|
||||||
(ex) => ex.$type === `${prefix}:ButtonsSetting`,
|
(ex: any) => ex.$type === `${prefix}:ButtonsSetting`,
|
||||||
);
|
);
|
||||||
if (buttonsSettingEl.value.length === 0) {
|
if (buttonsSettingEl.value.length === 0) {
|
||||||
DEFAULT_BUTTON_SETTING.forEach((item) => {
|
DEFAULT_BUTTON_SETTING.forEach((item) => {
|
||||||
@@ -397,14 +190,13 @@ const resetCustomConfigList = () => {
|
|||||||
// 字段权限
|
// 字段权限
|
||||||
if (formType.value === BpmModelFormType.NORMAL) {
|
if (formType.value === BpmModelFormType.NORMAL) {
|
||||||
const fieldsPermissionList = elExtensionElements.value.values?.filter(
|
const fieldsPermissionList = elExtensionElements.value.values?.filter(
|
||||||
(ex) => ex.$type === `${prefix}:FieldsPermission`,
|
(ex: any) => ex.$type === `${prefix}:FieldsPermission`,
|
||||||
);
|
);
|
||||||
fieldsPermissionEl.value = [];
|
fieldsPermissionEl.value = [];
|
||||||
getNodeConfigFormFields();
|
getNodeConfigFormFields();
|
||||||
fieldsPermissionConfig.value = fieldsPermissionConfig.value;
|
fieldsPermissionConfig.value.forEach((element: any) => {
|
||||||
fieldsPermissionConfig.value.forEach((element) => {
|
|
||||||
element.permission =
|
element.permission =
|
||||||
fieldsPermissionList?.find((obj) => obj.field === element.field)
|
fieldsPermissionList?.find((obj: any) => obj.field === element.field)
|
||||||
?.permission ?? '1';
|
?.permission ?? '1';
|
||||||
fieldsPermissionEl.value.push(
|
fieldsPermissionEl.value.push(
|
||||||
bpmnInstances().moddle.create(`${prefix}:FieldsPermission`, element),
|
bpmnInstances().moddle.create(`${prefix}:FieldsPermission`, element),
|
||||||
@@ -415,21 +207,21 @@ const resetCustomConfigList = () => {
|
|||||||
// 是否需要签名
|
// 是否需要签名
|
||||||
signEnable.value =
|
signEnable.value =
|
||||||
elExtensionElements.value.values?.filter(
|
elExtensionElements.value.values?.filter(
|
||||||
(ex) => ex.$type === `${prefix}:SignEnable`,
|
(ex: any) => ex.$type === `${prefix}:SignEnable`,
|
||||||
)?.[0] ||
|
)?.[0] ||
|
||||||
bpmnInstances().moddle.create(`${prefix}:SignEnable`, { value: false });
|
bpmnInstances().moddle.create(`${prefix}:SignEnable`, { value: false });
|
||||||
|
|
||||||
// 审批意见
|
// 审批意见
|
||||||
reasonRequire.value =
|
reasonRequire.value =
|
||||||
elExtensionElements.value.values?.filter(
|
elExtensionElements.value.values?.filter(
|
||||||
(ex) => ex.$type === `${prefix}:ReasonRequire`,
|
(ex: any) => ex.$type === `${prefix}:ReasonRequire`,
|
||||||
)?.[0] ||
|
)?.[0] ||
|
||||||
bpmnInstances().moddle.create(`${prefix}:ReasonRequire`, { value: false });
|
bpmnInstances().moddle.create(`${prefix}:ReasonRequire`, { value: false });
|
||||||
|
|
||||||
// 保留剩余扩展元素,便于后面更新该元素对应属性
|
// 保留剩余扩展元素,便于后面更新该元素对应属性
|
||||||
otherExtensions.value =
|
otherExtensions.value =
|
||||||
elExtensionElements.value.values?.filter(
|
elExtensionElements.value.values?.filter(
|
||||||
(ex) =>
|
(ex: any) =>
|
||||||
ex.$type !== `${prefix}:AssignStartUserHandlerType` &&
|
ex.$type !== `${prefix}:AssignStartUserHandlerType` &&
|
||||||
ex.$type !== `${prefix}:RejectHandlerType` &&
|
ex.$type !== `${prefix}:RejectHandlerType` &&
|
||||||
ex.$type !== `${prefix}:RejectReturnTaskId` &&
|
ex.$type !== `${prefix}:RejectReturnTaskId` &&
|
||||||
@@ -455,7 +247,7 @@ const updateAssignStartUserHandlerType = () => {
|
|||||||
const updateRejectHandlerType = () => {
|
const updateRejectHandlerType = () => {
|
||||||
rejectHandlerTypeEl.value.value = rejectHandlerType.value;
|
rejectHandlerTypeEl.value.value = rejectHandlerType.value;
|
||||||
|
|
||||||
returnNodeId.value = returnTaskList.value[0].id;
|
returnNodeId.value = returnTaskList.value[0]?.id;
|
||||||
returnNodeIdEl.value.value = returnNodeId.value;
|
returnNodeIdEl.value.value = returnNodeId.value;
|
||||||
|
|
||||||
updateElementExtensions();
|
updateElementExtensions();
|
||||||
@@ -504,7 +296,7 @@ watch(
|
|||||||
() => props.id,
|
() => props.id,
|
||||||
(val) => {
|
(val) => {
|
||||||
val &&
|
val &&
|
||||||
val.length &&
|
val.length > 0 &&
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
resetCustomConfigList();
|
resetCustomConfigList();
|
||||||
});
|
});
|
||||||
@@ -512,20 +304,20 @@ watch(
|
|||||||
{ immediate: true },
|
{ immediate: true },
|
||||||
);
|
);
|
||||||
|
|
||||||
function findAllPredecessorsExcludingStart(elementId, modeler) {
|
function findAllPredecessorsExcludingStart(elementId: string, modeler: any) {
|
||||||
const elementRegistry = modeler.get('elementRegistry');
|
const elementRegistry = modeler.get('elementRegistry');
|
||||||
const allConnections = elementRegistry.filter(
|
const allConnections = elementRegistry.filter(
|
||||||
(element) => element.type === 'bpmn:SequenceFlow',
|
(element: any) => element.type === 'bpmn:SequenceFlow',
|
||||||
);
|
);
|
||||||
const predecessors = new Set(); // 使用 Set 来避免重复节点
|
const predecessors = new Set(); // 使用 Set 来避免重复节点
|
||||||
const visited = new Set(); // 用于记录已访问的节点
|
const visited = new Set(); // 用于记录已访问的节点
|
||||||
|
|
||||||
// 检查是否是开始事件节点
|
// 检查是否是开始事件节点
|
||||||
function isStartEvent(element) {
|
function isStartEvent(element: any) {
|
||||||
return element.type === 'bpmn:StartEvent';
|
return element.type === 'bpmn:StartEvent';
|
||||||
}
|
}
|
||||||
|
|
||||||
function findPredecessorsRecursively(element) {
|
function findPredecessorsRecursively(element: any) {
|
||||||
// 如果该节点已经访问过,直接返回,避免循环
|
// 如果该节点已经访问过,直接返回,避免循环
|
||||||
if (visited.has(element)) {
|
if (visited.has(element)) {
|
||||||
return;
|
return;
|
||||||
@@ -536,10 +328,10 @@ function findAllPredecessorsExcludingStart(elementId, modeler) {
|
|||||||
|
|
||||||
// 获取与当前节点相连的所有连接
|
// 获取与当前节点相连的所有连接
|
||||||
const incomingConnections = allConnections.filter(
|
const incomingConnections = allConnections.filter(
|
||||||
(connection) => connection.target === element,
|
(connection: any) => connection.target === element,
|
||||||
);
|
);
|
||||||
|
|
||||||
incomingConnections.forEach((connection) => {
|
incomingConnections.forEach((connection: any) => {
|
||||||
const source = connection.source; // 获取前置节点
|
const source = connection.source; // 获取前置节点
|
||||||
|
|
||||||
// 只添加不是开始事件的前置节点
|
// 只添加不是开始事件的前置节点
|
||||||
@@ -556,7 +348,7 @@ function findAllPredecessorsExcludingStart(elementId, modeler) {
|
|||||||
findPredecessorsRecursively(targetElement);
|
findPredecessorsRecursively(targetElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Array.from(predecessors); // 返回前置节点数组
|
return [...predecessors]; // 返回前置节点数组
|
||||||
}
|
}
|
||||||
|
|
||||||
function useButtonsSetting() {
|
function useButtonsSetting() {
|
||||||
@@ -568,9 +360,11 @@ function useButtonsSetting() {
|
|||||||
};
|
};
|
||||||
const btnDisplayNameBlurEvent = (index: number) => {
|
const btnDisplayNameBlurEvent = (index: number) => {
|
||||||
btnDisplayNameEdit.value[index] = false;
|
btnDisplayNameEdit.value[index] = false;
|
||||||
const buttonItem = buttonsSetting.value![index];
|
const buttonItem = buttonsSetting.value?.[index];
|
||||||
buttonItem.displayName =
|
if (buttonItem) {
|
||||||
buttonItem.displayName || OPERATION_BUTTON_NAME.get(buttonItem.id)!;
|
buttonItem.displayName =
|
||||||
|
buttonItem.displayName || OPERATION_BUTTON_NAME.get(buttonItem.id)!;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
return {
|
return {
|
||||||
buttonsSetting,
|
buttonsSetting,
|
||||||
@@ -583,23 +377,251 @@ function useButtonsSetting() {
|
|||||||
/** 批量更新权限 */
|
/** 批量更新权限 */
|
||||||
// TODO @lesan:这个页面,有一些 idea 红色报错,咱要不要 fix 下!
|
// TODO @lesan:这个页面,有一些 idea 红色报错,咱要不要 fix 下!
|
||||||
const updatePermission = (type: string) => {
|
const updatePermission = (type: string) => {
|
||||||
fieldsPermissionEl.value.forEach((field) => {
|
fieldsPermissionEl.value.forEach((field: any) => {
|
||||||
field.permission =
|
if (type === 'READ') {
|
||||||
type === 'READ'
|
field.permission = FieldPermissionType.READ;
|
||||||
? FieldPermissionType.READ
|
} else if (type === 'WRITE') {
|
||||||
: type === 'WRITE'
|
field.permission = FieldPermissionType.WRITE;
|
||||||
? FieldPermissionType.WRITE
|
} else {
|
||||||
: FieldPermissionType.NONE;
|
field.permission = FieldPermissionType.NONE;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const userOptions = ref<UserApi.UserVO[]>([]); // 用户列表
|
const userOptions = ref<SystemUserApi.User[]>([]); // 用户列表
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
// 获得用户列表
|
// 获得用户列表
|
||||||
userOptions.value = await UserApi.getSimpleUserList();
|
userOptions.value = await getSimpleUserList();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<Divider orientation="left">审批类型</Divider>
|
||||||
|
<Form.Item prop="approveType">
|
||||||
|
<RadioGroup v-model:value="approveType.value">
|
||||||
|
<Radio
|
||||||
|
v-for="(item, index) in APPROVE_TYPE"
|
||||||
|
:key="index"
|
||||||
|
:value="item.value"
|
||||||
|
>
|
||||||
|
{{ item.label }}
|
||||||
|
</Radio>
|
||||||
|
</RadioGroup>
|
||||||
|
</Form.Item>
|
||||||
|
|
||||||
|
<Divider orientation="left">审批人拒绝时</Divider>
|
||||||
|
<Form.Item prop="rejectHandlerType">
|
||||||
|
<RadioGroup
|
||||||
|
v-model:value="rejectHandlerType"
|
||||||
|
:disabled="returnTaskList.length === 0"
|
||||||
|
@change="updateRejectHandlerType"
|
||||||
|
>
|
||||||
|
<div class="flex-col">
|
||||||
|
<div v-for="(item, index) in REJECT_HANDLER_TYPES" :key="index">
|
||||||
|
<Radio :key="item.value" :value="item.value">
|
||||||
|
{{ item.label }}
|
||||||
|
</Radio>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</RadioGroup>
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
v-if="rejectHandlerType === RejectHandlerType.RETURN_USER_TASK"
|
||||||
|
label="驳回节点"
|
||||||
|
prop="returnNodeId"
|
||||||
|
>
|
||||||
|
<Select
|
||||||
|
v-model:value="returnNodeId"
|
||||||
|
allow-clear
|
||||||
|
style="width: 100%"
|
||||||
|
@change="updateReturnNodeId"
|
||||||
|
>
|
||||||
|
<SelectOption
|
||||||
|
v-for="item in returnTaskList"
|
||||||
|
:key="item.id"
|
||||||
|
:value="item.id"
|
||||||
|
>
|
||||||
|
{{ item.name }}
|
||||||
|
</SelectOption>
|
||||||
|
</Select>
|
||||||
|
</Form.Item>
|
||||||
|
|
||||||
|
<Divider orientation="left">审批人为空时</Divider>
|
||||||
|
<Form.Item prop="assignEmptyHandlerType">
|
||||||
|
<RadioGroup
|
||||||
|
v-model:value="assignEmptyHandlerType"
|
||||||
|
@change="updateAssignEmptyHandlerType"
|
||||||
|
>
|
||||||
|
<div class="flex-col">
|
||||||
|
<div v-for="(item, index) in ASSIGN_EMPTY_HANDLER_TYPES" :key="index">
|
||||||
|
<Radio :key="item.value" :value="item.value">
|
||||||
|
{{ item.label }}
|
||||||
|
</Radio>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</RadioGroup>
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
v-if="assignEmptyHandlerType === AssignEmptyHandlerType.ASSIGN_USER"
|
||||||
|
label="指定用户"
|
||||||
|
prop="assignEmptyHandlerUserIds"
|
||||||
|
>
|
||||||
|
<Select
|
||||||
|
v-model:value="assignEmptyUserIds"
|
||||||
|
allow-clear
|
||||||
|
mode="multiple"
|
||||||
|
style="width: 100%"
|
||||||
|
@change="updateAssignEmptyUserIds"
|
||||||
|
>
|
||||||
|
<SelectOption
|
||||||
|
v-for="item in userOptions"
|
||||||
|
:key="item.id"
|
||||||
|
:value="item.id"
|
||||||
|
>
|
||||||
|
{{ item.nickname }}
|
||||||
|
</SelectOption>
|
||||||
|
</Select>
|
||||||
|
</Form.Item>
|
||||||
|
|
||||||
|
<Divider orientation="left">审批人与提交人为同一人时</Divider>
|
||||||
|
<RadioGroup
|
||||||
|
v-model:value="assignStartUserHandlerType"
|
||||||
|
@change="updateAssignStartUserHandlerType"
|
||||||
|
>
|
||||||
|
<div class="flex-col">
|
||||||
|
<div
|
||||||
|
v-for="(item, index) in ASSIGN_START_USER_HANDLER_TYPES"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<Radio :key="item.value" :value="item.value">
|
||||||
|
{{ item.label }}
|
||||||
|
</Radio>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</RadioGroup>
|
||||||
|
|
||||||
|
<Divider orientation="left">操作按钮</Divider>
|
||||||
|
<div class="button-setting-pane">
|
||||||
|
<div class="button-setting-title">
|
||||||
|
<div class="button-title-label">操作按钮</div>
|
||||||
|
<div class="button-title-label pl-4">显示名称</div>
|
||||||
|
<div class="button-title-label">启用</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="button-setting-item"
|
||||||
|
v-for="(item, index) in buttonsSettingEl"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<div class="button-setting-item-label">
|
||||||
|
{{ OPERATION_BUTTON_NAME.get(item.id) }}
|
||||||
|
</div>
|
||||||
|
<div class="button-setting-item-label">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="editable-title-input"
|
||||||
|
@blur="btnDisplayNameBlurEvent(index)"
|
||||||
|
v-mounted-focus
|
||||||
|
v-model="item.displayName"
|
||||||
|
:placeholder="item.displayName"
|
||||||
|
v-if="btnDisplayNameEdit[index]"
|
||||||
|
/>
|
||||||
|
<Button v-else type="text" @click="changeBtnDisplayName(index)">
|
||||||
|
{{ item.displayName }}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
<div class="button-setting-item-label">
|
||||||
|
<Switch v-model:checked="item.enable" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Divider orientation="left">字段权限</Divider>
|
||||||
|
<div class="field-setting-pane" v-if="formType === BpmModelFormType.NORMAL">
|
||||||
|
<div class="field-permit-title">
|
||||||
|
<div class="setting-title-label first-title">字段名称</div>
|
||||||
|
<div class="other-titles">
|
||||||
|
<span
|
||||||
|
class="setting-title-label cursor-pointer"
|
||||||
|
@click="updatePermission('READ')"
|
||||||
|
>只读
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
class="setting-title-label cursor-pointer"
|
||||||
|
@click="updatePermission('WRITE')"
|
||||||
|
>
|
||||||
|
可编辑
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
class="setting-title-label cursor-pointer"
|
||||||
|
@click="updatePermission('NONE')"
|
||||||
|
>隐藏
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="field-setting-item"
|
||||||
|
v-for="(item, index) in fieldsPermissionEl"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<div class="field-setting-item-label">{{ item.title }}</div>
|
||||||
|
<RadioGroup
|
||||||
|
class="field-setting-item-group"
|
||||||
|
v-model:value="item.permission"
|
||||||
|
>
|
||||||
|
<div class="item-radio-wrap">
|
||||||
|
<Radio
|
||||||
|
:value="FieldPermissionType.READ"
|
||||||
|
size="large"
|
||||||
|
@change="updateElementExtensions"
|
||||||
|
>
|
||||||
|
<span></span>
|
||||||
|
</Radio>
|
||||||
|
</div>
|
||||||
|
<div class="item-radio-wrap">
|
||||||
|
<Radio
|
||||||
|
:value="FieldPermissionType.WRITE"
|
||||||
|
size="large"
|
||||||
|
@change="updateElementExtensions"
|
||||||
|
>
|
||||||
|
<span></span>
|
||||||
|
</Radio>
|
||||||
|
</div>
|
||||||
|
<div class="item-radio-wrap">
|
||||||
|
<Radio
|
||||||
|
:value="FieldPermissionType.NONE"
|
||||||
|
size="large"
|
||||||
|
@change="updateElementExtensions"
|
||||||
|
>
|
||||||
|
<span></span>
|
||||||
|
</Radio>
|
||||||
|
</div>
|
||||||
|
</RadioGroup>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Divider orientation="left">是否需要签名</Divider>
|
||||||
|
<Form.Item prop="signEnable">
|
||||||
|
<Switch
|
||||||
|
v-model:checked="signEnable.value"
|
||||||
|
checked-children="是"
|
||||||
|
un-checked-children="否"
|
||||||
|
@change="updateElementExtensions"
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
|
||||||
|
<Divider orientation="left">审批意见</Divider>
|
||||||
|
<Form.Item prop="reasonRequire">
|
||||||
|
<Switch
|
||||||
|
v-model:checked="reasonRequire.value"
|
||||||
|
checked-children="必填"
|
||||||
|
un-checked-children="非必填"
|
||||||
|
@change="updateElementExtensions"
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.button-setting-pane {
|
.button-setting-pane {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
Reference in New Issue
Block a user