-
Notifications
You must be signed in to change notification settings - Fork 5
Added Table-Stateful & Table-Stateless #250
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
deleonio
merged 21 commits into
main
from
242-kachel-fr-die-tabelle-in-der-dokumentation
Nov 23, 2024
Merged
Changes from 19 commits
Commits
Show all changes
21 commits
Select commit
Hold shift + click to select a range
acf6334
added pages for stateful and stateless table
AlexanderSchmidtCE 777ab03
added table-category in component
AlexanderSchmidtCE a918606
added table index.mdx for en
AlexanderSchmidtCE 2b77a34
Merge branch 'main' into 242-kachel-fr-die-tabelle-in-der-dokumentation
AlexanderSchmidtCE d7c8dc0
Updated Tables
AlexanderSchmidtCE cf2a3bf
updated to alpha
AlexanderSchmidtCE c354f37
moved readmes to documentation in tables
AlexanderSchmidtCE 6d78719
removed en version of tables
AlexanderSchmidtCE 5d7f7af
added deprecated table to documentation
AlexanderSchmidtCE d06202c
minor text fixes
AlexanderSchmidtCE 120ba9a
minor text fixes
AlexanderSchmidtCE 0825e91
fixed links
AlexanderSchmidtCE 60c2ed9
Merge branch 'main' of https://github.com/public-ui/public-ui.github.…
deleonio 9697f2e
dev merge
AlexanderSchmidtCE 6312c7f
removed table subfolder
AlexanderSchmidtCE 7a676ea
Merge branch 'main' into 242-kachel-fr-die-tabelle-in-der-dokumentation
AlexanderSchmidtCE 1553225
removed intern component readmes
AlexanderSchmidtCE b7fcacf
updated dependencies
AlexanderSchmidtCE d58e7b4
fixed wrong link
AlexanderSchmidtCE ba270eb
review fixes
AlexanderSchmidtCE bb3c62d
Update table.mdx
deleonio File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,208 @@ | ||
--- | ||
title: TableStateful | ||
description: Beschreibung, Spezifikation und Beispiele für die TableStateful-Komponente. | ||
tags: | ||
- Table | ||
- Beschreibung | ||
- Spezifikation | ||
- Beispiele | ||
--- | ||
|
||
import Readme from '../../readmes/table-stateful/readme.md'; | ||
import { LiveEditorCompact } from '@site/src/components/LiveEditorCompact'; | ||
import { ExampleLink } from '@site/src/components/ExampleLink'; | ||
|
||
Synonyme: Data Table, Details List, Data Grid | ||
|
||
<kol-alert _type="warning" _variant="card"> | ||
deleonio marked this conversation as resolved.
Show resolved
Hide resolved
|
||
<kol-badge _color="#476af5" _label="Preview"></kol-badge> Diese neue Komponente wird als ungetestet markiert, da die Barrierefreiheitstests noch ausstehen. Die verschiedenen Tests können aufgrund der Modularität bei neuen Komponenten und Funktionalitäten meist erst nach einem Release erfolgen. Wir empfehlen daher, die Komponente noch nicht in Produktion zu verwenden. | ||
</kol-alert> | ||
|
||
Die **TableStateful**-Komponente dient primär der übersichtlichen Darstellung von Datenmengen. Dabei ist sie so ausgelegt, dass sie alle von den Daten abhängige Werte automatisch ermittelt und die Tabelle entsprechend darstellt. Hierzu gehören beispielsweise die optionalen Funktionalitäten Spaltensortierung oder Pagination. | ||
|
||
<kol-indented-text _summary="Backend-seitige Pagination"> | ||
Bei sehr großen Datenmengen ist auch eine manuelle Nutzung der TableStateless-Komponente möglich. Das bedeutet, dass die Tabelle seitenweise "manuell" befüllt wird. Hierzu kann einfach anstatt der Table-Pagination eine "eigene" Pagination unter der Tabelle mittels der Pagination-Komponente verwendet werden. Eine mögliche Sortierung muss ebenfalls über die `onSort`-Events selber implementiert werden. Siehe [KolTableStateless](./table-stateless). | ||
</kol-indented-text> | ||
|
||
## Konstruktion | ||
|
||
Die Table-Komponente ist so konstruiert, dass nicht der gesamte Tabellenaufbau im Markup selbst beschrieben werden muss. Wie genau die Tabelle Markup-spezifisch aufgebaut werden muss, um barrierefrei zu sein, übernimmt die Komponente selbst. | ||
|
||
Dadurch, dass die Table-Komponente das valide und barrierefreie Markup dynamisch zusammenbaut, kann die komplexe Auszeichnung für die assistive Systeme dem/der Entwickler:in abgenommen werden. | ||
|
||
### Funktionalitäten | ||
|
||
Die Table-Komponente unterstützt folgende Funktionalitäten: | ||
|
||
- Tabellenbeschreibung durch ein **`label`**-Attribut. | ||
- Mehrzeilige Spaltenüberschriften in horizontaler oder vertikaler Richtung. | ||
- Sortierfunktion für entweder horizontale und vertikale Ausrichtung. | ||
- Unterschiedliche Render-Funktion für die Zellen. | ||
- Pagination für die Tabelle. | ||
|
||
Die Table-Komponente unterstützt folgende Funktionalitäten **nicht**: | ||
|
||
- Das Filtern der Tabelle ist aktuell nicht innerhalb der Tabelle vorgesehen. | ||
- Das Auswählen von Zeilen ist aktuell in der Tabelle nicht vorgesehen. | ||
|
||
> Beides könnte jedoch mittels der Render-Funktion umgesetzt werden. | ||
|
||
### Pagination | ||
|
||
Über das Attribut **`_pagination`** kann optional eine Vielzahl zusätzlicher Properties zur Steuerung der Pagination übergeben werden. Die genaue Beschreibung der Optionen ist auf der Seite <kol-link _href="../pagination" _label="/docs/components/pagination" _label="Pagination"></kol-link> zu finden. | ||
|
||
#### KoliBriTableHeaders | ||
|
||
```ts | ||
{ | ||
horizontal: [ | ||
[ | ||
{ | ||
label: string, | ||
key?: string, | ||
colsSpan?: number, | ||
rowSpan?: number, | ||
useTdInsteadOfTh?: boolean, | ||
render?: (data) => string, | ||
sort?: (data) => data, | ||
}, | ||
… | ||
], | ||
… | ||
], | ||
vertical: [ | ||
[ | ||
{ | ||
label: string, | ||
key?: string, | ||
colsSpan?: number, | ||
rowSpan?: number, | ||
useTdInsteadOfTh?: boolean, | ||
render?: (data) => string, | ||
sort?: (data) => data, | ||
}, | ||
… | ||
], | ||
… | ||
], | ||
}; | ||
``` | ||
|
||
### Code | ||
|
||
```html | ||
<kol-table-stateful | ||
_label="Tabellenbeschreibung" | ||
_headers='{"horizontal": [[{"label":"Montag","key":"montag"}]]}' | ||
_pagination='[{"page":2}]' | ||
></kol-table-stateful> | ||
``` | ||
|
||
### Beispiel | ||
|
||
<kol-table-stateful _label="Nur Vertikal Header, Daten Vertikal, Pagination" _headers='{"horizontal":[[{"label":"Montag","key":"montag"}]]}' _data='[{"montag":"Zelle1"},{"montag":"Zelle2"}]' _pagination='{"page":2}'></kol-table-stateful> | ||
|
||
### Footer | ||
|
||
Durch die Verwendung des **`_dataFoot_`**-Attribut können zusammenfassende Informationen oder zusätzliche Details am Ende der Tabelle angezeigt werden. Die Informationen sind hierbei an die Spaltendefinitionen gebunden. | ||
|
||
### Beispiel | ||
|
||
<kol-table-stateful _label="Nur Vertikal Header, Daten Vertikal, Pagination, DataFoot" _headers='{"horizontal":[[{"label":"Montag","key":"montag"}]]}' _data='[{"montag":"Zelle1"},{"montag":"Zelle2"}]' _dataFoot='[{"montag":"Ruhetag"}]' _pagination='{"page":2}'></kol-table-stateful> | ||
|
||
## Verwendung | ||
|
||
### Sortierung | ||
|
||
- Zu jedem Header kann man eine Sortierfunktion definieren. | ||
- Es ist exakt eine oder keine Sortierfunktion aktiviert. | ||
- **Multi-Sort-Funktionalität**: Wenn die Multi-Sort-Option (`_allowMultiSort`) aktiviert ist, kann der Benutzer mehrere Spalten gleichzeitig sortieren. Standardmäßig ist diese Funktion deaktiviert, und nur eine Spalte kann auf einmal sortiert werden. Die Sortierung wechselt zwischen aufsteigend, absteigend und ohne Sortierung. Wenn Multi-Sort deaktiviert ist, wird die Sortierung der vorherigen Spalte aufgehoben, sobald eine neue Spalte sortiert wird. | ||
- Aktuell wird nicht unterstützt, dass bei zweidimensionalen Headern, die Header der jeweils anderen Header-Seite mit sortiert werden. Bei der Anforderung der Sortierung empfehlen wir die Verwendung nur einer Header-Dimension (entweder horizontal oder vertikal). | ||
|
||
### Render Funktion | ||
|
||
Render-Funktionen werden als Teil der Tabellen-Header definiert. Siehe Abschnitt "KoliBriTableHeaders". Gibt es sowohl horizontale als auch vertikale Header, muss die Render-Funktion für die _horizontalen_ Header definiert werden. Gibt es nur vertikale Header, können die Render-Funktionen dort definiert werden. | ||
|
||
Die `render` Funktion kann auf verschiedene Arten wie folgt verwendet werden. | ||
Alle Methoden sind auch in diesem Beispiel demonstriert: [render-cell.tsx](https://github.com/public-ui/kolibri/blob/23ebb42d1ce3c8d1e4c74a5c7972842d5e4203fe/packages/samples/react/src/components/table/render-cell.tsx#L34) | ||
|
||
1. String Rückgabewert: | ||
|
||
```tsx | ||
{ | ||
render: (_el, cell) => `Index: ${cell.label}`, | ||
} | ||
``` | ||
|
||
2. Node mit textContent füllen | ||
|
||
```tsx | ||
{ | ||
render: (el, cell) => { | ||
el.textContent = `Index: ${cell.label}`; | ||
}, | ||
} | ||
``` | ||
|
||
3. Node mit innerHTML füllen - ⚠️ Hierbei unbedingt darauf achten, Werte zu sanitizen, um XXS vermeiden. | ||
|
||
```tsx | ||
{ | ||
render: (el, cell) => { | ||
el.innerHTML = `<strong>${cell.label}</strong>`; | ||
}, | ||
} | ||
``` | ||
|
||
4. React render-function verwenden | ||
|
||
```tsx | ||
import { createReactRenderElement } from '@public-ui/react'; | ||
{ | ||
render: (el) => { | ||
getRoot(createReactRenderElement(el)).render( | ||
<div> | ||
<KolInputText _label="Input" /> | ||
<KolButton _label="Save" /> | ||
</div>, | ||
); | ||
}, | ||
} | ||
``` | ||
|
||
<!--### Best practices | ||
|
||
### Anwendungsfälle--> | ||
|
||
## Barrierefreiheit | ||
|
||
Bei der Table-Komponente werden zahlreiche Attribut-Definitionen dem Tabellen-Markup hinzugefügt, um die Screenreader bestmöglich zu unterstützen. | ||
|
||
Aktuell werden folgende Attribute von der Komponente verwaltet: `role`, `scope` und `aria-\*`. | ||
|
||
Das heißt beispielsweise, dass bei den Spaltenüberschriften automatisch entweder die Rolle `colheader` oder `rowheader` gesetzt wird. Darüber hinaus wird der Scope entweder auf `col`/`colgroup` oder `row`/`rowgroup` gesetzt. Ähnlich dieser Automatismen werden auch die `aria-\*`-Attribute je nach Relevanz gesetzt. | ||
|
||
Warum die Tabelle einen **Tabindex** hat, wird auf der folgenden Webseite beschrieben: <kol-link _href="" _label=""></kol-link>https://dequeuniversity.com/rules/axe/3.5/scrollable-region-focusable | ||
|
||
## Links und Referenzen | ||
|
||
- <kol-link _href="https://www.w3.org/WAI/tutorials/tables/" _target="_blank"></kol-link> | ||
- <kol-link _href="https://www.barrierefreies-webdesign.de/knowhow/datentabellen/scope.html" _target="_blank"></kol-link> | ||
- <kol-link _href="https://developer.mozilla.org/de/docs/Web/Accessibility/ARIA/ARIA_Live_Regions" _target="_blank"></kol-link> | ||
- <kol-link _href="https://tollwerk.de/projekte/tipps-techniken-inklusiv-barrierefrei/aria-live-regionen" _target="_blank"></kol-link> | ||
- <kol-link _href="https://www.barrierefreies-webdesign.de/knowhow/live-regions/attribute.html" _target="_blank"></kol-link> | ||
- <kol-link _href="https://www.digitala11y.com/aria-sort-properties/" _target="_blank"></kol-link> | ||
- <kol-link _href="https://dequeuniversity.com/library/aria/table-sortable" _target="_blank"></kol-link> | ||
- <kol-link _href="https://www.maxability.co.in/2016/06/07/aria-sort-property/" _target="_blank"></kol-link> | ||
- <kol-link _href="https://developer.mozilla.org/en-US/docs/Web/API/Element/ariaSort" _target="_blank"></kol-link> | ||
- <kol-link _href="https://tollwerk.de/projekte/tipps-techniken-inklusiv-barrierefrei/aria-live-regionen" _target="_blank"></kol-link> | ||
- <kol-link _href="https://stackoverflow.com/questions/1312236/" _target="_blank"></kol-link> | ||
- <kol-link _href="https://dequeuniversity.com/rules/axe/3.5/scrollable-region-focusable" _target="_blank"></kol-link> | ||
|
||
<Readme /> | ||
|
||
<ExampleLink component="table-stateful" /> | ||
|
||
## Live-Editor | ||
|
||
<LiveEditorCompact component="table-stateful" /> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
--- | ||
title: TableStateless | ||
description: Beschreibung, Spezifikation und Beispiele für die TableStateless-Komponente. | ||
tags: | ||
- Table | ||
- Beschreibung | ||
- Spezifikation | ||
- Beispiele | ||
--- | ||
|
||
import Readme from '../../readmes/table-stateless/readme.md'; | ||
import { LiveEditorCompact } from '@site/src/components/LiveEditorCompact'; | ||
import { ExampleLink } from '@site/src/components/ExampleLink'; | ||
|
||
Synonyme: Data Table, Details List, Data Grid | ||
|
||
<kol-alert _type="warning" _variant="card"> | ||
deleonio marked this conversation as resolved.
Show resolved
Hide resolved
|
||
<kol-badge _color="#476af5" _label="Preview"></kol-badge> Diese neue Komponente wird als ungetestet markiert, da die Barrierefreiheitstests noch ausstehen. Die verschiedenen Tests können aufgrund der Modularität bei neuen Komponenten und Funktionalitäten meist erst nach einem Release erfolgen. Wir empfehlen daher, die Komponente noch nicht in Produktion zu verwenden. | ||
</kol-alert> | ||
|
||
Die **TableStateless**-Komponente ist für die reine Darstellung der KoliBri-Tabelle verantwortlich. Für eine Tabellen-Komponente, die Sortierung und Paginierung mit den zur Verfügung gestellten Daten automatisch übernehmen kann, siehe [KolTableStateful](./table-stateful). | ||
|
||
TableStateless bietet sich insbesondere bei größeren Datenmengen an, wenn es nicht praktikabel ist, die komplette Datenmenge zur Filterung und Sortierung in den Browser auszuliefern. | ||
|
||
## Selektion | ||
|
||
Über die `_selection`-Property kann der "Selection-Modus" der Komponente aktiviert und gesteuert werden. Ist `_selection` definiert, erhält jede Zeile eine Checkbox, über die sich die Zeile aus- oder abwählen lässt. | ||
|
||
```ts | ||
const data = [ | ||
{ id: '1001', name: 'Marianne Musterfrau' }, | ||
{ id: '1002', name: 'Max Mustermann' }, | ||
]; | ||
const selection: KoliBriTableSelection = { | ||
/* label: Funktion, welche für jede Zeile ausgerufen wird, und ein Label für die Checkbox zurückgibt. */ | ||
label: (row: KoliBriTableDataType) => `Selection for ${row.name}`, | ||
|
||
/* selectedKeys: Array von Strings, das die Key-Properties der gewählten Zeilen beinhaltet */ | ||
selectedKeys: ['1002'], | ||
|
||
/* keyPropertyName: Eigenschaft, auf die sich `selectedKeys` bezieht. Default-Wert: `id` */ | ||
keyPropertyName: 'id', | ||
}; | ||
``` | ||
|
||
## Beispiel | ||
|
||
```jsx | ||
<KolTableStateless | ||
_label="Table for demonstration purposes" | ||
_headerCells={{ | ||
horizontal: [ | ||
[ | ||
{ key: 'value', label: 'Value', sortDirection: 'ASC' }, | ||
], | ||
], | ||
}} | ||
_data={DATA} | ||
_selection={{ | ||
label: (row: KoliBriTableDataType) => `Selection for ${row.name}`, | ||
selectedKeys: ['1002'], | ||
keyPropertyName: 'id', | ||
}} | ||
_on={{ | ||
/** | ||
* @param {MouseEvent} _ | ||
* @param {SortEventPayload} payload | ||
* @param {string} payload.key | ||
* @param {KoliBriSortDirection} payload.currentSortDirection | ||
*/ | ||
onSort: (_: MouseEvent, payload: SortEventPayload) => { | ||
/* Perform sort, update `DATA` and headers `sortDirection` */ | ||
}, | ||
|
||
/** | ||
* @param {Event} _ | ||
* @param {string[]} selection - Array of selected keys | ||
*/ | ||
onSelectionChange: (_: Event, selection: string[]) => { | ||
/* Update selection.selectedKeys state */ | ||
} | ||
}} | ||
/> | ||
``` | ||
|
||
<Readme /> | ||
|
||
<ExampleLink component="table-stateless" /> | ||
|
||
## Live-Editor | ||
|
||
<LiveEditorCompact component="table-stateless" /> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.