@agridea/suibi-module 0.1.0-preview.8 → 0.1.0-preview.82d9ee0

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 (121) hide show
  1. package/README.md +10 -10
  2. package/dist/elements/browser/main.js +75 -64
  3. package/dist/elements/browser/styles.css +1 -1
  4. package/dist/elements/browser/suibi-module-latest.css +1 -1
  5. package/dist/elements/browser/suibi-module-latest.js +75 -64
  6. package/dist/elements/browser/{suibi-module.v0.1.0-preview.8.css → suibi-module.v0.1.0-preview.82d9ee0.css} +1 -1
  7. package/dist/elements/browser/suibi-module.v0.1.0-preview.82d9ee0.js +78 -0
  8. package/dist/elements/browser/suibi-theme-dark.css +1 -1
  9. package/dist/elements/browser/version.txt +1 -1
  10. package/dist/elements/browser/wc-global-utilities.css +1 -0
  11. package/dist/types/app/app.d.ts +14 -6
  12. package/dist/types/app/components/add-dashed-button/add-dashed-button.component.d.ts +9 -0
  13. package/dist/types/app/components/data-preview/data-preview.component.d.ts +233 -0
  14. package/dist/types/app/components/empty-state/empty-state.component.d.ts +12 -0
  15. package/dist/types/app/components/gauge-arc/gauge-arc.component.d.ts +49 -0
  16. package/dist/types/app/components/header-bar/header-bar.component.d.ts +14 -0
  17. package/dist/types/app/components/inline-table/inline-table.component.d.ts +159 -0
  18. package/dist/types/app/components/inline-table/inline-table.types.d.ts +212 -0
  19. package/dist/types/app/components/module-placeholder-page/module-placeholder-page.component.d.ts +6 -0
  20. package/dist/types/app/components/planning-result/planning-result.component.d.ts +46 -0
  21. package/dist/types/app/components/planning-result-row/planning-result-row.component.d.ts +34 -0
  22. package/dist/types/app/components/planning-trigger/planning-trigger.component.d.ts +13 -0
  23. package/dist/types/app/components/results-page/results-page.component.d.ts +13 -0
  24. package/dist/types/app/components/suissebilanz-dashboard/suissebilanz-dashboard.component.d.ts +32 -0
  25. package/dist/types/app/components/suissebilanz-dashboard/suissebilanz-metrics.service.d.ts +21 -0
  26. package/dist/types/app/components/suissebilanz-minibar/suissebilanz-minibar.component.d.ts +19 -0
  27. package/dist/types/app/components/validation-page/validation-page.component.d.ts +18 -0
  28. package/dist/types/app/components/welcome-page/metadata.types.d.ts +1 -0
  29. package/dist/types/app/components/welcome-page/welcome-page.component.d.ts +30 -0
  30. package/dist/types/app/components/workflow-stepper/workflow-stepper.component.d.ts +49 -0
  31. package/dist/types/app/core/data/naebi-data.service.d.ts +52 -31
  32. package/dist/types/app/core/error/global-error-handler.d.ts +5 -0
  33. package/dist/types/app/core/events/suibi-data-emitter.service.d.ts +13 -0
  34. package/dist/types/app/core/events/suibi-data-event.d.ts +26 -0
  35. package/dist/types/app/core/i18n/i18n.service.d.ts +5 -3
  36. package/dist/types/app/core/i18n/locales/fr.d.ts +2 -0
  37. package/dist/types/app/core/i18n/locales/it.d.ts +2 -0
  38. package/dist/types/app/core/master-data/master-data.service.d.ts +15 -1
  39. package/dist/types/app/core/metadata/suibi-metadata.service.d.ts +6 -0
  40. package/dist/types/app/core/metadata/suibi-metadata.types.d.ts +18 -0
  41. package/dist/types/app/core/navigation/navigation.service.d.ts +59 -5
  42. package/dist/types/app/core/planning/planning-balance.service.d.ts +46 -0
  43. package/dist/types/app/core/planning/planning-balance.types.d.ts +206 -0
  44. package/dist/types/app/core/planning/planning-balance.utils.d.ts +10 -0
  45. package/dist/types/app/core/schemas/schema-localization.util.d.ts +18 -0
  46. package/dist/types/app/core/telemetry/telemetry.service.d.ts +12 -0
  47. package/dist/types/app/core/utils/custom-unit.util.d.ts +39 -0
  48. package/dist/types/app/core/utils/object.util.d.ts +46 -0
  49. package/dist/types/app/core/validation/ajv-custom.d.ts +1 -0
  50. package/dist/types/app/core/validation/capabilities.d.ts +11 -5
  51. package/dist/types/app/core/validation/global-validation.service.d.ts +33 -4
  52. package/dist/types/app/jsonforms/filters/code-list-filter-resolvers.d.ts +3 -0
  53. package/dist/types/app/jsonforms/registry/renderers.registry.d.ts +12 -0
  54. package/dist/types/app/jsonforms/renderers/controls/selects/animal-category/animal-category-select.renderer.d.ts +1 -1
  55. package/dist/types/app/jsonforms/renderers/controls/selects/code-list/code-list-select.renderer.d.ts +16 -2
  56. package/dist/types/app/jsonforms/renderers/layout/array/array-layout.renderer.d.ts +43 -0
  57. package/dist/types/app/jsonforms/renderers/layout/categorization/selected-category-categorization.renderer.d.ts +34 -0
  58. package/dist/types/app/jsonforms/renderers/layout/constraint/constraint-layout.renderer.d.ts +1 -0
  59. package/dist/types/app/jsonforms/renderers/layout/group/base-group.renderer.d.ts +2 -0
  60. package/dist/types/app/jsonforms/renderers/layout/group/module-toggle-group.renderer.d.ts +38 -0
  61. package/dist/types/app/nutrient-cycle/animal-stock/animal-stock-detail/animal-stock-detail.component.d.ts +21 -0
  62. package/dist/types/app/{animal-stock → nutrient-cycle/animal-stock/animal-stock-list}/animal-stock-list.component.d.ts +6 -9
  63. package/dist/types/app/{animal-stock → nutrient-cycle/animal-stock/animal-stock-master-detail}/animal-stock-master-detail.component.d.ts +5 -2
  64. package/dist/types/app/{animal-stock → nutrient-cycle/animal-stock}/animal-stock.types.d.ts +6 -6
  65. package/dist/types/app/nutrient-cycle/animal-stock/index.d.ts +4 -0
  66. package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading-master-detail/farm-manure-trading-master-detail.component.d.ts +19 -0
  67. package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading-table/farm-manure-trading-table.component.d.ts +37 -0
  68. package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading-table/farm-manure-trading-table.config.d.ts +24 -0
  69. package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading.types.d.ts +31 -0
  70. package/dist/types/app/nutrient-cycle/farm-manure-trading/index.d.ts +4 -0
  71. package/dist/types/app/nutrient-cycle/farm-manure-trading/transaction-unit.util.d.ts +3 -0
  72. package/dist/types/app/nutrient-cycle/field-cultivation/arable-land-table/arable-land-table.component.d.ts +23 -0
  73. package/dist/types/app/nutrient-cycle/field-cultivation/arable-land-table/arable-land-table.config.d.ts +16 -0
  74. package/dist/types/app/nutrient-cycle/field-cultivation/crop-harvest-table/crop-harvest-table.component.d.ts +21 -0
  75. package/dist/types/app/nutrient-cycle/field-cultivation/crop-harvest-table/crop-harvest-table.config.d.ts +13 -0
  76. package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation-detail/field-cultivation-detail.component.d.ts +22 -0
  77. package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation-general/field-cultivation-general.component.d.ts +20 -0
  78. package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation-list/field-cultivation-list.component.d.ts +17 -0
  79. package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation-master-detail/field-cultivation-master-detail.component.d.ts +29 -0
  80. package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation.types.d.ts +45 -0
  81. package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation.util.d.ts +10 -0
  82. package/dist/types/app/nutrient-cycle/field-cultivation/fodder-cropland-table/fodder-cropland-table.component.d.ts +29 -0
  83. package/dist/types/app/nutrient-cycle/field-cultivation/fodder-cropland-table/fodder-cropland-table.config.d.ts +21 -0
  84. package/dist/types/app/nutrient-cycle/field-cultivation/index.d.ts +9 -0
  85. package/dist/types/app/nutrient-cycle/field-cultivation/special-crops-table/special-crops-table.component.d.ts +29 -0
  86. package/dist/types/app/nutrient-cycle/field-cultivation/special-crops-table/special-crops-table.config.d.ts +54 -0
  87. package/dist/types/app/nutrient-cycle/field-spreading/fertiliser-table/fertiliser-table.component.d.ts +52 -0
  88. package/dist/types/app/nutrient-cycle/field-spreading/fertiliser-table/fertiliser-table.config.d.ts +20 -0
  89. package/dist/types/app/nutrient-cycle/field-spreading/field-spreading.component.d.ts +36 -0
  90. package/dist/types/app/nutrient-cycle/field-spreading/field-spreading.types.d.ts +44 -0
  91. package/dist/types/app/nutrient-cycle/field-spreading/index.d.ts +2 -0
  92. package/dist/types/app/nutrient-cycle/field-spreading/ingredient.util.d.ts +8 -0
  93. package/dist/types/app/nutrient-cycle/field-spreading/recycling-table/recycling-table.component.d.ts +32 -0
  94. package/dist/types/app/nutrient-cycle/field-spreading/recycling-table/recycling-table.config.d.ts +17 -0
  95. package/dist/types/app/nutrient-cycle/field-spreading/recycling-table/recycling-transaction-unit.util.d.ts +4 -0
  96. package/dist/types/app/nutrient-cycle/fodder/fodder-master-detail/fodder-master-detail.component.d.ts +25 -0
  97. package/dist/types/app/nutrient-cycle/fodder/fodder-table/fodder-table.component.d.ts +28 -0
  98. package/dist/types/app/nutrient-cycle/fodder/fodder-table/fodder-table.config.d.ts +9 -0
  99. package/dist/types/app/nutrient-cycle/fodder/fodder.types.d.ts +34 -0
  100. package/dist/types/app/nutrient-cycle/fodder/index.d.ts +3 -0
  101. package/dist/types/app/nutrient-cycle/fodder/ingredient.util.d.ts +8 -0
  102. package/dist/types/app/nutrient-cycle/fodder/transaction-unit.util.d.ts +2 -0
  103. package/dist/types/app/nutrient-cycle/lifetime-performance/index.d.ts +2 -0
  104. package/dist/types/app/nutrient-cycle/lifetime-performance/lifetime-performance-form.component.d.ts +27 -0
  105. package/dist/types/app/nutrient-cycle/lifetime-performance/lifetime-performance.types.d.ts +5 -0
  106. package/dist/types/app/nutrient-cycle/storage/index.d.ts +4 -0
  107. package/dist/types/app/nutrient-cycle/storage/storage-detail/storage-detail.component.d.ts +30 -0
  108. package/dist/types/app/nutrient-cycle/storage/storage-general/storage-general.component.d.ts +29 -0
  109. package/dist/types/app/nutrient-cycle/storage/storage-list/storage-list.component.d.ts +23 -0
  110. package/dist/types/app/nutrient-cycle/storage/storage-master-detail/storage-master-detail.component.d.ts +32 -0
  111. package/dist/types/app/nutrient-cycle/storage/storage.types.d.ts +40 -0
  112. package/dist/types/environments/environment.d.ts +11 -0
  113. package/dist/types/public-api.d.ts +2 -0
  114. package/dist/types/shared/material-icons.d.ts +3 -3
  115. package/package.json +69 -17
  116. package/dist/elements/browser/suibi-module.v0.1.0-preview.8.js +0 -67
  117. package/dist/types/app/animal-stock/animal-stock-detail.component.d.ts +0 -22
  118. package/dist/types/app/data-preview.d.ts +0 -7
  119. package/dist/types/app/header-bar.d.ts +0 -19
  120. package/dist/types/app/welcome-page.d.ts +0 -4
  121. /package/dist/types/app/{core/validation/validation-errors-panel.d.ts → components/validation-errors-panel/validation-errors-panel.component.d.ts} +0 -0
@@ -1 +1 @@
1
- :host,suibi-module{color-scheme:dark;--mat-sys-background: #121410;--mat-sys-error: #ffb4ab;--mat-sys-error-container: #93000a;--mat-sys-inverse-on-surface: #2f312d;--mat-sys-inverse-primary: #e722ff;--mat-sys-inverse-surface: #e2e3dc;--mat-sys-on-background: #e2e3dc;--mat-sys-on-error: #690005;--mat-sys-on-error-container: #ffdad6;--mat-sys-on-primary: #013a00;--mat-sys-on-primary-container: #77ff61;--mat-sys-on-primary-fixed: #002200;--mat-sys-on-primary-fixed-variant: #015300;--mat-sys-on-secondary: #263422;--mat-sys-on-secondary-container: #d7e8cd;--mat-sys-on-secondary-fixed: #121f0e;--mat-sys-on-secondary-fixed-variant: #3c4b37;--mat-sys-on-surface: #e2e3dc;--mat-sys-on-surface-variant: #dfe4d7;--mat-sys-on-tertiary: #013a00;--mat-sys-on-tertiary-container: #77ff61;--mat-sys-on-tertiary-fixed: #002200;--mat-sys-on-tertiary-fixed-variant: #015300;--mat-sys-outline: #8d9387;--mat-sys-outline-variant: #43483f;--mat-sys-primary: #02e600;--mat-sys-primary-container: #015300;--mat-sys-primary-fixed: #77ff61;--mat-sys-primary-fixed-dim: #02e600;--mat-sys-scrim: #000000;--mat-sys-secondary: #bbcbb2;--mat-sys-secondary-container: #3c4b37;--mat-sys-secondary-fixed: #d7e8cd;--mat-sys-secondary-fixed-dim: #bbcbb2;--mat-sys-shadow: #000000;--mat-sys-surface: #121410;--mat-sys-surface-bright: #383a35;--mat-sys-surface-container: #1e201c;--mat-sys-surface-container-high: #282b26;--mat-sys-surface-container-highest: #333531;--mat-sys-surface-container-low: #1a1c18;--mat-sys-surface-container-lowest: #0c0f0b;--mat-sys-surface-dim: #121410;--mat-sys-surface-tint: #02e600;--mat-sys-surface-variant: #43483f;--mat-sys-tertiary: #02e600;--mat-sys-tertiary-container: #015300;--mat-sys-tertiary-fixed: #77ff61;--mat-sys-tertiary-fixed-dim: #02e600;--mat-sys-neutral-variant20: #2c3229;--mat-sys-neutral10: #1a1c18;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 300 1rem / 1.5rem Serif;--mat-sys-body-large-font: Serif;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 300;--mat-sys-body-medium: 300 .875rem / 1.25rem Serif;--mat-sys-body-medium-font: Serif;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 300;--mat-sys-body-small: 300 .75rem / 1rem Serif;--mat-sys-body-small-font: Serif;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 300;--mat-sys-display-large: 300 3.562rem / 4rem Serif;--mat-sys-display-large-font: Serif;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 300;--mat-sys-display-medium: 300 2.812rem / 3.25rem Serif;--mat-sys-display-medium-font: Serif;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 300;--mat-sys-display-small: 300 2.25rem / 2.75rem Serif;--mat-sys-display-small-font: Serif;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 300;--mat-sys-headline-large: 300 2rem / 2.5rem Serif;--mat-sys-headline-large-font: Serif;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 300;--mat-sys-headline-medium: 300 1.75rem / 2.25rem Serif;--mat-sys-headline-medium-font: Serif;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 300;--mat-sys-headline-small: 300 1.5rem / 2rem Serif;--mat-sys-headline-small-font: Serif;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 300;--mat-sys-label-large: 600 .875rem / 1.25rem Serif;--mat-sys-label-large-font: Serif;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 600;--mat-sys-label-large-weight-prominent: 800;--mat-sys-label-medium: 600 .75rem / 1rem Serif;--mat-sys-label-medium-font: Serif;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 600;--mat-sys-label-medium-weight-prominent: 800;--mat-sys-label-small: 600 .688rem / 1rem Serif;--mat-sys-label-small-font: Serif;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 600;--mat-sys-title-large: 300 1.375rem / 1.75rem Serif;--mat-sys-title-large-font: Serif;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 300;--mat-sys-title-medium: 600 1rem / 1.5rem Serif;--mat-sys-title-medium-font: Serif;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 600;--mat-sys-title-small: 600 .875rem / 1.25rem Serif;--mat-sys-title-small-font: Serif;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 600;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;--mat-sys-surface: #121212;--mat-form-field-filled-container-color: #2a2a2a;--mat-card-elevated-container-color: #1e1e1e;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}.group-layout.mat-mdc-card-outlined{border:0;--mdc-outlined-card-outline-color: transparent;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f;border-radius:8px}.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.8 c276491
1
+ 0.1.0-preview.82d9ee0 82d9ee0
@@ -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}.mat-mdc-option.mdc-list-item{height:auto;min-height:48px}.mat-mdc-option .mdc-list-item__primary-text{white-space:normal;overflow:visible;text-overflow:clip;line-height:1.35}
@@ -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
- localeInput: import("@angular/core").InputSignal<Locale>;
7
+ private readonly autosaveIntervalMs;
8
+ locale: import("@angular/core").InputSignal<Locale>;
7
9
  themeSrc: import("@angular/core").InputSignal<string | null>;
8
- pageInput: import("@angular/core").InputSignal<PageId>;
9
- naebiDataInput: import("@angular/core").InputSignal<any>;
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 locale: import("@angular/core").Signal<Locale>;
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,233 @@
1
+ import { NaebiDataService } from '../../core/data/naebi-data.service';
2
+ import { PlanningBalanceService } from '../../core/planning/planning-balance.service';
3
+ export declare class DataPreviewComponent {
4
+ private readonly host;
5
+ private readonly emitter;
6
+ private readonly clipboard;
7
+ readonly planning: PlanningBalanceService;
8
+ readonly naebi: NaebiDataService;
9
+ readonly metadataPreview: import("@angular/core").Signal<import("../../../public-api").SuibiDataEventMetadata>;
10
+ /** Exact payload that runPlanning will POST (same builder as the real request). */
11
+ readonly apiPayload: import("@angular/core").Signal<{
12
+ nutrientCycle: {
13
+ animalStock: {
14
+ order: string;
15
+ animalCategoryPRIF: number;
16
+ selfReportedLivestock: {
17
+ averageQuantity: number;
18
+ };
19
+ durationCorrectionQuantity: number;
20
+ durationCorrectionDays: number;
21
+ utilisation: number;
22
+ formOfDetention: {
23
+ hasGrazing: boolean;
24
+ pasture: {
25
+ days: number;
26
+ hoursPerDay: number;
27
+ };
28
+ stall: {
29
+ stableSystem: string;
30
+ stableVentilationType: number;
31
+ hasStableDeepLitter: boolean;
32
+ hasStableManureBeltDrying: boolean;
33
+ stableManureRemovalFrequency: number;
34
+ stableWaterSupply: number;
35
+ hasStableManureAndSlurryProduction: boolean;
36
+ hasStableFeedingStationElevated: boolean;
37
+ hasStableFloorSlopedUrineDrainage: boolean;
38
+ hasYard: boolean;
39
+ };
40
+ };
41
+ hasImpexDerivedExcretion: boolean;
42
+ hasLinearCorrectionDerivedExcretion: boolean;
43
+ feeding: {
44
+ fodderConsumption: number;
45
+ concentratedFeedstuffConsumption: number;
46
+ concentratedFeedStuffConsumption: number;
47
+ winterFeeding: {
48
+ feedingRoutine: {
49
+ typeOfFeedstuffProduct: string;
50
+ transactionUnit: string;
51
+ quantity: number;
52
+ }[];
53
+ dailyConcentratedFeedstuff: {
54
+ quantity: number;
55
+ };
56
+ };
57
+ summerFeeding: {
58
+ feedingRoutine: {
59
+ typeOfFeedstuffProduct: string;
60
+ transactionUnit: string;
61
+ quantity: number;
62
+ }[];
63
+ dailyConcentratedFeedstuff: {
64
+ quantity: number;
65
+ };
66
+ };
67
+ };
68
+ }[];
69
+ storage: {
70
+ stableStrawLitter: number;
71
+ slurrySupplyProportionStored: number;
72
+ createFacilitySpecificManureProduct: boolean;
73
+ createFacilitySpecificSlurryProduct: boolean;
74
+ slurryTankQuantity: number;
75
+ dilutionRatio: number;
76
+ manurePit: never[];
77
+ slurryTank: {
78
+ descriptor: string;
79
+ volumeInM3: number;
80
+ depthInM: number;
81
+ cover: number;
82
+ mixingFrequency: number;
83
+ manureDerivation: string[];
84
+ }[];
85
+ };
86
+ farmManureTrading: {
87
+ supply: never[];
88
+ dispense: {
89
+ quantity: number;
90
+ typeOfManureRecyclingProduct: string;
91
+ transactionUnit: string;
92
+ manureDerivation: {
93
+ zoologicalAnimal: string;
94
+ percentageAllocation: number;
95
+ }[];
96
+ ingredient: {
97
+ quantity: number;
98
+ molecularFormula: string;
99
+ unit: string;
100
+ }[];
101
+ }[];
102
+ };
103
+ fieldSpreading: {
104
+ soilPh: number;
105
+ slurry: {
106
+ quantity: number;
107
+ dilutionRatio: number;
108
+ otherApplicationTechnologies: {
109
+ applicationTechnologyType: number;
110
+ proportionOfArea: number;
111
+ }[];
112
+ applicationDuringWarmDays: number;
113
+ proportionAppliedSummerMonths: number;
114
+ proportionAppliedOtherMonths: number;
115
+ proportionAppliedAfter6PM: number;
116
+ dragHoseAreaSize: number;
117
+ };
118
+ manure: {
119
+ applicationIncorporationTime: number;
120
+ proportionAppliedSummerMonths: number;
121
+ proportionAppliedOtherMonths: number;
122
+ };
123
+ fertiliser: {
124
+ descriptor: string;
125
+ fertiliserProductCategory: string;
126
+ quantity: number;
127
+ transactionUnit: string;
128
+ ingredient: {
129
+ molecularFormula: string;
130
+ quantity: number;
131
+ unit: string;
132
+ }[];
133
+ }[];
134
+ recycling: {
135
+ typeOfManureRecyclingProduct: string;
136
+ quantity: number;
137
+ transactionUnit: string;
138
+ ingredient: {
139
+ molecularFormula: string;
140
+ quantity: number;
141
+ unit: string;
142
+ }[];
143
+ }[];
144
+ };
145
+ lifetimePerformance: {
146
+ milkProductionReport: number;
147
+ };
148
+ fodder: {
149
+ trading: {
150
+ supply: {
151
+ typeOfFeedstuffProduct: string;
152
+ quantity: number;
153
+ transactionUnit: string;
154
+ ingredient: {
155
+ quantity: number;
156
+ molecularFormula: string;
157
+ unit: string;
158
+ }[];
159
+ }[];
160
+ dispense: {
161
+ typeOfFeedstuffProduct: string;
162
+ quantity: number;
163
+ transactionUnit: string;
164
+ ingredient: never[];
165
+ }[];
166
+ };
167
+ cropFromNonFodderCropland: {
168
+ typeOfFeedstuffProduct: string;
169
+ quantity: number;
170
+ transactionUnit: string;
171
+ ingredient: {
172
+ quantity: number;
173
+ molecularFormula: string;
174
+ unit: string;
175
+ }[];
176
+ }[];
177
+ proportionStorageLoss: number;
178
+ totalBalanceErrorMargin: number;
179
+ };
180
+ fieldCultivation: {
181
+ buildingZoneAreaSize: number;
182
+ outdoorVegetableMainCropAreaSize: number;
183
+ indoorVegetableMainCropAreaSize: number;
184
+ feedingOfCropHarvest: {
185
+ agronomicCropCategory: string;
186
+ effectiveYield: number;
187
+ }[];
188
+ dispenseOfCropHarvest: {
189
+ agronomicCropCategory: string;
190
+ effectiveYield: number;
191
+ }[];
192
+ fodderCropland: ({
193
+ agronomicCropCategory: string;
194
+ isMainCrop: boolean;
195
+ areaSize: number;
196
+ calculateYieldThroughFodderBalance: boolean;
197
+ yieldPerSquareMeasure?: undefined;
198
+ } | {
199
+ agronomicCropCategory: string;
200
+ isMainCrop: boolean;
201
+ areaSize: number;
202
+ yieldPerSquareMeasure: number;
203
+ calculateYieldThroughFodderBalance?: undefined;
204
+ })[];
205
+ arableLand: {
206
+ agronomicCropCategory: string;
207
+ isMainCrop: boolean;
208
+ areaSize: number;
209
+ yieldPerSquareMeasure: number;
210
+ hasLongTermYieldDivergence: boolean;
211
+ }[];
212
+ special: {
213
+ agronomicCropCategory: string;
214
+ userSpecificPlantName: string;
215
+ isMainCrop: boolean;
216
+ areaSize: number;
217
+ requirementCorrection: {
218
+ quantity: number;
219
+ molecularFormula: string;
220
+ unit: string;
221
+ }[];
222
+ }[];
223
+ };
224
+ generateReport: boolean;
225
+ };
226
+ calculationVersion: {
227
+ version: string;
228
+ };
229
+ }>;
230
+ setPlanningEndpoint(value: string | null): void;
231
+ emitData(): void;
232
+ copyJson(getValue: () => unknown): void;
233
+ }
@@ -0,0 +1,12 @@
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
+ fontSet: import("@angular/core").InputSignal<string>;
8
+ icon: import("@angular/core").InputSignal<string>;
9
+ primaryText: import("@angular/core").InputSignal<string>;
10
+ /** Optional hint displayed below the primary message. */
11
+ secondaryText: import("@angular/core").InputSignal<string>;
12
+ }
@@ -0,0 +1,49 @@
1
+ /** Visual status driving arc colour and icon in the gauge. */
2
+ export type GaugeStatus = 'ok' | 'tolerated' | 'over' | 'under' | 'empty';
3
+ /** View-model for a single metric card in the SuisseBilanz dashboard. */
4
+ export interface GaugeMetric {
5
+ /** Stable key used for `@for` tracking (nutrient formula or 'rendement'). */
6
+ key: string;
7
+ /** Short display label — chemical formula or translated metric name. */
8
+ label: string;
9
+ /** Human-readable sub-label (nutrient description). */
10
+ sublabel: string;
11
+ /** Numeric value to display; `null` indicates no result yet. */
12
+ value: number | null;
13
+ /** Unit appended to the value inside the arc (e.g. '%' or ''). */
14
+ unit: string;
15
+ /** Derived status controlling arc colour and badge. */
16
+ status: GaugeStatus;
17
+ /** Upper bound of the gauge arc scale. */
18
+ maxGauge: number;
19
+ /** Short range description shown below the arc (e.g. '< 100 %'). */
20
+ rangeLabel: string;
21
+ /** Raw quantity in kg (nutrients) or dt/ha (rendement) to display below the arc. */
22
+ kgValue?: number | null;
23
+ }
24
+ /**
25
+ * Reusable semicircular SVG arc gauge.
26
+ *
27
+ * Renders a 180° arc gauge using pure inline SVG — no third-party library.
28
+ * All geometry is derived via `computed()` signals so the component is
29
+ * fully zoneless-safe and works without Zone.js triggers.
30
+ *
31
+ * The arc uses `pathLength="1"` so `stroke-dasharray` fractions map
32
+ * directly to 0–1 without floating-point arc-length estimation.
33
+ */
34
+ export declare class GaugeArcComponent {
35
+ readonly value: import("@angular/core").InputSignal<number>;
36
+ readonly max: import("@angular/core").InputSignal<number>;
37
+ readonly status: import("@angular/core").InputSignal<GaugeStatus>;
38
+ protected readonly pct: import("@angular/core").Signal<number>;
39
+ protected readonly dashArray: import("@angular/core").Signal<string>;
40
+ protected readonly tickCoords: import("@angular/core").Signal<{
41
+ x1: number;
42
+ y1: number;
43
+ x2: number;
44
+ y2: number;
45
+ }>;
46
+ protected readonly fillColor: import("@angular/core").Signal<string>;
47
+ protected readonly displayValue: import("@angular/core").Signal<string>;
48
+ protected readonly ariaLabel: import("@angular/core").Signal<string>;
49
+ }
@@ -0,0 +1,14 @@
1
+ import { Locale } from '../../core/i18n/i18n.service';
2
+ import { PageId } from '../../core/navigation/navigation.service';
3
+ /**
4
+ * HeaderBarComponent
5
+ * Footer actions for quick access to data preview and the current save state.
6
+ */
7
+ export declare class HeaderBarComponent {
8
+ locale: import("@angular/core").InputSignal<Locale>;
9
+ currentPage: import("@angular/core").InputSignal<PageId>;
10
+ isDirty: import("@angular/core").InputSignal<boolean>;
11
+ onNavigate: import("@angular/core").InputSignal<(page: PageId) => void>;
12
+ onLocaleChange: import("@angular/core").InputSignal<(locale: Locale) => void>;
13
+ navigate(page: PageId): void;
14
+ }
@@ -0,0 +1,159 @@
1
+ import { MatCheckboxChange } from '@angular/material/checkbox';
2
+ import { BaseCodeListEntry } from '../../jsonforms/shared/option-sources/code-lists';
3
+ import { InlineColumnDef, InlineTableConfig, InlineCellErrorResolver } from './inline-table.types';
4
+ /**
5
+ * InlineTableComponent — generic inline-editable table for array-of-objects data.
6
+ *
7
+ * This component is intentionally domain-agnostic. All column structure, labels,
8
+ * and section text are driven by an `InlineTableConfig` input (the "uischema").
9
+ * Domain-specific side-effects (e.g. auto-populating fields when a dropdown changes)
10
+ * are injected via the optional `rowTransform` function input.
11
+ *
12
+ * ## Usage
13
+ * ```html
14
+ * <app-inline-table
15
+ * [config]="myTableConfig"
16
+ * [rows]="myRows()"
17
+ * [rowTransform]="myTransform"
18
+ * (rowsChange)="onRowsChange($event)"
19
+ * />
20
+ * ```
21
+ *
22
+ * ## Extending for a new domain
23
+ * 1. Create a new `InlineTableConfig` constant (the column config file).
24
+ * 2. Optionally create a thin wrapper component that provides the config and
25
+ * a `rowTransform` arrow-function.
26
+ * 3. No changes to this component are needed.
27
+ */
28
+ export declare class InlineTableComponent {
29
+ private readonly i18n;
30
+ private readonly host;
31
+ constructor();
32
+ /** Table configuration — columns, labels, and the row factory. Acts as the "uischema". */
33
+ readonly config: import("@angular/core").InputSignal<InlineTableConfig>;
34
+ /** Current array of row objects. Each key maps to a column's `key` or sub-array path. */
35
+ readonly rows: import("@angular/core").InputSignal<Record<string, unknown>[]>;
36
+ /**
37
+ * Emitted with the complete updated array after any cell change, row add, or row remove.
38
+ * The parent component is responsible for persisting the new value (e.g. via signal).
39
+ */
40
+ readonly rowsChange: import("@angular/core").OutputEmitterRef<Record<string, unknown>[]>;
41
+ /**
42
+ * Optional business-logic transform applied after every cell edit — before emission.
43
+ *
44
+ * Signature: `(changedKey, newValue, updatedRow, previousRow) => transformedRow`
45
+ *
46
+ * - `changedKey`: the `InlineColumnDef.key` of the edited column.
47
+ * - `newValue`: the raw new value (string, number, or null).
48
+ * - `updatedRow`: the row object already reflecting the edit.
49
+ * - `previousRow`: the row as it was before the edit — needed when the side-effect
50
+ * depends on the replaced value (e.g. converting a quantity on a unit switch).
51
+ * - Return the row (possibly further mutated) that should be stored.
52
+ *
53
+ * Use this for cross-field side-effects such as pre-populating nutrient % columns
54
+ * when a product is selected. For forms without such logic, omit this input.
55
+ */
56
+ readonly rowTransform: import("@angular/core").InputSignal<((changedKey: string, newValue: unknown, row: Record<string, unknown>, previousRow?: Record<string, unknown>) => Record<string, unknown>) | null>;
57
+ /**
58
+ * Optional per-cell validation resolver — returns a translated error message
59
+ * shown under the cell (cell turns red via `mat-form-field-invalid`), or `null`
60
+ * when valid. Inline tables bypass JSONForms/AJV, so business rules that must
61
+ * be visible while typing (e.g. percentage caps) are surfaced through this hook.
62
+ */
63
+ readonly cellError: import("@angular/core").InputSignal<InlineCellErrorResolver | null>;
64
+ /**
65
+ * Index of the row to visually highlight (e.g. after a validation-error deep-link).
66
+ * Also triggers a scrollIntoView so the row is on screen.
67
+ */
68
+ readonly highlightRowIndex: import("@angular/core").InputSignal<number | null>;
69
+ /** Resolves the per-cell error message via the optional `cellError` input (null = valid). */
70
+ errorForCell(row: Record<string, unknown>, col: InlineColumnDef): string | null;
71
+ /** True when any column of the row reports an error — drives the row-level red tint. */
72
+ rowHasError(row: Record<string, unknown>): boolean;
73
+ /** Extracts a px value from a grid-format width string (e.g. 'minmax(120px, 1fr)' → '120px'). */
74
+ colMinWidth(width?: string): string;
75
+ /** Total table width = sum of all column px values + 40px for the delete column. */
76
+ readonly tableWidth: import("@angular/core").Signal<string>;
77
+ /** Grid template columns string for CSS grid layout. */
78
+ readonly gridTemplateColumns: import("@angular/core").Signal<string>;
79
+ readonly sectionTitle: import("@angular/core").Signal<string>;
80
+ readonly sectionDescription: import("@angular/core").Signal<string>;
81
+ readonly addLabel: import("@angular/core").Signal<string>;
82
+ readonly emptyLabel: import("@angular/core").Signal<string>;
83
+ readonly emptyHint: import("@angular/core").Signal<string>;
84
+ /** Returns the option array for a select column from the shared CODE_LISTS map. */
85
+ getOptions(col: InlineColumnDef): BaseCodeListEntry[];
86
+ /** Options for a select column, narrowed per row when the column defines `optionsFilter`. */
87
+ optionsForRow(col: InlineColumnDef, row: Record<string, unknown>): BaseCodeListEntry[];
88
+ /**
89
+ * Returns the localized display label for a code-list option.
90
+ * - `optionLabelKey`: translates the i18n key returned by the column's resolver — for
91
+ * literal option lists whose labels live in the locales rather than in master data.
92
+ * - `optionDisplay: 'id'`: returns `String(entry.id)` (e.g. "kg", "t").
93
+ * - default (`'label'`): uses `descriptor.designation_eng / designation_deu`;
94
+ * falls back to `String(entry.id)` when no descriptor is present.
95
+ */
96
+ optionLabel(entry: BaseCodeListEntry, col: InlineColumnDef): string;
97
+ /**
98
+ * Reads the current cell value for a column from a row object.
99
+ *
100
+ * - `valueResolver` columns: fully derived value (e.g. from master data).
101
+ * - Simple field: returns `row[col.key]`.
102
+ * - Sub-array field: navigates `row[arrayPath]`, finds the entry matching
103
+ * `arrayKeyField === arrayKeyValue`, and returns `entry[arrayValueField]`.
104
+ */
105
+ getValue(row: Record<string, unknown>, col: InlineColumnDef): unknown;
106
+ /**
107
+ * Returns a new row with the column's value updated (immutably).
108
+ * Handles both flat field assignment and nested sub-array mutation.
109
+ */
110
+ private setValue;
111
+ /** Called when a `mat-select` selection changes. */
112
+ onSelectChange(rowIdx: number, col: InlineColumnDef, value: unknown): void;
113
+ /** Called on `(input)` of a number `<input>` — parses the string value and guards NaN.
114
+ * Uses `input` (not `change`) so every keystroke commits immediately: relying on blur
115
+ * meant edits were lost whenever the table was destroyed before the field lost focus
116
+ * (e.g. navigating to another page), even though switching same-page tabs hid the bug
117
+ * since mat-tab-group keeps inactive tab content mounted. */
118
+ onNumberChange(rowIdx: number, col: InlineColumnDef, event: Event): void;
119
+ /** Called on `(input)` of a text `<input>` (see onNumberChange for why not `(change)`). */
120
+ onTextChange(rowIdx: number, col: InlineColumnDef, event: Event): void;
121
+ /** Called when a `mat-checkbox` is toggled. */
122
+ onCheckboxChange(rowIdx: number, col: InlineColumnDef, change: MatCheckboxChange): void;
123
+ /** Whether the cell widget is disabled for this row (per-row constraint hook). */
124
+ isCellDisabled(col: InlineColumnDef, row: Record<string, unknown>): boolean;
125
+ /** Appends a blank row produced by `config.createRow()`. */
126
+ addRow(): void;
127
+ /** Removes the row at `idx` from the array. */
128
+ removeRow(idx: number): void;
129
+ /** Ids of the expanded sub-rows panels, keyed `${rowIdx}:${col.key}` (UI-only state). */
130
+ private readonly expandedSubrows;
131
+ isSubrowsExpanded(rowIdx: number, col: InlineColumnDef): boolean;
132
+ toggleSubrows(rowIdx: number, col: InlineColumnDef): void;
133
+ /** Reads the nested key/value entries of a sub-rows column (never null). */
134
+ getSubEntries(row: Record<string, unknown>, col: InlineColumnDef): Record<string, unknown>[];
135
+ /** Options for the key select of a sub-rows column. */
136
+ getSubrowOptions(col: InlineColumnDef): BaseCodeListEntry[];
137
+ /** Localized label for a sub-entry key (descriptor designation, id as fallback). */
138
+ subrowKeyLabel(col: InlineColumnDef, keyValue: unknown): string;
139
+ /** Collapsed-cell summary, e.g. "Bovins 25 %, Porcs 75 %" ('–' when empty). */
140
+ subrowsSummary(row: Record<string, unknown>, col: InlineColumnDef): string;
141
+ /** Sum of the value fields of all sub-entries. */
142
+ subEntryTotal(row: Record<string, unknown>, col: InlineColumnDef): number;
143
+ /** Whether the sub-entry values sum to the configured expected total. */
144
+ subEntryTotalOk(row: Record<string, unknown>, col: InlineColumnDef): boolean;
145
+ addSubEntry(rowIdx: number, col: InlineColumnDef): void;
146
+ removeSubEntry(rowIdx: number, col: InlineColumnDef, subIdx: number): void;
147
+ onSubEntryKeyChange(rowIdx: number, col: InlineColumnDef, subIdx: number, value: unknown): void;
148
+ /** Commits on every keystroke (not on blur) — same rationale as `onNumberChange`.
149
+ * When `expectedTotal` is set, the value is clamped to the remaining share so the
150
+ * sum can never exceed it; smaller intermediate keystrokes still go through. */
151
+ onSubEntryValueChange(rowIdx: number, col: InlineColumnDef, subIdx: number, event: Event): void;
152
+ /** Writes the sub-entry array back to the row, runs rowTransform, emits rowsChange. */
153
+ private updateSubEntries;
154
+ /**
155
+ * Core change handler: sets the new value on the row, applies the optional
156
+ * `rowTransform` for any cross-field side-effects, then emits the updated array.
157
+ */
158
+ private _applyChange;
159
+ }