@hestia-earth/ui-components 0.41.56 → 0.41.58

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,8 @@ const icons = [
2974
2938
  'unit',
2975
2939
  'upload',
2976
2940
  'video',
2941
+ 'webhook',
2942
+ 'xlsx-file',
2977
2943
  'xmark',
2978
2944
  'xmark-circle',
2979
2945
  'xmark-circle-filled',
@@ -3960,7 +3926,7 @@ const isNode = unknown => {
3960
3926
  Node.prototype.cloneNode.call(unknown, false);
3961
3927
  return true;
3962
3928
  }
3963
- catch (_err) {
3929
+ catch {
3964
3930
  return false;
3965
3931
  }
3966
3932
  };
@@ -8059,168 +8025,12 @@ const isNonNodeModelKey = (value) => ['completeness'].includes(value);
8059
8025
  const inputGroupsTermTypes = [TermTermType.pesticideBrandName, TermTermType.fertiliserBrandName];
8060
8026
  // should each group be open by default?
8061
8027
  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
8028
  const noValue = 'None';
8068
8029
  // add any other models that are set as "not relevant"
8069
8030
  const notRelevantModels = ['emissionNotRelevant'];
8070
8031
  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
8032
  const asArray = (values) => (Array.isArray(values) ? values : []);
8033
+ const subValueKeys = ['transformation', 'animal'];
8224
8034
  const computeTerms = (originalValues, recalculatedValues, terms, filterTermTypes, extraTerms = []) => orderBy(uniqBy([
8225
8035
  ...(terms?.length
8226
8036
  ? terms
@@ -8928,8 +8738,8 @@ const filterLogValueArray = (value) => {
8928
8738
  ? null
8929
8739
  : values;
8930
8740
  };
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));
8741
+ const parseLog$1 = (key, value) => parseLogCompleteness(key, value) || { key, value: filterLogValueArray(value) };
8742
+ const parseLogs = (logs) => Object.entries(logs).map(([key, value]) => parseLog$1(key, value));
8933
8743
  class NodeLogsModelsLogsComponent {
8934
8744
  constructor() {
8935
8745
  this.logs = input.required(...(ngDevMode ? [{ debugName: "logs" }] : []));
@@ -8941,7 +8751,7 @@ class NodeLogsModelsLogsComponent {
8941
8751
  this.requirementKeys = computed(() => requirementKeys(this.requirements()), ...(ngDevMode ? [{ debugName: "requirementKeys" }] : []));
8942
8752
  this.missingLookups = computed(() => this.logs().missingLookups ?? [], ...(ngDevMode ? [{ debugName: "missingLookups" }] : []));
8943
8753
  this.allLogs = computed(() => [
8944
- ...requirementKeys(this.requirements()).map(key => parseLog(key, this.requirements()[key])),
8754
+ ...requirementKeys(this.requirements()).map(key => parseLog$1(key, this.requirements()[key])),
8945
8755
  ...parseLogs(this.logs()?.logs ?? {})
8946
8756
  ].filter(v => v.value !== null), ...(ngDevMode ? [{ debugName: "allLogs" }] : []));
8947
8757
  }
@@ -9143,6 +8953,186 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
9143
8953
  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
8954
  }], 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
8955
 
8956
+ /* eslint-disable complexity */
8957
+ const termTypes = Object.values(TermTermType);
8958
+ const blankNodeTypes = Object.values(SchemaType).filter(t => !isTypeNode(t));
8959
+ const blankNodeTypesLowerCase = blankNodeTypes.map(v => v.toLowerCase());
8960
+ const schemaTypesLowerCase = Object.values(SchemaType).map(v => v.toLowerCase());
8961
+ const missingLookupPrefix = 'Missing lookup';
8962
+ const omitLogKeys = (log, ...keys) => Object.fromEntries(Object.entries(log).filter(([key]) => !schemaTypesLowerCase.includes(key) && !keys.includes(key)));
8963
+ const includeBlankNodes = (logs, log) => Object.keys(log)
8964
+ .filter(key => blankNodeTypesLowerCase.includes(key))
8965
+ .reduce((prev, key) => ({
8966
+ ...prev,
8967
+ [key]: unique([...((typeof prev[key] === 'string' ? [prev[key]] : prev[key]) || []), log[key]])
8968
+ }), logs);
8969
+ const parseLogMultipleValue = (values) => values
8970
+ .map(v => (v.filter(Boolean).length === 2 ? v.join(':') : null))
8971
+ .filter(Boolean)
8972
+ .join('_');
8973
+ const parseLog = (log) => ['value' in log, 'coefficient' in log, 'node' in log || 'operation' in log].every(Boolean)
8974
+ ? {
8975
+ [log.node || log.operation]: parseLogMultipleValue([
8976
+ ['value', log.value],
8977
+ ['coefficient', log.coefficient],
8978
+ ['operation', !log.node ? log.operation : null]
8979
+ ])
8980
+ }
8981
+ : omitLogKeys(log);
8982
+ const parseLookup = ({ column, termid, 'term.id': _termid, [missingLookupPrefix]: missingLookup }) => ({
8983
+ filename: parseFilename(missingLookup),
8984
+ termId: termid || _termid,
8985
+ column
8986
+ });
8987
+ const hasValue = (value) => !!value && value !== noValue;
8988
+ const parseFilename = (filepath) => {
8989
+ const [filename] = filepath.split('.');
8990
+ const ext = termTypes.includes(filename) ? SupportedExtensions.xlsx : SupportedExtensions.csv;
8991
+ return fileToExt(filename, ext);
8992
+ };
8993
+ const groupLog = (group, { logger, term, model, key, should_run, should_merge, run_required, property, input_group_id, ...log }, groupByAnimal = false) => {
8994
+ const isOrchestrator = logger.includes('orchestrator');
8995
+ const isKey = !isOrchestrator && !!key;
8996
+ const isProperty = !isOrchestrator && !!property;
8997
+ const parentLogKey = [
8998
+ groupByAnimal && log.animalId,
8999
+ hasValue(term) && `["${term}"]`,
9000
+ (!isOrchestrator && key) || property,
9001
+ log.emission_id
9002
+ ]
9003
+ .filter(Boolean)
9004
+ .join('.');
9005
+ const logModelKey = [parentLogKey, hasValue(model) && model].filter(Boolean).join('.');
9006
+ set(group, `${parentLogKey}.models`, unique([...get(group, `${parentLogKey}.models`, []), model]));
9007
+ set(group, `${parentLogKey}.isKey`, isKey);
9008
+ set(group, `${parentLogKey}.isProperty`, isProperty);
9009
+ input_group_id && set(group, `${parentLogKey}.groupId`, input_group_id);
9010
+ let data = get(group, logModelKey, {});
9011
+ data = includeBlankNodes(data, log);
9012
+ if (typeof should_run !== 'undefined') {
9013
+ const shouldRun = should_run === 'True';
9014
+ data = isOrchestrator
9015
+ ? {
9016
+ ...data,
9017
+ ...omitLogKeys(log, 'value'),
9018
+ shouldRunOrchestrator: shouldRun
9019
+ }
9020
+ : {
9021
+ ...data,
9022
+ ...omitLogKeys(log),
9023
+ shouldRun
9024
+ };
9025
+ }
9026
+ else if (typeof run_required !== 'undefined') {
9027
+ const runRequired = run_required === 'True';
9028
+ data = {
9029
+ ...data,
9030
+ ...(runRequired ? {} : omitLogKeys(log)), // no need to save logs if we need to run the model
9031
+ runRequired
9032
+ };
9033
+ }
9034
+ else if ('requirements' in log) {
9035
+ const { requirements, ...logData } = log;
9036
+ data.requirements = {
9037
+ ...(data.requirements || {}),
9038
+ ...logData
9039
+ };
9040
+ }
9041
+ else if (missingLookupPrefix in log) {
9042
+ data.missingLookups = unique([...(data.missingLookups || []), parseLookup(log)]);
9043
+ }
9044
+ else if (!isOrchestrator) {
9045
+ data.logs = {
9046
+ ...(data.logs || {}),
9047
+ ...parseLog(log)
9048
+ };
9049
+ }
9050
+ if (typeof should_merge !== 'undefined') {
9051
+ data.shouldMerge = should_merge === 'True';
9052
+ }
9053
+ if (typeof log.replaceLowerTier !== 'undefined') {
9054
+ data.replaceLowerTier = log.replaceLowerTier === 'True';
9055
+ }
9056
+ if (typeof log.replaceThreshold !== 'undefined') {
9057
+ data.replaceThreshold = log.replaceThreshold === 'True';
9058
+ }
9059
+ set(group, logModelKey, data);
9060
+ return group;
9061
+ };
9062
+ const groupLogSubValue = (group, log, key) => {
9063
+ const id = log[key];
9064
+ const data = groupLog(group[id] || {}, log);
9065
+ group[id] = data;
9066
+ if (subValueKeys.includes(key)) {
9067
+ // add value to the same term/model on parent group
9068
+ Object.entries(group[id]).map(([term, models]) => Object.keys(models).map(model => {
9069
+ if (typeof group?.[term]?.[model] === 'object') {
9070
+ group[term][model][key] = unique([...(group[term][model][key] || []), id]);
9071
+ }
9072
+ }));
9073
+ }
9074
+ return group;
9075
+ };
9076
+ const csvValue = (value) => (value || '').replace('[', '').replace(']', '');
9077
+ const parseLogMessage = (message) => {
9078
+ try {
9079
+ const data = JSON.parse(message);
9080
+ // Split on a comma (and optional space) ONLY if it's followed by "key="
9081
+ // \w+ matches alphanumeric characters and underscores (standard log keys)
9082
+ const pairs = data.message.split(/,\s*(?=\w+=)/);
9083
+ return pairs.reduce((prev, parts) => {
9084
+ // Use indexOf instead of split('=') just in case your values ever contain an '='
9085
+ const firstEqualsIndex = parts.indexOf('=');
9086
+ if (firstEqualsIndex === -1)
9087
+ return prev;
9088
+ const key = parts.substring(0, firstEqualsIndex).trim();
9089
+ const value = parts.substring(firstEqualsIndex + 1).trim();
9090
+ const val = csvValue(value);
9091
+ return {
9092
+ ...prev,
9093
+ ...(key && val ? { [key]: val } : {})
9094
+ };
9095
+ }, { logger: data.logger });
9096
+ }
9097
+ catch {
9098
+ // make sure it works even if one log is malformed
9099
+ return {};
9100
+ }
9101
+ };
9102
+ const groupLogsByModel = (data = '', groupBySubValue = false, groupByAnimal = false) => data
9103
+ .trim()
9104
+ .split('\n')
9105
+ .map(parseLogMessage)
9106
+ .filter(v => [hasValue(v?.model), ['term', 'key', 'animalId'].some(k => hasValue(v?.[k]))].every(Boolean))
9107
+ .reduce((group, log) => {
9108
+ const subValue = subValueKeys.find(v => !!log[v] && log[v] != noValue);
9109
+ return subValue && groupBySubValue && !log.cycle
9110
+ ? groupLogSubValue(group, log, subValue)
9111
+ : groupLog(group, log, groupByAnimal);
9112
+ }, {});
9113
+ class NodeLogsModelsService {
9114
+ constructor() {
9115
+ this.nodeService = inject(HeNodeService);
9116
+ }
9117
+ getNodeLogs$(node, groupByAnimal = false) {
9118
+ return this.nodeService
9119
+ .getLog$({
9120
+ '@type': node['@type'],
9121
+ '@id': node['@id'],
9122
+ dataState: node.aggregated && node['@type'] !== NodeType.ImpactAssessment ? DataState.original : DataState.recalculated
9123
+ })
9124
+ .pipe(map(logs => logs ? groupLogsByModel(logs, node['@type'] === NodeType.Cycle, groupByAnimal) : {}));
9125
+ }
9126
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NodeLogsModelsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9127
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NodeLogsModelsService, providedIn: 'root' }); }
9128
+ }
9129
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NodeLogsModelsService, decorators: [{
9130
+ type: Injectable,
9131
+ args: [{
9132
+ providedIn: 'root'
9133
+ }]
9134
+ }] });
9135
+
9146
9136
  const groupTerms = (terms) => terms.reduce((prev, curr) => ({ ...prev, [curr['@id']]: curr }), {});
9147
9137
  const logIcon = {
9148
9138
  [LogStatus.success]: 'checkmark',
@@ -9235,6 +9225,7 @@ const valuesSchemaType = (values) => Array.isArray(values) ? valueSchemaType(val
9235
9225
  class NodeLogsModelsComponent {
9236
9226
  constructor() {
9237
9227
  this.nodeService = inject(HeNodeService);
9228
+ this.nodeLogsModelsService = inject(NodeLogsModelsService);
9238
9229
  this.searchService = inject(HeSearchService);
9239
9230
  this.engineService = inject(HeEngineService);
9240
9231
  this.guideEnabled = inject(GUIDE_ENABLED);
@@ -9273,15 +9264,11 @@ class NodeLogsModelsComponent {
9273
9264
  this.logsUrl = computed(() => this.nodeService.nodeLogsUrl(this.node()), ...(ngDevMode ? [{ debugName: "logsUrl" }] : []));
9274
9265
  this.nodeType = computed(() => nodeType(this.node()), ...(ngDevMode ? [{ debugName: "nodeType" }] : []));
9275
9266
  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
- })
9267
+ params: () => ({ node: this.node(), groupByAnimal: !!this.logsKey() }),
9268
+ stream: ({ params: { node, groupByAnimal } }) => this.nodeLogsModelsService.getNodeLogs$(node, groupByAnimal)
9282
9269
  });
9283
- this.allLogs = computed(() => this.logsResource.value() ?? '', ...(ngDevMode ? [{ debugName: "allLogs" }] : []));
9284
- this.hasLogs = computed(() => this.allLogs() !== '', ...(ngDevMode ? [{ debugName: "hasLogs" }] : []));
9270
+ this.allLogs = computed(() => this.logsResource.value() ?? {}, ...(ngDevMode ? [{ debugName: "allLogs" }] : []));
9271
+ this.hasLogs = computed(() => !isEmpty(this.allLogs()), ...(ngDevMode ? [{ debugName: "hasLogs" }] : []));
9285
9272
  this.configResource = rxResource({
9286
9273
  params: () => ({ node: this.node() }),
9287
9274
  stream: ({ params: { node } }) => this.engineService.ochestratorConfig$(nodeType(node), nodeId(node))
@@ -9308,8 +9295,7 @@ class NodeLogsModelsComponent {
9308
9295
  return prev;
9309
9296
  }, {}), ...(ngDevMode ? [{ debugName: "animalGroups" }] : []));
9310
9297
  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" }] : []));
9298
+ this.logs = computed(() => (this.logsKey() ? this.allLogs()?.[this.logsKey()] : this.allLogs()) || {}, ...(ngDevMode ? [{ debugName: "logs" }] : []));
9313
9299
  this.isBlankNodes = computed(() => Array.isArray(this.originalValues()) || Array.isArray(this.recalculatedValues()), ...(ngDevMode ? [{ debugName: "isBlankNodes" }] : []));
9314
9300
  this.extraTermsFromLogsResource = rxResource({
9315
9301
  params: () => ({
@@ -11878,7 +11864,7 @@ const formatError = (error, allErrors = []) => error
11878
11864
  : undefined;
11879
11865
  const errorHasError = (error) => error && (error.level === 'error' || !error.level);
11880
11866
  const errorHasWarning = (error) => error && error.level === 'warning';
11881
- const isMissingPropertyError = ({ params, message }) => !!params && 'missingProperty' in params;
11867
+ const isMissingPropertyError = ({ params }) => !!params && 'missingProperty' in params;
11882
11868
  const isMissingOneOfError = ({ keyword, schemaPath }) => keyword === 'required' && (schemaPath || '').includes('oneOf');
11883
11869
  const isFailingKeywordError = ({ params }) => !!params && 'failingKeyword' in params;
11884
11870
  const filterError = (error) => [isFailingKeywordError].every(func => !func(error));
@@ -12496,7 +12482,7 @@ const groupChanged = (properties, key, value) => {
12496
12482
  }
12497
12483
  }, properties);
12498
12484
  }
12499
- catch (_err) {
12485
+ catch {
12500
12486
  // ignore error
12501
12487
  }
12502
12488
  };
@@ -13237,7 +13223,7 @@ const errorCsv = nodes => {
13237
13223
  try {
13238
13224
  return toCsv$1(nodes, { includeExising: true });
13239
13225
  }
13240
- catch (_err) {
13226
+ catch {
13241
13227
  return '';
13242
13228
  }
13243
13229
  };
@@ -15046,39 +15032,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
15046
15032
  }]
15047
15033
  }], ctorParameters: () => [], propDecorators: { indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: true }] }] } });
15048
15034
 
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
15035
  const allGroups = (values = []) => values.flatMap(v => (v.type === 'group' ? [v, ...allGroups(v.options)] : []));
15083
15036
  const allOptions = ({ options }) => options.flatMap(v => (v.type === 'group' ? allOptions(v) : v));
15084
15037
  const optionsFromGroup = (group) => allOptions(group).map(v => v.value);
@@ -15114,7 +15067,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
15114
15067
  class FilterAccordionComponent extends ControlValueAccessor {
15115
15068
  constructor() {
15116
15069
  super();
15117
- this.filterStore = inject((FilterStore));
15118
15070
  /**
15119
15071
  * Show the header, with title and global clear/search.
15120
15072
  */
@@ -15162,9 +15114,10 @@ class FilterAccordionComponent extends ControlValueAccessor {
15162
15114
  this.getDirectOptionsCount = getDirectOptionsCount;
15163
15115
  this.optionsFromGroup = optionsFromGroup;
15164
15116
  this.search = signal('', ...(ngDevMode ? [{ debugName: "search" }] : []));
15165
- this.group = computed(() => ({ options: this.filterStore.filteredData() }), ...(ngDevMode ? [{ debugName: "group" }] : []));
15117
+ this.group = computed(() => ({
15118
+ options: populateWithTrackIdsFilterData(this.data() || [])
15119
+ }), ...(ngDevMode ? [{ debugName: "group" }] : []));
15166
15120
  this.disabledValues = computed(() => disabledValues(this.data()), ...(ngDevMode ? [{ debugName: "disabledValues" }] : []));
15167
- effect(() => this.data() && this.filterStore.setData(this.data()));
15168
15121
  effect(() => (this.panelStates = Object.fromEntries(
15169
15122
  /* eslint-disable-next-line complexity */
15170
15123
  allGroups(this.data()).map(({ label, type }, index) => [
@@ -15183,9 +15136,6 @@ class FilterAccordionComponent extends ControlValueAccessor {
15183
15136
  this.selectControl.setValue(value);
15184
15137
  this.updateSelectedValues(value);
15185
15138
  }
15186
- ngOnInit() {
15187
- this.filterStore.setValue(this.selectControl.valueChanges.pipe(startWith(this.selectControl.value)));
15188
- }
15189
15139
  updateSelectedValues(value) {
15190
15140
  const disabledValues = this.disabledValues();
15191
15141
  const nonDisabledValues = value?.filter(v => !disabledValues.includes(v)) ?? [];
@@ -15261,17 +15211,8 @@ class FilterAccordionComponent extends ControlValueAccessor {
15261
15211
  provide: NG_VALUE_ACCESSOR,
15262
15212
  useExisting: forwardRef(() => FilterAccordionComponent),
15263
15213
  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 }); }
15214
+ }
15215
+ ], 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
15216
  }
15276
15217
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FilterAccordionComponent, decorators: [{
15277
15218
  type: Component$1,
@@ -15280,8 +15221,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
15280
15221
  provide: NG_VALUE_ACCESSOR,
15281
15222
  useExisting: forwardRef(() => FilterAccordionComponent),
15282
15223
  multi: true
15283
- },
15284
- FilterStore
15224
+ }
15285
15225
  ], imports: [
15286
15226
  FormsModule,
15287
15227
  ReactiveFormsModule,
@@ -15290,15 +15230,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
15290
15230
  NgTemplateOutlet,
15291
15231
  FilterAccordionGroupPipe,
15292
15232
  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"] }]
15233
+ ], 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
15234
  }], 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
15235
 
15304
15236
  const termTypeName = (select) => [
@@ -15640,5 +15572,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
15640
15572
  * Generated bundle index. Do not edit.
15641
15573
  */
15642
15574
 
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 };
15575
+ 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
15576
  //# sourceMappingURL=hestia-earth-ui-components.mjs.map