Skip to content

Commit

Permalink
Allow to assign multiple policies to to a user or group (#646)
Browse files Browse the repository at this point in the history
* Allow to assign multiple policies to to a user or group

* Latest assets
  • Loading branch information
dvaldivia committed Mar 22, 2021
1 parent 897b5b8 commit 2a704d3
Show file tree
Hide file tree
Showing 11 changed files with 44 additions and 29 deletions.
14 changes: 7 additions & 7 deletions portal-ui/build/asset-manifest.json
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
{
"files": {
"main.css": "/static/css/main.a19f3d53.chunk.css",
"main.js": "/static/js/main.5dcc63ee.chunk.js",
"main.js.map": "/static/js/main.5dcc63ee.chunk.js.map",
"main.js": "/static/js/main.b266fca9.chunk.js",
"main.js.map": "/static/js/main.b266fca9.chunk.js.map",
"runtime-main.js": "/static/js/runtime-main.f48e99e5.js",
"runtime-main.js.map": "/static/js/runtime-main.f48e99e5.js.map",
"static/css/2.76b14b73.chunk.css": "/static/css/2.76b14b73.chunk.css",
"static/js/2.1da96d0d.chunk.js": "/static/js/2.1da96d0d.chunk.js",
"static/js/2.1da96d0d.chunk.js.map": "/static/js/2.1da96d0d.chunk.js.map",
"static/js/2.33fe03f5.chunk.js": "/static/js/2.33fe03f5.chunk.js",
"static/js/2.33fe03f5.chunk.js.map": "/static/js/2.33fe03f5.chunk.js.map",
"index.html": "/index.html",
"static/css/2.76b14b73.chunk.css.map": "/static/css/2.76b14b73.chunk.css.map",
"static/css/main.a19f3d53.chunk.css.map": "/static/css/main.a19f3d53.chunk.css.map",
"static/js/2.1da96d0d.chunk.js.LICENSE.txt": "/static/js/2.1da96d0d.chunk.js.LICENSE.txt",
"static/js/2.33fe03f5.chunk.js.LICENSE.txt": "/static/js/2.33fe03f5.chunk.js.LICENSE.txt",
"static/media/minio_console_logo.0837460e.svg": "/static/media/minio_console_logo.0837460e.svg",
"static/media/minio_operator_logo.1312b7c9.svg": "/static/media/minio_operator_logo.1312b7c9.svg"
},
"entrypoints": [
"static/js/runtime-main.f48e99e5.js",
"static/css/2.76b14b73.chunk.css",
"static/js/2.1da96d0d.chunk.js",
"static/js/2.33fe03f5.chunk.js",
"static/css/main.a19f3d53.chunk.css",
"static/js/main.5dcc63ee.chunk.js"
"static/js/main.b266fca9.chunk.js"
]
}
2 changes: 1 addition & 1 deletion portal-ui/build/index.html
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="MinIO Console"/><link href="https://fonts.googleapis.com/css2?family=Lato:wght@400;500;700;900&display=swap" rel="stylesheet"/><link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"/><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"/><link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"/><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"/><link rel="manifest" href="/manifest.json"/><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#3a4e54"/><title>MinIO Console</title><link href="/static/css/2.76b14b73.chunk.css" rel="stylesheet"><link href="/static/css/main.a19f3d53.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,l,i=r[0],a=r[1],p=r[2],c=0,s=[];c<i.length;c++)l=i[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n]);for(f&&f(r);s.length;)s.shift()();return u.push.apply(u,p||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var a=t[i];0!==o[a]&&(n=!1)}n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={1:0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,function(r){return e[r]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/";var i=this["webpackJsonpportal-ui"]=this["webpackJsonpportal-ui"]||[],a=i.push.bind(i);i.push=r,i=i.slice();for(var p=0;p<i.length;p++)r(i[p]);var f=a;t()}([])</script><script src="/static/js/2.1da96d0d.chunk.js"></script><script src="/static/js/main.5dcc63ee.chunk.js"></script></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="MinIO Console"/><link href="https://fonts.googleapis.com/css2?family=Lato:wght@400;500;700;900&display=swap" rel="stylesheet"/><link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"/><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"/><link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png"/><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"/><link rel="manifest" href="/manifest.json"/><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#3a4e54"/><title>MinIO Console</title><link href="/static/css/2.76b14b73.chunk.css" rel="stylesheet"><link href="/static/css/main.a19f3d53.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,l,i=r[0],a=r[1],p=r[2],c=0,s=[];c<i.length;c++)l=i[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n]);for(f&&f(r);s.length;)s.shift()();return u.push.apply(u,p||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var a=t[i];0!==o[a]&&(n=!1)}n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={1:0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,function(r){return e[r]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/";var i=this["webpackJsonpportal-ui"]=this["webpackJsonpportal-ui"]||[],a=i.push.bind(i);i.push=r,i=i.slice();for(var p=0;p<i.length;p++)r(i[p]);var f=a;t()}([])</script><script src="/static/js/2.33fe03f5.chunk.js"></script><script src="/static/js/main.b266fca9.chunk.js"></script></body></html>

Large diffs are not rendered by default.

Large diffs are not rendered by default.

2 changes: 0 additions & 2 deletions portal-ui/build/static/js/main.5dcc63ee.chunk.js

This file was deleted.

1 change: 0 additions & 1 deletion portal-ui/build/static/js/main.5dcc63ee.chunk.js.map

This file was deleted.

2 changes: 2 additions & 0 deletions portal-ui/build/static/js/main.b266fca9.chunk.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions portal-ui/build/static/js/main.b266fca9.chunk.js.map

Large diffs are not rendered by default.

24 changes: 18 additions & 6 deletions portal-ui/src/screens/Console/Policies/PolicySelectors.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import TableWrapper from "../Common/TableWrapper/TableWrapper";

interface ISelectPolicyProps {
classes: any;
selectedPolicy?: string;
selectedPolicy?: string[];
setSelectedPolicy: any;
setModalErrorSnackMessage: typeof setModalErrorSnackMessage;
}
Expand Down Expand Up @@ -108,7 +108,7 @@ const styles = (theme: Theme) =>

const PolicySelectors = ({
classes,
selectedPolicy = "",
selectedPolicy = [],
setSelectedPolicy,
setModalErrorSnackMessage,
}: ISelectPolicyProps) => {
Expand Down Expand Up @@ -147,8 +147,21 @@ const PolicySelectors = ({
const selectionChanged = (e: React.ChangeEvent<HTMLInputElement>) => {
const targetD = e.target;
const value = targetD.value;
const checked = targetD.checked;

setSelectedPolicy(value);
let elements: string[] = [...selectedPolicy]; // We clone the checkedUsers array

if (checked) {
// If the user has checked this field we need to push this to checkedUsersList
elements.push(value);
} else {
// User has unchecked this field, we need to remove it from the list
elements = elements.filter((element) => element !== value);
}
// remove empty values
elements = elements.filter((element) => element !== "");

setSelectedPolicy(elements);
};

const filteredRecords = records.filter((elementItem) =>
Expand All @@ -160,7 +173,7 @@ const PolicySelectors = ({
<Grid item xs={12}>
<Paper className={classes.paper}>
{loading && <LinearProgress />}
{records != null && records.length > 0 ? (
{records.length > 0 ? (
<React.Fragment>
<Grid item xs={12} className={classes.actionsTray}>
<span className={classes.actionsTitle}>Assign Policies</span>
Expand All @@ -185,13 +198,12 @@ const PolicySelectors = ({
<TableWrapper
columns={[{ label: "Policy", elementKey: "name" }]}
onSelect={selectionChanged}
selectedItems={[selectedPolicy]}
selectedItems={selectedPolicy}
isLoading={loading}
records={filteredRecords}
entityName="Policies"
idField="name"
customPaperHeight={classes.multiSelectTable}
radioSelection
/>
</Grid>
</React.Fragment>
Expand Down
21 changes: 12 additions & 9 deletions portal-ui/src/screens/Console/Policies/SetPolicy.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ const SetPolicy = ({
}: ISetPolicyProps) => {
//Local States
const [loading, setLoading] = useState<boolean>(false);
const [actualPolicy, setActualPolicy] = useState<string>("");
const [selectedPolicy, setSelectedPolicy] = useState<string>("");
const [actualPolicy, setActualPolicy] = useState<string[]>([]);
const [selectedPolicy, setSelectedPolicy] = useState<string[]>([]);

const setPolicyAction = () => {
let entity = "user";
Expand Down Expand Up @@ -92,9 +92,9 @@ const SetPolicy = ({
api
.invoke("GET", `/api/v1/groups/${selectedGroup}`)
.then((res: any) => {
const groupPolicy = get(res, "policy", "");
setActualPolicy(groupPolicy);
setSelectedPolicy(groupPolicy);
const groupPolicy: String = get(res, "policy", "");
setActualPolicy(groupPolicy.split(","));
setSelectedPolicy(groupPolicy.split(","));
})
.catch((err) => {
setModalErrorSnackMessage(err);
Expand All @@ -114,9 +114,9 @@ const SetPolicy = ({
return;
}

const userPolicy = get(selectedUser, "policy", "");
setActualPolicy(userPolicy);
setSelectedPolicy(userPolicy);
const userPolicy: String = get(selectedUser, "policy", "");
setActualPolicy(userPolicy.split(","));
setSelectedPolicy(userPolicy.split(","));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [open, selectedGroup, selectedUser]);
Expand All @@ -138,7 +138,10 @@ const SetPolicy = ({
/>
</Grid>
<Grid item xs={12}>
<PredefinedList label={"Current Policy"} content={actualPolicy} />
<PredefinedList
label={"Current Policy"}
content={actualPolicy.join(", ")}
/>
</Grid>
<PolicySelectors
selectedPolicy={selectedPolicy}
Expand Down

0 comments on commit 2a704d3

Please sign in to comment.