From 072feb2f6cc3d725a272ba616bd512bfa76e5619 Mon Sep 17 00:00:00 2001 From: lbiedinger Date: Fri, 20 Sep 2024 13:52:38 +0200 Subject: [PATCH 01/19] thumbnails for item media in new IIIF layout --- .../components/item/ItemMediaPresentation.vue | 46 +++-- .../components/item/ItemMediaThumbnail.vue | 170 ++++++++++++++++++ .../components/item/ItemMediaThumbnails.vue | 78 +++++++- .../item/ItemMediaThumbnail.spec.js | 37 ++++ .../item/ItemMediaThumbnails.spec.js | 37 ++++ 5 files changed, 341 insertions(+), 27 deletions(-) create mode 100644 packages/portal/src/components/item/ItemMediaThumbnail.vue create mode 100644 packages/portal/tests/unit/components/item/ItemMediaThumbnail.spec.js create mode 100644 packages/portal/tests/unit/components/item/ItemMediaThumbnails.spec.js diff --git a/packages/portal/src/components/item/ItemMediaPresentation.vue b/packages/portal/src/components/item/ItemMediaPresentation.vue index 6e193cd04c..8c430cf56c 100644 --- a/packages/portal/src/components/item/ItemMediaPresentation.vue +++ b/packages/portal/src/components/item/ItemMediaPresentation.vue @@ -1,10 +1,10 @@ @@ -151,7 +159,8 @@ annotationPage: null, presentation: null, page: 1, - showSidebar: null + showSidebar: null, + showThumbnails: true }; }, @@ -178,12 +187,8 @@ return this.presentation?.resources?.length || 0; }, - thumbnail() { - return this.thumbnails[this.page - 1]; - }, - - thumbnails() { - return this.presentation?.resources.map((resource) => resource.thumbnails?.(this.$nuxt.context)?.small) || []; + thumbnailResources() { + return this.presentation?.resources || []; } }, @@ -192,11 +197,6 @@ }, methods: { - handleClickThumbnail(index) { - const page = index + 1; - this.$router.push({ ...this.$route, query: { ...this.$route.query, page } }); - }, - onClickAnno(anno) { console.log('onClickAnno', anno); // const layer = this.map.getLayers()[0]; @@ -249,4 +249,12 @@ diff --git a/packages/portal/src/components/item/ItemMediaThumbnail.vue b/packages/portal/src/components/item/ItemMediaThumbnail.vue new file mode 100644 index 0000000000..3fc4629233 --- /dev/null +++ b/packages/portal/src/components/item/ItemMediaThumbnail.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/packages/portal/src/components/item/ItemMediaThumbnails.vue b/packages/portal/src/components/item/ItemMediaThumbnails.vue index 2d08b5f919..76237d94dd 100644 --- a/packages/portal/src/components/item/ItemMediaThumbnails.vue +++ b/packages/portal/src/components/item/ItemMediaThumbnails.vue @@ -1,32 +1,94 @@ + + diff --git a/packages/portal/tests/unit/components/item/ItemMediaThumbnail.spec.js b/packages/portal/tests/unit/components/item/ItemMediaThumbnail.spec.js new file mode 100644 index 0000000000..f5d963be15 --- /dev/null +++ b/packages/portal/tests/unit/components/item/ItemMediaThumbnail.spec.js @@ -0,0 +1,37 @@ +import { createLocalVue } from '@vue/test-utils'; +import { shallowMountNuxt } from '../../utils'; +import ItemMediaThumbnail from '@/components/item/ItemMediaThumbnail'; +// import sinon from 'sinon'; + +const localVue = createLocalVue(); + +const factory = ({ propsData = {}, mocks = {} } = {}) => shallowMountNuxt(ItemMediaThumbnail, { + localVue, + attachTo: document.body, + propsData, + mocks: { + $route: { query: {} }, + $t: (key) => key, + ...mocks + } +}); + +const props = { + edmType: 'image', + offset: 0, + resource: { + edmType: '' + } +}; + +describe('components/item/ItemMediaThumbnail', () => { + describe('template', () => { + it('renders a item media thumbnail', () => { + const wrapper = factory({ propsData: props }); + + const thumbnail = wrapper.find('.item-media-thumbnail'); + + expect(thumbnail.isVisible()).toBe(true); + }); + }); +}); diff --git a/packages/portal/tests/unit/components/item/ItemMediaThumbnails.spec.js b/packages/portal/tests/unit/components/item/ItemMediaThumbnails.spec.js new file mode 100644 index 0000000000..cb7b26264c --- /dev/null +++ b/packages/portal/tests/unit/components/item/ItemMediaThumbnails.spec.js @@ -0,0 +1,37 @@ +import { createLocalVue } from '@vue/test-utils'; +import { shallowMountNuxt } from '../../utils'; +import ItemMediaThumbnails from '@/components/item/ItemMediaThumbnails'; +// import sinon from 'sinon'; + +const localVue = createLocalVue(); + +const factory = ({ propsData = {}, mocks = {} } = {}) => shallowMountNuxt(ItemMediaThumbnails, { + localVue, + attachTo: document.body, + propsData, + mocks: { + $route: { query: {} }, + $t: (key) => key, + ...mocks + } +}); + +const props = { + edmType: 'image', + selectedIndex: 0, + resources: [{ + edmType: '' + }] +}; + +describe('components/item/ItemMediaThumbnail', () => { + describe('template', () => { + it('renders a item media thumbnail', () => { + const wrapper = factory({ propsData: props }); + + const thumbnail = wrapper.find('.media-thumbnails'); + + expect(thumbnail.isVisible()).toBe(true); + }); + }); +}); From fa1448dd14612725708cbbcaf6b6b2cf9c128dc4 Mon Sep 17 00:00:00 2001 From: lbiedinger Date: Fri, 20 Sep 2024 14:59:19 +0200 Subject: [PATCH 02/19] style show/hide thumbnails button --- .../components/item/ItemMediaPresentation.vue | 19 +++++++++++++------ .../components/item/ItemMediaThumbnail.vue | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/portal/src/components/item/ItemMediaPresentation.vue b/packages/portal/src/components/item/ItemMediaPresentation.vue index 8c430cf56c..d4f784e529 100644 --- a/packages/portal/src/components/item/ItemMediaPresentation.vue +++ b/packages/portal/src/components/item/ItemMediaPresentation.vue @@ -86,13 +86,12 @@ :total-results="resourceCount" class="pagination mx-auto" /> - - {{ showThumbnails ? 'Hide thumbnails' : 'Show thumbnails' }} - + /> - +