@agridea/suibi-module 0.1.0-preview.8 → 0.1.0-preview.8c4fa92
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/dist/elements/browser/main.js +76 -64
- package/dist/elements/browser/styles.css +1 -1
- package/dist/elements/browser/suibi-module-latest.css +1 -1
- package/dist/elements/browser/suibi-module-latest.js +76 -64
- package/dist/elements/browser/{suibi-module.v0.1.0-preview.8.css → suibi-module.v0.1.0-preview.8c4fa92.css} +1 -1
- package/dist/elements/browser/suibi-module.v0.1.0-preview.8c4fa92.js +79 -0
- package/dist/elements/browser/suibi-theme-dark.css +1 -1
- package/dist/elements/browser/version.txt +1 -1
- package/dist/elements/browser/wc-global-utilities.css +1 -0
- package/dist/types/app/app.d.ts +14 -6
- package/dist/types/app/components/add-dashed-button/add-dashed-button.component.d.ts +9 -0
- package/dist/types/app/components/data-preview/data-preview.component.d.ts +11 -0
- package/dist/types/app/components/empty-state/empty-state.component.d.ts +10 -0
- package/dist/types/app/components/planning-result/planning-result.component.d.ts +69 -0
- package/dist/types/app/components/welcome-page/metadata.types.d.ts +1 -0
- package/dist/types/app/components/welcome-page/welcome-page.component.d.ts +28 -0
- package/dist/types/app/components/workflow-stepper/workflow-stepper.component.d.ts +48 -0
- package/dist/types/app/core/data/naebi-data.service.d.ts +28 -7
- package/dist/types/app/core/error/global-error-handler.d.ts +6 -0
- package/dist/types/app/core/events/suibi-data-emitter.service.d.ts +13 -0
- package/dist/types/app/core/events/suibi-data-event.d.ts +26 -0
- package/dist/types/app/core/master-data/master-data.service.d.ts +13 -1
- package/dist/types/app/core/metadata/suibi-metadata.service.d.ts +6 -0
- package/dist/types/app/core/metadata/suibi-metadata.types.d.ts +8 -0
- package/dist/types/app/core/navigation/navigation.service.d.ts +25 -4
- package/dist/types/app/core/planning/planning-balance.service.d.ts +18 -0
- package/dist/types/app/core/planning/planning-balance.types.d.ts +206 -0
- package/dist/types/app/core/schemas/schema-localization.util.d.ts +18 -0
- package/dist/types/app/core/telemetry/telemetry.service.d.ts +12 -0
- package/dist/types/app/core/utils/object.util.d.ts +24 -0
- package/dist/types/app/core/validation/capabilities.d.ts +5 -5
- package/dist/types/app/core/validation/global-validation.service.d.ts +13 -4
- package/dist/types/app/header-bar.d.ts +3 -7
- package/dist/types/app/jsonforms/registry/renderers.registry.d.ts +8 -0
- package/dist/types/app/jsonforms/renderers/controls/selects/code-list/code-list-select.renderer.d.ts +8 -0
- package/dist/types/app/jsonforms/renderers/layout/array/array-layout.renderer.d.ts +43 -0
- package/dist/types/app/jsonforms/renderers/layout/categorization/selected-category-categorization.renderer.d.ts +34 -0
- package/dist/types/app/{animal-stock → nutrient-cycle/animal-stock}/animal-stock-detail.component.d.ts +1 -1
- package/dist/types/app/{animal-stock → nutrient-cycle/animal-stock}/animal-stock-master-detail.component.d.ts +4 -1
- package/dist/types/app/{animal-stock → nutrient-cycle/animal-stock}/animal-stock.types.d.ts +6 -6
- package/dist/types/app/nutrient-cycle/animal-stock/index.d.ts +4 -0
- package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading-detail.component.d.ts +27 -0
- package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading-list.component.d.ts +23 -0
- package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading-master-detail.component.d.ts +25 -0
- package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading.types.d.ts +27 -0
- package/dist/types/app/nutrient-cycle/farm-manure-trading/index.d.ts +4 -0
- package/dist/types/app/nutrient-cycle/farm-manure-trading/transaction-unit.util.d.ts +1 -0
- package/dist/types/app/nutrient-cycle/field-spreading/field-spreading.component.d.ts +21 -0
- package/dist/types/app/nutrient-cycle/field-spreading/field-spreading.types.d.ts +43 -0
- package/dist/types/app/nutrient-cycle/field-spreading/index.d.ts +2 -0
- package/dist/types/app/nutrient-cycle/lifetime-performance/lifetime-performance-form.component.d.ts +27 -0
- package/dist/types/app/nutrient-cycle/lifetime-performance/lifetime-performance.types.d.ts +5 -0
- package/dist/types/environments/environment.d.ts +11 -0
- package/dist/types/public-api.d.ts +2 -0
- package/package.json +2 -1
- package/dist/elements/browser/suibi-module.v0.1.0-preview.8.js +0 -67
- package/dist/types/app/data-preview.d.ts +0 -7
- package/dist/types/app/welcome-page.d.ts +0 -4
- /package/dist/types/app/{animal-stock → nutrient-cycle/animal-stock}/animal-stock-list.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;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}.
|
|
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 +1 @@
|
|
|
1
|
-
0.1.0-preview.
|
|
1
|
+
0.1.0-preview.8c4fa92 8c4fa92
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.cdk-overlay-container{position:fixed;inset:0;z-index:1200;pointer-events:none}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{position:fixed;inset:0;display:flex;align-items:flex-start;justify-content:center;pointer-events:none}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1200;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1200}.cdk-overlay-backdrop{position:fixed;inset:0;z-index:1199;pointer-events:auto}.cdk-overlay-transparent-backdrop{background:transparent}.cdk-overlay-dark-backdrop{background:#00000052}.mat-mdc-select-panel.mdc-menu-surface{background:#fff;--mdc-theme-surface: #fff;--mdc-menu-container-color: #fff;--mat-select-panel-background-color: #fff;box-shadow:0 4px 16px #00000040;border-radius:4px;outline:0;opacity:1!important;filter:none!important}
|
package/dist/types/app/app.d.ts
CHANGED
|
@@ -1,26 +1,34 @@
|
|
|
1
1
|
import { Locale } from './core/i18n/i18n.service';
|
|
2
|
+
import { SuibiDataEventDetail } from './core/events/suibi-data-event';
|
|
2
3
|
import { EnrichedValidationError } from './core/validation/global-validation.service';
|
|
3
4
|
import { PageId } from './core/navigation/navigation.service';
|
|
4
5
|
import { ErrorObject } from 'ajv';
|
|
5
6
|
export declare class App {
|
|
6
|
-
|
|
7
|
+
private readonly autosaveIntervalMs;
|
|
8
|
+
locale: import("@angular/core").InputSignal<Locale>;
|
|
7
9
|
themeSrc: import("@angular/core").InputSignal<string | null>;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
+
page: import("@angular/core").InputSignal<PageId>;
|
|
11
|
+
suibiData: import("@angular/core").InputSignal<string | SuibiDataEventDetail | null>;
|
|
12
|
+
telemetryInput: import("@angular/core").InputSignal<string | boolean>;
|
|
10
13
|
private readonly i18n;
|
|
11
14
|
private readonly hostEl;
|
|
12
15
|
private readonly destroyRef;
|
|
13
16
|
private readonly naebi;
|
|
17
|
+
private readonly metadataSvc;
|
|
14
18
|
private readonly globalValidation;
|
|
15
19
|
private readonly navigationSvc;
|
|
20
|
+
private readonly dataEmitter;
|
|
21
|
+
private readonly telemetryService;
|
|
16
22
|
private readonly isCustomElement;
|
|
17
|
-
readonly
|
|
23
|
+
readonly activeLocale: import("@angular/core").Signal<Locale>;
|
|
18
24
|
readonly validationErrors: import("@angular/core").Signal<EnrichedValidationError[]>;
|
|
25
|
+
readonly isDirty: import("@angular/core").Signal<boolean>;
|
|
19
26
|
constructor();
|
|
20
27
|
readonly currentPage: import("@angular/core").WritableSignal<PageId>;
|
|
21
|
-
private lastPageInput;
|
|
22
|
-
private readonly syncPageEffect;
|
|
23
28
|
go(page: PageId): void;
|
|
24
29
|
setLocale(locale: Locale): void;
|
|
30
|
+
emitData(): void;
|
|
31
|
+
private emitDataIfDirty;
|
|
32
|
+
private initAutosave;
|
|
25
33
|
onValidationErrorSelected(error: ErrorObject): void;
|
|
26
34
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AddDashedButtonComponent
|
|
3
|
+
* Full-width dashed call-to-action button used as the primary add action in list views.
|
|
4
|
+
* Styled with the brand primary colour; works in both empty and non-empty list states.
|
|
5
|
+
*/
|
|
6
|
+
export declare class AddDashedButtonComponent {
|
|
7
|
+
label: import("@angular/core").InputSignal<string>;
|
|
8
|
+
clicked: import("@angular/core").OutputEmitterRef<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { NaebiDataService } from '../../core/data/naebi-data.service';
|
|
2
|
+
import { PlanningBalanceService } from '../../core/planning/planning-balance.service';
|
|
3
|
+
export declare class DataPreviewComponent {
|
|
4
|
+
readonly naebi: NaebiDataService;
|
|
5
|
+
private readonly host;
|
|
6
|
+
private readonly emitter;
|
|
7
|
+
readonly planning: PlanningBalanceService;
|
|
8
|
+
readonly metadataPreview: import("@angular/core").Signal<import("../../../public-api").SuibiDataEventMetadata>;
|
|
9
|
+
constructor(naebi: NaebiDataService);
|
|
10
|
+
emitData(): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmptyStateComponent
|
|
3
|
+
* Reusable centered placeholder shown when a list has no entries.
|
|
4
|
+
* Displays a faded icon, a primary message, and an optional hint line.
|
|
5
|
+
*/
|
|
6
|
+
export declare class EmptyStateComponent {
|
|
7
|
+
primaryText: import("@angular/core").InputSignal<string>;
|
|
8
|
+
/** Optional hint displayed below the primary message. */
|
|
9
|
+
secondaryText: import("@angular/core").InputSignal<string>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { SafeResourceUrl } from '@angular/platform-browser';
|
|
2
|
+
import { PlanningBalanceService, PlanningEndpoint } from '../../core/planning/planning-balance.service';
|
|
3
|
+
import { MasterDataService } from '../../core/master-data/master-data.service';
|
|
4
|
+
import type { BalanceRow, CropRequirementRow, NutrientEntry, ValidationMessage } from '../../core/planning/planning-balance.types';
|
|
5
|
+
export declare class PlanningResultComponent {
|
|
6
|
+
readonly planning: PlanningBalanceService;
|
|
7
|
+
private readonly naebi;
|
|
8
|
+
private readonly sanitizer;
|
|
9
|
+
readonly masterData: MasterDataService;
|
|
10
|
+
readonly selectedEndpoint: import("@angular/core").WritableSignal<PlanningEndpoint>;
|
|
11
|
+
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
|
+
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
|
+
/** Fodder net balance (positive = surplus, negative = deficit). */
|
|
27
|
+
readonly fodderTotal: import("@angular/core").Signal<import("../../core/planning/planning-balance.types").FodderQuantity | null>;
|
|
28
|
+
readonly animalStockTotals: import("@angular/core").Signal<import("../../core/planning/planning-balance.types").AnimalStock | null>;
|
|
29
|
+
/** Housing-type segments for the A2 table, pre-built to avoid dynamic key access in template. */
|
|
30
|
+
readonly animalStockSegments: import("@angular/core").Signal<{
|
|
31
|
+
label: string;
|
|
32
|
+
data: import("../../core/planning/planning-balance.types").TotalNutrientSet;
|
|
33
|
+
}[]>;
|
|
34
|
+
/** A3 equivalent: manure trading balance per product. */
|
|
35
|
+
readonly manureTradingBalance: import("@angular/core").Signal<import("../../core/planning/planning-balance.types").FarmManureTrading | null>;
|
|
36
|
+
/** A4 equivalent: manure storage totals. */
|
|
37
|
+
readonly storageBalance: import("@angular/core").Signal<import("../../core/planning/planning-balance.types").TotalNutrientSet | null>;
|
|
38
|
+
/** A5 equivalent: field spreading totals for key nutrients. */
|
|
39
|
+
readonly fieldSpreadingBalance: import("@angular/core").Signal<import("../../core/planning/planning-balance.types").TotalNutrientSet | null>;
|
|
40
|
+
readonly requirementPerCultivationCategory: import("@angular/core").Signal<import("../../core/planning/planning-balance.types").NutrientRequirementEntry[]>;
|
|
41
|
+
readonly totalRequirement: import("@angular/core").Signal<NutrientEntry[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Merge area/yield data from fieldCultivation with nutrient requirements so
|
|
44
|
+
* each row has everything needed to display Section C of the PDF report.
|
|
45
|
+
*/
|
|
46
|
+
readonly cropRequirementRows: import("@angular/core").Signal<CropRequirementRow[]>;
|
|
47
|
+
readonly fodderDetail: import("@angular/core").Signal<import("../../core/planning/planning-balance.types").RequiredEffectiveYieldFromFodderCropland | null>;
|
|
48
|
+
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
|
+
/** Human-readable label for a molecular formula symbol. */
|
|
54
|
+
formulaLabel(f: string): string;
|
|
55
|
+
/** Returns CSS modifier class based on the balance percentage value. */
|
|
56
|
+
balancePctClass(pct: number | null): string;
|
|
57
|
+
/** Returns the quantity for a given formula from a nutrient entry list, or 0 if absent. */
|
|
58
|
+
reqValue(requirement: NutrientEntry[], formula: string): number;
|
|
59
|
+
/**
|
|
60
|
+
* Sums entries by formula for the given ordered formula list (kg unit only).
|
|
61
|
+
* Multiple per-product rows with the same formula are aggregated into one.
|
|
62
|
+
*/
|
|
63
|
+
sumNutrients(entries: NutrientEntry[], formulas: readonly string[]): NutrientEntry[];
|
|
64
|
+
/** Summary chips for Sections A1–A5 (Ntot / P₂O₅ / K₂O / Mg). */
|
|
65
|
+
sumStockNutrients(entries: NutrientEntry[]): NutrientEntry[];
|
|
66
|
+
/** Summary chips for Sections C & D (N avail. / P₂O₅ / K₂O / Mg). */
|
|
67
|
+
sumKeyNutrients(entries: NutrientEntry[]): NutrientEntry[];
|
|
68
|
+
runPlanning(): void;
|
|
69
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DEFAULT_SUIBI_METADATA, type SubmissionStatus, type SuibiVersion, type SuibiMetadata } from '../../core/metadata/suibi-metadata.types';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { OnInit } from '@angular/core';
|
|
2
|
+
import { JsonSchema, UISchemaElement } from '@jsonforms/core';
|
|
3
|
+
import { SuibiMetadata } from '../../core/metadata/suibi-metadata.types';
|
|
4
|
+
export declare class WelcomePageComponent implements OnInit {
|
|
5
|
+
private readonly i18n;
|
|
6
|
+
private readonly metadataSvc;
|
|
7
|
+
startEvent: import("@angular/core").OutputEmitterRef<void>;
|
|
8
|
+
metadataChange: import("@angular/core").OutputEmitterRef<SuibiMetadata>;
|
|
9
|
+
private readonly baseSchema;
|
|
10
|
+
private readonly baseUiSchema;
|
|
11
|
+
readonly suibiAjv: import("ajv").Ajv;
|
|
12
|
+
readonly renderers: {
|
|
13
|
+
tester: import("@jsonforms/core").RankedTester;
|
|
14
|
+
renderer: any;
|
|
15
|
+
}[];
|
|
16
|
+
readonly metadata: import("@angular/core").Signal<SuibiMetadata>;
|
|
17
|
+
readonly localizedSchema: import("@angular/core").Signal<JsonSchema>;
|
|
18
|
+
readonly localizedUi: import("@angular/core").Signal<UISchemaElement>;
|
|
19
|
+
readonly jsonFormsData: import("@angular/core").Signal<{}>;
|
|
20
|
+
ngOnInit(): void;
|
|
21
|
+
start(): void;
|
|
22
|
+
onMetadataChange(newValue: unknown): void;
|
|
23
|
+
private normalizeJsonFormsPayload;
|
|
24
|
+
private toMetadata;
|
|
25
|
+
private isSuibiVersion;
|
|
26
|
+
private isSubmissionStatus;
|
|
27
|
+
private isSameMetadata;
|
|
28
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { PageId } from '../../core/navigation/navigation.service';
|
|
2
|
+
/**
|
|
3
|
+
* WorkflowStepperComponent
|
|
4
|
+
* Horizontal navigation stepper for the main data-entry workflow.
|
|
5
|
+
*
|
|
6
|
+
* Design contract:
|
|
7
|
+
* - Uses mat-stepper as a header-only nav bar (step content is empty; content
|
|
8
|
+
* area is hidden via CSS so the stepper acts as a pure navigation indicator).
|
|
9
|
+
* - [selectedIndex] is driven by the currentPage input — no internal routing state.
|
|
10
|
+
* - Navigation is delegated back to App via the onNavigate callback, preserving
|
|
11
|
+
* the custom-element page-attribute reflection.
|
|
12
|
+
* - Error indicators: any page with at least one enriched validation error shows
|
|
13
|
+
* the error ring on its step circle. Requires STEPPER_GLOBAL_OPTIONS { showError: true }.
|
|
14
|
+
* - Non-workflow pages (e.g. data_preview): mat-stepper rejects out-of-bounds selectedIndex,
|
|
15
|
+
* so we clamp to 0; the no-active-step CSS class neutralises the visual active indicator,
|
|
16
|
+
* and onStepperClick delegates clicks for all headers (bypassing the stepper's
|
|
17
|
+
* "no-change" guard that suppresses selectedIndexChange for the currently selected step).
|
|
18
|
+
*
|
|
19
|
+
* Extension points:
|
|
20
|
+
* - Completed state: replace the hardcoded `false` on [completed] with a per-page
|
|
21
|
+
* computed once domain completion rules are defined (e.g. all required fields valid).
|
|
22
|
+
* - New pages: add an entry to WORKFLOW_STEPS and extend PageId.
|
|
23
|
+
*/
|
|
24
|
+
export declare class WorkflowStepperComponent {
|
|
25
|
+
protected readonly steps: readonly {
|
|
26
|
+
readonly pageId: PageId;
|
|
27
|
+
readonly labelKey: string;
|
|
28
|
+
}[];
|
|
29
|
+
/**
|
|
30
|
+
* Current page from the parent. Controls which step circle is highlighted.
|
|
31
|
+
* Non-workflow pages (e.g. data_preview) use index 0 as a valid CDK fallback;
|
|
32
|
+
* the no-active-step CSS class removes the visual active indicator for those pages.
|
|
33
|
+
*/
|
|
34
|
+
readonly currentPage: import("@angular/core").InputSignal<PageId>;
|
|
35
|
+
/**
|
|
36
|
+
* Navigation callback provided by App.
|
|
37
|
+
* Using a callback (instead of an output EventEmitter) matches the existing
|
|
38
|
+
* header-bar pattern and ensures the custom-element page-attribute is reflected.
|
|
39
|
+
*/
|
|
40
|
+
readonly onNavigate: import("@angular/core").InputSignal<(page: PageId) => void>;
|
|
41
|
+
private readonly validationSvc;
|
|
42
|
+
protected readonly pagesWithErrors: import("@angular/core").Signal<Set<PageId>>;
|
|
43
|
+
protected readonly isOnWorkflowPage: import("@angular/core").Signal<boolean>;
|
|
44
|
+
protected readonly clampedStepIndex: import("@angular/core").Signal<number>;
|
|
45
|
+
protected onSelectedIndexChange(index: number): void;
|
|
46
|
+
protected onStepperClick(event: MouseEvent): void;
|
|
47
|
+
private navigateTo;
|
|
48
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import exampleDetail from '../../../../assets/example-data/example-naebi-data.json';
|
|
2
|
+
type SampleEvent = typeof exampleDetail;
|
|
3
|
+
type SampleData = SampleEvent['payload']['data'];
|
|
4
|
+
export type NaebiData = SampleData;
|
|
3
5
|
/**
|
|
4
6
|
* Calculation mode determines which validation rules and features are active.
|
|
5
7
|
*/
|
|
@@ -27,7 +29,7 @@ export declare class NaebiDataService {
|
|
|
27
29
|
hoursPerDay: number;
|
|
28
30
|
};
|
|
29
31
|
stall: {
|
|
30
|
-
stableSystem:
|
|
32
|
+
stableSystem: string;
|
|
31
33
|
stableCapacity: number;
|
|
32
34
|
stableVentilationType: number;
|
|
33
35
|
stableAirPurification: number;
|
|
@@ -99,6 +101,10 @@ export declare class NaebiDataService {
|
|
|
99
101
|
quantity: number;
|
|
100
102
|
typeOfManureRecyclingProduct: string;
|
|
101
103
|
transactionUnit: string;
|
|
104
|
+
manureDerivation: {
|
|
105
|
+
zoologicalAnimal: string;
|
|
106
|
+
percentageAllocation: number;
|
|
107
|
+
}[];
|
|
102
108
|
ingredient: {
|
|
103
109
|
quantity: number;
|
|
104
110
|
molecularFormula: string;
|
|
@@ -113,6 +119,11 @@ export declare class NaebiDataService {
|
|
|
113
119
|
zoologicalAnimal: string;
|
|
114
120
|
percentageAllocation: number;
|
|
115
121
|
}[];
|
|
122
|
+
ingredient: {
|
|
123
|
+
quantity: number;
|
|
124
|
+
molecularFormula: string;
|
|
125
|
+
unit: string;
|
|
126
|
+
}[];
|
|
116
127
|
}[];
|
|
117
128
|
};
|
|
118
129
|
fieldSpreading: {
|
|
@@ -125,14 +136,18 @@ export declare class NaebiDataService {
|
|
|
125
136
|
proportionOfArea: number;
|
|
126
137
|
}[];
|
|
127
138
|
applicationDuringWarmDays: number;
|
|
139
|
+
proportionAppliedSummerMonths: number;
|
|
140
|
+
proportionAppliedOtherMonths: number;
|
|
128
141
|
proportionAppliedAfter6PM: number;
|
|
129
142
|
dragHoseAreaSize: number;
|
|
130
143
|
};
|
|
131
144
|
manure: {
|
|
132
145
|
applicationIncorporationTime: number;
|
|
133
146
|
proportionAppliedSummerMonths: number;
|
|
147
|
+
proportionAppliedOtherMonths: number;
|
|
134
148
|
};
|
|
135
149
|
fertiliser: {
|
|
150
|
+
descriptor: string;
|
|
136
151
|
fertiliserProductCategory: string;
|
|
137
152
|
quantity: number;
|
|
138
153
|
transactionUnit: string;
|
|
@@ -154,8 +169,6 @@ export declare class NaebiDataService {
|
|
|
154
169
|
}[];
|
|
155
170
|
};
|
|
156
171
|
lifetimePerformance: {
|
|
157
|
-
dailyGain: number;
|
|
158
|
-
liveWeight: number;
|
|
159
172
|
milkProductionReport: number;
|
|
160
173
|
};
|
|
161
174
|
fodder: {
|
|
@@ -209,19 +222,26 @@ export declare class NaebiDataService {
|
|
|
209
222
|
userSpecificPlantName: string;
|
|
210
223
|
isMainCrop: boolean;
|
|
211
224
|
areaSize: number;
|
|
212
|
-
yieldPerSquareMeasure: number;
|
|
213
225
|
}[];
|
|
214
226
|
};
|
|
215
227
|
generateReport: boolean;
|
|
216
228
|
};
|
|
229
|
+
calculationVersion: {
|
|
230
|
+
version: string;
|
|
231
|
+
};
|
|
217
232
|
}>;
|
|
233
|
+
private readonly _lastEmitted;
|
|
234
|
+
private readonly _dirty;
|
|
235
|
+
readonly dirty: import("@angular/core").Signal<boolean>;
|
|
218
236
|
private readonly _calculationMode;
|
|
219
237
|
readonly calculationMode: import("@angular/core").Signal<CalculationMode>;
|
|
220
238
|
/**
|
|
221
239
|
* Set new data value; accepts plain object (already parsed) matching NaebiData shape.
|
|
222
|
-
* Silent no-op if value is structurally equal
|
|
240
|
+
* Silent no-op if value is structurally equal after normalization to avoid unnecessary updates.
|
|
223
241
|
*/
|
|
224
242
|
setData(value: NaebiData): void;
|
|
243
|
+
/** Mark current data as saved (clears dirty state and updates snapshot). */
|
|
244
|
+
markSaved(): void;
|
|
225
245
|
/**
|
|
226
246
|
* Set calculation mode (SuiBi or ExBi).
|
|
227
247
|
* Can affect which validation rules are active or which features are enabled.
|
|
@@ -230,3 +250,4 @@ export declare class NaebiDataService {
|
|
|
230
250
|
/** Reset to bundled example */
|
|
231
251
|
reset(): void;
|
|
232
252
|
}
|
|
253
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SuibiDataEventDetail, SuibiDataEventMetadata } from './suibi-data-event';
|
|
2
|
+
/**
|
|
3
|
+
* Centralizes construction + dispatch of the `suibi-data-emitted` payload so multiple UI entry points can reuse it.
|
|
4
|
+
*/
|
|
5
|
+
export declare class SuibiDataEmitterService {
|
|
6
|
+
private readonly i18n;
|
|
7
|
+
private readonly validation;
|
|
8
|
+
private readonly metadataSvc;
|
|
9
|
+
private readonly naebi;
|
|
10
|
+
buildMetadata(): SuibiDataEventMetadata;
|
|
11
|
+
buildDetail(): SuibiDataEventDetail;
|
|
12
|
+
emitFrom(target: HTMLElement): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Locale } from '../i18n/i18n.service';
|
|
2
|
+
import { NaebiData } from '../data/naebi-data.service';
|
|
3
|
+
import { SuibiMetadata } from '../metadata/suibi-metadata.types';
|
|
4
|
+
/**
|
|
5
|
+
* Increment when the payload contract changes in a backwards-incompatible way.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SUIBI_DATA_EVENT_VERSION = "suibi-data.v1";
|
|
8
|
+
/** Detail object emitted with the `suibi-data` CustomEvent. */
|
|
9
|
+
export interface SuibiDataEventDetail {
|
|
10
|
+
version: typeof SUIBI_DATA_EVENT_VERSION;
|
|
11
|
+
payload: SuibiDataEventPayload;
|
|
12
|
+
}
|
|
13
|
+
/** Top-level payload structure delivered to host applications. */
|
|
14
|
+
export interface SuibiDataEventPayload {
|
|
15
|
+
metadata: SuibiDataEventMetadata;
|
|
16
|
+
data: NaebiData;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Metadata describing the dataset at the moment of emission so hosts can audit and reason about it.
|
|
20
|
+
*/
|
|
21
|
+
export type SuibiDataEventMetadata = SuibiMetadata & {
|
|
22
|
+
emittedAt: string;
|
|
23
|
+
locale: Locale;
|
|
24
|
+
isValid: boolean;
|
|
25
|
+
errorCount: number;
|
|
26
|
+
};
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { Locale } from '../i18n/i18n.service';
|
|
2
|
-
|
|
2
|
+
/** The property name of the primary key in a master-data catalog entry. */
|
|
3
|
+
type MasterDataKeyField = string;
|
|
4
|
+
interface MasterDataCatalog {
|
|
5
|
+
entries: any[];
|
|
6
|
+
/** Property name to use as the lookup key; 'id' entries are coerced to Number. */
|
|
7
|
+
key: MasterDataKeyField;
|
|
8
|
+
}
|
|
9
|
+
declare const MASTER_DATA: Record<string, MasterDataCatalog>;
|
|
3
10
|
export type MasterDataKind = keyof typeof MASTER_DATA;
|
|
4
11
|
export declare class MasterDataService {
|
|
5
12
|
private readonly i18n;
|
|
@@ -14,5 +21,10 @@ export declare class MasterDataService {
|
|
|
14
21
|
designation(kind: MasterDataKind, id: number | string | null | undefined, locale?: Locale): string;
|
|
15
22
|
resolveAnimalCategory(id: number | string | null | undefined, locale?: Locale): string;
|
|
16
23
|
resolveUtilisation(id: number | string | null | undefined, locale?: Locale): string;
|
|
24
|
+
resolveManureProduct(code: string | null | undefined, locale?: Locale): string;
|
|
25
|
+
resolveZoologicalAnimal(code: string | null | undefined, locale?: Locale): string;
|
|
26
|
+
resolveCultivationCategory(code: string | null | undefined, locale?: Locale): string;
|
|
27
|
+
resolveAgronomicCropCategory(code: string | null | undefined, locale?: Locale): string;
|
|
28
|
+
resolveFeedstuffProduct(code: string | null | undefined, locale?: Locale): string;
|
|
17
29
|
}
|
|
18
30
|
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type SuibiVersion = '1.19' | '1.20';
|
|
2
|
+
export type SubmissionStatus = 'draft' | 'submitted' | 'final';
|
|
3
|
+
export interface SuibiMetadata {
|
|
4
|
+
title: string;
|
|
5
|
+
suibiVersion: SuibiVersion;
|
|
6
|
+
status: SubmissionStatus;
|
|
7
|
+
}
|
|
8
|
+
export declare const DEFAULT_SUIBI_METADATA: SuibiMetadata;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export type PageId = 'welcome' | 'animal_stock' | 'data_preview' | 'storage' | 'field_spreading' | 'farm_manure_trading';
|
|
2
2
|
export type AnimalStockCategory = 'base' | 'formOfDetention' | 'feeding';
|
|
3
|
+
export type FarmManureTradingMode = 'supply' | 'dispense';
|
|
4
|
+
export type FarmManureTradingCategory = 'general' | 'derivation' | 'ingredients';
|
|
5
|
+
export type FieldSpreadingCategory = 'general' | 'fertiliser' | 'recycling';
|
|
3
6
|
/**
|
|
4
7
|
* NavigationService
|
|
5
8
|
* Global reactive store for application routing and deep-link state.
|
|
@@ -21,8 +24,20 @@ export declare class NavigationService {
|
|
|
21
24
|
readonly currentPage: import("@angular/core").WritableSignal<PageId>;
|
|
22
25
|
/** Selected animal stock entry index (null = list view) */
|
|
23
26
|
readonly selectedAnimalStockIndex: import("@angular/core").WritableSignal<number | null>;
|
|
24
|
-
/**
|
|
25
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Generic category (tab) selection: stores current page + selected category key.
|
|
29
|
+
* Used by categorization renderer for programmatic tab control.
|
|
30
|
+
* Format: { page: PageId, category: string }
|
|
31
|
+
*/
|
|
32
|
+
readonly selectedCategory: import("@angular/core").WritableSignal<{
|
|
33
|
+
page: PageId;
|
|
34
|
+
category: string;
|
|
35
|
+
}>;
|
|
36
|
+
/** Selected farm manure trading detail context (mode + index) */
|
|
37
|
+
readonly selectedFarmManureTrading: import("@angular/core").WritableSignal<{
|
|
38
|
+
mode: FarmManureTradingMode;
|
|
39
|
+
index: number;
|
|
40
|
+
} | null>;
|
|
26
41
|
/** True if currently viewing animal stock detail (not list) */
|
|
27
42
|
readonly isAnimalStockDetailView: import("@angular/core").Signal<boolean>;
|
|
28
43
|
/** True if currently on animal stock page (list or detail) */
|
|
@@ -41,10 +56,16 @@ export declare class NavigationService {
|
|
|
41
56
|
* Used by validation error navigation and internal routing.
|
|
42
57
|
*/
|
|
43
58
|
navigateToAnimalStockDetail(index: number, category?: AnimalStockCategory): void;
|
|
59
|
+
navigateToFarmManureTradingDetail(mode: FarmManureTradingMode, index: number, category?: FarmManureTradingCategory): void;
|
|
60
|
+
navigateToFarmManureTradingList(): void;
|
|
61
|
+
navigateToFieldSpreading(category?: FieldSpreadingCategory): void;
|
|
44
62
|
/**
|
|
45
|
-
* Set active category/tab
|
|
63
|
+
* Set active category/tab for current page (without changing page/entry).
|
|
64
|
+
* Generic method supporting any page's categorization navigation.
|
|
65
|
+
* No-op when page and category are already the same values to prevent
|
|
66
|
+
* unnecessary signal emissions that re-trigger the tab index computed.
|
|
46
67
|
*/
|
|
47
|
-
|
|
68
|
+
setCategory(page: PageId, category: string): void;
|
|
48
69
|
/**
|
|
49
70
|
* Reset page-specific context when navigating away.
|
|
50
71
|
* Prevents stale state (e.g., old selected index) from affecting new page.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { NaebiData } from '../data/naebi-data.service';
|
|
2
|
+
import type { PlanningBalanceResponse } from './planning-balance.types';
|
|
3
|
+
export type { PlanningBalanceResponse } from './planning-balance.types';
|
|
4
|
+
/** Which backend to target for planning requests. */
|
|
5
|
+
export type PlanningEndpoint = 'ebilanz' | 'blw';
|
|
6
|
+
/**
|
|
7
|
+
* Sends NAEBI data to a planning endpoint and exposes the result as a
|
|
8
|
+
* signal-based resource. Call `runPlanning(data, endpoint)` to trigger a request.
|
|
9
|
+
*
|
|
10
|
+
* The ID counter ensures each call re-fetches even if the payload hasn't changed.
|
|
11
|
+
*/
|
|
12
|
+
export declare class PlanningBalanceService {
|
|
13
|
+
private readonly _trigger;
|
|
14
|
+
private _nextId;
|
|
15
|
+
readonly planningResource: import("@angular/common/http").HttpResourceRef<PlanningBalanceResponse | undefined>;
|
|
16
|
+
/** Fire a new planning-balance request with the current NAEBI data payload. */
|
|
17
|
+
runPlanning(data: NaebiData, endpoint: PlanningEndpoint): void;
|
|
18
|
+
}
|