feat: 允许流程在某个节点单独控制是否可以明细表新加行

This commit is contained in:
gaoyunqi
2024-05-07 17:14:53 +08:00
parent 2994590e20
commit 30972d5881
3 changed files with 456 additions and 464 deletions

View File

@ -1,10 +1,10 @@
<template> <template>
<div> <div>
<div class="tbl-toolbar"> <div class="tbl-toolbar">
<a-button v-if="useSelectButton" :disabled="disabled" class="select-btn" type="primary" @click="multipleDialog = true"> <a-button v-if="useSelectButton && !disableAddRow" :disabled="disabled" class="select-btn" type="primary" @click="multipleDialog = true">
{{ buttonName }} {{ buttonName }}
</a-button> </a-button>
<a-button v-if="!disabled" type="primary" @click="add"> <a-button v-if="!disabled && !disableAddRow" type="primary" @click="add">
<PlusOutlined /> <PlusOutlined />
{{ t('新增') }} {{ t('新增') }}
</a-button> </a-button>
@ -154,6 +154,10 @@
type: Boolean, type: Boolean,
default: false default: false
}, },
disableAddRow: {
type: Boolean,
default: false
},
/** /**
* 预加载数据为api时使用 * 预加载数据为api时使用
*/ */

View File

@ -146,6 +146,9 @@ function schemeList(
if (isViewProcess) { if (isViewProcess) {
schema.dynamicDisabled = true; schema.dynamicDisabled = true;
} }
if ((permissionConfig.children || []).find((item) => item.fieldId === '_row_ctrl_' && !item.edit)) {
schema.componentProps.disableAddRow = true;
}
if (!permissionConfig?.view) { if (!permissionConfig?.view) {
schema.show = false; schema.show = false;
} else { } else {

View File

@ -3,7 +3,7 @@
<div class="opr-box"> <div class="opr-box">
<NodeHead :nodeName="t('表单列表')" /> <NodeHead :nodeName="t('表单列表')" />
<div class="button-box"> <div class="button-box">
<SettingModal :list="[]" :isSingle="false" @submit="addItem"> <SettingModal :isSingle="false" :list="[]" @submit="addItem">
<a-button type="primary">{{ t('添加表单') }}</a-button> <a-button type="primary">{{ t('添加表单') }}</a-button>
</SettingModal> </SettingModal>
</div> </div>
@ -15,14 +15,11 @@
<span class="form-type">{{ t('表单类型') }}</span> <span class="form-type">{{ t('表单类型') }}</span>
<span class="opr">{{ t('操作') }}</span> <span class="opr">{{ t('操作') }}</span>
</div> </div>
<div class="body" v-if="formSetting.list.length > 0"> <div v-if="formSetting.list.length > 0" class="body">
<div class="box" v-for="(item, index) in formSetting.list" :key="index"> <div v-for="(item, index) in formSetting.list" :key="index" class="box">
<div class="row item"> <div class="row item">
<div class="up-or-down" @click="item.showChildren = !item.showChildren"> <div class="up-or-down" @click="item.showChildren = !item.showChildren">
<Icon <Icon :icon="item.showChildren ? 'ant-design:up-outlined' : 'ant-design:down-outlined'" class="icon" />
class="icon"
:icon="item.showChildren ? 'ant-design:up-outlined' : 'ant-design:down-outlined'"
/>
</div> </div>
<span class="form-name">{{ item.formName }}</span> <span class="form-name">{{ item.formName }}</span>
<span class="form-type">{{ formTypeOptions[item.formType] }}</span> <span class="form-type">{{ formTypeOptions[item.formType] }}</span>
@ -32,118 +29,61 @@
<div style="width: 300px"> <div style="width: 300px">
<p>{{ t('删除表单') }}</p> <p>{{ t('删除表单') }}</p>
<p>{{ t('删除表单会清空已引用该表单数据的所有配置,请确认是否继续?') }}</p> <p>{{ t('删除表单会清空已引用该表单数据的所有配置,请确认是否继续?') }}</p>
<p class="pop-desc">{{ <p class="pop-desc">{{ t('如果引用该表单的配置较多,清空时间会相应变长,请耐心等待。') }}</p>
t('如果引用该表单的配置较多,清空时间会相应变长,请耐心等待。')
}}</p>
</div> </div>
</template> </template>
<Icon icon="ant-design:delete-outlined" class="delete-icon" /> <Icon class="delete-icon" icon="ant-design:delete-outlined" />
</a-popconfirm> </a-popconfirm>
</span> </span>
</div> </div>
<div <div v-if="item.showChildren && item.children && item.children.length > 0" class="children list">
class="children list"
v-if="item.showChildren && item.children && item.children.length > 0"
>
<div class="row head"> <div class="row head">
<span class="flex-baisc-4"></span> <span class="flex-baisc-4"></span>
<span>{{ t('字段名') }}</span> <span>{{ t('字段名') }}</span>
<span>{{ t('字段ID') }}</span> <span>{{ t('字段ID') }}</span>
<span <span>
><a-checkbox <a-checkbox v-model:checked="item.requiredAll" size="small" @change="requiredAll(item)">{{ t('必填') }}</a-checkbox>
v-model:checked="item.requiredAll" </span>
size="small" <span>
@change="requiredAll(item)" <a-checkbox v-model:checked="item.viewAll" size="small" @change="viewAll(item)">{{ t('查看') }}</a-checkbox>
>{{ t('必填') }}</a-checkbox </span>
></span <span>
> <a-checkbox v-model:checked="item.editAll" size="small" @change="editAll(item)">{{ t('编辑') }}</a-checkbox>
<span </span>
><a-checkbox v-model:checked="item.viewAll" size="small" @change="viewAll(item)">{{
t('查看')
}}</a-checkbox></span
>
<span
><a-checkbox v-model:checked="item.editAll" size="small" @change="editAll(item)">{{
t('编辑')
}}</a-checkbox></span
>
</div> </div>
<div class="body" v-if="item.children.length > 0"> <div v-if="item.children.length > 0" class="body">
<div <div v-for="(child, childIndex) in item.children" :key="childIndex" class="padding-left">
v-for="(child, childIndex) in item.children" <div v-if="child.type != hiddenComponentType" class="row item">
:key="childIndex" <span>
class="padding-left" <em v-if="child.isSubTable" class="flex-baisc-4" @click="child.showChildren = !child.showChildren"> <Icon :icon="child.showChildren ? 'ant-design:up-outlined' : 'ant-design:down-outlined'" class="icon" /> </em
> >{{ child.fieldName }}
<div class="row item" v-if="child.type != hiddenComponentType"> </span>
<span
><em
class="flex-baisc-4"
v-if="child.isSubTable"
@click="child.showChildren = !child.showChildren"
>
<Icon
class="icon"
:icon="
child.showChildren ? 'ant-design:up-outlined' : 'ant-design:down-outlined'
"
/> </em
>{{ child.fieldName }}</span
>
<span>{{ child.fieldId }}</span> <span>{{ child.fieldId }}</span>
<span> <span>
<a-switch <a-switch
v-if="!child.isSubTable && !doNotShowControl.includes(child.type)" v-if="!child.isSubTable && !doNotShowControl.includes(child.type)"
v-model:checked="child.required" v-model:checked="child.required"
:disabled="requiredDisabled.includes(child.type) || child.isSaveTable" :disabled="requiredDisabled.includes(child.type) || child.isSaveTable"
size="small"
@change="TableRequired(child.required, child, item)" @change="TableRequired(child.required, child, item)"
size="small" />
/></span> </span>
<span> <span><a-switch v-model:checked="child.view" size="small" @change="TableView(child.view, child, item)" /></span>
<a-switch <span><a-switch v-if="!child.isSubTable && !doNotShowControl.includes(child.type)" v-model:checked="child.edit" :disabled="child.disabled" size="small" @change="TableEdit(child.edit, child, item)" /></span>
v-model:checked="child.view"
size="small"
@change="TableView(child.view, child, item)"
/></span>
<span
><a-switch
v-if="!child.isSubTable && !doNotShowControl.includes(child.type)"
:disabled="child.disabled"
v-model:checked="child.edit"
@change="TableEdit(child.edit, child, item)"
size="small"
/></span>
</div> </div>
<template <template v-if="child.showChildren && child.isSubTable && child.children.length > 0">
v-if="child.showChildren && child.isSubTable && child.children.length > 0" <div v-for="(child2, childIndex2) in child.children" :key="childIndex2" class="row item padding-left">
>
<div
class="row item padding-left"
v-for="(child2, childIndex2) in child.children"
:key="childIndex2"
>
<span>{{ child2.fieldName }}</span> <span>{{ child2.fieldName }}</span>
<span>{{ child2.fieldId }}</span> <span>{{ child2.fieldId }}</span>
<span <span>
><a-switch <a-switch v-model:checked="child2.required" :disabled="child2.disabled || child2.isSaveTable || child2.fieldId === ROW_CTRL" size="small" @change="TableRequired(child2.required, child2, item, child)" />
:disabled="child2.disabled || child2.isSaveTable" </span>
v-model:checked="child2.required" <span>
@change="TableRequired(child2.required, child2, item, child)" <a-switch v-model:checked="child2.view" :disabled="child2.disabled || child2.fieldId === ROW_CTRL" size="small" @change="TableView(child2.view, child2, item, child)" />
size="small" </span>
/></span> <span>
<span <a-switch v-model:checked="child2.edit" :disabled="child2.disabled || child2.isSaveTable" size="small" @change="TableEdit(child2.edit, child2, item, child)" />
><a-switch </span>
:disabled="child2.disabled"
v-model:checked="child2.view"
@change="TableView(child2.view, child2, item, child)"
size="small"
/></span>
<span
><a-switch
:disabled="child2.disabled || child2.isSaveTable"
v-model:checked="child2.edit"
@change="TableEdit(child2.edit, child2, item, child)"
size="small"
/></span>
</div> </div>
</template> </template>
</div> </div>
@ -157,7 +97,7 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script lang="ts" setup>
import useStateFormInfo from '/@bpmn/hooks/useStateFormInfo'; import useStateFormInfo from '/@bpmn/hooks/useStateFormInfo';
import Icon from '/@/components/Icon/index'; import Icon from '/@/components/Icon/index';
import { NodeHead, EmptyBox } from '/@/components/ModalPanel/index'; import { NodeHead, EmptyBox } from '/@/components/ModalPanel/index';
@ -166,17 +106,15 @@
import { FormConfigItem } from '/@/model/workflow/formSetting'; import { FormConfigItem } from '/@/model/workflow/formSetting';
import { onMounted, reactive } from 'vue'; import { onMounted, reactive } from 'vue';
import { import { formPermissionList, hiddenComponentType, requiredDisabled, doNotShowControl } from '/@bpmn/config/formPermission';
formPermissionList,
hiddenComponentType,
requiredDisabled,
doNotShowControl,
} from '/@bpmn/config/formPermission';
import { updateFormDataInfo } from '/@bpmn/config/useUpdateAllFormInfo'; import { updateFormDataInfo } from '/@bpmn/config/useUpdateAllFormInfo';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
import { buildUUID } from '/@/utils/uuid';
const { t } = useI18n(); const { t } = useI18n();
const { formInfo } = useStateFormInfo(); const { formInfo } = useStateFormInfo();
const formTypeOptions = {}; const formTypeOptions = {};
const ROW_CTRL = '_row_ctrl_';
formTypeOptions[FormType.CUSTOM] = t('自定义表单'); formTypeOptions[FormType.CUSTOM] = t('自定义表单');
formTypeOptions[FormType.SYSTEM] = t('系统表单'); formTypeOptions[FormType.SYSTEM] = t('系统表单');
let formSetting: { list: Array<FormConfigItem> } = reactive({ list: [] }); let formSetting: { list: Array<FormConfigItem> } = reactive({ list: [] });
@ -184,9 +122,48 @@
onMounted(() => { onMounted(() => {
if (formInfo.value.formConfigs) formSetting.list = formInfo.value.formConfigs; if (formInfo.value.formConfigs) formSetting.list = formInfo.value.formConfigs;
formSetting.list.forEach((val) => { formSetting.list.forEach((val) => {
addTableRowCtrl();
checkIsAll(val); checkIsAll(val);
}); });
}); });
function addTableRowCtrl() {
formSetting.list.forEach((form) => {
recAddTableRowCtrl(form);
});
}
function recAddTableRowCtrl(parent) {
if (parent.isSubTable) {
if (!parent.children || parent.children.length === 0) {
return;
}
const hasRowCtrl = parent.children.find((item) => item.fieldId === '_row_ctrl_');
if (!hasRowCtrl) {
parent.children.push({
disabled: false,
edit: true,
fieldId: ROW_CTRL,
fieldName: '添加新行*',
isSaveTable: false,
isSubTable: true,
key: buildUUID(),
required: false,
showChildren: false,
tableName: parent.tableName,
view: true
});
}
return;
}
if (parent.children && parent.children.length) {
parent.children.forEach((child) => {
recAddTableRowCtrl(child);
});
return;
}
}
function deleteItem(index: number) { function deleteItem(index: number) {
updateFormDataInfo(formSetting.list[index]['key']); updateFormDataInfo(formSetting.list[index]['key']);
formSetting.list.splice(index, 1); formSetting.list.splice(index, 1);
@ -220,8 +197,10 @@
} }
if (requiredAll) ele.view = true; if (requiredAll) ele.view = true;
if (ele.children && ele.children.length > 0) { if (ele.children && ele.children.length > 0) {
ele.children.map( ele.children.map((ele2: { disabled: any; required: boolean; view: boolean; edit: boolean }) => {
(ele2: { disabled: any; required: boolean; view: boolean; edit: boolean }) => { if (ele2.fieldId === ROW_CTRL) {
return;
}
if (!ele2.disabled) { if (!ele2.disabled) {
if (requiredAll) { if (requiredAll) {
ele2.required = true; ele2.required = true;
@ -231,8 +210,7 @@
} }
} }
if (requiredAll) ele2.view = true; if (requiredAll) ele2.view = true;
}, });
);
} }
return ele; return ele;
}); });
@ -258,8 +236,7 @@
} }
if (editAll) ele.view = true; if (editAll) ele.view = true;
if (ele.children && ele.children.length > 0) { if (ele.children && ele.children.length > 0) {
ele.children.map( ele.children.map((ele2: { disabled: any; required: boolean; view: boolean; edit: boolean }) => {
(ele2: { disabled: any; required: boolean; view: boolean; edit: boolean }) => {
if (!ele2.disabled) { if (!ele2.disabled) {
if (editAll) { if (editAll) {
ele2.edit = true; ele2.edit = true;
@ -269,12 +246,12 @@
} }
} }
if (editAll) ele2.view = true; if (editAll) ele2.view = true;
}, });
);
} }
return ele; return ele;
}); });
} }
function viewAll(item) { function viewAll(item) {
// 查看所有为true 所有的查看都为true除了disabled // 查看所有为true 所有的查看都为true除了disabled
// 查看所有为false 所有查看都为false除了disabled // 查看所有为false 所有查看都为false除了disabled
@ -293,6 +270,9 @@
} }
if (ele.children && ele.children.length > 0) { if (ele.children && ele.children.length > 0) {
ele.children.map((ele2) => { ele.children.map((ele2) => {
if (ele2.fieldId === ROW_CTRL) {
return;
}
if (viewAll) { if (viewAll) {
ele2.view = true; ele2.view = true;
} else { } else {
@ -305,6 +285,7 @@
return ele; return ele;
}); });
} }
function TableRequired(required, child, item, cur?) { function TableRequired(required, child, item, cur?) {
if (required) { if (required) {
child.view = true; child.view = true;
@ -315,6 +296,7 @@
checkCurTableIsEdit(cur); checkCurTableIsEdit(cur);
} }
} }
function TableView(view, child, item, cur?) { function TableView(view, child, item, cur?) {
if (!view) { if (!view) {
child.required = view; child.required = view;
@ -339,6 +321,7 @@
checkCurTableIsEdit(cur); checkCurTableIsEdit(cur);
} }
} }
function TableEdit(edit, child, item, cur?) { function TableEdit(edit, child, item, cur?) {
if (edit) { if (edit) {
child.view = true; child.view = true;
@ -350,6 +333,7 @@
checkCurTableIsEdit(cur); checkCurTableIsEdit(cur);
} }
} }
function checkCurTableIsEdit(item) { function checkCurTableIsEdit(item) {
let view = 0; let view = 0;
let edit = 0; let edit = 0;
@ -361,6 +345,7 @@
item.view = view > 0 ? true : false; item.view = view > 0 ? true : false;
item.edit = edit > 0 ? true : false; item.edit = edit > 0 ? true : false;
} }
function checkIsAll(item) { function checkIsAll(item) {
let all = 0; let all = 0;
let required = 0; let required = 0;