From df53cef3b78b4cdd849b0f95f24f0103ce597bc3 Mon Sep 17 00:00:00 2001 From: curo1305 Date: Tue, 16 Jun 2026 21:33:57 +0200 Subject: [PATCH] feat(11-04): mobile-safe modals and form baseline verification - Add max-h-[90vh] overflow-y-auto to ShareModal, CloudCredentialModal, FolderDeleteModal, and DocumentView cloud-delete modal panels - Add responsive px-4 sm:px-6 to DocumentPreviewModal header for narrow viewports - Add data-test attributes to all modal panels for testability - Confirm @tailwindcss/forms active in tailwind.config.js (no drift found) - Audit forms: focus:outline-none focus:ring-2 pattern is consistent throughout - Add 4 test files covering mobile-safe modal classes and form baseline: ShareModal.mobile.test.js, CloudCredentialModal.mobile.test.js, FolderDeleteModal.mobile.test.js, DocumentPreviewModal.mobile.test.js VISUAL-02, RESP-04 --- .../components/cloud/CloudCredentialModal.vue | 2 +- .../CloudCredentialModal.mobile.test.js | 52 +++++++++++ .../documents/DocumentPreviewModal.vue | 3 +- .../DocumentPreviewModal.mobile.test.js | 58 ++++++++++++ .../components/folders/FolderDeleteModal.vue | 3 +- .../FolderDeleteModal.mobile.test.js | 49 ++++++++++ .../src/components/sharing/ShareModal.vue | 3 +- .../__tests__/ShareModal.mobile.test.js | 89 +++++++++++++++++++ frontend/src/views/DocumentView.vue | 3 +- 9 files changed, 257 insertions(+), 5 deletions(-) create mode 100644 frontend/src/components/cloud/__tests__/CloudCredentialModal.mobile.test.js create mode 100644 frontend/src/components/documents/__tests__/DocumentPreviewModal.mobile.test.js create mode 100644 frontend/src/components/folders/__tests__/FolderDeleteModal.mobile.test.js create mode 100644 frontend/src/components/sharing/__tests__/ShareModal.mobile.test.js diff --git a/frontend/src/components/cloud/CloudCredentialModal.vue b/frontend/src/components/cloud/CloudCredentialModal.vue index c230a89..c8672af 100644 --- a/frontend/src/components/cloud/CloudCredentialModal.vue +++ b/frontend/src/components/cloud/CloudCredentialModal.vue @@ -5,7 +5,7 @@ @click.self="handleOverlayClick" @keydown.escape.window="handleEscape" > -
+

diff --git a/frontend/src/components/cloud/__tests__/CloudCredentialModal.mobile.test.js b/frontend/src/components/cloud/__tests__/CloudCredentialModal.mobile.test.js new file mode 100644 index 0000000..4e88ff0 --- /dev/null +++ b/frontend/src/components/cloud/__tests__/CloudCredentialModal.mobile.test.js @@ -0,0 +1,52 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest' +import { mount } from '@vue/test-utils' +import { createPinia, setActivePinia } from 'pinia' + +vi.mock('../../../api/client.js', () => ({ + getConnectionConfig: vi.fn().mockResolvedValue({ connection_username: '', server_url: '' }), + connectWebDav: vi.fn(), +})) + +import CloudCredentialModal from '../CloudCredentialModal.vue' + +const globalStubs = { + AppIcon: true, +} + +const testProvider = { key: 'webdav', label: 'WebDAV' } + +beforeEach(() => { + setActivePinia(createPinia()) + vi.clearAllMocks() +}) + +describe('RESP-04: CloudCredentialModal mobile-safe panel', () => { + it('panel has max-h-[90vh] class for mobile scroll safety', () => { + const wrapper = mount(CloudCredentialModal, { + props: { show: true, provider: testProvider, existing: null }, + global: { stubs: globalStubs }, + }) + const panel = wrapper.find('[data-test="cloud-credential-modal-panel"]') + expect(panel.exists()).toBe(true) + expect(panel.classes()).toContain('max-h-[90vh]') + }) + + it('panel has overflow-y-auto class for mobile scroll', () => { + const wrapper = mount(CloudCredentialModal, { + props: { show: true, provider: testProvider, existing: null }, + global: { stubs: globalStubs }, + }) + const panel = wrapper.find('[data-test="cloud-credential-modal-panel"]') + expect(panel.classes()).toContain('overflow-y-auto') + }) + + it('panel not rendered when show=false', () => { + const wrapper = mount(CloudCredentialModal, { + props: { show: false, provider: testProvider, existing: null }, + global: { stubs: globalStubs }, + }) + // When show=false the v-if hides the entire overlay + const panel = wrapper.find('[data-test="cloud-credential-modal-panel"]') + expect(panel.exists()).toBe(false) + }) +}) diff --git a/frontend/src/components/documents/DocumentPreviewModal.vue b/frontend/src/components/documents/DocumentPreviewModal.vue index 903d3df..0699569 100644 --- a/frontend/src/components/documents/DocumentPreviewModal.vue +++ b/frontend/src/components/documents/DocumentPreviewModal.vue @@ -2,6 +2,7 @@