@hestia-earth/ui-components 0.32.33 → 0.32.34
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/chart/distribution-chart/distribution-chart.component.d.ts +24 -0
- package/fesm2022/hestia-earth-ui-components.mjs +217 -14
- package/fesm2022/hestia-earth-ui-components.mjs.map +1 -1
- package/node/node-value-details/node-value-details.component.d.ts +6 -2
- package/package.json +1 -1
- package/select/filter-accordion.component.d.ts +1 -0
- package/select/filter.model.d.ts +2 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Signal } from '@angular/core';
|
|
2
|
+
import { ChartConfiguration, ChartData } from 'chart.js';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export interface HistogramChartDataItem {
|
|
5
|
+
label: string;
|
|
6
|
+
values: number[];
|
|
7
|
+
color?: string;
|
|
8
|
+
backgroundColor?: string;
|
|
9
|
+
borderColor?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class DistributionChartComponent {
|
|
12
|
+
protected readonly distribution: import("@angular/core").InputSignal<number[]>;
|
|
13
|
+
protected readonly value: import("@angular/core").InputSignal<number>;
|
|
14
|
+
protected readonly label: import("@angular/core").InputSignal<string>;
|
|
15
|
+
protected readonly nbBins: import("@angular/core").InputSignal<number>;
|
|
16
|
+
protected readonly config: import("@angular/core").InputSignal<Partial<ChartConfiguration>>;
|
|
17
|
+
private readonly groupedData;
|
|
18
|
+
private readonly singlePoint;
|
|
19
|
+
private readonly defaultConfig;
|
|
20
|
+
protected readonly dataConfig: Signal<ChartData>;
|
|
21
|
+
protected readonly configuration: Signal<Partial<ChartConfiguration>>;
|
|
22
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DistributionChartComponent, never>;
|
|
23
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DistributionChartComponent, "he-distribution-chart", never, { "distribution": { "alias": "distribution"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "nbBins": { "alias": "nbBins"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
24
|
+
}
|
|
@@ -646,7 +646,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
646
646
|
type: Input
|
|
647
647
|
}] } });
|
|
648
648
|
|
|
649
|
-
const defaultSettings$
|
|
649
|
+
const defaultSettings$3 = Object.freeze({
|
|
650
650
|
options: {
|
|
651
651
|
responsive: true,
|
|
652
652
|
maintainAspectRatio: false,
|
|
@@ -660,7 +660,7 @@ class ChartComponent {
|
|
|
660
660
|
this.data = input({});
|
|
661
661
|
this.config = input({});
|
|
662
662
|
this.configuration = computed(() => ({
|
|
663
|
-
...merge({}, defaultSettings$
|
|
663
|
+
...merge({}, defaultSettings$3, this.config()),
|
|
664
664
|
data: this.data()
|
|
665
665
|
}));
|
|
666
666
|
}
|
|
@@ -672,7 +672,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
672
672
|
args: [{ selector: 'he-chart', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ChartConfigurationDirective], template: "<div class=\"is-relative h-100 | chart-container\" #container>\n <canvas [chartConfiguration]=\"configuration()\" [chartContainer]=\"container\"></canvas>\n</div>\n", styles: [":host{display:block;height:100%;overflow:visible}.chart-container{min-height:50px}\n"] }]
|
|
673
673
|
}] });
|
|
674
674
|
|
|
675
|
-
const defaultSettings$
|
|
675
|
+
const defaultSettings$2 = Object.freeze({
|
|
676
676
|
type: 'horizontalBar',
|
|
677
677
|
options: {
|
|
678
678
|
events: [],
|
|
@@ -753,7 +753,7 @@ class BarChartComponent {
|
|
|
753
753
|
datasets: this.defaultDatasets(),
|
|
754
754
|
labels: this.data().map(({ label }) => label)
|
|
755
755
|
}));
|
|
756
|
-
this.configuration = computed(() => merge({}, defaultSettings$
|
|
756
|
+
this.configuration = computed(() => merge({}, defaultSettings$2, this.defaultConfig(), this.config()));
|
|
757
757
|
}
|
|
758
758
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: BarChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
759
759
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.1.4", type: BarChartComponent, isStandalone: true, selector: "he-bar-chart", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, datasets: { classPropertyName: "datasets", publicName: "datasets", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<he-chart [data]=\"dataConfig()\" [config]=\"configuration()\" />\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: ChartComponent, selector: "he-chart", inputs: ["data", "config"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
@@ -763,7 +763,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
763
763
|
args: [{ selector: 'he-bar-chart', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ChartComponent], template: "<he-chart [data]=\"dataConfig()\" [config]=\"configuration()\" />\n", styles: [":host{display:block}\n"] }]
|
|
764
764
|
}] });
|
|
765
765
|
|
|
766
|
-
const defaultSettings = {
|
|
766
|
+
const defaultSettings$1 = {
|
|
767
767
|
type: 'line',
|
|
768
768
|
options: {
|
|
769
769
|
scales: {
|
|
@@ -785,7 +785,7 @@ class LineChartComponent {
|
|
|
785
785
|
this.dataConfig = computed(() => ({
|
|
786
786
|
datasets: this.datasets()
|
|
787
787
|
}));
|
|
788
|
-
this.configuration = computed(() => merge({}, defaultSettings, this.config()));
|
|
788
|
+
this.configuration = computed(() => merge({}, defaultSettings$1, this.config()));
|
|
789
789
|
}
|
|
790
790
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: LineChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
791
791
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.1.4", type: LineChartComponent, isStandalone: true, selector: "he-line-chart", inputs: { datasets: { classPropertyName: "datasets", publicName: "datasets", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<he-chart [data]=\"dataConfig()\" [config]=\"configuration()\" />\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: ChartComponent, selector: "he-chart", inputs: ["data", "config"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
@@ -7288,6 +7288,193 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
7288
7288
|
args: [{ selector: 'he-cycles-functional-unit-measure', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<span class=\"is-nowrap has-text-ellipsis\" [attr.title]=\"functionalUnit()\">\n @switch (functionalUnit()) {\n @case (CycleFunctionalUnit['1 ha']) {\n 1 hectare\n }\n @default {\n relative\n }\n }\n</span>\n", styles: [":host{display:inline-block}\n"] }]
|
|
7289
7289
|
}] });
|
|
7290
7290
|
|
|
7291
|
+
const colors = {
|
|
7292
|
+
darkBlue: 'rgba(25, 57, 87, 1)',
|
|
7293
|
+
lightBlue: 'rgba(132, 160, 220, 1)'
|
|
7294
|
+
};
|
|
7295
|
+
const opaqueColor = (color, opacity = 0.5) => color.replace(', 1)', `, ${opacity})`);
|
|
7296
|
+
const defaultSettings = Object.freeze({
|
|
7297
|
+
type: 'line',
|
|
7298
|
+
options: {
|
|
7299
|
+
events: [],
|
|
7300
|
+
responsive: true,
|
|
7301
|
+
tooltips: {
|
|
7302
|
+
enabled: false
|
|
7303
|
+
},
|
|
7304
|
+
legend: {
|
|
7305
|
+
display: false,
|
|
7306
|
+
align: 'center'
|
|
7307
|
+
},
|
|
7308
|
+
scales: {
|
|
7309
|
+
yAxes: [
|
|
7310
|
+
{
|
|
7311
|
+
display: true,
|
|
7312
|
+
position: 'left',
|
|
7313
|
+
gridLines: {
|
|
7314
|
+
display: true
|
|
7315
|
+
},
|
|
7316
|
+
ticks: {
|
|
7317
|
+
beginAtZero: true,
|
|
7318
|
+
crossAlign: 'center'
|
|
7319
|
+
}
|
|
7320
|
+
}
|
|
7321
|
+
]
|
|
7322
|
+
}
|
|
7323
|
+
}
|
|
7324
|
+
});
|
|
7325
|
+
const joinXLabel = ' to ';
|
|
7326
|
+
const createDynamicHistogramData = (values, numberOfBins) => {
|
|
7327
|
+
if (values.length === 0) {
|
|
7328
|
+
return { labels: [], frequencies: [] };
|
|
7329
|
+
}
|
|
7330
|
+
// Find the minimum and maximum values in the dataset
|
|
7331
|
+
const min = Math.min(...values);
|
|
7332
|
+
const max = Math.max(...values);
|
|
7333
|
+
// Calculate the size of each bin
|
|
7334
|
+
const binSize = (max - min) / numberOfBins;
|
|
7335
|
+
// Create an array to hold the bin frequencies, initialized to zero
|
|
7336
|
+
const frequencies = new Array(numberOfBins).fill(0);
|
|
7337
|
+
// Create labels for the chart based on the bin ranges
|
|
7338
|
+
const labels = [];
|
|
7339
|
+
for (let i = 0; i < numberOfBins; i++) {
|
|
7340
|
+
const binStart = min + i * binSize;
|
|
7341
|
+
const binEnd = binStart + binSize;
|
|
7342
|
+
labels.push([binStart, binEnd].join(joinXLabel));
|
|
7343
|
+
// Count data points for the current bin
|
|
7344
|
+
values.forEach(point => {
|
|
7345
|
+
if (point >= binStart && point < binEnd) {
|
|
7346
|
+
frequencies[i]++;
|
|
7347
|
+
}
|
|
7348
|
+
});
|
|
7349
|
+
}
|
|
7350
|
+
// Ensure the maximum value is included in the last bin
|
|
7351
|
+
frequencies[numberOfBins - 1] += values.filter(p => p === max).length;
|
|
7352
|
+
return { labels, frequencies };
|
|
7353
|
+
};
|
|
7354
|
+
const createSinglePointDataset = (labels, pointValue) => {
|
|
7355
|
+
// Create an array with the same length as the labels, filled with nulls.
|
|
7356
|
+
const pointData = new Array(labels.length).fill(null);
|
|
7357
|
+
// Find the index of the bin that contains the pointValue.
|
|
7358
|
+
// We parse the bin range from the label string (e.g., '900-1000').
|
|
7359
|
+
const binIndex = labels.findIndex(label => {
|
|
7360
|
+
// Split the label to get the bin's min and max values
|
|
7361
|
+
const [minStr, maxStr] = label.split(joinXLabel);
|
|
7362
|
+
const binMin = parseFloat(minStr);
|
|
7363
|
+
const binMax = parseFloat(maxStr);
|
|
7364
|
+
return pointValue >= binMin && pointValue < binMax;
|
|
7365
|
+
});
|
|
7366
|
+
// If a valid bin is found, place the point value in the array.
|
|
7367
|
+
if (binIndex !== -1) {
|
|
7368
|
+
// We'll set the single point's Y-value to its own value here,
|
|
7369
|
+
// but you could also set it to a frequency or a custom value.
|
|
7370
|
+
pointData[binIndex] = 1;
|
|
7371
|
+
}
|
|
7372
|
+
return pointData;
|
|
7373
|
+
};
|
|
7374
|
+
class DistributionChartComponent {
|
|
7375
|
+
constructor() {
|
|
7376
|
+
this.distribution = input();
|
|
7377
|
+
this.value = input();
|
|
7378
|
+
this.label = input('Distribution');
|
|
7379
|
+
this.nbBins = input(10);
|
|
7380
|
+
this.config = input({});
|
|
7381
|
+
this.groupedData = computed(() => createDynamicHistogramData(this.distribution() ?? [], this.nbBins()));
|
|
7382
|
+
this.singlePoint = computed(() => createSinglePointDataset(this.groupedData()?.labels, this.value()));
|
|
7383
|
+
this.defaultConfig = computed(() => ({
|
|
7384
|
+
options: {
|
|
7385
|
+
scales: {
|
|
7386
|
+
xAxes: [
|
|
7387
|
+
{
|
|
7388
|
+
display: true,
|
|
7389
|
+
gridLines: {
|
|
7390
|
+
offsetGridLines: true
|
|
7391
|
+
},
|
|
7392
|
+
ticks: {
|
|
7393
|
+
min: 0,
|
|
7394
|
+
userCallback: (label) => label
|
|
7395
|
+
.split(joinXLabel)
|
|
7396
|
+
.map(parseFloat)
|
|
7397
|
+
.map(v => toPrecision(v, 2))
|
|
7398
|
+
.map(v => v.toExponential())
|
|
7399
|
+
.join('-')
|
|
7400
|
+
},
|
|
7401
|
+
scaleLabel: {
|
|
7402
|
+
display: true,
|
|
7403
|
+
labelString: this.label()
|
|
7404
|
+
}
|
|
7405
|
+
}
|
|
7406
|
+
],
|
|
7407
|
+
yAxes: [
|
|
7408
|
+
{
|
|
7409
|
+
ticks: {
|
|
7410
|
+
fontColor: '#4A4A4A',
|
|
7411
|
+
fontFamily: 'Lato',
|
|
7412
|
+
fontSize: 10,
|
|
7413
|
+
fontStyle: '400'
|
|
7414
|
+
},
|
|
7415
|
+
scaleLabel: {
|
|
7416
|
+
display: true,
|
|
7417
|
+
labelString: 'Frequency of values'
|
|
7418
|
+
}
|
|
7419
|
+
}
|
|
7420
|
+
]
|
|
7421
|
+
}
|
|
7422
|
+
}
|
|
7423
|
+
}));
|
|
7424
|
+
this.dataConfig = computed(() => ({
|
|
7425
|
+
datasets: [
|
|
7426
|
+
this.distribution()
|
|
7427
|
+
? [
|
|
7428
|
+
{
|
|
7429
|
+
label: 'Distribution',
|
|
7430
|
+
data: this.groupedData().frequencies,
|
|
7431
|
+
backgroundColor: opaqueColor(colors.lightBlue),
|
|
7432
|
+
borderColor: colors.lightBlue,
|
|
7433
|
+
borderWidth: 1,
|
|
7434
|
+
fill: true,
|
|
7435
|
+
pointRadius: 0,
|
|
7436
|
+
type: 'bar'
|
|
7437
|
+
},
|
|
7438
|
+
{
|
|
7439
|
+
label: 'Distribution',
|
|
7440
|
+
data: this.groupedData().frequencies,
|
|
7441
|
+
backgroundColor: opaqueColor(colors.darkBlue),
|
|
7442
|
+
borderColor: colors.darkBlue,
|
|
7443
|
+
borderWidth: 1,
|
|
7444
|
+
fill: false,
|
|
7445
|
+
pointRadius: 0,
|
|
7446
|
+
type: 'line'
|
|
7447
|
+
}
|
|
7448
|
+
]
|
|
7449
|
+
: null,
|
|
7450
|
+
this.singlePoint()?.length
|
|
7451
|
+
? {
|
|
7452
|
+
label: 'Value',
|
|
7453
|
+
data: this.singlePoint(),
|
|
7454
|
+
fill: false,
|
|
7455
|
+
borderColor: colors.darkBlue,
|
|
7456
|
+
backgroundColor: colors.darkBlue,
|
|
7457
|
+
pointRadius: 4,
|
|
7458
|
+
showLine: false,
|
|
7459
|
+
type: 'line',
|
|
7460
|
+
tension: 0
|
|
7461
|
+
}
|
|
7462
|
+
: null
|
|
7463
|
+
]
|
|
7464
|
+
.filter(Boolean)
|
|
7465
|
+
.flat(),
|
|
7466
|
+
labels: this.groupedData().labels
|
|
7467
|
+
}));
|
|
7468
|
+
this.configuration = computed(() => merge({}, defaultSettings, this.defaultConfig(), this.config()));
|
|
7469
|
+
}
|
|
7470
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: DistributionChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
7471
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.1.4", type: DistributionChartComponent, isStandalone: true, selector: "he-distribution-chart", inputs: { distribution: { classPropertyName: "distribution", publicName: "distribution", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, nbBins: { classPropertyName: "nbBins", publicName: "nbBins", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<he-chart [data]=\"dataConfig()\" [config]=\"configuration()\" />\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: ChartComponent, selector: "he-chart", inputs: ["data", "config"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
7472
|
+
}
|
|
7473
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: DistributionChartComponent, decorators: [{
|
|
7474
|
+
type: Component$1,
|
|
7475
|
+
args: [{ selector: 'he-distribution-chart', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ChartComponent], template: "<he-chart [data]=\"dataConfig()\" [config]=\"configuration()\" />\n", styles: [":host{display:block}\n"] }]
|
|
7476
|
+
}] });
|
|
7477
|
+
|
|
7291
7478
|
// TODO: compute from the list of unique properties
|
|
7292
7479
|
const additionalKeys = [
|
|
7293
7480
|
'key',
|
|
@@ -7298,7 +7485,6 @@ const additionalKeys = [
|
|
|
7298
7485
|
'emissionDuration',
|
|
7299
7486
|
'observations',
|
|
7300
7487
|
'statsDefinition',
|
|
7301
|
-
'term',
|
|
7302
7488
|
'source',
|
|
7303
7489
|
'variety',
|
|
7304
7490
|
'reliability',
|
|
@@ -7344,7 +7530,7 @@ class NodeValueDetailsComponent {
|
|
|
7344
7530
|
this.schemaService = inject(HeSchemaService);
|
|
7345
7531
|
this.localStorage = inject(LocalStorageService);
|
|
7346
7532
|
this.schemaBaseUrl = schemaBaseUrl();
|
|
7347
|
-
this.keys = ['value', ...grouppedValueKeys];
|
|
7533
|
+
this.keys = ['term', 'value', ...grouppedValueKeys];
|
|
7348
7534
|
this.additionalKeys = additionalKeys;
|
|
7349
7535
|
this.schemas = toSignal(this.schemaService.schemas$.pipe(startWith(loadSchemas())));
|
|
7350
7536
|
this.schemaKeys = computed(() => Object.entries(this.schemas()?.[this.type()]?.properties ?? {})
|
|
@@ -7366,6 +7552,10 @@ class NodeValueDetailsComponent {
|
|
|
7366
7552
|
this.type = computed(() => this.node()?.['@type']);
|
|
7367
7553
|
this.type$ = toObservable(this.type);
|
|
7368
7554
|
this.showInline = computed(() => this.nodes()?.length === 1);
|
|
7555
|
+
this.showDistribution = signal(undefined);
|
|
7556
|
+
this.chartDistribution = computed(() => this.showDistribution()?.distribution.flat());
|
|
7557
|
+
this.chartValue = computed(() => Array.isArray(this.showDistribution()?.value) ? this.showDistribution()?.value?.[0] : this.showDistribution()?.value);
|
|
7558
|
+
this.chartLabel = computed(() => `${this.node()?.term.name} in ${this.node()?.term.units}`);
|
|
7369
7559
|
combineLatest([this.type$, this.schemaKeys$])
|
|
7370
7560
|
.pipe(filter(([type, schemaKeys]) => !!type && !!schemaKeys?.length))
|
|
7371
7561
|
.subscribe(([type]) => {
|
|
@@ -7412,11 +7602,20 @@ class NodeValueDetailsComponent {
|
|
|
7412
7602
|
this.updateKeys(selectedKeys);
|
|
7413
7603
|
}
|
|
7414
7604
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NodeValueDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
7415
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.4", type: NodeValueDetailsComponent, isStandalone: true, selector: "he-node-value-details", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, nodeType: { classPropertyName: "nodeType", publicName: "nodeType", isSignal: true, isRequired: true, transformFunction: null }, dataState: { classPropertyName: "dataState", publicName: "dataState", isSignal: true, isRequired: true, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@if (showInline()) {\n @for (key of keys; track key) {\n <he-link-key-value\n [node]=\"node()\"\n [nodeType]=\"nodeType()\"\n [dataState]=\"dataState()\"\n [dataKey]=\"dataKey()\"\n [key]=\"key\" />\n }\n @for (key of additionalKeys; track key) {\n <he-link-key-value\n [node]=\"node()\"\n [nodeType]=\"nodeType()\"\n [dataState]=\"dataState()\"\n [dataKey]=\"dataKey()\"\n [key]=\"key\" />\n }\n} @else {\n <he-link-key-value\n [node]=\"node()\"\n [nodeType]=\"nodeType()\"\n [dataState]=\"dataState()\"\n [dataKey]=\"dataKey()\"\n key=\"term\" />\n\n <div class=\"columns is-p-0 is-my-0 is-overflow-visible\">\n <div class=\"column is-p-0 is-my-0\"></div>\n <div class=\"column is-p-0 is-my-0 is-narrow is-overflow-visible\">\n <div ngbDropdown class=\"is-overflow-visible\" autoClose=\"outside\" placement=\"bottom-end\">\n <button\n ngbDropdownToggle\n class=\"button is-small is-ghost has-text-white\"\n type=\"button\"\n aria-controls=\"config-menu\">\n <span>Customise fields</span>\n <span class=\"icon is-small\">\n <he-svg-icon name=\"settings\" aria-hidden=\"true\" />\n </span>\n </button>\n\n <div ngbDropdownMenu id=\"config-menu\">\n <div\n class=\"dropdown-content is-overflow-y-auto\"\n (click)=\"$event.stopPropagation()\"\n cdkDropList\n (cdkDropListDropped)=\"dropTableKey($event)\">\n @for (key of tableKeys(); track key.key; let keyIndex = $index) {\n <div class=\"dropdown-item cdk-drag-item\" cdkDrag>\n <div class=\"field is-relative\">\n <input\n type=\"checkbox\"\n class=\"selector\"\n [id]=\"key.key\"\n [name]=\"key.key\"\n [checked]=\"key.selected\"\n (change)=\"onTableKeyChange(key, keyIndex, $event.target.checked)\" />\n <label class=\"is-pl-2\" [for]=\"key.key\">{{ key.key }}</label>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"table-container is-mt-2\">\n <table class=\"table is-dark is-narrow is-striped\">\n <thead>\n @for (key of visibleTableKeys(); track key) {\n <th>\n <a class=\"is-dark\" [href]=\"schemaBaseUrl + '/' + type() + '#' + key.split('.')[0]\" target=\"_blank\">\n <b>{{ key.includes('.') ? key.split('.')[1] : key }}</b>\n </a>\n </th>\n }\n </thead>\n <tbody>\n @for (node of nodes(); track node) {\n <tr>\n @for (key of visibleTableKeys(); track key) {\n <td>\n <he-link-key-value\n
|
|
7605
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.4", type: NodeValueDetailsComponent, isStandalone: true, selector: "he-node-value-details", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, nodeType: { classPropertyName: "nodeType", publicName: "nodeType", isSignal: true, isRequired: true, transformFunction: null }, dataState: { classPropertyName: "dataState", publicName: "dataState", isSignal: true, isRequired: true, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@if (showInline()) {\n @for (key of keys; track key) {\n <he-link-key-value\n [node]=\"node()\"\n [nodeType]=\"nodeType()\"\n [dataState]=\"dataState()\"\n [dataKey]=\"dataKey()\"\n [key]=\"key\" />\n }\n @for (key of additionalKeys; track key) {\n <he-link-key-value\n [node]=\"node()\"\n [nodeType]=\"nodeType()\"\n [dataState]=\"dataState()\"\n [dataKey]=\"dataKey()\"\n [key]=\"key\" />\n }\n\n @if (node().distribution?.length) {\n <a class=\"is-dark\" [href]=\"schemaBaseUrl + '/' + node['@type'] + '#distribution'\" target=\"_blank\">\n <b>distribution</b>\n </a>\n <span class=\"pr-2\">:</span>\n <ng-container *ngTemplateOutlet=\"distributionContent; context: { node: node() }\" />\n }\n} @else {\n <he-link-key-value\n [node]=\"node()\"\n [nodeType]=\"nodeType()\"\n [dataState]=\"dataState()\"\n [dataKey]=\"dataKey()\"\n key=\"term\" />\n\n <div class=\"columns is-p-0 is-my-0 is-overflow-visible\">\n <div class=\"column is-p-0 is-my-0\"></div>\n <div class=\"column is-p-0 is-my-0 is-narrow is-overflow-visible\">\n <div ngbDropdown class=\"is-overflow-visible\" autoClose=\"outside\" placement=\"bottom-end\">\n <button\n ngbDropdownToggle\n class=\"button is-small is-ghost has-text-white\"\n type=\"button\"\n aria-controls=\"config-menu\">\n <span>Customise fields</span>\n <span class=\"icon is-small\">\n <he-svg-icon name=\"settings\" aria-hidden=\"true\" />\n </span>\n </button>\n\n <div ngbDropdownMenu id=\"config-menu\">\n <div\n class=\"dropdown-content is-overflow-y-auto\"\n (click)=\"$event.stopPropagation()\"\n cdkDropList\n (cdkDropListDropped)=\"dropTableKey($event)\">\n @for (key of tableKeys(); track key.key; let keyIndex = $index) {\n <div class=\"dropdown-item cdk-drag-item\" cdkDrag>\n <div class=\"field is-relative\">\n <input\n type=\"checkbox\"\n class=\"selector\"\n [id]=\"key.key\"\n [name]=\"key.key\"\n [checked]=\"key.selected\"\n (change)=\"onTableKeyChange(key, keyIndex, $event.target.checked)\" />\n <label class=\"is-pl-2\" [for]=\"key.key\">{{ key.key }}</label>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"table-container is-mt-2\">\n <table class=\"table is-dark is-narrow is-striped\">\n <thead>\n @for (key of visibleTableKeys(); track key) {\n <th>\n <a class=\"is-dark\" [href]=\"schemaBaseUrl + '/' + type() + '#' + key.split('.')[0]\" target=\"_blank\">\n <b>{{ key.includes('.') ? key.split('.')[1] : key }}</b>\n </a>\n </th>\n }\n </thead>\n <tbody>\n @for (node of nodes(); track node) {\n <tr>\n @for (key of visibleTableKeys(); track key) {\n <td>\n @if (key === 'distribution') {\n <ng-container *ngTemplateOutlet=\"distributionContent; context: { node }\" />\n } @else {\n <he-link-key-value\n [node]=\"node\"\n [nodeType]=\"nodeType()\"\n [dataState]=\"dataState()\"\n [dataKey]=\"dataKey()\"\n [key]=\"key\"\n [defaultValue]=\"defaultValue(key)\" />\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n}\n\n<ng-template #distributionContent let-node=\"node\">\n @if (node.distribution?.length) {\n @if (showDistribution() === node) {\n <a class=\"has-text-white\" (click)=\"showDistribution.set(undefined)\">Hide</a>\n } @else {\n <a class=\"has-text-white\" (click)=\"showDistribution.set(node)\">Show</a>\n }\n } @else {\n <span>N/A</span>\n }\n</ng-template>\n\n@if (chartDistribution()) {\n <div class=\"has-background-white is-mt-2 is-p-2 is-rounded | chart-container\">\n <he-distribution-chart\n [distribution]=\"chartDistribution()\"\n [value]=\"chartValue()\"\n [label]=\"chartLabel()\"\n [nbBins]=\"10\" />\n </div>\n}\n", styles: ["table{background-color:transparent}table::ng-deep he-link-key-value>a:first-child,table::ng-deep he-link-key-value>a:first-child+span{display:none}.dropdown-content{max-height:300px}.cdk-drag-preview{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;list-style:none}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-item{cursor:move}.chart-container{border-radius:3px}.chart-container he-distribution-chart{height:250px;min-width:400px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "component", type: LinkKeyValueComponent, selector: "he-link-key-value", inputs: ["node", "nodeType", "dataState", "dataKey", "key", "defaultValue"] }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation", "svgClass"] }, { kind: "ngmodule", type: NgbTooltipModule }, { kind: "ngmodule", type: NgbDropdownModule }, { kind: "directive", type: i1$1.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i1$1.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i1$1.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "component", type: DistributionChartComponent, selector: "he-distribution-chart", inputs: ["distribution", "value", "label", "nbBins", "config"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
7416
7606
|
}
|
|
7417
7607
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: NodeValueDetailsComponent, decorators: [{
|
|
7418
7608
|
type: Component$1,
|
|
7419
|
-
args: [{ selector: 'he-node-value-details', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
7609
|
+
args: [{ selector: 'he-node-value-details', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
7610
|
+
NgTemplateOutlet,
|
|
7611
|
+
CdkDrag,
|
|
7612
|
+
CdkDropList,
|
|
7613
|
+
LinkKeyValueComponent,
|
|
7614
|
+
HESvgIconComponent,
|
|
7615
|
+
NgbTooltipModule,
|
|
7616
|
+
NgbDropdownModule,
|
|
7617
|
+
DistributionChartComponent
|
|
7618
|
+
], template: "@if (showInline()) {\n @for (key of keys; track key) {\n <he-link-key-value\n [node]=\"node()\"\n [nodeType]=\"nodeType()\"\n [dataState]=\"dataState()\"\n [dataKey]=\"dataKey()\"\n [key]=\"key\" />\n }\n @for (key of additionalKeys; track key) {\n <he-link-key-value\n [node]=\"node()\"\n [nodeType]=\"nodeType()\"\n [dataState]=\"dataState()\"\n [dataKey]=\"dataKey()\"\n [key]=\"key\" />\n }\n\n @if (node().distribution?.length) {\n <a class=\"is-dark\" [href]=\"schemaBaseUrl + '/' + node['@type'] + '#distribution'\" target=\"_blank\">\n <b>distribution</b>\n </a>\n <span class=\"pr-2\">:</span>\n <ng-container *ngTemplateOutlet=\"distributionContent; context: { node: node() }\" />\n }\n} @else {\n <he-link-key-value\n [node]=\"node()\"\n [nodeType]=\"nodeType()\"\n [dataState]=\"dataState()\"\n [dataKey]=\"dataKey()\"\n key=\"term\" />\n\n <div class=\"columns is-p-0 is-my-0 is-overflow-visible\">\n <div class=\"column is-p-0 is-my-0\"></div>\n <div class=\"column is-p-0 is-my-0 is-narrow is-overflow-visible\">\n <div ngbDropdown class=\"is-overflow-visible\" autoClose=\"outside\" placement=\"bottom-end\">\n <button\n ngbDropdownToggle\n class=\"button is-small is-ghost has-text-white\"\n type=\"button\"\n aria-controls=\"config-menu\">\n <span>Customise fields</span>\n <span class=\"icon is-small\">\n <he-svg-icon name=\"settings\" aria-hidden=\"true\" />\n </span>\n </button>\n\n <div ngbDropdownMenu id=\"config-menu\">\n <div\n class=\"dropdown-content is-overflow-y-auto\"\n (click)=\"$event.stopPropagation()\"\n cdkDropList\n (cdkDropListDropped)=\"dropTableKey($event)\">\n @for (key of tableKeys(); track key.key; let keyIndex = $index) {\n <div class=\"dropdown-item cdk-drag-item\" cdkDrag>\n <div class=\"field is-relative\">\n <input\n type=\"checkbox\"\n class=\"selector\"\n [id]=\"key.key\"\n [name]=\"key.key\"\n [checked]=\"key.selected\"\n (change)=\"onTableKeyChange(key, keyIndex, $event.target.checked)\" />\n <label class=\"is-pl-2\" [for]=\"key.key\">{{ key.key }}</label>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"table-container is-mt-2\">\n <table class=\"table is-dark is-narrow is-striped\">\n <thead>\n @for (key of visibleTableKeys(); track key) {\n <th>\n <a class=\"is-dark\" [href]=\"schemaBaseUrl + '/' + type() + '#' + key.split('.')[0]\" target=\"_blank\">\n <b>{{ key.includes('.') ? key.split('.')[1] : key }}</b>\n </a>\n </th>\n }\n </thead>\n <tbody>\n @for (node of nodes(); track node) {\n <tr>\n @for (key of visibleTableKeys(); track key) {\n <td>\n @if (key === 'distribution') {\n <ng-container *ngTemplateOutlet=\"distributionContent; context: { node }\" />\n } @else {\n <he-link-key-value\n [node]=\"node\"\n [nodeType]=\"nodeType()\"\n [dataState]=\"dataState()\"\n [dataKey]=\"dataKey()\"\n [key]=\"key\"\n [defaultValue]=\"defaultValue(key)\" />\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n}\n\n<ng-template #distributionContent let-node=\"node\">\n @if (node.distribution?.length) {\n @if (showDistribution() === node) {\n <a class=\"has-text-white\" (click)=\"showDistribution.set(undefined)\">Hide</a>\n } @else {\n <a class=\"has-text-white\" (click)=\"showDistribution.set(node)\">Show</a>\n }\n } @else {\n <span>N/A</span>\n }\n</ng-template>\n\n@if (chartDistribution()) {\n <div class=\"has-background-white is-mt-2 is-p-2 is-rounded | chart-container\">\n <he-distribution-chart\n [distribution]=\"chartDistribution()\"\n [value]=\"chartValue()\"\n [label]=\"chartLabel()\"\n [nbBins]=\"10\" />\n </div>\n}\n", styles: ["table{background-color:transparent}table::ng-deep he-link-key-value>a:first-child,table::ng-deep he-link-key-value>a:first-child+span{display:none}.dropdown-content{max-height:300px}.cdk-drag-preview{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;list-style:none}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-item{cursor:move}.chart-container{border-radius:3px}.chart-container he-distribution-chart{height:250px;min-width:400px}\n"] }]
|
|
7420
7619
|
}], ctorParameters: () => [] });
|
|
7421
7620
|
|
|
7422
7621
|
class CyclesNodesTimelineComponent {
|
|
@@ -9221,6 +9420,7 @@ const customErrorMessage = {
|
|
|
9221
9420
|
Use Transformations if needed to represent additional processing steps rather than new Cycles.`
|
|
9222
9421
|
: `The primary Product must not also be an Input into the cycle.`,
|
|
9223
9422
|
'must have a primary processing operation': () => `For processing cycles, a primary Operation must be specified, it should reflect the main process in the Cycle.`,
|
|
9423
|
+
'primaryPercent not allowed on this siteType': ({ params }) => `The ${schemaLink('Practice#primaryPercent', 'primaryPercent')} can only be used on ${schemaLink('Site#siteType', 'siteType')} ${params?.expected?.map(code).join(' or ')}.`,
|
|
9224
9424
|
'at least one landCover practice must match an equivalent product': ({ params }) => `You have specified ${params?.current.map(code).join(', ')} as ${code(TermTermType.landCover)} practice, but none of the recorded products match. Please add the practices for ${params?.expected
|
|
9225
9425
|
.map(code)
|
|
9226
9426
|
.join(', ')}, or remove all ${code(TermTermType.landCover)} practices.`,
|
|
@@ -12293,7 +12493,7 @@ class SelectComponent extends ControlValueAccessor {
|
|
|
12293
12493
|
provide: SELECT_TOKEN,
|
|
12294
12494
|
useExisting: forwardRef(() => SelectComponent)
|
|
12295
12495
|
}
|
|
12296
|
-
], queries: [{ propertyName: "nodes", predicate: NODE_ELEMENT_TOKEN, descendants: true }, { propertyName: "options", predicate: SELECT_OPTION_TOKEN, descendants: true }], viewQueries: [{ propertyName: "searchInputEl", first: true, predicate: ["input"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div #origin=\"cdkOverlayOrigin\" cdkOverlayOrigin>\n <ng-container\n *ngTemplateOutlet=\"\n selectTemplate ?? defaultSelectTemplate;\n context: {\n $implicit: this,\n value,\n displayValue,\n labelState,\n icon,\n placeholder,\n searchPlaceholder,\n width,\n valueTemplate\n }\n \" />\n</div>\n\n<ng-template\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n [cdkConnectedOverlayOffsetX]=\"overlayOptions?.offsetX ?? -2\"\n [cdkConnectedOverlayOffsetY]=\"overlayOptions?.offsetY ?? 4\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayBackdropClass]=\"['cdk-overlay-transparent-backdrop', 'pointer-none']\"\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop>\n <div [style.width]=\"width\" class=\"select-panel\" (clickOutside)=\"close()\">\n <ng-content />\n </div>\n</ng-template>\n\n<ng-template #defaultSelectTemplate>\n <div class=\"is-flex is-justify-content-flex-start is-flex-direction-column | select-host\">\n <div class=\"control is-flex is-justify-content-space-between is-align-items-center\">\n <ng-container [ngSwitch]=\"labelState\">\n <input\n #input\n (input)=\"onHandleInput($event)\"\n *ngSwitchCase=\"'search'\"\n [placeholder]=\"searchPlaceholder\"\n class=\"select-search | is-transparent\" />\n\n <ng-container *ngSwitchCase=\"'value'\">\n <ng-container *ngTemplateOutlet=\"valueTemplate ?? defaultValueTemplate; context: { $implicit: value }\" />\n </ng-container>\n </ng-container>\n\n <span class=\"drop-down-icon ml-2\">\n <he-svg-icon [name]=\"icon\" />\n </span>\n </div>\n </div>\n</ng-template>\n\n<ng-template #defaultValueTemplate>\n <span [ngClass]=\"{ empty: !value }\" class=\"has-text-secondary | selected-value\">\n {{ displayValue || placeholder }}\n </span>\n</ng-template>\n", styles: ["::ng-deep:root{--select-border-radius: 6px;--select-min-width: 250px;--select-shadow: rgba(0, 0, 0, .1) 0px 4px 6px -1px, rgba(0, 0, 0, .06) 0px 2px 4px -1px}.select-host{padding:5px 10px;box-sizing:border-box;min-width:var(--select-min-width);border-radius:var(--select-border-radius);border:1px solid #f5f5f5;background:#fff;box-shadow:var(--select-shadow)}.select-host:hover{cursor:pointer;background-color:var(--color-background, #eceff1)}.select-host.select-panel-open{position:relative;z-index:1001;border-radius:var(--select-border-radius) var(--select-border-radius) 0 0;box-shadow:none}::ng-deep .is-disabled .select-host{pointer-events:none;-webkit-user-select:none;user-select:none;background:#f5f5f580;border-color:#dbdbdb;box-shadow:none;color:#dbdbdb}.select-search{border:none;outline:none;background:transparent}.select-panel{box-sizing:border-box;border-radius:0 0 var(--select-border-radius, 6px) var(--select-border-radius, 6px);border:1px solid #f5f5f5;background-color:#fff;transform-origin:top;max-height:350px;overflow:auto;box-shadow:var(--select-shadow)}\n"], dependencies: [{ kind: "directive", type:
|
|
12496
|
+
], queries: [{ propertyName: "nodes", predicate: NODE_ELEMENT_TOKEN, descendants: true }, { propertyName: "options", predicate: SELECT_OPTION_TOKEN, descendants: true }], viewQueries: [{ propertyName: "searchInputEl", first: true, predicate: ["input"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div #origin=\"cdkOverlayOrigin\" cdkOverlayOrigin>\n <ng-container\n *ngTemplateOutlet=\"\n selectTemplate ?? defaultSelectTemplate;\n context: {\n $implicit: this,\n value,\n displayValue,\n labelState,\n icon,\n placeholder,\n searchPlaceholder,\n width,\n valueTemplate\n }\n \" />\n</div>\n\n<ng-template\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n [cdkConnectedOverlayOffsetX]=\"overlayOptions?.offsetX ?? -2\"\n [cdkConnectedOverlayOffsetY]=\"overlayOptions?.offsetY ?? 4\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayBackdropClass]=\"['cdk-overlay-transparent-backdrop', 'pointer-none']\"\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop>\n <div [style.width]=\"width\" class=\"select-panel\" (clickOutside)=\"close()\">\n <ng-content />\n </div>\n</ng-template>\n\n<ng-template #defaultSelectTemplate>\n <div class=\"is-flex is-justify-content-flex-start is-flex-direction-column | select-host\">\n <div class=\"control is-flex is-justify-content-space-between is-align-items-center\">\n <ng-container [ngSwitch]=\"labelState\">\n <input\n #input\n (input)=\"onHandleInput($event)\"\n *ngSwitchCase=\"'search'\"\n [placeholder]=\"searchPlaceholder\"\n class=\"select-search | is-transparent\" />\n\n <ng-container *ngSwitchCase=\"'value'\">\n <ng-container *ngTemplateOutlet=\"valueTemplate ?? defaultValueTemplate; context: { $implicit: value }\" />\n </ng-container>\n </ng-container>\n\n <span class=\"drop-down-icon ml-2\">\n <he-svg-icon [name]=\"icon\" />\n </span>\n </div>\n </div>\n</ng-template>\n\n<ng-template #defaultValueTemplate>\n <span [ngClass]=\"{ empty: !value }\" class=\"has-text-secondary | selected-value\">\n {{ displayValue || placeholder }}\n </span>\n</ng-template>\n", styles: ["::ng-deep:root{--select-border-radius: 6px;--select-min-width: 250px;--select-shadow: rgba(0, 0, 0, .1) 0px 4px 6px -1px, rgba(0, 0, 0, .06) 0px 2px 4px -1px}.select-host{padding:5px 10px;box-sizing:border-box;min-width:var(--select-min-width);border-radius:var(--select-border-radius);border:1px solid #f5f5f5;background:#fff;box-shadow:var(--select-shadow)}.select-host:hover{cursor:pointer;background-color:var(--color-background, #eceff1)}.select-host.select-panel-open{position:relative;z-index:1001;border-radius:var(--select-border-radius) var(--select-border-radius) 0 0;box-shadow:none}::ng-deep .is-disabled .select-host{pointer-events:none;-webkit-user-select:none;user-select:none;background:#f5f5f580;border-color:#dbdbdb;box-shadow:none;color:#dbdbdb}.select-search{border:none;outline:none;background:transparent}.select-panel{box-sizing:border-box;border-radius:0 0 var(--select-border-radius, 6px) var(--select-border-radius, 6px);border:1px solid #f5f5f5;background-color:#fff;transform-origin:top;max-height:350px;overflow:auto;box-shadow:var(--select-shadow)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideListenAfter"], outputs: ["clickOutside"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation", "svgClass"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
12297
12497
|
}
|
|
12298
12498
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: SelectComponent, decorators: [{
|
|
12299
12499
|
type: Component$1,
|
|
@@ -12308,8 +12508,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
12308
12508
|
useExisting: forwardRef(() => SelectComponent)
|
|
12309
12509
|
}
|
|
12310
12510
|
], changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
12311
|
-
CdkOverlayOrigin,
|
|
12312
12511
|
NgTemplateOutlet,
|
|
12512
|
+
CdkOverlayOrigin,
|
|
12313
12513
|
CdkConnectedOverlay,
|
|
12314
12514
|
ClickOutsideDirective,
|
|
12315
12515
|
NgSwitch,
|
|
@@ -13019,6 +13219,9 @@ class FilterAccordionComponent extends ControlValueAccessor {
|
|
|
13019
13219
|
const countFn = this.getOptionCountFn();
|
|
13020
13220
|
return countFn ? countFn(value) : 1;
|
|
13021
13221
|
}
|
|
13222
|
+
isItemEffectivelyDisabled(item, parentDisabled = false) {
|
|
13223
|
+
return this.disabled() || item.disabled || parentDisabled;
|
|
13224
|
+
}
|
|
13022
13225
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: FilterAccordionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
13023
13226
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.4", type: FilterAccordionComponent, isStandalone: true, selector: "he-filter-accordion", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, tooltip: { classPropertyName: "tooltip", publicName: "tooltip", isSignal: true, isRequired: false, transformFunction: null }, showClearAll: { classPropertyName: "showClearAll", publicName: "showClearAll", isSignal: true, isRequired: false, transformFunction: null }, getOptionCountFn: { classPropertyName: "getOptionCountFn", publicName: "getOptionCountFn", isSignal: true, isRequired: false, transformFunction: null }, preserveOptionsOnSelection: { classPropertyName: "preserveOptionsOnSelection", publicName: "preserveOptionsOnSelection", isSignal: true, isRequired: false, transformFunction: null }, maintainPanelStates: { classPropertyName: "maintainPanelStates", publicName: "maintainPanelStates", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChanged: "selectionChanged" }, providers: [
|
|
13024
13227
|
{
|
|
@@ -13027,7 +13230,7 @@ class FilterAccordionComponent extends ControlValueAccessor {
|
|
|
13027
13230
|
multi: true
|
|
13028
13231
|
},
|
|
13029
13232
|
FilterStore
|
|
13030
|
-
], usesInheritance: true, ngImport: i0, template: "<div>\n <div\n class=\"is-flex is-justify-content-space-between gap-13 is-align-items-flex-start is-flex-direction-column has-border-bottom\">\n <div class=\"is-flex is-align-items-center\">\n <h3 class=\"title is-size-6 has-text-secondary mr-2 mb-0\">{{ title() }}</h3>\n @if (tooltip()) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"has-text-grey\"\n [ngbTooltip]=\"tooltip()\"\n placement=\"top\"\n triggers=\"hover\"\n container=\"body\"></he-svg-icon>\n }\n </div>\n @if (showClearAll()) {\n <span class=\"is-clickable is-size-7 has-text-weight-normal is-italic clear-button\" (click)=\"clearAll()\">\n Clear all\n </span>\n }\n </div>\n\n <div>\n @for (item of filterStore.filteredData(); track item.trackId || item.label) {\n @if (item.type === 'group') {\n @if (panelStates[item.label]) {\n @let groupState = panelStates[item.label];\n <div class=\"has-border-bottom\" [class.is-active]=\"groupState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover accordion-row\"\n (click)=\"groupState.expanded = !groupState.expanded\">\n <label class=\"checkbox mr-3\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupFullySelected(item)\"\n [indeterminate]=\"isGroupPartiallySelected(item)\"\n (change)=\"toggleGroup(item)\"\n [disabled]=\"disabled()\" />\n </label>\n\n <span class=\"is-flex-grow-1 has-text-weight-medium has-text-grey-dark is-size-7\">\n {{ removeCountFromLabel(item.label) }}\n </span>\n\n <he-svg-icon\n class=\"has-text-grey transition-transform\"\n [name]=\"groupState.expanded ? 'chevron-up' : 'chevron-down'\"></he-svg-icon>\n </div>\n\n <div\n class=\"filter-accordion__panel-content\"\n [class.filter-accordion__panel-content--expanded]=\"groupState.expanded\">\n @if (groupState.expanded && getDirectOptionsCount(item) > 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n placeholder=\"Search {{ removeCountFromLabel(item.label) }}\"\n [value]=\"groupState.searchTerm || ''\"\n (input)=\"groupState.searchTerm = $any($event.target).value\" />\n <a\n class=\"icon is-small is-right\"\n [class.is-hidden]=\"!groupState.searchTerm\"\n (click)=\"groupState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"groupState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n\n <div>\n @for (\n child of getFilteredDirectChildren(item, groupState.searchTerm);\n track child.trackId || child.label;\n let childLast = $last\n ) {\n @if (child.type === 'group') {\n <!-- Nested group -->\n @if (panelStates[child.label]) {\n @let childState = panelStates[child.label];\n <div class=\"pl-5\" [class.has-border-bottom]=\"!childLast\">\n <div [class.is-active]=\"childState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover accordion-row\"\n (click)=\"childState.expanded = !childState.expanded\">\n <label class=\"checkbox mr-3\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupFullySelected(child)\"\n [indeterminate]=\"isGroupPartiallySelected(child)\"\n (change)=\"toggleGroup(child)\"\n [disabled]=\"disabled()\" />\n </label>\n\n <span class=\"is-flex-grow-1 has-text-weight-medium has-text-grey-dark is-size-7\">\n {{ removeCountFromLabel(child.label) }}\n </span>\n\n <he-svg-icon\n class=\"has-text-grey transition-transform\"\n [class.is-rotated-180]=\"childState.expanded\"\n [name]=\"childState.expanded ? 'chevron-up' : 'chevron-down'\"></he-svg-icon>\n </div>\n\n <div\n class=\"filter-accordion__panel-content\"\n [class.filter-accordion__panel-content--expanded]=\"childState.expanded\">\n @if (childState.expanded && optionsFromGroup(child).length >= 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n placeholder=\"Search {{ removeCountFromLabel(child.label) }}\"\n [value]=\"childState.searchTerm || ''\"\n (input)=\"childState.searchTerm = $any($event.target).value\" />\n <a\n class=\"icon is-small is-right\"\n [class.is-hidden]=\"!childState.searchTerm\"\n (click)=\"childState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"childState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n <div>\n @for (\n nestedOption of getFilteredOptions(\n child,\n childState.searchTerm || groupState.searchTerm\n );\n track nestedOption.trackId || nestedOption.label;\n let nestedLast = $last\n ) {\n <div class=\"pl-5 accordion-row\" [class.has-border-bottom]=\"!nestedLast\">\n <label\n class=\"checkbox is-flex is-align-items-center is-fullwidth is-size-7 has-text-grey-dark\">\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(nestedOption.value)\"\n (change)=\"toggleOption(nestedOption.value)\"\n [disabled]=\"disabled()\"\n class=\"mr-3\" />\n\n <span class=\"is-flex-grow-1\">\n {{ removeCountFromLabel(nestedOption.label) }}\n </span>\n\n <span class=\"has-text-grey is-size-7 ml-2\">\n ({{ getOptionCount(nestedOption.value) }})\n </span>\n </label>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n } @else {\n <!-- Direct option -->\n <div class=\"pl-5 accordion-row\" [class.has-border-bottom]=\"!childLast\">\n <label class=\"checkbox is-flex is-align-items-center is-fullwidth is-size-7 has-text-grey-dark\">\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(child.value)\"\n (change)=\"toggleOption(child.value)\"\n [disabled]=\"disabled()\"\n class=\"mr-3\" />\n\n <span class=\"is-flex-grow-1\">\n {{ removeCountFromLabel(child.label) }}\n </span>\n\n <span class=\"has-text-grey is-size-7 ml-2\">({{ getOptionCount(child.value) }})</span>\n </label>\n </div>\n }\n }\n\n @if (getFilteredDirectChildren(item, groupState.searchTerm).length === 0 && groupState.searchTerm) {\n <div class=\"px-6 py-4 has-text-grey is-size-7 has-text-centered is-italic\">\n No results found for \"{{ groupState.searchTerm }}\"\n </div>\n }\n </div>\n </div>\n </div>\n }\n }\n\n @if (item.type === 'option') {\n <div class=\"is-flex is-justify-content-space-between has-border-bottom accordion-row\">\n <label class=\"checkbox is-flex is-align-items-center is-fullwidth is-full is-size-7 has-text-grey-dark\">\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(item.value)\"\n (change)=\"toggleOption(item.value)\"\n [disabled]=\"disabled()\"\n class=\"mr-3\" />\n\n <span class=\"is-flex-grow-1\">\n {{ removeCountFromLabel(item.label) }}\n </span>\n </label>\n <span class=\"has-text-grey is-size-7 ml-2\">({{ getOptionCount(item.value) }})</span>\n </div>\n }\n }\n </div>\n</div>\n", styles: [".gap-13{gap:13px}.clear-button{color:#4c7194}.accordion-row{padding:4px 0}.filter-accordion__panel-content{max-height:0;overflow:hidden;transition:max-height .3s ease-out}.filter-accordion__panel-content--expanded{max-height:500px;overflow-y:auto}.has-background-hover-light:hover{background-color:#fafafa}.has-border-bottom{border-bottom:1px solid #dbe3ea}.transition-transform{transition:transform .2s}@media screen and (max-width: 768px){.filter-accordion__panel-content--expanded{max-height:400px}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation", "svgClass"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
13233
|
+
], usesInheritance: true, ngImport: i0, template: "<div>\n <div\n class=\"is-flex is-justify-content-space-between gap-13 is-align-items-flex-start is-flex-direction-column has-border-bottom\">\n <div class=\"is-flex is-align-items-center\">\n <h3 class=\"title is-size-6 has-text-secondary mr-2 mb-0\">{{ title() }}</h3>\n @if (tooltip()) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"has-text-grey\"\n [ngbTooltip]=\"tooltip()\"\n placement=\"top\"\n triggers=\"hover\"\n container=\"body\"></he-svg-icon>\n }\n </div>\n @if (showClearAll()) {\n <span class=\"is-clickable is-size-7 has-text-weight-normal is-italic clear-button\" (click)=\"clearAll()\">\n Clear all\n </span>\n }\n </div>\n\n <div>\n @for (item of filterStore.filteredData(); track item.trackId || item.label) {\n @if (item.type === 'group') {\n @if (panelStates[item.label]) {\n @let groupState = panelStates[item.label];\n <div class=\"has-border-bottom\" [class.is-active]=\"groupState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover accordion-row\"\n (click)=\"groupState.expanded = !groupState.expanded\">\n <label class=\"checkbox mr-3\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupFullySelected(item)\"\n [indeterminate]=\"isGroupPartiallySelected(item)\"\n (change)=\"toggleGroup(item)\"\n [disabled]=\"isItemEffectivelyDisabled(item)\" />\n </label>\n\n <span class=\"is-flex-grow-1 has-text-weight-medium has-text-grey-dark is-size-7\">\n {{ removeCountFromLabel(item.label) }}\n </span>\n\n <he-svg-icon\n class=\"has-text-grey transition-transform\"\n [name]=\"groupState.expanded ? 'chevron-up' : 'chevron-down'\"></he-svg-icon>\n </div>\n\n <div\n class=\"filter-accordion__panel-content\"\n [class.filter-accordion__panel-content--expanded]=\"groupState.expanded\">\n @if (groupState.expanded && getDirectOptionsCount(item) > 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n placeholder=\"Search {{ removeCountFromLabel(item.label) }}\"\n [value]=\"groupState.searchTerm || ''\"\n [disabled]=\"isItemEffectivelyDisabled(item)\"\n (input)=\"groupState.searchTerm = $any($event.target).value\" />\n <a\n class=\"icon is-small is-right\"\n [class.is-hidden]=\"!groupState.searchTerm\"\n (click)=\"groupState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"groupState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n\n <div>\n @for (\n child of getFilteredDirectChildren(item, groupState.searchTerm);\n track child.trackId || child.label;\n let childLast = $last\n ) {\n @if (child.type === 'group') {\n <!-- Nested group -->\n @if (panelStates[child.label]) {\n @let childState = panelStates[child.label];\n <div class=\"pl-5\" [class.has-border-bottom]=\"!childLast\">\n <div [class.is-active]=\"childState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover accordion-row\"\n (click)=\"childState.expanded = !childState.expanded\">\n <label class=\"checkbox mr-3\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupFullySelected(child)\"\n [indeterminate]=\"isGroupPartiallySelected(child)\"\n (change)=\"toggleGroup(child)\"\n [disabled]=\"isItemEffectivelyDisabled(child, isItemEffectivelyDisabled(item))\" />\n </label>\n\n <span class=\"is-flex-grow-1 has-text-weight-medium has-text-grey-dark is-size-7\">\n {{ removeCountFromLabel(child.label) }}\n </span>\n\n <he-svg-icon\n class=\"has-text-grey transition-transform\"\n [class.is-rotated-180]=\"childState.expanded\"\n [name]=\"childState.expanded ? 'chevron-up' : 'chevron-down'\"></he-svg-icon>\n </div>\n\n <div\n class=\"filter-accordion__panel-content\"\n [class.filter-accordion__panel-content--expanded]=\"childState.expanded\">\n @if (childState.expanded && optionsFromGroup(child).length >= 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n placeholder=\"Search {{ removeCountFromLabel(child.label) }}\"\n [value]=\"childState.searchTerm || ''\"\n [disabled]=\"isItemEffectivelyDisabled(child, isItemEffectivelyDisabled(item))\"\n (input)=\"childState.searchTerm = $any($event.target).value\" />\n <a\n class=\"icon is-small is-right\"\n [class.is-hidden]=\"!childState.searchTerm\"\n (click)=\"childState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"childState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n <div>\n @for (\n nestedOption of getFilteredOptions(\n child,\n childState.searchTerm || groupState.searchTerm\n );\n track nestedOption.trackId || nestedOption.label;\n let nestedLast = $last\n ) {\n <div class=\"pl-5 accordion-row\" [class.has-border-bottom]=\"!nestedLast\">\n <label\n class=\"checkbox is-flex is-align-items-center is-fullwidth is-size-7 has-text-grey-dark\">\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(nestedOption.value)\"\n (change)=\"toggleOption(nestedOption.value)\"\n [disabled]=\"isItemEffectivelyDisabled(nestedOption, isItemEffectivelyDisabled(child, isItemEffectivelyDisabled(item)))\"\n class=\"mr-3\" />\n\n <span class=\"is-flex-grow-1\">\n {{ removeCountFromLabel(nestedOption.label) }}\n </span>\n\n <span class=\"has-text-grey is-size-7 ml-2\">\n ({{ getOptionCount(nestedOption.value) }})\n </span>\n </label>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n } @else {\n <!-- Direct option -->\n <div class=\"pl-5 accordion-row\" [class.has-border-bottom]=\"!childLast\">\n <label class=\"checkbox is-flex is-align-items-center is-fullwidth is-size-7 has-text-grey-dark\">\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(child.value)\"\n (change)=\"toggleOption(child.value)\"\n [disabled]=\"isItemEffectivelyDisabled(child, isItemEffectivelyDisabled(item))\"\n class=\"mr-3\" />\n\n <span class=\"is-flex-grow-1\">\n {{ removeCountFromLabel(child.label) }}\n </span>\n\n <span class=\"has-text-grey is-size-7 ml-2\">({{ getOptionCount(child.value) }})</span>\n </label>\n </div>\n }\n }\n\n @if (getFilteredDirectChildren(item, groupState.searchTerm).length === 0 && groupState.searchTerm) {\n <div class=\"px-6 py-4 has-text-grey is-size-7 has-text-centered is-italic\">\n No results found for \"{{ groupState.searchTerm }}\"\n </div>\n }\n </div>\n </div>\n </div>\n }\n }\n\n @if (item.type === 'option') {\n <div class=\"is-flex is-justify-content-space-between has-border-bottom accordion-row\">\n <label class=\"checkbox is-flex is-align-items-center is-fullwidth is-full is-size-7 has-text-grey-dark\">\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(item.value)\"\n (change)=\"toggleOption(item.value)\"\n [disabled]=\"isItemEffectivelyDisabled(item)\"\n class=\"mr-3\" />\n\n <span class=\"is-flex-grow-1\">\n {{ removeCountFromLabel(item.label) }}\n </span>\n </label>\n <span class=\"has-text-grey is-size-7 ml-2\">({{ getOptionCount(item.value) }})</span>\n </div>\n }\n }\n </div>\n</div>\n", styles: [".gap-13{gap:13px}.clear-button{color:#4c7194}.accordion-row{padding:4px 0}.filter-accordion__panel-content{max-height:0;overflow:hidden;transition:max-height .3s ease-out}.filter-accordion__panel-content--expanded{max-height:500px;overflow-y:auto}.has-background-hover-light:hover{background-color:#fafafa}.has-border-bottom{border-bottom:1px solid #dbe3ea}.transition-transform{transition:transform .2s}@media screen and (max-width: 768px){.filter-accordion__panel-content--expanded{max-height:400px}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation", "svgClass"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
13031
13234
|
}
|
|
13032
13235
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImport: i0, type: FilterAccordionComponent, decorators: [{
|
|
13033
13236
|
type: Component$1,
|
|
@@ -13038,7 +13241,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
13038
13241
|
multi: true
|
|
13039
13242
|
},
|
|
13040
13243
|
FilterStore
|
|
13041
|
-
], imports: [FormsModule, ReactiveFormsModule, HESvgIconComponent, NgbTooltip], template: "<div>\n <div\n class=\"is-flex is-justify-content-space-between gap-13 is-align-items-flex-start is-flex-direction-column has-border-bottom\">\n <div class=\"is-flex is-align-items-center\">\n <h3 class=\"title is-size-6 has-text-secondary mr-2 mb-0\">{{ title() }}</h3>\n @if (tooltip()) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"has-text-grey\"\n [ngbTooltip]=\"tooltip()\"\n placement=\"top\"\n triggers=\"hover\"\n container=\"body\"></he-svg-icon>\n }\n </div>\n @if (showClearAll()) {\n <span class=\"is-clickable is-size-7 has-text-weight-normal is-italic clear-button\" (click)=\"clearAll()\">\n Clear all\n </span>\n }\n </div>\n\n <div>\n @for (item of filterStore.filteredData(); track item.trackId || item.label) {\n @if (item.type === 'group') {\n @if (panelStates[item.label]) {\n @let groupState = panelStates[item.label];\n <div class=\"has-border-bottom\" [class.is-active]=\"groupState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover accordion-row\"\n (click)=\"groupState.expanded = !groupState.expanded\">\n <label class=\"checkbox mr-3\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupFullySelected(item)\"\n [indeterminate]=\"isGroupPartiallySelected(item)\"\n (change)=\"toggleGroup(item)\"\n [disabled]=\"disabled()\" />\n </label>\n\n <span class=\"is-flex-grow-1 has-text-weight-medium has-text-grey-dark is-size-7\">\n {{ removeCountFromLabel(item.label) }}\n </span>\n\n <he-svg-icon\n class=\"has-text-grey transition-transform\"\n [name]=\"groupState.expanded ? 'chevron-up' : 'chevron-down'\"></he-svg-icon>\n </div>\n\n <div\n class=\"filter-accordion__panel-content\"\n [class.filter-accordion__panel-content--expanded]=\"groupState.expanded\">\n @if (groupState.expanded && getDirectOptionsCount(item) > 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n placeholder=\"Search {{ removeCountFromLabel(item.label) }}\"\n [value]=\"groupState.searchTerm || ''\"\n (input)=\"groupState.searchTerm = $any($event.target).value\" />\n <a\n class=\"icon is-small is-right\"\n [class.is-hidden]=\"!groupState.searchTerm\"\n (click)=\"groupState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"groupState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n\n <div>\n @for (\n child of getFilteredDirectChildren(item, groupState.searchTerm);\n track child.trackId || child.label;\n let childLast = $last\n ) {\n @if (child.type === 'group') {\n <!-- Nested group -->\n @if (panelStates[child.label]) {\n @let childState = panelStates[child.label];\n <div class=\"pl-5\" [class.has-border-bottom]=\"!childLast\">\n <div [class.is-active]=\"childState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover accordion-row\"\n (click)=\"childState.expanded = !childState.expanded\">\n <label class=\"checkbox mr-3\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupFullySelected(child)\"\n [indeterminate]=\"isGroupPartiallySelected(child)\"\n (change)=\"toggleGroup(child)\"\n [disabled]=\"disabled()\" />\n </label>\n\n <span class=\"is-flex-grow-1 has-text-weight-medium has-text-grey-dark is-size-7\">\n {{ removeCountFromLabel(child.label) }}\n </span>\n\n <he-svg-icon\n class=\"has-text-grey transition-transform\"\n [class.is-rotated-180]=\"childState.expanded\"\n [name]=\"childState.expanded ? 'chevron-up' : 'chevron-down'\"></he-svg-icon>\n </div>\n\n <div\n class=\"filter-accordion__panel-content\"\n [class.filter-accordion__panel-content--expanded]=\"childState.expanded\">\n @if (childState.expanded && optionsFromGroup(child).length >= 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n placeholder=\"Search {{ removeCountFromLabel(child.label) }}\"\n [value]=\"childState.searchTerm || ''\"\n (input)=\"childState.searchTerm = $any($event.target).value\" />\n <a\n class=\"icon is-small is-right\"\n [class.is-hidden]=\"!childState.searchTerm\"\n (click)=\"childState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"childState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n <div>\n @for (\n nestedOption of getFilteredOptions(\n child,\n childState.searchTerm || groupState.searchTerm\n );\n track nestedOption.trackId || nestedOption.label;\n let nestedLast = $last\n ) {\n <div class=\"pl-5 accordion-row\" [class.has-border-bottom]=\"!nestedLast\">\n <label\n class=\"checkbox is-flex is-align-items-center is-fullwidth is-size-7 has-text-grey-dark\">\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(nestedOption.value)\"\n (change)=\"toggleOption(nestedOption.value)\"\n [disabled]=\"disabled()\"\n class=\"mr-3\" />\n\n <span class=\"is-flex-grow-1\">\n {{ removeCountFromLabel(nestedOption.label) }}\n </span>\n\n <span class=\"has-text-grey is-size-7 ml-2\">\n ({{ getOptionCount(nestedOption.value) }})\n </span>\n </label>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n } @else {\n <!-- Direct option -->\n <div class=\"pl-5 accordion-row\" [class.has-border-bottom]=\"!childLast\">\n <label class=\"checkbox is-flex is-align-items-center is-fullwidth is-size-7 has-text-grey-dark\">\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(child.value)\"\n (change)=\"toggleOption(child.value)\"\n [disabled]=\"disabled()\"\n class=\"mr-3\" />\n\n <span class=\"is-flex-grow-1\">\n {{ removeCountFromLabel(child.label) }}\n </span>\n\n <span class=\"has-text-grey is-size-7 ml-2\">({{ getOptionCount(child.value) }})</span>\n </label>\n </div>\n }\n }\n\n @if (getFilteredDirectChildren(item, groupState.searchTerm).length === 0 && groupState.searchTerm) {\n <div class=\"px-6 py-4 has-text-grey is-size-7 has-text-centered is-italic\">\n No results found for \"{{ groupState.searchTerm }}\"\n </div>\n }\n </div>\n </div>\n </div>\n }\n }\n\n @if (item.type === 'option') {\n <div class=\"is-flex is-justify-content-space-between has-border-bottom accordion-row\">\n <label class=\"checkbox is-flex is-align-items-center is-fullwidth is-full is-size-7 has-text-grey-dark\">\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(item.value)\"\n (change)=\"toggleOption(item.value)\"\n [disabled]=\"disabled()\"\n class=\"mr-3\" />\n\n <span class=\"is-flex-grow-1\">\n {{ removeCountFromLabel(item.label) }}\n </span>\n </label>\n <span class=\"has-text-grey is-size-7 ml-2\">({{ getOptionCount(item.value) }})</span>\n </div>\n }\n }\n </div>\n</div>\n", styles: [".gap-13{gap:13px}.clear-button{color:#4c7194}.accordion-row{padding:4px 0}.filter-accordion__panel-content{max-height:0;overflow:hidden;transition:max-height .3s ease-out}.filter-accordion__panel-content--expanded{max-height:500px;overflow-y:auto}.has-background-hover-light:hover{background-color:#fafafa}.has-border-bottom{border-bottom:1px solid #dbe3ea}.transition-transform{transition:transform .2s}@media screen and (max-width: 768px){.filter-accordion__panel-content--expanded{max-height:400px}}\n"] }]
|
|
13244
|
+
], imports: [FormsModule, ReactiveFormsModule, HESvgIconComponent, NgbTooltip], template: "<div>\n <div\n class=\"is-flex is-justify-content-space-between gap-13 is-align-items-flex-start is-flex-direction-column has-border-bottom\">\n <div class=\"is-flex is-align-items-center\">\n <h3 class=\"title is-size-6 has-text-secondary mr-2 mb-0\">{{ title() }}</h3>\n @if (tooltip()) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"has-text-grey\"\n [ngbTooltip]=\"tooltip()\"\n placement=\"top\"\n triggers=\"hover\"\n container=\"body\"></he-svg-icon>\n }\n </div>\n @if (showClearAll()) {\n <span class=\"is-clickable is-size-7 has-text-weight-normal is-italic clear-button\" (click)=\"clearAll()\">\n Clear all\n </span>\n }\n </div>\n\n <div>\n @for (item of filterStore.filteredData(); track item.trackId || item.label) {\n @if (item.type === 'group') {\n @if (panelStates[item.label]) {\n @let groupState = panelStates[item.label];\n <div class=\"has-border-bottom\" [class.is-active]=\"groupState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover accordion-row\"\n (click)=\"groupState.expanded = !groupState.expanded\">\n <label class=\"checkbox mr-3\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupFullySelected(item)\"\n [indeterminate]=\"isGroupPartiallySelected(item)\"\n (change)=\"toggleGroup(item)\"\n [disabled]=\"isItemEffectivelyDisabled(item)\" />\n </label>\n\n <span class=\"is-flex-grow-1 has-text-weight-medium has-text-grey-dark is-size-7\">\n {{ removeCountFromLabel(item.label) }}\n </span>\n\n <he-svg-icon\n class=\"has-text-grey transition-transform\"\n [name]=\"groupState.expanded ? 'chevron-up' : 'chevron-down'\"></he-svg-icon>\n </div>\n\n <div\n class=\"filter-accordion__panel-content\"\n [class.filter-accordion__panel-content--expanded]=\"groupState.expanded\">\n @if (groupState.expanded && getDirectOptionsCount(item) > 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n placeholder=\"Search {{ removeCountFromLabel(item.label) }}\"\n [value]=\"groupState.searchTerm || ''\"\n [disabled]=\"isItemEffectivelyDisabled(item)\"\n (input)=\"groupState.searchTerm = $any($event.target).value\" />\n <a\n class=\"icon is-small is-right\"\n [class.is-hidden]=\"!groupState.searchTerm\"\n (click)=\"groupState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"groupState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n\n <div>\n @for (\n child of getFilteredDirectChildren(item, groupState.searchTerm);\n track child.trackId || child.label;\n let childLast = $last\n ) {\n @if (child.type === 'group') {\n <!-- Nested group -->\n @if (panelStates[child.label]) {\n @let childState = panelStates[child.label];\n <div class=\"pl-5\" [class.has-border-bottom]=\"!childLast\">\n <div [class.is-active]=\"childState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover accordion-row\"\n (click)=\"childState.expanded = !childState.expanded\">\n <label class=\"checkbox mr-3\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupFullySelected(child)\"\n [indeterminate]=\"isGroupPartiallySelected(child)\"\n (change)=\"toggleGroup(child)\"\n [disabled]=\"isItemEffectivelyDisabled(child, isItemEffectivelyDisabled(item))\" />\n </label>\n\n <span class=\"is-flex-grow-1 has-text-weight-medium has-text-grey-dark is-size-7\">\n {{ removeCountFromLabel(child.label) }}\n </span>\n\n <he-svg-icon\n class=\"has-text-grey transition-transform\"\n [class.is-rotated-180]=\"childState.expanded\"\n [name]=\"childState.expanded ? 'chevron-up' : 'chevron-down'\"></he-svg-icon>\n </div>\n\n <div\n class=\"filter-accordion__panel-content\"\n [class.filter-accordion__panel-content--expanded]=\"childState.expanded\">\n @if (childState.expanded && optionsFromGroup(child).length >= 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n placeholder=\"Search {{ removeCountFromLabel(child.label) }}\"\n [value]=\"childState.searchTerm || ''\"\n [disabled]=\"isItemEffectivelyDisabled(child, isItemEffectivelyDisabled(item))\"\n (input)=\"childState.searchTerm = $any($event.target).value\" />\n <a\n class=\"icon is-small is-right\"\n [class.is-hidden]=\"!childState.searchTerm\"\n (click)=\"childState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"childState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n <div>\n @for (\n nestedOption of getFilteredOptions(\n child,\n childState.searchTerm || groupState.searchTerm\n );\n track nestedOption.trackId || nestedOption.label;\n let nestedLast = $last\n ) {\n <div class=\"pl-5 accordion-row\" [class.has-border-bottom]=\"!nestedLast\">\n <label\n class=\"checkbox is-flex is-align-items-center is-fullwidth is-size-7 has-text-grey-dark\">\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(nestedOption.value)\"\n (change)=\"toggleOption(nestedOption.value)\"\n [disabled]=\"isItemEffectivelyDisabled(nestedOption, isItemEffectivelyDisabled(child, isItemEffectivelyDisabled(item)))\"\n class=\"mr-3\" />\n\n <span class=\"is-flex-grow-1\">\n {{ removeCountFromLabel(nestedOption.label) }}\n </span>\n\n <span class=\"has-text-grey is-size-7 ml-2\">\n ({{ getOptionCount(nestedOption.value) }})\n </span>\n </label>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n } @else {\n <!-- Direct option -->\n <div class=\"pl-5 accordion-row\" [class.has-border-bottom]=\"!childLast\">\n <label class=\"checkbox is-flex is-align-items-center is-fullwidth is-size-7 has-text-grey-dark\">\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(child.value)\"\n (change)=\"toggleOption(child.value)\"\n [disabled]=\"isItemEffectivelyDisabled(child, isItemEffectivelyDisabled(item))\"\n class=\"mr-3\" />\n\n <span class=\"is-flex-grow-1\">\n {{ removeCountFromLabel(child.label) }}\n </span>\n\n <span class=\"has-text-grey is-size-7 ml-2\">({{ getOptionCount(child.value) }})</span>\n </label>\n </div>\n }\n }\n\n @if (getFilteredDirectChildren(item, groupState.searchTerm).length === 0 && groupState.searchTerm) {\n <div class=\"px-6 py-4 has-text-grey is-size-7 has-text-centered is-italic\">\n No results found for \"{{ groupState.searchTerm }}\"\n </div>\n }\n </div>\n </div>\n </div>\n }\n }\n\n @if (item.type === 'option') {\n <div class=\"is-flex is-justify-content-space-between has-border-bottom accordion-row\">\n <label class=\"checkbox is-flex is-align-items-center is-fullwidth is-full is-size-7 has-text-grey-dark\">\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(item.value)\"\n (change)=\"toggleOption(item.value)\"\n [disabled]=\"isItemEffectivelyDisabled(item)\"\n class=\"mr-3\" />\n\n <span class=\"is-flex-grow-1\">\n {{ removeCountFromLabel(item.label) }}\n </span>\n </label>\n <span class=\"has-text-grey is-size-7 ml-2\">({{ getOptionCount(item.value) }})</span>\n </div>\n }\n }\n </div>\n</div>\n", styles: [".gap-13{gap:13px}.clear-button{color:#4c7194}.accordion-row{padding:4px 0}.filter-accordion__panel-content{max-height:0;overflow:hidden;transition:max-height .3s ease-out}.filter-accordion__panel-content--expanded{max-height:500px;overflow-y:auto}.has-background-hover-light:hover{background-color:#fafafa}.has-border-bottom{border-bottom:1px solid #dbe3ea}.transition-transform{transition:transform .2s}@media screen and (max-width: 768px){.filter-accordion__panel-content--expanded{max-height:400px}}\n"] }]
|
|
13042
13245
|
}], ctorParameters: () => [] });
|
|
13043
13246
|
|
|
13044
13247
|
const sortedPoints = (values) => Object.entries(values)
|