From ab5a6752a51732f48deab8cedf28b9cacd1833d0 Mon Sep 17 00:00:00 2001 From: Jannik Stehle <50302941+JammingBen@users.noreply.github.com> Date: Fri, 22 Dec 2023 14:50:51 +0100 Subject: [PATCH] refactor: modal implementation (#10212) * refactor: modal implementation * refactor: rename registerModal to dispatchModal * refactor: remove explicit active property from modals * style: run linter * fix: importer modal not rendering content * test: align modal.ts test file name with actual file name --- changelog/unreleased/change-creating-modals | 8 + .../src/components/OcModal/OcModal.vue | 128 +++------------ .../__snapshots__/OcModal.spec.ts.snap | 24 ++- .../components/Groups/CreateGroupModal.vue | 57 +++---- .../src/components/Spaces/ContextActions.vue | 2 +- .../Spaces/SideBar/ActionsPanel.vue | 2 +- .../src/components/Users/AddToGroupsModal.vue | 51 +++--- .../src/components/Users/CreateUserModal.vue | 58 +++---- .../src/components/Users/LoginModal.vue | 75 ++++----- .../Users/RemoveFromGroupsModal.vue | 51 +++--- .../groups/useGroupActionsCreateGroup.ts | 21 +-- .../actions/groups/useGroupActionsDelete.ts | 21 +-- .../users/useUserActionsAddToGroups.ts | 8 +- .../actions/users/useUserActionsCreateUser.ts | 20 +-- .../actions/users/useUserActionsDelete.ts | 20 +-- .../actions/users/useUserActionsEditLogin.ts | 8 +- .../actions/users/useUserActionsEditQuota.ts | 12 +- .../users/useUserActionsRemoveFromGroups.ts | 8 +- .../src/views/Spaces.vue | 2 +- .../Groups/CreateGroupModal.spec.ts | 17 +- .../components/Users/AddToGroupsModal.spec.ts | 10 +- .../components/Users/CreateUserModal.spec.ts | 17 +- .../unit/components/Users/LoginModal.spec.ts | 10 +- .../Users/RemoveFromGroupsModal.spec.ts | 10 +- .../__snapshots__/LoginModal.spec.ts.snap | 7 +- .../groups/useGroupActionsCreateGroup.spec.ts | 24 ++- .../groups/useGroupActionsDelete.spec.ts | 6 +- .../users/useUserActionsAddToGroups.spec.ts | 30 ++-- .../users/useUserActionsCreateUser.spec.ts | 25 ++- .../users/useUserActionsDelete.spec.ts | 6 +- .../users/useUserActionsEditLogin.spec.ts | 7 +- .../users/useUserActionsEditQuota.spec.ts | 6 +- .../useUserActionsRemoveFromGroups.spec.ts | 30 ++-- .../src/components/AppBar/CreateAndUpload.vue | 4 +- .../src/components/AppBar/CreateSpace.vue | 71 ++++---- .../Modals/SetLinkPasswordModal.vue | 45 ++---- .../SideBar/Actions/SpaceActions.vue | 2 +- .../SideBar/Shares/Collaborators/ListItem.vue | 14 +- .../components/SideBar/Shares/FileLinks.vue | 33 ++-- .../components/SideBar/Shares/FileShares.vue | 18 +-- .../SideBar/Shares/Links/DetailsAndEdit.vue | 98 +++++------ .../SideBar/Shares/SpaceMembers.vue | 24 ++- .../components/Spaces/SpaceContextActions.vue | 2 +- .../src/helpers/resource/actions/transfer.ts | 4 +- .../src/helpers/resource/actions/upload.ts | 2 - packages/web-app-files/src/store/actions.ts | 4 - .../src/views/spaces/GenericSpace.vue | 4 +- .../components/AppBar/CreateSpace.spec.ts | 21 ++- .../Modals/SetLinkPasswordModal.spec.ts | 3 + .../Shares/Links/DetailsAndEdit.spec.ts | 15 -- .../resource/resourcesTransfer.spec.ts | 8 - .../tests/unit/views/FilesDrop.spec.ts | 3 +- .../unit/views/spaces/GenericSpace.spec.ts | 3 +- .../unit/views/spaces/GenericTrash.spec.ts | 3 +- packages/web-app-importer/src/extensions.ts | 22 +-- .../web-pkg/src/components/AppBar/AppBar.vue | 2 +- .../components/AppTemplates/AppWrapper.vue | 11 +- .../src/components/CreateLinkModal.vue | 58 +++---- .../src/components/CreateShortcutModal.vue | 61 ++++--- .../Modals/ResourceConflictModal.vue | 69 ++++---- .../components/Modals/SpaceMoveInfoModal.vue | 22 +++ .../web-pkg/src/components/Modals/index.ts | 1 + .../src/components/Spaces/QuotaModal.vue | 56 +++---- .../components/Spaces/ReadmeContentModal.vue | 17 +- .../actions/files/useFileActionsCreateLink.ts | 6 +- .../files/useFileActionsCreateNewFile.ts | 34 ++-- .../files/useFileActionsCreateNewFolder.ts | 37 ++--- .../files/useFileActionsCreateNewShortcut.ts | 21 ++- .../useFileActionsCreateSpaceFromResource.ts | 17 +- .../files/useFileActionsEmptyTrashBin.ts | 19 +-- .../actions/files/useFileActionsPaste.ts | 2 - .../actions/files/useFileActionsRename.ts | 67 +++----- .../actions/files/useFileActionsRestore.ts | 4 +- .../helpers/useFileActionsDeleteResources.ts | 23 +-- .../actions/spaces/useSpaceActionsDelete.ts | 22 +-- .../actions/spaces/useSpaceActionsDisable.ts | 23 +-- .../spaces/useSpaceActionsEditDescription.ts | 14 +- .../spaces/useSpaceActionsEditQuota.ts | 13 +- .../useSpaceActionsEditReadmeContent.ts | 5 +- .../actions/spaces/useSpaceActionsRename.ts | 17 +- .../actions/spaces/useSpaceActionsRestore.ts | 13 +- .../src/composables/piniaStores/index.ts | 1 + .../src/composables/piniaStores/modals.ts | 90 +++++++++++ .../src/composables/piniaStores/theme.ts | 4 +- .../src/composables/spaces/useSpaceHelpers.ts | 16 +- .../conflictHandling/conflictDialog.ts | 29 ++-- .../tests/unit/components/AppBanner.spec.ts | 24 +-- .../unit/components/CreateLinkModal.spec.ts | 39 ++--- .../Modals/ResourceConflictModal.spec.ts | 10 +- .../files/useFileActionsCreateLink.spec.ts | 11 +- .../files/useFileActionsCreateNewFile.spec.ts | 19 +-- .../useFileActionsCreateNewFolder.spec.ts | 20 +-- .../useFileActionsCreateNewShortcut.spec.ts | 7 +- .../files/useFileActionsEmptyTrashBin.spec.ts | 23 +-- .../files/useFileActionsRename.spec.ts | 70 ++++---- .../spaces/useSpaceActionsDelete.spec.ts | 38 ++--- .../spaces/useSpaceActionsDisable.spec.ts | 37 +++-- .../useSpaceActionsEditDescription.spec.ts | 25 +-- .../spaces/useSpaceActionsEditQuota.spec.ts | 8 +- .../useSpaceActionsEditReadmeContent.spec.ts | 6 +- .../spaces/useSpaceActionsRename.spec.ts | 30 ++-- .../spaces/useSpaceActionsRestore.spec.ts | 35 ++-- .../composables/piniaStores/modals.spec.ts | 73 +++++++++ .../spaces/useSpaceHelpers.spec.ts | 54 +++---- .../conflictHandling/conflictDialog.spec.ts | 14 +- packages/web-runtime/src/App.vue | 77 +-------- .../src/components/EditPasswordModal.vue | 128 +++++++++------ .../src/components/ModalWrapper.vue | 107 ++++++++++++ .../web-runtime/src/container/bootstrap.ts | 6 +- packages/web-runtime/src/index.ts | 2 + packages/web-runtime/src/pages/account.vue | 50 ++---- .../src/services/auth/authService.ts | 5 +- packages/web-runtime/src/store/index.ts | 2 - packages/web-runtime/src/store/modal.ts | 106 ------------ .../unit/components/EditPasswordModal.spec.ts | 10 +- .../unit/components/ModalWrapper.spec.ts | 153 ++++++++++++++++++ .../components/Topbar/ThemeSwitcher.spec.ts | 22 ++- .../unit/components/Topbar/TopBar.spec.ts | 3 +- .../unit/components/Topbar/UserMenu.spec.ts | 12 +- .../tests/unit/pages/accessDenied.spec.ts | 3 +- .../tests/unit/pages/account.spec.ts | 31 ---- .../tests/unit/pages/oidcCallback.spec.ts | 3 +- .../unit/pages/resolvePublicLink.spec.ts | 3 +- .../web-test-helpers/src/defaultPlugins.ts | 9 +- packages/web-test-helpers/src/mocks/index.ts | 1 + packages/web-test-helpers/src/mocks/pinia.ts | 31 ++-- .../mocks/store/defaultStoreMockOptions.ts | 5 - 127 files changed, 1553 insertions(+), 1717 deletions(-) create mode 100644 changelog/unreleased/change-creating-modals create mode 100644 packages/web-pkg/src/components/Modals/SpaceMoveInfoModal.vue create mode 100644 packages/web-pkg/src/composables/piniaStores/modals.ts create mode 100644 packages/web-pkg/tests/unit/composables/piniaStores/modals.spec.ts create mode 100644 packages/web-runtime/src/components/ModalWrapper.vue delete mode 100644 packages/web-runtime/src/store/modal.ts create mode 100644 packages/web-runtime/tests/unit/components/ModalWrapper.spec.ts diff --git a/changelog/unreleased/change-creating-modals b/changelog/unreleased/change-creating-modals new file mode 100644 index 00000000000..49a39eac2c7 --- /dev/null +++ b/changelog/unreleased/change-creating-modals @@ -0,0 +1,8 @@ +Change: Creating modals + +BREAKING CHANGE for developers: The way how to work with modals has been reworked. Modals can now be registered via the `dispatchModal` method provided by the `useModals` composable, instead of calling `createModal` or `hideModal` from the store. + +For more details on how to use the modal please see the linked PR down below. + +https://github.com/owncloud/web/pull/10212 +https://github.com/owncloud/web/issues/10095 diff --git a/packages/design-system/src/components/OcModal/OcModal.vue b/packages/design-system/src/components/OcModal/OcModal.vue index c8cfaae15e9..98e81417e5f 100644 --- a/packages/design-system/src/components/OcModal/OcModal.vue +++ b/packages/design-system/src/components/OcModal/OcModal.vue @@ -40,11 +40,9 @@ v-model="userInputValue" class="oc-modal-body-input" :error-message="inputError" - :placeholder="inputPlaceholder" :label="inputLabel" :type="inputType" :description-message="inputDescription" - :disabled="inputDisabled" :fix-message-line="true" :selection-range="inputSelectionRange" @update:model-value="inputOnInput" @@ -54,24 +52,24 @@
${this.$gettext( - 'Moving files from one space to another is not possible. Do you want to copy instead?' - )}
${this.$gettext( - 'Note: Links and shares of the original file are not copied.' - )}
`, - cancelText: this.$gettext('Cancel'), + customComponent: SpaceMoveInfoModal, confirmText: this.$gettext('Copy here'), onCancel: () => { - this.hideModal() resolve(false) }, - onConfirm: () => { - this.hideModal() - resolve(true) - } - } - this.createModal(modal) + onConfirm: () => Promise.resolve(resolve(true)) + }) }) } } diff --git a/packages/web-pkg/tests/unit/components/AppBanner.spec.ts b/packages/web-pkg/tests/unit/components/AppBanner.spec.ts index 473f6edd950..6b6457cd685 100644 --- a/packages/web-pkg/tests/unit/components/AppBanner.spec.ts +++ b/packages/web-pkg/tests/unit/components/AppBanner.spec.ts @@ -3,7 +3,6 @@ import AppBanner from '../../../src/components/AppBanner.vue' import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router' import { useSessionStorage } from '@vueuse/core' import { ref } from 'vue' -import { createMockThemeStore } from 'web-test-helpers/src/mocks/pinia' jest.mock('@vueuse/core') @@ -62,15 +61,20 @@ function getWrapper({ fileId, sessionStorageReturnValue }) { }, global: { plugins: [ - ...defaultPlugins(), - createMockThemeStore({ - appBanner: { - title: 'ownCloud', - publisher: 'ownCloud GmbH', - additionalInformation: '', - ctaText: 'OPEN', - icon: 'themes/owncloud/assets/owncloud-app-icon.png', - appScheme: 'owncloud' + ...defaultPlugins({ + piniaOptions: { + themeState: { + currentTheme: { + appBanner: { + title: 'ownCloud', + publisher: 'ownCloud GmbH', + additionalInformation: '', + ctaText: 'OPEN', + icon: 'themes/owncloud/assets/owncloud-app-icon.png', + appScheme: 'owncloud' + } + } + } } }) ], diff --git a/packages/web-pkg/tests/unit/components/CreateLinkModal.spec.ts b/packages/web-pkg/tests/unit/components/CreateLinkModal.spec.ts index 2f816716553..90193d401b2 100644 --- a/packages/web-pkg/tests/unit/components/CreateLinkModal.spec.ts +++ b/packages/web-pkg/tests/unit/components/CreateLinkModal.spec.ts @@ -126,28 +126,38 @@ describe('CreateLinkModal', () => { }) describe('method "confirm"', () => { it('shows an error if a password is enforced but empty', async () => { + jest.spyOn(console, 'error').mockImplementation(undefined) const { wrapper } = getWrapper({ passwordEnforced: true }) - await wrapper.find(selectors.confirmBtn).trigger('click') + try { + await wrapper.vm.onConfirm() + } catch (error) {} + expect(wrapper.vm.password.error).toBeDefined() }) it('does not create links when the password policy is not fulfilled', async () => { - const { wrapper, storeOptions } = getWrapper({ passwordPolicyFulfilled: false }) - await wrapper.find(selectors.confirmBtn).trigger('click') - expect(storeOptions.actions.hideModal).not.toHaveBeenCalled() + jest.spyOn(console, 'error').mockImplementation(undefined) + const callbackFn = jest.fn() + const { wrapper } = getWrapper({ passwordPolicyFulfilled: false, callbackFn }) + try { + await wrapper.vm.onConfirm() + } catch (error) {} + + expect(callbackFn).not.toHaveBeenCalled() }) it('creates links for all resources', async () => { + const callbackFn = jest.fn() const resources = [mock