@agridea/suibi-module 0.1.0-preview.2f7b6e2 → 0.1.0-preview.3b0cded
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.
- package/README.md +10 -10
- package/dist/elements/browser/main.js +71 -72
- package/dist/elements/browser/suibi-module-latest.js +71 -72
- package/dist/elements/browser/suibi-module.v0.1.0-preview.3b0cded.js +78 -0
- package/dist/elements/browser/suibi-theme-dark.css +1 -1
- package/dist/elements/browser/version.txt +1 -1
- package/dist/types/app/components/data-preview/data-preview.component.d.ts +2 -2
- package/dist/types/app/components/empty-state/empty-state.component.d.ts +2 -0
- package/dist/types/app/components/gauge-arc/gauge-arc.component.d.ts +49 -0
- package/dist/types/app/{header-bar.d.ts → components/header-bar/header-bar.component.d.ts} +3 -4
- package/dist/types/app/components/inline-table/inline-table.component.d.ts +100 -0
- package/dist/types/app/components/inline-table/inline-table.types.d.ts +127 -0
- package/dist/types/app/components/module-placeholder-page/module-placeholder-page.component.d.ts +6 -0
- package/dist/types/app/components/planning-result/planning-result.component.d.ts +3 -26
- package/dist/types/app/components/planning-result-row/planning-result-row.component.d.ts +34 -0
- package/dist/types/app/components/planning-trigger/planning-trigger.component.d.ts +13 -0
- package/dist/types/app/components/results-page/results-page.component.d.ts +13 -0
- package/dist/types/app/components/suissebilanz-dashboard/suissebilanz-dashboard.component.d.ts +30 -0
- package/dist/types/app/components/suissebilanz-dashboard/suissebilanz-metrics.service.d.ts +21 -0
- package/dist/types/app/components/suissebilanz-minibar/suissebilanz-minibar.component.d.ts +19 -0
- package/dist/types/app/components/validation-page/validation-page.component.d.ts +18 -0
- package/dist/types/app/components/welcome-page/metadata.types.d.ts +1 -1
- package/dist/types/app/components/welcome-page/welcome-page.component.d.ts +5 -3
- package/dist/types/app/components/workflow-stepper/workflow-stepper.component.d.ts +1 -0
- package/dist/types/app/core/data/naebi-data.service.d.ts +28 -28
- package/dist/types/app/core/error/global-error-handler.d.ts +2 -3
- package/dist/types/app/core/i18n/i18n.service.d.ts +4 -3
- package/dist/types/app/core/i18n/locales/fr.d.ts +2 -0
- package/dist/types/app/core/i18n/locales/it.d.ts +2 -0
- package/dist/types/app/core/master-data/master-data.service.d.ts +2 -0
- package/dist/types/app/core/metadata/suibi-metadata.types.d.ts +11 -1
- package/dist/types/app/core/navigation/navigation.service.d.ts +27 -1
- package/dist/types/app/core/planning/planning-balance.service.d.ts +23 -3
- package/dist/types/app/core/planning/planning-balance.utils.d.ts +10 -0
- package/dist/types/app/core/validation/global-validation.service.d.ts +19 -1
- package/dist/types/app/jsonforms/filters/code-list-filter-resolvers.d.ts +3 -0
- package/dist/types/app/jsonforms/registry/renderers.registry.d.ts +4 -0
- package/dist/types/app/jsonforms/renderers/controls/selects/animal-category/animal-category-select.renderer.d.ts +1 -1
- package/dist/types/app/jsonforms/renderers/controls/selects/code-list/code-list-select.renderer.d.ts +10 -4
- package/dist/types/app/jsonforms/renderers/layout/constraint/constraint-layout.renderer.d.ts +1 -0
- package/dist/types/app/jsonforms/renderers/layout/group/base-group.renderer.d.ts +2 -0
- package/dist/types/app/jsonforms/renderers/layout/group/module-toggle-group.renderer.d.ts +36 -0
- package/dist/types/app/nutrient-cycle/animal-stock/animal-stock-detail.component.d.ts +7 -8
- package/dist/types/app/nutrient-cycle/animal-stock/animal-stock-list.component.d.ts +5 -8
- package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading-detail.component.d.ts +8 -9
- package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading-list.component.d.ts +6 -7
- package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation-detail.component.d.ts +22 -0
- package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation-general.component.d.ts +22 -0
- package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation-list.component.d.ts +17 -0
- package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation-master-detail.component.d.ts +37 -0
- package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation.types.d.ts +40 -0
- package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation.util.d.ts +6 -0
- package/dist/types/app/nutrient-cycle/field-cultivation/index.d.ts +4 -0
- package/dist/types/app/nutrient-cycle/field-spreading/fertiliser-table/fertiliser-table.component.d.ts +38 -0
- package/dist/types/app/nutrient-cycle/field-spreading/fertiliser-table/fertiliser-table.config.d.ts +20 -0
- package/dist/types/app/nutrient-cycle/field-spreading/field-spreading.component.d.ts +16 -3
- package/dist/types/app/nutrient-cycle/field-spreading/recycling-table/recycling-table.component.d.ts +22 -0
- package/dist/types/app/nutrient-cycle/field-spreading/recycling-table/recycling-table.config.d.ts +16 -0
- package/dist/types/app/nutrient-cycle/fodder/fodder-detail.component.d.ts +31 -0
- package/dist/types/app/nutrient-cycle/fodder/fodder-list.component.d.ts +20 -0
- package/dist/types/app/nutrient-cycle/fodder/fodder-master-detail.component.d.ts +37 -0
- package/dist/types/app/nutrient-cycle/fodder/fodder.types.d.ts +27 -0
- package/dist/types/app/nutrient-cycle/fodder/index.d.ts +4 -0
- package/dist/types/app/nutrient-cycle/fodder/transaction-unit.util.d.ts +2 -0
- package/dist/types/app/nutrient-cycle/lifetime-performance/index.d.ts +2 -0
- package/dist/types/app/nutrient-cycle/storage/index.d.ts +4 -0
- package/dist/types/app/nutrient-cycle/storage/storage-detail.component.d.ts +30 -0
- package/dist/types/app/nutrient-cycle/storage/storage-general.component.d.ts +29 -0
- package/dist/types/app/nutrient-cycle/storage/storage-list.component.d.ts +20 -0
- package/dist/types/app/nutrient-cycle/storage/storage-master-detail.component.d.ts +29 -0
- package/dist/types/app/nutrient-cycle/storage/storage.types.d.ts +40 -0
- package/dist/types/shared/material-icons.d.ts +3 -3
- package/package.json +68 -17
- package/dist/elements/browser/suibi-module.v0.1.0-preview.2f7b6e2.js +0 -79
- /package/dist/elements/browser/{suibi-module.v0.1.0-preview.2f7b6e2.css → suibi-module.v0.1.0-preview.3b0cded.css} +0 -0
- /package/dist/types/app/{core/validation/validation-errors-panel.d.ts → components/validation-errors-panel/validation-errors-panel.component.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
:host,suibi-module{color-scheme:dark;--mat-sys-background: #121410;--mat-sys-error: #ffb4ab;--mat-sys-error-container: #93000a;--mat-sys-inverse-on-surface: #2f312d;--mat-sys-inverse-primary: #e722ff;--mat-sys-inverse-surface: #e2e3dc;--mat-sys-on-background: #e2e3dc;--mat-sys-on-error: #690005;--mat-sys-on-error-container: #ffdad6;--mat-sys-on-primary: #013a00;--mat-sys-on-primary-container: #77ff61;--mat-sys-on-primary-fixed: #002200;--mat-sys-on-primary-fixed-variant: #015300;--mat-sys-on-secondary: #263422;--mat-sys-on-secondary-container: #d7e8cd;--mat-sys-on-secondary-fixed: #121f0e;--mat-sys-on-secondary-fixed-variant: #3c4b37;--mat-sys-on-surface: #e2e3dc;--mat-sys-on-surface-variant: #dfe4d7;--mat-sys-on-tertiary: #013a00;--mat-sys-on-tertiary-container: #77ff61;--mat-sys-on-tertiary-fixed: #002200;--mat-sys-on-tertiary-fixed-variant: #015300;--mat-sys-outline: #8d9387;--mat-sys-outline-variant: #43483f;--mat-sys-primary: #02e600;--mat-sys-primary-container: #015300;--mat-sys-primary-fixed: #77ff61;--mat-sys-primary-fixed-dim: #02e600;--mat-sys-scrim: #000000;--mat-sys-secondary: #bbcbb2;--mat-sys-secondary-container: #3c4b37;--mat-sys-secondary-fixed: #d7e8cd;--mat-sys-secondary-fixed-dim: #bbcbb2;--mat-sys-shadow: #000000;--mat-sys-surface: #121410;--mat-sys-surface-bright: #383a35;--mat-sys-surface-container: #1e201c;--mat-sys-surface-container-high: #282b26;--mat-sys-surface-container-highest: #333531;--mat-sys-surface-container-low: #1a1c18;--mat-sys-surface-container-lowest: #0c0f0b;--mat-sys-surface-dim: #121410;--mat-sys-surface-tint: #02e600;--mat-sys-surface-variant: #43483f;--mat-sys-tertiary: #02e600;--mat-sys-tertiary-container: #015300;--mat-sys-tertiary-fixed: #77ff61;--mat-sys-tertiary-fixed-dim: #02e600;--mat-sys-neutral-variant20: #2c3229;--mat-sys-neutral10: #1a1c18;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 300 1rem / 1.5rem Serif;--mat-sys-body-large-font: Serif;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 300;--mat-sys-body-medium: 300 .875rem / 1.25rem Serif;--mat-sys-body-medium-font: Serif;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 300;--mat-sys-body-small: 300 .75rem / 1rem Serif;--mat-sys-body-small-font: Serif;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 300;--mat-sys-display-large: 300 3.562rem / 4rem Serif;--mat-sys-display-large-font: Serif;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 300;--mat-sys-display-medium: 300 2.812rem / 3.25rem Serif;--mat-sys-display-medium-font: Serif;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 300;--mat-sys-display-small: 300 2.25rem / 2.75rem Serif;--mat-sys-display-small-font: Serif;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 300;--mat-sys-headline-large: 300 2rem / 2.5rem Serif;--mat-sys-headline-large-font: Serif;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 300;--mat-sys-headline-medium: 300 1.75rem / 2.25rem Serif;--mat-sys-headline-medium-font: Serif;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 300;--mat-sys-headline-small: 300 1.5rem / 2rem Serif;--mat-sys-headline-small-font: Serif;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 300;--mat-sys-label-large: 600 .875rem / 1.25rem Serif;--mat-sys-label-large-font: Serif;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 600;--mat-sys-label-large-weight-prominent: 800;--mat-sys-label-medium: 600 .75rem / 1rem Serif;--mat-sys-label-medium-font: Serif;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 600;--mat-sys-label-medium-weight-prominent: 800;--mat-sys-label-small: 600 .688rem / 1rem Serif;--mat-sys-label-small-font: Serif;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 600;--mat-sys-title-large: 300 1.375rem / 1.75rem Serif;--mat-sys-title-large-font: Serif;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 300;--mat-sys-title-medium: 600 1rem / 1.5rem Serif;--mat-sys-title-medium-font: Serif;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 600;--mat-sys-title-small: 600 .875rem / 1.25rem Serif;--mat-sys-title-small-font: Serif;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 600;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;--mat-sys-surface: #121212;--mat-form-field-filled-container-color: #2a2a2a;--mat-card-elevated-container-color: #1e1e1e;--mat-card-elevated-container-shape: 12px;--mat-card-filled-container-shape: 12px;--mat-card-outlined-container-shape: 12px;--mat-card-outlined-outline-width: 0px;--mat-card-outlined-outline-color: transparent;--mat-card-elevated-container-elevation: 0 2px 12px rgba(0, 0, 0, .35);--mat-card-outlined-container-elevation: 0 2px 12px rgba(0, 0, 0, .35);--mat-card-filled-container-elevation: 0 2px 12px rgba(0, 0, 0, .35);font-family:Roboto Thin,Roboto,Arial,sans-serif;display:block;line-height:1.4;box-sizing:border-box;background:var(--mat-sys-surface, #121212);color:var(--mat-sys-on-surface, #e0e0e0)}*,*:before,*:after{box-sizing:inherit}.suibi-surface{background:var(--mat-sys-surface-container-low, #1e1e1e);border:1px solid var(--mat-sys-outline-variant, #2a2a2a);border-radius:8px;padding:16px}pre{background:#1d1f21;color:#c5c8c6;padding:8px 16px;border-radius:4px}:host .mat-mdc-form-field-error,suibi-module .mat-mdc-form-field-error{color:#e72200}.horizontal-layout>div:has([style*="display: none"]){display:none!important}
|
|
1
|
+
:host,suibi-module{color-scheme:dark;--mat-sys-background: #121410;--mat-sys-error: #ffb4ab;--mat-sys-error-container: #93000a;--mat-sys-inverse-on-surface: #2f312d;--mat-sys-inverse-primary: #e722ff;--mat-sys-inverse-surface: #e2e3dc;--mat-sys-on-background: #e2e3dc;--mat-sys-on-error: #690005;--mat-sys-on-error-container: #ffdad6;--mat-sys-on-primary: #013a00;--mat-sys-on-primary-container: #77ff61;--mat-sys-on-primary-fixed: #002200;--mat-sys-on-primary-fixed-variant: #015300;--mat-sys-on-secondary: #263422;--mat-sys-on-secondary-container: #d7e8cd;--mat-sys-on-secondary-fixed: #121f0e;--mat-sys-on-secondary-fixed-variant: #3c4b37;--mat-sys-on-surface: #e2e3dc;--mat-sys-on-surface-variant: #dfe4d7;--mat-sys-on-tertiary: #013a00;--mat-sys-on-tertiary-container: #77ff61;--mat-sys-on-tertiary-fixed: #002200;--mat-sys-on-tertiary-fixed-variant: #015300;--mat-sys-outline: #8d9387;--mat-sys-outline-variant: #43483f;--mat-sys-primary: #02e600;--mat-sys-primary-container: #015300;--mat-sys-primary-fixed: #77ff61;--mat-sys-primary-fixed-dim: #02e600;--mat-sys-scrim: #000000;--mat-sys-secondary: #bbcbb2;--mat-sys-secondary-container: #3c4b37;--mat-sys-secondary-fixed: #d7e8cd;--mat-sys-secondary-fixed-dim: #bbcbb2;--mat-sys-shadow: #000000;--mat-sys-surface: #121410;--mat-sys-surface-bright: #383a35;--mat-sys-surface-container: #1e201c;--mat-sys-surface-container-high: #282b26;--mat-sys-surface-container-highest: #333531;--mat-sys-surface-container-low: #1a1c18;--mat-sys-surface-container-lowest: #0c0f0b;--mat-sys-surface-dim: #121410;--mat-sys-surface-tint: #02e600;--mat-sys-surface-variant: #43483f;--mat-sys-tertiary: #02e600;--mat-sys-tertiary-container: #015300;--mat-sys-tertiary-fixed: #77ff61;--mat-sys-tertiary-fixed-dim: #02e600;--mat-sys-neutral-variant20: #2c3229;--mat-sys-neutral10: #1a1c18;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 300 1rem / 1.5rem Serif;--mat-sys-body-large-font: Serif;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 300;--mat-sys-body-medium: 300 .875rem / 1.25rem Serif;--mat-sys-body-medium-font: Serif;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 300;--mat-sys-body-small: 300 .75rem / 1rem Serif;--mat-sys-body-small-font: Serif;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 300;--mat-sys-display-large: 300 3.562rem / 4rem Serif;--mat-sys-display-large-font: Serif;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 300;--mat-sys-display-medium: 300 2.812rem / 3.25rem Serif;--mat-sys-display-medium-font: Serif;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 300;--mat-sys-display-small: 300 2.25rem / 2.75rem Serif;--mat-sys-display-small-font: Serif;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 300;--mat-sys-headline-large: 300 2rem / 2.5rem Serif;--mat-sys-headline-large-font: Serif;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 300;--mat-sys-headline-medium: 300 1.75rem / 2.25rem Serif;--mat-sys-headline-medium-font: Serif;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 300;--mat-sys-headline-small: 300 1.5rem / 2rem Serif;--mat-sys-headline-small-font: Serif;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 300;--mat-sys-label-large: 600 .875rem / 1.25rem Serif;--mat-sys-label-large-font: Serif;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 600;--mat-sys-label-large-weight-prominent: 800;--mat-sys-label-medium: 600 .75rem / 1rem Serif;--mat-sys-label-medium-font: Serif;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 600;--mat-sys-label-medium-weight-prominent: 800;--mat-sys-label-small: 600 .688rem / 1rem Serif;--mat-sys-label-small-font: Serif;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 600;--mat-sys-title-large: 300 1.375rem / 1.75rem Serif;--mat-sys-title-large-font: Serif;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 300;--mat-sys-title-medium: 600 1rem / 1.5rem Serif;--mat-sys-title-medium-font: Serif;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 600;--mat-sys-title-small: 600 .875rem / 1.25rem Serif;--mat-sys-title-small-font: Serif;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 600;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;--mat-sys-surface: #121212;--mat-form-field-filled-container-color: #2a2a2a;--mat-card-elevated-container-color: #1e1e1e;--mat-card-elevated-container-shape: 12px;--mat-card-filled-container-shape: 12px;--mat-card-outlined-container-shape: 12px;--mat-card-outlined-outline-width: 0px;--mat-card-outlined-outline-color: transparent;--mat-card-elevated-container-elevation: 0 2px 12px rgba(0, 0, 0, .35);--mat-card-outlined-container-elevation: 0 2px 12px rgba(0, 0, 0, .35);--mat-card-filled-container-elevation: 0 2px 12px rgba(0, 0, 0, .35);font-family:Roboto Thin,Roboto,Arial,sans-serif;display:block;line-height:1.4;box-sizing:border-box;background:var(--mat-sys-surface, #121212);color:var(--mat-sys-on-surface, #e0e0e0)}*,*:before,*:after{box-sizing:inherit}mat-card.welcome-card,mat-card.metadata-card,mat-card.data-preview-card,mat-card.summary-card,mat-card.results-card,mat-card.placeholder-card,mat-card.minibar-card,mat-card.dashboard-card:not(.dashboard-card--embedded),mat-card.planning-result-card:not(.planning-result-card--embedded){background:var(--mat-sys-surface-container-low, #1e1e1e)}.suibi-surface{background:var(--mat-sys-surface-container-low, #1e1e1e);border:1px solid var(--mat-sys-outline-variant, #2a2a2a);border-radius:8px;padding:16px}pre{background:#1d1f21;color:#c5c8c6;padding:8px 16px;border-radius:4px}:host .mat-mdc-form-field-error,suibi-module .mat-mdc-form-field-error{color:#e72200}.horizontal-layout>div:has([style*="display: none"]){display:none!important}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.1.0-preview.
|
|
1
|
+
0.1.0-preview.3b0cded 3b0cded
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { NaebiDataService } from '../../core/data/naebi-data.service';
|
|
2
2
|
import { PlanningBalanceService } from '../../core/planning/planning-balance.service';
|
|
3
3
|
export declare class DataPreviewComponent {
|
|
4
|
-
readonly naebi: NaebiDataService;
|
|
5
4
|
private readonly host;
|
|
6
5
|
private readonly emitter;
|
|
7
6
|
readonly planning: PlanningBalanceService;
|
|
7
|
+
readonly naebi: NaebiDataService;
|
|
8
8
|
readonly metadataPreview: import("@angular/core").Signal<import("../../../public-api").SuibiDataEventMetadata>;
|
|
9
|
-
|
|
9
|
+
setPlanningEndpoint(value: string | null): void;
|
|
10
10
|
emitData(): void;
|
|
11
11
|
}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* Displays a faded icon, a primary message, and an optional hint line.
|
|
5
5
|
*/
|
|
6
6
|
export declare class EmptyStateComponent {
|
|
7
|
+
fontSet: import("@angular/core").InputSignal<string>;
|
|
8
|
+
icon: import("@angular/core").InputSignal<string>;
|
|
7
9
|
primaryText: import("@angular/core").InputSignal<string>;
|
|
8
10
|
/** Optional hint displayed below the primary message. */
|
|
9
11
|
secondaryText: import("@angular/core").InputSignal<string>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** Visual status driving arc colour and icon in the gauge. */
|
|
2
|
+
export type GaugeStatus = 'ok' | 'tolerated' | 'over' | 'under' | 'empty';
|
|
3
|
+
/** View-model for a single metric card in the SuisseBilanz dashboard. */
|
|
4
|
+
export interface GaugeMetric {
|
|
5
|
+
/** Stable key used for `@for` tracking (nutrient formula or 'rendement'). */
|
|
6
|
+
key: string;
|
|
7
|
+
/** Short display label — chemical formula or translated metric name. */
|
|
8
|
+
label: string;
|
|
9
|
+
/** Human-readable sub-label (nutrient description). */
|
|
10
|
+
sublabel: string;
|
|
11
|
+
/** Numeric value to display; `null` indicates no result yet. */
|
|
12
|
+
value: number | null;
|
|
13
|
+
/** Unit appended to the value inside the arc (e.g. '%' or ''). */
|
|
14
|
+
unit: string;
|
|
15
|
+
/** Derived status controlling arc colour and badge. */
|
|
16
|
+
status: GaugeStatus;
|
|
17
|
+
/** Upper bound of the gauge arc scale. */
|
|
18
|
+
maxGauge: number;
|
|
19
|
+
/** Short range description shown below the arc (e.g. '< 100 %'). */
|
|
20
|
+
rangeLabel: string;
|
|
21
|
+
/** Raw quantity in kg (nutrients) or dt/ha (rendement) to display below the arc. */
|
|
22
|
+
kgValue?: number | null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Reusable semicircular SVG arc gauge.
|
|
26
|
+
*
|
|
27
|
+
* Renders a 180° arc gauge using pure inline SVG — no third-party library.
|
|
28
|
+
* All geometry is derived via `computed()` signals so the component is
|
|
29
|
+
* fully zoneless-safe and works without Zone.js triggers.
|
|
30
|
+
*
|
|
31
|
+
* The arc uses `pathLength="1"` so `stroke-dasharray` fractions map
|
|
32
|
+
* directly to 0–1 without floating-point arc-length estimation.
|
|
33
|
+
*/
|
|
34
|
+
export declare class GaugeArcComponent {
|
|
35
|
+
readonly value: import("@angular/core").InputSignal<number>;
|
|
36
|
+
readonly max: import("@angular/core").InputSignal<number>;
|
|
37
|
+
readonly status: import("@angular/core").InputSignal<GaugeStatus>;
|
|
38
|
+
protected readonly pct: import("@angular/core").Signal<number>;
|
|
39
|
+
protected readonly dashArray: import("@angular/core").Signal<string>;
|
|
40
|
+
protected readonly tickCoords: import("@angular/core").Signal<{
|
|
41
|
+
x1: number;
|
|
42
|
+
y1: number;
|
|
43
|
+
x2: number;
|
|
44
|
+
y2: number;
|
|
45
|
+
}>;
|
|
46
|
+
protected readonly fillColor: import("@angular/core").Signal<string>;
|
|
47
|
+
protected readonly displayValue: import("@angular/core").Signal<string>;
|
|
48
|
+
protected readonly ariaLabel: import("@angular/core").Signal<string>;
|
|
49
|
+
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { Locale } from '
|
|
2
|
-
import { PageId } from '
|
|
1
|
+
import { Locale } from '../../core/i18n/i18n.service';
|
|
2
|
+
import { PageId } from '../../core/navigation/navigation.service';
|
|
3
3
|
/**
|
|
4
4
|
* HeaderBarComponent
|
|
5
|
-
*
|
|
6
|
-
* Main workflow navigation is delegated to WorkflowStepperComponent below the toolbar.
|
|
5
|
+
* Footer actions for quick access to data preview and the current save state.
|
|
7
6
|
*/
|
|
8
7
|
export declare class HeaderBarComponent {
|
|
9
8
|
locale: import("@angular/core").InputSignal<Locale>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { BaseCodeListEntry } from '../../jsonforms/shared/option-sources/code-lists';
|
|
2
|
+
import { InlineColumnDef, InlineTableConfig } from './inline-table.types';
|
|
3
|
+
/**
|
|
4
|
+
* InlineTableComponent — generic inline-editable table for array-of-objects data.
|
|
5
|
+
*
|
|
6
|
+
* This component is intentionally domain-agnostic. All column structure, labels,
|
|
7
|
+
* and section text are driven by an `InlineTableConfig` input (the "uischema").
|
|
8
|
+
* Domain-specific side-effects (e.g. auto-populating fields when a dropdown changes)
|
|
9
|
+
* are injected via the optional `rowTransform` function input.
|
|
10
|
+
*
|
|
11
|
+
* ## Usage
|
|
12
|
+
* ```html
|
|
13
|
+
* <app-inline-table
|
|
14
|
+
* [config]="myTableConfig"
|
|
15
|
+
* [rows]="myRows()"
|
|
16
|
+
* [rowTransform]="myTransform"
|
|
17
|
+
* (rowsChange)="onRowsChange($event)"
|
|
18
|
+
* />
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* ## Extending for a new domain
|
|
22
|
+
* 1. Create a new `InlineTableConfig` constant (the column config file).
|
|
23
|
+
* 2. Optionally create a thin wrapper component that provides the config and
|
|
24
|
+
* a `rowTransform` arrow-function.
|
|
25
|
+
* 3. No changes to this component are needed.
|
|
26
|
+
*/
|
|
27
|
+
export declare class InlineTableComponent {
|
|
28
|
+
private readonly i18n;
|
|
29
|
+
/** Table configuration — columns, labels, and the row factory. Acts as the "uischema". */
|
|
30
|
+
readonly config: import("@angular/core").InputSignal<InlineTableConfig>;
|
|
31
|
+
/** Current array of row objects. Each key maps to a column's `key` or sub-array path. */
|
|
32
|
+
readonly rows: import("@angular/core").InputSignal<Record<string, unknown>[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Emitted with the complete updated array after any cell change, row add, or row remove.
|
|
35
|
+
* The parent component is responsible for persisting the new value (e.g. via signal).
|
|
36
|
+
*/
|
|
37
|
+
readonly rowsChange: import("@angular/core").OutputEmitterRef<Record<string, unknown>[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Optional business-logic transform applied after every cell edit — before emission.
|
|
40
|
+
*
|
|
41
|
+
* Signature: `(changedKey, newValue, updatedRow) => transformedRow`
|
|
42
|
+
*
|
|
43
|
+
* - `changedKey`: the `InlineColumnDef.key` of the edited column.
|
|
44
|
+
* - `newValue`: the raw new value (string, number, or null).
|
|
45
|
+
* - `updatedRow`: the row object already reflecting the edit.
|
|
46
|
+
* - Return the row (possibly further mutated) that should be stored.
|
|
47
|
+
*
|
|
48
|
+
* Use this for cross-field side-effects such as pre-populating nutrient % columns
|
|
49
|
+
* when a product is selected. For forms without such logic, omit this input.
|
|
50
|
+
*/
|
|
51
|
+
readonly rowTransform: import("@angular/core").InputSignal<((changedKey: string, newValue: unknown, row: Record<string, unknown>) => Record<string, unknown>) | null>;
|
|
52
|
+
/** Extracts a px value from a grid-format width string (e.g. 'minmax(120px, 1fr)' → '120px'). */
|
|
53
|
+
colMinWidth(width?: string): string;
|
|
54
|
+
/** Total table width = sum of all column px values + 40px for the delete column. */
|
|
55
|
+
readonly tableWidth: import("@angular/core").Signal<string>;
|
|
56
|
+
/** Grid template columns string for CSS grid layout. */
|
|
57
|
+
readonly gridTemplateColumns: import("@angular/core").Signal<string>;
|
|
58
|
+
readonly sectionTitle: import("@angular/core").Signal<string>;
|
|
59
|
+
readonly sectionDescription: import("@angular/core").Signal<string>;
|
|
60
|
+
readonly addLabel: import("@angular/core").Signal<string>;
|
|
61
|
+
readonly emptyLabel: import("@angular/core").Signal<string>;
|
|
62
|
+
readonly emptyHint: import("@angular/core").Signal<string>;
|
|
63
|
+
/** Returns the option array for a select column from the shared CODE_LISTS map. */
|
|
64
|
+
getOptions(col: InlineColumnDef): BaseCodeListEntry[];
|
|
65
|
+
/**
|
|
66
|
+
* Returns the localized display label for a code-list option.
|
|
67
|
+
* - `optionDisplay: 'id'`: returns `String(entry.id)` (e.g. "kg", "t").
|
|
68
|
+
* - default (`'label'`): uses `descriptor.designation_eng / designation_deu`;
|
|
69
|
+
* falls back to `String(entry.id)` when no descriptor is present.
|
|
70
|
+
*/
|
|
71
|
+
optionLabel(entry: BaseCodeListEntry, col: InlineColumnDef): string;
|
|
72
|
+
/**
|
|
73
|
+
* Reads the current cell value for a column from a row object.
|
|
74
|
+
*
|
|
75
|
+
* - Simple field: returns `row[col.key]`.
|
|
76
|
+
* - Sub-array field: navigates `row[arrayPath]`, finds the entry matching
|
|
77
|
+
* `arrayKeyField === arrayKeyValue`, and returns `entry[arrayValueField]`.
|
|
78
|
+
*/
|
|
79
|
+
getValue(row: Record<string, unknown>, col: InlineColumnDef): unknown;
|
|
80
|
+
/**
|
|
81
|
+
* Returns a new row with the column's value updated (immutably).
|
|
82
|
+
* Handles both flat field assignment and nested sub-array mutation.
|
|
83
|
+
*/
|
|
84
|
+
private setValue;
|
|
85
|
+
/** Called when a `mat-select` selection changes. */
|
|
86
|
+
onSelectChange(rowIdx: number, col: InlineColumnDef, value: unknown): void;
|
|
87
|
+
/** Called on `(change)` of a number `<input>` — parses the string value and guards NaN. */
|
|
88
|
+
onNumberChange(rowIdx: number, col: InlineColumnDef, event: Event): void;
|
|
89
|
+
/** Called on `(change)` of a text `<input>`. */
|
|
90
|
+
onTextChange(rowIdx: number, col: InlineColumnDef, event: Event): void;
|
|
91
|
+
/** Appends a blank row produced by `config.createRow()`. */
|
|
92
|
+
addRow(): void;
|
|
93
|
+
/** Removes the row at `idx` from the array. */
|
|
94
|
+
removeRow(idx: number): void;
|
|
95
|
+
/**
|
|
96
|
+
* Core change handler: sets the new value on the row, applies the optional
|
|
97
|
+
* `rowTransform` for any cross-field side-effects, then emits the updated array.
|
|
98
|
+
*/
|
|
99
|
+
private _applyChange;
|
|
100
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for the generic InlineTableComponent.
|
|
3
|
+
*
|
|
4
|
+
* Usage pattern (the "uischema" concept):
|
|
5
|
+
* 1. Define an `InlineTableConfig` object describing your columns and labels.
|
|
6
|
+
* 2. Pass it to `<app-inline-table [config]="…" [rows]="…">`.
|
|
7
|
+
* 3. For business-logic side-effects (e.g. auto-populating fields on selection),
|
|
8
|
+
* pass an optional `rowTransform` function — the generic component knows nothing
|
|
9
|
+
* about domain rules.
|
|
10
|
+
*
|
|
11
|
+
* To reuse the table for a different domain, create a new config file and a thin
|
|
12
|
+
* wrapper component. Only the config changes; the rendering component stays the same.
|
|
13
|
+
*/
|
|
14
|
+
/** Supported cell widget types. Extend with new literal types as needed. */
|
|
15
|
+
export type InlineCellType = 'select' | 'number' | 'text';
|
|
16
|
+
/**
|
|
17
|
+
* Definition for a single column in an inline table.
|
|
18
|
+
*
|
|
19
|
+
* Each definition drives both the column header and the cell widget for that column.
|
|
20
|
+
* This is the per-column equivalent of a JSONForms uischema Control element.
|
|
21
|
+
*/
|
|
22
|
+
export interface InlineColumnDef {
|
|
23
|
+
/**
|
|
24
|
+
* Unique key for this column.
|
|
25
|
+
* - For simple flat fields: also the property path on the row object.
|
|
26
|
+
* - For nested sub-array columns: used as a stable identifier; actual read/write
|
|
27
|
+
* path is determined by `arrayPath` + `arrayKeyField` + `arrayKeyValue`.
|
|
28
|
+
*/
|
|
29
|
+
key: string;
|
|
30
|
+
/**
|
|
31
|
+
* Header label source.
|
|
32
|
+
* - By default treated as an i18n translation key (e.g. `'fieldSpreading.fields.fertiliser.product'`).
|
|
33
|
+
* - Set `labelLiteral: true` to use the value verbatim (e.g. `'Ntot (%)'`).
|
|
34
|
+
*/
|
|
35
|
+
labelKey: string;
|
|
36
|
+
/**
|
|
37
|
+
* When `true`, `labelKey` is rendered as a plain string rather than passed through
|
|
38
|
+
* the translation service. Use this for labels that are already final (e.g. chemical
|
|
39
|
+
* formulas such as "P₂O₅ (%)").
|
|
40
|
+
* Default: `false`.
|
|
41
|
+
*/
|
|
42
|
+
labelLiteral?: boolean;
|
|
43
|
+
/** Widget rendered inside the cell. */
|
|
44
|
+
type: InlineCellType;
|
|
45
|
+
/**
|
|
46
|
+
* For `type: 'select'` — key into the shared `CODE_LISTS` map.
|
|
47
|
+
* The generic component resolves the option list and their localized labels
|
|
48
|
+
* automatically via the `descriptor.designation_eng / designation_deu` convention.
|
|
49
|
+
*/
|
|
50
|
+
codeListKey?: string;
|
|
51
|
+
/**
|
|
52
|
+
* For `type: 'select'` — how to display an option's label in the dropdown.
|
|
53
|
+
* - `'label'` (default): use `descriptor.designation_eng/deu` — best for named products.
|
|
54
|
+
* - `'id'`: use `String(entry.id)` verbatim — best for codes that are already
|
|
55
|
+
* human-readable (e.g. unit codes like "kg", "t", "l").
|
|
56
|
+
*/
|
|
57
|
+
optionDisplay?: 'label' | 'id';
|
|
58
|
+
/**
|
|
59
|
+
* CSS grid column-sizing token, e.g. `'minmax(140px, 2fr)'` or `'84px'`.
|
|
60
|
+
* These values are joined to build the `grid-template-columns` style on the table.
|
|
61
|
+
* Defaults to `'1fr'` when omitted.
|
|
62
|
+
*/
|
|
63
|
+
width?: string;
|
|
64
|
+
/** Minimum allowed value — sets the `min` attribute (type `'number'` only). */
|
|
65
|
+
min?: number;
|
|
66
|
+
/** Maximum allowed value — sets the `max` attribute (type `'number'` only). */
|
|
67
|
+
max?: number;
|
|
68
|
+
/**
|
|
69
|
+
* `step` attribute value (type `'number'` only).
|
|
70
|
+
* Defaults to `'any'` when omitted, allowing any decimal.
|
|
71
|
+
*/
|
|
72
|
+
step?: string;
|
|
73
|
+
/**
|
|
74
|
+
* Sub-array navigation config — for columns whose value lives inside a nested array
|
|
75
|
+
* on the row object (e.g. `ingredient[].quantity`).
|
|
76
|
+
*
|
|
77
|
+
* When all four sub-fields are set, the component:
|
|
78
|
+
* - **reads** `row[arrayPath].find(e => e[arrayKeyField] === arrayKeyValue)[arrayValueField]`
|
|
79
|
+
* - **writes** back immutably into that same slot
|
|
80
|
+
*
|
|
81
|
+
* Example — "Ntot %" column that reads `row.ingredient[{molecularFormula:'Ntot'}].quantity`:
|
|
82
|
+
* ```
|
|
83
|
+
* arrayPath: 'ingredient'
|
|
84
|
+
* arrayKeyField: 'molecularFormula'
|
|
85
|
+
* arrayKeyValue: 'Ntot'
|
|
86
|
+
* arrayValueField: 'quantity'
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
arrayPath?: string;
|
|
90
|
+
arrayKeyField?: string;
|
|
91
|
+
arrayKeyValue?: string;
|
|
92
|
+
arrayValueField?: string;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Full configuration for one inline-table instance — the "uischema" equivalent.
|
|
96
|
+
*
|
|
97
|
+
* Creating a table for a new domain means defining one `InlineTableConfig` object
|
|
98
|
+
* (and an optional `rowTransform` for business logic); the generic component handles
|
|
99
|
+
* all layout, rendering, and data binding.
|
|
100
|
+
*/
|
|
101
|
+
export interface InlineTableConfig {
|
|
102
|
+
/** Ordered list of column definitions — determines column count and order. */
|
|
103
|
+
columns: InlineColumnDef[];
|
|
104
|
+
/** i18n key for the section heading (`<h2>`). */
|
|
105
|
+
titleKey: string;
|
|
106
|
+
/**
|
|
107
|
+
* i18n key for the section description paragraph.
|
|
108
|
+
* Omit (or set to `undefined`) to hide the description.
|
|
109
|
+
*/
|
|
110
|
+
descriptionKey?: string;
|
|
111
|
+
/** i18n key for the "Add entry" dashed-button label. */
|
|
112
|
+
addLabelKey: string;
|
|
113
|
+
/** i18n key for the empty-state primary text (shown when `rows` is empty). */
|
|
114
|
+
emptyLabelKey: string;
|
|
115
|
+
/**
|
|
116
|
+
* i18n key for the empty-state hint text (secondary line).
|
|
117
|
+
* Omit to show only the primary text.
|
|
118
|
+
*/
|
|
119
|
+
emptyHintKey?: string;
|
|
120
|
+
/**
|
|
121
|
+
* Factory function invoked when the user clicks "Add entry".
|
|
122
|
+
* Should return a fresh row object with sensible defaults (e.g. pre-initialised
|
|
123
|
+
* sub-arrays such as `ingredient`).
|
|
124
|
+
* Defaults to `() => ({})` when omitted.
|
|
125
|
+
*/
|
|
126
|
+
createRow?: () => Record<string, unknown>;
|
|
127
|
+
}
|
|
@@ -1,28 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { PlanningBalanceService, PlanningEndpoint } from '../../core/planning/planning-balance.service';
|
|
1
|
+
import { PlanningBalanceService } from '../../core/planning/planning-balance.service';
|
|
3
2
|
import { MasterDataService } from '../../core/master-data/master-data.service';
|
|
4
|
-
import type {
|
|
3
|
+
import type { CropRequirementRow, NutrientEntry, ValidationMessage } from '../../core/planning/planning-balance.types';
|
|
5
4
|
export declare class PlanningResultComponent {
|
|
5
|
+
readonly embedded: import("@angular/core").InputSignal<boolean>;
|
|
6
6
|
readonly planning: PlanningBalanceService;
|
|
7
|
-
private readonly naebi;
|
|
8
|
-
private readonly sanitizer;
|
|
9
7
|
readonly masterData: MasterDataService;
|
|
10
|
-
readonly selectedEndpoint: import("@angular/core").WritableSignal<PlanningEndpoint>;
|
|
11
8
|
private readonly result;
|
|
12
|
-
/**
|
|
13
|
-
* Merges interleaved kg/% rows from totalBalance into one row per nutrient
|
|
14
|
-
* for use in the Section-D summary table.
|
|
15
|
-
*/
|
|
16
|
-
readonly balanceRows: import("@angular/core").Signal<BalanceRow[]>;
|
|
17
|
-
/** Farm-wide gas emissions (NH₃, NO, N₂O, N₂). */
|
|
18
|
-
readonly farmEmissions: import("@angular/core").Signal<NutrientEntry[]>;
|
|
19
9
|
readonly validationMessages: import("@angular/core").Signal<ValidationMessage[]>;
|
|
20
|
-
/** Land area stats converted from m² → ha (÷ 10 000). */
|
|
21
|
-
readonly landStats: import("@angular/core").Signal<{
|
|
22
|
-
total: number;
|
|
23
|
-
fertilizable: number;
|
|
24
|
-
slurry: number;
|
|
25
|
-
} | null>;
|
|
26
10
|
/** Fodder net balance (positive = surplus, negative = deficit). */
|
|
27
11
|
readonly fodderTotal: import("@angular/core").Signal<import("../../core/planning/planning-balance.types").FodderQuantity | null>;
|
|
28
12
|
readonly animalStockTotals: import("@angular/core").Signal<import("../../core/planning/planning-balance.types").AnimalStock | null>;
|
|
@@ -46,14 +30,8 @@ export declare class PlanningResultComponent {
|
|
|
46
30
|
readonly cropRequirementRows: import("@angular/core").Signal<CropRequirementRow[]>;
|
|
47
31
|
readonly fodderDetail: import("@angular/core").Signal<import("../../core/planning/planning-balance.types").RequiredEffectiveYieldFromFodderCropland | null>;
|
|
48
32
|
readonly fodderEffectiveYield: import("@angular/core").Signal<import("../../core/planning/planning-balance.types").FodderQuantity | null>;
|
|
49
|
-
/** SafeResourceUrl for the PDF iframe, or null if no report is present. */
|
|
50
|
-
readonly pdfUrl: import("@angular/core").Signal<SafeResourceUrl | null>;
|
|
51
|
-
private _prevBlobUrl;
|
|
52
|
-
private readonly _blobCleanup;
|
|
53
33
|
/** Human-readable label for a molecular formula symbol. */
|
|
54
34
|
formulaLabel(f: string): string;
|
|
55
|
-
/** Returns CSS modifier class based on the balance percentage value. */
|
|
56
|
-
balancePctClass(pct: number | null): string;
|
|
57
35
|
/** Returns the quantity for a given formula from a nutrient entry list, or 0 if absent. */
|
|
58
36
|
reqValue(requirement: NutrientEntry[], formula: string): number;
|
|
59
37
|
/**
|
|
@@ -65,5 +43,4 @@ export declare class PlanningResultComponent {
|
|
|
65
43
|
sumStockNutrients(entries: NutrientEntry[]): NutrientEntry[];
|
|
66
44
|
/** Summary chips for Sections C & D (N avail. / P₂O₅ / K₂O / Mg). */
|
|
67
45
|
sumKeyNutrients(entries: NutrientEntry[]): NutrientEntry[];
|
|
68
|
-
runPlanning(): void;
|
|
69
46
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { SuisseBilanzMetricsService } from '../suissebilanz-dashboard/suissebilanz-metrics.service';
|
|
2
|
+
import { GaugeStatus } from '../gauge-arc/gauge-arc.component';
|
|
3
|
+
/** Compact row + expandable detail for the latest planning-balance result. */
|
|
4
|
+
export declare class PlanningResultRowComponent {
|
|
5
|
+
protected readonly STATUS_ICONS: Record<GaugeStatus, string>;
|
|
6
|
+
private readonly planning;
|
|
7
|
+
private readonly naebi;
|
|
8
|
+
private readonly metadataSvc;
|
|
9
|
+
protected readonly metricsService: SuisseBilanzMetricsService;
|
|
10
|
+
protected readonly expanded: import("@angular/core").WritableSignal<boolean>;
|
|
11
|
+
protected readonly isLoading: import("@angular/core").Signal<boolean>;
|
|
12
|
+
protected readonly hasResult: import("@angular/core").Signal<boolean>;
|
|
13
|
+
protected readonly title: import("@angular/core").Signal<string>;
|
|
14
|
+
private readonly result;
|
|
15
|
+
/** Derived overall status: worst status across all nutrient metrics. */
|
|
16
|
+
protected readonly overallStatus: import("@angular/core").Signal<GaugeStatus>;
|
|
17
|
+
/** Compact chips for the 4 nutrient metrics + rendement, with kg values merged in. */
|
|
18
|
+
protected readonly nutrientChips: import("@angular/core").Signal<{
|
|
19
|
+
key: string;
|
|
20
|
+
label: string;
|
|
21
|
+
pct: number | null;
|
|
22
|
+
kg: number | null;
|
|
23
|
+
dt: number | null;
|
|
24
|
+
status: GaugeStatus;
|
|
25
|
+
}[]>;
|
|
26
|
+
/** Areas in ha (converted from m²). */
|
|
27
|
+
protected readonly areas: import("@angular/core").Signal<{
|
|
28
|
+
sau: number;
|
|
29
|
+
sfe: number;
|
|
30
|
+
to: number;
|
|
31
|
+
} | null>;
|
|
32
|
+
protected refresh(): void;
|
|
33
|
+
protected toggleDetail(): void;
|
|
34
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PlanningBalanceService } from '../../core/planning/planning-balance.service';
|
|
2
|
+
/**
|
|
3
|
+
* Extracted trigger UI for running the planning balance calculation.
|
|
4
|
+
* Contains: submit button and progress bar.
|
|
5
|
+
* Delegates actual HTTP call to `PlanningBalanceService`.
|
|
6
|
+
*/
|
|
7
|
+
export declare class PlanningTriggerComponent {
|
|
8
|
+
readonly planning: PlanningBalanceService;
|
|
9
|
+
private readonly naebi;
|
|
10
|
+
/** When true, the submit button is disabled regardless of loading state. */
|
|
11
|
+
readonly hasErrors: import("@angular/core").InputSignal<boolean>;
|
|
12
|
+
runPlanning(): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ErrorObject } from 'ajv';
|
|
2
|
+
import { PageId } from '../../core/navigation/navigation.service';
|
|
3
|
+
import { PlanningBalanceService } from '../../core/planning/planning-balance.service';
|
|
4
|
+
export declare class ResultsPageComponent {
|
|
5
|
+
readonly currentPage: import("@angular/core").InputSignal<PageId>;
|
|
6
|
+
readonly onNavigate: import("@angular/core").InputSignal<(page: PageId) => void>;
|
|
7
|
+
readonly onErrorSelected: import("@angular/core").InputSignal<(error: ErrorObject) => void>;
|
|
8
|
+
readonly onSubmitSuccess: import("@angular/core").InputSignal<() => void>;
|
|
9
|
+
protected readonly planning: PlanningBalanceService;
|
|
10
|
+
protected readonly selectedTabIndex: import("@angular/core").WritableSignal<number>;
|
|
11
|
+
constructor();
|
|
12
|
+
protected onTabChange(index: number): void;
|
|
13
|
+
}
|
package/dist/types/app/components/suissebilanz-dashboard/suissebilanz-dashboard.component.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { SafeUrl } from '@angular/platform-browser';
|
|
2
|
+
import { PlanningBalanceService } from '../../core/planning/planning-balance.service';
|
|
3
|
+
import { GaugeStatus } from '../gauge-arc/gauge-arc.component';
|
|
4
|
+
import { SuisseBilanzMetricsService } from './suissebilanz-metrics.service';
|
|
5
|
+
/**
|
|
6
|
+
* Dashboard card displaying the 5 main SuisseBilanz metrics as semicircular
|
|
7
|
+
* SVG gauges. Derives all display data from `PlanningBalanceService` via
|
|
8
|
+
* computed signals — fully zoneless-safe, `OnPush`.
|
|
9
|
+
*
|
|
10
|
+
* Shows an empty-state panel when no planning result is available yet.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SuisseBilanzDashboardComponent {
|
|
13
|
+
readonly embedded: import("@angular/core").InputSignal<boolean>;
|
|
14
|
+
protected readonly planning: PlanningBalanceService;
|
|
15
|
+
private readonly sanitizer;
|
|
16
|
+
protected readonly metricsService: SuisseBilanzMetricsService;
|
|
17
|
+
private readonly result;
|
|
18
|
+
protected readonly metrics: import("@angular/core").Signal<import("../gauge-arc/gauge-arc.component").GaugeMetric[]>;
|
|
19
|
+
/** Surface areas in ha, derived from the latest planning result. */
|
|
20
|
+
protected readonly surfaces: import("@angular/core").Signal<{
|
|
21
|
+
sau: number;
|
|
22
|
+
sfe: number;
|
|
23
|
+
to: number;
|
|
24
|
+
} | null>;
|
|
25
|
+
protected readonly officialPdfUrl: import("@angular/core").Signal<SafeUrl | null>;
|
|
26
|
+
private prevBlobUrl;
|
|
27
|
+
private readonly blobCleanup;
|
|
28
|
+
/** Maps a `GaugeStatus` to its Material icon name for the status badge. */
|
|
29
|
+
protected statusIcon(status: GaugeStatus): string;
|
|
30
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { GaugeMetric } from '../gauge-arc/gauge-arc.component';
|
|
2
|
+
/**
|
|
3
|
+
* Shared source of truth for all SuisseBilanz metric view-models.
|
|
4
|
+
*
|
|
5
|
+
* Both the full dashboard card and the slim minibar consume this service so
|
|
6
|
+
* the derivation logic lives in exactly one place. Metrics re-compute via
|
|
7
|
+
* `computed()` when either the planning result or the locale signal changes.
|
|
8
|
+
*/
|
|
9
|
+
export declare class SuisseBilanzMetricsService {
|
|
10
|
+
private readonly planning;
|
|
11
|
+
private readonly i18n;
|
|
12
|
+
/** Wall-clock time of the most recent successful planning result. */
|
|
13
|
+
readonly lastUpdated: import("@angular/core").WritableSignal<Date | null>;
|
|
14
|
+
constructor();
|
|
15
|
+
/**
|
|
16
|
+
* Five gauge view-models for N avail., P₂O₅, K₂O, Mg and Rendement prairies.
|
|
17
|
+
* Returns placeholder 'empty' metrics until the first planning result arrives.
|
|
18
|
+
*/
|
|
19
|
+
readonly metrics: import("@angular/core").Signal<GaugeMetric[]>;
|
|
20
|
+
private emptyMetric;
|
|
21
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { GaugeMetric, GaugeStatus } from '../gauge-arc/gauge-arc.component';
|
|
2
|
+
import { SuisseBilanzMetricsService } from '../suissebilanz-dashboard/suissebilanz-metrics.service';
|
|
3
|
+
/**
|
|
4
|
+
* Slim, always-visible metrics card placed above the workflow stepper.
|
|
5
|
+
*
|
|
6
|
+
* Shows the same 5 SuisseBilanz metrics as the full dashboard card but in a
|
|
7
|
+
* compact single-row layout: metric label → bold coloured value → thin
|
|
8
|
+
* progress bar. Shares all data logic via `SuisseBilanzMetricsService`.
|
|
9
|
+
*/
|
|
10
|
+
export declare class SuisseBilanzMinibarComponent {
|
|
11
|
+
protected readonly metricsService: SuisseBilanzMetricsService;
|
|
12
|
+
/** Returns the status colour for a given metric status. */
|
|
13
|
+
protected statusColor(status: GaugeStatus): string;
|
|
14
|
+
/**
|
|
15
|
+
* Maps the metric value to a 0–100 fill percentage for the progress bar,
|
|
16
|
+
* clamped so bars never overflow the track.
|
|
17
|
+
*/
|
|
18
|
+
protected fillPct(metric: GaugeMetric): number;
|
|
19
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ErrorObject } from 'ajv';
|
|
2
|
+
import { PlanningBalanceService } from '../../core/planning/planning-balance.service';
|
|
3
|
+
/**
|
|
4
|
+
* Final submission step: review validation status and submit the planning balance.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ValidationPageComponent {
|
|
7
|
+
readonly showHeader: import("@angular/core").InputSignal<boolean>;
|
|
8
|
+
/** Navigation callback for validation error clicks — provided by App to keep routing logic centralised. */
|
|
9
|
+
readonly onErrorSelected: import("@angular/core").InputSignal<(error: ErrorObject) => void>;
|
|
10
|
+
/** Navigation callback triggered after a fresh successful planning submission. */
|
|
11
|
+
readonly onSubmitSuccess: import("@angular/core").InputSignal<() => void>;
|
|
12
|
+
protected readonly planning: PlanningBalanceService;
|
|
13
|
+
private readonly globalValidation;
|
|
14
|
+
private lastHandledSuccessRequestId;
|
|
15
|
+
constructor();
|
|
16
|
+
protected readonly validationErrors: import("@angular/core").Signal<import("../../../public-api").EnrichedValidationError[]>;
|
|
17
|
+
protected readonly errorCount: import("@angular/core").Signal<number>;
|
|
18
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { DEFAULT_SUIBI_METADATA, type SubmissionStatus, type SuibiVersion, type SuibiMetadata } from '../../core/metadata/suibi-metadata.types';
|
|
1
|
+
export { DEFAULT_SUIBI_METADATA, DEFAULT_COMPUTATION_MODULES, type ComputationModules, type SubmissionStatus, type SuibiVersion, type SuibiMetadata } from '../../core/metadata/suibi-metadata.types';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { OnInit } from '@angular/core';
|
|
2
1
|
import { JsonSchema, UISchemaElement } from '@jsonforms/core';
|
|
3
2
|
import { SuibiMetadata } from '../../core/metadata/suibi-metadata.types';
|
|
4
|
-
export declare class WelcomePageComponent
|
|
3
|
+
export declare class WelcomePageComponent {
|
|
5
4
|
private readonly i18n;
|
|
6
5
|
private readonly metadataSvc;
|
|
6
|
+
private readonly naebi;
|
|
7
7
|
startEvent: import("@angular/core").OutputEmitterRef<void>;
|
|
8
8
|
metadataChange: import("@angular/core").OutputEmitterRef<SuibiMetadata>;
|
|
9
9
|
private readonly baseSchema;
|
|
@@ -17,11 +17,13 @@ export declare class WelcomePageComponent implements OnInit {
|
|
|
17
17
|
readonly localizedSchema: import("@angular/core").Signal<JsonSchema>;
|
|
18
18
|
readonly localizedUi: import("@angular/core").Signal<UISchemaElement>;
|
|
19
19
|
readonly jsonFormsData: import("@angular/core").Signal<{}>;
|
|
20
|
-
|
|
20
|
+
constructor();
|
|
21
21
|
start(): void;
|
|
22
|
+
loadExampleData(): void;
|
|
22
23
|
onMetadataChange(newValue: unknown): void;
|
|
23
24
|
private normalizeJsonFormsPayload;
|
|
24
25
|
private toMetadata;
|
|
26
|
+
private extractModules;
|
|
25
27
|
private isSuibiVersion;
|
|
26
28
|
private isSubmissionStatus;
|
|
27
29
|
private isSameMetadata;
|
|
@@ -39,6 +39,7 @@ export declare class WorkflowStepperComponent {
|
|
|
39
39
|
*/
|
|
40
40
|
readonly onNavigate: import("@angular/core").InputSignal<(page: PageId) => void>;
|
|
41
41
|
private readonly validationSvc;
|
|
42
|
+
private readonly workflowPage;
|
|
42
43
|
protected readonly pagesWithErrors: import("@angular/core").Signal<Set<PageId>>;
|
|
43
44
|
protected readonly isOnWorkflowPage: import("@angular/core").Signal<boolean>;
|
|
44
45
|
protected readonly clampedStepIndex: import("@angular/core").Signal<number>;
|