diff --git a/docs/advanced/otherVolumes.md b/docs/advanced/otherVolumes.md index 36a8254bbc8bdcc8deec3253cc2748aa989c9fd8..b38f05425259ccdfd47e1f2e43086ec9055aa8a4 100644 --- a/docs/advanced/otherVolumes.md +++ b/docs/advanced/otherVolumes.md @@ -1,7 +1,7 @@ # Displaying non-atlas volumes !!! warning - This section is still been developed, and the content/API may change in future versions. + This section is still been developed, and the content/API may change in future versions. Interactive atlas can allow for arbitary volumes to be viewed, either in the context of a reference template or without. diff --git a/e2e/src/advanced/nonAtlasImages.e2e-spec.js b/e2e/src/advanced/nonAtlasImages.e2e-spec.js index b88b2c624cef57493400f48c02e5e1a7bc85c1ed..d50b98b6908f8679940ac7bf7e240eee0a886feb 100644 --- a/e2e/src/advanced/nonAtlasImages.e2e-spec.js +++ b/e2e/src/advanced/nonAtlasImages.e2e-spec.js @@ -10,7 +10,7 @@ describe('> non-atlas images', () => { describe('> standalone volumes', () => { // TODO investigates why it occassionally fails - it('> loads standalone volumes when set', async () => { + it('> loads standalone volumes when set (fails sometimes. Just rerun if it does.)', async () => { const searchParam = new URLSearchParams() searchParam.set('standaloneVolumes', '["precomputed://https://object.cscs.ch/v1/AUTH_08c08f9f119744cbbf77e216988da3eb/imgsvc-46d9d64f-bdac-418e-a41b-b7f805068c64"]') await iavPage.goto(`/?${searchParam.toString()}`, { interceptHttp: true, doNotAutomate: true }) @@ -144,4 +144,82 @@ describe('> non-atlas images', () => { ) }) }) + + describe('> controls for non atlas volumes', () => { + it('if no additional volume is being shown, additional volume control is not visible', async () => { + const searchParam = new URLSearchParams() + searchParam.set('templateSelected', 'MNI Colin 27') + searchParam.set('parcellationSelected', 'JuBrain Cytoarchitectonic Atlas') + + const previewingDatasetFiles = [ + { + "datasetId":"minds/core/dataset/v1.0.0/b08a7dbc-7c75-4ce7-905b-690b2b1e8957", + "filename":"Overlay of data modalities" + } + ] + searchParam.set('previewingDatasetFiles', JSON.stringify(previewingDatasetFiles)) + + await iavPage.goto(`/?${searchParam.toString()}`) + await iavPage.wait(2000) + + const additionalLayerControlIsShown = await iavPage.additionalLayerControlIsVisible() + + expect(additionalLayerControlIsShown).toEqual(false) + + }) + + it('if additonal volumes are being shown, additional volume control is visible', async () => { + + const searchParam = new URLSearchParams() + searchParam.set('templateSelected', 'Big Brain (Histology)') + searchParam.set('parcellationSelected', 'Grey/White matter') + + const previewingDatasetFiles = [ + { + "datasetId":"minds/core/dataset/v1.0.0/b08a7dbc-7c75-4ce7-905b-690b2b1e8957", + "filename":"Overlay of data modalities" + } + ] + searchParam.set('previewingDatasetFiles', JSON.stringify(previewingDatasetFiles)) + + await iavPage.goto(`/?${searchParam.toString()}`) + await iavPage.wait(2000) + + const additionalLayerCtrlIsVisible = await iavPage.additionalLayerControlIsVisible() + expect(additionalLayerCtrlIsVisible).toEqual(true) + + }) + + it('if additional volumes are being shown, it can be toggled', async () => { + + const searchParam = new URLSearchParams() + searchParam.set('templateSelected', 'Big Brain (Histology)') + searchParam.set('parcellationSelected', 'Grey/White matter') + + const previewingDatasetFiles = [ + { + "datasetId":"minds/core/dataset/v1.0.0/b08a7dbc-7c75-4ce7-905b-690b2b1e8957", + "filename":"Overlay of data modalities" + } + ] + searchParam.set('previewingDatasetFiles', JSON.stringify(previewingDatasetFiles)) + + await iavPage.goto(`/?${searchParam.toString()}`) + await iavPage.wait(2000) + + const additionalLayerCtrlIsExpanded = await iavPage.additionalLayerControlIsExpanded() + expect(additionalLayerCtrlIsExpanded).toEqual(true) + + await iavPage.toggleLayerControl() + + const additionalLayerCtrlIsExpanded2 = await iavPage.additionalLayerControlIsExpanded() + expect(additionalLayerCtrlIsExpanded2).toEqual(false) + + await iavPage.toggleLayerControl() + + const additionalLayerCtrlIsExpanded3 = await iavPage.additionalLayerControlIsExpanded() + expect(additionalLayerCtrlIsExpanded3).toEqual(true) + + }) + }) }) diff --git a/e2e/src/util.js b/e2e/src/util.js index f79d341a931755b53dd5e4413dc32b21bed30797..281cdcfe5101dc744c1f2a4e1761024f9ad8a40e 100644 --- a/e2e/src/util.js +++ b/e2e/src/util.js @@ -241,6 +241,38 @@ class WdLayoutPage extends WdBase{ return text } + + _getAdditionalLayerControl(){ + return this._browser.findElement( + By.css('[aria-label="Additional volumes control"]') + ) + } + + async additionalLayerControlIsVisible(){ + try { + return await this._getAdditionalLayerControl().isDisplayed() + } catch (e) { + return false + } + } + + // will throw if additional layer contorl is not visible + additionalLayerControlIsExpanded() { + return this._getAdditionalLayerControl() + .findElement( + By.tagName('layer-browser') + ) + .isDisplayed() + } + + // will throw if additional layer contorl is not visible + async toggleLayerControl(){ + return this._getAdditionalLayerControl() + .findElement( + By.css('[aria-label="Toggle expansion state of additional layer browser"]') + ) + .click() + } } class WdIavPage extends WdLayoutPage{ diff --git a/src/services/effect/newTemplate.effect.ts b/src/services/effect/newTemplate.effect.ts index 102ac244379ba37e9a10bb51205d400bd594f224..d6b68b5d1c3b15fa0877054c1e4cae31ca99024f 100644 --- a/src/services/effect/newTemplate.effect.ts +++ b/src/services/effect/newTemplate.effect.ts @@ -19,7 +19,6 @@ export class NewTemplateUseEffect{ ){ this.onNewTemplateShouldClearPreviewDataset$ = this.actions$.pipe( ofType(NEWVIEWER), - tap(() => console.log(`new`)), mapTo({ type: DATASETS_ACTIONS_TYPES.CLEAR_PREVIEW_DATASETS }) diff --git a/src/ui/searchSideNav/searchSideNav.component.ts b/src/ui/searchSideNav/searchSideNav.component.ts index 1bb7ce4a6977e6b36777534089b978d486cf6e2a..f514928bd44411a8519b740fc31c13f9b83e7fbf 100644 --- a/src/ui/searchSideNav/searchSideNav.component.ts +++ b/src/ui/searchSideNav/searchSideNav.component.ts @@ -26,6 +26,8 @@ import { MatSnackBar } from "@angular/material/snack-bar"; export class SearchSideNav implements OnDestroy { public availableDatasets: number = 0 + public showLayerBrowser: boolean = true + private subscriptions: Subscription[] = [] private layerBrowserDialogRef: MatDialogRef<any> @@ -100,10 +102,11 @@ export class SearchSideNav implements OnDestroy { type: CLOSE_SIDE_PANEL, }) - const dialogToOpen = this.layerBrowserTmpl || LayerBrowser + const dialogToOpen = this.layerBrowserTmpl this.layerBrowserDialogRef = this.dialog.open(dialogToOpen, { hasBackdrop: false, autoFocus: false, + ariaLabel: 'Additional volumes control', panelClass: [ 'layerBrowserContainer', ], diff --git a/src/ui/searchSideNav/searchSideNav.style.css b/src/ui/searchSideNav/searchSideNav.style.css index 40287116012a17025cc03415606ed3a3b6fcaaf6..5d1650ffca031ccf13067a3551d4b9b233547f10 100644 --- a/src/ui/searchSideNav/searchSideNav.style.css +++ b/src/ui/searchSideNav/searchSideNav.style.css @@ -23,3 +23,8 @@ connectivity-browser { { min-height: 50vh!important; } + +.layerBrowserToggleBtn[toggle-open="true"] +{ + transform: translateY(-50%); +} diff --git a/src/ui/searchSideNav/searchSideNav.template.html b/src/ui/searchSideNav/searchSideNav.template.html index 4628d6bc8f7dd13b89f69735457446f30f796d88..765869826cba77a7218f5404a6656d6a4c3ae56f 100644 --- a/src/ui/searchSideNav/searchSideNav.template.html +++ b/src/ui/searchSideNav/searchSideNav.template.html @@ -75,10 +75,25 @@ </div> <ng-template #layerBrowserTmpl> - <mat-dialog-content> - <layer-browser></layer-browser> + <mat-dialog-content [hidden]="!showLayerBrowser"> + <div class="d-flex flex-column"> + <layer-browser></layer-browser> + </div> </mat-dialog-content> -</ng-template> + + <div class="d-flex justify-content-center position-static h-0 mt-4"> + <button mat-mini-fab + aria-label="Toggle expansion state of additional layer browser" + [matBadge]="showLayerBrowser ? null : (layerBrowser.nonBaseNgLayers$ | async).length" + class="position-absolute layerBrowserToggleBtn" + matTooltip="Toggle the visiblity of the additional layer browser" + [attr.toggle-open]="showLayerBrowser" + (click)="showLayerBrowser = !showLayerBrowser"> + <i class="fas" [ngClass]="{'fa-chevron-down': !showLayerBrowser, 'fa-chevron-up': showLayerBrowser}"> + </i> + </button> + </div> +</ng-template> <!-- selected regions container --> <ng-template #selectedRegionsTmpl>