diff --git a/src/atlasViewer/atlasViewer.component.ts b/src/atlasViewer/atlasViewer.component.ts index 4bbf3551b57b593832bf7ecb3960948f0b78052b..f455d1ccd19d49df265efd730e2078b7b9e64217 100644 --- a/src/atlasViewer/atlasViewer.component.ts +++ b/src/atlasViewer/atlasViewer.component.ts @@ -37,7 +37,6 @@ export class AtlasViewer implements OnDestroy, OnInit, AfterViewInit { @ViewChild('dockedContainer', { read: ViewContainerRef }) dockedContainer: ViewContainerRef @ViewChild('floatingContainer', { read: ViewContainerRef }) floatingContainer: ViewContainerRef @ViewChild('databrowser', { read: ElementRef }) databrowser: ElementRef - @ViewChild('temporaryContainer', { read: ViewContainerRef }) temporaryContainer: ViewContainerRef @ViewChild('toastContainer', { read: ViewContainerRef }) toastContainer: ViewContainerRef @ViewChild('floatingMouseContextualContainer', { read: ViewContainerRef }) floatingMouseContextualContainer: ViewContainerRef @ViewChild('pluginFactory', { read: ViewContainerRef }) pluginViewContainerRef: ViewContainerRef @@ -71,6 +70,10 @@ export class AtlasViewer implements OnDestroy, OnInit, AfterViewInit { public ngLayers : NgLayerInterface[] private disposeHandler : any + get toggleMessage(){ + return this.constantsService.toggleMessage + } + constructor( private toastService:ToastService, private pluginService: PluginServices, diff --git a/src/atlasViewer/atlasViewer.constantService.service.ts b/src/atlasViewer/atlasViewer.constantService.service.ts index 2173492c30aabea648555a9669cecafd954aeb1d..99f66f51f5467cd36ac58ac70b5ec41406e05e87 100644 --- a/src/atlasViewer/atlasViewer.constantService.service.ts +++ b/src/atlasViewer/atlasViewer.constantService.service.ts @@ -104,6 +104,11 @@ the atlas viewer requires **webgl2.0**, and the \`EXT_color_buffer_float\` exten return [400,100] } + /** + * message when user on hover a segment or landmark + */ + public toggleMessage: string = 'double click to toggle select' + constructor(private store : Store<ViewerStateInterface>){ const ua = window && window.navigator && window.navigator.userAgent diff --git a/src/atlasViewer/atlasViewer.style.css b/src/atlasViewer/atlasViewer.style.css index f1e509854b3421370c40c84b66a519b67a8ed10d..9d26e67c1d8922096490aa82025a231b61a4a2b2 100644 --- a/src/atlasViewer/atlasViewer.style.css +++ b/src/atlasViewer/atlasViewer.style.css @@ -58,7 +58,7 @@ layout-floating-container overflow:hidden; } -div[toastContainer] +[toastContainer] { pointer-events: none; position : absolute; @@ -69,7 +69,7 @@ div[toastContainer] flex-direction: column; } -div[toastContainer] > * +[toastContainer] > * { flex : 0 0 auto; } @@ -88,32 +88,25 @@ div[floatingMouseContextualContainer] height: 0px; } -div[contextualInnerContainer] +div[contextualBlock] { - margin-top :1em; - margin-left :1em; + margin: 1.3em 1.5em; + white-space: nowrap; display:inline-block; width:auto; } -div[contextualInnerContainer] +div[contextualBlock] { background-color:rgba(200,200,200,0.8); } -:host-context([darktheme="true"]) div[contextualInnerContainer] +:host-context([darktheme="true"]) div[contextualBlock] { background-color : rgba(30,30,30,0.8); color : rgba(250,250,250,0.8); } -div[contextualBlock] -{ - margin: 0.3em 0.5em; - white-space: nowrap; -} - - :host-context([darktheme="false"]) div[resizeSliver] > span.tabContainer { background-color:rgba(235,235,235,0.8); @@ -225,6 +218,7 @@ span.tabContainer.active-tab:before [mobileMenu] { min-height:50em; + margin-top: 1em; } [mobileMenu] > * diff --git a/src/atlasViewer/atlasViewer.template.html b/src/atlasViewer/atlasViewer.template.html index e5e89a7790a51c3b1bce7558fb78339c5f9dc62e..0e5250ccdc46155492ccb1a2c12053ba01735a47 100644 --- a/src/atlasViewer/atlasViewer.template.html +++ b/src/atlasViewer/atlasViewer.template.html @@ -24,15 +24,13 @@ <div heading> Menu </div> - <div body> - <div mobileMenu> - <atlas-banner> + <div mobileMenu body> + <atlas-banner> - </atlas-banner> - <template-parcellation-citation-container mobileTemplateCitation> - - </template-parcellation-citation-container> - </div> + </atlas-banner> + <template-parcellation-citation-container mobileTemplateCitation> + + </template-parcellation-citation-container> </div> </panel-component> </div> @@ -43,10 +41,8 @@ <div heading> Data Browser </div> - <div body> - <data-browser> - </data-browser> - </div> + <data-browser body> + </data-browser> </panel-component> </div> @@ -56,11 +52,8 @@ <div heading> Layer Browser </div> - <div body> - <layer-browser > - </layer-browser> - - </div> + <layer-browser body> + </layer-browser> </panel-component> </div> @@ -70,10 +63,8 @@ <div heading> Tools Browser </div> - <div body> - <plugin-banner> - </plugin-banner> - </div> + <plugin-banner body> + </plugin-banner> </panel-component> </div> @@ -83,9 +74,7 @@ </div> <!-- Docked Container--> - <div dockedContainer> - <ng-template #dockedContainer> - </ng-template> + <div dockedContainer #dockedContainer> </div> </div> @@ -163,16 +152,17 @@ </ng-template> <div [style.transform] = "floatingMouseContextualContainerTransform" floatingMouseContextualContainer> - <div *ngIf = "onhoverLandmark$ | async" contextualInnerContainer> - <div contextualBlock> - {{ onhoverLandmark$ | async }} <i><small class = "mute-text">dbl click to toggle select</small></i> - </div> + <div + *ngIf = "onhoverLandmark$ | async" + contextualBlock> + {{ onhoverLandmark$ | async }} <i><small class = "mute-text">{{ toggleMessage }}</small></i> </div> - <div *ngIf = "onhoverSegment$ | async as onhoverSegment" contextualInnerContainer> - <div *ngIf = "onhoverSegment !== ''" contextualBlock> - {{ onhoverSegment }} <i><small class = "mute-text">dbl click to toggle select</small></i> - </div> + <div + *ngIf = "(onhoverSegment$ | async) !== ''" + contextualBlock> + {{ onhoverSegment$ | async }} <i><small class = "mute-text">{{ toggleMessage }}</small></i> </div> + <!-- TODO Potentially implementing plugin contextual info --> </div> <div toastContainer> <ng-template #toastContainer> @@ -180,9 +170,6 @@ </div> </layout-floating-container> - <ng-template #temporaryContainer> - </ng-template> - <ng-template #pluginFactory> </ng-template> diff --git a/src/atlasViewer/pluginUnit/pluginUnit.component.ts b/src/atlasViewer/pluginUnit/pluginUnit.component.ts index 15e4624040df7c1c6545ba9c9d32b96d82bf1f23..8afdef862023810da00a20580c0b7dbb36796f06 100644 --- a/src/atlasViewer/pluginUnit/pluginUnit.component.ts +++ b/src/atlasViewer/pluginUnit/pluginUnit.component.ts @@ -1,4 +1,4 @@ -import { Component, ElementRef, ViewChild, OnDestroy } from "@angular/core"; +import { Component, ElementRef, OnDestroy, HostBinding } from "@angular/core"; @Component({ @@ -7,8 +7,14 @@ import { Component, ElementRef, ViewChild, OnDestroy } from "@angular/core"; export class PluginUnit implements OnDestroy{ - @ViewChild('pluginContainer',{read:ElementRef}) elementRef:ElementRef + + @HostBinding('attr.pluginContainer') + pluginContainer = true + + constructor(er:ElementRef){ + this.elementRef = er + } ngOnDestroy(){ console.log('plugin being destroyed') diff --git a/src/atlasViewer/pluginUnit/pluginUnit.template.html b/src/atlasViewer/pluginUnit/pluginUnit.template.html index 4896a25f9103b94552db10dd920b9f200a1225ec..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/src/atlasViewer/pluginUnit/pluginUnit.template.html +++ b/src/atlasViewer/pluginUnit/pluginUnit.template.html @@ -1,2 +0,0 @@ -<div pluginContainer #pluginContainer> -</div> \ No newline at end of file diff --git a/src/components/dropdown/dropdown.style.css b/src/components/dropdown/dropdown.style.css index df852e545da343add63cef73460c8bba33cd2102..0d08444ec11328b06b3d0333f1a5d67240161d95 100644 --- a/src/components/dropdown/dropdown.style.css +++ b/src/components/dropdown/dropdown.style.css @@ -1,6 +1,7 @@ -div[dropdowncontainer] +:host { position:relative; + display:block; } ul.dropdown-menu diff --git a/src/components/dropdown/dropdown.template.html b/src/components/dropdown/dropdown.template.html index fe2253165751f410d21617efa2cd469173a243ef..97207b21f69bb4e1cd2218eabb10dc207b31e27c 100644 --- a/src/components/dropdown/dropdown.template.html +++ b/src/components/dropdown/dropdown.template.html @@ -1,28 +1,24 @@ -<div - dropdowncontainer> +<span + class = "btn btn-default" + [innerHTML] = "activeDisplay(selectedItem)" + hoverable + #dropdownToggle + dropdownToggle> +</span> - <span - class = "btn btn-default" - [innerHTML] = "activeDisplay(selectedItem)" - hoverable - #dropdownToggle - dropdownToggle> - </span> - - <ul - class="dropdown-menu" - role="menu" - [@showState] = "openState ? 'show' : 'hide'"> - <li - *ngFor="let input of inputArray" - [ngClass]="selectedItem === input ? 'selected' : 'notselected'" - (click)="itemSelected.emit(input); openState = false" - role="menuitem"> - - <span - class="dropdown-item" - [innerHTML] = "listDisplay(input)"> - </span> - </li> - </ul> -</div> \ No newline at end of file +<ul + class="dropdown-menu" + role="menu" + [@showState] = "openState ? 'show' : 'hide'"> + <li + *ngFor="let input of inputArray" + [ngClass]="selectedItem === input ? 'selected' : 'notselected'" + (click)="itemSelected.emit(input); openState = false" + role="menuitem"> + + <span + class="dropdown-item" + [innerHTML] = "listDisplay(input)"> + </span> + </li> +</ul> \ No newline at end of file diff --git a/src/components/flatTree/flatTree.component.ts b/src/components/flatTree/flatTree.component.ts index e3c19238b5b67a39bc91ba5e91277337d4fd5964..b82ec4f5b1c5ac9d720bf762a74852f7bcdcd2d4 100644 --- a/src/components/flatTree/flatTree.component.ts +++ b/src/components/flatTree/flatTree.component.ts @@ -1,6 +1,10 @@ import { EventEmitter, Component, Input, Output, ChangeDetectionStrategy, ElementRef, OnDestroy, ChangeDetectorRef, ViewChildren, QueryList, AfterViewChecked, AfterViewInit, OnInit } from "@angular/core"; import { FlattenedTreeInterface } from "./flattener.pipe"; +/** + * TODO to be replaced by virtual scrolling when ivy is in stable + */ + @Component({ selector : 'flat-tree-component', templateUrl : './flatTree.template.html', diff --git a/src/components/flatTree/flatTree.template.html b/src/components/flatTree/flatTree.template.html index b695100bf690ea853a8f3826bda05ee0607044b9..de7151e12be34258ebcb2064afe5360d54b25ba4 100644 --- a/src/components/flatTree/flatTree.template.html +++ b/src/components/flatTree/flatTree.template.html @@ -1,46 +1,44 @@ -<div class="container"> - <div *ngFor = "let flattenedItems of (inputItem | flattenTreePipe : findChildren | filterRowsByVisbilityPipe : findChildren : searchFilter | appendSiblingFlagPipe | clusteringPipe : clusterNumber ); let index = index" clusterContainer> +<div *ngFor = "let flattenedItems of (inputItem | flattenTreePipe : findChildren | filterRowsByVisbilityPipe : findChildren : searchFilter | appendSiblingFlagPipe | clusteringPipe : clusterNumber ); let index = index" clusterContainer> - <div [attr.clusterindex] = "index" flatTreeStart #flatTreeStart> - </div> + <div [attr.clusterindex] = "index" flatTreeStart #flatTreeStart> + </div> - <div *ngIf = "showCluster(index)"> - <div - *ngFor = "let flattenedItem of flattenedItems" - [ngClass] = "getClass(flattenedItem.flattenedTreeLevel)" - [attr.flattenedtreelevel] = "flattenedItem.flattenedTreeLevel" - [attr.collapsed] = "flattenedItem.collapsed ? flattenedItem.collapsed : false" - [attr.lvlId] = "flattenedItem.lvlId" - [hidden] = "collapseRow(flattenedItem) " - renderNode> - - <span class = "padding-block-container"> - <span - [attr.hidemargin] = "block" - *ngFor = "let block of flattenedItem.siblingFlags" - class = "padding-block"> - - </span> - </span> - <span - *ngIf = "findChildren(flattenedItem).length > 0; else noChildren" - (click) = "$event.stopPropagation(); toggleCollapse(flattenedItem)" > - <i [ngClass] = "isCollapsed(flattenedItem) ? 'glyphicon-chevron-right' : 'glyphicon-chevron-down'" class="glyphicon"></i> - </span> - <ng-template #noChildren> - <i class="glyphicon glyphicon-none"> - - </i> - </ng-template> + <div *ngIf = "showCluster(index)"> + <div + *ngFor = "let flattenedItem of flattenedItems" + [ngClass] = "getClass(flattenedItem.flattenedTreeLevel)" + [attr.flattenedtreelevel] = "flattenedItem.flattenedTreeLevel" + [attr.collapsed] = "flattenedItem.collapsed ? flattenedItem.collapsed : false" + [attr.lvlId] = "flattenedItem.lvlId" + [hidden] = "collapseRow(flattenedItem) " + renderNode> + + <span class = "padding-block-container"> <span - (click) = "treeNodeClick.emit({event:$event,inputItem:flattenedItem})" - class = "render-node-text" - [innerHtml] = "flattenedItem | renderPipe : renderNode "> + *ngFor = "let block of flattenedItem.siblingFlags" + [attr.hidemargin] = "block" + class = "padding-block"> + </span> - </div> + </span> + <span + *ngIf = "findChildren(flattenedItem).length > 0; else noChildren" + (click) = "$event.stopPropagation(); toggleCollapse(flattenedItem)" > + <i [ngClass] = "isCollapsed(flattenedItem) ? 'glyphicon-chevron-right' : 'glyphicon-chevron-down'" class="glyphicon"></i> + </span> + <ng-template #noChildren> + <i class="glyphicon glyphicon-none"> + + </i> + </ng-template> + <span + (click) = "treeNodeClick.emit({event:$event,inputItem:flattenedItem})" + class = "render-node-text" + [innerHtml] = "flattenedItem | renderPipe : renderNode "> + </span> </div> + </div> - <div [attr.clusterindex] = "index" flatTreeEnd #flatTreeEnd> - </div> + <div [attr.clusterindex] = "index" flatTreeEnd #flatTreeEnd> </div> </div> \ No newline at end of file diff --git a/src/components/panel/panel.component.ts b/src/components/panel/panel.component.ts index d3fdea331f06c5ac8b7d145018f72fd82910d6b6..04c869d4f252b04370473ead6f9eb8677eb43b41 100644 --- a/src/components/panel/panel.component.ts +++ b/src/components/panel/panel.component.ts @@ -11,6 +11,9 @@ import { ParseAttributeDirective } from "../parseAttribute.directive"; animations : [ panelAnimations ], + host: { + '[class]': 'getClassNames' + }, changeDetection:ChangeDetectionStrategy.OnPush }) @@ -34,12 +37,22 @@ export class PanelComponent extends ParseAttributeDirective implements AfterCont super() } + get getClassNames(){ + return `panel ${this.containerClass === '' ? 'panel-default' : this.containerClass}` + } + ngAfterContentChecked(){ + /** + * TODO check performance implication. + * setting height forces a repaint (?) + */ this.fullHeight = (this.efPanelBody ? this.efPanelBody.nativeElement.offsetHeight : 0) + (this.efPanelFooter ? this.efPanelFooter.nativeElement.offsetHeight : 0) this.cdr.detectChanges() } + @HostBinding('class.panel-default') + set fullHeight(num:number){ this._fullHeight = num } diff --git a/src/components/panel/panel.style.css b/src/components/panel/panel.style.css index 2163a4923d7798421cbffef5185aae76636532f2..8cf87fc19f464e119eabba889b2e4b9e70c968f5 100644 --- a/src/components/panel/panel.style.css +++ b/src/components/panel/panel.style.css @@ -3,13 +3,10 @@ font-size:92%; overflow:hidden; box-shadow: 0px 4px 16px -4px rgba(0,0,0,0.2); -} - -.panel -{ border-radius : 0; border:none; margin:0; + background:none; } [bodyFooterContainer] @@ -17,7 +14,7 @@ overflow:hidden; } -.panel > .panel-heading +:host > .panel-heading { border-radius : 0; padding: 0; @@ -25,31 +22,26 @@ border:none; } -.panel > [bodyFooterContainer] > .panel-body, -.panel > [bodyFooterContainer] > .panel-footer +:host > [bodyFooterContainer] > .panel-body, +:host > [bodyFooterContainer] > .panel-footer { margin-top:0px; padding: 0px; border:none; } -div.panel -{ - background:none; -} - div.panel-body { background-color:rgba(245,245,245,0.8); } -:host-context([darktheme="true"]) div.panel-default div.panel-heading +:host-context([darktheme="true"]).panel-default div.panel-heading { background-color:rgba(45,45,45,0.9); color:rgba(250,250,250,0.9); } -:host-context([darktheme="true"]) div.panel-success div.panel-heading +:host-context([darktheme="true"]).panel-success div.panel-heading { background-color:rgba(60,118,61,0.9); color:rgba(223,240,216 ,0.9); diff --git a/src/components/panel/panel.template.html b/src/components/panel/panel.template.html index bbdf5f62be8390be008526ce72bbc7294dd86bb8..7f7c1af411784a2153456c412dc9f02429288e5e 100644 --- a/src/components/panel/panel.template.html +++ b/src/components/panel/panel.template.html @@ -1,36 +1,35 @@ -<div class = "panel" - [ngClass] = "containerClass === '' ? 'panel-default' : containerClass"> +<div + *ngIf = "showHeading" + class = "panel-heading" + (click) = "toggleCollapseBody($event)" + hoverable> + + <ng-content select="[heading]"> + </ng-content> + +</div> + +<!-- While wrapping body and footer in a diffrent div adds a lot of overhead, it enables nice transition effects --> +<div + bodyFooterContainer> <div - *ngIf = "showHeading" - class = "panel-heading" - (click) = "toggleCollapseBody($event)" - hoverable> + *ngIf = "showBody" + class = "panel-body" + [@collapseState] = "{ value : collapseBody ? 'collapsed' : 'visible', params : { fullHeight : fullHeight } }" + #panelBody> - <ng-content select="[heading]"> + <ng-content select="[body]"> </ng-content> </div> - <div - bodyFooterContainer> - <div - *ngIf = "showBody" - class = "panel-body" - [@collapseState] = "{ value : collapseBody ? 'collapsed' : 'visible', params : { fullHeight : fullHeight } }" - #panelBody> - - <ng-content select="[body]"> - </ng-content> - - </div> - <div - *ngIf = "showFooter" - class = "panel-footer" - [@collapseState] = "{ value : collapseBody ? 'collapsed' : 'visible', params : { fullHeight : fullHeight } }" - #panelFooter> - - <ng-content select="[footer]"> - </ng-content> + <div + *ngIf = "showFooter" + class = "panel-footer" + [@collapseState] = "{ value : collapseBody ? 'collapsed' : 'visible', params : { fullHeight : fullHeight } }" + #panelFooter> + + <ng-content select="[footer]"> + </ng-content> - </div> </div> </div> \ No newline at end of file diff --git a/src/layouts/mainside/mainside.style.css b/src/layouts/mainside/mainside.style.css index 7b4888e5be0e5ee01d639026d7cf39a8c64d9418..da85c4123c2237cf74e7f25f062bdd15a57bba25 100644 --- a/src/layouts/mainside/mainside.style.css +++ b/src/layouts/mainside/mainside.style.css @@ -1,5 +1,6 @@ -div[container] +:host { + display:block; width:100%; height:100%; display:flex; @@ -15,8 +16,6 @@ div[maincontent] div[resizeSliver] { - /* width : 2.0em; - height: 4em; */ margin-top : 2em; width:0em; } diff --git a/src/layouts/mainside/mainside.template.html b/src/layouts/mainside/mainside.template.html index b3da941e85cef8d68e30158d968274e7126dc312..ae93b37bc266219ef51992d08016ce2fc9ab9ea7 100644 --- a/src/layouts/mainside/mainside.template.html +++ b/src/layouts/mainside/mainside.template.html @@ -1,18 +1,18 @@ -<div container> - <div maincontent> - <ng-content select="[maincontent]"> - </ng-content> - </div> - <div resizeSliver> - <ng-content select = "[resizeSliver]"> - </ng-content> - </div> - <div - [@collapseSide] = "{ value : showSide ? 'visible' : 'collapsed' , params : { sideWidth : sideWidth, animationTiming : animationFlag ? 180 : 0 } }" - (@collapseSide.start) = "animationStart()" - (@collapseSide.done) = "animationEnd()" - sidecontent> - <ng-content select="[sidecontent]"> - </ng-content> - </div> +<div maincontent> + <ng-content select="[maincontent]"> + </ng-content> +</div> + +<div resizeSliver> + <ng-content select = "[resizeSliver]"> + </ng-content> +</div> + +<div + [@collapseSide] = "{ value : showSide ? 'visible' : 'collapsed' , params : { sideWidth : sideWidth, animationTiming : animationFlag ? 180 : 0 } }" + (@collapseSide.start) = "animationStart()" + (@collapseSide.done) = "animationEnd()" + sidecontent> + <ng-content select="[sidecontent]"> + </ng-content> </div> \ No newline at end of file diff --git a/src/ui/banner/banner.style.css b/src/ui/banner/banner.style.css index 3df7fe3bca1a1c45b24931e6d9586dd3ab64a74a..63e7f18e377922014f800a2ee2b53593b49981d2 100644 --- a/src/ui/banner/banner.style.css +++ b/src/ui/banner/banner.style.css @@ -1,16 +1,13 @@ :host { display:block; -} - -div[container] -{ display:flex; flex-direction: row; flex-wrap : wrap; } -dropdown-component, div[container] > div[searchRegionPopover] +dropdown-component, +:host > div[searchRegionPopover] { margin-left:1em; margin-bottom: 0.4em; diff --git a/src/ui/banner/banner.template.html b/src/ui/banner/banner.template.html index 3cf7350f865a6444ac230237149715adf8d48956..44201ed9468310b7212ac134a50e2e737667a376 100644 --- a/src/ui/banner/banner.template.html +++ b/src/ui/banner/banner.template.html @@ -1,54 +1,52 @@ -<div container> - <dropdown-component - (itemSelected) = "selectTemplate($event)" - [activeDisplay] = "displayActiveTemplate" - [selectedItem] = "selectedTemplate" - [inputArray] = "loadedTemplates$ | async | filterNull"> - - </dropdown-component> - - <dropdown-component - *ngIf = "selectedTemplate" - (itemSelected) = "selectParcellation($event)" - [activeDisplay] = "displayActiveParcellation" - [selectedItem] = "selectedParcellation" - [inputArray] = "selectedTemplate.parcellations"> - </dropdown-component> +<dropdown-component + (itemSelected) = "selectTemplate($event)" + [activeDisplay] = "displayActiveTemplate" + [selectedItem] = "selectedTemplate" + [inputArray] = "loadedTemplates$ | async | filterNull"> +</dropdown-component> + +<dropdown-component + *ngIf = "selectedTemplate" + (itemSelected) = "selectParcellation($event)" + [activeDisplay] = "displayActiveParcellation" + [selectedItem] = "selectedParcellation" + [inputArray] = "selectedTemplate.parcellations"> +</dropdown-component> + +<div + *ngIf = "selectedTemplate" + #searchRegionPopover + searchRegionPopover> + + <input + (keydown.esc) = "showRegionTree = false; $event.target.blur(); searchTerm = ''" + (focus) = "showRegionTree = true" + [value] = "searchTerm" + (input) = "changeSearchTerm($event)" + class = "form-control" + type="text" + placeholder="Regions"/> + <div - *ngIf = "selectedTemplate" - #searchRegionPopover - searchRegionPopover> + [@showState] + *ngIf = "showRegionTree" + hideScrollbarContainer> - <input - (keydown.esc) = "showRegionTree = false; $event.target.blur(); searchTerm = ''" - (focus) = "showRegionTree = true" - [value] = "searchTerm" - (input) = "changeSearchTerm($event)" - class = "form-control" - type="text" - placeholder="Regions"/> + <div treeContainer #treeContainer> + <div treeHeader> + <span>{{ selectedRegions.length }} {{ selectedRegions.length > 1 ? 'regions' : 'region' }} selected</span> + <span (click) = "clearRegions($event)" *ngIf = "selectedRegions.length > 0" class = "btn btn-link">clear all</span> + </div> - <div - [@showState] - *ngIf = "showRegionTree" - hideScrollbarContainer> - - <div treeContainer #treeContainer> - <div treeHeader> - <span>{{ selectedRegions.length }} {{ selectedRegions.length > 1 ? 'regions' : 'region' }} selected</span> - <span (click) = "clearRegions($event)" *ngIf = "selectedRegions.length > 0" class = "btn btn-link">clear all</span> - </div> + <flat-tree-component + [flatTreeViewPort] = "treeContainer" + (treeNodeClick) = "handleClickRegion($event)" + [inputItem] = "aggregatedRegionTree" + [renderNode] = "displayTreeNode.bind(this)" + [searchFilter] = "filterTreeBySearch.bind(this)"> - <flat-tree-component - [flatTreeViewPort] = "treeContainer" - (treeNodeClick) = "handleClickRegion($event)" - [inputItem] = "aggregatedRegionTree" - [renderNode] = "displayTreeNode.bind(this)" - [searchFilter] = "filterTreeBySearch.bind(this)"> - - </flat-tree-component> - </div> + </flat-tree-component> </div> </div> -</div> +</div> \ No newline at end of file diff --git a/src/ui/datasetViewer/datasetViewer.style.css b/src/ui/datasetViewer/datasetViewer.style.css index 59294f4b3947a97d6df29535ec13fd50c81c915d..f95c2e97aa13bcc73d1324e153874bd4cdb2a063 100644 --- a/src/ui/datasetViewer/datasetViewer.style.css +++ b/src/ui/datasetViewer/datasetViewer.style.css @@ -1,11 +1,7 @@ -div[title] -{ - margin: 0.5rem; -} - flat-tree-component { overflow: hidden; + white-space: nowrap; } :host-context([darktheme="true"]) hr diff --git a/src/ui/datasetViewer/datasetViewer.template.html b/src/ui/datasetViewer/datasetViewer.template.html index eb385d627ca09acee655332d183ad792cd5b7bec..9c31a987c59b4a5493960016d5556870fc238531 100644 --- a/src/ui/datasetViewer/datasetViewer.template.html +++ b/src/ui/datasetViewer/datasetViewer.template.html @@ -21,9 +21,11 @@ </flat-tree-component> <hr /> </div> + <ng-template #defaultDisplay> Nothing to display ... </ng-template> + <ng-template #noKgID> kgID not specified. </ng-template> diff --git a/src/ui/layerbrowser/layerbrowser.style.css b/src/ui/layerbrowser/layerbrowser.style.css index 0b744a4006dae5cf30bdefa82895ee6bb30a4193..2babcd853d582a36bed00a1710af4bf7529bb445 100644 --- a/src/ui/layerbrowser/layerbrowser.style.css +++ b/src/ui/layerbrowser/layerbrowser.style.css @@ -1,10 +1,6 @@ :host { padding: 0 0.2em; -} - -div[container] -{ display: flex; flex-direction: column-reverse; } diff --git a/src/ui/layerbrowser/layerbrowser.template.html b/src/ui/layerbrowser/layerbrowser.template.html index 2dc961729b07bbe7da6dc2f1f05ad2ad3877e954..b88d2e18b1a748c40821d5b89ee58ec590704a00 100644 --- a/src/ui/layerbrowser/layerbrowser.template.html +++ b/src/ui/layerbrowser/layerbrowser.template.html @@ -1,53 +1,51 @@ -<div container> - <div - class="layerContainer" - *ngFor = "let ngLayer of ngLayers"> +<div + class="layerContainer" + *ngFor = "let ngLayer of ngLayers"> - <div> - <i - container = "body" - placement = "bottom" - [tooltip] = "checkLocked(ngLayer) ? 'base layer cannot be hidden' : 'toggle visibility'" - (click) = "checkLocked(ngLayer) ? null : toggleVisibility(ngLayer)" - class = "glyphicon" - [ngClass] = "checkLocked(ngLayer) ? 'glyphicon-lock muted' :ngLayer.visible ? 'glyphicon-eye-open' : 'glyphicon-eye-close'"> + <div> + <i + container = "body" + placement = "bottom" + [tooltip] = "checkLocked(ngLayer) ? 'base layer cannot be hidden' : 'toggle visibility'" + (click) = "checkLocked(ngLayer) ? null : toggleVisibility(ngLayer)" + class = "glyphicon" + [ngClass] = "checkLocked(ngLayer) ? 'glyphicon-lock muted' :ngLayer.visible ? 'glyphicon-eye-open' : 'glyphicon-eye-close'"> - </i> - </div> - <div> - <i - container = "body" - placement = "bottom" - [tooltip] = "ngLayer.type === 'segmentation' ? segmentationTooltip() : 'only segmentation layer can hide/show segments'" - (click) = "forceSegment.hide();toggleForceShowSegment(ngLayer)" - class = "glyphicon" - #forceSegment = "bs-tooltip" - [ngClass] = "ngLayer.type === 'segmentation' ? ('glyphicon-th-large ' + segmentationAdditionalClass) : 'glyphicon-lock muted' "> + </i> + </div> + <div> + <i + container = "body" + placement = "bottom" + [tooltip] = "ngLayer.type === 'segmentation' ? segmentationTooltip() : 'only segmentation layer can hide/show segments'" + (click) = "forceSegment.hide();toggleForceShowSegment(ngLayer)" + class = "glyphicon" + #forceSegment = "bs-tooltip" + [ngClass] = "ngLayer.type === 'segmentation' ? ('glyphicon-th-large ' + segmentationAdditionalClass) : 'glyphicon-lock muted' "> - </i> - </div> - <div> - <i - (click) = "removeLayer(ngLayer)" - container = "body" - placement = "bottom" - [tooltip] = "checkLocked(ngLayer) ? 'base layers cannot be removed' : 'remove layer'" - class = "glyphicon" - [ngClass] = "checkLocked(ngLayer) ? 'glyphicon-lock muted' : 'glyphicon-remove-circle'"> + </i> + </div> + <div> + <i + (click) = "removeLayer(ngLayer)" + container = "body" + placement = "bottom" + [tooltip] = "checkLocked(ngLayer) ? 'base layers cannot be removed' : 'remove layer'" + class = "glyphicon" + [ngClass] = "checkLocked(ngLayer) ? 'glyphicon-lock muted' : 'glyphicon-remove-circle'"> - </i> - </div> + </i> + </div> - <panel-component - [ngClass] = "{'muted-text muted' : !classVisible(ngLayer)}"> + <panel-component + [ngClass] = "{'muted-text muted' : !classVisible(ngLayer)}"> - <div heading> - {{ ngLayer.name | getLayerNameFromDatasets : (fetchedDataEntries$ | async) }} : {{ ngLayer.type }} - </div> + <div heading> + {{ ngLayer.name | getLayerNameFromDatasets : (fetchedDataEntries$ | async) }} : {{ ngLayer.type }} + </div> - <div bodyy> - {{ ngLayer.source }} - </div> - </panel-component> - </div> + <div bodyy> + {{ ngLayer.source }} + </div> + </panel-component> </div> \ No newline at end of file diff --git a/src/ui/nehubaContainer/nehubaContainer.template.html b/src/ui/nehubaContainer/nehubaContainer.template.html index b3158ad21a3fc38e1c2bc82db6547274eb9d457d..4157818adb97335d0c7aca04887bd7caca7dfe0a 100644 --- a/src/ui/nehubaContainer/nehubaContainer.template.html +++ b/src/ui/nehubaContainer/nehubaContainer.template.html @@ -128,6 +128,7 @@ </div> </div> </layout-floating-container> + <mobile-overlay *ngIf = "isMobile && viewerLoaded" [tunableProperties] = "tunableMobileProperties" diff --git a/src/ui/nehubaContainer/nehubaViewer/nehubaViewer.style.css b/src/ui/nehubaContainer/nehubaViewer/nehubaViewer.style.css index d28e3a33b7a0a3b6674a32a30ad02ac9dbc45853..a67e6b395efbd93c7ae581bc651d3b444a899a3c 100644 --- a/src/ui/nehubaContainer/nehubaViewer/nehubaViewer.style.css +++ b/src/ui/nehubaContainer/nehubaViewer/nehubaViewer.style.css @@ -1,4 +1,15 @@ div#neuroglancer-container { height:100%; + width: 100%; +} + +[placeholder] +{ + height:100%; + width: 100%; + justify-content: center; + align-items: center; + display:flex; + flex-direction: column; } \ No newline at end of file diff --git a/src/ui/nehubaContainer/nehubaViewer/nehubaViewer.template.html b/src/ui/nehubaContainer/nehubaViewer/nehubaViewer.template.html index a17ab3e398c61c66a293dc16f7a5649c1f898580..4af0dd0b58060aef059d247c7d7c6bac70e30378 100644 --- a/src/ui/nehubaContainer/nehubaViewer/nehubaViewer.template.html +++ b/src/ui/nehubaContainer/nehubaViewer/nehubaViewer.template.html @@ -1,7 +1,7 @@ <div id = "neuroglancer-container"> - <div *ngIf = "constantService.loadExportNehubaPromise ? !(constantService.loadExportNehubaPromise | async) : true"> + <div placeholder *ngIf = "constantService.loadExportNehubaPromise ? !(constantService.loadExportNehubaPromise | async) : true"> <h1 tyle = "text-align:center;"> - Loading Nehuba Viewer ... + loading nehuba viewer </h1> <h1 style = "text-align:center;"> <span class = "homeAnimationDots loadingAnimationDots">•</span> diff --git a/src/ui/templateParcellationCitations/templateParcellationCitations.component.ts b/src/ui/templateParcellationCitations/templateParcellationCitations.component.ts index 4754fe01f3c573f240c54748542c1e42c9c9bb46..edffccf8e86f1609e550d06e63b4c702afde635c 100644 --- a/src/ui/templateParcellationCitations/templateParcellationCitations.component.ts +++ b/src/ui/templateParcellationCitations/templateParcellationCitations.component.ts @@ -2,7 +2,7 @@ import { Component } from "@angular/core"; import { Observable } from "rxjs"; import { ViewerStateInterface, isDefined, safeFilter } from "../../services/stateStore.service"; import { Store, select } from "@ngrx/store"; -import { filter, switchMap, map } from "rxjs/operators"; +import { switchMap, map } from "rxjs/operators"; @Component({ selector : 'template-parcellation-citation-container',