@hestia-earth/ui-components 0.41.56 → 0.41.57

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.
@@ -6,7 +6,7 @@ import { FormsModule, NG_VALUE_ACCESSOR, UntypedFormBuilder, Validators, Reactiv
6
6
  import { NgClass, DecimalPipe, NgTemplateOutlet, KeyValuePipe, DOCUMENT, PlatformLocation, NgStyle, UpperCasePipe, JsonPipe, DatePipe, AsyncPipe, formatDate as formatDate$1 } from '@angular/common';
7
7
  import * as i1$1 from '@ng-bootstrap/ng-bootstrap';
8
8
  import { NgbTooltip, NgbDropdown, NgbDropdownMenu, NgbDropdownToggle, NgbActiveModal, NgbHighlight, NgbModal, NgbDropdownItem, NgbTypeahead, NgbPopover, NgbTooltipModule, NgbDropdownModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap';
9
- import { ReplaySubject, of, mergeMap, shareReplay, delay, map, catchError, distinctUntilChanged, timer, take, first, Subject, combineLatest, filter, tap, pipe, fromEvent, startWith, merge, skip, switchMap, EMPTY, throttleTime, animationFrameScheduler, debounceTime, lastValueFrom, skipUntil, zip, mergeAll, reduce, forkJoin, throwError, from, firstValueFrom, toArray, distinct, groupBy } from 'rxjs';
9
+ import { ReplaySubject, of, mergeMap, shareReplay, delay, map, catchError, distinctUntilChanged, timer, take, first, Subject, combineLatest, filter, fromEvent, startWith, merge, skip, switchMap, EMPTY, throttleTime, animationFrameScheduler, debounceTime, takeUntil, lastValueFrom, tap, skipUntil, zip, mergeAll, reduce, forkJoin, throwError, from, firstValueFrom, toArray, distinct, groupBy } from 'rxjs';
10
10
  import { HttpClient } from '@angular/common/http';
11
11
  import get from 'lodash.get';
12
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, infrastructureTermTermType, managementTermTermType } from '@hestia-earth/schema';
@@ -23,8 +23,6 @@ import { models as models$1, loadConfig, getMaxStage } from '@hestia-earth/engin
23
23
  import { DeltaDisplayType, delta, customDeltaFuncs } from '@hestia-earth/utils/dist/delta';
24
24
  import { LocalStorageService } from 'ngx-webstorage';
25
25
  import { trigger, state, transition, style, animate } from '@angular/animations';
26
- import { signalStore, withState, withComputed, withMethods, patchState, withHooks } from '@ngrx/signals';
27
- import { rxMethod } from '@ngrx/signals/rxjs-interop';
28
26
  import { RouterLinkActive, RouterLink, ActivatedRoute } from '@angular/router';
29
27
  import { BreakpointObserver } from '@angular/cdk/layout';
30
28
  import { CdkScrollable } from '@angular/cdk/scrolling';
@@ -41,10 +39,10 @@ import annotationPlugin from 'chartjs-plugin-annotation';
41
39
  import { headersFromCsv, toCsv as toCsv$1, toJson, toCsvPivot, ErrorKeys } from '@hestia-earth/schema-convert';
42
40
  import { isCSVIncluded, isDefaultCSVSelected } from '@hestia-earth/json-schema/schema-utils';
43
41
  import { recommendedProperties, loadSchemas } from '@hestia-earth/json-schema';
44
- import set from 'lodash.set';
45
42
  import uniqBy from 'lodash.uniqby';
46
43
  import { ScrollStrategyOptions, CdkOverlayOrigin, CdkConnectedOverlay } from '@angular/cdk/overlay';
47
44
  import { ResizableDirective, ResizeHandleDirective } from 'angular-resizable-element';
45
+ import set from 'lodash.set';
48
46
  import * as semver from 'semver';
49
47
  import { parse } from 'papaparse';
50
48
  import omit from 'lodash.omit';
@@ -57,7 +55,6 @@ import { linkHorizontal } from 'd3-shape';
57
55
  import 'd3-transition';
58
56
  import { hierarchy, tree } from 'd3-hierarchy';
59
57
  import { easeElasticIn, easeElasticOut } from 'd3-ease';
60
- import { ComponentStore } from '@ngrx/component-store';
61
58
 
62
59
  class HeAuthService {
63
60
  set token(token) {
@@ -98,7 +95,7 @@ const handleAPIError = (err) => {
98
95
  try {
99
96
  error = parseErrorMessage(err);
100
97
  }
101
- catch (_err) {
98
+ catch {
102
99
  // ignore error
103
100
  }
104
101
  throw error;
@@ -136,7 +133,7 @@ const safeJSONParse = (value, defaultValue) => {
136
133
  try {
137
134
  return typeof value === 'string' ? JSON.parse(value) : value;
138
135
  }
139
- catch (_err) {
136
+ catch {
140
137
  return defaultValue;
141
138
  }
142
139
  };
@@ -542,7 +539,7 @@ const compoundToHtml = (value, termType) => !isTermTypeAllowed(termType) || igno
542
539
  class ControlValueAccessor {
543
540
  constructor() {
544
541
  // eslint-disable-next-line @typescript-eslint/no-empty-function
545
- this.onChange = (value) => { };
542
+ this.onChange = (_value) => { };
546
543
  // eslint-disable-next-line @typescript-eslint/no-empty-function
547
544
  this.onTouched = () => { };
548
545
  }
@@ -658,7 +655,7 @@ const parseLine = (text) => {
658
655
  try {
659
656
  return JSON.parse(text);
660
657
  }
661
- catch (_err) {
658
+ catch {
662
659
  return { level: Level.debug };
663
660
  }
664
661
  };
@@ -810,7 +807,7 @@ const coordinatesToPoint = (values) => {
810
807
  ? null
811
808
  : new google.maps.LatLng(values[1], values[0]);
812
809
  }
813
- catch (_err) {
810
+ catch {
814
811
  return null;
815
812
  }
816
813
  };
@@ -1928,94 +1925,6 @@ const ANIMATIONS = [
1928
1925
  ])
1929
1926
  ];
1930
1927
 
1931
- const initialResizeEvent = {
1932
- isResizing: false,
1933
- startingCursorX: 0,
1934
- startingWidth: 0,
1935
- newWidth: 0
1936
- };
1937
- const initialState = {
1938
- minWidth: 250,
1939
- maxWidth: 600,
1940
- width: 256,
1941
- expanded: true,
1942
- side: 'left',
1943
- resizeEvent: initialResizeEvent,
1944
- contentContainerSpacing: 0,
1945
- // 20px handle size + padding
1946
- minMenuDistance: 20 + 16
1947
- };
1948
- const sidenavStore = signalStore(withState(initialState), withComputed(({ minWidth, width, maxWidth }) => ({
1949
- sidenavWidth: computed(() => Math.min(Math.max(width(), minWidth()), maxWidth()))
1950
- })), withMethods(store => ({
1951
- setExpanded: rxMethod(pipe(tap((expanded) => patchState(store, { expanded })))),
1952
- setSide: rxMethod(pipe(tap((side) => patchState(store, { side })))),
1953
- setMinMenuDistance: rxMethod(pipe(tap((minMenuDistance) => patchState(store, { minMenuDistance })))),
1954
- setMinWidth: rxMethod(pipe(tap((minWidth) => patchState(store, { minWidth })))),
1955
- setMaxWidth: rxMethod(pipe(tap((maxWidth) => patchState(store, { maxWidth })))),
1956
- setWidth: rxMethod(pipe(tap((width) => patchState(store, { width })))),
1957
- setSidenavWidthCss: rxMethod(pipe(tap(({ position, width }) => document.body.style.setProperty(`--sidenav-${position}-width`, `${width}px`)))),
1958
- setContentTransformCss: rxMethod(pipe(tap(({ expanded, position, value }) => {
1959
- document.body.style.setProperty(`--content-transition-${position}-x`, `${expanded ? value : 0}px`);
1960
- }))),
1961
- setContentContainerSpacing: rxMethod(pipe(tap((contentContainerSpacing) => patchState(store, { contentContainerSpacing })))),
1962
- startResizing: (event) => patchState(store, {
1963
- resizeEvent: {
1964
- isResizing: true,
1965
- startingCursorX: event instanceof MouseEvent ? event.clientX : event.touches[0].clientX,
1966
- startingWidth: store.sidenavWidth(),
1967
- newWidth: store.sidenavWidth()
1968
- }
1969
- }),
1970
- updateResizing: rxMethod(tap((clientX) => {
1971
- const resizeEvent = store.resizeEvent();
1972
- // No need to even continue if we're not resizing
1973
- if (!resizeEvent.isResizing) {
1974
- return;
1975
- }
1976
- // 1. Calculate how much mouse has moved on the x-axis
1977
- const cursorDeltaX = clientX - resizeEvent.startingCursorX;
1978
- // 2. Calculate the new width according to initial width and mouse movement
1979
- const newWidth = resizeEvent.startingWidth - (store.side() === 'left' ? -1 : 1) * cursorDeltaX;
1980
- patchState(store, state => ({
1981
- ...state,
1982
- resizeEvent: {
1983
- ...state.resizeEvent,
1984
- newWidth
1985
- },
1986
- width: newWidth
1987
- }));
1988
- })),
1989
- stopResizing: () => patchState(store, {
1990
- resizeEvent: {
1991
- ...store.resizeEvent(),
1992
- isResizing: false
1993
- }
1994
- })
1995
- })), withComputed(({ sidenavWidth, minMenuDistance, contentContainerSpacing }) => ({
1996
- overlappingDistance: computed(() => sidenavWidth() + minMenuDistance() - contentContainerSpacing())
1997
- })), withComputed(({ overlappingDistance }) => ({
1998
- isMenuOverlapping: computed(() => overlappingDistance() > 0)
1999
- })), withComputed(({ resizeEvent, overlappingDistance, isMenuOverlapping }) => ({
2000
- hasMenuWidthChanged: computed(() => resizeEvent().startingWidth !== resizeEvent().newWidth),
2001
- isResizing: computed(() => resizeEvent().isResizing),
2002
- contentContainerTransform: computed(() => (isMenuOverlapping() ? overlappingDistance() : 0))
2003
- })), withHooks(({ sidenavWidth, setSidenavWidthCss, setContentTransformCss, side, expanded, contentContainerTransform }) => ({
2004
- onInit: () => {
2005
- const contentTransform = computed(() => ({
2006
- expanded: expanded(),
2007
- position: side(),
2008
- value: contentContainerTransform()
2009
- }), ...(ngDevMode ? [{ debugName: "contentTransform" }] : []));
2010
- setContentTransformCss(contentTransform);
2011
- const width = computed(() => ({
2012
- width: sidenavWidth(),
2013
- position: side()
2014
- }), ...(ngDevMode ? [{ debugName: "width" }] : []));
2015
- setSidenavWidthCss(width);
2016
- }
2017
- })));
2018
-
2019
1928
  const isCollapsible$1 = (link) => !!link.links?.length;
2020
1929
  const primaryLinkExpandable = (link) => isCollapsible$1(link) && !link.icon;
2021
1930
  const toggleLink = ($event, link) => {
@@ -2163,10 +2072,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
2163
2072
  }] });
2164
2073
 
2165
2074
  const storageKey$2 = 'he-drawer-container';
2075
+ const initialState = {
2076
+ minWidth: 250,
2077
+ maxWidth: 600,
2078
+ width: 256,
2079
+ expanded: true,
2080
+ side: 'left',
2081
+ minMenuDistance: 20 + 16
2082
+ };
2166
2083
  const moveEvent = () => merge(fromEvent(window, 'mousemove').pipe(map(event => event.clientX)), fromEvent(window, 'touchmove', { passive: false }).pipe(map(event => event.touches[0].clientX)));
2167
2084
  class DrawerContainerComponent {
2168
2085
  constructor() {
2169
- this.sidenavStore = inject(sidenavStore);
2170
2086
  this.responsiveService = inject(ResponsiveService);
2171
2087
  this.localStorage = inject(LocalStorageService);
2172
2088
  this.contentContainer = viewChild('contentContainer', { ...(ngDevMode ? { debugName: "contentContainer" } : {}), read: ElementRef });
@@ -2234,8 +2150,22 @@ class DrawerContainerComponent {
2234
2150
  ].some(Boolean), ...(ngDevMode ? [{ debugName: "visible" }] : []));
2235
2151
  this.isCompact = toSignal(toObservable(this.compactBreakpoint).pipe(switchMap(breakpoint => this.responsiveService.isAboveBreakpoint$(breakpoint).pipe(map(isAboveBreakpoint => !isAboveBreakpoint)))));
2236
2152
  this.hostClass = computed(() => ['is-flex', this.isCompact() ? 'is-flex-direction-column' : '', this.resizable() ? 'is-resizable' : ''].join(' '), ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
2237
- this.isHoldingToggle = this.sidenavStore.isResizing;
2238
- this._updateSidenavEvent$ = toObservable(this.sidenavStore.isResizing).pipe(switchMap(listen => (listen ? moveEvent() : EMPTY)), throttleTime(0, animationFrameScheduler));
2153
+ this.resizeEvent = signal({
2154
+ isResizing: false,
2155
+ startingCursorX: 0,
2156
+ startingWidth: 0,
2157
+ newWidth: 0
2158
+ }, ...(ngDevMode ? [{ debugName: "resizeEvent" }] : []));
2159
+ this.contentContainerSpacing = signal(0, ...(ngDevMode ? [{ debugName: "contentContainerSpacing" }] : []));
2160
+ this.sidenavWidth = computed(() => Math.min(Math.max(this.width(), this.min()), this.max()), ...(ngDevMode ? [{ debugName: "sidenavWidth" }] : []));
2161
+ this.overlappingDistance = computed(() => this.sidenavWidth() + this.minMenuDistance() - this.contentContainerSpacing(), ...(ngDevMode ? [{ debugName: "overlappingDistance" }] : []));
2162
+ this.isMenuOverlapping = computed(() => this.overlappingDistance() > 0, ...(ngDevMode ? [{ debugName: "isMenuOverlapping" }] : []));
2163
+ this.hasMenuWidthChanged = computed(() => this.resizeEvent().startingWidth !== this.resizeEvent().newWidth, ...(ngDevMode ? [{ debugName: "hasMenuWidthChanged" }] : []));
2164
+ this.isResizing = computed(() => this.resizeEvent().isResizing, ...(ngDevMode ? [{ debugName: "isResizing" }] : []));
2165
+ this.contentContainerTransform = computed(() => (this.isMenuOverlapping() ? this.overlappingDistance() : 0), ...(ngDevMode ? [{ debugName: "contentContainerTransform" }] : []));
2166
+ this.isHoldingToggle = this.isResizing;
2167
+ this.destroy$ = new Subject();
2168
+ this._updateSidenavEvent$ = toObservable(this.isResizing).pipe(switchMap(listen => (listen ? moveEvent() : EMPTY)), throttleTime(0, animationFrameScheduler));
2239
2169
  this._contentContainer$ = toObservable(this.contentContainer).pipe(filter(v => !!v));
2240
2170
  this._hostComponentWidth$ = fromEvent(window, 'resize').pipe(startWith(window.innerWidth));
2241
2171
  /**
@@ -2252,14 +2182,21 @@ class DrawerContainerComponent {
2252
2182
  this.storedConfiguration = signal({}, ...(ngDevMode ? [{ debugName: "storedConfiguration" }] : []));
2253
2183
  this.storedWith = computed(() => this.storedConfiguration()?.width || 0, ...(ngDevMode ? [{ debugName: "storedWith" }] : []));
2254
2184
  this.storedExpanded = computed(() => this.storedConfiguration()?.expanded, ...(ngDevMode ? [{ debugName: "storedExpanded" }] : []));
2255
- this.sidenavStore.setSide(this.position);
2256
- this.sidenavStore.setMinWidth(this.min);
2257
- this.sidenavStore.setMaxWidth(this.max);
2258
- this.sidenavStore.setWidth(this.width);
2259
- this.sidenavStore.updateResizing(this._updateSidenavEvent$);
2260
- this.sidenavStore.setContentContainerSpacing(this._contentContainerPadding$);
2261
- this.sidenavStore.setExpanded(this.expanded);
2262
- this.sidenavStore.setMinMenuDistance(this.minMenuDistance);
2185
+ this._updateSidenavEvent$.pipe(takeUntil(this.destroy$)).subscribe(clientX => this.updateResizing(clientX));
2186
+ this._contentContainerPadding$
2187
+ .pipe(takeUntil(this.destroy$))
2188
+ .subscribe(spacing => this.contentContainerSpacing.set(spacing));
2189
+ effect(() => {
2190
+ const position = this.position();
2191
+ const width = this.sidenavWidth();
2192
+ document.body.style.setProperty(`--sidenav-${position}-width`, `${width}px`);
2193
+ });
2194
+ effect(() => {
2195
+ const expanded = this.expanded();
2196
+ const position = this.position();
2197
+ const value = this.contentContainerTransform();
2198
+ document.body.style.setProperty(`--content-transition-${position}-x`, `${expanded ? value : 0}px`);
2199
+ });
2263
2200
  // initial load of configuration
2264
2201
  effect(() => this.storageKey() && this.storeConfiguration());
2265
2202
  effect(() => {
@@ -2278,6 +2215,10 @@ class DrawerContainerComponent {
2278
2215
  }
2279
2216
  });
2280
2217
  }
2218
+ ngOnDestroy() {
2219
+ this.destroy$.next();
2220
+ this.destroy$.complete();
2221
+ }
2281
2222
  storeConfiguration(config = {}) {
2282
2223
  const storedConfig = JSON.parse(this.localStorage.retrieve(this.storageKey()) || '{}');
2283
2224
  const newConfig = { ...storedConfig, ...config };
@@ -2285,11 +2226,34 @@ class DrawerContainerComponent {
2285
2226
  this.storedConfiguration.set(newConfig);
2286
2227
  }
2287
2228
  startResizing(event) {
2288
- this.resizable() && this.sidenavStore.startResizing(event);
2229
+ if (!this.resizable())
2230
+ return;
2231
+ this.resizeEvent.set({
2232
+ isResizing: true,
2233
+ startingCursorX: event instanceof MouseEvent ? event.clientX : event.touches[0].clientX,
2234
+ startingWidth: this.sidenavWidth(),
2235
+ newWidth: this.sidenavWidth()
2236
+ });
2237
+ }
2238
+ updateResizing(clientX) {
2239
+ const resizeEvent = this.resizeEvent();
2240
+ if (!resizeEvent.isResizing) {
2241
+ return;
2242
+ }
2243
+ const cursorDeltaX = clientX - resizeEvent.startingCursorX;
2244
+ const newWidth = resizeEvent.startingWidth - (this.position() === 'left' ? -1 : 1) * cursorDeltaX;
2245
+ this.resizeEvent.update(state => ({
2246
+ ...state,
2247
+ newWidth
2248
+ }));
2249
+ this.width.set(newWidth);
2289
2250
  }
2290
2251
  stopResizing() {
2291
- this.sidenavStore.stopResizing();
2292
- this.storageKey() && this.storeConfiguration({ width: this.sidenavStore.width() });
2252
+ this.resizeEvent.update(state => ({
2253
+ ...state,
2254
+ isResizing: false
2255
+ }));
2256
+ this.storageKey() && this.storeConfiguration({ width: this.width() });
2293
2257
  }
2294
2258
  toggleIcon() {
2295
2259
  return (this.expanded() && this.position() === 'left') || (!this.expanded() && this.position() === 'right')
@@ -2297,7 +2261,7 @@ class DrawerContainerComponent {
2297
2261
  : 'chevron-double-right';
2298
2262
  }
2299
2263
  toggleMenu() {
2300
- if (this.sidenavStore.hasMenuWidthChanged() && this.expanded())
2264
+ if (this.hasMenuWidthChanged() && this.expanded())
2301
2265
  return;
2302
2266
  const expanded = !this.expanded();
2303
2267
  this.expanded.set(expanded);
@@ -2315,7 +2279,7 @@ class DrawerContainerComponent {
2315
2279
  return parseInt(padding, 10) + parseInt(margin, 10);
2316
2280
  }
2317
2281
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DrawerContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2318
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: DrawerContainerComponent, isStandalone: true, selector: "he-drawer-container", inputs: { expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, compactBreakpoint: { classPropertyName: "compactBreakpoint", publicName: "compactBreakpoint", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, contentStyles: { classPropertyName: "contentStyles", publicName: "contentStyles", isSignal: true, isRequired: false, transformFunction: null }, contentPaddingStyles: { classPropertyName: "contentPaddingStyles", publicName: "contentPaddingStyles", isSignal: true, isRequired: false, transformFunction: null }, menuOverlap: { classPropertyName: "menuOverlap", publicName: "menuOverlap", isSignal: true, isRequired: false, transformFunction: null }, links: { classPropertyName: "links", publicName: "links", isSignal: true, isRequired: false, transformFunction: null }, secondaryLinks: { classPropertyName: "secondaryLinks", publicName: "secondaryLinks", isSignal: true, isRequired: false, transformFunction: null }, drawerHeaderTemplate: { classPropertyName: "drawerHeaderTemplate", publicName: "drawerHeaderTemplate", isSignal: true, isRequired: false, transformFunction: null }, drawerContentTemplate: { classPropertyName: "drawerContentTemplate", publicName: "drawerContentTemplate", isSignal: true, isRequired: false, transformFunction: null }, drawerFooterTemplate: { classPropertyName: "drawerFooterTemplate", publicName: "drawerFooterTemplate", isSignal: true, isRequired: false, transformFunction: null }, drawerMenuHeaderTemplate: { classPropertyName: "drawerMenuHeaderTemplate", publicName: "drawerMenuHeaderTemplate", isSignal: true, isRequired: false, transformFunction: null }, drawerMenuFooterTemplate: { classPropertyName: "drawerMenuFooterTemplate", publicName: "drawerMenuFooterTemplate", isSignal: true, isRequired: false, transformFunction: null }, compactMenuLabel: { classPropertyName: "compactMenuLabel", publicName: "compactMenuLabel", isSignal: true, isRequired: false, transformFunction: null }, compactHeaderClass: { classPropertyName: "compactHeaderClass", publicName: "compactHeaderClass", isSignal: true, isRequired: false, transformFunction: null }, compactMenuHeaderClass: { classPropertyName: "compactMenuHeaderClass", publicName: "compactMenuHeaderClass", isSignal: true, isRequired: false, transformFunction: null }, minMenuDistance: { classPropertyName: "minMenuDistance", publicName: "minMenuDistance", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expanded: "expandedChange", width: "widthChange", opened: "opened", closed: "closed" }, host: { listeners: { "window:mouseup": "stopResizing()", "window:touchend": "stopResizing()", "window:touchcancel": "stopResizing()" }, properties: { "class": "hostClass()", "attr.drawer-position": "position()", "attr.drawer-state": "menuState()" } }, providers: [sidenavStore], viewQueries: [{ propertyName: "contentContainer", first: true, predicate: ["contentContainer"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "@if (visible()) {\n @if (isCompact()) {\n <div class=\"compact-header\">\n <div [ngClass]=\"compactHeaderClass()\">\n <div class=\"is-flex is-align-items-center is-justify-content-space-between is-gap-8 w-100\">\n @if (drawerHeaderTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerHeaderTemplate()\" />\n }\n @if (links()?.length > 0) {\n <div\n ngbDropdown\n #optionDd=\"ngbDropdown\"\n container=\"body\"\n placement=\"bottom-end\"\n [dropdownClass]=\"compactMenuHeaderClass()\">\n <button\n ngbDropdownToggle\n class=\"button is-small is-no-shadow is-block has-text-weight-bold has-text-secondary is-size-6 is-py-1 is-px-2 is-radius-3 is-gap-4 | compact-header--btn\"\n aria-controls=\"drawer-menu\"\n type=\"button\">\n <span>{{ compactMenuLabel() }}</span>\n <he-svg-icon\n class=\"compact-header--btn__icon\"\n [name]=\"optionDd.isOpen() ? 'chevron-up' : 'chevron-down'\"\n aria-hidden=\"true\" />\n </button>\n\n <div ngbDropdownMenu id=\"drawer-menu\">\n <div class=\"dropdown-content navigation-menu-dropdown\">\n <he-navigation-menu (closed)=\"optionDd.close()\" [links]=\"links()\" [secondaryLinks]=\"secondaryLinks()\">\n @if (drawerMenuHeaderTemplate()) {\n <ng-container header [ngTemplateOutlet]=\"drawerMenuHeaderTemplate()\" />\n }\n @if (drawerMenuFooterTemplate()) {\n <ng-container footer [ngTemplateOutlet]=\"drawerMenuFooterTemplate()\" />\n }\n </he-navigation-menu>\n </div>\n </div>\n </div>\n }\n @if (drawerFooterTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerFooterTemplate()\" />\n }\n </div>\n </div>\n </div>\n } @else {\n <aside>\n <div\n class=\"is-absolute h-100 shadow-2 has-background-white | shell__menuContent\"\n [class.is-pr-3]=\"position() === 'right'\"\n (@sideMenu.done)=\"animationDone($event)\"\n [@sideMenu]=\"expanded() ? 'full' : 'hidden'\">\n <div\n class=\"h-100 is-overflow-y-auto\"\n [class.is-py-4]=\"!drawerContentTemplate()\"\n [class.is-px-2]=\"!drawerContentTemplate()\">\n @if (drawerHeaderTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerHeaderTemplate()\" />\n }\n @if (drawerContentTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerContentTemplate()\" />\n }\n @if (links()?.length > 0) {\n <he-navigation-menu [links]=\"links()\" [secondaryLinks]=\"secondaryLinks()\">\n @if (drawerMenuHeaderTemplate()) {\n <ng-container header [ngTemplateOutlet]=\"drawerMenuHeaderTemplate()\" />\n }\n @if (drawerMenuFooterTemplate()) {\n <ng-container footer [ngTemplateOutlet]=\"drawerMenuFooterTemplate()\" />\n }\n </he-navigation-menu>\n }\n @if (drawerFooterTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerFooterTemplate()\" />\n }\n </div>\n @if (collapsible()) {\n <button\n (click)=\"toggleMenu()\"\n (mousedown)=\"startResizing($event)\"\n (touchstart)=\"startResizing($event)\"\n class=\"is-absolute is-overflow-hidden is-flex is-justify-content-center is-align-items-center | shell__menuContent--toggle\"\n pointer>\n <he-svg-icon [name]=\"resizable() ? 'drag' : toggleIcon()\" size=\"20\" />\n </button>\n }\n </div>\n </aside>\n }\n}\n\n<div [class.is-resizing]=\"isHoldingToggle()\" class=\"shell__content | h-100 w-100 is-flex\">\n <div class=\"shell__content--body | w-100\" [@reduceWidth]=\"reduceAnimation()\">\n <div #contentContainer class=\"w-100 h-100\" [style]=\"contentStyles()\" [className]=\"contentPaddingStyles()\">\n <ng-content select=\"[drawer-content]\" />\n </div>\n </div>\n</div>\n", styles: ["::ng-deep :root{--drawer-toggle-position: -20px;--sidenav-left-width: 256px;--sidenav-right-width: 256px;--content-transition-left-x: 0;--content-transition-right-x: 0}:host-context[drawer-position=left]{--sidenav-side-transform: 1;--sidenav-width: var(--sidenav-left-width);--content-transition-x: var(--content-transition-left-x);--menu-transition-transform: -1}:host-context[drawer-position=left]>aside{left:0}:host-context[drawer-position=left]>aside>.shell__menuContent{left:0}:host-context[drawer-position=left]>aside>.shell__menuContent>.shell__menuContent--toggle{right:var(--drawer-toggle-position);border-radius:0 9px 9px 0}:host-context[drawer-position=right]{--sidenav-side-transform: 0;--sidenav-width: var(--sidenav-right-width);--content-transition-x: var(--content-transition-right-x);--menu-transition-transform: 1}:host-context[drawer-position=right]>aside{right:0;order:1}:host-context[drawer-position=right]>aside>.shell__menuContent{right:0}:host-context[drawer-position=right]>aside>.shell__menuContent>.shell__menuContent--toggle{left:var(--drawer-toggle-position);border-radius:9px 0 0 9px}:host{position:relative;max-height:100%;display:flex;justify-content:space-between}:host aside{position:sticky;top:var(--navbar-height);z-index:10;height:calc(100vh - var(--navbar-height))}:host aside .shell__menuContent{top:0;width:var(--sidenav-width)}:host aside .shell__menuContent--toggle{top:calc(50% - 24px);background:#dbe3ea;border:none;width:20px;height:48px}:host aside ::ng-deep he-collapsible-box{box-shadow:none;padding:4px!important}@media screen and (max-width:1023px){:host aside ::ng-deep he-collapsible-box{background-color:transparent}}:host aside ::ng-deep he-collapsible-box>div{gap:16px!important}:host aside ::ng-deep he-collapsible-box .dropdown-content{box-shadow:none}:host aside ::ng-deep he-collapsible-box .dropdown-item+.dropdown-item{border-top:1px solid #b5b5b5}:host aside ::ng-deep he-collapsible-box .navbar-divider{background-color:#b5b5b5;margin:0}:host.is-resizable .shell__menuContent--toggle:active{cursor:col-resize}.shell__content--body{container-type:inline-size;transition:none}.shell__content:not(.is-resizing) .shell__content--body{transition:transform .3s ease-in-out,width .3s ease-in-out}.navigation-menu-dropdown{padding:.5rem 1rem;width:300px}@media screen and (max-width:767px){.navigation-menu-dropdown{width:calc(100dvw - 3rem)}}.compact-header{position:sticky;top:calc(var(--navbar-height));z-index:10}@media screen and (max-width:767px){.compact-header{top:0}}.compact-header--btn{background:#dbe3ea}he-navigation-menu ::ng-deep .menu{width:100%!important;min-width:100%!important;max-width:100%!important}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "component", type: NavigationMenuComponent, selector: "he-navigation-menu", inputs: ["links", "secondaryLinks", "sticky", "collapsible", "routerLinkMatchOptions"], outputs: ["closed"] }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation"] }], animations: ANIMATIONS, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2282
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: DrawerContainerComponent, isStandalone: true, selector: "he-drawer-container", inputs: { expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, compactBreakpoint: { classPropertyName: "compactBreakpoint", publicName: "compactBreakpoint", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, contentStyles: { classPropertyName: "contentStyles", publicName: "contentStyles", isSignal: true, isRequired: false, transformFunction: null }, contentPaddingStyles: { classPropertyName: "contentPaddingStyles", publicName: "contentPaddingStyles", isSignal: true, isRequired: false, transformFunction: null }, menuOverlap: { classPropertyName: "menuOverlap", publicName: "menuOverlap", isSignal: true, isRequired: false, transformFunction: null }, links: { classPropertyName: "links", publicName: "links", isSignal: true, isRequired: false, transformFunction: null }, secondaryLinks: { classPropertyName: "secondaryLinks", publicName: "secondaryLinks", isSignal: true, isRequired: false, transformFunction: null }, drawerHeaderTemplate: { classPropertyName: "drawerHeaderTemplate", publicName: "drawerHeaderTemplate", isSignal: true, isRequired: false, transformFunction: null }, drawerContentTemplate: { classPropertyName: "drawerContentTemplate", publicName: "drawerContentTemplate", isSignal: true, isRequired: false, transformFunction: null }, drawerFooterTemplate: { classPropertyName: "drawerFooterTemplate", publicName: "drawerFooterTemplate", isSignal: true, isRequired: false, transformFunction: null }, drawerMenuHeaderTemplate: { classPropertyName: "drawerMenuHeaderTemplate", publicName: "drawerMenuHeaderTemplate", isSignal: true, isRequired: false, transformFunction: null }, drawerMenuFooterTemplate: { classPropertyName: "drawerMenuFooterTemplate", publicName: "drawerMenuFooterTemplate", isSignal: true, isRequired: false, transformFunction: null }, compactMenuLabel: { classPropertyName: "compactMenuLabel", publicName: "compactMenuLabel", isSignal: true, isRequired: false, transformFunction: null }, compactHeaderClass: { classPropertyName: "compactHeaderClass", publicName: "compactHeaderClass", isSignal: true, isRequired: false, transformFunction: null }, compactMenuHeaderClass: { classPropertyName: "compactMenuHeaderClass", publicName: "compactMenuHeaderClass", isSignal: true, isRequired: false, transformFunction: null }, minMenuDistance: { classPropertyName: "minMenuDistance", publicName: "minMenuDistance", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expanded: "expandedChange", width: "widthChange", opened: "opened", closed: "closed" }, host: { listeners: { "window:mouseup": "stopResizing()", "window:touchend": "stopResizing()", "window:touchcancel": "stopResizing()" }, properties: { "class": "hostClass()", "attr.drawer-position": "position()", "attr.drawer-state": "menuState()" } }, viewQueries: [{ propertyName: "contentContainer", first: true, predicate: ["contentContainer"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "@if (visible()) {\n @if (isCompact()) {\n <div class=\"compact-header\">\n <div [ngClass]=\"compactHeaderClass()\">\n <div class=\"is-flex is-align-items-center is-justify-content-space-between is-gap-8 w-100\">\n @if (drawerHeaderTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerHeaderTemplate()\" />\n }\n @if (links()?.length > 0) {\n <div\n ngbDropdown\n #optionDd=\"ngbDropdown\"\n container=\"body\"\n placement=\"bottom-end\"\n [dropdownClass]=\"compactMenuHeaderClass()\">\n <button\n ngbDropdownToggle\n class=\"button is-small is-no-shadow is-block has-text-weight-bold has-text-secondary is-size-6 is-py-1 is-px-2 is-radius-3 is-gap-4 | compact-header--btn\"\n aria-controls=\"drawer-menu\"\n type=\"button\">\n <span>{{ compactMenuLabel() }}</span>\n <he-svg-icon\n class=\"compact-header--btn__icon\"\n [name]=\"optionDd.isOpen() ? 'chevron-up' : 'chevron-down'\"\n aria-hidden=\"true\" />\n </button>\n\n <div ngbDropdownMenu id=\"drawer-menu\">\n <div class=\"dropdown-content navigation-menu-dropdown\">\n <he-navigation-menu (closed)=\"optionDd.close()\" [links]=\"links()\" [secondaryLinks]=\"secondaryLinks()\">\n @if (drawerMenuHeaderTemplate()) {\n <ng-container header [ngTemplateOutlet]=\"drawerMenuHeaderTemplate()\" />\n }\n @if (drawerMenuFooterTemplate()) {\n <ng-container footer [ngTemplateOutlet]=\"drawerMenuFooterTemplate()\" />\n }\n </he-navigation-menu>\n </div>\n </div>\n </div>\n }\n @if (drawerFooterTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerFooterTemplate()\" />\n }\n </div>\n </div>\n </div>\n } @else {\n <aside>\n <div\n class=\"is-absolute h-100 shadow-2 has-background-white | shell__menuContent\"\n [class.is-pr-3]=\"position() === 'right'\"\n (@sideMenu.done)=\"animationDone($event)\"\n [@sideMenu]=\"expanded() ? 'full' : 'hidden'\">\n <div\n class=\"h-100 is-overflow-y-auto\"\n [class.is-py-4]=\"!drawerContentTemplate()\"\n [class.is-px-2]=\"!drawerContentTemplate()\">\n @if (drawerHeaderTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerHeaderTemplate()\" />\n }\n @if (drawerContentTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerContentTemplate()\" />\n }\n @if (links()?.length > 0) {\n <he-navigation-menu [links]=\"links()\" [secondaryLinks]=\"secondaryLinks()\">\n @if (drawerMenuHeaderTemplate()) {\n <ng-container header [ngTemplateOutlet]=\"drawerMenuHeaderTemplate()\" />\n }\n @if (drawerMenuFooterTemplate()) {\n <ng-container footer [ngTemplateOutlet]=\"drawerMenuFooterTemplate()\" />\n }\n </he-navigation-menu>\n }\n @if (drawerFooterTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerFooterTemplate()\" />\n }\n </div>\n @if (collapsible()) {\n <button\n (click)=\"toggleMenu()\"\n (mousedown)=\"startResizing($event)\"\n (touchstart)=\"startResizing($event)\"\n class=\"is-absolute is-overflow-hidden is-flex is-justify-content-center is-align-items-center | shell__menuContent--toggle\"\n pointer>\n <he-svg-icon [name]=\"resizable() ? 'drag' : toggleIcon()\" size=\"20\" />\n </button>\n }\n </div>\n </aside>\n }\n}\n\n<div [class.is-resizing]=\"isHoldingToggle()\" class=\"shell__content | h-100 w-100 is-flex\">\n <div class=\"shell__content--body | w-100\" [@reduceWidth]=\"reduceAnimation()\">\n <div #contentContainer class=\"w-100 h-100\" [style]=\"contentStyles()\" [className]=\"contentPaddingStyles()\">\n <ng-content select=\"[drawer-content]\" />\n </div>\n </div>\n</div>\n", styles: ["::ng-deep :root{--drawer-toggle-position: -20px;--sidenav-left-width: 256px;--sidenav-right-width: 256px;--content-transition-left-x: 0;--content-transition-right-x: 0}:host-context[drawer-position=left]{--sidenav-side-transform: 1;--sidenav-width: var(--sidenav-left-width);--content-transition-x: var(--content-transition-left-x);--menu-transition-transform: -1}:host-context[drawer-position=left]>aside{left:0}:host-context[drawer-position=left]>aside>.shell__menuContent{left:0}:host-context[drawer-position=left]>aside>.shell__menuContent>.shell__menuContent--toggle{right:var(--drawer-toggle-position);border-radius:0 9px 9px 0}:host-context[drawer-position=right]{--sidenav-side-transform: 0;--sidenav-width: var(--sidenav-right-width);--content-transition-x: var(--content-transition-right-x);--menu-transition-transform: 1}:host-context[drawer-position=right]>aside{right:0;order:1}:host-context[drawer-position=right]>aside>.shell__menuContent{right:0}:host-context[drawer-position=right]>aside>.shell__menuContent>.shell__menuContent--toggle{left:var(--drawer-toggle-position);border-radius:9px 0 0 9px}:host{position:relative;max-height:100%;display:flex;justify-content:space-between}:host aside{position:sticky;top:var(--navbar-height);z-index:10;height:calc(100vh - var(--navbar-height))}:host aside .shell__menuContent{top:0;width:var(--sidenav-width)}:host aside .shell__menuContent--toggle{top:calc(50% - 24px);background:#dbe3ea;border:none;width:20px;height:48px}:host aside ::ng-deep he-collapsible-box{box-shadow:none;padding:4px!important}@media screen and (max-width:1023px){:host aside ::ng-deep he-collapsible-box{background-color:transparent}}:host aside ::ng-deep he-collapsible-box>div{gap:16px!important}:host aside ::ng-deep he-collapsible-box .dropdown-content{box-shadow:none}:host aside ::ng-deep he-collapsible-box .dropdown-item+.dropdown-item{border-top:1px solid #b5b5b5}:host aside ::ng-deep he-collapsible-box .navbar-divider{background-color:#b5b5b5;margin:0}:host.is-resizable .shell__menuContent--toggle:active{cursor:col-resize}.shell__content--body{container-type:inline-size;transition:none}.shell__content:not(.is-resizing) .shell__content--body{transition:transform .3s ease-in-out,width .3s ease-in-out}.navigation-menu-dropdown{padding:.5rem 1rem;width:300px}@media screen and (max-width:767px){.navigation-menu-dropdown{width:calc(100dvw - 3rem)}}.compact-header{position:sticky;top:calc(var(--navbar-height));z-index:10}@media screen and (max-width:767px){.compact-header{top:0}}.compact-header--btn{background:#dbe3ea}he-navigation-menu ::ng-deep .menu{width:100%!important;min-width:100%!important;max-width:100%!important}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "component", type: NavigationMenuComponent, selector: "he-navigation-menu", inputs: ["links", "secondaryLinks", "sticky", "collapsible", "routerLinkMatchOptions"], outputs: ["closed"] }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation"] }], animations: ANIMATIONS, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2319
2283
  }
2320
2284
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: DrawerContainerComponent, decorators: [{
2321
2285
  type: Component$1,
@@ -2332,7 +2296,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
2332
2296
  '[class]': 'hostClass()',
2333
2297
  '[attr.drawer-position]': 'position()',
2334
2298
  '[attr.drawer-state]': 'menuState()'
2335
- }, providers: [sidenavStore], template: "@if (visible()) {\n @if (isCompact()) {\n <div class=\"compact-header\">\n <div [ngClass]=\"compactHeaderClass()\">\n <div class=\"is-flex is-align-items-center is-justify-content-space-between is-gap-8 w-100\">\n @if (drawerHeaderTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerHeaderTemplate()\" />\n }\n @if (links()?.length > 0) {\n <div\n ngbDropdown\n #optionDd=\"ngbDropdown\"\n container=\"body\"\n placement=\"bottom-end\"\n [dropdownClass]=\"compactMenuHeaderClass()\">\n <button\n ngbDropdownToggle\n class=\"button is-small is-no-shadow is-block has-text-weight-bold has-text-secondary is-size-6 is-py-1 is-px-2 is-radius-3 is-gap-4 | compact-header--btn\"\n aria-controls=\"drawer-menu\"\n type=\"button\">\n <span>{{ compactMenuLabel() }}</span>\n <he-svg-icon\n class=\"compact-header--btn__icon\"\n [name]=\"optionDd.isOpen() ? 'chevron-up' : 'chevron-down'\"\n aria-hidden=\"true\" />\n </button>\n\n <div ngbDropdownMenu id=\"drawer-menu\">\n <div class=\"dropdown-content navigation-menu-dropdown\">\n <he-navigation-menu (closed)=\"optionDd.close()\" [links]=\"links()\" [secondaryLinks]=\"secondaryLinks()\">\n @if (drawerMenuHeaderTemplate()) {\n <ng-container header [ngTemplateOutlet]=\"drawerMenuHeaderTemplate()\" />\n }\n @if (drawerMenuFooterTemplate()) {\n <ng-container footer [ngTemplateOutlet]=\"drawerMenuFooterTemplate()\" />\n }\n </he-navigation-menu>\n </div>\n </div>\n </div>\n }\n @if (drawerFooterTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerFooterTemplate()\" />\n }\n </div>\n </div>\n </div>\n } @else {\n <aside>\n <div\n class=\"is-absolute h-100 shadow-2 has-background-white | shell__menuContent\"\n [class.is-pr-3]=\"position() === 'right'\"\n (@sideMenu.done)=\"animationDone($event)\"\n [@sideMenu]=\"expanded() ? 'full' : 'hidden'\">\n <div\n class=\"h-100 is-overflow-y-auto\"\n [class.is-py-4]=\"!drawerContentTemplate()\"\n [class.is-px-2]=\"!drawerContentTemplate()\">\n @if (drawerHeaderTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerHeaderTemplate()\" />\n }\n @if (drawerContentTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerContentTemplate()\" />\n }\n @if (links()?.length > 0) {\n <he-navigation-menu [links]=\"links()\" [secondaryLinks]=\"secondaryLinks()\">\n @if (drawerMenuHeaderTemplate()) {\n <ng-container header [ngTemplateOutlet]=\"drawerMenuHeaderTemplate()\" />\n }\n @if (drawerMenuFooterTemplate()) {\n <ng-container footer [ngTemplateOutlet]=\"drawerMenuFooterTemplate()\" />\n }\n </he-navigation-menu>\n }\n @if (drawerFooterTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerFooterTemplate()\" />\n }\n </div>\n @if (collapsible()) {\n <button\n (click)=\"toggleMenu()\"\n (mousedown)=\"startResizing($event)\"\n (touchstart)=\"startResizing($event)\"\n class=\"is-absolute is-overflow-hidden is-flex is-justify-content-center is-align-items-center | shell__menuContent--toggle\"\n pointer>\n <he-svg-icon [name]=\"resizable() ? 'drag' : toggleIcon()\" size=\"20\" />\n </button>\n }\n </div>\n </aside>\n }\n}\n\n<div [class.is-resizing]=\"isHoldingToggle()\" class=\"shell__content | h-100 w-100 is-flex\">\n <div class=\"shell__content--body | w-100\" [@reduceWidth]=\"reduceAnimation()\">\n <div #contentContainer class=\"w-100 h-100\" [style]=\"contentStyles()\" [className]=\"contentPaddingStyles()\">\n <ng-content select=\"[drawer-content]\" />\n </div>\n </div>\n</div>\n", styles: ["::ng-deep :root{--drawer-toggle-position: -20px;--sidenav-left-width: 256px;--sidenav-right-width: 256px;--content-transition-left-x: 0;--content-transition-right-x: 0}:host-context[drawer-position=left]{--sidenav-side-transform: 1;--sidenav-width: var(--sidenav-left-width);--content-transition-x: var(--content-transition-left-x);--menu-transition-transform: -1}:host-context[drawer-position=left]>aside{left:0}:host-context[drawer-position=left]>aside>.shell__menuContent{left:0}:host-context[drawer-position=left]>aside>.shell__menuContent>.shell__menuContent--toggle{right:var(--drawer-toggle-position);border-radius:0 9px 9px 0}:host-context[drawer-position=right]{--sidenav-side-transform: 0;--sidenav-width: var(--sidenav-right-width);--content-transition-x: var(--content-transition-right-x);--menu-transition-transform: 1}:host-context[drawer-position=right]>aside{right:0;order:1}:host-context[drawer-position=right]>aside>.shell__menuContent{right:0}:host-context[drawer-position=right]>aside>.shell__menuContent>.shell__menuContent--toggle{left:var(--drawer-toggle-position);border-radius:9px 0 0 9px}:host{position:relative;max-height:100%;display:flex;justify-content:space-between}:host aside{position:sticky;top:var(--navbar-height);z-index:10;height:calc(100vh - var(--navbar-height))}:host aside .shell__menuContent{top:0;width:var(--sidenav-width)}:host aside .shell__menuContent--toggle{top:calc(50% - 24px);background:#dbe3ea;border:none;width:20px;height:48px}:host aside ::ng-deep he-collapsible-box{box-shadow:none;padding:4px!important}@media screen and (max-width:1023px){:host aside ::ng-deep he-collapsible-box{background-color:transparent}}:host aside ::ng-deep he-collapsible-box>div{gap:16px!important}:host aside ::ng-deep he-collapsible-box .dropdown-content{box-shadow:none}:host aside ::ng-deep he-collapsible-box .dropdown-item+.dropdown-item{border-top:1px solid #b5b5b5}:host aside ::ng-deep he-collapsible-box .navbar-divider{background-color:#b5b5b5;margin:0}:host.is-resizable .shell__menuContent--toggle:active{cursor:col-resize}.shell__content--body{container-type:inline-size;transition:none}.shell__content:not(.is-resizing) .shell__content--body{transition:transform .3s ease-in-out,width .3s ease-in-out}.navigation-menu-dropdown{padding:.5rem 1rem;width:300px}@media screen and (max-width:767px){.navigation-menu-dropdown{width:calc(100dvw - 3rem)}}.compact-header{position:sticky;top:calc(var(--navbar-height));z-index:10}@media screen and (max-width:767px){.compact-header{top:0}}.compact-header--btn{background:#dbe3ea}he-navigation-menu ::ng-deep .menu{width:100%!important;min-width:100%!important;max-width:100%!important}\n"] }]
2299
+ }, template: "@if (visible()) {\n @if (isCompact()) {\n <div class=\"compact-header\">\n <div [ngClass]=\"compactHeaderClass()\">\n <div class=\"is-flex is-align-items-center is-justify-content-space-between is-gap-8 w-100\">\n @if (drawerHeaderTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerHeaderTemplate()\" />\n }\n @if (links()?.length > 0) {\n <div\n ngbDropdown\n #optionDd=\"ngbDropdown\"\n container=\"body\"\n placement=\"bottom-end\"\n [dropdownClass]=\"compactMenuHeaderClass()\">\n <button\n ngbDropdownToggle\n class=\"button is-small is-no-shadow is-block has-text-weight-bold has-text-secondary is-size-6 is-py-1 is-px-2 is-radius-3 is-gap-4 | compact-header--btn\"\n aria-controls=\"drawer-menu\"\n type=\"button\">\n <span>{{ compactMenuLabel() }}</span>\n <he-svg-icon\n class=\"compact-header--btn__icon\"\n [name]=\"optionDd.isOpen() ? 'chevron-up' : 'chevron-down'\"\n aria-hidden=\"true\" />\n </button>\n\n <div ngbDropdownMenu id=\"drawer-menu\">\n <div class=\"dropdown-content navigation-menu-dropdown\">\n <he-navigation-menu (closed)=\"optionDd.close()\" [links]=\"links()\" [secondaryLinks]=\"secondaryLinks()\">\n @if (drawerMenuHeaderTemplate()) {\n <ng-container header [ngTemplateOutlet]=\"drawerMenuHeaderTemplate()\" />\n }\n @if (drawerMenuFooterTemplate()) {\n <ng-container footer [ngTemplateOutlet]=\"drawerMenuFooterTemplate()\" />\n }\n </he-navigation-menu>\n </div>\n </div>\n </div>\n }\n @if (drawerFooterTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerFooterTemplate()\" />\n }\n </div>\n </div>\n </div>\n } @else {\n <aside>\n <div\n class=\"is-absolute h-100 shadow-2 has-background-white | shell__menuContent\"\n [class.is-pr-3]=\"position() === 'right'\"\n (@sideMenu.done)=\"animationDone($event)\"\n [@sideMenu]=\"expanded() ? 'full' : 'hidden'\">\n <div\n class=\"h-100 is-overflow-y-auto\"\n [class.is-py-4]=\"!drawerContentTemplate()\"\n [class.is-px-2]=\"!drawerContentTemplate()\">\n @if (drawerHeaderTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerHeaderTemplate()\" />\n }\n @if (drawerContentTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerContentTemplate()\" />\n }\n @if (links()?.length > 0) {\n <he-navigation-menu [links]=\"links()\" [secondaryLinks]=\"secondaryLinks()\">\n @if (drawerMenuHeaderTemplate()) {\n <ng-container header [ngTemplateOutlet]=\"drawerMenuHeaderTemplate()\" />\n }\n @if (drawerMenuFooterTemplate()) {\n <ng-container footer [ngTemplateOutlet]=\"drawerMenuFooterTemplate()\" />\n }\n </he-navigation-menu>\n }\n @if (drawerFooterTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerFooterTemplate()\" />\n }\n </div>\n @if (collapsible()) {\n <button\n (click)=\"toggleMenu()\"\n (mousedown)=\"startResizing($event)\"\n (touchstart)=\"startResizing($event)\"\n class=\"is-absolute is-overflow-hidden is-flex is-justify-content-center is-align-items-center | shell__menuContent--toggle\"\n pointer>\n <he-svg-icon [name]=\"resizable() ? 'drag' : toggleIcon()\" size=\"20\" />\n </button>\n }\n </div>\n </aside>\n }\n}\n\n<div [class.is-resizing]=\"isHoldingToggle()\" class=\"shell__content | h-100 w-100 is-flex\">\n <div class=\"shell__content--body | w-100\" [@reduceWidth]=\"reduceAnimation()\">\n <div #contentContainer class=\"w-100 h-100\" [style]=\"contentStyles()\" [className]=\"contentPaddingStyles()\">\n <ng-content select=\"[drawer-content]\" />\n </div>\n </div>\n</div>\n", styles: ["::ng-deep :root{--drawer-toggle-position: -20px;--sidenav-left-width: 256px;--sidenav-right-width: 256px;--content-transition-left-x: 0;--content-transition-right-x: 0}:host-context[drawer-position=left]{--sidenav-side-transform: 1;--sidenav-width: var(--sidenav-left-width);--content-transition-x: var(--content-transition-left-x);--menu-transition-transform: -1}:host-context[drawer-position=left]>aside{left:0}:host-context[drawer-position=left]>aside>.shell__menuContent{left:0}:host-context[drawer-position=left]>aside>.shell__menuContent>.shell__menuContent--toggle{right:var(--drawer-toggle-position);border-radius:0 9px 9px 0}:host-context[drawer-position=right]{--sidenav-side-transform: 0;--sidenav-width: var(--sidenav-right-width);--content-transition-x: var(--content-transition-right-x);--menu-transition-transform: 1}:host-context[drawer-position=right]>aside{right:0;order:1}:host-context[drawer-position=right]>aside>.shell__menuContent{right:0}:host-context[drawer-position=right]>aside>.shell__menuContent>.shell__menuContent--toggle{left:var(--drawer-toggle-position);border-radius:9px 0 0 9px}:host{position:relative;max-height:100%;display:flex;justify-content:space-between}:host aside{position:sticky;top:var(--navbar-height);z-index:10;height:calc(100vh - var(--navbar-height))}:host aside .shell__menuContent{top:0;width:var(--sidenav-width)}:host aside .shell__menuContent--toggle{top:calc(50% - 24px);background:#dbe3ea;border:none;width:20px;height:48px}:host aside ::ng-deep he-collapsible-box{box-shadow:none;padding:4px!important}@media screen and (max-width:1023px){:host aside ::ng-deep he-collapsible-box{background-color:transparent}}:host aside ::ng-deep he-collapsible-box>div{gap:16px!important}:host aside ::ng-deep he-collapsible-box .dropdown-content{box-shadow:none}:host aside ::ng-deep he-collapsible-box .dropdown-item+.dropdown-item{border-top:1px solid #b5b5b5}:host aside ::ng-deep he-collapsible-box .navbar-divider{background-color:#b5b5b5;margin:0}:host.is-resizable .shell__menuContent--toggle:active{cursor:col-resize}.shell__content--body{container-type:inline-size;transition:none}.shell__content:not(.is-resizing) .shell__content--body{transition:transform .3s ease-in-out,width .3s ease-in-out}.navigation-menu-dropdown{padding:.5rem 1rem;width:300px}@media screen and (max-width:767px){.navigation-menu-dropdown{width:calc(100dvw - 3rem)}}.compact-header{position:sticky;top:calc(var(--navbar-height));z-index:10}@media screen and (max-width:767px){.compact-header{top:0}}.compact-header--btn{background:#dbe3ea}he-navigation-menu ::ng-deep .menu{width:100%!important;min-width:100%!important;max-width:100%!important}\n"] }]
2336
2300
  }], ctorParameters: () => [], propDecorators: { contentContainer: [{ type: i0.ViewChild, args: ['contentContainer', { ...{ read: ElementRef }, isSignal: true }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }, { type: i0.Output, args: ["expandedChange"] }], compactBreakpoint: [{ type: i0.Input, args: [{ isSignal: true, alias: "compactBreakpoint", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }, { type: i0.Output, args: ["widthChange"] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], contentStyles: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentStyles", required: false }] }], contentPaddingStyles: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentPaddingStyles", required: false }] }], menuOverlap: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuOverlap", required: false }] }], links: [{ type: i0.Input, args: [{ isSignal: true, alias: "links", required: false }] }], secondaryLinks: [{ type: i0.Input, args: [{ isSignal: true, alias: "secondaryLinks", required: false }] }], drawerHeaderTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawerHeaderTemplate", required: false }] }], drawerContentTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawerContentTemplate", required: false }] }], drawerFooterTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawerFooterTemplate", required: false }] }], drawerMenuHeaderTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawerMenuHeaderTemplate", required: false }] }], drawerMenuFooterTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawerMenuFooterTemplate", required: false }] }], compactMenuLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "compactMenuLabel", required: false }] }], compactHeaderClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "compactHeaderClass", required: false }] }], compactMenuHeaderClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "compactMenuHeaderClass", required: false }] }], minMenuDistance: [{ type: i0.Input, args: [{ isSignal: true, alias: "minMenuDistance", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], stopResizing: [{
2337
2301
  type: HostListener,
2338
2302
  args: ['window:mouseup']
@@ -2974,6 +2938,7 @@ const icons = [
2974
2938
  'unit',
2975
2939
  'upload',
2976
2940
  'video',
2941
+ 'xlsx-file',
2977
2942
  'xmark',
2978
2943
  'xmark-circle',
2979
2944
  'xmark-circle-filled',
@@ -3960,7 +3925,7 @@ const isNode = unknown => {
3960
3925
  Node.prototype.cloneNode.call(unknown, false);
3961
3926
  return true;
3962
3927
  }
3963
- catch (_err) {
3928
+ catch {
3964
3929
  return false;
3965
3930
  }
3966
3931
  };
@@ -8059,168 +8024,12 @@ const isNonNodeModelKey = (value) => ['completeness'].includes(value);
8059
8024
  const inputGroupsTermTypes = [TermTermType.pesticideBrandName, TermTermType.fertiliserBrandName];
8060
8025
  // should each group be open by default?
8061
8026
  const defaultGroupOpen = false;
8062
- const termTypes = Object.values(TermTermType);
8063
- const blankNodeTypes = Object.values(SchemaType).filter(t => !isTypeNode(t));
8064
- const schemaTypesLowerCase = Object.values(SchemaType).map(v => v.toLowerCase());
8065
- const blankNodeTypesLowerCase = blankNodeTypes.map(v => v.toLowerCase());
8066
- const missingLookupPrefix = 'Missing lookup';
8067
8027
  const noValue = 'None';
8068
8028
  // add any other models that are set as "not relevant"
8069
8029
  const notRelevantModels = ['emissionNotRelevant'];
8070
8030
  const isNotRelevantModel = (model) => notRelevantModels.includes(model.methodId);
8071
- const hasValue = (value) => !!value && value !== noValue;
8072
- const parseFilename = (filepath) => {
8073
- const [filename] = filepath.split('.');
8074
- const ext = termTypes.includes(filename) ? SupportedExtensions.xlsx : SupportedExtensions.csv;
8075
- return fileToExt(filename, ext);
8076
- };
8077
- const parseLookup = ({ column, termid, 'term.id': _termid, [missingLookupPrefix]: missingLookup }) => ({
8078
- filename: parseFilename(missingLookup),
8079
- termId: termid || _termid,
8080
- column
8081
- });
8082
- const csvValue = (value) => (value || '').replace('[', '').replace(']', '');
8083
- const parseLogMessage = (message) => {
8084
- try {
8085
- const data = JSON.parse(message);
8086
- // Split on a comma (and optional space) ONLY if it's followed by "key="
8087
- // \w+ matches alphanumeric characters and underscores (standard log keys)
8088
- const pairs = data.message.split(/,\s*(?=\w+=)/);
8089
- return pairs.reduce((prev, parts) => {
8090
- // Use indexOf instead of split('=') just in case your values ever contain an '='
8091
- const firstEqualsIndex = parts.indexOf('=');
8092
- if (firstEqualsIndex === -1)
8093
- return prev;
8094
- const key = parts.substring(0, firstEqualsIndex).trim();
8095
- const value = parts.substring(firstEqualsIndex + 1).trim();
8096
- const val = csvValue(value);
8097
- return {
8098
- ...prev,
8099
- ...(key && val ? { [key]: val } : {})
8100
- };
8101
- }, { logger: data.logger });
8102
- }
8103
- catch (_err) {
8104
- // make sure it works even if one log is malformed
8105
- return {};
8106
- }
8107
- };
8108
- const parseLogMultipleValue = (values) => values
8109
- .map(v => (v.filter(Boolean).length === 2 ? v.join(':') : null))
8110
- .filter(Boolean)
8111
- .join('_');
8112
- const parseLog$1 = (log) => ['value' in log, 'coefficient' in log, 'node' in log || 'operation' in log].every(Boolean)
8113
- ? {
8114
- [log.node || log.operation]: parseLogMultipleValue([
8115
- ['value', log.value],
8116
- ['coefficient', log.coefficient],
8117
- ['operation', !log.node ? log.operation : null]
8118
- ])
8119
- }
8120
- : omitLogKeys(log);
8121
- const omitLogKeys = (log, ...keys) => Object.fromEntries(Object.entries(log).filter(([key]) => !schemaTypesLowerCase.includes(key) && !keys.includes(key)));
8122
- const includeBlankNodes = (logs, log) => Object.keys(log)
8123
- .filter(key => blankNodeTypesLowerCase.includes(key))
8124
- .reduce((prev, key) => ({
8125
- ...prev,
8126
- [key]: unique([...((typeof prev[key] === 'string' ? [prev[key]] : prev[key]) || []), log[key]])
8127
- }), logs);
8128
- const groupLog = (group, { logger, term, model, key, should_run, should_merge, run_required, property, input_group_id, ...log }, groupByAnimal = false) => {
8129
- const isOrchestrator = logger.includes('orchestrator');
8130
- const isKey = !isOrchestrator && !!key;
8131
- const isProperty = !isOrchestrator && !!property;
8132
- const parentLogKey = [
8133
- groupByAnimal && log.animalId,
8134
- hasValue(term) && `["${term}"]`,
8135
- (!isOrchestrator && key) || property,
8136
- log.emission_id
8137
- ]
8138
- .filter(Boolean)
8139
- .join('.');
8140
- const logModelKey = [parentLogKey, hasValue(model) && model].filter(Boolean).join('.');
8141
- set(group, `${parentLogKey}.models`, unique([...get(group, `${parentLogKey}.models`, []), model]));
8142
- set(group, `${parentLogKey}.isKey`, isKey);
8143
- set(group, `${parentLogKey}.isProperty`, isProperty);
8144
- input_group_id && set(group, `${parentLogKey}.groupId`, input_group_id);
8145
- let data = get(group, logModelKey, {});
8146
- data = includeBlankNodes(data, log);
8147
- if (typeof should_run !== 'undefined') {
8148
- const shouldRun = should_run === 'True';
8149
- data = isOrchestrator
8150
- ? {
8151
- ...data,
8152
- ...omitLogKeys(log, 'value'),
8153
- shouldRunOrchestrator: shouldRun
8154
- }
8155
- : {
8156
- ...data,
8157
- ...omitLogKeys(log),
8158
- shouldRun
8159
- };
8160
- }
8161
- else if (typeof run_required !== 'undefined') {
8162
- const runRequired = run_required === 'True';
8163
- data = {
8164
- ...data,
8165
- ...(runRequired ? {} : omitLogKeys(log)), // no need to save logs if we need to run the model
8166
- runRequired
8167
- };
8168
- }
8169
- else if ('requirements' in log) {
8170
- const { requirements, ...logData } = log;
8171
- data.requirements = {
8172
- ...(data.requirements || {}),
8173
- ...logData
8174
- };
8175
- }
8176
- else if (missingLookupPrefix in log) {
8177
- data.missingLookups = unique([...(data.missingLookups || []), parseLookup(log)]);
8178
- }
8179
- else if (!isOrchestrator) {
8180
- data.logs = {
8181
- ...(data.logs || {}),
8182
- ...parseLog$1(log)
8183
- };
8184
- }
8185
- if (typeof should_merge !== 'undefined') {
8186
- data.shouldMerge = should_merge === 'True';
8187
- }
8188
- if (typeof log.replaceLowerTier !== 'undefined') {
8189
- data.replaceLowerTier = log.replaceLowerTier === 'True';
8190
- }
8191
- if (typeof log.replaceThreshold !== 'undefined') {
8192
- data.replaceThreshold = log.replaceThreshold === 'True';
8193
- }
8194
- set(group, logModelKey, data);
8195
- return group;
8196
- };
8197
- const subValueKeys = ['transformation', 'animal'];
8198
- const groupLogSubValue = (group, log, key) => {
8199
- const id = log[key];
8200
- const data = groupLog(group[id] || {}, log);
8201
- group[id] = data;
8202
- if (subValueKeys.includes(key)) {
8203
- // add value to the same term/model on parent group
8204
- Object.entries(group[id]).map(([term, models]) => Object.keys(models).map(model => {
8205
- if (typeof group?.[term]?.[model] === 'object') {
8206
- group[term][model][key] = unique([...(group[term][model][key] || []), id]);
8207
- }
8208
- }));
8209
- }
8210
- return group;
8211
- };
8212
- const groupLogsByModel = (data = '', groupBySubValue = false, groupByAnimal = false) => data
8213
- .trim()
8214
- .split('\n')
8215
- .map(parseLogMessage)
8216
- .filter(v => [hasValue(v?.model), ['term', 'key', 'animalId'].some(k => hasValue(v?.[k]))].every(Boolean))
8217
- .reduce((group, log) => {
8218
- const subValue = subValueKeys.find(v => !!log[v] && log[v] != noValue);
8219
- return subValue && groupBySubValue && !log.cycle
8220
- ? groupLogSubValue(group, log, subValue)
8221
- : groupLog(group, log, groupByAnimal);
8222
- }, {});
8223
8031
  const asArray = (values) => (Array.isArray(values) ? values : []);
8032
+ const subValueKeys = ['transformation', 'animal'];
8224
8033
  const computeTerms = (originalValues, recalculatedValues, terms, filterTermTypes, extraTerms = []) => orderBy(uniqBy([
8225
8034
  ...(terms?.length
8226
8035
  ? terms
@@ -8928,8 +8737,8 @@ const filterLogValueArray = (value) => {
8928
8737
  ? null
8929
8738
  : values;
8930
8739
  };
8931
- const parseLog = (key, value) => parseLogCompleteness(key, value) || { key, value: filterLogValueArray(value) };
8932
- const parseLogs = (logs) => Object.entries(logs).map(([key, value]) => parseLog(key, value));
8740
+ const parseLog$1 = (key, value) => parseLogCompleteness(key, value) || { key, value: filterLogValueArray(value) };
8741
+ const parseLogs = (logs) => Object.entries(logs).map(([key, value]) => parseLog$1(key, value));
8933
8742
  class NodeLogsModelsLogsComponent {
8934
8743
  constructor() {
8935
8744
  this.logs = input.required(...(ngDevMode ? [{ debugName: "logs" }] : []));
@@ -8941,7 +8750,7 @@ class NodeLogsModelsLogsComponent {
8941
8750
  this.requirementKeys = computed(() => requirementKeys(this.requirements()), ...(ngDevMode ? [{ debugName: "requirementKeys" }] : []));
8942
8751
  this.missingLookups = computed(() => this.logs().missingLookups ?? [], ...(ngDevMode ? [{ debugName: "missingLookups" }] : []));
8943
8752
  this.allLogs = computed(() => [
8944
- ...requirementKeys(this.requirements()).map(key => parseLog(key, this.requirements()[key])),
8753
+ ...requirementKeys(this.requirements()).map(key => parseLog$1(key, this.requirements()[key])),
8945
8754
  ...parseLogs(this.logs()?.logs ?? {})
8946
8755
  ].filter(v => v.value !== null), ...(ngDevMode ? [{ debugName: "allLogs" }] : []));
8947
8756
  }
@@ -9143,6 +8952,186 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
9143
8952
  args: [{ selector: 'he-node-logs-models-contributions', imports: [NgTemplateOutlet, HESvgIconComponent, SortByPipe, DefaultPipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (loading()) {\n <div class=\"is-my-3 has-text-center\">\n <he-svg-icon name=\"loading\" animation=\"spin\" />\n </div>\n}\n\n<div class=\"table-container\">\n <table class=\"table is-dark is-fullwidth\">\n <tbody>\n <tr>\n <td class=\"has-border-right\">Contribution details</td>\n <td>\n @if (rows().length && columns().length) {\n <table class=\"table is-dark is-bordered is-striped\">\n @let sorting = $any({});\n <thead>\n <tr>\n @for (header of columns(); track header) {\n <th class=\"has-text-white\">\n <div class=\"is-nowrap\">\n {{ header }}\n <ng-container *ngTemplateOutlet=\"sortColumn; context: { column: header }\" />\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows() | sortBy: sortBy() : sortOrder(); track trackByRow(row)) {\n <tr>\n @for (header of columns(); track header) {\n <td>\n <ng-container *ngTemplateOutlet=\"tableRow; context: { value: row[header] }\" />\n @if (header === 'coefficient' && row.value === 0) {\n <sup class=\"is-pl-1\">*</sup>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n\n <p class=\"is-size-7 is-italic has-text-white\">\n <sup>*</sup>\n Contributions with\n <code>value=0</code>\n are not stored and coefficient will appear as\n <code>-</code>\n . Please see the \"Missing Coefficients\" list for more details.\n </p>\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n\n<ng-template #tableRow let-value=\"value\">\n <div [innerHTML]=\"value | default: '-'\"></div>\n</ng-template>\n\n<ng-template #sortColumn let-column=\"column\">\n <a class=\"is-p-1 has-text-white\" (click)=\"toggleSort(column)\">\n @if (sortBy() === column) {\n @if (sortOrder() === 'asc') {\n <he-svg-icon name=\"sort-caret-up-filled\" size=\"16\" />\n } @else {\n <he-svg-icon name=\"sort-caret-down-filled\" size=\"16\" />\n }\n } @else {\n <he-svg-icon name=\"sort-caret-stacked-filled-stacked\" size=\"16\" />\n }\n </a>\n</ng-template>\n" }]
9144
8953
  }], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }], nodeKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeKey", required: false }] }], model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: true }] }] } });
9145
8954
 
8955
+ /* eslint-disable complexity */
8956
+ const termTypes = Object.values(TermTermType);
8957
+ const blankNodeTypes = Object.values(SchemaType).filter(t => !isTypeNode(t));
8958
+ const blankNodeTypesLowerCase = blankNodeTypes.map(v => v.toLowerCase());
8959
+ const schemaTypesLowerCase = Object.values(SchemaType).map(v => v.toLowerCase());
8960
+ const missingLookupPrefix = 'Missing lookup';
8961
+ const omitLogKeys = (log, ...keys) => Object.fromEntries(Object.entries(log).filter(([key]) => !schemaTypesLowerCase.includes(key) && !keys.includes(key)));
8962
+ const includeBlankNodes = (logs, log) => Object.keys(log)
8963
+ .filter(key => blankNodeTypesLowerCase.includes(key))
8964
+ .reduce((prev, key) => ({
8965
+ ...prev,
8966
+ [key]: unique([...((typeof prev[key] === 'string' ? [prev[key]] : prev[key]) || []), log[key]])
8967
+ }), logs);
8968
+ const parseLogMultipleValue = (values) => values
8969
+ .map(v => (v.filter(Boolean).length === 2 ? v.join(':') : null))
8970
+ .filter(Boolean)
8971
+ .join('_');
8972
+ const parseLog = (log) => ['value' in log, 'coefficient' in log, 'node' in log || 'operation' in log].every(Boolean)
8973
+ ? {
8974
+ [log.node || log.operation]: parseLogMultipleValue([
8975
+ ['value', log.value],
8976
+ ['coefficient', log.coefficient],
8977
+ ['operation', !log.node ? log.operation : null]
8978
+ ])
8979
+ }
8980
+ : omitLogKeys(log);
8981
+ const parseLookup = ({ column, termid, 'term.id': _termid, [missingLookupPrefix]: missingLookup }) => ({
8982
+ filename: parseFilename(missingLookup),
8983
+ termId: termid || _termid,
8984
+ column
8985
+ });
8986
+ const hasValue = (value) => !!value && value !== noValue;
8987
+ const parseFilename = (filepath) => {
8988
+ const [filename] = filepath.split('.');
8989
+ const ext = termTypes.includes(filename) ? SupportedExtensions.xlsx : SupportedExtensions.csv;
8990
+ return fileToExt(filename, ext);
8991
+ };
8992
+ const groupLog = (group, { logger, term, model, key, should_run, should_merge, run_required, property, input_group_id, ...log }, groupByAnimal = false) => {
8993
+ const isOrchestrator = logger.includes('orchestrator');
8994
+ const isKey = !isOrchestrator && !!key;
8995
+ const isProperty = !isOrchestrator && !!property;
8996
+ const parentLogKey = [
8997
+ groupByAnimal && log.animalId,
8998
+ hasValue(term) && `["${term}"]`,
8999
+ (!isOrchestrator && key) || property,
9000
+ log.emission_id
9001
+ ]
9002
+ .filter(Boolean)
9003
+ .join('.');
9004
+ const logModelKey = [parentLogKey, hasValue(model) && model].filter(Boolean).join('.');
9005
+ set(group, `${parentLogKey}.models`, unique([...get(group, `${parentLogKey}.models`, []), model]));
9006
+ set(group, `${parentLogKey}.isKey`, isKey);
9007
+ set(group, `${parentLogKey}.isProperty`, isProperty);
9008
+ input_group_id && set(group, `${parentLogKey}.groupId`, input_group_id);
9009
+ let data = get(group, logModelKey, {});
9010
+ data = includeBlankNodes(data, log);
9011
+ if (typeof should_run !== 'undefined') {
9012
+ const shouldRun = should_run === 'True';
9013
+ data = isOrchestrator
9014
+ ? {
9015
+ ...data,
9016
+ ...omitLogKeys(log, 'value'),
9017
+ shouldRunOrchestrator: shouldRun
9018
+ }
9019
+ : {
9020
+ ...data,
9021
+ ...omitLogKeys(log),
9022
+ shouldRun
9023
+ };
9024
+ }
9025
+ else if (typeof run_required !== 'undefined') {
9026
+ const runRequired = run_required === 'True';
9027
+ data = {
9028
+ ...data,
9029
+ ...(runRequired ? {} : omitLogKeys(log)), // no need to save logs if we need to run the model
9030
+ runRequired
9031
+ };
9032
+ }
9033
+ else if ('requirements' in log) {
9034
+ const { requirements, ...logData } = log;
9035
+ data.requirements = {
9036
+ ...(data.requirements || {}),
9037
+ ...logData
9038
+ };
9039
+ }
9040
+ else if (missingLookupPrefix in log) {
9041
+ data.missingLookups = unique([...(data.missingLookups || []), parseLookup(log)]);
9042
+ }
9043
+ else if (!isOrchestrator) {
9044
+ data.logs = {
9045
+ ...(data.logs || {}),
9046
+ ...parseLog(log)
9047
+ };
9048
+ }
9049
+ if (typeof should_merge !== 'undefined') {
9050
+ data.shouldMerge = should_merge === 'True';
9051
+ }
9052
+ if (typeof log.replaceLowerTier !== 'undefined') {
9053
+ data.replaceLowerTier = log.replaceLowerTier === 'True';
9054
+ }
9055
+ if (typeof log.replaceThreshold !== 'undefined') {
9056
+ data.replaceThreshold = log.replaceThreshold === 'True';
9057
+ }
9058
+ set(group, logModelKey, data);
9059
+ return group;
9060
+ };
9061
+ const groupLogSubValue = (group, log, key) => {
9062
+ const id = log[key];
9063
+ const data = groupLog(group[id] || {}, log);
9064
+ group[id] = data;
9065
+ if (subValueKeys.includes(key)) {
9066
+ // add value to the same term/model on parent group
9067
+ Object.entries(group[id]).map(([term, models]) => Object.keys(models).map(model => {
9068
+ if (typeof group?.[term]?.[model] === 'object') {
9069
+ group[term][model][key] = unique([...(group[term][model][key] || []), id]);
9070
+ }
9071
+ }));
9072
+ }
9073
+ return group;
9074
+ };
9075
+ const csvValue = (value) => (value || '').replace('[', '').replace(']', '');
9076
+ const parseLogMessage = (message) => {
9077
+ try {
9078
+ const data = JSON.parse(message);
9079
+ // Split on a comma (and optional space) ONLY if it's followed by "key="
9080
+ // \w+ matches alphanumeric characters and underscores (standard log keys)
9081
+ const pairs = data.message.split(/,\s*(?=\w+=)/);
9082
+ return pairs.reduce((prev, parts) => {
9083
+ // Use indexOf instead of split('=') just in case your values ever contain an '='
9084
+ const firstEqualsIndex = parts.indexOf('=');
9085
+ if (firstEqualsIndex === -1)
9086
+ return prev;
9087
+ const key = parts.substring(0, firstEqualsIndex).trim();
9088
+ const value = parts.substring(firstEqualsIndex + 1).trim();
9089
+ const val = csvValue(value);
9090
+ return {
9091
+ ...prev,
9092
+ ...(key && val ? { [key]: val } : {})
9093
+ };
9094
+ }, { logger: data.logger });
9095
+ }
9096
+ catch {
9097
+ // make sure it works even if one log is malformed
9098
+ return {};
9099
+ }
9100
+ };
9101
+ const groupLogsByModel = (data = '', groupBySubValue = false, groupByAnimal = false) => data
9102
+ .trim()
9103
+ .split('\n')
9104
+ .map(parseLogMessage)
9105
+ .filter(v => [hasValue(v?.model), ['term', 'key', 'animalId'].some(k => hasValue(v?.[k]))].every(Boolean))
9106
+ .reduce((group, log) => {
9107
+ const subValue = subValueKeys.find(v => !!log[v] && log[v] != noValue);
9108
+ return subValue && groupBySubValue && !log.cycle
9109
+ ? groupLogSubValue(group, log, subValue)
9110
+ : groupLog(group, log, groupByAnimal);
9111
+ }, {});
9112
+ class NodeLogsModelsService {
9113
+ constructor() {
9114
+ this.nodeService = inject(HeNodeService);
9115
+ }
9116
+ getNodeLogs$(node, groupByAnimal = false) {
9117
+ return this.nodeService
9118
+ .getLog$({
9119
+ '@type': node['@type'],
9120
+ '@id': node['@id'],
9121
+ dataState: node.aggregated && node['@type'] !== NodeType.ImpactAssessment ? DataState.original : DataState.recalculated
9122
+ })
9123
+ .pipe(map(logs => logs ? groupLogsByModel(logs, node['@type'] === NodeType.Cycle, groupByAnimal) : {}));
9124
+ }
9125
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NodeLogsModelsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9126
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NodeLogsModelsService, providedIn: 'root' }); }
9127
+ }
9128
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NodeLogsModelsService, decorators: [{
9129
+ type: Injectable,
9130
+ args: [{
9131
+ providedIn: 'root'
9132
+ }]
9133
+ }] });
9134
+
9146
9135
  const groupTerms = (terms) => terms.reduce((prev, curr) => ({ ...prev, [curr['@id']]: curr }), {});
9147
9136
  const logIcon = {
9148
9137
  [LogStatus.success]: 'checkmark',
@@ -9235,6 +9224,7 @@ const valuesSchemaType = (values) => Array.isArray(values) ? valueSchemaType(val
9235
9224
  class NodeLogsModelsComponent {
9236
9225
  constructor() {
9237
9226
  this.nodeService = inject(HeNodeService);
9227
+ this.nodeLogsModelsService = inject(NodeLogsModelsService);
9238
9228
  this.searchService = inject(HeSearchService);
9239
9229
  this.engineService = inject(HeEngineService);
9240
9230
  this.guideEnabled = inject(GUIDE_ENABLED);
@@ -9273,15 +9263,11 @@ class NodeLogsModelsComponent {
9273
9263
  this.logsUrl = computed(() => this.nodeService.nodeLogsUrl(this.node()), ...(ngDevMode ? [{ debugName: "logsUrl" }] : []));
9274
9264
  this.nodeType = computed(() => nodeType(this.node()), ...(ngDevMode ? [{ debugName: "nodeType" }] : []));
9275
9265
  this.logsResource = rxResource({
9276
- params: () => ({ node: this.node() }),
9277
- stream: ({ params: { node } }) => this.nodeService.getLog$({
9278
- '@type': node['@type'],
9279
- '@id': node['@id'],
9280
- dataState: node.aggregated && node['@type'] !== NodeType.ImpactAssessment ? DataState.original : DataState.recalculated
9281
- })
9266
+ params: () => ({ node: this.node(), groupByAnimal: !!this.logsKey() }),
9267
+ stream: ({ params: { node, groupByAnimal } }) => this.nodeLogsModelsService.getNodeLogs$(node, groupByAnimal)
9282
9268
  });
9283
- this.allLogs = computed(() => this.logsResource.value() ?? '', ...(ngDevMode ? [{ debugName: "allLogs" }] : []));
9284
- this.hasLogs = computed(() => this.allLogs() !== '', ...(ngDevMode ? [{ debugName: "hasLogs" }] : []));
9269
+ this.allLogs = computed(() => this.logsResource.value() ?? {}, ...(ngDevMode ? [{ debugName: "allLogs" }] : []));
9270
+ this.hasLogs = computed(() => !isEmpty(this.allLogs()), ...(ngDevMode ? [{ debugName: "hasLogs" }] : []));
9285
9271
  this.configResource = rxResource({
9286
9272
  params: () => ({ node: this.node() }),
9287
9273
  stream: ({ params: { node } }) => this.engineService.ochestratorConfig$(nodeType(node), nodeId(node))
@@ -9308,8 +9294,7 @@ class NodeLogsModelsComponent {
9308
9294
  return prev;
9309
9295
  }, {}), ...(ngDevMode ? [{ debugName: "animalGroups" }] : []));
9310
9296
  this.termsGrouping = computed(() => Object.assign({}, this.inputGroupsResource.value() ?? {}, this.animalGroups() ?? {}), ...(ngDevMode ? [{ debugName: "termsGrouping" }] : []));
9311
- this.groupedLogs = computed(() => this.allLogs() ? groupLogsByModel(this.allLogs(), this.nodeType() === NodeType.Cycle, !!this.logsKey()) : {}, ...(ngDevMode ? [{ debugName: "groupedLogs" }] : []));
9312
- this.logs = computed(() => (this.logsKey() ? this.groupedLogs()?.[this.logsKey()] : this.groupedLogs()) || {}, ...(ngDevMode ? [{ debugName: "logs" }] : []));
9297
+ this.logs = computed(() => (this.logsKey() ? this.allLogs()?.[this.logsKey()] : this.allLogs()) || {}, ...(ngDevMode ? [{ debugName: "logs" }] : []));
9313
9298
  this.isBlankNodes = computed(() => Array.isArray(this.originalValues()) || Array.isArray(this.recalculatedValues()), ...(ngDevMode ? [{ debugName: "isBlankNodes" }] : []));
9314
9299
  this.extraTermsFromLogsResource = rxResource({
9315
9300
  params: () => ({
@@ -11878,7 +11863,7 @@ const formatError = (error, allErrors = []) => error
11878
11863
  : undefined;
11879
11864
  const errorHasError = (error) => error && (error.level === 'error' || !error.level);
11880
11865
  const errorHasWarning = (error) => error && error.level === 'warning';
11881
- const isMissingPropertyError = ({ params, message }) => !!params && 'missingProperty' in params;
11866
+ const isMissingPropertyError = ({ params }) => !!params && 'missingProperty' in params;
11882
11867
  const isMissingOneOfError = ({ keyword, schemaPath }) => keyword === 'required' && (schemaPath || '').includes('oneOf');
11883
11868
  const isFailingKeywordError = ({ params }) => !!params && 'failingKeyword' in params;
11884
11869
  const filterError = (error) => [isFailingKeywordError].every(func => !func(error));
@@ -12496,7 +12481,7 @@ const groupChanged = (properties, key, value) => {
12496
12481
  }
12497
12482
  }, properties);
12498
12483
  }
12499
- catch (_err) {
12484
+ catch {
12500
12485
  // ignore error
12501
12486
  }
12502
12487
  };
@@ -13237,7 +13222,7 @@ const errorCsv = nodes => {
13237
13222
  try {
13238
13223
  return toCsv$1(nodes, { includeExising: true });
13239
13224
  }
13240
- catch (_err) {
13225
+ catch {
13241
13226
  return '';
13242
13227
  }
13243
13228
  };
@@ -15046,39 +15031,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
15046
15031
  }]
15047
15032
  }], ctorParameters: () => [], propDecorators: { indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: true }] }] } });
15048
15033
 
15049
- class FilterStore extends ComponentStore {
15050
- constructor() {
15051
- super(initialFilterState);
15052
- this.setValue = this.updater((state, value) => ({
15053
- ...state,
15054
- value
15055
- }));
15056
- this.setData = this.updater((state, data) => ({
15057
- ...state,
15058
- data: populateWithTrackIdsFilterData(data)
15059
- }));
15060
- this.flattenOptions = this.selectSignal(({ data }) => {
15061
- const flattenData = flatFilterData(data);
15062
- return flattenData.filter(item => item.type === 'option');
15063
- });
15064
- this.value = this.selectSignal(({ value }) => value);
15065
- this.filteredData = this.selectSignal(({ filter, filterFn, data, mapFn }) => {
15066
- const filteredData = this._getFilteredData(filter, filterFn, data);
15067
- return mapFn ? mapFilterData(filteredData, mapFn) : filteredData;
15068
- });
15069
- }
15070
- _getFilteredData(filter, filterFn, data) {
15071
- return filter.trim().length
15072
- ? this.flattenOptions().filter(o => filterFn(o, filter))
15073
- : searchFilterData(data, item => filterFn(item, filter));
15074
- }
15075
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FilterStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
15076
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FilterStore }); }
15077
- }
15078
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FilterStore, decorators: [{
15079
- type: Injectable
15080
- }], ctorParameters: () => [] });
15081
-
15082
15034
  const allGroups = (values = []) => values.flatMap(v => (v.type === 'group' ? [v, ...allGroups(v.options)] : []));
15083
15035
  const allOptions = ({ options }) => options.flatMap(v => (v.type === 'group' ? allOptions(v) : v));
15084
15036
  const optionsFromGroup = (group) => allOptions(group).map(v => v.value);
@@ -15114,7 +15066,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
15114
15066
  class FilterAccordionComponent extends ControlValueAccessor {
15115
15067
  constructor() {
15116
15068
  super();
15117
- this.filterStore = inject((FilterStore));
15118
15069
  /**
15119
15070
  * Show the header, with title and global clear/search.
15120
15071
  */
@@ -15162,9 +15113,10 @@ class FilterAccordionComponent extends ControlValueAccessor {
15162
15113
  this.getDirectOptionsCount = getDirectOptionsCount;
15163
15114
  this.optionsFromGroup = optionsFromGroup;
15164
15115
  this.search = signal('', ...(ngDevMode ? [{ debugName: "search" }] : []));
15165
- this.group = computed(() => ({ options: this.filterStore.filteredData() }), ...(ngDevMode ? [{ debugName: "group" }] : []));
15116
+ this.group = computed(() => ({
15117
+ options: populateWithTrackIdsFilterData(this.data() || [])
15118
+ }), ...(ngDevMode ? [{ debugName: "group" }] : []));
15166
15119
  this.disabledValues = computed(() => disabledValues(this.data()), ...(ngDevMode ? [{ debugName: "disabledValues" }] : []));
15167
- effect(() => this.data() && this.filterStore.setData(this.data()));
15168
15120
  effect(() => (this.panelStates = Object.fromEntries(
15169
15121
  /* eslint-disable-next-line complexity */
15170
15122
  allGroups(this.data()).map(({ label, type }, index) => [
@@ -15183,9 +15135,6 @@ class FilterAccordionComponent extends ControlValueAccessor {
15183
15135
  this.selectControl.setValue(value);
15184
15136
  this.updateSelectedValues(value);
15185
15137
  }
15186
- ngOnInit() {
15187
- this.filterStore.setValue(this.selectControl.valueChanges.pipe(startWith(this.selectControl.value)));
15188
- }
15189
15138
  updateSelectedValues(value) {
15190
15139
  const disabledValues = this.disabledValues();
15191
15140
  const nonDisabledValues = value?.filter(v => !disabledValues.includes(v)) ?? [];
@@ -15261,17 +15210,8 @@ class FilterAccordionComponent extends ControlValueAccessor {
15261
15210
  provide: NG_VALUE_ACCESSOR,
15262
15211
  useExisting: forwardRef(() => FilterAccordionComponent),
15263
15212
  multi: true
15264
- },
15265
- FilterStore
15266
- ], usesInheritance: true, ngImport: i0, template: "<div class=\"is-flex is-flex-direction-column is-gap-12 w-100\">\n @if (showHeader()) {\n <div class=\"is-flex is-flex-direction-column is-gap-12 is-justify-content-space-between is-align-items-flex-start\">\n @if (title()) {\n <div class=\"is-flex is-align-items-center\">\n <span class=\"has-text-secondary has-text-weight-semibold\">{{ title() }}</span>\n @if (tooltip()) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"is-ml-1 is-mb-1 has-text-grey-light is-clickable\"\n [ngbTooltip]=\"tooltip()\"\n placement=\"right\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n </div>\n }\n\n <ng-content select=\"[header-content]\" />\n\n @if (showClearAll()) {\n <span\n class=\"is-size-7 has-text-weight-normal is-italic | clear-button\"\n [class.is-clickable]=\"hasSelectedValues()\"\n (click)=\"hasSelectedValues() && clearAll()\">\n Clear all\n </span>\n }\n\n @if (showGlobalSearch()) {\n <div class=\"field is-mb-0 w-100\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n [placeholder]=\"globalSearchPlaceholder()\"\n [(ngModel)]=\"search\"\n [disabled]=\"disabled()\"\n (input)=\"onSearch($event.target.value, group())\" />\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"!search()\" (click)=\"clearSearch()\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"search()\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"has-border-top has-border-bottom\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: { group: group(), parentSearch: search(), showNoResults: showGlobalSearch() }\n \" />\n </div>\n</div>\n\n<ng-template #itemsList let-group=\"group\" let-parentSearch=\"parentSearch\" let-showNoResults=\"showNoResults\">\n @for (item of group | filterAccordionGroup: parentSearch; track item.trackId || item.label; let lastItem = $last) {\n @if (item.type === 'group') {\n @let groupState = panelStates[item.label];\n @if (groupState) {\n <div [class.has-border-bottom]=\"!lastItem\" [class.is-active]=\"groupState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover is-py-1 | accordion-row\"\n (click)=\"groupState.expanded = !groupState.expanded\">\n <ng-container *ngTemplateOutlet=\"groupOptionLabel; context: { item, groupState }\" />\n </div>\n\n @if (groupState.expanded) {\n <div class=\"is-overflow-hidden\" [@slideDownUp]=\"groupState.expanded\">\n @if (!showGlobalSearch() && getDirectOptionsCount(item) >= 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right pl-5\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input pl-2\"\n placeholder=\"Search {{ item.label }}\"\n [value]=\"groupState.searchTerm || ''\"\n [disabled]=\"isItemEffectivelyDisabled(item)\"\n (input)=\"groupState.searchTerm = $event.target.value; onSearch($event.target.value, item)\" />\n <a\n class=\"icon has-text-secondary is-small is-right\"\n [class.is-hidden]=\"!groupState.searchTerm\"\n (click)=\"groupState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small has-text-secondary is-right\" [class.is-hidden]=\"groupState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n\n <div class=\"pl-5\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: {\n group: item,\n parentSearch: parentSearch || groupState.searchTerm,\n showNoResults: !showGlobalSearch()\n }\n \" />\n </div>\n </div>\n }\n </div>\n }\n } @else {\n <div\n class=\"is-flex is-justify-content-space-between is-py-1 | accordion-row\"\n [class.has-border-bottom]=\"!lastItem\">\n <ng-container *ngTemplateOutlet=\"optionLabel; context: { item }\" />\n </div>\n }\n } @empty {\n @if (parentSearch && showNoResults) {\n <div class=\"px-6 py-4 has-text-grey is-size-7 has-text-centered is-italic\">\n No results found for \"{{ parentSearch }}\"\n </div>\n }\n }\n</ng-template>\n\n<ng-template #itemLabel let-item=\"item\" let-count=\"count\">\n <span class=\"is-flex is-gap-4 is-flex-wrap-wrap is-flex-grow-1 is-size-7 has-text-grey-dark has-text-weight-medium\">\n <span>{{ item.label }}</span>\n\n @if (item.tooltip) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"has-text-grey-light\"\n [ngbTooltip]=\"item.tooltip\"\n placement=\"top\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n\n @if (isNumber(count)) {\n <span class=\"has-text-grey-light is-size-7\">({{ count }})</span>\n }\n </span>\n</ng-template>\n\n<ng-template #groupOptionLabel let-item=\"item\" let-groupState=\"groupState\">\n @let options = optionsFromGroup(item);\n\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isGroupFullySelected(options)\"\n [indeterminate]=\"isGroupPartiallySelected(options)\"\n (change)=\"toggleGroup(options)\"\n [disabled]=\"isItemEffectivelyDisabled(item)\" />\n </label>\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: showGroupCount() ? item.count : undefined }\" />\n\n <he-svg-icon\n class=\"has-text-secondary transition-transform\"\n [name]=\"groupState.expanded ? 'chevron-up' : 'chevron-down'\" />\n</ng-template>\n\n<ng-template #optionLabel let-item=\"item\" let-parentDisabled=\"parentDisabled\">\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isOptionSelected(item.value)\"\n (change)=\"toggleOption(item.value)\"\n [disabled]=\"isItemEffectivelyDisabled(item, parentDisabled)\" />\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: item.count }\" />\n </label>\n</ng-template>\n", styles: [".clear-button{color:#b5b5b5}.clear-button.is-clickable{color:#4c7194}.accordion-row{min-height:25px}.control{height:28px}.control.has-icons-left .icon,.control.has-icons-right .icon{height:28px!important}.search-input{height:28px;border:1px solid #dbe3ea;border-radius:3px;font-weight:400;line-height:17px;box-shadow:none!important}.has-background-hover-light:hover{background-color:#fafafa}.has-border-top{border-top:1px solid #dbe3ea}.has-border-bottom{border-bottom:1px solid #dbe3ea}.transition-transform{transition:transform .2s ease-out}input[type=checkbox]{height:14px;width:14px;border:1px solid #b5b5b5;border-radius:3px;appearance:none;-webkit-appearance:none;background-color:transparent;accent-color:transparent}input[type=checkbox]:disabled{background-color:#f5f5f5}input[type=checkbox]:checked{background-color:#4c7194;accent-color:#4c7194;appearance:auto;-webkit-appearance:auto}\n"], dependencies: [{ 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.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: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: InputIndeterminateDirective, selector: "input[indeterminate]", inputs: ["indeterminate"] }, { kind: "pipe", type: FilterAccordionGroupPipe, name: "filterAccordionGroup" }], animations: [
15267
- trigger('slideDownUp', [
15268
- transition(':enter', [
15269
- style({ maxHeight: '0', opacity: 0 }),
15270
- animate('200ms ease-in', style({ maxHeight: '1000px', opacity: 1 }))
15271
- ]),
15272
- transition(':leave', [animate('200ms ease-out', style({ maxHeight: '0', opacity: 0 }))])
15273
- ])
15274
- ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15213
+ }
15214
+ ], usesInheritance: true, ngImport: i0, template: "<div class=\"is-flex is-flex-direction-column is-gap-12 w-100\">\n @if (showHeader()) {\n <div class=\"is-flex is-flex-direction-column is-gap-12 is-justify-content-space-between is-align-items-flex-start\">\n @if (title()) {\n <div class=\"is-flex is-align-items-center\">\n <span class=\"has-text-secondary has-text-weight-semibold\">{{ title() }}</span>\n @if (tooltip()) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"is-ml-1 is-mb-1 has-text-grey-light is-clickable\"\n [ngbTooltip]=\"tooltip()\"\n placement=\"right\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n </div>\n }\n\n <ng-content select=\"[header-content]\" />\n\n @if (showClearAll()) {\n <span\n class=\"is-size-7 has-text-weight-normal is-italic | clear-button\"\n [class.is-clickable]=\"hasSelectedValues()\"\n (click)=\"hasSelectedValues() && clearAll()\">\n Clear all\n </span>\n }\n\n @if (showGlobalSearch()) {\n <div class=\"field is-mb-0 w-100\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n [placeholder]=\"globalSearchPlaceholder()\"\n [(ngModel)]=\"search\"\n [disabled]=\"disabled()\"\n (input)=\"onSearch($event.target.value, group())\" />\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"!search()\" (click)=\"clearSearch()\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"search()\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"has-border-top has-border-bottom\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: { group: group(), parentSearch: search(), showNoResults: showGlobalSearch() }\n \" />\n </div>\n</div>\n\n<ng-template #itemsList let-group=\"group\" let-parentSearch=\"parentSearch\" let-showNoResults=\"showNoResults\">\n @for (item of group | filterAccordionGroup: parentSearch; track item.trackId || item.label; let lastItem = $last) {\n @if (item.type === 'group') {\n @let groupState = panelStates[item.label];\n @if (groupState) {\n <div [class.has-border-bottom]=\"!lastItem\" [class.is-active]=\"groupState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover is-py-1 | accordion-row\"\n (click)=\"groupState.expanded = !groupState.expanded\">\n <ng-container *ngTemplateOutlet=\"groupOptionLabel; context: { item, groupState }\" />\n </div>\n\n @if (groupState.expanded) {\n <div class=\"is-overflow-hidden\" animate.enter=\"slide-down\" animate.leave=\"slide-up\">\n @if (!showGlobalSearch() && getDirectOptionsCount(item) >= 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right pl-5\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input pl-2\"\n placeholder=\"Search {{ item.label }}\"\n [value]=\"groupState.searchTerm || ''\"\n [disabled]=\"isItemEffectivelyDisabled(item)\"\n (input)=\"groupState.searchTerm = $event.target.value; onSearch($event.target.value, item)\" />\n <a\n class=\"icon has-text-secondary is-small is-right\"\n [class.is-hidden]=\"!groupState.searchTerm\"\n (click)=\"groupState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small has-text-secondary is-right\" [class.is-hidden]=\"groupState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n\n <div class=\"pl-5\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: {\n group: item,\n parentSearch: parentSearch || groupState.searchTerm,\n showNoResults: !showGlobalSearch()\n }\n \" />\n </div>\n </div>\n }\n </div>\n }\n } @else {\n <div\n class=\"is-flex is-justify-content-space-between is-py-1 | accordion-row\"\n [class.has-border-bottom]=\"!lastItem\">\n <ng-container *ngTemplateOutlet=\"optionLabel; context: { item }\" />\n </div>\n }\n } @empty {\n @if (parentSearch && showNoResults) {\n <div class=\"px-6 py-4 has-text-grey is-size-7 has-text-centered is-italic\">\n No results found for \"{{ parentSearch }}\"\n </div>\n }\n }\n</ng-template>\n\n<ng-template #itemLabel let-item=\"item\" let-count=\"count\">\n <span class=\"is-flex is-gap-4 is-flex-wrap-wrap is-flex-grow-1 is-size-7 has-text-grey-dark has-text-weight-medium\">\n <span>{{ item.label }}</span>\n\n @if (item.tooltip) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"has-text-grey-light\"\n [ngbTooltip]=\"item.tooltip\"\n placement=\"top\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n\n @if (isNumber(count)) {\n <span class=\"has-text-grey-light is-size-7\">({{ count }})</span>\n }\n </span>\n</ng-template>\n\n<ng-template #groupOptionLabel let-item=\"item\" let-groupState=\"groupState\">\n @let options = optionsFromGroup(item);\n\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isGroupFullySelected(options)\"\n [indeterminate]=\"isGroupPartiallySelected(options)\"\n (change)=\"toggleGroup(options)\"\n [disabled]=\"isItemEffectivelyDisabled(item)\" />\n </label>\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: showGroupCount() ? item.count : undefined }\" />\n\n <he-svg-icon\n class=\"has-text-secondary transition-transform\"\n [name]=\"groupState.expanded ? 'chevron-up' : 'chevron-down'\" />\n</ng-template>\n\n<ng-template #optionLabel let-item=\"item\" let-parentDisabled=\"parentDisabled\">\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isOptionSelected(item.value)\"\n (change)=\"toggleOption(item.value)\"\n [disabled]=\"isItemEffectivelyDisabled(item, parentDisabled)\" />\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: item.count }\" />\n </label>\n</ng-template>\n", styles: ["@keyframes slideDown{0%{max-height:0;opacity:0}to{max-height:1000px;opacity:1}}@keyframes slideUp{0%{max-height:1000px;opacity:1}to{max-height:0;opacity:0}}.slide-down{animation:slideDown .2s ease-in;overflow:hidden}.slide-up{animation:slideUp .2s ease-out;overflow:hidden}.clear-button{color:#b5b5b5}.clear-button.is-clickable{color:#4c7194}.accordion-row{min-height:25px}.control{height:28px}.control.has-icons-left .icon,.control.has-icons-right .icon{height:28px!important}.search-input{height:28px;border:1px solid #dbe3ea;border-radius:3px;font-weight:400;line-height:17px;box-shadow:none!important}.has-background-hover-light:hover{background-color:#fafafa}.has-border-top{border-top:1px solid #dbe3ea}.has-border-bottom{border-bottom:1px solid #dbe3ea}.transition-transform{transition:transform .2s ease-out}input[type=checkbox]{height:14px;width:14px;border:1px solid #b5b5b5;border-radius:3px;appearance:none;-webkit-appearance:none;background-color:transparent;accent-color:transparent}input[type=checkbox]:disabled{background-color:#f5f5f5}input[type=checkbox]:checked{background-color:#4c7194;accent-color:#4c7194;appearance:auto;-webkit-appearance:auto}\n"], dependencies: [{ 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.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: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: InputIndeterminateDirective, selector: "input[indeterminate]", inputs: ["indeterminate"] }, { kind: "pipe", type: FilterAccordionGroupPipe, name: "filterAccordionGroup" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15275
15215
  }
15276
15216
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FilterAccordionComponent, decorators: [{
15277
15217
  type: Component$1,
@@ -15280,8 +15220,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
15280
15220
  provide: NG_VALUE_ACCESSOR,
15281
15221
  useExisting: forwardRef(() => FilterAccordionComponent),
15282
15222
  multi: true
15283
- },
15284
- FilterStore
15223
+ }
15285
15224
  ], imports: [
15286
15225
  FormsModule,
15287
15226
  ReactiveFormsModule,
@@ -15290,15 +15229,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
15290
15229
  NgTemplateOutlet,
15291
15230
  FilterAccordionGroupPipe,
15292
15231
  InputIndeterminateDirective
15293
- ], animations: [
15294
- trigger('slideDownUp', [
15295
- transition(':enter', [
15296
- style({ maxHeight: '0', opacity: 0 }),
15297
- animate('200ms ease-in', style({ maxHeight: '1000px', opacity: 1 }))
15298
- ]),
15299
- transition(':leave', [animate('200ms ease-out', style({ maxHeight: '0', opacity: 0 }))])
15300
- ])
15301
- ], template: "<div class=\"is-flex is-flex-direction-column is-gap-12 w-100\">\n @if (showHeader()) {\n <div class=\"is-flex is-flex-direction-column is-gap-12 is-justify-content-space-between is-align-items-flex-start\">\n @if (title()) {\n <div class=\"is-flex is-align-items-center\">\n <span class=\"has-text-secondary has-text-weight-semibold\">{{ title() }}</span>\n @if (tooltip()) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"is-ml-1 is-mb-1 has-text-grey-light is-clickable\"\n [ngbTooltip]=\"tooltip()\"\n placement=\"right\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n </div>\n }\n\n <ng-content select=\"[header-content]\" />\n\n @if (showClearAll()) {\n <span\n class=\"is-size-7 has-text-weight-normal is-italic | clear-button\"\n [class.is-clickable]=\"hasSelectedValues()\"\n (click)=\"hasSelectedValues() && clearAll()\">\n Clear all\n </span>\n }\n\n @if (showGlobalSearch()) {\n <div class=\"field is-mb-0 w-100\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n [placeholder]=\"globalSearchPlaceholder()\"\n [(ngModel)]=\"search\"\n [disabled]=\"disabled()\"\n (input)=\"onSearch($event.target.value, group())\" />\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"!search()\" (click)=\"clearSearch()\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"search()\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"has-border-top has-border-bottom\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: { group: group(), parentSearch: search(), showNoResults: showGlobalSearch() }\n \" />\n </div>\n</div>\n\n<ng-template #itemsList let-group=\"group\" let-parentSearch=\"parentSearch\" let-showNoResults=\"showNoResults\">\n @for (item of group | filterAccordionGroup: parentSearch; track item.trackId || item.label; let lastItem = $last) {\n @if (item.type === 'group') {\n @let groupState = panelStates[item.label];\n @if (groupState) {\n <div [class.has-border-bottom]=\"!lastItem\" [class.is-active]=\"groupState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover is-py-1 | accordion-row\"\n (click)=\"groupState.expanded = !groupState.expanded\">\n <ng-container *ngTemplateOutlet=\"groupOptionLabel; context: { item, groupState }\" />\n </div>\n\n @if (groupState.expanded) {\n <div class=\"is-overflow-hidden\" [@slideDownUp]=\"groupState.expanded\">\n @if (!showGlobalSearch() && getDirectOptionsCount(item) >= 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right pl-5\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input pl-2\"\n placeholder=\"Search {{ item.label }}\"\n [value]=\"groupState.searchTerm || ''\"\n [disabled]=\"isItemEffectivelyDisabled(item)\"\n (input)=\"groupState.searchTerm = $event.target.value; onSearch($event.target.value, item)\" />\n <a\n class=\"icon has-text-secondary is-small is-right\"\n [class.is-hidden]=\"!groupState.searchTerm\"\n (click)=\"groupState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small has-text-secondary is-right\" [class.is-hidden]=\"groupState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n\n <div class=\"pl-5\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: {\n group: item,\n parentSearch: parentSearch || groupState.searchTerm,\n showNoResults: !showGlobalSearch()\n }\n \" />\n </div>\n </div>\n }\n </div>\n }\n } @else {\n <div\n class=\"is-flex is-justify-content-space-between is-py-1 | accordion-row\"\n [class.has-border-bottom]=\"!lastItem\">\n <ng-container *ngTemplateOutlet=\"optionLabel; context: { item }\" />\n </div>\n }\n } @empty {\n @if (parentSearch && showNoResults) {\n <div class=\"px-6 py-4 has-text-grey is-size-7 has-text-centered is-italic\">\n No results found for \"{{ parentSearch }}\"\n </div>\n }\n }\n</ng-template>\n\n<ng-template #itemLabel let-item=\"item\" let-count=\"count\">\n <span class=\"is-flex is-gap-4 is-flex-wrap-wrap is-flex-grow-1 is-size-7 has-text-grey-dark has-text-weight-medium\">\n <span>{{ item.label }}</span>\n\n @if (item.tooltip) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"has-text-grey-light\"\n [ngbTooltip]=\"item.tooltip\"\n placement=\"top\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n\n @if (isNumber(count)) {\n <span class=\"has-text-grey-light is-size-7\">({{ count }})</span>\n }\n </span>\n</ng-template>\n\n<ng-template #groupOptionLabel let-item=\"item\" let-groupState=\"groupState\">\n @let options = optionsFromGroup(item);\n\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isGroupFullySelected(options)\"\n [indeterminate]=\"isGroupPartiallySelected(options)\"\n (change)=\"toggleGroup(options)\"\n [disabled]=\"isItemEffectivelyDisabled(item)\" />\n </label>\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: showGroupCount() ? item.count : undefined }\" />\n\n <he-svg-icon\n class=\"has-text-secondary transition-transform\"\n [name]=\"groupState.expanded ? 'chevron-up' : 'chevron-down'\" />\n</ng-template>\n\n<ng-template #optionLabel let-item=\"item\" let-parentDisabled=\"parentDisabled\">\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isOptionSelected(item.value)\"\n (change)=\"toggleOption(item.value)\"\n [disabled]=\"isItemEffectivelyDisabled(item, parentDisabled)\" />\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: item.count }\" />\n </label>\n</ng-template>\n", styles: [".clear-button{color:#b5b5b5}.clear-button.is-clickable{color:#4c7194}.accordion-row{min-height:25px}.control{height:28px}.control.has-icons-left .icon,.control.has-icons-right .icon{height:28px!important}.search-input{height:28px;border:1px solid #dbe3ea;border-radius:3px;font-weight:400;line-height:17px;box-shadow:none!important}.has-background-hover-light:hover{background-color:#fafafa}.has-border-top{border-top:1px solid #dbe3ea}.has-border-bottom{border-bottom:1px solid #dbe3ea}.transition-transform{transition:transform .2s ease-out}input[type=checkbox]{height:14px;width:14px;border:1px solid #b5b5b5;border-radius:3px;appearance:none;-webkit-appearance:none;background-color:transparent;accent-color:transparent}input[type=checkbox]:disabled{background-color:#f5f5f5}input[type=checkbox]:checked{background-color:#4c7194;accent-color:#4c7194;appearance:auto;-webkit-appearance:auto}\n"] }]
15232
+ ], template: "<div class=\"is-flex is-flex-direction-column is-gap-12 w-100\">\n @if (showHeader()) {\n <div class=\"is-flex is-flex-direction-column is-gap-12 is-justify-content-space-between is-align-items-flex-start\">\n @if (title()) {\n <div class=\"is-flex is-align-items-center\">\n <span class=\"has-text-secondary has-text-weight-semibold\">{{ title() }}</span>\n @if (tooltip()) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"is-ml-1 is-mb-1 has-text-grey-light is-clickable\"\n [ngbTooltip]=\"tooltip()\"\n placement=\"right\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n </div>\n }\n\n <ng-content select=\"[header-content]\" />\n\n @if (showClearAll()) {\n <span\n class=\"is-size-7 has-text-weight-normal is-italic | clear-button\"\n [class.is-clickable]=\"hasSelectedValues()\"\n (click)=\"hasSelectedValues() && clearAll()\">\n Clear all\n </span>\n }\n\n @if (showGlobalSearch()) {\n <div class=\"field is-mb-0 w-100\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n [placeholder]=\"globalSearchPlaceholder()\"\n [(ngModel)]=\"search\"\n [disabled]=\"disabled()\"\n (input)=\"onSearch($event.target.value, group())\" />\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"!search()\" (click)=\"clearSearch()\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"search()\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"has-border-top has-border-bottom\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: { group: group(), parentSearch: search(), showNoResults: showGlobalSearch() }\n \" />\n </div>\n</div>\n\n<ng-template #itemsList let-group=\"group\" let-parentSearch=\"parentSearch\" let-showNoResults=\"showNoResults\">\n @for (item of group | filterAccordionGroup: parentSearch; track item.trackId || item.label; let lastItem = $last) {\n @if (item.type === 'group') {\n @let groupState = panelStates[item.label];\n @if (groupState) {\n <div [class.has-border-bottom]=\"!lastItem\" [class.is-active]=\"groupState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover is-py-1 | accordion-row\"\n (click)=\"groupState.expanded = !groupState.expanded\">\n <ng-container *ngTemplateOutlet=\"groupOptionLabel; context: { item, groupState }\" />\n </div>\n\n @if (groupState.expanded) {\n <div class=\"is-overflow-hidden\" animate.enter=\"slide-down\" animate.leave=\"slide-up\">\n @if (!showGlobalSearch() && getDirectOptionsCount(item) >= 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right pl-5\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input pl-2\"\n placeholder=\"Search {{ item.label }}\"\n [value]=\"groupState.searchTerm || ''\"\n [disabled]=\"isItemEffectivelyDisabled(item)\"\n (input)=\"groupState.searchTerm = $event.target.value; onSearch($event.target.value, item)\" />\n <a\n class=\"icon has-text-secondary is-small is-right\"\n [class.is-hidden]=\"!groupState.searchTerm\"\n (click)=\"groupState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small has-text-secondary is-right\" [class.is-hidden]=\"groupState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n\n <div class=\"pl-5\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: {\n group: item,\n parentSearch: parentSearch || groupState.searchTerm,\n showNoResults: !showGlobalSearch()\n }\n \" />\n </div>\n </div>\n }\n </div>\n }\n } @else {\n <div\n class=\"is-flex is-justify-content-space-between is-py-1 | accordion-row\"\n [class.has-border-bottom]=\"!lastItem\">\n <ng-container *ngTemplateOutlet=\"optionLabel; context: { item }\" />\n </div>\n }\n } @empty {\n @if (parentSearch && showNoResults) {\n <div class=\"px-6 py-4 has-text-grey is-size-7 has-text-centered is-italic\">\n No results found for \"{{ parentSearch }}\"\n </div>\n }\n }\n</ng-template>\n\n<ng-template #itemLabel let-item=\"item\" let-count=\"count\">\n <span class=\"is-flex is-gap-4 is-flex-wrap-wrap is-flex-grow-1 is-size-7 has-text-grey-dark has-text-weight-medium\">\n <span>{{ item.label }}</span>\n\n @if (item.tooltip) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"has-text-grey-light\"\n [ngbTooltip]=\"item.tooltip\"\n placement=\"top\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n\n @if (isNumber(count)) {\n <span class=\"has-text-grey-light is-size-7\">({{ count }})</span>\n }\n </span>\n</ng-template>\n\n<ng-template #groupOptionLabel let-item=\"item\" let-groupState=\"groupState\">\n @let options = optionsFromGroup(item);\n\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isGroupFullySelected(options)\"\n [indeterminate]=\"isGroupPartiallySelected(options)\"\n (change)=\"toggleGroup(options)\"\n [disabled]=\"isItemEffectivelyDisabled(item)\" />\n </label>\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: showGroupCount() ? item.count : undefined }\" />\n\n <he-svg-icon\n class=\"has-text-secondary transition-transform\"\n [name]=\"groupState.expanded ? 'chevron-up' : 'chevron-down'\" />\n</ng-template>\n\n<ng-template #optionLabel let-item=\"item\" let-parentDisabled=\"parentDisabled\">\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isOptionSelected(item.value)\"\n (change)=\"toggleOption(item.value)\"\n [disabled]=\"isItemEffectivelyDisabled(item, parentDisabled)\" />\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: item.count }\" />\n </label>\n</ng-template>\n", styles: ["@keyframes slideDown{0%{max-height:0;opacity:0}to{max-height:1000px;opacity:1}}@keyframes slideUp{0%{max-height:1000px;opacity:1}to{max-height:0;opacity:0}}.slide-down{animation:slideDown .2s ease-in;overflow:hidden}.slide-up{animation:slideUp .2s ease-out;overflow:hidden}.clear-button{color:#b5b5b5}.clear-button.is-clickable{color:#4c7194}.accordion-row{min-height:25px}.control{height:28px}.control.has-icons-left .icon,.control.has-icons-right .icon{height:28px!important}.search-input{height:28px;border:1px solid #dbe3ea;border-radius:3px;font-weight:400;line-height:17px;box-shadow:none!important}.has-background-hover-light:hover{background-color:#fafafa}.has-border-top{border-top:1px solid #dbe3ea}.has-border-bottom{border-bottom:1px solid #dbe3ea}.transition-transform{transition:transform .2s ease-out}input[type=checkbox]{height:14px;width:14px;border:1px solid #b5b5b5;border-radius:3px;appearance:none;-webkit-appearance:none;background-color:transparent;accent-color:transparent}input[type=checkbox]:disabled{background-color:#f5f5f5}input[type=checkbox]:checked{background-color:#4c7194;accent-color:#4c7194;appearance:auto;-webkit-appearance:auto}\n"] }]
15302
15233
  }], ctorParameters: () => [], propDecorators: { showHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "showHeader", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], tooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltip", required: false }] }], showGlobalSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGlobalSearch", required: false }] }], globalSearchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "globalSearchPlaceholder", required: false }] }], showClearAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClearAll", required: false }] }], preserveOptionsOnSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "preserveOptionsOnSelection", required: false }] }], maintainPanelStates: [{ type: i0.Input, args: [{ isSignal: true, alias: "maintainPanelStates", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], showGroupCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGroupCount", required: false }] }], expandFirstGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandFirstGroup", required: false }] }], selectionChanged: [{ type: i0.Output, args: ["selectionChanged"] }] } });
15303
15234
 
15304
15235
  const termTypeName = (select) => [
@@ -15640,5 +15571,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
15640
15571
  * Generated bundle index. Do not edit.
15641
15572
  */
15642
15573
 
15643
- export { ARRAY_DELIMITER, ApplyPurePipe, BarChartComponent, BibliographiesSearchConfirmComponent, BlankNodeStateComponent, BlankNodeStateNoticeComponent, BlankNodeValueDeltaComponent, CapitalizePipe, ChartComponent, ChartConfigurationDirective, ChartExportButtonComponent, ChartTooltipComponent, ClickOutsideDirective, ClipboardComponent, CollapsibleBoxComponent, CollapsibleBoxStyle, ColorPalette, CompoundDirective, CompoundPipe, ContributionChartComponent, ControlValueAccessor, CycleNodesKeyGroup, CyclesCompletenessComponent, CyclesEmissionsCategoryService, CyclesEmissionsChartComponent, CyclesFunctionalUnitMeasureComponent, CyclesMetadataComponent, CyclesNodesComponent, CyclesNodesTimelineComponent, CyclesResultComponent, DataTableComponent, DefaultPipe, DeltaColour, DistributionChartComponent, DrawerContainerComponent, DurationPipe, EllipsisPipe, EngineModelsLinkComponent, EngineModelsLookupInfoComponent, EngineModelsStageComponent, EngineModelsStageDeepComponent, EngineModelsStageDeepService, EngineModelsVersionInfoComponent, 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, MaxPipe, MeanPipe, MedianPipe, MendeleySearchResult, MinPipe, MobileShellComponent, NavigationMenuComponent, NoExtPipe, NodeAggregatedComponent, NodeAggregatedInfoComponent, NodeAggregatedQualityScoreComponent, NodeCsvExportConfirmComponent, NodeCsvPreviewComponent, NodeCsvSelectHeadersComponent, NodeIconComponent, NodeJsonldComponent, NodeJsonldSchemaComponent, NodeKeyState, NodeLinkComponent, NodeLogsFileComponent, NodeLogsModelsComponent, NodeLogsTimeComponent, NodeMissingLookupFactorsComponent, NodeQualityScore, NodeRecommendationsComponent, NodeSelectComponent, NodeValueDetailsComponent, PipelineStagesProgressComponent, PluralizePipe, PopoverComponent, PopoverConfirmComponent, PrecisionPipe, RelatedNodeResult, RemoveMarkdownPipe, RepeatPipe, Repository, ResizedDirective, ResizedEvent, ResponsiveService, SchemaInfoComponent, SchemaVersionLinkComponent, SearchExtendComponent, ShelfDialogComponent, ShellComponent, SitesManagementChartComponent, SitesMapsComponent, SitesNodesComponent, SkeletonTextComponent, SocialTagsComponent, SortByPipe, SortSelectComponent, SumPipe, TagsInputDirective, Template, TermsPropertyContentComponent, TermsSubClassOfContentComponent, TermsUnitsDescriptionComponent, ThousandSuffixesPipe, ThousandsPipe, TimesPipe, ToastComponent, UncapitalizePipe, addPolygonToFeature, afterBarDrawPlugin, allCountriesQuery, allGroups, allOptions, availableProperties, axisHoverPlugin, backgroundHoverPlugin, baseApiUrl, baseUrl, bottom, buildSummary, bytesSize, calculateCycleDuration, calculateCycleDurationEnabled, calculateCycleStartDate, calculateCycleStartDateEnabled, capitalize, changelogUrl, clustererImage, code, colorToRgba, compoundToHtml, computeKeys, computeTerms, contactUsEmail, contactUsLink, convertToSvg, coordinatesToPoint, copyObject, countGroupVisibleNodes, countriesQuery, createMarker, cropsQuery, d3ellipse, d3wrap, dataPathLabel, dataPathToKey, dataVersionHeader, dataVersionHeaderKey, defaultFeature, defaultLabel, defaultSuggestionType, defaultSvgIconSize, defaultTicksFont, definitionToSchemaType, distinctUntilChangedDeep, downloadFile, downloadPng, downloadSvg, ellipsis, engineGitBaseUrl, engineGitUrl, errorHasError, errorHasWarning, errorText, evaluateSuccess, exportAsSVG, exportFormats, 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, increaseScaleLimits, initialFilterState, injectResizeEvent$, inputGroupsTermTypes, isAddPropertyEnabled, isChrome, isDateBetween, isEqual, isExternal, isKeyClosedVisible, isKeyHidden, isMaxStage, isMethodModelAllowed, isMigrationError, isMissingOneOfError, isMissingPropertyError, isNonNodeModelKey, isSchemaIri, isScrolledBelow, isState, isTermTypeAllowed, isValidKey, keyToDataPath, levels, listColor, listColorContinuous, listColorWithAlpha, loadMapApi, loadSvgSprite, locationQuery, logToCsv$2 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, nodeDataStates, nodeId, nodeIds, nodeLink, nodeLinkEnabled, nodeLinkTypeEnabled, nodeLogsUrl, nodeQualityScoreColor, nodeQualityScoreLevel, nodeQualityScoreMaxDefault, nodeQualityScoreOrder, nodeSecondaryColours, nodeToAggregationFilename, nodeType, nodeTypeDataState, nodeTypeIcon, nodeTypeIconSchema, nodeUrl, nodeUrlParams, nodeVersion, nodesByState, nodesByType, numberGte, optionsFromGroup, parentKey, parentProperty, parseColor, parseData, parseDataPath, parseLines, parseLogMessage, 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, simplifyContributions, singleProperty, siteTooBig, siteTypeToColor, siteTypeToIcon, sortProperties, sortedDates, strokeColor, strokeStyle, suggestMatchQuery, suggestQuery, takeAfterViewInit, termLocation, termLocationName, termProperties, termTypeLabel, toSnakeCase, toThousands, typeToNewProperty, typeaheadFocus, uncapitalize, uniqueDatesBetween, updateProperties, valueLink, valueToString, valueTypeToDefault, valueValue, waitFor, wildcardQuery };
15574
+ export { ARRAY_DELIMITER, ApplyPurePipe, BarChartComponent, BibliographiesSearchConfirmComponent, BlankNodeStateComponent, BlankNodeStateNoticeComponent, BlankNodeValueDeltaComponent, CapitalizePipe, ChartComponent, ChartConfigurationDirective, ChartExportButtonComponent, ChartTooltipComponent, ClickOutsideDirective, ClipboardComponent, CollapsibleBoxComponent, CollapsibleBoxStyle, ColorPalette, CompoundDirective, CompoundPipe, ContributionChartComponent, ControlValueAccessor, CycleNodesKeyGroup, CyclesCompletenessComponent, CyclesEmissionsCategoryService, CyclesEmissionsChartComponent, CyclesFunctionalUnitMeasureComponent, CyclesMetadataComponent, CyclesNodesComponent, CyclesNodesTimelineComponent, CyclesResultComponent, DataTableComponent, DefaultPipe, DeltaColour, DistributionChartComponent, DrawerContainerComponent, DurationPipe, EllipsisPipe, EngineModelsLinkComponent, EngineModelsLookupInfoComponent, EngineModelsStageComponent, EngineModelsStageDeepComponent, EngineModelsStageDeepService, EngineModelsVersionInfoComponent, 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, MaxPipe, MeanPipe, MedianPipe, MendeleySearchResult, MinPipe, MobileShellComponent, NavigationMenuComponent, NoExtPipe, NodeAggregatedComponent, NodeAggregatedInfoComponent, NodeAggregatedQualityScoreComponent, NodeCsvExportConfirmComponent, NodeCsvPreviewComponent, NodeCsvSelectHeadersComponent, NodeIconComponent, NodeJsonldComponent, NodeJsonldSchemaComponent, NodeKeyState, NodeLinkComponent, NodeLogsFileComponent, NodeLogsModelsComponent, NodeLogsTimeComponent, NodeMissingLookupFactorsComponent, NodeQualityScore, NodeRecommendationsComponent, NodeSelectComponent, NodeValueDetailsComponent, PipelineStagesProgressComponent, PluralizePipe, PopoverComponent, PopoverConfirmComponent, PrecisionPipe, RelatedNodeResult, RemoveMarkdownPipe, RepeatPipe, Repository, ResizedDirective, ResizedEvent, ResponsiveService, SchemaInfoComponent, SchemaVersionLinkComponent, SearchExtendComponent, ShelfDialogComponent, ShellComponent, SitesManagementChartComponent, SitesMapsComponent, SitesNodesComponent, SkeletonTextComponent, SocialTagsComponent, SortByPipe, SortSelectComponent, SumPipe, TagsInputDirective, Template, TermsPropertyContentComponent, TermsSubClassOfContentComponent, TermsUnitsDescriptionComponent, ThousandSuffixesPipe, ThousandsPipe, TimesPipe, ToastComponent, UncapitalizePipe, addPolygonToFeature, afterBarDrawPlugin, allCountriesQuery, allGroups, allOptions, availableProperties, axisHoverPlugin, backgroundHoverPlugin, baseApiUrl, baseUrl, bottom, buildSummary, bytesSize, calculateCycleDuration, calculateCycleDurationEnabled, calculateCycleStartDate, calculateCycleStartDateEnabled, capitalize, changelogUrl, clustererImage, code, colorToRgba, compoundToHtml, computeKeys, computeTerms, contactUsEmail, contactUsLink, convertToSvg, coordinatesToPoint, copyObject, countGroupVisibleNodes, countriesQuery, createMarker, cropsQuery, d3ellipse, d3wrap, dataPathLabel, dataPathToKey, dataVersionHeader, dataVersionHeaderKey, defaultFeature, defaultLabel, defaultSuggestionType, defaultSvgIconSize, defaultTicksFont, definitionToSchemaType, distinctUntilChangedDeep, downloadFile, downloadPng, downloadSvg, ellipsis, engineGitBaseUrl, engineGitUrl, errorHasError, errorHasWarning, errorText, evaluateSuccess, exportAsSVG, exportFormats, 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, groupLogsByTerm, groupNodesByTerm, groupdLogsByKey, grouppedKeys, grouppedValueKeys, groupsLogsByFields, guideModelUrl, guideNamespace, guidePageId, handleAPIError, handleGuideEvent, hasError, hasValidationError, hasWarning, hexToRgba, iconSizes, icons, ignoreKeys$2 as ignoreKeys, increaseScaleLimits, initialFilterState, injectResizeEvent$, inputGroupsTermTypes, isAddPropertyEnabled, isChrome, isDateBetween, isEqual, isExternal, isKeyClosedVisible, isKeyHidden, isMaxStage, isMethodModelAllowed, isMigrationError, isMissingOneOfError, isMissingPropertyError, isNonNodeModelKey, isSchemaIri, isScrolledBelow, isState, isTermTypeAllowed, isValidKey, keyToDataPath, levels, listColor, listColorContinuous, listColorWithAlpha, loadMapApi, loadSvgSprite, locationQuery, logToCsv$2 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, noValue, nodeAvailableProperties, nodeById, nodeColours$1 as nodeColours, nodeDataState, nodeDataStates, nodeId, nodeIds, nodeLink, nodeLinkEnabled, nodeLinkTypeEnabled, nodeLogsUrl, nodeQualityScoreColor, nodeQualityScoreLevel, nodeQualityScoreMaxDefault, nodeQualityScoreOrder, nodeSecondaryColours, nodeToAggregationFilename, nodeType, nodeTypeDataState, nodeTypeIcon, nodeTypeIconSchema, nodeUrl, nodeUrlParams, nodeVersion, nodesByState, nodesByType, numberGte, optionsFromGroup, parentKey, parentProperty, parseColor, parseData, parseDataPath, parseLines, 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, simplifyContributions, singleProperty, siteTooBig, siteTypeToColor, siteTypeToIcon, sortProperties, sortedDates, strokeColor, strokeStyle, subValueKeys, suggestMatchQuery, suggestQuery, takeAfterViewInit, termLocation, termLocationName, termProperties, termTypeLabel, toSnakeCase, toThousands, typeToNewProperty, typeaheadFocus, uncapitalize, uniqueDatesBetween, updateProperties, valueLink, valueToString, valueTypeToDefault, valueValue, waitFor, wildcardQuery };
15644
15575
  //# sourceMappingURL=hestia-earth-ui-components.mjs.map