diff --git a/deploy/csp/index.js b/deploy/csp/index.js index 1d67da419baa8f3c60bb7e93893ce5939f9d5ee2..e976dd482d2845490dd24bebef212ea1ab0aeb17 100644 --- a/deploy/csp/index.js +++ b/deploy/csp/index.js @@ -115,7 +115,7 @@ module.exports = { 'https://unpkg.com/d3@6.2.0/', // required for preview component 'https://unpkg.com/mathjax@3.1.2/', // math jax 'https://unpkg.com/three-surfer@0.0.13/dist/bundle.js', // for threeSurfer (freesurfer support in browser) - 'https://unpkg.com/ng-layer-tune@0.0.6/dist/ng-layer-tune/', // needed for ng layer control + 'https://unpkg.com/ng-layer-tune@0.0.12/dist/ng-layer-tune/', // needed for ng layer control 'https://unpkg.com/hbp-connectivity-component@0.6.6/', // needed for connectivity component (req, res) => res.locals.nonce ? `'nonce-${res.locals.nonce}'` : null, ...SCRIPT_SRC, diff --git a/docs/releases/v2.11.1.md b/docs/releases/v2.11.1.md index cd89866c729578f4e11a82420342cec75c9d1b34..7c187df69ab20e2bf1aeb6b1606076fc9cfe7367 100644 --- a/docs/releases/v2.11.1.md +++ b/docs/releases/v2.11.1.md @@ -4,6 +4,7 @@ - Allow point assignment result to be sorted - Allow point assignment result to be downloaded as csv +- Informs user when atlas download should be occurring, and check popup blocker ## Bugfixes @@ -13,4 +14,5 @@ - Bump siibra-api version dependency. Remove guard for feature type query restrictions - Removed unused components -- Tweaked context menu, showing on hover effects \ No newline at end of file +- Tweaked context menu, showing on hover effects +- now also attempts to fetch `transform.json` when external layer is populated diff --git a/src/atlas-download/atlas-download.directive.ts b/src/atlas-download/atlas-download.directive.ts index ce873301181fa39c1975848bd4a76de9b09adbf4..9b2ba98268b8f52cebec05803ca637a0d75e2353 100644 --- a/src/atlas-download/atlas-download.directive.ts +++ b/src/atlas-download/atlas-download.directive.ts @@ -1,4 +1,5 @@ import { Directive, HostListener } from '@angular/core'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { Store, select } from '@ngrx/store'; import { Subject, concat, of } from 'rxjs'; import { distinctUntilChanged, shareReplay, take } from 'rxjs/operators'; @@ -70,6 +71,7 @@ export class AtlasDownloadDirective { */ window.open(`${endpoint}/atlas_download/${task_id}/download`, "_blank") this.#busy$.next(false) + this.snackbar.open(`Download starting. If it has not, please check your browser's popup blocker.`, 'Dismiss') } catch (e) { this.#busy$.next(false) this.#error$.next(e.toString()) @@ -89,6 +91,6 @@ export class AtlasDownloadDirective { #error$ = new Subject<string>() error$ = this.#error$.pipe() - constructor(private store: Store<MainState>) { } + constructor(private store: Store<MainState>, private snackbar: MatSnackBar) { } } diff --git a/src/atlas-download/atlas-download.module.ts b/src/atlas-download/atlas-download.module.ts index b4181a9cc0526254f2cabd6fbe1aa7b9894acfc8..910154cb4bce732b351da2a27738d85cab6a275a 100644 --- a/src/atlas-download/atlas-download.module.ts +++ b/src/atlas-download/atlas-download.module.ts @@ -1,6 +1,7 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { AtlasDownloadDirective } from './atlas-download.directive'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; @NgModule({ @@ -9,6 +10,7 @@ import { AtlasDownloadDirective } from './atlas-download.directive'; ], imports: [ CommonModule, + MatSnackBarModule, ], exports: [ AtlasDownloadDirective diff --git a/src/atlasComponents/sapiViews/volumes/point-assignment/point-assignment.component.ts b/src/atlasComponents/sapiViews/volumes/point-assignment/point-assignment.component.ts index 46377dac685aab4db567a7efc318d032a8af305d..90cf9b9ed7aaca875eec919e4a718e6a6ef66898 100644 --- a/src/atlasComponents/sapiViews/volumes/point-assignment/point-assignment.component.ts +++ b/src/atlasComponents/sapiViews/volumes/point-assignment/point-assignment.component.ts @@ -127,7 +127,7 @@ Data retrieved through siibra-api version \`${EXPECTED_SIIBRA_API_VERSION}\` Retrieval parameters: Point -- coord: ${pt.coordinates.map(v => v.value).join(',')} mm +- coord: ${pt.coordinates.map(v => v.value/1e6).join(',')} mm Parcellation - name: ${parc.name || parc.shortName} diff --git a/src/index.html b/src/index.html index 0f009f4f2d5ab33219754015cfc136a5c8758899..c1cef937495c9ed9218e6ec90326307b07a8816e 100644 --- a/src/index.html +++ b/src/index.html @@ -14,7 +14,7 @@ <script src="extra_js.js"></script> <script src="https://unpkg.com/kg-dataset-previewer@1.2.0/dist/kg-dataset-previewer/kg-dataset-previewer.js" defer></script> <script src="https://unpkg.com/three-surfer@0.0.13/dist/bundle.js" defer></script> - <script type="module" src="https://unpkg.com/ng-layer-tune@0.0.6/dist/ng-layer-tune/ng-layer-tune.esm.js"></script> + <script type="module" src="https://unpkg.com/ng-layer-tune@0.0.12/dist/ng-layer-tune/ng-layer-tune.esm.js"></script> <script type="module" src="https://unpkg.com/hbp-connectivity-component@0.6.6/dist/connectivity-component/connectivity-component.js" ></script> <script defer src="https://unpkg.com/mathjax@3.1.2/es5/tex-svg.js"></script> <script defer src="https://unpkg.com/d3@6.2.0/dist/d3.min.js"></script> diff --git a/src/ui/topMenu/topMenuCmp/topMenu.components.ts b/src/ui/topMenu/topMenuCmp/topMenu.components.ts index cf6922a353a041bd18b136ac7c1876dbc6e74c05..688da21160db6fef1fd93c1e95e17423cb627cbf 100644 --- a/src/ui/topMenu/topMenuCmp/topMenu.components.ts +++ b/src/ui/topMenu/topMenuCmp/topMenu.components.ts @@ -3,7 +3,6 @@ import { Component, Input, TemplateRef, - ViewChild, } from "@angular/core"; import { Observable } from "rxjs"; import { map } from "rxjs/operators"; diff --git a/src/ui/topMenu/topMenuCmp/topMenu.template.html b/src/ui/topMenu/topMenuCmp/topMenu.template.html index a33377a72f41a7126bd272754e3862651fd8b86a..c64c0dcee48ba00781195e882d4ffe17cd84e72d 100644 --- a/src/ui/topMenu/topMenuCmp/topMenu.template.html +++ b/src/ui/topMenu/topMenuCmp/topMenu.template.html @@ -22,7 +22,7 @@ <!-- pinned dataset --> <div iav-fab-speed-dial-child> - <ng-container *ngTemplateOutlet="pinnedDatasetBtnTmpl"> + <ng-container *ngTemplateOutlet="downloadAllTmpl"> </ng-container> </div> @@ -53,7 +53,7 @@ </ng-container> <!-- pinned dataset --> - <ng-container *ngTemplateOutlet="pinnedDatasetBtnTmpl"> + <ng-container *ngTemplateOutlet="downloadAllTmpl"> </ng-container> <!-- help one pager --> @@ -100,7 +100,7 @@ </ng-template> <!-- pinned dataset btn --> -<ng-template #pinnedDatasetBtnTmpl> +<ng-template #downloadAllTmpl> <div class="btnWrapper" [matTooltip]="(atlasDlDct.busy$| async) ? busyTxt : idleTxt" quick-tour diff --git a/src/viewerModule/nehuba/userLayers/service.ts b/src/viewerModule/nehuba/userLayers/service.ts index 042cc54851be1e31cf457926d81768dfcbc2a5a8..3fe9d0a7db656354ed6217ebd13a0fd0354deae4 100644 --- a/src/viewerModule/nehuba/userLayers/service.ts +++ b/src/viewerModule/nehuba/userLayers/service.ts @@ -1,8 +1,8 @@ import { Injectable, OnDestroy } from "@angular/core" import { MatDialog } from "@angular/material/dialog" import { select, Store } from "@ngrx/store" -import { concat, of, Subscription } from "rxjs" -import { pairwise } from "rxjs/operators" +import { concat, from, of, Subscription } from "rxjs" +import { catchError, map, pairwise, switchMap } from "rxjs/operators" import { linearTransform, TVALID_LINEAR_XFORM_DST, @@ -198,29 +198,48 @@ export class UserLayerService implements OnDestroy { ) { this.#subscription.push( concat( - of(null), - this.routerSvc.customRoute$.pipe(select((v) => v[OVERLAY_LAYER_KEY])) - ) - .pipe(pairwise()) - .subscribe(([prev, curr]) => { - if (prev) { - this.removeUserLayer(prev) + of(null as string), + this.routerSvc.customRoute$.pipe( + select(v => v[OVERLAY_LAYER_KEY]) + ) + ).pipe( + pairwise(), + switchMap(([prev, curr]) => { + /** + * for precomputed sources, check if transform.json exists. + * if so, try to fetch it, and set it as transform + */ + if (!curr) { + return of([prev, curr, null]) } - if (curr) { - this.addUserLayer( - curr, - { - filename: curr, - message: `Overlay layer populated in URL`, - }, - { - shader: getShader({ - colormap: EnumColorMapName.MAGMA, - }), - } - ) + if (!curr.startsWith("precomputed://")) { + return of([prev, curr, null]) } + return from(fetch(`${curr.replace('precomputed://', '')}/transform.json`).then(res => res.json())).pipe( + catchError(() => of([prev, curr, null])), + map(transform => [prev, curr, transform]) + ) }) + ).subscribe(([prev, curr, transform]) => { + if (prev) { + this.removeUserLayer(prev) + } + if (curr) { + this.addUserLayer( + curr, + { + filename: curr, + message: `Overlay layer populated in URL`, + }, + { + shader: getShader({ + colormap: EnumColorMapName.MAGMA, + }), + transform + } + ) + } + }) ) }