@hestia-earth/ui-components 0.41.56 → 0.41.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -6,7 +6,7 @@ import { FormsModule, NG_VALUE_ACCESSOR, UntypedFormBuilder, Validators, Reactiv
|
|
|
6
6
|
import { NgClass, DecimalPipe, NgTemplateOutlet, KeyValuePipe, DOCUMENT, PlatformLocation, NgStyle, UpperCasePipe, JsonPipe, DatePipe, AsyncPipe, formatDate as formatDate$1 } from '@angular/common';
|
|
7
7
|
import * as i1$1 from '@ng-bootstrap/ng-bootstrap';
|
|
8
8
|
import { NgbTooltip, NgbDropdown, NgbDropdownMenu, NgbDropdownToggle, NgbActiveModal, NgbHighlight, NgbModal, NgbDropdownItem, NgbTypeahead, NgbPopover, NgbTooltipModule, NgbDropdownModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap';
|
|
9
|
-
import { ReplaySubject, of, mergeMap, shareReplay, delay, map, catchError, distinctUntilChanged, timer, take, first, Subject, combineLatest, filter,
|
|
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
|
|
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
|
|
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 = (
|
|
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
|
|
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
|
|
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.
|
|
2238
|
-
|
|
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.
|
|
2256
|
-
this.
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
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()
|
|
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.
|
|
2292
|
-
|
|
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.
|
|
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
|
-
},
|
|
2299
|
+
}, template: "@if (visible()) {\n @if (isCompact()) {\n <div class=\"compact-header\">\n <div [ngClass]=\"compactHeaderClass()\">\n <div class=\"is-flex is-align-items-center is-justify-content-space-between is-gap-8 w-100\">\n @if (drawerHeaderTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerHeaderTemplate()\" />\n }\n @if (links()?.length > 0) {\n <div\n ngbDropdown\n #optionDd=\"ngbDropdown\"\n container=\"body\"\n placement=\"bottom-end\"\n [dropdownClass]=\"compactMenuHeaderClass()\">\n <button\n ngbDropdownToggle\n class=\"button is-small is-no-shadow is-block has-text-weight-bold has-text-secondary is-size-6 is-py-1 is-px-2 is-radius-3 is-gap-4 | compact-header--btn\"\n aria-controls=\"drawer-menu\"\n type=\"button\">\n <span>{{ compactMenuLabel() }}</span>\n <he-svg-icon\n class=\"compact-header--btn__icon\"\n [name]=\"optionDd.isOpen() ? 'chevron-up' : 'chevron-down'\"\n aria-hidden=\"true\" />\n </button>\n\n <div ngbDropdownMenu id=\"drawer-menu\">\n <div class=\"dropdown-content navigation-menu-dropdown\">\n <he-navigation-menu (closed)=\"optionDd.close()\" [links]=\"links()\" [secondaryLinks]=\"secondaryLinks()\">\n @if (drawerMenuHeaderTemplate()) {\n <ng-container header [ngTemplateOutlet]=\"drawerMenuHeaderTemplate()\" />\n }\n @if (drawerMenuFooterTemplate()) {\n <ng-container footer [ngTemplateOutlet]=\"drawerMenuFooterTemplate()\" />\n }\n </he-navigation-menu>\n </div>\n </div>\n </div>\n }\n @if (drawerFooterTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerFooterTemplate()\" />\n }\n </div>\n </div>\n </div>\n } @else {\n <aside>\n <div\n class=\"is-absolute h-100 shadow-2 has-background-white | shell__menuContent\"\n [class.is-pr-3]=\"position() === 'right'\"\n (@sideMenu.done)=\"animationDone($event)\"\n [@sideMenu]=\"expanded() ? 'full' : 'hidden'\">\n <div\n class=\"h-100 is-overflow-y-auto\"\n [class.is-py-4]=\"!drawerContentTemplate()\"\n [class.is-px-2]=\"!drawerContentTemplate()\">\n @if (drawerHeaderTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerHeaderTemplate()\" />\n }\n @if (drawerContentTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerContentTemplate()\" />\n }\n @if (links()?.length > 0) {\n <he-navigation-menu [links]=\"links()\" [secondaryLinks]=\"secondaryLinks()\">\n @if (drawerMenuHeaderTemplate()) {\n <ng-container header [ngTemplateOutlet]=\"drawerMenuHeaderTemplate()\" />\n }\n @if (drawerMenuFooterTemplate()) {\n <ng-container footer [ngTemplateOutlet]=\"drawerMenuFooterTemplate()\" />\n }\n </he-navigation-menu>\n }\n @if (drawerFooterTemplate()) {\n <ng-container [ngTemplateOutlet]=\"drawerFooterTemplate()\" />\n }\n </div>\n @if (collapsible()) {\n <button\n (click)=\"toggleMenu()\"\n (mousedown)=\"startResizing($event)\"\n (touchstart)=\"startResizing($event)\"\n class=\"is-absolute is-overflow-hidden is-flex is-justify-content-center is-align-items-center | shell__menuContent--toggle\"\n pointer>\n <he-svg-icon [name]=\"resizable() ? 'drag' : toggleIcon()\" size=\"20\" />\n </button>\n }\n </div>\n </aside>\n }\n}\n\n<div [class.is-resizing]=\"isHoldingToggle()\" class=\"shell__content | h-100 w-100 is-flex\">\n <div class=\"shell__content--body | w-100\" [@reduceWidth]=\"reduceAnimation()\">\n <div #contentContainer class=\"w-100 h-100\" [style]=\"contentStyles()\" [className]=\"contentPaddingStyles()\">\n <ng-content select=\"[drawer-content]\" />\n </div>\n </div>\n</div>\n", styles: ["::ng-deep :root{--drawer-toggle-position: -20px;--sidenav-left-width: 256px;--sidenav-right-width: 256px;--content-transition-left-x: 0;--content-transition-right-x: 0}:host-context[drawer-position=left]{--sidenav-side-transform: 1;--sidenav-width: var(--sidenav-left-width);--content-transition-x: var(--content-transition-left-x);--menu-transition-transform: -1}:host-context[drawer-position=left]>aside{left:0}:host-context[drawer-position=left]>aside>.shell__menuContent{left:0}:host-context[drawer-position=left]>aside>.shell__menuContent>.shell__menuContent--toggle{right:var(--drawer-toggle-position);border-radius:0 9px 9px 0}:host-context[drawer-position=right]{--sidenav-side-transform: 0;--sidenav-width: var(--sidenav-right-width);--content-transition-x: var(--content-transition-right-x);--menu-transition-transform: 1}:host-context[drawer-position=right]>aside{right:0;order:1}:host-context[drawer-position=right]>aside>.shell__menuContent{right:0}:host-context[drawer-position=right]>aside>.shell__menuContent>.shell__menuContent--toggle{left:var(--drawer-toggle-position);border-radius:9px 0 0 9px}:host{position:relative;max-height:100%;display:flex;justify-content:space-between}:host aside{position:sticky;top:var(--navbar-height);z-index:10;height:calc(100vh - var(--navbar-height))}:host aside .shell__menuContent{top:0;width:var(--sidenav-width)}:host aside .shell__menuContent--toggle{top:calc(50% - 24px);background:#dbe3ea;border:none;width:20px;height:48px}:host aside ::ng-deep he-collapsible-box{box-shadow:none;padding:4px!important}@media screen and (max-width:1023px){:host aside ::ng-deep he-collapsible-box{background-color:transparent}}:host aside ::ng-deep he-collapsible-box>div{gap:16px!important}:host aside ::ng-deep he-collapsible-box .dropdown-content{box-shadow:none}:host aside ::ng-deep he-collapsible-box .dropdown-item+.dropdown-item{border-top:1px solid #b5b5b5}:host aside ::ng-deep he-collapsible-box .navbar-divider{background-color:#b5b5b5;margin:0}:host.is-resizable .shell__menuContent--toggle:active{cursor:col-resize}.shell__content--body{container-type:inline-size;transition:none}.shell__content:not(.is-resizing) .shell__content--body{transition:transform .3s ease-in-out,width .3s ease-in-out}.navigation-menu-dropdown{padding:.5rem 1rem;width:300px}@media screen and (max-width:767px){.navigation-menu-dropdown{width:calc(100dvw - 3rem)}}.compact-header{position:sticky;top:calc(var(--navbar-height));z-index:10}@media screen and (max-width:767px){.compact-header{top:0}}.compact-header--btn{background:#dbe3ea}he-navigation-menu ::ng-deep .menu{width:100%!important;min-width:100%!important;max-width:100%!important}\n"] }]
|
|
2336
2300
|
}], ctorParameters: () => [], propDecorators: { contentContainer: [{ type: i0.ViewChild, args: ['contentContainer', { ...{ read: ElementRef }, isSignal: true }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }, { type: i0.Output, args: ["expandedChange"] }], compactBreakpoint: [{ type: i0.Input, args: [{ isSignal: true, alias: "compactBreakpoint", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }, { type: i0.Output, args: ["widthChange"] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], contentStyles: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentStyles", required: false }] }], contentPaddingStyles: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentPaddingStyles", required: false }] }], menuOverlap: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuOverlap", required: false }] }], links: [{ type: i0.Input, args: [{ isSignal: true, alias: "links", required: false }] }], secondaryLinks: [{ type: i0.Input, args: [{ isSignal: true, alias: "secondaryLinks", required: false }] }], drawerHeaderTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawerHeaderTemplate", required: false }] }], drawerContentTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawerContentTemplate", required: false }] }], drawerFooterTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawerFooterTemplate", required: false }] }], drawerMenuHeaderTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawerMenuHeaderTemplate", required: false }] }], drawerMenuFooterTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawerMenuFooterTemplate", required: false }] }], compactMenuLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "compactMenuLabel", required: false }] }], compactHeaderClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "compactHeaderClass", required: false }] }], compactMenuHeaderClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "compactMenuHeaderClass", required: false }] }], minMenuDistance: [{ type: i0.Input, args: [{ isSignal: true, alias: "minMenuDistance", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], stopResizing: [{
|
|
2337
2301
|
type: HostListener,
|
|
2338
2302
|
args: ['window:mouseup']
|
|
@@ -2974,6 +2938,7 @@ const icons = [
|
|
|
2974
2938
|
'unit',
|
|
2975
2939
|
'upload',
|
|
2976
2940
|
'video',
|
|
2941
|
+
'xlsx-file',
|
|
2977
2942
|
'xmark',
|
|
2978
2943
|
'xmark-circle',
|
|
2979
2944
|
'xmark-circle-filled',
|
|
@@ -3960,7 +3925,7 @@ const isNode = unknown => {
|
|
|
3960
3925
|
Node.prototype.cloneNode.call(unknown, false);
|
|
3961
3926
|
return true;
|
|
3962
3927
|
}
|
|
3963
|
-
catch
|
|
3928
|
+
catch {
|
|
3964
3929
|
return false;
|
|
3965
3930
|
}
|
|
3966
3931
|
};
|
|
@@ -8059,168 +8024,12 @@ const isNonNodeModelKey = (value) => ['completeness'].includes(value);
|
|
|
8059
8024
|
const inputGroupsTermTypes = [TermTermType.pesticideBrandName, TermTermType.fertiliserBrandName];
|
|
8060
8025
|
// should each group be open by default?
|
|
8061
8026
|
const defaultGroupOpen = false;
|
|
8062
|
-
const termTypes = Object.values(TermTermType);
|
|
8063
|
-
const blankNodeTypes = Object.values(SchemaType).filter(t => !isTypeNode(t));
|
|
8064
|
-
const schemaTypesLowerCase = Object.values(SchemaType).map(v => v.toLowerCase());
|
|
8065
|
-
const blankNodeTypesLowerCase = blankNodeTypes.map(v => v.toLowerCase());
|
|
8066
|
-
const missingLookupPrefix = 'Missing lookup';
|
|
8067
8027
|
const noValue = 'None';
|
|
8068
8028
|
// add any other models that are set as "not relevant"
|
|
8069
8029
|
const notRelevantModels = ['emissionNotRelevant'];
|
|
8070
8030
|
const isNotRelevantModel = (model) => notRelevantModels.includes(model.methodId);
|
|
8071
|
-
const hasValue = (value) => !!value && value !== noValue;
|
|
8072
|
-
const parseFilename = (filepath) => {
|
|
8073
|
-
const [filename] = filepath.split('.');
|
|
8074
|
-
const ext = termTypes.includes(filename) ? SupportedExtensions.xlsx : SupportedExtensions.csv;
|
|
8075
|
-
return fileToExt(filename, ext);
|
|
8076
|
-
};
|
|
8077
|
-
const parseLookup = ({ column, termid, 'term.id': _termid, [missingLookupPrefix]: missingLookup }) => ({
|
|
8078
|
-
filename: parseFilename(missingLookup),
|
|
8079
|
-
termId: termid || _termid,
|
|
8080
|
-
column
|
|
8081
|
-
});
|
|
8082
|
-
const csvValue = (value) => (value || '').replace('[', '').replace(']', '');
|
|
8083
|
-
const parseLogMessage = (message) => {
|
|
8084
|
-
try {
|
|
8085
|
-
const data = JSON.parse(message);
|
|
8086
|
-
// Split on a comma (and optional space) ONLY if it's followed by "key="
|
|
8087
|
-
// \w+ matches alphanumeric characters and underscores (standard log keys)
|
|
8088
|
-
const pairs = data.message.split(/,\s*(?=\w+=)/);
|
|
8089
|
-
return pairs.reduce((prev, parts) => {
|
|
8090
|
-
// Use indexOf instead of split('=') just in case your values ever contain an '='
|
|
8091
|
-
const firstEqualsIndex = parts.indexOf('=');
|
|
8092
|
-
if (firstEqualsIndex === -1)
|
|
8093
|
-
return prev;
|
|
8094
|
-
const key = parts.substring(0, firstEqualsIndex).trim();
|
|
8095
|
-
const value = parts.substring(firstEqualsIndex + 1).trim();
|
|
8096
|
-
const val = csvValue(value);
|
|
8097
|
-
return {
|
|
8098
|
-
...prev,
|
|
8099
|
-
...(key && val ? { [key]: val } : {})
|
|
8100
|
-
};
|
|
8101
|
-
}, { logger: data.logger });
|
|
8102
|
-
}
|
|
8103
|
-
catch (_err) {
|
|
8104
|
-
// make sure it works even if one log is malformed
|
|
8105
|
-
return {};
|
|
8106
|
-
}
|
|
8107
|
-
};
|
|
8108
|
-
const parseLogMultipleValue = (values) => values
|
|
8109
|
-
.map(v => (v.filter(Boolean).length === 2 ? v.join(':') : null))
|
|
8110
|
-
.filter(Boolean)
|
|
8111
|
-
.join('_');
|
|
8112
|
-
const parseLog$1 = (log) => ['value' in log, 'coefficient' in log, 'node' in log || 'operation' in log].every(Boolean)
|
|
8113
|
-
? {
|
|
8114
|
-
[log.node || log.operation]: parseLogMultipleValue([
|
|
8115
|
-
['value', log.value],
|
|
8116
|
-
['coefficient', log.coefficient],
|
|
8117
|
-
['operation', !log.node ? log.operation : null]
|
|
8118
|
-
])
|
|
8119
|
-
}
|
|
8120
|
-
: omitLogKeys(log);
|
|
8121
|
-
const omitLogKeys = (log, ...keys) => Object.fromEntries(Object.entries(log).filter(([key]) => !schemaTypesLowerCase.includes(key) && !keys.includes(key)));
|
|
8122
|
-
const includeBlankNodes = (logs, log) => Object.keys(log)
|
|
8123
|
-
.filter(key => blankNodeTypesLowerCase.includes(key))
|
|
8124
|
-
.reduce((prev, key) => ({
|
|
8125
|
-
...prev,
|
|
8126
|
-
[key]: unique([...((typeof prev[key] === 'string' ? [prev[key]] : prev[key]) || []), log[key]])
|
|
8127
|
-
}), logs);
|
|
8128
|
-
const groupLog = (group, { logger, term, model, key, should_run, should_merge, run_required, property, input_group_id, ...log }, groupByAnimal = false) => {
|
|
8129
|
-
const isOrchestrator = logger.includes('orchestrator');
|
|
8130
|
-
const isKey = !isOrchestrator && !!key;
|
|
8131
|
-
const isProperty = !isOrchestrator && !!property;
|
|
8132
|
-
const parentLogKey = [
|
|
8133
|
-
groupByAnimal && log.animalId,
|
|
8134
|
-
hasValue(term) && `["${term}"]`,
|
|
8135
|
-
(!isOrchestrator && key) || property,
|
|
8136
|
-
log.emission_id
|
|
8137
|
-
]
|
|
8138
|
-
.filter(Boolean)
|
|
8139
|
-
.join('.');
|
|
8140
|
-
const logModelKey = [parentLogKey, hasValue(model) && model].filter(Boolean).join('.');
|
|
8141
|
-
set(group, `${parentLogKey}.models`, unique([...get(group, `${parentLogKey}.models`, []), model]));
|
|
8142
|
-
set(group, `${parentLogKey}.isKey`, isKey);
|
|
8143
|
-
set(group, `${parentLogKey}.isProperty`, isProperty);
|
|
8144
|
-
input_group_id && set(group, `${parentLogKey}.groupId`, input_group_id);
|
|
8145
|
-
let data = get(group, logModelKey, {});
|
|
8146
|
-
data = includeBlankNodes(data, log);
|
|
8147
|
-
if (typeof should_run !== 'undefined') {
|
|
8148
|
-
const shouldRun = should_run === 'True';
|
|
8149
|
-
data = isOrchestrator
|
|
8150
|
-
? {
|
|
8151
|
-
...data,
|
|
8152
|
-
...omitLogKeys(log, 'value'),
|
|
8153
|
-
shouldRunOrchestrator: shouldRun
|
|
8154
|
-
}
|
|
8155
|
-
: {
|
|
8156
|
-
...data,
|
|
8157
|
-
...omitLogKeys(log),
|
|
8158
|
-
shouldRun
|
|
8159
|
-
};
|
|
8160
|
-
}
|
|
8161
|
-
else if (typeof run_required !== 'undefined') {
|
|
8162
|
-
const runRequired = run_required === 'True';
|
|
8163
|
-
data = {
|
|
8164
|
-
...data,
|
|
8165
|
-
...(runRequired ? {} : omitLogKeys(log)), // no need to save logs if we need to run the model
|
|
8166
|
-
runRequired
|
|
8167
|
-
};
|
|
8168
|
-
}
|
|
8169
|
-
else if ('requirements' in log) {
|
|
8170
|
-
const { requirements, ...logData } = log;
|
|
8171
|
-
data.requirements = {
|
|
8172
|
-
...(data.requirements || {}),
|
|
8173
|
-
...logData
|
|
8174
|
-
};
|
|
8175
|
-
}
|
|
8176
|
-
else if (missingLookupPrefix in log) {
|
|
8177
|
-
data.missingLookups = unique([...(data.missingLookups || []), parseLookup(log)]);
|
|
8178
|
-
}
|
|
8179
|
-
else if (!isOrchestrator) {
|
|
8180
|
-
data.logs = {
|
|
8181
|
-
...(data.logs || {}),
|
|
8182
|
-
...parseLog$1(log)
|
|
8183
|
-
};
|
|
8184
|
-
}
|
|
8185
|
-
if (typeof should_merge !== 'undefined') {
|
|
8186
|
-
data.shouldMerge = should_merge === 'True';
|
|
8187
|
-
}
|
|
8188
|
-
if (typeof log.replaceLowerTier !== 'undefined') {
|
|
8189
|
-
data.replaceLowerTier = log.replaceLowerTier === 'True';
|
|
8190
|
-
}
|
|
8191
|
-
if (typeof log.replaceThreshold !== 'undefined') {
|
|
8192
|
-
data.replaceThreshold = log.replaceThreshold === 'True';
|
|
8193
|
-
}
|
|
8194
|
-
set(group, logModelKey, data);
|
|
8195
|
-
return group;
|
|
8196
|
-
};
|
|
8197
|
-
const subValueKeys = ['transformation', 'animal'];
|
|
8198
|
-
const groupLogSubValue = (group, log, key) => {
|
|
8199
|
-
const id = log[key];
|
|
8200
|
-
const data = groupLog(group[id] || {}, log);
|
|
8201
|
-
group[id] = data;
|
|
8202
|
-
if (subValueKeys.includes(key)) {
|
|
8203
|
-
// add value to the same term/model on parent group
|
|
8204
|
-
Object.entries(group[id]).map(([term, models]) => Object.keys(models).map(model => {
|
|
8205
|
-
if (typeof group?.[term]?.[model] === 'object') {
|
|
8206
|
-
group[term][model][key] = unique([...(group[term][model][key] || []), id]);
|
|
8207
|
-
}
|
|
8208
|
-
}));
|
|
8209
|
-
}
|
|
8210
|
-
return group;
|
|
8211
|
-
};
|
|
8212
|
-
const groupLogsByModel = (data = '', groupBySubValue = false, groupByAnimal = false) => data
|
|
8213
|
-
.trim()
|
|
8214
|
-
.split('\n')
|
|
8215
|
-
.map(parseLogMessage)
|
|
8216
|
-
.filter(v => [hasValue(v?.model), ['term', 'key', 'animalId'].some(k => hasValue(v?.[k]))].every(Boolean))
|
|
8217
|
-
.reduce((group, log) => {
|
|
8218
|
-
const subValue = subValueKeys.find(v => !!log[v] && log[v] != noValue);
|
|
8219
|
-
return subValue && groupBySubValue && !log.cycle
|
|
8220
|
-
? groupLogSubValue(group, log, subValue)
|
|
8221
|
-
: groupLog(group, log, groupByAnimal);
|
|
8222
|
-
}, {});
|
|
8223
8031
|
const asArray = (values) => (Array.isArray(values) ? values : []);
|
|
8032
|
+
const subValueKeys = ['transformation', 'animal'];
|
|
8224
8033
|
const computeTerms = (originalValues, recalculatedValues, terms, filterTermTypes, extraTerms = []) => orderBy(uniqBy([
|
|
8225
8034
|
...(terms?.length
|
|
8226
8035
|
? terms
|
|
@@ -8928,8 +8737,8 @@ const filterLogValueArray = (value) => {
|
|
|
8928
8737
|
? null
|
|
8929
8738
|
: values;
|
|
8930
8739
|
};
|
|
8931
|
-
const parseLog = (key, value) => parseLogCompleteness(key, value) || { key, value: filterLogValueArray(value) };
|
|
8932
|
-
const parseLogs = (logs) => Object.entries(logs).map(([key, value]) => parseLog(key, value));
|
|
8740
|
+
const parseLog$1 = (key, value) => parseLogCompleteness(key, value) || { key, value: filterLogValueArray(value) };
|
|
8741
|
+
const parseLogs = (logs) => Object.entries(logs).map(([key, value]) => parseLog$1(key, value));
|
|
8933
8742
|
class NodeLogsModelsLogsComponent {
|
|
8934
8743
|
constructor() {
|
|
8935
8744
|
this.logs = input.required(...(ngDevMode ? [{ debugName: "logs" }] : []));
|
|
@@ -8941,7 +8750,7 @@ class NodeLogsModelsLogsComponent {
|
|
|
8941
8750
|
this.requirementKeys = computed(() => requirementKeys(this.requirements()), ...(ngDevMode ? [{ debugName: "requirementKeys" }] : []));
|
|
8942
8751
|
this.missingLookups = computed(() => this.logs().missingLookups ?? [], ...(ngDevMode ? [{ debugName: "missingLookups" }] : []));
|
|
8943
8752
|
this.allLogs = computed(() => [
|
|
8944
|
-
...requirementKeys(this.requirements()).map(key => parseLog(key, this.requirements()[key])),
|
|
8753
|
+
...requirementKeys(this.requirements()).map(key => parseLog$1(key, this.requirements()[key])),
|
|
8945
8754
|
...parseLogs(this.logs()?.logs ?? {})
|
|
8946
8755
|
].filter(v => v.value !== null), ...(ngDevMode ? [{ debugName: "allLogs" }] : []));
|
|
8947
8756
|
}
|
|
@@ -9143,6 +8952,186 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
9143
8952
|
args: [{ selector: 'he-node-logs-models-contributions', imports: [NgTemplateOutlet, HESvgIconComponent, SortByPipe, DefaultPipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (loading()) {\n <div class=\"is-my-3 has-text-center\">\n <he-svg-icon name=\"loading\" animation=\"spin\" />\n </div>\n}\n\n<div class=\"table-container\">\n <table class=\"table is-dark is-fullwidth\">\n <tbody>\n <tr>\n <td class=\"has-border-right\">Contribution details</td>\n <td>\n @if (rows().length && columns().length) {\n <table class=\"table is-dark is-bordered is-striped\">\n @let sorting = $any({});\n <thead>\n <tr>\n @for (header of columns(); track header) {\n <th class=\"has-text-white\">\n <div class=\"is-nowrap\">\n {{ header }}\n <ng-container *ngTemplateOutlet=\"sortColumn; context: { column: header }\" />\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows() | sortBy: sortBy() : sortOrder(); track trackByRow(row)) {\n <tr>\n @for (header of columns(); track header) {\n <td>\n <ng-container *ngTemplateOutlet=\"tableRow; context: { value: row[header] }\" />\n @if (header === 'coefficient' && row.value === 0) {\n <sup class=\"is-pl-1\">*</sup>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n\n <p class=\"is-size-7 is-italic has-text-white\">\n <sup>*</sup>\n Contributions with\n <code>value=0</code>\n are not stored and coefficient will appear as\n <code>-</code>\n . Please see the \"Missing Coefficients\" list for more details.\n </p>\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n\n<ng-template #tableRow let-value=\"value\">\n <div [innerHTML]=\"value | default: '-'\"></div>\n</ng-template>\n\n<ng-template #sortColumn let-column=\"column\">\n <a class=\"is-p-1 has-text-white\" (click)=\"toggleSort(column)\">\n @if (sortBy() === column) {\n @if (sortOrder() === 'asc') {\n <he-svg-icon name=\"sort-caret-up-filled\" size=\"16\" />\n } @else {\n <he-svg-icon name=\"sort-caret-down-filled\" size=\"16\" />\n }\n } @else {\n <he-svg-icon name=\"sort-caret-stacked-filled-stacked\" size=\"16\" />\n }\n </a>\n</ng-template>\n" }]
|
|
9144
8953
|
}], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }], nodeKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeKey", required: false }] }], model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: true }] }] } });
|
|
9145
8954
|
|
|
8955
|
+
/* eslint-disable complexity */
|
|
8956
|
+
const termTypes = Object.values(TermTermType);
|
|
8957
|
+
const blankNodeTypes = Object.values(SchemaType).filter(t => !isTypeNode(t));
|
|
8958
|
+
const blankNodeTypesLowerCase = blankNodeTypes.map(v => v.toLowerCase());
|
|
8959
|
+
const schemaTypesLowerCase = Object.values(SchemaType).map(v => v.toLowerCase());
|
|
8960
|
+
const missingLookupPrefix = 'Missing lookup';
|
|
8961
|
+
const omitLogKeys = (log, ...keys) => Object.fromEntries(Object.entries(log).filter(([key]) => !schemaTypesLowerCase.includes(key) && !keys.includes(key)));
|
|
8962
|
+
const includeBlankNodes = (logs, log) => Object.keys(log)
|
|
8963
|
+
.filter(key => blankNodeTypesLowerCase.includes(key))
|
|
8964
|
+
.reduce((prev, key) => ({
|
|
8965
|
+
...prev,
|
|
8966
|
+
[key]: unique([...((typeof prev[key] === 'string' ? [prev[key]] : prev[key]) || []), log[key]])
|
|
8967
|
+
}), logs);
|
|
8968
|
+
const parseLogMultipleValue = (values) => values
|
|
8969
|
+
.map(v => (v.filter(Boolean).length === 2 ? v.join(':') : null))
|
|
8970
|
+
.filter(Boolean)
|
|
8971
|
+
.join('_');
|
|
8972
|
+
const parseLog = (log) => ['value' in log, 'coefficient' in log, 'node' in log || 'operation' in log].every(Boolean)
|
|
8973
|
+
? {
|
|
8974
|
+
[log.node || log.operation]: parseLogMultipleValue([
|
|
8975
|
+
['value', log.value],
|
|
8976
|
+
['coefficient', log.coefficient],
|
|
8977
|
+
['operation', !log.node ? log.operation : null]
|
|
8978
|
+
])
|
|
8979
|
+
}
|
|
8980
|
+
: omitLogKeys(log);
|
|
8981
|
+
const parseLookup = ({ column, termid, 'term.id': _termid, [missingLookupPrefix]: missingLookup }) => ({
|
|
8982
|
+
filename: parseFilename(missingLookup),
|
|
8983
|
+
termId: termid || _termid,
|
|
8984
|
+
column
|
|
8985
|
+
});
|
|
8986
|
+
const hasValue = (value) => !!value && value !== noValue;
|
|
8987
|
+
const parseFilename = (filepath) => {
|
|
8988
|
+
const [filename] = filepath.split('.');
|
|
8989
|
+
const ext = termTypes.includes(filename) ? SupportedExtensions.xlsx : SupportedExtensions.csv;
|
|
8990
|
+
return fileToExt(filename, ext);
|
|
8991
|
+
};
|
|
8992
|
+
const groupLog = (group, { logger, term, model, key, should_run, should_merge, run_required, property, input_group_id, ...log }, groupByAnimal = false) => {
|
|
8993
|
+
const isOrchestrator = logger.includes('orchestrator');
|
|
8994
|
+
const isKey = !isOrchestrator && !!key;
|
|
8995
|
+
const isProperty = !isOrchestrator && !!property;
|
|
8996
|
+
const parentLogKey = [
|
|
8997
|
+
groupByAnimal && log.animalId,
|
|
8998
|
+
hasValue(term) && `["${term}"]`,
|
|
8999
|
+
(!isOrchestrator && key) || property,
|
|
9000
|
+
log.emission_id
|
|
9001
|
+
]
|
|
9002
|
+
.filter(Boolean)
|
|
9003
|
+
.join('.');
|
|
9004
|
+
const logModelKey = [parentLogKey, hasValue(model) && model].filter(Boolean).join('.');
|
|
9005
|
+
set(group, `${parentLogKey}.models`, unique([...get(group, `${parentLogKey}.models`, []), model]));
|
|
9006
|
+
set(group, `${parentLogKey}.isKey`, isKey);
|
|
9007
|
+
set(group, `${parentLogKey}.isProperty`, isProperty);
|
|
9008
|
+
input_group_id && set(group, `${parentLogKey}.groupId`, input_group_id);
|
|
9009
|
+
let data = get(group, logModelKey, {});
|
|
9010
|
+
data = includeBlankNodes(data, log);
|
|
9011
|
+
if (typeof should_run !== 'undefined') {
|
|
9012
|
+
const shouldRun = should_run === 'True';
|
|
9013
|
+
data = isOrchestrator
|
|
9014
|
+
? {
|
|
9015
|
+
...data,
|
|
9016
|
+
...omitLogKeys(log, 'value'),
|
|
9017
|
+
shouldRunOrchestrator: shouldRun
|
|
9018
|
+
}
|
|
9019
|
+
: {
|
|
9020
|
+
...data,
|
|
9021
|
+
...omitLogKeys(log),
|
|
9022
|
+
shouldRun
|
|
9023
|
+
};
|
|
9024
|
+
}
|
|
9025
|
+
else if (typeof run_required !== 'undefined') {
|
|
9026
|
+
const runRequired = run_required === 'True';
|
|
9027
|
+
data = {
|
|
9028
|
+
...data,
|
|
9029
|
+
...(runRequired ? {} : omitLogKeys(log)), // no need to save logs if we need to run the model
|
|
9030
|
+
runRequired
|
|
9031
|
+
};
|
|
9032
|
+
}
|
|
9033
|
+
else if ('requirements' in log) {
|
|
9034
|
+
const { requirements, ...logData } = log;
|
|
9035
|
+
data.requirements = {
|
|
9036
|
+
...(data.requirements || {}),
|
|
9037
|
+
...logData
|
|
9038
|
+
};
|
|
9039
|
+
}
|
|
9040
|
+
else if (missingLookupPrefix in log) {
|
|
9041
|
+
data.missingLookups = unique([...(data.missingLookups || []), parseLookup(log)]);
|
|
9042
|
+
}
|
|
9043
|
+
else if (!isOrchestrator) {
|
|
9044
|
+
data.logs = {
|
|
9045
|
+
...(data.logs || {}),
|
|
9046
|
+
...parseLog(log)
|
|
9047
|
+
};
|
|
9048
|
+
}
|
|
9049
|
+
if (typeof should_merge !== 'undefined') {
|
|
9050
|
+
data.shouldMerge = should_merge === 'True';
|
|
9051
|
+
}
|
|
9052
|
+
if (typeof log.replaceLowerTier !== 'undefined') {
|
|
9053
|
+
data.replaceLowerTier = log.replaceLowerTier === 'True';
|
|
9054
|
+
}
|
|
9055
|
+
if (typeof log.replaceThreshold !== 'undefined') {
|
|
9056
|
+
data.replaceThreshold = log.replaceThreshold === 'True';
|
|
9057
|
+
}
|
|
9058
|
+
set(group, logModelKey, data);
|
|
9059
|
+
return group;
|
|
9060
|
+
};
|
|
9061
|
+
const groupLogSubValue = (group, log, key) => {
|
|
9062
|
+
const id = log[key];
|
|
9063
|
+
const data = groupLog(group[id] || {}, log);
|
|
9064
|
+
group[id] = data;
|
|
9065
|
+
if (subValueKeys.includes(key)) {
|
|
9066
|
+
// add value to the same term/model on parent group
|
|
9067
|
+
Object.entries(group[id]).map(([term, models]) => Object.keys(models).map(model => {
|
|
9068
|
+
if (typeof group?.[term]?.[model] === 'object') {
|
|
9069
|
+
group[term][model][key] = unique([...(group[term][model][key] || []), id]);
|
|
9070
|
+
}
|
|
9071
|
+
}));
|
|
9072
|
+
}
|
|
9073
|
+
return group;
|
|
9074
|
+
};
|
|
9075
|
+
const csvValue = (value) => (value || '').replace('[', '').replace(']', '');
|
|
9076
|
+
const parseLogMessage = (message) => {
|
|
9077
|
+
try {
|
|
9078
|
+
const data = JSON.parse(message);
|
|
9079
|
+
// Split on a comma (and optional space) ONLY if it's followed by "key="
|
|
9080
|
+
// \w+ matches alphanumeric characters and underscores (standard log keys)
|
|
9081
|
+
const pairs = data.message.split(/,\s*(?=\w+=)/);
|
|
9082
|
+
return pairs.reduce((prev, parts) => {
|
|
9083
|
+
// Use indexOf instead of split('=') just in case your values ever contain an '='
|
|
9084
|
+
const firstEqualsIndex = parts.indexOf('=');
|
|
9085
|
+
if (firstEqualsIndex === -1)
|
|
9086
|
+
return prev;
|
|
9087
|
+
const key = parts.substring(0, firstEqualsIndex).trim();
|
|
9088
|
+
const value = parts.substring(firstEqualsIndex + 1).trim();
|
|
9089
|
+
const val = csvValue(value);
|
|
9090
|
+
return {
|
|
9091
|
+
...prev,
|
|
9092
|
+
...(key && val ? { [key]: val } : {})
|
|
9093
|
+
};
|
|
9094
|
+
}, { logger: data.logger });
|
|
9095
|
+
}
|
|
9096
|
+
catch {
|
|
9097
|
+
// make sure it works even if one log is malformed
|
|
9098
|
+
return {};
|
|
9099
|
+
}
|
|
9100
|
+
};
|
|
9101
|
+
const groupLogsByModel = (data = '', groupBySubValue = false, groupByAnimal = false) => data
|
|
9102
|
+
.trim()
|
|
9103
|
+
.split('\n')
|
|
9104
|
+
.map(parseLogMessage)
|
|
9105
|
+
.filter(v => [hasValue(v?.model), ['term', 'key', 'animalId'].some(k => hasValue(v?.[k]))].every(Boolean))
|
|
9106
|
+
.reduce((group, log) => {
|
|
9107
|
+
const subValue = subValueKeys.find(v => !!log[v] && log[v] != noValue);
|
|
9108
|
+
return subValue && groupBySubValue && !log.cycle
|
|
9109
|
+
? groupLogSubValue(group, log, subValue)
|
|
9110
|
+
: groupLog(group, log, groupByAnimal);
|
|
9111
|
+
}, {});
|
|
9112
|
+
class NodeLogsModelsService {
|
|
9113
|
+
constructor() {
|
|
9114
|
+
this.nodeService = inject(HeNodeService);
|
|
9115
|
+
}
|
|
9116
|
+
getNodeLogs$(node, groupByAnimal = false) {
|
|
9117
|
+
return this.nodeService
|
|
9118
|
+
.getLog$({
|
|
9119
|
+
'@type': node['@type'],
|
|
9120
|
+
'@id': node['@id'],
|
|
9121
|
+
dataState: node.aggregated && node['@type'] !== NodeType.ImpactAssessment ? DataState.original : DataState.recalculated
|
|
9122
|
+
})
|
|
9123
|
+
.pipe(map(logs => logs ? groupLogsByModel(logs, node['@type'] === NodeType.Cycle, groupByAnimal) : {}));
|
|
9124
|
+
}
|
|
9125
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NodeLogsModelsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
9126
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NodeLogsModelsService, providedIn: 'root' }); }
|
|
9127
|
+
}
|
|
9128
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NodeLogsModelsService, decorators: [{
|
|
9129
|
+
type: Injectable,
|
|
9130
|
+
args: [{
|
|
9131
|
+
providedIn: 'root'
|
|
9132
|
+
}]
|
|
9133
|
+
}] });
|
|
9134
|
+
|
|
9146
9135
|
const groupTerms = (terms) => terms.reduce((prev, curr) => ({ ...prev, [curr['@id']]: curr }), {});
|
|
9147
9136
|
const logIcon = {
|
|
9148
9137
|
[LogStatus.success]: 'checkmark',
|
|
@@ -9235,6 +9224,7 @@ const valuesSchemaType = (values) => Array.isArray(values) ? valueSchemaType(val
|
|
|
9235
9224
|
class NodeLogsModelsComponent {
|
|
9236
9225
|
constructor() {
|
|
9237
9226
|
this.nodeService = inject(HeNodeService);
|
|
9227
|
+
this.nodeLogsModelsService = inject(NodeLogsModelsService);
|
|
9238
9228
|
this.searchService = inject(HeSearchService);
|
|
9239
9229
|
this.engineService = inject(HeEngineService);
|
|
9240
9230
|
this.guideEnabled = inject(GUIDE_ENABLED);
|
|
@@ -9273,15 +9263,11 @@ class NodeLogsModelsComponent {
|
|
|
9273
9263
|
this.logsUrl = computed(() => this.nodeService.nodeLogsUrl(this.node()), ...(ngDevMode ? [{ debugName: "logsUrl" }] : []));
|
|
9274
9264
|
this.nodeType = computed(() => nodeType(this.node()), ...(ngDevMode ? [{ debugName: "nodeType" }] : []));
|
|
9275
9265
|
this.logsResource = rxResource({
|
|
9276
|
-
params: () => ({ node: this.node() }),
|
|
9277
|
-
stream: ({ params: { node } }) => this.
|
|
9278
|
-
'@type': node['@type'],
|
|
9279
|
-
'@id': node['@id'],
|
|
9280
|
-
dataState: node.aggregated && node['@type'] !== NodeType.ImpactAssessment ? DataState.original : DataState.recalculated
|
|
9281
|
-
})
|
|
9266
|
+
params: () => ({ node: this.node(), groupByAnimal: !!this.logsKey() }),
|
|
9267
|
+
stream: ({ params: { node, groupByAnimal } }) => this.nodeLogsModelsService.getNodeLogs$(node, groupByAnimal)
|
|
9282
9268
|
});
|
|
9283
|
-
this.allLogs = computed(() => this.logsResource.value() ??
|
|
9284
|
-
this.hasLogs = computed(() => this.allLogs()
|
|
9269
|
+
this.allLogs = computed(() => this.logsResource.value() ?? {}, ...(ngDevMode ? [{ debugName: "allLogs" }] : []));
|
|
9270
|
+
this.hasLogs = computed(() => !isEmpty(this.allLogs()), ...(ngDevMode ? [{ debugName: "hasLogs" }] : []));
|
|
9285
9271
|
this.configResource = rxResource({
|
|
9286
9272
|
params: () => ({ node: this.node() }),
|
|
9287
9273
|
stream: ({ params: { node } }) => this.engineService.ochestratorConfig$(nodeType(node), nodeId(node))
|
|
@@ -9308,8 +9294,7 @@ class NodeLogsModelsComponent {
|
|
|
9308
9294
|
return prev;
|
|
9309
9295
|
}, {}), ...(ngDevMode ? [{ debugName: "animalGroups" }] : []));
|
|
9310
9296
|
this.termsGrouping = computed(() => Object.assign({}, this.inputGroupsResource.value() ?? {}, this.animalGroups() ?? {}), ...(ngDevMode ? [{ debugName: "termsGrouping" }] : []));
|
|
9311
|
-
this.
|
|
9312
|
-
this.logs = computed(() => (this.logsKey() ? this.groupedLogs()?.[this.logsKey()] : this.groupedLogs()) || {}, ...(ngDevMode ? [{ debugName: "logs" }] : []));
|
|
9297
|
+
this.logs = computed(() => (this.logsKey() ? this.allLogs()?.[this.logsKey()] : this.allLogs()) || {}, ...(ngDevMode ? [{ debugName: "logs" }] : []));
|
|
9313
9298
|
this.isBlankNodes = computed(() => Array.isArray(this.originalValues()) || Array.isArray(this.recalculatedValues()), ...(ngDevMode ? [{ debugName: "isBlankNodes" }] : []));
|
|
9314
9299
|
this.extraTermsFromLogsResource = rxResource({
|
|
9315
9300
|
params: () => ({
|
|
@@ -11878,7 +11863,7 @@ const formatError = (error, allErrors = []) => error
|
|
|
11878
11863
|
: undefined;
|
|
11879
11864
|
const errorHasError = (error) => error && (error.level === 'error' || !error.level);
|
|
11880
11865
|
const errorHasWarning = (error) => error && error.level === 'warning';
|
|
11881
|
-
const isMissingPropertyError = ({ params
|
|
11866
|
+
const isMissingPropertyError = ({ params }) => !!params && 'missingProperty' in params;
|
|
11882
11867
|
const isMissingOneOfError = ({ keyword, schemaPath }) => keyword === 'required' && (schemaPath || '').includes('oneOf');
|
|
11883
11868
|
const isFailingKeywordError = ({ params }) => !!params && 'failingKeyword' in params;
|
|
11884
11869
|
const filterError = (error) => [isFailingKeywordError].every(func => !func(error));
|
|
@@ -12496,7 +12481,7 @@ const groupChanged = (properties, key, value) => {
|
|
|
12496
12481
|
}
|
|
12497
12482
|
}, properties);
|
|
12498
12483
|
}
|
|
12499
|
-
catch
|
|
12484
|
+
catch {
|
|
12500
12485
|
// ignore error
|
|
12501
12486
|
}
|
|
12502
12487
|
};
|
|
@@ -13237,7 +13222,7 @@ const errorCsv = nodes => {
|
|
|
13237
13222
|
try {
|
|
13238
13223
|
return toCsv$1(nodes, { includeExising: true });
|
|
13239
13224
|
}
|
|
13240
|
-
catch
|
|
13225
|
+
catch {
|
|
13241
13226
|
return '';
|
|
13242
13227
|
}
|
|
13243
13228
|
};
|
|
@@ -15046,39 +15031,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
15046
15031
|
}]
|
|
15047
15032
|
}], ctorParameters: () => [], propDecorators: { indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: true }] }] } });
|
|
15048
15033
|
|
|
15049
|
-
class FilterStore extends ComponentStore {
|
|
15050
|
-
constructor() {
|
|
15051
|
-
super(initialFilterState);
|
|
15052
|
-
this.setValue = this.updater((state, value) => ({
|
|
15053
|
-
...state,
|
|
15054
|
-
value
|
|
15055
|
-
}));
|
|
15056
|
-
this.setData = this.updater((state, data) => ({
|
|
15057
|
-
...state,
|
|
15058
|
-
data: populateWithTrackIdsFilterData(data)
|
|
15059
|
-
}));
|
|
15060
|
-
this.flattenOptions = this.selectSignal(({ data }) => {
|
|
15061
|
-
const flattenData = flatFilterData(data);
|
|
15062
|
-
return flattenData.filter(item => item.type === 'option');
|
|
15063
|
-
});
|
|
15064
|
-
this.value = this.selectSignal(({ value }) => value);
|
|
15065
|
-
this.filteredData = this.selectSignal(({ filter, filterFn, data, mapFn }) => {
|
|
15066
|
-
const filteredData = this._getFilteredData(filter, filterFn, data);
|
|
15067
|
-
return mapFn ? mapFilterData(filteredData, mapFn) : filteredData;
|
|
15068
|
-
});
|
|
15069
|
-
}
|
|
15070
|
-
_getFilteredData(filter, filterFn, data) {
|
|
15071
|
-
return filter.trim().length
|
|
15072
|
-
? this.flattenOptions().filter(o => filterFn(o, filter))
|
|
15073
|
-
: searchFilterData(data, item => filterFn(item, filter));
|
|
15074
|
-
}
|
|
15075
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FilterStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
15076
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FilterStore }); }
|
|
15077
|
-
}
|
|
15078
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FilterStore, decorators: [{
|
|
15079
|
-
type: Injectable
|
|
15080
|
-
}], ctorParameters: () => [] });
|
|
15081
|
-
|
|
15082
15034
|
const allGroups = (values = []) => values.flatMap(v => (v.type === 'group' ? [v, ...allGroups(v.options)] : []));
|
|
15083
15035
|
const allOptions = ({ options }) => options.flatMap(v => (v.type === 'group' ? allOptions(v) : v));
|
|
15084
15036
|
const optionsFromGroup = (group) => allOptions(group).map(v => v.value);
|
|
@@ -15114,7 +15066,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
15114
15066
|
class FilterAccordionComponent extends ControlValueAccessor {
|
|
15115
15067
|
constructor() {
|
|
15116
15068
|
super();
|
|
15117
|
-
this.filterStore = inject((FilterStore));
|
|
15118
15069
|
/**
|
|
15119
15070
|
* Show the header, with title and global clear/search.
|
|
15120
15071
|
*/
|
|
@@ -15162,9 +15113,10 @@ class FilterAccordionComponent extends ControlValueAccessor {
|
|
|
15162
15113
|
this.getDirectOptionsCount = getDirectOptionsCount;
|
|
15163
15114
|
this.optionsFromGroup = optionsFromGroup;
|
|
15164
15115
|
this.search = signal('', ...(ngDevMode ? [{ debugName: "search" }] : []));
|
|
15165
|
-
this.group = computed(() => ({
|
|
15116
|
+
this.group = computed(() => ({
|
|
15117
|
+
options: populateWithTrackIdsFilterData(this.data() || [])
|
|
15118
|
+
}), ...(ngDevMode ? [{ debugName: "group" }] : []));
|
|
15166
15119
|
this.disabledValues = computed(() => disabledValues(this.data()), ...(ngDevMode ? [{ debugName: "disabledValues" }] : []));
|
|
15167
|
-
effect(() => this.data() && this.filterStore.setData(this.data()));
|
|
15168
15120
|
effect(() => (this.panelStates = Object.fromEntries(
|
|
15169
15121
|
/* eslint-disable-next-line complexity */
|
|
15170
15122
|
allGroups(this.data()).map(({ label, type }, index) => [
|
|
@@ -15183,9 +15135,6 @@ class FilterAccordionComponent extends ControlValueAccessor {
|
|
|
15183
15135
|
this.selectControl.setValue(value);
|
|
15184
15136
|
this.updateSelectedValues(value);
|
|
15185
15137
|
}
|
|
15186
|
-
ngOnInit() {
|
|
15187
|
-
this.filterStore.setValue(this.selectControl.valueChanges.pipe(startWith(this.selectControl.value)));
|
|
15188
|
-
}
|
|
15189
15138
|
updateSelectedValues(value) {
|
|
15190
15139
|
const disabledValues = this.disabledValues();
|
|
15191
15140
|
const nonDisabledValues = value?.filter(v => !disabledValues.includes(v)) ?? [];
|
|
@@ -15261,17 +15210,8 @@ class FilterAccordionComponent extends ControlValueAccessor {
|
|
|
15261
15210
|
provide: NG_VALUE_ACCESSOR,
|
|
15262
15211
|
useExisting: forwardRef(() => FilterAccordionComponent),
|
|
15263
15212
|
multi: true
|
|
15264
|
-
}
|
|
15265
|
-
FilterStore
|
|
15266
|
-
], usesInheritance: true, ngImport: i0, template: "<div class=\"is-flex is-flex-direction-column is-gap-12 w-100\">\n @if (showHeader()) {\n <div class=\"is-flex is-flex-direction-column is-gap-12 is-justify-content-space-between is-align-items-flex-start\">\n @if (title()) {\n <div class=\"is-flex is-align-items-center\">\n <span class=\"has-text-secondary has-text-weight-semibold\">{{ title() }}</span>\n @if (tooltip()) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"is-ml-1 is-mb-1 has-text-grey-light is-clickable\"\n [ngbTooltip]=\"tooltip()\"\n placement=\"right\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n </div>\n }\n\n <ng-content select=\"[header-content]\" />\n\n @if (showClearAll()) {\n <span\n class=\"is-size-7 has-text-weight-normal is-italic | clear-button\"\n [class.is-clickable]=\"hasSelectedValues()\"\n (click)=\"hasSelectedValues() && clearAll()\">\n Clear all\n </span>\n }\n\n @if (showGlobalSearch()) {\n <div class=\"field is-mb-0 w-100\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n [placeholder]=\"globalSearchPlaceholder()\"\n [(ngModel)]=\"search\"\n [disabled]=\"disabled()\"\n (input)=\"onSearch($event.target.value, group())\" />\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"!search()\" (click)=\"clearSearch()\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"search()\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"has-border-top has-border-bottom\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: { group: group(), parentSearch: search(), showNoResults: showGlobalSearch() }\n \" />\n </div>\n</div>\n\n<ng-template #itemsList let-group=\"group\" let-parentSearch=\"parentSearch\" let-showNoResults=\"showNoResults\">\n @for (item of group | filterAccordionGroup: parentSearch; track item.trackId || item.label; let lastItem = $last) {\n @if (item.type === 'group') {\n @let groupState = panelStates[item.label];\n @if (groupState) {\n <div [class.has-border-bottom]=\"!lastItem\" [class.is-active]=\"groupState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover is-py-1 | accordion-row\"\n (click)=\"groupState.expanded = !groupState.expanded\">\n <ng-container *ngTemplateOutlet=\"groupOptionLabel; context: { item, groupState }\" />\n </div>\n\n @if (groupState.expanded) {\n <div class=\"is-overflow-hidden\" [@slideDownUp]=\"groupState.expanded\">\n @if (!showGlobalSearch() && getDirectOptionsCount(item) >= 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right pl-5\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input pl-2\"\n placeholder=\"Search {{ item.label }}\"\n [value]=\"groupState.searchTerm || ''\"\n [disabled]=\"isItemEffectivelyDisabled(item)\"\n (input)=\"groupState.searchTerm = $event.target.value; onSearch($event.target.value, item)\" />\n <a\n class=\"icon has-text-secondary is-small is-right\"\n [class.is-hidden]=\"!groupState.searchTerm\"\n (click)=\"groupState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small has-text-secondary is-right\" [class.is-hidden]=\"groupState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n\n <div class=\"pl-5\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: {\n group: item,\n parentSearch: parentSearch || groupState.searchTerm,\n showNoResults: !showGlobalSearch()\n }\n \" />\n </div>\n </div>\n }\n </div>\n }\n } @else {\n <div\n class=\"is-flex is-justify-content-space-between is-py-1 | accordion-row\"\n [class.has-border-bottom]=\"!lastItem\">\n <ng-container *ngTemplateOutlet=\"optionLabel; context: { item }\" />\n </div>\n }\n } @empty {\n @if (parentSearch && showNoResults) {\n <div class=\"px-6 py-4 has-text-grey is-size-7 has-text-centered is-italic\">\n No results found for \"{{ parentSearch }}\"\n </div>\n }\n }\n</ng-template>\n\n<ng-template #itemLabel let-item=\"item\" let-count=\"count\">\n <span class=\"is-flex is-gap-4 is-flex-wrap-wrap is-flex-grow-1 is-size-7 has-text-grey-dark has-text-weight-medium\">\n <span>{{ item.label }}</span>\n\n @if (item.tooltip) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"has-text-grey-light\"\n [ngbTooltip]=\"item.tooltip\"\n placement=\"top\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n\n @if (isNumber(count)) {\n <span class=\"has-text-grey-light is-size-7\">({{ count }})</span>\n }\n </span>\n</ng-template>\n\n<ng-template #groupOptionLabel let-item=\"item\" let-groupState=\"groupState\">\n @let options = optionsFromGroup(item);\n\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isGroupFullySelected(options)\"\n [indeterminate]=\"isGroupPartiallySelected(options)\"\n (change)=\"toggleGroup(options)\"\n [disabled]=\"isItemEffectivelyDisabled(item)\" />\n </label>\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: showGroupCount() ? item.count : undefined }\" />\n\n <he-svg-icon\n class=\"has-text-secondary transition-transform\"\n [name]=\"groupState.expanded ? 'chevron-up' : 'chevron-down'\" />\n</ng-template>\n\n<ng-template #optionLabel let-item=\"item\" let-parentDisabled=\"parentDisabled\">\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isOptionSelected(item.value)\"\n (change)=\"toggleOption(item.value)\"\n [disabled]=\"isItemEffectivelyDisabled(item, parentDisabled)\" />\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: item.count }\" />\n </label>\n</ng-template>\n", styles: [".clear-button{color:#b5b5b5}.clear-button.is-clickable{color:#4c7194}.accordion-row{min-height:25px}.control{height:28px}.control.has-icons-left .icon,.control.has-icons-right .icon{height:28px!important}.search-input{height:28px;border:1px solid #dbe3ea;border-radius:3px;font-weight:400;line-height:17px;box-shadow:none!important}.has-background-hover-light:hover{background-color:#fafafa}.has-border-top{border-top:1px solid #dbe3ea}.has-border-bottom{border-bottom:1px solid #dbe3ea}.transition-transform{transition:transform .2s ease-out}input[type=checkbox]{height:14px;width:14px;border:1px solid #b5b5b5;border-radius:3px;appearance:none;-webkit-appearance:none;background-color:transparent;accent-color:transparent}input[type=checkbox]:disabled{background-color:#f5f5f5}input[type=checkbox]:checked{background-color:#4c7194;accent-color:#4c7194;appearance:auto;-webkit-appearance:auto}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: InputIndeterminateDirective, selector: "input[indeterminate]", inputs: ["indeterminate"] }, { kind: "pipe", type: FilterAccordionGroupPipe, name: "filterAccordionGroup" }], animations: [
|
|
15267
|
-
trigger('slideDownUp', [
|
|
15268
|
-
transition(':enter', [
|
|
15269
|
-
style({ maxHeight: '0', opacity: 0 }),
|
|
15270
|
-
animate('200ms ease-in', style({ maxHeight: '1000px', opacity: 1 }))
|
|
15271
|
-
]),
|
|
15272
|
-
transition(':leave', [animate('200ms ease-out', style({ maxHeight: '0', opacity: 0 }))])
|
|
15273
|
-
])
|
|
15274
|
-
], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
15213
|
+
}
|
|
15214
|
+
], usesInheritance: true, ngImport: i0, template: "<div class=\"is-flex is-flex-direction-column is-gap-12 w-100\">\n @if (showHeader()) {\n <div class=\"is-flex is-flex-direction-column is-gap-12 is-justify-content-space-between is-align-items-flex-start\">\n @if (title()) {\n <div class=\"is-flex is-align-items-center\">\n <span class=\"has-text-secondary has-text-weight-semibold\">{{ title() }}</span>\n @if (tooltip()) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"is-ml-1 is-mb-1 has-text-grey-light is-clickable\"\n [ngbTooltip]=\"tooltip()\"\n placement=\"right\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n </div>\n }\n\n <ng-content select=\"[header-content]\" />\n\n @if (showClearAll()) {\n <span\n class=\"is-size-7 has-text-weight-normal is-italic | clear-button\"\n [class.is-clickable]=\"hasSelectedValues()\"\n (click)=\"hasSelectedValues() && clearAll()\">\n Clear all\n </span>\n }\n\n @if (showGlobalSearch()) {\n <div class=\"field is-mb-0 w-100\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n [placeholder]=\"globalSearchPlaceholder()\"\n [(ngModel)]=\"search\"\n [disabled]=\"disabled()\"\n (input)=\"onSearch($event.target.value, group())\" />\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"!search()\" (click)=\"clearSearch()\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"search()\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"has-border-top has-border-bottom\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: { group: group(), parentSearch: search(), showNoResults: showGlobalSearch() }\n \" />\n </div>\n</div>\n\n<ng-template #itemsList let-group=\"group\" let-parentSearch=\"parentSearch\" let-showNoResults=\"showNoResults\">\n @for (item of group | filterAccordionGroup: parentSearch; track item.trackId || item.label; let lastItem = $last) {\n @if (item.type === 'group') {\n @let groupState = panelStates[item.label];\n @if (groupState) {\n <div [class.has-border-bottom]=\"!lastItem\" [class.is-active]=\"groupState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover is-py-1 | accordion-row\"\n (click)=\"groupState.expanded = !groupState.expanded\">\n <ng-container *ngTemplateOutlet=\"groupOptionLabel; context: { item, groupState }\" />\n </div>\n\n @if (groupState.expanded) {\n <div class=\"is-overflow-hidden\" animate.enter=\"slide-down\" animate.leave=\"slide-up\">\n @if (!showGlobalSearch() && getDirectOptionsCount(item) >= 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right pl-5\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input pl-2\"\n placeholder=\"Search {{ item.label }}\"\n [value]=\"groupState.searchTerm || ''\"\n [disabled]=\"isItemEffectivelyDisabled(item)\"\n (input)=\"groupState.searchTerm = $event.target.value; onSearch($event.target.value, item)\" />\n <a\n class=\"icon has-text-secondary is-small is-right\"\n [class.is-hidden]=\"!groupState.searchTerm\"\n (click)=\"groupState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small has-text-secondary is-right\" [class.is-hidden]=\"groupState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n\n <div class=\"pl-5\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: {\n group: item,\n parentSearch: parentSearch || groupState.searchTerm,\n showNoResults: !showGlobalSearch()\n }\n \" />\n </div>\n </div>\n }\n </div>\n }\n } @else {\n <div\n class=\"is-flex is-justify-content-space-between is-py-1 | accordion-row\"\n [class.has-border-bottom]=\"!lastItem\">\n <ng-container *ngTemplateOutlet=\"optionLabel; context: { item }\" />\n </div>\n }\n } @empty {\n @if (parentSearch && showNoResults) {\n <div class=\"px-6 py-4 has-text-grey is-size-7 has-text-centered is-italic\">\n No results found for \"{{ parentSearch }}\"\n </div>\n }\n }\n</ng-template>\n\n<ng-template #itemLabel let-item=\"item\" let-count=\"count\">\n <span class=\"is-flex is-gap-4 is-flex-wrap-wrap is-flex-grow-1 is-size-7 has-text-grey-dark has-text-weight-medium\">\n <span>{{ item.label }}</span>\n\n @if (item.tooltip) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"has-text-grey-light\"\n [ngbTooltip]=\"item.tooltip\"\n placement=\"top\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n\n @if (isNumber(count)) {\n <span class=\"has-text-grey-light is-size-7\">({{ count }})</span>\n }\n </span>\n</ng-template>\n\n<ng-template #groupOptionLabel let-item=\"item\" let-groupState=\"groupState\">\n @let options = optionsFromGroup(item);\n\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isGroupFullySelected(options)\"\n [indeterminate]=\"isGroupPartiallySelected(options)\"\n (change)=\"toggleGroup(options)\"\n [disabled]=\"isItemEffectivelyDisabled(item)\" />\n </label>\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: showGroupCount() ? item.count : undefined }\" />\n\n <he-svg-icon\n class=\"has-text-secondary transition-transform\"\n [name]=\"groupState.expanded ? 'chevron-up' : 'chevron-down'\" />\n</ng-template>\n\n<ng-template #optionLabel let-item=\"item\" let-parentDisabled=\"parentDisabled\">\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isOptionSelected(item.value)\"\n (change)=\"toggleOption(item.value)\"\n [disabled]=\"isItemEffectivelyDisabled(item, parentDisabled)\" />\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: item.count }\" />\n </label>\n</ng-template>\n", styles: ["@keyframes slideDown{0%{max-height:0;opacity:0}to{max-height:1000px;opacity:1}}@keyframes slideUp{0%{max-height:1000px;opacity:1}to{max-height:0;opacity:0}}.slide-down{animation:slideDown .2s ease-in;overflow:hidden}.slide-up{animation:slideUp .2s ease-out;overflow:hidden}.clear-button{color:#b5b5b5}.clear-button.is-clickable{color:#4c7194}.accordion-row{min-height:25px}.control{height:28px}.control.has-icons-left .icon,.control.has-icons-right .icon{height:28px!important}.search-input{height:28px;border:1px solid #dbe3ea;border-radius:3px;font-weight:400;line-height:17px;box-shadow:none!important}.has-background-hover-light:hover{background-color:#fafafa}.has-border-top{border-top:1px solid #dbe3ea}.has-border-bottom{border-bottom:1px solid #dbe3ea}.transition-transform{transition:transform .2s ease-out}input[type=checkbox]{height:14px;width:14px;border:1px solid #b5b5b5;border-radius:3px;appearance:none;-webkit-appearance:none;background-color:transparent;accent-color:transparent}input[type=checkbox]:disabled{background-color:#f5f5f5}input[type=checkbox]:checked{background-color:#4c7194;accent-color:#4c7194;appearance:auto;-webkit-appearance:auto}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: InputIndeterminateDirective, selector: "input[indeterminate]", inputs: ["indeterminate"] }, { kind: "pipe", type: FilterAccordionGroupPipe, name: "filterAccordionGroup" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
15275
15215
|
}
|
|
15276
15216
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FilterAccordionComponent, decorators: [{
|
|
15277
15217
|
type: Component$1,
|
|
@@ -15280,8 +15220,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
15280
15220
|
provide: NG_VALUE_ACCESSOR,
|
|
15281
15221
|
useExisting: forwardRef(() => FilterAccordionComponent),
|
|
15282
15222
|
multi: true
|
|
15283
|
-
}
|
|
15284
|
-
FilterStore
|
|
15223
|
+
}
|
|
15285
15224
|
], imports: [
|
|
15286
15225
|
FormsModule,
|
|
15287
15226
|
ReactiveFormsModule,
|
|
@@ -15290,15 +15229,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
15290
15229
|
NgTemplateOutlet,
|
|
15291
15230
|
FilterAccordionGroupPipe,
|
|
15292
15231
|
InputIndeterminateDirective
|
|
15293
|
-
],
|
|
15294
|
-
trigger('slideDownUp', [
|
|
15295
|
-
transition(':enter', [
|
|
15296
|
-
style({ maxHeight: '0', opacity: 0 }),
|
|
15297
|
-
animate('200ms ease-in', style({ maxHeight: '1000px', opacity: 1 }))
|
|
15298
|
-
]),
|
|
15299
|
-
transition(':leave', [animate('200ms ease-out', style({ maxHeight: '0', opacity: 0 }))])
|
|
15300
|
-
])
|
|
15301
|
-
], template: "<div class=\"is-flex is-flex-direction-column is-gap-12 w-100\">\n @if (showHeader()) {\n <div class=\"is-flex is-flex-direction-column is-gap-12 is-justify-content-space-between is-align-items-flex-start\">\n @if (title()) {\n <div class=\"is-flex is-align-items-center\">\n <span class=\"has-text-secondary has-text-weight-semibold\">{{ title() }}</span>\n @if (tooltip()) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"is-ml-1 is-mb-1 has-text-grey-light is-clickable\"\n [ngbTooltip]=\"tooltip()\"\n placement=\"right\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n </div>\n }\n\n <ng-content select=\"[header-content]\" />\n\n @if (showClearAll()) {\n <span\n class=\"is-size-7 has-text-weight-normal is-italic | clear-button\"\n [class.is-clickable]=\"hasSelectedValues()\"\n (click)=\"hasSelectedValues() && clearAll()\">\n Clear all\n </span>\n }\n\n @if (showGlobalSearch()) {\n <div class=\"field is-mb-0 w-100\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n [placeholder]=\"globalSearchPlaceholder()\"\n [(ngModel)]=\"search\"\n [disabled]=\"disabled()\"\n (input)=\"onSearch($event.target.value, group())\" />\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"!search()\" (click)=\"clearSearch()\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"search()\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"has-border-top has-border-bottom\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: { group: group(), parentSearch: search(), showNoResults: showGlobalSearch() }\n \" />\n </div>\n</div>\n\n<ng-template #itemsList let-group=\"group\" let-parentSearch=\"parentSearch\" let-showNoResults=\"showNoResults\">\n @for (item of group | filterAccordionGroup: parentSearch; track item.trackId || item.label; let lastItem = $last) {\n @if (item.type === 'group') {\n @let groupState = panelStates[item.label];\n @if (groupState) {\n <div [class.has-border-bottom]=\"!lastItem\" [class.is-active]=\"groupState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover is-py-1 | accordion-row\"\n (click)=\"groupState.expanded = !groupState.expanded\">\n <ng-container *ngTemplateOutlet=\"groupOptionLabel; context: { item, groupState }\" />\n </div>\n\n @if (groupState.expanded) {\n <div class=\"is-overflow-hidden\" [@slideDownUp]=\"groupState.expanded\">\n @if (!showGlobalSearch() && getDirectOptionsCount(item) >= 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right pl-5\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input pl-2\"\n placeholder=\"Search {{ item.label }}\"\n [value]=\"groupState.searchTerm || ''\"\n [disabled]=\"isItemEffectivelyDisabled(item)\"\n (input)=\"groupState.searchTerm = $event.target.value; onSearch($event.target.value, item)\" />\n <a\n class=\"icon has-text-secondary is-small is-right\"\n [class.is-hidden]=\"!groupState.searchTerm\"\n (click)=\"groupState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small has-text-secondary is-right\" [class.is-hidden]=\"groupState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n\n <div class=\"pl-5\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: {\n group: item,\n parentSearch: parentSearch || groupState.searchTerm,\n showNoResults: !showGlobalSearch()\n }\n \" />\n </div>\n </div>\n }\n </div>\n }\n } @else {\n <div\n class=\"is-flex is-justify-content-space-between is-py-1 | accordion-row\"\n [class.has-border-bottom]=\"!lastItem\">\n <ng-container *ngTemplateOutlet=\"optionLabel; context: { item }\" />\n </div>\n }\n } @empty {\n @if (parentSearch && showNoResults) {\n <div class=\"px-6 py-4 has-text-grey is-size-7 has-text-centered is-italic\">\n No results found for \"{{ parentSearch }}\"\n </div>\n }\n }\n</ng-template>\n\n<ng-template #itemLabel let-item=\"item\" let-count=\"count\">\n <span class=\"is-flex is-gap-4 is-flex-wrap-wrap is-flex-grow-1 is-size-7 has-text-grey-dark has-text-weight-medium\">\n <span>{{ item.label }}</span>\n\n @if (item.tooltip) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"has-text-grey-light\"\n [ngbTooltip]=\"item.tooltip\"\n placement=\"top\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n\n @if (isNumber(count)) {\n <span class=\"has-text-grey-light is-size-7\">({{ count }})</span>\n }\n </span>\n</ng-template>\n\n<ng-template #groupOptionLabel let-item=\"item\" let-groupState=\"groupState\">\n @let options = optionsFromGroup(item);\n\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isGroupFullySelected(options)\"\n [indeterminate]=\"isGroupPartiallySelected(options)\"\n (change)=\"toggleGroup(options)\"\n [disabled]=\"isItemEffectivelyDisabled(item)\" />\n </label>\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: showGroupCount() ? item.count : undefined }\" />\n\n <he-svg-icon\n class=\"has-text-secondary transition-transform\"\n [name]=\"groupState.expanded ? 'chevron-up' : 'chevron-down'\" />\n</ng-template>\n\n<ng-template #optionLabel let-item=\"item\" let-parentDisabled=\"parentDisabled\">\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isOptionSelected(item.value)\"\n (change)=\"toggleOption(item.value)\"\n [disabled]=\"isItemEffectivelyDisabled(item, parentDisabled)\" />\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: item.count }\" />\n </label>\n</ng-template>\n", styles: [".clear-button{color:#b5b5b5}.clear-button.is-clickable{color:#4c7194}.accordion-row{min-height:25px}.control{height:28px}.control.has-icons-left .icon,.control.has-icons-right .icon{height:28px!important}.search-input{height:28px;border:1px solid #dbe3ea;border-radius:3px;font-weight:400;line-height:17px;box-shadow:none!important}.has-background-hover-light:hover{background-color:#fafafa}.has-border-top{border-top:1px solid #dbe3ea}.has-border-bottom{border-bottom:1px solid #dbe3ea}.transition-transform{transition:transform .2s ease-out}input[type=checkbox]{height:14px;width:14px;border:1px solid #b5b5b5;border-radius:3px;appearance:none;-webkit-appearance:none;background-color:transparent;accent-color:transparent}input[type=checkbox]:disabled{background-color:#f5f5f5}input[type=checkbox]:checked{background-color:#4c7194;accent-color:#4c7194;appearance:auto;-webkit-appearance:auto}\n"] }]
|
|
15232
|
+
], template: "<div class=\"is-flex is-flex-direction-column is-gap-12 w-100\">\n @if (showHeader()) {\n <div class=\"is-flex is-flex-direction-column is-gap-12 is-justify-content-space-between is-align-items-flex-start\">\n @if (title()) {\n <div class=\"is-flex is-align-items-center\">\n <span class=\"has-text-secondary has-text-weight-semibold\">{{ title() }}</span>\n @if (tooltip()) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"is-ml-1 is-mb-1 has-text-grey-light is-clickable\"\n [ngbTooltip]=\"tooltip()\"\n placement=\"right\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n </div>\n }\n\n <ng-content select=\"[header-content]\" />\n\n @if (showClearAll()) {\n <span\n class=\"is-size-7 has-text-weight-normal is-italic | clear-button\"\n [class.is-clickable]=\"hasSelectedValues()\"\n (click)=\"hasSelectedValues() && clearAll()\">\n Clear all\n </span>\n }\n\n @if (showGlobalSearch()) {\n <div class=\"field is-mb-0 w-100\">\n <div class=\"control is-expanded has-icons-right\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input\"\n [placeholder]=\"globalSearchPlaceholder()\"\n [(ngModel)]=\"search\"\n [disabled]=\"disabled()\"\n (input)=\"onSearch($event.target.value, group())\" />\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"!search()\" (click)=\"clearSearch()\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon has-text-secondary is-small is-right\" [class.is-hidden]=\"search()\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"has-border-top has-border-bottom\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: { group: group(), parentSearch: search(), showNoResults: showGlobalSearch() }\n \" />\n </div>\n</div>\n\n<ng-template #itemsList let-group=\"group\" let-parentSearch=\"parentSearch\" let-showNoResults=\"showNoResults\">\n @for (item of group | filterAccordionGroup: parentSearch; track item.trackId || item.label; let lastItem = $last) {\n @if (item.type === 'group') {\n @let groupState = panelStates[item.label];\n @if (groupState) {\n <div [class.has-border-bottom]=\"!lastItem\" [class.is-active]=\"groupState.expanded\">\n <div\n class=\"is-flex is-align-items-center is-clickable has-background-hover is-py-1 | accordion-row\"\n (click)=\"groupState.expanded = !groupState.expanded\">\n <ng-container *ngTemplateOutlet=\"groupOptionLabel; context: { item, groupState }\" />\n </div>\n\n @if (groupState.expanded) {\n <div class=\"is-overflow-hidden\" animate.enter=\"slide-down\" animate.leave=\"slide-up\">\n @if (!showGlobalSearch() && getDirectOptionsCount(item) >= 5) {\n <div class=\"field is-mb-0 pb-2 has-border-bottom\">\n <div class=\"control is-expanded has-icons-right pl-5\">\n <input\n type=\"text\"\n class=\"input is-secondary is-small search-input pl-2\"\n placeholder=\"Search {{ item.label }}\"\n [value]=\"groupState.searchTerm || ''\"\n [disabled]=\"isItemEffectivelyDisabled(item)\"\n (input)=\"groupState.searchTerm = $event.target.value; onSearch($event.target.value, item)\" />\n <a\n class=\"icon has-text-secondary is-small is-right\"\n [class.is-hidden]=\"!groupState.searchTerm\"\n (click)=\"groupState.searchTerm = ''\">\n <he-svg-icon name=\"xmark\" />\n </a>\n <a class=\"icon is-small has-text-secondary is-right\" [class.is-hidden]=\"groupState.searchTerm\">\n <he-svg-icon name=\"search\" />\n </a>\n </div>\n </div>\n }\n\n <div class=\"pl-5\">\n <ng-container\n *ngTemplateOutlet=\"\n itemsList;\n context: {\n group: item,\n parentSearch: parentSearch || groupState.searchTerm,\n showNoResults: !showGlobalSearch()\n }\n \" />\n </div>\n </div>\n }\n </div>\n }\n } @else {\n <div\n class=\"is-flex is-justify-content-space-between is-py-1 | accordion-row\"\n [class.has-border-bottom]=\"!lastItem\">\n <ng-container *ngTemplateOutlet=\"optionLabel; context: { item }\" />\n </div>\n }\n } @empty {\n @if (parentSearch && showNoResults) {\n <div class=\"px-6 py-4 has-text-grey is-size-7 has-text-centered is-italic\">\n No results found for \"{{ parentSearch }}\"\n </div>\n }\n }\n</ng-template>\n\n<ng-template #itemLabel let-item=\"item\" let-count=\"count\">\n <span class=\"is-flex is-gap-4 is-flex-wrap-wrap is-flex-grow-1 is-size-7 has-text-grey-dark has-text-weight-medium\">\n <span>{{ item.label }}</span>\n\n @if (item.tooltip) {\n <he-svg-icon\n name=\"info-circle\"\n class=\"has-text-grey-light\"\n [ngbTooltip]=\"item.tooltip\"\n placement=\"top\"\n triggers=\"hover\"\n size=\"16\"\n container=\"body\" />\n }\n\n @if (isNumber(count)) {\n <span class=\"has-text-grey-light is-size-7\">({{ count }})</span>\n }\n </span>\n</ng-template>\n\n<ng-template #groupOptionLabel let-item=\"item\" let-groupState=\"groupState\">\n @let options = optionsFromGroup(item);\n\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isGroupFullySelected(options)\"\n [indeterminate]=\"isGroupPartiallySelected(options)\"\n (change)=\"toggleGroup(options)\"\n [disabled]=\"isItemEffectivelyDisabled(item)\" />\n </label>\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: showGroupCount() ? item.count : undefined }\" />\n\n <he-svg-icon\n class=\"has-text-secondary transition-transform\"\n [name]=\"groupState.expanded ? 'chevron-up' : 'chevron-down'\" />\n</ng-template>\n\n<ng-template #optionLabel let-item=\"item\" let-parentDisabled=\"parentDisabled\">\n <label\n class=\"checkbox is-flex is-justify-content-center is-align-items-center is-fullwidth\"\n (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"mr-3 is-flex-shrink-0\"\n [checked]=\"isOptionSelected(item.value)\"\n (change)=\"toggleOption(item.value)\"\n [disabled]=\"isItemEffectivelyDisabled(item, parentDisabled)\" />\n\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { item, count: item.count }\" />\n </label>\n</ng-template>\n", styles: ["@keyframes slideDown{0%{max-height:0;opacity:0}to{max-height:1000px;opacity:1}}@keyframes slideUp{0%{max-height:1000px;opacity:1}to{max-height:0;opacity:0}}.slide-down{animation:slideDown .2s ease-in;overflow:hidden}.slide-up{animation:slideUp .2s ease-out;overflow:hidden}.clear-button{color:#b5b5b5}.clear-button.is-clickable{color:#4c7194}.accordion-row{min-height:25px}.control{height:28px}.control.has-icons-left .icon,.control.has-icons-right .icon{height:28px!important}.search-input{height:28px;border:1px solid #dbe3ea;border-radius:3px;font-weight:400;line-height:17px;box-shadow:none!important}.has-background-hover-light:hover{background-color:#fafafa}.has-border-top{border-top:1px solid #dbe3ea}.has-border-bottom{border-bottom:1px solid #dbe3ea}.transition-transform{transition:transform .2s ease-out}input[type=checkbox]{height:14px;width:14px;border:1px solid #b5b5b5;border-radius:3px;appearance:none;-webkit-appearance:none;background-color:transparent;accent-color:transparent}input[type=checkbox]:disabled{background-color:#f5f5f5}input[type=checkbox]:checked{background-color:#4c7194;accent-color:#4c7194;appearance:auto;-webkit-appearance:auto}\n"] }]
|
|
15302
15233
|
}], ctorParameters: () => [], propDecorators: { showHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "showHeader", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], tooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltip", required: false }] }], showGlobalSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGlobalSearch", required: false }] }], globalSearchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "globalSearchPlaceholder", required: false }] }], showClearAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClearAll", required: false }] }], preserveOptionsOnSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "preserveOptionsOnSelection", required: false }] }], maintainPanelStates: [{ type: i0.Input, args: [{ isSignal: true, alias: "maintainPanelStates", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], showGroupCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGroupCount", required: false }] }], expandFirstGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandFirstGroup", required: false }] }], selectionChanged: [{ type: i0.Output, args: ["selectionChanged"] }] } });
|
|
15303
15234
|
|
|
15304
15235
|
const termTypeName = (select) => [
|
|
@@ -15640,5 +15571,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
|
|
|
15640
15571
|
* Generated bundle index. Do not edit.
|
|
15641
15572
|
*/
|
|
15642
15573
|
|
|
15643
|
-
export { ARRAY_DELIMITER, ApplyPurePipe, BarChartComponent, BibliographiesSearchConfirmComponent, BlankNodeStateComponent, BlankNodeStateNoticeComponent, BlankNodeValueDeltaComponent, CapitalizePipe, ChartComponent, ChartConfigurationDirective, ChartExportButtonComponent, ChartTooltipComponent, ClickOutsideDirective, ClipboardComponent, CollapsibleBoxComponent, CollapsibleBoxStyle, ColorPalette, CompoundDirective, CompoundPipe, ContributionChartComponent, ControlValueAccessor, CycleNodesKeyGroup, CyclesCompletenessComponent, CyclesEmissionsCategoryService, CyclesEmissionsChartComponent, CyclesFunctionalUnitMeasureComponent, CyclesMetadataComponent, CyclesNodesComponent, CyclesNodesTimelineComponent, CyclesResultComponent, DataTableComponent, DefaultPipe, DeltaColour, DistributionChartComponent, DrawerContainerComponent, DurationPipe, EllipsisPipe, EngineModelsLinkComponent, EngineModelsLookupInfoComponent, EngineModelsStageComponent, EngineModelsStageDeepComponent, EngineModelsStageDeepService, EngineModelsVersionInfoComponent, EngineModelsVersionLinkComponent, EngineOrchestratorEditComponent, EngineRequirementsFormComponent, FileSizePipe, FileUploadErrorKeys, FilesErrorSummaryComponent, FilesFormComponent, FilesFormEditableComponent, FilesUploadErrorsComponent, FilterAccordionComponent, GUIDE_ENABLED, GetPipe, GlossaryMigrationFormat, GuideOverlayComponent, HESvgIconComponent, HE_API_BASE_URL, HE_CALCULATIONS_BASE_URL, HE_MAP_LOADED, HeAuthService, HeCommonService, HeEngineService, HeGlossaryService, HeMendeleyService, HeNodeCsvService, HeNodeService, HeNodeStoreService, HeSchemaService, HeSearchService, HeToastService, HorizontalBarChartComponent, HorizontalButtonsGroupComponent, ImpactAssessmentsGraphComponent, ImpactAssessmentsIndicatorBreakdownChartComponent, ImpactAssessmentsIndicatorsChartComponent, ImpactAssessmentsProductsComponent, IsArrayPipe, IsObjectPipe, IssueConfirmComponent, KeyToLabelPipe, Level, LineChartComponent, LinkKeyValueComponent, LogStatus, LongPressDirective, MAX_RESULTS, MapsDrawingComponent, MapsDrawingConfirmComponent, MaxPipe, MeanPipe, MedianPipe, MendeleySearchResult, MinPipe, MobileShellComponent, NavigationMenuComponent, NoExtPipe, NodeAggregatedComponent, NodeAggregatedInfoComponent, NodeAggregatedQualityScoreComponent, NodeCsvExportConfirmComponent, NodeCsvPreviewComponent, NodeCsvSelectHeadersComponent, NodeIconComponent, NodeJsonldComponent, NodeJsonldSchemaComponent, NodeKeyState, NodeLinkComponent, NodeLogsFileComponent, NodeLogsModelsComponent, NodeLogsTimeComponent, NodeMissingLookupFactorsComponent, NodeQualityScore, NodeRecommendationsComponent, NodeSelectComponent, NodeValueDetailsComponent, PipelineStagesProgressComponent, PluralizePipe, PopoverComponent, PopoverConfirmComponent, PrecisionPipe, RelatedNodeResult, RemoveMarkdownPipe, RepeatPipe, Repository, ResizedDirective, ResizedEvent, ResponsiveService, SchemaInfoComponent, SchemaVersionLinkComponent, SearchExtendComponent, ShelfDialogComponent, ShellComponent, SitesManagementChartComponent, SitesMapsComponent, SitesNodesComponent, SkeletonTextComponent, SocialTagsComponent, SortByPipe, SortSelectComponent, SumPipe, TagsInputDirective, Template, TermsPropertyContentComponent, TermsSubClassOfContentComponent, TermsUnitsDescriptionComponent, ThousandSuffixesPipe, ThousandsPipe, TimesPipe, ToastComponent, UncapitalizePipe, addPolygonToFeature, afterBarDrawPlugin, allCountriesQuery, allGroups, allOptions, availableProperties, axisHoverPlugin, backgroundHoverPlugin, baseApiUrl, baseUrl, bottom, buildSummary, bytesSize, calculateCycleDuration, calculateCycleDurationEnabled, calculateCycleStartDate, calculateCycleStartDateEnabled, capitalize, changelogUrl, clustererImage, code, colorToRgba, compoundToHtml, computeKeys, computeTerms, contactUsEmail, contactUsLink, convertToSvg, coordinatesToPoint, copyObject, countGroupVisibleNodes, countriesQuery, createMarker, cropsQuery, d3ellipse, d3wrap, dataPathLabel, dataPathToKey, dataVersionHeader, dataVersionHeaderKey, defaultFeature, defaultLabel, defaultSuggestionType, defaultSvgIconSize, defaultTicksFont, definitionToSchemaType, distinctUntilChangedDeep, downloadFile, downloadPng, downloadSvg, ellipsis, engineGitBaseUrl, engineGitUrl, errorHasError, errorHasWarning, errorText, evaluateSuccess, exportAsSVG, exportFormats, externalLink, externalNodeLink, fillColor, fillStyle, filterBlankNode$1 as filterBlankNode, filterError, filterParams, findConfigModels, findMatchingModel, findModels, findNodeModel, findOrchestratorModel, findProperty, findPropertyById, flatFilterData, flatFilterNode, formatCustomErrorMessage, formatDate, formatError, formatPropertyError, formatter, getColor, getDatesBetween, gitBranch, gitHome, gitlabRawUrl, glossaryBaseUrl, glossaryLink, groupChanged,
|
|
15574
|
+
export { ARRAY_DELIMITER, ApplyPurePipe, BarChartComponent, BibliographiesSearchConfirmComponent, BlankNodeStateComponent, BlankNodeStateNoticeComponent, BlankNodeValueDeltaComponent, CapitalizePipe, ChartComponent, ChartConfigurationDirective, ChartExportButtonComponent, ChartTooltipComponent, ClickOutsideDirective, ClipboardComponent, CollapsibleBoxComponent, CollapsibleBoxStyle, ColorPalette, CompoundDirective, CompoundPipe, ContributionChartComponent, ControlValueAccessor, CycleNodesKeyGroup, CyclesCompletenessComponent, CyclesEmissionsCategoryService, CyclesEmissionsChartComponent, CyclesFunctionalUnitMeasureComponent, CyclesMetadataComponent, CyclesNodesComponent, CyclesNodesTimelineComponent, CyclesResultComponent, DataTableComponent, DefaultPipe, DeltaColour, DistributionChartComponent, DrawerContainerComponent, DurationPipe, EllipsisPipe, EngineModelsLinkComponent, EngineModelsLookupInfoComponent, EngineModelsStageComponent, EngineModelsStageDeepComponent, EngineModelsStageDeepService, EngineModelsVersionInfoComponent, EngineModelsVersionLinkComponent, EngineOrchestratorEditComponent, EngineRequirementsFormComponent, FileSizePipe, FileUploadErrorKeys, FilesErrorSummaryComponent, FilesFormComponent, FilesFormEditableComponent, FilesUploadErrorsComponent, FilterAccordionComponent, GUIDE_ENABLED, GetPipe, GlossaryMigrationFormat, GuideOverlayComponent, HESvgIconComponent, HE_API_BASE_URL, HE_CALCULATIONS_BASE_URL, HE_MAP_LOADED, HeAuthService, HeCommonService, HeEngineService, HeGlossaryService, HeMendeleyService, HeNodeCsvService, HeNodeService, HeNodeStoreService, HeSchemaService, HeSearchService, HeToastService, HorizontalBarChartComponent, HorizontalButtonsGroupComponent, ImpactAssessmentsGraphComponent, ImpactAssessmentsIndicatorBreakdownChartComponent, ImpactAssessmentsIndicatorsChartComponent, ImpactAssessmentsProductsComponent, IsArrayPipe, IsObjectPipe, IssueConfirmComponent, KeyToLabelPipe, Level, LineChartComponent, LinkKeyValueComponent, LogStatus, LongPressDirective, MAX_RESULTS, MapsDrawingComponent, MapsDrawingConfirmComponent, MaxPipe, MeanPipe, MedianPipe, MendeleySearchResult, MinPipe, MobileShellComponent, NavigationMenuComponent, NoExtPipe, NodeAggregatedComponent, NodeAggregatedInfoComponent, NodeAggregatedQualityScoreComponent, NodeCsvExportConfirmComponent, NodeCsvPreviewComponent, NodeCsvSelectHeadersComponent, NodeIconComponent, NodeJsonldComponent, NodeJsonldSchemaComponent, NodeKeyState, NodeLinkComponent, NodeLogsFileComponent, NodeLogsModelsComponent, NodeLogsTimeComponent, NodeMissingLookupFactorsComponent, NodeQualityScore, NodeRecommendationsComponent, NodeSelectComponent, NodeValueDetailsComponent, PipelineStagesProgressComponent, PluralizePipe, PopoverComponent, PopoverConfirmComponent, PrecisionPipe, RelatedNodeResult, RemoveMarkdownPipe, RepeatPipe, Repository, ResizedDirective, ResizedEvent, ResponsiveService, SchemaInfoComponent, SchemaVersionLinkComponent, SearchExtendComponent, ShelfDialogComponent, ShellComponent, SitesManagementChartComponent, SitesMapsComponent, SitesNodesComponent, SkeletonTextComponent, SocialTagsComponent, SortByPipe, SortSelectComponent, SumPipe, TagsInputDirective, Template, TermsPropertyContentComponent, TermsSubClassOfContentComponent, TermsUnitsDescriptionComponent, ThousandSuffixesPipe, ThousandsPipe, TimesPipe, ToastComponent, UncapitalizePipe, addPolygonToFeature, afterBarDrawPlugin, allCountriesQuery, allGroups, allOptions, availableProperties, axisHoverPlugin, backgroundHoverPlugin, baseApiUrl, baseUrl, bottom, buildSummary, bytesSize, calculateCycleDuration, calculateCycleDurationEnabled, calculateCycleStartDate, calculateCycleStartDateEnabled, capitalize, changelogUrl, clustererImage, code, colorToRgba, compoundToHtml, computeKeys, computeTerms, contactUsEmail, contactUsLink, convertToSvg, coordinatesToPoint, copyObject, countGroupVisibleNodes, countriesQuery, createMarker, cropsQuery, d3ellipse, d3wrap, dataPathLabel, dataPathToKey, dataVersionHeader, dataVersionHeaderKey, defaultFeature, defaultLabel, defaultSuggestionType, defaultSvgIconSize, defaultTicksFont, definitionToSchemaType, distinctUntilChangedDeep, downloadFile, downloadPng, downloadSvg, ellipsis, engineGitBaseUrl, engineGitUrl, errorHasError, errorHasWarning, errorText, evaluateSuccess, exportAsSVG, exportFormats, externalLink, externalNodeLink, fillColor, fillStyle, filterBlankNode$1 as filterBlankNode, filterError, filterParams, findConfigModels, findMatchingModel, findModels, findNodeModel, findOrchestratorModel, findProperty, findPropertyById, flatFilterData, flatFilterNode, formatCustomErrorMessage, formatDate, formatError, formatPropertyError, formatter, getColor, getDatesBetween, gitBranch, gitHome, gitlabRawUrl, glossaryBaseUrl, glossaryLink, groupChanged, groupLogsByTerm, groupNodesByTerm, groupdLogsByKey, grouppedKeys, grouppedValueKeys, groupsLogsByFields, guideModelUrl, guideNamespace, guidePageId, handleAPIError, handleGuideEvent, hasError, hasValidationError, hasWarning, hexToRgba, iconSizes, icons, ignoreKeys$2 as ignoreKeys, increaseScaleLimits, initialFilterState, injectResizeEvent$, inputGroupsTermTypes, isAddPropertyEnabled, isChrome, isDateBetween, isEqual, isExternal, isKeyClosedVisible, isKeyHidden, isMaxStage, isMethodModelAllowed, isMigrationError, isMissingOneOfError, isMissingPropertyError, isNonNodeModelKey, isSchemaIri, isScrolledBelow, isState, isTermTypeAllowed, isValidKey, keyToDataPath, levels, listColor, listColorContinuous, listColorWithAlpha, loadMapApi, loadSvgSprite, locationQuery, logToCsv$2 as logToCsv, logValueArray, logsKey, lollipopChartPlugin, lookupUrl, mapFilterData, mapsUrl, markerIcon, markerPie, matchAggregatedQuery, matchAggregatedValidatedQuery, matchBoolPrefixQuery, matchCountry, matchExactQuery, matchGlobalRegion, matchId, matchNameNormalized, matchNestedKey, matchPhrasePrefixQuery, matchPhraseQuery, matchPrimaryProductQuery, matchQuery, matchRegex, matchRegion, matchTermType, matchType, maxAreaSize, measurementValue, mergeDataWithHeaders, methodTierOrder, migrationErrorMessage, migrationsUrl, missingNodeErrors, modelCount, modelKeyParams, modelParams, models, multiMatchQuery, nestedProperty, nestingEnabled, nestingTypeEnabled, noValue, nodeAvailableProperties, nodeById, nodeColours$1 as nodeColours, nodeDataState, nodeDataStates, nodeId, nodeIds, nodeLink, nodeLinkEnabled, nodeLinkTypeEnabled, nodeLogsUrl, nodeQualityScoreColor, nodeQualityScoreLevel, nodeQualityScoreMaxDefault, nodeQualityScoreOrder, nodeSecondaryColours, nodeToAggregationFilename, nodeType, nodeTypeDataState, nodeTypeIcon, nodeTypeIconSchema, nodeUrl, nodeUrlParams, nodeVersion, nodesByState, nodesByType, numberGte, optionsFromGroup, parentKey, parentProperty, parseColor, parseData, parseDataPath, parseLines, parseMessage, parseNewValue, pluralize, pointToCoordinates, polygonBounds, polygonToCoordinates, polygonToMap, polygonsFromFeature, populateWithTrackIdsFilterData, postGuideEvent, primaryProduct, productsQuery, propertyError, propertyId, recursiveProperties, refToSchemaType, refreshPropertyKeys, regionsQuery, registerChart, repeat, reportIssueLink, reportIssueUrl, safeJSONParse, safeJSONStringify, schemaBaseUrl, schemaDataBaseUrl, schemaLink, schemaRequiredProperties, schemaTypeToDefaultValue, scrollToEl, scrollTop, searchFilterData, searchableTypes, siblingProperty, simplifyContributions, singleProperty, siteTooBig, siteTypeToColor, siteTypeToIcon, sortProperties, sortedDates, strokeColor, strokeStyle, subValueKeys, suggestMatchQuery, suggestQuery, takeAfterViewInit, termLocation, termLocationName, termProperties, termTypeLabel, toSnakeCase, toThousands, typeToNewProperty, typeaheadFocus, uncapitalize, uniqueDatesBetween, updateProperties, valueLink, valueToString, valueTypeToDefault, valueValue, waitFor, wildcardQuery };
|
|
15644
15575
|
//# sourceMappingURL=hestia-earth-ui-components.mjs.map
|