diff --git a/__tests__/component/Viewer.spec.ts b/__tests__/component/Viewer.spec.ts index aaa6fc9..310e9fe 100644 --- a/__tests__/component/Viewer.spec.ts +++ b/__tests__/component/Viewer.spec.ts @@ -46,6 +46,17 @@ describe('Viewer.open()', () => { expect(modalProps().show).toBe(true) }) + it('titles the modal with the display name when the server gives one', async () => { + const { vm, wrapper, modalName } = mountViewer([imageHandler()]) + // A version of a file is served under its version id but reads as a date + const version = makeFile({ basename: '1737542400', mime: 'image/jpeg', displayname: '22 January 2025, 11:20:00' }) + + await vm.open([version], version) + await wrapper.vm.$nextTick() + + expect(modalName()).toBe('22 January 2025, 11:20:00') + }) + it('filters currentFileList to files of the same handler group', async () => { const pdfHandler = makeHandler({ id: 'pdf', @@ -305,6 +316,30 @@ describe('Viewer action submenu', () => { }) }) +describe('Viewer sidebar', () => { + const sidebarButton = (wrapper: ReturnType['wrapper']) => wrapper.findAll('.nc-action-button-stub').find((button) => button.text().includes('Open sidebar')) + + it('offers the sidebar for an ordinary file', async () => { + const { vm, wrapper } = mountViewer([imageHandler()]) + const f1 = makeFile({ mime: 'image/jpeg' }) + + await vm.open([f1], f1) + await wrapper.vm.$nextTick() + + expect(sidebarButton(wrapper)).toBeTruthy() + }) + + it('does not offer it for a file the sidebar cannot resolve', async () => { + const { vm, wrapper } = mountViewer([imageHandler()]) + const version = makeFile({ mime: 'image/jpeg' }) + + await vm.open([version], version, { enableSidebar: false }) + await wrapper.vm.$nextTick() + + expect(sidebarButton(wrapper)).toBeUndefined() + }) +}) + describe('Viewer loadMore', () => { it('appends files returned by loadMore when reaching the last item', async () => { const f1 = makeFile({ basename: 'f1.jpg', mime: 'image/jpeg' }) diff --git a/__tests__/defaults.spec.ts b/__tests__/defaults.spec.ts index 94cbba2..542ca7e 100644 --- a/__tests__/defaults.spec.ts +++ b/__tests__/defaults.spec.ts @@ -20,6 +20,18 @@ describe('default handlers', () => { expect([...scope.handlers!.keys()].sort()).toEqual(['audios', 'images', 'videos']) }) + it('can be reached by importing one of the handler modules first', async () => { + // Entering the graph anywhere but the entry used to hit the entry + // mid-evaluation, and the handler it was about to register was not + // initialised yet + vi.resetModules() + const { registerImageHandler } = await import('../lib/models/images.ts') + + registerImageHandler() + + expect(scope.handlers!.has('images')).toBe(true) + }) + it('do not complain about themselves when asked for explicitly', async () => { const { registerDefaultHandlers } = await importPackage() const { logger } = await import('../lib/services/logger.ts') diff --git a/__tests__/factories.ts b/__tests__/factories.ts index f0b11db..adba976 100644 --- a/__tests__/factories.ts +++ b/__tests__/factories.ts @@ -19,6 +19,8 @@ interface MakeFileOptions { mtime?: Date size?: number root?: string + /** What the server calls the file, when that differs from its name */ + displayname?: string } /** @@ -41,6 +43,7 @@ export function makeFile(options: MakeFileOptions = {}): File { // A dav node reports whatever it was given, and a file nobody can // read is not what these tests are about unless they say so permissions: options.permissions ?? Permission.ALL, + displayname: options.displayname, }) } diff --git a/lib/components/ImageEditor.vue b/lib/components/ImageEditor.vue index 529ba04..ed72568 100644 --- a/lib/components/ImageEditor.vue +++ b/lib/components/ImageEditor.vue @@ -5,7 +5,7 @@