diff options
author | usodhi <61431818+usodhi@users.noreply.github.com> | 2020-06-26 19:40:03 +0530 |
---|---|---|
committer | usodhi <61431818+usodhi@users.noreply.github.com> | 2020-06-26 19:40:03 +0530 |
commit | db3ed8fc7acbc1722160992b66fd6b3664c64007 (patch) | |
tree | 8e1885288da84139afe108f124bee2c6a3f594a7 /src | |
parent | 76906b719bcd1b605910003ec23412da81b17ad1 (diff) |
convoluted permissions stuff + SharingManager ui changes
Diffstat (limited to 'src')
-rw-r--r-- | src/client/util/GroupManager.tsx | 3 | ||||
-rw-r--r-- | src/client/util/SharingManager.scss | 15 | ||||
-rw-r--r-- | src/client/util/SharingManager.tsx | 74 |
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 |