@evotecit/canopyx 0.1.2 → 0.2.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 (85) hide show
  1. package/CanopyX.Html/Assets/canopyx-calendar-edit.js +113 -0
  2. package/CanopyX.Html/Assets/canopyx-calendar-ics.js +87 -0
  3. package/CanopyX.Html/Assets/canopyx-calendar-recurrence.js +36 -0
  4. package/CanopyX.Html/Assets/canopyx-calendar.css +279 -0
  5. package/CanopyX.Html/Assets/canopyx-calendar.js +307 -0
  6. package/CanopyX.Html/Assets/canopyx-cell-range.css +38 -0
  7. package/CanopyX.Html/Assets/canopyx-cell-range.js +141 -0
  8. package/CanopyX.Html/Assets/canopyx-column-groups.css +18 -0
  9. package/CanopyX.Html/Assets/canopyx-column-groups.js +51 -0
  10. package/CanopyX.Html/Assets/canopyx-data.js +14 -0
  11. package/CanopyX.Html/Assets/canopyx-detail-rows.css +18 -0
  12. package/CanopyX.Html/Assets/canopyx-detail-rows.js +51 -0
  13. package/CanopyX.Html/Assets/canopyx-editing.css +44 -0
  14. package/CanopyX.Html/Assets/canopyx-editing.js +134 -0
  15. package/CanopyX.Html/Assets/canopyx-enhance.js +126 -0
  16. package/CanopyX.Html/Assets/canopyx-export.js +18 -0
  17. package/CanopyX.Html/Assets/canopyx-facets.css +86 -0
  18. package/CanopyX.Html/Assets/canopyx-facets.js +65 -0
  19. package/CanopyX.Html/Assets/canopyx-filter-editor.css +15 -18
  20. package/CanopyX.Html/Assets/canopyx-filter-editor.js +23 -17
  21. package/CanopyX.Html/Assets/canopyx-format-editor.css +77 -0
  22. package/CanopyX.Html/Assets/canopyx-format-editor.js +30 -0
  23. package/CanopyX.Html/Assets/canopyx-formatting.css +40 -0
  24. package/CanopyX.Html/Assets/canopyx-formatting.js +101 -0
  25. package/CanopyX.Html/Assets/canopyx-grid-module.mjs +352 -246
  26. package/CanopyX.Html/Assets/canopyx-grid.css +139 -117
  27. package/CanopyX.Html/Assets/canopyx-grid.js +352 -246
  28. package/CanopyX.Html/Assets/canopyx-grouping.css +39 -0
  29. package/CanopyX.Html/Assets/canopyx-grouping.js +85 -0
  30. package/CanopyX.Html/Assets/canopyx-highlight.css +34 -0
  31. package/CanopyX.Html/Assets/canopyx-highlight.js +80 -0
  32. package/CanopyX.Html/Assets/canopyx-history.js +13 -0
  33. package/CanopyX.Html/Assets/canopyx-interactive.css +18 -6
  34. package/CanopyX.Html/Assets/canopyx-interactive.js +179 -100
  35. package/CanopyX.Html/Assets/canopyx-labels-de.js +304 -0
  36. package/CanopyX.Html/Assets/canopyx-labels-es.js +304 -0
  37. package/CanopyX.Html/Assets/canopyx-labels-fr.js +529 -0
  38. package/CanopyX.Html/Assets/canopyx-labels-it.js +529 -0
  39. package/CanopyX.Html/Assets/canopyx-labels-pl.js +304 -0
  40. package/CanopyX.Html/Assets/canopyx-layouts.css +48 -0
  41. package/CanopyX.Html/Assets/canopyx-layouts.js +39 -0
  42. package/CanopyX.Html/Assets/canopyx-link.css +19 -0
  43. package/CanopyX.Html/Assets/canopyx-link.js +38 -0
  44. package/CanopyX.Html/Assets/canopyx-links.js +14 -0
  45. package/CanopyX.Html/Assets/canopyx-live.css +24 -0
  46. package/CanopyX.Html/Assets/canopyx-live.js +88 -0
  47. package/CanopyX.Html/Assets/canopyx-module.mjs +180 -100
  48. package/CanopyX.Html/Assets/canopyx-pager.css +10 -0
  49. package/CanopyX.Html/Assets/canopyx-pager.js +14 -0
  50. package/CanopyX.Html/Assets/canopyx-record-panel.css +111 -0
  51. package/CanopyX.Html/Assets/canopyx-record-panel.js +178 -0
  52. package/CanopyX.Html/Assets/canopyx-reporting-module.mjs +406 -342
  53. package/CanopyX.Html/Assets/canopyx-reporting.css +140 -135
  54. package/CanopyX.Html/Assets/canopyx-reporting.js +406 -342
  55. package/CanopyX.Html/Assets/canopyx-search.js +32 -0
  56. package/CanopyX.Html/Assets/canopyx-timeline.css +80 -0
  57. package/CanopyX.Html/Assets/canopyx-timeline.js +88 -0
  58. package/CanopyX.Html/Assets/canopyx-tree-tools.css +103 -0
  59. package/CanopyX.Html/Assets/canopyx-tree-tools.js +92 -0
  60. package/CanopyX.Html/Assets/canopyx.css +17 -5
  61. package/CanopyX.Html/Assets/canopyx.js +175 -96
  62. package/JavaScript/calendar.d.ts +362 -0
  63. package/JavaScript/cell-ranges.d.ts +76 -0
  64. package/JavaScript/column-groups.d.ts +32 -0
  65. package/JavaScript/editing.d.ts +257 -0
  66. package/JavaScript/enhance.d.ts +202 -0
  67. package/JavaScript/facets.d.ts +58 -0
  68. package/JavaScript/formatting.d.ts +88 -0
  69. package/JavaScript/grid.d.ts +409 -56
  70. package/JavaScript/hosts.d.ts +177 -2
  71. package/JavaScript/index.d.ts +53 -4
  72. package/JavaScript/live.d.ts +115 -0
  73. package/JavaScript/locales/de.mjs +304 -0
  74. package/JavaScript/locales/es.mjs +304 -0
  75. package/JavaScript/locales/fr.d.ts +6 -0
  76. package/JavaScript/locales/fr.mjs +527 -0
  77. package/JavaScript/locales/it.d.ts +6 -0
  78. package/JavaScript/locales/it.mjs +527 -0
  79. package/JavaScript/locales/pl.mjs +304 -0
  80. package/JavaScript/plugins.d.ts +113 -0
  81. package/JavaScript/protocol.d.ts +139 -6
  82. package/JavaScript/records.d.ts +136 -0
  83. package/README.md +61 -9
  84. package/README.nuget.md +1 -1
  85. package/package.json +99 -3
@@ -1,5 +1,6 @@
1
1
  // Generated from CanopyX/Views/Locales/labels.json by Build/Sync-Assets.ps1.
2
2
  const labels = Object.freeze({
3
+ gridNoExportColumns: "Żadna widoczna kolumna nie obsługuje eksportu.",
3
4
  searchPlaceholder: "Szukaj",
4
5
  searchResults: "Wyniki wyszukiwania",
5
6
  searchResultCount: "Wyniki: {count}",
@@ -13,6 +14,24 @@ const labels = Object.freeze({
13
14
  gridFilters: "Filtry",
14
15
  gridFitContent: "Dopasuj do zawartości",
15
16
  gridUnpin: "Odepnij",
17
+ matchesHighlight: "Wyróżniaj dopasowania",
18
+ matchesCount: "[one]{count} dopasowanie[few]{count} dopasowania[many]{count} dopasowań[other]{count} dopasowania",
19
+ matchesPosition: "{current} z {count}",
20
+ matchesNone: "Brak dopasowań",
21
+ matchesLoaded: "[one]{count} dopasowanie we wczytanych wierszach[few]{count} dopasowania we wczytanych wierszach[many]{count} dopasowań we wczytanych wierszach[other]{count} dopasowania we wczytanych wierszach",
22
+ matchesPrevious: "Poprzednie dopasowanie",
23
+ matchesNext: "Następne dopasowanie",
24
+ matchesAnnounce: "Dopasowanie {current} z {count}, {column}",
25
+ layoutMenu: "Układ",
26
+ layoutFit: "Dopasuj do szerokości",
27
+ layoutScroll: "Wszystkie kolumny, przewijanie w poziomie",
28
+ layoutCards: "Karty",
29
+ layoutDensity: "Gęstość",
30
+ layoutCompact: "Zwarta",
31
+ layoutNormal: "Normalna",
32
+ layoutComfortable: "Swobodna",
33
+ layoutChanged: "Układ: {mode}, {density}",
34
+ layoutSort: "Sortuj według",
16
35
  gridWhere: "Gdzie",
17
36
  gridComplexFilter: "Ta kolumna należy do mieszanej grupy warunków. Edytuj ją w Filtrach.",
18
37
  gridClearColumnFilter: "Wyczyść filtr",
@@ -82,6 +101,9 @@ const labels = Object.freeze({
82
101
  gridPreviousPage: "Poprzednia strona",
83
102
  gridNextPage: "Następna strona",
84
103
  gridLastPage: "Ostatnia strona",
104
+ gridPageInfo: "Wyświetlanie wierszy od {first} do {last} z {count}",
105
+ gridPageInfoFiltered: "Wyświetlanie wierszy od {first} do {last} z {count} (odfiltrowano z {total})",
106
+ gridPageButton: "Strona {page}",
85
107
  gridClearQuery: "Wyczyść wyszukiwanie i filtry",
86
108
  gridRemoveSearch: "Wyczyść wyszukiwanie: {search}",
87
109
  gridGroupedFilters: "Grupy filtrów (warunki: {count})",
@@ -91,9 +113,30 @@ const labels = Object.freeze({
91
113
  gridFilteredResults: "Przefiltrowane wyniki",
92
114
  gridSelectedRows: "Zaznaczone wiersze",
93
115
  gridAllResults: "Wszystkie wyniki",
116
+ gridVisibleRows: "Widoczne wiersze",
117
+ gridAllRows: "Wszystkie wiersze",
94
118
  gridDownloadCsv: "Pobierz plik CSV",
95
119
  gridCopy: "Kopiuj",
96
120
  gridDetails: "Szczegóły rekordu",
121
+ gridCellRangeSelected: "Zaznaczono wiersze: {rows} × kolumny: {columns}",
122
+ gridCellRangesSelected: "Zaznaczone zakresy: {ranges}, komórki: {cells}",
123
+ gridCellRangeCleared: "Wyczyszczono zaznaczenie komórek",
124
+ gridCopyCells: "Kopiuj komórki",
125
+ gridCopyCellsWithHeaders: "Kopiuj komórki z nagłówkami",
126
+ gridPasteCells: "Wklej",
127
+ gridSelectAllCells: "Zaznacz wszystkie komórki",
128
+ gridCellsCopied: "Skopiowano wiersze: {rows} × kolumny: {columns}",
129
+ gridCellsPasted: "Wklejone komórki: {count}",
130
+ gridPasteRefused: "Niewklejone komórki: {count}",
131
+ gridPasteReadOnly: "Tej komórki nie można zmienić.",
132
+ gridPasteType: "„{value}” nie jest prawidłową wartością dla: {column}.",
133
+ gridPasteReport: "Raport wklejania",
134
+ gridPasteCell: "Wiersz {row}, {column}: {reason}",
135
+ gridFillHandle: "Przeciągnij, aby wypełnić komórki poniżej",
136
+ gridCellsFilled: "Wypełnione komórki: {count}",
137
+ gridCellMenu: "Akcje komórek",
138
+ gridClearCellRanges: "Wyczyść zaznaczenie komórek",
139
+ gridRowPicked: "Podniesiono {title}. Przejdź do kalendarza i naciśnij Enter, aby go upuścić.",
97
140
  gridColumn: "Kolumna",
98
141
  gridOperator: "Warunek",
99
142
  gridValue: "Wartość (daty w UTC)",
@@ -173,6 +216,28 @@ const labels = Object.freeze({
173
216
  gridGroupCollapse: "Zwiń grupę",
174
217
  gridSummary: "Podsumowanie wyników",
175
218
  gridGroupOrder: "Kolejność grup jest ustalona w raporcie",
219
+ gridAggregateCount: "liczba {value}",
220
+ gridAggregateSum: "suma {value}",
221
+ gridAggregateAverage: "śr. {value}",
222
+ gridAggregateMinimum: "min. {value}",
223
+ gridAggregateMaximum: "maks. {value}",
224
+ gridGroupBy: "Grupuj według tej kolumny",
225
+ gridUngroup: "Przestań grupować według tej kolumny",
226
+ gridGroupDrop: "Przeciągnij tutaj nagłówek kolumny, aby pogrupować wiersze",
227
+ gridExpandAll: "Rozwiń wszystko",
228
+ gridCollapseAll: "Zwiń wszystko",
229
+ gridExpandLevel: "Rozwiń poziom {level}",
230
+ gridCollapseLevel: "Zwiń poziom {level}",
231
+ gridGroupMove: "Alt+Strzałka w lewo i Alt+Strzałka w prawo przesuwają ten poziom",
232
+ gridGroupSortBy: "Sortuj grupy według",
233
+ gridGroupSortValue: "według wartości",
234
+ gridGroupSortAggregate: "według: {aggregate}",
235
+ gridSelectGroup: "Zaznacz rekordy grupy {group}",
236
+ gridAggregateDistinct: "unikalne {value}",
237
+ gridShowDetail: "Pokaż szczegóły",
238
+ gridHideDetail: "Ukryj szczegóły",
239
+ gridDetailOf: "Szczegóły: {record}",
240
+ gridDetailFailed: "Nie udało się wczytać szczegółów: {error}",
176
241
  gridExportProgress: "Rekordy: {completed} z {total}",
177
242
  gridExportReading: "Rekordy: {completed}",
178
243
  gridExportCancelled: "Eksport anulowany",
@@ -207,11 +272,250 @@ const labels = Object.freeze({
207
272
  showMoreUnknownTotal: "Pokaż więcej (wczytano {loaded})",
208
273
  pageLoaded: "Wczytano {loaded} z {total}",
209
274
  itemsLoaded: "Elementy: {count}",
275
+ recordBack: "Wstecz",
276
+ recordBackTo: "Wróć do: {record}",
277
+ recordTrail: "Ścieżka rekordów",
278
+ recordShowing: "Wyświetlono: {record}",
279
+ recordTabs: "Widoki rekordu",
280
+ recordSections: "Przejdź do sekcji",
281
+ recordOtherFields: "Pozostałe pola",
282
+ recordShowEmpty: "Pokaż puste pola ({count})",
283
+ recordHideEmpty: "Ukryj puste pola",
284
+ recordActions: "Akcje rekordu",
285
+ recordCopyValues: "Kopiuj wartości",
286
+ recordCopyJson: "Kopiuj jako JSON",
287
+ recordCopyLink: "Kopiuj link",
288
+ recordCopied: "Skopiowano do schowka",
289
+ recordPrint: "Drukuj rekord",
290
+ recordExportCsv: "Eksportuj CSV",
291
+ recordExportJson: "Eksportuj JSON",
292
+ recordOpenAll: "Otwórz wszystkie w tabeli",
293
+ recordLoadMore: "Wczytaj więcej",
294
+ recordCount: "{shown} z {total}",
295
+ recordItems: "Elementy: {count}",
296
+ recordMore: "+{count}",
297
+ recordShowAll: "Pokaż wszystkie ({count})",
298
+ recordRetry: "Ponów",
299
+ recordLoadFailed: "Nie udało się wczytać szczegółów rekordu: {error}",
300
+ recordUnavailable: "Rekord {id} nie jest tutaj dostępny.",
301
+ recordField: "Pole",
302
+ recordValue: "Wartość",
303
+ recordSection: "Sekcja",
304
+ recordBefore: "Przed",
305
+ recordAfter: "Po",
306
+ recordAdded: "Dodano",
307
+ recordRemoved: "Usunięto",
308
+ recordChanged: "Zmienione pola: {count}",
210
309
  yes: "Tak",
211
310
  no: "Nie",
212
311
  utcTime: "{time} UTC",
213
312
  localTime: "{time} czasu lokalnego",
214
313
  mountError: "Nie można wyświetlić widoku: {error}",
314
+ gridEditCell: "Edytuj: {column}",
315
+ gridEditSave: "Zapisz",
316
+ gridEditCancel: "Anuluj",
317
+ gridEditDiscard: "Odrzuć zmiany",
318
+ gridEditUndo: "Cofnij",
319
+ gridEditRedo: "Ponów",
320
+ gridEditEdited: "Zmieniono",
321
+ gridEditChanges: "Niezapisane zmiany: {count}",
322
+ gridEditErrors: "Błędy: {count}",
323
+ gridEditSaving: "Zapisywanie…",
324
+ gridEditSaved: "Zapisane wiersze: {count}",
325
+ gridEditFailed: "Niezapisane wiersze: {count}",
326
+ gridEditRequired: "{column}: pole wymagane.",
327
+ gridEditNumber: "{column}: wpisz liczbę.",
328
+ gridEditDate: "{column}: wpisz poprawną datę.",
329
+ gridEditMin: "{column}: wartość nie może być mniejsza niż {min}.",
330
+ gridEditMax: "{column}: wartość nie może być większa niż {max}.",
331
+ gridEditStep: "{column}: wartość musi być wielokrotnością {step}.",
332
+ gridEditMinLength: "{column}: minimalna liczba znaków to {min}.",
333
+ gridEditMaxLength: "{column}: maksymalna liczba znaków to {max}.",
334
+ gridEditPattern: "{column}: niepoprawny format.",
335
+ gridEditChoice: "{column}: wybierz wartość z listy.",
336
+ gridEditConflict: "Ktoś inny zmienił ten wiersz. Odśwież go i spróbuj ponownie.",
337
+ gridEditRejected: "Nie zapisano: {error}",
338
+ gridEditNotSaved: "Nie zapisano.",
339
+ gridEditNoMatches: "Brak dopasowań",
340
+ gridEditSearching: "Wyszukiwanie…",
341
+ gridEditUndone: "Cofnięto: {column}",
342
+ gridEditRedone: "Ponowiono: {column}",
343
+ gridEditNone: "(brak)",
344
+ gridLiveOrderChanged: "Kolejność się zmieniła",
345
+ gridLiveResort: "Sortuj ponownie",
346
+ gridLiveNewData: "Nowe dane",
347
+ gridLiveRefresh: "Odśwież",
348
+ gridLiveOrderHint: "Wiersze zostają na swoich miejscach, gdy dane się zmieniają. Posortuj ponownie, aby przenieść je na miejsca zgodne z sortowaniem.",
349
+ gridLiveChanged: "Zmienione wiersze: dodane {added}, zaktualizowane {updated}, usunięte {removed}",
350
+ gridLiveSorted: "Wiersze przeniesiono na miejsca zgodne z sortowaniem.",
351
+ gridLiveRecordRemoved: "Ten rekord został usunięty.",
352
+ gridFacetPanel: "Filtruj według",
353
+ gridFacetPanelHide: "Ukryj panel filtrów",
354
+ gridFacetPanelShow: "Pokaż panel filtrów",
355
+ gridFacetShowMore: "Pokaż więcej: {count}",
356
+ gridFacetShowFewer: "Pokaż mniej",
357
+ gridFacetEmptyValue: "(Puste)",
358
+ gridFacetFrom: "Od",
359
+ gridFacetTo: "Do",
360
+ gridFacetHistogram: "Rozkład: {column}",
361
+ gridFacetBin: "Od {from} do {to}, wiersze: {count}",
362
+ gridFacetNoChart: "Zbyt wiele wartości do wykresu",
363
+ gridFacetClear: "Wyczyść: {column}",
364
+ gridFacetCustom: "Tę kolumnę filtruje inny warunek.",
365
+ gridFacetResult: "Pasujące wiersze: {count}",
366
+ gridFacetSelected: "Zaznaczone: {count}",
367
+ gridFacetValueCount: "{value}, wiersze: {count}",
368
+ gridFacetCollapse: "Zwiń: {column}",
369
+ gridFacetExpand: "Rozwiń: {column}",
370
+ gridFacetInvalid: "Wpisz poprawną wartość.",
371
+ gridFacetReversed: "Wartość „Od” nie może być późniejsza niż „Do”.",
372
+ linkFilteredBy: "Filtr z {source}: {values}",
373
+ linkRemoveFilter: "Usuń filtr z {source}: {values}",
374
+ linkFiltered: "Filtr z {source}, wiersze: {count}",
375
+ linkHighlighted: "Wyróżnione wiersze z {source}: {count}",
376
+ linkHighlightedRows: "Wyróżnione wiersze: {count}",
377
+ linkCleared: "Usunięto powiązane filtry",
378
+ formatRules: "Formatowanie warunkowe",
379
+ formatLegend: "Legenda formatowania",
380
+ formatUpTo: "Do",
381
+ formatAbove: "Powyżej",
382
+ formatHiddenFlagged: "Sformatowane ukryte pola: {count} ({rules})",
383
+ formatRule: "Reguła {number}",
384
+ formatAddRule: "Dodaj regułę",
385
+ formatEditRule: "Edytuj: {rule}",
386
+ formatDeleteRule: "Usuń: {rule}",
387
+ formatMoveUp: "Przenieś wyżej: {rule}",
388
+ formatMoveDown: "Przenieś niżej: {rule}",
389
+ formatEnableRule: "Stosuj: {rule}",
390
+ formatNoRules: "Brak reguł formatowania.",
391
+ formatName: "Nazwa",
392
+ formatDescription: "Opis dla czytnika ekranu",
393
+ formatOnlyRowsWhere: "Tylko wiersze, w których",
394
+ formatEveryRow: "Każdy wiersz",
395
+ formatNone: "Żaden",
396
+ formatApplyTo: "Zastosuj do",
397
+ formatTargetCell: "Komórka",
398
+ formatTargetRow: "Cały wiersz",
399
+ formatTargetColumns: "Wybrane kolumny",
400
+ formatStyle: "Styl",
401
+ formatHighlight: "Wyróżnienie",
402
+ formatDataBar: "Pasek danych",
403
+ formatColorScale: "Skala kolorów",
404
+ formatBands: "Progi",
405
+ formatTone: "Ton",
406
+ formatEmphasis: "Wyróżnienie tonu",
407
+ formatFill: "Wypełnienie",
408
+ formatTextOnly: "Kolor tekstu",
409
+ formatStrong: "Pogrubione wypełnienie",
410
+ formatIcon: "Ikona",
411
+ formatNoIcon: "Bez ikony",
412
+ formatAutomatic: "Automatycznie",
413
+ formatBadge: "Plakietka",
414
+ formatCue: "Wskazówka tekstowa",
415
+ formatLowest: "Najniższa",
416
+ formatMidpoint: "Punkt środkowy",
417
+ formatHighest: "Najwyższa",
418
+ formatAddBand: "+ Próg",
419
+ formatRemoveBand: "Usuń próg",
420
+ formatSave: "Zapisz regułę",
421
+ formatCancel: "Anuluj",
422
+ formatShowLegend: "Pokaż legendę",
423
+ formatInvalid: "Uzupełnij regułę przed zapisaniem.",
424
+ formatMatchCase: "Uwzględnij wielkość liter",
425
+ formatToneDanger: "Zagrożenie",
426
+ formatToneWarning: "Ostrzeżenie",
427
+ formatToneSuccess: "Sukces",
428
+ formatToneInfo: "Informacja",
429
+ formatToneNeutral: "Neutralny",
430
+ formatToneMuted: "Wyciszony",
431
+ formatNotContains: "nie zawiera",
432
+ formatEndsWith: "kończy się na",
433
+ formatNotIn: "nie jest żadną z",
434
+ formatBetween: "między",
435
+ formatLike: "pasuje do wzorca z symbolami wieloznacznymi",
436
+ formatMatches: "pasuje do wyrażenia",
437
+ formatOlderThan: "starsze niż (dni)",
438
+ formatWithinLast: "w ciągu ostatnich (dni)",
439
+ formatNotLike: "nie pasuje do wzorca z symbolami wieloznacznymi",
440
+ formatNotMatches: "nie pasuje do wyrażenia",
441
+ formatBetweenExclusive: "między (bez granic)",
442
+ calendarToday: "Dzisiaj",
443
+ calendarPrevious: "Poprzedni okres",
444
+ calendarNext: "Następny okres",
445
+ calendarViews: "Widok kalendarza",
446
+ calendarMonth: "Miesiąc",
447
+ calendarWeek: "Tydzień",
448
+ calendarDay: "Dzień",
449
+ calendarDays: "{count} dni",
450
+ calendarAgenda: "Harmonogram",
451
+ calendarYear: "Rok",
452
+ calendarTimeline: "Oś czasu",
453
+ calendarGoTo: "Przejdź do daty",
454
+ calendarAllDay: "Cały dzień",
455
+ calendarMore: "+{count} więcej",
456
+ calendarMoreLabel: "Pokaż więcej wydarzeń z dnia {date}: {count}",
457
+ calendarDayEvents: "Wydarzenia z dnia {date}",
458
+ calendarNoEvents: "Brak wydarzeń w tym okresie",
459
+ calendarEvents: "[one]{count} wydarzenie[few]{count} wydarzenia[many]{count} wydarzeń[other]{count} wydarzenia",
460
+ calendarShowing: "{view}, {range}",
461
+ calendarRepeats: "Powtarza się",
462
+ calendarTruncated: "Pokazano pierwsze wydarzenia: {count}. Zawęź okres lub filtry, aby zobaczyć resztę.",
463
+ calendarLoading: "Wczytywanie wydarzeń…",
464
+ calendarLoadError: "Nie udało się wczytać wydarzeń: {error}",
465
+ calendarNow: "Teraz",
466
+ calendarZoom: "Skala",
467
+ calendarZoomHour: "Godziny",
468
+ calendarZoomDay: "Dni",
469
+ calendarZoomWeek: "Tygodnie",
470
+ calendarZoomMonth: "Miesiące",
471
+ calendarZoomQuarter: "Kwartały",
472
+ calendarResources: "Zasoby",
473
+ calendarCapacity: "Równoczesne wydarzenia",
474
+ calendarCapacityAt: "Jednocześnie: {count}",
475
+ calendarBusy: "Zajęte: {hours} h",
476
+ calendarOverlaps: "[one]{count} kolizja[few]{count} kolizje[many]{count} kolizji[other]{count} kolizji",
477
+ calendarUnavailable: "Niedostępne",
478
+ calendarOutsideHours: "Poza godzinami pracy",
479
+ calendarConflict: "Koliduje z: {title}",
480
+ calendarNotAllowed: "{resource} nie może przyjąć tego wydarzenia",
481
+ calendarMoved: "Przeniesiono {title} na {time}",
482
+ calendarResized: "Nowy koniec wydarzenia {title}: {time}",
483
+ calendarSeriesMoved: "Przeniesiono wszystkie wystąpienia: {title}",
484
+ calendarSeriesTime: "Tutaj można przesunąć tylko godzinę całej serii.",
485
+ calendarMoveHelp: "Strzałki przesuwają, Shift ze strzałkami zmienia koniec, Alt ze strzałką w górę lub w dół zmienia zasób, Enter zapisuje, Escape anuluje.",
486
+ calendarEdit: "Przenieś lub zmień długość: {title}",
487
+ calendarSaveFailed: "Nie zapisano {title}: {error}",
488
+ calendarExport: "iCalendar (.ics)",
489
+ calendarTimeRange: "{start} – {end}",
490
+ calendarSelected: "Zaznaczono: {range}",
491
+ calendarLane: "{resource}, {events}",
492
+ calendarHighlighted: "[one]Wyróżniono {count} wydarzenie[few]Wyróżniono {count} wydarzenia[many]Wyróżniono {count} wydarzeń[other]Wyróżniono {count} wydarzenia",
493
+ calendarMini: "Mały miesiąc",
494
+ calendarWeekList: "Lista tygodnia",
495
+ calendarDayList: "Lista dnia",
496
+ calendarMonths: "Miesiące",
497
+ calendarWeekNumber: "Tydzień {number}",
498
+ calendarWeekShort: "T{number}",
499
+ calendarNewEvent: "Nowe wydarzenie",
500
+ calendarEventTitle: "Tytuł",
501
+ calendarCreate: "Dodaj",
502
+ calendarCancel: "Anuluj",
503
+ calendarCreated: "Dodano {title} na {time}",
504
+ calendarReceived: "Zaplanowano {title} na {time}",
505
+ calendarOccurrenceTitle: "Zmień wydarzenie cykliczne",
506
+ calendarOccurrenceReadOnly: "Nie można zapisać tej części serii, ponieważ niektóre wartości są tylko do odczytu.",
507
+ calendarThisEvent: "To wydarzenie",
508
+ calendarThisAndFollowing: "To i następne wydarzenia",
509
+ calendarAllEvents: "Wszystkie wydarzenia",
510
+ calendarSources: "Kalendarze",
511
+ calendarImportFailed: "Nie udało się odczytać {source}: {error}",
512
+ calendarActions: "Akcje dla {title}",
513
+ calendarOpen: "Otwórz",
514
+ calendarMove: "Przenieś",
515
+ calendarNewHere: "Nowe wydarzenie tutaj",
516
+ calendarOutsideRange: "Poza datami, które pokazuje ten kalendarz",
517
+ calendarClose: "Zamknij",
518
+ calendarDetailsOf: "Szczegóły: {title}",
215
519
  });
216
520
  const staticLabels = Object.freeze({
217
521
  overflowNote: "Pokazano {shown} z {total} wierszy.",
@@ -0,0 +1,113 @@
1
+ // Plugins and parts: the extension points of every CanopyX runtime (docs/plugins.md).
2
+ import type { CanopyNode, CanopyView } from "./protocol.js";
3
+ import type { CellContext, ExportFormat } from "./hosts.js";
4
+ import type { TreeGrid } from "./index.js";
5
+ import type { RecordSectionRenderer, RecordAction } from "./records.js";
6
+ import type { DataGrid, GridCellContext, GridRow, GridView } from "./grid.js";
7
+
8
+ /** The kinds of view a plugin can apply to. */
9
+ export type CanopyViewKind = "tree" | "grid";
10
+
11
+ /** What a plugin's lifecycle hooks and event handlers receive, once per grid or tree. Frozen. */
12
+ export interface CanopyPluginContext {
13
+ /** The public API of the grid or tree, as createTreeGrid or createDataGrid return it. Narrow it with kind. */
14
+ readonly api: TreeGrid | DataGrid;
15
+ /** The host element. */
16
+ readonly element: HTMLElement;
17
+ /** The view document the grid or tree was created from. */
18
+ readonly view: CanopyView | GridView;
19
+ readonly kind: CanopyViewKind;
20
+ /** The texts the grid writes itself, translations included. */
21
+ readonly labels: Readonly<Record<string, string>>;
22
+ /** Aborts when the grid or tree is destroyed; put listeners, timers and requests on it. */
23
+ readonly signal: AbortSignal;
24
+ /** Loads a part of the runtime by name (for example "export") and resolves once it is installed. */
25
+ part(name: string): Promise<void>;
26
+ }
27
+
28
+ /**
29
+ * Draws a cell of a column whose renderer field names it. The same contract as a host renderer: return true when the
30
+ * renderer drew the cell (a tree), or draw into element (a flat grid); a host renderer for the column wins.
31
+ */
32
+ export type CanopyCellRenderer =
33
+ | ((node: CanopyNode, element: HTMLElement, context: CellContext) => boolean)
34
+ | ((row: GridRow, element: HTMLElement, context: GridCellContext) => boolean | void);
35
+
36
+ /** Typed cell editors that editable flat-grid columns choose by name (docs/editing.md). */
37
+ export type { CanopyCellEditor, CanopyEditorContext, CanopyEditorInstance } from "./editing.js";
38
+ /** A custom aggregate: the raw nonmissing values of a group (or the whole result) in, a finite number or null out. */
39
+ export interface CanopyAggregate {
40
+ compute(values: readonly (string | number | boolean)[], context: { readonly column: string; readonly aggregate: string }): number | null;
41
+ /** The cell text, a template with {value}, for example "med {value}". Default "<name> {value}". */
42
+ readonly label?: string;
43
+ }
44
+
45
+ /** Reserved for named column types: plugins can register them now, and later features read them. */
46
+ export interface CanopyColumnType { readonly [key: string]: unknown; }
47
+
48
+ /** What a plugin's toolbar item or menu entry runs with: the host action context (the selected nodes of a tree, or a grid's query) and the API. */
49
+ export interface CanopyPluginItemContext {
50
+ readonly signal: AbortSignal;
51
+ readonly api: TreeGrid | DataGrid;
52
+ /** Trees: the selected nodes. */
53
+ readonly nodes?: CanopyNode[];
54
+ /** Flat grids: the accepted query. */
55
+ readonly query?: unknown;
56
+ }
57
+
58
+ /** A toolbar button or a more-menu entry. A menu entry on the reporting runtime can render content instead of running. */
59
+ export type CanopyPluginItem =
60
+ | { label: string; run(context: CanopyPluginItemContext): unknown; render?: never }
61
+ | { label: string; render(container: HTMLElement, context: { close(): void; signal: AbortSignal }): void; run?: never };
62
+
63
+ /** A handler for a canopyx:<name> event on the host element; call preventDefault on cancelable events to keep the default. */
64
+ export type CanopyPluginEventHandler = (event: CustomEvent, context: CanopyPluginContext) => void;
65
+
66
+ /**
67
+ * A plugin: a named bundle of lifecycle hooks and extension points. Register it for the page with CanopyX.use, or for one
68
+ * grid with the plugins option. Every member except name is optional.
69
+ */
70
+ export interface CanopyPlugin {
71
+ /** 1 to 32 lowercase ASCII letters, digits and hyphens, starting with a letter; unique on the page. */
72
+ readonly name: string;
73
+ /** Plugins that start first, and parts of the runtime (for example "export") that load before init. */
74
+ readonly requires?: readonly string[];
75
+ /** The view kinds the plugin applies to; absent means both. */
76
+ readonly views?: readonly CanopyViewKind[];
77
+ /** Runs once per grid or tree, after its required parts loaded; the grid's ready waits for a returned promise. */
78
+ init?(context: CanopyPluginContext): void | PromiseLike<void>;
79
+ /** Runs when the grid or tree is destroyed. */
80
+ destroy?(context: CanopyPluginContext): void;
81
+ /** Cell renderers by name; a column chooses one with its renderer field. */
82
+ readonly cellRenderers?: Readonly<Record<string, CanopyCellRenderer>>;
83
+ /** Reserved: named column types. */
84
+ readonly columnTypes?: Readonly<Record<string, CanopyColumnType>>;
85
+ /** Typed cell editors by name; an editable flat-grid column chooses one with its editor type. */
86
+ readonly editors?: Readonly<Record<string, import("./editing.js").CanopyCellEditor>>;
87
+ /** Custom aggregates by operation name: compute(values, context) returns a finite number or null; label is a "{value}" template. */
88
+ readonly aggregates?: Readonly<Record<string, CanopyAggregate | CanopyAggregate["compute"]>>;
89
+ /** Detail renderers by name; a reporting definition chooses one with detail.renderer. */
90
+ readonly detailRenderers?: Readonly<Record<string, (row: Readonly<{ id: string; cells: Readonly<Record<string, unknown>> }>, element: HTMLElement, context: { readonly id: string; readonly signal: AbortSignal; readonly api: unknown; readonly labels: Readonly<Record<string, string>>; onDispose(cleanup: () => void): void }) => void | PromiseLike<void>>>;
91
+ /** Record panel section renderers by name (a chart, for example); a section chooses one with renderer. */
92
+ readonly drawerSections?: Readonly<Record<string, RecordSectionRenderer>>;
93
+ /** Actions of the record panel's actions menu, after the built-in ones and the host's. */
94
+ readonly recordActions?: readonly RecordAction[];
95
+ /** Buttons in the toolbar's left-hand group, after Columns and before Views. */
96
+ readonly toolbarItems?: readonly CanopyPluginItem[];
97
+ /** Entries of the more menu, after the host's actions. */
98
+ readonly menuItems?: readonly CanopyPluginItem[];
99
+ /** Export formats: registered for the page by CanopyX.use, offered by the one grid for the plugins option. */
100
+ readonly exportFormats?: readonly ExportFormat<any>[];
101
+ /** Handlers by event name without the canopyx: prefix (select, query, load, error, rowActivate, ...). */
102
+ readonly events?: Readonly<Record<string, CanopyPluginEventHandler>>;
103
+ }
104
+
105
+ /** The code of a part of the runtime, as its script registers it. */
106
+ export interface CanopyPartDefinition {
107
+ /** The build version; a runtime installs only the part of its own build. */
108
+ readonly version: string;
109
+ /** Parts that load, and install, before this one. */
110
+ readonly requires?: readonly string[];
111
+ /** Installs the part into the runtime context it is given. */
112
+ install(context: Readonly<Record<string, unknown>>): void;
113
+ }