Skip to content

Commit 16b2a89

Browse files
authored
Merge pull request #67 from codingapi/dev
update from permission
2 parents 7c532d0 + 5b98aff commit 16b2a89

18 files changed

Lines changed: 125 additions & 50 deletions

File tree

flow-engine-framework/src/main/java/com/codingapi/flow/form/FlowForm.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public static FlowForm fromMap(Map<String, Object> map) {
6868
fieldMeta.setCode((String) field.get("code"));
6969
fieldMeta.setType(DataType.valueOf((String) field.get("type")));
7070
fieldMeta.setRequired(Boolean.TRUE.equals(field.get("required")));
71+
fieldMeta.setHidden(Boolean.TRUE.equals(field.get("hidden")));
7172
fieldMeta.setDefaultValue((String) field.get("defaultValue"));
7273
fieldMeta.setPlaceholder((String) field.get("placeholder"));
7374
fieldMeta.setTooltip((String) field.get("tooltip"));

flow-engine-framework/src/main/java/com/codingapi/flow/form/FormField.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ public class FormField {
1717
private String code;
1818
// 字段类型
1919
private DataType type;
20+
// 是否隐藏
21+
private boolean hidden;
2022
// 是否必填
2123
private boolean required;
2224
// 默认值

flow-engine-framework/src/main/java/com/codingapi/flow/manager/NodeStrategyManager.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.codingapi.flow.error.ErrorThrow;
44
import com.codingapi.flow.form.FlowForm;
5+
import com.codingapi.flow.form.permission.FormFieldPermission;
56
import com.codingapi.flow.session.FlowSession;
67
import com.codingapi.flow.strategy.node.*;
78
import lombok.Getter;
@@ -154,6 +155,17 @@ public OperatorManager loadOperators(FlowSession session) {
154155
return new OperatorManager(new ArrayList<>());
155156
}
156157

158+
/**
159+
* 获取节点的字段权限配置
160+
*/
161+
public List<FormFieldPermission> getFieldPermissions() {
162+
FormFieldPermissionStrategy formFieldPermissionStrategy = this.getStrategy(FormFieldPermissionStrategy.class);
163+
if(formFieldPermissionStrategy!=null){
164+
return formFieldPermissionStrategy.getFieldPermissions();
165+
}
166+
return new ArrayList<>();
167+
}
168+
157169
public void verifySession(FlowSession session) {
158170
for (INodeStrategy strategy : strategies) {
159171
strategy.verifySession(session);
@@ -185,4 +197,6 @@ public ErrorThrow errorTrigger(FlowSession session) {
185197
}
186198
return null;
187199
}
200+
201+
188202
}

flow-engine-framework/src/main/java/com/codingapi/flow/pojo/response/FlowContent.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.codingapi.flow.action.IFlowAction;
44
import com.codingapi.flow.form.FlowForm;
5+
import com.codingapi.flow.form.permission.FormFieldPermission;
56
import com.codingapi.flow.manager.ActionManager;
67
import com.codingapi.flow.manager.NodeStrategyManager;
78
import com.codingapi.flow.node.IFlowNode;
@@ -79,6 +80,11 @@ public class FlowContent {
7980
* 表单元数据
8081
*/
8182
private FlowForm form;
83+
84+
/**
85+
* 表单字段权限
86+
*/
87+
private List<FormFieldPermission> fieldPermissions;
8288
/**
8389
* 流程记录
8490
*/
@@ -134,6 +140,7 @@ public void pushCurrentNode(IFlowNode currentNode) {
134140
this.nodeId = currentNode.getId();
135141
this.nodeName = currentNode.getName();
136142
this.nodeType = currentNode.getType();
143+
this.fieldPermissions = strategyManager.getFieldPermissions();
137144
Map<String,Object> nodeData = currentNode.toMap();
138145
this.view = (String) nodeData.get("view");
139146
}

flow-engine-framework/src/main/java/com/codingapi/flow/strategy/node/FormFieldPermissionStrategy.java

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class FormFieldPermissionStrategy extends BaseStrategy {
2424

2525
/**
2626
* 表单字段权限
27+
* 若为空时,代表字段全部可写
2728
*/
2829
private List<FormFieldPermission> fieldPermissions;
2930

@@ -44,10 +45,12 @@ public FormFieldPermissionStrategy(List<FormFieldPermission> fieldPermissions) {
4445
@Override
4546
public void verifyNode(FlowForm form) {
4647
Map<String, DataType> fieldTypes = form.loadAllFieldTypeMaps();
47-
for (FormFieldPermission permission : fieldPermissions) {
48-
String key = permission.getFormCode() + "." + permission.getFieldCode();
49-
if (!fieldTypes.containsKey(key)) {
50-
throw FlowValidationException.fieldNotFound(key);
48+
if(fieldPermissions!=null) {
49+
for (FormFieldPermission permission : fieldPermissions) {
50+
String key = permission.getFormCode() + "." + permission.getFieldCode();
51+
if (!fieldTypes.containsKey(key)) {
52+
throw FlowValidationException.fieldNotFound(key);
53+
}
5154
}
5255
}
5356
}
@@ -57,39 +60,41 @@ public void verifySession(FlowSession session) {
5760
FlowForm flowForm = session.getFormData().getFlowForm();
5861
Map<String, Object> currentData = session.getCurrentRecord().getFormData();
5962
Map<String, Object> latestData = session.getFormData().toMapData();
60-
for (FormFieldPermission permission : fieldPermissions) {
61-
// 子表
62-
if (flowForm.isSubForm(permission.getFormCode())) {
63-
if (permission.getType() == PermissionType.READ) {
64-
List<Map<String, Object>> currentSubFormData = (List<Map<String, Object>>) currentData.get(permission.getFormCode());
65-
List<Map<String, Object>> latestSubFormData = (List<Map<String, Object>>) latestData.get(permission.getFormCode());
66-
if (currentSubFormData == null || latestSubFormData == null) {
67-
throw FlowValidationException.nodeRequired("form");
68-
}
63+
if(fieldPermissions!=null) {
64+
for (FormFieldPermission permission : fieldPermissions) {
65+
// 子表
66+
if (flowForm.isSubForm(permission.getFormCode())) {
67+
if (permission.getType() == PermissionType.READ) {
68+
List<Map<String, Object>> currentSubFormData = (List<Map<String, Object>>) currentData.get(permission.getFormCode());
69+
List<Map<String, Object>> latestSubFormData = (List<Map<String, Object>>) latestData.get(permission.getFormCode());
70+
if (currentSubFormData == null || latestSubFormData == null) {
71+
throw FlowValidationException.nodeRequired("form");
72+
}
6973

70-
if (currentSubFormData.size() != latestSubFormData.size()) {
71-
throw FlowValidationException.nodeRequired("form");
72-
}
74+
if (currentSubFormData.size() != latestSubFormData.size()) {
75+
throw FlowValidationException.nodeRequired("form");
76+
}
7377

74-
for (int i = 0; i < currentSubFormData.size(); i++) {
75-
Map<String, Object> currentSubFormItem = currentSubFormData.get(i);
76-
Map<String, Object> latestSubFormItem = latestSubFormData.get(i);
77-
Object currentValue = currentSubFormItem.get(permission.getFieldCode());
78-
Object latestValue = latestSubFormItem.get(permission.getFieldCode());
78+
for (int i = 0; i < currentSubFormData.size(); i++) {
79+
Map<String, Object> currentSubFormItem = currentSubFormData.get(i);
80+
Map<String, Object> latestSubFormItem = latestSubFormData.get(i);
81+
Object currentValue = currentSubFormItem.get(permission.getFieldCode());
82+
Object latestValue = latestSubFormItem.get(permission.getFieldCode());
83+
if (!currentValue.equals(latestValue)) {
84+
throw FlowValidationException.fieldReadOnly(permission.getFieldCode());
85+
}
86+
}
87+
}
88+
} else {
89+
// 在只读权限下不允许修改数据
90+
if (permission.getType() == PermissionType.READ) {
91+
Object currentValue = currentData.get(permission.getFieldCode());
92+
Object latestValue = latestData.get(permission.getFieldCode());
7993
if (!currentValue.equals(latestValue)) {
8094
throw FlowValidationException.fieldReadOnly(permission.getFieldCode());
8195
}
8296
}
8397
}
84-
} else {
85-
// 在只读权限下不允许修改数据
86-
if (permission.getType() == PermissionType.READ) {
87-
Object currentValue = currentData.get(permission.getFieldCode());
88-
Object latestValue = latestData.get(permission.getFieldCode());
89-
if (!currentValue.equals(latestValue)) {
90-
throw FlowValidationException.fieldReadOnly(permission.getFieldCode());
91-
}
92-
}
9398
}
9499
}
95100
}

frontend/packages/flow-pc/flow-pc-approval/src/components/flow-approval/components/form-view-component.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export const FormViewComponent: React.FC<FormViewComponentProps> = (props) => {
1414
const ViewComponent = ViewBindPlugin.getInstance().get(state.flow?.view || 'default') || FlowFormView;
1515

1616
const flowForm = state.flow?.form;
17+
const fieldPermissions = state.flow?.fieldPermissions || [];
1718

1819
// 是否可合并审批
1920
const mergeable = state.flow?.mergeable || false;
@@ -66,6 +67,7 @@ export const FormViewComponent: React.FC<FormViewComponentProps> = (props) => {
6667
{viewForms.map((item, index) => (
6768
<ViewComponent
6869
key={index}
70+
fieldPermissions={fieldPermissions}
6971
review={review}
7072
meta={flowForm}
7173
form={item.instance}

frontend/packages/flow-pc/flow-pc-design/src/components/design-editor/node-components/promission/table.tsx renamed to frontend/packages/flow-pc/flow-pc-design/src/components/design-editor/node-components/promission/index.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from "react";
22
import {Tabs,Switch} from "antd";
33
import {Table} from "@flow-engine/flow-pc-ui";
4-
import {PromissionManager} from "@/components/design-editor/node-components/promission/index";
4+
import {PromissionPresenter} from "./presenter";
55
import {useDesignContext} from "@/components/design-panel/hooks/use-design-context";
66

77
interface PromissionTableProps {
@@ -12,12 +12,12 @@ interface PromissionTableProps {
1212
interface FormPromissionTableProps {
1313
title: string;
1414
code: string;
15-
promissionManager:PromissionManager;
15+
presenter:PromissionPresenter;
1616
}
1717

1818
const FormPromissionTable: React.FC<FormPromissionTableProps> = (props) => {
1919
const code = props.code;
20-
const promissionManager = props.promissionManager;
20+
const promissionManager = props.presenter;
2121
const datasource = promissionManager.getDatasource(code);
2222

2323
const columns = [
@@ -106,8 +106,8 @@ const FormPromissionTable: React.FC<FormPromissionTableProps> = (props) => {
106106
export const PromissionTable: React.FC<PromissionTableProps> = (props) => {
107107
const {state} = useDesignContext();
108108
const form = state.workflow.form;
109-
const promissionManager = new PromissionManager(form,props.value, props.onChange);
110-
promissionManager.initFormPromission();
109+
const presenter = new PromissionPresenter(form,props.value, props.onChange);
110+
presenter.initFormPromission();
111111

112112
const formList = form.subForms || [];
113113

@@ -119,7 +119,7 @@ export const PromissionTable: React.FC<PromissionTableProps> = (props) => {
119119
<FormPromissionTable
120120
title={item.name}
121121
code={item.code}
122-
promissionManager={promissionManager}
122+
presenter={presenter}
123123
/>
124124
)
125125
}
@@ -130,7 +130,7 @@ export const PromissionTable: React.FC<PromissionTableProps> = (props) => {
130130
<FormPromissionTable
131131
title={form?.name || '主表单'}
132132
code={form?.code || ''}
133-
promissionManager={promissionManager}
133+
presenter={presenter}
134134
/>
135135

136136
{items && items.length > 0 && (

frontend/packages/flow-pc/flow-pc-design/src/components/design-editor/node-components/promission/index.ts renamed to frontend/packages/flow-pc/flow-pc-design/src/components/design-editor/node-components/promission/presenter.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import {FlowForm} from "@flow-engine/flow-types";
2+
import {FieldPermission} from "@flow-engine/flow-types";
23

3-
export class PromissionManager {
4+
export class PromissionPresenter {
45

5-
private data: any[];
6-
private readonly onChange: (data: any[]) => void;
6+
private data: FieldPermission[];
7+
private readonly onChange: (value: FieldPermission[]) => void;
78
private readonly form: FlowForm;
89
private readonly formList:FlowForm[];
910

10-
public constructor(form: FlowForm, data: any[], onChange: (data: any[]) => void) {
11+
public constructor(form: FlowForm, data: FieldPermission[], onChange: (data: FieldPermission[]) => void) {
1112
this.form = form;
1213
this.onChange = onChange;
1314
this.data = data;

frontend/packages/flow-pc/flow-pc-design/src/components/design-editor/node-components/taps/promission.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from "react";
22
import {Field, FieldRenderProps} from "@flowgram.ai/fixed-layout-editor";
3-
import {PromissionTable} from "@/components/design-editor/node-components/promission/table";
3+
import {PromissionTable} from "@/components/design-editor/node-components/promission";
44

55
export const TabPromission: React.FC = () => {
66

frontend/packages/flow-pc/flow-pc-design/src/components/design-panel/layout/body.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const Body = ()=>{
1010
const tabPanelType = state.view.tabPanel;
1111

1212
return (
13-
<>
13+
<div>
1414
{tabPanelType ==='form' && (
1515
<TabForm/>
1616
)}
@@ -23,7 +23,7 @@ export const Body = ()=>{
2323
{tabPanelType ==='setting' && (
2424
<TabSetting/>
2525
)}
26-
</>
26+
</div>
2727
)
2828
}
2929

0 commit comments

Comments
 (0)