From 11227d26ab33f1ae3a9e934666243c83ee08903a Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Thu, 17 Mar 2022 21:13:24 +0100 Subject: [PATCH 01/12] Add useCapability composable --- .../src/composables/capability/index.ts | 1 + .../composables/capability/useCapability.ts | 34 +++++++++ packages/web-runtime/src/composables/index.ts | 1 + .../unit/composables/capability/spec/index.ts | 19 +++++ .../capability/useCapability.spec.ts | 73 +++++++++++++++++++ 5 files changed, 128 insertions(+) create mode 100644 packages/web-runtime/src/composables/capability/index.ts create mode 100644 packages/web-runtime/src/composables/capability/useCapability.ts create mode 100644 packages/web-runtime/tests/unit/composables/capability/spec/index.ts create mode 100644 packages/web-runtime/tests/unit/composables/capability/useCapability.spec.ts diff --git a/packages/web-runtime/src/composables/capability/index.ts b/packages/web-runtime/src/composables/capability/index.ts new file mode 100644 index 00000000000..1aa9aac380f --- /dev/null +++ b/packages/web-runtime/src/composables/capability/index.ts @@ -0,0 +1 @@ +export * from './useCapability' diff --git a/packages/web-runtime/src/composables/capability/useCapability.ts b/packages/web-runtime/src/composables/capability/useCapability.ts new file mode 100644 index 00000000000..5e70b848079 --- /dev/null +++ b/packages/web-runtime/src/composables/capability/useCapability.ts @@ -0,0 +1,34 @@ +import { Store } from 'vuex' +import get from 'lodash-es/get' +import { computed, ComputedRef } from '@vue/composition-api' +import { useStore } from 'web-pkg/src/composables' + +export const useCapability = ( + store: Store, + name: string, + defaultValue?: T +): ComputedRef => { + return computed((): T => { + if (defaultValue) { + return get(store, `getters.capabilities.${name}`, defaultValue) as T + } + + const value = get(store, `getters.capabilities.${name}`) as T + if (value === undefined) { + throw new Error('useCapability: capability is not defined and no default was defined') + } + return value + }) +} + +const createCapabilityComposable = ( + name: string, + defaultValue?: T +): ((store?: Store) => ComputedRef) => { + return (store?: Store) => useCapability(store || useStore(), name, defaultValue) +} + +export const useCapabilityFilesSharingResharing = createCapabilityComposable( + 'files_sharing.resharing', + true +) diff --git a/packages/web-runtime/src/composables/index.ts b/packages/web-runtime/src/composables/index.ts index fc6c2f69f68..7946db02dc9 100644 --- a/packages/web-runtime/src/composables/index.ts +++ b/packages/web-runtime/src/composables/index.ts @@ -1 +1,2 @@ export * from './theme' +export * from './capability' diff --git a/packages/web-runtime/tests/unit/composables/capability/spec/index.ts b/packages/web-runtime/tests/unit/composables/capability/spec/index.ts new file mode 100644 index 00000000000..c7a8fefba15 --- /dev/null +++ b/packages/web-runtime/tests/unit/composables/capability/spec/index.ts @@ -0,0 +1,19 @@ +import VueCompositionAPI, { defineComponent, SetupFunction, Data } from '@vue/composition-api' +import { createLocalVue, mount, Wrapper } from '@vue/test-utils' +import Vuex from 'vuex' +import Vue from 'vue' + +const localVue = createLocalVue() +localVue.use(VueCompositionAPI) +localVue.use(Vuex) + +export const createWrapper = (setup: SetupFunction): Wrapper => + mount( + defineComponent({ + template: `
`, + setup + }), + { + localVue + } + ) diff --git a/packages/web-runtime/tests/unit/composables/capability/useCapability.spec.ts b/packages/web-runtime/tests/unit/composables/capability/useCapability.spec.ts new file mode 100644 index 00000000000..bbb81e1c1c4 --- /dev/null +++ b/packages/web-runtime/tests/unit/composables/capability/useCapability.spec.ts @@ -0,0 +1,73 @@ +import { unref } from '@vue/composition-api' +import { createWrapper } from './spec' +import { useCapability } from '../../../../src/composables/capability/useCapability' +import { Store } from 'vuex' +import user from '../../../../src/store/user' +import set from 'lodash-es/set' + +let store +beforeEach(() => { + createWrapper(undefined) + store = new Store({ + modules: { + user + } + }) +}) + +const commitValue = (name: string, value: T) => { + store.commit('SET_CAPABILITIES', { + version: '1.2.3', + capabilities: set({}, name, value) + }) +} + +describe('useCapability', () => { + it('should be valid', () => { + expect(useCapability).toBeDefined() + }) + + it('handles bools correctly', () => { + const resharingCapability = useCapability(store, 'files_sharing.resharing') + const resharingCapabilityWithDefault = useCapability( + store, + 'files_sharing.resharing', + true + ) + + // FIXME: how to test this? + // expect(() => { + // unref(resharingCapability) + // }).rejects.toThrow() + expect(unref(resharingCapabilityWithDefault)).toBe(true) + + commitValue('files_sharing.resharing', false) + expect(unref(resharingCapability)).toBe(false) + expect(unref(resharingCapabilityWithDefault)).toBe(false) + + commitValue('files_sharing.resharing', true) + expect(unref(resharingCapability)).toBe(true) + expect(unref(resharingCapabilityWithDefault)).toBe(true) + }) + + it('handles arrays correctly', () => { + const supportedTypesCapability = useCapability(store, 'checksums.supportedTypes') + const supportedTypesCapabilityWithDefaults = useCapability( + store, + 'checksums.supportedTypes', + ['foo', 'bar'] + ) + + // FIXME: how to test this? + // expect(() => { + // unref(resharingCapability) + // }).rejects.toThrow() + expect(unref(supportedTypesCapabilityWithDefaults)).toStrictEqual(['foo', 'bar']) + + commitValue('checksums.supportedTypes', ['sha1', 'md5', 'adler32']) + expect(unref(supportedTypesCapability)).toStrictEqual(['sha1', 'md5', 'adler32']) + + commitValue('checksums.supportedTypes', ['sha1', 'adler32']) + expect(unref(supportedTypesCapability)).toStrictEqual(['sha1', 'adler32']) + }) +}) From 9a79c7421f358827a5948df667564a8b273f778d Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Thu, 17 Mar 2022 21:15:15 +0100 Subject: [PATCH 02/12] Replace isOcis in SideBar/shares/Collaborators/ListItem with resharing capability --- .../SideBar/Shares/Collaborators/ListItem.vue | 12 +++++++++--- .../SideBar/Shares/Collaborators/ListItem.spec.js | 3 --- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/ListItem.vue b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/ListItem.vue index f059712778c..278b393523e 100644 --- a/packages/web-app-files/src/components/SideBar/Shares/Collaborators/ListItem.vue +++ b/packages/web-app-files/src/components/SideBar/Shares/Collaborators/ListItem.vue @@ -66,7 +66,7 @@ :share-id="share.id" :existing-permissions="share.customPermissions" :existing-role="share.role" - :allow-share-permission="!isOcis || isSpace" + :allow-share-permission="resharingCapability || isSpace" class="files-collaborators-collaborator-role" @optionChange="shareRoleChanged" /> @@ -94,6 +94,7 @@ import EditDropdown from './EditDropdown.vue' import RoleDropdown from '../RoleDropdown.vue' import { SharePermissions, ShareTypes } from '../../../../helpers/share' import { clientService } from 'web-pkg/src/services' +import { useCapabilityFilesSharingResharing } from 'web-runtime/src/composables' export default { name: 'ListItem', @@ -112,9 +113,14 @@ export default { default: false } }, + setup() { + return { + resharingCapability: useCapabilityFilesSharingResharing() + } + }, computed: { ...mapGetters('Files', ['highlightedFile']), - ...mapGetters(['isOcis', 'getToken', 'configuration']), + ...mapGetters(['getToken', 'configuration']), ...mapState(['user']), shareType() { @@ -264,7 +270,7 @@ export default { const bitmask = role.hasCustomPermissions ? SharePermissions.permissionsToBitmask(permissions) : SharePermissions.permissionsToBitmask( - role.permissions(!this.isOcis || this.shareType === ShareTypes.space) + role.permissions(this.resharingCapability || this.shareType === ShareTypes.space) ) this.changeShare({ client: this.$client, diff --git a/packages/web-app-files/tests/unit/components/SideBar/Shares/Collaborators/ListItem.spec.js b/packages/web-app-files/tests/unit/components/SideBar/Shares/Collaborators/ListItem.spec.js index c57fc166737..0c03a0d5324 100644 --- a/packages/web-app-files/tests/unit/components/SideBar/Shares/Collaborators/ListItem.spec.js +++ b/packages/web-app-files/tests/unit/components/SideBar/Shares/Collaborators/ListItem.spec.js @@ -107,9 +107,6 @@ function createWrapper({ state: { user: Users.alice }, - getters: { - isOcis: () => false - }, modules: { Files: { namespaced: true, From 442f4660e39720cfff6cbda3ee39e74347921561 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Thu, 17 Mar 2022 21:17:31 +0100 Subject: [PATCH 03/12] Replace isOcis in InviteCollaborator component with resharing capability --- .../InviteCollaborator/InviteCollaboratorForm.vue | 12 +++++++++--- .../InviteCollaborator/RecipientContainer.spec.js | 1 - 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/web-app-files/src/components/SideBar/Shares/InviteCollaborator/InviteCollaboratorForm.vue b/packages/web-app-files/src/components/SideBar/Shares/InviteCollaborator/InviteCollaboratorForm.vue index ce00aebefb0..3c6c8fcad57 100644 --- a/packages/web-app-files/src/components/SideBar/Shares/InviteCollaborator/InviteCollaboratorForm.vue +++ b/packages/web-app-files/src/components/SideBar/Shares/InviteCollaborator/InviteCollaboratorForm.vue @@ -42,7 +42,7 @@
{ } }, getters: { - isOcis: () => false, user: () => user, getToken: () => '', capabilities: () => { From 360d18f5c234e988e3d864ff762fb7dca24752c1 Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Thu, 17 Mar 2022 21:21:32 +0100 Subject: [PATCH 04/12] Get rid of isOcis on account page by abusing the resharing capability for it for now --- packages/web-runtime/src/pages/account.vue | 13 +++++++++++-- .../tests/unit/pages/account.spec.js | 17 ++++++++++++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/packages/web-runtime/src/pages/account.vue b/packages/web-runtime/src/pages/account.vue index 6192264b63b..b3191fd2803 100644 --- a/packages/web-runtime/src/pages/account.vue +++ b/packages/web-runtime/src/pages/account.vue @@ -73,8 +73,17 @@