@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, NgZone, ElementRef, Input, Directive, viewChild, Pipe, DestroyRef, HostListener, ViewEncapsulation, EventEmitter as EventEmitter$1, Output, ContentChild, ViewChild, viewChildren, forwardRef } from '@angular/core';
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/operators';
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, loadResourceKey } from '@hestia-earth/glossary';
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}`).toPromise().catch(handleAPIError);
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._zone.run(() => this.resize()));
1162
- }
1163
- /**
1164
- * The chart configuration.
1165
- * This is used to initialize the chart.
1166
- *
1167
- * @param configuration The chart configuration
1168
- */
1169
- set chartConfiguration(configuration) {
1170
- this._zone.runOutsideAngular(() => {
1171
- this.removeChart();
1172
- if (configuration) {
1173
- this._chart = new Chart(this._elementRef.nativeElement, configuration);
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: "14.0.0", version: "20.3.13", type: ChartConfigurationDirective, isStandalone: true, selector: "[chartConfiguration]", inputs: { chartConfiguration: "chartConfiguration", chartContainer: "chartContainer" }, exportAs: ["chart"], ngImport: i0 }); }
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
- label: `${excludedData.length} others`,
1498
- count: sum(excludedData.map(({ count }) => count)),
1499
- backgroundColor: excludedData[0].backgroundColor,
1500
- borderColor: excludedData[0].borderColor,
1501
- color: excludedData[0].color,
1502
- includedItems: excludedData
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.length ? includedItems.map(item => defaultTooltipFn(item)).join('</br>') : `${label}: ${count}`;
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.zone.run(() => this.observe(entries)));
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.ngZone.runOutsideAngular(() => {
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._shelfButtons = signal([], ...(ngDevMode ? [{ debugName: "_shelfButtons" }] : []));
3918
- this._defaultActiveButtonId = signal(null, ...(ngDevMode ? [{ debugName: "_defaultActiveButtonId" }] : []));
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.iconTemplate = null;
3923
- this.menuShown = new EventEmitter$1();
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._shelfButtons()
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 = null;
4092
- this._shelfButtons = signal([], ...(ngDevMode ? [{ debugName: "_shelfButtons" }] : []));
4093
- this._defaultActiveButtonId = signal(null, ...(ngDevMode ? [{ debugName: "_defaultActiveButtonId" }] : []));
4094
- this.menuOverlap = false;
4095
- this.closeMenuOnOutsideClick = false;
4096
- this.menuShown = new EventEmitter$1();
4097
- this.buttons = computed(() => this._shelfButtons()
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._shelfButtons()
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
- return this.buttons().filter(button => !button.position || button.position === 'top');
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", defaultActiveButtonId: "defaultActiveButtonId" }, outputs: { menuShown: "menuShown" }, queries: [{ propertyName: "iconTemplate", first: true, predicate: ["iconTemplate"], descendants: 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"] }] }); }
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
- this.ngZone.runOutsideAngular(() => {
4314
- fromEvent(document, 'click')
4315
- .pipe(takeUntilDestroyed(), tap(event => this.documentClick$.next(event)))
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.zone.runOutsideAngular(() => {
4338
- this.documentClickService.documentClick$
4339
- .pipe(skipUntil(skip$), takeUntilDestroyed(this.destroyRef), tap(event => {
4340
- if (!this.elementRef.nativeElement.contains(event.target)) {
4341
- this.zone.run(() => {
4342
- this.clickOutside.emit();
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$.pipe(take(1)).toPromise();
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$.pipe(take(1)).toPromise();
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), hasValue(v?.term) || hasValue(v?.key)].every(Boolean))
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
- return {
7490
- methodId,
7491
- model:
7492
- // handle "hestia.seed_emissions"
7493
- findMatchingModel(modelParams(node, !['backgroundData'].includes(subValue?.key), subValue?.modelKey)) ||
7494
- findMatchingModel(modelParams(node, !['backgroundData'].includes(subValue?.key))) ||
7495
- // handle background emissions
7496
- findMatchingModel({ modelKey: toSnakeCase(nodeType), model: methodId }) ||
7497
- // handle "liveAnimal"
7498
- (termType && findMatchingModel(modelKeyParams(node, termType))) ||
7499
- // handle "completeness.cropResidue"
7500
- (key ? findMatchingModel(modelKeyParams(node, `${methodId}.${key}`)) : undefined) ||
7501
- findMatchingModel(modelKeyParams(node, `${subValue?.key}.${methodId}`)) ||
7502
- // handle "input.price"
7503
- findMatchingModel(modelKeyParams(node, `${type?.toLowerCase()}.${subValue?.key}`)) ||
7504
- // handle "input.hestiaAggregatedData"
7505
- findMatchingModel(modelKeyParams(node, `${type?.toLowerCase()}.${methodId}`)) ||
7506
- // handle "transformation"
7507
- (subValue?.key ? findMatchingModel(modelKeyParams(node, subValue?.key)) : undefined) ||
7508
- // handle "transformation/input/excreta" and other models with "/"
7509
- (methodId.includes('/')
7510
- ? findMatchingModel({
7511
- model: methodId.split('/')[0],
7512
- modelKey: methodId.split('/').slice(1).join('.')
7513
- })
7514
- : undefined) ||
7515
- // handle "seed_emissions"
7516
- ([subValue?.id === 'seed', type === SchemaType.Emission].every(Boolean)
7517
- ? findMatchingModel({ model: methodId, modelKey: 'seed_emissions' })
7518
- : undefined) ||
7519
- findMatchingModel({ modelKey, model: methodId }) ||
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.&#64;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.&#64;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.&#64;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 the model name on the left to view the debugging logs.</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" }] }); }
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.&#64;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.&#64;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.&#64;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.&#64;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.&#64;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.&#64;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 the model name on the left to view the debugging logs.</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" }]
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.&#64;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.&#64;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.&#64;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.ngZone.run(() => this.message.set(data));
7741
+ this.message.set(data);
7864
7742
  }
7865
7743
  };
7866
- this.ngZone.runOutsideAngular(() => {
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 = loadResourceKey('inHestiaDefaultSystemBoundary.json', termId);
7985
- return !inSystemBoundary ? [isRecalculated, isRequired].some(Boolean) : `${inSystemBoundary}` === 'true';
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.isSystemBoundary = isSystemBoundary;
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('', ...(ngDevMode ? [{ debugName: "term" }] : []));
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&nbsp;</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&nbsp;</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&nbsp;</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&nbsp;</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.googleMap.fitBounds(polygonBounds(polygons));
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.googleMap.data.setStyle(() => ({ ...strokeStyle, strokeOpacity: 0.1 }));
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, zone }) => {
12447
+ const addTooltip = (selection, { tooltipOperator }) => {
12531
12448
  let hoveringTip = false;
12532
12449
  let hoveringNode = false;
12533
12450
  let lastNodeId;
12534
12451
  const closeTip = () => {
12535
- zone.run(() => tooltipOperator.close(false));
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
- zone.run(() => tooltipOperator.open({ tipData: generateTipData(nodeDatum) }));
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, zone }) => {
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, zone });
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
- .sort((a, b) => b.data.fraction - a.data.fraction)
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.ngZone.run(() => this.tooltipOperator().close(false));
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
- this.ngZone.run(() => this.tooltipOperator().close(false));
13015
- });
12887
+ .on('end', () => this.tooltipOperator().close(false)));
13016
12888
  });
13017
12889
  this.node
13018
- .call(mergedNodes, { tooltipOperator: this.tooltipOperator(), zone: this.ngZone })
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, localStorageSignal, 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 };
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