@auditcore/ui-core 0.3.0

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 (186) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1326 -0
  3. package/dist/account/camera.d.ts +8 -0
  4. package/dist/account/controller.d.ts +30 -0
  5. package/dist/account/index.d.ts +7 -0
  6. package/dist/account/messages.d.ts +2 -0
  7. package/dist/account/port.d.ts +10 -0
  8. package/dist/account/presentation.d.ts +9 -0
  9. package/dist/account/types.d.ts +42 -0
  10. package/dist/account/view.d.ts +12 -0
  11. package/dist/attributes/controller.d.ts +26 -0
  12. package/dist/attributes/index.d.ts +5 -0
  13. package/dist/attributes/messages.d.ts +3 -0
  14. package/dist/attributes/port.d.ts +4 -0
  15. package/dist/attributes/types.d.ts +60 -0
  16. package/dist/attributes/view.d.ts +49 -0
  17. package/dist/base/icons.d.ts +38 -0
  18. package/dist/base/index.d.ts +3 -0
  19. package/dist/base/types.d.ts +3 -0
  20. package/dist/batchchecks/controller.d.ts +60 -0
  21. package/dist/batchchecks/index.d.ts +7 -0
  22. package/dist/batchchecks/messages.d.ts +3 -0
  23. package/dist/batchchecks/model.d.ts +38 -0
  24. package/dist/batchchecks/port.d.ts +6 -0
  25. package/dist/batchchecks/rest-port.d.ts +4 -0
  26. package/dist/batchchecks/types.d.ts +121 -0
  27. package/dist/batchchecks/view.d.ts +58 -0
  28. package/dist/benford/chart.d.ts +49 -0
  29. package/dist/benford/controller.d.ts +48 -0
  30. package/dist/benford/index.d.ts +7 -0
  31. package/dist/benford/messages.d.ts +3 -0
  32. package/dist/benford/model.d.ts +32 -0
  33. package/dist/benford/rest-port.d.ts +4 -0
  34. package/dist/benford/types.d.ts +144 -0
  35. package/dist/benford/view.d.ts +45 -0
  36. package/dist/dataprotection/dsfa.d.ts +55 -0
  37. package/dist/dataprotection/dsfaView.d.ts +45 -0
  38. package/dist/dataprotection/exporters.d.ts +33 -0
  39. package/dist/dataprotection/index.d.ts +10 -0
  40. package/dist/dataprotection/messages.d.ts +5 -0
  41. package/dist/dataprotection/registerView.d.ts +47 -0
  42. package/dist/dataprotection/requests.d.ts +16 -0
  43. package/dist/dataprotection/rest-port.d.ts +4 -0
  44. package/dist/dataprotection/types.d.ts +291 -0
  45. package/dist/dataprotection/vvt.d.ts +69 -0
  46. package/dist/dbkanban/controller.d.ts +54 -0
  47. package/dist/dbkanban/index.d.ts +3 -0
  48. package/dist/dbkanban/messages.d.ts +5 -0
  49. package/dist/dbkanban/view.d.ts +39 -0
  50. package/dist/documents/controller.d.ts +63 -0
  51. package/dist/documents/form.d.ts +52 -0
  52. package/dist/documents/importing.d.ts +12 -0
  53. package/dist/documents/index.d.ts +6 -0
  54. package/dist/documents/list.d.ts +21 -0
  55. package/dist/documents/messages.d.ts +8 -0
  56. package/dist/documents/view.d.ts +36 -0
  57. package/dist/download.d.ts +14 -0
  58. package/dist/extraction/controller.d.ts +34 -0
  59. package/dist/extraction/index.d.ts +5 -0
  60. package/dist/extraction/messages.d.ts +3 -0
  61. package/dist/extraction/rest-port.d.ts +4 -0
  62. package/dist/extraction/types.d.ts +115 -0
  63. package/dist/extraction/view.d.ts +35 -0
  64. package/dist/extrapolation/controller-subsample.d.ts +20 -0
  65. package/dist/extrapolation/controller.d.ts +72 -0
  66. package/dist/extrapolation/index.d.ts +9 -0
  67. package/dist/extrapolation/messages.d.ts +3 -0
  68. package/dist/extrapolation/model-design.d.ts +28 -0
  69. package/dist/extrapolation/model-subsample.d.ts +40 -0
  70. package/dist/extrapolation/model.d.ts +92 -0
  71. package/dist/extrapolation/rest-port.d.ts +4 -0
  72. package/dist/extrapolation/types.d.ts +255 -0
  73. package/dist/extrapolation/view-details.d.ts +46 -0
  74. package/dist/extrapolation/view.d.ts +50 -0
  75. package/dist/focus.d.ts +10 -0
  76. package/dist/geo/controller.d.ts +87 -0
  77. package/dist/geo/index.d.ts +6 -0
  78. package/dist/geo/mapView.d.ts +30 -0
  79. package/dist/geo/messages.d.ts +3 -0
  80. package/dist/geo/model.d.ts +43 -0
  81. package/dist/geo/rest-port.d.ts +12 -0
  82. package/dist/geo/types.d.ts +195 -0
  83. package/dist/i18n.d.ts +29 -0
  84. package/dist/identifiers/controller.d.ts +63 -0
  85. package/dist/identifiers/index.d.ts +5 -0
  86. package/dist/identifiers/messages.d.ts +3 -0
  87. package/dist/identifiers/model.d.ts +87 -0
  88. package/dist/identifiers/rest-port.d.ts +4 -0
  89. package/dist/identifiers/types.d.ts +101 -0
  90. package/dist/index.d.ts +33 -0
  91. package/dist/index.js +10676 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/kanban/index.d.ts +2 -0
  94. package/dist/kanban/messages.d.ts +6 -0
  95. package/dist/messages.d.ts +2 -0
  96. package/dist/reporting/controller.d.ts +46 -0
  97. package/dist/reporting/index.d.ts +5 -0
  98. package/dist/reporting/messages.d.ts +3 -0
  99. package/dist/reporting/rest-port.d.ts +4 -0
  100. package/dist/reporting/types.d.ts +72 -0
  101. package/dist/reporting/view.d.ts +12 -0
  102. package/dist/reporttemplates/controller.d.ts +46 -0
  103. package/dist/reporttemplates/index.d.ts +5 -0
  104. package/dist/reporttemplates/messages.d.ts +3 -0
  105. package/dist/reporttemplates/port.d.ts +4 -0
  106. package/dist/reporttemplates/types.d.ts +92 -0
  107. package/dist/reporttemplates/view.d.ts +27 -0
  108. package/dist/risk/controller.d.ts +54 -0
  109. package/dist/risk/format.d.ts +13 -0
  110. package/dist/risk/index.d.ts +7 -0
  111. package/dist/risk/labels.d.ts +9 -0
  112. package/dist/risk/messages.d.ts +3 -0
  113. package/dist/risk/port.d.ts +41 -0
  114. package/dist/risk/state.d.ts +61 -0
  115. package/dist/risk/types.d.ts +107 -0
  116. package/dist/runner/aktionen.d.ts +16 -0
  117. package/dist/runner/controller.d.ts +72 -0
  118. package/dist/runner/eingabe.d.ts +5 -0
  119. package/dist/runner/index.d.ts +9 -0
  120. package/dist/runner/messages.d.ts +3 -0
  121. package/dist/runner/port.d.ts +20 -0
  122. package/dist/runner/profil.d.ts +39 -0
  123. package/dist/runner/types.d.ts +109 -0
  124. package/dist/runner/view-listen.d.ts +32 -0
  125. package/dist/runner/view.d.ts +95 -0
  126. package/dist/samplesize/controller.d.ts +33 -0
  127. package/dist/samplesize/index.d.ts +7 -0
  128. package/dist/samplesize/messages.d.ts +3 -0
  129. package/dist/samplesize/model.d.ts +40 -0
  130. package/dist/samplesize/port.d.ts +9 -0
  131. package/dist/samplesize/types.d.ts +92 -0
  132. package/dist/samplesize/view.d.ts +39 -0
  133. package/dist/sampling/controller.d.ts +62 -0
  134. package/dist/sampling/index.d.ts +6 -0
  135. package/dist/sampling/messages.d.ts +3 -0
  136. package/dist/sampling/model.d.ts +63 -0
  137. package/dist/sampling/rest-port.d.ts +4 -0
  138. package/dist/sampling/types.d.ts +136 -0
  139. package/dist/sampling/view.d.ts +45 -0
  140. package/dist/screening/controller.d.ts +52 -0
  141. package/dist/screening/index.d.ts +8 -0
  142. package/dist/screening/messages.d.ts +7 -0
  143. package/dist/screening/rest-port.d.ts +4 -0
  144. package/dist/screening/runForm.d.ts +22 -0
  145. package/dist/screening/types.d.ts +295 -0
  146. package/dist/screening/view.d.ts +84 -0
  147. package/dist/store.d.ts +30 -0
  148. package/dist/synopsis/controller.d.ts +68 -0
  149. package/dist/synopsis/exporters.d.ts +16 -0
  150. package/dist/synopsis/index.d.ts +8 -0
  151. package/dist/synopsis/messages.d.ts +3 -0
  152. package/dist/synopsis/navigation.d.ts +5 -0
  153. package/dist/synopsis/port.d.ts +38 -0
  154. package/dist/synopsis/types.d.ts +121 -0
  155. package/dist/synopsis/viewModel.d.ts +74 -0
  156. package/dist/synopsis/wordDiff.d.ts +31 -0
  157. package/dist/table/index.d.ts +6 -0
  158. package/dist/tabular/index.d.ts +2 -0
  159. package/dist/tabular/messages.d.ts +3 -0
  160. package/dist/tabular/tableImport.d.ts +40 -0
  161. package/package.json +55 -0
  162. package/styles/account.css +37 -0
  163. package/styles/attributes.css +18 -0
  164. package/styles/base.css +116 -0
  165. package/styles/batchchecks.css +26 -0
  166. package/styles/benford.css +39 -0
  167. package/styles/dataprotection.css +68 -0
  168. package/styles/dbkanban.css +38 -0
  169. package/styles/documents.css +51 -0
  170. package/styles/extraction.css +25 -0
  171. package/styles/extrapolation.css +34 -0
  172. package/styles/geo.css +54 -0
  173. package/styles/identifiers.css +38 -0
  174. package/styles/index.css +24 -0
  175. package/styles/kanban.css +115 -0
  176. package/styles/reporting.css +22 -0
  177. package/styles/reporttemplates.css +21 -0
  178. package/styles/risk.css +92 -0
  179. package/styles/runner.css +54 -0
  180. package/styles/samplesize.css +27 -0
  181. package/styles/sampling.css +31 -0
  182. package/styles/screening.css +86 -0
  183. package/styles/synopsis.css +83 -0
  184. package/styles/table.css +17 -0
  185. package/styles/tabular.css +11 -0
  186. package/styles/tokens.css +121 -0
@@ -0,0 +1,49 @@
1
+ import { ConformityRow } from './types';
2
+ export interface ChartBox {
3
+ width: number;
4
+ height: number;
5
+ top: number;
6
+ right: number;
7
+ bottom: number;
8
+ left: number;
9
+ }
10
+ export interface ChartBar {
11
+ digit: number;
12
+ x: number;
13
+ y: number;
14
+ width: number;
15
+ height: number;
16
+ exceeds: boolean;
17
+ }
18
+ export interface ChartGeometry {
19
+ box: ChartBox;
20
+ plot: {
21
+ x: number;
22
+ y: number;
23
+ width: number;
24
+ height: number;
25
+ };
26
+ bars: ChartBar[];
27
+ expected: {
28
+ x: number;
29
+ y: number;
30
+ }[];
31
+ expectedPath: string;
32
+ yTicks: {
33
+ y: number;
34
+ value: number;
35
+ }[];
36
+ /** Nachkommastellen der Prozentbeschriftung (0 für ganze Prozent, sonst 1). */
37
+ tickDigits: number;
38
+ xLabels: {
39
+ x: number;
40
+ digit: number;
41
+ }[];
42
+ }
43
+ export declare const DEFAULT_BOX: ChartBox;
44
+ /** Obergrenze der y-Achse: nächstes Vielfaches des Tickabstands über dem Maximum. */
45
+ export declare function axisMaximum(maximum: number): {
46
+ top: number;
47
+ step: number;
48
+ };
49
+ export declare function chartGeometry(rows: readonly ConformityRow[], box?: ChartBox): ChartGeometry;
@@ -0,0 +1,48 @@
1
+ import { RequestState } from '../store';
2
+ import { AnalyseError } from './model';
3
+ import { BenfordAnalysis, BenfordCatalogue, BenfordMetricId, BenfordMetricsRequest, BenfordPort, BenfordTest, ConformityProfile, ShortValues } from './types';
4
+ export type BenfordBusy = 'load' | 'analyse';
5
+ export interface BenfordCallbacks {
6
+ analysed?: (result: BenfordAnalysis) => void;
7
+ failed?: (message: string) => void;
8
+ }
9
+ /** Stand der Benford-Analyse; `error` ist die Meldung der letzten abgelehnten Anfrage. */
10
+ export interface BenfordData extends RequestState<string> {
11
+ catalogue: BenfordCatalogue | null;
12
+ /** Importierte Werte; `null` = Eigenschaft `values`. */
13
+ imported: readonly (number | null)[] | null;
14
+ test: BenfordTest | null;
15
+ profileId: string | null;
16
+ shortValues: ShortValues | null;
17
+ result: BenfordAnalysis | null;
18
+ validation: AnalyseError | null;
19
+ /** Im Formular abgewählte Kennzahlen (Vorgabe: alle vorgegebenen aktiv). */
20
+ disabledMetrics: readonly BenfordMetricId[];
21
+ }
22
+ export interface BenfordSource {
23
+ port: () => BenfordPort | null | undefined;
24
+ values: () => readonly (number | null)[];
25
+ callbacks?: () => BenfordCallbacks;
26
+ /** Vorgegebene zusätzliche Kennzahlen (Eigenschaft `metrics`). */
27
+ metrics?: () => BenfordMetricsRequest | null | undefined;
28
+ /** Nach dem Laden und bei neuen Werten sofort analysieren (Eigenschaft `autoAnalyse`). */
29
+ autoAnalyse?: () => boolean | undefined;
30
+ }
31
+ export declare const INITIAL_BENFORD: BenfordData;
32
+ export declare function benfordValues(state: BenfordData, given: readonly (number | null)[]): readonly (number | null)[];
33
+ export declare function benfordProfile(state: BenfordData): ConformityProfile | null;
34
+ export declare function createBenfordController(source: BenfordSource): {
35
+ store: import('..').Store<BenfordData>;
36
+ load: () => Promise<void>;
37
+ analyse: () => Promise<void>;
38
+ /** Importierte Werte übernehmen; `null` kehrt zur Eigenschaft `values` zurück. */
39
+ useValues: (imported: readonly (number | null)[] | null) => void;
40
+ /** Neue Eigenschaft `values`: Import verwerfen, bei `autoAnalyse` erneut analysieren. */
41
+ valuesChanged(): Promise<void>;
42
+ /** Vorgegebene Kennzahl für die nächste Analyse an- oder abwählen. */
43
+ setMetric: (id: BenfordMetricId, on: boolean) => void;
44
+ setTest: (test: BenfordTest | null) => void;
45
+ setProfile: (profileId: string | null) => void;
46
+ setShortValues: (shortValues: ShortValues | null) => void;
47
+ };
48
+ export type BenfordController = ReturnType<typeof createBenfordController>;
@@ -0,0 +1,7 @@
1
+ export { benfordMessages, type BenfordMessageKey } from './messages';
2
+ export * from './chart';
3
+ export * from './model';
4
+ export { createBenfordRestPort } from './rest-port';
5
+ export type * from './types';
6
+ export * from './controller';
7
+ export * from './view';
@@ -0,0 +1,3 @@
1
+ /** Texte der Benford-Analyse. */
2
+ export declare const benfordMessages: import('..').Catalogs<"loading" | "notice" | "data" | "table" | "title" | "profile" | "yes" | "failed" | "choose" | "valuesCount" | "valuesEmpty" | "test" | "shortValues" | "analyse" | "errornoValues" | "errortooMany" | "errortest" | "errorprofile" | "errorshortValues" | "analysed" | "excluded" | "excludedDetail" | "mad" | "madBounds" | "chi2" | "chi2Detail" | "chi2Exceeds" | "chi2Within" | "zDigits" | "zNone" | "chart" | "chartLabel" | "legendObserved" | "legendExpected" | "legendExceeds" | "barTitle" | "axisDigit" | "axisShare" | "colDigit" | "colCount" | "colObserved" | "colExpected" | "colDeviation" | "colZ" | "colExceeds" | "profileSource" | "metricsLegend" | "metricchi_square" | "metricdigit_z" | "significance" | "chiTest" | "chiTestDetail" | "criticalValues" | "criticalValue" | "chiRejects" | "chiKeeps" | "chiNoLevel" | "digitZ" | "digitZDetail" | "withCorrection" | "withoutCorrection" | "digitZNoLimit" | "digitZValues">;
3
+ export type BenfordMessageKey = keyof typeof benfordMessages.de;
@@ -0,0 +1,32 @@
1
+ import { AnalyseRequest, BenfordCatalogue, BenfordMetricId, BenfordMetricsRequest, BenfordTest, ShortValues } from './types';
2
+ export interface AnalyseInput {
3
+ catalogue: BenfordCatalogue;
4
+ test: BenfordTest | null;
5
+ profile: string | null;
6
+ shortValues: ShortValues | null;
7
+ values: readonly (number | null)[];
8
+ /** Angeforderte Kennzahlen (bereits ohne abgewählte). */
9
+ metrics?: BenfordMetricsRequest | null;
10
+ }
11
+ export declare const BENFORD_METRIC_IDS: readonly BenfordMetricId[];
12
+ /** Vorgegebene Kennzahlen ohne die abgewählten; `null`, wenn keine übrig bleibt. */
13
+ export declare function activeMetrics(given: BenfordMetricsRequest | null | undefined, disabled: readonly BenfordMetricId[]): BenfordMetricsRequest | null;
14
+ /** Kennungen der vorgegebenen Kennzahlen in fester Reihenfolge (für die Auswahl im Formular). */
15
+ export declare function offeredMetrics(given: BenfordMetricsRequest | null | undefined): BenfordMetricId[];
16
+ export type AnalyseError = 'noValues' | 'tooMany' | 'test' | 'profile' | 'shortValues';
17
+ export type AnalyseValidation = {
18
+ ok: true;
19
+ request: AnalyseRequest;
20
+ } | {
21
+ ok: false;
22
+ error: AnalyseError;
23
+ };
24
+ /** Zweistellige Tests (erste zwei Ziffern, zweite Ziffer) verlangen eine Regel für kurze Werte. */
25
+ export declare function needsShortValues(catalogue: BenfordCatalogue, test: BenfordTest | null): boolean;
26
+ /** Anfrage für `POST /analyze`; Test, Profil und ggf. Regel für kurze Werte sind Pflicht. */
27
+ export declare function buildAnalyseRequest(input: AnalyseInput): AnalyseValidation;
28
+ export type LevelTone = 'neutral' | 'success' | 'accent' | 'warning' | 'danger';
29
+ /** Farbton der MAD-Stufe 0–3 (enge … keine Übereinstimmung). */
30
+ export declare function levelTone(level: number): LevelTone;
31
+ /** Anzeige einer Ziffer: zweite Ziffer 0–9, sonst Zahl. */
32
+ export declare function digitLabel(digit: number): string;
@@ -0,0 +1,4 @@
1
+ import { RestOptions } from '@auditcore/common';
2
+ import { BenfordPort } from './types';
3
+ /** Port auf den REST-Vertrag von `auditcore_statistics.web` (Starlette oder FastAPI). */
4
+ export declare function createBenfordRestPort(options: RestOptions): BenfordPort;
@@ -0,0 +1,144 @@
1
+ /** Typen des REST-Vertrags `docs/ui/benford-rest.md` (auditcore_statistics.web). */
2
+ export type BenfordTest = 'first' | 'first_two' | 'second';
3
+ export type ShortValues = 'exclude' | 'pad';
4
+ export interface ConformityProfile {
5
+ id: string;
6
+ label: string;
7
+ source: string;
8
+ mad_bounds: Readonly<Record<BenfordTest, readonly [number, number, number]>>;
9
+ level_labels: readonly [string, string, string, string];
10
+ z_critical: number;
11
+ continuity_correction: boolean;
12
+ significance_level: number;
13
+ note: string;
14
+ }
15
+ /** Zusätzliche, wählbare Kennzahlen (`metrics`, auditcore_statistics.significance). */
16
+ export type BenfordMetricId = 'chi_square' | 'digit_z';
17
+ export interface BenfordMetricsRequest {
18
+ /** Chi²-Test mit kritischen Werten; Entscheidung nur mit `significance_level`. */
19
+ chi_square?: {
20
+ significance_level?: number | null;
21
+ };
22
+ /** z je Ziffer; „auffällige Ziffern“ nur mit `z_critical`. */
23
+ digit_z?: {
24
+ continuity_correction: boolean;
25
+ z_critical?: number | null;
26
+ };
27
+ }
28
+ export interface BenfordCatalogue {
29
+ library: string;
30
+ method: string;
31
+ tests: readonly {
32
+ id: BenfordTest;
33
+ label: string;
34
+ digits: 1 | 2;
35
+ }[];
36
+ short_values: readonly {
37
+ id: ShortValues;
38
+ label: string;
39
+ }[];
40
+ profiles: readonly ConformityProfile[];
41
+ limits: {
42
+ max_values: number;
43
+ };
44
+ /** Ab auditcore_statistics nach 0.3.4; ältere Server liefern keine Kennzahlen. */
45
+ metrics?: readonly {
46
+ id: BenfordMetricId;
47
+ label: string;
48
+ parameters: Readonly<Record<string, string>>;
49
+ }[];
50
+ standard_levels?: readonly number[];
51
+ }
52
+ export interface AnalyseRequest {
53
+ test: BenfordTest;
54
+ profile: string;
55
+ short_values?: ShortValues;
56
+ values: readonly (number | null)[];
57
+ metrics?: BenfordMetricsRequest;
58
+ }
59
+ export interface DistributionRow {
60
+ digit: number;
61
+ observed_count: number;
62
+ observed_share: number;
63
+ expected_share: number;
64
+ deviation: number;
65
+ }
66
+ export interface ConformityRow extends DistributionRow {
67
+ z: number;
68
+ exceeds: boolean;
69
+ }
70
+ export interface BenfordDistribution {
71
+ method: string;
72
+ digits: 1 | 2;
73
+ short_values: ShortValues | null;
74
+ analysed: number;
75
+ excluded: {
76
+ missing: number;
77
+ zero: number;
78
+ short: number;
79
+ };
80
+ negative_absolute: number;
81
+ chi2_statistic: number;
82
+ degrees_of_freedom: number;
83
+ p_value: number;
84
+ rows: readonly DistributionRow[];
85
+ }
86
+ export interface Conformity {
87
+ profile: string;
88
+ test: BenfordTest;
89
+ analysed: number;
90
+ mad: number;
91
+ mad_level: 0 | 1 | 2 | 3;
92
+ mad_label: string;
93
+ chi2_statistic: number;
94
+ degrees_of_freedom: number;
95
+ p_value: number;
96
+ significance_level: number;
97
+ chi2_exceeds: boolean;
98
+ z_critical: number;
99
+ exceeding_digits: readonly number[];
100
+ rows: readonly ConformityRow[];
101
+ }
102
+ export interface ChiSquareMetric {
103
+ test: BenfordTest;
104
+ analysed: number;
105
+ chi2_statistic: number;
106
+ degrees_of_freedom: number;
107
+ p_value: number;
108
+ significance_level: number | null;
109
+ critical_value: number | null;
110
+ rejects: boolean | null;
111
+ critical_values: readonly {
112
+ level: number;
113
+ value: number;
114
+ }[];
115
+ }
116
+ export interface DigitZRow extends DistributionRow {
117
+ z: number;
118
+ exceeds: boolean | null;
119
+ }
120
+ export interface DigitZMetric {
121
+ test: BenfordTest;
122
+ analysed: number;
123
+ continuity_correction: boolean;
124
+ z_critical: number | null;
125
+ exceeding_digits: readonly number[] | null;
126
+ rows: readonly DigitZRow[];
127
+ }
128
+ export interface BenfordAnalysis {
129
+ library: string;
130
+ test: BenfordTest;
131
+ test_label: string;
132
+ distribution: BenfordDistribution;
133
+ conformity: Conformity;
134
+ /** Nur bei angeforderten Kennzahlen (`AnalyseRequest.metrics`). */
135
+ metrics?: {
136
+ chi_square?: ChiSquareMetric;
137
+ digit_z?: DigitZMetric;
138
+ };
139
+ }
140
+ /** Schnittstelle der Komponente zur Fachlogik; Standardumsetzung: `createBenfordRestPort`. */
141
+ export interface BenfordPort {
142
+ profiles(): Promise<BenfordCatalogue>;
143
+ analyse(request: AnalyseRequest): Promise<BenfordAnalysis>;
144
+ }
@@ -0,0 +1,45 @@
1
+ import { TableColumn, TableRow } from '@auditcore/common';
2
+ import { Locale, Translate } from '../i18n';
3
+ import { BenfordMessageKey } from './messages';
4
+ import { AnalyseError } from './model';
5
+ import { BenfordAnalysis, BenfordMetricId, ChiSquareMetric, Conformity, ConformityProfile, DigitZMetric } from './types';
6
+ export type BenfordTranslate = Translate<BenfordMessageKey>;
7
+ export declare function analyseErrorKey(error: AnalyseError): BenfordMessageKey;
8
+ export declare function benfordValuesText(count: number, t: BenfordTranslate, locale: Locale): string;
9
+ /** Titel eines Balkens (Tooltip und Vorlesetext). */
10
+ export declare function benfordBarTitle(conformity: Conformity, index: number, t: BenfordTranslate, locale: Locale): string;
11
+ export declare function benfordChartTitle(conformity: Conformity, testLabel: string, t: BenfordTranslate): string;
12
+ export declare function benfordTickText(value: number, digits: number, locale: Locale): string;
13
+ export interface BenfordMetricTexts {
14
+ analysed: string;
15
+ excluded: string;
16
+ excludedDetail: string;
17
+ mad: string;
18
+ madBounds: string;
19
+ chi2: string;
20
+ chi2Detail: string;
21
+ chi2Verdict: string;
22
+ zDigits: string;
23
+ exceeding: string;
24
+ }
25
+ export declare function benfordMetricTexts(analysis: BenfordAnalysis, profile: ConformityProfile | null, t: BenfordTranslate, locale: Locale): BenfordMetricTexts;
26
+ export declare function benfordDigitColumns(t: BenfordTranslate, locale: Locale): TableColumn[];
27
+ export declare function benfordDigitRows(conformity: Conformity): TableRow[];
28
+ export declare function benfordMetricLabel(id: BenfordMetricId, t: BenfordTranslate): string;
29
+ export interface BenfordChiTexts {
30
+ statistic: string;
31
+ detail: string;
32
+ critical: string;
33
+ verdict: string;
34
+ /** Farbton des Urteils: `warning` (verworfen), `success`, `neutral` (ohne Niveau). */
35
+ tone: 'warning' | 'success' | 'neutral';
36
+ }
37
+ export interface BenfordDigitZTexts {
38
+ digits: string;
39
+ detail: string;
40
+ largest: string;
41
+ }
42
+ /** Texte der Kennzahl `chi_square` (kritische Werte je Niveau, Urteil nur mit Niveau). */
43
+ export declare function benfordChiTexts(metric: ChiSquareMetric, t: BenfordTranslate, locale: Locale): BenfordChiTexts;
44
+ /** Texte der Kennzahl `digit_z` („auffällige Ziffern“ nur mit kritischem z-Wert). */
45
+ export declare function benfordDigitZTexts(metric: DigitZMetric, t: BenfordTranslate, locale: Locale): BenfordDigitZTexts;
@@ -0,0 +1,55 @@
1
+ import { RequestState, Store } from '../store';
2
+ import { TabItem } from './dsfaView';
3
+ import { DataProtectionKey, DataProtectionTranslate } from './messages';
4
+ import { DataProtectionError, RequestHooks } from './requests';
5
+ import { AssessmentExportFormat, AssessmentView, DataProtectionPort, DataProtectionProfile, DecisionInput, OverviewRow, Proposal, SurveyInput } from './types';
6
+ export type DsfaStep = 'saved' | 'decided' | 'dpo' | 'released' | 'started';
7
+ export type DsfaTab = 'screening' | 'risk' | 'result';
8
+ export interface DsfaHooks extends RequestHooks {
9
+ onChanged?: (step: DsfaStep, view: AssessmentView) => void;
10
+ /** Wartezeit der Vorschau nach einer Eingabe (ms). */
11
+ previewDelay?: number;
12
+ }
13
+ export interface DsfaData extends RequestState<DataProtectionError> {
14
+ profile: DataProtectionProfile | null;
15
+ rows: OverviewRow[];
16
+ view: AssessmentView | null;
17
+ survey: SurveyInput | null;
18
+ preview: Proposal | null;
19
+ tab: DsfaTab;
20
+ }
21
+ export interface DsfaDerived {
22
+ dirty: boolean;
23
+ proposal: Proposal | null;
24
+ /** Vorschau anzeigen: ungespeicherte Eingaben und eine berechnete Vorschau liegen vor. */
25
+ showPreview: boolean;
26
+ }
27
+ export declare function dsfaDerived(state: DsfaData): DsfaDerived;
28
+ /** Nur lesen: nicht bearbeitbar oder gesperrte (freigegebene) Fassung. */
29
+ export declare function dsfaReadonly(state: DsfaData, editable: boolean): boolean;
30
+ export declare function dsfaTabs(t: DataProtectionTranslate): TabItem[];
31
+ export declare const DSFA_NOTICES: Readonly<Record<DsfaStep, DataProtectionKey>>;
32
+ export interface DsfaControllerOptions extends DsfaHooks {
33
+ port: () => DataProtectionPort | null;
34
+ t: () => DataProtectionTranslate;
35
+ }
36
+ export declare function createDsfaController(options: DsfaControllerOptions): {
37
+ start: (activityId: string) => Promise<void>;
38
+ save: () => Promise<AssessmentView | null>;
39
+ decide: (decision: DecisionInput) => Promise<AssessmentView | null>;
40
+ requestDpo: (from: string, on: string) => Promise<AssessmentView | null>;
41
+ release: () => Promise<AssessmentView | null>;
42
+ reassess: () => Promise<AssessmentView | null>;
43
+ load: () => Promise<void>;
44
+ open: (assessmentId: string) => Promise<void>;
45
+ openActivity: (activityId: string) => Promise<void>;
46
+ calculate: () => Promise<void>;
47
+ edit: (next: SurveyInput) => void;
48
+ dispose: () => void;
49
+ store: Store<DsfaData>;
50
+ connect: (activityId: string) => Promise<void>;
51
+ exportReport: (format: AssessmentExportFormat) => Promise<boolean>;
52
+ setTab: (tab: string) => void;
53
+ setNotice: (notice: string) => void;
54
+ };
55
+ export type DsfaController = ReturnType<typeof createDsfaController>;
@@ -0,0 +1,45 @@
1
+ import { BadgeTone } from '../base/types';
2
+ import { AnswerValue, AssessmentView, BlockView, LevelView, DataProtectionProfile, Proposal, ScenarioInput, SurveyInput } from './types';
3
+ export declare const ANSWER_VALUES: readonly AnswerValue[];
4
+ export interface TabItem {
5
+ key: string;
6
+ label: string;
7
+ }
8
+ export interface BlockProgress {
9
+ answered: number;
10
+ total: number;
11
+ yes: number;
12
+ }
13
+ export declare function emptyScenario(profile: DataProtectionProfile): ScenarioInput;
14
+ /** Bearbeitbare Kopie der gespeicherten Erhebung. */
15
+ export declare function surveyFrom(view: AssessmentView, profile: DataProtectionProfile): SurveyInput;
16
+ export declare function sameSurvey(a: SurveyInput | null, b: SurveyInput | null): boolean;
17
+ export declare function answerOf(survey: SurveyInput, key: string): AnswerValue | null;
18
+ export declare function withAnswer(survey: SurveyInput, key: string, value: AnswerValue): SurveyInput;
19
+ export declare function withJustification(survey: SurveyInput, key: string, justification: string): SurveyInput;
20
+ export declare function blockProgress(block: BlockView, survey: SurveyInput): BlockProgress;
21
+ export declare function withScenario(survey: SurveyInput, index: number, scenario: ScenarioInput): SurveyInput;
22
+ export declare function addScenario(survey: SurveyInput, profile: DataProtectionProfile): SurveyInput;
23
+ export declare function removeScenario(survey: SurveyInput, index: number): SurveyInput;
24
+ export declare function toggleMeasure(scenario: ScenarioInput, measure: string): ScenarioInput;
25
+ export declare function levelLabel(levels: readonly LevelView[], value: number | null): string;
26
+ /** Stufe eines Risikos nach Rang im Profil: höchste Stufe rot, zweithöchste gelb. */
27
+ export declare function bandTone(band: string | undefined, bands: readonly string[]): BadgeTone;
28
+ export declare function recommendationTone(recommendation: string | null | undefined): BadgeTone;
29
+ export declare function screeningTone(outcome: Proposal['screening']['outcome']): BadgeTone;
30
+ export declare function decisionTitle(profile: DataProtectionProfile, key: string | null | undefined): string;
31
+ /** Abweichung vom Vorschlag verlangt eine Begründung (Bibliothek prüft Mindestlänge). */
32
+ export declare function isDeviation(proposal: Proposal, decision: string): boolean;
33
+ /** Auflagen: eine je Zeile, leere Zeilen entfallen. */
34
+ export declare function parseConditions(text: string): string[];
35
+ /** Vier-Augen-Prinzip vorab anzeigen; maßgeblich bleibt die Prüfung des Servers. */
36
+ export declare function mayRelease(view: AssessmentView, actor: string): boolean;
37
+ /** Eingabefelder der Entscheidung, vorbelegt aus der Fassung bzw. dem Vorschlag. */
38
+ export interface DecisionForm {
39
+ decision: string;
40
+ justification: string;
41
+ conditions: string;
42
+ }
43
+ export declare function decisionForm(view: AssessmentView, proposal: Proposal): DecisionForm;
44
+ /** Freigabe möglich: Vier-Augen-Vorprüfung, keine ungespeicherten Eingaben, keine Sperrgründe. */
45
+ export declare function canReleaseAssessment(view: AssessmentView, actor: string, dirty: boolean): boolean;
@@ -0,0 +1,33 @@
1
+ import { RegisterColumn, Issue, RegisterContent } from './types';
2
+ export interface ExportTexts {
3
+ yes: string;
4
+ no: string;
5
+ empty: string;
6
+ title: string;
7
+ department: string;
8
+ withoutDepartment: string;
9
+ controller: string;
10
+ dpo: string;
11
+ version: string;
12
+ issues: string;
13
+ noIssues: string;
14
+ required: string;
15
+ hint: string;
16
+ field: string;
17
+ content: string;
18
+ generated: string;
19
+ }
20
+ export interface RegisterExportInput {
21
+ content: RegisterContent;
22
+ columns: readonly RegisterColumn[];
23
+ issues: readonly Issue[];
24
+ /** Zeile unter dem Titel, z. B. „Fassung 2 – Entwurf“. */
25
+ versionLabel: string;
26
+ texts: ExportTexts;
27
+ lang?: string;
28
+ generatedAt?: string;
29
+ }
30
+ export declare function registerCsv(input: RegisterExportInput): string;
31
+ export declare function registerMarkdown(input: RegisterExportInput): string;
32
+ export declare function registerHtml(input: RegisterExportInput): string;
33
+ export declare function registerFilename(version: number | null, extension: string): string;
@@ -0,0 +1,10 @@
1
+ export { dataprotectionMessages, type DataProtectionKey, type DataProtectionTranslate } from './messages';
2
+ export { createDataProtectionRestPort } from './rest-port';
3
+ export type { Activity, AnswerInput, AnswerValue, AssessmentExportFormat, AssessmentStatus, AssessmentSummary, AssessmentView, BlockView, DataProtectionPort, DataProtectionProfile, DecisionInput, DossierFieldView, ExportedFile, FieldKind, FieldValue, Issue as RegisterIssue, KeyTitle, LevelView, MeasureView, OverviewRow, Person, Proposal, QuestionView, RegisterColumn, RegisterContent, RegisterExportFormat, RegisterState, RegisterStatus, ScenarioInput, ScenarioResult, SurveyInput, VersionSummary, VersionView, } from './types';
4
+ export { CONTRACT as DATAPROTECTION_CONTRACT } from './types';
5
+ export { asError as dataprotectionError, statusLabel as dataprotectionStatusLabel, prefixedLabel as dataprotectionLabel, type DataProtectionError, type RequestHooks as DataProtectionRequestHooks, } from './requests';
6
+ export * from './registerView';
7
+ export * from './dsfaView';
8
+ export { registerCsv, registerFilename, registerHtml, registerMarkdown, type RegisterExportInput, type ExportTexts } from './exporters';
9
+ export * from './vvt';
10
+ export * from './dsfa';
@@ -0,0 +1,5 @@
1
+ import { Translate } from '../i18n';
2
+ /** Texte von `<flowaudit-vvt>` und `<flowaudit-dsfa>`. */
3
+ export declare const dataprotectionMessages: import('..').Catalogs<"loading" | "progress" | "search" | "empty" | "noMatches" | "exportLabel" | "exportMarkdown" | "exportPrint" | "generated" | "profile" | "field" | "vvtTitle" | "vvtNorm" | "dsfaTitle" | "dsfaNorm" | "noPort" | "networkError" | "yes" | "no" | "open" | "status_entwurf" | "status_freigegeben" | "status_abgeloest" | "status_dsb_beteiligung" | "versionLabel" | "noVersion" | "createdBy" | "releasedBy" | "revision" | "save" | "saving" | "discard" | "release" | "fourEyesHint" | "saveFirst" | "newDraft" | "showDraft" | "showReleased" | "history" | "hideHistory" | "exportCsv" | "unsaved" | "saved" | "released" | "exported" | "colVersion" | "colStatus" | "colCreated" | "colReleased" | "colActivities" | "noHistory" | "cover" | "controller" | "dpo" | "departments" | "departmentNew" | "departmentAdd" | "departmentRemove" | "withoutDepartment" | "activities" | "noActivities" | "addActivity" | "removeActivity" | "unnamed" | "selectActivity" | "complete" | "missing" | "missingOne" | "hints" | "hintOne" | "requiredMark" | "invalidCount" | "completenessTitle" | "completenessSummary" | "completenessOk" | "blockingLabel" | "hintLabel" | "issuesExport" | "noIssues" | "content" | "overview" | "colActivity" | "colDepartment" | "colState" | "colResult" | "colAction" | "noDsfa" | "reviewRequired" | "openAssessment" | "startAssessment" | "noRegister" | "stepScreening" | "stepRisk" | "stepResult" | "steps" | "lockedNotice" | "reassess" | "preview" | "screeningResult" | "outcome_pflicht" | "outcome_keine_pflicht" | "outcome_unvollstaendig" | "points" | "hardTriggers" | "openAnswers" | "effect_hart" | "effect_punkt" | "effect_fria" | "answer_ja" | "answer_nein" | "answer_unbekannt" | "justification" | "explanation" | "scenarios" | "addScenario" | "removeScenario" | "scenario" | "noScenarios" | "dimension" | "description" | "severity" | "likelihood" | "measures" | "residual" | "residualSeverity" | "residualLikelihood" | "computed" | "residualJustification" | "scenarioResult" | "riskSummary" | "necessityTitle" | "necessity" | "proportionality" | "dossierTitle" | "proposalTitle" | "recommendation_unvollstaendig" | "consultation" | "issuesTitle" | "decisionTitle" | "decision" | "chooseDecision" | "deviationHint" | "decisionJustification" | "conditions" | "decide" | "decidedBy" | "dpoTitle" | "dpoFrom" | "dpoOn" | "dpoRecord" | "dpoRecorded" | "releaseTitle" | "releaseOpenPoints" | "releaseInfo" | "releaseBlockers" | "assessmentSaved" | "assessmentReleased" | "decisionSaved" | "dpoSaved" | "versions" | "reportHtml" | "reportMarkdown" | "colDecision">;
4
+ export type DataProtectionKey = keyof typeof dataprotectionMessages.de;
5
+ export type DataProtectionTranslate = Translate<DataProtectionKey>;
@@ -0,0 +1,47 @@
1
+ import { BadgeTone } from '../base/types';
2
+ import { Activity, RegisterColumn, FieldValue, Issue, Person, RegisterContent, RegisterState, VersionView } from './types';
3
+ export declare const NO_DEPARTMENT = "";
4
+ export interface ActivityGroup {
5
+ department: string;
6
+ items: {
7
+ index: number;
8
+ activity: Activity;
9
+ }[];
10
+ }
11
+ export interface Completeness {
12
+ blocking: number;
13
+ hints: number;
14
+ }
15
+ /** Tätigkeit ohne Kennung (die vergibt der Server beim Speichern). */
16
+ export declare function emptyActivity(columns: readonly RegisterColumn[], department: string): Activity;
17
+ export declare function emptyContent(): RegisterContent;
18
+ /** Tiefe Kopie (JSON-Daten), damit Eingaben den gelesenen Stand nie verändern. */
19
+ export declare function cloneContent(content: RegisterContent): RegisterContent;
20
+ /** Referate wie in der Quelle: konfigurierte zuerst, dann unbekannte; leere entfallen. */
21
+ export declare function groupByDepartment(content: RegisterContent, query?: string): ActivityGroup[];
22
+ /** Schlüssel einer Tätigkeit für die Zuordnung der Hinweise (Kennung, sonst Name wie in der Bibliothek). */
23
+ export declare function activityKey(activity: Activity): string;
24
+ export declare function issuesFor(issues: readonly Issue[], activity: Activity): Issue[];
25
+ export declare function fieldIssues(issues: readonly Issue[], activity: Activity, field: string): Issue[];
26
+ /** Hinweise zum Deckblatt (Verantwortlicher, DSB). */
27
+ export declare function coverIssues(issues: readonly Issue[]): Issue[];
28
+ export declare function completeness(issues: readonly Issue[]): Completeness;
29
+ export declare function completenessTone(value: Completeness): BadgeTone;
30
+ export declare function statusTone(status: string): BadgeTone;
31
+ /** Angezeigte Fassung: offener Entwurf vor Freigabe (dort wird gearbeitet). */
32
+ export declare function currentVersion(state: RegisterState | null, prefer?: 'draft' | 'released'): VersionView | null;
33
+ export declare function withField(content: RegisterContent, index: number, key: string, value: FieldValue): RegisterContent;
34
+ export declare function withActivity(content: RegisterContent, activity: Activity): RegisterContent;
35
+ export declare function withoutActivity(content: RegisterContent, index: number): RegisterContent;
36
+ export declare function withPerson(content: RegisterContent, part: 'verantwortlicher' | 'dsb', person: Person): RegisterContent;
37
+ export declare function withDepartments(content: RegisterContent, departments: readonly string[]): RegisterContent;
38
+ /** Anzeigewert eines Feldes; Wahrheitswerte und Leerwerte über die Texte der Komponente. */
39
+ export declare function displayValue(value: FieldValue | undefined, texts: {
40
+ yes: string;
41
+ no: string;
42
+ empty: string;
43
+ }): string;
44
+ /** Eingabe eines Zahlfeldes: leer → null, sonst nichtnegative ganze Zahl; ungültig → undefined. */
45
+ export declare function parseCount(text: string): number | null | undefined;
46
+ /** Vier-Augen-Prinzip vorab anzeigen: wer den Entwurf bearbeitet hat, kann ihn nicht freigeben. */
47
+ export declare function editedBy(version: VersionView | null, actor: string): boolean;
@@ -0,0 +1,16 @@
1
+ import { DataProtectionTranslate } from './messages';
2
+ /** Fehler einer Portanfrage: Code und Meldung des Servers bzw. `network_error` mit Status 0. */
3
+ export interface DataProtectionError {
4
+ code: string;
5
+ message: string;
6
+ status: number;
7
+ }
8
+ export interface RequestHooks {
9
+ onError?: (error: DataProtectionError) => void;
10
+ /** Meldung für Fehler ohne Serverantwort (Netz, Programmfehler). */
11
+ networkMessage?: (message: string) => string;
12
+ }
13
+ export declare function asError(error: unknown, hooks: RequestHooks): DataProtectionError;
14
+ /** Übersetzter Status (`entwurf`, `freigegeben`, …); unbekannte Werte bleiben stehen. */
15
+ export declare function statusLabel(t: DataProtectionTranslate, status: string): string;
16
+ export declare function prefixedLabel(t: DataProtectionTranslate, prefix: string, value: string, fallback?: string): string;
@@ -0,0 +1,4 @@
1
+ import { RestOptions } from '@auditcore/common';
2
+ import { DataProtectionPort } from './types';
3
+ /** Port auf den REST-Vertrag `dataprotection_ui/1` von `auditcore_dataprotection.web`. */
4
+ export declare function createDataProtectionRestPort(options: RestOptions): DataProtectionPort;