@agridea/suibi-module 0.1.0-preview.2f7b6e2 → 0.1.0-preview.557ea51

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.
Files changed (40) hide show
  1. package/dist/elements/browser/main.js +70 -71
  2. package/dist/elements/browser/suibi-module-latest.js +70 -71
  3. package/dist/elements/browser/suibi-module.v0.1.0-preview.557ea51.js +78 -0
  4. package/dist/elements/browser/suibi-theme-dark.css +1 -1
  5. package/dist/elements/browser/version.txt +1 -1
  6. package/dist/types/app/components/data-preview/data-preview.component.d.ts +1 -0
  7. package/dist/types/app/components/empty-state/empty-state.component.d.ts +2 -0
  8. package/dist/types/app/components/module-placeholder-page/module-placeholder-page.component.d.ts +6 -0
  9. package/dist/types/app/components/planning-result/planning-result.component.d.ts +3 -26
  10. package/dist/types/app/components/planning-result/planning-trigger.component.d.ts +13 -0
  11. package/dist/types/app/components/results-page/results-page.component.d.ts +13 -0
  12. package/dist/types/app/components/suissebilanz-dashboard/gauge-arc.component.d.ts +47 -0
  13. package/dist/types/app/components/suissebilanz-dashboard/suissebilanz-dashboard.component.d.ts +24 -0
  14. package/dist/types/app/components/suissebilanz-dashboard/suissebilanz-metrics.service.d.ts +21 -0
  15. package/dist/types/app/components/suissebilanz-dashboard/suissebilanz-minibar.component.d.ts +19 -0
  16. package/dist/types/app/components/validation-page/validation-page.component.d.ts +18 -0
  17. package/dist/types/app/components/workflow-stepper/workflow-stepper.component.d.ts +1 -0
  18. package/dist/types/app/core/data/naebi-data.service.d.ts +12 -0
  19. package/dist/types/app/core/master-data/master-data.service.d.ts +2 -0
  20. package/dist/types/app/core/navigation/navigation.service.d.ts +19 -1
  21. package/dist/types/app/core/planning/planning-balance.service.d.ts +22 -3
  22. package/dist/types/app/core/planning/planning-balance.utils.d.ts +10 -0
  23. package/dist/types/app/core/validation/global-validation.service.d.ts +15 -1
  24. package/dist/types/app/header-bar.d.ts +1 -2
  25. package/dist/types/app/jsonforms/filters/code-list-filter-resolvers.d.ts +3 -0
  26. package/dist/types/app/jsonforms/renderers/controls/selects/code-list/code-list-select.renderer.d.ts +10 -4
  27. package/dist/types/app/nutrient-cycle/fodder/fodder-detail.component.d.ts +32 -0
  28. package/dist/types/app/nutrient-cycle/fodder/fodder-list.component.d.ts +21 -0
  29. package/dist/types/app/nutrient-cycle/fodder/fodder-master-detail.component.d.ts +37 -0
  30. package/dist/types/app/nutrient-cycle/fodder/fodder.types.d.ts +27 -0
  31. package/dist/types/app/nutrient-cycle/fodder/transaction-unit.util.d.ts +2 -0
  32. package/dist/types/app/nutrient-cycle/storage/storage-detail.component.d.ts +30 -0
  33. package/dist/types/app/nutrient-cycle/storage/storage-general.component.d.ts +29 -0
  34. package/dist/types/app/nutrient-cycle/storage/storage-list.component.d.ts +20 -0
  35. package/dist/types/app/nutrient-cycle/storage/storage-master-detail.component.d.ts +31 -0
  36. package/dist/types/app/nutrient-cycle/storage/storage.types.d.ts +40 -0
  37. package/dist/types/shared/material-icons.d.ts +3 -3
  38. package/package.json +1 -1
  39. package/dist/elements/browser/suibi-module.v0.1.0-preview.2f7b6e2.js +0 -79
  40. /package/dist/elements/browser/{suibi-module.v0.1.0-preview.2f7b6e2.css → suibi-module.v0.1.0-preview.557ea51.css} +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.2f7b6e2 2f7b6e2
1
+ 0.1.0-preview.557ea51 557ea51
@@ -7,5 +7,6 @@ export declare class DataPreviewComponent {
7
7
  readonly planning: PlanningBalanceService;
8
8
  readonly metadataPreview: import("@angular/core").Signal<import("../../../public-api").SuibiDataEventMetadata>;
9
9
  constructor(naebi: NaebiDataService);
10
+ setPlanningEndpoint(value: string | null): void;
10
11
  emitData(): void;
11
12
  }
@@ -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,6 @@
1
+ /**
2
+ * Generic page wrapper for workflow steps that are present in navigation but not implemented yet.
3
+ */
4
+ export declare class ModulePlaceholderPageComponent {
5
+ readonly titleKey: import("@angular/core").InputSignal<string>;
6
+ }
@@ -1,28 +1,12 @@
1
- import { SafeResourceUrl } from '@angular/platform-browser';
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 { BalanceRow, CropRequirementRow, NutrientEntry, ValidationMessage } from '../../core/planning/planning-balance.types';
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,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
+ }
@@ -0,0 +1,47 @@
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
+ }
22
+ /**
23
+ * Reusable semicircular SVG arc gauge.
24
+ *
25
+ * Renders a 180° arc gauge using pure inline SVG — no third-party library.
26
+ * All geometry is derived via `computed()` signals so the component is
27
+ * fully zoneless-safe and works without Zone.js triggers.
28
+ *
29
+ * The arc uses `pathLength="1"` so `stroke-dasharray` fractions map
30
+ * directly to 0–1 without floating-point arc-length estimation.
31
+ */
32
+ export declare class GaugeArcComponent {
33
+ readonly value: import("@angular/core").InputSignal<number>;
34
+ readonly max: import("@angular/core").InputSignal<number>;
35
+ readonly status: import("@angular/core").InputSignal<GaugeStatus>;
36
+ protected readonly pct: import("@angular/core").Signal<number>;
37
+ protected readonly dashArray: import("@angular/core").Signal<string>;
38
+ protected readonly tickCoords: import("@angular/core").Signal<{
39
+ x1: number;
40
+ y1: number;
41
+ x2: number;
42
+ y2: number;
43
+ }>;
44
+ protected readonly fillColor: import("@angular/core").Signal<string>;
45
+ protected readonly displayValue: import("@angular/core").Signal<string>;
46
+ protected readonly ariaLabel: import("@angular/core").Signal<string>;
47
+ }
@@ -0,0 +1,24 @@
1
+ import { SafeUrl } from '@angular/platform-browser';
2
+ import { PlanningBalanceService } from '../../core/planning/planning-balance.service';
3
+ import { GaugeStatus } from './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.component").GaugeMetric[]>;
19
+ protected readonly officialPdfUrl: import("@angular/core").Signal<SafeUrl | null>;
20
+ private prevBlobUrl;
21
+ private readonly blobCleanup;
22
+ /** Maps a `GaugeStatus` to its Material icon name for the status badge. */
23
+ protected statusIcon(status: GaugeStatus): string;
24
+ }
@@ -0,0 +1,21 @@
1
+ import { GaugeMetric } from './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.component';
2
+ import { SuisseBilanzMetricsService } from './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
+ }
@@ -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>;
@@ -82,6 +82,7 @@ export declare class NaebiDataService {
82
82
  createFacilitySpecificSlurryProduct: boolean;
83
83
  dilutionRatio: number;
84
84
  manurePit: {
85
+ descriptor: string;
85
86
  cover: number;
86
87
  manureFromAnimalStockStored: {
87
88
  manureDerivation: string;
@@ -89,6 +90,7 @@ export declare class NaebiDataService {
89
90
  }[];
90
91
  }[];
91
92
  slurryTank: {
93
+ descriptor: string;
92
94
  volumeInM3: number;
93
95
  depthInM: number;
94
96
  cover: number;
@@ -183,6 +185,16 @@ export declare class NaebiDataService {
183
185
  unit: string;
184
186
  }[];
185
187
  }[];
188
+ dispense: {
189
+ typeOfFeedstuffProduct: string;
190
+ quantity: number;
191
+ transactionUnit: string;
192
+ ingredient: {
193
+ quantity: number;
194
+ molecularFormula: string;
195
+ unit: string;
196
+ }[];
197
+ }[];
186
198
  };
187
199
  cropFromNonFodderCropland: {
188
200
  typeOfFeedstuffProduct: string;
@@ -26,5 +26,7 @@ export declare class MasterDataService {
26
26
  resolveCultivationCategory(code: string | null | undefined, locale?: Locale): string;
27
27
  resolveAgronomicCropCategory(code: string | null | undefined, locale?: Locale): string;
28
28
  resolveFeedstuffProduct(code: string | null | undefined, locale?: Locale): string;
29
+ resolveCover(id: number | string | null | undefined, locale?: Locale): string;
30
+ resolveMixingFrequency(id: number | string | null | undefined, locale?: Locale): string;
29
31
  }
30
32
  export {};
@@ -1,8 +1,12 @@
1
- export type PageId = 'welcome' | 'animal_stock' | 'data_preview' | 'storage' | 'field_spreading' | 'farm_manure_trading';
1
+ export type PageId = 'welcome' | 'animal_stock' | 'data_preview' | 'storage' | 'field_spreading' | 'farm_manure_trading' | 'fodder' | 'field_cultivation' | 'validation' | 'results';
2
2
  export type AnimalStockCategory = 'base' | 'formOfDetention' | 'feeding';
3
3
  export type FarmManureTradingMode = 'supply' | 'dispense';
4
4
  export type FarmManureTradingCategory = 'general' | 'derivation' | 'ingredients';
5
+ export type FodderMode = 'supply' | 'dispense' | 'non_fodder_cropland';
6
+ export type FodderCategory = 'general' | 'ingredients';
5
7
  export type FieldSpreadingCategory = 'general' | 'fertiliser' | 'recycling';
8
+ export type StorageTab = 'manure' | 'slurry';
9
+ export type StorageEntryType = 'manure_pit' | 'slurry_tank';
6
10
  /**
7
11
  * NavigationService
8
12
  * Global reactive store for application routing and deep-link state.
@@ -38,6 +42,16 @@ export declare class NavigationService {
38
42
  mode: FarmManureTradingMode;
39
43
  index: number;
40
44
  } | null>;
45
+ /** Selected fodder detail context (mode + index) */
46
+ readonly selectedFodderDetail: import("@angular/core").WritableSignal<{
47
+ mode: FodderMode;
48
+ index: number;
49
+ } | null>;
50
+ /** Selected storage detail context (type + index) */
51
+ readonly selectedStorageDetail: import("@angular/core").WritableSignal<{
52
+ type: StorageEntryType;
53
+ index: number;
54
+ } | null>;
41
55
  /** True if currently viewing animal stock detail (not list) */
42
56
  readonly isAnimalStockDetailView: import("@angular/core").Signal<boolean>;
43
57
  /** True if currently on animal stock page (list or detail) */
@@ -58,7 +72,11 @@ export declare class NavigationService {
58
72
  navigateToAnimalStockDetail(index: number, category?: AnimalStockCategory): void;
59
73
  navigateToFarmManureTradingDetail(mode: FarmManureTradingMode, index: number, category?: FarmManureTradingCategory): void;
60
74
  navigateToFarmManureTradingList(): void;
75
+ navigateToFodderDetail(mode: FodderMode, index: number, category?: FodderCategory): void;
76
+ navigateToFodderList(): void;
61
77
  navigateToFieldSpreading(category?: FieldSpreadingCategory): void;
78
+ navigateToStorageDetail(type: StorageEntryType, index: number): void;
79
+ navigateToStorageList(tab?: StorageTab): void;
62
80
  /**
63
81
  * Set active category/tab for current page (without changing page/entry).
64
82
  * Generic method supporting any page's categorization navigation.
@@ -10,9 +10,28 @@ export type PlanningEndpoint = 'ebilanz' | 'blw';
10
10
  * The ID counter ensures each call re-fetches even if the payload hasn't changed.
11
11
  */
12
12
  export declare class PlanningBalanceService {
13
- private readonly _trigger;
13
+ private readonly http;
14
+ private readonly _value;
15
+ private readonly _error;
16
+ private readonly _isLoading;
17
+ private readonly _selectedEndpoint;
18
+ private readonly _lastStartedRequestId;
19
+ private readonly _lastCompletedRequestId;
20
+ private readonly _lastSuccessfulRequestId;
14
21
  private _nextId;
15
- readonly planningResource: import("@angular/common/http").HttpResourceRef<PlanningBalanceResponse | undefined>;
22
+ private activeRequestId;
23
+ private activeRequestSub;
24
+ readonly planningResource: {
25
+ value: import("@angular/core").Signal<PlanningBalanceResponse | undefined>;
26
+ error: import("@angular/core").Signal<unknown>;
27
+ isLoading: import("@angular/core").Signal<boolean>;
28
+ hasValue: import("@angular/core").Signal<boolean>;
29
+ lastStartedRequestId: import("@angular/core").Signal<number>;
30
+ lastCompletedRequestId: import("@angular/core").Signal<number>;
31
+ lastSuccessfulRequestId: import("@angular/core").Signal<number>;
32
+ };
33
+ readonly selectedEndpoint: import("@angular/core").Signal<PlanningEndpoint>;
34
+ setSelectedEndpoint(endpoint: PlanningEndpoint): void;
16
35
  /** Fire a new planning-balance request with the current NAEBI data payload. */
17
- runPlanning(data: NaebiData, endpoint: PlanningEndpoint): void;
36
+ runPlanning(data: NaebiData, endpoint?: PlanningEndpoint): void;
18
37
  }
@@ -0,0 +1,10 @@
1
+ import type { BalanceRow, NutrientEntry } from './planning-balance.types';
2
+ /**
3
+ * Merges the interleaved kg / % rows from `totalBalance` into one `BalanceRow`
4
+ * per nutrient formula, preserving the canonical KEY_NUTRIENTS display order.
5
+ *
6
+ * The planning-balance API returns two `NutrientEntry` objects per formula
7
+ * (one with `unit === 'kg'`, one with `unit === '%'`). This function coalesces
8
+ * them so callers work with a single, normalised row.
9
+ */
10
+ export declare function mergeBalanceRows(totalBalance: NutrientEntry[]): BalanceRow[];
@@ -1,5 +1,5 @@
1
1
  import { ErrorObject } from 'ajv';
2
- import { AnimalStockCategory, FarmManureTradingCategory, FarmManureTradingMode, FieldSpreadingCategory, PageId } from '../navigation/navigation.service';
2
+ import { AnimalStockCategory, FarmManureTradingCategory, FarmManureTradingMode, FieldSpreadingCategory, FodderCategory, FodderMode, PageId, StorageEntryType, StorageTab } from '../navigation/navigation.service';
3
3
  export interface EnrichedValidationError extends ErrorObject {
4
4
  /** Human-friendly field label (e.g., "Animal Category") */
5
5
  fieldLabel?: string;
@@ -17,8 +17,20 @@ export interface EnrichedValidationError extends ErrorObject {
17
17
  targetFarmManureTradingIndex?: number;
18
18
  /** Category tab inside farm manure trading detail */
19
19
  targetFarmManureTradingCategory?: FarmManureTradingCategory;
20
+ /** Navigation target: fodder mode */
21
+ targetFodderMode?: FodderMode;
22
+ /** Navigation target: fodder entry index */
23
+ targetFodderIndex?: number;
24
+ /** Category tab inside fodder detail */
25
+ targetFodderCategory?: FodderCategory;
20
26
  /** Category tab inside field spreading */
21
27
  targetFieldSpreadingCategory?: FieldSpreadingCategory;
28
+ /** Storage detail type */
29
+ targetStorageType?: StorageEntryType;
30
+ /** Storage detail index */
31
+ targetStorageIndex?: number;
32
+ /** Storage tab for list-level or scalar navigation */
33
+ targetStorageTab?: StorageTab;
22
34
  }
23
35
  /**
24
36
  * GlobalValidationService
@@ -37,5 +49,7 @@ export declare class GlobalValidationService {
37
49
  private inferCategory;
38
50
  private inferFarmTradingCategory;
39
51
  private inferFieldSpreadingCategory;
52
+ private inferFodderCategory;
53
+ private inferStorageTab;
40
54
  private inferFieldLabel;
41
55
  }
@@ -2,8 +2,7 @@ import { Locale } from './core/i18n/i18n.service';
2
2
  import { PageId } from './core/navigation/navigation.service';
3
3
  /**
4
4
  * HeaderBarComponent
5
- * Top app bar: application branding, utility actions (data preview, save indicator).
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>;
@@ -20,9 +20,11 @@
20
20
  */
21
21
  import { MasterDataService } from '../../core/master-data/master-data.service';
22
22
  import { I18nService } from '../../core/i18n/i18n.service';
23
+ import { NaebiDataService } from '../../core/data/naebi-data.service';
23
24
  import { BaseCodeListEntry } from '../shared/option-sources/code-lists';
24
25
  export interface FilterContext {
25
26
  data: unknown;
27
+ rootData: unknown;
26
28
  get<T = unknown>(pointer: string): T | undefined;
27
29
  masterData: MasterDataService;
28
30
  locale: string;
@@ -57,4 +59,5 @@ export declare function registerCodeListFilter(name: string, fn: CodeListFilterR
57
59
  export declare function evaluateFilter(list: BaseCodeListEntry[], cfg: FilterConfig | undefined, services: {
58
60
  masterData: MasterDataService;
59
61
  i18n: I18nService;
62
+ naebiData?: NaebiDataService;
60
63
  }, data: unknown): BaseCodeListEntry[];
@@ -1,28 +1,34 @@
1
1
  import { Signal } from '@angular/core';
2
2
  import { JsonFormsAngularService } from '@jsonforms/angular';
3
- import { RankedTester } from '@jsonforms/core';
3
+ import { ControlElement, RankedTester } from '@jsonforms/core';
4
4
  import { BaseSelectControl } from '../../../../shared/base-control/base-select-control';
5
5
  import { BaseCodeListEntry } from '../../../../shared/option-sources/code-lists';
6
+ export declare function replaceDataPathLeaf(path: string | null | undefined, replacement: string): string | null;
7
+ export declare function deriveSiblingDependencyPath(uischema: ControlElement | null | undefined, path: string | null | undefined, replacement: string): string | null;
6
8
  export declare class CodeListSelectRenderer extends BaseSelectControl<number | string> {
7
9
  private readonly masterData;
8
10
  private readonly i18n;
11
+ private readonly naebiData;
9
12
  private readonly formData;
10
13
  private readonly controlScope;
11
14
  private explicitCodeListKey;
12
15
  private controlKey;
13
16
  private listKey;
14
17
  readonly options: Signal<BaseCodeListEntry[]>;
18
+ readonly isMultiSelect: Signal<boolean>;
15
19
  private readonly filterConfig;
20
+ private readonly emptyHintKey;
16
21
  private readonly dependsOnDataPath;
17
- private readonly autoDependsOnScope;
22
+ private readonly autoDependsOnDataPath;
18
23
  private scopePointerToDataPath;
19
- private replacePointerLeaf;
20
24
  private inferListKeyFromScope;
21
25
  private readValueAtPath;
22
26
  readonly filteredOptions: Signal<BaseCodeListEntry[]>;
23
27
  constructor(jsonFormsService: JsonFormsAngularService);
24
28
  getEventValue: (event: any) => any;
25
29
  optionLabel(opt: BaseCodeListEntry): string;
26
- onSelectionChange(value: number | string): void;
30
+ emptyHint(): string;
31
+ shouldShowEmptyHint(): boolean;
32
+ onSelectionChange(value: number | string | Array<number | string>): void;
27
33
  }
28
34
  export declare const codeListSelectTester: RankedTester;
@@ -0,0 +1,32 @@
1
+ import { EventEmitter, Signal } from '@angular/core';
2
+ import { JsonSchema, UISchemaElement } from '@jsonforms/core';
3
+ import { FodderMode } from '../../core/navigation/navigation.service';
4
+ import { FodderCropFromNonFodderCropland, FodderDispense, FodderSupply } from './fodder.types';
5
+ type FodderRow = FodderSupply | FodderDispense | FodderCropFromNonFodderCropland;
6
+ export declare class FodderDetailComponent {
7
+ private readonly i18n;
8
+ row: Signal<FodderRow | null>;
9
+ index: Signal<number | null>;
10
+ mode: import("@angular/core").InputSignal<FodderMode>;
11
+ rowChange: EventEmitter<FodderRow>;
12
+ close: EventEmitter<void>;
13
+ readonly renderers: {
14
+ tester: import("@jsonforms/core").RankedTester;
15
+ renderer: any;
16
+ }[];
17
+ readonly suibiAjv: import("ajv").Ajv;
18
+ private readonly baseSchemas;
19
+ private readonly baseUis;
20
+ readonly itemSchema: Signal<JsonSchema>;
21
+ readonly localizedUi: Signal<UISchemaElement>;
22
+ readonly detailTitle: Signal<string>;
23
+ readonly jsonFormsData: Signal<({
24
+ quantity?: number;
25
+ typeOfFeedstuffProduct?: string;
26
+ transactionUnit?: string;
27
+ ingredient?: import("./fodder.types").FodderIngredient[];
28
+ } & import("../../core/schemas/ui-helper-registry").UiHelperDefinitions) | null>;
29
+ onDataChange(event: unknown): void;
30
+ private applyDerivedFields;
31
+ }
32
+ export {};
@@ -0,0 +1,21 @@
1
+ import { EventEmitter, Signal } from '@angular/core';
2
+ import { FodderCropFromNonFodderCropland, FodderDispense, FodderSupply } from './fodder.types';
3
+ import { FodderMode } from '../../core/navigation/navigation.service';
4
+ type FodderRow = FodderSupply | FodderDispense | FodderCropFromNonFodderCropland;
5
+ export declare class FodderListComponent {
6
+ private readonly masterData;
7
+ private readonly i18n;
8
+ rows: Signal<FodderRow[]>;
9
+ selectedIndex: Signal<number | null>;
10
+ mode: FodderMode;
11
+ select: EventEmitter<number>;
12
+ add: EventEmitter<void>;
13
+ delete: EventEmitter<number>;
14
+ readonly displayedColumns: string[];
15
+ resolveProduct(code: string | null | undefined): string;
16
+ emptyLabel(): string;
17
+ emptyHintLabel(): string;
18
+ addLabel(): string;
19
+ onDelete(index: number, event: Event): void;
20
+ }
21
+ export {};
@@ -0,0 +1,37 @@
1
+ import { FodderMode } from '../../core/navigation/navigation.service';
2
+ import { FodderCropFromNonFodderCropland, FodderDispense, FodderSupply } from './fodder.types';
3
+ type FodderRow = FodderSupply | FodderDispense | FodderCropFromNonFodderCropland;
4
+ export declare class FodderMasterDetailComponent {
5
+ private readonly dataSvc;
6
+ private readonly navigationSvc;
7
+ constructor();
8
+ readonly supplyRows: import("@angular/core").Signal<FodderSupply[]>;
9
+ readonly dispenseRows: import("@angular/core").Signal<FodderDispense[]>;
10
+ readonly nonFodderCroplandRows: import("@angular/core").Signal<FodderCropFromNonFodderCropland[]>;
11
+ readonly proportionStorageLoss: import("@angular/core").Signal<number | undefined>;
12
+ readonly totalBalanceErrorMargin: import("@angular/core").Signal<number | undefined>;
13
+ readonly activeTab: import("@angular/core").WritableSignal<FodderMode>;
14
+ readonly selectedSupplyIndex: import("@angular/core").WritableSignal<number | null>;
15
+ readonly selectedDispenseIndex: import("@angular/core").WritableSignal<number | null>;
16
+ readonly selectedNonFodderCroplandIndex: import("@angular/core").WritableSignal<number | null>;
17
+ readonly currentDetail: import("@angular/core").Signal<FodderRow | null>;
18
+ readonly currentIndex: import("@angular/core").Signal<number | null>;
19
+ readonly detailOpen: import("@angular/core").Signal<boolean>;
20
+ readonly activeTabIndex: import("@angular/core").Signal<0 | 1 | 2>;
21
+ onTabChange(index: number): void;
22
+ openDetail(mode: FodderMode, index: number): void;
23
+ closeDetail(): void;
24
+ addEntry(mode: FodderMode): void;
25
+ deleteEntry(mode: FodderMode, index: number): void;
26
+ onDetailChange(payload: FodderRow): void;
27
+ onScalarInput(field: 'proportionStorageLoss' | 'totalBalanceErrorMargin', rawValue: string): void;
28
+ scalarInputValue(value: number | undefined): string;
29
+ private clearInvalidSelection;
30
+ private selectedIndexSignal;
31
+ private rowsForMode;
32
+ private createEmptyEntry;
33
+ private patchRows;
34
+ private cloneFodder;
35
+ private cloneTrading;
36
+ }
37
+ export {};