diff --git a/Dockerfile b/Dockerfile
index 3b017144535e201d255259c3b28ec4833d965e0c..14bfaf866d6b8db773443eebc37b32f54300432d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -44,7 +44,7 @@ RUN npm i
RUN npm run build-aot
# gzipping container
-FROM ubuntu:20.10 as compressor
+FROM ubuntu:22.04 as compressor
RUN apt upgrade -y && apt update && apt install brotli
RUN mkdir /iv
diff --git a/angular.json b/angular.json
index 68b6001b6a2bd6b197221bcf374c11f378bff086..7d4fcb6a0e5a971095069f821056fcfab9ea3679 100644
--- a/angular.json
+++ b/angular.json
@@ -29,7 +29,6 @@
"tsConfig": "tsconfig.app.json",
"inlineStyleLanguage": "css",
"assets": [
- "src/favicon.ico",
"src/assets"
],
"styles": [
@@ -60,7 +59,11 @@
"inject": false,
"bundleName": "syntaxError"
},
-
+ {
+ "input": "third_party/extra_js.js",
+ "inject": false,
+ "bundleName": "extra_js"
+ },
{
"input": "third_party/vanilla_nehuba.js",
"inject": false,
diff --git a/docs/releases/v2.6.2.md b/docs/releases/v2.6.2.md
new file mode 100644
index 0000000000000000000000000000000000000000..9d9b9979bbdbdea7186d7c4f47d657de13a50bd8
--- /dev/null
+++ b/docs/releases/v2.6.2.md
@@ -0,0 +1,14 @@
+# v2.6.2
+
+## Bugfixes
+
+- Added indication when annotations were overwritten (partial fix to #1128)
+
+## Under the hood stuff
+
+- fixed some CSP issues
+- fixed favicons
+- added build debug messages
+- increment siibra-api version expectation
+- remove unused tests
+- update compressor image to 22.04
diff --git a/mkdocs.yml b/mkdocs.yml
index c241c4687813d1dae9989a231ac606140e24f39a..01b07eb3b9759e89e7fe1fb66ec0b143a1b97c04 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -40,6 +40,7 @@ pages:
- Fetching datasets: 'advanced/datasets.md'
- Display non-atlas volumes: 'advanced/otherVolumes.md'
- Release notes:
+ - v2.6.2: 'releases/v2.6.2.md'
- v2.6.1: 'releases/v2.6.1.md'
- v2.6.0: 'releases/v2.6.0.md'
- v2.5.8: 'releases/v2.5.8.md'
diff --git a/package-lock.json b/package-lock.json
index 0d10510326d468f9571ed0ab12e43a0c067312b8..b2554cd884ae060d9ad806ee0412d233e73a8b57 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "interactive-viewer",
- "version": "2.6.0",
+ "version": "2.6.2",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index ff98cdb21e037689121ec043556cb380faa6c6d5..70b5d8a08c41ad69cf3fbfd2c8d95a4523064619 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "interactive-viewer",
- "version": "2.6.1",
+ "version": "2.6.2",
"description": "HBP interactive atlas viewer. Integrating KG query, dataset previews & more. Based on humanbrainproject/nehuba & google/neuroglancer. Built with angular",
"scripts": {
"build-aot": "ng build && node ./third_party/matomo/processMatomo.js",
diff --git a/src/res/favicons/favicon-128-dark.svg b/src/assets/favicons/favicon-128-dark.svg
similarity index 100%
rename from src/res/favicons/favicon-128-dark.svg
rename to src/assets/favicons/favicon-128-dark.svg
diff --git a/src/res/favicons/favicon-128-light.png b/src/assets/favicons/favicon-128-light.png
similarity index 100%
rename from src/res/favicons/favicon-128-light.png
rename to src/assets/favicons/favicon-128-light.png
diff --git a/src/res/favicons/favicon-128-light.svg b/src/assets/favicons/favicon-128-light.svg
similarity index 100%
rename from src/res/favicons/favicon-128-light.svg
rename to src/assets/favicons/favicon-128-light.svg
diff --git a/src/atlasComponents/userAnnotations/tools/service.ts b/src/atlasComponents/userAnnotations/tools/service.ts
index dccdc60427a025b8c0e9fc974e03bc6e23f959ee..26fc809549b7f7fd59740539aaaec0e09ae66a4a 100644
--- a/src/atlasComponents/userAnnotations/tools/service.ts
+++ b/src/atlasComponents/userAnnotations/tools/service.ts
@@ -172,7 +172,7 @@ export class ModularUserAnnotationToolService implements OnDestroy{
const d = (arg as TCallback['message']['callArg'] & { type: any })
const { message, actionCallback, action = null } = d
this.snackbar.open(message, action, {
- duration: 3000
+ duration: 5000
}).afterDismissed().subscribe(({ dismissedByAction }) => {
if (dismissedByAction && actionCallback) actionCallback()
})
diff --git a/src/atlasComponents/userAnnotations/tools/type.ts b/src/atlasComponents/userAnnotations/tools/type.ts
index 8e33221b9bdf575fd3e2a196711236dce78b6d3b..763a58fcb59efc5aeee758008f2d5a6c710ac7c7 100644
--- a/src/atlasComponents/userAnnotations/tools/type.ts
+++ b/src/atlasComponents/userAnnotations/tools/type.ts
@@ -156,7 +156,23 @@ export abstract class AbsToolClass<T extends IAnnotationGeometry> {
public addAnnotation(geom: T) {
const found = this.managedAnnotations.find(ann => ann.id === geom.id)
- if (found) found.remove()
+ if (found) {
+ this.callback({
+ type: "message",
+ message: `Annotation with id ${found.id} already exist under the name ${found.name}. Replaced with ${geom.name}`,
+ action: "Learn more",
+ actionCallback: () => {
+ // see issue https://github.com/FZJ-INM1-BDA/siibra-explorer/issues/1128
+ const a = document.createElement("a")
+ a.href = "https://github.com/FZJ-INM1-BDA/siibra-explorer/issues/1128"
+ a.target = "_blank"
+ document.body.appendChild(a)
+ a.click()
+ document.body.removeChild(a)
+ }
+ })
+ found.remove()
+ }
const sub = geom.updateSignal$.subscribe(() => {
this.managedAnnotations$.next(this.managedAnnotations)
})
diff --git a/src/environments/parseEnv.js b/src/environments/parseEnv.js
index 84c95658b5b7466938de4d8c8f675950662b1162..dbd985314dc0c472611870143293d584b95e1e11 100644
--- a/src/environments/parseEnv.js
+++ b/src/environments/parseEnv.js
@@ -16,6 +16,18 @@ const main = async () => {
GIT_HASH = 'unknown hash',
EXPERIMENTAL_FEATURE_FLAG
} = process.env
+
+ console.log(`[parseEnv.js] parse envvar:`, {
+ BACKEND_URL,
+ DATASET_PREVIEW_URL,
+ STRICT_LOCAL,
+ MATOMO_URL,
+ MATOMO_ID,
+ BS_REST_URL,
+ VERSION,
+ GIT_HASH,
+ EXPERIMENTAL_FEATURE_FLAG,
+ })
const version = JSON.stringify(
VERSION || 'unknown version'
)
diff --git a/src/index.html b/src/index.html
index 8fd23a5d9027b1514df06dc820b766c9b0027af7..0928ef9d4a1e014365a41dedc3481534b08f68f5 100644
--- a/src/index.html
+++ b/src/index.html
@@ -10,15 +10,11 @@
<link rel="stylesheet" href="icons/iav-icons.css">
<link rel="stylesheet" href="main.css">
<link rel="stylesheet" href="version.css">
- <link rel="icon" type="image/png" href="res/favicons/favicon-128-light.png"/>
- <script>
- // disable zone patching of raf. This hampers NG performance significantly
- window['__Zone_disable_requestAnimationFrame'] = true
- </script>
- <script src="https://unpkg.com/kg-dataset-previewer@1.2.0/dist/kg-dataset-previewer/kg-dataset-previewer.js" defer>
- </script>
+ <link rel="icon" type="image/png" href="assets/favicons/favicon-128-light.png"/>
+ <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.10/dist/bundle.js" defer></script>
- <script type="module" src="https://unpkg.com/ng-layer-tune@0.0.4/dist/ng-layer-tune/ng-layer-tune.esm.js"></script>
+ <script type="module" src="https://unpkg.com/ng-layer-tune@0.0.5/dist/ng-layer-tune/ng-layer-tune.esm.js"></script>
<title>Interactive Atlas Viewer</title>
</head>
diff --git a/src/main-common.ts b/src/main-common.ts
index c3f3f5ee2d1f07260b1932bbe9152d65c7e81dc7..3bfc08878e14626e0a9cc0c95d26806ed27a47e3 100644
--- a/src/main-common.ts
+++ b/src/main-common.ts
@@ -20,11 +20,6 @@ import '!!file-loader?context=src/res&name=icons/iav-icons.ttf!src/res/icons/iav
import '!!file-loader?context=src/res&name=icons/iav-icons.woff!src/res/icons/iav-icons.woff'
import '!!file-loader?context=src/res&name=icons/iav-icons.svg!src/res/icons/iav-icons.svg'
-/**
- * favicons
- */
-import '!!file-loader?context=src/res/favicons&name=favicon-128-light.png!src/res/favicons/favicon-128-light.png'
-
/**
* version css
*/
diff --git a/src/util/pureConstant.service.ts b/src/util/pureConstant.service.ts
index 5d69b140153b700a2d76e35070602b6fba98dc23..130ee0d1dbc0ba1b820dfe0e7c915e5e2e8b6138 100644
--- a/src/util/pureConstant.service.ts
+++ b/src/util/pureConstant.service.ts
@@ -17,7 +17,7 @@ import { MatSnackBar } from "@angular/material/snack-bar";
import { TTemplateImage } from "./interfaces";
export const SIIBRA_API_VERSION_HEADER_KEY='x-siibra-api-version'
-export const SIIBRA_API_VERSION = '0.1.8'
+export const SIIBRA_API_VERSION = '0.1.9'
const validVolumeType = new Set([
'neuroglancer/precomputed',
diff --git a/src/viewerModule/nehuba/nehubaContainer.component.spec.ts b/src/viewerModule/nehuba/nehubaContainer.component.spec.ts
deleted file mode 100644
index 24fc4230411831d5e2f4c71ed5b9afa575645aa5..0000000000000000000000000000000000000000
--- a/src/viewerModule/nehuba/nehubaContainer.component.spec.ts
+++ /dev/null
@@ -1,684 +0,0 @@
-
-// const {
-// TOGGLE_SIDE_PANEL,
-// EXPAND,
-// COLLAPSE,
-// ZOOM_IN,
-// ZOOM_OUT,
-// TOGGLE_FRONTAL_OCTANT
-// } = ARIA_LABELS
-
-// const bigbrainJson = {
-// ..._bigbrainJson,
-// nehubaConfig: _bigbrainNehubaConfigJson
-// }
-// const importNehubaSpy = jasmine.createSpy('importNehubaSpy').and.returnValue(Promise.reject())
-
-describe('> nehubaContainer.component.ts', () => {
-
- describe('> NehubaContainer', () => {
-
- // beforeEach(async(() => {
-
- // TestBed.configureTestingModule({
- // imports: [
- // NoopAnimationsModule,
- // WidgetModule,
- // AngularMaterialModule,
- // LayoutModule,
- // UtilModule,
- // NehubaModule,
- // AuthModule,
- // StateModule,
- // FormsModule,
- // ReactiveFormsModule,
- // HttpClientModule,
- // CommonModule,
- // RegionalFeaturesModule,
- // ParcellationRegionModule,
- // AtlasCmpParcellationModule,
-
- // /**
- // * because the change done to pureconstant service, need to intercept http call to avoid crypto error message
- // * so and so components needs to be compiled first. make sure you call compileComponents
- // */
- // HttpClientTestingModule,
- // Landmark2DModule,
- // ],
- // declarations: [
- // NehubaContainer,
- // TouchSideClass,
- // MaximisePanelButton,
- // AtlasLayerSelector,
- // StatusCardComponent,
- // NehubaViewerTouchDirective,
- // MobileOverlay,
-
- // SplashScreen,
- // CurrentLayout,
-
- // // pipes
- // MobileControlNubStylePipe,
- // ReorderPanelIndexPipe,
-
- // RegionAccordionTooltipTextPipe,
- // ],
- // providers: [
- // provideMockStore({ initialState: defaultRootState }),
- // {
- // provide: IMPORT_NEHUBA_INJECT_TOKEN,
- // useValue: importNehubaSpy
- // },
- // PureContantService,
- // ],
- // schemas: [
- // CUSTOM_ELEMENTS_SCHEMA
- // ],
- // }).compileComponents()
-
- // }))
-
-
- // const fixture = TestBed.createComponent(NehubaContainer)
- // fixture.componentInstance.currentOnHoverObs$ = hot('')
- // const el = fixture.debugElement.componentInstance
- // expect(el).toBeTruthy()
- it('> component can be created')
-
- describe('> on selectedTemplatechange', () => {
-
- // const fixture = TestBed.createComponent(NehubaContainer)
- // fixture.componentInstance.currentOnHoverObs$ = hot('')
-
- // const mockStore = TestBed.inject(MockStore)
- // const newState = {
- // ...defaultRootState,
- // viewerState: {
- // ...defaultRootState.viewerState,
- // fetchedTemplates: [ bigbrainJson ],
- // templateSelected: bigbrainJson,
- // parcellationSelected: bigbrainJson.parcellations[0]
- // },
- // [viewerStateHelperStoreName]: {
- // fetchedAtlases: [ humanAtlas ],
- // selectedAtlasId: humanAtlas['@id']
- // }
- // }
-
- // mockStore.setState(newState)
- // fixture.detectChanges()
- // expect(importNehubaSpy).toHaveBeenCalled()
- it('> calls importNehubaPr')
-
- /**
- * TODO perhaps move this to e2e?
- */
- it('> drag handle reattaches properly')
- })
-
- describe('> on selectedparcellation change', () => {
-
-
- // const fixture = TestBed.createComponent(NehubaContainer)
- // fixture.componentInstance.currentOnHoverObs$ = hot('')
- // const el = fixture.debugElement.componentInstance as NehubaContainer
- // const mockStore = TestBed.inject(MockStore)
- // const newState = {
- // ...defaultRootState,
- // viewerState: {
- // ...defaultRootState.viewerState,
- // fetchedTemplates: [ bigbrainJson ],
- // templateSelected: bigbrainJson,
- // parcellationSelected: bigbrainJson.parcellations[0]
- // },
- // [viewerStateHelperStoreName]: {
- // fetchedAtlases: [ humanAtlas ],
- // selectedAtlasId: humanAtlas['@id']
- // }
- // }
-
- // mockStore.setState(newState)
- // fixture.detectChanges()
-
- // const setSpy = spyOnProperty(el.nehubaViewer, 'ngIds', 'set')
-
- // const newState2 = {
- // ...defaultRootState,
- // viewerState: {
- // ...defaultRootState.viewerState,
- // fetchedTemplates: [ bigbrainJson ],
- // templateSelected: bigbrainJson,
- // parcellationSelected: bigbrainJson.parcellations[1]
- // },
- // [viewerStateHelperStoreName]: {
- // fetchedAtlases: [ humanAtlas ],
- // selectedAtlasId: humanAtlas['@id']
- // }
- // }
-
- // mockStore.setState(newState2)
- // fixture.detectChanges()
-
- // expect(setSpy).toHaveBeenCalled()
- it('> should set ngId of nehubaViewer')
- })
-
- describe('> extended sidepanel hides and shows as expected', () => {
- describe('> on start, if nothing is selected', () => {
- // beforeEach(() => {
- // const mockStore = TestBed.inject(MockStore)
- // const newState = {
- // ...defaultRootState,
- // viewerState: {
- // ...defaultRootState.viewerState,
- // fetchedTemplates: [ bigbrainJson ],
- // templateSelected: bigbrainJson,
- // parcellationSelected: bigbrainJson.parcellations[0]
- // },
- // [viewerStateHelperStoreName]: {
- // fetchedAtlases: [ humanAtlas ],
- // selectedAtlasId: humanAtlas['@id']
- // }
- // }
-
- // mockStore.setState(newState)
- // })
-
-
-
- // const fixture = TestBed.createComponent(NehubaContainer)
- // fixture.componentInstance.currentOnHoverObs$ = hot('')
- // fixture.detectChanges()
- // expect(
- // fixture.componentInstance.matDrawerMain.opened
- // ).toEqual(false)
- // expect(
- // fixture.componentInstance.matDrawerMinor.opened
- // ).toEqual(false)
- it('> both should be shut')
-
-
- // const fixture = TestBed.createComponent(NehubaContainer)
- // fixture.componentInstance.currentOnHoverObs$ = hot('')
- // fixture.detectChanges()
- // const toggleBtn = fixture.debugElement.query( By.css(`[aria-label="${TOGGLE_SIDE_PANEL}"]`) )
- // toggleBtn.triggerEventHandler('click', null)
- // fixture.detectChanges()
-
- // expect(
- // fixture.componentInstance.matDrawerMain.opened
- // ).toEqual(true)
- // expect(
- // fixture.componentInstance.matDrawerMinor.opened
- // ).toEqual(false)
- it('> opening via tab should result in only top drawer open')
-
-
-
- // const fixture = TestBed.createComponent(NehubaContainer)
- // fixture.componentInstance.currentOnHoverObs$ = hot('')
- // fixture.detectChanges()
- // const toggleBtn = fixture.debugElement.query( By.css(`[aria-label="${TOGGLE_SIDE_PANEL}"]`) )
- // toggleBtn.triggerEventHandler('click', null)
- // fixture.detectChanges()
- // const expandRegionFeatureBtn = fixture.debugElement.query( By.css(`mat-drawer[data-mat-drawer-secondary-open="true"] [aria-label="${EXPAND}"]`) )
- // expect(expandRegionFeatureBtn).toBeNull()
- it('> on opening top drawer, explore features should not be present')
-
-
- // const fixture = TestBed.createComponent(NehubaContainer)
- // fixture.componentInstance.currentOnHoverObs$ = hot('')
- // fixture.detectChanges()
- // const toggleBtn = fixture.debugElement.query( By.css(`[aria-label="${TOGGLE_SIDE_PANEL}"]`) )
- // toggleBtn.triggerEventHandler('click', null)
- // fixture.detectChanges()
- // const expandRegionFeatureBtn = fixture.debugElement.query( By.css(`mat-drawer[data-mat-drawer-secondary-open="true"] [aria-label="${COLLAPSE}"]`) )
- // expect(expandRegionFeatureBtn).toBeNull()
- it('> collapse btn should not be visible')
- })
-
- describe('> on start, if something is selected', () => {
- // beforeEach(() => {
- // const mockStore = TestBed.inject(MockStore)
- // const newState = {
- // ...defaultRootState,
- // viewerState: {
- // ...defaultRootState.viewerState,
- // fetchedTemplates: [ bigbrainJson ],
- // templateSelected: bigbrainJson,
- // parcellationSelected: bigbrainJson.parcellations[0],
- // regionsSelected: [{
- // name: "foobar",
- // ngId: 'untitled',
- // labelIndex: 15
- // }]
- // },
- // [viewerStateHelperStoreName]: {
- // fetchedAtlases: [ humanAtlas ],
- // selectedAtlasId: humanAtlas['@id']
- // }
- // }
-
- // mockStore.setState(newState)
- // })
-
-
- // const fixture = TestBed.createComponent(NehubaContainer)
- // fixture.componentInstance.currentOnHoverObs$ = hot('')
- // fixture.detectChanges()
- // expect(
- // fixture.componentInstance.matDrawerMain.opened
- // ).toEqual(true)
- // expect(
- // fixture.componentInstance.matDrawerMinor.opened
- // ).toEqual(true)
-
- // expect(
- // fixture.componentInstance.navSideDrawerMainSwitch.switchState
- // ).toEqual(true)
- // expect(
- // fixture.componentInstance.navSideDrawerMinorSwitch.switchState
- // ).toEqual(true)
- it('> both should be open')
-
-
- // () => {
- // const fixture = TestBed.createComponent(NehubaContainer)
- // fixture.componentInstance.currentOnHoverObs$ = hot('')
- // fixture.detectChanges()
- // const toggleBtn = fixture.debugElement.query( By.css(`[aria-label="${TOGGLE_SIDE_PANEL}"]`) )
- // toggleBtn.triggerEventHandler('click', null)
- // fixture.detectChanges()
- // expect(
- // fixture.componentInstance.matDrawerMain.opened
- // ).toEqual(false)
-
- // /**
- // * TODO investigate why openedStart/closedStart events fail to fire
- // */
- // // expect(
- // // fixture.componentInstance.matDrawerMinor.opened
- // // ).toEqual(false)
-
- // // expect(
- // // fixture.componentInstance.navSideDrawerMainSwitch.switchState
- // // ).toEqual(false)
- // // expect(
- // // fixture.componentInstance.navSideDrawerMinorSwitch.switchState
- // // ).toEqual(false)
- // }
- it('> closing main drawer via tag should close both')
-
-
- // () => {
-
- // const fixture = TestBed.createComponent(NehubaContainer)
- // fixture.componentInstance.currentOnHoverObs$ = hot('')
- // fixture.detectChanges()
- // const collapseRegionFeatureBtn = fixture.debugElement.query( By.css(`mat-drawer[data-mat-drawer-secondary-open="true"] [aria-label="${COLLAPSE}"]`) )
- // expect(collapseRegionFeatureBtn).not.toBeNull()
- // }
- it('> collapse btn should be visible')
-
- // () => {
-
- // const fixture = TestBed.createComponent(NehubaContainer)
- // fixture.componentInstance.currentOnHoverObs$ = hot('')
- // fixture.detectChanges()
- // const collapseRegionFeatureBtn = fixture.debugElement.query( By.css(`mat-drawer[data-mat-drawer-secondary-open="true"] [aria-label="${COLLAPSE}"]`) )
- // collapseRegionFeatureBtn.triggerEventHandler('click', null)
- // fixture.detectChanges()
- // expect(
- // fixture.componentInstance.matDrawerMain.opened
- // ).toEqual(true)
-
- // /**
- // * TODO investigate why property does not get updated
- // */
- // // expect(
- // // fixture.componentInstance.matDrawerMinor.opened
- // // ).toEqual(false)
-
- // expect(
- // fixture.componentInstance.navSideDrawerMainSwitch.switchState
- // ).toEqual(true)
- // expect(
- // fixture.componentInstance.navSideDrawerMinorSwitch.switchState
- // ).toEqual(false)
- // }
- it('> clicking on collapse btn should minimize 1 drawer')
-
- // () => {
- // const fixture = TestBed.createComponent(NehubaContainer)
- // fixture.componentInstance.currentOnHoverObs$ = hot('')
- // fixture.detectChanges()
- // const collapseRegionFeatureBtn = fixture.debugElement.query( By.css(`mat-drawer[data-mat-drawer-secondary-open="true"] [aria-label="${COLLAPSE}"]`) )
- // collapseRegionFeatureBtn.triggerEventHandler('click', null)
- // fixture.detectChanges()
- // const expandRegionFeatureBtn = fixture.debugElement.query( By.css(`mat-drawer[data-mat-drawer-primary-open="true"] [aria-label="${EXPAND}"]`) )
- // expandRegionFeatureBtn.triggerEventHandler('click', null)
- // fixture.detectChanges()
-
- // expect(
- // fixture.componentInstance.matDrawerMain.opened
- // ).toEqual(true)
- // expect(
- // fixture.componentInstance.matDrawerMinor.opened
- // ).toEqual(true)
-
- // expect(
- // fixture.componentInstance.navSideDrawerMainSwitch.switchState
- // ).toEqual(true)
- // /**
- // * TODO figoure out why switch state is updated async, and karma can't force update state
- // */
- // // expect(
- // // fixture.componentInstance.navSideDrawerMinorSwitch.switchState
- // // ).toEqual(true)
- // }
- it('> on minimize drawer, clicking expand btn should expand everything')
- })
-
- describe('> side bar content', () => {
-
- /**
- * TODO
- */
- it('> if nothing is shown, it should show place holder text')
-
- /**
- * TODO
- */
- it('> if something (region features/connectivity) exists, placeh holder text should be hdiden')
- })
- })
-
- describe('> panelCtrl', () => {
- // let fixture: ComponentFixture<NehubaContainer>
- // const setViewerLoaded = () => {
- // fixture.componentInstance.viewerLoaded = true
- // }
- // const ctrlElementIsVisible = (el: DebugElement) => {
- // const visible = (el.nativeElement as HTMLElement).getAttribute('data-viewer-controller-visible')
- // return visible === 'true'
- // }
- // beforeEach(() => {
- // fixture = TestBed.createComponent(NehubaContainer)
- // })
-
- // () => {
- // fixture.detectChanges()
- // setViewerLoaded()
- // fixture.detectChanges()
- // for (const idx of [0, 1, 2, 3]) {
- // const el = fixture.debugElement.query(
- // By.css(`[data-viewer-controller-index="${idx}"]`)
- // )
- // expect(el).toBeTruthy()
- // }
- // }
- it('> on start, all four ctrl panels exists')
-
- // () => {
-
- // fixture.detectChanges()
- // setViewerLoaded()
- // fixture.detectChanges()
- // for (const idx of [0, 1, 2, 3]) {
- // const el = fixture.debugElement.query(
- // By.css(`[data-viewer-controller-index="${idx}"]`)
- // )
- // expect(ctrlElementIsVisible(el)).toBeFalsy()
- // }
- // }
- it('> on start all four ctrl panels are invisible')
-
- describe('> on hover, only the hovered panel have ctrl shown', () => {
-
- for (const idx of [0, 1, 2, 3]) {
-
- // fakeAsync(() => {
- // fixture.detectChanges()
- // const findPanelIndexSpy = spyOn<any>(fixture.componentInstance, 'findPanelIndex').and.callFake(() => {
- // return idx
- // })
- // setViewerLoaded()
- // fixture.detectChanges()
- // const nativeElement = fixture.componentInstance['elementRef'].nativeElement
- // nativeElement.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }))
-
- // /**
- // * assert findPanelIndex called with event.target, i.e. native element in thsi case
- // */
- // expect(findPanelIndexSpy).toHaveBeenCalledWith(nativeElement)
- // tick(200)
- // fixture.detectChanges()
-
- // /**
- // * every panel index should be non visible
- // * only when idx matches, it can be visible
- // * n.b. this does not test visual visibility (which is controlled by extra-style.css)
- // * (which is also affected by global [ismobile] configuration)
- // *
- // * this merely test the unit logic, and sets the flag appropriately
- // */
- // for (const iterativeIdx of [0, 1, 2, 3]) {
- // const el = fixture.debugElement.query(
- // By.css(`[data-viewer-controller-index="${iterativeIdx}"]`)
- // )
- // if (iterativeIdx === idx) {
- // expect(ctrlElementIsVisible(el)).toBeTruthy()
- // } else {
- // expect(ctrlElementIsVisible(el)).toBeFalsy()
- // }
- // }
- // discardPeriodicTasks()
- // })
- it(`> on hoveredPanelIndices$ emit ${idx}, the panel index ${idx} ctrl becomes visible`)
- }
-
- })
-
- describe('> on maximise top right slice panel (idx 1)', () => {
- // beforeEach(() => {
- // const mockStore = TestBed.inject(MockStore)
- // mockStore.overrideSelector(ngViewerSelectorPanelMode, PANELS.SINGLE_PANEL)
- // mockStore.overrideSelector(ngViewerSelectorPanelOrder, '1230')
-
- // fixture.detectChanges()
- // setViewerLoaded()
- // fixture.detectChanges()
- // })
-
-
- // () => {
-
- // const toggleBtn = fixture.debugElement.query(
- // By.css(`[cell-i] [aria-label="${TOGGLE_FRONTAL_OCTANT}"]`)
- // )
- // expect(toggleBtn).toBeFalsy()
- // }
- it('> toggle front octant btn not visible')
-
- // () => {
-
- // const zoomInBtn = fixture.debugElement.query(
- // By.css(`[cell-i] [aria-label="${ZOOM_IN}"]`)
- // )
-
- // const zoomOutBtn = fixture.debugElement.query(
- // By.css(`[cell-i] [aria-label="${ZOOM_OUT}"]`)
- // )
-
- // expect(zoomInBtn).toBeTruthy()
- // expect(zoomOutBtn).toBeTruthy()
- // }
- it('> zoom in and out btns are visible')
-
- // () => {
- // const zoomViewSpy = spyOn(fixture.componentInstance, 'zoomNgView')
-
- // const zoomInBtn = fixture.debugElement.query(
- // By.css(`[cell-i] [aria-label="${ZOOM_IN}"]`)
- // )
- // zoomInBtn.triggerEventHandler('click', null)
- // expect(zoomViewSpy).toHaveBeenCalled()
- // const { args } = zoomViewSpy.calls.first()
- // expect(args[0]).toEqual(1)
- // /**
- // * zoom in < 1
- // */
- // expect(args[1]).toBeLessThan(1)
- // }
- it('> zoom in btn calls fn with right param')
-
- // () => {
- // const zoomViewSpy = spyOn(fixture.componentInstance, 'zoomNgView')
-
- // const zoomOutBtn = fixture.debugElement.query(
- // By.css(`[cell-i] [aria-label="${ZOOM_OUT}"]`)
- // )
- // zoomOutBtn.triggerEventHandler('click', null)
- // expect(zoomViewSpy).toHaveBeenCalled()
- // const { args } = zoomViewSpy.calls.first()
- // expect(args[0]).toEqual(1)
- // /**
- // * zoom out > 1
- // */
- // expect(args[1]).toBeGreaterThan(1)
- // }
- it('> zoom out btn calls fn with right param')
- })
-
- describe('> on maximise perspective panel', () => {
- // beforeEach(() => {
- // const mockStore = TestBed.inject(MockStore)
- // mockStore.overrideSelector(ngViewerSelectorPanelMode, PANELS.SINGLE_PANEL)
- // mockStore.overrideSelector(ngViewerSelectorPanelOrder, '3012')
-
- // fixture.detectChanges()
- // setViewerLoaded()
- // fixture.detectChanges()
- // })
-
-
- // () => {
- // const setOctantRemovalSpy = spyOn(fixture.componentInstance, 'setOctantRemoval')
-
- // const toggleBtn = fixture.debugElement.query(
- // By.css(`[cell-i] [aria-label="${TOGGLE_FRONTAL_OCTANT}"]`)
- // )
- // expect(toggleBtn).toBeTruthy()
- // toggleBtn.nativeElement.dispatchEvent(
- // new MouseEvent('click', { bubbles: true })
- // )
- // expect(setOctantRemovalSpy).toHaveBeenCalled()
- // }
- it('> toggle octant btn visible and functional')
-
- // () => {
- // const zoomViewSpy = spyOn(fixture.componentInstance, 'zoomNgView')
-
- // const zoomInBtn = fixture.debugElement.query(
- // By.css(`[cell-i] [aria-label="${ZOOM_IN}"]`)
- // )
- // expect(zoomInBtn).toBeTruthy()
-
- // zoomInBtn.triggerEventHandler('click', null)
- // expect(zoomViewSpy).toHaveBeenCalled()
- // const { args } = zoomViewSpy.calls.first()
- // expect(args[0]).toEqual(3)
- // /**
- // * zoom in < 1
- // */
- // expect(args[1]).toBeLessThan(1)
- // }
- it('> zoom in btn visible and functional')
-
- // () => {
- // const zoomViewSpy = spyOn(fixture.componentInstance, 'zoomNgView')
-
- // const zoomOutBtn = fixture.debugElement.query(
- // By.css(`[cell-i] [aria-label="${ZOOM_OUT}"]`)
- // )
- // expect(zoomOutBtn).toBeTruthy()
-
- // zoomOutBtn.triggerEventHandler('click', null)
- // expect(zoomViewSpy).toHaveBeenCalled()
- // const { args } = zoomViewSpy.calls.first()
- // expect(args[0]).toEqual(3)
- // /**
- // * zoom in < 1
- // */
- // expect(args[1]).toBeGreaterThan(1)
- // }
- it('> zoom out btn visible and functional')
-
- })
- })
-
- describe('> on userLandmarks change', () => {
- const lm1 = {
- id: 'test-1',
- position: [0, 0, 0]
- }
- const lm2 = {
- id: 'test-2',
- position: [1, 1,1 ]
- }
-
- // () => {
- // const fixture = TestBed.createComponent(NehubaContainer)
-
- // fixture.componentInstance.nehubaViewer = {
- // updateUserLandmarks: () => {}
- // } as any
-
- // const updateUserLandmarksSpy = spyOn(
- // fixture.componentInstance.nehubaViewer,
- // 'updateUserLandmarks'
- // )
-
- // const mockStore = TestBed.inject(MockStore)
- // mockStore.overrideSelector(viewerStateCustomLandmarkSelector, [
- // lm1,
- // lm2
- // ])
- // fixture.detectChanges()
- // expect(
- // updateUserLandmarksSpy
- // ).toHaveBeenCalledWith([
- // lm1, lm2
- // ])
- // }
- it('> calls nehubaViewer.updateUserLandmarks')
-
- // () => {
-
- // const fixture = TestBed.createComponent(NehubaContainer)
-
- // fixture.componentInstance.nehubaContainerDirective = {
- // toggleOctantRemoval: () => {},
- // clear: () => {}
- // } as any
-
- // const toggleOctantRemovalSpy = spyOn(
- // fixture.componentInstance.nehubaContainerDirective,
- // 'toggleOctantRemoval'
- // )
-
- // const mockStore = TestBed.inject(MockStore)
- // mockStore.overrideSelector(viewerStateCustomLandmarkSelector, [
- // lm1,
- // lm2
- // ])
- // mockStore.overrideSelector(ngViewerSelectorOctantRemoval, true)
- // fixture.detectChanges()
- // expect(
- // toggleOctantRemovalSpy
- // ).toHaveBeenCalledWith(false)
- // }
- it('> calls togglecotantREmoval')
- })
- })
-})
diff --git a/third_party/extra_js.js b/third_party/extra_js.js
new file mode 100644
index 0000000000000000000000000000000000000000..82febd16a73314d0b797ae6ced9957d4849af412
--- /dev/null
+++ b/third_party/extra_js.js
@@ -0,0 +1,2 @@
+// disable zone patching of raf. This hampers NG performance significantly
+window['__Zone_disable_requestAnimationFrame'] = true
\ No newline at end of file