From 2e6a4ee3f1d86c2089a99dfde7d6737f8394650d Mon Sep 17 00:00:00 2001
From: frans
Date: Thu, 25 May 2023 13:51:59 +0200
Subject: [PATCH 1/4] make users and roles in the PermissionsDialog clickable
and open in a new tab
---
.../PermissionsDialog.react.js | 22 ++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/src/components/PermissionsDialog/PermissionsDialog.react.js b/src/components/PermissionsDialog/PermissionsDialog.react.js
index b4d749494f..249a94f5c2 100644
--- a/src/components/PermissionsDialog/PermissionsDialog.react.js
+++ b/src/components/PermissionsDialog/PermissionsDialog.react.js
@@ -971,7 +971,21 @@ export default class PermissionsDialog extends React.Component {
return output;
}
+ urlForKey(key) {
+ let isRole = key.startsWith('role:')
+ let className = isRole ? '_Role' : '_User';
+ let field = isRole ? 'name' : 'objectId';
+ let value = isRole ? key.replace('role:', '') : key
+ let filters = JSON.stringify([{
+ field,
+ constraint: 'eq',
+ compareTo: value
+ }]);
+ return window.location.href.split('browser/')[0] + `browser/${className}?filters=${encodeURIComponent(filters)}`;
+ }
+
renderRow(key, columns, types) {
+
const pill = text => (
@@ -982,14 +996,16 @@ export default class PermissionsDialog extends React.Component {
const type = (types && types.get(key)) || {};
let pointer = this.state.pointerPerms.has(key);
- let label = {key};
+ let label = {key};
if (type.user) {
label = (
- {type.user.id}
+
+ {type.user.id}
+
{pill('User')}
@@ -1005,7 +1021,7 @@ export default class PermissionsDialog extends React.Component {
{'role:'}
- {type.role.name}
+ {type.role.name}
From 96a2dbb18bd8b3c95da8ac89da412b4352b75de6 Mon Sep 17 00:00:00 2001
From: frans
Date: Fri, 26 May 2023 11:37:42 +0200
Subject: [PATCH 2/4] identify and mark invalid users and roles in
PermissionsDialog
---
src/components/ACLEditor/ACLEditor.react.js | 11 ++++++++++-
.../PermissionsDialog.react.js | 19 +++++++++++++------
2 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/src/components/ACLEditor/ACLEditor.react.js b/src/components/ACLEditor/ACLEditor.react.js
index a1f46dc328..ff58f22b0e 100644
--- a/src/components/ACLEditor/ACLEditor.react.js
+++ b/src/components/ACLEditor/ACLEditor.react.js
@@ -9,8 +9,10 @@ import Parse from 'parse';
import PermissionsDialog from 'components/PermissionsDialog/PermissionsDialog.react';
import React from 'react';
-function validateEntry(text) {
+function validateEntry(text, returnInvalid = true) {
+ let type = 'unknown';
+ let entry = text;
let userQuery;
let roleQuery;
@@ -19,22 +21,26 @@ function validateEntry(text) {
}
if (text.startsWith('user:')) {
+ type = 'user';
// no need to query roles
roleQuery = {
find: () => Promise.resolve([])
};
let user = text.substring(5);
+ entry = user;
userQuery = new Parse.Query.or(
new Parse.Query(Parse.User).equalTo('username', user),
new Parse.Query(Parse.User).equalTo('objectId', user)
);
} else if (text.startsWith('role:')) {
+ type = 'role';
// no need to query users
userQuery = {
find: () => Promise.resolve([])
};
let role = text.substring(5);
+ entry = role;
roleQuery = new Parse.Query.or(
new Parse.Query(Parse.Role).equalTo('name', role),
new Parse.Query(Parse.Role).equalTo('objectId', role)
@@ -61,6 +67,9 @@ function validateEntry(text) {
} else if (role.length > 0) {
return { entry: role[0], type: 'role' };
} else {
+ if(returnInvalid) {
+ return Promise.resolve({entry, type})
+ }
return Promise.reject();
}
});
diff --git a/src/components/PermissionsDialog/PermissionsDialog.react.js b/src/components/PermissionsDialog/PermissionsDialog.react.js
index 249a94f5c2..45a28c719a 100644
--- a/src/components/PermissionsDialog/PermissionsDialog.react.js
+++ b/src/components/PermissionsDialog/PermissionsDialog.react.js
@@ -647,7 +647,15 @@ export default class PermissionsDialog extends React.Component {
let key;
let value = {};
- if (type === 'user') {
+ if(typeof entry === 'string') {
+ key = type + ':' + entry;
+ value[type] = {
+ name: entry,
+ id: undefined
+ };
+ }
+
+ else if (type === 'user') {
key = entry.id;
value[type] = {
name: entry.get('username'),
@@ -655,7 +663,7 @@ export default class PermissionsDialog extends React.Component {
};
}
- if (type === 'role') {
+ else if (type === 'role') {
key = 'role:' + entry.getName();
value[type] = {
name: entry.getName(),
@@ -663,7 +671,7 @@ export default class PermissionsDialog extends React.Component {
};
}
- if (type === 'pointer') {
+ else if (type === 'pointer') {
key = entry;
value[type] = true;
}
@@ -1010,8 +1018,7 @@ export default class PermissionsDialog extends React.Component {
- {'username: '}
- {type.user.name}
+ username: {type.user.name ?? 'USER NOT FOUND'}
);
@@ -1025,7 +1032,7 @@ export default class PermissionsDialog extends React.Component {
- id: {type.role.id}
+ id: {type.role.id ?? 'ROLE NOT FOUND'}
);
From e7689742060ace6bc443d89676918aaf11bf7c90 Mon Sep 17 00:00:00 2001
From: frans
Date: Sat, 27 May 2023 01:55:07 +0200
Subject: [PATCH 3/4] use generatePath(this.context, ...) for composing urls in
the PermissionsDialog
---
src/components/PermissionsDialog/PermissionsDialog.react.js | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/components/PermissionsDialog/PermissionsDialog.react.js b/src/components/PermissionsDialog/PermissionsDialog.react.js
index 45a28c719a..8780ce2029 100644
--- a/src/components/PermissionsDialog/PermissionsDialog.react.js
+++ b/src/components/PermissionsDialog/PermissionsDialog.react.js
@@ -20,6 +20,8 @@ import Toggle from 'components/Toggle/Toggle.react';
import Autocomplete from 'components/Autocomplete/Autocomplete.react';
import { Map, fromJS } from 'immutable';
import TrackVisibility from 'components/TrackVisibility/TrackVisibility.react';
+import {CurrentApp} from '../../context/currentApp';
+import generatePath from '../../lib/generatePath';
let origin = new Position(0, 0);
@@ -517,6 +519,8 @@ function renderPointerCheckboxes(
const intersectionMargin = '10px 0px 0px 20px';
export default class PermissionsDialog extends React.Component {
+ static contextType = CurrentApp;
+
constructor(props) {
super(props);
@@ -989,7 +993,7 @@ export default class PermissionsDialog extends React.Component {
constraint: 'eq',
compareTo: value
}]);
- return window.location.href.split('browser/')[0] + `browser/${className}?filters=${encodeURIComponent(filters)}`;
+ return generatePath(this.context, `browser/${className}?filters=${encodeURIComponent(filters)}`);
}
renderRow(key, columns, types) {
From e827b66be15b1472811d3b6fd3af191a8b5c143b Mon Sep 17 00:00:00 2001
From: Manuel <5673677+mtrezza@users.noreply.github.com>
Date: Sat, 27 May 2023 02:05:54 +0200
Subject: [PATCH 4/4] restyle
Signed-off-by: Manuel <5673677+mtrezza@users.noreply.github.com>
---
src/components/PermissionsDialog/PermissionsDialog.react.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/components/PermissionsDialog/PermissionsDialog.react.js b/src/components/PermissionsDialog/PermissionsDialog.react.js
index 8780ce2029..8ae4241d19 100644
--- a/src/components/PermissionsDialog/PermissionsDialog.react.js
+++ b/src/components/PermissionsDialog/PermissionsDialog.react.js
@@ -1022,7 +1022,7 @@ export default class PermissionsDialog extends React.Component {
- username: {type.user.name ?? 'USER NOT FOUND'}
+ username: {type.user.name ?? 'user not found'}
);
@@ -1036,7 +1036,7 @@ export default class PermissionsDialog extends React.Component {
- id: {type.role.id ?? 'ROLE NOT FOUND'}
+ id: {type.role.id ?? 'role not found'}
);