@jax-data-science/sci-image-visualizer 0.17.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/contracts/display-types.mjs +3 -2
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
- package/esm2022/lib/geometry/place.mjs +47 -0
- package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +81 -15
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +325 -18
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +182 -24
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +30 -2
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +111 -28
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +14 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +180 -48
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +28 -8
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
- package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
- package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
- package/esm2022/lib/region-source/region-tiles.mjs +1 -1
- package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
- package/esm2022/lib/routing-visualizer.service.mjs +404 -7
- package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
- package/esm2022/lib/spatial/plane-cells.mjs +119 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +298 -5
- package/esm2022/lib/spatial/spatial-encoding.mjs +35 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
- package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
- package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
- package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +47 -12
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +38 -10
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
- package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
- package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
- package/esm2022/lib/store/region-source-scope.mjs +10 -1
- package/esm2022/lib/store/region-store.service.mjs +33 -2
- package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
- package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
- package/esm2022/lib/visualizer.component.mjs +40 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4521 -759
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
- package/fesm2022/region-source.worker.js +84 -2
- package/lib/contracts/display-types.d.ts +90 -4
- package/lib/contracts/image.contract.d.ts +6 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
- package/lib/contracts/region-editor-api.contract.d.ts +9 -0
- package/lib/contracts/region-store.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
- package/lib/contracts/visualizer.contract.d.ts +43 -1
- package/lib/geometry/cell-meshes.d.ts +27 -0
- package/lib/geometry/place.d.ts +45 -0
- package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
- package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
- package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +87 -0
- package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +49 -8
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +15 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +38 -19
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +53 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
- package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
- package/lib/region-editor/region-editor.component.d.ts +4 -0
- package/lib/region-source/region-source-ops.d.ts +12 -0
- package/lib/region-source/region-tiles.d.ts +8 -0
- package/lib/region-source/worker-region-source.d.ts +18 -0
- package/lib/routing-visualizer.service.d.ts +140 -1
- package/lib/spatial/observations-in-selection.d.ts +43 -0
- package/lib/spatial/plane-cells.d.ts +37 -0
- package/lib/spatial/spatial-controls.facade.d.ts +59 -0
- package/lib/spatial/spatial-encoding.d.ts +14 -1
- package/lib/spatial/spatial-hover.d.ts +23 -0
- package/lib/spatial/spatial-planes.d.ts +22 -0
- package/lib/spatial/spatial-selection.d.ts +2 -1
- package/lib/spatial/spatial-tile-merge.d.ts +9 -0
- package/lib/spatial/transcripts-in-selection.d.ts +95 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
- package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +17 -2
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +16 -6
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
- package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
- package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
- package/lib/store/region-source-scope.d.ts +4 -0
- package/lib/store/region-store.service.d.ts +21 -0
- package/lib/toolbar/toolbar.component.d.ts +6 -1
- package/lib/visualizer/spatial-region-set.d.ts +55 -0
- package/lib/visualizer.component.d.ts +14 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +0 -1
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { DropdownModule } from 'primeng/dropdown';
|
|
5
|
+
import { SelectButtonModule } from 'primeng/selectbutton';
|
|
6
|
+
import { DEFAULT_SPATIAL_VIEW } from '../../contracts/display-types';
|
|
7
|
+
import { cellTypeColumnFor } from '../../spatial/lod';
|
|
8
|
+
import { SpatialGroupsPanelComponent } from '../spatial-groups-panel/spatial-groups-panel.component';
|
|
9
|
+
import { SpatialKeyComponent } from '../spatial-key/spatial-key.component';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@angular/common";
|
|
12
|
+
import * as i2 from "@angular/forms";
|
|
13
|
+
import * as i3 from "primeng/dropdown";
|
|
14
|
+
import * as i4 from "primeng/selectbutton";
|
|
15
|
+
/**
|
|
16
|
+
* The Observations section's "Colour by": one colouring for the markers and the cells alike —
|
|
17
|
+
* a grouping (the {@link SpatialGroupsPanelComponent groups} with their colours and switches),
|
|
18
|
+
* one gene's expression, a measurement (a numeric column), or one colour. Each choice writes
|
|
19
|
+
* the markers' colour source (`colorBy`) and the cells' (`cellColorMode` and its own fields)
|
|
20
|
+
* together, so the two cannot disagree.
|
|
21
|
+
*
|
|
22
|
+
* Writes only through `controls.setViewState`.
|
|
23
|
+
*/
|
|
24
|
+
export class SpatialColorByComponent {
|
|
25
|
+
constructor() {
|
|
26
|
+
/** The spatial controls this panel reads and writes through; null without a `SPATIAL_DATA_PORT`. */
|
|
27
|
+
this.controls = null;
|
|
28
|
+
/** The dataset on offer, or null. */
|
|
29
|
+
this.dataset = null;
|
|
30
|
+
/** The current spatial view state. */
|
|
31
|
+
this.view = DEFAULT_SPATIAL_VIEW;
|
|
32
|
+
/** The gene list the gene colouring picks from, shared with the other gene dropdowns. */
|
|
33
|
+
this.genes = null;
|
|
34
|
+
/** The key's categorical legend, or null (continuous). */
|
|
35
|
+
this.legend = null;
|
|
36
|
+
/** The key's continuous colour bar (a CSS gradient), or null. */
|
|
37
|
+
this.colorBarCss = null;
|
|
38
|
+
/** The selected category (its code), for highlighting its group. */
|
|
39
|
+
this.selectedCategory = null;
|
|
40
|
+
/** Colormap tree for the continuous colour scale. */
|
|
41
|
+
this.colormapOptions = [];
|
|
42
|
+
/** A group was clicked: its category's code, to select its observations. */
|
|
43
|
+
this.categoryClicked = new EventEmitter();
|
|
44
|
+
/** Virtual-scrolled only past this many options (see the gene dropdowns elsewhere). */
|
|
45
|
+
this.geneVirtualScrollFrom = 200;
|
|
46
|
+
/** The modes the dataset can be coloured in. */
|
|
47
|
+
this.modeOptions = [];
|
|
48
|
+
/** The dataset's numeric columns. */
|
|
49
|
+
this.measureOptions = [];
|
|
50
|
+
/** A mode picked before its gene or measurement is: shown, nothing written yet. */
|
|
51
|
+
this.pending = null;
|
|
52
|
+
}
|
|
53
|
+
ngOnChanges(changes) {
|
|
54
|
+
if (changes['dataset']) {
|
|
55
|
+
const columns = this.dataset?.columns ?? [];
|
|
56
|
+
this.measureOptions = columns
|
|
57
|
+
.filter((c) => c.kind === 'continuous')
|
|
58
|
+
.map((c) => ({
|
|
59
|
+
label: c.kind === 'continuous' && c.unit ? `${c.name} (${c.unit})` : c.name,
|
|
60
|
+
value: c.name,
|
|
61
|
+
}));
|
|
62
|
+
this.modeOptions = [
|
|
63
|
+
...(columns.some((c) => c.kind === 'categorical') ? [{ label: 'Group', value: 'group' }] : []),
|
|
64
|
+
...(this.dataset?.features ? [{ label: 'Gene', value: 'gene' }] : []),
|
|
65
|
+
...(this.measureOptions.length ? [{ label: 'Measurement', value: 'measure' }] : []),
|
|
66
|
+
{ label: 'Single colour', value: 'single' },
|
|
67
|
+
];
|
|
68
|
+
this.pending = null;
|
|
69
|
+
}
|
|
70
|
+
if (changes['view'] && this.pending && this.pending === this.viewMode)
|
|
71
|
+
this.pending = null;
|
|
72
|
+
}
|
|
73
|
+
/** The mode on show: one picked and waiting for its value, else what the view is coloured by. */
|
|
74
|
+
get mode() {
|
|
75
|
+
return this.pending ?? this.viewMode;
|
|
76
|
+
}
|
|
77
|
+
/** What the view is coloured by, as a mode; null for the flat default. */
|
|
78
|
+
get viewMode() {
|
|
79
|
+
const by = this.view.colorBy;
|
|
80
|
+
if (!by)
|
|
81
|
+
return this.view.cellColorMode === 'single' ? 'single' : null;
|
|
82
|
+
if (by.kind === 'feature')
|
|
83
|
+
return 'gene';
|
|
84
|
+
const meta = this.dataset?.columns.find((c) => c.name === by.name);
|
|
85
|
+
if (!meta)
|
|
86
|
+
return null;
|
|
87
|
+
return meta.kind === 'categorical' ? 'group' : 'measure';
|
|
88
|
+
}
|
|
89
|
+
/** The gene the observations are coloured by, or null. */
|
|
90
|
+
get selectedGene() {
|
|
91
|
+
return this.view.colorBy?.kind === 'feature' ? this.view.colorBy.name : null;
|
|
92
|
+
}
|
|
93
|
+
/** The measurement the observations are coloured by, or null. */
|
|
94
|
+
get selectedMeasure() {
|
|
95
|
+
const by = this.view.colorBy;
|
|
96
|
+
return by?.kind === 'column' && this.measureOptions.some((o) => o.value === by.name) ? by.name : null;
|
|
97
|
+
}
|
|
98
|
+
onMode(mode) {
|
|
99
|
+
if (!mode || mode === this.mode)
|
|
100
|
+
return;
|
|
101
|
+
this.pending = null;
|
|
102
|
+
switch (mode) {
|
|
103
|
+
case 'group': {
|
|
104
|
+
const name = this.dataset ? cellTypeColumnFor(this.dataset, this.view) : null;
|
|
105
|
+
if (name) {
|
|
106
|
+
this.controls?.setViewState({
|
|
107
|
+
cellTypeColumn: name,
|
|
108
|
+
cellColorMode: 'group',
|
|
109
|
+
colorBy: { kind: 'column', name },
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
case 'gene':
|
|
115
|
+
if (this.view.cellColorGene)
|
|
116
|
+
this.onGene(this.view.cellColorGene);
|
|
117
|
+
else
|
|
118
|
+
this.pending = 'gene';
|
|
119
|
+
return;
|
|
120
|
+
case 'measure':
|
|
121
|
+
this.pending = 'measure';
|
|
122
|
+
return;
|
|
123
|
+
case 'single':
|
|
124
|
+
this.controls?.setViewState({ colorBy: null, cellColorMode: 'single' });
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/** Colour the markers and the cells by gene `name`. */
|
|
129
|
+
onGene(name) {
|
|
130
|
+
if (!name)
|
|
131
|
+
return;
|
|
132
|
+
this.pending = null;
|
|
133
|
+
this.controls?.setViewState({
|
|
134
|
+
colorBy: { kind: 'feature', name },
|
|
135
|
+
logScale: !!this.dataset?.features?.logScaleHint,
|
|
136
|
+
cellColorMode: 'gene',
|
|
137
|
+
cellColorGene: name,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/** Colour the markers and the cells by measurement `name`. */
|
|
141
|
+
onMeasure(name) {
|
|
142
|
+
if (!name)
|
|
143
|
+
return;
|
|
144
|
+
this.pending = null;
|
|
145
|
+
const meta = this.dataset?.columns.find((c) => c.name === name);
|
|
146
|
+
this.controls?.setViewState({
|
|
147
|
+
colorBy: { kind: 'column', name },
|
|
148
|
+
logScale: meta?.kind === 'continuous' ? !!meta.logScaleHint : false,
|
|
149
|
+
cellColorMode: 'column',
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
onSingleColor(hex) {
|
|
153
|
+
this.controls?.setViewState({ cellSingleColor: hex, colorBy: null, cellColorMode: 'single' });
|
|
154
|
+
}
|
|
155
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialColorByComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
156
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SpatialColorByComponent, isStandalone: true, selector: "spatial-color-by", inputs: { controls: "controls", dataset: "dataset", view: "view", genes: "genes", legend: "legend", colorBarCss: "colorBarCss", selectedCategory: "selectedCategory", colormapOptions: "colormapOptions" }, outputs: { categoryClicked: "categoryClicked" }, usesOnChanges: true, ngImport: i0, template: "<!-- What colours the observations: one choice for the markers and the cells alike. -->\n<div class=\"sc-subhead\">Colour by</div>\n<p-selectButton\n [options]=\"modeOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"mode\"\n (ngModelChange)=\"onMode($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n class=\"sc-color-modes\"\n></p-selectButton>\n<small class=\"sc-hint\" *ngIf=\"!mode\">One flat colour. Choose what colours the observations.</small>\n\n<!-- Group: the grouping, its groups' colours and their switches. -->\n<spatial-groups-panel\n *ngIf=\"mode === 'group'\"\n [controls]=\"controls\"\n [dataset]=\"dataset\"\n [view]=\"view\"\n [selectedCategory]=\"selectedCategory\"\n (categoryClicked)=\"categoryClicked.emit($event)\"\n></spatial-groups-panel>\n\n<!-- Gene: one gene's expression, through the colormap. -->\n<ng-container *ngIf=\"mode === 'gene'\">\n <ng-container *ngIf=\"genes?.state$ | async as gene\">\n <div class=\"sc-section\" *ngIf=\"dataset?.features as features\">\n <label class=\"sc-lbl\" for=\"sc-gene\">Gene</label>\n <!-- A filterable dropdown, not a free-text box: the genes are visible before anything is\n typed, and each keystroke narrows a list the user can see. Virtual-scrolled because a\n targeted panel runs to a few thousand names. -->\n <p-dropdown\n inputId=\"sc-gene\"\n [options]=\"gene.options\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"selectedGene\"\n (ngModelChange)=\"onGene($event)\"\n [filter]=\"true\"\n filterBy=\"label\"\n [resetFilterOnHide]=\"true\"\n (onFilter)=\"genes?.onFilter($event.filter)\"\n (onShow)=\"genes?.ensureList()\"\n [virtualScroll]=\"gene.options.length > geneVirtualScrollFrom\"\n [virtualScrollItemSize]=\"30\"\n [emptyFilterMessage]=\"gene.remote ? 'No match \u2014 keep typing' : 'No match'\"\n [emptyMessage]=\"gene.remote ? 'Type to search genes' : 'No genes'\"\n appendTo=\"body\"\n placeholder=\"Search {{ features.count | number }} genes\u2026\"\n styleClass=\"sc-full\"\n ></p-dropdown>\n <small class=\"sc-hint\" *ngIf=\"gene.failed\">Gene lookup failed.</small>\n </div>\n </ng-container>\n</ng-container>\n\n<!-- Measurement: a numeric column, through the colormap. -->\n<div class=\"sc-section\" *ngIf=\"mode === 'measure'\">\n <label class=\"sc-lbl\" for=\"sc-measure\">Measurement</label>\n <p-dropdown\n inputId=\"sc-measure\"\n [options]=\"measureOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"selectedMeasure\"\n (ngModelChange)=\"onMeasure($event)\"\n placeholder=\"Pick a measurement\"\n appendTo=\"body\"\n styleClass=\"sc-full\"\n ></p-dropdown>\n</div>\n\n<!-- A gene or a measurement: its colour bar and colormap. -->\n<spatial-key\n *ngIf=\"(mode === 'gene' || mode === 'measure') && view.colorBy\"\n [controls]=\"controls\"\n [dataset]=\"dataset\"\n [view]=\"view\"\n [legend]=\"legend\"\n [colorBarCss]=\"colorBarCss\"\n [selectedCategory]=\"selectedCategory\"\n [colormapOptions]=\"colormapOptions\"\n (categoryClicked)=\"categoryClicked.emit($event)\"\n></spatial-key>\n\n<!-- Single colour: every marker and cell in one colour. -->\n<div class=\"sc-row\" *ngIf=\"mode === 'single'\">\n <span class=\"sc-lbl\">Colour</span>\n <input\n type=\"color\"\n class=\"sc-color-input\"\n [value]=\"view.cellSingleColor\"\n (change)=\"onSingleColor($any($event.target).value)\"\n />\n</div>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}.sc-subsection{display:flex;flex-direction:column;gap:.45rem}.sc-subsection-head{cursor:pointer;-webkit-user-select:none;user-select:none}.sc-subsection-head i{font-size:.65rem}.sc-subsection-head:hover .sc-subsection-title{color:var(--primary-color, #3b82f6)}.sc-subsection-body{display:flex;flex-direction:column;gap:.45rem;padding-left:.6rem;border-left:2px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}.sc-seltx-toggle{width:100%;padding:0;background:none;border:0;cursor:pointer;font-family:inherit;text-align:left}.sc-seltx-toggle i{font-size:.65rem}.sc-seltx-toggle:hover{color:var(--primary-color, #3b82f6)}.sc-seltx{display:flex;flex-direction:column;gap:.35rem}.sc-seltx-head{display:flex;align-items:baseline;gap:.5rem;min-width:0}.sc-seltx-label{font-size:.82rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-summary{display:flex;align-items:center;justify-content:space-between;font-size:.78rem}.sc-seltx-list{list-style:none;margin:0;padding:0;max-height:16rem;overflow-y:auto;font-size:.78rem}.sc-seltx-list.stale{opacity:.55}.sc-seltx-list li{display:grid;grid-template-columns:minmax(4rem,7rem) 1fr auto;align-items:center;gap:.5rem;padding:.1rem 0}.sc-seltx-gene{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-bar{height:.45rem;border-radius:2px;background:var(--surface-200, #e9ecef);overflow:hidden}.sc-seltx-bar span{display:block;height:100%;background:var(--primary-color, #3b82f6)}.sc-seltx-count{font-variant-numeric:tabular-nums;text-align:right;min-width:3rem}.sc-seltx-swatch{display:inline-block;width:.6rem;height:.6rem;margin-right:.35rem;border-radius:2px;vertical-align:baseline}.sc-seltx-measures{display:grid;grid-template-columns:minmax(4rem,1fr) auto;gap:.1rem .75rem;margin:0;font-size:.78rem}.sc-seltx-measures dt{color:var(--text-color-secondary, #6c757d);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-measures dd{margin:0;text-align:right;font-variant-numeric:tabular-nums}:host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i3.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i4.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey", "autofocus"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: SpatialGroupsPanelComponent, selector: "spatial-groups-panel", inputs: ["controls", "dataset", "view", "selectedCategory"], outputs: ["categoryClicked"] }, { kind: "component", type: SpatialKeyComponent, selector: "spatial-key", inputs: ["controls", "dataset", "view", "legend", "colorBarCss", "selectedCategory", "colormapOptions"], outputs: ["categoryClicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
157
|
+
}
|
|
158
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialColorByComponent, decorators: [{
|
|
159
|
+
type: Component,
|
|
160
|
+
args: [{ selector: 'spatial-color-by', standalone: true, imports: [
|
|
161
|
+
CommonModule,
|
|
162
|
+
FormsModule,
|
|
163
|
+
DropdownModule,
|
|
164
|
+
SelectButtonModule,
|
|
165
|
+
SpatialGroupsPanelComponent,
|
|
166
|
+
SpatialKeyComponent,
|
|
167
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- What colours the observations: one choice for the markers and the cells alike. -->\n<div class=\"sc-subhead\">Colour by</div>\n<p-selectButton\n [options]=\"modeOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"mode\"\n (ngModelChange)=\"onMode($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n class=\"sc-color-modes\"\n></p-selectButton>\n<small class=\"sc-hint\" *ngIf=\"!mode\">One flat colour. Choose what colours the observations.</small>\n\n<!-- Group: the grouping, its groups' colours and their switches. -->\n<spatial-groups-panel\n *ngIf=\"mode === 'group'\"\n [controls]=\"controls\"\n [dataset]=\"dataset\"\n [view]=\"view\"\n [selectedCategory]=\"selectedCategory\"\n (categoryClicked)=\"categoryClicked.emit($event)\"\n></spatial-groups-panel>\n\n<!-- Gene: one gene's expression, through the colormap. -->\n<ng-container *ngIf=\"mode === 'gene'\">\n <ng-container *ngIf=\"genes?.state$ | async as gene\">\n <div class=\"sc-section\" *ngIf=\"dataset?.features as features\">\n <label class=\"sc-lbl\" for=\"sc-gene\">Gene</label>\n <!-- A filterable dropdown, not a free-text box: the genes are visible before anything is\n typed, and each keystroke narrows a list the user can see. Virtual-scrolled because a\n targeted panel runs to a few thousand names. -->\n <p-dropdown\n inputId=\"sc-gene\"\n [options]=\"gene.options\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"selectedGene\"\n (ngModelChange)=\"onGene($event)\"\n [filter]=\"true\"\n filterBy=\"label\"\n [resetFilterOnHide]=\"true\"\n (onFilter)=\"genes?.onFilter($event.filter)\"\n (onShow)=\"genes?.ensureList()\"\n [virtualScroll]=\"gene.options.length > geneVirtualScrollFrom\"\n [virtualScrollItemSize]=\"30\"\n [emptyFilterMessage]=\"gene.remote ? 'No match \u2014 keep typing' : 'No match'\"\n [emptyMessage]=\"gene.remote ? 'Type to search genes' : 'No genes'\"\n appendTo=\"body\"\n placeholder=\"Search {{ features.count | number }} genes\u2026\"\n styleClass=\"sc-full\"\n ></p-dropdown>\n <small class=\"sc-hint\" *ngIf=\"gene.failed\">Gene lookup failed.</small>\n </div>\n </ng-container>\n</ng-container>\n\n<!-- Measurement: a numeric column, through the colormap. -->\n<div class=\"sc-section\" *ngIf=\"mode === 'measure'\">\n <label class=\"sc-lbl\" for=\"sc-measure\">Measurement</label>\n <p-dropdown\n inputId=\"sc-measure\"\n [options]=\"measureOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"selectedMeasure\"\n (ngModelChange)=\"onMeasure($event)\"\n placeholder=\"Pick a measurement\"\n appendTo=\"body\"\n styleClass=\"sc-full\"\n ></p-dropdown>\n</div>\n\n<!-- A gene or a measurement: its colour bar and colormap. -->\n<spatial-key\n *ngIf=\"(mode === 'gene' || mode === 'measure') && view.colorBy\"\n [controls]=\"controls\"\n [dataset]=\"dataset\"\n [view]=\"view\"\n [legend]=\"legend\"\n [colorBarCss]=\"colorBarCss\"\n [selectedCategory]=\"selectedCategory\"\n [colormapOptions]=\"colormapOptions\"\n (categoryClicked)=\"categoryClicked.emit($event)\"\n></spatial-key>\n\n<!-- Single colour: every marker and cell in one colour. -->\n<div class=\"sc-row\" *ngIf=\"mode === 'single'\">\n <span class=\"sc-lbl\">Colour</span>\n <input\n type=\"color\"\n class=\"sc-color-input\"\n [value]=\"view.cellSingleColor\"\n (change)=\"onSingleColor($any($event.target).value)\"\n />\n</div>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}.sc-subsection{display:flex;flex-direction:column;gap:.45rem}.sc-subsection-head{cursor:pointer;-webkit-user-select:none;user-select:none}.sc-subsection-head i{font-size:.65rem}.sc-subsection-head:hover .sc-subsection-title{color:var(--primary-color, #3b82f6)}.sc-subsection-body{display:flex;flex-direction:column;gap:.45rem;padding-left:.6rem;border-left:2px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}.sc-seltx-toggle{width:100%;padding:0;background:none;border:0;cursor:pointer;font-family:inherit;text-align:left}.sc-seltx-toggle i{font-size:.65rem}.sc-seltx-toggle:hover{color:var(--primary-color, #3b82f6)}.sc-seltx{display:flex;flex-direction:column;gap:.35rem}.sc-seltx-head{display:flex;align-items:baseline;gap:.5rem;min-width:0}.sc-seltx-label{font-size:.82rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-summary{display:flex;align-items:center;justify-content:space-between;font-size:.78rem}.sc-seltx-list{list-style:none;margin:0;padding:0;max-height:16rem;overflow-y:auto;font-size:.78rem}.sc-seltx-list.stale{opacity:.55}.sc-seltx-list li{display:grid;grid-template-columns:minmax(4rem,7rem) 1fr auto;align-items:center;gap:.5rem;padding:.1rem 0}.sc-seltx-gene{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-bar{height:.45rem;border-radius:2px;background:var(--surface-200, #e9ecef);overflow:hidden}.sc-seltx-bar span{display:block;height:100%;background:var(--primary-color, #3b82f6)}.sc-seltx-count{font-variant-numeric:tabular-nums;text-align:right;min-width:3rem}.sc-seltx-swatch{display:inline-block;width:.6rem;height:.6rem;margin-right:.35rem;border-radius:2px;vertical-align:baseline}.sc-seltx-measures{display:grid;grid-template-columns:minmax(4rem,1fr) auto;gap:.1rem .75rem;margin:0;font-size:.78rem}.sc-seltx-measures dt{color:var(--text-color-secondary, #6c757d);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-measures dd{margin:0;text-align:right;font-variant-numeric:tabular-nums}:host{display:contents}\n"] }]
|
|
168
|
+
}], propDecorators: { controls: [{
|
|
169
|
+
type: Input
|
|
170
|
+
}], dataset: [{
|
|
171
|
+
type: Input
|
|
172
|
+
}], view: [{
|
|
173
|
+
type: Input
|
|
174
|
+
}], genes: [{
|
|
175
|
+
type: Input
|
|
176
|
+
}], legend: [{
|
|
177
|
+
type: Input
|
|
178
|
+
}], colorBarCss: [{
|
|
179
|
+
type: Input
|
|
180
|
+
}], selectedCategory: [{
|
|
181
|
+
type: Input
|
|
182
|
+
}], colormapOptions: [{
|
|
183
|
+
type: Input
|
|
184
|
+
}], categoryClicked: [{
|
|
185
|
+
type: Output
|
|
186
|
+
}] } });
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1jb2xvci1ieS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwtY29udHJvbHMvc3BhdGlhbC1jb2xvci1ieS9zcGF0aWFsLWNvbG9yLWJ5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWNvbG9yLWJ5L3NwYXRpYWwtY29sb3ItYnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFJMUQsT0FBTyxFQUFnQixvQkFBb0IsRUFBb0IsTUFBTSwrQkFBK0IsQ0FBQztBQUNyRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd0RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUVyRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7Ozs7O0FBSzNFOzs7Ozs7OztHQVFHO0FBZ0JILE1BQU0sT0FBTyx1QkFBdUI7SUFmcEM7UUFnQkUsb0dBQW9HO1FBQzNGLGFBQVEsR0FBNEIsSUFBSSxDQUFDO1FBQ2xELHFDQUFxQztRQUM1QixZQUFPLEdBQTBCLElBQUksQ0FBQztRQUMvQyxzQ0FBc0M7UUFDN0IsU0FBSSxHQUFxQixvQkFBb0IsQ0FBQztRQUN2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VkNuRHBDLHdpSEFnR0EsNHRORHhESSxZQUFZLCtPQUNaLFdBQVcsOFZBQ1gsY0FBYyx1dENBQ2Qsa0JBQWtCLHlWQUNsQiwyQkFBMkIsNEpBQzNCLG1CQUFtQjs7MkZBTVYsdUJBQXVCO2tCQWZuQyxTQUFTOytCQUNFLGtCQUFrQixjQUNoQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQiwyQkFBMkI7d0JBQzNCLG1CQUFtQjtxQkFDcEIsbUJBR2dCLHVCQUF1QixDQUFDLE1BQU07OEJBSXRDLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRWEsZUFBZTtzQkFBakMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERyb3Bkb3duTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kcm9wZG93bic7XG5pbXBvcnQgeyBTZWxlY3RCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL3NlbGVjdGJ1dHRvbic7XG5cbmltcG9ydCB0eXBlIHsgSVNwYXRpYWxDb250cm9scyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB0eXBlIHsgU3BhdGlhbERhdGFzZXQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IENvbG9ybWFwTm9kZSwgREVGQVVMVF9TUEFUSUFMX1ZJRVcsIFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBjZWxsVHlwZUNvbHVtbkZvciB9IGZyb20gJy4uLy4uL3NwYXRpYWwvbG9kJztcbmltcG9ydCB0eXBlIHsgUGFuZWxPcHRpb24gfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtcGFuZWwtbW9kZWwnO1xuaW1wb3J0IHR5cGUgeyBHZW5lUGlja2VyTW9kZWwgfSBmcm9tICcuLi9zcGF0aWFsLWdlbmUtcGlja2VyJztcbmltcG9ydCB7IFNwYXRpYWxHcm91cHNQYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL3NwYXRpYWwtZ3JvdXBzLXBhbmVsL3NwYXRpYWwtZ3JvdXBzLXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxMZWdlbmRFbnRyeSB9IGZyb20gJy4uL3NwYXRpYWwta2V5L3NwYXRpYWwta2V5Lm1vZGVsJztcbmltcG9ydCB7IFNwYXRpYWxLZXlDb21wb25lbnQgfSBmcm9tICcuLi9zcGF0aWFsLWtleS9zcGF0aWFsLWtleS5jb21wb25lbnQnO1xuXG4vKiogV2hhdCBjb2xvdXJzIHRoZSBvYnNlcnZhdGlvbnM6IGEgZ3JvdXBpbmcsIGEgZ2VuZSwgYSBtZWFzdXJlbWVudCwgb3Igb25lIGNvbG91ci4gKi9cbmV4cG9ydCB0eXBlIENvbG9yQnlNb2RlID0gJ2dyb3VwJyB8ICdnZW5lJyB8ICdtZWFzdXJlJyB8ICdzaW5nbGUnO1xuXG4vKipcbiAqIFRoZSBPYnNlcnZhdGlvbnMgc2VjdGlvbidzIFwiQ29sb3VyIGJ5XCI6IG9uZSBjb2xvdXJpbmcgZm9yIHRoZSBtYXJrZXJzIGFuZCB0aGUgY2VsbHMgYWxpa2Ug4oCUXG4gKiBhIGdyb3VwaW5nICh0aGUge0BsaW5rIFNwYXRpYWxHcm91cHNQYW5lbENvbXBvbmVudCBncm91cHN9IHdpdGggdGhlaXIgY29sb3VycyBhbmQgc3dpdGNoZXMpLFxuICogb25lIGdlbmUncyBleHByZXNzaW9uLCBhIG1lYXN1cmVtZW50IChhIG51bWVyaWMgY29sdW1uKSwgb3Igb25lIGNvbG91ci4gRWFjaCBjaG9pY2Ugd3JpdGVzXG4gKiB0aGUgbWFya2VycycgY29sb3VyIHNvdXJjZSAoYGNvbG9yQnlgKSBhbmQgdGhlIGNlbGxzJyAoYGNlbGxDb2xvck1vZGVgIGFuZCBpdHMgb3duIGZpZWxkcylcbiAqIHRvZ2V0aGVyLCBzbyB0aGUgdHdvIGNhbm5vdCBkaXNhZ3JlZS5cbiAqXG4gKiBXcml0ZXMgb25seSB0aHJvdWdoIGBjb250cm9scy5zZXRWaWV3U3RhdGVgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcGF0aWFsLWNvbG9yLWJ5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBEcm9wZG93bk1vZHVsZSxcbiAgICBTZWxlY3RCdXR0b25Nb2R1bGUsXG4gICAgU3BhdGlhbEdyb3Vwc1BhbmVsQ29tcG9uZW50LFxuICAgIFNwYXRpYWxLZXlDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zcGF0aWFsLWNvbG9yLWJ5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3BhdGlhbC1jb2xvci1ieS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU3BhdGlhbENvbG9yQnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKiogVGhlIHNwYXRpYWwgY29udHJvbHMgdGhpcyBwYW5lbCByZWFkcyBhbmQgd3JpdGVzIHRocm91Z2g7IG51bGwgd2l0aG91dCBhIGBTUEFUSUFMX0RBVEFfUE9SVGAuICovXG4gIEBJbnB1dCgpIGNvbnRyb2xzOiBJU3BhdGlhbENvbnRyb2xzIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgZGF0YXNldCBvbiBvZmZlciwgb3IgbnVsbC4gKi9cbiAgQElucHV0KCkgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBjdXJyZW50IHNwYXRpYWwgdmlldyBzdGF0ZS4gKi9cbiAgQElucHV0KCkgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSA9IERFRkFVTFRfU1BBVElBTF9WSUVXO1xuICAvKiogVGhlIGdlbmUgbGlzdCB0aGUgZ2VuZSBjb2xvdXJpbmcgcGlja3MgZnJvbSwgc2hhcmVkIHdpdGggdGhlIG90aGVyIGdlbmUgZHJvcGRvd25zLiAqL1xuICBASW5wdXQoKSBnZW5lczogR2VuZVBpY2tlck1vZGVsIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUga2V5J3MgY2F0ZWdvcmljYWwgbGVnZW5kLCBvciBudWxsIChjb250aW51b3VzKS4gKi9cbiAgQElucHV0KCkgbGVnZW5kOiBTcGF0aWFsTGVnZW5kRW50cnlbXSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGtleSdzIGNvbnRpbnVvdXMgY29sb3VyIGJhciAoYSBDU1MgZ3JhZGllbnQpLCBvciBudWxsLiAqL1xuICBASW5wdXQoKSBjb2xvckJhckNzczogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgc2VsZWN0ZWQgY2F0ZWdvcnkgKGl0cyBjb2RlKSwgZm9yIGhpZ2hsaWdodGluZyBpdHMgZ3JvdXAuICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkQ2F0ZWdvcnk6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogQ29sb3JtYXAgdHJlZSBmb3IgdGhlIGNvbnRpbnVvdXMgY29sb3VyIHNjYWxlLiAqL1xuICBASW5wdXQoKSBjb2xvcm1hcE9wdGlvbnM6IENvbG9ybWFwTm9kZVtdID0gW107XG4gIC8qKiBBIGdyb3VwIHdhcyBjbGlja2VkOiBpdHMgY2F0ZWdvcnkncyBjb2RlLCB0byBzZWxlY3QgaXRzIG9ic2VydmF0aW9ucy4gKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNhdGVnb3J5Q2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIC8qKiBWaXJ0dWFsLXNjcm9sbGVkIG9ubHkgcGFzdCB0aGlzIG1hbnkgb3B0aW9ucyAoc2VlIHRoZSBnZW5lIGRyb3Bkb3ducyBlbHNld2hlcmUpLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZVZpcnR1YWxTY3JvbGxGcm9tID0gMjAwO1xuICAvKiogVGhlIG1vZGVzIHRoZSBkYXRhc2V0IGNhbiBiZSBjb2xvdXJlZCBpbi4gKi9cbiAgcHJvdGVjdGVkIG1vZGVPcHRpb25zOiBQYW5lbE9wdGlvbjxDb2xvckJ5TW9kZT5bXSA9IFtdO1xuICAvKiogVGhlIGRhdGFzZXQncyBudW1lcmljIGNvbHVtbnMuICovXG4gIHByb3RlY3RlZCBtZWFzdXJlT3B0aW9uczogUGFuZWxPcHRpb248c3RyaW5nPltdID0gW107XG4gIC8qKiBBIG1vZGUgcGlja2VkIGJlZm9yZSBpdHMgZ2VuZSBvciBtZWFzdXJlbWVudCBpczogc2hvd24sIG5vdGhpbmcgd3JpdHRlbiB5ZXQuICovXG4gIHByaXZhdGUgcGVuZGluZzogQ29sb3JCeU1vZGUgfCBudWxsID0gbnVsbDtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGFzZXQnXSkge1xuICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZGF0YXNldD8uY29sdW1ucyA/PyBbXTtcbiAgICAgIHRoaXMubWVhc3VyZU9wdGlvbnMgPSBjb2x1bW5zXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMua2luZCA9PT0gJ2NvbnRpbnVvdXMnKVxuICAgICAgICAubWFwKChjKSA9PiAoe1xuICAgICAgICAgIGxhYmVsOiBjLmtpbmQgPT09ICdjb250aW51b3VzJyAmJiBjLnVuaXQgPyBgJHtjLm5hbWV9ICgke2MudW5pdH0pYCA6IGMubmFtZSxcbiAgICAgICAgICB2YWx1ZTogYy5uYW1lLFxuICAgICAgICB9KSk7XG4gICAgICB0aGlzLm1vZGVPcHRpb25zID0gW1xuICAgICAgICAuLi4oY29sdW1ucy5zb21lKChjKSA9PiBjLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcpID8gW3sgbGFiZWw6ICdHcm91cCcsIHZhbHVlOiAnZ3JvdXAnIGFzIGNvbnN0IH1dIDogW10pLFxuICAgICAgICAuLi4odGhpcy5kYXRhc2V0Py5mZWF0dXJlcyA/IFt7IGxhYmVsOiAnR2VuZScsIHZhbHVlOiAnZ2VuZScgYXMgY29uc3QgfV0gOiBbXSksXG4gICAgICAgIC4uLih0aGlzLm1lYXN1cmVPcHRpb25zLmxlbmd0aCA/IFt7IGxhYmVsOiAnTWVhc3VyZW1lbnQnLCB2YWx1ZTogJ21lYXN1cmUnIGFzIGNvbnN0IH1dIDogW10pLFxuICAgICAgICB7IGxhYmVsOiAnU2luZ2xlIGNvbG91cicsIHZhbHVlOiAnc2luZ2xlJyBhcyBjb25zdCB9LFxuICAgICAgXTtcbiAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd2aWV3J10gJiYgdGhpcy5wZW5kaW5nICYmIHRoaXMucGVuZGluZyA9PT0gdGhpcy52aWV3TW9kZSkgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBUaGUgbW9kZSBvbiBzaG93OiBvbmUgcGlja2VkIGFuZCB3YWl0aW5nIGZvciBpdHMgdmFsdWUsIGVsc2Ugd2hhdCB0aGUgdmlldyBpcyBjb2xvdXJlZCBieS4gKi9cbiAgcHJvdGVjdGVkIGdldCBtb2RlKCk6IENvbG9yQnlNb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZyA/PyB0aGlzLnZpZXdNb2RlO1xuICB9XG5cbiAgLyoqIFdoYXQgdGhlIHZpZXcgaXMgY29sb3VyZWQgYnksIGFzIGEgbW9kZTsgbnVsbCBmb3IgdGhlIGZsYXQgZGVmYXVsdC4gKi9cbiAgcHJpdmF0ZSBnZXQgdmlld01vZGUoKTogQ29sb3JCeU1vZGUgfCBudWxsIHtcbiAgICBjb25zdCBieSA9IHRoaXMudmlldy5jb2xvckJ5O1xuICAgIGlmICghYnkpIHJldHVybiB0aGlzLnZpZXcuY2VsbENvbG9yTW9kZSA9PT0gJ3NpbmdsZScgPyAnc2luZ2xlJyA6IG51bGw7XG4gICAgaWYgKGJ5LmtpbmQgPT09ICdmZWF0dXJlJykgcmV0dXJuICdnZW5lJztcbiAgICBjb25zdCBtZXRhID0gdGhpcy5kYXRhc2V0Py5jb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gYnkubmFtZSk7XG4gICAgaWYgKCFtZXRhKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbWV0YS5raW5kID09PSAnY2F0ZWdvcmljYWwnID8gJ2dyb3VwJyA6ICdtZWFzdXJlJztcbiAgfVxuXG4gIC8qKiBUaGUgZ2VuZSB0aGUgb2JzZXJ2YXRpb25zIGFyZSBjb2xvdXJlZCBieSwgb3IgbnVsbC4gKi9cbiAgcHJvdGVjdGVkIGdldCBzZWxlY3RlZEdlbmUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudmlldy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScgPyB0aGlzLnZpZXcuY29sb3JCeS5uYW1lIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBUaGUgbWVhc3VyZW1lbnQgdGhlIG9ic2VydmF0aW9ucyBhcmUgY29sb3VyZWQgYnksIG9yIG51bGwuICovXG4gIHByb3RlY3RlZCBnZXQgc2VsZWN0ZWRNZWFzdXJlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGJ5ID0gdGhpcy52aWV3LmNvbG9yQnk7XG4gICAgcmV0dXJuIGJ5Py5raW5kID09PSAnY29sdW1uJyAmJiB0aGlzLm1lYXN1cmVPcHRpb25zLnNvbWUoKG8pID0+IG8udmFsdWUgPT09IGJ5Lm5hbWUpID8gYnkubmFtZSA6IG51bGw7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Nb2RlKG1vZGU6IENvbG9yQnlNb2RlIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghbW9kZSB8fCBtb2RlID09PSB0aGlzLm1vZGUpIHJldHVybjtcbiAgICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSAnZ3JvdXAnOiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmRhdGFzZXQgPyBjZWxsVHlwZUNvbHVtbkZvcih0aGlzLmRhdGFzZXQsIHRoaXMudmlldykgOiBudWxsO1xuICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7XG4gICAgICAgICAgICBjZWxsVHlwZUNvbHVtbjogbmFtZSxcbiAgICAgICAgICAgIGNlbGxDb2xvck1vZGU6ICdncm91cCcsXG4gICAgICAgICAgICBjb2xvckJ5OiB7IGtpbmQ6ICdjb2x1bW4nLCBuYW1lIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAnZ2VuZSc6XG4gICAgICAgIGlmICh0aGlzLnZpZXcuY2VsbENvbG9yR2VuZSkgdGhpcy5vbkdlbmUodGhpcy52aWV3LmNlbGxDb2xvckdlbmUpO1xuICAgICAgICBlbHNlIHRoaXMucGVuZGluZyA9ICdnZW5lJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnbWVhc3VyZSc6XG4gICAgICAgIHRoaXMucGVuZGluZyA9ICdtZWFzdXJlJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnc2luZ2xlJzpcbiAgICAgICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY29sb3JCeTogbnVsbCwgY2VsbENvbG9yTW9kZTogJ3NpbmdsZScgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKiogQ29sb3VyIHRoZSBtYXJrZXJzIGFuZCB0aGUgY2VsbHMgYnkgZ2VuZSBgbmFtZWAuICovXG4gIHByb3RlY3RlZCBvbkdlbmUobmFtZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHtcbiAgICAgIGNvbG9yQnk6IHsga2luZDogJ2ZlYXR1cmUnLCBuYW1lIH0sXG4gICAgICBsb2dTY2FsZTogISF0aGlzLmRhdGFzZXQ/LmZlYXR1cmVzPy5sb2dTY2FsZUhpbnQsXG4gICAgICBjZWxsQ29sb3JNb2RlOiAnZ2VuZScsXG4gICAgICBjZWxsQ29sb3JHZW5lOiBuYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIENvbG91ciB0aGUgbWFya2VycyBhbmQgdGhlIGNlbGxzIGJ5IG1lYXN1cmVtZW50IGBuYW1lYC4gKi9cbiAgcHJvdGVjdGVkIG9uTWVhc3VyZShuYW1lOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm47XG4gICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5kYXRhc2V0Py5jb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gbmFtZSk7XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHtcbiAgICAgIGNvbG9yQnk6IHsga2luZDogJ2NvbHVtbicsIG5hbWUgfSxcbiAgICAgIGxvZ1NjYWxlOiBtZXRhPy5raW5kID09PSAnY29udGludW91cycgPyAhIW1ldGEubG9nU2NhbGVIaW50IDogZmFsc2UsXG4gICAgICBjZWxsQ29sb3JNb2RlOiAnY29sdW1uJyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNpbmdsZUNvbG9yKGhleDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbFNpbmdsZUNvbG9yOiBoZXgsIGNvbG9yQnk6IG51bGwsIGNlbGxDb2xvck1vZGU6ICdzaW5nbGUnIH0pO1xuICB9XG59XG4iLCI8IS0tIFdoYXQgY29sb3VycyB0aGUgb2JzZXJ2YXRpb25zOiBvbmUgY2hvaWNlIGZvciB0aGUgbWFya2VycyBhbmQgdGhlIGNlbGxzIGFsaWtlLiAtLT5cbjxkaXYgY2xhc3M9XCJzYy1zdWJoZWFkXCI+Q29sb3VyIGJ5PC9kaXY+XG48cC1zZWxlY3RCdXR0b25cbiAgW29wdGlvbnNdPVwibW9kZU9wdGlvbnNcIlxuICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gIFtuZ01vZGVsXT1cIm1vZGVcIlxuICAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGUoJGV2ZW50KVwiXG4gIFthbGxvd0VtcHR5XT1cImZhbHNlXCJcbiAgc3R5bGVDbGFzcz1cInNjLWJ1dHRvbnNcIlxuICBjbGFzcz1cInNjLWNvbG9yLW1vZGVzXCJcbj48L3Atc2VsZWN0QnV0dG9uPlxuPHNtYWxsIGNsYXNzPVwic2MtaGludFwiICpuZ0lmPVwiIW1vZGVcIj5PbmUgZmxhdCBjb2xvdXIuIENob29zZSB3aGF0IGNvbG91cnMgdGhlIG9ic2VydmF0aW9ucy48L3NtYWxsPlxuXG48IS0tIEdyb3VwOiB0aGUgZ3JvdXBpbmcsIGl0cyBncm91cHMnIGNvbG91cnMgYW5kIHRoZWlyIHN3aXRjaGVzLiAtLT5cbjxzcGF0aWFsLWdyb3Vwcy1wYW5lbFxuICAqbmdJZj1cIm1vZGUgPT09ICdncm91cCdcIlxuICBbY29udHJvbHNdPVwiY29udHJvbHNcIlxuICBbZGF0YXNldF09XCJkYXRhc2V0XCJcbiAgW3ZpZXddPVwidmlld1wiXG4gIFtzZWxlY3RlZENhdGVnb3J5XT1cInNlbGVjdGVkQ2F0ZWdvcnlcIlxuICAoY2F0ZWdvcnlDbGlja2VkKT1cImNhdGVnb3J5Q2xpY2tlZC5lbWl0KCRldmVudClcIlxuPjwvc3BhdGlhbC1ncm91cHMtcGFuZWw+XG5cbjwhLS0gR2VuZTogb25lIGdlbmUncyBleHByZXNzaW9uLCB0aHJvdWdoIHRoZSBjb2xvcm1hcC4gLS0+XG48bmctY29udGFpbmVyICpuZ0lmPVwibW9kZSA9PT0gJ2dlbmUnXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZW5lcz8uc3RhdGUkIHwgYXN5bmMgYXMgZ2VuZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJzYy1zZWN0aW9uXCIgKm5nSWY9XCJkYXRhc2V0Py5mZWF0dXJlcyBhcyBmZWF0dXJlc1wiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwic2MtbGJsXCIgZm9yPVwic2MtZ2VuZVwiPkdlbmU8L2xhYmVsPlxuICAgICAgPCEtLSBBIGZpbHRlcmFibGUgZHJvcGRvd24sIG5vdCBhIGZyZWUtdGV4dCBib3g6IHRoZSBnZW5lcyBhcmUgdmlzaWJsZSBiZWZvcmUgYW55dGhpbmcgaXNcbiAgICAgICAgICAgdHlwZWQsIGFuZCBlYWNoIGtleXN0cm9rZSBuYXJyb3dzIGEgbGlzdCB0aGUgdXNlciBjYW4gc2VlLiBWaXJ0dWFsLXNjcm9sbGVkIGJlY2F1c2UgYVxuICAgICAgICAgICB0YXJnZXRlZCBwYW5lbCBydW5zIHRvIGEgZmV3IHRob3VzYW5kIG5hbWVzLiAtLT5cbiAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgIGlucHV0SWQ9XCJzYy1nZW5lXCJcbiAgICAgICAgW29wdGlvbnNdPVwiZ2VuZS5vcHRpb25zXCJcbiAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZEdlbmVcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkdlbmUoJGV2ZW50KVwiXG4gICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICAgIGZpbHRlckJ5PVwibGFiZWxcIlxuICAgICAgICBbcmVzZXRGaWx0ZXJPbkhpZGVdPVwidHJ1ZVwiXG4gICAgICAgIChvbkZpbHRlcik9XCJnZW5lcz8ub25GaWx0ZXIoJGV2ZW50LmZpbHRlcilcIlxuICAgICAgICAob25TaG93KT1cImdlbmVzPy5lbnN1cmVMaXN0KClcIlxuICAgICAgICBbdmlydHVhbFNjcm9sbF09XCJnZW5lLm9wdGlvbnMubGVuZ3RoID4gZ2VuZVZpcnR1YWxTY3JvbGxGcm9tXCJcbiAgICAgICAgW3ZpcnR1YWxTY3JvbGxJdGVtU2l6ZV09XCIzMFwiXG4gICAgICAgIFtlbXB0eUZpbHRlck1lc3NhZ2VdPVwiZ2VuZS5yZW1vdGUgPyAnTm8gbWF0Y2gg4oCUIGtlZXAgdHlwaW5nJyA6ICdObyBtYXRjaCdcIlxuICAgICAgICBbZW1wdHlNZXNzYWdlXT1cImdlbmUucmVtb3RlID8gJ1R5cGUgdG8gc2VhcmNoIGdlbmVzJyA6ICdObyBnZW5lcydcIlxuICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCB7eyBmZWF0dXJlcy5jb3VudCB8IG51bWJlciB9fSBnZW5lc+KAplwiXG4gICAgICAgIHN0eWxlQ2xhc3M9XCJzYy1mdWxsXCJcbiAgICAgID48L3AtZHJvcGRvd24+XG4gICAgICA8c21hbGwgY2xhc3M9XCJzYy1oaW50XCIgKm5nSWY9XCJnZW5lLmZhaWxlZFwiPkdlbmUgbG9va3VwIGZhaWxlZC48L3NtYWxsPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIE1lYXN1cmVtZW50OiBhIG51bWVyaWMgY29sdW1uLCB0aHJvdWdoIHRoZSBjb2xvcm1hcC4gLS0+XG48ZGl2IGNsYXNzPVwic2Mtc2VjdGlvblwiICpuZ0lmPVwibW9kZSA9PT0gJ21lYXN1cmUnXCI+XG4gIDxsYWJlbCBjbGFzcz1cInNjLWxibFwiIGZvcj1cInNjLW1lYXN1cmVcIj5NZWFzdXJlbWVudDwvbGFiZWw+XG4gIDxwLWRyb3Bkb3duXG4gICAgaW5wdXRJZD1cInNjLW1lYXN1cmVcIlxuICAgIFtvcHRpb25zXT1cIm1lYXN1cmVPcHRpb25zXCJcbiAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICBbbmdNb2RlbF09XCJzZWxlY3RlZE1lYXN1cmVcIlxuICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTWVhc3VyZSgkZXZlbnQpXCJcbiAgICBwbGFjZWhvbGRlcj1cIlBpY2sgYSBtZWFzdXJlbWVudFwiXG4gICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICBzdHlsZUNsYXNzPVwic2MtZnVsbFwiXG4gID48L3AtZHJvcGRvd24+XG48L2Rpdj5cblxuPCEtLSBBIGdlbmUgb3IgYSBtZWFzdXJlbWVudDogaXRzIGNvbG91ciBiYXIgYW5kIGNvbG9ybWFwLiAtLT5cbjxzcGF0aWFsLWtleVxuICAqbmdJZj1cIihtb2RlID09PSAnZ2VuZScgfHwgbW9kZSA9PT0gJ21lYXN1cmUnKSAmJiB2aWV3LmNvbG9yQnlcIlxuICBbY29udHJvbHNdPVwiY29udHJvbHNcIlxuICBbZGF0YXNldF09XCJkYXRhc2V0XCJcbiAgW3ZpZXddPVwidmlld1wiXG4gIFtsZWdlbmRdPVwibGVnZW5kXCJcbiAgW2NvbG9yQmFyQ3NzXT1cImNvbG9yQmFyQ3NzXCJcbiAgW3NlbGVjdGVkQ2F0ZWdvcnldPVwic2VsZWN0ZWRDYXRlZ29yeVwiXG4gIFtjb2xvcm1hcE9wdGlvbnNdPVwiY29sb3JtYXBPcHRpb25zXCJcbiAgKGNhdGVnb3J5Q2xpY2tlZCk9XCJjYXRlZ29yeUNsaWNrZWQuZW1pdCgkZXZlbnQpXCJcbj48L3NwYXRpYWwta2V5PlxuXG48IS0tIFNpbmdsZSBjb2xvdXI6IGV2ZXJ5IG1hcmtlciBhbmQgY2VsbCBpbiBvbmUgY29sb3VyLiAtLT5cbjxkaXYgY2xhc3M9XCJzYy1yb3dcIiAqbmdJZj1cIm1vZGUgPT09ICdzaW5nbGUnXCI+XG4gIDxzcGFuIGNsYXNzPVwic2MtbGJsXCI+Q29sb3VyPC9zcGFuPlxuICA8aW5wdXRcbiAgICB0eXBlPVwiY29sb3JcIlxuICAgIGNsYXNzPVwic2MtY29sb3ItaW5wdXRcIlxuICAgIFt2YWx1ZV09XCJ2aWV3LmNlbGxTaW5nbGVDb2xvclwiXG4gICAgKGNoYW5nZSk9XCJvblNpbmdsZUNvbG9yKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgLz5cbjwvZGl2PlxuIl19
|