@evotecit/canopyx 0.0.0-stage → 0.1.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.
@@ -0,0 +1,109 @@
1
+ import type {
2
+ CanopyNode, CanopyColumn, CanopyView, InlineView, SidecarView, RemoteView, CanopyLabels, CellValue, CheckIntent,
3
+ CountsDocument, PageResult, SearchResult, ViewQuery, ReadonlyViewQuery, ContextAction
4
+ } from "./protocol.js";
5
+
6
+ export type Awaitable<T> = T | PromiseLike<T>;
7
+ /** Query-aware hosts answer from one accepted dataset revision. */
8
+ export interface SourceRequest { signal: AbortSignal; query?: ReadonlyViewQuery; revision?: string | null; }
9
+ interface DataSourceBase {
10
+ kind?: string;
11
+ /** Resolves a lease disposer. A source releases held data on cancellation as well. */
12
+ prefetch?(opens: string[], finds: string[], request?: SourceRequest): Awaitable<void | (() => void)>;
13
+ }
14
+ type SourcePage<T> = (node: CanopyNode | null, cursor: string | null, request?: SourceRequest) => Awaitable<T>;
15
+ type SourceSearch<T> = (query: string, limit: number, request?: SourceRequest) => Awaitable<T>;
16
+ type SourceCounts<T> = (ids: string[], request?: SourceRequest) => Awaitable<T>;
17
+ type SearchCapability<T> = (
18
+ | { canSearch: true; search: SourceSearch<T> }
19
+ | { canSearch?: false; search?: SourceSearch<T> }
20
+ );
21
+ /** Search availability requires its method; query-aware callbacks identify one dataset revision. */
22
+ export type DataSource = DataSourceBase & (
23
+ | ({ queryAware?: false; page: SourcePage<PageResult>; counts?: SourceCounts<CountsDocument> | null } & SearchCapability<SearchResult>)
24
+ | ({ queryAware: true; page: SourcePage<PageResult & { revision: string }>;
25
+ counts?: SourceCounts<CountsDocument & { revision: string }> | null } & SearchCapability<SearchResult & { revision: string }>)
26
+ );
27
+ export interface RemoteOptions { timeoutMs?: number; signal?: AbortSignal; }
28
+ export interface Sources {
29
+ inline(view: InlineView): DataSource;
30
+ sidecar(view: SidecarView): DataSource;
31
+ remote(view: RemoteView, options?: RemoteOptions): DataSource;
32
+ }
33
+
34
+ export interface NodeReference { readonly nodeId: string; readonly path: readonly string[]; }
35
+ export interface EditProposal extends NodeReference {
36
+ readonly column: string;
37
+ readonly previous: CellValue;
38
+ readonly value: CellValue;
39
+ }
40
+ export type DropPlacement = "inside" | "before" | "after";
41
+ export interface DropProposal {
42
+ readonly nodes: readonly NodeReference[];
43
+ readonly target: { readonly nodeId: string | null; readonly path: readonly string[] };
44
+ readonly placement: DropPlacement;
45
+ }
46
+ export interface ActionProposal extends NodeReference { readonly action: string; }
47
+ export interface InteractionContext {
48
+ readonly signal: AbortSignal;
49
+ readonly reason: string;
50
+ readonly query: ViewQuery | null;
51
+ readonly revision: string | null;
52
+ }
53
+ export interface InteractionOptions { signal?: AbortSignal; reason?: string; }
54
+ export interface SelectionContext { previous: CanopyNode[]; reason: string; }
55
+ export interface CheckContext { readonly previous: readonly CheckIntent[]; readonly reason: string; }
56
+ export interface CellContext {
57
+ column: string; level: number; expanded: boolean; index: number;
58
+ /** Aborts before replacement, recycling, failed rendering or destruction. */
59
+ readonly signal: AbortSignal;
60
+ /** Registers cleanup for this cell paint. Called once in reverse registration order. */
61
+ onDispose(cleanup: () => void): void;
62
+ }
63
+ export interface LoadInfo { node: CanopyNode | null; count: number; total: number | null; ms: number; }
64
+
65
+ /** Hooks stay with the host. Acceptance never makes the grid perform a write. */
66
+ interface HostOptionsBase {
67
+ source?: DataSource;
68
+ labels?: CanopyLabels;
69
+ requestTimeoutMs?: number;
70
+ retainedNodeLimit?: number;
71
+ inactiveNodeLimit?: number;
72
+ interactionTimeoutMs?: number;
73
+ renderers?: Record<string, (node: CanopyNode, element: HTMLElement, context: CellContext) => boolean>;
74
+ renderDetail?: (node: CanopyNode, element: HTMLElement) => boolean;
75
+ onSelect?: (node: CanopyNode | null, nodes: CanopyNode[]) => void;
76
+ onToggle?: (node: CanopyNode, expanded: boolean) => void;
77
+ onLoad?: (node: CanopyNode | null, info: LoadInfo) => void;
78
+ isSelectable?: (node: CanopyNode) => boolean;
79
+ beforeSelect?: (node: CanopyNode | null, nodes: CanopyNode[], context: SelectionContext) => boolean | void;
80
+ isCheckable?: (node: CanopyNode) => boolean;
81
+ beforeCheck?: (node: CanopyNode | null, intents: readonly CheckIntent[], context: CheckContext) => boolean | void;
82
+ onCheck?: (node: CanopyNode | null, intents: readonly CheckIntent[], context: { reason: string }) => void;
83
+ onEdit?: (proposal: EditProposal, context: InteractionContext) => Awaitable<boolean>;
84
+ onDrop?: (proposal: DropProposal, context: InteractionContext) => Awaitable<boolean>;
85
+ onAction?: (proposal: ActionProposal, context: InteractionContext) => Awaitable<boolean>;
86
+ canEdit?: (node: CanopyNode, column: CanopyColumn) => boolean;
87
+ canDrag?: (node: CanopyNode) => boolean;
88
+ canDrop?: (proposal: DropProposal) => boolean;
89
+ isActionEnabled?: (node: CanopyNode, action: Readonly<ContextAction>) => boolean;
90
+ }
91
+ /** A custom deep-link scheme supplies its formatter and parser together. */
92
+ export type HostOptions = HostOptionsBase & (
93
+ | { formatLink: (path: string[], node: CanopyNode | null) => string | null;
94
+ parseLink: (fragment: string) => Awaitable<string[] | null> }
95
+ | { formatLink?: never; parseLink?: never }
96
+ );
97
+ export type TreeGridOptions = HostOptions & { view: CanopyView };
98
+ export interface ExpandPathOptions {
99
+ select?: boolean;
100
+ focus?: boolean;
101
+ reveal?: boolean;
102
+ expandLast?: boolean;
103
+ signal?: AbortSignal;
104
+ }
105
+ export interface FilterOptions { autoExpand?: boolean; }
106
+ export type NodeFilter = ((node: CanopyNode) => boolean) | {
107
+ match(node: CanopyNode): boolean;
108
+ keep?(node: CanopyNode): boolean;
109
+ };
@@ -0,0 +1,85 @@
1
+ import type {
2
+ CanopyBadge, CanopyNode, CanopyView, CanopyLabels, CellValue, CheckIntent, CheckState,
3
+ CountsDocument, SortDirection, TimeZone, ViewQuery, ViewState, LegacyViewState, SearchResult, LabelName
4
+ } from "./protocol.js";
5
+ import type {
6
+ TreeGridOptions, HostOptions, Sources, ExpandPathOptions, NodeFilter, FilterOptions,
7
+ InteractionOptions, DropPlacement
8
+ } from "./hosts.js";
9
+ export * from "./protocol.js";
10
+ export * from "./hosts.js";
11
+
12
+ /** One mounted grid. Every method owns presentation only; host hooks own domain writes. */
13
+ export interface TreeGrid {
14
+ readonly element: HTMLElement;
15
+ readonly view: CanopyView;
16
+ readonly ready: Promise<void>;
17
+ expandPath(ids: string[], options?: ExpandPathOptions): Promise<CanopyNode | null>;
18
+ setFilter(filter: NodeFilter | null, options?: FilterOptions): void;
19
+ setFilterActive(id: string, active: boolean): void | Promise<boolean>;
20
+ setActiveFilters(ids: string[]): void | Promise<boolean>;
21
+ /** Applies removals, then additions, in one transaction using the latest pending query. */
22
+ updateActiveFilters(change: { add?: readonly string[]; remove?: readonly string[] }): void | Promise<boolean>;
23
+ getActiveFilters(): string[];
24
+ sort(columnId: string, direction?: SortDirection | null): void | Promise<boolean>;
25
+ getQuery(): ViewQuery;
26
+ setQuery(query: ViewQuery, options?: { signal?: AbortSignal }): Promise<boolean>;
27
+ setColumnVisible(columnId: string, visible: boolean): void;
28
+ setColumnWidth(columnId: string, width: number): void;
29
+ setTreeColumnPinned(pinned: boolean): void;
30
+ setTimeZone(zone: TimeZone): void;
31
+ getTimeZone(): TimeZone;
32
+ refresh(): void;
33
+ reload(id?: string | null, options?: { signal?: AbortSignal }): Promise<boolean>;
34
+ readLocation(): Promise<void>;
35
+ getSelected(): CanopyNode[];
36
+ /** Replaces selection with loaded IDs. Single-selection overflow is rejected atomically. */
37
+ setSelection(ids: string[]): boolean;
38
+ clearSelection(): boolean;
39
+ /** Chooses loaded or visible nodes without fetching unloaded data. Scope is required. */
40
+ selectAll(options: { scope: "visible" | "loaded" }): boolean;
41
+ focus(): void;
42
+ visibleRows(): { node: CanopyNode; level: number; path: string[] }[];
43
+ toOutline(): string;
44
+ getState(): ViewState;
45
+ setState(state: ViewState | LegacyViewState): Promise<boolean>;
46
+ search(query: string, limit?: number): Promise<SearchResult>;
47
+ loadMore(id?: string | null): Promise<void>;
48
+ applyCounts(document: CountsDocument): void;
49
+ refreshCounts(ids?: string[]): Promise<CountsDocument | null>;
50
+ getCheckState(id: string): CheckState | null;
51
+ getCheckIntents(): CheckIntent[];
52
+ setChecked(id: string, checked: boolean): boolean;
53
+ setCheckIntents(intents: readonly CheckIntent[]): boolean;
54
+ requestEdit(id: string, column: string, value: CellValue, options?: InteractionOptions): Promise<boolean>;
55
+ requestDrop(ids: string[], target: string | null, placement?: DropPlacement, options?: InteractionOptions): Promise<boolean>;
56
+ requestAction(id: string, action: string, options?: InteractionOptions): Promise<boolean>;
57
+ cancelInteraction(): boolean;
58
+ beginEdit(id: string, column: string): boolean;
59
+ openActions(id: string): boolean;
60
+ destroy(): void;
61
+ }
62
+
63
+ export const protocol: "canopyx/2";
64
+ /** Creates a grid, or returns the existing grid mounted in this host. Requires a browser DOM. */
65
+ export function createTreeGrid(host: HTMLElement, options: TreeGridOptions): TreeGrid;
66
+ /** Configures future fragment mounts and returns a disposer for this registration. Requires a browser DOM. */
67
+ export function configure(viewId: string, options: HostOptions): () => void;
68
+ export function unconfigure(viewId: string): boolean;
69
+ /** Mounts unmounted fragments below root. Requires a browser DOM. */
70
+ export function mount(root?: ParentNode): TreeGrid[];
71
+ export const sources: Readonly<Sources>;
72
+ export function badge(value: CanopyBadge): HTMLElement;
73
+ export const labels: Readonly<Record<LabelName, string>>;
74
+
75
+ declare const CanopyX: Readonly<{
76
+ protocol: typeof protocol;
77
+ createTreeGrid: typeof createTreeGrid;
78
+ configure: typeof configure;
79
+ unconfigure: typeof unconfigure;
80
+ mount: typeof mount;
81
+ sources: typeof sources;
82
+ badge: typeof badge;
83
+ labels: typeof labels;
84
+ }>;
85
+ export default CanopyX;
@@ -0,0 +1,6 @@
1
+ import type { CanopyLabels } from "../protocol.js";
2
+ /** Complete German browser labels; individual properties can be overridden by the host. */
3
+ export const labels: Readonly<Required<CanopyLabels>>;
4
+ /** Labels used only by a script-free static fallback. */
5
+ export const staticLabels: Readonly<{ overflowNote: string; unknownTotal: string; hiddenRows: string; fullReport: string }>;
6
+ export default labels;
@@ -0,0 +1,223 @@
1
+ // Generated from CanopyX/Views/Locales/labels.json by Build/Sync-Assets.ps1.
2
+ const labels = Object.freeze({
3
+ searchPlaceholder: "Suchen",
4
+ searchResults: "Suchergebnisse",
5
+ searchResultCount: "{count} Ergebnisse",
6
+ searchResultCountOfTotal: "{count} von {total} Ergebnissen",
7
+ searchResultCountOfMany: "{count} von vielen Ergebnissen",
8
+ searchNoResults: "Keine Ergebnisse",
9
+ searchTooShort: "Mindestens {min} Zeichen eingeben",
10
+ searchWordTooShort: "Ein Wort mit mindestens {min} Zeichen eingeben",
11
+ searchFailed: "Suche fehlgeschlagen: {error}",
12
+ columns: "Spalten",
13
+ gridFilters: "Filter",
14
+ gridFitContent: "An Inhalt anpassen",
15
+ gridUnpin: "Fixierung aufheben",
16
+ gridWhere: "Wenn",
17
+ gridComplexFilter: "Diese Spalte gehört zu einer gemischten Bedingungsgruppe. Bearbeiten Sie sie unter Filter.",
18
+ gridClearColumnFilter: "Filter löschen",
19
+ gridSelectionAggregate: "Anzahl: {count} · Summe: {sum} · Durchschnitt: {average} · Minimum: {minimum} · Maximum: {maximum}",
20
+ gridConditionValue: "Wert",
21
+ gridConditionUpperValue: "Oberer Wert",
22
+ gridDeleteCondition: "Bedingung entfernen",
23
+ gridShowRowsWhere: "Zeilen anzeigen, für die",
24
+ gridOfTheseAreTrue: "dieser Bedingungen zutreffen",
25
+ gridOfThese: "dieser Bedingungen",
26
+ gridGroupCount: "{count} Gruppen",
27
+ gridMore: "Mehr",
28
+ gridDone: "Fertig",
29
+ gridClearAll: "Alles löschen",
30
+ gridRows: "Zeilen",
31
+ gridResultNoun: "{count} von {total} {noun}",
32
+ gridSearchNoun: "{noun} suchen",
33
+ gridChart: "Diagramm",
34
+ gridColumnMenu: "Menü für {column}",
35
+ gridSortAscending: "Aufsteigend sortieren",
36
+ gridSortDescending: "Absteigend sortieren",
37
+ gridClearSort: "Sortierung löschen",
38
+ gridFilterColumn: "Filtern…",
39
+ gridHideColumn: "Spalte ausblenden",
40
+ gridGroupedBy: "Gruppiert nach",
41
+ gridRemoveGrouping: "Gruppierung entfernen",
42
+ gridSelectAllValues: "Alle Werte auswählen",
43
+ gridFilterValues: "Werte suchen",
44
+ gridAddCondition: "+ Bedingung",
45
+ gridAddGroup: "+ Gruppe",
46
+ gridAnd: "und",
47
+ gridOr: "oder",
48
+ gridEditAsText: "Als Text bearbeiten",
49
+ gridFilterText: "Filterausdruck",
50
+ gridDeepFilters: "Dieser gespeicherte Filter hat mehr als zwei Verschachtelungsebenen.",
51
+ gridToday: "Heute",
52
+ gridYesterday: "Gestern",
53
+ gridLastSevenDays: "Letzte 7 Tage",
54
+ gridLastThirtyDays: "Letzte 30 Tage",
55
+ gridThisMonth: "Dieser Monat",
56
+ gridDateRange: "Zeitraum",
57
+ gridEmpty: "Keine {noun}",
58
+ gridEmptyReason: "Es gibt keine Datensätze zum Anzeigen.",
59
+ gridNoMatches: "Keine passenden {noun}",
60
+ gridNoMatchesReason: "Suche: {search}. Aktive Filter: {count}.",
61
+ gridRetry: "Erneut versuchen",
62
+ gridLoadFailed: "Datensätze konnten nicht geladen werden",
63
+ gridAll: "Alle",
64
+ gridPageOf: "{page} von {pages}",
65
+ gridStatusCount: "{count} {noun} · {selected} ausgewählt",
66
+ gridDetailsSection: "Details",
67
+ gridPreviousRecord: "Vorheriger Datensatz",
68
+ gridNextRecord: "Nächster Datensatz",
69
+ gridShowMore: "Mehr anzeigen",
70
+ gridNoData: "Keine Daten",
71
+ gridPeriodRange: "{from}–{to}: {state}",
72
+ gridHealthy: "Normal",
73
+ gridResultCount: "{count} von {total} Zeilen",
74
+ gridUnknownCount: "Ergebnisanzahl nicht verfügbar",
75
+ gridMatchedCount: "{count} passende Zeilen",
76
+ gridCursorRange: "Zeilen {first}–{last}",
77
+ gridPaging: "Ergebnisseiten",
78
+ gridPageRange: "Zeilen {first}–{last} von {count}",
79
+ gridPageNumber: "Seite",
80
+ gridPageLength: "Zeilen pro Seite",
81
+ gridFirstPage: "Erste Seite",
82
+ gridPreviousPage: "Vorherige Seite",
83
+ gridNextPage: "Nächste Seite",
84
+ gridLastPage: "Letzte Seite",
85
+ gridClearQuery: "Suche und Filter löschen",
86
+ gridRemoveSearch: "Suche löschen: {search}",
87
+ gridGroupedFilters: "Filtergruppen ({count} Bedingungen)",
88
+ gridRemoveGroup: "Filtergruppen löschen",
89
+ gridRemoveCondition: "Bedingung entfernen: {condition}",
90
+ gridExport: "Exportieren",
91
+ gridFilteredResults: "Gefilterte Ergebnisse",
92
+ gridSelectedRows: "Ausgewählte Zeilen",
93
+ gridAllResults: "Alle Ergebnisse",
94
+ gridDownloadCsv: "CSV herunterladen",
95
+ gridCopy: "Kopieren",
96
+ gridDetails: "Datensatzdetails",
97
+ gridColumn: "Spalte",
98
+ gridOperator: "Bedingung",
99
+ gridValue: "Wert (Datumsangaben in UTC)",
100
+ gridValueType: "Typ des Rohwerts",
101
+ gridText: "Text",
102
+ gridBoolean: "Boolescher Wert",
103
+ gridAddFilter: "Filter hinzufügen",
104
+ gridRemoveFilter: "Filter für {column} entfernen",
105
+ gridApply: "Übernehmen",
106
+ gridClearFilters: "Alle Filter löschen",
107
+ gridMoveEarlier: "{column} nach links verschieben",
108
+ gridMoveLater: "{column} nach rechts verschieben",
109
+ gridViews: "Ansichten",
110
+ gridViewName: "Ansichtsname",
111
+ gridSaveView: "Ansicht speichern",
112
+ gridRemoveView: "Ansicht löschen",
113
+ gridResetView: "Ansicht zurücksetzen",
114
+ gridChooseView: "Gespeicherte Ansicht auswählen",
115
+ gridInvalidFilter: "Einen gültigen Filterwert eingeben.",
116
+ gridBetween: "zwischen (einschließlich)",
117
+ gridRangeEnd: "Oberer Wert (Datumsangaben in UTC)",
118
+ gridInvalidRange: "Der obere Wert muss mindestens so groß wie der untere Wert sein.",
119
+ gridSuggestedCategory: "Vorgeschlagene Kategorie",
120
+ gridChooseCategory: "Kategorie auswählen",
121
+ gridBooleanValue: "Boolescher Wert",
122
+ gridTrue: "Wahr",
123
+ gridFalse: "Falsch",
124
+ gridHeaderFilter: "{column} filtern",
125
+ gridExpandCell: "{column}: vollständigen Text anzeigen",
126
+ gridCloseCell: "Vollständigen Text schließen",
127
+ gridMoveColumn: "{column}: zum Verschieben ziehen oder Pfeil links/rechts verwenden",
128
+ gridResizeHelp: "Eingabe passt die Breite an bis zu 200 geladene Zeilen an; Pfeil links/rechts ändert die Breite.",
129
+ gridFitColumn: "{column} anpassen",
130
+ gridFitAllColumns: "Alle Spalten anpassen",
131
+ gridColumnMoved: "{column} an Position {position} verschoben",
132
+ gridPinColumn: "{column}: Spalte fixieren",
133
+ gridPinNone: "Mitlaufend",
134
+ gridPinLeft: "Links fixieren",
135
+ gridPinRight: "Rechts fixieren",
136
+ gridResponsiveHidden: "Bei dieser Breite ausgeblendet",
137
+ gridFindColumn: "Spalte suchen…",
138
+ gridShowAllColumns: "Alle anzeigen",
139
+ gridResetColumns: "Spalten zurücksetzen",
140
+ gridReorderColumn: "{column}: ziehen oder Alt+Pfeil nach oben bzw. Alt+Pfeil nach unten drücken, um zu verschieben",
141
+ gridPinnedLeft: "Links fixiert",
142
+ gridPinnedRight: "Rechts fixiert",
143
+ gridFilterGroupTitle: "Zusätzliche Bedingungsgruppen",
144
+ gridFilterMatch: "Übereinstimmung",
145
+ gridFilterAll: "Alle",
146
+ gridFilterAny: "Beliebige",
147
+ gridAddFilterGroup: "Bedingungsgruppe hinzufügen",
148
+ gridDeleteFilterGroup: "Bedingungsgruppe entfernen",
149
+ gridFacetValues: "Werte und Häufigkeiten mit angewendeten Filtern",
150
+ gridFacetSearch: "Werte suchen",
151
+ gridFacetIncludeCurrent: "Angewendete Filter dieser Spalte berücksichtigen",
152
+ gridFacetLoad: "Werte laden",
153
+ gridFacetChoose: "Wert auswählen",
154
+ gridFacetCounts: "{count} passende Zeilen; {shown} von {total} Werten.",
155
+ gridFacetReload: "Die Werte wurden geändert oder die Anfrage wurde abgebrochen. Werte erneut laden.",
156
+ gridRenameView: "Ansicht umbenennen",
157
+ gridDefaultView: "Als Standard festlegen",
158
+ gridClearDefaultView: "Standardzuordnung entfernen",
159
+ gridDefaultViewName: "Standardansicht: {name}",
160
+ gridNoDefaultView: "Keine Standardansicht",
161
+ gridDefaultViewOption: "{name} (Standard)",
162
+ gridSelection: "Auswahl",
163
+ gridSelectPage: "Seite auswählen",
164
+ gridSelectMatching: "Alle passenden auswählen",
165
+ gridClearSelection: "Auswahl aufheben",
166
+ gridSelectionCount: "{count} ausgewählt",
167
+ gridSelectionQueryCount: "{count} passende Datensätze ausgewählt; {excluded} ausgeschlossen",
168
+ gridSelectionQueryUnknown: "Alle passenden Datensätze ausgewählt; {excluded} ausgeschlossen",
169
+ gridSelectRecord: "Datensatz {id} auswählen",
170
+ gridGroupHeading: "{column}: {value} ({count} Datensätze)",
171
+ gridGroupMissing: "Fehlender Wert",
172
+ gridGroupExpand: "Gruppe erweitern",
173
+ gridGroupCollapse: "Gruppe reduzieren",
174
+ gridSummary: "Ergebnissummen",
175
+ gridGroupOrder: "Die Gruppenreihenfolge ist im Bericht festgelegt",
176
+ gridExportProgress: "{completed} von {total} Datensätzen",
177
+ gridExportReading: "{completed} Datensätze",
178
+ gridExportCancelled: "Export abgebrochen",
179
+ gridCancelExport: "Export abbrechen",
180
+ gridPrint: "Drucken",
181
+ gridCloseRecord: "Datensatzdetails schließen",
182
+ gridContains: "enthält",
183
+ gridStartsWith: "beginnt mit",
184
+ gridIn: "ist einer der Werte",
185
+ gridIsNull: "fehlt",
186
+ gridIsNotNull: "ist vorhanden",
187
+ visibleColumns: "Sichtbare Spalten",
188
+ resizeColumn: "Breite von {column} ändern",
189
+ columnWidth: "{width} Pixel",
190
+ loading: "Wird geladen…",
191
+ loadError: "Laden fehlgeschlagen: {error} (Eingabe zum Wiederholen)",
192
+ queryFailed: "Ansicht konnte nicht aktualisiert werden: {error}",
193
+ actions: "Aktionen",
194
+ editValue: "{column} bearbeiten",
195
+ saveEdit: "Speichern",
196
+ cancelEdit: "Abbrechen",
197
+ invalidEdit: "Einen gültigen Wert für {column} eingeben.",
198
+ interactionPending: "Warten auf die Anwendung…",
199
+ interactionRejected: "Die Anwendung hat den Vorgang abgelehnt.",
200
+ interactionFailed: "Vorgang fehlgeschlagen: {error}",
201
+ markMove: "Diesen Knoten verschieben",
202
+ moveHere: "Hierher verschieben",
203
+ moveBefore: "Davor verschieben",
204
+ moveAfter: "Danach verschieben",
205
+ cancelMove: "Verschieben abbrechen",
206
+ showMore: "Mehr anzeigen ({loaded} von {total} geladen)",
207
+ showMoreUnknownTotal: "Mehr anzeigen ({loaded} geladen)",
208
+ pageLoaded: "{loaded} von {total} geladen",
209
+ itemsLoaded: "{count} Elemente",
210
+ yes: "Ja",
211
+ no: "Nein",
212
+ utcTime: "{time} UTC",
213
+ localTime: "{time} Ortszeit",
214
+ mountError: "Diese Ansicht konnte nicht angezeigt werden: {error}",
215
+ });
216
+ const staticLabels = Object.freeze({
217
+ overflowNote: "{shown} Zeilen angezeigt. Gesamtzahl: {total}.",
218
+ unknownTotal: "unbekannt",
219
+ hiddenRows: "{count} weitere Zeilen werden nicht angezeigt",
220
+ fullReport: "Vollständigen Bericht öffnen",
221
+ });
222
+ export { labels, staticLabels };
223
+ export default labels;
@@ -0,0 +1,6 @@
1
+ import type { CanopyLabels } from "../protocol.js";
2
+ /** Complete Spanish browser labels; individual properties can be overridden by the host. */
3
+ export const labels: Readonly<Required<CanopyLabels>>;
4
+ /** Labels used only by a script-free static fallback. */
5
+ export const staticLabels: Readonly<{ overflowNote: string; unknownTotal: string; hiddenRows: string; fullReport: string }>;
6
+ export default labels;
@@ -0,0 +1,223 @@
1
+ // Generated from CanopyX/Views/Locales/labels.json by Build/Sync-Assets.ps1.
2
+ const labels = Object.freeze({
3
+ searchPlaceholder: "Buscar",
4
+ searchResults: "Resultados de búsqueda",
5
+ searchResultCount: "{count} resultados",
6
+ searchResultCountOfTotal: "{count} de {total} resultados",
7
+ searchResultCountOfMany: "{count} de muchos resultados",
8
+ searchNoResults: "Sin resultados",
9
+ searchTooShort: "Escriba al menos {min} caracteres",
10
+ searchWordTooShort: "Escriba una palabra de al menos {min} caracteres",
11
+ searchFailed: "Error al buscar: {error}",
12
+ columns: "Columnas",
13
+ gridFilters: "Filtros",
14
+ gridFitContent: "Ajustar al contenido",
15
+ gridUnpin: "Desfijar",
16
+ gridWhere: "Donde",
17
+ gridComplexFilter: "Esta columna pertenece a un grupo mixto de condiciones. Edítelo en Filtros.",
18
+ gridClearColumnFilter: "Borrar filtro",
19
+ gridSelectionAggregate: "Cantidad: {count} · Suma: {sum} · Media: {average} · Mínimo: {minimum} · Máximo: {maximum}",
20
+ gridConditionValue: "Valor",
21
+ gridConditionUpperValue: "Valor superior",
22
+ gridDeleteCondition: "Eliminar condición",
23
+ gridShowRowsWhere: "Mostrar filas donde",
24
+ gridOfTheseAreTrue: "de estas condiciones se cumplen",
25
+ gridOfThese: "de estas condiciones",
26
+ gridGroupCount: "{count} grupos",
27
+ gridMore: "Más",
28
+ gridDone: "Listo",
29
+ gridClearAll: "Borrar todo",
30
+ gridRows: "filas",
31
+ gridResultNoun: "{count} de {total} {noun}",
32
+ gridSearchNoun: "Buscar {noun}",
33
+ gridChart: "Gráfico",
34
+ gridColumnMenu: "Menú de {column}",
35
+ gridSortAscending: "Ordenar ascendente",
36
+ gridSortDescending: "Ordenar descendente",
37
+ gridClearSort: "Borrar orden",
38
+ gridFilterColumn: "Filtrar…",
39
+ gridHideColumn: "Ocultar columna",
40
+ gridGroupedBy: "Agrupado por",
41
+ gridRemoveGrouping: "Quitar agrupación",
42
+ gridSelectAllValues: "Seleccionar todos los valores",
43
+ gridFilterValues: "Buscar valores",
44
+ gridAddCondition: "+ Condición",
45
+ gridAddGroup: "+ Grupo",
46
+ gridAnd: "y",
47
+ gridOr: "o",
48
+ gridEditAsText: "Editar como texto",
49
+ gridFilterText: "Expresión de filtro",
50
+ gridDeepFilters: "Este filtro guardado tiene más de dos niveles de anidación.",
51
+ gridToday: "Hoy",
52
+ gridYesterday: "Ayer",
53
+ gridLastSevenDays: "Últimos 7 días",
54
+ gridLastThirtyDays: "Últimos 30 días",
55
+ gridThisMonth: "Este mes",
56
+ gridDateRange: "Rango",
57
+ gridEmpty: "Sin {noun}",
58
+ gridEmptyReason: "No hay registros que mostrar.",
59
+ gridNoMatches: "Sin {noun} coincidentes",
60
+ gridNoMatchesReason: "Búsqueda: {search}. Filtros activos: {count}.",
61
+ gridRetry: "Reintentar",
62
+ gridLoadFailed: "No se pudieron cargar los registros",
63
+ gridAll: "Todo",
64
+ gridPageOf: "{page} de {pages}",
65
+ gridStatusCount: "{count} {noun} · {selected} seleccionados",
66
+ gridDetailsSection: "Detalles",
67
+ gridPreviousRecord: "Registro anterior",
68
+ gridNextRecord: "Registro siguiente",
69
+ gridShowMore: "Mostrar más",
70
+ gridNoData: "Sin datos",
71
+ gridPeriodRange: "{from}–{to}: {state}",
72
+ gridHealthy: "Correcto",
73
+ gridResultCount: "{count} de {total} filas",
74
+ gridUnknownCount: "El número de resultados no está disponible",
75
+ gridMatchedCount: "{count} filas coincidentes",
76
+ gridCursorRange: "Filas {first}–{last}",
77
+ gridPaging: "Páginas de resultados",
78
+ gridPageRange: "Filas {first}–{last} de {count}",
79
+ gridPageNumber: "Página",
80
+ gridPageLength: "Filas por página",
81
+ gridFirstPage: "Primera página",
82
+ gridPreviousPage: "Página anterior",
83
+ gridNextPage: "Página siguiente",
84
+ gridLastPage: "Última página",
85
+ gridClearQuery: "Borrar búsqueda y filtros",
86
+ gridRemoveSearch: "Borrar búsqueda: {search}",
87
+ gridGroupedFilters: "Filtros agrupados ({count} condiciones)",
88
+ gridRemoveGroup: "Borrar filtros agrupados",
89
+ gridRemoveCondition: "Quitar condición: {condition}",
90
+ gridExport: "Exportar",
91
+ gridFilteredResults: "Resultados filtrados",
92
+ gridSelectedRows: "Filas seleccionadas",
93
+ gridAllResults: "Todos los resultados",
94
+ gridDownloadCsv: "Descargar CSV",
95
+ gridCopy: "Copiar",
96
+ gridDetails: "Detalles del registro",
97
+ gridColumn: "Columna",
98
+ gridOperator: "Condición",
99
+ gridValue: "Valor (fechas en UTC)",
100
+ gridValueType: "Tipo del valor original",
101
+ gridText: "Texto",
102
+ gridBoolean: "Valor lógico",
103
+ gridAddFilter: "Agregar filtro",
104
+ gridRemoveFilter: "Quitar filtro de {column}",
105
+ gridApply: "Aplicar",
106
+ gridClearFilters: "Borrar todos los filtros",
107
+ gridMoveEarlier: "Mover {column} a la izquierda",
108
+ gridMoveLater: "Mover {column} a la derecha",
109
+ gridViews: "Vistas",
110
+ gridViewName: "Nombre de la vista",
111
+ gridSaveView: "Guardar vista",
112
+ gridRemoveView: "Eliminar vista",
113
+ gridResetView: "Restablecer vista",
114
+ gridChooseView: "Seleccionar una vista guardada",
115
+ gridInvalidFilter: "Escriba un valor de filtro válido.",
116
+ gridBetween: "entre (inclusive)",
117
+ gridRangeEnd: "Valor superior (fechas en UTC)",
118
+ gridInvalidRange: "El valor superior debe ser mayor o igual que el inferior.",
119
+ gridSuggestedCategory: "Categoría sugerida",
120
+ gridChooseCategory: "Seleccionar categoría",
121
+ gridBooleanValue: "Valor lógico",
122
+ gridTrue: "Verdadero",
123
+ gridFalse: "Falso",
124
+ gridHeaderFilter: "Filtrar {column}",
125
+ gridExpandCell: "{column}: mostrar el texto completo",
126
+ gridCloseCell: "Cerrar el texto completo",
127
+ gridMoveColumn: "{column}: arrastre para mover o use las flechas izquierda y derecha",
128
+ gridResizeHelp: "Entrar ajusta el ancho a un máximo de 200 filas cargadas; las flechas izquierda y derecha cambian el ancho.",
129
+ gridFitColumn: "Ajustar {column}",
130
+ gridFitAllColumns: "Ajustar todas las columnas",
131
+ gridColumnMoved: "{column} se ha movido a la posición {position}",
132
+ gridPinColumn: "{column}: fijar columna",
133
+ gridPinNone: "Desplazable",
134
+ gridPinLeft: "Fijar a la izquierda",
135
+ gridPinRight: "Fijar a la derecha",
136
+ gridResponsiveHidden: "Oculta con este ancho",
137
+ gridFindColumn: "Buscar una columna…",
138
+ gridShowAllColumns: "Mostrar todas",
139
+ gridResetColumns: "Restablecer columnas",
140
+ gridReorderColumn: "{column}: arrastre o pulse Alt+Flecha arriba o Alt+Flecha abajo para mover",
141
+ gridPinnedLeft: "Fijada a la izquierda",
142
+ gridPinnedRight: "Fijada a la derecha",
143
+ gridFilterGroupTitle: "Grupos de condiciones adicionales",
144
+ gridFilterMatch: "Coincidencia",
145
+ gridFilterAll: "Todas",
146
+ gridFilterAny: "Cualquiera",
147
+ gridAddFilterGroup: "Agregar grupo de condiciones",
148
+ gridDeleteFilterGroup: "Quitar grupo de condiciones",
149
+ gridFacetValues: "Valores y recuentos con los filtros aplicados",
150
+ gridFacetSearch: "Buscar valores",
151
+ gridFacetIncludeCurrent: "Incluir los filtros aplicados a esta columna",
152
+ gridFacetLoad: "Cargar valores",
153
+ gridFacetChoose: "Seleccionar un valor",
154
+ gridFacetCounts: "{count} filas coincidentes; {shown} de {total} valores.",
155
+ gridFacetReload: "Los valores han cambiado o se ha cancelado la solicitud. Vuelva a cargar los valores.",
156
+ gridRenameView: "Cambiar nombre de la vista",
157
+ gridDefaultView: "Establecer como predeterminada",
158
+ gridClearDefaultView: "Quitar la vista predeterminada",
159
+ gridDefaultViewName: "Vista predeterminada: {name}",
160
+ gridNoDefaultView: "Sin vista predeterminada",
161
+ gridDefaultViewOption: "{name} (predeterminada)",
162
+ gridSelection: "Selección",
163
+ gridSelectPage: "Seleccionar página",
164
+ gridSelectMatching: "Seleccionar todos los coincidentes",
165
+ gridClearSelection: "Borrar selección",
166
+ gridSelectionCount: "{count} seleccionados",
167
+ gridSelectionQueryCount: "{count} registros coincidentes seleccionados; {excluded} excluidos",
168
+ gridSelectionQueryUnknown: "Todos los registros coincidentes seleccionados; {excluded} excluidos",
169
+ gridSelectRecord: "Seleccionar registro {id}",
170
+ gridGroupHeading: "{column}: {value} ({count} registros)",
171
+ gridGroupMissing: "Valor ausente",
172
+ gridGroupExpand: "Expandir grupo",
173
+ gridGroupCollapse: "Contraer grupo",
174
+ gridSummary: "Totales de resultados",
175
+ gridGroupOrder: "El orden de los grupos está fijado en este informe",
176
+ gridExportProgress: "{completed} de {total} registros",
177
+ gridExportReading: "{completed} registros",
178
+ gridExportCancelled: "Exportación cancelada",
179
+ gridCancelExport: "Cancelar exportación",
180
+ gridPrint: "Imprimir",
181
+ gridCloseRecord: "Cerrar detalles del registro",
182
+ gridContains: "contiene",
183
+ gridStartsWith: "empieza por",
184
+ gridIn: "es uno de estos valores",
185
+ gridIsNull: "está ausente",
186
+ gridIsNotNull: "está presente",
187
+ visibleColumns: "Columnas visibles",
188
+ resizeColumn: "Cambiar ancho de {column}",
189
+ columnWidth: "{width} píxeles",
190
+ loading: "Cargando…",
191
+ loadError: "No se pudo cargar: {error} (Entrar para reintentar)",
192
+ queryFailed: "No se pudo actualizar la vista: {error}",
193
+ actions: "Acciones",
194
+ editValue: "Editar {column}",
195
+ saveEdit: "Guardar",
196
+ cancelEdit: "Cancelar",
197
+ invalidEdit: "Escriba un valor válido para {column}.",
198
+ interactionPending: "Esperando a la aplicación…",
199
+ interactionRejected: "La aplicación ha rechazado la operación.",
200
+ interactionFailed: "Error en la operación: {error}",
201
+ markMove: "Mover este nodo",
202
+ moveHere: "Mover aquí",
203
+ moveBefore: "Mover antes",
204
+ moveAfter: "Mover después",
205
+ cancelMove: "Cancelar movimiento",
206
+ showMore: "Mostrar más ({loaded} de {total} cargados)",
207
+ showMoreUnknownTotal: "Mostrar más ({loaded} cargados)",
208
+ pageLoaded: "{loaded} de {total} cargados",
209
+ itemsLoaded: "{count} elementos",
210
+ yes: "Sí",
211
+ no: "No",
212
+ utcTime: "{time} UTC",
213
+ localTime: "{time} hora local",
214
+ mountError: "No se pudo mostrar esta vista: {error}",
215
+ });
216
+ const staticLabels = Object.freeze({
217
+ overflowNote: "Filas mostradas: {shown}. Total: {total}.",
218
+ unknownTotal: "desconocido",
219
+ hiddenRows: "No se muestran {count} filas más",
220
+ fullReport: "Abrir el informe completo",
221
+ });
222
+ export { labels, staticLabels };
223
+ export default labels;
@@ -0,0 +1,6 @@
1
+ import type { CanopyLabels } from "../protocol.js";
2
+ /** Complete Polish browser labels; individual properties can be overridden by the host. */
3
+ export const labels: Readonly<Required<CanopyLabels>>;
4
+ /** Labels used only by a script-free static fallback. */
5
+ export const staticLabels: Readonly<{ overflowNote: string; unknownTotal: string; hiddenRows: string; fullReport: string }>;
6
+ export default labels;