fix(gantt): update permission check in gantt block (#1701)

* fix: view collection can  update in gantt

* fix: gantt update without acl check

* style: style improve

* style: style improve

* style: style improve

* style: style improve
This commit is contained in:
katherinehhh 2023-04-14 22:08:01 +08:00 committed by GitHub
parent 2e95d3bf85
commit dca370eacf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 11 deletions

View File

@ -2,6 +2,8 @@ import { useField } from '@formily/react';
import React, { createContext, useContext, useEffect, useState } from 'react';
import { BlockProvider, useBlockRequestContext } from './BlockProvider';
import { TableBlockProvider } from './TableBlockProvider';
import { useACLRoleContext } from '../acl/ACLProvider';
import { useCollection } from '../collection-manager/hooks';
export const GanttBlockContext = createContext<any>({});
@ -11,9 +13,11 @@ const formatData = (
tasks: any[] = [],
projectId: any = undefined,
hideChildren: boolean = false,
checkPermassion?: Function,
) => {
data.forEach((item: any) => {
const percent=item[fieldNames.progress] * 100;
const disable = checkPermassion(item);
const percent = item[fieldNames.progress] * 100;
if (item.children && item.children.length) {
tasks.push({
start: new Date(item[fieldNames.start]),
@ -21,12 +25,13 @@ const formatData = (
name: item[fieldNames.title],
id: item.id + '',
type: 'project',
progress: percent>100?100:percent || 0,
progress: percent > 100 ? 100 : percent || 0,
hideChildren: hideChildren,
project: projectId,
color: item.color,
isDisabled: disable,
});
formatData(item.children, fieldNames, tasks, item.id + '', hideChildren);
formatData(item.children, fieldNames, tasks, item.id + '', hideChildren, checkPermassion);
} else {
tasks.push({
start: item[fieldNames.start] ? new Date(item[fieldNames.start]) : undefined,
@ -34,9 +39,10 @@ const formatData = (
name: item[fieldNames.title],
id: item.id + '',
type: fieldNames.end ? 'task' : 'milestone',
progress: percent>100?100:percent || 0,
progress: percent > 100 ? 100 : percent || 0,
project: projectId,
color: item.color,
isDisabled: disable,
});
}
});
@ -66,8 +72,8 @@ const InternalGanttBlockProvider = (props) => {
export const GanttBlockProvider = (props) => {
return (
<BlockProvider {...props} params={{ tree:true, paginate: false, sort: props.fieldNames.start }}>
<TableBlockProvider {...props} params={{ tree:true, paginate: false, sort: props.fieldNames.start }}>
<BlockProvider {...props} params={{ tree: true, paginate: false, sort: props.fieldNames.start }}>
<TableBlockProvider {...props} params={{ tree: true, paginate: false, sort: props.fieldNames.start }}>
<InternalGanttBlockProvider {...props} />
</TableBlockProvider>
</BlockProvider>
@ -81,6 +87,17 @@ export const useGanttBlockContext = () => {
export const useGanttBlockProps = () => {
const ctx = useGanttBlockContext();
const [tasks, setTasks] = useState<any>([]);
const { getPrimaryKey, name, template } = useCollection();
const { parseAction } = useACLRoleContext();
const primaryKey = getPrimaryKey();
const checkPermassion = (record) => {
const actionPath = `${name}:update`;
const schema = {};
const recordPkValue = record?.[primaryKey];
const params = parseAction(actionPath, { schema, recordPkValue });
return template === 'view' || !params;
};
const onExpanderClick = (task: any) => {
const data = ctx.field.data;
const tasksData = data.map((t: any) => (t.id === task.id ? task : t));
@ -88,13 +105,13 @@ export const useGanttBlockProps = () => {
ctx.field.data = tasksData;
};
const expandAndCollapseAll = (flag) => {
const data = formatData(ctx.service.data?.data, ctx.fieldNames, [], undefined, flag);
const data = formatData(ctx.service.data?.data, ctx.fieldNames, [], undefined, flag, checkPermassion);
setTasks(data);
ctx.field.data = data;
};
useEffect(() => {
if (!ctx?.service?.loading) {
const data = formatData(ctx.service.data?.data, ctx.fieldNames);
const data = formatData(ctx.service.data?.data, ctx.fieldNames, [], undefined, false, checkPermassion);
setTasks(data);
ctx.field.data = data;
}

View File

@ -56,10 +56,11 @@ const GanttRecordViewer = (props) => {
export const Gantt: any = (props: any) => {
const { designable } = useDesignable();
const currentTheme = localStorage.getItem('NOCOBASE_THEME');
const tableRowHeight = currentTheme === 'compact' ? 45 : 55.56;
const {
headerHeight = currentTheme === 'compact' ? (designable ? 53 : 45) : designable ? 65 : 55,
listCellWidth = '155px',
rowHeight = currentTheme === 'compact' ? 45 : 55.56,
rowHeight = tableRowHeight,
ganttHeight = 0,
preStepsCount = 1,
barFill = 60,
@ -490,6 +491,9 @@ export const Gantt: any = (props: any) => {
.ant-table-container::after {
box-shadow: none !important;
}
.ant-table-row {
height: ${tableRowHeight}px;
}
`}
>
<GanttRecordViewer visible={visible} setVisible={setVisible} record={record} />

View File

@ -5,7 +5,7 @@ export const ganttVerticalContainer = css`
font-size: 0;
margin: 0;
padding: 0;
// width:100%;
width:100%;
border-left: 2px solid #f4f2f2;
`;

View File

@ -23,7 +23,7 @@ export const scrollWrapper = css`
background-clip: padding-box;
}
&::-webkit-scrollbar-thumb:hover {
border: 3px solid transparent;
border: 4px solid transparent;
background: #5c5858bd;
background-clip: padding-box;
}