@evotecit/canopyx 0.3.5 → 0.3.6

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 (51) hide show
  1. package/CanopyX.Html/Assets/canopyx-flow-checks.css +24 -0
  2. package/CanopyX.Html/Assets/canopyx-flow-checks.js +13 -0
  3. package/CanopyX.Html/Assets/canopyx-flow-command.css +14 -0
  4. package/CanopyX.Html/Assets/canopyx-flow-command.js +19 -0
  5. package/CanopyX.Html/Assets/canopyx-flow-consent.css +6 -0
  6. package/CanopyX.Html/Assets/canopyx-flow-consent.js +8 -0
  7. package/CanopyX.Html/Assets/canopyx-flow-dialog.css +14 -0
  8. package/CanopyX.Html/Assets/canopyx-flow-dialog.js +3 -0
  9. package/CanopyX.Html/Assets/canopyx-flow-drafts.css +17 -0
  10. package/CanopyX.Html/Assets/canopyx-flow-drafts.js +21 -0
  11. package/CanopyX.Html/Assets/canopyx-flow-endpoint.js +6 -0
  12. package/CanopyX.Html/Assets/canopyx-flow-entry.css +1 -0
  13. package/CanopyX.Html/Assets/canopyx-flow-entry.js +6 -2
  14. package/CanopyX.Html/Assets/canopyx-flow-host.css +5 -0
  15. package/CanopyX.Html/Assets/canopyx-flow-host.js +4 -0
  16. package/CanopyX.Html/Assets/canopyx-flow-links.js +6 -0
  17. package/CanopyX.Html/Assets/canopyx-flow-module.mjs +6 -2
  18. package/CanopyX.Html/Assets/canopyx-flow-options.js +25 -0
  19. package/CanopyX.Html/Assets/canopyx-flow-pick.css +19 -0
  20. package/CanopyX.Html/Assets/canopyx-flow-pick.js +9 -0
  21. package/CanopyX.Html/Assets/canopyx-flow-preview.css +11 -0
  22. package/CanopyX.Html/Assets/canopyx-flow-preview.js +9 -0
  23. package/CanopyX.Html/Assets/canopyx-flow-records.css +9 -0
  24. package/CanopyX.Html/Assets/canopyx-flow-records.js +12 -0
  25. package/CanopyX.Html/Assets/canopyx-flow-tasks.css +29 -0
  26. package/CanopyX.Html/Assets/canopyx-flow-tasks.js +20 -0
  27. package/CanopyX.Html/Assets/canopyx-flow.js +48 -45
  28. package/CanopyX.Html/Assets/canopyx-grid-module.mjs +11 -6
  29. package/CanopyX.Html/Assets/canopyx-grid.css +1 -0
  30. package/CanopyX.Html/Assets/canopyx-grid.js +11 -6
  31. package/CanopyX.Html/Assets/canopyx-interactive.js +1 -1
  32. package/CanopyX.Html/Assets/canopyx-labels-de.js +74 -0
  33. package/CanopyX.Html/Assets/canopyx-labels-es.js +74 -0
  34. package/CanopyX.Html/Assets/canopyx-labels-fr.js +74 -0
  35. package/CanopyX.Html/Assets/canopyx-labels-it.js +74 -0
  36. package/CanopyX.Html/Assets/canopyx-labels-pl.js +74 -0
  37. package/CanopyX.Html/Assets/canopyx-module.mjs +1 -1
  38. package/CanopyX.Html/Assets/canopyx-reporting-module.mjs +11 -6
  39. package/CanopyX.Html/Assets/canopyx-reporting.css +1 -0
  40. package/CanopyX.Html/Assets/canopyx-reporting.js +11 -6
  41. package/CanopyX.Html/Assets/canopyx-tree-tools.js +4 -3
  42. package/CanopyX.Html/Assets/canopyx.js +1 -1
  43. package/JavaScript/flow.d.ts +180 -9
  44. package/JavaScript/grid.d.ts +2 -0
  45. package/JavaScript/locales/de.mjs +74 -0
  46. package/JavaScript/locales/es.mjs +74 -0
  47. package/JavaScript/locales/fr.mjs +74 -0
  48. package/JavaScript/locales/it.mjs +74 -0
  49. package/JavaScript/locales/pl.mjs +74 -0
  50. package/README.md +2 -2
  51. package/package.json +3 -1
@@ -2,12 +2,18 @@
2
2
  // proposal to the host. The flow entry point (@evotecit/canopyx/flow) and the grid entry points create them.
3
3
  import type { CanopyPlugin } from "./plugins.js";
4
4
 
5
- /** A value a field holds: text, a number, a boolean, a list of values, or nothing. Secrets never have one. */
6
- export type FlowValue = string | number | boolean | null | readonly (string | number | boolean)[];
5
+ /** A value a field holds: text, a number, a boolean, a list of values, rows of a records field, picked records, or nothing. Secrets never have one. */
6
+ export type FlowValue = string | number | boolean | null | readonly (string | number | boolean)[] | readonly FlowRecordRow[] | readonly FlowPickedRecord[];
7
+
8
+ /** A row of a records field: a cell per column. */
9
+ export type FlowRecordRow = Readonly<Record<string, string | number | boolean | null>>;
10
+
11
+ /** A record a pick step chose: its id and the label the tray and the review page show. */
12
+ export interface FlowPickedRecord { readonly id: string; readonly label: string }
7
13
 
8
14
  /** The field types: the shared grid editors, the types flows add, and custom editors. */
9
15
  export type FlowFieldType = "text" | "number" | "date" | "datetime" | "time" | "select" | "toggle" | "lookup" | "choice" | "multiChoice"
10
- | "textarea" | "list" | "secret" | "duration" | "custom";
16
+ | "textarea" | "list" | "secret" | "duration" | "records" | "custom";
11
17
 
12
18
  /** A condition operator, from the filter builder's grammar. */
13
19
  export type FlowOperator = "eq" | "ne" | "gt" | "ge" | "lt" | "le" | "contains" | "notContains" | "startsWith" | "endsWith" | "matches" | "notMatches"
@@ -77,17 +83,73 @@ export interface FlowField {
77
83
  units?: readonly ("seconds" | "minutes" | "hours" | "days")[];
78
84
  /** Custom fields: the registered editor's name. */
79
85
  editor?: string;
86
+ /** Select, choice, multiple-choice and lookup fields: "host" takes the options from hooks.options (or an endpoint). */
87
+ source?: "document" | "host";
88
+ /** The fields (at most 16, never secrets) whose change reloads host options, or empties this answer. */
89
+ dependsOn?: readonly string[];
90
+ /** Records fields: the columns of each row (1 to 16). */
91
+ columns?: readonly FlowRecordColumn[];
92
+ }
93
+
94
+ /** A column of a records field. */
95
+ export interface FlowRecordColumn {
96
+ id: string;
97
+ title: string;
98
+ type?: "text" | "number" | "date" | "time" | "select" | "toggle";
99
+ required?: boolean;
100
+ options?: readonly FlowOption[];
101
+ validation?: { min?: number; max?: number; minLength?: number; maxLength?: number; pattern?: string; message?: string };
102
+ width?: number;
103
+ }
104
+
105
+ /** A server check of some answers, such as "Send a test message", run through hooks.check (or an endpoint). */
106
+ export interface FlowCheck {
107
+ id: string;
108
+ label: string;
109
+ description?: string;
110
+ /** The fields it tests (1 to 64); a change marks its result stale. Secrets among them reach the hook through secret(id). */
111
+ fields: readonly string[];
112
+ /** "pass" blocks Next until it passes on the current answers; "run" until it ran on them without failing. */
113
+ required?: "pass" | "run";
114
+ }
115
+
116
+ /** A pick step's picker: a grid or tree view whose selection is the step's answer. */
117
+ export interface FlowPick {
118
+ field: {
119
+ id: string; label?: string; help?: string; required?: boolean; when?: FlowCondition; parameter?: string; path?: string; sensitive?: boolean;
120
+ validation?: Pick<FlowValidation, "minItems" | "maxItems" | "message">; default?: readonly FlowPickedRecord[];
121
+ };
122
+ /** The grid or tree view document (canopyx/2). */
123
+ view: Readonly<Record<string, unknown>>;
124
+ /** The view column whose value labels a picked record. */
125
+ label: string;
126
+ /** Whether the tray of picked records shows (default true). */
127
+ tray?: boolean;
128
+ height?: number;
80
129
  }
81
130
 
82
- /** A section of a step: a heading over some of its fields. */
83
- export interface FlowSection { id: string; label: string; description?: string; fields: readonly FlowField[]; when?: FlowCondition }
131
+ /** A preset the reader can start from. */
132
+ export interface FlowPreset { id: string; label: string; description?: string; values: Readonly<Record<string, FlowValue>> }
84
133
 
85
- /** A step: a form, a page of text, or the review page (which comes last). */
134
+ /** A section of a step: a heading over some of its fields, or over fields the host supplies. */
135
+ export interface FlowSection {
136
+ id: string;
137
+ label: string;
138
+ description?: string;
139
+ /** The section's own fields; none when its fields come from the host. */
140
+ fields?: readonly FlowField[];
141
+ when?: FlowCondition;
142
+ /** "host": hooks.fields (or an endpoint) supplies the fields as the step opens, and again when a field in dependsOn changes. */
143
+ source?: "host";
144
+ dependsOn?: readonly string[];
145
+ }
146
+
147
+ /** A step: a form, a page of text, a pick step, or the review page (which comes last). */
86
148
  export interface FlowStep {
87
149
  id: string;
88
150
  title?: string;
89
151
  description?: string;
90
- type?: "form" | "info" | "review";
152
+ type?: "form" | "info" | "pick" | "review";
91
153
  fields?: readonly FlowField[];
92
154
  sections?: readonly FlowSection[];
93
155
  when?: FlowCondition;
@@ -96,6 +158,19 @@ export interface FlowStep {
96
158
  declaration?: string;
97
159
  /** Review steps in edit mode: whether only changed answers show first (default true). */
98
160
  changesOnly?: boolean;
161
+ /** Form steps: server checks (at most 8). */
162
+ checks?: readonly FlowCheck[];
163
+ /** Task lists: the heading the task sits under. */
164
+ group?: string;
165
+ /** Pick steps: the picker. */
166
+ pick?: FlowPick;
167
+ /** Review steps: a text the reader types before submitting, or a field whose answer they type. */
168
+ confirm?: { label: string; text?: string; field?: string };
169
+ /** Review steps: a box the reader ticks before submitting, while the condition holds. */
170
+ acknowledge?: { label: string; when?: FlowCondition };
171
+ /** Review steps: true says the review page shows the host's preview (hooks.preview), so the page loads the preview part with
172
+ * the flow; without it, a preview hook loads the part on its own. */
173
+ preview?: boolean;
99
174
  }
100
175
 
101
176
  /** A flow document, the contract C# writes with CanopyFlow and any host can map. */
@@ -105,8 +180,9 @@ export interface FlowDocument {
105
180
  id: string;
106
181
  title: string;
107
182
  description?: string;
108
- mode?: "linear" | "free";
109
- layout?: { orientation?: "auto" | "horizontal" | "vertical" };
183
+ mode?: "linear" | "free" | "tasks";
184
+ /** Container "dialog" or "drawer" opens the flow from a launch button. */
185
+ layout?: { orientation?: "auto" | "horizontal" | "vertical"; container?: "inline" | "dialog" | "drawer"; launch?: string };
110
186
  density?: "compact" | "normal" | "comfortable";
111
187
  timeZone?: "utc" | "local";
112
188
  steps: readonly FlowStep[];
@@ -117,6 +193,15 @@ export interface FlowDocument {
117
193
  baseline?: string;
118
194
  submit?: { label?: string };
119
195
  labels?: Readonly<Record<string, string>>;
196
+ /** The equivalent command the review page shows; variants come from hooks.commands. */
197
+ command?: { name: string; style?: "powershell" | "posix" | "windows"; variants?: readonly { id: string; label: string }[] };
198
+ presets?: readonly FlowPreset[];
199
+ /** Where the draft lives: nowhere (the default), the session, local storage, or hooks.draftStore. */
200
+ draft?: "none" | "session" | "local" | "host";
201
+ /** Whether the page's address names the open step (#flow-id/step-id). */
202
+ deepLinks?: boolean;
203
+ /** Routes on the page's own origin that answer the hooks the host left unset (CanopyX.AspNetCore's MapCanopyFlow). */
204
+ endpoint?: { url: string; routes: readonly ("options" | "fields" | "check" | "validate" | "preview" | "status" | "draft" | "submit")[] };
120
205
  }
121
206
 
122
207
  /** The proposal flowSubmit carries: visible answers, secret states, the changes and a JSON patch. Never a secret value. */
@@ -130,8 +215,50 @@ export interface FlowSubmission {
130
215
  secrets: Record<string, { state: "set" | "keep" }>;
131
216
  changes: { field: string; path?: string; from: FlowValue; to: FlowValue }[];
132
217
  patch: ({ op: "add" | "replace"; path: string; value: FlowValue } | { op: "remove"; path: string })[];
218
+ /** The checks that ran on these answers, as the browser saw them: a claim the server runs again before relying on it. */
219
+ checks?: Record<string, { status: FlowCheckStatus; at: string }>;
220
+ /** The equivalent command of these answers; typed secrets read <secret>. */
221
+ command?: string;
222
+ /** The preset the answers started from. */
223
+ preset?: string;
224
+ }
225
+
226
+ /** A check's outcome. */
227
+ export type FlowCheckStatus = "pass" | "warning" | "fail";
228
+
229
+ /** What a check answers. */
230
+ export interface FlowCheckResult {
231
+ status: FlowCheckStatus;
232
+ message?: string;
233
+ details?: { label: string; value: string | number | boolean }[];
234
+ fieldErrors?: Record<string, string>;
133
235
  }
134
236
 
237
+ /** A task's state on a task-list flow, as the host sees it. */
238
+ export interface FlowStepState { state: "complete" | "needsAction" | "blocked" | "notStarted"; summary?: string; blockers?: string[] }
239
+
240
+ /** A row of the review page's preview. */
241
+ export interface FlowPreviewRow { label: string; value: string | number | boolean; tone?: "info" | "success" | "warning" | "danger" }
242
+
243
+ /** The review page's preview: rows of what submitting does, or a title, rows and notes. Text only. */
244
+ export type FlowPreview = readonly FlowPreviewRow[] | { title?: string; rows?: readonly FlowPreviewRow[]; notes?: readonly string[] };
245
+
246
+ /** A draft: the answers (never secrets or sensitive fields), the open step, the completed steps, the preset and the baseline. */
247
+ export interface FlowDraft {
248
+ kind: "flowDraft";
249
+ version: 1;
250
+ flow: string;
251
+ step: string;
252
+ completed: string[];
253
+ values: Record<string, FlowValue>;
254
+ saved: string;
255
+ baseline?: string;
256
+ preset?: string;
257
+ }
258
+
259
+ /** What an asynchronous hook receives: a signal that a newer request, Cancel, the timeout or destroy aborts. */
260
+ export interface FlowHookContext { signal: AbortSignal }
261
+
135
262
  /** The submit event's detail: the proposal, how to answer it, and each secret once. */
136
263
  export interface FlowSubmitDetail extends Readonly<FlowSubmission> {
137
264
  respondWith(answer: FlowAnswer | Promise<FlowAnswer>): void;
@@ -159,6 +286,24 @@ export interface FlowHooks {
159
286
  validateStep?(stepId: string, values: Record<string, FlowValue>): FlowRuleResult | Promise<FlowRuleResult>;
160
287
  validateFlow?(values: Record<string, FlowValue>): FlowRuleResult | Promise<FlowRuleResult>;
161
288
  submit?(detail: FlowSubmitDetail): FlowAnswer | Promise<FlowAnswer>;
289
+ /** The options of a field whose source is "host". */
290
+ options?(fieldId: string, values: Record<string, FlowValue>, context: FlowHookContext): readonly FlowOption[] | Promise<readonly FlowOption[]>;
291
+ /** The fields of a host section: at most 64, of the plain types, without path, source or dependsOn. */
292
+ fields?(sectionId: string, values: Record<string, FlowValue>, context: FlowHookContext): readonly FlowField[] | Promise<readonly FlowField[]>;
293
+ /** Runs a check; secret(id) reads, once, a secret among the fields it tests. */
294
+ check?(checkId: string, values: Record<string, FlowValue>, context: FlowHookContext & { secret(fieldId: string): string | null }): FlowCheckResult | Promise<FlowCheckResult>;
295
+ /** The review page's preview of what submitting does. */
296
+ preview?(values: Record<string, FlowValue>, context: FlowHookContext): FlowPreview | Promise<FlowPreview>;
297
+ /** A task list's step states, by step id. */
298
+ status?(values: Record<string, FlowValue>, context: FlowHookContext): Record<string, FlowStepState> | Promise<Record<string, FlowStepState>>;
299
+ /** The command's variants, by variant id: each writes the command line of the answers. */
300
+ commands?: Record<string, (values: Record<string, FlowValue>) => string | Promise<string>>;
301
+ /** The store of draft "host". */
302
+ draftStore?: { load(flowId: string): FlowDraft | null | Promise<FlowDraft | null>; save(flowId: string, draft: FlowDraft): void | Promise<void>; clear(flowId: string): void | Promise<void> };
303
+ /** Presets the host keeps; save adds "Save as preset". */
304
+ presetStore?: { list(flowId: string): readonly FlowPreset[] | Promise<readonly FlowPreset[]>; save?(flowId: string, preset: FlowPreset): void | Promise<void> };
305
+ /** Grid or tree options of a pick step's view, by step id, such as a remote data source. */
306
+ pickers?: Record<string, Readonly<Record<string, unknown>>>;
162
307
  }
163
308
 
164
309
  /** Options of createFlow and CanopyX.configure for a flow fragment. */
@@ -176,6 +321,17 @@ export interface FlowOptions {
176
321
  onSubmit?(detail: FlowSubmitDetail): FlowAnswer | Promise<FlowAnswer> | void;
177
322
  onSubmitted?(answer: FlowAnswer): void;
178
323
  onReload?(detail: { baseline: string | null }): void;
324
+ onCheck?(detail: { check: string; result: { status: FlowCheckStatus; message: string | null; details: { label: string; value: string }[]; at: string } }): void;
325
+ /** A dialog or drawer flow closes with answers; false (or cancelling flowLeaving) keeps it open. */
326
+ onLeaving?(detail: { reason: "close" }): boolean | void;
327
+ /** Deep links: a step's fragment, in place of "flow-id/step-id". */
328
+ formatLink?(stepId: string): string | null;
329
+ /** Deep links: the step a fragment names, or null. */
330
+ parseLink?(fragment: string): string | null;
331
+ /** How long an asynchronous hook may take, in milliseconds: 100 to 600000, default 30000. */
332
+ timeout?: number;
333
+ /** Headers an endpoint's requests carry, such as an antiforgery token. */
334
+ headers?: Record<string, string>;
179
335
  }
180
336
 
181
337
  /** A validation result: the errors and warnings of a step or the whole flow. */
@@ -212,6 +368,21 @@ export interface FlowApi {
212
368
  submit(): Promise<FlowAnswer | null>;
213
369
  setProgress(progress: { done?: number; total?: number; message?: string }): boolean;
214
370
  complete(answer: FlowAnswer): boolean;
371
+ /** Runs a check now; resolves with its result as the flow keeps it (field messages show in place), or null when it was cancelled.
372
+ * Rejects for a check the flow does not have. */
373
+ runCheck(checkId: string): Promise<{ status: FlowCheckStatus; message: string | null; details: { label: string; value: string }[]; at: string } | null>;
374
+ /** Loads a host-option field's options again. Rejects for any other field. */
375
+ refreshOptions(fieldId: string): Promise<void>;
376
+ /** Sets a task's state as the host sees it; null returns it to what the answers say. Throws for a flow that is no task list. */
377
+ setStepState(stepId: string, state: FlowStepState | null): void;
378
+ /** Saves the draft now; resolves with whether it was saved (false for a flow without a draft store). */
379
+ saveDraft(): Promise<boolean>;
380
+ /** Starts from a preset, or from the plain start with null. Rejects for a preset the flow does not have. */
381
+ setPreset(presetId: string | null): Promise<void>;
382
+ /** Dialog and drawer flows: opens the container; true once it is open, false for an inline flow. */
383
+ open(): boolean;
384
+ /** Dialog and drawer flows: closes the container, asking first when answers would be lost; false when it stays open. */
385
+ close(): boolean;
215
386
  /** Releases the flow and its host's mount state, even before ready or after mount failure. Repeated calls do nothing. */
216
387
  destroy(): void;
217
388
  }
@@ -887,6 +887,8 @@ export interface DataGrid<Q extends AcceptedGridQuery = GridQuery, Row extends G
887
887
  getSelection(): string[];
888
888
  setSelection(ids: string[]): void;
889
889
  clearSelection(): void;
890
+ /** The loaded records among ids, as copies of { id, cells }; a record that is not loaded now is left out. Never fetches. */
891
+ getLoadedRows(ids: readonly string[]): { id: string; cells: Record<string, Cell> }[];
890
892
  prepareExport(options: GridExportOptions): GridExport<Q>;
891
893
  toCsv(options: GridExportOptions): Promise<string>;
892
894
  copy(options: GridExportOptions): Promise<string>;
@@ -588,6 +588,80 @@ const labels = Object.freeze({
588
588
  flowCopied: "Kopiert",
589
589
  flowSavedIt: "Ich habe es gespeichert",
590
590
  flowShownOnce: "Wird nur einmal angezeigt. Jetzt kopieren.",
591
+ flowTimedOut: "Der Host hat nicht rechtzeitig geantwortet.",
592
+ flowNoHostHook: "Der Host beantwortet das nicht.",
593
+ flowOptionsLoading: "Optionen werden geladen…",
594
+ flowOptionsFailed: "Die Optionen konnten nicht geladen werden: {message}",
595
+ flowRetry: "Erneut versuchen",
596
+ flowRunAgain: "Erneut ausführen",
597
+ flowRunCheckAgain: "„{check}“ erneut ausführen",
598
+ flowFieldsLoading: "Felder werden geladen…",
599
+ flowFieldsFailed: "Die Felder konnten nicht geladen werden: {message}",
600
+ flowChangedMark: "Geändert",
601
+ flowRecordActions: "Aktionen",
602
+ flowRecordCell: "{column}, Zeile {row}",
603
+ flowRecordRemove: "Zeile {row} entfernen",
604
+ flowRecordAdd: "Zeile hinzufügen",
605
+ flowRecordsEmpty: "Noch keine Zeilen.",
606
+ flowRecordProblem: "Zeile {row}: {message}",
607
+ flowRecordsCount: "[one]{count} Zeile[other]{count} Zeilen",
608
+ flowPickMore: "und {count} weitere",
609
+ flowPickCount: "[one]{count} ausgewählt[other]{count} ausgewählt",
610
+ flowPickChosen: "Ausgewählt",
611
+ flowPickNone: "Noch nichts ausgewählt.",
612
+ flowChecks: "Prüfungen",
613
+ flowCancel: "Abbrechen",
614
+ flowCheckAcknowledge: "Trotz der Warnung fortfahren",
615
+ flowCheckRunning: "Wird geprüft…",
616
+ flowCheckNotRun: "Nicht ausgeführt",
617
+ flowCheckStale: "Die Antworten haben sich seit der Prüfung geändert",
618
+ flowCheckPassed: "Bestanden um {time}",
619
+ flowCheckWarning: "Warnung um {time}",
620
+ flowCheckFailed: "Fehlgeschlagen um {time}",
621
+ flowCheckInvalid: "Die Prüfung lieferte keine verwertbare Antwort.",
622
+ flowCheckNeeded: "Führen Sie „{check}“ mit diesen Antworten aus.",
623
+ flowCheckNotPassed: "„{check}“ wurde nicht bestanden.",
624
+ flowCheckConfirmWarning: "Bestätigen Sie die Warnung von „{check}“.",
625
+ flowTasks: "Aufgaben",
626
+ flowTasksProgress: "{done} von {count} Aufgaben erledigt",
627
+ flowTaskNeedsAction: "Handlungsbedarf",
628
+ flowTaskBlocked: "Kann noch nicht beginnen",
629
+ flowTasksReview: "Prüfen und absenden",
630
+ flowTasksIncomplete: "Erledigen Sie zuerst die erforderlichen Aufgaben.",
631
+ flowBackToTasks: "Zurück zu den Aufgaben",
632
+ flowSaveAndReturn: "Speichern und zurück",
633
+ flowSaveDraft: "Entwurf speichern",
634
+ flowClose: "Schließen",
635
+ flowDiscardQuestion: "Ihre Antworten verwerfen?",
636
+ flowDiscard: "Verwerfen",
637
+ flowKeepEditing: "Weiter bearbeiten",
638
+ flowDraftSaved: "Entwurf gespeichert",
639
+ flowDraftFailed: "Der Entwurf wurde nicht gespeichert.",
640
+ flowDraftFound: "Gespeicherter Entwurf",
641
+ flowDraftFrom: "Sie haben einen Entwurf vom {time}.",
642
+ flowDraftStale: "Die Einstellungen haben sich nach dem Speichern dieses Entwurfs geändert.",
643
+ flowDraftResume: "Dort weitermachen, wo Sie aufgehört haben",
644
+ flowDraftRestart: "Neu beginnen",
645
+ flowStartFrom: "Ausgangspunkt",
646
+ flowPresetSave: "Als Vorlage speichern",
647
+ flowPresetNone: "Standardwerte",
648
+ flowPresetsSaved: "Gespeicherte Vorlagen",
649
+ flowPresetApplied: "Ausgehend von {preset}",
650
+ flowPresetName: "Name der Vorlage",
651
+ flowPresetFailed: "Die Vorlage wurde nicht gespeichert.",
652
+ flowPresetSaved: "Vorlage {preset} gespeichert",
653
+ flowPresetChanges: "[one]Basierend auf {preset}, {count} Änderung[other]Basierend auf {preset}, {count} Änderungen",
654
+ flowCommandTab: "Befehl",
655
+ flowPatchTab: "JSON-Patch",
656
+ flowCommandTitle: "Entsprechender Befehl",
657
+ flowPreview: "Vorschau",
658
+ flowPreviewLoading: "Vorschau wird geladen…",
659
+ flowPreviewFailed: "Die Vorschau konnte nicht geladen werden: {message}",
660
+ flowPreviewNone: "Keine Vorschau.",
661
+ flowConfirmMismatch: "Geben Sie genau {text} ein, um fortzufahren.",
662
+ flowAcknowledgeNeeded: "Bestätigen Sie dies vor dem Absenden.",
663
+ flowPresetCurrent: "Aktuelle Einstellungen",
664
+ flowPickOneByOne: "Wählen Sie die Datensätze einzeln oder seitenweise aus.",
591
665
  matrixRows: "Zeilen",
592
666
  matrixColumns: "Spalten",
593
667
  matrixSearch: "Zeilen und Spalten suchen",
@@ -588,6 +588,80 @@ const labels = Object.freeze({
588
588
  flowCopied: "Copiado",
589
589
  flowSavedIt: "Lo he guardado",
590
590
  flowShownOnce: "Se muestra solo una vez. Cópielo ahora.",
591
+ flowTimedOut: "El host no respondió a tiempo.",
592
+ flowNoHostHook: "Ningún host responde a esto.",
593
+ flowOptionsLoading: "Cargando opciones…",
594
+ flowOptionsFailed: "No se pudieron cargar las opciones: {message}",
595
+ flowRetry: "Reintentar",
596
+ flowRunAgain: "Volver a ejecutar",
597
+ flowRunCheckAgain: "Volver a ejecutar «{check}»",
598
+ flowFieldsLoading: "Cargando campos…",
599
+ flowFieldsFailed: "No se pudieron cargar los campos: {message}",
600
+ flowChangedMark: "Modificado",
601
+ flowRecordActions: "Acciones",
602
+ flowRecordCell: "{column}, fila {row}",
603
+ flowRecordRemove: "Quitar la fila {row}",
604
+ flowRecordAdd: "Añadir fila",
605
+ flowRecordsEmpty: "Todavía no hay filas.",
606
+ flowRecordProblem: "Fila {row}: {message}",
607
+ flowRecordsCount: "[one]{count} fila[other]{count} filas",
608
+ flowPickMore: "y {count} más",
609
+ flowPickCount: "[one]{count} elegido[other]{count} elegidos",
610
+ flowPickChosen: "Elegidos",
611
+ flowPickNone: "Todavía no se ha elegido nada.",
612
+ flowChecks: "Comprobaciones",
613
+ flowCancel: "Cancelar",
614
+ flowCheckAcknowledge: "Continuar pese a la advertencia",
615
+ flowCheckRunning: "Comprobando…",
616
+ flowCheckNotRun: "Sin ejecutar",
617
+ flowCheckStale: "Las respuestas cambiaron desde la comprobación",
618
+ flowCheckPassed: "Superada a las {time}",
619
+ flowCheckWarning: "Advertencia a las {time}",
620
+ flowCheckFailed: "Falló a las {time}",
621
+ flowCheckInvalid: "La comprobación no dio una respuesta válida.",
622
+ flowCheckNeeded: "Ejecute «{check}» con estas respuestas.",
623
+ flowCheckNotPassed: "«{check}» no se superó.",
624
+ flowCheckConfirmWarning: "Confirme la advertencia de «{check}».",
625
+ flowTasks: "Tareas",
626
+ flowTasksProgress: "{done} de {count} tareas completadas",
627
+ flowTaskNeedsAction: "Requiere acción",
628
+ flowTaskBlocked: "Aún no se puede empezar",
629
+ flowTasksReview: "Revisar y enviar",
630
+ flowTasksIncomplete: "Complete primero las tareas obligatorias.",
631
+ flowBackToTasks: "Volver a las tareas",
632
+ flowSaveAndReturn: "Guardar y volver",
633
+ flowSaveDraft: "Guardar borrador",
634
+ flowClose: "Cerrar",
635
+ flowDiscardQuestion: "¿Descartar sus respuestas?",
636
+ flowDiscard: "Descartar",
637
+ flowKeepEditing: "Seguir editando",
638
+ flowDraftSaved: "Borrador guardado",
639
+ flowDraftFailed: "No se guardó el borrador.",
640
+ flowDraftFound: "Borrador guardado",
641
+ flowDraftFrom: "Tiene un borrador guardado el {time}.",
642
+ flowDraftStale: "La configuración cambió después de guardar este borrador.",
643
+ flowDraftResume: "Continuar donde lo dejó",
644
+ flowDraftRestart: "Empezar de nuevo",
645
+ flowStartFrom: "Empezar desde",
646
+ flowPresetSave: "Guardar como plantilla",
647
+ flowPresetNone: "Valores predeterminados",
648
+ flowPresetsSaved: "Plantillas guardadas",
649
+ flowPresetApplied: "Se empezó desde {preset}",
650
+ flowPresetName: "Nombre de la plantilla",
651
+ flowPresetFailed: "No se guardó la plantilla.",
652
+ flowPresetSaved: "Plantilla {preset} guardada",
653
+ flowPresetChanges: "[one]Basado en {preset}, {count} cambio[other]Basado en {preset}, {count} cambios",
654
+ flowCommandTab: "Comando",
655
+ flowPatchTab: "JSON patch",
656
+ flowCommandTitle: "Comando equivalente",
657
+ flowPreview: "Vista previa",
658
+ flowPreviewLoading: "Cargando la vista previa…",
659
+ flowPreviewFailed: "No se pudo cargar la vista previa: {message}",
660
+ flowPreviewNone: "Nada que previsualizar.",
661
+ flowConfirmMismatch: "Escriba exactamente {text} para continuar.",
662
+ flowAcknowledgeNeeded: "Confírmelo antes de enviar.",
663
+ flowPresetCurrent: "Configuración actual",
664
+ flowPickOneByOne: "Elija los registros uno a uno o por páginas.",
591
665
  matrixRows: "Filas",
592
666
  matrixColumns: "Columnas",
593
667
  matrixSearch: "Buscar filas y columnas",
@@ -588,6 +588,80 @@ const labels = Object.freeze({
588
588
  flowCopied: "Copié",
589
589
  flowSavedIt: "Je l'ai enregistré",
590
590
  flowShownOnce: "Affiché une seule fois. Copiez-le maintenant.",
591
+ flowTimedOut: "L’hôte n’a pas répondu à temps.",
592
+ flowNoHostHook: "Aucun hôte ne répond à cela.",
593
+ flowOptionsLoading: "Chargement des options…",
594
+ flowOptionsFailed: "Impossible de charger les options : {message}",
595
+ flowRetry: "Réessayer",
596
+ flowRunAgain: "Relancer",
597
+ flowRunCheckAgain: "Relancer « {check} »",
598
+ flowFieldsLoading: "Chargement des champs…",
599
+ flowFieldsFailed: "Impossible de charger les champs : {message}",
600
+ flowChangedMark: "Modifié",
601
+ flowRecordActions: "Actions",
602
+ flowRecordCell: "{column}, ligne {row}",
603
+ flowRecordRemove: "Supprimer la ligne {row}",
604
+ flowRecordAdd: "Ajouter une ligne",
605
+ flowRecordsEmpty: "Aucune ligne pour l’instant.",
606
+ flowRecordProblem: "Ligne {row} : {message}",
607
+ flowRecordsCount: "[one]{count} ligne[other]{count} lignes",
608
+ flowPickMore: "et {count} de plus",
609
+ flowPickCount: "[one]{count} choisi[other]{count} choisis",
610
+ flowPickChosen: "Choisis",
611
+ flowPickNone: "Rien n’est encore choisi.",
612
+ flowChecks: "Vérifications",
613
+ flowCancel: "Annuler",
614
+ flowCheckAcknowledge: "Continuer malgré l’avertissement",
615
+ flowCheckRunning: "Vérification…",
616
+ flowCheckNotRun: "Non exécutée",
617
+ flowCheckStale: "Les réponses ont changé depuis la vérification",
618
+ flowCheckPassed: "Réussie à {time}",
619
+ flowCheckWarning: "Avertissement à {time}",
620
+ flowCheckFailed: "Échec à {time}",
621
+ flowCheckInvalid: "La vérification n’a pas donné de réponse exploitable.",
622
+ flowCheckNeeded: "Lancez « {check} » avec ces réponses.",
623
+ flowCheckNotPassed: "« {check} » n’a pas réussi.",
624
+ flowCheckConfirmWarning: "Confirmez l’avertissement de « {check} ».",
625
+ flowTasks: "Tâches",
626
+ flowTasksProgress: "{done} tâches sur {count} terminées",
627
+ flowTaskNeedsAction: "Action requise",
628
+ flowTaskBlocked: "Ne peut pas encore commencer",
629
+ flowTasksReview: "Vérifier et envoyer",
630
+ flowTasksIncomplete: "Terminez d’abord les tâches requises.",
631
+ flowBackToTasks: "Retour aux tâches",
632
+ flowSaveAndReturn: "Enregistrer et revenir",
633
+ flowSaveDraft: "Enregistrer le brouillon",
634
+ flowClose: "Fermer",
635
+ flowDiscardQuestion: "Abandonner vos réponses ?",
636
+ flowDiscard: "Abandonner",
637
+ flowKeepEditing: "Continuer la saisie",
638
+ flowDraftSaved: "Brouillon enregistré",
639
+ flowDraftFailed: "Le brouillon n’a pas été enregistré.",
640
+ flowDraftFound: "Brouillon enregistré",
641
+ flowDraftFrom: "Vous avez un brouillon enregistré le {time}.",
642
+ flowDraftStale: "Les paramètres ont changé depuis l’enregistrement de ce brouillon.",
643
+ flowDraftResume: "Reprendre là où vous en étiez",
644
+ flowDraftRestart: "Recommencer",
645
+ flowStartFrom: "Partir de",
646
+ flowPresetSave: "Enregistrer comme modèle",
647
+ flowPresetNone: "Valeurs par défaut",
648
+ flowPresetsSaved: "Modèles enregistrés",
649
+ flowPresetApplied: "Parti de {preset}",
650
+ flowPresetName: "Nom du modèle",
651
+ flowPresetFailed: "Le modèle n’a pas été enregistré.",
652
+ flowPresetSaved: "Modèle {preset} enregistré",
653
+ flowPresetChanges: "[one]D’après {preset}, {count} modification[other]D’après {preset}, {count} modifications",
654
+ flowCommandTab: "Commande",
655
+ flowPatchTab: "JSON patch",
656
+ flowCommandTitle: "Commande équivalente",
657
+ flowPreview: "Aperçu",
658
+ flowPreviewLoading: "Chargement de l’aperçu…",
659
+ flowPreviewFailed: "Impossible de charger l’aperçu : {message}",
660
+ flowPreviewNone: "Rien à prévisualiser.",
661
+ flowConfirmMismatch: "Saisissez exactement {text} pour continuer.",
662
+ flowAcknowledgeNeeded: "Confirmez ceci avant d’envoyer.",
663
+ flowPresetCurrent: "Paramètres actuels",
664
+ flowPickOneByOne: "Choisissez les enregistrements un par un ou page par page.",
591
665
  matrixRows: "Lignes",
592
666
  matrixColumns: "Colonnes",
593
667
  matrixSearch: "Rechercher des lignes et des colonnes",
@@ -588,6 +588,80 @@ const labels = Object.freeze({
588
588
  flowCopied: "Copiato",
589
589
  flowSavedIt: "L'ho salvato",
590
590
  flowShownOnce: "Mostrato una sola volta. Copialo ora.",
591
+ flowTimedOut: "L’host non ha risposto in tempo.",
592
+ flowNoHostHook: "Nessun host risponde a questo.",
593
+ flowOptionsLoading: "Caricamento delle opzioni…",
594
+ flowOptionsFailed: "Impossibile caricare le opzioni: {message}",
595
+ flowRetry: "Riprova",
596
+ flowRunAgain: "Esegui di nuovo",
597
+ flowRunCheckAgain: "Esegui di nuovo «{check}»",
598
+ flowFieldsLoading: "Caricamento dei campi…",
599
+ flowFieldsFailed: "Impossibile caricare i campi: {message}",
600
+ flowChangedMark: "Modificato",
601
+ flowRecordActions: "Azioni",
602
+ flowRecordCell: "{column}, riga {row}",
603
+ flowRecordRemove: "Rimuovi la riga {row}",
604
+ flowRecordAdd: "Aggiungi riga",
605
+ flowRecordsEmpty: "Ancora nessuna riga.",
606
+ flowRecordProblem: "Riga {row}: {message}",
607
+ flowRecordsCount: "[one]{count} riga[other]{count} righe",
608
+ flowPickMore: "e altri {count}",
609
+ flowPickCount: "[one]{count} scelto[other]{count} scelti",
610
+ flowPickChosen: "Scelti",
611
+ flowPickNone: "Ancora nulla di scelto.",
612
+ flowChecks: "Verifiche",
613
+ flowCancel: "Annulla",
614
+ flowCheckAcknowledge: "Continua nonostante l’avviso",
615
+ flowCheckRunning: "Verifica in corso…",
616
+ flowCheckNotRun: "Non eseguita",
617
+ flowCheckStale: "Le risposte sono cambiate dopo la verifica",
618
+ flowCheckPassed: "Superata alle {time}",
619
+ flowCheckWarning: "Avviso alle {time}",
620
+ flowCheckFailed: "Non riuscita alle {time}",
621
+ flowCheckInvalid: "La verifica non ha dato una risposta utilizzabile.",
622
+ flowCheckNeeded: "Esegui «{check}» con queste risposte.",
623
+ flowCheckNotPassed: "«{check}» non è stata superata.",
624
+ flowCheckConfirmWarning: "Conferma l’avviso di «{check}».",
625
+ flowTasks: "Attività",
626
+ flowTasksProgress: "{done} di {count} attività completate",
627
+ flowTaskNeedsAction: "Richiede un intervento",
628
+ flowTaskBlocked: "Non può ancora iniziare",
629
+ flowTasksReview: "Rivedi e invia",
630
+ flowTasksIncomplete: "Completa prima le attività obbligatorie.",
631
+ flowBackToTasks: "Torna alle attività",
632
+ flowSaveAndReturn: "Salva e torna indietro",
633
+ flowSaveDraft: "Salva bozza",
634
+ flowClose: "Chiudi",
635
+ flowDiscardQuestion: "Scartare le risposte?",
636
+ flowDiscard: "Scarta",
637
+ flowKeepEditing: "Continua a modificare",
638
+ flowDraftSaved: "Bozza salvata",
639
+ flowDraftFailed: "La bozza non è stata salvata.",
640
+ flowDraftFound: "Bozza salvata",
641
+ flowDraftFrom: "Hai una bozza salvata il {time}.",
642
+ flowDraftStale: "Le impostazioni sono cambiate dopo il salvataggio di questa bozza.",
643
+ flowDraftResume: "Riprendi da dove avevi lasciato",
644
+ flowDraftRestart: "Ricomincia",
645
+ flowStartFrom: "Parti da",
646
+ flowPresetSave: "Salva come modello",
647
+ flowPresetNone: "Valori predefiniti",
648
+ flowPresetsSaved: "Modelli salvati",
649
+ flowPresetApplied: "Avviato da {preset}",
650
+ flowPresetName: "Nome del modello",
651
+ flowPresetFailed: "Il modello non è stato salvato.",
652
+ flowPresetSaved: "Modello {preset} salvato",
653
+ flowPresetChanges: "[one]In base a {preset}, {count} modifica[other]In base a {preset}, {count} modifiche",
654
+ flowCommandTab: "Comando",
655
+ flowPatchTab: "JSON patch",
656
+ flowCommandTitle: "Comando equivalente",
657
+ flowPreview: "Anteprima",
658
+ flowPreviewLoading: "Caricamento dell’anteprima…",
659
+ flowPreviewFailed: "Impossibile caricare l’anteprima: {message}",
660
+ flowPreviewNone: "Niente da visualizzare.",
661
+ flowConfirmMismatch: "Digita esattamente {text} per continuare.",
662
+ flowAcknowledgeNeeded: "Conferma prima di inviare.",
663
+ flowPresetCurrent: "Impostazioni attuali",
664
+ flowPickOneByOne: "Scegli i record uno alla volta o una pagina alla volta.",
591
665
  matrixRows: "Righe",
592
666
  matrixColumns: "Colonne",
593
667
  matrixSearch: "Cerca righe e colonne",