cannam@480
|
1 /**
|
cannam@480
|
2 * Created by lucast on 31/05/2017.
|
cannam@480
|
3 */
|
cannam@480
|
4 import {
|
cannam@480
|
5 InspectableVerticallyBoundedComponent,
|
cannam@480
|
6 VerticallyBounded,
|
cannam@480
|
7 VerticalScaleRenderer,
|
cannam@480
|
8 VerticalValueInspectorRenderer,
|
cannam@480
|
9 WavesComponent
|
cannam@480
|
10 } from '../waves-base.component';
|
cannam@480
|
11 import {
|
cannam@480
|
12 ChangeDetectionStrategy,
|
cannam@480
|
13 Component,
|
cannam@480
|
14 Input,
|
cannam@480
|
15 } from '@angular/core';
|
cannam@480
|
16 import {Region} from '../FeatureUtilities';
|
cannam@480
|
17 import Waves from 'waves-ui-piper';
|
cannam@480
|
18
|
cannam@480
|
19 @Component({
|
cannam@480
|
20 selector: 'ugly-regions',
|
cannam@480
|
21 templateUrl: '../waves-template.html',
|
cannam@480
|
22 styleUrls: ['../waves-template.css'],
|
cannam@480
|
23 changeDetection: ChangeDetectionStrategy.OnPush,
|
cannam@480
|
24 providers: [
|
cannam@480
|
25 { provide: VerticallyBounded, useExisting: RegionsComponent },
|
cannam@480
|
26 { provide: VerticalScaleRenderer, useExisting: RegionsComponent },
|
cannam@480
|
27 {provide: VerticalValueInspectorRenderer, useExisting: RegionsComponent },
|
cannam@480
|
28 {provide: WavesComponent, useExisting: RegionsComponent}
|
cannam@480
|
29 ]
|
cannam@480
|
30 })
|
cannam@480
|
31 export class RegionsComponent extends InspectableVerticallyBoundedComponent<Region[]> {
|
cannam@480
|
32 private currentVerticalRange: [number, number];
|
cannam@480
|
33
|
cannam@480
|
34 get range(): [number, number] {
|
cannam@480
|
35 return this.currentVerticalRange;
|
cannam@480
|
36 }
|
cannam@480
|
37
|
cannam@480
|
38 @Input() set regions(regions: Region[]) {
|
cannam@480
|
39 this.feature = regions;
|
cannam@480
|
40 }
|
cannam@480
|
41
|
cannam@480
|
42 protected get featureLayers(): Layer[] {
|
cannam@480
|
43 this.currentVerticalRange = findVerticalRange(this.feature);
|
cannam@480
|
44 return [
|
cannam@481
|
45 new Waves.helpers.RegionLayer(
|
cannam@480
|
46 this.feature,
|
cannam@480
|
47 {
|
cannam@480
|
48 height: this.height,
|
cannam@480
|
49 color: this.colour,
|
cannam@480
|
50 yDomain: this.currentVerticalRange
|
cannam@480
|
51 }
|
cannam@480
|
52 )
|
cannam@480
|
53 ];
|
cannam@480
|
54 }
|
cannam@480
|
55 }
|
cannam@480
|
56
|
cannam@480
|
57 // TODO there might be scope to create a generic utility function like this
|
cannam@480
|
58 function findVerticalRange(regions: Region[]): [number, number] {
|
cannam@480
|
59 let [min, max] = regions.reduce((acc, region) => {
|
cannam@480
|
60 const [min, max] = acc;
|
cannam@480
|
61 return [Math.min (min, region.value), Math.max (max, region.value)];
|
cannam@480
|
62 }, [Infinity, -Infinity]);
|
cannam@480
|
63 if (min === Infinity) {
|
cannam@480
|
64 min = 0;
|
cannam@480
|
65 max = 1;
|
cannam@480
|
66 }
|
cannam@480
|
67 return [ min, max ];
|
cannam@480
|
68 }
|