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