@hestia-earth/ui-components 0.38.1 → 0.39.1
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.
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Injectable, InjectionToken, inject, input, computed, HostBinding, Component as Component$1, model, output, signal, effect, ChangeDetectionStrategy,
|
|
2
|
+
import { Injectable, InjectionToken, inject, input, computed, HostBinding, Component as Component$1, model, output, signal, effect, ChangeDetectionStrategy, ElementRef, untracked, Directive, viewChild, Pipe, DestroyRef, HostListener, ViewEncapsulation, contentChild, viewChildren, forwardRef } from '@angular/core';
|
|
3
3
|
import { toSignal, toObservable, outputFromObservable, takeUntilDestroyed, rxResource } from '@angular/core/rxjs-interop';
|
|
4
4
|
import * as i1 from '@angular/forms';
|
|
5
5
|
import { UntypedFormBuilder, Validators, FormsModule, ReactiveFormsModule, NG_VALUE_ACCESSOR, FormControl } from '@angular/forms';
|
|
6
6
|
import { NgTemplateOutlet, NgClass, DecimalPipe, KeyValuePipe, DOCUMENT, PlatformLocation, NgStyle, UpperCasePipe, JsonPipe, DatePipe, AsyncPipe } from '@angular/common';
|
|
7
7
|
import * as i1$2 from '@ng-bootstrap/ng-bootstrap';
|
|
8
8
|
import { NgbActiveModal, NgbHighlight, NgbTooltip, NgbDropdown, NgbDropdownMenu, NgbDropdownToggle, NgbDropdownItem, NgbTypeahead, NgbPopover, NgbModal, NgbTooltipModule, NgbDropdownModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap';
|
|
9
|
-
import { catchError, map, debounceTime, distinctUntilChanged, tap, switchMap, startWith, mergeMap, shareReplay, delay, take, first, filter, skip, throttleTime, skipUntil, reduce, mergeAll, toArray, distinct, groupBy } from 'rxjs
|
|
10
|
-
import { of, zip, fromEvent, ReplaySubject, timer, Subject, combineLatest, pipe, merge as merge$1, EMPTY, animationFrameScheduler, forkJoin, from } from 'rxjs';
|
|
9
|
+
import { catchError, of, map, debounceTime, distinctUntilChanged, tap, switchMap, zip, fromEvent, startWith, ReplaySubject, mergeMap, shareReplay, delay, timer, take, first, Subject, combineLatest, filter, pipe, merge as merge$1, skip, EMPTY, throttleTime, animationFrameScheduler, skipUntil, lastValueFrom, forkJoin, from, reduce, firstValueFrom, mergeAll, toArray, distinct, groupBy } from 'rxjs';
|
|
11
10
|
import { HttpClient } from '@angular/common/http';
|
|
12
11
|
import get from 'lodash.get';
|
|
13
12
|
import { SCHEMA_VERSION, SchemaType, NodeType, TermTermType, productTermTermType, nestedSearchableKeys, SiteSiteType, EmissionMethodTier, isExpandable, sortKeysByType, isTypeNode, BlankNodesKey, impactAssessmentTermTermType, measurementTermTermType, emissionTermTermType, inputTermTermType, CycleFunctionalUnit, NonBlankNodesKey, jsonldPath, isTypeValid, isTypeBlankNode, typeToSchemaType, managementTermTermType } from '@hestia-earth/schema';
|
|
@@ -22,12 +21,12 @@ import { BreakpointObserver } from '@angular/cdk/layout';
|
|
|
22
21
|
import { select, selectAll } from 'd3-selection';
|
|
23
22
|
import { json2csv } from 'json-2-csv';
|
|
24
23
|
import { propertyValue as propertyValue$1, emptyValue } from '@hestia-earth/utils/dist/term';
|
|
25
|
-
import { getDefaultModelId, getModelGroup,
|
|
26
|
-
import { LocalStorageService } from 'ngx-webstorage';
|
|
24
|
+
import { getDefaultModelId, getModelGroup, isInSystemBoundary } from '@hestia-earth/glossary';
|
|
27
25
|
import isEqual$1 from 'lodash.isequal';
|
|
28
26
|
import { DataState, filenameWithoutExt, nodeTypeToParam, SupportedExtensions, fileToExt, allowedDataStates, fileExt, maxFileSizeMb } from '@hestia-earth/api';
|
|
29
27
|
import { models as models$1, loadConfig, getMaxStage } from '@hestia-earth/engine-models';
|
|
30
28
|
import { DeltaDisplayType, delta, customDeltaFuncs } from '@hestia-earth/utils/dist/delta';
|
|
29
|
+
import { LocalStorageService } from 'ngx-webstorage';
|
|
31
30
|
import { trigger, state, transition, style, animate } from '@angular/animations';
|
|
32
31
|
import { signalStore, withState, withComputed, withMethods, patchState, withHooks } from '@ngrx/signals';
|
|
33
32
|
import { rxMethod } from '@ngrx/signals/rxjs-interop';
|
|
@@ -249,11 +248,11 @@ class HeMendeleyService {
|
|
|
249
248
|
get path() {
|
|
250
249
|
return `${this.commonService.apiBaseUrl}/mendeley`;
|
|
251
250
|
}
|
|
252
|
-
find(params) {
|
|
251
|
+
find$(params) {
|
|
253
252
|
return this.http.get(this.path, { params: filterParams(params) });
|
|
254
253
|
}
|
|
255
|
-
get(id) {
|
|
256
|
-
return this.http.get(`${this.path}/${id}`)
|
|
254
|
+
get$(id) {
|
|
255
|
+
return this.http.get(`${this.path}/${id}`);
|
|
257
256
|
}
|
|
258
257
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: HeMendeleyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
259
258
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: HeMendeleyService, providedIn: 'root' }); }
|
|
@@ -425,15 +424,9 @@ class HeSearchService {
|
|
|
425
424
|
.post(`${this.commonService.apiBaseUrl}/search`, params)
|
|
426
425
|
.pipe(catchError(() => of(emptySearchResult())));
|
|
427
426
|
}
|
|
428
|
-
async search(params) {
|
|
429
|
-
return await this.search$(params).toPromise();
|
|
430
|
-
}
|
|
431
427
|
count$(params = {}) {
|
|
432
428
|
return this.http.post(`${this.commonService.apiBaseUrl}/count`, params).pipe(catchError(() => of(0)));
|
|
433
429
|
}
|
|
434
|
-
async count(params = {}) {
|
|
435
|
-
return await this.count$(params).toPromise();
|
|
436
|
-
}
|
|
437
430
|
get$(type, id) {
|
|
438
431
|
return this.http
|
|
439
432
|
.post(`${this.commonService.apiBaseUrl}/search`, {
|
|
@@ -446,9 +439,6 @@ class HeSearchService {
|
|
|
446
439
|
})
|
|
447
440
|
.pipe(catchError(() => of(emptySearchResult())), map(({ results }) => results[0] || null));
|
|
448
441
|
}
|
|
449
|
-
async get(type, id) {
|
|
450
|
-
return await this.get$(type, id).toPromise();
|
|
451
|
-
}
|
|
452
442
|
suggest$(term, type, extraQueries = [], fullQuery, limit = 10, includes = []) {
|
|
453
443
|
const query = fullQuery || suggestQuery(term, type, extraQueries);
|
|
454
444
|
return this.http
|
|
@@ -459,9 +449,6 @@ class HeSearchService {
|
|
|
459
449
|
})
|
|
460
450
|
.pipe(catchError(() => of(emptySearchResult())), map(({ results }) => results.map(({ _score, ...res }) => res)));
|
|
461
451
|
}
|
|
462
|
-
suggest(term, type, extraQueries = [], fullQuery, limit = 10, includes = []) {
|
|
463
|
-
return this.suggest$(term, type, extraQueries, fullQuery, limit, includes).toPromise();
|
|
464
|
-
}
|
|
465
452
|
suggestSource$(term, limit = 5, fields = ['bibliography.title'], includes = ['bibliography.title']) {
|
|
466
453
|
return this.suggest$(term, NodeType.Source, [], suggestSourceQuery(term, fields), limit, includes).pipe(map((sources) => sources.map(source => ({
|
|
467
454
|
...source,
|
|
@@ -472,9 +459,6 @@ class HeSearchService {
|
|
|
472
459
|
}
|
|
473
460
|
}))));
|
|
474
461
|
}
|
|
475
|
-
suggestSource(term, limit = 5, fields = ['bibliography.title'], includes = ['bibliography.title']) {
|
|
476
|
-
return this.suggestSource$(term, limit, fields, includes).toPromise();
|
|
477
|
-
}
|
|
478
462
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: HeSearchService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
479
463
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: HeSearchService, providedIn: 'root' }); }
|
|
480
464
|
}
|
|
@@ -558,7 +542,7 @@ class BibliographiesSearchConfirmComponent {
|
|
|
558
542
|
? { doi: term }
|
|
559
543
|
: { scopus: term };
|
|
560
544
|
return this.searchBibliographies
|
|
561
|
-
? this.mendeleyService.find({ ...params, limit: this.searchLimit() }).pipe(map(({ results }) => results))
|
|
545
|
+
? this.mendeleyService.find$({ ...params, limit: this.searchLimit() }).pipe(map(({ results }) => results))
|
|
562
546
|
: of([]);
|
|
563
547
|
}
|
|
564
548
|
runSearch(term) {
|
|
@@ -1156,43 +1140,43 @@ const registerChart = (items = []) => () => {
|
|
|
1156
1140
|
|
|
1157
1141
|
class ChartConfigurationDirective {
|
|
1158
1142
|
constructor() {
|
|
1159
|
-
this._zone = inject(NgZone);
|
|
1160
1143
|
this._elementRef = inject(ElementRef);
|
|
1161
|
-
this._observer = new ResizeObserver(() => this.
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1144
|
+
this._observer = new ResizeObserver(() => this.resize());
|
|
1145
|
+
/**
|
|
1146
|
+
* The chart configuration.
|
|
1147
|
+
* This is used to initialize the chart.
|
|
1148
|
+
*
|
|
1149
|
+
* @param configuration The chart configuration
|
|
1150
|
+
*/
|
|
1151
|
+
this.chartConfiguration = input(...(ngDevMode ? [undefined, { debugName: "chartConfiguration" }] : []));
|
|
1152
|
+
/**
|
|
1153
|
+
* The container element of the chart.
|
|
1154
|
+
* This is used to observe the size of the container and resize the chart accordingly. (chart.js update charts only on the window resize event)
|
|
1155
|
+
* If not provided, the chart will not be resized.
|
|
1156
|
+
*
|
|
1157
|
+
* @param container The container element of the chart
|
|
1158
|
+
*/
|
|
1159
|
+
this.chartContainer = input(...(ngDevMode ? [undefined, { debugName: "chartContainer" }] : []));
|
|
1160
|
+
effect(onCleanup => {
|
|
1161
|
+
const configuration = this.chartConfiguration();
|
|
1162
|
+
untracked(() => {
|
|
1163
|
+
this.removeChart();
|
|
1164
|
+
if (configuration) {
|
|
1165
|
+
this._chart = new Chart(this._elementRef.nativeElement, configuration);
|
|
1166
|
+
}
|
|
1167
|
+
});
|
|
1168
|
+
onCleanup(() => this.removeChart());
|
|
1169
|
+
});
|
|
1170
|
+
effect(onCleanup => {
|
|
1171
|
+
if (this.chartContainer()) {
|
|
1172
|
+
this._observer?.observe(this.chartContainer());
|
|
1174
1173
|
}
|
|
1174
|
+
else {
|
|
1175
|
+
this._observer?.disconnect();
|
|
1176
|
+
}
|
|
1177
|
+
onCleanup(() => this._observer?.disconnect());
|
|
1175
1178
|
});
|
|
1176
1179
|
}
|
|
1177
|
-
/**
|
|
1178
|
-
* The container element of the chart.
|
|
1179
|
-
* This is used to observe the size of the container and resize the chart accordingly. (chart.js update charts only on the window resize event)
|
|
1180
|
-
* If not provided, the chart will not be resized.
|
|
1181
|
-
*
|
|
1182
|
-
* @param container The container element of the chart
|
|
1183
|
-
*/
|
|
1184
|
-
set chartContainer(container) {
|
|
1185
|
-
if (container) {
|
|
1186
|
-
this._observer?.observe(container);
|
|
1187
|
-
}
|
|
1188
|
-
else {
|
|
1189
|
-
this._observer?.disconnect();
|
|
1190
|
-
}
|
|
1191
|
-
}
|
|
1192
|
-
ngOnDestroy() {
|
|
1193
|
-
this.removeChart();
|
|
1194
|
-
this._observer?.disconnect();
|
|
1195
|
-
}
|
|
1196
1180
|
removeChart() {
|
|
1197
1181
|
const chart = this._chart || Chart.getChart(this._elementRef.nativeElement);
|
|
1198
1182
|
chart?.destroy();
|
|
@@ -1205,7 +1189,7 @@ class ChartConfigurationDirective {
|
|
|
1205
1189
|
this._chart?.resize();
|
|
1206
1190
|
}
|
|
1207
1191
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: ChartConfigurationDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1208
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "
|
|
1192
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.13", type: ChartConfigurationDirective, isStandalone: true, selector: "[chartConfiguration]", inputs: { chartConfiguration: { classPropertyName: "chartConfiguration", publicName: "chartConfiguration", isSignal: true, isRequired: false, transformFunction: null }, chartContainer: { classPropertyName: "chartContainer", publicName: "chartContainer", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["chart"], ngImport: i0 }); }
|
|
1209
1193
|
}
|
|
1210
1194
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: ChartConfigurationDirective, decorators: [{
|
|
1211
1195
|
type: Directive,
|
|
@@ -1213,11 +1197,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImpo
|
|
|
1213
1197
|
selector: '[chartConfiguration]',
|
|
1214
1198
|
exportAs: 'chart'
|
|
1215
1199
|
}]
|
|
1216
|
-
}], propDecorators: { chartConfiguration: [{
|
|
1217
|
-
type: Input
|
|
1218
|
-
}], chartContainer: [{
|
|
1219
|
-
type: Input
|
|
1220
|
-
}] } });
|
|
1200
|
+
}], ctorParameters: () => [], propDecorators: { chartConfiguration: [{ type: i0.Input, args: [{ isSignal: true, alias: "chartConfiguration", required: false }] }], chartContainer: [{ type: i0.Input, args: [{ isSignal: true, alias: "chartContainer", required: false }] }] } });
|
|
1221
1201
|
|
|
1222
1202
|
const defaultSettings$3 = Object.freeze({
|
|
1223
1203
|
options: {
|
|
@@ -1493,14 +1473,16 @@ class BarChartComponent {
|
|
|
1493
1473
|
const excludedData = data.slice(this.maximumValues());
|
|
1494
1474
|
return [
|
|
1495
1475
|
...includedData,
|
|
1496
|
-
excludedData.length
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1476
|
+
excludedData.length
|
|
1477
|
+
? {
|
|
1478
|
+
label: `${excludedData.length} others`,
|
|
1479
|
+
count: sum(excludedData.map(({ count }) => count)),
|
|
1480
|
+
backgroundColor: excludedData[0].backgroundColor,
|
|
1481
|
+
borderColor: excludedData[0].borderColor,
|
|
1482
|
+
color: excludedData[0].color,
|
|
1483
|
+
includedItems: excludedData
|
|
1484
|
+
}
|
|
1485
|
+
: []
|
|
1504
1486
|
].flat();
|
|
1505
1487
|
}, ...(ngDevMode ? [{ debugName: "maximumData" }] : []));
|
|
1506
1488
|
this.defaultDatasets = computed(() => this.datasets()?.length
|
|
@@ -1812,7 +1794,7 @@ const defaultConfig = Object.freeze({
|
|
|
1812
1794
|
}
|
|
1813
1795
|
}
|
|
1814
1796
|
});
|
|
1815
|
-
const defaultTooltipFn = ({ label, count, includedItems }) => includedItems
|
|
1797
|
+
const defaultTooltipFn = ({ label, count, includedItems }) => includedItems?.length ? includedItems.map(item => defaultTooltipFn(item)).join('</br>') : `${label}: ${count}`;
|
|
1816
1798
|
class HorizontalBarChartComponent extends BarChartComponent {
|
|
1817
1799
|
constructor() {
|
|
1818
1800
|
super(...arguments);
|
|
@@ -2394,34 +2376,6 @@ const groupNodesByTerm = (nodes = [], key, includeNode = (_node) => true, hideZe
|
|
|
2394
2376
|
};
|
|
2395
2377
|
const isGroupVisible = (blankNodes) => blankNodes.some(v => v.value.visible);
|
|
2396
2378
|
|
|
2397
|
-
/**
|
|
2398
|
-
* Signal utility to patch local storage.
|
|
2399
|
-
*/
|
|
2400
|
-
const localStorageSignal = (initialValue, localStorageKey) => {
|
|
2401
|
-
const localStorage = inject(LocalStorageService);
|
|
2402
|
-
// retrieve value from local storage
|
|
2403
|
-
const storedValueRaw = localStorage.retrieve(localStorageKey);
|
|
2404
|
-
if (storedValueRaw) {
|
|
2405
|
-
try {
|
|
2406
|
-
initialValue = JSON.parse(storedValueRaw);
|
|
2407
|
-
}
|
|
2408
|
-
catch (e) {
|
|
2409
|
-
console.error('Failed to parse stored value for key:', localStorageKey);
|
|
2410
|
-
}
|
|
2411
|
-
}
|
|
2412
|
-
else {
|
|
2413
|
-
localStorage.store(localStorageKey, JSON.stringify(initialValue));
|
|
2414
|
-
}
|
|
2415
|
-
const writableSignal = signal(initialValue, ...(ngDevMode ? [{ debugName: "writableSignal" }] : []));
|
|
2416
|
-
// monkey-patch signal setter to also store to local storage on set
|
|
2417
|
-
const setter = writableSignal.set;
|
|
2418
|
-
writableSignal.set = (value) => {
|
|
2419
|
-
localStorage.store(localStorageKey, JSON.stringify(value));
|
|
2420
|
-
setter(value);
|
|
2421
|
-
};
|
|
2422
|
-
return writableSignal;
|
|
2423
|
-
};
|
|
2424
|
-
|
|
2425
2379
|
/* eslint-disable */
|
|
2426
2380
|
// copied from https://github.com/plurals/pluralize but incompatible with angular 14 and webpack 6
|
|
2427
2381
|
// Rule storage - pluralize and singularize need to be run sequentially,
|
|
@@ -2869,9 +2823,8 @@ class ResizedEvent {
|
|
|
2869
2823
|
class ResizedDirective {
|
|
2870
2824
|
constructor() {
|
|
2871
2825
|
this.element = inject(ElementRef);
|
|
2872
|
-
this.zone = inject(NgZone);
|
|
2873
2826
|
this.resized = output();
|
|
2874
|
-
this.observer = new ResizeObserver(entries => this.
|
|
2827
|
+
this.observer = new ResizeObserver(entries => this.observe(entries));
|
|
2875
2828
|
}
|
|
2876
2829
|
ngOnInit() {
|
|
2877
2830
|
this.observer.observe(this.element.nativeElement);
|
|
@@ -2973,12 +2926,10 @@ class HeEngineService {
|
|
|
2973
2926
|
this._recommendations = {};
|
|
2974
2927
|
this._requirements = {};
|
|
2975
2928
|
}
|
|
2976
|
-
listModels(params) {
|
|
2977
|
-
return this.http
|
|
2978
|
-
.get(`${this._calculationsBaseUrl}/models`, {
|
|
2929
|
+
listModels$(params) {
|
|
2930
|
+
return this.http.get(`${this._calculationsBaseUrl}/models`, {
|
|
2979
2931
|
params: filterParams(params)
|
|
2980
|
-
})
|
|
2981
|
-
.toPromise();
|
|
2932
|
+
});
|
|
2982
2933
|
}
|
|
2983
2934
|
getRequirements$(params) {
|
|
2984
2935
|
const key = JSON.stringify(filterParams(params));
|
|
@@ -2991,9 +2942,6 @@ class HeEngineService {
|
|
|
2991
2942
|
.pipe(shareReplay(1));
|
|
2992
2943
|
return this._requirements[key];
|
|
2993
2944
|
}
|
|
2994
|
-
getRequirements(params) {
|
|
2995
|
-
return this.getRequirements$(params).toPromise();
|
|
2996
|
-
}
|
|
2997
2945
|
getTermIds$(params) {
|
|
2998
2946
|
const key = JSON.stringify(filterParams(params));
|
|
2999
2947
|
this._recommendations[key] =
|
|
@@ -3189,7 +3137,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImpo
|
|
|
3189
3137
|
|
|
3190
3138
|
class DataTableComponent {
|
|
3191
3139
|
constructor() {
|
|
3192
|
-
this.ngZone = inject(NgZone);
|
|
3193
3140
|
this.elementRef = inject(ElementRef);
|
|
3194
3141
|
this.minHeight = input(...(ngDevMode ? [undefined, { debugName: "minHeight" }] : []));
|
|
3195
3142
|
this.maxHeight = input(...(ngDevMode ? [undefined, { debugName: "maxHeight" }] : []));
|
|
@@ -3202,9 +3149,7 @@ class DataTableComponent {
|
|
|
3202
3149
|
return this.elementRef.nativeElement.querySelector('.data-table-holder');
|
|
3203
3150
|
}
|
|
3204
3151
|
onResized({ newRect: { width } }) {
|
|
3205
|
-
this.
|
|
3206
|
-
this.containerEl.style.width = `${width}px`;
|
|
3207
|
-
});
|
|
3152
|
+
this.containerEl.style.width = `${width}px`;
|
|
3208
3153
|
}
|
|
3209
3154
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: DataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3210
3155
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.13", type: DataTableComponent, isStandalone: true, selector: "he-data-table", inputs: { minHeight: { classPropertyName: "minHeight", publicName: "minHeight", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, small: { classPropertyName: "small", publicName: "small", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "resized": "onResized($event)" }, properties: { "class.is-small": "this.isSmall" } }, ngImport: i0, template: "<div class=\"w-100 h-100 is-overflow-hidden | data-table-holder\">\n <div\n class=\"w-100 h-100 is-overflow-auto | table-container\"\n [style.min-height]=\"minHeight() + 'px'\"\n [style.max-height]=\"maxHeight() + 'px'\">\n <ng-content />\n </div>\n</div>\n", styles: [":host{display:block;height:inherit;width:100%}:host *{box-sizing:border-box}:host .data-table-holder{z-index:1}:host.is-bordered>.data-table-holder{border:1px solid #dbe3ea;border-radius:3px;box-shadow:inset -2px 0 #bdb7b726;padding:8px}:host ::ng-deep *{box-sizing:border-box}:host ::ng-deep>.data-table-holder>.table-container>.table{width:100%}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th{height:42px;white-space:nowrap;font-weight:600}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td{border:none}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th>span:first-child,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td>span:first-child{display:inline-block;max-width:100%}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.table-container>.table .fixed-column{position:sticky}:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td{z-index:10}:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td.fixed-column{z-index:11}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th{top:0;z-index:1070}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th.fixed-column{z-index:1071}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th.has-border-right:not(:last-child),:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td.has-border-right:not(:last-child){box-shadow:inset -2px 0 #bdb7b726}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td.fixed-column{left:0;max-width:300px;width:300px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td.fixed-column{max-width:180px;width:180px}}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th.fixed-column.has-border-right,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td.fixed-column.has-border-right{box-shadow:none}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th.fixed-column.has-border-right:after,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td.fixed-column.has-border-right:after{position:absolute;content:\"\";height:100%;top:0;right:0;width:4px;box-shadow:2px 0 4px #bdb7b726}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td.fixed-column{left:300px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td.fixed-column{left:180px}}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr:last-child>th{box-shadow:inset 0 -1px #ffc000}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr:last-child>th.has-border-right:not(:last-child){box-shadow:inset 0 -1px #ffc000,inset -2px 0 #bdb7b726}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr:last-child>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr:last-child>th.fixed-column.has-border-right{box-shadow:inset 0 -1px #ffc000}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr:last-child>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr:last-child>th.fixed-column.has-border-right:after{box-shadow:inset 0 -1px #ffc000,2px 0 4px #bdb7b726}:host ::ng-deep>.data-table-holder>.table-container>.table.is-dark>thead>tr>th.has-border-right,:host ::ng-deep>.data-table-holder>.table-container>.table.is-dark>tbody>tr>td.has-border-right{box-shadow:inset -2px 0 #6c8093}:host ::ng-deep>.data-table-holder>.table-container>.table.is-dark>thead>tr>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.table-container>.table.is-dark>thead>tr>th.fixed-column.has-border-right:after,:host ::ng-deep>.data-table-holder>.table-container>.table.is-dark>tbody>tr>td:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.table-container>.table.is-dark>tbody>tr>td.fixed-column.has-border-right:after{box-shadow:2px 0 4px #6c8093}:host ::ng-deep>.data-table-holder>.table-container>.table.is-dark>thead>tr:last-child>th{box-shadow:inset 0 -1px #c5cdd5}:host ::ng-deep>.data-table-holder>.table-container>.table.is-dark>thead>tr:last-child>th.has-border-right{box-shadow:inset 0 -1px #c5cdd5,inset -2px 0 #6c8093}:host ::ng-deep>.data-table-holder>.table-container>.table.is-dark>thead>tr:last-child>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.table-container>.table.is-dark>thead>tr:last-child>th.fixed-column.has-border-right{box-shadow:inset 0 -1px #c5cdd5}:host ::ng-deep>.data-table-holder>.table-container>.table.is-dark>thead>tr:last-child>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.table-container>.table.is-dark>thead>tr:last-child>th.fixed-column.has-border-right:after{box-shadow:inset 0 -1px #c5cdd5,2px 0 4px #6c8093}:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr{background-color:transparent!important}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr+tr th{top:42px}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr+tr+tr th{top:84px}:host ::ng-deep>.data-table-holder>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.table-container>.table>tbody>tr>td{background-color:#fff}:host ::ng-deep>.data-table-holder>.table-container>.table.is-hoverable>tbody>tr:not(.is-selected):hover>td{background-color:#f3f5f7}:host ::ng-deep>.data-table-holder>.table-container>.table.is-striped>tbody>tr:not(.is-selected):nth-child(2n)>td{background-color:#fefcf7}:host ::ng-deep>.data-table-holder>.table-container>.table.is-striped.is-hoverable>tr:not(.is-selected):nth-child(2n):hover>td{background-color:#f3f5f7}:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow{font-size:.875rem;line-height:1rem}:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>thead>tr>th{height:30px}:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>tbody>tr>td.fixed-column{min-width:200px;max-width:200px;width:200px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>tbody>tr>td.fixed-column{min-width:120px;max-width:120px;width:120px}}:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>tbody>tr>td.fixed-column{left:200px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>tbody>tr>td.fixed-column{left:120px}}:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>thead>tr+tr th{top:30px}:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow>thead>tr+tr+tr th{top:60px}:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow .select,:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow .select select,:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow .input{height:30px;font-size:.875rem;line-height:1rem}:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow .select select,:host ::ng-deep>.data-table-holder>.table-container>.table.is-narrow .input{padding-top:5px;padding-bottom:5px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
@@ -3914,14 +3859,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImpo
|
|
|
3914
3859
|
|
|
3915
3860
|
class MobileShellComponent {
|
|
3916
3861
|
constructor() {
|
|
3917
|
-
this.
|
|
3918
|
-
this.
|
|
3862
|
+
this.iconTemplate = contentChild('iconTemplate', ...(ngDevMode ? [{ debugName: "iconTemplate" }] : []));
|
|
3863
|
+
this.menuButtons = input(...(ngDevMode ? [undefined, { debugName: "menuButtons" }] : []));
|
|
3864
|
+
this.defaultActiveButtonId = input(...(ngDevMode ? [undefined, { debugName: "defaultActiveButtonId" }] : []));
|
|
3919
3865
|
this.clickedButton = signal(null, ...(ngDevMode ? [{ debugName: "clickedButton" }] : []));
|
|
3920
3866
|
this.expanded = signal(false, ...(ngDevMode ? [{ debugName: "expanded" }] : []));
|
|
3921
3867
|
this.menuRef = signal(null, ...(ngDevMode ? [{ debugName: "menuRef" }] : []));
|
|
3922
|
-
this.
|
|
3923
|
-
this.
|
|
3924
|
-
this.buttons = computed(() => this._shelfButtons()
|
|
3868
|
+
this.menuShown = output();
|
|
3869
|
+
this.buttons = computed(() => this.menuButtons()
|
|
3925
3870
|
.map((button, index) => ({
|
|
3926
3871
|
...button,
|
|
3927
3872
|
id: button.id || index.toString()
|
|
@@ -3930,21 +3875,13 @@ class MobileShellComponent {
|
|
|
3930
3875
|
const activeMenuId = this.activeMenuId();
|
|
3931
3876
|
return { ...button, isActive: button.id === (activeMenuId || this.activeButtonId()) };
|
|
3932
3877
|
}), ...(ngDevMode ? [{ debugName: "buttons" }] : []));
|
|
3933
|
-
this.activeButtonId = computed(() => {
|
|
3934
|
-
return this.clickedButton() || this._defaultActiveButtonId();
|
|
3935
|
-
}, ...(ngDevMode ? [{ debugName: "activeButtonId" }] : []));
|
|
3878
|
+
this.activeButtonId = computed(() => this.clickedButton() || this.defaultActiveButtonId(), ...(ngDevMode ? [{ debugName: "activeButtonId" }] : []));
|
|
3936
3879
|
this.activeMenuId = computed(() => this.expanded() && this.menuRef()
|
|
3937
|
-
? this.
|
|
3880
|
+
? this.menuButtons()
|
|
3938
3881
|
.findIndex(button => button.menuRef === this.menuRef())
|
|
3939
3882
|
?.toString()
|
|
3940
3883
|
: undefined, ...(ngDevMode ? [{ debugName: "activeMenuId" }] : []));
|
|
3941
3884
|
}
|
|
3942
|
-
set menuButtons(value) {
|
|
3943
|
-
this._shelfButtons.set(value);
|
|
3944
|
-
}
|
|
3945
|
-
set defaultActiveButtonId(value) {
|
|
3946
|
-
this._defaultActiveButtonId.set(value);
|
|
3947
|
-
}
|
|
3948
3885
|
hideMenu() {
|
|
3949
3886
|
this.expanded.set(false);
|
|
3950
3887
|
this.clickedButton.set(null);
|
|
@@ -3974,21 +3911,12 @@ class MobileShellComponent {
|
|
|
3974
3911
|
button.onClick?.();
|
|
3975
3912
|
}
|
|
3976
3913
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: MobileShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3977
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.13", type: MobileShellComponent, isStandalone: true, selector: "he-mobile-shell", inputs: { menuButtons: "menuButtons", defaultActiveButtonId: "defaultActiveButtonId" }, outputs: { menuShown: "menuShown" }, queries: [{ propertyName: "iconTemplate", first: true, predicate: ["iconTemplate"], descendants: true }], ngImport: i0, template: "<div class=\"is-overflow-auto | shell-content\">\n <div [class.menu-expanded]=\"expanded()\" class=\"shell__content--body | h-100\">\n <ng-content />\n </div>\n</div>\n\n<aside class=\"shell-footer | is-flex is-justify-content-space-between\">\n @for (button of buttons(); track button.id || button.label) {\n <button\n (click)=\"onMenuButtonClick(button)\"\n class=\"button is-secondary is-flex is-flex-direction-column is-align-items-center | menu-button\"\n [disabled]=\"button.disabled\">\n <ng-container\n *ngTemplateOutlet=\"\n iconTemplate ?? defaultIconTemplate;\n context: { $implicit: button, isActive: button.isActive }\n \" />\n @if (button.isActive && button.label) {\n <span class=\"is-size-8 | menu-button-label\">{{ button.label }}</span>\n }\n </button>\n }\n</aside>\n\n<div [class.expanded]=\"expanded()\" class=\"shell-menu | is-absolute w-100 h-100\">\n <ng-template [ngTemplateOutlet]=\"menuRef()\" />\n</div>\n\n<ng-template #defaultIconTemplate let-button>\n <he-svg-icon [name]=\"button.icon\" />\n</ng-template>\n", styles: [":host{position:relative;display:grid;grid-template-rows:1fr auto;width:100%;height:100%;overflow:hidden;--menu-height: 2.875em}.shell-footer{background:#193957;z-index:10}.shell-menu{bottom:0;left:0;background:#fefaef;transform:translateY(100%);transition:transform .1s ease-out;padding-bottom:var(--menu-height)}.shell-menu.expanded{transform:translateY(0)}.menu-button-label{line-height:normal;letter-spacing:-.01rem}.menu-button{box-shadow:none;height:3.5em;width:2em}.menu-button:hover{background-color:initial}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation"] }] }); }
|
|
3914
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.13", type: MobileShellComponent, isStandalone: true, selector: "he-mobile-shell", inputs: { menuButtons: { classPropertyName: "menuButtons", publicName: "menuButtons", isSignal: true, isRequired: false, transformFunction: null }, defaultActiveButtonId: { classPropertyName: "defaultActiveButtonId", publicName: "defaultActiveButtonId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuShown: "menuShown" }, queries: [{ propertyName: "iconTemplate", first: true, predicate: ["iconTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"is-overflow-auto | shell-content\">\n <div [class.menu-expanded]=\"expanded()\" class=\"shell__content--body | h-100\">\n <ng-content />\n </div>\n</div>\n\n<aside class=\"shell-footer | is-flex is-justify-content-space-between\">\n @for (button of buttons(); track button.id || button.label) {\n <button\n (click)=\"onMenuButtonClick(button)\"\n class=\"button is-secondary is-flex is-flex-direction-column is-align-items-center | menu-button\"\n [disabled]=\"button.disabled\">\n <ng-container\n *ngTemplateOutlet=\"\n iconTemplate() ?? defaultIconTemplate;\n context: { $implicit: button, isActive: button.isActive }\n \" />\n @if (button.isActive && button.label) {\n <span class=\"is-size-8 | menu-button-label\">{{ button.label }}</span>\n }\n </button>\n }\n</aside>\n\n<div [class.expanded]=\"expanded()\" class=\"shell-menu | is-absolute w-100 h-100\">\n <ng-template [ngTemplateOutlet]=\"menuRef()\" />\n</div>\n\n<ng-template #defaultIconTemplate let-button>\n <he-svg-icon [name]=\"button.icon\" />\n</ng-template>\n", styles: [":host{position:relative;display:grid;grid-template-rows:1fr auto;width:100%;height:100%;overflow:hidden;--menu-height: 2.875em}.shell-footer{background:#193957;z-index:10}.shell-menu{bottom:0;left:0;background:#fefaef;transform:translateY(100%);transition:transform .1s ease-out;padding-bottom:var(--menu-height)}.shell-menu.expanded{transform:translateY(0)}.menu-button-label{line-height:normal;letter-spacing:-.01rem}.menu-button{box-shadow:none;height:3.5em;width:2em}.menu-button:hover{background-color:initial}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation"] }] }); }
|
|
3978
3915
|
}
|
|
3979
3916
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: MobileShellComponent, decorators: [{
|
|
3980
3917
|
type: Component$1,
|
|
3981
|
-
args: [{ selector: 'he-mobile-shell', imports: [NgTemplateOutlet, HESvgIconComponent], template: "<div class=\"is-overflow-auto | shell-content\">\n <div [class.menu-expanded]=\"expanded()\" class=\"shell__content--body | h-100\">\n <ng-content />\n </div>\n</div>\n\n<aside class=\"shell-footer | is-flex is-justify-content-space-between\">\n @for (button of buttons(); track button.id || button.label) {\n <button\n (click)=\"onMenuButtonClick(button)\"\n class=\"button is-secondary is-flex is-flex-direction-column is-align-items-center | menu-button\"\n [disabled]=\"button.disabled\">\n <ng-container\n *ngTemplateOutlet=\"\n iconTemplate ?? defaultIconTemplate;\n context: { $implicit: button, isActive: button.isActive }\n \" />\n @if (button.isActive && button.label) {\n <span class=\"is-size-8 | menu-button-label\">{{ button.label }}</span>\n }\n </button>\n }\n</aside>\n\n<div [class.expanded]=\"expanded()\" class=\"shell-menu | is-absolute w-100 h-100\">\n <ng-template [ngTemplateOutlet]=\"menuRef()\" />\n</div>\n\n<ng-template #defaultIconTemplate let-button>\n <he-svg-icon [name]=\"button.icon\" />\n</ng-template>\n", styles: [":host{position:relative;display:grid;grid-template-rows:1fr auto;width:100%;height:100%;overflow:hidden;--menu-height: 2.875em}.shell-footer{background:#193957;z-index:10}.shell-menu{bottom:0;left:0;background:#fefaef;transform:translateY(100%);transition:transform .1s ease-out;padding-bottom:var(--menu-height)}.shell-menu.expanded{transform:translateY(0)}.menu-button-label{line-height:normal;letter-spacing:-.01rem}.menu-button{box-shadow:none;height:3.5em;width:2em}.menu-button:hover{background-color:initial}\n"] }]
|
|
3982
|
-
}], propDecorators: { iconTemplate: [{
|
|
3983
|
-
type: ContentChild,
|
|
3984
|
-
args: ['iconTemplate']
|
|
3985
|
-
}], menuButtons: [{
|
|
3986
|
-
type: Input
|
|
3987
|
-
}], defaultActiveButtonId: [{
|
|
3988
|
-
type: Input
|
|
3989
|
-
}], menuShown: [{
|
|
3990
|
-
type: Output
|
|
3991
|
-
}] } });
|
|
3918
|
+
args: [{ selector: 'he-mobile-shell', imports: [NgTemplateOutlet, HESvgIconComponent], template: "<div class=\"is-overflow-auto | shell-content\">\n <div [class.menu-expanded]=\"expanded()\" class=\"shell__content--body | h-100\">\n <ng-content />\n </div>\n</div>\n\n<aside class=\"shell-footer | is-flex is-justify-content-space-between\">\n @for (button of buttons(); track button.id || button.label) {\n <button\n (click)=\"onMenuButtonClick(button)\"\n class=\"button is-secondary is-flex is-flex-direction-column is-align-items-center | menu-button\"\n [disabled]=\"button.disabled\">\n <ng-container\n *ngTemplateOutlet=\"\n iconTemplate() ?? defaultIconTemplate;\n context: { $implicit: button, isActive: button.isActive }\n \" />\n @if (button.isActive && button.label) {\n <span class=\"is-size-8 | menu-button-label\">{{ button.label }}</span>\n }\n </button>\n }\n</aside>\n\n<div [class.expanded]=\"expanded()\" class=\"shell-menu | is-absolute w-100 h-100\">\n <ng-template [ngTemplateOutlet]=\"menuRef()\" />\n</div>\n\n<ng-template #defaultIconTemplate let-button>\n <he-svg-icon [name]=\"button.icon\" />\n</ng-template>\n", styles: [":host{position:relative;display:grid;grid-template-rows:1fr auto;width:100%;height:100%;overflow:hidden;--menu-height: 2.875em}.shell-footer{background:#193957;z-index:10}.shell-menu{bottom:0;left:0;background:#fefaef;transform:translateY(100%);transition:transform .1s ease-out;padding-bottom:var(--menu-height)}.shell-menu.expanded{transform:translateY(0)}.menu-button-label{line-height:normal;letter-spacing:-.01rem}.menu-button{box-shadow:none;height:3.5em;width:2em}.menu-button:hover{background-color:initial}\n"] }]
|
|
3919
|
+
}], propDecorators: { iconTemplate: [{ type: i0.ContentChild, args: ['iconTemplate', { isSignal: true }] }], menuButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuButtons", required: false }] }], defaultActiveButtonId: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultActiveButtonId", required: false }] }], menuShown: [{ type: i0.Output, args: ["menuShown"] }] } });
|
|
3992
3920
|
|
|
3993
3921
|
class PopoverComponent {
|
|
3994
3922
|
constructor() {
|
|
@@ -4088,13 +4016,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImpo
|
|
|
4088
4016
|
|
|
4089
4017
|
class ShellComponent {
|
|
4090
4018
|
constructor() {
|
|
4091
|
-
this.iconTemplate =
|
|
4092
|
-
this.
|
|
4093
|
-
this.
|
|
4094
|
-
this.menuOverlap = false;
|
|
4095
|
-
this.closeMenuOnOutsideClick = false;
|
|
4096
|
-
this.menuShown =
|
|
4097
|
-
this.buttons = computed(() => this.
|
|
4019
|
+
this.iconTemplate = contentChild('iconTemplate', ...(ngDevMode ? [{ debugName: "iconTemplate" }] : []));
|
|
4020
|
+
this.shelfButtons = input(...(ngDevMode ? [undefined, { debugName: "shelfButtons" }] : []));
|
|
4021
|
+
this.defaultActiveButtonId = input(null, ...(ngDevMode ? [{ debugName: "defaultActiveButtonId" }] : []));
|
|
4022
|
+
this.menuOverlap = input(false, ...(ngDevMode ? [{ debugName: "menuOverlap" }] : []));
|
|
4023
|
+
this.closeMenuOnOutsideClick = input(false, ...(ngDevMode ? [{ debugName: "closeMenuOnOutsideClick" }] : []));
|
|
4024
|
+
this.menuShown = output();
|
|
4025
|
+
this.buttons = computed(() => this.shelfButtons()
|
|
4098
4026
|
.map((button, index) => ({
|
|
4099
4027
|
...button,
|
|
4100
4028
|
id: button.id || index.toString()
|
|
@@ -4106,26 +4034,14 @@ class ShellComponent {
|
|
|
4106
4034
|
this.clickedButton = signal(null, ...(ngDevMode ? [{ debugName: "clickedButton" }] : []));
|
|
4107
4035
|
this.expanded = signal(false, ...(ngDevMode ? [{ debugName: "expanded" }] : []));
|
|
4108
4036
|
this.menuRef = signal(null, ...(ngDevMode ? [{ debugName: "menuRef" }] : []));
|
|
4109
|
-
this.activeButtonId = computed(() => {
|
|
4110
|
-
return this.clickedButton() || this._defaultActiveButtonId();
|
|
4111
|
-
}, ...(ngDevMode ? [{ debugName: "activeButtonId" }] : []));
|
|
4037
|
+
this.activeButtonId = computed(() => this.clickedButton() || this.defaultActiveButtonId(), ...(ngDevMode ? [{ debugName: "activeButtonId" }] : []));
|
|
4112
4038
|
this.activeMenuId = computed(() => this.expanded() && this.menuRef()
|
|
4113
|
-
? this.
|
|
4039
|
+
? this.shelfButtons()
|
|
4114
4040
|
.findIndex(button => button.menuRef === this.menuRef())
|
|
4115
4041
|
?.toString()
|
|
4116
4042
|
: undefined, ...(ngDevMode ? [{ debugName: "activeMenuId" }] : []));
|
|
4117
|
-
this.topMenuButtons = computed(() => {
|
|
4118
|
-
|
|
4119
|
-
}, ...(ngDevMode ? [{ debugName: "topMenuButtons" }] : []));
|
|
4120
|
-
this.bottomMenuButtons = computed(() => {
|
|
4121
|
-
return this.buttons().filter(button => button.position === 'bottom');
|
|
4122
|
-
}, ...(ngDevMode ? [{ debugName: "bottomMenuButtons" }] : []));
|
|
4123
|
-
}
|
|
4124
|
-
set shelfButtons(value) {
|
|
4125
|
-
this._shelfButtons.set(value);
|
|
4126
|
-
}
|
|
4127
|
-
set defaultActiveButtonId(value) {
|
|
4128
|
-
this._defaultActiveButtonId.set(value);
|
|
4043
|
+
this.topMenuButtons = computed(() => this.buttons().filter(button => !button.position || button.position === 'top'), ...(ngDevMode ? [{ debugName: "topMenuButtons" }] : []));
|
|
4044
|
+
this.bottomMenuButtons = computed(() => this.buttons().filter(button => button.position === 'bottom'), ...(ngDevMode ? [{ debugName: "bottomMenuButtons" }] : []));
|
|
4129
4045
|
}
|
|
4130
4046
|
trackByFn(index, item) {
|
|
4131
4047
|
return item.id;
|
|
@@ -4159,25 +4075,12 @@ class ShellComponent {
|
|
|
4159
4075
|
button.onClick?.();
|
|
4160
4076
|
}
|
|
4161
4077
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: ShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4162
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.13", type: ShellComponent, isStandalone: true, selector: "he-shell", inputs: { shelfButtons: "shelfButtons", menuOverlap: "menuOverlap", closeMenuOnOutsideClick: "closeMenuOnOutsideClick",
|
|
4078
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.13", type: ShellComponent, isStandalone: true, selector: "he-shell", inputs: { shelfButtons: { classPropertyName: "shelfButtons", publicName: "shelfButtons", isSignal: true, isRequired: false, transformFunction: null }, defaultActiveButtonId: { classPropertyName: "defaultActiveButtonId", publicName: "defaultActiveButtonId", isSignal: true, isRequired: false, transformFunction: null }, menuOverlap: { classPropertyName: "menuOverlap", publicName: "menuOverlap", isSignal: true, isRequired: false, transformFunction: null }, closeMenuOnOutsideClick: { classPropertyName: "closeMenuOnOutsideClick", publicName: "closeMenuOnOutsideClick", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuShown: "menuShown" }, queries: [{ propertyName: "iconTemplate", first: true, predicate: ["iconTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"shell | h-100 is-overflow-hidden\">\n <aside>\n <div class=\"shell__menu | is-relative h-100 is-flex is-flex-direction-column is-justify-content-space-between\">\n <div class=\"shell__menu--section | is-flex is-flex-direction-column\">\n @for (button of topMenuButtons(); track trackByFn($index, button)) {\n <ng-container [ngTemplateOutlet]=\"buttonTemplate\" [ngTemplateOutletContext]=\"{ $implicit: button }\" />\n }\n </div>\n\n <div class=\"shell__menu--section | is-flex is-flex-direction-column\">\n @for (button of bottomMenuButtons(); track trackByFn($index, button)) {\n <ng-container [ngTemplateOutlet]=\"buttonTemplate\" [ngTemplateOutletContext]=\"{ $implicit: button }\" />\n }\n </div>\n </div>\n <div class=\"shell__menuContent | h-100 is-absolute\" [class.expanded]=\"expanded()\">\n <div class=\"h-100\" [class.is-hidden]=\"!expanded()\">\n <ng-template [ngTemplateOutlet]=\"menuRef()\" />\n </div>\n </div>\n </aside>\n\n <div class=\"shell__content | h-100 w-100 is-overflow-hidden is-flex is-justify-content-flex-end\">\n <div\n class=\"shell__content--body | w-100\"\n [class.menu-expanded]=\"!menuOverlap() && expanded()\"\n (click)=\"closeMenuOnOutsideClick() ? hideMenu() : null\">\n <ng-content />\n </div>\n </div>\n</div>\n\n<ng-template #buttonTemplate let-button>\n <button\n (click)=\"onMenuButtonClick(button)\"\n class=\"menu-button button is-secondary\"\n [ngClass]=\"button.isActive ? button.activeClassName : ''\"\n [class.is-active]=\"button.isActive\">\n <ng-container\n *ngTemplateOutlet=\"\n iconTemplate() ?? defaultIconTemplate;\n context: { $implicit: button, isActive: button !== clickedButton }\n \" />\n </button>\n</ng-template>\n\n<ng-template #defaultIconTemplate let-button>\n <he-svg-icon [name]=\"button.icon\" />\n</ng-template>\n", styles: ["::ng-deep :root{--menu-width: 200px;--menu-transition-time: .15s}.shell{display:grid;grid-template-columns:auto 1fr;grid-template-areas:\"menu content\"}.shell>aside{position:relative;grid-area:menu}.shell>aside .shell__menu{background:#193957;padding:1.5em 0;z-index:10;min-width:2.875em}.shell>aside .shell__menuContent{background-color:#fefaef;width:var(--menu-width);top:0;right:1px;transform:translate(0);transition:transform var(--menu-transition-time) ease-out}.shell>aside .shell__menuContent.expanded{transform:translate(100%)}.shell__content{grid-area:content}.shell__content--body{transition:width var(--menu-transition-time) ease-out}.shell__content .menu-expanded{width:calc(100% - var(--menu-width))}.menu-button{border-radius:0;padding:1.25em .6em;box-shadow:none!important;border-width:0}.menu-button.is-active{background-color:#fff;color:#0a0a0a}.menu-button:hover:not(.is-active){background-color:initial}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation"] }] }); }
|
|
4163
4079
|
}
|
|
4164
4080
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: ShellComponent, decorators: [{
|
|
4165
4081
|
type: Component$1,
|
|
4166
|
-
args: [{ selector: 'he-shell', imports: [NgTemplateOutlet, NgClass, HESvgIconComponent], template: "<div class=\"shell | h-100 is-overflow-hidden\">\n <aside>\n <div class=\"shell__menu | is-relative h-100 is-flex is-flex-direction-column is-justify-content-space-between\">\n <div class=\"shell__menu--section | is-flex is-flex-direction-column\">\n @for (button of topMenuButtons(); track trackByFn($index, button)) {\n <ng-container [ngTemplateOutlet]=\"buttonTemplate\" [ngTemplateOutletContext]=\"{ $implicit: button }\" />\n }\n </div>\n\n <div class=\"shell__menu--section | is-flex is-flex-direction-column\">\n @for (button of bottomMenuButtons(); track trackByFn($index, button)) {\n <ng-container [ngTemplateOutlet]=\"buttonTemplate\" [ngTemplateOutletContext]=\"{ $implicit: button }\" />\n }\n </div>\n </div>\n <div class=\"shell__menuContent | h-100 is-absolute\" [class.expanded]=\"expanded()\">\n <div class=\"h-100\" [class.is-hidden]=\"!expanded()\">\n <ng-template [ngTemplateOutlet]=\"menuRef()\" />\n </div>\n </div>\n </aside>\n\n <div class=\"shell__content | h-100 w-100 is-overflow-hidden is-flex is-justify-content-flex-end\">\n <div\n class=\"shell__content--body | w-100\"\n [class.menu-expanded]=\"!menuOverlap && expanded()\"\n (click)=\"closeMenuOnOutsideClick ? hideMenu() : null\">\n <ng-content />\n </div>\n </div>\n</div>\n\n<ng-template #buttonTemplate let-button>\n <button\n (click)=\"onMenuButtonClick(button)\"\n class=\"menu-button button is-secondary\"\n [ngClass]=\"button.isActive ? button.activeClassName : ''\"\n [class.is-active]=\"button.isActive\">\n <ng-container\n *ngTemplateOutlet=\"\n iconTemplate ?? defaultIconTemplate;\n context: { $implicit: button, isActive: button !== clickedButton }\n \" />\n </button>\n</ng-template>\n\n<ng-template #defaultIconTemplate let-button>\n <he-svg-icon [name]=\"button.icon\" />\n</ng-template>\n", styles: ["::ng-deep :root{--menu-width: 200px;--menu-transition-time: .15s}.shell{display:grid;grid-template-columns:auto 1fr;grid-template-areas:\"menu content\"}.shell>aside{position:relative;grid-area:menu}.shell>aside .shell__menu{background:#193957;padding:1.5em 0;z-index:10;min-width:2.875em}.shell>aside .shell__menuContent{background-color:#fefaef;width:var(--menu-width);top:0;right:1px;transform:translate(0);transition:transform var(--menu-transition-time) ease-out}.shell>aside .shell__menuContent.expanded{transform:translate(100%)}.shell__content{grid-area:content}.shell__content--body{transition:width var(--menu-transition-time) ease-out}.shell__content .menu-expanded{width:calc(100% - var(--menu-width))}.menu-button{border-radius:0;padding:1.25em .6em;box-shadow:none!important;border-width:0}.menu-button.is-active{background-color:#fff;color:#0a0a0a}.menu-button:hover:not(.is-active){background-color:initial}\n"] }]
|
|
4167
|
-
}], propDecorators: { iconTemplate: [{
|
|
4168
|
-
type: ContentChild,
|
|
4169
|
-
args: ['iconTemplate']
|
|
4170
|
-
}], shelfButtons: [{
|
|
4171
|
-
type: Input
|
|
4172
|
-
}], menuOverlap: [{
|
|
4173
|
-
type: Input
|
|
4174
|
-
}], closeMenuOnOutsideClick: [{
|
|
4175
|
-
type: Input
|
|
4176
|
-
}], defaultActiveButtonId: [{
|
|
4177
|
-
type: Input
|
|
4178
|
-
}], menuShown: [{
|
|
4179
|
-
type: Output
|
|
4180
|
-
}] } });
|
|
4082
|
+
args: [{ selector: 'he-shell', imports: [NgTemplateOutlet, NgClass, HESvgIconComponent], template: "<div class=\"shell | h-100 is-overflow-hidden\">\n <aside>\n <div class=\"shell__menu | is-relative h-100 is-flex is-flex-direction-column is-justify-content-space-between\">\n <div class=\"shell__menu--section | is-flex is-flex-direction-column\">\n @for (button of topMenuButtons(); track trackByFn($index, button)) {\n <ng-container [ngTemplateOutlet]=\"buttonTemplate\" [ngTemplateOutletContext]=\"{ $implicit: button }\" />\n }\n </div>\n\n <div class=\"shell__menu--section | is-flex is-flex-direction-column\">\n @for (button of bottomMenuButtons(); track trackByFn($index, button)) {\n <ng-container [ngTemplateOutlet]=\"buttonTemplate\" [ngTemplateOutletContext]=\"{ $implicit: button }\" />\n }\n </div>\n </div>\n <div class=\"shell__menuContent | h-100 is-absolute\" [class.expanded]=\"expanded()\">\n <div class=\"h-100\" [class.is-hidden]=\"!expanded()\">\n <ng-template [ngTemplateOutlet]=\"menuRef()\" />\n </div>\n </div>\n </aside>\n\n <div class=\"shell__content | h-100 w-100 is-overflow-hidden is-flex is-justify-content-flex-end\">\n <div\n class=\"shell__content--body | w-100\"\n [class.menu-expanded]=\"!menuOverlap() && expanded()\"\n (click)=\"closeMenuOnOutsideClick() ? hideMenu() : null\">\n <ng-content />\n </div>\n </div>\n</div>\n\n<ng-template #buttonTemplate let-button>\n <button\n (click)=\"onMenuButtonClick(button)\"\n class=\"menu-button button is-secondary\"\n [ngClass]=\"button.isActive ? button.activeClassName : ''\"\n [class.is-active]=\"button.isActive\">\n <ng-container\n *ngTemplateOutlet=\"\n iconTemplate() ?? defaultIconTemplate;\n context: { $implicit: button, isActive: button !== clickedButton }\n \" />\n </button>\n</ng-template>\n\n<ng-template #defaultIconTemplate let-button>\n <he-svg-icon [name]=\"button.icon\" />\n</ng-template>\n", styles: ["::ng-deep :root{--menu-width: 200px;--menu-transition-time: .15s}.shell{display:grid;grid-template-columns:auto 1fr;grid-template-areas:\"menu content\"}.shell>aside{position:relative;grid-area:menu}.shell>aside .shell__menu{background:#193957;padding:1.5em 0;z-index:10;min-width:2.875em}.shell>aside .shell__menuContent{background-color:#fefaef;width:var(--menu-width);top:0;right:1px;transform:translate(0);transition:transform var(--menu-transition-time) ease-out}.shell>aside .shell__menuContent.expanded{transform:translate(100%)}.shell__content{grid-area:content}.shell__content--body{transition:width var(--menu-transition-time) ease-out}.shell__content .menu-expanded{width:calc(100% - var(--menu-width))}.menu-button{border-radius:0;padding:1.25em .6em;box-shadow:none!important;border-width:0}.menu-button.is-active{background-color:#fff;color:#0a0a0a}.menu-button:hover:not(.is-active){background-color:initial}\n"] }]
|
|
4083
|
+
}], propDecorators: { iconTemplate: [{ type: i0.ContentChild, args: ['iconTemplate', { isSignal: true }] }], shelfButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "shelfButtons", required: false }] }], defaultActiveButtonId: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultActiveButtonId", required: false }] }], menuOverlap: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuOverlap", required: false }] }], closeMenuOnOutsideClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeMenuOnOutsideClick", required: false }] }], menuShown: [{ type: i0.Output, args: ["menuShown"] }] } });
|
|
4181
4084
|
|
|
4182
4085
|
class SkeletonTextComponent {
|
|
4183
4086
|
constructor() {
|
|
@@ -4308,13 +4211,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImpo
|
|
|
4308
4211
|
/* eslint-disable @angular-eslint/directive-selector */
|
|
4309
4212
|
class DocumentClickService {
|
|
4310
4213
|
constructor() {
|
|
4311
|
-
this.ngZone = inject(NgZone);
|
|
4312
4214
|
this.documentClick$ = new Subject();
|
|
4313
|
-
|
|
4314
|
-
|
|
4315
|
-
|
|
4316
|
-
.subscribe();
|
|
4317
|
-
});
|
|
4215
|
+
fromEvent(document, 'click')
|
|
4216
|
+
.pipe(takeUntilDestroyed(), tap(event => this.documentClick$.next(event)))
|
|
4217
|
+
.subscribe();
|
|
4318
4218
|
}
|
|
4319
4219
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: DocumentClickService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4320
4220
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: DocumentClickService, providedIn: 'root' }); }
|
|
@@ -4326,7 +4226,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImpo
|
|
|
4326
4226
|
class ClickOutsideDirective {
|
|
4327
4227
|
constructor() {
|
|
4328
4228
|
this.elementRef = inject(ElementRef);
|
|
4329
|
-
this.zone = inject(NgZone);
|
|
4330
4229
|
this.destroyRef = inject(DestroyRef);
|
|
4331
4230
|
this.documentClickService = inject(DocumentClickService);
|
|
4332
4231
|
this.clickOutsideListenAfter = input(0, ...(ngDevMode ? [{ debugName: "clickOutsideListenAfter" }] : []));
|
|
@@ -4334,17 +4233,13 @@ class ClickOutsideDirective {
|
|
|
4334
4233
|
}
|
|
4335
4234
|
ngAfterViewInit() {
|
|
4336
4235
|
const skip$ = timer(this.clickOutsideListenAfter()).pipe(take(1));
|
|
4337
|
-
this.
|
|
4338
|
-
this.
|
|
4339
|
-
|
|
4340
|
-
|
|
4341
|
-
|
|
4342
|
-
|
|
4343
|
-
|
|
4344
|
-
}
|
|
4345
|
-
}))
|
|
4346
|
-
.subscribe();
|
|
4347
|
-
});
|
|
4236
|
+
this.documentClickService.documentClick$
|
|
4237
|
+
.pipe(skipUntil(skip$), takeUntilDestroyed(this.destroyRef), tap(event => {
|
|
4238
|
+
if (!this.elementRef.nativeElement.contains(event.target)) {
|
|
4239
|
+
this.clickOutside.emit();
|
|
4240
|
+
}
|
|
4241
|
+
}))
|
|
4242
|
+
.subscribe();
|
|
4348
4243
|
}
|
|
4349
4244
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: ClickOutsideDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
4350
4245
|
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.13", type: ClickOutsideDirective, isStandalone: true, selector: "[clickOutside]", inputs: { clickOutsideListenAfter: { classPropertyName: "clickOutsideListenAfter", publicName: "clickOutsideListenAfter", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clickOutside: "clickOutside" }, ngImport: i0 }); }
|
|
@@ -6360,9 +6255,7 @@ class HeNodeService {
|
|
|
6360
6255
|
return this.getWithHeaders$(node, params).pipe(tap(({ headers }) => onHeaders(headers)), map(({ data }) => data));
|
|
6361
6256
|
}
|
|
6362
6257
|
async get(node, defaultForState = true) {
|
|
6363
|
-
return await this.get$(node)
|
|
6364
|
-
.toPromise()
|
|
6365
|
-
.catch(() => (node.dataState && defaultForState ? node : {}));
|
|
6258
|
+
return await lastValueFrom(this.get$(node)).catch(() => node.dataState && defaultForState ? node : {});
|
|
6366
6259
|
}
|
|
6367
6260
|
head$(node) {
|
|
6368
6261
|
return this.http.head(this.nodeUrl(node));
|
|
@@ -6374,9 +6267,6 @@ class HeNodeService {
|
|
|
6374
6267
|
})
|
|
6375
6268
|
.pipe(catchError(() => of({ count: 0, results: [] })));
|
|
6376
6269
|
}
|
|
6377
|
-
async getRelated(node, relatedType, limit = 100, offset = 0, relationship) {
|
|
6378
|
-
return this.getRelated$(node, relatedType, limit, offset, relationship).toPromise();
|
|
6379
|
-
}
|
|
6380
6270
|
getLog$({ dataState, aggregated, ...node }) {
|
|
6381
6271
|
return this.http
|
|
6382
6272
|
.get(`${this.nodeUrl(node)}/log`, {
|
|
@@ -6396,17 +6286,11 @@ class HeNodeService {
|
|
|
6396
6286
|
});
|
|
6397
6287
|
}
|
|
6398
6288
|
async triggerPipeline({ dataState, ...node }) {
|
|
6399
|
-
return await this.http
|
|
6400
|
-
.post(`${this.nodeUrl(node)}/pipeline`, filterParams({ dataState }), {})
|
|
6401
|
-
.toPromise()
|
|
6402
|
-
.catch(handleAPIError);
|
|
6289
|
+
return await lastValueFrom(this.http.post(`${this.nodeUrl(node)}/pipeline`, filterParams({ dataState }), {})).catch(handleAPIError);
|
|
6403
6290
|
}
|
|
6404
6291
|
downloadRaw$(url, responseType = 'json') {
|
|
6405
6292
|
return this.http.get(url, { responseType }).pipe(catchError(() => of((responseType === 'json' ? {} : ''))));
|
|
6406
6293
|
}
|
|
6407
|
-
downloadRaw(url, responseType = 'json') {
|
|
6408
|
-
return this.downloadRaw$(url, responseType).toPromise();
|
|
6409
|
-
}
|
|
6410
6294
|
nodeTypeUrl(type) {
|
|
6411
6295
|
return nodeTypeUrl(this.commonService.apiBaseUrl, type);
|
|
6412
6296
|
}
|
|
@@ -6648,9 +6532,6 @@ class HeSchemaService {
|
|
|
6648
6532
|
getSchema$(type, version) {
|
|
6649
6533
|
return this.http.get(`${schemaDataBaseUrl(version)}/json-schema/${type}.json`);
|
|
6650
6534
|
}
|
|
6651
|
-
getSchema(type, version) {
|
|
6652
|
-
return this.getSchema$(type, version).toPromise();
|
|
6653
|
-
}
|
|
6654
6535
|
loadSchemas(version) {
|
|
6655
6536
|
this.schemasLoading = true;
|
|
6656
6537
|
return from(Object.values(SchemaType)).pipe(mergeMap(type => this.getSchema$(type, version).pipe(map(schema => ({ type, schema })), catchError(() => of({ type, schema: { properties: [] } })))), reduce((prev, { type, schema }) => ({ ...prev, [type]: schema }), {}), map(data => {
|
|
@@ -6664,7 +6545,7 @@ class HeSchemaService {
|
|
|
6664
6545
|
return this.schemasLoading || this.schemasLoaded ? this._schemas.asObservable() : this.loadSchemas();
|
|
6665
6546
|
}
|
|
6666
6547
|
schemas() {
|
|
6667
|
-
return this.schemas
|
|
6548
|
+
return firstValueFrom(this.schemas$);
|
|
6668
6549
|
}
|
|
6669
6550
|
loadSortConfig(version) {
|
|
6670
6551
|
this.sortConfigLoading = true;
|
|
@@ -6679,7 +6560,7 @@ class HeSchemaService {
|
|
|
6679
6560
|
return this.sortConfigLoading || this.sortConfigLoaded ? this._sortConfig.asObservable() : this.loadSortConfig();
|
|
6680
6561
|
}
|
|
6681
6562
|
sortConfig() {
|
|
6682
|
-
return this.sortConfig
|
|
6563
|
+
return firstValueFrom(this.sortConfig$);
|
|
6683
6564
|
}
|
|
6684
6565
|
/**
|
|
6685
6566
|
* Parse and sort (if possible) headers from CSV content according to the schema order.
|
|
@@ -7117,7 +6998,7 @@ const groupLogsByModel = (data = '', groupByAnimal = false) => data
|
|
|
7117
6998
|
.trim()
|
|
7118
6999
|
.split('\n')
|
|
7119
7000
|
.map(parseMessage)
|
|
7120
|
-
.filter(v => [hasValue(v?.model),
|
|
7001
|
+
.filter(v => [hasValue(v?.model), ['term', 'key', 'animalId'].some(k => hasValue(v?.[k]))].every(Boolean))
|
|
7121
7002
|
.reduce((group, log) => {
|
|
7122
7003
|
const subValue = subValueKeys.find(v => !!log[v] && log[v] != noValue);
|
|
7123
7004
|
return subValue && !log.cycle ? groupLogSubValue(group, log, subValue) : groupLog(group, log, groupByAnimal);
|
|
@@ -7486,39 +7367,37 @@ const configModelWithDocs = ({ nodeType, type, termId, termType, key }, subValue
|
|
|
7486
7367
|
methodModel: { '@id': methodId }
|
|
7487
7368
|
};
|
|
7488
7369
|
const modelKey = (allLogs?.[subValue?.id]?.[termId]?.[methodId] || allLogs?.[termId]?.[methodId])?.model_key;
|
|
7489
|
-
|
|
7490
|
-
|
|
7491
|
-
|
|
7492
|
-
|
|
7493
|
-
|
|
7494
|
-
|
|
7495
|
-
|
|
7496
|
-
|
|
7497
|
-
|
|
7498
|
-
|
|
7499
|
-
|
|
7500
|
-
|
|
7501
|
-
|
|
7502
|
-
|
|
7503
|
-
|
|
7504
|
-
|
|
7505
|
-
|
|
7506
|
-
|
|
7507
|
-
|
|
7508
|
-
|
|
7509
|
-
|
|
7510
|
-
|
|
7511
|
-
|
|
7512
|
-
|
|
7513
|
-
|
|
7514
|
-
|
|
7515
|
-
|
|
7516
|
-
|
|
7517
|
-
|
|
7518
|
-
|
|
7519
|
-
|
|
7520
|
-
(isNotRelevantModel({ methodId }) ? findMatchingModel({ model: methodId }) : undefined)
|
|
7521
|
-
};
|
|
7370
|
+
const model =
|
|
7371
|
+
// handle "hestia.seed_emissions"
|
|
7372
|
+
findMatchingModel(modelParams(node, !['backgroundData'].includes(subValue?.key), subValue?.modelKey)) ||
|
|
7373
|
+
findMatchingModel(modelParams(node, !['backgroundData'].includes(subValue?.key))) ||
|
|
7374
|
+
// handle background emissions
|
|
7375
|
+
findMatchingModel({ modelKey: toSnakeCase(nodeType), model: methodId }) ||
|
|
7376
|
+
// handle "liveAnimal"
|
|
7377
|
+
(termType && findMatchingModel(modelKeyParams(node, termType))) ||
|
|
7378
|
+
// handle "completeness.cropResidue"
|
|
7379
|
+
(key ? findMatchingModel(modelKeyParams(node, `${methodId}.${key}`)) : undefined) ||
|
|
7380
|
+
findMatchingModel(modelKeyParams(node, `${subValue?.key}.${methodId}`)) ||
|
|
7381
|
+
// handle "input.price"
|
|
7382
|
+
findMatchingModel(modelKeyParams(node, `${type?.toLowerCase()}.${subValue?.key}`)) ||
|
|
7383
|
+
// handle "input.hestiaAggregatedData"
|
|
7384
|
+
findMatchingModel(modelKeyParams(node, `${type?.toLowerCase()}.${methodId}`)) ||
|
|
7385
|
+
// handle "transformation"
|
|
7386
|
+
(subValue?.key ? findMatchingModel(modelKeyParams(node, subValue?.key)) : undefined) ||
|
|
7387
|
+
// handle "transformation/input/excreta" and other models with "/"
|
|
7388
|
+
(methodId.includes('/')
|
|
7389
|
+
? findMatchingModel({
|
|
7390
|
+
model: methodId.split('/')[0],
|
|
7391
|
+
modelKey: methodId.split('/').slice(1).join('.')
|
|
7392
|
+
})
|
|
7393
|
+
: undefined) ||
|
|
7394
|
+
// handle "seed_emissions"
|
|
7395
|
+
([subValue?.id === 'seed', type === SchemaType.Emission].every(Boolean)
|
|
7396
|
+
? findMatchingModel({ model: methodId, modelKey: 'seed_emissions' })
|
|
7397
|
+
: undefined) ||
|
|
7398
|
+
(modelKey ? findMatchingModel({ modelKey, model: methodId }) : undefined) ||
|
|
7399
|
+
(isNotRelevantModel({ methodId }) ? findMatchingModel({ model: methodId }) : undefined);
|
|
7400
|
+
return { methodId, model };
|
|
7522
7401
|
};
|
|
7523
7402
|
const configModelWithLogs = (data, logs, previousModelSuccess = false) => (model) => {
|
|
7524
7403
|
const status = logStatus(data, logs, model, previousModelSuccess);
|
|
@@ -7847,25 +7726,22 @@ class NodeLogsModelsLogsStatusComponent {
|
|
|
7847
7726
|
return values.some(v => 'methodTier' in v && v.methodTier === methodTier);
|
|
7848
7727
|
}
|
|
7849
7728
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: NodeLogsModelsLogsStatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
7850
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.13", type: NodeLogsModelsLogsStatusComponent, isStandalone: true, selector: "he-node-logs-models-logs-status", inputs: { nodeType: { classPropertyName: "nodeType", publicName: "nodeType", isSignal: true, isRequired: true, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{ modelStatus() }}</span>\n</div>\n\n@if (modelStatus() === LogStatus.notRequired && modelLogs().is_not_relevant === 'True') {\n <ul class=\"is-pl-3 is-list-style-disc\">\n @if (modelLogs().logs?.siteType_allowed === 'False') {\n <li>\n The\n <code class=\"is-mx-1\">site.siteType</code>\n is not relevant.\n </li>\n }\n @if (modelLogs().logs?.product_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.site_measurement_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Measurement</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.product_termType_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.termType</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.input_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.input_termType_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.termType</code>\n is relevant.\n </li>\n }\n </ul>\n}\n\n@if (modelLogs() && modelStatus() !== LogStatus.notRequired && modelStatus() !== LogStatus.skipHierarchy) {\n @let config = model().config;\n\n <ul class=\"is-pl-3 is-list-style-disc\">\n @if (modelLogs().shouldRunOrchestrator === false) {\n <li class=\"is-no-run-orchestrator\">\n @if (!modelLogs().runRequired) {\n @if (modelLogs().logs?.node_type_allowed === 'False') {\n <span class=\"is-run-node-type-not-allowed\">\n This model should not run for {{ nodeType() | pluralize: 0 }}\n </span>\n }\n }\n @if (config) {\n <p class=\"is-run-strategy-{{ config.runStrategy }}\">\n @switch (config.runStrategy) {\n @case ('always') {\n <span></span>\n }\n @case ('add_key_if_missing') {\n <span>We only gap-fill this key if not present</span>\n }\n @case ('add_blank_node_if_missing') {\n <span>We only gap-fill this Blank Node if not present.</span>\n }\n }\n </p>\n <p class=\"is-mt-1\">\n @if (config.runArgs?.runNonMeasured && hasMethodTier(data().original, EmissionMethodTier.measured)) {\n <span class=\"is-run-with-measured\">\n The\n <code class=\"is-mx-1\">{{ config.value }}</code>\n was reported as measured.\n </span>\n }\n </p>\n } @else if (modelLogs().logs?.is_empty === 'False') {\n <span class=\"is-run-not-empty\">\n The {{ data().type || 'blank node' }} with Term\n <code class=\"is-mx-1\">{{ data().termId }}</code>\n is already present or already added by another model.\n </span>\n }\n </li>\n } @else {\n <li class=\"is-run-orchestrator\">\n @if (modelLogs().shouldRun) {\n <p>All the requirements were met to run the model.</p>\n } @else {\n <p>Some of the requirements were not met to run the model.</p>\n <p>You can click on
|
|
7729
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.13", type: NodeLogsModelsLogsStatusComponent, isStandalone: true, selector: "he-node-logs-models-logs-status", inputs: { nodeType: { classPropertyName: "nodeType", publicName: "nodeType", isSignal: true, isRequired: true, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{ modelStatus() }}</span>\n</div>\n\n@if (modelStatus() === LogStatus.notRequired && modelLogs().is_not_relevant === 'True') {\n <ul class=\"is-pl-3 is-list-style-disc\">\n @if (modelLogs().logs?.siteType_allowed === 'False') {\n <li>\n The\n <code class=\"is-mx-1\">site.siteType</code>\n is not relevant.\n </li>\n }\n @if (modelLogs().logs?.product_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.site_measurement_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Measurement</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.product_termType_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.termType</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.input_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.input_termType_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.termType</code>\n is relevant.\n </li>\n }\n </ul>\n}\n\n@if (modelLogs() && modelStatus() !== LogStatus.notRequired && modelStatus() !== LogStatus.skipHierarchy) {\n @let config = model().config;\n\n <ul class=\"is-pl-3 is-list-style-disc\">\n @if (modelLogs().shouldRunOrchestrator === false) {\n <li class=\"is-no-run-orchestrator\">\n @if (!modelLogs().runRequired) {\n @if (modelLogs().logs?.node_type_allowed === 'False') {\n <span class=\"is-run-node-type-not-allowed\">\n This model should not run for {{ nodeType() | pluralize: 0 }}\n </span>\n }\n }\n @if (config) {\n <p class=\"is-run-strategy-{{ config.runStrategy }}\">\n @switch (config.runStrategy) {\n @case ('always') {\n <span></span>\n }\n @case ('add_key_if_missing') {\n <span>We only gap-fill this key if not present</span>\n }\n @case ('add_blank_node_if_missing') {\n <span>We only gap-fill this Blank Node if not present.</span>\n }\n }\n </p>\n <p class=\"is-mt-1\">\n @if (config.runArgs?.runNonMeasured && hasMethodTier(data().original, EmissionMethodTier.measured)) {\n <span class=\"is-run-with-measured\">\n The\n <code class=\"is-mx-1\">{{ config.value }}</code>\n was reported as measured.\n </span>\n }\n </p>\n } @else if (modelLogs().logs?.is_empty === 'False') {\n <span class=\"is-run-not-empty\">\n The {{ data().type || 'blank node' }} with Term\n <code class=\"is-mx-1\">{{ data().termId }}</code>\n is already present or already added by another model.\n </span>\n }\n </li>\n } @else {\n <li class=\"is-run-orchestrator\">\n @if (modelStatus() === LogStatus.success || modelLogs().shouldRun) {\n <p>All the requirements were met to run the model.</p>\n } @else {\n <p>Some of the requirements were not met to run the model.</p>\n <p>You can click on \"logs\" to view the debugging logs when available.</p>\n }\n @if (modelLogs().logs?.error) {\n <p>The model failed to run for the following reason:</p>\n <p>\n <code>{{ modelLogs().logs.error }}</code>\n </p>\n }\n </li>\n }\n @if (modelLogs().replaceLowerTier !== undefined) {\n <li>\n <span>\n The recalculated\n <b>methodTier</b>\n was\n </span>\n @if (modelLogs().replaceLowerTier) {\n <span class=\"is-pl-1 is-underlined\">higher than or equal to</span>\n } @else {\n <span class=\"is-pl-1 is-underlined\">lower than</span>\n }\n <span class=\"is-pl-1\">\n the original\n <b>methodTier</b>\n .\n </span>\n </li>\n }\n @if (modelLogs().replaceLowerTier) {\n <li class=\"is-merge-replaceLowerTier\">\n <span>The recalculated</span>\n <b class=\"is-pl-1\">{{ config?.mergeArgs?.replaceThreshold?.[0] || 'value' }}</b>\n <span class=\"is-pl-1\">was</span>\n <span class=\"is-pl-1\">\n @if (config?.mergeArgs) {\n @if (modelLogs().replaceThreshold) {\n <span class=\"is-underlined\">more than or equal to</span>\n } @else {\n <span class=\"is-underlined\">less than</span>\n }\n <b class=\"is-pl-1\">{{ config.mergeArgs.replaceThreshold[1] * 100 }}%</b>\n } @else {\n @if (modelLogs().replaceThreshold) {\n <span class=\"is-underlined\">sufficiently</span>\n } @else {\n <span class=\"is-underlined\">not sufficiently</span>\n }\n }\n </span>\n <span class=\"is-pl-1\">different from the original</span>\n <b class=\"is-pl-1\">{{ config?.mergeArgs?.replaceThreshold?.[0] || 'value' }}.</b>\n </li>\n }\n </ul>\n}\n", styles: [""], dependencies: [{ kind: "pipe", type: PluralizePipe, name: "pluralize" }] }); }
|
|
7851
7730
|
}
|
|
7852
7731
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: NodeLogsModelsLogsStatusComponent, decorators: [{
|
|
7853
7732
|
type: Component$1,
|
|
7854
|
-
args: [{ selector: 'he-node-logs-models-logs-status', imports: [PluralizePipe], template: "<div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{ modelStatus() }}</span>\n</div>\n\n@if (modelStatus() === LogStatus.notRequired && modelLogs().is_not_relevant === 'True') {\n <ul class=\"is-pl-3 is-list-style-disc\">\n @if (modelLogs().logs?.siteType_allowed === 'False') {\n <li>\n The\n <code class=\"is-mx-1\">site.siteType</code>\n is not relevant.\n </li>\n }\n @if (modelLogs().logs?.product_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.site_measurement_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Measurement</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.product_termType_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.termType</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.input_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.input_termType_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.termType</code>\n is relevant.\n </li>\n }\n </ul>\n}\n\n@if (modelLogs() && modelStatus() !== LogStatus.notRequired && modelStatus() !== LogStatus.skipHierarchy) {\n @let config = model().config;\n\n <ul class=\"is-pl-3 is-list-style-disc\">\n @if (modelLogs().shouldRunOrchestrator === false) {\n <li class=\"is-no-run-orchestrator\">\n @if (!modelLogs().runRequired) {\n @if (modelLogs().logs?.node_type_allowed === 'False') {\n <span class=\"is-run-node-type-not-allowed\">\n This model should not run for {{ nodeType() | pluralize: 0 }}\n </span>\n }\n }\n @if (config) {\n <p class=\"is-run-strategy-{{ config.runStrategy }}\">\n @switch (config.runStrategy) {\n @case ('always') {\n <span></span>\n }\n @case ('add_key_if_missing') {\n <span>We only gap-fill this key if not present</span>\n }\n @case ('add_blank_node_if_missing') {\n <span>We only gap-fill this Blank Node if not present.</span>\n }\n }\n </p>\n <p class=\"is-mt-1\">\n @if (config.runArgs?.runNonMeasured && hasMethodTier(data().original, EmissionMethodTier.measured)) {\n <span class=\"is-run-with-measured\">\n The\n <code class=\"is-mx-1\">{{ config.value }}</code>\n was reported as measured.\n </span>\n }\n </p>\n } @else if (modelLogs().logs?.is_empty === 'False') {\n <span class=\"is-run-not-empty\">\n The {{ data().type || 'blank node' }} with Term\n <code class=\"is-mx-1\">{{ data().termId }}</code>\n is already present or already added by another model.\n </span>\n }\n </li>\n } @else {\n <li class=\"is-run-orchestrator\">\n @if (modelLogs().shouldRun) {\n <p>All the requirements were met to run the model.</p>\n } @else {\n <p>Some of the requirements were not met to run the model.</p>\n <p>You can click on
|
|
7733
|
+
args: [{ selector: 'he-node-logs-models-logs-status', imports: [PluralizePipe], template: "<div class=\"is-mb-2\">\n <span>Status:</span>\n <span class=\"is-pl-1\">{{ modelStatus() }}</span>\n</div>\n\n@if (modelStatus() === LogStatus.notRequired && modelLogs().is_not_relevant === 'True') {\n <ul class=\"is-pl-3 is-list-style-disc\">\n @if (modelLogs().logs?.siteType_allowed === 'False') {\n <li>\n The\n <code class=\"is-mx-1\">site.siteType</code>\n is not relevant.\n </li>\n }\n @if (modelLogs().logs?.product_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.site_measurement_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Measurement</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.product_termType_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Product</code>\n <code class=\"is-mr-1\">term.termType</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.input_id_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.@id</code>\n is relevant.\n </li>\n }\n @if (modelLogs().logs?.input_termType_allowed === 'False') {\n <li>\n None of the\n <code class=\"is-mx-1\">Input</code>\n <code class=\"is-mr-1\">term.termType</code>\n is relevant.\n </li>\n }\n </ul>\n}\n\n@if (modelLogs() && modelStatus() !== LogStatus.notRequired && modelStatus() !== LogStatus.skipHierarchy) {\n @let config = model().config;\n\n <ul class=\"is-pl-3 is-list-style-disc\">\n @if (modelLogs().shouldRunOrchestrator === false) {\n <li class=\"is-no-run-orchestrator\">\n @if (!modelLogs().runRequired) {\n @if (modelLogs().logs?.node_type_allowed === 'False') {\n <span class=\"is-run-node-type-not-allowed\">\n This model should not run for {{ nodeType() | pluralize: 0 }}\n </span>\n }\n }\n @if (config) {\n <p class=\"is-run-strategy-{{ config.runStrategy }}\">\n @switch (config.runStrategy) {\n @case ('always') {\n <span></span>\n }\n @case ('add_key_if_missing') {\n <span>We only gap-fill this key if not present</span>\n }\n @case ('add_blank_node_if_missing') {\n <span>We only gap-fill this Blank Node if not present.</span>\n }\n }\n </p>\n <p class=\"is-mt-1\">\n @if (config.runArgs?.runNonMeasured && hasMethodTier(data().original, EmissionMethodTier.measured)) {\n <span class=\"is-run-with-measured\">\n The\n <code class=\"is-mx-1\">{{ config.value }}</code>\n was reported as measured.\n </span>\n }\n </p>\n } @else if (modelLogs().logs?.is_empty === 'False') {\n <span class=\"is-run-not-empty\">\n The {{ data().type || 'blank node' }} with Term\n <code class=\"is-mx-1\">{{ data().termId }}</code>\n is already present or already added by another model.\n </span>\n }\n </li>\n } @else {\n <li class=\"is-run-orchestrator\">\n @if (modelStatus() === LogStatus.success || modelLogs().shouldRun) {\n <p>All the requirements were met to run the model.</p>\n } @else {\n <p>Some of the requirements were not met to run the model.</p>\n <p>You can click on \"logs\" to view the debugging logs when available.</p>\n }\n @if (modelLogs().logs?.error) {\n <p>The model failed to run for the following reason:</p>\n <p>\n <code>{{ modelLogs().logs.error }}</code>\n </p>\n }\n </li>\n }\n @if (modelLogs().replaceLowerTier !== undefined) {\n <li>\n <span>\n The recalculated\n <b>methodTier</b>\n was\n </span>\n @if (modelLogs().replaceLowerTier) {\n <span class=\"is-pl-1 is-underlined\">higher than or equal to</span>\n } @else {\n <span class=\"is-pl-1 is-underlined\">lower than</span>\n }\n <span class=\"is-pl-1\">\n the original\n <b>methodTier</b>\n .\n </span>\n </li>\n }\n @if (modelLogs().replaceLowerTier) {\n <li class=\"is-merge-replaceLowerTier\">\n <span>The recalculated</span>\n <b class=\"is-pl-1\">{{ config?.mergeArgs?.replaceThreshold?.[0] || 'value' }}</b>\n <span class=\"is-pl-1\">was</span>\n <span class=\"is-pl-1\">\n @if (config?.mergeArgs) {\n @if (modelLogs().replaceThreshold) {\n <span class=\"is-underlined\">more than or equal to</span>\n } @else {\n <span class=\"is-underlined\">less than</span>\n }\n <b class=\"is-pl-1\">{{ config.mergeArgs.replaceThreshold[1] * 100 }}%</b>\n } @else {\n @if (modelLogs().replaceThreshold) {\n <span class=\"is-underlined\">sufficiently</span>\n } @else {\n <span class=\"is-underlined\">not sufficiently</span>\n }\n }\n </span>\n <span class=\"is-pl-1\">different from the original</span>\n <b class=\"is-pl-1\">{{ config?.mergeArgs?.replaceThreshold?.[0] || 'value' }}.</b>\n </li>\n }\n </ul>\n}\n" }]
|
|
7855
7734
|
}], propDecorators: { nodeType: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeType", required: true }] }], model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: true }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }] } });
|
|
7856
7735
|
|
|
7857
7736
|
class GuideOverlayService {
|
|
7858
7737
|
constructor() {
|
|
7859
|
-
this.ngZone = inject(NgZone);
|
|
7860
7738
|
this.message = signal(null, ...(ngDevMode ? [{ debugName: "message" }] : []));
|
|
7861
7739
|
this.messageListener = ({ data }) => {
|
|
7862
7740
|
if (data.namespace == guideNamespace) {
|
|
7863
|
-
this.
|
|
7741
|
+
this.message.set(data);
|
|
7864
7742
|
}
|
|
7865
7743
|
};
|
|
7866
|
-
this.
|
|
7867
|
-
window.addEventListener('message', this.messageListener);
|
|
7868
|
-
});
|
|
7744
|
+
window.addEventListener('message', this.messageListener);
|
|
7869
7745
|
}
|
|
7870
7746
|
ngOnDestroy() {
|
|
7871
7747
|
window.removeEventListener('message', this.messageListener);
|
|
@@ -7981,8 +7857,8 @@ const methodIdLabel = (methodId, _model) => (methodId
|
|
|
7981
7857
|
const getModelsAt = (log, index) => ('modelsInSubValues' in log ? !log.modelsInSubValues || !log.isOpen : true) && log.configModels?.[index];
|
|
7982
7858
|
const isSystemBoundary = (termId) => ({ isRecalculated, isRequired }) => {
|
|
7983
7859
|
// only exists for some terms
|
|
7984
|
-
const inSystemBoundary =
|
|
7985
|
-
return
|
|
7860
|
+
const inSystemBoundary = isInSystemBoundary(termId);
|
|
7861
|
+
return inSystemBoundary || [isRecalculated, isRequired].some(Boolean);
|
|
7986
7862
|
};
|
|
7987
7863
|
const isGenericTerm = (termId) => [termId.startsWith('excreta')].every(Boolean);
|
|
7988
7864
|
const extraTermIdsFromConfig = (config, key, logs) => unique([
|
|
@@ -8021,7 +7897,7 @@ const restrictTermTypeFromKey = {
|
|
|
8021
7897
|
...matchTermTypeFromKey
|
|
8022
7898
|
};
|
|
8023
7899
|
const filterBlankNode = ({ term: { name, '@id': id }, subValues, ...log }, selectedTerm, filterTermTypes, onlyRequired) => selectedTerm
|
|
8024
|
-
? name.toLowerCase().includes(selectedTerm.toLowerCase())
|
|
7900
|
+
? name.toLowerCase().includes(selectedTerm.name.toLowerCase())
|
|
8025
7901
|
: !filterTermTypes?.length || !onlyRequired || isSystemBoundary(id)(log) || subValues.some(isSystemBoundary(id));
|
|
8026
7902
|
const orderBlankNodesByNodeKey = {
|
|
8027
7903
|
emissions: values => orderBy(values.map(value => ({
|
|
@@ -8061,7 +7937,7 @@ class NodeLogsModelsComponent {
|
|
|
8061
7937
|
this.logIcon = logIcon;
|
|
8062
7938
|
this.logColor = logColor;
|
|
8063
7939
|
this.getModelsAt = getModelsAt;
|
|
8064
|
-
this.
|
|
7940
|
+
this.isInSystemBoundary = isInSystemBoundary;
|
|
8065
7941
|
this.showLegend = signal(true, ...(ngDevMode ? [{ debugName: "showLegend" }] : []));
|
|
8066
7942
|
this.onlyRequired = signal(true, ...(ngDevMode ? [{ debugName: "onlyRequired" }] : []));
|
|
8067
7943
|
this.schemaType = computed(() => (this.originalValues()?.[0]?.['@type'] ||
|
|
@@ -8195,8 +8071,9 @@ class NodeLogsModelsComponent {
|
|
|
8195
8071
|
});
|
|
8196
8072
|
this.termsById = computed(() => this.termsByIdResource.value() ?? {}, ...(ngDevMode ? [{ debugName: "termsById" }] : []));
|
|
8197
8073
|
// filter list of results by a single Term
|
|
8198
|
-
this.term = signal(
|
|
8074
|
+
this.term = signal(undefined, ...(ngDevMode ? [{ debugName: "term" }] : []));
|
|
8199
8075
|
this.enableFilterByTerm = computed(() => this.allTerms()?.length > 0, ...(ngDevMode ? [{ debugName: "enableFilterByTerm" }] : []));
|
|
8076
|
+
this.termFormatter = ({ name }) => name;
|
|
8200
8077
|
this.suggestTerm = (text$) => text$.pipe(distinctUntilChanged(), map(v => this.suggestByTerm(v)));
|
|
8201
8078
|
this.typeaheadFocus = typeaheadFocus;
|
|
8202
8079
|
this.loading = computed(() => [
|
|
@@ -8214,9 +8091,7 @@ class NodeLogsModelsComponent {
|
|
|
8214
8091
|
this.isNumber = (value) => typeof value === 'number';
|
|
8215
8092
|
}
|
|
8216
8093
|
suggestByTerm(term) {
|
|
8217
|
-
return this.allTerms()
|
|
8218
|
-
.map(({ name }) => name)
|
|
8219
|
-
.filter(v => termSearch(v).includes(termSearch(term)));
|
|
8094
|
+
return this.allTerms().filter(v => termSearch(v.name).includes(termSearch(term)));
|
|
8220
8095
|
}
|
|
8221
8096
|
searchTerms(query, ...extraFields) {
|
|
8222
8097
|
return this.searchService
|
|
@@ -8256,7 +8131,7 @@ class NodeLogsModelsComponent {
|
|
|
8256
8131
|
return subValues.every(v => v.configModels.some(vv => vv.status === LogStatus.success));
|
|
8257
8132
|
}
|
|
8258
8133
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: NodeLogsModelsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
8259
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.13", type: NodeLogsModelsComponent, isStandalone: true, selector: "he-node-logs-models", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, nodeKey: { classPropertyName: "nodeKey", publicName: "nodeKey", isSignal: true, isRequired: false, transformFunction: null }, originalValues: { classPropertyName: "originalValues", publicName: "originalValues", isSignal: true, isRequired: false, transformFunction: null }, recalculatedValues: { classPropertyName: "recalculatedValues", publicName: "recalculatedValues", isSignal: true, isRequired: false, transformFunction: null }, terms: { classPropertyName: "terms", publicName: "terms", isSignal: true, isRequired: false, transformFunction: null }, filterTermTypes: { classPropertyName: "filterTermTypes", publicName: "filterTermTypes", isSignal: true, isRequired: false, transformFunction: null }, filterTermTypesLabel: { classPropertyName: "filterTermTypesLabel", publicName: "filterTermTypesLabel", isSignal: true, isRequired: false, transformFunction: null }, logsKey: { classPropertyName: "logsKey", publicName: "logsKey", isSignal: true, isRequired: false, transformFunction: null }, noDataMessage: { classPropertyName: "noDataMessage", publicName: "noDataMessage", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"is-flex is-gap-8 is-justify-content-space-between is-align-items-center is-my-2\">\n <div>\n <ng-content />\n </div>\n\n @if (!isExternal && !loading() && logsUrl() && hasLogs()) {\n <a class=\"is-size-7\" [href]=\"logsUrl()\" target=\"_blank\">\n <span>Open Full Logs</span>\n <he-svg-icon name=\"external-link\" class=\"ml-2\" />\n </a>\n }\n</div>\n\n@if (!isExternal && !loading() && !hasLogs()) {\n <p class=\"is-my-2\">\n <he-svg-icon class=\"has-text-warning\" name=\"exclamation-triangle\" />\n <span class=\"is-size-7 has-text-warning is-pl-1\">No logs found. Recalculation logs will be incomplete.</span>\n </p>\n}\n\n<he-data-table class=\"is-mt-2 is-mb-1 is-bordered\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr>\n <th class=\"width-auto has-border-right\">\n @if (enableFilterByTerm()) {\n <div class=\"field is-pb-1\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n class=\"input search-input is-small\"\n [ngModel]=\"term()\"\n name=\"term\"\n placeholder=\"Select entry by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [focusFirst]=\"true\"\n (focus)=\"typeaheadFocus($event)\"\n (selectItem)=\"term.set($event.item)\"\n container=\"body\"\n popupClass=\"is-small\" />\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"!term()\" (click)=\"term.set('')\">\n <he-svg-icon name=\"xmark\" />\n </a>\n </div>\n </div>\n }\n </th>\n @if (isBlankNodes()) {\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>\n <span class=\"is-pr-1\">Units</span>\n @if (functionalUnit()) {\n <span>(per </span>\n <span>{{ functionalUnit() }}</span>\n <span>)</span>\n }\n </span>\n </div>\n </th>\n }\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Original</span>\n </div>\n </th>\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Recalculated</span>\n </div>\n </th>\n @if (isBlankNodes()) {\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Difference</span>\n </div>\n </th>\n }\n @for (c of methodModelsCount() | times; track i; let i = $index) {\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Model {{ i + 1 }}</span>\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n <tr>\n <td class=\"has-border-right has-text-centered\" colspan=\"6\">\n <div class=\"has-text-center py-3\">\n <he-svg-icon name=\"loading\" animation=\"spin\" size=\"40\" />\n </div>\n </td>\n </tr>\n } @else if (blankNodes().length === 0) {\n <tr>\n <td class=\"has-border-right has-text-centered\" colspan=\"6\">\n <span>{{ noDataMessage() || 'No original data was provided and no gap filling occurred.' }}</span>\n </td>\n </tr>\n }\n @for (blankNode of blankNodes(); track trackByBlankNode($index, blankNode)) {\n <tr [class.has-sub-rows]=\"blankNode.canOpen\" [class.is-open]=\"blankNode.isOpen\">\n <td\n class=\"width-auto has-border-right is-nowrap\"\n [attr.title]=\"$any(blankNode).term?.name || $any(blankNode).key\">\n <div class=\"is-flex is-align-items-flex-start is-gap-4\">\n <ng-container *ngTemplateOutlet=\"collapseButton; context: { $implicit: blankNode }\" />\n @if ($any(blankNode).term) {\n <he-node-link class=\"is-inline-block is-pre-wrap is-pr-2\" [node]=\"$any(blankNode).term\">\n <span\n class=\"break-word\"\n [innerHtml]=\"$any(blankNode).term.name | compound: $any(blankNode).term.termType\"></span>\n </he-node-link>\n } @else if ($any(blankNode).key) {\n @if (nodeKey() === 'completeness') {\n <a [href]=\"schemaBaseUrl + '/Completeness#' + $any(blankNode).key\" target=\"_blank\">\n <span>{{ $any(blankNode).key | keyToLabel }}</span>\n </a>\n } @else {\n <a [href]=\"schemaBaseUrl + '/' + nodeType() + '#' + $any(blankNode).key\" target=\"_blank\">\n <span>{{ $any(blankNode).key | keyToLabel }}</span>\n </a>\n }\n }\n </div>\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">\n @if ($any(blankNode).term) {\n <span\n class=\"is-nowrap\"\n [innerHtml]=\"$any(blankNode).term.units | compound: $any(blankNode).term.termType\"></span>\n }\n </td>\n }\n <td class=\"has-border-right\">\n <ng-template #originalValueContent>\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: $any(blankNode).originalValue }\" />\n </span>\n </ng-template>\n\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model.methodId) {\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n valueContent;\n context: { value: $any(blankNode).originalValueByMethodId[model.methodId] }\n \" />\n </div>\n }\n } @else {\n <span\n [class.trigger-popover]=\"!!$any(blankNode).original?.[0]?.methodModel\"\n [ngbPopover]=\"blankNodeOriginalValueDetails\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow\"\n placement=\"bottom left right auto\"\n container=\"body\"\n [disablePopover]=\"!$any(blankNode).original?.[0]?.methodModel\"\n [popoverContext]=\"{ blankNode }\">\n <span pointer>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: $any(blankNode).originalValue }\" />\n </span>\n </span>\n }\n </td>\n <td class=\"has-border-right\">\n @if (!blankNode.isOriginal || blankNode.isRecalculated) {\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model.methodId) {\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n valueContent;\n context: { value: $any(blankNode).recalculatedValueByMethodId[model.methodId] }\n \" />\n </div>\n }\n } @else {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: blankNode.recalculatedValue }\" />\n </span>\n }\n } @else if ($any(blankNode).configModels?.length) {\n not recalculated\n } @else {\n -\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right is-nowrap\">\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model.methodId) {\n <div>\n @if (\n $any(blankNode).originalValueByMethodId[model.methodId] !== null &&\n $any(blankNode).recalculatedValueByMethodId[model.methodId] !== null\n ) {\n <he-blank-node-value-delta\n [value]=\"$any(blankNode).recalculatedValueByMethodId[model.methodId]\"\n [originalValue]=\"$any(blankNode).originalValueByMethodId[model.methodId]\"\n [useCustomFunctions]=\"false\" />\n } @else {\n -\n }\n </div>\n }\n } @else {\n @if ($any(blankNode).original.length && blankNode.isRecalculated) {\n <he-blank-node-value-delta\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"$any(blankNode).originalValue\"\n [useCustomFunctions]=\"false\" />\n } @else {\n -\n }\n }\n </td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: blankNode }\" />\n </tr>\n @for (subValue of $any(blankNode).keys; track trackBySubValue(subValue)) {\n @if (blankNode.isOpen) {\n <tr [class.has-sub-rows]=\"$any(blankNode).subValues?.length\" [class.is-sub-row]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right is-nowrap\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n @if (blankNode.type) {\n <a\n class=\"is-inline-block is-pre-wrap\"\n [href]=\"schemaBaseUrl + '/' + blankNode.type + '#' + subValue.key\"\n target=\"_blank\"\n [title]=\"subValue.key\">\n <span>{{ subValue.key }}</span>\n </a>\n }\n @if (!blankNode.type) {\n <span class=\"is-inline-block is-align-top\">{{ subValue.key }}</span>\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\"></td>\n }\n <td class=\"has-border-right\">\n @if (subValue.originalValue !== null) {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.originalValue }\" />\n </span>\n } @else {\n -\n }\n </td>\n <td class=\"has-border-right\">\n @if (subValue.isRecalculated || subValue.key === 'impactAssessment') {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.recalculatedValue }\" />\n </span>\n } @else {\n not recalculated\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">-</td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\" />\n </tr>\n }\n }\n @for (subValue of $any(blankNode).subValues; track trackBySubValue(subValue)) {\n <ng-container *ngTemplateOutlet=\"subValueRow; context: { blankNode, parent: blankNode, subValue }\" />\n }\n }\n </tbody>\n </table>\n</he-data-table>\n<div class=\"is-size-7\">\n <div class=\"is-flex is-py-2 is-px-3 is-gap-16 | status-legend\">\n <div\n class=\"is-flex is-justify-content-center is-align-items-center is-align-content-center is-flex-wrap-wrap is-gap-8\">\n @for (status of LogStatus | keyvalue; track status.value) {\n @if (logIcon[status.value]) {\n <span class=\"is-flex is-align-items-center is-gap-8\">\n <he-svg-icon [name]=\"logIcon[status.value]\" size=\"20\" class=\"has-text-{{ logColor[status.value] }}\" />\n <span class=\"is-size-7 is-capitalized\">{{ status.value }}</span>\n </span>\n }\n }\n </div>\n\n @if (filteredType()) {\n <div class=\"field is-relative\">\n <input\n type=\"checkbox\"\n class=\"switch is-small is-rounded is-secondary\"\n [(ngModel)]=\"onlyRequired\"\n [disabled]=\"!!term()\"\n id=\"onlyRequired\" />\n <label class=\"is-size-7\" for=\"onlyRequired\">\n <span>Show only {{ filteredType() }} terms included in the default HESTIA system boundary</span>\n </label>\n </div>\n }\n </div>\n</div>\n\n<ng-template #valueContent let-value=\"value\">\n @if (isNumber(value)) {\n {{ value | precision: 3 | default: '-' }}\n } @else {\n {{ value | default: '-' }}\n }\n</ng-template>\n\n<ng-template #collapseButton let-blankNode>\n @if (blankNode.canOpen) {\n <a class=\"open-node\" (click)=\"toggleBlankNode(blankNode)\">\n <he-svg-icon [name]=\"blankNode.isOpen ? 'chevron-down' : 'chevron-right'\" />\n </a>\n }\n</ng-template>\n\n<ng-template #subValueRow let-blankNode=\"blankNode\" let-parent=\"parent\" let-subValue=\"subValue\" let-rowClass=\"rowClass\">\n @let term = subValue.term || termById(subValue.id);\n @if (parent.isOpen) {\n <tr [class.is-sub-row]=\"parent.canOpen\" [ngClass]=\"rowClass\">\n <td class=\"width-auto has-border-right\">\n <div class=\"is-flex is-align-items-flex-start is-gap-4 h-100\">\n <ng-container *ngTemplateOutlet=\"collapseButton; context: { $implicit: subValue }\" />\n <he-svg-icon class=\"sub-sub-row-icon\" name=\"chevron-double-right\" />\n <div class=\"is-flex is-align-items-flex-start is-flex-wrap-wrap is-gap-4\" [class.is-pl-3]=\"!subValue.canOpen\">\n <span>\n <span>{{ subValue.key | keyToLabel }}</span>\n @if (subValue.id) {\n <span class=\"is-inline-block\">:</span>\n }\n </span>\n @if (subValue.id) {\n @switch (subValue.key) {\n @case ('backgroundData') {\n <span class=\"is-inline-block\">{{ term?.name }}</span>\n }\n @case ('animal') {\n <span class=\"is-inline-block\">{{ subValue.id }}</span>\n }\n @default {\n <he-node-link\n class=\"is-inline-block\"\n linkClass=\"is-inline-block\"\n [node]=\"term\"\n [attr.title]=\"term?.name\">\n <span class=\"break-word\" [innerHtml]=\"term?.name | compound\"></span>\n </he-node-link>\n }\n }\n }\n </div>\n </div>\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">\n @if (subValue.showUnits && $any(blankNode).term) {\n <span\n class=\"is-nowrap\"\n [innerHtml]=\"$any(blankNode).term.units | compound: $any(blankNode).term.termType\"></span>\n }\n </td>\n }\n <td class=\"has-border-right\">\n @if (!isEmpty(subValue.originalValue)) {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.originalValue }\" />\n </span>\n } @else {\n -\n }\n </td>\n <td class=\"has-border-right\">\n @if (subValue.isRecalculated) {\n @if (subValue.multiGroups) {\n <span\n class=\"trigger-popover\"\n ngbPopover=\"The total value across all inputs\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow is-overflow-visible\"\n placement=\"left bottom auto\"\n container=\"body\">\n <span pointer>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.recalculatedValue }\" />\n </span>\n </span>\n } @else {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.recalculatedValue }\" />\n </span>\n }\n } @else if (!isEmpty(subValue.originalValue)) {\n not recalculated\n } @else {\n -\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">-</td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\" />\n </tr>\n }\n @if (subValue.subValues) {\n @for (sub of subValue.subValues; track trackBySubValue(sub)) {\n <ng-container\n *ngTemplateOutlet=\"\n subValueRow;\n context: { blankNode, parent: subValue, subValue: sub, rowClass: 'is-sub-sub-row' }\n \" />\n }\n }\n</ng-template>\n\n<ng-template #blankNodeOriginalValueDetails let-blankNode=\"blankNode\">\n <span class=\"is-pr-1\">The original value was reported using:</span>\n <he-node-link\n class=\"is-inline-block\"\n linkClass=\"is-dark\"\n [node]=\"$any(blankNode).original[0].methodModel\"\n [showExternalLink]=\"true\">\n <span>{{ $any(blankNode).original[0].methodModel.name }}</span>\n </he-node-link>\n</ng-template>\n\n<ng-template #blankNodeModels let-data=\"data\">\n @let extraColumns = methodModelsCount() - 1;\n\n <ng-template #notInSystemBoundary>\n <td class=\"has-border-right\">\n <span>Not in HESTIA system boundary</span>\n </td>\n @for (v of data | repeat: extraColumns; track repeatIndex; let repeatIndex = $index) {\n <td class=\"has-border-right\"></td>\n }\n </ng-template>\n\n @if (data.canOpen && !data.isOpen && !data.configModels?.length) {\n <td class=\"has-border-right\">\n <span>Expand to see logs (</span>\n @let key = subValuesKey(data, 'sub-values');\n @if (hasCompleteSuccess(data)) {\n <span>all succeeded</span>\n <he-svg-icon class=\"is-ml-1\" name=\"checkmark\" class=\"has-text-success\" />\n } @else {\n <span>some failed</span>\n <he-svg-icon class=\"is-ml-1\" name=\"xmark\" class=\"has-text-danger\" />\n }\n <span>)</span>\n </td>\n @for (v of data | repeat: extraColumns; track repeatIndex; let repeatIndex = $index) {\n <td class=\"has-border-right\"></td>\n }\n } @else if (isSystemBoundary(data)) {\n @for (configModel of methodModelsCount() | times; track configModelIndex; let configModelIndex = $index) {\n <td class=\"has-border-right blank-node-index-{{ configModelIndex }}\">\n @if (getModelsAt(data, configModelIndex); as models) {\n @if ($any(models) | isArray) {\n <div>\n @for (model of $any(models); track model.methodId) {\n <p>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model, data }\" />\n </p>\n }\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model: models, data }\" />\n }\n } @else {\n -\n }\n </td>\n }\n } @else {\n -\n }\n</ng-template>\n\n<ng-template #blankNodeModel let-model=\"model\" let-data=\"data\">\n <div class=\"is-flex is-align-self-stretch is-justify-content-center is-align-items-center is-gap-8\">\n <div class=\"is-flex is-gap-4 is-flex-grow-1 is-align-items-center\">\n <span\n class=\"pl-1 has-text-{{ logColor[model.status] }}\"\n [class.trigger-popover]=\"hasLogs()\"\n [ngbPopover]=\"logStatusDetails\"\n [disablePopover]=\"!hasLogs()\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p1=\"ngbPopover\"\n placement=\"bottom left right auto\"\n container=\"body\"\n (click)=\"$event.stopPropagation(); p1.isOpen() ? p1.close() : p1.open({ model, data })\">\n <he-svg-icon [name]=\"logIcon[model.status]\" />\n </span>\n\n <span class=\"is-flex is-flex-grow-1 is-gap-4\">\n <span class=\"is-nowrap is-capitalized\">{{ methodName(model) }}</span>\n\n @if (model.logs?.methodTier || model.model?.methodTier) {\n <span class=\"is-nowrap\">[{{ model.logs?.methodTier || model.model?.methodTier }}]</span>\n }\n </span>\n </div>\n\n <div class=\"is-flex is-gap-4 is-flex-shrink-0 is-align-items-center\">\n @if (model.showLogs) {\n <span\n class=\"is-nowrap is-clickable\"\n [ngbPopover]=\"logDetails\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"bottom left right auto\"\n container=\"body\"\n (click)=\"p.isOpen() ? p.close() : model.showLogs ? p.open({ logs: model.logs }) : null\">\n <span class=\"has-text-link\">Logs</span>\n </span>\n }\n\n @if (model.model) {\n @if (model.showLogs) {\n <div class=\"vertical-divider\"></div>\n }\n <ng-container *ngTemplateOutlet=\"docsLink; context: { $implicit: model.model }\" />\n }\n </div>\n </div>\n</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <he-node-logs-models-logs [logs]=\"logs\" />\n</ng-template>\n\n<ng-template #logStatusDetails let-model=\"model\" let-data=\"data\">\n <he-node-logs-models-logs-status [nodeType]=\"nodeType()\" [model]=\"model\" [data]=\"\" />\n</ng-template>\n\n<ng-template #docsLink let-model>\n @if (guideEnabled && model.guidePath) {\n <he-guide-overlay [pageId]=\"model.guidePath\" [width]=\"500\" />\n } @else {\n <a [href]=\"model.docPath || model.path\" target=\"_blank\" (click)=\"$event.stopPropagation()\">\n <span>Docs</span>\n <he-svg-icon name=\"external-link\" class=\"ml-2\" />\n </a>\n }\n</ng-template>\n", styles: [":host{display:block}:host .vertical-divider{width:1px;height:20px;background:#dbe3ea}:host .status-legend{border:1px solid #dbe3ea;background:#f5f7f9}::ng-deep .table{background-color:transparent}::ng-deep .table td.has-border-right{box-shadow:1px 0 #4c7194}::ng-deep .table .has-sub-rows.is-open>td:first-child:before,::ng-deep .table .is-sub-row>td:first-child:before{display:block;position:absolute;content:\" \";background-color:#4c719433;height:100%;width:1px;top:0;left:14px}::ng-deep .table .has-sub-rows.is-open>td:first-child:before{top:25px}::ng-deep .table .is-sub-row td:first-child{padding-left:12px}::ng-deep .table .is-sub-row .sub-sub-row-icon{display:none}::ng-deep .table .is-sub-row .open-node>he-svg-icon,::ng-deep .table .is-sub-row .sub-sub-row-icon{height:16px!important;width:16px!important}::ng-deep .table .is-sub-sub-row td:first-child{padding-left:24px}::ng-deep .table .is-sub-sub-row .sub-sub-row-icon{display:inline-block}::ng-deep .table .is-sub-sub-row .sub-sub-row-icon+div{padding-left:0!important}::ng-deep .table .popover-body .table-container{max-height:260px;overflow-y:auto}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NodeLinkComponent, selector: "he-node-link", inputs: ["node", "dataState", "showExternalLink", "linkClass"] }, { kind: "component", type: BlankNodeValueDeltaComponent, selector: "he-blank-node-value-delta", inputs: ["value", "originalValue", "displayType", "useCustomFunctions"] }, { kind: "directive", type: NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "selectOnExact", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: NodeLogsModelsLogsComponent, selector: "he-node-logs-models-logs", inputs: ["logs"] }, { kind: "component", type: NodeLogsModelsLogsStatusComponent, selector: "he-node-logs-models-logs-status", inputs: ["nodeType", "model", "data"] }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation"] }, { kind: "component", type: GuideOverlayComponent, selector: "he-guide-overlay", inputs: ["pageId", "width", "height", "positions"], outputs: ["widthChange", "heightChange"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: CompoundPipe, name: "compound" }, { kind: "pipe", type: DefaultPipe, name: "default" }, { kind: "pipe", type: KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: PrecisionPipe, name: "precision" }, { kind: "pipe", type: TimesPipe, name: "times" }, { kind: "pipe", type: IsArrayPipe, name: "isArray" }, { kind: "pipe", type: RepeatPipe, name: "repeat" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
8134
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.13", type: NodeLogsModelsComponent, isStandalone: true, selector: "he-node-logs-models", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, nodeKey: { classPropertyName: "nodeKey", publicName: "nodeKey", isSignal: true, isRequired: false, transformFunction: null }, originalValues: { classPropertyName: "originalValues", publicName: "originalValues", isSignal: true, isRequired: false, transformFunction: null }, recalculatedValues: { classPropertyName: "recalculatedValues", publicName: "recalculatedValues", isSignal: true, isRequired: false, transformFunction: null }, terms: { classPropertyName: "terms", publicName: "terms", isSignal: true, isRequired: false, transformFunction: null }, filterTermTypes: { classPropertyName: "filterTermTypes", publicName: "filterTermTypes", isSignal: true, isRequired: false, transformFunction: null }, filterTermTypesLabel: { classPropertyName: "filterTermTypesLabel", publicName: "filterTermTypesLabel", isSignal: true, isRequired: false, transformFunction: null }, logsKey: { classPropertyName: "logsKey", publicName: "logsKey", isSignal: true, isRequired: false, transformFunction: null }, noDataMessage: { classPropertyName: "noDataMessage", publicName: "noDataMessage", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"is-flex is-gap-8 is-justify-content-space-between is-align-items-center is-my-2\">\n <div>\n <ng-content />\n </div>\n\n @if (!isExternal && !loading() && logsUrl() && hasLogs()) {\n <a class=\"is-size-7\" [href]=\"logsUrl()\" target=\"_blank\">\n <span>Open Full Logs</span>\n <he-svg-icon name=\"external-link\" class=\"ml-2\" />\n </a>\n }\n</div>\n\n@if (!isExternal && !loading() && !hasLogs()) {\n <p class=\"is-my-2\">\n <he-svg-icon class=\"has-text-warning\" name=\"exclamation-triangle\" />\n <span class=\"is-size-7 has-text-warning is-pl-1\">No logs found. Recalculation logs will be incomplete.</span>\n </p>\n}\n\n<he-data-table class=\"is-mt-2 is-mb-1 is-bordered\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr>\n <th class=\"width-auto has-border-right\">\n @if (enableFilterByTerm()) {\n <div class=\"field is-pb-1\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n class=\"input search-input is-small\"\n [ngModel]=\"term()\"\n name=\"term\"\n placeholder=\"Select entry by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [resultFormatter]=\"termFormatter\"\n [inputFormatter]=\"termFormatter\"\n [focusFirst]=\"true\"\n (focus)=\"typeaheadFocus($event)\"\n (selectItem)=\"term.set($event.item)\"\n container=\"body\"\n popupClass=\"is-small\" />\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"!term()\" (click)=\"term.set(undefined)\">\n <he-svg-icon name=\"xmark\" />\n </a>\n </div>\n </div>\n }\n </th>\n @if (isBlankNodes()) {\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>\n <span class=\"is-pr-1\">Units</span>\n @if (functionalUnit()) {\n <span>(per </span>\n <span>{{ functionalUnit() }}</span>\n <span>)</span>\n }\n </span>\n </div>\n </th>\n }\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Original</span>\n </div>\n </th>\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Recalculated</span>\n </div>\n </th>\n @if (isBlankNodes()) {\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Difference</span>\n </div>\n </th>\n }\n @for (c of methodModelsCount() | times; track i; let i = $index) {\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Model {{ i + 1 }}</span>\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n <tr>\n <td class=\"has-border-right has-text-centered\" colspan=\"100\">\n <div class=\"has-text-center py-3\">\n <he-svg-icon name=\"loading\" animation=\"spin\" size=\"40\" />\n </div>\n </td>\n </tr>\n } @else if (blankNodes().length === 0) {\n <tr>\n <td class=\"has-border-right has-text-centered\" colspan=\"100\">\n <p class=\"is-p-1\">\n @if (noDataMessage()) {\n <span>{{ noDataMessage() }}</span>\n } @else {\n <ng-container *ngTemplateOutlet=\"noResultsDefaultMessage\" />\n }\n </p>\n </td>\n </tr>\n }\n @for (blankNode of blankNodes(); track trackByBlankNode($index, blankNode)) {\n <tr [class.has-sub-rows]=\"blankNode.canOpen\" [class.is-open]=\"blankNode.isOpen\">\n <td\n class=\"width-auto has-border-right is-nowrap\"\n [attr.title]=\"$any(blankNode).term?.name || $any(blankNode).key\">\n <div class=\"is-flex is-align-items-flex-start is-gap-4\">\n <ng-container *ngTemplateOutlet=\"collapseButton; context: { $implicit: blankNode }\" />\n @if ($any(blankNode).term) {\n <he-node-link class=\"is-inline-block is-pre-wrap is-pr-2\" [node]=\"$any(blankNode).term\">\n <span\n class=\"break-word\"\n [innerHtml]=\"$any(blankNode).term.name | compound: $any(blankNode).term.termType\"></span>\n </he-node-link>\n } @else if ($any(blankNode).key) {\n @if (nodeKey() === 'completeness') {\n <a [href]=\"schemaBaseUrl + '/Completeness#' + $any(blankNode).key\" target=\"_blank\">\n <span>{{ $any(blankNode).key | keyToLabel }}</span>\n </a>\n } @else {\n <a [href]=\"schemaBaseUrl + '/' + nodeType() + '#' + $any(blankNode).key\" target=\"_blank\">\n <span>{{ $any(blankNode).key | keyToLabel }}</span>\n </a>\n }\n }\n </div>\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">\n @if ($any(blankNode).term) {\n <span\n class=\"is-nowrap\"\n [innerHtml]=\"$any(blankNode).term.units | compound: $any(blankNode).term.termType\"></span>\n }\n </td>\n }\n <td class=\"has-border-right\">\n <ng-template #originalValueContent>\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: $any(blankNode).originalValue }\" />\n </span>\n </ng-template>\n\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model.methodId) {\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n valueContent;\n context: { value: $any(blankNode).originalValueByMethodId[model.methodId] }\n \" />\n </div>\n }\n } @else {\n <span\n [class.trigger-popover]=\"!!$any(blankNode).original?.[0]?.methodModel\"\n [ngbPopover]=\"blankNodeOriginalValueDetails\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow\"\n placement=\"bottom left right auto\"\n container=\"body\"\n [disablePopover]=\"!$any(blankNode).original?.[0]?.methodModel\"\n [popoverContext]=\"{ blankNode }\">\n <span pointer>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: $any(blankNode).originalValue }\" />\n </span>\n </span>\n }\n </td>\n <td class=\"has-border-right\">\n @if (!blankNode.isOriginal || blankNode.isRecalculated) {\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model.methodId) {\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n valueContent;\n context: { value: $any(blankNode).recalculatedValueByMethodId[model.methodId] }\n \" />\n </div>\n }\n } @else {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: blankNode.recalculatedValue }\" />\n </span>\n }\n } @else if ($any(blankNode).configModels?.length) {\n not recalculated\n } @else {\n -\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right is-nowrap\">\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model.methodId) {\n <div>\n @if (\n $any(blankNode).originalValueByMethodId[model.methodId] !== null &&\n $any(blankNode).recalculatedValueByMethodId[model.methodId] !== null\n ) {\n <he-blank-node-value-delta\n [value]=\"$any(blankNode).recalculatedValueByMethodId[model.methodId]\"\n [originalValue]=\"$any(blankNode).originalValueByMethodId[model.methodId]\"\n [useCustomFunctions]=\"false\" />\n } @else {\n -\n }\n </div>\n }\n } @else {\n @if ($any(blankNode).original.length && blankNode.isRecalculated) {\n <he-blank-node-value-delta\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"$any(blankNode).originalValue\"\n [useCustomFunctions]=\"false\" />\n } @else {\n -\n }\n }\n </td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: blankNode }\" />\n </tr>\n @for (subValue of $any(blankNode).keys; track trackBySubValue(subValue)) {\n @if (blankNode.isOpen) {\n <tr [class.has-sub-rows]=\"$any(blankNode).subValues?.length\" [class.is-sub-row]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right is-nowrap\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n @if (blankNode.type) {\n <a\n class=\"is-inline-block is-pre-wrap\"\n [href]=\"schemaBaseUrl + '/' + blankNode.type + '#' + subValue.key\"\n target=\"_blank\"\n [title]=\"subValue.key\">\n <span>{{ subValue.key }}</span>\n </a>\n }\n @if (!blankNode.type) {\n <span class=\"is-inline-block is-align-top\">{{ subValue.key }}</span>\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\"></td>\n }\n <td class=\"has-border-right\">\n @if (subValue.originalValue !== null) {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.originalValue }\" />\n </span>\n } @else {\n -\n }\n </td>\n <td class=\"has-border-right\">\n @if (subValue.isRecalculated || subValue.key === 'impactAssessment') {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.recalculatedValue }\" />\n </span>\n } @else {\n not recalculated\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">-</td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\" />\n </tr>\n }\n }\n @for (subValue of $any(blankNode).subValues; track trackBySubValue(subValue)) {\n <ng-container *ngTemplateOutlet=\"subValueRow; context: { blankNode, parent: blankNode, subValue }\" />\n }\n }\n </tbody>\n </table>\n</he-data-table>\n<div class=\"is-size-7\">\n <div class=\"is-flex is-py-2 is-px-3 is-gap-16 | status-legend\">\n <div\n class=\"is-flex is-justify-content-center is-align-items-center is-align-content-center is-flex-wrap-wrap is-gap-8\">\n @for (status of LogStatus | keyvalue; track status.value) {\n @if (logIcon[status.value]) {\n <span class=\"is-flex is-align-items-center is-gap-8\">\n <he-svg-icon [name]=\"logIcon[status.value]\" size=\"20\" class=\"has-text-{{ logColor[status.value] }}\" />\n <span class=\"is-size-7 is-capitalized\">{{ status.value }}</span>\n </span>\n }\n }\n </div>\n\n @if (filteredType()) {\n <div class=\"field is-relative\">\n <input\n type=\"checkbox\"\n class=\"switch is-small is-rounded is-secondary\"\n [(ngModel)]=\"onlyRequired\"\n [disabled]=\"!!term()\"\n id=\"onlyRequired\" />\n <label class=\"is-size-7\" for=\"onlyRequired\">\n <span>Show only {{ filteredType() }} terms included in the default HESTIA system boundary</span>\n </label>\n </div>\n }\n </div>\n</div>\n\n<ng-template #noResultsDefaultMessage>\n <span>No original data was provided and no gap filling occurred</span>\n @if (term() && !isInSystemBoundary(term()['@id'])) {\n <span class=\"is-pl-1\">as</span>\n <i class=\"is-px-1\">{{ term().name }}</i>\n <span>is not in the HESTIA system boundary</span>\n }\n <span>.</span>\n</ng-template>\n\n<ng-template #valueContent let-value=\"value\">\n @if (isNumber(value)) {\n {{ value | precision: 3 | default: '-' }}\n } @else {\n {{ value | default: '-' }}\n }\n</ng-template>\n\n<ng-template #collapseButton let-blankNode>\n @if (blankNode.canOpen) {\n <a class=\"open-node\" (click)=\"toggleBlankNode(blankNode)\">\n <he-svg-icon [name]=\"blankNode.isOpen ? 'chevron-down' : 'chevron-right'\" />\n </a>\n }\n</ng-template>\n\n<ng-template #subValueRow let-blankNode=\"blankNode\" let-parent=\"parent\" let-subValue=\"subValue\" let-rowClass=\"rowClass\">\n @let term = subValue.term || termById(subValue.id);\n @if (parent.isOpen) {\n <tr [class.is-sub-row]=\"parent.canOpen\" [ngClass]=\"rowClass\">\n <td class=\"width-auto has-border-right\">\n <div class=\"is-flex is-align-items-flex-start is-gap-4 h-100\">\n <ng-container *ngTemplateOutlet=\"collapseButton; context: { $implicit: subValue }\" />\n <he-svg-icon class=\"sub-sub-row-icon\" name=\"chevron-double-right\" />\n <div class=\"is-flex is-align-items-flex-start is-flex-wrap-wrap is-gap-4\" [class.is-pl-3]=\"!subValue.canOpen\">\n <span>\n <span>{{ subValue.key | keyToLabel }}</span>\n @if (subValue.id) {\n <span class=\"is-inline-block\">:</span>\n }\n </span>\n @if (subValue.id) {\n @switch (subValue.key) {\n @case ('backgroundData') {\n <span class=\"is-inline-block\">{{ term?.name }}</span>\n }\n @case ('animal') {\n <span class=\"is-inline-block\">{{ subValue.id }}</span>\n }\n @default {\n <he-node-link\n class=\"is-inline-block\"\n linkClass=\"is-inline-block\"\n [node]=\"term\"\n [attr.title]=\"term?.name\">\n <span class=\"break-word\" [innerHtml]=\"term?.name | compound\"></span>\n </he-node-link>\n }\n }\n }\n </div>\n </div>\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">\n @if (subValue.showUnits && $any(blankNode).term) {\n <span\n class=\"is-nowrap\"\n [innerHtml]=\"$any(blankNode).term.units | compound: $any(blankNode).term.termType\"></span>\n }\n </td>\n }\n <td class=\"has-border-right\">\n @if (!isEmpty(subValue.originalValue)) {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.originalValue }\" />\n </span>\n } @else {\n -\n }\n </td>\n <td class=\"has-border-right\">\n @if (subValue.isRecalculated) {\n @if (subValue.multiGroups) {\n <span\n class=\"trigger-popover\"\n ngbPopover=\"The total value across all inputs\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow is-overflow-visible\"\n placement=\"left bottom auto\"\n container=\"body\">\n <span pointer>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.recalculatedValue }\" />\n </span>\n </span>\n } @else {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.recalculatedValue }\" />\n </span>\n }\n } @else if (!isEmpty(subValue.originalValue)) {\n not recalculated\n } @else {\n -\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">-</td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\" />\n </tr>\n }\n @if (subValue.subValues) {\n @for (sub of subValue.subValues; track trackBySubValue(sub)) {\n <ng-container\n *ngTemplateOutlet=\"\n subValueRow;\n context: { blankNode, parent: subValue, subValue: sub, rowClass: 'is-sub-sub-row' }\n \" />\n }\n }\n</ng-template>\n\n<ng-template #blankNodeOriginalValueDetails let-blankNode=\"blankNode\">\n <span class=\"is-pr-1\">The original value was reported using:</span>\n <he-node-link\n class=\"is-inline-block\"\n linkClass=\"is-dark\"\n [node]=\"$any(blankNode).original[0].methodModel\"\n [showExternalLink]=\"true\">\n <span>{{ $any(blankNode).original[0].methodModel.name }}</span>\n </he-node-link>\n</ng-template>\n\n<ng-template #blankNodeModels let-data=\"data\">\n @let extraColumns = methodModelsCount() - 1;\n\n <ng-template #notInSystemBoundary>\n <td class=\"has-border-right\">\n <span>Not in HESTIA system boundary</span>\n </td>\n @for (v of data | repeat: extraColumns; track repeatIndex; let repeatIndex = $index) {\n <td class=\"has-border-right\"></td>\n }\n </ng-template>\n\n @if (data.canOpen && !data.isOpen && !data.configModels?.length) {\n <td class=\"has-border-right\">\n <span>Expand to see logs (</span>\n @let key = subValuesKey(data, 'sub-values');\n @if (hasCompleteSuccess(data)) {\n <span>all succeeded</span>\n <he-svg-icon class=\"is-ml-1\" name=\"checkmark\" class=\"has-text-success\" />\n } @else {\n <span>some failed</span>\n <he-svg-icon class=\"is-ml-1\" name=\"xmark\" class=\"has-text-danger\" />\n }\n <span>)</span>\n </td>\n @for (v of data | repeat: extraColumns; track repeatIndex; let repeatIndex = $index) {\n <td class=\"has-border-right\"></td>\n }\n } @else {\n @for (configModel of methodModelsCount() | times; track configModelIndex; let configModelIndex = $index) {\n <td class=\"has-border-right blank-node-index-{{ configModelIndex }}\">\n @if (getModelsAt(data, configModelIndex); as models) {\n @if ($any(models) | isArray) {\n <div>\n @for (model of $any(models); track model.methodId) {\n <p>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model, data }\" />\n </p>\n }\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model: models, data }\" />\n }\n } @else {\n -\n }\n </td>\n }\n }\n</ng-template>\n\n<ng-template #blankNodeModel let-model=\"model\" let-data=\"data\">\n <div class=\"is-flex is-align-self-stretch is-justify-content-center is-align-items-center is-gap-8\">\n <div class=\"is-flex is-gap-4 is-flex-grow-1 is-align-items-center\">\n <span\n class=\"pl-1 has-text-{{ logColor[model.status] }}\"\n [class.trigger-popover]=\"hasLogs()\"\n [ngbPopover]=\"logStatusDetails\"\n [disablePopover]=\"!hasLogs()\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p1=\"ngbPopover\"\n placement=\"bottom left right auto\"\n container=\"body\"\n (click)=\"$event.stopPropagation(); p1.isOpen() ? p1.close() : p1.open({ model, data })\">\n <he-svg-icon [name]=\"logIcon[model.status]\" />\n </span>\n\n <span class=\"is-flex is-flex-grow-1 is-gap-4\">\n <span class=\"is-nowrap is-capitalized\">{{ methodName(model) }}</span>\n\n @if (model.logs?.methodTier || model.model?.methodTier) {\n <span class=\"is-nowrap\">[{{ model.logs?.methodTier || model.model?.methodTier }}]</span>\n }\n </span>\n </div>\n\n <div class=\"is-flex is-gap-4 is-flex-shrink-0 is-align-items-center\">\n @if (model.showLogs) {\n <span\n class=\"is-nowrap is-clickable\"\n [ngbPopover]=\"logDetails\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"bottom left right auto\"\n container=\"body\"\n (click)=\"p.isOpen() ? p.close() : model.showLogs ? p.open({ logs: model.logs }) : null\">\n <span class=\"has-text-link\">Logs</span>\n </span>\n }\n\n @if (model.model) {\n @if (model.showLogs) {\n <div class=\"vertical-divider\"></div>\n }\n <ng-container *ngTemplateOutlet=\"docsLink; context: { $implicit: model.model }\" />\n }\n </div>\n </div>\n</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <he-node-logs-models-logs [logs]=\"logs\" />\n</ng-template>\n\n<ng-template #logStatusDetails let-model=\"model\" let-data=\"data\">\n <he-node-logs-models-logs-status [nodeType]=\"nodeType()\" [model]=\"model\" [data]=\"\" />\n</ng-template>\n\n<ng-template #docsLink let-model>\n @if (guideEnabled && model.guidePath) {\n <he-guide-overlay [pageId]=\"model.guidePath\" [width]=\"500\" />\n } @else {\n <a [href]=\"model.docPath || model.path\" target=\"_blank\" (click)=\"$event.stopPropagation()\">\n <span>Docs</span>\n <he-svg-icon name=\"external-link\" class=\"ml-2\" />\n </a>\n }\n</ng-template>\n", styles: [":host{display:block}:host .vertical-divider{width:1px;height:20px;background:#dbe3ea}:host .status-legend{border:1px solid #dbe3ea;background:#f5f7f9}::ng-deep .table{background-color:transparent}::ng-deep .table td.has-border-right{box-shadow:1px 0 #4c7194}::ng-deep .table .has-sub-rows.is-open>td:first-child:before,::ng-deep .table .is-sub-row>td:first-child:before{display:block;position:absolute;content:\" \";background-color:#4c719433;height:100%;width:1px;top:0;left:14px}::ng-deep .table .has-sub-rows.is-open>td:first-child:before{top:25px}::ng-deep .table .is-sub-row td:first-child{padding-left:12px}::ng-deep .table .is-sub-row .sub-sub-row-icon{display:none}::ng-deep .table .is-sub-row .open-node>he-svg-icon,::ng-deep .table .is-sub-row .sub-sub-row-icon{height:16px!important;width:16px!important}::ng-deep .table .is-sub-sub-row td:first-child{padding-left:24px}::ng-deep .table .is-sub-sub-row .sub-sub-row-icon{display:inline-block}::ng-deep .table .is-sub-sub-row .sub-sub-row-icon+div{padding-left:0!important}::ng-deep .table .popover-body .table-container{max-height:260px;overflow-y:auto}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NodeLinkComponent, selector: "he-node-link", inputs: ["node", "dataState", "showExternalLink", "linkClass"] }, { kind: "component", type: BlankNodeValueDeltaComponent, selector: "he-blank-node-value-delta", inputs: ["value", "originalValue", "displayType", "useCustomFunctions"] }, { kind: "directive", type: NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "selectOnExact", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: NodeLogsModelsLogsComponent, selector: "he-node-logs-models-logs", inputs: ["logs"] }, { kind: "component", type: NodeLogsModelsLogsStatusComponent, selector: "he-node-logs-models-logs-status", inputs: ["nodeType", "model", "data"] }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation"] }, { kind: "component", type: GuideOverlayComponent, selector: "he-guide-overlay", inputs: ["pageId", "width", "height", "positions"], outputs: ["widthChange", "heightChange"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: CompoundPipe, name: "compound" }, { kind: "pipe", type: DefaultPipe, name: "default" }, { kind: "pipe", type: KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: PrecisionPipe, name: "precision" }, { kind: "pipe", type: TimesPipe, name: "times" }, { kind: "pipe", type: IsArrayPipe, name: "isArray" }, { kind: "pipe", type: RepeatPipe, name: "repeat" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
8260
8135
|
}
|
|
8261
8136
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: NodeLogsModelsComponent, decorators: [{
|
|
8262
8137
|
type: Component$1,
|
|
@@ -8281,7 +8156,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImpo
|
|
|
8281
8156
|
NodeLogsModelsLogsStatusComponent,
|
|
8282
8157
|
HESvgIconComponent,
|
|
8283
8158
|
GuideOverlayComponent
|
|
8284
|
-
], template: "<div class=\"is-flex is-gap-8 is-justify-content-space-between is-align-items-center is-my-2\">\n <div>\n <ng-content />\n </div>\n\n @if (!isExternal && !loading() && logsUrl() && hasLogs()) {\n <a class=\"is-size-7\" [href]=\"logsUrl()\" target=\"_blank\">\n <span>Open Full Logs</span>\n <he-svg-icon name=\"external-link\" class=\"ml-2\" />\n </a>\n }\n</div>\n\n@if (!isExternal && !loading() && !hasLogs()) {\n <p class=\"is-my-2\">\n <he-svg-icon class=\"has-text-warning\" name=\"exclamation-triangle\" />\n <span class=\"is-size-7 has-text-warning is-pl-1\">No logs found. Recalculation logs will be incomplete.</span>\n </p>\n}\n\n<he-data-table class=\"is-mt-2 is-mb-1 is-bordered\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr>\n <th class=\"width-auto has-border-right\">\n @if (enableFilterByTerm()) {\n <div class=\"field is-pb-1\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n class=\"input search-input is-small\"\n [ngModel]=\"term()\"\n name=\"term\"\n placeholder=\"Select entry by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [focusFirst]=\"true\"\n (focus)=\"typeaheadFocus($event)\"\n (selectItem)=\"term.set($event.item)\"\n container=\"body\"\n popupClass=\"is-small\" />\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"!term()\" (click)=\"term.set('')\">\n <he-svg-icon name=\"xmark\" />\n </a>\n </div>\n </div>\n }\n </th>\n @if (isBlankNodes()) {\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>\n <span class=\"is-pr-1\">Units</span>\n @if (functionalUnit()) {\n <span>(per </span>\n <span>{{ functionalUnit() }}</span>\n <span>)</span>\n }\n </span>\n </div>\n </th>\n }\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Original</span>\n </div>\n </th>\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Recalculated</span>\n </div>\n </th>\n @if (isBlankNodes()) {\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Difference</span>\n </div>\n </th>\n }\n @for (c of methodModelsCount() | times; track i; let i = $index) {\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Model {{ i + 1 }}</span>\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n <tr>\n <td class=\"has-border-right has-text-centered\" colspan=\"6\">\n <div class=\"has-text-center py-3\">\n <he-svg-icon name=\"loading\" animation=\"spin\" size=\"40\" />\n </div>\n </td>\n </tr>\n } @else if (blankNodes().length === 0) {\n <tr>\n <td class=\"has-border-right has-text-centered\" colspan=\"6\">\n <span>{{ noDataMessage() || 'No original data was provided and no gap filling occurred.' }}</span>\n </td>\n </tr>\n }\n @for (blankNode of blankNodes(); track trackByBlankNode($index, blankNode)) {\n <tr [class.has-sub-rows]=\"blankNode.canOpen\" [class.is-open]=\"blankNode.isOpen\">\n <td\n class=\"width-auto has-border-right is-nowrap\"\n [attr.title]=\"$any(blankNode).term?.name || $any(blankNode).key\">\n <div class=\"is-flex is-align-items-flex-start is-gap-4\">\n <ng-container *ngTemplateOutlet=\"collapseButton; context: { $implicit: blankNode }\" />\n @if ($any(blankNode).term) {\n <he-node-link class=\"is-inline-block is-pre-wrap is-pr-2\" [node]=\"$any(blankNode).term\">\n <span\n class=\"break-word\"\n [innerHtml]=\"$any(blankNode).term.name | compound: $any(blankNode).term.termType\"></span>\n </he-node-link>\n } @else if ($any(blankNode).key) {\n @if (nodeKey() === 'completeness') {\n <a [href]=\"schemaBaseUrl + '/Completeness#' + $any(blankNode).key\" target=\"_blank\">\n <span>{{ $any(blankNode).key | keyToLabel }}</span>\n </a>\n } @else {\n <a [href]=\"schemaBaseUrl + '/' + nodeType() + '#' + $any(blankNode).key\" target=\"_blank\">\n <span>{{ $any(blankNode).key | keyToLabel }}</span>\n </a>\n }\n }\n </div>\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">\n @if ($any(blankNode).term) {\n <span\n class=\"is-nowrap\"\n [innerHtml]=\"$any(blankNode).term.units | compound: $any(blankNode).term.termType\"></span>\n }\n </td>\n }\n <td class=\"has-border-right\">\n <ng-template #originalValueContent>\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: $any(blankNode).originalValue }\" />\n </span>\n </ng-template>\n\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model.methodId) {\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n valueContent;\n context: { value: $any(blankNode).originalValueByMethodId[model.methodId] }\n \" />\n </div>\n }\n } @else {\n <span\n [class.trigger-popover]=\"!!$any(blankNode).original?.[0]?.methodModel\"\n [ngbPopover]=\"blankNodeOriginalValueDetails\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow\"\n placement=\"bottom left right auto\"\n container=\"body\"\n [disablePopover]=\"!$any(blankNode).original?.[0]?.methodModel\"\n [popoverContext]=\"{ blankNode }\">\n <span pointer>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: $any(blankNode).originalValue }\" />\n </span>\n </span>\n }\n </td>\n <td class=\"has-border-right\">\n @if (!blankNode.isOriginal || blankNode.isRecalculated) {\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model.methodId) {\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n valueContent;\n context: { value: $any(blankNode).recalculatedValueByMethodId[model.methodId] }\n \" />\n </div>\n }\n } @else {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: blankNode.recalculatedValue }\" />\n </span>\n }\n } @else if ($any(blankNode).configModels?.length) {\n not recalculated\n } @else {\n -\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right is-nowrap\">\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model.methodId) {\n <div>\n @if (\n $any(blankNode).originalValueByMethodId[model.methodId] !== null &&\n $any(blankNode).recalculatedValueByMethodId[model.methodId] !== null\n ) {\n <he-blank-node-value-delta\n [value]=\"$any(blankNode).recalculatedValueByMethodId[model.methodId]\"\n [originalValue]=\"$any(blankNode).originalValueByMethodId[model.methodId]\"\n [useCustomFunctions]=\"false\" />\n } @else {\n -\n }\n </div>\n }\n } @else {\n @if ($any(blankNode).original.length && blankNode.isRecalculated) {\n <he-blank-node-value-delta\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"$any(blankNode).originalValue\"\n [useCustomFunctions]=\"false\" />\n } @else {\n -\n }\n }\n </td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: blankNode }\" />\n </tr>\n @for (subValue of $any(blankNode).keys; track trackBySubValue(subValue)) {\n @if (blankNode.isOpen) {\n <tr [class.has-sub-rows]=\"$any(blankNode).subValues?.length\" [class.is-sub-row]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right is-nowrap\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n @if (blankNode.type) {\n <a\n class=\"is-inline-block is-pre-wrap\"\n [href]=\"schemaBaseUrl + '/' + blankNode.type + '#' + subValue.key\"\n target=\"_blank\"\n [title]=\"subValue.key\">\n <span>{{ subValue.key }}</span>\n </a>\n }\n @if (!blankNode.type) {\n <span class=\"is-inline-block is-align-top\">{{ subValue.key }}</span>\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\"></td>\n }\n <td class=\"has-border-right\">\n @if (subValue.originalValue !== null) {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.originalValue }\" />\n </span>\n } @else {\n -\n }\n </td>\n <td class=\"has-border-right\">\n @if (subValue.isRecalculated || subValue.key === 'impactAssessment') {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.recalculatedValue }\" />\n </span>\n } @else {\n not recalculated\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">-</td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\" />\n </tr>\n }\n }\n @for (subValue of $any(blankNode).subValues; track trackBySubValue(subValue)) {\n <ng-container *ngTemplateOutlet=\"subValueRow; context: { blankNode, parent: blankNode, subValue }\" />\n }\n }\n </tbody>\n </table>\n</he-data-table>\n<div class=\"is-size-7\">\n <div class=\"is-flex is-py-2 is-px-3 is-gap-16 | status-legend\">\n <div\n class=\"is-flex is-justify-content-center is-align-items-center is-align-content-center is-flex-wrap-wrap is-gap-8\">\n @for (status of LogStatus | keyvalue; track status.value) {\n @if (logIcon[status.value]) {\n <span class=\"is-flex is-align-items-center is-gap-8\">\n <he-svg-icon [name]=\"logIcon[status.value]\" size=\"20\" class=\"has-text-{{ logColor[status.value] }}\" />\n <span class=\"is-size-7 is-capitalized\">{{ status.value }}</span>\n </span>\n }\n }\n </div>\n\n @if (filteredType()) {\n <div class=\"field is-relative\">\n <input\n type=\"checkbox\"\n class=\"switch is-small is-rounded is-secondary\"\n [(ngModel)]=\"onlyRequired\"\n [disabled]=\"!!term()\"\n id=\"onlyRequired\" />\n <label class=\"is-size-7\" for=\"onlyRequired\">\n <span>Show only {{ filteredType() }} terms included in the default HESTIA system boundary</span>\n </label>\n </div>\n }\n </div>\n</div>\n\n<ng-template #valueContent let-value=\"value\">\n @if (isNumber(value)) {\n {{ value | precision: 3 | default: '-' }}\n } @else {\n {{ value | default: '-' }}\n }\n</ng-template>\n\n<ng-template #collapseButton let-blankNode>\n @if (blankNode.canOpen) {\n <a class=\"open-node\" (click)=\"toggleBlankNode(blankNode)\">\n <he-svg-icon [name]=\"blankNode.isOpen ? 'chevron-down' : 'chevron-right'\" />\n </a>\n }\n</ng-template>\n\n<ng-template #subValueRow let-blankNode=\"blankNode\" let-parent=\"parent\" let-subValue=\"subValue\" let-rowClass=\"rowClass\">\n @let term = subValue.term || termById(subValue.id);\n @if (parent.isOpen) {\n <tr [class.is-sub-row]=\"parent.canOpen\" [ngClass]=\"rowClass\">\n <td class=\"width-auto has-border-right\">\n <div class=\"is-flex is-align-items-flex-start is-gap-4 h-100\">\n <ng-container *ngTemplateOutlet=\"collapseButton; context: { $implicit: subValue }\" />\n <he-svg-icon class=\"sub-sub-row-icon\" name=\"chevron-double-right\" />\n <div class=\"is-flex is-align-items-flex-start is-flex-wrap-wrap is-gap-4\" [class.is-pl-3]=\"!subValue.canOpen\">\n <span>\n <span>{{ subValue.key | keyToLabel }}</span>\n @if (subValue.id) {\n <span class=\"is-inline-block\">:</span>\n }\n </span>\n @if (subValue.id) {\n @switch (subValue.key) {\n @case ('backgroundData') {\n <span class=\"is-inline-block\">{{ term?.name }}</span>\n }\n @case ('animal') {\n <span class=\"is-inline-block\">{{ subValue.id }}</span>\n }\n @default {\n <he-node-link\n class=\"is-inline-block\"\n linkClass=\"is-inline-block\"\n [node]=\"term\"\n [attr.title]=\"term?.name\">\n <span class=\"break-word\" [innerHtml]=\"term?.name | compound\"></span>\n </he-node-link>\n }\n }\n }\n </div>\n </div>\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">\n @if (subValue.showUnits && $any(blankNode).term) {\n <span\n class=\"is-nowrap\"\n [innerHtml]=\"$any(blankNode).term.units | compound: $any(blankNode).term.termType\"></span>\n }\n </td>\n }\n <td class=\"has-border-right\">\n @if (!isEmpty(subValue.originalValue)) {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.originalValue }\" />\n </span>\n } @else {\n -\n }\n </td>\n <td class=\"has-border-right\">\n @if (subValue.isRecalculated) {\n @if (subValue.multiGroups) {\n <span\n class=\"trigger-popover\"\n ngbPopover=\"The total value across all inputs\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow is-overflow-visible\"\n placement=\"left bottom auto\"\n container=\"body\">\n <span pointer>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.recalculatedValue }\" />\n </span>\n </span>\n } @else {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.recalculatedValue }\" />\n </span>\n }\n } @else if (!isEmpty(subValue.originalValue)) {\n not recalculated\n } @else {\n -\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">-</td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\" />\n </tr>\n }\n @if (subValue.subValues) {\n @for (sub of subValue.subValues; track trackBySubValue(sub)) {\n <ng-container\n *ngTemplateOutlet=\"\n subValueRow;\n context: { blankNode, parent: subValue, subValue: sub, rowClass: 'is-sub-sub-row' }\n \" />\n }\n }\n</ng-template>\n\n<ng-template #blankNodeOriginalValueDetails let-blankNode=\"blankNode\">\n <span class=\"is-pr-1\">The original value was reported using:</span>\n <he-node-link\n class=\"is-inline-block\"\n linkClass=\"is-dark\"\n [node]=\"$any(blankNode).original[0].methodModel\"\n [showExternalLink]=\"true\">\n <span>{{ $any(blankNode).original[0].methodModel.name }}</span>\n </he-node-link>\n</ng-template>\n\n<ng-template #blankNodeModels let-data=\"data\">\n @let extraColumns = methodModelsCount() - 1;\n\n <ng-template #notInSystemBoundary>\n <td class=\"has-border-right\">\n <span>Not in HESTIA system boundary</span>\n </td>\n @for (v of data | repeat: extraColumns; track repeatIndex; let repeatIndex = $index) {\n <td class=\"has-border-right\"></td>\n }\n </ng-template>\n\n @if (data.canOpen && !data.isOpen && !data.configModels?.length) {\n <td class=\"has-border-right\">\n <span>Expand to see logs (</span>\n @let key = subValuesKey(data, 'sub-values');\n @if (hasCompleteSuccess(data)) {\n <span>all succeeded</span>\n <he-svg-icon class=\"is-ml-1\" name=\"checkmark\" class=\"has-text-success\" />\n } @else {\n <span>some failed</span>\n <he-svg-icon class=\"is-ml-1\" name=\"xmark\" class=\"has-text-danger\" />\n }\n <span>)</span>\n </td>\n @for (v of data | repeat: extraColumns; track repeatIndex; let repeatIndex = $index) {\n <td class=\"has-border-right\"></td>\n }\n } @else if (isSystemBoundary(data)) {\n @for (configModel of methodModelsCount() | times; track configModelIndex; let configModelIndex = $index) {\n <td class=\"has-border-right blank-node-index-{{ configModelIndex }}\">\n @if (getModelsAt(data, configModelIndex); as models) {\n @if ($any(models) | isArray) {\n <div>\n @for (model of $any(models); track model.methodId) {\n <p>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model, data }\" />\n </p>\n }\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model: models, data }\" />\n }\n } @else {\n -\n }\n </td>\n }\n } @else {\n -\n }\n</ng-template>\n\n<ng-template #blankNodeModel let-model=\"model\" let-data=\"data\">\n <div class=\"is-flex is-align-self-stretch is-justify-content-center is-align-items-center is-gap-8\">\n <div class=\"is-flex is-gap-4 is-flex-grow-1 is-align-items-center\">\n <span\n class=\"pl-1 has-text-{{ logColor[model.status] }}\"\n [class.trigger-popover]=\"hasLogs()\"\n [ngbPopover]=\"logStatusDetails\"\n [disablePopover]=\"!hasLogs()\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p1=\"ngbPopover\"\n placement=\"bottom left right auto\"\n container=\"body\"\n (click)=\"$event.stopPropagation(); p1.isOpen() ? p1.close() : p1.open({ model, data })\">\n <he-svg-icon [name]=\"logIcon[model.status]\" />\n </span>\n\n <span class=\"is-flex is-flex-grow-1 is-gap-4\">\n <span class=\"is-nowrap is-capitalized\">{{ methodName(model) }}</span>\n\n @if (model.logs?.methodTier || model.model?.methodTier) {\n <span class=\"is-nowrap\">[{{ model.logs?.methodTier || model.model?.methodTier }}]</span>\n }\n </span>\n </div>\n\n <div class=\"is-flex is-gap-4 is-flex-shrink-0 is-align-items-center\">\n @if (model.showLogs) {\n <span\n class=\"is-nowrap is-clickable\"\n [ngbPopover]=\"logDetails\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"bottom left right auto\"\n container=\"body\"\n (click)=\"p.isOpen() ? p.close() : model.showLogs ? p.open({ logs: model.logs }) : null\">\n <span class=\"has-text-link\">Logs</span>\n </span>\n }\n\n @if (model.model) {\n @if (model.showLogs) {\n <div class=\"vertical-divider\"></div>\n }\n <ng-container *ngTemplateOutlet=\"docsLink; context: { $implicit: model.model }\" />\n }\n </div>\n </div>\n</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <he-node-logs-models-logs [logs]=\"logs\" />\n</ng-template>\n\n<ng-template #logStatusDetails let-model=\"model\" let-data=\"data\">\n <he-node-logs-models-logs-status [nodeType]=\"nodeType()\" [model]=\"model\" [data]=\"\" />\n</ng-template>\n\n<ng-template #docsLink let-model>\n @if (guideEnabled && model.guidePath) {\n <he-guide-overlay [pageId]=\"model.guidePath\" [width]=\"500\" />\n } @else {\n <a [href]=\"model.docPath || model.path\" target=\"_blank\" (click)=\"$event.stopPropagation()\">\n <span>Docs</span>\n <he-svg-icon name=\"external-link\" class=\"ml-2\" />\n </a>\n }\n</ng-template>\n", styles: [":host{display:block}:host .vertical-divider{width:1px;height:20px;background:#dbe3ea}:host .status-legend{border:1px solid #dbe3ea;background:#f5f7f9}::ng-deep .table{background-color:transparent}::ng-deep .table td.has-border-right{box-shadow:1px 0 #4c7194}::ng-deep .table .has-sub-rows.is-open>td:first-child:before,::ng-deep .table .is-sub-row>td:first-child:before{display:block;position:absolute;content:\" \";background-color:#4c719433;height:100%;width:1px;top:0;left:14px}::ng-deep .table .has-sub-rows.is-open>td:first-child:before{top:25px}::ng-deep .table .is-sub-row td:first-child{padding-left:12px}::ng-deep .table .is-sub-row .sub-sub-row-icon{display:none}::ng-deep .table .is-sub-row .open-node>he-svg-icon,::ng-deep .table .is-sub-row .sub-sub-row-icon{height:16px!important;width:16px!important}::ng-deep .table .is-sub-sub-row td:first-child{padding-left:24px}::ng-deep .table .is-sub-sub-row .sub-sub-row-icon{display:inline-block}::ng-deep .table .is-sub-sub-row .sub-sub-row-icon+div{padding-left:0!important}::ng-deep .table .popover-body .table-container{max-height:260px;overflow-y:auto}\n"] }]
|
|
8159
|
+
], template: "<div class=\"is-flex is-gap-8 is-justify-content-space-between is-align-items-center is-my-2\">\n <div>\n <ng-content />\n </div>\n\n @if (!isExternal && !loading() && logsUrl() && hasLogs()) {\n <a class=\"is-size-7\" [href]=\"logsUrl()\" target=\"_blank\">\n <span>Open Full Logs</span>\n <he-svg-icon name=\"external-link\" class=\"ml-2\" />\n </a>\n }\n</div>\n\n@if (!isExternal && !loading() && !hasLogs()) {\n <p class=\"is-my-2\">\n <he-svg-icon class=\"has-text-warning\" name=\"exclamation-triangle\" />\n <span class=\"is-size-7 has-text-warning is-pl-1\">No logs found. Recalculation logs will be incomplete.</span>\n </p>\n}\n\n<he-data-table class=\"is-mt-2 is-mb-1 is-bordered\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr>\n <th class=\"width-auto has-border-right\">\n @if (enableFilterByTerm()) {\n <div class=\"field is-pb-1\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n class=\"input search-input is-small\"\n [ngModel]=\"term()\"\n name=\"term\"\n placeholder=\"Select entry by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [resultFormatter]=\"termFormatter\"\n [inputFormatter]=\"termFormatter\"\n [focusFirst]=\"true\"\n (focus)=\"typeaheadFocus($event)\"\n (selectItem)=\"term.set($event.item)\"\n container=\"body\"\n popupClass=\"is-small\" />\n <a class=\"icon is-small is-right\" [class.is-hidden]=\"!term()\" (click)=\"term.set(undefined)\">\n <he-svg-icon name=\"xmark\" />\n </a>\n </div>\n </div>\n }\n </th>\n @if (isBlankNodes()) {\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>\n <span class=\"is-pr-1\">Units</span>\n @if (functionalUnit()) {\n <span>(per </span>\n <span>{{ functionalUnit() }}</span>\n <span>)</span>\n }\n </span>\n </div>\n </th>\n }\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Original</span>\n </div>\n </th>\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Recalculated</span>\n </div>\n </th>\n @if (isBlankNodes()) {\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Difference</span>\n </div>\n </th>\n }\n @for (c of methodModelsCount() | times; track i; let i = $index) {\n <th class=\"has-border-right\">\n <div class=\"is-flex is-flex-direction-column is-justify-content-center h-100\">\n <span>Model {{ i + 1 }}</span>\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading()) {\n <tr>\n <td class=\"has-border-right has-text-centered\" colspan=\"100\">\n <div class=\"has-text-center py-3\">\n <he-svg-icon name=\"loading\" animation=\"spin\" size=\"40\" />\n </div>\n </td>\n </tr>\n } @else if (blankNodes().length === 0) {\n <tr>\n <td class=\"has-border-right has-text-centered\" colspan=\"100\">\n <p class=\"is-p-1\">\n @if (noDataMessage()) {\n <span>{{ noDataMessage() }}</span>\n } @else {\n <ng-container *ngTemplateOutlet=\"noResultsDefaultMessage\" />\n }\n </p>\n </td>\n </tr>\n }\n @for (blankNode of blankNodes(); track trackByBlankNode($index, blankNode)) {\n <tr [class.has-sub-rows]=\"blankNode.canOpen\" [class.is-open]=\"blankNode.isOpen\">\n <td\n class=\"width-auto has-border-right is-nowrap\"\n [attr.title]=\"$any(blankNode).term?.name || $any(blankNode).key\">\n <div class=\"is-flex is-align-items-flex-start is-gap-4\">\n <ng-container *ngTemplateOutlet=\"collapseButton; context: { $implicit: blankNode }\" />\n @if ($any(blankNode).term) {\n <he-node-link class=\"is-inline-block is-pre-wrap is-pr-2\" [node]=\"$any(blankNode).term\">\n <span\n class=\"break-word\"\n [innerHtml]=\"$any(blankNode).term.name | compound: $any(blankNode).term.termType\"></span>\n </he-node-link>\n } @else if ($any(blankNode).key) {\n @if (nodeKey() === 'completeness') {\n <a [href]=\"schemaBaseUrl + '/Completeness#' + $any(blankNode).key\" target=\"_blank\">\n <span>{{ $any(blankNode).key | keyToLabel }}</span>\n </a>\n } @else {\n <a [href]=\"schemaBaseUrl + '/' + nodeType() + '#' + $any(blankNode).key\" target=\"_blank\">\n <span>{{ $any(blankNode).key | keyToLabel }}</span>\n </a>\n }\n }\n </div>\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">\n @if ($any(blankNode).term) {\n <span\n class=\"is-nowrap\"\n [innerHtml]=\"$any(blankNode).term.units | compound: $any(blankNode).term.termType\"></span>\n }\n </td>\n }\n <td class=\"has-border-right\">\n <ng-template #originalValueContent>\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: $any(blankNode).originalValue }\" />\n </span>\n </ng-template>\n\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model.methodId) {\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n valueContent;\n context: { value: $any(blankNode).originalValueByMethodId[model.methodId] }\n \" />\n </div>\n }\n } @else {\n <span\n [class.trigger-popover]=\"!!$any(blankNode).original?.[0]?.methodModel\"\n [ngbPopover]=\"blankNodeOriginalValueDetails\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow\"\n placement=\"bottom left right auto\"\n container=\"body\"\n [disablePopover]=\"!$any(blankNode).original?.[0]?.methodModel\"\n [popoverContext]=\"{ blankNode }\">\n <span pointer>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: $any(blankNode).originalValue }\" />\n </span>\n </span>\n }\n </td>\n <td class=\"has-border-right\">\n @if (!blankNode.isOriginal || blankNode.isRecalculated) {\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model.methodId) {\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n valueContent;\n context: { value: $any(blankNode).recalculatedValueByMethodId[model.methodId] }\n \" />\n </div>\n }\n } @else {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: blankNode.recalculatedValue }\" />\n </span>\n }\n } @else if ($any(blankNode).configModels?.length) {\n not recalculated\n } @else {\n -\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right is-nowrap\">\n @if (blankNode.allParallel) {\n @for (model of $any(blankNode).configModels[0]; track model.methodId) {\n <div>\n @if (\n $any(blankNode).originalValueByMethodId[model.methodId] !== null &&\n $any(blankNode).recalculatedValueByMethodId[model.methodId] !== null\n ) {\n <he-blank-node-value-delta\n [value]=\"$any(blankNode).recalculatedValueByMethodId[model.methodId]\"\n [originalValue]=\"$any(blankNode).originalValueByMethodId[model.methodId]\"\n [useCustomFunctions]=\"false\" />\n } @else {\n -\n }\n </div>\n }\n } @else {\n @if ($any(blankNode).original.length && blankNode.isRecalculated) {\n <he-blank-node-value-delta\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"$any(blankNode).originalValue\"\n [useCustomFunctions]=\"false\" />\n } @else {\n -\n }\n }\n </td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: blankNode }\" />\n </tr>\n @for (subValue of $any(blankNode).keys; track trackBySubValue(subValue)) {\n @if (blankNode.isOpen) {\n <tr [class.has-sub-rows]=\"$any(blankNode).subValues?.length\" [class.is-sub-row]=\"blankNode.canOpen\">\n <td class=\"width-auto has-border-right is-nowrap\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n @if (blankNode.type) {\n <a\n class=\"is-inline-block is-pre-wrap\"\n [href]=\"schemaBaseUrl + '/' + blankNode.type + '#' + subValue.key\"\n target=\"_blank\"\n [title]=\"subValue.key\">\n <span>{{ subValue.key }}</span>\n </a>\n }\n @if (!blankNode.type) {\n <span class=\"is-inline-block is-align-top\">{{ subValue.key }}</span>\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\"></td>\n }\n <td class=\"has-border-right\">\n @if (subValue.originalValue !== null) {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.originalValue }\" />\n </span>\n } @else {\n -\n }\n </td>\n <td class=\"has-border-right\">\n @if (subValue.isRecalculated || subValue.key === 'impactAssessment') {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.recalculatedValue }\" />\n </span>\n } @else {\n not recalculated\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">-</td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\" />\n </tr>\n }\n }\n @for (subValue of $any(blankNode).subValues; track trackBySubValue(subValue)) {\n <ng-container *ngTemplateOutlet=\"subValueRow; context: { blankNode, parent: blankNode, subValue }\" />\n }\n }\n </tbody>\n </table>\n</he-data-table>\n<div class=\"is-size-7\">\n <div class=\"is-flex is-py-2 is-px-3 is-gap-16 | status-legend\">\n <div\n class=\"is-flex is-justify-content-center is-align-items-center is-align-content-center is-flex-wrap-wrap is-gap-8\">\n @for (status of LogStatus | keyvalue; track status.value) {\n @if (logIcon[status.value]) {\n <span class=\"is-flex is-align-items-center is-gap-8\">\n <he-svg-icon [name]=\"logIcon[status.value]\" size=\"20\" class=\"has-text-{{ logColor[status.value] }}\" />\n <span class=\"is-size-7 is-capitalized\">{{ status.value }}</span>\n </span>\n }\n }\n </div>\n\n @if (filteredType()) {\n <div class=\"field is-relative\">\n <input\n type=\"checkbox\"\n class=\"switch is-small is-rounded is-secondary\"\n [(ngModel)]=\"onlyRequired\"\n [disabled]=\"!!term()\"\n id=\"onlyRequired\" />\n <label class=\"is-size-7\" for=\"onlyRequired\">\n <span>Show only {{ filteredType() }} terms included in the default HESTIA system boundary</span>\n </label>\n </div>\n }\n </div>\n</div>\n\n<ng-template #noResultsDefaultMessage>\n <span>No original data was provided and no gap filling occurred</span>\n @if (term() && !isInSystemBoundary(term()['@id'])) {\n <span class=\"is-pl-1\">as</span>\n <i class=\"is-px-1\">{{ term().name }}</i>\n <span>is not in the HESTIA system boundary</span>\n }\n <span>.</span>\n</ng-template>\n\n<ng-template #valueContent let-value=\"value\">\n @if (isNumber(value)) {\n {{ value | precision: 3 | default: '-' }}\n } @else {\n {{ value | default: '-' }}\n }\n</ng-template>\n\n<ng-template #collapseButton let-blankNode>\n @if (blankNode.canOpen) {\n <a class=\"open-node\" (click)=\"toggleBlankNode(blankNode)\">\n <he-svg-icon [name]=\"blankNode.isOpen ? 'chevron-down' : 'chevron-right'\" />\n </a>\n }\n</ng-template>\n\n<ng-template #subValueRow let-blankNode=\"blankNode\" let-parent=\"parent\" let-subValue=\"subValue\" let-rowClass=\"rowClass\">\n @let term = subValue.term || termById(subValue.id);\n @if (parent.isOpen) {\n <tr [class.is-sub-row]=\"parent.canOpen\" [ngClass]=\"rowClass\">\n <td class=\"width-auto has-border-right\">\n <div class=\"is-flex is-align-items-flex-start is-gap-4 h-100\">\n <ng-container *ngTemplateOutlet=\"collapseButton; context: { $implicit: subValue }\" />\n <he-svg-icon class=\"sub-sub-row-icon\" name=\"chevron-double-right\" />\n <div class=\"is-flex is-align-items-flex-start is-flex-wrap-wrap is-gap-4\" [class.is-pl-3]=\"!subValue.canOpen\">\n <span>\n <span>{{ subValue.key | keyToLabel }}</span>\n @if (subValue.id) {\n <span class=\"is-inline-block\">:</span>\n }\n </span>\n @if (subValue.id) {\n @switch (subValue.key) {\n @case ('backgroundData') {\n <span class=\"is-inline-block\">{{ term?.name }}</span>\n }\n @case ('animal') {\n <span class=\"is-inline-block\">{{ subValue.id }}</span>\n }\n @default {\n <he-node-link\n class=\"is-inline-block\"\n linkClass=\"is-inline-block\"\n [node]=\"term\"\n [attr.title]=\"term?.name\">\n <span class=\"break-word\" [innerHtml]=\"term?.name | compound\"></span>\n </he-node-link>\n }\n }\n }\n </div>\n </div>\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">\n @if (subValue.showUnits && $any(blankNode).term) {\n <span\n class=\"is-nowrap\"\n [innerHtml]=\"$any(blankNode).term.units | compound: $any(blankNode).term.termType\"></span>\n }\n </td>\n }\n <td class=\"has-border-right\">\n @if (!isEmpty(subValue.originalValue)) {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.originalValue }\" />\n </span>\n } @else {\n -\n }\n </td>\n <td class=\"has-border-right\">\n @if (subValue.isRecalculated) {\n @if (subValue.multiGroups) {\n <span\n class=\"trigger-popover\"\n ngbPopover=\"The total value across all inputs\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow is-overflow-visible\"\n placement=\"left bottom auto\"\n container=\"body\">\n <span pointer>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.recalculatedValue }\" />\n </span>\n </span>\n } @else {\n <span>\n <ng-container *ngTemplateOutlet=\"valueContent; context: { value: subValue.recalculatedValue }\" />\n </span>\n }\n } @else if (!isEmpty(subValue.originalValue)) {\n not recalculated\n } @else {\n -\n }\n </td>\n @if (isBlankNodes()) {\n <td class=\"has-border-right\">-</td>\n }\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: { data: subValue }\" />\n </tr>\n }\n @if (subValue.subValues) {\n @for (sub of subValue.subValues; track trackBySubValue(sub)) {\n <ng-container\n *ngTemplateOutlet=\"\n subValueRow;\n context: { blankNode, parent: subValue, subValue: sub, rowClass: 'is-sub-sub-row' }\n \" />\n }\n }\n</ng-template>\n\n<ng-template #blankNodeOriginalValueDetails let-blankNode=\"blankNode\">\n <span class=\"is-pr-1\">The original value was reported using:</span>\n <he-node-link\n class=\"is-inline-block\"\n linkClass=\"is-dark\"\n [node]=\"$any(blankNode).original[0].methodModel\"\n [showExternalLink]=\"true\">\n <span>{{ $any(blankNode).original[0].methodModel.name }}</span>\n </he-node-link>\n</ng-template>\n\n<ng-template #blankNodeModels let-data=\"data\">\n @let extraColumns = methodModelsCount() - 1;\n\n <ng-template #notInSystemBoundary>\n <td class=\"has-border-right\">\n <span>Not in HESTIA system boundary</span>\n </td>\n @for (v of data | repeat: extraColumns; track repeatIndex; let repeatIndex = $index) {\n <td class=\"has-border-right\"></td>\n }\n </ng-template>\n\n @if (data.canOpen && !data.isOpen && !data.configModels?.length) {\n <td class=\"has-border-right\">\n <span>Expand to see logs (</span>\n @let key = subValuesKey(data, 'sub-values');\n @if (hasCompleteSuccess(data)) {\n <span>all succeeded</span>\n <he-svg-icon class=\"is-ml-1\" name=\"checkmark\" class=\"has-text-success\" />\n } @else {\n <span>some failed</span>\n <he-svg-icon class=\"is-ml-1\" name=\"xmark\" class=\"has-text-danger\" />\n }\n <span>)</span>\n </td>\n @for (v of data | repeat: extraColumns; track repeatIndex; let repeatIndex = $index) {\n <td class=\"has-border-right\"></td>\n }\n } @else {\n @for (configModel of methodModelsCount() | times; track configModelIndex; let configModelIndex = $index) {\n <td class=\"has-border-right blank-node-index-{{ configModelIndex }}\">\n @if (getModelsAt(data, configModelIndex); as models) {\n @if ($any(models) | isArray) {\n <div>\n @for (model of $any(models); track model.methodId) {\n <p>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model, data }\" />\n </p>\n }\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: { model: models, data }\" />\n }\n } @else {\n -\n }\n </td>\n }\n }\n</ng-template>\n\n<ng-template #blankNodeModel let-model=\"model\" let-data=\"data\">\n <div class=\"is-flex is-align-self-stretch is-justify-content-center is-align-items-center is-gap-8\">\n <div class=\"is-flex is-gap-4 is-flex-grow-1 is-align-items-center\">\n <span\n class=\"pl-1 has-text-{{ logColor[model.status] }}\"\n [class.trigger-popover]=\"hasLogs()\"\n [ngbPopover]=\"logStatusDetails\"\n [disablePopover]=\"!hasLogs()\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p1=\"ngbPopover\"\n placement=\"bottom left right auto\"\n container=\"body\"\n (click)=\"$event.stopPropagation(); p1.isOpen() ? p1.close() : p1.open({ model, data })\">\n <he-svg-icon [name]=\"logIcon[model.status]\" />\n </span>\n\n <span class=\"is-flex is-flex-grow-1 is-gap-4\">\n <span class=\"is-nowrap is-capitalized\">{{ methodName(model) }}</span>\n\n @if (model.logs?.methodTier || model.model?.methodTier) {\n <span class=\"is-nowrap\">[{{ model.logs?.methodTier || model.model?.methodTier }}]</span>\n }\n </span>\n </div>\n\n <div class=\"is-flex is-gap-4 is-flex-shrink-0 is-align-items-center\">\n @if (model.showLogs) {\n <span\n class=\"is-nowrap is-clickable\"\n [ngbPopover]=\"logDetails\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"bottom left right auto\"\n container=\"body\"\n (click)=\"p.isOpen() ? p.close() : model.showLogs ? p.open({ logs: model.logs }) : null\">\n <span class=\"has-text-link\">Logs</span>\n </span>\n }\n\n @if (model.model) {\n @if (model.showLogs) {\n <div class=\"vertical-divider\"></div>\n }\n <ng-container *ngTemplateOutlet=\"docsLink; context: { $implicit: model.model }\" />\n }\n </div>\n </div>\n</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <he-node-logs-models-logs [logs]=\"logs\" />\n</ng-template>\n\n<ng-template #logStatusDetails let-model=\"model\" let-data=\"data\">\n <he-node-logs-models-logs-status [nodeType]=\"nodeType()\" [model]=\"model\" [data]=\"\" />\n</ng-template>\n\n<ng-template #docsLink let-model>\n @if (guideEnabled && model.guidePath) {\n <he-guide-overlay [pageId]=\"model.guidePath\" [width]=\"500\" />\n } @else {\n <a [href]=\"model.docPath || model.path\" target=\"_blank\" (click)=\"$event.stopPropagation()\">\n <span>Docs</span>\n <he-svg-icon name=\"external-link\" class=\"ml-2\" />\n </a>\n }\n</ng-template>\n", styles: [":host{display:block}:host .vertical-divider{width:1px;height:20px;background:#dbe3ea}:host .status-legend{border:1px solid #dbe3ea;background:#f5f7f9}::ng-deep .table{background-color:transparent}::ng-deep .table td.has-border-right{box-shadow:1px 0 #4c7194}::ng-deep .table .has-sub-rows.is-open>td:first-child:before,::ng-deep .table .is-sub-row>td:first-child:before{display:block;position:absolute;content:\" \";background-color:#4c719433;height:100%;width:1px;top:0;left:14px}::ng-deep .table .has-sub-rows.is-open>td:first-child:before{top:25px}::ng-deep .table .is-sub-row td:first-child{padding-left:12px}::ng-deep .table .is-sub-row .sub-sub-row-icon{display:none}::ng-deep .table .is-sub-row .open-node>he-svg-icon,::ng-deep .table .is-sub-row .sub-sub-row-icon{height:16px!important;width:16px!important}::ng-deep .table .is-sub-sub-row td:first-child{padding-left:24px}::ng-deep .table .is-sub-sub-row .sub-sub-row-icon{display:inline-block}::ng-deep .table .is-sub-sub-row .sub-sub-row-icon+div{padding-left:0!important}::ng-deep .table .popover-body .table-container{max-height:260px;overflow-y:auto}\n"] }]
|
|
8285
8160
|
}], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }], nodeKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeKey", required: false }] }], originalValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "originalValues", required: false }] }], recalculatedValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "recalculatedValues", required: false }] }], terms: [{ type: i0.Input, args: [{ isSignal: true, alias: "terms", required: false }] }], filterTermTypes: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterTermTypes", required: false }] }], filterTermTypesLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterTermTypesLabel", required: false }] }], logsKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "logsKey", required: false }] }], noDataMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "noDataMessage", required: false }] }] } });
|
|
8286
8161
|
|
|
8287
8162
|
var View$4;
|
|
@@ -9357,9 +9232,7 @@ const loadSvgSprite = () => {
|
|
|
9357
9232
|
const document = inject(DOCUMENT);
|
|
9358
9233
|
const platformLocation = inject(PlatformLocation);
|
|
9359
9234
|
const baseUrl = platformLocation.getBaseHrefFromDOM();
|
|
9360
|
-
return http
|
|
9361
|
-
.get(`${baseUrl}assets/svg-icons/icons-sprite.svg`, { responseType: 'text' })
|
|
9362
|
-
.pipe(tap(svgContent => {
|
|
9235
|
+
return lastValueFrom(http.get(`${baseUrl}assets/svg-icons/icons-sprite.svg`, { responseType: 'text' }).pipe(tap(svgContent => {
|
|
9363
9236
|
const div = document.createElement('div');
|
|
9364
9237
|
div.innerHTML = svgContent;
|
|
9365
9238
|
const svg = div.querySelector('svg');
|
|
@@ -9367,8 +9240,7 @@ const loadSvgSprite = () => {
|
|
|
9367
9240
|
svg.style.display = 'none';
|
|
9368
9241
|
document.body.insertBefore(svg, document.body.firstChild);
|
|
9369
9242
|
}
|
|
9370
|
-
}))
|
|
9371
|
-
.toPromise();
|
|
9243
|
+
})));
|
|
9372
9244
|
};
|
|
9373
9245
|
|
|
9374
9246
|
class NodeAggregatedInfoComponent {
|
|
@@ -11464,6 +11336,7 @@ class SitesMapsComponent {
|
|
|
11464
11336
|
this.nodeStoreService = inject(HeNodeStoreService);
|
|
11465
11337
|
this._loadPolygonsRequests = {};
|
|
11466
11338
|
this._mapReady = signal(false, ...(ngDevMode ? [{ debugName: "_mapReady" }] : []));
|
|
11339
|
+
this.map = viewChild(GoogleMap, ...(ngDevMode ? [{ debugName: "map" }] : []));
|
|
11467
11340
|
this.loadPolygons = input(true, ...(ngDevMode ? [{ debugName: "loadPolygons" }] : []));
|
|
11468
11341
|
/**
|
|
11469
11342
|
* Display Site directly without using the node store.
|
|
@@ -11511,7 +11384,7 @@ class SitesMapsComponent {
|
|
|
11511
11384
|
this.centerTimeout = null;
|
|
11512
11385
|
}
|
|
11513
11386
|
this.centerTimeout = setTimeout(() => {
|
|
11514
|
-
this.map
|
|
11387
|
+
this.map()?.googleMap?.fitBounds(polygonBounds(polygons));
|
|
11515
11388
|
}, 1000);
|
|
11516
11389
|
}
|
|
11517
11390
|
loadTermId(id) {
|
|
@@ -11533,19 +11406,16 @@ class SitesMapsComponent {
|
|
|
11533
11406
|
setTimeout(() => {
|
|
11534
11407
|
this._mapReady.set(true);
|
|
11535
11408
|
// loaded data as geojson
|
|
11536
|
-
this.map
|
|
11409
|
+
this.map()?.googleMap?.data?.setStyle(() => ({ ...strokeStyle, strokeOpacity: 0.1 }));
|
|
11537
11410
|
});
|
|
11538
11411
|
}
|
|
11539
11412
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: SitesMapsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
11540
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.13", type: SitesMapsComponent, isStandalone: true, selector: "he-sites-maps", inputs: { loadPolygons: { classPropertyName: "loadPolygons", publicName: "loadPolygons", isSignal: true, isRequired: false, transformFunction: null }, sites: { classPropertyName: "sites", publicName: "sites", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, showNotice: { classPropertyName: "showNotice", publicName: "showNotice", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "map", first: true, predicate: GoogleMap, descendants: true }], ngImport: i0, template: "@if (mapLoaded$ | async) {\n <google-map (mapInitialized)=\"mapLoaded()\" height=\"100%\" width=\"100%\" [zoom]=\"zoom()\" [center]=\"mapCenter()\">\n @for (marker of markers(); track trackByMarker($index, marker)) {\n <map-marker [position]=\"marker.position\" [icon]=\"marker.icon\"></map-marker>\n }\n @for (polygon of sitePolygons(); track trackByPolygon($index, polygon)) {\n <map-polygon [paths]=\"polygon.paths\" [options]=\"polygon.options\" />\n }\n @for (polygon of termPolygons(); track trackByPolygon($index, polygon)) {\n <map-polygon [paths]=\"polygon.paths\" [options]=\"polygon.options\" />\n }\n </google-map>\n}\n\n@if (showNotice()) {\n <p class=\"mt-2 is-italic is-size-7\">The information provided might not be complete</p>\n}\n\n@if (showNoLocation()) {\n <div class=\"no-location has-text-center has-text-light\">\n <span>No precise location data</span>\n </div>\n}\n", styles: [":host{display:block;height:100%;position:relative;width:100%}.no-location{background-color:#0000004d;left:0;height:100%;position:absolute;top:0;width:100%;z-index:9}.no-location>span{display:inline-block;margin-top:12%}\n"], dependencies: [{ kind: "component", type: GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "directive", type: MapMarker, selector: "map-marker", inputs: ["title", "position", "label", "clickable", "options", "icon", "visible"], outputs: ["animationChanged", "mapClick", "clickableChanged", "cursorChanged", "mapDblclick", "mapDrag", "mapDragend", "draggableChanged", "mapDragstart", "flatChanged", "iconChanged", "mapMousedown", "mapMouseout", "mapMouseover", "mapMouseup", "positionChanged", "mapRightclick", "shapeChanged", "titleChanged", "visibleChanged", "zindexChanged", "markerInitialized"], exportAs: ["mapMarker"] }, { kind: "directive", type: MapPolygon, selector: "map-polygon", inputs: ["options", "paths"], outputs: ["polygonClick", "polygonDblclick", "polygonDrag", "polygonDragend", "polygonDragstart", "polygonMousedown", "polygonMousemove", "polygonMouseout", "polygonMouseover", "polygonMouseup", "polygonRightclick", "polygonInitialized"], exportAs: ["mapPolygon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
11413
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.13", type: SitesMapsComponent, isStandalone: true, selector: "he-sites-maps", inputs: { loadPolygons: { classPropertyName: "loadPolygons", publicName: "loadPolygons", isSignal: true, isRequired: false, transformFunction: null }, sites: { classPropertyName: "sites", publicName: "sites", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, showNotice: { classPropertyName: "showNotice", publicName: "showNotice", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "map", first: true, predicate: GoogleMap, descendants: true, isSignal: true }], ngImport: i0, template: "@if (mapLoaded$ | async) {\n <google-map (mapInitialized)=\"mapLoaded()\" height=\"100%\" width=\"100%\" [zoom]=\"zoom()\" [center]=\"mapCenter()\">\n @for (marker of markers(); track trackByMarker($index, marker)) {\n <map-marker [position]=\"marker.position\" [icon]=\"marker.icon\"></map-marker>\n }\n @for (polygon of sitePolygons(); track trackByPolygon($index, polygon)) {\n <map-polygon [paths]=\"polygon.paths\" [options]=\"polygon.options\" />\n }\n @for (polygon of termPolygons(); track trackByPolygon($index, polygon)) {\n <map-polygon [paths]=\"polygon.paths\" [options]=\"polygon.options\" />\n }\n </google-map>\n}\n\n@if (showNotice()) {\n <p class=\"mt-2 is-italic is-size-7\">The information provided might not be complete</p>\n}\n\n@if (showNoLocation()) {\n <div class=\"no-location has-text-center has-text-light\">\n <span>No precise location data</span>\n </div>\n}\n", styles: [":host{display:block;height:100%;position:relative;width:100%}.no-location{background-color:#0000004d;left:0;height:100%;position:absolute;top:0;width:100%;z-index:9}.no-location>span{display:inline-block;margin-top:12%}\n"], dependencies: [{ kind: "component", type: GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "directive", type: MapMarker, selector: "map-marker", inputs: ["title", "position", "label", "clickable", "options", "icon", "visible"], outputs: ["animationChanged", "mapClick", "clickableChanged", "cursorChanged", "mapDblclick", "mapDrag", "mapDragend", "draggableChanged", "mapDragstart", "flatChanged", "iconChanged", "mapMousedown", "mapMouseout", "mapMouseover", "mapMouseup", "positionChanged", "mapRightclick", "shapeChanged", "titleChanged", "visibleChanged", "zindexChanged", "markerInitialized"], exportAs: ["mapMarker"] }, { kind: "directive", type: MapPolygon, selector: "map-polygon", inputs: ["options", "paths"], outputs: ["polygonClick", "polygonDblclick", "polygonDrag", "polygonDragend", "polygonDragstart", "polygonMousedown", "polygonMousemove", "polygonMouseout", "polygonMouseover", "polygonMouseup", "polygonRightclick", "polygonInitialized"], exportAs: ["mapPolygon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
11541
11414
|
}
|
|
11542
11415
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: SitesMapsComponent, decorators: [{
|
|
11543
11416
|
type: Component$1,
|
|
11544
11417
|
args: [{ selector: 'he-sites-maps', changeDetection: ChangeDetectionStrategy.OnPush, imports: [GoogleMap, MapMarker, MapPolygon, AsyncPipe], template: "@if (mapLoaded$ | async) {\n <google-map (mapInitialized)=\"mapLoaded()\" height=\"100%\" width=\"100%\" [zoom]=\"zoom()\" [center]=\"mapCenter()\">\n @for (marker of markers(); track trackByMarker($index, marker)) {\n <map-marker [position]=\"marker.position\" [icon]=\"marker.icon\"></map-marker>\n }\n @for (polygon of sitePolygons(); track trackByPolygon($index, polygon)) {\n <map-polygon [paths]=\"polygon.paths\" [options]=\"polygon.options\" />\n }\n @for (polygon of termPolygons(); track trackByPolygon($index, polygon)) {\n <map-polygon [paths]=\"polygon.paths\" [options]=\"polygon.options\" />\n }\n </google-map>\n}\n\n@if (showNotice()) {\n <p class=\"mt-2 is-italic is-size-7\">The information provided might not be complete</p>\n}\n\n@if (showNoLocation()) {\n <div class=\"no-location has-text-center has-text-light\">\n <span>No precise location data</span>\n </div>\n}\n", styles: [":host{display:block;height:100%;position:relative;width:100%}.no-location{background-color:#0000004d;left:0;height:100%;position:absolute;top:0;width:100%;z-index:9}.no-location>span{display:inline-block;margin-top:12%}\n"] }]
|
|
11545
|
-
}], ctorParameters: () => [], propDecorators: { map: [{
|
|
11546
|
-
type: ViewChild,
|
|
11547
|
-
args: [GoogleMap]
|
|
11548
|
-
}], loadPolygons: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadPolygons", required: false }] }], sites: [{ type: i0.Input, args: [{ isSignal: true, alias: "sites", required: false }] }], zoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoom", required: false }] }], showNotice: [{ type: i0.Input, args: [{ isSignal: true, alias: "showNotice", required: false }] }] } });
|
|
11418
|
+
}], ctorParameters: () => [], propDecorators: { map: [{ type: i0.ViewChild, args: [i0.forwardRef(() => GoogleMap), { isSignal: true }] }], loadPolygons: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadPolygons", required: false }] }], sites: [{ type: i0.Input, args: [{ isSignal: true, alias: "sites", required: false }] }], zoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoom", required: false }] }], showNotice: [{ type: i0.Input, args: [{ isSignal: true, alias: "showNotice", required: false }] }] } });
|
|
11549
11419
|
|
|
11550
11420
|
const stringify = (value) => JSON.stringify(value);
|
|
11551
11421
|
const focusFirstGroupError = (element) => {
|
|
@@ -12352,9 +12222,6 @@ class HeGlossaryService {
|
|
|
12352
12222
|
migrations$(format = GlossaryMigrationFormat.json) {
|
|
12353
12223
|
return this.http.get(migrationsUrl(format));
|
|
12354
12224
|
}
|
|
12355
|
-
migrations(format = GlossaryMigrationFormat.json) {
|
|
12356
|
-
return this.migrations$(format).toPromise();
|
|
12357
|
-
}
|
|
12358
12225
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: HeGlossaryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
12359
12226
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: HeGlossaryService, providedIn: 'root' }); }
|
|
12360
12227
|
}
|
|
@@ -12407,7 +12274,6 @@ const getUnitsAndLabel = (terms, fallbackLabel = 'unknown term') => {
|
|
|
12407
12274
|
units
|
|
12408
12275
|
};
|
|
12409
12276
|
};
|
|
12410
|
-
|
|
12411
12277
|
const typeMapping = {
|
|
12412
12278
|
[TermTermType.endpointIndicator]: ChartNodeType.endpoint,
|
|
12413
12279
|
[TermTermType.characterisedIndicator]: ChartNodeType.midpoint,
|
|
@@ -12415,6 +12281,58 @@ const typeMapping = {
|
|
|
12415
12281
|
[TermTermType.resourceUse]: ChartNodeType.emission,
|
|
12416
12282
|
[TermTermType.operation]: ChartNodeType.operation
|
|
12417
12283
|
};
|
|
12284
|
+
const safeDivide = (numerator, denominator) => (denominator !== 0 ? numerator / denominator : 0);
|
|
12285
|
+
const sumIndicators = (data) => {
|
|
12286
|
+
const totalValues = data.reduce((acc, log) => {
|
|
12287
|
+
acc[log.indicator] = acc[log.indicator] || [];
|
|
12288
|
+
!isUndefined(log.weightedValue) && acc[log.indicator].push(log.weightedValue);
|
|
12289
|
+
return acc;
|
|
12290
|
+
}, {});
|
|
12291
|
+
return Object.fromEntries(Object.entries(totalValues).map(([key, values]) => [
|
|
12292
|
+
key,
|
|
12293
|
+
// if the total is positive, we ignore negative values
|
|
12294
|
+
sum(values) < 0 ? sum(values) : sum(values.filter(v => v >= 0))
|
|
12295
|
+
]));
|
|
12296
|
+
};
|
|
12297
|
+
const groupIndicators = (data, terms = {}, totals = {}) => data.reduce((acc, log) => {
|
|
12298
|
+
const contributorType = typeMapping[terms[log.contributor]?.termType] || ChartNodeType.input;
|
|
12299
|
+
const indicatorType = typeMapping[terms[log.indicator]?.termType];
|
|
12300
|
+
const contributorNode = {
|
|
12301
|
+
id: log.contributor,
|
|
12302
|
+
...getUnitsAndLabel(terms[log.contributor], log.contributor),
|
|
12303
|
+
type: contributorType,
|
|
12304
|
+
value: log.value,
|
|
12305
|
+
weightedValue: log.weightedValue,
|
|
12306
|
+
modelId: log.modelId,
|
|
12307
|
+
fraction: safeDivide(log.weightedValue, totals[log.indicator]),
|
|
12308
|
+
children: contributorType === ChartNodeType.emission
|
|
12309
|
+
? log.inputs.map(i => ({
|
|
12310
|
+
...i,
|
|
12311
|
+
...getUnitsAndLabel(terms[i.id], i.label),
|
|
12312
|
+
type: ChartNodeType.input,
|
|
12313
|
+
fraction: safeDivide(i.weightedValue, log.value),
|
|
12314
|
+
children: i.operations.map(o => ({
|
|
12315
|
+
...o,
|
|
12316
|
+
...getUnitsAndLabel(terms[o.id], o.label),
|
|
12317
|
+
type: ChartNodeType.operation,
|
|
12318
|
+
fraction: safeDivide(o.weightedValue, i.weightedValue)
|
|
12319
|
+
}))
|
|
12320
|
+
}))
|
|
12321
|
+
: []
|
|
12322
|
+
};
|
|
12323
|
+
acc[log.indicator]
|
|
12324
|
+
? acc[log.indicator].children.push(contributorNode)
|
|
12325
|
+
: (acc[log.indicator] = {
|
|
12326
|
+
id: log.indicator,
|
|
12327
|
+
...getUnitsAndLabel(terms[log.indicator], log.indicator),
|
|
12328
|
+
modelId: log.modelId,
|
|
12329
|
+
type: indicatorType,
|
|
12330
|
+
value: totals[log.indicator],
|
|
12331
|
+
children: [contributorNode]
|
|
12332
|
+
});
|
|
12333
|
+
return acc;
|
|
12334
|
+
}, {});
|
|
12335
|
+
|
|
12418
12336
|
const width = 800;
|
|
12419
12337
|
const margin = { top: 10, right: 20, bottom: 10, left: 20 };
|
|
12420
12338
|
const fontSize = Math.floor(width / 100);
|
|
@@ -12502,7 +12420,6 @@ const setGroupButtonXY = (selection) => selection
|
|
|
12502
12420
|
.attr('x', d => (d._groupOpen ? (nodeWidth * 2.5) / 7 : nodeWidth / 2 - groupButtonWidth / 2))
|
|
12503
12421
|
.attr('y', d => d._groupOpen ? groupOverlap + (groupNodeSpace - (lineHeight + nodePadding * 2)) / 2 : nodePadding + lineHeight + 6);
|
|
12504
12422
|
const formatNumber = (value) => (isNumber(value) ? toPrecision(value, 3) : 'N/A');
|
|
12505
|
-
const safeDivide = (numerator, denominator) => (denominator > 0 ? numerator / denominator : 0);
|
|
12506
12423
|
const isTypeWithoutValue = (nodeDatum) => [ChartNodeType.input, ChartNodeType.operation].includes(nodeDatum.data.type);
|
|
12507
12424
|
const getWeightedValueText = (nodeDatum) => `${formatNumber(nodeDatum.data.weightedValue)}${nodeDatum.parent?.data.value === null
|
|
12508
12425
|
? ''
|
|
@@ -12527,12 +12444,12 @@ const generateTipData = (nodeDatum) => ({
|
|
|
12527
12444
|
href: `${baseUrl()}/term/${term['@id']}`
|
|
12528
12445
|
}))
|
|
12529
12446
|
});
|
|
12530
|
-
const addTooltip = (selection, { tooltipOperator
|
|
12447
|
+
const addTooltip = (selection, { tooltipOperator }) => {
|
|
12531
12448
|
let hoveringTip = false;
|
|
12532
12449
|
let hoveringNode = false;
|
|
12533
12450
|
let lastNodeId;
|
|
12534
12451
|
const closeTip = () => {
|
|
12535
|
-
|
|
12452
|
+
tooltipOperator.close(false);
|
|
12536
12453
|
selectAll('.tip-target').classed('tip-target', false);
|
|
12537
12454
|
lastNodeId = null;
|
|
12538
12455
|
};
|
|
@@ -12553,7 +12470,7 @@ const addTooltip = (selection, { tooltipOperator, zone }) => {
|
|
|
12553
12470
|
closeTip();
|
|
12554
12471
|
lastNodeId = nodeDatum.data.id;
|
|
12555
12472
|
select(event.target).classed('tip-target', true);
|
|
12556
|
-
|
|
12473
|
+
tooltipOperator.open({ tipData: generateTipData(nodeDatum) });
|
|
12557
12474
|
select('.driver-chart-tooltip')
|
|
12558
12475
|
.on('pointerenter', () => {
|
|
12559
12476
|
hoveringTip = true;
|
|
@@ -12569,7 +12486,7 @@ const addTooltip = (selection, { tooltipOperator, zone }) => {
|
|
|
12569
12486
|
});
|
|
12570
12487
|
return selection;
|
|
12571
12488
|
};
|
|
12572
|
-
const mergedNodes = (selection, { tooltipOperator
|
|
12489
|
+
const mergedNodes = (selection, { tooltipOperator }) => {
|
|
12573
12490
|
selection
|
|
12574
12491
|
.selectAll('.node-box')
|
|
12575
12492
|
.classed('node-openable', d => !!d.height)
|
|
@@ -12581,7 +12498,7 @@ const mergedNodes = (selection, { tooltipOperator, zone }) => {
|
|
|
12581
12498
|
.attr('rx', '3px')
|
|
12582
12499
|
.attr('ry', '3px')
|
|
12583
12500
|
.style('user-select', window.innerWidth < 768 ? 'none' : null);
|
|
12584
|
-
selection.filter(d => !d.data.group && d.data.id !== nonLCAIndicatorsId).call(addTooltip, { tooltipOperator
|
|
12501
|
+
selection.filter(d => !d.data.group && d.data.id !== nonLCAIndicatorsId).call(addTooltip, { tooltipOperator });
|
|
12585
12502
|
selection
|
|
12586
12503
|
.selectAll('.node-label')
|
|
12587
12504
|
.attr('y', d => (d.data.showBar ? lineHeight / 2 + nodePadding / 2 : 0))
|
|
@@ -12768,49 +12685,6 @@ const groupPercentage = (node, percentage = 0.02) => {
|
|
|
12768
12685
|
node._children = notGrouped;
|
|
12769
12686
|
}
|
|
12770
12687
|
};
|
|
12771
|
-
const sumIndicators = (data) => data.reduce((acc, log) => {
|
|
12772
|
-
// ignore negative values in the total
|
|
12773
|
-
acc[log.indicator] = (acc[log.indicator] || 0) + (log.weightedValue > 0 ? log.weightedValue : 0);
|
|
12774
|
-
return acc;
|
|
12775
|
-
}, {});
|
|
12776
|
-
const groupIndicators = (data, terms = {}, totals = {}) => data.reduce((acc, log) => {
|
|
12777
|
-
const contributorType = typeMapping[terms[log.contributor]?.termType] || ChartNodeType.input;
|
|
12778
|
-
const indicatorType = typeMapping[terms[log.indicator]?.termType];
|
|
12779
|
-
const contributorNode = {
|
|
12780
|
-
id: log.contributor,
|
|
12781
|
-
...getUnitsAndLabel(terms[log.contributor], log.contributor),
|
|
12782
|
-
type: contributorType,
|
|
12783
|
-
value: log.value,
|
|
12784
|
-
weightedValue: log.weightedValue,
|
|
12785
|
-
modelId: log.modelId,
|
|
12786
|
-
fraction: safeDivide(log.weightedValue, totals[log.indicator]),
|
|
12787
|
-
children: contributorType === ChartNodeType.emission
|
|
12788
|
-
? log.inputs.map(i => ({
|
|
12789
|
-
...i,
|
|
12790
|
-
...getUnitsAndLabel(terms[i.id], i.label),
|
|
12791
|
-
type: ChartNodeType.input,
|
|
12792
|
-
fraction: safeDivide(i.weightedValue, log.value),
|
|
12793
|
-
children: i.operations.map(o => ({
|
|
12794
|
-
...o,
|
|
12795
|
-
...getUnitsAndLabel(terms[o.id], o.label),
|
|
12796
|
-
type: ChartNodeType.operation,
|
|
12797
|
-
fraction: safeDivide(o.weightedValue, i.weightedValue)
|
|
12798
|
-
}))
|
|
12799
|
-
}))
|
|
12800
|
-
: []
|
|
12801
|
-
};
|
|
12802
|
-
acc[log.indicator]
|
|
12803
|
-
? acc[log.indicator].children.push(contributorNode)
|
|
12804
|
-
: (acc[log.indicator] = {
|
|
12805
|
-
id: log.indicator,
|
|
12806
|
-
...getUnitsAndLabel(terms[log.indicator], log.indicator),
|
|
12807
|
-
modelId: log.modelId,
|
|
12808
|
-
type: indicatorType,
|
|
12809
|
-
value: totals[log.indicator],
|
|
12810
|
-
children: [contributorNode]
|
|
12811
|
-
});
|
|
12812
|
-
return acc;
|
|
12813
|
-
}, {});
|
|
12814
12688
|
const showBar = (node) => [
|
|
12815
12689
|
node.parent?.data.type !== ChartNodeType.root,
|
|
12816
12690
|
node.parent?.data.id !== nonLCAIndicatorsId,
|
|
@@ -12819,7 +12693,6 @@ const showBar = (node) => [
|
|
|
12819
12693
|
].every(Boolean);
|
|
12820
12694
|
class HierarchyChartComponent {
|
|
12821
12695
|
constructor() {
|
|
12822
|
-
this.ngZone = inject(NgZone);
|
|
12823
12696
|
this.chart = viewChild.required('chart');
|
|
12824
12697
|
this.zoomContainer = viewChild.required('zoomContainer');
|
|
12825
12698
|
this.chartContainer = viewChild.required('chartContainer');
|
|
@@ -12903,7 +12776,8 @@ class HierarchyChartComponent {
|
|
|
12903
12776
|
});
|
|
12904
12777
|
this.includedTypes.set(unique(root.descendants().map(n => n.data.type)));
|
|
12905
12778
|
this.root = root
|
|
12906
|
-
|
|
12779
|
+
// treat `0` as -infinity so they appear all the way to the bottom
|
|
12780
|
+
.sort((a, b) => (b.data.fraction || -Infinity) - (a.data.fraction || -Infinity))
|
|
12907
12781
|
.eachAfter(node => {
|
|
12908
12782
|
if (node.data.fraction === 0) {
|
|
12909
12783
|
node.children = null;
|
|
@@ -12996,8 +12870,8 @@ class HierarchyChartComponent {
|
|
|
12996
12870
|
.call(enterNodes)
|
|
12997
12871
|
.attr('opacity', 0)
|
|
12998
12872
|
.attr('transform', d => 'translate(' + (togglingGroup ? d.y : d.y - nodeWidth / 2) + ',' + d.x + ')'), update => update, exit => {
|
|
12999
|
-
this.
|
|
13000
|
-
return exit
|
|
12873
|
+
this.tooltipOperator().close(false);
|
|
12874
|
+
return (exit
|
|
13001
12875
|
.style('pointer-events', 'none')
|
|
13002
12876
|
.transition()
|
|
13003
12877
|
.duration(nodeDuration / 2)
|
|
@@ -13009,13 +12883,11 @@ class HierarchyChartComponent {
|
|
|
13009
12883
|
.attr('transform', d => 'translate(' + (togglingGroup ? d.y : d.y - nodeWidth / 2) + ',' + d.x + ')')
|
|
13010
12884
|
.attr('opacity', 0)
|
|
13011
12885
|
.remove()
|
|
13012
|
-
.on('end', () => {
|
|
13013
12886
|
// in case a tooltip was opened on a transitioning element
|
|
13014
|
-
|
|
13015
|
-
});
|
|
12887
|
+
.on('end', () => this.tooltipOperator().close(false)));
|
|
13016
12888
|
});
|
|
13017
12889
|
this.node
|
|
13018
|
-
.call(mergedNodes, { tooltipOperator: this.tooltipOperator()
|
|
12890
|
+
.call(mergedNodes, { tooltipOperator: this.tooltipOperator() })
|
|
13019
12891
|
.transition()
|
|
13020
12892
|
.delay(d => {
|
|
13021
12893
|
const groupClosing = togglingGroup && !d.parent?.children?.find(n => n.data.group)?._groupOpen;
|
|
@@ -13306,7 +13178,7 @@ const csvHeaders = [
|
|
|
13306
13178
|
'Functional Unit'
|
|
13307
13179
|
];
|
|
13308
13180
|
const logsTotalValue = (logs, includeNegativeValues) => sum((includeNegativeValues ? logs : logs.filter(curr => curr.value >= 0)).map(v => v.value));
|
|
13309
|
-
const valueRatio = (value, total) => toPrecision((value * 100) / total, 2);
|
|
13181
|
+
const valueRatio = (value, total) => total === 0 ? 0 : toPrecision((value * 100) / total, 2);
|
|
13310
13182
|
const chartLabel = (value, total) => {
|
|
13311
13183
|
const ratio = valueRatio(value, total);
|
|
13312
13184
|
return value === 0 ? '0' : `${value}, ${ratio}%`;
|
|
@@ -14257,5 +14129,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImpo
|
|
|
14257
14129
|
* Generated bundle index. Do not edit.
|
|
14258
14130
|
*/
|
|
14259
14131
|
|
|
14260
|
-
export { ARRAY_DELIMITER, ApplyPurePipe, BarChartComponent, BibliographiesSearchConfirmComponent, BlankNodeStateComponent, BlankNodeStateNoticeComponent, BlankNodeValueDeltaComponent, CapitalizePipe, ChartComponent, ChartConfigurationDirective, ClickOutsideDirective, ClipboardComponent, CollapsibleBoxComponent, ColorPalette, CompoundDirective, CompoundPipe, ControlValueAccessor, CycleNodesKeyGroup, CyclesCompletenessComponent, CyclesEmissionsChartComponent, CyclesFunctionalUnitMeasureComponent, CyclesMetadataComponent, CyclesNodesComponent, CyclesNodesTimelineComponent, CyclesResultComponent, DataTableComponent, DefaultPipe, DeltaColour, DistributionChartComponent, DrawerContainerComponent, DurationPipe, EllipsisPipe, EngineModelsLinkComponent, EngineModelsLookupInfoComponent, EngineModelsStageComponent, EngineModelsStageDeepComponent, EngineModelsStageDeepService, EngineModelsVersionLinkComponent, EngineOrchestratorEditComponent, EngineRequirementsFormComponent, FileSizePipe, FileUploadErrorKeys, FilesErrorSummaryComponent, FilesFormComponent, FilesFormEditableComponent, FilesUploadErrorsComponent, FilterAccordionComponent, GUIDE_ENABLED, GetPipe, GlossaryMigrationFormat, GuideOverlayComponent, HESvgIconComponent, HE_API_BASE_URL, HE_CALCULATIONS_BASE_URL, HE_MAP_LOADED, HeAuthService, HeCommonService, HeEngineService, HeGlossaryService, HeMendeleyService, HeNodeCsvService, HeNodeService, HeNodeStoreService, HeSchemaService, HeSearchService, HeToastService, HorizontalBarChartComponent, HorizontalButtonsGroupComponent, ImpactAssessmentsGraphComponent, ImpactAssessmentsIndicatorBreakdownChartComponent, ImpactAssessmentsIndicatorsChartComponent, ImpactAssessmentsProductsComponent, IsArrayPipe, IsObjectPipe, IssueConfirmComponent, KeyToLabelPipe, Level, LineChartComponent, LinkKeyValueComponent, LogStatus, LongPressDirective, MAX_RESULTS, MapsDrawingComponent, MapsDrawingConfirmComponent, MendeleySearchResult, MobileShellComponent, NavigationMenuComponent, NoExtPipe, NodeAggregatedComponent, NodeAggregatedInfoComponent, NodeAggregatedQualityScoreComponent, NodeCsvExportConfirmComponent, NodeCsvPreviewComponent, NodeCsvSelectHeadersComponent, NodeIconComponent, NodeJsonldComponent, NodeJsonldSchemaComponent, NodeKeyState, NodeLinkComponent, NodeLogsFileComponent, NodeLogsModelsComponent, NodeLogsTimeComponent, NodeMissingLookupFactorsComponent, NodeQualityScore, NodeRecommendationsComponent, NodeSelectComponent, NodeValueDetailsComponent, PluralizePipe, PopoverComponent, PopoverConfirmComponent, PrecisionPipe, RelatedNodeResult, RemoveMarkdownPipe, RepeatPipe, Repository, ResizedDirective, ResizedEvent, ResponsiveService, SchemaInfoComponent, SchemaVersionLinkComponent, SearchExtendComponent, ShelfDialogComponent, ShellComponent, SitesManagementChartComponent, SitesMapsComponent, SitesNodesComponent, SkeletonTextComponent, SocialTagsComponent, SortByPipe, SortSelectComponent, TagsInputDirective, Template, TermsPropertyContentComponent, TermsSubClassOfContentComponent, TermsUnitsDescriptionComponent, ThousandSuffixesPipe, ThousandsPipe, TimesPipe, ToastComponent, UncapitalizePipe, addPolygonToFeature, afterBarDrawPlugin, allCountriesQuery, allGroups, allOptions, arrayValue, availableProperties, backgroundHoverPlugin, baseApiUrl, baseUrl, bottom, buildSummary, bytesSize, calculateCycleDuration, calculateCycleDurationEnabled, calculateCycleStartDate, calculateCycleStartDateEnabled, capitalize, changelogUrl, clustererImage, code, colorToRgba, compoundToHtml, computeKeys, computeTerms, contactUsEmail, contactUsLink, convertToSvg, coordinatesToPoint, copyObject, countriesQuery, createMarker, cropsQuery, d3ellipse, d3wrap, dataPathLabel, dataPathToKey, defaultFeature, defaultLabel, defaultSuggestionType, defaultSvgIconSize, definitionToSchemaType, distinctUntilChangedDeep, downloadFile, downloadSvg, ellipsis, engineGitBaseUrl, engineGitUrl, errorHasError, errorHasWarning, errorText, evaluateSuccess, exportAsSVG, externalLink, externalNodeLink, fillColor, fillStyle, filterBlankNode$1 as filterBlankNode, filterError, filterParams, findConfigModels, findMatchingModel, findModels, findNodeModel, findOrchestratorModel, findProperty, findPropertyById, flatFilterData, flatFilterNode, formatCustomErrorMessage, formatDate, formatError, formatPropertyError, formatter, getColor, getDatesBetween, gitBranch, gitHome, gitlabRawUrl, glossaryBaseUrl, glossaryLink, groupChanged, groupLogsByModel, groupLogsByTerm, groupNodesByTerm, groupdLogsByKey, grouppedKeys, grouppedValueKeys, groupsLogsByFields, guideModelUrl, guideNamespace, guidePageId, handleAPIError, handleGuideEvent, hasError, hasValidationError, hasWarning, hexToRgba, iconSizes, icons, ignoreKeys$2 as ignoreKeys, initialFilterState, injectResizeEvent$, inputGroupsTermTypes, isAddPropertyEnabled, isChrome, isDateBetween, isEqual, isExternal, isGroupVisible, isKeyClosedVisible, isKeyHidden, isMaxStage, isMethodModelAllowed, isMigrationError, isMissingOneOfError, isMissingPropertyError, isNonNodeModelKey, isSchemaIri, isScrolledBelow, isState, isTermTypeAllowed, isValidKey, keyToDataPath, levels, listColor, listColorContinuous, listColorWithAlpha, loadMapApi, loadSvgSprite,
|
|
14132
|
+
export { ARRAY_DELIMITER, ApplyPurePipe, BarChartComponent, BibliographiesSearchConfirmComponent, BlankNodeStateComponent, BlankNodeStateNoticeComponent, BlankNodeValueDeltaComponent, CapitalizePipe, ChartComponent, ChartConfigurationDirective, ClickOutsideDirective, ClipboardComponent, CollapsibleBoxComponent, ColorPalette, CompoundDirective, CompoundPipe, ControlValueAccessor, CycleNodesKeyGroup, CyclesCompletenessComponent, CyclesEmissionsChartComponent, CyclesFunctionalUnitMeasureComponent, CyclesMetadataComponent, CyclesNodesComponent, CyclesNodesTimelineComponent, CyclesResultComponent, DataTableComponent, DefaultPipe, DeltaColour, DistributionChartComponent, DrawerContainerComponent, DurationPipe, EllipsisPipe, EngineModelsLinkComponent, EngineModelsLookupInfoComponent, EngineModelsStageComponent, EngineModelsStageDeepComponent, EngineModelsStageDeepService, EngineModelsVersionLinkComponent, EngineOrchestratorEditComponent, EngineRequirementsFormComponent, FileSizePipe, FileUploadErrorKeys, FilesErrorSummaryComponent, FilesFormComponent, FilesFormEditableComponent, FilesUploadErrorsComponent, FilterAccordionComponent, GUIDE_ENABLED, GetPipe, GlossaryMigrationFormat, GuideOverlayComponent, HESvgIconComponent, HE_API_BASE_URL, HE_CALCULATIONS_BASE_URL, HE_MAP_LOADED, HeAuthService, HeCommonService, HeEngineService, HeGlossaryService, HeMendeleyService, HeNodeCsvService, HeNodeService, HeNodeStoreService, HeSchemaService, HeSearchService, HeToastService, HorizontalBarChartComponent, HorizontalButtonsGroupComponent, ImpactAssessmentsGraphComponent, ImpactAssessmentsIndicatorBreakdownChartComponent, ImpactAssessmentsIndicatorsChartComponent, ImpactAssessmentsProductsComponent, IsArrayPipe, IsObjectPipe, IssueConfirmComponent, KeyToLabelPipe, Level, LineChartComponent, LinkKeyValueComponent, LogStatus, LongPressDirective, MAX_RESULTS, MapsDrawingComponent, MapsDrawingConfirmComponent, MendeleySearchResult, MobileShellComponent, NavigationMenuComponent, NoExtPipe, NodeAggregatedComponent, NodeAggregatedInfoComponent, NodeAggregatedQualityScoreComponent, NodeCsvExportConfirmComponent, NodeCsvPreviewComponent, NodeCsvSelectHeadersComponent, NodeIconComponent, NodeJsonldComponent, NodeJsonldSchemaComponent, NodeKeyState, NodeLinkComponent, NodeLogsFileComponent, NodeLogsModelsComponent, NodeLogsTimeComponent, NodeMissingLookupFactorsComponent, NodeQualityScore, NodeRecommendationsComponent, NodeSelectComponent, NodeValueDetailsComponent, PluralizePipe, PopoverComponent, PopoverConfirmComponent, PrecisionPipe, RelatedNodeResult, RemoveMarkdownPipe, RepeatPipe, Repository, ResizedDirective, ResizedEvent, ResponsiveService, SchemaInfoComponent, SchemaVersionLinkComponent, SearchExtendComponent, ShelfDialogComponent, ShellComponent, SitesManagementChartComponent, SitesMapsComponent, SitesNodesComponent, SkeletonTextComponent, SocialTagsComponent, SortByPipe, SortSelectComponent, TagsInputDirective, Template, TermsPropertyContentComponent, TermsSubClassOfContentComponent, TermsUnitsDescriptionComponent, ThousandSuffixesPipe, ThousandsPipe, TimesPipe, ToastComponent, UncapitalizePipe, addPolygonToFeature, afterBarDrawPlugin, allCountriesQuery, allGroups, allOptions, arrayValue, availableProperties, backgroundHoverPlugin, baseApiUrl, baseUrl, bottom, buildSummary, bytesSize, calculateCycleDuration, calculateCycleDurationEnabled, calculateCycleStartDate, calculateCycleStartDateEnabled, capitalize, changelogUrl, clustererImage, code, colorToRgba, compoundToHtml, computeKeys, computeTerms, contactUsEmail, contactUsLink, convertToSvg, coordinatesToPoint, copyObject, countriesQuery, createMarker, cropsQuery, d3ellipse, d3wrap, dataPathLabel, dataPathToKey, defaultFeature, defaultLabel, defaultSuggestionType, defaultSvgIconSize, definitionToSchemaType, distinctUntilChangedDeep, downloadFile, downloadSvg, ellipsis, engineGitBaseUrl, engineGitUrl, errorHasError, errorHasWarning, errorText, evaluateSuccess, exportAsSVG, externalLink, externalNodeLink, fillColor, fillStyle, filterBlankNode$1 as filterBlankNode, filterError, filterParams, findConfigModels, findMatchingModel, findModels, findNodeModel, findOrchestratorModel, findProperty, findPropertyById, flatFilterData, flatFilterNode, formatCustomErrorMessage, formatDate, formatError, formatPropertyError, formatter, getColor, getDatesBetween, gitBranch, gitHome, gitlabRawUrl, glossaryBaseUrl, glossaryLink, groupChanged, groupLogsByModel, groupLogsByTerm, groupNodesByTerm, groupdLogsByKey, grouppedKeys, grouppedValueKeys, groupsLogsByFields, guideModelUrl, guideNamespace, guidePageId, handleAPIError, handleGuideEvent, hasError, hasValidationError, hasWarning, hexToRgba, iconSizes, icons, ignoreKeys$2 as ignoreKeys, initialFilterState, injectResizeEvent$, inputGroupsTermTypes, isAddPropertyEnabled, isChrome, isDateBetween, isEqual, isExternal, isGroupVisible, isKeyClosedVisible, isKeyHidden, isMaxStage, isMethodModelAllowed, isMigrationError, isMissingOneOfError, isMissingPropertyError, isNonNodeModelKey, isSchemaIri, isScrolledBelow, isState, isTermTypeAllowed, isValidKey, keyToDataPath, levels, listColor, listColorContinuous, listColorWithAlpha, loadMapApi, loadSvgSprite, locationQuery, logToCsv$1 as logToCsv, logValueArray, logsKey, lollipopChartPlugin, lookupUrl, mapFilterData, mapsUrl, markerIcon, markerPie, matchAggregatedQuery, matchAggregatedValidatedQuery, matchBoolPrefixQuery, matchCountry, matchExactQuery, matchGlobalRegion, matchId, matchNameNormalized, matchNestedKey, matchPhrasePrefixQuery, matchPhraseQuery, matchPrimaryProductQuery, matchQuery, matchRegex, matchRegion, matchTermType, matchType, maxAreaSize, measurementValue, mergeDataWithHeaders, methodTierOrder, migrationErrorMessage, migrationsUrl, missingNodeErrors, modelCount, modelKeyParams, modelParams, models, multiMatchQuery, nestedProperty, nestingEnabled, nestingTypeEnabled, nodeAvailableProperties, nodeById, nodeColours$1 as nodeColours, nodeDataState, nodeId, nodeIds, nodeLink, nodeLinkEnabled, nodeLinkTypeEnabled, nodeLogsUrl, nodeQualityScoreColor, nodeQualityScoreLevel, nodeQualityScoreMaxDefault, nodeQualityScoreOrder, nodeSecondaryColours, nodeToAggregationFilename, nodeType, nodeTypeDataState, nodeTypeIcon, nodeUrl, nodeUrlParams, nodeVersion, nodesByState, nodesByType, numberGte, optionsFromGroup, parentKey, parentProperty, parseColor, parseData, parseDataPath, parseLines, parseMessage$1 as parseMessage, parseNewValue, pluralize, pointToCoordinates, polygonBounds, polygonToCoordinates, polygonToMap, polygonsFromFeature, populateWithTrackIdsFilterData, postGuideEvent, primaryProduct, productsQuery, propertyError, propertyId, recursiveProperties, refToSchemaType, refreshPropertyKeys, regionsQuery, registerChart, repeat, reportIssueLink, reportIssueUrl, safeJSONParse, safeJSONStringify, schemaBaseUrl, schemaDataBaseUrl, schemaLink, schemaRequiredProperties, schemaTypeToDefaultValue, scrollToEl, scrollTop, searchFilterData, searchableTypes, siblingProperty, singleProperty, siteTooBig, siteTypeToIcon, sortProperties, sortedDates, strokeColor, strokeStyle, suggestMatchQuery, suggestQuery, takeAfterViewInit, termLocation, termLocationName, termProperties, termTypeLabel, toSnakeCase, toThousands, typeToNewProperty, typeaheadFocus, uncapitalize, uniqueDatesBetween, updateProperties, valueTypeToDefault, waitFor, wildcardQuery };
|
|
14261
14133
|
//# sourceMappingURL=hestia-earth-ui-components.mjs.map
|