@konce-pt/angular 0.7.6 → 0.7.8

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/CHANGELOG.md CHANGED
@@ -1,5 +1,125 @@
1
1
  # @konce-pt/angular
2
2
 
3
+ ## 0.7.8
4
+
5
+ ### Minor Changes
6
+
7
+ - 40a5d04: kpt-date-range: kilka miesięcy obok siebie (`visibleMonths`) i ciągłe pasmo zakresu
8
+
9
+ Nowy input `visibleMonths` (domyślnie 1, przycinany do 1–3) pokazuje sąsiednie miesiące obok
10
+ siebie. Strzałki ‹ › stoją na skrajnych panelach i przesuwają całość o jeden miesiąc. Przy więcej
11
+ niż jednym panelu dni sąsiednich miesięcy są ukrywane do pustych slotów — inaczej ta sama data
12
+ byłaby klikalna w dwóch panelach naraz, a pasmo zakresu malowałoby się w obu miejscach.
13
+
14
+ Zakres podświetla teraz ciągłe pasmo biegnące przez wszystkie panele: dni skrajne mają plamę
15
+ zaznaczenia, a pasmo wychodzi z ich środka i zaokrągla się na krańcach wiersza siatki. Wcześniej
16
+ pasmo urywało się na dniach skrajnych, bo zasłaniało je pełne tło komórki.
17
+
18
+ - a843fd6: kpt-datepicker: nawigacja drill-down po panelu — dekady → lata → miesiące → dni
19
+
20
+ Panel kalendarza jest teraz stosem widoków: klik w komórkę schodzi poziom niżej, klik w tytuł
21
+ nagłówka wchodzi poziom wyżej. Nowy input `startView` ('day' | 'month' | 'year' | 'decade' | null)
22
+ ustawia poziom startowy — `startView="decade"` daje wybór daty urodzenia w czterech kliknięciach.
23
+ Domyślne `null` zachowuje dotychczasowe zachowanie każdego `selectionMode`.
24
+
25
+ Zmiana zachowania: strona siatki lat to pełna dekada (10 lat, „1970 – 1979”) zamiast dotychczasowego
26
+ bloku 12-letniego — dotyczy też istniejącego `selectionMode="year"`. Strona dekad obejmuje 12 dekad
27
+ („1920 – 2039”). Strzałki ‹ › są wyłączane, gdy cała sąsiednia strona wypada poza `minDate`/`maxDate`.
28
+
29
+ Typy `KptDatepickerMode` i `KptDatepickerView` są eksportowane z `@konce-pt/angular`.
30
+
31
+ ## 0.7.7
32
+
33
+ ### Minor Changes
34
+
35
+ - 47ada55: `kpt-data-table` — edycja inline komórek, a przy okazji publiczny stan panelu w `kpt-select`
36
+ i `kpt-datepicker`.
37
+
38
+ - `KptColumn.edit` (`{ type, options?, placeholder?, min?, max?, step? }`) włącza edycję kolumny.
39
+ Klik w komórkę (albo Enter — komórka edytowalna ma `tabindex="0"`) zamienia wartość na kontrolkę:
40
+ `text` → `kpt-input`, `number` → `kpt-input-number`, `date` → `kpt-datepicker`, `select`
41
+ i `multiselect` → `kpt-select` (drugi z `multiple filter`). Dla edytorów na overlayu panel otwiera
42
+ się od razu, więc wybór to jedno kliknięcie.
43
+ - `cellEdit` (`output<KptCellEditEvent<T>>`) emituje `{ row, field, value, updatedRow }` po
44
+ zatwierdzeniu i tylko wtedy, gdy wartość faktycznie się zmieniła (tablice porównywane po
45
+ zawartości, więc powrót do tego samego zestawu nic nie wysyła). `updatedRow` to gotowe body
46
+ żądania — tabela sama nic nie zapisuje, jak przy `lazyLoad`.
47
+ - `kptCellEdit` — dyrektywa szablonu własnego edytora, gdy wbudowane typy nie wystarczają.
48
+ Kontekst: `$implicit` = wartość, `row`, `commit(value)`, `cancel()`.
49
+ - `open` w `kpt-select` i `kpt-datepicker` jest teraz publicznym `model(false)` — dwukierunkowe
50
+ `[(open)]` i `(openChange)`, spójnie z `kpt-dialog`/`kpt-drawer`. Bez tego nie da się z zewnątrz
51
+ odróżnić „user skończył wybierać" od „pole straciło fokus": `touch` leci również z blur triggera,
52
+ czyli już przy naciśnięciu myszy na opcji w panelu (panel żyje w kontenerze CDK Overlay przy
53
+ `<body>`). Inicjalizacja panelu przy otwarciu przeniosła się z `toggleOpen()` do efektu na `open`,
54
+ żeby otwarcie z zewnątrz ustawiało widok kalendarza i resetowało filtr tak samo jak klik w trigger.
55
+
56
+ `exportCsv()` i eksport nie zmieniają zachowania. Kolumny bez `edit` (i tabele bez `cellEdit`)
57
+ działają dokładnie jak dotąd.
58
+
59
+ - `kpt-data-table` — ukrywanie kolumn przez `hiddenFields` i slot `kptPaginatorActions`.
60
+
61
+ - `hiddenFields` (`model<readonly string[]>`, dwukierunkowe) trzyma pola ukrytych kolumn.
62
+ Komponent celowo nie dostarcza UI do zarządzania widocznością — to minimalny hak do podpięcia
63
+ własnego przełącznika. Renderowanie (nagłówek, wiersz filtrów, wiersze, `colspan`, sticky-offsety
64
+ kolumn zamrożonych) i `exportCsv()` respektują ukryte kolumny; ukrycie nie wyłącza kolumny
65
+ z globalnego wyszukiwania ani z filtrów per-kolumna, a kolejność zapamiętana przez `reorderable`
66
+ przeżywa ukrycie i pokazanie z powrotem.
67
+ - Wiersz paginatora dostał slot projekcji `[kptPaginatorActions]` po lewej stronie `kpt-paginator`
68
+ (który ma teraz `flex: 1 1 auto`, więc bez projekcji wygląda dokładnie jak dotąd) — miejsce na
69
+ kompaktowy przycisk obok paginatora.
70
+ - Ikona `adjustments-horizontal` doszła do wbudowanego rejestru, więc przycisk dostosowywania
71
+ kolumn nie wymaga `provideKptTablerIcons()`.
72
+
73
+ Przy okazji naprawione przestawianie kolumn: `reorderable` operowało na indeksie z pętli `@for`,
74
+ co po odfiltrowaniu kolumn ukrytych przestawiałoby niewłaściwą kolumnę. Teraz identyfikuje kolumny
75
+ po `field`.
76
+
77
+ Gotowe UI dostosowywania kolumn (przycisk, dialog z checkboxami, zapis w `localStorage`) żyje jako
78
+ przykład w playgroundzie — nie wchodzi do biblioteki.
79
+
80
+ ### Patch Changes
81
+
82
+ - Uzupełniona dokumentacja kontrolek `avatar`, `avatar-group`, `input-number`, `knob` i `slider`
83
+ (`llms.txt`) oraz poprawiony przykład w JSDoc `kpt-knob`.
84
+
85
+ Poprzedni przykład pokazywał `[formField]` razem z `[min]`/`[max]`, co jest błędem kompilacji:
86
+ pod `[formField]` zakres bierze się ze schematu (`min(path.level, 0)`, `max(path.level, 100)`),
87
+ a dyrektywa sama wstrzykuje go w wejścia. Jawne `[min]`/`[max]` należą do wariantu z `[(value)]`.
88
+ Sama implementacja bez zmian.
89
+
90
+ - Domknięcie dwóch bliźniaczych luk, których pierwszy audyt nie objął — znalezionych przy
91
+ ponownej weryfikacji już naprawionych funkcji.
92
+
93
+ - `renderMarkerHtml()` w mapie escapuje teraz również `shape`. Poprzednia poprawka objęła
94
+ `color` i `contrast`, ale `shape` — trzecie pole trafiające do sklejanego HTML — wciąż szło
95
+ surowo do atrybutu `class`, więc wartość z CMS-a czy API bez walidacji runtime mogła wyrwać się
96
+ z atrybutu tym samym mechanizmem. Trzy legalne wartości (`pin`, `dot`, `square`) nie zawierają
97
+ znaków specjalnych HTML, więc wygląd jest bez zmian.
98
+ - Tooltip wykresu wiązał kolor kropki przez `[style.background]` — shorthand akceptujący `url()` —
99
+ zasilany niewalidowanym `KptChartSeries.color`. Zamiana na `background-color`, czyli ten sam fix,
100
+ który wcześniej dostały `color-picker`, `meter-group`, `roadmap` i legenda mapy.
101
+
102
+ - Poprawki bezpieczeństwa z audytu: dwa krytyczne XSS, niebezpieczne publiczne API rejestru ikon
103
+ oraz CSV formula injection.
104
+
105
+ - `kpt-rich-text` zapisywał `value` wprost do `innerHTML` bez sanitizera wszędzie poza ścieżką
106
+ wklejania. Efekt synchronizujący sanityzuje teraz **każdy** zewnętrzny zapis wartości.
107
+ - `marker-html.ts` (mapa) wstawiał kolor kategorii surowo do atrybutu `style` — `colorVarOf`
108
+ i `foregroundVarOf` mają whitelistę `var(--kpt-*)`, co zamyka naraz wyrwanie się z atrybutu
109
+ i wstrzyknięcie CSS średnikiem.
110
+ - `KptIconRegistry.register()` przyjmował dowolny SVG jako string. Teraz sanityzuje do allowlisty
111
+ geometrii (`path`, `circle`, `rect`, `g`, `line`, `polygon`, `polyline`, `ellipse`) — bez zmian
112
+ dla zestawu wbudowanego i pełnego Tablera (5130 ikon), bo oba używają wyłącznie `<path>`.
113
+ - Eksport CSV z `kpt-data-table` poprzedza apostrofem komórki zaczynające się od `=`, `+`, `-`, `@`
114
+ (formula injection), a filtr `javascript:` w narzędziu linku, `normalizeUrl` w mapie i tła CSS
115
+ przyjmujące `url()` przeszły z blocklist na allowlisty schematów.
116
+
117
+ `escapeCsvCell`, `normalizeUrl` i nowy `sanitizeUrl` wydzieliły się do osobnych plików pure-TS,
118
+ żeby dało się je testować przez `node --test`.
119
+
120
+ Dla danych zgodnych z kontraktem zachowanie jest bez zmian. Dwa świadome wyjątki: URL bez schematu
121
+ dostaje prefiks `https://`, a komórki CSV zaczynające się od znaku formuły — wiodący apostrof.
122
+
3
123
  ## 0.7.6
4
124
 
5
125
  ### Minor Changes
@@ -612,7 +612,7 @@ function KptChartTooltip_Conditional_0_For_3_Template(rf, ctx) { if (rf & 1) {
612
612
  } if (rf & 2) {
613
613
  const row_r2 = ctx.$implicit;
614
614
  i0.ɵɵadvance();
615
- i0.ɵɵstyleProp("background", row_r2.color);
615
+ i0.ɵɵstyleProp("background-color", row_r2.color);
616
616
  i0.ɵɵadvance(2);
617
617
  i0.ɵɵtextInterpolate(row_r2.name);
618
618
  i0.ɵɵadvance(2);
@@ -673,7 +673,7 @@ class KptChartTooltip {
673
673
  }
674
674
  @for (row of t.rows; track $index) {
675
675
  <div class="kpt-chart__tooltip-row">
676
- <span class="kpt-chart__tooltip-dot" [style.background]="row.color"></span>
676
+ <span class="kpt-chart__tooltip-dot" [style.background-color]="row.color"></span>
677
677
  <span class="kpt-chart__tooltip-name">{{ row.name }}</span>
678
678
  <span class="kpt-chart__tooltip-val">{{ row.value }}</span>
679
679
  </div>