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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- 0.1.0-preview.4849424 4849424
1
+ 0.1.0-preview.557ea51 557ea51
@@ -1,4 +1,13 @@
1
+ import { ErrorObject } from 'ajv';
2
+ import { PageId } from '../../core/navigation/navigation.service';
1
3
  import { PlanningBalanceService } from '../../core/planning/planning-balance.service';
2
4
  export declare class ResultsPageComponent {
5
+ readonly currentPage: import("@angular/core").InputSignal<PageId>;
6
+ readonly onNavigate: import("@angular/core").InputSignal<(page: PageId) => void>;
7
+ readonly onErrorSelected: import("@angular/core").InputSignal<(error: ErrorObject) => void>;
8
+ readonly onSubmitSuccess: import("@angular/core").InputSignal<() => void>;
3
9
  protected readonly planning: PlanningBalanceService;
10
+ protected readonly selectedTabIndex: import("@angular/core").WritableSignal<number>;
11
+ constructor();
12
+ protected onTabChange(index: number): void;
4
13
  }
@@ -4,6 +4,7 @@ import { PlanningBalanceService } from '../../core/planning/planning-balance.ser
4
4
  * Final submission step: review validation status and submit the planning balance.
5
5
  */
6
6
  export declare class ValidationPageComponent {
7
+ readonly showHeader: import("@angular/core").InputSignal<boolean>;
7
8
  /** Navigation callback for validation error clicks — provided by App to keep routing logic centralised. */
8
9
  readonly onErrorSelected: import("@angular/core").InputSignal<(error: ErrorObject) => void>;
9
10
  /** Navigation callback triggered after a fresh successful planning submission. */
@@ -39,14 +39,11 @@ export declare class WorkflowStepperComponent {
39
39
  */
40
40
  readonly onNavigate: import("@angular/core").InputSignal<(page: PageId) => void>;
41
41
  private readonly validationSvc;
42
- private readonly planningSvc;
42
+ private readonly workflowPage;
43
43
  protected readonly pagesWithErrors: import("@angular/core").Signal<Set<PageId>>;
44
44
  protected readonly isOnWorkflowPage: import("@angular/core").Signal<boolean>;
45
- protected readonly hasPlanningResult: import("@angular/core").Signal<boolean>;
46
- protected readonly isResultsStepDisabled: import("@angular/core").Signal<boolean>;
47
45
  protected readonly clampedStepIndex: import("@angular/core").Signal<number>;
48
46
  protected onSelectedIndexChange(index: number): void;
49
47
  protected onStepperClick(event: MouseEvent): void;
50
48
  private navigateTo;
51
- private isStepDisabled;
52
49
  }
@@ -185,6 +185,16 @@ export declare class NaebiDataService {
185
185
  unit: string;
186
186
  }[];
187
187
  }[];
188
+ dispense: {
189
+ typeOfFeedstuffProduct: string;
190
+ quantity: number;
191
+ transactionUnit: string;
192
+ ingredient: {
193
+ quantity: number;
194
+ molecularFormula: string;
195
+ unit: string;
196
+ }[];
197
+ }[];
188
198
  };
189
199
  cropFromNonFodderCropland: {
190
200
  typeOfFeedstuffProduct: string;
@@ -1,7 +1,9 @@
1
- export type PageId = 'welcome' | 'animal_stock' | 'data_preview' | 'storage' | 'field_spreading' | 'farm_manure_trading' | 'field_cultivation' | 'validation' | 'results';
1
+ export type PageId = 'welcome' | 'animal_stock' | 'data_preview' | 'storage' | 'field_spreading' | 'farm_manure_trading' | 'fodder' | 'field_cultivation' | 'validation' | 'results';
2
2
  export type AnimalStockCategory = 'base' | 'formOfDetention' | 'feeding';
3
3
  export type FarmManureTradingMode = 'supply' | 'dispense';
4
4
  export type FarmManureTradingCategory = 'general' | 'derivation' | 'ingredients';
5
+ export type FodderMode = 'supply' | 'dispense' | 'non_fodder_cropland';
6
+ export type FodderCategory = 'general' | 'ingredients';
5
7
  export type FieldSpreadingCategory = 'general' | 'fertiliser' | 'recycling';
6
8
  export type StorageTab = 'manure' | 'slurry';
7
9
  export type StorageEntryType = 'manure_pit' | 'slurry_tank';
@@ -40,6 +42,11 @@ export declare class NavigationService {
40
42
  mode: FarmManureTradingMode;
41
43
  index: number;
42
44
  } | null>;
45
+ /** Selected fodder detail context (mode + index) */
46
+ readonly selectedFodderDetail: import("@angular/core").WritableSignal<{
47
+ mode: FodderMode;
48
+ index: number;
49
+ } | null>;
43
50
  /** Selected storage detail context (type + index) */
44
51
  readonly selectedStorageDetail: import("@angular/core").WritableSignal<{
45
52
  type: StorageEntryType;
@@ -65,6 +72,8 @@ export declare class NavigationService {
65
72
  navigateToAnimalStockDetail(index: number, category?: AnimalStockCategory): void;
66
73
  navigateToFarmManureTradingDetail(mode: FarmManureTradingMode, index: number, category?: FarmManureTradingCategory): void;
67
74
  navigateToFarmManureTradingList(): void;
75
+ navigateToFodderDetail(mode: FodderMode, index: number, category?: FodderCategory): void;
76
+ navigateToFodderList(): void;
68
77
  navigateToFieldSpreading(category?: FieldSpreadingCategory): void;
69
78
  navigateToStorageDetail(type: StorageEntryType, index: number): void;
70
79
  navigateToStorageList(tab?: StorageTab): void;
@@ -1,5 +1,5 @@
1
1
  import { ErrorObject } from 'ajv';
2
- import { AnimalStockCategory, FarmManureTradingCategory, FarmManureTradingMode, FieldSpreadingCategory, PageId, StorageEntryType, StorageTab } from '../navigation/navigation.service';
2
+ import { AnimalStockCategory, FarmManureTradingCategory, FarmManureTradingMode, FieldSpreadingCategory, FodderCategory, FodderMode, PageId, StorageEntryType, StorageTab } from '../navigation/navigation.service';
3
3
  export interface EnrichedValidationError extends ErrorObject {
4
4
  /** Human-friendly field label (e.g., "Animal Category") */
5
5
  fieldLabel?: string;
@@ -17,6 +17,12 @@ 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;
22
28
  /** Storage detail type */
@@ -43,6 +49,7 @@ export declare class GlobalValidationService {
43
49
  private inferCategory;
44
50
  private inferFarmTradingCategory;
45
51
  private inferFieldSpreadingCategory;
52
+ private inferFodderCategory;
46
53
  private inferStorageTab;
47
54
  private inferFieldLabel;
48
55
  }
@@ -1,8 +1,10 @@
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;
@@ -17,9 +19,8 @@ export declare class CodeListSelectRenderer extends BaseSelectControl<number | s
17
19
  private readonly filterConfig;
18
20
  private readonly emptyHintKey;
19
21
  private readonly dependsOnDataPath;
20
- private readonly autoDependsOnScope;
22
+ private readonly autoDependsOnDataPath;
21
23
  private scopePointerToDataPath;
22
- private replacePointerLeaf;
23
24
  private inferListKeyFromScope;
24
25
  private readValueAtPath;
25
26
  readonly filteredOptions: Signal<BaseCodeListEntry[]>;
@@ -0,0 +1,32 @@
1
+ import { EventEmitter, Signal } from '@angular/core';
2
+ import { JsonSchema, UISchemaElement } from '@jsonforms/core';
3
+ import { FodderMode } from '../../core/navigation/navigation.service';
4
+ import { FodderCropFromNonFodderCropland, FodderDispense, FodderSupply } from './fodder.types';
5
+ type FodderRow = FodderSupply | FodderDispense | FodderCropFromNonFodderCropland;
6
+ export declare class FodderDetailComponent {
7
+ private readonly i18n;
8
+ row: Signal<FodderRow | null>;
9
+ index: Signal<number | null>;
10
+ mode: import("@angular/core").InputSignal<FodderMode>;
11
+ rowChange: EventEmitter<FodderRow>;
12
+ close: EventEmitter<void>;
13
+ readonly renderers: {
14
+ tester: import("@jsonforms/core").RankedTester;
15
+ renderer: any;
16
+ }[];
17
+ readonly suibiAjv: import("ajv").Ajv;
18
+ private readonly baseSchemas;
19
+ private readonly baseUis;
20
+ readonly itemSchema: Signal<JsonSchema>;
21
+ readonly localizedUi: Signal<UISchemaElement>;
22
+ readonly detailTitle: Signal<string>;
23
+ readonly jsonFormsData: Signal<({
24
+ quantity?: number;
25
+ typeOfFeedstuffProduct?: string;
26
+ transactionUnit?: string;
27
+ ingredient?: import("./fodder.types").FodderIngredient[];
28
+ } & import("../../core/schemas/ui-helper-registry").UiHelperDefinitions) | null>;
29
+ onDataChange(event: unknown): void;
30
+ private applyDerivedFields;
31
+ }
32
+ export {};
@@ -0,0 +1,21 @@
1
+ import { EventEmitter, Signal } from '@angular/core';
2
+ import { FodderCropFromNonFodderCropland, FodderDispense, FodderSupply } from './fodder.types';
3
+ import { FodderMode } from '../../core/navigation/navigation.service';
4
+ type FodderRow = FodderSupply | FodderDispense | FodderCropFromNonFodderCropland;
5
+ export declare class FodderListComponent {
6
+ private readonly masterData;
7
+ private readonly i18n;
8
+ rows: Signal<FodderRow[]>;
9
+ selectedIndex: Signal<number | null>;
10
+ mode: FodderMode;
11
+ select: EventEmitter<number>;
12
+ add: EventEmitter<void>;
13
+ delete: EventEmitter<number>;
14
+ readonly displayedColumns: string[];
15
+ resolveProduct(code: string | null | undefined): string;
16
+ emptyLabel(): string;
17
+ emptyHintLabel(): string;
18
+ addLabel(): string;
19
+ onDelete(index: number, event: Event): void;
20
+ }
21
+ export {};
@@ -0,0 +1,37 @@
1
+ import { FodderMode } from '../../core/navigation/navigation.service';
2
+ import { FodderCropFromNonFodderCropland, FodderDispense, FodderSupply } from './fodder.types';
3
+ type FodderRow = FodderSupply | FodderDispense | FodderCropFromNonFodderCropland;
4
+ export declare class FodderMasterDetailComponent {
5
+ private readonly dataSvc;
6
+ private readonly navigationSvc;
7
+ constructor();
8
+ readonly supplyRows: import("@angular/core").Signal<FodderSupply[]>;
9
+ readonly dispenseRows: import("@angular/core").Signal<FodderDispense[]>;
10
+ readonly nonFodderCroplandRows: import("@angular/core").Signal<FodderCropFromNonFodderCropland[]>;
11
+ readonly proportionStorageLoss: import("@angular/core").Signal<number | undefined>;
12
+ readonly totalBalanceErrorMargin: import("@angular/core").Signal<number | undefined>;
13
+ readonly activeTab: import("@angular/core").WritableSignal<FodderMode>;
14
+ readonly selectedSupplyIndex: import("@angular/core").WritableSignal<number | null>;
15
+ readonly selectedDispenseIndex: import("@angular/core").WritableSignal<number | null>;
16
+ readonly selectedNonFodderCroplandIndex: import("@angular/core").WritableSignal<number | null>;
17
+ readonly currentDetail: import("@angular/core").Signal<FodderRow | null>;
18
+ readonly currentIndex: import("@angular/core").Signal<number | null>;
19
+ readonly detailOpen: import("@angular/core").Signal<boolean>;
20
+ readonly activeTabIndex: import("@angular/core").Signal<0 | 1 | 2>;
21
+ onTabChange(index: number): void;
22
+ openDetail(mode: FodderMode, index: number): void;
23
+ closeDetail(): void;
24
+ addEntry(mode: FodderMode): void;
25
+ deleteEntry(mode: FodderMode, index: number): void;
26
+ onDetailChange(payload: FodderRow): void;
27
+ onScalarInput(field: 'proportionStorageLoss' | 'totalBalanceErrorMargin', rawValue: string): void;
28
+ scalarInputValue(value: number | undefined): string;
29
+ private clearInvalidSelection;
30
+ private selectedIndexSignal;
31
+ private rowsForMode;
32
+ private createEmptyEntry;
33
+ private patchRows;
34
+ private cloneFodder;
35
+ private cloneTrading;
36
+ }
37
+ export {};
@@ -0,0 +1,27 @@
1
+ export interface FodderIngredient {
2
+ quantity?: number;
3
+ molecularFormula?: string;
4
+ unit?: string;
5
+ }
6
+ export interface FodderTradingEntry {
7
+ quantity?: number;
8
+ typeOfFeedstuffProduct?: string;
9
+ transactionUnit?: string;
10
+ ingredient?: FodderIngredient[];
11
+ }
12
+ export interface FodderSupply extends FodderTradingEntry {
13
+ }
14
+ export interface FodderDispense extends FodderTradingEntry {
15
+ }
16
+ export interface FodderCropFromNonFodderCropland extends FodderTradingEntry {
17
+ }
18
+ export interface FodderTradingData {
19
+ supply?: FodderSupply[];
20
+ dispense?: FodderDispense[];
21
+ }
22
+ export interface FodderData {
23
+ trading?: FodderTradingData;
24
+ cropFromNonFodderCropland?: FodderCropFromNonFodderCropland[];
25
+ proportionStorageLoss?: number;
26
+ totalBalanceErrorMargin?: number;
27
+ }
@@ -0,0 +1,2 @@
1
+ export declare const FODDER_TRANSACTION_UNIT = "kg";
2
+ export declare function deriveFodderTransactionUnit(): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agridea/suibi-module",
3
- "version": "0.1.0-preview.4849424",
3
+ "version": "0.1.0-preview.557ea51",
4
4
  "scripts": {
5
5
  "ng": "ng",
6
6
  "start": "ng serve --host 0.0.0.0",