Skip to content

Commit 4c19877

Browse files
FrancescoMolinarovins01-4science
authored andcommitted
Merged in task/ux-plus-cris-2024_02_x/UXP-88 (pull request #60)
[UXP-88] adapt query param handling Approved-by: Vincenzo Mecca
2 parents 64dae85 + 6a928a1 commit 4c19877

4 files changed

Lines changed: 99 additions & 8 deletions

File tree

src/app/cris-layout/cris-layout-matrix/cris-layout-box-container/boxes/metadata/rendering-types/advanced-attachment/bitstream-attachment/attachment-render/types/iiif-toolbar/iiif-toolbar.component.spec.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@ import { of as observableOf } from 'rxjs';
1212

1313
import { AuthorizationDataService } from '../../../../../../../../../../../core/data/feature-authorization/authorization-data.service';
1414
import { buildPaginatedList } from '../../../../../../../../../../../core/data/paginated-list.model';
15+
import { Bitstream } from '../../../../../../../../../../../core/shared/bitstream.model';
1516
import { Item } from '../../../../../../../../../../../core/shared/item.model';
17+
import { MetadataValue } from '../../../../../../../../../../../core/shared/metadata.models';
1618
import { PageInfo } from '../../../../../../../../../../../core/shared/page-info.model';
1719
import { createRelationshipsObservable } from '../../../../../../../../../../../item-page/simple/item-types/shared/item.component.spec';
20+
import { MockBitstream1 } from '../../../../../../../../../../../shared/mocks/item.mock';
1821
import { NotificationsService } from '../../../../../../../../../../../shared/notifications/notifications.service';
1922
import { createSuccessfulRemoteDataObject$ } from '../../../../../../../../../../../shared/remote-data.utils';
2023
import { AuthorizationDataServiceStub } from '../../../../../../../../../../../shared/testing/authorization-service.stub';
@@ -26,6 +29,8 @@ describe('IiifToolbarComponent', () => {
2629
let fixture: ComponentFixture<IIIFToolbarComponent>;
2730
let translateService: TranslateService;
2831

32+
const mockBitstream: Bitstream = MockBitstream1;
33+
2934
const mockItem: Item = Object.assign(new Item(), {
3035
bundles: createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), [])),
3136
metadata: {
@@ -73,6 +78,7 @@ describe('IiifToolbarComponent', () => {
7378
fixture = TestBed.createComponent(IIIFToolbarComponent);
7479
component = fixture.componentInstance;
7580
component.item = mockItem;
81+
component.bitstream = mockBitstream;
7682
component.getObjectUrl = () => 'https://test-url.com';
7783
fixture.detectChanges();
7884

@@ -83,4 +89,31 @@ describe('IiifToolbarComponent', () => {
8389
it('should create', () => {
8490
expect(component).toBeTruthy();
8591
});
92+
93+
it('should get canvasId from metadata', () => {
94+
component.bitstream = Object.assign(new Bitstream(), mockBitstream, {
95+
metadata: {
96+
'bitstream.iiif.canvasid': [
97+
Object.assign(new MetadataValue(), {
98+
language: null,
99+
value: 'testCanvasId',
100+
authority: 'someAuthority',
101+
}),
102+
],
103+
},
104+
});
105+
const expectedQueryParams = {
106+
canvasId: 'testCanvasId',
107+
};
108+
component.ngOnInit();
109+
expect(component.queryParams).toEqual(expectedQueryParams);
110+
});
111+
112+
it('should get canvasId from uuid', () => {
113+
const expectedQueryParams = {
114+
canvasId: mockBitstream.uuid,
115+
};
116+
component.ngOnInit();
117+
expect(component.queryParams).toEqual(expectedQueryParams);
118+
});
86119
});

src/app/cris-layout/cris-layout-matrix/cris-layout-box-container/boxes/metadata/rendering-types/advanced-attachment/bitstream-attachment/attachment-render/types/iiif-toolbar/iiif-toolbar.component.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,10 @@ export class IIIFToolbarComponent implements OnInit {
118118
}
119119

120120
private getQueryParams() {
121-
return this.MD_BITSTREAMS_MAP
122-
.filter(({ metadata }) => this.bitstream?.metadata[`${metadata}`]?.length > 0)
123-
.map(({ param, metadata }) => ({ [`${param}`]: this.bitstream?.metadata[`${metadata}`][0]?.value }))
124-
.reduce((acc, curr) => ({ ...acc, ...curr }), {});
121+
return this.MD_BITSTREAMS_MAP.map(({ param, metadata }) => {
122+
const metadataValue = this.bitstream?.firstMetadataValue(metadata);
123+
return { [`${param}`]: metadataValue ?? this.bitstream.uuid };
124+
})[0];
125125
}
126126

127127
}

src/app/item-page/mirador-viewer/mirador-viewer.component.spec.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import {
77
TestBed,
88
waitForAsync,
99
} from '@angular/core/testing';
10+
import {
11+
ActivatedRoute,
12+
Router,
13+
} from '@angular/router';
1014
import {
1115
TranslateLoader,
1216
TranslateModule,
@@ -24,14 +28,17 @@ import {
2428
import { Item } from '../../core/shared/item.model';
2529
import { MetadataMap } from '../../core/shared/metadata.models';
2630
import { HostWindowService } from '../../shared/host-window.service';
31+
import { MockActivatedRoute } from '../../shared/mocks/active-router.mock';
2732
import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock';
2833
import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils';
34+
import { RouterStub } from '../../shared/testing/router.stub';
2935
import { createPaginatedList } from '../../shared/testing/utils.test';
3036
import { createRelationshipsObservable } from '../simple/item-types/shared/item.component.spec';
3137
import { MiradorViewerComponent } from './mirador-viewer.component';
3238
import { MiradorViewerService } from './mirador-viewer.service';
3339

3440

41+
3542
function getItem(metadata: MetadataMap) {
3643
return Object.assign(new Item(), {
3744
bundles: createSuccessfulRemoteDataObject$(createPaginatedList([])),
@@ -72,6 +79,8 @@ describe('MiradorViewerComponent with search', () => {
7279
{ provide: HostWindowService, useValue: mockHostWindowService },
7380
{ provide: NativeWindowService, useValue: new NativeWindowRef() },
7481
{ provide: Location, useValue: {} },
82+
{ provide: Router, useClass: RouterStub },
83+
{ provide: ActivatedRoute, useValue: new MockActivatedRoute() },
7584
],
7685
schemas: [NO_ERRORS_SCHEMA],
7786
}).overrideComponent(MiradorViewerComponent, {
@@ -142,6 +151,8 @@ describe('MiradorViewerComponent with multiple images', () => {
142151
{ provide: HostWindowService, useValue: mockHostWindowService },
143152
{ provide: NativeWindowService, useValue: new NativeWindowRef() },
144153
{ provide: Location, useValue: {} },
154+
{ provide: Router, useClass: RouterStub },
155+
{ provide: ActivatedRoute, useValue: new MockActivatedRoute() },
145156
],
146157
schemas: [NO_ERRORS_SCHEMA],
147158
}).overrideComponent(MiradorViewerComponent, {
@@ -209,6 +220,8 @@ describe('MiradorViewerComponent with a single image', () => {
209220
{ provide: HostWindowService, useValue: mockHostWindowService },
210221
{ provide: NativeWindowService, useValue: new NativeWindowRef() },
211222
{ provide: Location, useValue: {} },
223+
{ provide: Router, useClass: RouterStub },
224+
{ provide: ActivatedRoute, useValue: new MockActivatedRoute() },
212225
],
213226
schemas: [NO_ERRORS_SCHEMA],
214227
}).overrideComponent(MiradorViewerComponent, {
@@ -259,15 +272,17 @@ describe('MiradorViewerComponent on browser in prod mode', () => {
259272
},
260273
}),
261274
MiradorViewerComponent,
262-
VarDirective,
263275
SafeUrlPipe,
276+
VarDirective,
264277
],
265278
providers: [
266279
{ provide: BitstreamDataService, useValue: {} },
267280
{ provide: BundleDataService, useValue: {} },
268281
{ provide: HostWindowService, useValue: mockHostWindowService },
269282
{ provide: NativeWindowService, useValue: new NativeWindowRef() },
270283
{ provide: Location, useValue: {} },
284+
{ provide: Router, useClass: RouterStub },
285+
{ provide: ActivatedRoute, useValue: new MockActivatedRoute() },
271286
{ provide: PLATFORM_ID, useValue: 'browser' },
272287
],
273288
schemas: [NO_ERRORS_SCHEMA],
@@ -330,6 +345,8 @@ describe('MiradorViewerComponent in development mode', () => {
330345
{ provide: HostWindowService, useValue: mockHostWindowService },
331346
{ provide: NativeWindowService, useValue: new NativeWindowRef() },
332347
{ provide: Location, useValue: {} },
348+
{ provide: Router, useClass: RouterStub },
349+
{ provide: ActivatedRoute, useValue: new MockActivatedRoute() },
333350
],
334351
},
335352
}).compileComponents();

src/app/item-page/mirador-viewer/mirador-viewer.component.ts

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,22 @@ import {
1414
PLATFORM_ID,
1515
} from '@angular/core';
1616
import { DomSanitizer } from '@angular/platform-browser';
17+
import {
18+
ActivatedRoute,
19+
Router,
20+
} from '@angular/router';
1721
import { TranslateModule } from '@ngx-translate/core';
1822
import {
1923
Observable,
2024
of,
25+
Subscription,
2126
} from 'rxjs';
2227
import {
28+
distinctUntilChanged,
2329
map,
2430
take,
2531
} from 'rxjs/operators';
2632
import { SafeUrlPipe } from 'src/app/shared/utils/safe-url-pipe';
27-
import { VarDirective } from 'src/app/shared/utils/var.directive';
2833

2934
import { environment } from '../../../environments/environment';
3035
import { BitstreamDataService } from '../../core/data/bitstream-data.service';
@@ -38,6 +43,7 @@ import {
3843
HostWindowService,
3944
WidthCategory,
4045
} from '../../shared/host-window.service';
46+
import { VarDirective } from '../../shared/utils/var.directive';
4147
import { MiradorViewerService } from './mirador-viewer.service';
4248

4349
const IFRAME_UPDATE_URL_MESSAGE = 'update-url';
@@ -108,17 +114,22 @@ export class MiradorViewerComponent implements OnInit, OnDestroy {
108114

109115
viewerMessage = 'Sorry, the Mirador viewer is not currently available in development mode.';
110116

117+
private readonly isInItemPage = environment.advancedAttachmentRendering.showViewerOnSameItemPage;
118+
119+
private readonly subs: Subscription[] = [];
120+
111121
constructor(
112122
private sanitizer: DomSanitizer,
113123
private viewerService: MiradorViewerService,
114124
private bitstreamDataService: BitstreamDataService,
115125
private bundleDataService: BundleDataService,
116126
private hostWindowService: HostWindowService,
117127
private location: Location,
128+
private route: ActivatedRoute,
129+
private router: Router,
118130
@Inject(PLATFORM_ID) private platformId: any,
119131
@Inject(NativeWindowService) protected _window: NativeWindowRef,
120132
) {
121-
122133
}
123134

124135
/**
@@ -206,14 +217,18 @@ export class MiradorViewerComponent implements OnInit, OnDestroy {
206217
}),
207218
);
208219
}
220+
221+
if (this.isInItemPage) {
222+
this.reloadIframeOnUrlChange();
223+
}
209224
}
210225
}
211226

212227
ngOnDestroy(): void {
213228
this._window.nativeWindow.removeEventListener('message', this.iframeMessageListener);
229+
this.subs.forEach((sub) => sub.unsubscribe());
214230
}
215231

216-
217232
iframeMessageListener = (event: MessageEvent) => {
218233
const data: IFrameMessageData = event.data;
219234

@@ -231,4 +246,30 @@ export class MiradorViewerComponent implements OnInit, OnDestroy {
231246
this.location.replaceState(newPathWithQuery);
232247
}
233248
};
249+
250+
private reloadIframeOnUrlChange(): void {
251+
this.subs.push(
252+
this.route.queryParams.pipe(distinctUntilChanged()).subscribe(params => {
253+
const canvasId = params.canvasId;
254+
const canvasIndex = params.canvasIndex;
255+
256+
let shouldReload = false;
257+
258+
if (canvasId && canvasId !== this.canvasId) {
259+
this.canvasId = canvasId;
260+
shouldReload = true;
261+
}
262+
263+
if (canvasIndex && canvasIndex !== this.canvasIndex) {
264+
this.canvasIndex = canvasIndex;
265+
shouldReload = true;
266+
}
267+
268+
if (shouldReload) {
269+
// Regenerate iframe URL
270+
this.iframeViewerUrl = of('').pipe(map(() => this.getURL()));
271+
}
272+
}),
273+
);
274+
}
234275
}

0 commit comments

Comments
 (0)