aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorusodhi <61431818+usodhi@users.noreply.github.com>2020-06-26 19:40:03 +0530
committerusodhi <61431818+usodhi@users.noreply.github.com>2020-06-26 19:40:03 +0530
commitdb3ed8fc7acbc1722160992b66fd6b3664c64007 (patch)
tree8e1885288da84139afe108f124bee2c6a3f594a7
parent76906b719bcd1b605910003ec23412da81b17ad1 (diff)
convoluted permissions stuff + SharingManager ui changes
-rw-r--r--src/client/util/GroupManager.tsx3
-rw-r--r--src/client/util/SharingManager.scss15
-rw-r--r--src/client/util/SharingManager.tsx74
3 files changed, 54 insertions, 38 deletions
diff --git a/src/client/util/GroupManager.tsx b/src/client/util/GroupManager.tsx
index fa8da86c1..aaba84202 100644
--- a/src/client/util/GroupManager.tsx
+++ b/src/client/util/GroupManager.tsx
@@ -7,7 +7,7 @@ import { Doc, DocListCast, Opt } from "../../fields/Doc";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import * as fa from '@fortawesome/free-solid-svg-icons';
import { library } from "@fortawesome/fontawesome-svg-core";
-import { User } from "./SharingManager";
+import SharingManager, { User } from "./SharingManager";
import { Utils } from "../../Utils";
import * as RequestPromise from "request-promise";
import Select from 'react-select';
@@ -172,6 +172,7 @@ export default class GroupManager extends React.Component<{}> {
if (group) {
if (this.GroupManagerDoc && this.hasEditAccess(group)) {
Doc.RemoveDocFromList(this.GroupManagerDoc, "data", group);
+ SharingManager.Instance.setInternalGroupSharing(group, "Not Shared");
if (group === this.currentGroup) {
runInAction(() => this.currentGroup = undefined);
}
diff --git a/src/client/util/SharingManager.scss b/src/client/util/SharingManager.scss
index 1aff345a0..7b7412ec7 100644
--- a/src/client/util/SharingManager.scss
+++ b/src/client/util/SharingManager.scss
@@ -23,9 +23,8 @@
border: 1px solid black;
padding-left: 10px;
padding-right: 10px;
- // max-height: 200px;
- overflow: scroll;
- height: -webkit-fill-available;
+ overflow-y: scroll;
+ overflow-x: hidden;
text-align: left;
display: flex;
align-content: center;
@@ -33,9 +32,8 @@
text-align: center;
justify-content: center;
color: red;
-
- // width: 50%;
- max-height: 150px;
+ height: 150px;
+ margin: 0 2;
}
}
}
@@ -45,7 +43,6 @@
}
p {
- // font-size: 20px;
font-size: 15px;
text-align: left;
font-style: italic;
@@ -92,12 +89,12 @@
max-width: 700px;
text-align: left;
font-style: normal;
- font-size: 15;
+ font-size: 14;
font-weight: normal;
padding: 0;
.padding {
- padding: 0 0 0 20px;
+ padding: 0 0 0 10px;
color: black;
}
diff --git a/src/client/util/SharingManager.tsx b/src/client/util/SharingManager.tsx
index 3d796539c..521e5366c 100644
--- a/src/client/util/SharingManager.tsx
+++ b/src/client/util/SharingManager.tsx
@@ -40,11 +40,17 @@ const ColorMapping = new Map<string, string>([
[SharingPermissions.Edit, "green"]
]);
-const HierarchyMapping = new Map<string, number>([
- [SharingPermissions.None, 0],
- [SharingPermissions.View, 1],
- [SharingPermissions.Add, 2],
- [SharingPermissions.Edit, 3]
+const HierarchyMapping = new Map<string, string>([
+ [SharingPermissions.None, "0"],
+ [SharingPermissions.View, "1"],
+ [SharingPermissions.Add, "2"],
+ [SharingPermissions.Edit, "3"],
+
+ ["0", SharingPermissions.None],
+ ["1", SharingPermissions.View],
+ ["2", SharingPermissions.Add],
+ ["3", SharingPermissions.Edit]
+
]);
const SharingKey = "sharingPermissions";
@@ -138,39 +144,51 @@ export default class SharingManager extends React.Component<{}> {
const sharingDoc = this.sharingDoc!;
if (permission === SharingPermissions.None) {
- const metadata = sharingDoc[group[Id]];
- if (metadata) sharingDoc[group[Id]] = undefined;
+ const metadata = sharingDoc[StrCast(group.groupName)];
+ if (metadata) sharingDoc[StrCast(group.groupName)] = undefined;
}
else {
- sharingDoc[group[Id]] = permission;
+ sharingDoc[StrCast(group.groupName)] = permission;
}
users.forEach(user => {
- this.setInternalSharing(user, permission);
+ this.setInternalSharing(user, permission, group);
});
}
- setInternalSharing = async (recipient: ValidatedUser, state: string) => {
+ setInternalSharing = async (recipient: ValidatedUser, state: string, group: Opt<Doc>) => {
const { user, notificationDoc } = recipient;
const target = this.targetDoc!;
const manager = this.sharingDoc!;
const key = user.userDocumentId;
- if (state === SharingPermissions.None) {
- const metadata = (await DocCastAsync(manager[key]));
- if (metadata) {
- const sharedAlias = (await DocCastAsync(metadata.sharedAlias))!;
- Doc.RemoveDocFromList(notificationDoc, storage, sharedAlias);
- manager[key] = undefined;
- }
- } else {
- const sharedAlias = Doc.MakeAlias(target);
- Doc.AddDocToList(notificationDoc, storage, sharedAlias);
- const metadata = new Doc;
- metadata.permissions = state;
- metadata.sharedAlias = sharedAlias;
- manager[key] = metadata;
+ let metadata = await DocCastAsync(manager[key]);
+ const permissions: { [key: string]: number } = metadata?.permissions ? JSON.parse(StrCast(metadata.permissions)) : {};
+ permissions[StrCast(group ? group.groupName : Doc.CurrentUserEmail)] = parseInt(HierarchyMapping.get(state)!);
+ const max = Math.max(...Object.values(permissions));
+
+ switch (max) {
+ case 0:
+ if (metadata) {
+ const sharedAlias = (await DocCastAsync(metadata.sharedAlias))!;
+ Doc.RemoveDocFromList(notificationDoc, storage, sharedAlias);
+ manager[key] = undefined;
+ }
+ break;
+
+ case 1: case 2: case 3:
+ if (!metadata) {
+ metadata = new Doc;
+ const sharedAlias = Doc.MakeAlias(target);
+ Doc.AddDocToList(notificationDoc, storage, sharedAlias);
+ metadata.sharedAlias = sharedAlias;
+ manager[key] = metadata;
+ }
+ metadata.permissions = JSON.stringify(permissions);
+ break;
}
+
+ if (metadata) metadata.maxPermission = HierarchyMapping.get(`${max}`);
}
private setExternalSharing = (state: string) => {
@@ -245,7 +263,7 @@ export default class SharingManager extends React.Component<{}> {
if (!metadata) {
return SharingPermissions.None;
}
- return StrCast(metadata instanceof Doc ? metadata.permissions : metadata, SharingPermissions.None);
+ return StrCast(metadata instanceof Doc ? metadata.maxPermission : metadata, SharingPermissions.None);
}
@@ -302,7 +320,7 @@ export default class SharingManager extends React.Component<{}> {
className={"permissions-dropdown"}
value={permissions}
style={{ color, borderColor: color }}
- onChange={e => this.setInternalSharing({ user, notificationDoc }, e.currentTarget.value)}
+ onChange={e => this.setInternalSharing({ user, notificationDoc }, e.currentTarget.value, undefined)}
>
{this.sharingOptions}
</select>
@@ -318,11 +336,11 @@ export default class SharingManager extends React.Component<{}> {
<div className={"groups-list"} style={{ display: existGroups ? "block" : "flex", minHeight: existOtherUsers ? undefined : 150 }}>{/*200*/}
{!existGroups ? "There are no groups in your database." :
this.groups.map(group => {
- const permissions = this.computePermissions(group[Id]);
+ const permissions = this.computePermissions(StrCast(group.groupName));
const color = ColorMapping.get(permissions);
return (
<div
- key={group[Id]}
+ key={StrCast(group.groupName)}
className={"container"}
>
<select