@agridea/suibi-module 0.1.0-preview.9d0dbe2 → 0.1.0-preview.a4b0024
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 +68 -68
- 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 +68 -68
- package/dist/elements/browser/{suibi-module.v0.1.0-preview.9d0dbe2.css → suibi-module.v0.1.0-preview.a4b0024.css} +1 -1
- package/dist/elements/browser/{suibi-module.v0.1.0-preview.9d0dbe2.js → suibi-module.v0.1.0-preview.a4b0024.js} +68 -68
- package/dist/elements/browser/version.txt +1 -1
- package/dist/elements/browser/wc-global-utilities.css +1 -1
- package/dist/types/app/components/data-preview/data-preview.component.d.ts +222 -0
- package/dist/types/app/core/planning/planning-balance.service.d.ts +6 -0
- package/dist/types/app/core/utils/custom-unit.util.d.ts +14 -3
- package/dist/types/app/core/utils/object.util.d.ts +5 -0
- package/dist/types/app/nutrient-cycle/farm-manure-trading/farm-manure-trading-table/farm-manure-trading-table.component.d.ts +1 -1
- package/dist/types/app/nutrient-cycle/field-cultivation/arable-land-table/arable-land-table.config.d.ts +2 -0
- package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation.types.d.ts +2 -1
- package/dist/types/app/nutrient-cycle/field-cultivation/field-cultivation.util.d.ts +4 -0
- package/dist/types/app/nutrient-cycle/field-cultivation/special-crops-table/special-crops-table.component.d.ts +4 -4
- package/dist/types/app/nutrient-cycle/field-cultivation/special-crops-table/special-crops-table.config.d.ts +20 -30
- package/dist/types/app/nutrient-cycle/field-spreading/fertiliser-table/fertiliser-table.component.d.ts +1 -1
- package/dist/types/app/nutrient-cycle/field-spreading/recycling-table/recycling-table.component.d.ts +1 -1
- package/dist/types/app/nutrient-cycle/fodder/fodder-table/fodder-table.component.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
0.1.0-preview.
|
|
1
|
+
0.1.0-preview.a4b0024 a4b0024
|
|
@@ -1 +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}
|
|
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}
|
|
@@ -3,9 +3,231 @@ import { PlanningBalanceService } from '../../core/planning/planning-balance.ser
|
|
|
3
3
|
export declare class DataPreviewComponent {
|
|
4
4
|
private readonly host;
|
|
5
5
|
private readonly emitter;
|
|
6
|
+
private readonly clipboard;
|
|
6
7
|
readonly planning: PlanningBalanceService;
|
|
7
8
|
readonly naebi: NaebiDataService;
|
|
8
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
|
+
}>;
|
|
9
230
|
setPlanningEndpoint(value: string | null): void;
|
|
10
231
|
emitData(): void;
|
|
232
|
+
copyJson(getValue: () => unknown): void;
|
|
11
233
|
}
|
|
@@ -33,6 +33,12 @@ export declare class PlanningBalanceService {
|
|
|
33
33
|
};
|
|
34
34
|
readonly selectedEndpoint: import("@angular/core").Signal<PlanningEndpoint>;
|
|
35
35
|
setSelectedEndpoint(endpoint: PlanningEndpoint): void;
|
|
36
|
+
/**
|
|
37
|
+
* Builds the exact payload posted to the planning API: calculationVersion stamped from
|
|
38
|
+
* the current metadata, empty ingredient/routine slots stripped, null optional fields
|
|
39
|
+
* and host-only fields removed, custom display units converted to base units.
|
|
40
|
+
*/
|
|
41
|
+
buildApiPayload(data: NaebiData): NaebiData;
|
|
36
42
|
/** Fire a new planning-balance request with the current NAEBI data payload. */
|
|
37
43
|
runPlanning(data: NaebiData, endpoint?: PlanningEndpoint): void;
|
|
38
44
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export interface CustomUnit {
|
|
2
|
-
/** Unit code stored on the row (e.g. 'ha', 't', '
|
|
2
|
+
/** Unit code stored on the row (e.g. 'ha', 't', 'dt'). */
|
|
3
3
|
code: string;
|
|
4
4
|
/** API base unit this custom unit converts to (e.g. 'm2', 'kg'). */
|
|
5
5
|
baseUnit: string;
|
|
@@ -13,15 +13,26 @@ export declare function isCustomUnit(unit: unknown): boolean;
|
|
|
13
13
|
/** Base unit a quantity can be converted to: the custom unit's `baseUnit`, or the unit
|
|
14
14
|
* itself when it already is a base (or unknown) unit. */
|
|
15
15
|
export declare function baseUnitOf(unit: string | null | undefined): string | null | undefined;
|
|
16
|
-
/** Custom units convertible to the given base unit (e.g. 'kg' → [t,
|
|
16
|
+
/** Custom units convertible to the given base unit (e.g. 'kg' → [t, dt]). */
|
|
17
17
|
export declare function customUnitsForBaseUnit(baseUnit: string): CustomUnit[];
|
|
18
|
+
/**
|
|
19
|
+
* Builds a filter (compatible with the inline table's `optionsFilter`) keeping only the
|
|
20
|
+
* units compatible with the given context base unit — i.e. the base unit itself plus its
|
|
21
|
+
* custom units. Pass a nullable base (e.g. derived from a product's matterState): `null`
|
|
22
|
+
* keeps the full list (nothing derived yet).
|
|
23
|
+
*
|
|
24
|
+
* Works on any entry shape exposing `id` (and `baseUnit` for custom units).
|
|
25
|
+
*/
|
|
26
|
+
export declare function unitOptionsForBaseUnit<T extends {
|
|
27
|
+
id: string | number;
|
|
28
|
+
}>(contextBaseUnit: string | null | undefined): (entry: T) => boolean;
|
|
18
29
|
/** Converts a quantity expressed in a custom unit to its base unit; pass-through for
|
|
19
30
|
* base/unknown units and null quantities. */
|
|
20
31
|
export declare function convertToBaseUnit(quantity: number | null | undefined, unit: string | null | undefined): {
|
|
21
32
|
quantity: number | null | undefined;
|
|
22
33
|
unit: string | null | undefined;
|
|
23
34
|
};
|
|
24
|
-
/** Converts a quantity between two units sharing the same base unit (kg ↔ t ↔
|
|
35
|
+
/** Converts a quantity between two units sharing the same base unit (kg ↔ t ↔ dt,
|
|
25
36
|
* m2 ↔ ha). Returns the quantity unchanged when either unit is missing or the units
|
|
26
37
|
* are incompatible (different base units). */
|
|
27
38
|
export declare function convertQuantityBetween(quantity: number | null | undefined, fromUnit: string | null | undefined, toUnit: string | null | undefined): number | null | undefined;
|
|
@@ -34,6 +34,11 @@ export declare function stripIncompleteIngredients<T>(value: T): T;
|
|
|
34
34
|
* feedingOfCropHarvest, dispenseOfCropHarvest): any null property is dropped
|
|
35
35
|
* (fieldName, userSpecificPlantName, yieldPerSquareMeasure, effectiveYield, …)
|
|
36
36
|
* - `nutrientCycle.fodder.trading.<collection>[].quantity`: null → dropped
|
|
37
|
+
* - `nutrientCycle.animalStock[].feeding.(winter|summer)Feeding`: never-filled routine
|
|
38
|
+
* slots (`{}` rows pre-created by the inline tables) and null fields are dropped;
|
|
39
|
+
* a season — and `feeding` itself — is removed when nothing filled-in remains
|
|
40
|
+
* - `nutrientCycle.fieldSpreading`: null fields dropped (`soilPh`, `slurry.*`,
|
|
41
|
+
* `manure.*`); `slurry`/`manure` removed when nothing filled-in remains
|
|
37
42
|
*/
|
|
38
43
|
export declare function sanitizePlanningPayload(data: NaebiDataLike): NaebiDataLike;
|
|
39
44
|
/** Structural type so object.util stays free of a NaebiData import (circular-safe). */
|
|
@@ -12,7 +12,7 @@ type TradingRow = FarmManureTradingSupply | FarmManureTradingDispense;
|
|
|
12
12
|
* 3. Supplies `deriveUnits` as a `rowTransform` — the base `transactionUnit` ('kg'/'m3')
|
|
13
13
|
* and every ingredient's `unit` ('kg/t'/'kg/m3') are derived from the selected
|
|
14
14
|
* product's matterState; the user may switch to a custom unit sharing the same base
|
|
15
|
-
* (t,
|
|
15
|
+
* (t, dt for kg), which converts the entered quantity on the fly.
|
|
16
16
|
*/
|
|
17
17
|
export declare class FarmManureTradingTableComponent {
|
|
18
18
|
readonly mode: import("@angular/core").InputSignal<FarmManureTradingMode>;
|
|
@@ -6,4 +6,6 @@
|
|
|
6
6
|
* `agronomicCropCategoryArableLand` code list as-is, keeping its existing order.
|
|
7
7
|
*/
|
|
8
8
|
import type { InlineTableConfig } from '../../../components/inline-table/inline-table.types';
|
|
9
|
+
/** Looks up the row's selected crop in the arable-land code list. */
|
|
10
|
+
export declare function arableCrop(row: Record<string, unknown>): Record<string, unknown> | undefined;
|
|
9
11
|
export declare const ARABLE_LAND_TABLE_CONFIG: InlineTableConfig;
|
|
@@ -11,7 +11,8 @@ export interface FieldCultivationCropHarvest {
|
|
|
11
11
|
export interface FieldCultivationBaseEntry {
|
|
12
12
|
agronomicCropCategory?: string | null;
|
|
13
13
|
userSpecificPlantName?: string | null;
|
|
14
|
-
|
|
14
|
+
/** Null for CSC_OUTVG special crops — the main-crop concept does not apply to them. */
|
|
15
|
+
isMainCrop?: boolean | null;
|
|
15
16
|
areaSize?: number | null;
|
|
16
17
|
/** Host-only display unit for areaSize ('m2' base, or custom e.g. 'ha') — persisted in
|
|
17
18
|
* the dossier, converted to m2 and stripped before the planning POST (docs/custom-units.md). */
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { FieldCultivationCropHarvest, FieldCultivationData, FieldCultivationDetailEntry, FieldCultivationDetailMode, FieldCultivationRequirementCorrection } from './field-cultivation.types';
|
|
2
|
+
/** Subcategory whose special crops are never a main crop — `isMainCrop` must be null. */
|
|
3
|
+
export declare const OUTDOOR_VEGETABLE_SUBCATEGORY = "CSC_OUTVG";
|
|
4
|
+
/** True when the crop code belongs to the outdoor-vegetable subcategory (CSC_OUTVG). */
|
|
5
|
+
export declare function isOutdoorVegetableCrop(cropCode: unknown): boolean;
|
|
2
6
|
export declare function normalizeRequirementCorrection(source: Partial<FieldCultivationRequirementCorrection> | undefined): FieldCultivationRequirementCorrection;
|
|
3
7
|
export declare function normalizeCropHarvestEntry(source: Partial<FieldCultivationCropHarvest> | undefined): FieldCultivationCropHarvest;
|
|
4
8
|
export declare function normalizeFieldCultivationDetailEntry(mode: FieldCultivationDetailMode, source: Partial<FieldCultivationDetailEntry> | undefined): FieldCultivationDetailEntry;
|
|
@@ -19,11 +19,11 @@ export declare class SpecialCropsTableComponent {
|
|
|
19
19
|
onRowsChange(rows: Record<string, unknown>[]): void;
|
|
20
20
|
/**
|
|
21
21
|
* Domain rules applied on every edit:
|
|
22
|
-
* -
|
|
22
|
+
* - the unit of the managed nutrient slots is fixed (corrections in %),
|
|
23
23
|
* - managed slots left empty are dropped (the API rejects null quantities),
|
|
24
|
-
* -
|
|
25
|
-
*
|
|
26
|
-
*
|
|
24
|
+
* - CSC_OUTVG crops carry `isMainCrop: null` (not a main-crop concept),
|
|
25
|
+
* - selecting a crop pre-fills the three corrections (P2O5/K2O/Mg) at 100 %;
|
|
26
|
+
* clearing the crop removes the managed slots.
|
|
27
27
|
*/
|
|
28
28
|
readonly enforceSpecialCropRules: (changedKey: string, newValue: unknown, row: Record<string, unknown>, previousRow?: Record<string, unknown>) => Record<string, unknown>;
|
|
29
29
|
}
|
|
@@ -4,19 +4,11 @@
|
|
|
4
4
|
*
|
|
5
5
|
* ONE table for the whole CULT_SPECIAL category: the crop dropdown reuses the
|
|
6
6
|
* `agronomicCropCategorySpecial` code list, which is already filtered on
|
|
7
|
-
* cultivationCategory === 'CULT_SPECIAL'.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* Which nutrient columns apply depends on the selected crop's
|
|
12
|
-
* cultivationSubCategory (NäBIS backend rule): Gemüse (CSC_PRCRP, CSC_OUTVG)
|
|
13
|
-
* get Nmin + P/K/Mg; Dauerkulturen (CSC_DIVCR, CSC_ECOBL, CSC_PRMCR) get only
|
|
14
|
-
* P/K/Mg — no Nmin.
|
|
7
|
+
* cultivationCategory === 'CULT_SPECIAL'. The nutrient columns are the three
|
|
8
|
+
* corrections (P2O5/K2O/Mg slots in %) living in the row's
|
|
9
|
+
* `requirementCorrection[]` sub-array.
|
|
15
10
|
*/
|
|
16
11
|
import type { InlineTableConfig } from '../../../components/inline-table/inline-table.types';
|
|
17
|
-
/** Nmin maps to the N2 requirement-correction slot, always expressed in kg. */
|
|
18
|
-
export declare const NMIN_FORMULA = "N2";
|
|
19
|
-
export declare const NMIN_UNIT = "kg";
|
|
20
12
|
/** Correction slots managed by the table, always expressed in % (100 % = no correction). */
|
|
21
13
|
export declare const CORRECTION_FORMULAS: readonly ["P2O5", "K2O", "Mg"];
|
|
22
14
|
export declare const CORRECTION_UNIT = "%";
|
|
@@ -27,35 +19,33 @@ export declare const SPECIAL_CROPS_CODE_LIST = "agronomicCropCategorySpecial";
|
|
|
27
19
|
export declare const SPECIAL_CROPS_IDS: Set<string>;
|
|
28
20
|
/** Looks up a crop entry in the table's code list. */
|
|
29
21
|
export declare function specialCropEntry(id: unknown): Record<string, unknown> | undefined;
|
|
30
|
-
/**
|
|
31
|
-
export declare
|
|
32
|
-
/**
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
22
|
+
/** True when the row's crop belongs to the outdoor-vegetable subcategory (CSC_OUTVG). */
|
|
23
|
+
export declare function isOutdoorVegetableRow(row: Record<string, unknown>): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Enforces the isMainCrop rule: null for CSC_OUTVG crops (the main-crop concept does
|
|
26
|
+
* not apply), restored to false when switching back to a crop where the flag applies.
|
|
27
|
+
*/
|
|
28
|
+
export declare function normalizeIsMainCrop(row: Record<string, unknown>): Record<string, unknown>;
|
|
36
29
|
/** Corrections (P2O5/K2O/Mg) apply to every special crop; locked only without a crop. */
|
|
37
30
|
export declare function correctionColumnsLocked(crop: Record<string, unknown> | undefined): boolean;
|
|
38
31
|
/**
|
|
39
|
-
* Applies the crop's defaults to the requirement-correction slots
|
|
40
|
-
* crop's cultivationSubCategory:
|
|
32
|
+
* Applies the crop's defaults to the requirement-correction slots:
|
|
41
33
|
* - No crop selected: the managed slots are removed entirely — nothing is editable
|
|
42
34
|
* and nothing is sent to the API.
|
|
43
|
-
* -
|
|
44
|
-
*
|
|
45
|
-
* - Dauerkulturen (CSC_DIVCR/CSC_ECOBL/CSC_PRMCR): only the three corrections,
|
|
46
|
-
* reset to 100 % — no Nmin slot.
|
|
35
|
+
* - Crop selected: the three corrections (P2O5/K2O/Mg) are reset to 100 % and
|
|
36
|
+
* stay user-editable.
|
|
47
37
|
*/
|
|
48
38
|
export declare function applyCropDefaults(row: Record<string, unknown>, crop: Record<string, unknown> | undefined): Record<string, unknown>;
|
|
49
39
|
/**
|
|
50
|
-
* Normalizes the managed requirement-correction slots on every edit: fixed
|
|
51
|
-
* (
|
|
52
|
-
*
|
|
40
|
+
* Normalizes the managed requirement-correction slots on every edit: fixed unit
|
|
41
|
+
* (%) and removal of managed entries left without a quantity (the API rejects
|
|
42
|
+
* present-but-null quantities).
|
|
53
43
|
*/
|
|
54
44
|
export declare function normalizeManagedCorrections(row: Record<string, unknown>): Record<string, unknown>;
|
|
55
45
|
/**
|
|
56
|
-
* Shared column definitions for the requirement-correction sub-array (
|
|
57
|
-
* reusable across fodder, arable and special tables. `
|
|
58
|
-
*
|
|
46
|
+
* Shared column definitions for the requirement-correction sub-array (P2O5/K2O/Mg),
|
|
47
|
+
* reusable across fodder, arable and special tables. `lockCorrections` disables
|
|
48
|
+
* editing per row.
|
|
59
49
|
*/
|
|
60
|
-
export declare function requirementCorrectionColumns(
|
|
50
|
+
export declare function requirementCorrectionColumns(lockCorrections: (row: Record<string, unknown>) => boolean): InlineTableConfig['columns'];
|
|
61
51
|
export declare const SPECIAL_CROPS_TABLE_CONFIG: InlineTableConfig;
|
|
@@ -34,7 +34,7 @@ export declare class FertiliserTableComponent {
|
|
|
34
34
|
* Row transform for auto-populating nutrient columns when a product is selected.
|
|
35
35
|
*
|
|
36
36
|
* Unit handling: `transactionUnit` is user-selectable between kg and its custom units
|
|
37
|
-
* (t,
|
|
37
|
+
* (t, dt). Switching the unit converts the already-entered quantity so the amount is
|
|
38
38
|
* preserved; legacy/imported rows without a unit default to kg.
|
|
39
39
|
*
|
|
40
40
|
* Defined as an arrow-function property so `this` is never needed and the function
|
package/dist/types/app/nutrient-cycle/field-spreading/recycling-table/recycling-table.component.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { FieldSpreadingRecyclingEntry } from '../field-spreading.types';
|
|
|
9
9
|
* 3. Supplies `deriveUnits` as a `rowTransform` — the base `transactionUnit` ('kg'/'m3')
|
|
10
10
|
* and every ingredient's `unit` ('kg/t'/'kg/m3') are derived from the selected
|
|
11
11
|
* product's matterState; the user may switch to a custom unit sharing the same base
|
|
12
|
-
* (t,
|
|
12
|
+
* (t, dt for kg), which converts the entered quantity on the fly.
|
|
13
13
|
*/
|
|
14
14
|
export declare class RecyclingTableComponent {
|
|
15
15
|
readonly entries: import("@angular/core").InputSignal<FieldSpreadingRecyclingEntry[]>;
|
|
@@ -19,7 +19,7 @@ export declare class FodderTableComponent {
|
|
|
19
19
|
* when it is not permitted for the new kind.
|
|
20
20
|
* - Product change: pre-fill the dry matter share (T/S %) with the product's
|
|
21
21
|
* `standardDryMatterContent` (stays editable afterwards; null when none is defined).
|
|
22
|
-
* - `transactionUnit` is selectable between kg and its custom units (t,
|
|
22
|
+
* - `transactionUnit` is selectable between kg and its custom units (t, dt): switching
|
|
23
23
|
* converts the entered quantity so the amount is preserved; rows without a unit
|
|
24
24
|
* default to kg. The only permitted ingredient is dry matter (T/S) in % — re-appended
|
|
25
25
|
* when missing.
|