diff options
Diffstat (limited to 'src/client/util')
| -rw-r--r-- | src/client/util/GroupManager.tsx | 36 | ||||
| -rw-r--r-- | src/client/util/SharingManager.tsx | 46 |
2 files changed, 54 insertions, 28 deletions
diff --git a/src/client/util/GroupManager.tsx b/src/client/util/GroupManager.tsx index 2e5ecc543..72fba5c1b 100644 --- a/src/client/util/GroupManager.tsx +++ b/src/client/util/GroupManager.tsx @@ -16,6 +16,7 @@ import { StrCast, Cast } from "../../fields/Types"; import GroupMemberView from "./GroupMemberView"; import { setGroups } from "../../fields/util"; import { DocServer } from "../DocServer"; +import { TaskCompletionBox } from "../views/nodes/TaskCompletedBox"; library.add(fa.faPlus, fa.faTimes, fa.faInfoCircle); @@ -36,11 +37,13 @@ export default class GroupManager extends React.Component<{}> { @observable currentGroup: Opt<Doc>; // the currently selected group. @observable private createGroupModalOpen: boolean = false; private inputRef: React.RefObject<HTMLInputElement> = React.createRef(); // the ref for the input box. + private createGroupButtonRef: React.RefObject<HTMLButtonElement> = React.createRef(); private currentUserGroups: string[] = []; @observable private buttonColour: "#979797" | "black" = "#979797"; @observable private groupSort: "ascending" | "descending" | "none" = "none"; + constructor(props: Readonly<{}>) { super(props); GroupManager.Instance = this; @@ -48,6 +51,7 @@ export default class GroupManager extends React.Component<{}> { componentDidMount() { this.populateUsers(); + this.populateGroups(); } /** @@ -74,6 +78,17 @@ export default class GroupManager extends React.Component<{}> { return Promise.all(evaluating); } + populateGroups = () => { + DocListCastAsync(this.GroupManagerDoc?.data).then(groups => { + groups?.forEach(group => { + const members: string[] = JSON.parse(StrCast(group.members)); + if (members.includes(Doc.CurrentUserEmail)) this.currentUserGroups.push(StrCast(group.groupName)); + }); + + setGroups(this.currentUserGroups); + }); + } + /** * @returns the options to be rendered in the dropdown menu to add users and create a group. */ @@ -89,14 +104,7 @@ export default class GroupManager extends React.Component<{}> { SelectionManager.DeselectAll(); this.isOpen = true; this.populateUsers(); - DocListCastAsync(this.GroupManagerDoc?.data).then(groups => { - groups?.forEach(group => { - const members: string[] = JSON.parse(StrCast(group.members)); - if (members.includes(Doc.CurrentUserEmail)) this.currentUserGroups.push(StrCast(group.groupName)); - }); - - setGroups(this.currentUserGroups); - }); + this.populateGroups(); } /** @@ -298,6 +306,14 @@ export default class GroupManager extends React.Component<{}> { this.selectedUsers = null; this.inputRef.current.value = ""; this.buttonColour = "#979797"; + + const { left, width, top } = this.createGroupButtonRef.current!.getBoundingClientRect(); + TaskCompletionBox.popupX = left - 2 * width; + TaskCompletionBox.popupY = top; + TaskCompletionBox.textDisplayed = "Group created!"; + TaskCompletionBox.taskCompleted = true; + setTimeout(action(() => TaskCompletionBox.taskCompleted = false), 2000); + } private get groupCreationModal() { @@ -340,7 +356,9 @@ export default class GroupManager extends React.Component<{}> { }) }} /> - <button onClick={this.createGroup} + <button + ref={this.createGroupButtonRef} + onClick={this.createGroup} style={{ background: this.buttonColour }} disabled={this.buttonColour === "#979797"} > diff --git a/src/client/util/SharingManager.tsx b/src/client/util/SharingManager.tsx index 9c857a7c0..452a58d21 100644 --- a/src/client/util/SharingManager.tsx +++ b/src/client/util/SharingManager.tsx @@ -20,7 +20,8 @@ import GroupMemberView from "./GroupMemberView"; import Select from "react-select"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { List } from "../../fields/List"; -import { distributeAcls } from "../../fields/util"; +import { distributeAcls, SharingPermissions } from "../../fields/util"; +import { TaskCompletionBox } from "../views/nodes/TaskCompletedBox"; library.add(fa.faCopy, fa.faTimes); @@ -29,13 +30,6 @@ export interface User { userDocumentId: string; } -export enum SharingPermissions { - Edit = "Can Edit", - Add = "Can Add", - View = "Can View", - None = "Not Shared" -} - interface GroupOptions { label: string; options: UserOptions[]; @@ -69,6 +63,8 @@ export default class SharingManager extends React.Component<{}> { @observable private permissions: SharingPermissions = SharingPermissions.Edit; @observable private individualSort: "ascending" | "descending" | "none" = "none"; @observable private groupSort: "ascending" | "descending" | "none" = "none"; + private shareDocumentButtonRef: React.RefObject<HTMLButtonElement> = React.createRef(); + // private get linkVisible() { @@ -90,6 +86,8 @@ export default class SharingManager extends React.Component<{}> { public close = action(() => { this.isOpen = false; this.users = []; + this.selectedUsers = null; + setTimeout(action(() => { // this.copied = false; DictationOverlay.Instance.hasActiveModal = false; @@ -235,7 +233,7 @@ export default class SharingManager extends React.Component<{}> { private get sharingOptions() { return Object.values(SharingPermissions).map(permission => { return ( - <option key={permission} value={permission}> + <option key={permission} value={permission} selected={permission === SharingPermissions.Edit}> {permission} </option> ); @@ -284,15 +282,25 @@ export default class SharingManager extends React.Component<{}> { @action share = () => { - this.selectedUsers?.forEach(user => { - if (user.value.includes(indType)) { - this.setInternalSharing(this.users.find(u => u.user.email === user.label)!, this.permissions); - } - else { - this.setInternalGroupSharing(GroupManager.Instance.getGroup(user.label)!, this.permissions); - } - }); - this.selectedUsers = null; + if (this.selectedUsers) { + this.selectedUsers.forEach(user => { + if (user.value.includes(indType)) { + this.setInternalSharing(this.users.find(u => u.user.email === user.label)!, this.permissions); + } + else { + this.setInternalGroupSharing(GroupManager.Instance.getGroup(user.label)!, this.permissions); + } + }); + + const { left, width, top, height } = this.shareDocumentButtonRef.current!.getBoundingClientRect(); + TaskCompletionBox.popupX = left - 1.5 * width; + TaskCompletionBox.popupY = top - height; + TaskCompletionBox.textDisplayed = "Document shared!"; + TaskCompletionBox.taskCompleted = true; + setTimeout(action(() => TaskCompletionBox.taskCompleted = false), 2000); + + this.selectedUsers = null; + } } sortUsers = (u1: ValidatedUser, u2: ValidatedUser) => { @@ -456,7 +464,7 @@ export default class SharingManager extends React.Component<{}> { <select className="permissions-select" onChange={this.handlePermissionsChange}> {this.sharingOptions} </select> - <button className="share-button" onClick={this.share}> + <button ref={this.shareDocumentButtonRef} className="share-button" onClick={this.share}> Share </button> </div> |
