@konce-pt/angular 0.7.8 → 0.7.10

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@konce-pt/angular",
3
- "version": "0.7.8",
3
+ "version": "0.7.10",
4
4
  "description": "Open-source Angular 22 component library on Signals & Signal Forms — 70+ components, rich data table, zoneless, fully tokenized. Selektory kpt-*, klasy Kpt*.",
5
5
  "license": "MIT",
6
6
  "author": "konce.pt",
@@ -7,11 +7,11 @@ Import: `import { KptContextMenu } from '@konce-pt/angular';`
7
7
  - `items`: KptMenuItem<T>[] — { label, icon?, danger?, disabled?, separator? }
8
8
  Honoruje też `header` (nieklikalny wiersz z `avatar`/`label`/`description`), `description`
9
9
  (druga linia) i `badge` + `badgeVariant` (odznaka po prawej) — pełny opis w menu/llms.txt.
10
- - `select`: KptMenuItem<T> — wybór pozycji
10
+ - `selected`: KptMenuItem<T> — wybór pozycji
11
11
  - Obszar reagujący na PPM przez projekcję `<ng-content>`.
12
12
 
13
13
  ## Przykład
14
- <kpt-context-menu [items]="items" (select)="onSelect($event)">
14
+ <kpt-context-menu [items]="items" (selected)="onSelect($event)">
15
15
  <div class="obszar">Kliknij prawym przyciskiem</div>
16
16
  </kpt-context-menu>
17
17
 
@@ -8,7 +8,7 @@ Import: `import { KptDataTable, KptColumn, KptCellDef, KptCellEditDef, KptRowDet
8
8
  `kpt-data-table`
9
9
 
10
10
  ## Model kolumny (KptColumn)
11
- `{ field: string; header: string; sortable?: boolean; align?: 'start'|'center'|'end'; width?: string; frozen?: boolean; filter?: KptColumnFilter; edit?: KptColumnEdit }`
11
+ `{ field: string; header: string; sortable?: boolean; align?: 'start'|'center'|'end'; width?: string; frozen?: boolean; filter?: KptColumnFilter; edit?: KptColumnEdit; summary?: KptColumnSummary }`
12
12
  Kolumny `frozen` (wiodące, sąsiadujące) przyklejają się przy poziomym przewijaniu — wymagają `width`.
13
13
 
14
14
  ### Filtr kolumny (KptColumnFilter)
@@ -29,6 +29,10 @@ Gdy kolumna ma `edit`, jej komórki są klikalne — klik (albo Enter na sfokuso
29
29
  wartość na kontrolkę: `text` → `kpt-input`, `number` → `kpt-input-number`, `date` → `kpt-datepicker`,
30
30
  `select` → `kpt-select`, `multiselect` → `kpt-select multiple filter`. Patrz sekcja „Edycja inline” niżej.
31
31
 
32
+ ### Podsumowanie kolumny (KptColumnSummary)
33
+ `{ fn: 'sum'|'avg'|'min'|'max'|'count' | ((rows) => unknown); format?: (value) => string }`
34
+ Kolumna z `summary` jest agregowana w wierszu podsumowania — patrz sekcja „Wiersz podsumowania” niżej.
35
+
32
36
  ## Wejścia
33
37
  - `columns`: KptColumn[] (wymagane)
34
38
  - `data`: T[] (domyślnie [])
@@ -50,6 +54,9 @@ wartość na kontrolkę: `text` → `kpt-input`, `number` → `kpt-input-number`
50
54
  - `rowHeight`: number — stała wysokość wiersza w px (domyślnie 41), potrzebna przy virtualScroll
51
55
  - `expandable`: boolean — kolumna z przełącznikiem rozwijającym wiersz (renderuje szablon `kptRowDetail`)
52
56
  - `multiExpand`: boolean (domyślnie true) — pozwala rozwinąć wiele wierszy naraz; false = tylko jeden
57
+ - `summaryLabel`: string — etykieta wiersza podsumowania; bez wartości używa i18n (`dataTable.total`)
58
+ - `summaryValues`: Record<string, unknown> | null — gotowe wartości podsumowania (pole → wartość);
59
+ nadpisują wyliczenia, przy `lazy` są jedynym źródłem
53
60
 
54
61
  ## Model / zdarzenia
55
62
  - `selection`: model<T[]> — dwukierunkowe `[(selection)]`
@@ -136,6 +143,45 @@ Gdy 5 wbudowanych typów nie wystarcza, dyrektywa `kptCellEdit` daje pełny, wł
136
143
  </ng-template>
137
144
  </kpt-data-table>
138
145
 
146
+ ## Wiersz podsumowania (column.summary)
147
+ Kolumny z `summary` renderują `<tfoot>` — ostatni wiersz tabeli, **nad paginatorem**, przyklejony
148
+ do dołu obszaru przewijania (`position: sticky; bottom: 0`, jak sticky header).
149
+
150
+ - **Etykieta** (`summaryLabel`, domyślnie i18n `dataTable.total` → „Total”/„Razem”) renderuje się
151
+ w jednej komórce scalonej (`colspan`) od początku wiersza do pierwszej liczonej kolumny,
152
+ wyrównana do prawej. Colspan obejmuje też kolumny systemowe (rozwijanie, zaznaczanie).
153
+ Przykład: `summary` na 3. kolumnie → scalone kolumny 1–2. Gdy liczona jest **pierwsza** widoczna
154
+ kolumna (i nie ma kolumn systemowych), etykieta nie ma się gdzie zmieścić i nie renderuje się.
155
+ - **Zakres**: agregacja obejmuje **wszystkie wiersze po filtrach** — całą stronę 1 i każdą następną,
156
+ nie tylko widoczną. Filtr globalny i filtry kolumn zawężają zbiór (zgodnie z licznikiem paginatora),
157
+ sortowanie i strona nie zmieniają wyniku.
158
+ - **Na żywo przy edycji inline**: `data` jest zwykłym inputem, więc gdy konsument po `cellEdit`
159
+ podmieni tablicę w sygnale, podsumowanie przelicza się samo (zwykły `computed`).
160
+ - **Agregacje**: `sum`, `avg`, `min`, `max`, `count`. `count` liczy wiersze; pozostałe pomijają
161
+ wartości nieliczbowe (string z liczbą jest parsowany). Pusty zbiór: `sum` = 0, reszta — pusta
162
+ komórka. `sum`/`avg` przycinają ogony zmiennoprzecinkowe (bez tego `0.1+0.2` = `0.30000000000000004`).
163
+ Własna funkcja `fn: (rows) => unknown` dostaje ten sam zbiór (np. suma ważona).
164
+ - **Formatowanie**: `format: (value) => string` (np. `Intl.NumberFormat`); bez niego wartość leci
165
+ surowa. Komórki podsumowania są domyślnie do prawej — jawne `align` kolumny ma priorytet.
166
+ Etykieta wiersza („Razem”) jest jedna na cały wiersz, więc kolumnę liczoną inaczej niż sumą
167
+ (`avg`, `min`, `max`) nazwij w `format` (np. `ø 662,57 zł`) — inaczej czyta się jak suma.
168
+ - **Ukryte kolumny** (`hiddenFields`) wypadają też z podsumowania; kolejność po `reorderable`
169
+ jest respektowana (etykieta scala się do aktualnie pierwszej liczonej kolumny).
170
+ - **Tryb `lazy`**: tabela ma tylko bieżącą stronę, więc nie liczy nic sama — podaj `summaryValues`
171
+ (pole → gotowa wartość z serwera). `summaryValues` działa też poza `lazy`, nadpisując wyliczenia.
172
+ Kolumna wymieniona wyłącznie w `summaryValues` (bez `summary`) też pokazuje wartość.
173
+ - Wiersz nie renderuje się przy `loading` ani gdy tabela jest pusta (nie dublujemy komunikatu stanu).
174
+ - Eksport CSV **nie zawiera** wiersza podsumowania — `exportCsv()` eksportuje same dane.
175
+
176
+ cols = [
177
+ { field: 'product', header: 'Produkt' },
178
+ { field: 'qty', header: 'Ilość', align: 'end', summary: { fn: 'sum' } },
179
+ { field: 'net', header: 'Netto', align: 'end', summary: { fn: 'sum', format: pln } },
180
+ ];
181
+
182
+ <kpt-data-table [columns]="cols" [data]="rows()" [pageSize]="5" rowKey="id"
183
+ summaryLabel="Razem" (cellEdit)="onCellEdit($event)" />
184
+
139
185
  ## Zachowanie
140
186
  - Sortowanie: klik w nagłówek sortowalnej kolumny cyklicznie asc → desc → brak.
141
187
  - Filtr: dopasowanie tekstu we wszystkich polach kolumn; reset strony do 0.
@@ -164,6 +210,7 @@ patrz `hiddenFields` wyżej i przykład `pg-column-toggle` w playground.
164
210
  ## Tokeny
165
211
  `--kpt-table-{bg,fg,border,radius,header-bg,header-fg,row-hover,row-selected,cell-padding}`.
166
212
  Rozwijany wiersz: `--kpt-table-detail-bg` (fallback: surface-variant → row-hover).
213
+ Wiersz podsumowania: `--kpt-table-summary-bg` (fallback: header-bg).
167
214
  Paginacja: komponent `kpt-paginator`.
168
215
 
169
216
  ## Do zrobienia (roadmap)
@@ -174,3 +221,6 @@ i przykład `pg-column-toggle` w playground).
174
221
 
175
222
  Edycja komórek inline: gotowe (`column.edit` + `cellEdit` + `kptCellEdit`; zapis do API —
176
223
  patrz przykład w playground, `pg-fake-users-api.ts`).
224
+
225
+ Wiersz podsumowania: gotowe (`column.summary` + `summaryLabel` + `summaryValues` — patrz sekcja
226
+ „Wiersz podsumowania” i przykład „Inline editing + summary row” w playground).
@@ -8,7 +8,7 @@ Import: `import { KptMegamenu } from '@konce-pt/angular';`
8
8
 
9
9
  ## Wejścia / wyjścia
10
10
  - `items`: KptMenuItem<T>[] (3 poziomy: top → kolumny → linki)
11
- - `select`: KptMenuItem<T> (kliknięty odnośnik)
11
+ - `selected`: KptMenuItem<T> (kliknięty odnośnik)
12
12
 
13
13
  ## Przykład
14
14
  items = [{
@@ -6,7 +6,7 @@ Import: `import { KptMenu, KptMenuItem } from '@konce-pt/angular';`
6
6
 
7
7
  ## Wejścia / wyjścia
8
8
  - `items`: KptMenuItem[]
9
- - `select`: output<KptMenuItem> — emitowany tylko dla zwykłych pozycji (nie dla nagłówków)
9
+ - `selected`: output<KptMenuItem> — emitowany tylko dla zwykłych pozycji (nie dla nagłówków)
10
10
 
11
11
  ## KptMenuItem
12
12
  - `label?`, `value?`, `icon?`, `disabled?`, `danger?`, `separator?`
@@ -23,7 +23,7 @@ Import: `import { KptMenu, KptMenuItem } from '@konce-pt/angular';`
23
23
  Pola `header`, `description`, `badge` i `avatar` honorują też `kpt-context-menu` i `kpt-split-button`.
24
24
 
25
25
  ## Przykład
26
- <kpt-menu [items]="items" (select)="onSelect($event)">
26
+ <kpt-menu [items]="items" (selected)="onSelect($event)">
27
27
  <kpt-avatar name="Anna Kowalska" />
28
28
  </kpt-menu>
29
29
 
@@ -7,10 +7,10 @@ Import: `import { KptMenubar } from '@konce-pt/angular';`
7
7
 
8
8
  ## Wejścia / wyjścia
9
9
  - `items`: KptMenuItem<T>[] — pozycje górne; pod-menu w `items?` każdej pozycji
10
- - `select`: KptMenuItem<T>
10
+ - `selected`: KptMenuItem<T>
11
11
 
12
12
  ## Przykład
13
- <kpt-menubar [items]="items" (select)="onSelect($event)" />
13
+ <kpt-menubar [items]="items" (selected)="onSelect($event)" />
14
14
 
15
15
  items: KptMenuItem[] = [
16
16
  { label: 'Plik', items: [{ label: 'Nowy' }, { separator: true }, { label: 'Zamknij', danger: true }] },
@@ -7,10 +7,10 @@ Import: `import { KptSpeedDial } from '@konce-pt/angular';`
7
7
  - `items`: KptMenuItem<T>[] — akcje (label, icon)
8
8
  - `direction`: 'up' | 'down' | 'left' | 'right' (KptSpeedDialDirection)
9
9
  - `icon`: string (domyślnie 'plus', obraca się o 45° po otwarciu); `ariaLabel`: string
10
- - `select`: KptMenuItem<T>
10
+ - `selected`: KptMenuItem<T>
11
11
 
12
12
  ## Przykład
13
- <kpt-speed-dial [items]="actions" direction="up" (select)="onAction($event)" />
13
+ <kpt-speed-dial [items]="actions" direction="up" (selected)="onAction($event)" />
14
14
 
15
15
  ## Tokeny
16
16
  FAB główny z `kpt-fab`; akcje `--kpt-color-surface-raised`, `--kpt-elevation-2`.
@@ -13,10 +13,10 @@ Wymaga `import '@angular/cdk/overlay-prebuilt.css';`
13
13
 
14
14
  ## Wyjścia
15
15
  - `primaryClick`: void — klik przycisku głównego
16
- - `select`: KptMenuItem<T> — wybór pozycji z menu
16
+ - `selected`: KptMenuItem<T> — wybór pozycji z menu
17
17
 
18
18
  ## Przykład
19
- <kpt-split-button [items]="items" (primaryClick)="save()" (select)="onItem($event)">Zapisz</kpt-split-button>
19
+ <kpt-split-button [items]="items" (primaryClick)="save()" (selected)="onItem($event)">Zapisz</kpt-split-button>
20
20
 
21
21
  items: KptMenuItem[] = [
22
22
  { label: 'Zapisz jako szkic', value: 'draft' },
@@ -255,6 +255,8 @@ interface KptMessages {
255
255
  max: string;
256
256
  /** Interpolacja: {column}. Aria-label edytowalnej komórki. */
257
257
  editCell: string;
258
+ /** Domyślna etykieta wiersza podsumowania (input `summaryLabel` ma priorytet). */
259
+ total: string;
258
260
  };
259
261
  confirm: {
260
262
  header: string;
@@ -524,20 +526,20 @@ interface KptMenuItem<T = unknown> {
524
526
  * Wymaga stylów overlay CDK: `import '@angular/cdk/overlay-prebuilt.css';`
525
527
  *
526
528
  * @example
527
- * <kpt-menu [items]="items" (select)="onSelect($event)">
529
+ * <kpt-menu [items]="items" (selected)="onSelect($event)">
528
530
  * <kpt-button variant="outline">Opcje</kpt-button>
529
531
  * </kpt-menu>
530
532
  */
531
533
  declare class KptMenu<T = unknown> {
532
534
  readonly items: _angular_core.InputSignal<KptMenuItem<T>[]>;
533
- readonly select: _angular_core.OutputEmitterRef<KptMenuItem<T>>;
535
+ readonly selected: _angular_core.OutputEmitterRef<KptMenuItem<T>>;
534
536
  protected readonly open: _angular_core.WritableSignal<boolean>;
535
537
  protected readonly positions: ConnectedPosition[];
536
538
  protected toggle(): void;
537
539
  protected close(): void;
538
540
  protected pick(item: KptMenuItem<T>): void;
539
541
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptMenu<any>, never>;
540
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptMenu<any>, "kpt-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, { "select": "select"; }, never, ["*"], true, never>;
542
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptMenu<any>, "kpt-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, { "selected": "selected"; }, never, ["*"], true, never>;
541
543
  }
542
544
 
543
545
  /**
@@ -545,20 +547,20 @@ declare class KptMenu<T = unknown> {
545
547
  * Wymaga `import '@angular/cdk/overlay-prebuilt.css';`
546
548
  *
547
549
  * @example
548
- * <kpt-split-button [items]="items" (primaryClick)="save()" (select)="onItem($event)">Zapisz</kpt-split-button>
550
+ * <kpt-split-button [items]="items" (primaryClick)="save()" (selected)="onItem($event)">Zapisz</kpt-split-button>
549
551
  */
550
552
  declare class KptSplitButton<T = unknown> {
551
553
  readonly variant: _angular_core.InputSignal<KptButtonVariant>;
552
554
  readonly items: _angular_core.InputSignal<KptMenuItem<T>[]>;
553
555
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
554
556
  readonly primaryClick: _angular_core.OutputEmitterRef<void>;
555
- readonly select: _angular_core.OutputEmitterRef<KptMenuItem<T>>;
557
+ readonly selected: _angular_core.OutputEmitterRef<KptMenuItem<T>>;
556
558
  protected readonly i18n: KptI18n;
557
559
  protected readonly open: _angular_core.WritableSignal<boolean>;
558
560
  protected readonly positions: ConnectedPosition[];
559
561
  protected pick(item: KptMenuItem<T>): void;
560
562
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptSplitButton<any>, never>;
561
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptSplitButton<any>, "kpt-split-button", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "primaryClick": "primaryClick"; "select": "select"; }, never, ["*"], true, never>;
563
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptSplitButton<any>, "kpt-split-button", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "primaryClick": "primaryClick"; "selected": "selected"; }, never, ["*"], true, never>;
562
564
  }
563
565
 
564
566
  /**
@@ -1153,7 +1155,17 @@ declare class KptDatepicker implements FormValueControl<string> {
1153
1155
  private formatTime;
1154
1156
  /** Etykieta czasu na pasku trybu datetime (uwzględnia AM/PM). */
1155
1157
  protected readonly timeBarLabel: _angular_core.Signal<string>;
1158
+ /**
1159
+ * Tekst w triggerze. Każdy tryb ma własny format wartości, więc `display` tylko rozdziela
1160
+ * robotę — formatowanie siedzi w metodach `display*` niżej. Wartość niepasująca do formatu
1161
+ * trybu daje pusty string (trigger nie pokazuje śmieci, np. po ręcznej podmianie modelu).
1162
+ */
1156
1163
  protected readonly display: _angular_core.Signal<string>;
1164
+ private displayMonthYear;
1165
+ private displayMonth;
1166
+ private displayTime;
1167
+ private displayDateTime;
1168
+ private displayDate;
1157
1169
  private readonly selectedDateIso;
1158
1170
  protected readonly weeks: _angular_core.Signal<DayCell$1[][]>;
1159
1171
  /** Rok/miesiąc bieżącej wartości — zaznaczenie w siatkach wyższych poziomów. */
@@ -1224,7 +1236,11 @@ declare class KptClock {
1224
1236
  protected readonly hourLabel: _angular_core.Signal<string>;
1225
1237
  protected readonly minuteLabel: _angular_core.Signal<string>;
1226
1238
  private from12h;
1239
+ /** W 12h jeden pierścień; w 24h zewnętrzny (12, 1–11) i wewnętrzny (00, 13–23). */
1227
1240
  protected readonly hourMarks: _angular_core.Signal<ClockMark[]>;
1241
+ private marks12h;
1242
+ private marks24hOuter;
1243
+ private marks24hInner;
1228
1244
  protected readonly minuteMarks: _angular_core.Signal<ClockMark[]>;
1229
1245
  protected readonly handAngle: _angular_core.Signal<number>;
1230
1246
  protected readonly handInner: _angular_core.Signal<boolean>;
@@ -1233,6 +1249,10 @@ declare class KptClock {
1233
1249
  protected pickHour(mark: ClockMark): void;
1234
1250
  protected pickMinute(mark: ClockMark): void;
1235
1251
  protected onDialPointer(event: PointerEvent, face: HTMLElement): void;
1252
+ /** Godzina z kąta; w 24h o pierścieniu (a więc o 12–23 vs 0–11) decyduje promień kliknięcia. */
1253
+ private setHourFromAngle;
1254
+ /** Minuta z kąta, dociągnięta do `minuteStep`. */
1255
+ private setMinuteFromAngle;
1236
1256
  protected onDialUp(): void;
1237
1257
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptClock, never>;
1238
1258
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptClock, "kpt-clock", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "hourFormat": { "alias": "hourFormat"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
@@ -2353,6 +2373,19 @@ interface KptColumnFilter {
2353
2373
  /** Krok dla `type: 'slider'` (domyślnie 1). */
2354
2374
  step?: number;
2355
2375
  }
2376
+
2377
+ /** Wbudowana agregacja kolumny w wierszu podsumowania. */
2378
+ type KptSummaryFn = 'sum' | 'avg' | 'min' | 'max' | 'count';
2379
+ interface KptColumnSummary {
2380
+ /**
2381
+ * Agregacja wbudowana albo własna funkcja liczona na całym zbiorze wierszy
2382
+ * (po filtrach, ze wszystkich stron).
2383
+ */
2384
+ fn: KptSummaryFn | ((rows: readonly Record<string, unknown>[]) => unknown);
2385
+ /** Formatowanie wyniku (np. waluta). Bez niego wartość renderowana jest surowo. */
2386
+ format?: (value: unknown) => string;
2387
+ }
2388
+
2356
2389
  /** Rodzaj kontrolki edycji inline komórki. */
2357
2390
  type KptColumnEditType = 'text' | 'number' | 'date' | 'select' | 'multiselect';
2358
2391
  interface KptColumnEdit {
@@ -2382,6 +2415,8 @@ interface KptColumn {
2382
2415
  filter?: KptColumnFilter;
2383
2416
  /** Włącza edycję inline (klik w komórkę zamienia wartość na kontrolkę tego typu). */
2384
2417
  edit?: KptColumnEdit;
2418
+ /** Włącza agregację tej kolumny w wierszu podsumowania (`<tfoot>`, nad paginatorem). */
2419
+ summary?: KptColumnSummary;
2385
2420
  }
2386
2421
  /** Zdarzenie po zatwierdzeniu edycji komórki. */
2387
2422
  interface KptCellEditEvent<T> {
@@ -2452,6 +2487,13 @@ declare class KptDataTable<T = Record<string, unknown>> {
2452
2487
  readonly expandable: _angular_core.InputSignalWithTransform<boolean, unknown>;
2453
2488
  /** Zezwala na rozwinięcie wielu wierszy naraz (domyślnie tak). */
2454
2489
  readonly multiExpand: _angular_core.InputSignalWithTransform<boolean, unknown>;
2490
+ /** Etykieta wiersza podsumowania; bez wartości używa i18n (`dataTable.total`). */
2491
+ readonly summaryLabel: _angular_core.InputSignal<string | undefined>;
2492
+ /**
2493
+ * Gotowe wartości podsumowania (pole → wartość). Nadpisują wyliczenia po stronie klienta,
2494
+ * a w trybie `lazy` są ich jedynym źródłem (tabela ma wtedy tylko bieżącą stronę).
2495
+ */
2496
+ readonly summaryValues: _angular_core.InputSignal<Record<string, unknown> | null>;
2455
2497
  readonly selection: _angular_core.ModelSignal<T[]>;
2456
2498
  /** Rozwinięte wiersze (dwukierunkowo). */
2457
2499
  readonly expandedRows: _angular_core.ModelSignal<T[]>;
@@ -2560,14 +2602,39 @@ declare class KptDataTable<T = Record<string, unknown>> {
2560
2602
  protected setRangeFilter(field: string, bound: 'min' | 'max', event: Event): void;
2561
2603
  /** Bieżąca para `[lo, hi]` filtra suwakowego dla kolumny (domyślnie pełen zakres). */
2562
2604
  protected sliderVal(col: KptColumn): [number, number];
2563
- private static toIso;
2605
+ /** Semantyka dopasowania siedzi w `./column-filter` — tu zostaje tylko spięcie ze stanem. */
2564
2606
  private matchesColumnFilters;
2565
2607
  private readonly filtered;
2566
2608
  private readonly sorted;
2567
2609
  protected readonly filteredCount: _angular_core.Signal<number>;
2568
2610
  protected readonly paged: _angular_core.Signal<readonly T[]>;
2611
+ /** Wiodące kolumny systemowe (rozwijanie + zaznaczanie) — poza `visibleOrderedColumns()`. */
2612
+ private readonly leadingCells;
2569
2613
  protected readonly colspan: _angular_core.Signal<number>;
2570
2614
  protected readonly displayCount: _angular_core.Signal<number>;
2615
+ /** Etykieta wiersza podsumowania (input albo domyślna z i18n). */
2616
+ protected readonly summaryLabelText: _angular_core.Signal<string>;
2617
+ /**
2618
+ * Zbiór do agregacji: wszystkie wiersze po filtrach (a więc ze wszystkich stron — `paged()`
2619
+ * tnie dopiero po tym kroku). Przy `lazy` tabela ma tylko bieżącą stronę, więc nie liczy nic
2620
+ * sama — jedynym źródłem jest wtedy `summaryValues`.
2621
+ */
2622
+ private readonly summarySource;
2623
+ /** Pola z podsumowaniem: kolumny z `summary` (tylko widoczne) + klucze podane w `summaryValues`. */
2624
+ private readonly summaryFields;
2625
+ protected readonly hasSummary: _angular_core.Signal<boolean>;
2626
+ /** Indeks pierwszej podsumowywanej kolumny — do niej scala się etykieta. */
2627
+ protected readonly summaryStartIndex: _angular_core.Signal<number>;
2628
+ /**
2629
+ * Colspan komórki z etykietą: kolumny systemowe + kolumny przed pierwszą podsumowywaną.
2630
+ * Zero (pierwsza widoczna kolumna jest liczona) = etykieta nie ma się gdzie zmieścić i nie
2631
+ * renderuje się wcale.
2632
+ */
2633
+ protected readonly summaryLabelSpan: _angular_core.Signal<number>;
2634
+ /** Gotowe teksty komórek podsumowania (pole → tekst); pusty string dla braku wartości. */
2635
+ private readonly summaryTexts;
2636
+ private formatSummary;
2637
+ protected summaryText(field: string): string;
2571
2638
  private parseWidthPx;
2572
2639
  /** Mapa pole → przesunięcie left (px) dla wiodących zamrożonych kolumn. */
2573
2640
  /** Suma szerokości wiodących kolumn systemowych (rozwijanie + zaznaczanie) w px. */
@@ -2594,7 +2661,7 @@ declare class KptDataTable<T = Record<string, unknown>> {
2594
2661
  protected getValue(row: T, field: string): unknown;
2595
2662
  protected trackRow: (row: T) => unknown;
2596
2663
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptDataTable<any>, never>;
2597
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptDataTable<any>, "kpt-data-table", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "filterable": { "alias": "filterable"; "required": false; "isSignal": true; }; "filterRowPosition": { "alias": "filterRowPosition"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "rowKey": { "alias": "rowKey"; "required": false; "isSignal": true; }; "scrollHeight": { "alias": "scrollHeight"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "rowHeight": { "alias": "rowHeight"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; "exportable": { "alias": "exportable"; "required": false; "isSignal": true; }; "exportFilename": { "alias": "exportFilename"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "totalRecords": { "alias": "totalRecords"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "multiExpand": { "alias": "multiExpand"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "expandedRows": { "alias": "expandedRows"; "required": false; "isSignal": true; }; "hiddenFields": { "alias": "hiddenFields"; "required": false; "isSignal": true; }; }, { "selection": "selectionChange"; "expandedRows": "expandedRowsChange"; "hiddenFields": "hiddenFieldsChange"; "rowClick": "rowClick"; "lazyLoad": "lazyLoad"; "cellEdit": "cellEdit"; }, ["cellDefs", "cellEditDefs", "rowDetailDef"], ["[kptPaginatorActions]"], true, never>;
2664
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptDataTable<any>, "kpt-data-table", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "filterable": { "alias": "filterable"; "required": false; "isSignal": true; }; "filterRowPosition": { "alias": "filterRowPosition"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "rowKey": { "alias": "rowKey"; "required": false; "isSignal": true; }; "scrollHeight": { "alias": "scrollHeight"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "rowHeight": { "alias": "rowHeight"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; "exportable": { "alias": "exportable"; "required": false; "isSignal": true; }; "exportFilename": { "alias": "exportFilename"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "totalRecords": { "alias": "totalRecords"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "multiExpand": { "alias": "multiExpand"; "required": false; "isSignal": true; }; "summaryLabel": { "alias": "summaryLabel"; "required": false; "isSignal": true; }; "summaryValues": { "alias": "summaryValues"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "expandedRows": { "alias": "expandedRows"; "required": false; "isSignal": true; }; "hiddenFields": { "alias": "hiddenFields"; "required": false; "isSignal": true; }; }, { "selection": "selectionChange"; "expandedRows": "expandedRowsChange"; "hiddenFields": "hiddenFieldsChange"; "rowClick": "rowClick"; "lazyLoad": "lazyLoad"; "cellEdit": "cellEdit"; }, ["cellDefs", "cellEditDefs", "rowDetailDef"], ["[kptPaginatorActions]"], true, never>;
2598
2665
  }
2599
2666
 
2600
2667
  /**
@@ -3032,13 +3099,13 @@ declare class KptDrawer {
3032
3099
  * Menu kontekstowe (PPM) na obszarze projekcji. Panel pozycjonowany do kursora.
3033
3100
  *
3034
3101
  * @example
3035
- * <kpt-context-menu [items]="items" (select)="onSelect($event)">
3102
+ * <kpt-context-menu [items]="items" (selected)="onSelect($event)">
3036
3103
  * <div class="obszar">Kliknij prawym przyciskiem</div>
3037
3104
  * </kpt-context-menu>
3038
3105
  */
3039
3106
  declare class KptContextMenu<T = unknown> {
3040
3107
  readonly items: _angular_core.InputSignal<KptMenuItem<T>[]>;
3041
- readonly select: _angular_core.OutputEmitterRef<KptMenuItem<T>>;
3108
+ readonly selected: _angular_core.OutputEmitterRef<KptMenuItem<T>>;
3042
3109
  protected readonly open: _angular_core.WritableSignal<boolean>;
3043
3110
  protected readonly x: _angular_core.WritableSignal<number>;
3044
3111
  protected readonly y: _angular_core.WritableSignal<number>;
@@ -3046,7 +3113,7 @@ declare class KptContextMenu<T = unknown> {
3046
3113
  protected close(): void;
3047
3114
  protected pick(item: KptMenuItem<T>): void;
3048
3115
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptContextMenu<any>, never>;
3049
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptContextMenu<any>, "kpt-context-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, { "select": "select"; }, never, ["*"], true, never>;
3116
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptContextMenu<any>, "kpt-context-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, { "selected": "selected"; }, never, ["*"], true, never>;
3050
3117
  }
3051
3118
 
3052
3119
  /**
@@ -3056,18 +3123,18 @@ declare class KptContextMenu<T = unknown> {
3056
3123
  * `import '@angular/cdk/overlay-prebuilt.css';`
3057
3124
  *
3058
3125
  * @example
3059
- * <kpt-menubar [items]="items" (select)="onSelect($event)" />
3126
+ * <kpt-menubar [items]="items" (selected)="onSelect($event)" />
3060
3127
  */
3061
3128
  declare class KptMenubar<T = unknown> {
3062
3129
  readonly items: _angular_core.InputSignal<KptMenuItem<T>[]>;
3063
- readonly select: _angular_core.OutputEmitterRef<KptMenuItem<T>>;
3130
+ readonly selected: _angular_core.OutputEmitterRef<KptMenuItem<T>>;
3064
3131
  protected readonly openIndex: _angular_core.WritableSignal<number | null>;
3065
3132
  protected readonly positions: ConnectedPosition[];
3066
3133
  protected toggle(i: number, item: KptMenuItem<T>): void;
3067
3134
  protected pick(item: KptMenuItem<T>): void;
3068
3135
  protected closeAll(): void;
3069
3136
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptMenubar<any>, never>;
3070
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptMenubar<any>, "kpt-menubar", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, { "select": "select"; }, never, never, true, never>;
3137
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptMenubar<any>, "kpt-menubar", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, { "selected": "selected"; }, never, never, true, never>;
3071
3138
  }
3072
3139
 
3073
3140
  /**
@@ -3078,11 +3145,11 @@ declare class KptMenubar<T = unknown> {
3078
3145
  * `import '@angular/cdk/overlay-prebuilt.css';`
3079
3146
  *
3080
3147
  * @example
3081
- * <kpt-megamenu [items]="items" (select)="onSelect($event)" />
3148
+ * <kpt-megamenu [items]="items" (selected)="onSelect($event)" />
3082
3149
  */
3083
3150
  declare class KptMegamenu<T = unknown> {
3084
3151
  readonly items: _angular_core.InputSignal<KptMenuItem<T>[]>;
3085
- readonly select: _angular_core.OutputEmitterRef<KptMenuItem<T>>;
3152
+ readonly selected: _angular_core.OutputEmitterRef<KptMenuItem<T>>;
3086
3153
  protected readonly openIndex: _angular_core.WritableSignal<number | null>;
3087
3154
  protected readonly positions: ConnectedPosition[];
3088
3155
  protected activeColumns(): KptMenuItem<T>[];
@@ -3090,7 +3157,7 @@ declare class KptMegamenu<T = unknown> {
3090
3157
  protected pick(link: KptMenuItem<T>): void;
3091
3158
  protected closeAll(): void;
3092
3159
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptMegamenu<any>, never>;
3093
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptMegamenu<any>, "kpt-megamenu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, { "select": "select"; }, never, never, true, never>;
3160
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptMegamenu<any>, "kpt-megamenu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, { "selected": "selected"; }, never, never, true, never>;
3094
3161
  }
3095
3162
 
3096
3163
  interface KptConfirmOptions {
@@ -3162,7 +3229,7 @@ type KptSpeedDialDirection = 'up' | 'down' | 'left' | 'right';
3162
3229
  * Speed dial — FAB rozwijający zestaw akcji. Buduje na `kpt-fab`.
3163
3230
  *
3164
3231
  * @example
3165
- * <kpt-speed-dial [items]="actions" direction="up" (select)="onAction($event)" />
3232
+ * <kpt-speed-dial [items]="actions" direction="up" (selected)="onAction($event)" />
3166
3233
  */
3167
3234
  declare class KptSpeedDial<T = unknown> {
3168
3235
  readonly items: _angular_core.InputSignal<KptMenuItem<T>[]>;
@@ -3170,7 +3237,7 @@ declare class KptSpeedDial<T = unknown> {
3170
3237
  readonly icon: _angular_core.InputSignal<string>;
3171
3238
  /** Etykieta a11y FAB (stan zamknięty); bez wartości używa i18n (`speedDial.actions`). */
3172
3239
  readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
3173
- readonly select: _angular_core.OutputEmitterRef<KptMenuItem<T>>;
3240
+ readonly selected: _angular_core.OutputEmitterRef<KptMenuItem<T>>;
3174
3241
  protected readonly i18n: KptI18n;
3175
3242
  protected readonly effectiveAriaLabel: _angular_core.Signal<string>;
3176
3243
  protected readonly open: _angular_core.WritableSignal<boolean>;
@@ -3178,9 +3245,9 @@ declare class KptSpeedDial<T = unknown> {
3178
3245
  protected close(): void;
3179
3246
  protected pick(item: KptMenuItem<T>): void;
3180
3247
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptSpeedDial<any>, never>;
3181
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptSpeedDial<any>, "kpt-speed-dial", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "select": "select"; }, never, never, true, never>;
3248
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptSpeedDial<any>, "kpt-speed-dial", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "selected": "selected"; }, never, never, true, never>;
3182
3249
  }
3183
3250
 
3184
3251
  export { KPT_BREAKPOINTS, KPT_FORM_FIELD_CONTROL, KPT_I18N_CONFIG, KPT_MESSAGES_EN, KPT_MESSAGES_PL, KptAccordion, KptAccordionPanel, KptAlert, KptAppShell, KptAutocomplete, KptAvatar, KptAvatarGroup, KptBadge, KptBottomSheet, KptBreadcrumb, KptBreakpointObserver, KptButton, KptButtonGroup, KptCard, KptCarousel, KptCellDef, KptCellEditDef, KptCheckbox, KptChip, KptChipsInput, KptClock, KptColorPicker, KptConfirmContainer, KptConfirmService, KptContextMenu, KptDataTable, KptDataView, KptDateRange, KptDatepicker, KptDialog, KptDivider, KptDrawer, KptEmpty, KptFab, KptFieldset, KptFileUpload, KptFormField, KptGalleria, KptI18n, KptIcon, KptIconButton, KptIconRegistry, KptImage, KptInput, KptInputMask, KptInputNumber, KptInputOtp, KptKnob, KptListbox, KptMegamenu, KptMenu, KptMenubar, KptMeterGroup, KptOrderList, KptPaginator, KptPanel, KptPassword, KptPickList, KptPopover, KptProgress, KptRadioGroup, KptRating, KptRichText, KptRowDetailDef, KptScrollTop, KptSelect, KptShellNavToggle, KptSidenav, KptSkeleton, KptSlider, KptSpeedDial, KptSpinner, KptSplitButton, KptSplitter, KptStep, KptStepper, KptSwitch, KptSwitchGroup, KptTab, KptTabs, KptTextarea, KptTimeline, KptToastContainer, KptToastService, KptToolbar, KptTooltip, KptTree, provideKptI18n, renderKptIconSvg };
3185
- export type { DeepPartial, KptAlertVariant, KptAvatarItem, KptAvatarShape, KptAvatarSize, KptBadgeSize, KptBadgeVariant, KptBreadcrumbItem, KptBreakpoint, KptButtonSize, KptButtonVariant, KptCardVariant, KptCellEditEvent, KptChipVariant, KptColumn, KptColumnEdit, KptColumnEditType, KptConfirmOptions, KptConfirmRequest, KptDateRangeValue, KptDatepickerMode, KptDatepickerView, KptDividerOrientation, KptDrawerPosition, KptFormFieldControl, KptGalleriaItem, KptI18nConfig, KptIconName, KptInputType, KptLocale, KptMenuItem, KptMessages, KptMeterItem, KptOption, KptProgressVariant, KptRichTool, KptRichToolbar, KptSidenavMode, KptSkeletonVariant, KptSliderValue, KptSpeedDialDirection, KptSplitterOrientation, KptTableLazyState, KptTimelineItem, KptToast, KptToastOptions, KptTooltipPosition, KptTreeNode };
3252
+ export type { DeepPartial, KptAlertVariant, KptAvatarItem, KptAvatarShape, KptAvatarSize, KptBadgeSize, KptBadgeVariant, KptBreadcrumbItem, KptBreakpoint, KptButtonSize, KptButtonVariant, KptCardVariant, KptCellEditEvent, KptChipVariant, KptColumn, KptColumnEdit, KptColumnEditType, KptColumnFilter, KptColumnFilterType, KptColumnSummary, KptConfirmOptions, KptConfirmRequest, KptDateRangeValue, KptDatepickerMode, KptDatepickerView, KptDividerOrientation, KptDrawerPosition, KptFormFieldControl, KptGalleriaItem, KptI18nConfig, KptIconName, KptInputType, KptLocale, KptMenuItem, KptMessages, KptMeterItem, KptOption, KptProgressVariant, KptRichTool, KptRichToolbar, KptSidenavMode, KptSkeletonVariant, KptSliderValue, KptSpeedDialDirection, KptSplitterOrientation, KptSummaryFn, KptTableLazyState, KptTimelineItem, KptToast, KptToastOptions, KptTooltipPosition, KptTreeNode };
3186
3253
  //# sourceMappingURL=konce-pt-angular.d.ts.map