@agridea/suibi-module 0.1.0-preview.6 → 0.1.0-preview.6e162c8
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 +75 -72
- 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 +75 -72
- package/dist/elements/browser/{suibi-module.v0.1.0-preview.6.css → suibi-module.v0.1.0-preview.6e162c8.css} +1 -1
- package/dist/elements/browser/suibi-module.v0.1.0-preview.6e162c8.js +78 -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 +1 -3
- 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 +3 -0
- package/dist/types/app/components/empty-state/empty-state.component.d.ts +12 -0
- package/dist/types/app/components/module-placeholder-page/module-placeholder-page.component.d.ts +6 -0
- package/dist/types/app/components/planning-result/planning-result.component.d.ts +46 -0
- package/dist/types/app/components/planning-result/planning-trigger.component.d.ts +13 -0
- package/dist/types/app/components/results-page/results-page.component.d.ts +13 -0
- package/dist/types/app/components/suissebilanz-dashboard/gauge-arc.component.d.ts +47 -0
- package/dist/types/app/components/suissebilanz-dashboard/suissebilanz-dashboard.component.d.ts +24 -0
- package/dist/types/app/components/suissebilanz-dashboard/suissebilanz-metrics.service.d.ts +21 -0
- package/dist/types/app/components/suissebilanz-dashboard/suissebilanz-minibar.component.d.ts +19 -0
- package/dist/types/app/components/validation-page/validation-page.component.d.ts +18 -0
- package/dist/types/app/components/workflow-stepper/workflow-stepper.component.d.ts +49 -0
- package/dist/types/app/core/data/naebi-data.service.d.ts +39 -4
- package/dist/types/app/core/master-data/master-data.service.d.ts +8 -1
- package/dist/types/app/core/navigation/navigation.service.d.ts +29 -1
- package/dist/types/app/core/planning/planning-balance.service.d.ts +37 -0
- package/dist/types/app/core/planning/planning-balance.types.d.ts +206 -0
- package/dist/types/app/core/planning/planning-balance.utils.d.ts +10 -0
- package/dist/types/app/core/validation/capabilities.d.ts +5 -5
- package/dist/types/app/core/validation/global-validation.service.d.ts +19 -4
- package/dist/types/app/header-bar.d.ts +1 -2
- package/dist/types/app/jsonforms/filters/code-list-filter-resolvers.d.ts +3 -0
- package/dist/types/app/jsonforms/registry/renderers.registry.d.ts +4 -0
- package/dist/types/app/jsonforms/renderers/controls/selects/code-list/code-list-select.renderer.d.ts +10 -4
- 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 +3 -0
- package/dist/types/app/nutrient-cycle/animal-stock/animal-stock-master-detail.component.d.ts +0 -1
- package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading-detail.component.d.ts +1 -1
- package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading-list.component.d.ts +1 -0
- package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading-master-detail.component.d.ts +0 -1
- package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation-detail.component.d.ts +22 -0
- package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation-general.component.d.ts +22 -0
- package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation-list.component.d.ts +17 -0
- package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation-master-detail.component.d.ts +36 -0
- package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation.types.d.ts +40 -0
- package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation.util.d.ts +6 -0
- package/dist/types/app/nutrient-cycle/field-spreading/field-spreading.component.d.ts +0 -1
- package/dist/types/app/nutrient-cycle/fodder/fodder-detail.component.d.ts +32 -0
- package/dist/types/app/nutrient-cycle/fodder/fodder-list.component.d.ts +21 -0
- package/dist/types/app/nutrient-cycle/fodder/fodder-master-detail.component.d.ts +37 -0
- package/dist/types/app/nutrient-cycle/fodder/fodder.types.d.ts +27 -0
- package/dist/types/app/nutrient-cycle/fodder/transaction-unit.util.d.ts +2 -0
- package/dist/types/app/nutrient-cycle/lifetime-performance/lifetime-performance-form.component.d.ts +1 -1
- package/dist/types/app/nutrient-cycle/storage/storage-detail.component.d.ts +30 -0
- package/dist/types/app/nutrient-cycle/storage/storage-general.component.d.ts +29 -0
- package/dist/types/app/nutrient-cycle/storage/storage-list.component.d.ts +20 -0
- package/dist/types/app/nutrient-cycle/storage/storage-master-detail.component.d.ts +31 -0
- package/dist/types/app/nutrient-cycle/storage/storage.types.d.ts +40 -0
- package/dist/types/environments/environment.d.ts +5 -0
- package/dist/types/shared/material-icons.d.ts +3 -3
- package/package.json +1 -1
- package/dist/elements/browser/suibi-module.v0.1.0-preview.6.js +0 -75
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript interfaces for the planning-balance API response.
|
|
3
|
+
* These match the eBilanz / BLW response shape observed in the example data.
|
|
4
|
+
*/
|
|
5
|
+
/** A single nutrient quantity entry (kg or % unit). */
|
|
6
|
+
export interface NutrientEntry {
|
|
7
|
+
molecularFormula: string;
|
|
8
|
+
quantity: number;
|
|
9
|
+
quantityCorrected?: number;
|
|
10
|
+
unit: string;
|
|
11
|
+
productFamilyType?: string;
|
|
12
|
+
typeOfManureRecyclingProduct?: string;
|
|
13
|
+
fertiliserProductCategory?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface CalculationVersion {
|
|
16
|
+
version: string;
|
|
17
|
+
validFrom: string;
|
|
18
|
+
validTo: string;
|
|
19
|
+
}
|
|
20
|
+
export interface AreaAndYieldPerAgronomicCropCategory {
|
|
21
|
+
agronomicCropCategory: string;
|
|
22
|
+
areaSize: number;
|
|
23
|
+
effectiveYield: number;
|
|
24
|
+
isMainCrop: boolean;
|
|
25
|
+
isNutrientPoorFodder: boolean;
|
|
26
|
+
yieldPerSquareMeasure?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface AreaPerCultivationType {
|
|
29
|
+
areaSize: number;
|
|
30
|
+
isMainCrop: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface AreaAndYieldPerCultivationCategory {
|
|
33
|
+
cultivationCategory: string;
|
|
34
|
+
areaAndYieldPerAgronomicCropCategory: AreaAndYieldPerAgronomicCropCategory[];
|
|
35
|
+
areaPerCultivationType: AreaPerCultivationType[];
|
|
36
|
+
}
|
|
37
|
+
export interface AreaPerSubCategory {
|
|
38
|
+
cultivationSubCategory: string;
|
|
39
|
+
areaSize: number;
|
|
40
|
+
isMainCrop: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface FieldCultivation {
|
|
43
|
+
areaAndYieldPerCultivationCategory: AreaAndYieldPerCultivationCategory[];
|
|
44
|
+
areaPerSubCategory: AreaPerSubCategory[];
|
|
45
|
+
fertilizableAreaSize: number;
|
|
46
|
+
slurrySpreadingAreaSize: number;
|
|
47
|
+
totalAgriculturalLandAreaSize: number;
|
|
48
|
+
}
|
|
49
|
+
export interface FodderQuantity {
|
|
50
|
+
quantity: number;
|
|
51
|
+
unit: string;
|
|
52
|
+
proportionNutrientPoorFodder?: number;
|
|
53
|
+
}
|
|
54
|
+
export interface FodderProduct {
|
|
55
|
+
typeOfFeedstuffProduct: string;
|
|
56
|
+
quantity: number;
|
|
57
|
+
unit: string;
|
|
58
|
+
isNutrientPoorFodder: boolean;
|
|
59
|
+
}
|
|
60
|
+
export interface ConsumptionAnimalStock {
|
|
61
|
+
animalCategoryPRIF: number;
|
|
62
|
+
averageQuantity: number;
|
|
63
|
+
order: string;
|
|
64
|
+
quantity: number;
|
|
65
|
+
unit: string;
|
|
66
|
+
}
|
|
67
|
+
export interface RequiredEffectiveYieldFromFodderCropland {
|
|
68
|
+
consumptionAnimalStock: ConsumptionAnimalStock[];
|
|
69
|
+
cropFromNonFodderCroplandPerProduct: FodderProduct[];
|
|
70
|
+
dispensePerProduct: FodderProduct[];
|
|
71
|
+
supplyPerProduct: FodderProduct[];
|
|
72
|
+
totalBalance: FodderQuantity;
|
|
73
|
+
totalConsumptionAnimalStock: FodderQuantity;
|
|
74
|
+
totalCropFromNonFodderCropland: FodderQuantity;
|
|
75
|
+
totalDispense: FodderQuantity;
|
|
76
|
+
totalSupply: FodderQuantity;
|
|
77
|
+
}
|
|
78
|
+
export interface FodderBalance {
|
|
79
|
+
requiredEffectiveYieldFromFodderCropland: RequiredEffectiveYieldFromFodderCropland;
|
|
80
|
+
totalBalance: FodderQuantity;
|
|
81
|
+
totalEffectiveYieldFromFodderCropland: FodderQuantity;
|
|
82
|
+
totalNutrientPoorFodder: FodderQuantity;
|
|
83
|
+
}
|
|
84
|
+
export interface EmissionAndAccumulationEntry {
|
|
85
|
+
animalCategoryPRIF: number;
|
|
86
|
+
order: string;
|
|
87
|
+
accumulation: NutrientEntry[];
|
|
88
|
+
emission: NutrientEntry[];
|
|
89
|
+
manureExcretion?: unknown[];
|
|
90
|
+
}
|
|
91
|
+
export interface AccumulationEntireExcretion {
|
|
92
|
+
animalCategoryPRIF: number;
|
|
93
|
+
order: string;
|
|
94
|
+
durationSumTotalCorrectedNutrientBalance: number;
|
|
95
|
+
accumulation: NutrientEntry[];
|
|
96
|
+
}
|
|
97
|
+
export interface TotalNutrientSet {
|
|
98
|
+
accumulation: NutrientEntry[];
|
|
99
|
+
emission?: NutrientEntry[];
|
|
100
|
+
}
|
|
101
|
+
export interface AnimalStock {
|
|
102
|
+
accumulationEntireExcretion: AccumulationEntireExcretion[];
|
|
103
|
+
emissionAndAccumulationPasture: EmissionAndAccumulationEntry[];
|
|
104
|
+
emissionAndAccumulationStall: EmissionAndAccumulationEntry[];
|
|
105
|
+
emissionAndAccumulationYard: EmissionAndAccumulationEntry[];
|
|
106
|
+
totalAccumulationEntireExcretion: TotalNutrientSet;
|
|
107
|
+
totalEmissionAndAccumulationAnimalStock: TotalNutrientSet;
|
|
108
|
+
totalEmissionAndAccumulationPasture: TotalNutrientSet;
|
|
109
|
+
totalEmissionAndAccumulationStall: TotalNutrientSet;
|
|
110
|
+
totalEmissionAndAccumulationYard: TotalNutrientSet;
|
|
111
|
+
}
|
|
112
|
+
export interface ManureTradingProduct {
|
|
113
|
+
typeOfManureRecyclingProduct: string;
|
|
114
|
+
quantity: number;
|
|
115
|
+
unit: string;
|
|
116
|
+
ingredient: NutrientEntry[];
|
|
117
|
+
}
|
|
118
|
+
export interface FarmManureTrading {
|
|
119
|
+
balancePerProduct: ManureTradingProduct[];
|
|
120
|
+
dispensePerProduct: ManureTradingProduct[];
|
|
121
|
+
supplyPerProduct: ManureTradingProduct[];
|
|
122
|
+
totalBalance: {
|
|
123
|
+
ingredient: NutrientEntry[];
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export interface NutrientRequirementEntry {
|
|
127
|
+
agronomicCropCategory?: string;
|
|
128
|
+
cultivationCategory?: string;
|
|
129
|
+
isMainCrop?: boolean;
|
|
130
|
+
requirement: NutrientEntry[];
|
|
131
|
+
}
|
|
132
|
+
export interface FieldCultivationNutrients {
|
|
133
|
+
nutrientTransferUnfertilizedCultivation: NutrientEntry[];
|
|
134
|
+
requirementPerAgronomicCropCategory: NutrientRequirementEntry[];
|
|
135
|
+
requirementPerCultivationCategory: NutrientRequirementEntry[];
|
|
136
|
+
totalRequirement: NutrientEntry[];
|
|
137
|
+
}
|
|
138
|
+
export interface FieldSpreading {
|
|
139
|
+
emissionAndAccumulationFieldSpreading: TotalNutrientSet;
|
|
140
|
+
totalEmissionAndAccumulationFieldSpreading: TotalNutrientSet;
|
|
141
|
+
}
|
|
142
|
+
export interface StorageBalance {
|
|
143
|
+
emissionAndAccumulationManureStorage: TotalNutrientSet;
|
|
144
|
+
totalEmissionAndAccumulationManureStorage: TotalNutrientSet;
|
|
145
|
+
}
|
|
146
|
+
export interface NutrientBalance {
|
|
147
|
+
animalStock: AnimalStock;
|
|
148
|
+
farmManureTrading: FarmManureTrading;
|
|
149
|
+
fieldCultivation: FieldCultivationNutrients;
|
|
150
|
+
fieldSpreading: FieldSpreading;
|
|
151
|
+
storage: StorageBalance;
|
|
152
|
+
/** Final per-nutrient balance figures: kg lines + % lines interleaved. */
|
|
153
|
+
totalBalance: NutrientEntry[];
|
|
154
|
+
/** Farm-wide gas emissions (NH3, NO, N2O, N2). */
|
|
155
|
+
totalEmissionFarm: NutrientEntry[];
|
|
156
|
+
nutrientBalanceTMP?: unknown[];
|
|
157
|
+
}
|
|
158
|
+
export interface NutrientCycle {
|
|
159
|
+
creationDateTime: string;
|
|
160
|
+
facilitySpecificProducts: {
|
|
161
|
+
manureRecyclingProduct: unknown[];
|
|
162
|
+
};
|
|
163
|
+
fieldCultivation: FieldCultivation;
|
|
164
|
+
fodderBalance: FodderBalance;
|
|
165
|
+
nutrientBalance: NutrientBalance;
|
|
166
|
+
version: string;
|
|
167
|
+
/** Base64-encoded PDF report, if returned by the endpoint. */
|
|
168
|
+
report?: string;
|
|
169
|
+
}
|
|
170
|
+
export interface ValidationMessageDetail {
|
|
171
|
+
designation_deu: string;
|
|
172
|
+
designation_eng: string;
|
|
173
|
+
designation_fra: string;
|
|
174
|
+
designation_ita: string;
|
|
175
|
+
}
|
|
176
|
+
export interface ValidationMessage {
|
|
177
|
+
field: string;
|
|
178
|
+
type: string;
|
|
179
|
+
detail: ValidationMessageDetail;
|
|
180
|
+
}
|
|
181
|
+
/** Full response from the planning-balance endpoint. */
|
|
182
|
+
export interface PlanningBalanceResponse {
|
|
183
|
+
calculationVersion: CalculationVersion;
|
|
184
|
+
nutrientCycle: NutrientCycle;
|
|
185
|
+
validationMessage: ValidationMessage[];
|
|
186
|
+
}
|
|
187
|
+
/** Merged kg + % row for the final balance table (Section D). */
|
|
188
|
+
export interface BalanceRow {
|
|
189
|
+
molecularFormula: string;
|
|
190
|
+
quantity: number;
|
|
191
|
+
quantityCorrected: number;
|
|
192
|
+
quantityPct: number | null;
|
|
193
|
+
quantityCorrectedPct: number | null;
|
|
194
|
+
unit: 'kg';
|
|
195
|
+
}
|
|
196
|
+
/** Crop requirement row enriched with area and yield for display (Section C). */
|
|
197
|
+
export interface CropRequirementRow {
|
|
198
|
+
cropCode: string;
|
|
199
|
+
cultivationCategory: string;
|
|
200
|
+
isMainCrop: boolean;
|
|
201
|
+
areaHa: number;
|
|
202
|
+
effectiveYield: number;
|
|
203
|
+
/** kg/ha yield per square measure field (m² basis), converted to dt/ha for display. */
|
|
204
|
+
yieldDtHa: number | null;
|
|
205
|
+
requirement: NutrientEntry[];
|
|
206
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BalanceRow, NutrientEntry } from './planning-balance.types';
|
|
2
|
+
/**
|
|
3
|
+
* Merges the interleaved kg / % rows from `totalBalance` into one `BalanceRow`
|
|
4
|
+
* per nutrient formula, preserving the canonical KEY_NUTRIENTS display order.
|
|
5
|
+
*
|
|
6
|
+
* The planning-balance API returns two `NutrientEntry` objects per formula
|
|
7
|
+
* (one with `unit === 'kg'`, one with `unit === '%'`). This function coalesces
|
|
8
|
+
* them so callers work with a single, normalised row.
|
|
9
|
+
*/
|
|
10
|
+
export declare function mergeBalanceRows(totalBalance: NutrientEntry[]): BalanceRow[];
|
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
* All master data is embedded statically at compile time - no runtime HTTP calls.
|
|
6
6
|
*/
|
|
7
7
|
/**
|
|
8
|
-
* Derives permitted stable systems (
|
|
8
|
+
* Derives permitted stable systems (stableSystem enum strings) for a given animal category.
|
|
9
9
|
*
|
|
10
10
|
* @param animalCategoryPRIF - The PRIF animal category ID
|
|
11
|
-
* @returns Array of permitted
|
|
11
|
+
* @returns Array of permitted stableSystem enum strings (e.g. 'HUS_TETHER')
|
|
12
12
|
*/
|
|
13
|
-
export declare function derivePermittedStableSystems(animalCategoryPRIF: number | null | undefined):
|
|
13
|
+
export declare function derivePermittedStableSystems(animalCategoryPRIF: number | null | undefined): string[];
|
|
14
14
|
/**
|
|
15
15
|
* Pre-computed map for performance (memoized at module load).
|
|
16
|
-
* Maps animalCategoryPRIF -> array of permitted stableSystem
|
|
16
|
+
* Maps animalCategoryPRIF -> array of permitted stableSystem enum strings.
|
|
17
17
|
*/
|
|
18
|
-
export declare const PERMITTED_STABLE_SYSTEMS: Record<number,
|
|
18
|
+
export declare const PERMITTED_STABLE_SYSTEMS: Record<number, string[]>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ErrorObject } from 'ajv';
|
|
2
|
-
import { AnimalStockCategory, FarmManureTradingCategory, FarmManureTradingMode, FieldSpreadingCategory, PageId } from '../navigation/navigation.service';
|
|
2
|
+
import { AnimalStockCategory, FarmManureTradingCategory, FarmManureTradingMode, FieldCultivationTab, FieldSpreadingCategory, FodderCategory, FodderMode, PageId, StorageEntryType, StorageTab } from '../navigation/navigation.service';
|
|
3
3
|
export interface EnrichedValidationError extends ErrorObject {
|
|
4
4
|
/** Human-friendly field label (e.g., "Animal Category") */
|
|
5
5
|
fieldLabel?: string;
|
|
@@ -17,8 +17,24 @@ export interface EnrichedValidationError extends ErrorObject {
|
|
|
17
17
|
targetFarmManureTradingIndex?: number;
|
|
18
18
|
/** Category tab inside farm manure trading detail */
|
|
19
19
|
targetFarmManureTradingCategory?: FarmManureTradingCategory;
|
|
20
|
+
/** Navigation target: fodder mode */
|
|
21
|
+
targetFodderMode?: FodderMode;
|
|
22
|
+
/** Navigation target: fodder entry index */
|
|
23
|
+
targetFodderIndex?: number;
|
|
24
|
+
/** Category tab inside fodder detail */
|
|
25
|
+
targetFodderCategory?: FodderCategory;
|
|
20
26
|
/** Category tab inside field spreading */
|
|
21
27
|
targetFieldSpreadingCategory?: FieldSpreadingCategory;
|
|
28
|
+
/** Category tab inside field cultivation */
|
|
29
|
+
targetFieldCultivationTab?: FieldCultivationTab;
|
|
30
|
+
/** Field cultivation detail index */
|
|
31
|
+
targetFieldCultivationIndex?: number;
|
|
32
|
+
/** Storage detail type */
|
|
33
|
+
targetStorageType?: StorageEntryType;
|
|
34
|
+
/** Storage detail index */
|
|
35
|
+
targetStorageIndex?: number;
|
|
36
|
+
/** Storage tab for list-level or scalar navigation */
|
|
37
|
+
targetStorageTab?: StorageTab;
|
|
22
38
|
}
|
|
23
39
|
/**
|
|
24
40
|
* GlobalValidationService
|
|
@@ -31,14 +47,13 @@ export declare class GlobalValidationService {
|
|
|
31
47
|
private readonly dataSvc;
|
|
32
48
|
private readonly ajv;
|
|
33
49
|
private readonly validateFn;
|
|
34
|
-
private readonly rawErrors;
|
|
35
50
|
readonly errors: import("@angular/core").Signal<EnrichedValidationError[]>;
|
|
36
|
-
constructor();
|
|
37
|
-
validate(): void;
|
|
38
51
|
private consolidateErrors;
|
|
39
52
|
private enrichErrors;
|
|
40
53
|
private inferCategory;
|
|
41
54
|
private inferFarmTradingCategory;
|
|
42
55
|
private inferFieldSpreadingCategory;
|
|
56
|
+
private inferFodderCategory;
|
|
57
|
+
private inferStorageTab;
|
|
43
58
|
private inferFieldLabel;
|
|
44
59
|
}
|
|
@@ -2,8 +2,7 @@ import { Locale } from './core/i18n/i18n.service';
|
|
|
2
2
|
import { PageId } from './core/navigation/navigation.service';
|
|
3
3
|
/**
|
|
4
4
|
* HeaderBarComponent
|
|
5
|
-
*
|
|
6
|
-
* - Emits events via provided callback inputs (parent supplies functions) to avoid outputs overhead inside shadow root.
|
|
5
|
+
* Footer actions for quick access to data preview and the current save state.
|
|
7
6
|
*/
|
|
8
7
|
export declare class HeaderBarComponent {
|
|
9
8
|
locale: import("@angular/core").InputSignal<Locale>;
|
|
@@ -20,9 +20,11 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import { MasterDataService } from '../../core/master-data/master-data.service';
|
|
22
22
|
import { I18nService } from '../../core/i18n/i18n.service';
|
|
23
|
+
import { NaebiDataService } from '../../core/data/naebi-data.service';
|
|
23
24
|
import { BaseCodeListEntry } from '../shared/option-sources/code-lists';
|
|
24
25
|
export interface FilterContext {
|
|
25
26
|
data: unknown;
|
|
27
|
+
rootData: unknown;
|
|
26
28
|
get<T = unknown>(pointer: string): T | undefined;
|
|
27
29
|
masterData: MasterDataService;
|
|
28
30
|
locale: string;
|
|
@@ -57,4 +59,5 @@ export declare function registerCodeListFilter(name: string, fn: CodeListFilterR
|
|
|
57
59
|
export declare function evaluateFilter(list: BaseCodeListEntry[], cfg: FilterConfig | undefined, services: {
|
|
58
60
|
masterData: MasterDataService;
|
|
59
61
|
i18n: I18nService;
|
|
62
|
+
naebiData?: NaebiDataService;
|
|
60
63
|
}, data: unknown): BaseCodeListEntry[];
|
|
@@ -6,6 +6,7 @@ import { LogicalGroupRenderer } from '../renderers/layout/group/logical-group.re
|
|
|
6
6
|
import { RankedTester } from '@jsonforms/core';
|
|
7
7
|
import { ConstraintLayoutRenderer } from '../renderers/layout/constraint/constraint-layout.renderer';
|
|
8
8
|
import { SelectedCategoryCategorizationRenderer } from '../renderers/layout/categorization/selected-category-categorization.renderer';
|
|
9
|
+
import { CustomArrayLayoutRenderer } from '../renderers/layout/array/array-layout.renderer';
|
|
9
10
|
export declare const CUSTOM_JSONFORMS_RENDERERS: ({
|
|
10
11
|
tester: RankedTester;
|
|
11
12
|
renderer: typeof ConstraintLayoutRenderer;
|
|
@@ -27,4 +28,7 @@ export declare const CUSTOM_JSONFORMS_RENDERERS: ({
|
|
|
27
28
|
} | {
|
|
28
29
|
tester: RankedTester;
|
|
29
30
|
renderer: typeof CodeListSelectRenderer;
|
|
31
|
+
} | {
|
|
32
|
+
tester: RankedTester;
|
|
33
|
+
renderer: typeof CustomArrayLayoutRenderer;
|
|
30
34
|
})[];
|
package/dist/types/app/jsonforms/renderers/controls/selects/code-list/code-list-select.renderer.d.ts
CHANGED
|
@@ -1,28 +1,34 @@
|
|
|
1
1
|
import { Signal } from '@angular/core';
|
|
2
2
|
import { JsonFormsAngularService } from '@jsonforms/angular';
|
|
3
|
-
import { RankedTester } from '@jsonforms/core';
|
|
3
|
+
import { ControlElement, RankedTester } from '@jsonforms/core';
|
|
4
4
|
import { BaseSelectControl } from '../../../../shared/base-control/base-select-control';
|
|
5
5
|
import { BaseCodeListEntry } from '../../../../shared/option-sources/code-lists';
|
|
6
|
+
export declare function replaceDataPathLeaf(path: string | null | undefined, replacement: string): string | null;
|
|
7
|
+
export declare function deriveSiblingDependencyPath(uischema: ControlElement | null | undefined, path: string | null | undefined, replacement: string): string | null;
|
|
6
8
|
export declare class CodeListSelectRenderer extends BaseSelectControl<number | string> {
|
|
7
9
|
private readonly masterData;
|
|
8
10
|
private readonly i18n;
|
|
11
|
+
private readonly naebiData;
|
|
9
12
|
private readonly formData;
|
|
10
13
|
private readonly controlScope;
|
|
11
14
|
private explicitCodeListKey;
|
|
12
15
|
private controlKey;
|
|
13
16
|
private listKey;
|
|
14
17
|
readonly options: Signal<BaseCodeListEntry[]>;
|
|
18
|
+
readonly isMultiSelect: Signal<boolean>;
|
|
15
19
|
private readonly filterConfig;
|
|
20
|
+
private readonly emptyHintKey;
|
|
16
21
|
private readonly dependsOnDataPath;
|
|
17
|
-
private readonly
|
|
22
|
+
private readonly autoDependsOnDataPath;
|
|
18
23
|
private scopePointerToDataPath;
|
|
19
|
-
private replacePointerLeaf;
|
|
20
24
|
private inferListKeyFromScope;
|
|
21
25
|
private readValueAtPath;
|
|
22
26
|
readonly filteredOptions: Signal<BaseCodeListEntry[]>;
|
|
23
27
|
constructor(jsonFormsService: JsonFormsAngularService);
|
|
24
28
|
getEventValue: (event: any) => any;
|
|
25
29
|
optionLabel(opt: BaseCodeListEntry): string;
|
|
26
|
-
|
|
30
|
+
emptyHint(): string;
|
|
31
|
+
shouldShowEmptyHint(): boolean;
|
|
32
|
+
onSelectionChange(value: number | string | Array<number | string>): void;
|
|
27
33
|
}
|
|
28
34
|
export declare const codeListSelectTester: RankedTester;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { OnInit } from '@angular/core';
|
|
2
|
+
import { JsonFormsAbstractControl, JsonFormsAngularService } from '@jsonforms/angular';
|
|
3
|
+
import { ArrayLayoutProps, ArrayTranslations, JsonFormsState, OwnPropsOfRenderer, RankedTester, StatePropsOfArrayLayout, UISchemaElement, UISchemaTester } from '@jsonforms/core';
|
|
4
|
+
/**
|
|
5
|
+
* CustomArrayLayoutRenderer
|
|
6
|
+
* Overrides the stock JSONForms `ArrayLayoutRenderer` (rank 4 → this is rank 5) to apply
|
|
7
|
+
* the project UX pattern: centered empty-state placeholder when the array has no entries,
|
|
8
|
+
* and the full-width dashed add-button always anchored below the list.
|
|
9
|
+
*
|
|
10
|
+
* The add button label is driven by `translations.addTooltip` resolved via the JSONForms
|
|
11
|
+
* i18n pipeline — configure per-array labels there.
|
|
12
|
+
*/
|
|
13
|
+
export declare class CustomArrayLayoutRenderer extends JsonFormsAbstractControl<StatePropsOfArrayLayout> implements OnInit {
|
|
14
|
+
noData: boolean;
|
|
15
|
+
/** Indices 0..n-1 used to render per-item cards and drive sort-button disabled state. */
|
|
16
|
+
indices: number[];
|
|
17
|
+
translations: ArrayTranslations;
|
|
18
|
+
showSortButtons: boolean;
|
|
19
|
+
addItem: (path: string, value: unknown) => () => void;
|
|
20
|
+
moveItemUp: (path: string, index: number) => () => void;
|
|
21
|
+
moveItemDown: (path: string, index: number) => () => void;
|
|
22
|
+
removeItems: (path: string, toDelete: number[]) => () => void;
|
|
23
|
+
uischemas: {
|
|
24
|
+
tester: UISchemaTester;
|
|
25
|
+
uischema: UISchemaElement;
|
|
26
|
+
}[];
|
|
27
|
+
constructor(jsonFormsService: JsonFormsAngularService);
|
|
28
|
+
get emptyText(): string;
|
|
29
|
+
get addLabel(): string;
|
|
30
|
+
mapToProps(state: JsonFormsState): StatePropsOfArrayLayout & {
|
|
31
|
+
translations: ArrayTranslations;
|
|
32
|
+
};
|
|
33
|
+
mapAdditionalProps(props: ArrayLayoutProps & {
|
|
34
|
+
translations: ArrayTranslations;
|
|
35
|
+
}): void;
|
|
36
|
+
remove(index: number): void;
|
|
37
|
+
add(): void;
|
|
38
|
+
up(index: number): void;
|
|
39
|
+
down(index: number): void;
|
|
40
|
+
ngOnInit(): void;
|
|
41
|
+
getProps(index: number): OwnPropsOfRenderer;
|
|
42
|
+
}
|
|
43
|
+
export declare const customArrayLayoutRendererTester: RankedTester;
|
|
@@ -19,12 +19,15 @@ export declare class SelectedCategoryCategorizationRenderer extends JsonFormsBas
|
|
|
19
19
|
categoryLabels: string[];
|
|
20
20
|
private readonly categoryKeyToIndex;
|
|
21
21
|
private readonly indexToCategoryKey;
|
|
22
|
+
private _prevCategorySignature;
|
|
22
23
|
readonly selectedTabIndex: import("@angular/core").Signal<number>;
|
|
23
24
|
ngOnInit(): void;
|
|
24
25
|
/**
|
|
25
26
|
* Build bidirectional category key ↔ tab index mapping from UI schema.
|
|
26
27
|
* Reads options.categoryKey from each visible Category element.
|
|
27
28
|
* Example: { base: 0, formOfDetention: 1, feeding: 2 }
|
|
29
|
+
* Skips signal writes when the tab structure hasn't changed (pure data changes
|
|
30
|
+
* fire $state on every keystroke; no need to mark selectedTabIndex stale each time).
|
|
28
31
|
*/
|
|
29
32
|
private buildCategoryMappings;
|
|
30
33
|
onTabChange(newIndex: number): void;
|
package/dist/types/app/nutrient-cycle/animal-stock/animal-stock-master-detail.component.d.ts
CHANGED
|
@@ -3,7 +3,6 @@ import { LifetimePerformance } from '../lifetime-performance/lifetime-performanc
|
|
|
3
3
|
export declare class AnimalStockMasterDetailComponent {
|
|
4
4
|
private readonly dataSvc;
|
|
5
5
|
private readonly navigationSvc;
|
|
6
|
-
private readonly rootData;
|
|
7
6
|
constructor();
|
|
8
7
|
readonly rows: import("@angular/core").Signal<AnimalStockRow[]>;
|
|
9
8
|
readonly lifetimePerformance: import("@angular/core").Signal<LifetimePerformance | null>;
|
package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading-detail.component.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export declare class FarmManureTradingDetailComponent {
|
|
|
16
16
|
}[];
|
|
17
17
|
readonly suibiAjv: import("ajv").Ajv;
|
|
18
18
|
private readonly baseSchemas;
|
|
19
|
-
private readonly
|
|
19
|
+
private readonly baseUis;
|
|
20
20
|
itemSchema: Signal<JsonSchema>;
|
|
21
21
|
localizedUi: Signal<UISchemaElement>;
|
|
22
22
|
detailTitle: Signal<string>;
|
package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading-list.component.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export declare class FarmManureTradingListComponent {
|
|
|
15
15
|
readonly displayedColumns: string[];
|
|
16
16
|
resolveProduct(code: string | null | undefined): string;
|
|
17
17
|
emptyLabel(): string;
|
|
18
|
+
emptyHintLabel(): string;
|
|
18
19
|
addLabel(): string;
|
|
19
20
|
headerLabel(): string;
|
|
20
21
|
onDelete(index: number, event: Event): void;
|
|
@@ -3,7 +3,6 @@ import { FarmManureTradingSupply, FarmManureTradingDispense } from './farm-manur
|
|
|
3
3
|
export declare class FarmManureTradingMasterDetailComponent {
|
|
4
4
|
private readonly dataSvc;
|
|
5
5
|
private readonly navigationSvc;
|
|
6
|
-
private readonly rootData;
|
|
7
6
|
constructor();
|
|
8
7
|
readonly supplyRows: import("@angular/core").Signal<FarmManureTradingSupply[]>;
|
|
9
8
|
readonly dispenseRows: import("@angular/core").Signal<FarmManureTradingDispense[]>;
|
package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation-detail.component.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { JsonSchema, UISchemaElement } from '@jsonforms/core';
|
|
2
|
+
import { FieldCultivationDetailEntry, FieldCultivationDetailMode } from './field-cultivation.types';
|
|
3
|
+
export declare class FieldCultivationDetailComponent {
|
|
4
|
+
private readonly i18n;
|
|
5
|
+
readonly row: import("@angular/core").InputSignal<FieldCultivationDetailEntry | null>;
|
|
6
|
+
readonly index: import("@angular/core").InputSignal<number | null>;
|
|
7
|
+
readonly mode: import("@angular/core").InputSignal<FieldCultivationDetailMode>;
|
|
8
|
+
readonly rowChange: import("@angular/core").OutputEmitterRef<FieldCultivationDetailEntry>;
|
|
9
|
+
readonly close: import("@angular/core").OutputEmitterRef<void>;
|
|
10
|
+
readonly renderers: {
|
|
11
|
+
tester: import("@jsonforms/core").RankedTester;
|
|
12
|
+
renderer: any;
|
|
13
|
+
}[];
|
|
14
|
+
readonly suibiAjv: import("ajv").Ajv;
|
|
15
|
+
private readonly baseSchemas;
|
|
16
|
+
private readonly baseUis;
|
|
17
|
+
readonly itemSchema: import("@angular/core").Signal<JsonSchema>;
|
|
18
|
+
readonly localizedUi: import("@angular/core").Signal<UISchemaElement>;
|
|
19
|
+
readonly detailTitle: import("@angular/core").Signal<string>;
|
|
20
|
+
readonly jsonFormsData: import("@angular/core").Signal<(import("./field-cultivation.types").FieldCultivationFodderCropland & import("../../core/schemas/ui-helper-registry").UiHelperDefinitions) | (import("./field-cultivation.types").FieldCultivationSpecial & import("../../core/schemas/ui-helper-registry").UiHelperDefinitions) | null>;
|
|
21
|
+
onDataChange(event: unknown): void;
|
|
22
|
+
}
|
package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation-general.component.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { JsonSchema } from '@jsonforms/core';
|
|
2
|
+
import { FieldCultivationCropHarvest, FieldCultivationData } from './field-cultivation.types';
|
|
3
|
+
export declare class FieldCultivationGeneralComponent {
|
|
4
|
+
private readonly i18n;
|
|
5
|
+
readonly value: import("@angular/core").InputSignal<FieldCultivationData>;
|
|
6
|
+
readonly valueChange: import("@angular/core").OutputEmitterRef<FieldCultivationData>;
|
|
7
|
+
readonly renderers: {
|
|
8
|
+
tester: import("@jsonforms/core").RankedTester;
|
|
9
|
+
renderer: any;
|
|
10
|
+
}[];
|
|
11
|
+
readonly ajv: import("ajv").Ajv;
|
|
12
|
+
readonly schema: import("@angular/core").Signal<JsonSchema>;
|
|
13
|
+
readonly localizedUi: import("@angular/core").Signal<import("@jsonforms/core").UISchemaElement>;
|
|
14
|
+
readonly jsonFormsData: import("@angular/core").Signal<({
|
|
15
|
+
buildingZoneAreaSize: number | null | undefined;
|
|
16
|
+
outdoorVegetableMainCropAreaSize: number | null | undefined;
|
|
17
|
+
indoorVegetableMainCropAreaSize: number | null | undefined;
|
|
18
|
+
feedingOfCropHarvest: FieldCultivationCropHarvest[] | undefined;
|
|
19
|
+
dispenseOfCropHarvest: FieldCultivationCropHarvest[] | undefined;
|
|
20
|
+
} & import("../../core/schemas/ui-helper-registry").UiHelperDefinitions) | null>;
|
|
21
|
+
onDataChange(event: unknown): void;
|
|
22
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { FieldCultivationDetailEntry, FieldCultivationDetailMode } from './field-cultivation.types';
|
|
2
|
+
export declare class FieldCultivationListComponent {
|
|
3
|
+
private readonly masterData;
|
|
4
|
+
private readonly i18n;
|
|
5
|
+
readonly rows: import("@angular/core").InputSignal<FieldCultivationDetailEntry[]>;
|
|
6
|
+
readonly selectedIndex: import("@angular/core").InputSignal<number | null>;
|
|
7
|
+
readonly mode: import("@angular/core").InputSignal<FieldCultivationDetailMode>;
|
|
8
|
+
readonly select: import("@angular/core").OutputEmitterRef<number>;
|
|
9
|
+
readonly add: import("@angular/core").OutputEmitterRef<void>;
|
|
10
|
+
readonly delete: import("@angular/core").OutputEmitterRef<number>;
|
|
11
|
+
readonly displayedColumns: string[];
|
|
12
|
+
resolveCrop(code: string | null | undefined): string;
|
|
13
|
+
emptyLabel(): string;
|
|
14
|
+
emptyHintLabel(): string;
|
|
15
|
+
addLabel(): string;
|
|
16
|
+
onDelete(index: number, event: Event): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { FieldCultivationTab } from '../../core/navigation/navigation.service';
|
|
2
|
+
import { FieldCultivationArableLand, FieldCultivationData, FieldCultivationDetailEntry, FieldCultivationDetailMode, FieldCultivationFodderCropland, FieldCultivationSpecial } from './field-cultivation.types';
|
|
3
|
+
export declare class FieldCultivationMasterDetailComponent {
|
|
4
|
+
private readonly dataSvc;
|
|
5
|
+
private readonly navigationSvc;
|
|
6
|
+
constructor();
|
|
7
|
+
readonly fieldCultivation: import("@angular/core").Signal<FieldCultivationData>;
|
|
8
|
+
readonly fodderCroplandRows: import("@angular/core").Signal<FieldCultivationFodderCropland[]>;
|
|
9
|
+
readonly arableLandRows: import("@angular/core").Signal<FieldCultivationArableLand[]>;
|
|
10
|
+
readonly specialRows: import("@angular/core").Signal<FieldCultivationSpecial[]>;
|
|
11
|
+
readonly activeTab: import("@angular/core").WritableSignal<FieldCultivationTab>;
|
|
12
|
+
readonly selectedFodderCroplandIndex: import("@angular/core").WritableSignal<number | null>;
|
|
13
|
+
readonly selectedArableLandIndex: import("@angular/core").WritableSignal<number | null>;
|
|
14
|
+
readonly selectedSpecialIndex: import("@angular/core").WritableSignal<number | null>;
|
|
15
|
+
readonly detailOpen: import("@angular/core").Signal<boolean>;
|
|
16
|
+
readonly currentIndex: import("@angular/core").Signal<number | null>;
|
|
17
|
+
readonly currentDetail: import("@angular/core").Signal<FieldCultivationDetailEntry | null>;
|
|
18
|
+
readonly selectedFodderCroplandListIndex: import("@angular/core").Signal<number | null>;
|
|
19
|
+
readonly selectedArableLandListIndex: import("@angular/core").Signal<number | null>;
|
|
20
|
+
readonly selectedSpecialListIndex: import("@angular/core").Signal<number | null>;
|
|
21
|
+
readonly activeTabIndex: import("@angular/core").Signal<0 | 1 | 3 | 2>;
|
|
22
|
+
onTabChange(index: number): void;
|
|
23
|
+
openDetail(mode: FieldCultivationDetailMode, index: number): void;
|
|
24
|
+
closeDetail(): void;
|
|
25
|
+
addEntry(mode: FieldCultivationDetailMode): void;
|
|
26
|
+
deleteEntry(mode: FieldCultivationDetailMode, index: number): void;
|
|
27
|
+
onGeneralChange(value: FieldCultivationData): void;
|
|
28
|
+
onDetailChange(value: FieldCultivationDetailEntry): void;
|
|
29
|
+
private patchRows;
|
|
30
|
+
private patchFieldCultivation;
|
|
31
|
+
private rowsForMode;
|
|
32
|
+
private selectedIndexSignal;
|
|
33
|
+
private clearSelections;
|
|
34
|
+
private clearInvalidSelection;
|
|
35
|
+
private parseTab;
|
|
36
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface FieldCultivationRequirementCorrection {
|
|
2
|
+
quantity?: number | null;
|
|
3
|
+
molecularFormula?: string | null;
|
|
4
|
+
unit?: string | null;
|
|
5
|
+
}
|
|
6
|
+
export interface FieldCultivationCropHarvest {
|
|
7
|
+
agronomicCropCategory?: string | null;
|
|
8
|
+
userSpecificPlantName?: string | null;
|
|
9
|
+
effectiveYield?: number | null;
|
|
10
|
+
}
|
|
11
|
+
export interface FieldCultivationBaseEntry {
|
|
12
|
+
agronomicCropCategory?: string | null;
|
|
13
|
+
userSpecificPlantName?: string | null;
|
|
14
|
+
isMainCrop?: boolean;
|
|
15
|
+
areaSize?: number | null;
|
|
16
|
+
yieldPerSquareMeasure?: number | null;
|
|
17
|
+
}
|
|
18
|
+
export interface FieldCultivationFodderCropland extends FieldCultivationBaseEntry {
|
|
19
|
+
fieldName?: string | null;
|
|
20
|
+
calculateYieldThroughFodderBalance?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface FieldCultivationArableLand extends FieldCultivationBaseEntry {
|
|
23
|
+
hasLongTermYieldDivergence?: boolean;
|
|
24
|
+
requirementCorrection?: FieldCultivationRequirementCorrection[];
|
|
25
|
+
}
|
|
26
|
+
export interface FieldCultivationSpecial extends FieldCultivationBaseEntry {
|
|
27
|
+
requirementCorrection?: FieldCultivationRequirementCorrection[];
|
|
28
|
+
}
|
|
29
|
+
export interface FieldCultivationData {
|
|
30
|
+
buildingZoneAreaSize?: number | null;
|
|
31
|
+
outdoorVegetableMainCropAreaSize?: number | null;
|
|
32
|
+
indoorVegetableMainCropAreaSize?: number | null;
|
|
33
|
+
feedingOfCropHarvest?: FieldCultivationCropHarvest[];
|
|
34
|
+
dispenseOfCropHarvest?: FieldCultivationCropHarvest[];
|
|
35
|
+
fodderCropland?: FieldCultivationFodderCropland[];
|
|
36
|
+
arableLand?: FieldCultivationArableLand[];
|
|
37
|
+
special?: FieldCultivationSpecial[];
|
|
38
|
+
}
|
|
39
|
+
export type FieldCultivationDetailMode = 'fodderCropland' | 'arableLand' | 'special';
|
|
40
|
+
export type FieldCultivationDetailEntry = FieldCultivationFodderCropland | FieldCultivationArableLand | FieldCultivationSpecial;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FieldCultivationCropHarvest, FieldCultivationData, FieldCultivationDetailEntry, FieldCultivationDetailMode, FieldCultivationRequirementCorrection } from './field-cultivation.types';
|
|
2
|
+
export declare function normalizeRequirementCorrection(source: Partial<FieldCultivationRequirementCorrection> | undefined): FieldCultivationRequirementCorrection;
|
|
3
|
+
export declare function normalizeCropHarvestEntry(source: Partial<FieldCultivationCropHarvest> | undefined): FieldCultivationCropHarvest;
|
|
4
|
+
export declare function normalizeFieldCultivationDetailEntry(mode: FieldCultivationDetailMode, source: Partial<FieldCultivationDetailEntry> | undefined): FieldCultivationDetailEntry;
|
|
5
|
+
export declare function createEmptyFieldCultivationDetailEntry(mode: FieldCultivationDetailMode): FieldCultivationDetailEntry;
|
|
6
|
+
export declare function normalizeFieldCultivation(source: Partial<FieldCultivationData> | undefined): FieldCultivationData;
|
|
@@ -4,7 +4,6 @@ export declare class FieldSpreadingComponent {
|
|
|
4
4
|
private readonly dataSvc;
|
|
5
5
|
private readonly navigationSvc;
|
|
6
6
|
private readonly i18n;
|
|
7
|
-
private readonly rootData;
|
|
8
7
|
constructor();
|
|
9
8
|
readonly schema: import("@angular/core").Signal<JsonSchema>;
|
|
10
9
|
readonly localizedUi: import("@angular/core").Signal<UISchemaElement>;
|