From 003eaaea761a4006fed357d6cda9e6d4a949edef Mon Sep 17 00:00:00 2001 From: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com> Date: Mon, 24 May 2021 11:11:39 -0700 Subject: [PATCH] Group bucket users and policies under access tab. Rename ViewBuckets to BucketDetails (#766) Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com> --- .../Buckets/BucketDetails/AccessDetails.tsx | 161 ++++++++++++++++++ .../AddEvent.tsx | 0 .../AddLifecycleModal.tsx | 0 .../AddReplicationModal.tsx | 0 .../BucketDetails.tsx} | 123 ++----------- .../DeleteEvent.tsx | 0 .../DeleteReplicationRule.tsx | 0 .../EditLifecycleConfiguration.tsx | 0 .../EnableBucketEncryption.tsx | 0 .../EnableVersioningModal.tsx | 0 .../SetAccessPolicy.tsx | 0 .../SetRetentionConfig.tsx | 0 .../src/screens/Console/Buckets/Buckets.tsx | 4 +- .../Console/Policies/PolicyDetails.tsx | 2 +- .../Tenants/TenantDetails/TenantDetails.tsx | 33 ++-- 15 files changed, 201 insertions(+), 122 deletions(-) create mode 100644 portal-ui/src/screens/Console/Buckets/BucketDetails/AccessDetails.tsx rename portal-ui/src/screens/Console/Buckets/{ViewBucket => BucketDetails}/AddEvent.tsx (100%) rename portal-ui/src/screens/Console/Buckets/{ViewBucket => BucketDetails}/AddLifecycleModal.tsx (100%) rename portal-ui/src/screens/Console/Buckets/{ViewBucket => BucketDetails}/AddReplicationModal.tsx (100%) rename portal-ui/src/screens/Console/Buckets/{ViewBucket/ViewBucket.tsx => BucketDetails/BucketDetails.tsx} (90%) rename portal-ui/src/screens/Console/Buckets/{ViewBucket => BucketDetails}/DeleteEvent.tsx (100%) rename portal-ui/src/screens/Console/Buckets/{ViewBucket => BucketDetails}/DeleteReplicationRule.tsx (100%) rename portal-ui/src/screens/Console/Buckets/{ViewBucket => BucketDetails}/EditLifecycleConfiguration.tsx (100%) rename portal-ui/src/screens/Console/Buckets/{ViewBucket => BucketDetails}/EnableBucketEncryption.tsx (100%) rename portal-ui/src/screens/Console/Buckets/{ViewBucket => BucketDetails}/EnableVersioningModal.tsx (100%) rename portal-ui/src/screens/Console/Buckets/{ViewBucket => BucketDetails}/SetAccessPolicy.tsx (100%) rename portal-ui/src/screens/Console/Buckets/{ViewBucket => BucketDetails}/SetRetentionConfig.tsx (100%) diff --git a/portal-ui/src/screens/Console/Buckets/BucketDetails/AccessDetails.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/AccessDetails.tsx new file mode 100644 index 000000000..ecb7f38ab --- /dev/null +++ b/portal-ui/src/screens/Console/Buckets/BucketDetails/AccessDetails.tsx @@ -0,0 +1,161 @@ +// This file is part of MinIO Console Server +// Copyright (c) 2021 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import React, { useEffect, useState } from "react"; +import { connect } from "react-redux"; +import { AppState } from "../../../../store"; +import { setErrorSnackMessage } from "../../../../actions"; +import Tabs from "@material-ui/core/Tabs"; +import Tab from "@material-ui/core/Tab"; +import { Paper } from "@material-ui/core"; +import TableWrapper from "../../Common/TableWrapper/TableWrapper"; +import { TabPanel } from "../../../shared/tabs"; +import { Policy } from "../../Policies/types"; +import { ISessionResponse } from "../../types"; +import { User } from "../../Users/types"; +import api from "../../../../common/api"; +import history from "../../../../history"; +import { createStyles, Theme, withStyles } from "@material-ui/core/styles"; + +const styles = (theme: Theme) => createStyles({}); + +const mapState = (state: AppState) => ({ + session: state.console.session, +}); + +const connector = connect(mapState, { setErrorSnackMessage }); + +function a11yProps(index: any) { + return { + id: `simple-tab-${index}`, + "aria-controls": `simple-tabpanel-${index}`, + }; +} + +interface IAccessDetailsProps { + bucketName: string; + session: ISessionResponse; + setErrorSnackMessage: typeof setErrorSnackMessage; + classes: any; +} + +const AccessDetails = ({ + bucketName, + classes, + setErrorSnackMessage, + session, +}: IAccessDetailsProps) => { + const [curTab, setCurTab] = useState(0); + const [loadingPolicies, setLoadingPolicies] = useState(true); + const [bucketPolicy, setBucketPolicy] = useState([]); + const [loadingUsers, setLoadingUsers] = useState(true); + const [bucketUsers, setBucketUsers] = useState([]); + + const usersEnabled = session.pages?.indexOf("/users") > -1; + + const PolicyActions = [ + { + type: "view", + onClick: (policy: any) => { + history.push(`/policies/${policy.name}`); + }, + }, + ]; + + const userTableActions = [ + { + type: "view", + onClick: (user: any) => { + history.push(`/users/${user}`); + }, + }, + ]; + + useEffect(() => { + if (loadingUsers && usersEnabled) { + api + .invoke("GET", `/api/v1/bucket-users/${bucketName}`) + .then((res: any) => { + setBucketUsers(res); + setLoadingUsers(false); + }) + .catch((err: any) => { + setErrorSnackMessage(err); + setLoadingUsers(false); + }); + } + }, [loadingUsers, setErrorSnackMessage, bucketName, usersEnabled]); + + useEffect(() => { + if (loadingPolicies) { + api + .invoke("GET", `/api/v1/bucket-policy/${bucketName}`) + .then((res: any) => { + setBucketPolicy(res.policies); + setLoadingPolicies(false); + }) + .catch((err: any) => { + setErrorSnackMessage(err); + setLoadingPolicies(false); + }); + } + }, [loadingPolicies, setErrorSnackMessage, bucketName]); + + return ( + + , newValue: number) => { + setCurTab(newValue); + }} + indicatorColor="primary" + textColor="primary" + aria-label="cluster-tabs" + variant="scrollable" + scrollButtons="auto" + > + + {usersEnabled && } + + + + + {usersEnabled && ( + + + + )} + + ); +}; + +export default withStyles(styles)(connector(AccessDetails)); diff --git a/portal-ui/src/screens/Console/Buckets/ViewBucket/AddEvent.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddEvent.tsx similarity index 100% rename from portal-ui/src/screens/Console/Buckets/ViewBucket/AddEvent.tsx rename to portal-ui/src/screens/Console/Buckets/BucketDetails/AddEvent.tsx diff --git a/portal-ui/src/screens/Console/Buckets/ViewBucket/AddLifecycleModal.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx similarity index 100% rename from portal-ui/src/screens/Console/Buckets/ViewBucket/AddLifecycleModal.tsx rename to portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx diff --git a/portal-ui/src/screens/Console/Buckets/ViewBucket/AddReplicationModal.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddReplicationModal.tsx similarity index 100% rename from portal-ui/src/screens/Console/Buckets/ViewBucket/AddReplicationModal.tsx rename to portal-ui/src/screens/Console/Buckets/BucketDetails/AddReplicationModal.tsx diff --git a/portal-ui/src/screens/Console/Buckets/ViewBucket/ViewBucket.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/BucketDetails.tsx similarity index 90% rename from portal-ui/src/screens/Console/Buckets/ViewBucket/ViewBucket.tsx rename to portal-ui/src/screens/Console/Buckets/BucketDetails/BucketDetails.tsx index c53d290e5..093d79fbe 100644 --- a/portal-ui/src/screens/Console/Buckets/ViewBucket/ViewBucket.tsx +++ b/portal-ui/src/screens/Console/Buckets/BucketDetails/BucketDetails.tsx @@ -52,8 +52,6 @@ import { searchField, } from "../../Common/FormComponents/common/styleLibrary"; import { setErrorSnackMessage } from "../../../../actions"; -import { Policy } from "../../Policies/types"; -import { User } from "../../Users/types"; import { AppState } from "../../../../store"; import { ISessionResponse } from "../../types"; import SetAccessPolicy from "./SetAccessPolicy"; @@ -66,13 +64,12 @@ import PageHeader from "../../Common/PageHeader/PageHeader"; import EnableBucketEncryption from "./EnableBucketEncryption"; import EnableVersioningModal from "./EnableVersioningModal"; import UsageIcon from "../../../../icons/UsageIcon"; -import AddPolicy from "../../Policies/AddPolicy"; -import DeleteReplicationRule from "../ViewBucket/DeleteReplicationRule"; +import DeleteReplicationRule from ".//DeleteReplicationRule"; import EditLifecycleConfiguration from "./EditLifecycleConfiguration"; import AddLifecycleModal from "./AddLifecycleModal"; -import history from "../../../../history"; import InputAdornment from "@material-ui/core/InputAdornment"; import SearchIcon from "@material-ui/icons/Search"; +import AccessDetails from "./AccessDetails"; const styles = (theme: Theme) => createStyles({ @@ -178,6 +175,9 @@ const styles = (theme: Theme) => reportedUsage: { padding: "15px", }, + titleCol: { + fontWeight: "bold", + }, ...searchField, ...actionsTray, actionsTray: { @@ -189,7 +189,7 @@ const styles = (theme: Theme) => ...containerForHeader(theme.spacing(4)), }); -interface IViewBucketProps { +interface IBucketDetailsProps { classes: any; match: any; setErrorSnackMessage: typeof setErrorSnackMessage; @@ -226,21 +226,18 @@ function a11yProps(index: any) { }; } -const ViewBucket = ({ +const BucketDetails = ({ classes, match, setErrorSnackMessage, session, -}: IViewBucketProps) => { +}: IBucketDetailsProps) => { const [info, setInfo] = useState(null); const [records, setRecords] = useState([]); const [replicationRules, setReplicationRules] = useState< BucketReplicationRule[] >([]); - const [bucketPolicy, setBucketPolicy] = useState([]); - const [loadingPolicy, setLoadingPolicy] = useState(true); - const [bucketUsers, setBucketUsers] = useState([]); - const [loadingUsers, setLoadingUsers] = useState(true); + const [loadingBucket, setLoadingBucket] = useState(true); const [loadingEvents, setLoadingEvents] = useState(true); const [loadingVersioning, setLoadingVersioning] = useState(true); @@ -252,7 +249,6 @@ const ViewBucket = ({ useState(false); const [curTab, setCurTab] = useState(0); const [addScreenOpen, setAddScreenOpen] = useState(false); - const [policyScreenOpen, setPolicyScreenOpen] = useState(false); const [enableEncryptionScreenOpen, setEnableEncryptionScreenOpen] = useState(false); const [deleteOpen, setDeleteOpen] = useState(false); @@ -267,7 +263,6 @@ const ViewBucket = ({ useState(null); const [retentionConfigOpen, setRetentionConfigOpen] = useState(false); - const [policyEdit, setPolicyEdit] = useState(null); const [enableVersioningOpen, setEnableVersioningOpen] = useState(false); const [loadingPerms, setLoadingPerms] = useState(true); @@ -281,7 +276,6 @@ const ViewBucket = ({ const [addLifecycleOpen, setAddLifecycleOpen] = useState(false); const bucketName = match.params["bucketName"]; - const usersEnabled = session.pages?.indexOf("/users") > -1; // check the permissions for creating bucket useEffect(() => { @@ -403,36 +397,6 @@ const ViewBucket = ({ } }, [loadingReplication, setErrorSnackMessage, bucketName]); - useEffect(() => { - if (loadingPolicy) { - api - .invoke("GET", `/api/v1/bucket-policy/${bucketName}`) - .then((res: any) => { - setBucketPolicy(res.policies); - setLoadingPolicy(false); - }) - .catch((err: any) => { - setErrorSnackMessage(err); - setLoadingPolicy(false); - }); - } - }, [loadingPolicy, setErrorSnackMessage, bucketName]); - - useEffect(() => { - if (loadingUsers && usersEnabled) { - api - .invoke("GET", `/api/v1/bucket-users/${bucketName}`) - .then((res: any) => { - setBucketUsers(res); - setLoadingUsers(false); - }) - .catch((err: any) => { - setErrorSnackMessage(err); - setLoadingUsers(false); - }); - } - }, [loadingUsers, setErrorSnackMessage, bucketName, usersEnabled]); - useEffect(() => { if (loadingSize) { api @@ -522,18 +486,6 @@ const ViewBucket = ({ setLoadingEncryption(true); }; - const closeAddModalAndRefresh = (refresh: boolean) => { - setPolicyScreenOpen(false); - - if (refresh) { - fetchPolicies(); - } - }; - - const fetchPolicies = () => { - setLoadingPolicy(true); - }; - const closeAddEventAndRefresh = () => { setAddScreenOpen(false); loadAllBucketData(); @@ -628,12 +580,7 @@ const ViewBucket = ({ }; const tableActions = [{ type: "delete", onClick: confirmDeleteEvent }]; - const viewAction = (row: any) => { - setPolicyScreenOpen(true); - setPolicyEdit(row); - }; - const PolicyActions = [{ type: "view", onClick: viewAction }]; const replicationTableActions = [ { type: "delete", @@ -700,12 +647,6 @@ const ViewBucket = ({ }, ]; - const userViewAction = (user: any) => { - history.push(`/users/${user}`); - }; - - const userTableActions = [{ type: "view", onClick: userViewAction }]; - return ( {addScreenOpen && ( @@ -732,13 +673,6 @@ const ViewBucket = ({ closeModalAndRefresh={closeSetAccessPolicy} /> )} - {policyScreenOpen && ( - - )} {retentionConfigOpen && ( {canGetReplication && } - - {usersEnabled && } + @@ -827,7 +760,7 @@ const ViewBucket = ({
- + - + - + {!hasObjectLocking ? ( - + ) : ( @@ -915,7 +848,7 @@ const ViewBucket = ({
Access Policy:Access Policy: Encryption:Encryption: {loadingEncryption ? (
Replication:Replication: {replicationRules.length ? "Enabled" : "Disabled"} @@ -877,7 +810,7 @@ const ViewBucket = ({ Object Locking:Object Locking: Disabled
- + + - + - + - + - + - + - + {tenant?.endpoints && ( - + - + - +
Versioning:Versioning: {loadingVersioning ? (
- Retention:Retention: {loadingVersioning ? (
- +
- {usersEnabled && ( - -
- -
- )} @@ -1191,4 +1104,4 @@ const connector = connect(mapState, { setErrorSnackMessage, }); -export default withStyles(styles)(connector(ViewBucket)); +export default withStyles(styles)(connector(BucketDetails)); diff --git a/portal-ui/src/screens/Console/Buckets/ViewBucket/DeleteEvent.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/DeleteEvent.tsx similarity index 100% rename from portal-ui/src/screens/Console/Buckets/ViewBucket/DeleteEvent.tsx rename to portal-ui/src/screens/Console/Buckets/BucketDetails/DeleteEvent.tsx diff --git a/portal-ui/src/screens/Console/Buckets/ViewBucket/DeleteReplicationRule.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/DeleteReplicationRule.tsx similarity index 100% rename from portal-ui/src/screens/Console/Buckets/ViewBucket/DeleteReplicationRule.tsx rename to portal-ui/src/screens/Console/Buckets/BucketDetails/DeleteReplicationRule.tsx diff --git a/portal-ui/src/screens/Console/Buckets/ViewBucket/EditLifecycleConfiguration.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/EditLifecycleConfiguration.tsx similarity index 100% rename from portal-ui/src/screens/Console/Buckets/ViewBucket/EditLifecycleConfiguration.tsx rename to portal-ui/src/screens/Console/Buckets/BucketDetails/EditLifecycleConfiguration.tsx diff --git a/portal-ui/src/screens/Console/Buckets/ViewBucket/EnableBucketEncryption.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/EnableBucketEncryption.tsx similarity index 100% rename from portal-ui/src/screens/Console/Buckets/ViewBucket/EnableBucketEncryption.tsx rename to portal-ui/src/screens/Console/Buckets/BucketDetails/EnableBucketEncryption.tsx diff --git a/portal-ui/src/screens/Console/Buckets/ViewBucket/EnableVersioningModal.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/EnableVersioningModal.tsx similarity index 100% rename from portal-ui/src/screens/Console/Buckets/ViewBucket/EnableVersioningModal.tsx rename to portal-ui/src/screens/Console/Buckets/BucketDetails/EnableVersioningModal.tsx diff --git a/portal-ui/src/screens/Console/Buckets/ViewBucket/SetAccessPolicy.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/SetAccessPolicy.tsx similarity index 100% rename from portal-ui/src/screens/Console/Buckets/ViewBucket/SetAccessPolicy.tsx rename to portal-ui/src/screens/Console/Buckets/BucketDetails/SetAccessPolicy.tsx diff --git a/portal-ui/src/screens/Console/Buckets/ViewBucket/SetRetentionConfig.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/SetRetentionConfig.tsx similarity index 100% rename from portal-ui/src/screens/Console/Buckets/ViewBucket/SetRetentionConfig.tsx rename to portal-ui/src/screens/Console/Buckets/BucketDetails/SetRetentionConfig.tsx diff --git a/portal-ui/src/screens/Console/Buckets/Buckets.tsx b/portal-ui/src/screens/Console/Buckets/Buckets.tsx index 47e5a7f30..b4f82cb80 100644 --- a/portal-ui/src/screens/Console/Buckets/Buckets.tsx +++ b/portal-ui/src/screens/Console/Buckets/Buckets.tsx @@ -22,7 +22,7 @@ import { AppState } from "../../../store"; import { setMenuOpen } from "../../../actions"; import NotFoundPage from "../../NotFoundPage"; import ListBuckets from "./ListBuckets/ListBuckets"; -import ViewBucket from "./ViewBucket/ViewBucket"; +import BucketDetails from "./BucketDetails/BucketDetails"; const mapState = (state: AppState) => ({ open: state.system.sidebarOpen, @@ -34,7 +34,7 @@ const Buckets = () => { return ( - + diff --git a/portal-ui/src/screens/Console/Policies/PolicyDetails.tsx b/portal-ui/src/screens/Console/Policies/PolicyDetails.tsx index f13428e31..033464d89 100644 --- a/portal-ui/src/screens/Console/Policies/PolicyDetails.tsx +++ b/portal-ui/src/screens/Console/Policies/PolicyDetails.tsx @@ -323,7 +323,7 @@ const PolicyDetails = ({ columns={[{ label: "Name", elementKey: "name" }]} isLoading={false} records={userList} - entityName="Servers" + entityName="Users" idField="name" /> )} diff --git a/portal-ui/src/screens/Console/Tenants/TenantDetails/TenantDetails.tsx b/portal-ui/src/screens/Console/Tenants/TenantDetails/TenantDetails.tsx index 977fa9ca5..afe6c1da3 100644 --- a/portal-ui/src/screens/Console/Tenants/TenantDetails/TenantDetails.tsx +++ b/portal-ui/src/screens/Console/Tenants/TenantDetails/TenantDetails.tsx @@ -126,6 +126,9 @@ const styles = (theme: Theme) => poolLabel: { color: "#666666", }, + titleCol: { + fontWeight: "bold", + }, breadcrumLink: { textDecoration: "none", color: "black", @@ -445,9 +448,9 @@ const TenantDetails = ({
Capacity:Capacity: {niceBytes(capacity.toString(10))}MinIO:MinIO:
Clusters:Clusters: {poolCount}Console:Console:
Instances:Instances: {instances}Volumes:Volumes: {volumes}
Endpoint:Endpoint: Console:Console: )}
State:State: {tenant?.currentState}
@@ -537,7 +540,7 @@ const TenantDetails = ({ - Logs: + Logs: