From 3573596716c3f223a51a82b1f4246d3878318f9d Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Mon, 29 Jun 2020 10:49:53 -0400 Subject: [PATCH 01/16] Add menu to workspace detail --- src/views/WorkspaceDetail.vue | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/views/WorkspaceDetail.vue b/src/views/WorkspaceDetail.vue index b33719e3..c4bef2fb 100644 --- a/src/views/WorkspaceDetail.vue +++ b/src/views/WorkspaceDetail.vue @@ -79,9 +79,35 @@ bottom /> - - more_vert - + + + + + + + vpn_key + + + Permissions + + + + + Date: Wed, 1 Jul 2020 11:52:38 -0400 Subject: [PATCH 02/16] Create permissions modal --- src/views/WorkspaceDetail.vue | 264 +++++++++++++++++++++++++++++++++- 1 file changed, 261 insertions(+), 3 deletions(-) diff --git a/src/views/WorkspaceDetail.vue b/src/views/WorkspaceDetail.vue index c4bef2fb..7a559a27 100644 --- a/src/views/WorkspaceDetail.vue +++ b/src/views/WorkspaceDetail.vue @@ -79,6 +79,7 @@ bottom /> + - - - + + + vpn_key @@ -110,6 +117,201 @@ + + + + + + Permissions for {{ workspace }} + + + + + Make public + Make private + + + + + + + + + + + + + + + Add selected + + + + + + + + + + + + Set individual permissions: + + + + + + + + + + account_circle + + + + jakey.nesby@kitware.com + + + + + + + + + + account_circle + + + + maca_roni.chowdery@kitware.com + + + + + + + + + + account_circle + + + + jarred.tomatoes@kitware.com + + + + + + + + + + + + + Cancel + + + Save Permissions + + + + + + + @@ -186,6 +388,8 @@ export default Vue.extend({ requestError: null as string | null, loading: false, actionsMenu: false, + permDialog: false, + privacyToggle: true, }; }, @@ -210,6 +414,9 @@ export default Vue.extend({ return nodeTables.concat(edgeTables); }, + swapPermIcon() { + return this.privacyToggle ? 'lock' : 'lock_open'; + }, }, watch: { @@ -286,6 +493,23 @@ export default Vue.extend({ color:#7f9ba4; } +.user-list-heading { + font-size: 14px !important; +} + +.user-list-individual-select { + max-width: 175px; +} + +.v-dialog > .v-card > .v-card__title.perm-title { + font-size: 24px; + font-weight: 400; +} + +.v-dialog > .v-card > .v-card__title.perm-title strong { + font-weight: 600; +} + .ws-detail-title { align-items: center; display: flex; @@ -295,6 +519,40 @@ export default Vue.extend({ + + diff --git a/src/views/WorkspaceDetail.vue b/src/views/WorkspaceDetail.vue index aca6c985..4395fb6a 100644 --- a/src/views/WorkspaceDetail.vue +++ b/src/views/WorkspaceDetail.vue @@ -82,7 +82,6 @@ - - - - - - - Permissions for {{ workspace }} - - - - - Make public - Make private - - - - - - - - - - - - - - - Add selected - - - - - - - - - - - - Set individual permissions: - - - - - - - - - - account_circle - - - - jakey.nesby@kitware.com - - - - - - - - - - account_circle - - - - maca_roni.chowdery@kitware.com - - - - - - - - - - account_circle - - - - jarred.tomatoes@kitware.com - - - - - - - - - - - - - Cancel - - - Save Permissions - - - - - - + + @@ -362,6 +156,7 @@ import Vue, { PropType } from 'vue'; import api from '@/api'; import TablePanel from '@/components/TablePanel.vue'; import NetworkPanel from '@/components/NetworkPanel.vue'; +import PermissionsDialog from '@/components/PermissionsDialog.vue'; import store from '@/store'; const surroundingWhitespace = /^\s+|\s+$/; @@ -375,6 +170,7 @@ export default Vue.extend({ components: { TablePanel, NetworkPanel, + PermissionsDialog, }, props: { workspace: { @@ -389,8 +185,6 @@ export default Vue.extend({ requestError: null as string | null, loading: false, actionsMenu: false, - permDialog: false, - privacyToggle: true, }; }, @@ -417,11 +211,6 @@ export default Vue.extend({ return nodeTables.concat(edgeTables); }, - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - swapPermIcon(this: any) { - return this.privacyToggle ? 'lock' : 'lock_open'; - }, }, watch: { @@ -503,23 +292,6 @@ export default Vue.extend({ color:#7f9ba4; } -.user-list-heading { - font-size: 14px !important; -} - -.user-list-individual-select { - max-width: 175px; -} - -.v-dialog > .v-card > .v-card__title.perm-title { - font-size: 24px; - font-weight: 400; -} - -.v-dialog > .v-card > .v-card__title.perm-title strong { - font-weight: 600; -} - .ws-detail-title { align-items: center; display: flex; @@ -529,40 +301,6 @@ export default Vue.extend({ diff --git a/src/main.ts b/src/main.ts index b4665c2b..3dc93eb2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,5 @@ import 'material-design-icons-iconfont/dist/material-design-icons.css'; +import AsyncComputed from 'vue-async-computed'; import Vue from 'vue'; import App from './App.vue'; import vuetify from './vuetify'; @@ -7,6 +8,7 @@ import store from './store'; import './vuegtag'; Vue.config.productionTip = false; +Vue.use(AsyncComputed); new Vue({ render: (h) => h(App), diff --git a/src/store/index.ts b/src/store/index.ts index 5266a8cf..1f80e717 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -14,7 +14,7 @@ export interface WorkspaceState { graphs: string[]; } -interface State { +export interface State { workspaces: string[]; currentWorkspace: WorkspaceState | null; userInfo: UserInfo | null; diff --git a/src/utils/permissions.ts b/src/utils/permissions.ts new file mode 100644 index 00000000..23713f5d --- /dev/null +++ b/src/utils/permissions.ts @@ -0,0 +1,21 @@ +import { WorkspacePermissionsSpec } from 'multinet'; +import { State } from '@/store'; + + +export type Role = 'owner' | 'maintainers' | 'writers' | 'readers'; +export type SingularRole = 'owner' | 'maintainer' | 'writer' | 'reader'; + + +export function canChangeWorkspacePermissions(state: State, permissions: WorkspacePermissionsSpec) { + if (state.userInfo === null) { return false; } + + const userSub = state.userInfo.sub; + const ownerSub = permissions.owner.sub; + const maintainerSubs = permissions.maintainers.map((user) => user.sub); + + if (maintainerSubs.includes(userSub) || userSub === ownerSub) { + return true; + } + + return false; +} diff --git a/yarn.lock b/yarn.lock index 2878e92e..1ac4dd31 100644 --- a/yarn.lock +++ b/yarn.lock @@ -777,6 +777,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== +"@types/lodash@^4.14.158": + version "4.14.158" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.158.tgz#b38ea8b6fe799acd076d7a8d7ab71c26ef77f785" + integrity sha512-InCEXJNTv/59yO4VSfuvNrZHt7eeNtWQEgnieIA+mIC+MOWM9arOWG2eQ8Vhk6NbOre6/BidiXhkZYeDY9U35w== + "@types/mime-types@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.0.tgz#9ca52cda363f699c69466c2a6ccdaad913ea7a73" @@ -5459,6 +5464,11 @@ lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash@^4.17.19: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" @@ -5834,10 +5844,10 @@ multimatch@^2.1.0: arrify "^1.0.0" minimatch "^3.0.0" -multinet@0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/multinet/-/multinet-0.12.0.tgz#44c4c47272a609373edabf384c637f1d5641ae39" - integrity sha512-dkufPqpnRX6KNYPdxtE3cOKXtmyIQiZS1kCH6NjeALrP/a5+/eptEunN45cGL7huCIV8PLeLxkmkpLS6nr1M+A== +multinet@0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/multinet/-/multinet-0.13.0.tgz#a054347742456da5a1a5177f1be96614bdd8f495" + integrity sha512-zW9g6mddW9oX2NZ4ZH3E9MZ1SweJB7OfQZMqvwjHRbDi2DLmxpKSdPyN0fUrbDEd3Jv/oVeonogusZEJ6NxTog== dependencies: axios "^0.19.0" @@ -8889,6 +8899,11 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +vue-async-computed@^3.8.2: + version "3.8.2" + resolved "https://registry.yarnpkg.com/vue-async-computed/-/vue-async-computed-3.8.2.tgz#d5dff221b62f95ad2f98ce9e7bbea5a067ec8b9a" + integrity sha512-If5roOhp/x0WWd0TWRD77YsuFoiIw3MbkcRlIB/FE3TqQCPje52eQp5CV5NN/7B0VAyPuGX5JQa+rc9AOcGAYw== + vue-cli-plugin-vuetify@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/vue-cli-plugin-vuetify/-/vue-cli-plugin-vuetify-2.0.5.tgz#09ba78928653fc7e3801ea37e5120f957413dda4" From adebc130738f31666d7cc0ce68bcaa547d1a3300 Mon Sep 17 00:00:00 2001 From: Jacob Nesbitt Date: Mon, 3 Aug 2020 12:16:29 -0400 Subject: [PATCH 09/16] Add setting roles for all users --- src/components/PermissionsDialog.vue | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/components/PermissionsDialog.vue b/src/components/PermissionsDialog.vue index cabe90c6..abb5d515 100644 --- a/src/components/PermissionsDialog.vue +++ b/src/components/PermissionsDialog.vue @@ -110,6 +110,7 @@ dense placeholder="change all to" prepend-icon="more_horiz" + @input="setRoleForAllUsers(singularRoleToPlural($event))" /> @@ -299,9 +300,20 @@ export default Vue.extend({ } }, // eslint-disable-next-line @typescript-eslint/no-explicit-any - // setRoleForAllUsers(this: any, role: string) { - // // Put all of these users into this.mutablePermissions["role"] - // }, + setRoleForAllUsers(this: any, role: Role) { + const userList: UserSpec[] = (this.userPermissionsList as UserPermissionSpec[]) + .filter((user: UserPermissionSpec) => user.role !== 'owner') + .map((user) => user.user); + + this.mutablePermissions = { + owner: this.mutablePermissions.owner, + public: this.mutablePermissions.public, + maintainers: [], + writers: [], + readers: [], + [role]: userList, + }; + }, // eslint-disable-next-line @typescript-eslint/no-explicit-any async setPermissions(this: any) { try { From 9ec3fa54ab4e08fbcb706d926a73f82188134f22 Mon Sep 17 00:00:00 2001 From: Jacob Nesbitt Date: Mon, 3 Aug 2020 13:27:21 -0400 Subject: [PATCH 10/16] Disable permission dialog if unauthorized Replace UserInfo with newly added UserSpec in multinetjs --- src/components/PermissionsDialog.vue | 15 +++++++++++++-- src/store/index.ts | 6 +++--- src/utils/permissions.ts | 11 ++++------- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/components/PermissionsDialog.vue b/src/components/PermissionsDialog.vue index abb5d515..df86ccb7 100644 --- a/src/components/PermissionsDialog.vue +++ b/src/components/PermissionsDialog.vue @@ -6,6 +6,7 @@