Commit 62c3eeff authored by chenshouchao's avatar chenshouchao

Merge branch 'staging' into 'feat-20220608-projectdata'

# Conflicts:
#   src/api/api_manager.ts
#   src/router/index.ts
parents 532345c9 75150ad7
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIF7DCCBNSgAwIBAgIQCVCYwDuVY5x4M+xh4B2LgDANBgkqhkiG9w0BAQsFADBZ
MIIF6jCCBNKgAwIBAgIQBHtGXn1JBnAxkirfAJ6QIjANBgkqhkiG9w0BAQsFADBZ
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMTMwMQYDVQQDEypS
YXBpZFNTTCBUTFMgRFYgUlNBIE1peGVkIFNIQTI1NiAyMDIwIENBLTEwHhcNMjIw
NTA5MDAwMDAwWhcNMjMwNTMxMjM1OTU5WjAXMRUwEwYDVQQDDAwqLmNsb3VkYW0u
Y24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0jHcBgqqvNeBEkket
TCA0zm90o6AId9LMuplXFTkyk43MP5ilsgD1iTCj201IVjqNgL/UeDkpqaPbiYIM
65Gv1Rfj8YIH7KlXiNNUEu+542CF93xxh0BAQLj8CdvjDVd7k0HmMpNZoLtSyLiQ
59pfG0jWYbq4HahJzdxs9DJ1Puo+PPz+Twu3DRO5diZO2urLIK3bZ/bTf6+y8kkn
/MKfXCPK98X+GNxuT6qwKVhxN79hgPbhqPJmqsy1gYq58cLSBkq8KGlWpxHMGS1l
q3122E77qbvr1jnuO4bsHiJIIpITl5/QgrEqEshMiogjSse6a9MV61oLeOsG1GzY
DemTAgMBAAGjggLwMIIC7DAfBgNVHSMEGDAWgBSkjeW+fHnkcCNtLik0rSNY3PUx
fzAdBgNVHQ4EFgQUNNP5yKVtlyy6e+comkKsDusNwJUwIwYDVR0RBBwwGoIMKi5j
YXBpZFNTTCBUTFMgRFYgUlNBIE1peGVkIFNIQTI1NiAyMDIwIENBLTEwHhcNMjEw
NjA4MDAwMDAwWhcNMjIwNjA4MjM1OTU5WjAXMRUwEwYDVQQDDAwqLmNsb3VkYW0u
Y24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDezZOefbGzYX0ZytLu
nphj9zjiqD6fum/fz/PBICxNn4qgWcK5PK4rpTY7+gTLyKaRJxZQxuGY3QAmt5j6
zOqwa6Kate4WkAFQy+v44XhlOF/x2eM4HADezeFag7Qjzes/5L/mcd9ieb50nrwM
UsOdAHctxmxv8aJrPEowfNHyYmGi9gRJOriDq17y/OTf75Ickpfhs5caoDY93N4S
KyD+78Kbm1mHQqBltGD8kPi8iJE9WetpVdzK2ZgLj25P3mw3mbMvYsGIgUnvvMgB
prpbJif/YjDyzm4/fvg1uqypH/BUAmxc0wS6NYBN3A7l4ZBKVIRIOHs1CROr2vpq
bIWXAgMBAAGjggLuMIIC6jAfBgNVHSMEGDAWgBSkjeW+fHnkcCNtLik0rSNY3PUx
fzAdBgNVHQ4EFgQUC5fZPEyzRt0LXku8OFLtjBUxaUkwIwYDVR0RBBwwGoIMKi5j
bG91ZGFtLmNuggpjbG91ZGFtLmNuMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAU
BggrBgEFBQcDAQYIKwYBBQUHAwIwPgYDVR0gBDcwNTAzBgZngQwBAgEwKTAnBggr
BgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIGFBggrBgEFBQcB
AQR5MHcwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBPBggr
BgEFBQcwAoZDaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL1JhcGlkU1NMVExT
RFZSU0FNaXhlZFNIQTI1NjIwMjBDQS0xLmNydDAJBgNVHRMEAjAAMIIBgQYKKwYB
BAHWeQIEAgSCAXEEggFtAWsAdwDoPtDaPvUGNTLnVyi8iWvJA9PL0RFr7Otp4Xd9
bQa9bgAAAYCnXln2AAAEAwBIMEYCIQCOO9Vs04VxDM8yhgw9kh1Mm9bxcPycKYLJ
vg9fWOVnIwIhAOML4pBX4GFmiz5ltRzMBpeZU17TTeXHbQKX71LIcFmmAHcANc8Z
G7+xbFe/D61MbULLu7YnICZR6j/hKu+oA8M71kwAAAGAp15aMwAABAMASDBGAiEA
tzy6cxQMDdOG0RIyfkLzap6+cykg3qJBtr2/b8MA0moCIQCkbYtS7izBtsyh9MZc
Px2JZ++GUREx6N3xDDwwmguujgB3ALc++yTfnE26dfI5xbpY9Gxd/ELPep81xJ4d
CYEl7bSZAAABgKdeWh0AAAQDAEgwRgIhAPLjJg/t39lhqh958EbkQCd1Zd7NkVSY
HcKZ2SKHfPvtAiEAjpATcHNkXNTCzsqf7JFBEOgCwP0HDoqbCiM415PSl9AwDQYJ
KoZIhvcNAQELBQADggEBAEqz3XwL/NvDRScc74TkDkpDMOHrK1j57ccJXs6uheLL
Ukb5D7YQQnadtkFChmCWB+zU6ZC5zwkFtFiHITL1uZlazulGTcKT09QadvdAoZuA
mWuUsb08mkp0XKqgHBaojFNfs6Iwd2N9WP58CWqw1gTRNDHrbZOGGBEIYAUBT1Sa
LANPnq5tTtDw9FksYD8pEmlr+EXUlhgM36WWdt/MUkEaFtKv0+koZv4xHpE9f1gN
U900tP8LXachtdJOtw1JXWuEHwzjI/XLKjORpy80b6xNI4mw0uQHa8wbbuv7iay8
f4SeNNM6RLBP+HzCcC08rNpF6YTgsJcn/uZOjeOlxNU=
RFZSU0FNaXhlZFNIQTI1NjIwMjBDQS0xLmNydDAJBgNVHRMEAjAAMIIBfwYKKwYB
BAHWeQIEAgSCAW8EggFrAWkAdgApeb7wnjk5IfBWc59jpXflvld9nGAK+PlNXSZc
JV3HhAAAAXnpYz/4AAAEAwBHMEUCIQDgrYEEPoRY0oRzcpDCu3gW4OJtXzeyQlmo
e25p5o+JSQIgLSgIZWkdHZNVUBsdmi5NY9BbM8D0DCinlrDOLUTaBi0AdwAiRUUH
WVUkVpY/oS/x922G4CMmY63AS39dxoNcbuIPAgAAAXnpY0BOAAAEAwBIMEYCIQDb
UcpTWE+UGxnrWqA1/h28DvhakqEzQqNr1Pf5P31AxwIhAPdmmjrRAvGiqW3RBJVw
RvxmpLGvc12445pw+Xj81T7dAHYAQcjKsd8iRkoQxqE6CUKHXk4xixsD6+tLx2jw
kGKWBvYAAAF56WNAFQAABAMARzBFAiEA+AH8S2VvEdIjgrodGEDiKlTidyKigM4a
WbkEwEWNfLUCICv0w3apBeY8PU5s6SgJEX7WIU/ZPl9QxIjEcUuktORcMA0GCSqG
SIb3DQEBCwUAA4IBAQDNBnMLKBijkBxwbsByUNgVeAzZFsX30ew5fe9ngLngnSa3
LgwRl7tdrG8yBA3rATAu6+WxriQ8/vvWmjqIKAOnvy7/wSEoh+1vk4KAgg8EVghg
xgT0gjeRRw40oDv4wDsWvsOsCMsCZ4r0gS4VvVfywWsnuGWv65qEuHYmrp1ozbvE
Q/8PAJOkJbTnh89ix60khA6GCI66nC4KEgKvR9BGUvzVwiERDlDho8N7jyEOrJOn
LdOdnhiNajDMFkwhjJUY6dYixTM+BwJbR1n2/NoI9Ksv6hWT5chNVnHkPWfr8A+m
bwEc3WpLF3ZO5zx2kuSqVmJ/IHCTvdMhVr3XAHp3
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIQB5g2A63jmQghnKAMJ7yKbDANBgkqhkiG9w0BAQsFADBh
......
......@@ -23,6 +23,10 @@ const RESTAPI = {
API_DATA_MOVE: `${BACKEND_API_URI_PREFIX}/cpp/data/move`, //移动到
API_DATA_DEL: `${BACKEND_API_URI_PREFIX}/cpp/data/del`, //删除项目中的数据集
API_USER_PERMISSION_LIST: `${BACKEND_API_URI_PREFIX}/uaa/routes/privilege/list`, //获取用户包含的权限列表
};
API_WORKBENCH_TEMPLATE_LIST: `${BACKEND_API_URI_PREFIX}/cpp/workbench/project/workflowspec`,//查询项目下工作流模板列表
API_WORKBENCH_DELETE_TEMPLATE: `${BACKEND_API_URI_PREFIX}/cpp/workbench/project/workflowspec`,//项目管理员-删除工作流模板
API_WORKBENCH_ADD_TEMPLATE_LIST: `${BACKEND_API_URI_PREFIX}/cpp/workbench/product/workflowspec`,//项目管理员-添加工作流模板-模板列表
API_WORKBENCH_ADD_TEMPLATE: `${BACKEND_API_URI_PREFIX}/cpp/workbench/project/workflowspec`,//项目管理员-添加工作流模板-提交
}
export default RESTAPI;
import request from "@/utils/axios/service";
import Api from "./api_manager";
function current() {
return request({
url: Api.API_USER_FETCH,
method: "get",
});
}
function menu() {
return request({
url: "/accounts/menu-mock",
method: "get",
});
}
type workflowspecTemplateParams = {
projectId: string;
title?: string;
};
// 查询项目下工作流模板列表
const getWorkbenchTemplate = (params: workflowspecTemplateParams) => {
return request({
url: Api.API_WORKBENCH_TEMPLATE_LIST,
method: "get",
params,
});
};
type workflowspecDeleteTemplateParams = {
projectId: string;
workflowSpecId: string;
};
// 项目管理员-删除工作流模板
const deleteWorkbenchTemplate = (params: workflowspecDeleteTemplateParams) => {
return request({
url: Api.API_WORKBENCH_DELETE_TEMPLATE,
method: "delete",
params,
});
};
type workflowspecGetAddTemplateParams = {
projectId?: string;
productId: string;
title?: string;
};
// 项目管理员-添加工作流模板-模板列表
const getAddWorkbenchTemplate = (params: workflowspecGetAddTemplateParams) => {
return request({
url: Api.API_WORKBENCH_ADD_TEMPLATE_LIST,
method: "get",
params,
});
};
type workflowspecAddTemplateParams = {
projectId: string;
workflowSpecIds: string[];
};
// 项目管理员-添加工作流模板-提交
const addWorkbenchTemplate = (params: workflowspecAddTemplateParams) => {
return request({
url: Api.API_WORKBENCH_ADD_TEMPLATE,
method: "post",
data: params,
});
};
export {
current,
menu,
getWorkbenchTemplate,
deleteWorkbenchTemplate,
getAddWorkbenchTemplate,
addWorkbenchTemplate
};
<?xml version="1.0" encoding="UTF-8"?>
<svg width="83px" height="70px" viewBox="0 0 83 70" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>切片</title>
<defs>
<polygon id="path-1" points="0 0 65.7607024 0 65.7607024 46.987 0 46.987"></polygon>
<linearGradient x1="50%" y1="20.7300519%" x2="50%" y2="102.568465%" id="linearGradient-3">
<stop stop-color="#E3F0FF" offset="0%"></stop>
<stop stop-color="#8CBAFF" offset="100%"></stop>
</linearGradient>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-4">
<stop stop-color="#CEE2F9" offset="0%"></stop>
<stop stop-color="#9FC0F0" offset="100%"></stop>
</linearGradient>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-5">
<stop stop-color="#DBEAFC" offset="0%"></stop>
<stop stop-color="#8AAFE6" offset="100%"></stop>
</linearGradient>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-6">
<stop stop-color="#DBEAFC" offset="0%"></stop>
<stop stop-color="#8AAFE6" offset="100%"></stop>
</linearGradient>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-7">
<stop stop-color="#F2F7FF" offset="0%"></stop>
<stop stop-color="#E1EDFF" offset="100%"></stop>
</linearGradient>
<path d="M17.9695,0 C18.1602024,0 18.3370714,0.101 18.435881,0.267 L18.435881,0.267 L22.5265952,7.169 C22.6254048,7.335 22.8022738,7.436 22.9929762,7.436 L22.9929762,7.436 L42.7677262,7.436 C42.9584286,7.436 43.1352976,7.335 43.233119,7.169 L43.233119,7.169 L47.3258095,0.267 C47.423631,0.101 47.6005,0 47.7912024,0 L47.7912024,0 L65.21725,0 C65.517631,0 65.7607024,0.246 65.7607024,0.55 L65.7607024,0.55 L65.7607024,18.864 C65.7607024,19.534 65.2231786,20.078 64.5611548,20.078 L64.5611548,20.078 L1.19855952,20.078 C0.536535714,20.078 0,19.534 0,18.864 L0,18.864 L0,0.55 C0,0.246 0.243071429,0 0.542464286,0 L0.542464286,0 Z M41.7340798,12.3811 L24.0274131,12.3811 C23.5254607,12.3811 23.1193536,12.7931 23.1193536,13.3001 C23.1193536,13.8081 23.5254607,14.2191 24.0274131,14.2191 L24.0274131,14.2191 L41.7340798,14.2191 C42.235044,14.2191 42.6421393,13.8081 42.6421393,13.3001 C42.6421393,12.7931 42.235044,12.3811 41.7340798,12.3811 L41.7340798,12.3811 Z" id="path-8"></path>
</defs>
<g id="上线UI" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="工作台(子用户)" transform="translate(-789.000000, -511.000000)">
<g id="编组-6" transform="translate(788.000000, 511.000000)">
<g id="img_no-data" transform="translate(1.000000, 0.000000)">
<g transform="translate(8.645833, 6.999500)">
<g id="编组" transform="translate(0.000000, 8.970200)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="Clip-2"></g>
<path d="M49.3205762,0 L32.8806476,0 L16.440719,0 L0.257695238,26.488 C0.0897190476,26.764 -0.000197619048,27.081 -0.000197619048,27.405 L-0.000197619048,45.323 C-0.000197619048,45.689 1.28235,46.987 1.64498095,46.987 L32.8806476,46.987 L64.1173024,46.987 C64.4789452,46.987 65.7614929,45.689 65.7614929,45.323 L65.7614929,27.405 C65.7614929,27.081 65.6725643,26.764 65.5036,26.488 L49.3205762,0 Z" id="Fill-1" fill="url(#linearGradient-3)" mask="url(#mask-2)"></path>
</g>
<polygon id="Fill-3" fill="url(#linearGradient-4)" points="32.880944 8.5034 16.4400274 8.5034 16.4400274 18.3434 32.880944 18.3434 49.3208726 18.3434 49.3208726 8.5034"></polygon>
<path d="M1.25705476,53.0815 L16.4401262,18.3435 L16.4401262,8.5035 L0.250185714,35.4635 C0.0861619048,35.7355 0.000197619048,36.0495 0.000197619048,36.3675 L0.000197619048,52.8125 C0.000197619048,53.5315 0.969519048,53.7385 1.25705476,53.0815" id="Fill-5" fill="url(#linearGradient-5)"></path>
<path d="M64.5048333,53.0815 L49.3207738,18.3435 L49.3207738,8.5035 L65.5117024,35.4635 C65.6747381,35.7355 65.7607024,36.0495 65.7607024,36.3675 L65.7607024,52.8125 C65.7607024,53.5315 64.791381,53.7385 64.5048333,53.0815" id="Fill-7" fill="url(#linearGradient-6)"></path>
<g id="编组" transform="translate(0.000198, 35.880000)">
<mask id="mask-9" fill="white">
<use xlink:href="#path-8"></use>
</mask>
<use id="形状结合" fill="url(#linearGradient-7)" xlink:href="#path-8"></use>
</g>
<line x1="13.3284167" y1="4.812" x2="10.3582024" y2="0" id="Stroke-13" stroke="#C2DAFE" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></line>
<line x1="16.1112881" y1="4.5181" x2="17.7248476" y2="0.0531" id="Stroke-15" stroke="#C2DAFE" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></line>
<line x1="11.8462738" y1="7.2143" x2="7.17357143" y2="6.7233" id="Stroke-17" stroke="#C2DAFE" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></line>
</g>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
......@@ -13,6 +13,7 @@ type ButtonTagProps = {
fontSize?: string;
dropValue?: boolean;
drop?: boolean;
color?: "inherit" | "primary" | "secondary" | "success" | "error" | "info" | "warning" | undefined,
}
......@@ -35,6 +36,7 @@ const ButtonComponent = (props: ButtonTagProps) => {
<>
<Button
variant={props.variant || 'contained'}
color={props.color || "primary"}
disableRipple={true}
disableFocusRipple={true}
classes={{
......
......@@ -2,33 +2,74 @@ import { operation, route } from "@/router";
import { useStores } from "@/store";
import { useCallback } from "react";
const roleList: any[] = [
{ VIEWER: 1 },
{ USER: 2 },
{ MANAGER: 3 },
{ OWNER: 4 }
]
const usePass = () => {
const { permissionStore } = useStores();
const { currentProjectStore } = useStores();
const isPass = useCallback(
(key: string, routes?: Array<route | operation>): boolean => {
if (routes) {
for (let item of routes) {
if (item.id === key) {
return true;
} else if (
item.type === "page" &&
item.children?.length &&
isPass(key, item.children)
) {
return true;
(key: string, role?: "VIEWER" | "USER" | "MANAGER" | "OWNER", routes?: Array<route | operation>): boolean => {
let code = currentProjectStore && currentProjectStore.currentProjectInfo.projectRole
if (role) {
if (code && roleList.filter(e => e[role])[0][role] <= roleList.filter(e => e[code as string])[0][code]) {
if (routes) {
for (let item of routes) {
if (item.id === key) {
return true;
} else if (
item.type === "page" &&
item.children?.length &&
isPass(key, role, item.children)
) {
return true;
}
}
} else {
for (let item of permissionStore.allRoutes) {
if (item.type !== "navigate" && item.id === key) {
return true;
} else if (
item.type === "page" &&
item.children?.length &&
isPass(key, role, item.children)
) {
return true;
}
}
}
} else {
return false
}
} else {
for (let item of permissionStore.allRoutes) {
if (item.type !== "navigate" && item.id === key) {
return true;
} else if (
item.type === "page" &&
item.children?.length &&
isPass(key, item.children)
) {
return true;
if (routes) {
for (let item of routes) {
if (item.id === key) {
return true;
} else if (
item.type === "page" &&
item.children?.length &&
isPass(key, role, item.children)
) {
return true;
}
}
} else {
for (let item of permissionStore.allRoutes) {
if (item.type !== "navigate" && item.id === key) {
return true;
} else if (
item.type === "page" &&
item.children?.length &&
isPass(key, role, item.children)
) {
return true;
}
}
}
}
......
......@@ -8,19 +8,33 @@ import { stores } from "@/store/index";
import { MySnackbarProvider } from "@/components/MySnackbar";
import "@/mocks/index";
import './assets/style/public.css'
import { createTheme, ThemeProvider, styled } from '@mui/material/styles';
const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement
);
const theme = createTheme({
typography: {
fontFamily: ['Roboto', 'Helvetica', 'Tahoma', 'Arial', '"PingFang SC"', '"Hiragino Sans GB"', '"Heiti SC"', '"WenQuanYi Micro Hei"', 'sans-serif', '"Apple Color Emoji"', '"Segoe UI Emoji"', '"Segoe UI Symbol"'].join(','),
},
palette: {
primary: { main: '#136EFA' },
secondary: { main: '#4EB9FB' }
}
});
root.render(
<React.StrictMode>
<Provider {...stores}>
<MySnackbarProvider
alertSx={{ boxShadow: "0px 2px 4px 0px rgb(0 0 0 / 8%)" }}
>
<MyRouter></MyRouter>
</MySnackbarProvider>
</Provider>
<ThemeProvider theme={theme}>
<Provider {...stores}>
<MySnackbarProvider
alertSx={{ boxShadow: "0px 2px 4px 0px rgb(0 0 0 / 8%)" }}
>
<MyRouter></MyRouter>
</MySnackbarProvider>
</Provider>
</ThemeProvider>
</React.StrictMode>
);
......
......@@ -15,6 +15,9 @@ import NotFound from "@/views/404";
import Demo from "@/views/demo";
import ProjectSetting from "@/views/Project/ProjectSetting";
import ProjectData from "@/views/Project/ProjectData";
import ProjectWorkbench from "@/views/Project/ProjectWorkbench";
export type route = {
id?: string;
type: "page";
......@@ -48,6 +51,7 @@ export const elements: {
Demo: Demo,
ProjectSetting: ProjectSetting,
ProjectData: ProjectData,
ProjectWorkbench:ProjectWorkbench
};
export const routes: Array<route | navigate> = [
......
......@@ -3,6 +3,7 @@ type projectInfo = {
id?: string;
name?: string;
desc?: string;
projectRole?: string;
};
type productInfo = {
......
/*
* @Author: rocosen
* @Date: 2022-06-12 10:05:13
* @LastEditors: rocosen
* @LastEditTime: 2022-06-07 20:23:02
* @FilePath: /bkunyun/src/views/Project/ProjectSetting/index.tsx
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { memo, useState, useMemo, useEffect } from "react";
import { Box } from "@mui/system";
import { useStores } from "@/store/index";
import NoProject from "@/components/NoProject";
import { observer } from "mobx-react-lite";
import projectImg from "@/assets/project/projectIconSmall.svg";
import WorkbenchTemplate from "./workbenchTemplate";
import WorkbenchList from "./workbenchList";
import Tabs from "@/components/mui/Tabs";
import usePass from "@/hooks/usePass";
const ProjectWorkbench = observer(() => {
const { currentProjectStore } = useStores();
const isPass = usePass();
const [value, setValue] = useState("workbenchTemplate");
useEffect(() => {
console.log(isPass("PROJECT_WORKBENCH_FLOES_USE",'USER'), "11111111111");
}, [])
const tabList = useMemo(() => {
return [
{
label: "工作流模版",
value: "workbenchTemplate",
component: <WorkbenchTemplate />,
},
{
label: "任务列表",
value: "workbenchList",
component: <WorkbenchList />,
},
];
}, []);
const changeTabs = (val: string) => {
setValue(val);
};
return (
<div style={{ padding: 24 }}>
<div style={{ display: "flex", alignItems: "center" }}>
<img src={projectImg} alt="项目logo" />
<span style={{ marginLeft: 12 }}>
工作台
</span>
</div>
<Box sx={{ width: "100%", typography: "body1" }}>
<Tabs value={value} onChange={changeTabs} tabList={tabList} />
</Box>
</div>
);
});
export default memo(ProjectWorkbench);
/*
* @Author: 吴永生#A02208 yongsheng.wu@wholion.com
* @Date: 2022-05-31 10:18:13
* @LastEditors: 吴永生#A02208 yongsheng.wu@wholion.com
* @LastEditTime: 2022-06-07 21:39:30
* @FilePath: /bkunyun/src/views/Project/ProjectSetting/index.tsx
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { memo, useCallback, useEffect, useMemo, useState } from "react";
import _ from "lodash";
import { IResponse, useHttp } from "@/api/http";
import { useStores } from "@/store";
const ProjectMembers = () => {
const http = useHttp();
const { currentProjectStore } = useStores();
useEffect(() => {
}, []);
return (
<>
99999
</>
);
};
export default memo(ProjectMembers);
import { memo, useCallback, useEffect, useMemo, useState } from "react";
import styles from "../index.module.css";
import { Box, Typography } from "@mui/material";
import Button from "@mui/material/Button";
import Dialog from "@/components/mui/Dialog";
import OutlinedInput from "@mui/material/OutlinedInput";
import SearchIcon from "@mui/icons-material/Search";
import Checkbox from '@mui/material/Checkbox';
import CloseOutlinedIcon from '@mui/icons-material/CloseOutlined';
import _ from "lodash";
const AddTemplate = (props: any) => {
const { openAddTemplate, closeAddTemplateBlock, addTemplateList, templateSelectCallback, selectTemplateData, addTemplateCallback, searchTemplateNameCallback } = props;
return (
<Box className={styles.addTemplateMask} sx={{ display: openAddTemplate ? 'flex' : 'none' }} >
<Box sx={{ height: '50px', display: 'flex', alignItems: 'center' }} >
<CloseOutlinedIcon sx={{ color: "#ffffff", marginRight: "10px", cursor: "pointer" }} onClick={() => {
closeAddTemplateBlock()
}} />
</Box>
<Box className={styles.addTemplateBlock}>
<Box sx={{ padding: "24px 32px" }}>
<Typography sx={{ fontSize: '18px', fontWeight: '600', color: "#1E2633" }}>添加工作流模版</Typography>
<Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: "20px" }}>
<OutlinedInput
onChange={(e: any) => {
_.debounce(() => {
searchTemplateNameCallback(e.target.value)
}, 200)();
}}
placeholder="输入关键词搜索"
size="small"
sx={{ width: 340, height: 32, marginTop: "20px" }}
endAdornment={<SearchIcon style={{ color: "#8A9099" }} />}
/>
<Button
style={{ backgroundColor: "#1370FF", marginLeft: "12px" }}
variant="contained"
onClick={addTemplateCallback}
size="small"
>
添加模版{selectTemplateData.length === 0 ? "" : `(${selectTemplateData.length})`}
</Button>
</Box>
<Box sx={{ display: "flex", flexWrap: 'wrap', overflowX: 'hidden', overflowY: 'overlay', marginLeft: '-8px' }} >
{
addTemplateList.map((item: any, key: any) => {
return (
<Box className={styles.addTemplateBox} onClick={() => {
templateSelectCallback(item.id)
}}
sx={{ border: selectTemplateData.includes(item.id) ? '1px solid #1370FF' : "1px solid #EBEDF0;" }}
>
<Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', }}>
<Typography sx={{ fontSize: '14px', fontWeight: '600', color: '#1E2633', marginBottom: "4px", overflow: 'hidden', textOverflow: 'ellipsis' }}>{item.title}</Typography>
<Checkbox size="small" sx={{ padding: "0px" }} checked={selectTemplateData.includes(item.id)} />
</Box>
<Box sx={{ display: 'flex', marginBottom: "8px" }}>
<Typography sx={{ fontSize: '12px', fontWeight: '400', color: '#1370FF', marginRight: "24px" }}>版本:{item.version}</Typography>
<Typography sx={{ fontSize: '12px', fontWeight: '400', color: '#1370FF' }}>更新时间:{item.updateTime}</Typography>
</Box>
<Typography className={styles.templateDescText} >{item.description}</Typography>
</Box>
)
})
}
</Box>
</Box>
</Box>
</Box>
);
};
export default memo(AddTemplate);
import { memo, useCallback, useEffect, useMemo, useState } from "react";
import styles from "../index.module.css";
import { Box, Typography } from "@mui/material";
import Button from "@mui/material/Button";
import Dialog from "@/components/mui/Dialog";
const SimpleDialog = (props: any) => {
const { openDialog, closeDialog, onConfirm, text, title } = props;
return (
< >
<Dialog
open={openDialog}
onClose={closeDialog}
onConfirm={onConfirm}
title={title}
>
<Box>
<Typography sx={{ fontSize: '14px', fontWeight: '400' }}>{text}</Typography>
</Box>
</Dialog>
</>
);
};
export default memo(SimpleDialog);
import { memo, useCallback, useEffect, useMemo, useState } from "react";
import styles from "../index.module.css";
import { Box, Typography } from "@mui/material";
import Button from "@mui/material/Button";
import usePass from "@/hooks/usePass";
const TemplateBox = (props: any) => {
const info = props.data
const isPass = usePass();
return (
<Box className={styles.templateBlock} >
<Box>
<Typography sx={{ fontSize: '14px', fontWeight: '600', color: '#1E2633', marginBottom: "4px", overflow: 'hidden', textOverflow: 'ellipsis' }}>{info.title}</Typography>
<Box sx={{ display: 'flex', marginBottom: "8px" }} >
<Typography sx={{ fontSize: '12px', fontWeight: '400', color: '#1370FF', marginRight: "24px" }}>版本:{info.version}</Typography>
<Typography sx={{ fontSize: '12px', fontWeight: '400', color: '#1370FF' }}>更新时间:{info.updateTime}</Typography>
</Box>
<Typography className={styles.templateDescText} >{info.description}</Typography>
</Box>
<Box sx={{
display: 'flex', justifyContent: 'end'
}} >
{
isPass("PROJECT_WORKBENCH_FLOES_USE", 'MANAGER') && <Button
style={{ backgroundColor: "#F0F2F5", color: "#565C66" }}
variant="contained"
onClick={() => { props.startDialog(info.id) }}
size="small"
>
删除模版
</Button>
}
{
isPass("PROJECT_WORKBENCH_FLOES_USE", 'USER') && <Button
style={{ backgroundColor: "#1370FF", marginLeft: "12px" }}
variant="contained"
// onClick={addTemplateBlock}
size="small"
>
使用模版
</Button>
}
</Box>
</Box>
);
};
export default memo(TemplateBox);
.headerBox {
/* display: flex;
justify-content: space-between;
align-items: center; */
margin-bottom: 20px;
}
.removeItemBox {
color: #ff4e4e;
margin-left: 32px;
cursor: pointer;
}
.tabBox {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 24px;
}
.templateBlock {
width: 21.4876%;
height: 160px;
background: #FFFFFF;
border-radius: 4px;
border: 1px solid #EBEDF0;
padding: 16px 20px;
display: flex;
flex-direction: column;
justify-content: space-between;
margin: 8px;
}
.addTemplateMask {
background: rgb(56, 56, 56, 0.7);
position: absolute;
z-index: 800;
top: 0%;
left: 0%;
width: 100%;
height: 100%;
display: flex;
align-items: end;
flex-direction: column;
}
.addTemplateBlock {
background: #FFFFFF;
z-index: 900;
border-radius: 16px 0px 0px 0px;
height: 100%;
width: 100%;
}
.addTemplateBox {
width: 16.8751%;
height: 114px;
background: #FFFFFF;
border-radius: 4px;
border: 1px solid #F0F2F5;
padding: 16px 20px;
margin: 8px;
cursor: pointer;
}
.addTemplateBox:hover {
box-shadow: 6px 8px 22px 0px rgba(0, 24, 57, 0.08);
}
.templateDescText {
overflow: hidden;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
display: -webkit-box;
height: 54px;
font-size: 12px !important;
font-weight: 400 !important;
color: #8A9099 !important;
}
.addNewTemplate {
width: 380px;
height: 194px;
background: #FFFFFF;
border-radius: 4px;
border: 1px solid #EBEDF0;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
cursor: pointer;
}
\ No newline at end of file
/*
* @Author: 吴永生#A02208 yongsheng.wu@wholion.com
* @Date: 2022-05-31 10:18:13
* @LastEditors: 吴永生#A02208 yongsheng.wu@wholion.com
* @LastEditTime: 2022-06-07 21:39:30
* @FilePath: /bkunyun/src/views/Project/ProjectSetting/index.tsx
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { memo, useCallback, useEffect, useMemo, useState } from "react";
import { Box, Typography } from "@mui/material";
import styles from "./index.module.css";
import OutlinedInput from "@mui/material/OutlinedInput";
import SearchIcon from "@mui/icons-material/Search";
// import Button from "@/components/mui/Button";
import Button from "@mui/material/Button";
import Add from "@mui/icons-material/Add";
import useMyRequest from "@/hooks/useMyRequest";
import TemplateBox from "./components/templateBox"
import SimpleDialog from "./components/simpleDialog"
import AddTemplate from "./components/addTemplate"
import noData from '../../../../assets/project/noTemplate.svg'
import {
getWorkbenchTemplate,
deleteWorkbenchTemplate,
getAddWorkbenchTemplate,
addWorkbenchTemplate
} from "@/api/workbench_api";
import _ from "lodash";
import { IResponse, useHttp } from "@/api/http";
import { useStores } from "@/store";
import usePass from "@/hooks/usePass";
const ProjectMembers = () => {
const { currentProjectStore } = useStores();
const isPass = usePass();
/** 搜索模板名称 */
const [templateName, setTemplateName] = useState("");
/** 模板列表 */
const [templateList, setTemplateList] = useState([]);
/** 选中的模板id */
const [templateId, setTemplateId] = useState('');
/** 简单弹窗(删除模板) */
const [openDialog, setOpenDialog] = useState(false);
/** 增加模板 */
const [openAddTemplate, setOpenAddTemplate] = useState(false);
/** 可增加模板列表 */
const [addTemplateList, setAddTemplateList] = useState([]);
/** 已选择增加的模板列表 */
const [selectTemplateData, setSelectTemplateData] = useState<string[]>([]);
// 获取模板列表
const { run: getTemplateInfo } = useMyRequest(getWorkbenchTemplate, {
onSuccess: (result: any) => {
setTemplateList(result.data);
},
});
// 删除模板
const { run: delTemplate } = useMyRequest(deleteWorkbenchTemplate, {
onSuccess: (result: any) => {
setOpenDialog(false);
getTemplateInfo({
projectId: currentProjectStore.currentProjectInfo.id as string,
title: templateName
});
},
});
// 添加工作流模板-获取模板列表
const { run: getAddTemplateList } = useMyRequest(getAddWorkbenchTemplate, {
onSuccess: (result: any) => {
setAddTemplateList(result.data)
setOpenAddTemplate(true);
},
});
// 项目管理员-添加工作流模板-提交
const { run: addTemplate } = useMyRequest(addWorkbenchTemplate, {
onSuccess: (result: any) => {
setOpenAddTemplate(false)
getTemplateInfo({
projectId: currentProjectStore.currentProjectInfo.id as string,
});
setSelectTemplateData([])
},
});
useEffect(() => {
getTemplateInfo({
projectId: currentProjectStore.currentProjectInfo.id as string,
});
}, [currentProjectStore.currentProjectInfo.id, getTemplateInfo]);
/** 点击添加工作流模版 */
const onAddMember = () => {
// setAddMemberDialog(true);
};
/** 删除模板 */
const deleteTemplate = () => {
delTemplate({
projectId: currentProjectStore.currentProjectInfo.id as string,
workflowSpecId: templateId,
})
};
/** 打开弹窗 */
const startDialog = (id: string) => {
setTemplateId(id)
setOpenDialog(true);
};
/** 关闭弹窗 */
const closeDialog = () => {
setOpenDialog(false);
};
/** 增加模板 */
const addTemplateBlock = () => {
getAddTemplateList({
projectId: currentProjectStore.currentProjectInfo.id as string,
productId: 'cadd',
})
};
/** 关闭增加模板 */
const closeAddTemplateBlock = () => {
setOpenAddTemplate(false);
setSelectTemplateData([])
};
/** 增加模板操作 */
const addTemplateCallback = () => {
addTemplate({
projectId: currentProjectStore.currentProjectInfo.id as string,
workflowSpecIds: selectTemplateData
})
}
/** 搜索模板 */
const searchTemplateNameCallback = (data: any) => {
getAddTemplateList({
projectId: currentProjectStore.currentProjectInfo.id as string,
productId: 'cadd',
title: data
})
}
const templateSelectCallback = (data: string) => {
let list: string[] = [...selectTemplateData]
if (selectTemplateData.filter(e => e === data).length > 0) {
list = list.filter(e => e !== data)
setSelectTemplateData(list)
} else {
list.push(data)
setSelectTemplateData(list)
}
}
useEffect(() => {
getTemplateInfo({
projectId: currentProjectStore.currentProjectInfo.id as string,
title: templateName
});
}, [templateName]);
return (
<Box className={styles.headerBox}>
<Box className={styles.tabBox} >
<OutlinedInput
onChange={(e: any) => {
_.debounce(() => {
setTemplateName(e.target.value);
}, 200)();
}}
placeholder="输入关键词搜索"
size="small"
sx={{ width: 340, height: 32 }}
endAdornment={<SearchIcon style={{ color: "#8A9099" }} />}
/>
{
templateList.length > 0 && isPass("PROJECT_WORKBENCH_FLOES_ADD", 'MANAGER') && <Button
style={{ backgroundColor: "#1370FF " }}
variant="contained"
onClick={addTemplateBlock}
startIcon={<Add />}
size="small"
>
添加工作流模版
</Button>
}
</Box>
{
templateList.length === 0 && !isPass("PROJECT_WORKBENCH_FLOES_ADD", 'MANAGER') &&
<Box sx={{
display: 'flex', alignItems: 'center', flexDirection: 'column', minHeight: 'calc(100vh - 376px)',
justifyContent: 'center'
}}>
<img alt="" src={noData} />
<Typography sx={{ fontSize: '12px', fontWeight: '400', color: '#8A9099' }}>暂未开启模版</Typography>
</Box>
}
{
templateList.length > 0 && <Box sx={{ display: "flex", flexWrap: 'wrap', marginLeft: "-8px" }} >
{
templateList && templateList.length > 0 && templateList.map((item, key) => {
return <TemplateBox data={item} startDialog={startDialog} />
})
}
</Box>
}
{
templateList.length === 0 && isPass("PROJECT_WORKBENCH_FLOES_ADD", 'MANAGER') && <Box className={styles.addNewTemplate}
onClick={addTemplateBlock}
>
<Add sx={{ color: "#565C66", fontSize: "20px", width: "30px", height: '30px' }} />
<Typography sx={{ fontSize: '14px', fontWeight: '400', color: '#8A9099', marginTop: "15px" }}>添加工作流模版</Typography>
</Box>
}
<AddTemplate
openAddTemplate={openAddTemplate}
closeAddTemplateBlock={closeAddTemplateBlock}
addTemplateList={addTemplateList}
templateSelectCallback={templateSelectCallback}
selectTemplateData={selectTemplateData}
addTemplateCallback={addTemplateCallback}
searchTemplateNameCallback={searchTemplateNameCallback}
/>
<SimpleDialog
text={'确认移除该模板吗?'}
title={'删除模板'}
openDialog={openDialog}
closeDialog={closeDialog}
onConfirm={deleteTemplate}
/>
</Box>
);
};
export default memo(ProjectMembers);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment