From d0ea82c675b8a7d8f1c919bd0e85337262aad801 Mon Sep 17 00:00:00 2001 From: Benjamin Perez Date: Wed, 24 Aug 2022 19:09:31 -0500 Subject: [PATCH] Improved policy create policy screen Signed-off-by: Benjamin Perez --- .../Buckets/BucketDetails/SetAccessPolicy.tsx | 5 ++-- .../CodeMirrorWrapper/CodeMirrorWrapper.tsx | 17 +++++++++++--- .../Console/Policies/AddPolicyScreen.tsx | 8 +++++-- .../src/screens/Console/Policies/utils.ts | 23 +++++++++++++++++++ portal-ui/tests/permissions-1/iamPolicies.ts | 2 ++ 5 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 portal-ui/src/screens/Console/Policies/utils.ts diff --git a/portal-ui/src/screens/Console/Buckets/BucketDetails/SetAccessPolicy.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/SetAccessPolicy.tsx index 62b90231ea..b2877306c4 100644 --- a/portal-ui/src/screens/Console/Buckets/BucketDetails/SetAccessPolicy.tsx +++ b/portal-ui/src/screens/Console/Buckets/BucketDetails/SetAccessPolicy.tsx @@ -35,6 +35,7 @@ import CodeMirrorWrapper from "../../Common/FormComponents/CodeMirrorWrapper/Cod import { setModalErrorSnackMessage } from "../../../../systemSlice"; import { useAppDispatch } from "../../../../store"; +import { emptyPolicy } from "../../Policies/utils"; const styles = (theme: Theme) => createStyles({ @@ -76,7 +77,7 @@ const SetAccessPolicy = ({ const dispatch = useAppDispatch(); const [addLoading, setAddLoading] = useState(false); const [accessPolicy, setAccessPolicy] = useState(""); - const [policyDefinition, setPolicyDefinition] = useState(""); + const [policyDefinition, setPolicyDefinition] = useState(emptyPolicy); const addRecord = (event: React.FormEvent) => { event.preventDefault(); if (addLoading) { @@ -103,7 +104,7 @@ const SetAccessPolicy = ({ setPolicyDefinition( actualDefinition ? JSON.stringify(JSON.parse(actualDefinition), null, 4) - : "" + : emptyPolicy ); }, [setAccessPolicy, actualPolicy, setPolicyDefinition, actualDefinition]); diff --git a/portal-ui/src/screens/Console/Common/FormComponents/CodeMirrorWrapper/CodeMirrorWrapper.tsx b/portal-ui/src/screens/Console/Common/FormComponents/CodeMirrorWrapper/CodeMirrorWrapper.tsx index cc11210807..969e9046ad 100644 --- a/portal-ui/src/screens/Console/Common/FormComponents/CodeMirrorWrapper/CodeMirrorWrapper.tsx +++ b/portal-ui/src/screens/Console/Common/FormComponents/CodeMirrorWrapper/CodeMirrorWrapper.tsx @@ -56,7 +56,7 @@ const CodeMirrorWrapper = ({ }: ICodeWrapper) => { return ( - + {label} {tooltip !== "" && ( @@ -71,7 +71,15 @@ const CodeMirrorWrapper = ({ - + @@ -92,8 +102,9 @@ const CodeMirrorWrapper = ({ item xs={12} sx={{ - borderTop: "1px solid #eaeaea", background: "#f7f7f7", + border: "1px solid #eaeaea", + borderTop: 0, }} > { const dispatch = useAppDispatch(); @@ -38,7 +39,7 @@ const AddPolicyScreen = () => { const [addLoading, setAddLoading] = useState(false); const [policyName, setPolicyName] = useState(""); - const [policyDefinition, setPolicyDefinition] = useState(""); + const [policyDefinition, setPolicyDefinition] = useState(emptyPolicy); const addRecord = (event: React.FormEvent) => { event.preventDefault(); @@ -72,7 +73,10 @@ const AddPolicyScreen = () => { } else return ""; }; - const validSave = policyName.trim() !== "" && policyName.indexOf(" ") === -1; + const validSave = + policyName.trim() !== "" && + policyName.indexOf(" ") === -1 && + policyDefinition.trim() !== ""; return ( diff --git a/portal-ui/src/screens/Console/Policies/utils.ts b/portal-ui/src/screens/Console/Policies/utils.ts new file mode 100644 index 0000000000..fd5335cae8 --- /dev/null +++ b/portal-ui/src/screens/Console/Policies/utils.ts @@ -0,0 +1,23 @@ +// This file is part of MinIO Console Server +// Copyright (c) 2022 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 . + +export const emptyPolicy = + "{\n" + + ' "Version": "2012-10-17",\n' + + ' "Statement": [\n' + + " \n" + + " ]\n" + + "}"; diff --git a/portal-ui/tests/permissions-1/iamPolicies.ts b/portal-ui/tests/permissions-1/iamPolicies.ts index ac2ad32eba..78fdeb1b47 100644 --- a/portal-ui/tests/permissions-1/iamPolicies.ts +++ b/portal-ui/tests/permissions-1/iamPolicies.ts @@ -79,6 +79,7 @@ test("Create Policy modal can be submitted after inputs are entered", async (t) .typeText(elements.createPolicyName, constants.TEST_IAM_POLICY_NAME) .typeText(elements.createPolicyTextfield, constants.TEST_IAM_POLICY, { paste: true, + replace: true, }) .click(elements.saveButton); }).after(async (t) => { @@ -98,6 +99,7 @@ test("Created Policy can be viewed and deleted", async (t) => { .typeText(elements.createPolicyName, constants.TEST_IAM_POLICY_NAME) .typeText(elements.createPolicyTextfield, constants.TEST_IAM_POLICY, { paste: true, + replace: true, }) .click(elements.saveButton) .typeText(elements.searchResourceInput, constants.TEST_IAM_POLICY_NAME)