Skip to content

Commit 1b18f9b

Browse files
authored
Merge pull request #2 from avalynx/feature/table-sort
Feature/table sort
2 parents be2a300 + 98fbceb commit 1b18f9b

16 files changed

Lines changed: 3921 additions & 269 deletions

README.de.md

Lines changed: 123 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,21 @@ AvalynxTable ist ein leichtgewichtiges, abhängigkeitsfreies Tabellensystem, das
1515
- **Automatische Tabellenerweiterung**: Erweitert Tabellen durch Hinzufügen von Datenattributen zu Tabellenzellen basierend auf der entsprechenden Kopfzeile. Dies ist besonders nützlich für responsive Designs, bei denen Tabellenzellen ihre Header auf kleineren Bildschirmen inline anzeigen müssen.
1616
- **Flexible Selector-Unterstützung**: Unterstützt benutzerdefinierte Selektoren für das Ansprechen von Tabellen innerhalb des DOM. Dies ermöglicht eine feingranulare Kontrolle darüber, welche Tabellen erweitert werden.
1717
- **Benutzerdefinierte Breakpoints**: Ermöglicht die Angabe benutzerdefinierter Breakpoints für den Zeitpunkt, an dem Tabellen übereinander gestapelt werden sollen. Dies ist nützlich, um eine konsistente Benutzererfahrung über verschiedene Bildschirmgrößen hinweg zu schaffen.
18+
- **Optionale Sortierung**: Sortieren per Klick auf Spaltenüberschriften (aufsteigend/absteigend), sobald `options.sorting` konfiguriert ist.
19+
- **Multi-Sort-Unterstützung**: Auf Desktop mit `Ctrl` oder `Shift` mehrere Spalten sortieren. Im Stacked-Modus wird ein eigener Multi-Sort-Schalter angezeigt.
20+
- **Konfigurierbare Sortierspalten und Defaults**: Definieren Sie sortierbare Spalten und initiale Sortierungen per Index, Spaltenname oder `data-avalynx-table-sort-id`.
21+
- **Benutzerdefinierte Sortierwerte**: Mit `data-avalynx-table-sort-value` lassen sich formatierte Werte wie Währungen sauber sortieren.
22+
- **Stacked-Sortiersteuerung**: In der gestapelten Ansicht werden automatisch mobile Sortierbuttons eingeblendet.
23+
- **Anpassbare Sprache und Button-Klassen**: Beschriftungen und CSS-Klassen für Sortierbuttons sind konfigurierbar.
1824

1925
## Beispiel
2026

2127
Hier ist ein einfaches Beispiel für die Verwendung von AvalynxTable in Ihrem Projekt:
2228

2329
* [Übersicht](https://avalynx-table.jbs-newmedia.de/examples/index.html)
2430
* [Tabelle](https://avalynx-table.jbs-newmedia.de/examples/table.html)
31+
* [Tabelle mit Options-Buttons](https://avalynx-table.jbs-newmedia.de/examples/table-options.html)
32+
* [Tabelle mit Sortierung](https://avalynx-table.jbs-newmedia.de/examples/table-sorting.html)
2533
* [Tabelle mit benutzerdefinierten CSS-Variablen](https://avalynx-table.jbs-newmedia.de/examples/table-custom-css.html)
2634

2735
## Installation
@@ -50,8 +58,8 @@ Ersetzen Sie `path/to/avalynx-table.js` und `path/to/avalynx-table.css` durch de
5058
AvalynxTable ist auch über [jsDelivr](https://www.jsdelivr.com/) verfügbar. Sie können es wie folgt in Ihr Projekt einbinden:
5159

5260
```html
53-
<link href="https://cdn.jsdelivr.net/npm/avalynx-table@1.0.2/dist/css/avalynx-table.min.css" rel="stylesheet">
54-
<script src="https://cdn.jsdelivr.net/npm/avalynx-table@1.0.2/dist/js/avalynx-table.min.js"></script>
61+
<link href="https://cdn.jsdelivr.net/npm/avalynx-table@1.0.3/dist/css/avalynx-table.min.css" rel="stylesheet">
62+
<script src="https://cdn.jsdelivr.net/npm/avalynx-table@1.0.3/dist/js/avalynx-table.min.js"></script>
5563
```
5664

5765
Stellen Sie sicher, dass Sie auch das JS/CSS von Bootstrap in Ihr Projekt einbinden, um eine korrekte Anzeige von AvalynxTable zu gewährleisten.
@@ -142,12 +150,124 @@ Um AvalynxTable in Ihrem Projekt zu verwenden, stellen Sie zunächst sicher, das
142150
new AvalynxTable('.avalynx-table');
143151
```
144152

153+
### Verwendung mit Sortieroptionen
154+
155+
```html
156+
<table id="table-sorting" class="avalynx-table avalynx-table-md table table-bordered table-striped">
157+
<thead>
158+
<tr>
159+
<th data-avalynx-table-sort-id="id">ID</th>
160+
<th data-avalynx-table-sort-id="name">Name</th>
161+
<th data-avalynx-table-sort-id="department">Abteilung</th>
162+
<th data-avalynx-table-sort-id="salary">Gehalt</th>
163+
<th data-avalynx-sortable="false">Status</th>
164+
</tr>
165+
</thead>
166+
<tbody>
167+
<tr>
168+
<td data-avalynx-table-sort-value="1002">1002</td>
169+
<td>Max Mustermann</td>
170+
<td>Vertrieb</td>
171+
<td data-avalynx-table-sort-value="62000">62.000 €</td>
172+
<td>Aktiv</td>
173+
</tr>
174+
</tbody>
175+
</table>
176+
```
177+
178+
```javascript
179+
new AvalynxTable('#table-sorting', {
180+
sortableColumns: ['department', 'name', 'salary'],
181+
sorting: [
182+
{ column: 'department', dir: 'asc' },
183+
{ column: 'name', dir: 'asc' }
184+
],
185+
stackedSorter: true,
186+
stackedMultiSortToggle: true
187+
});
188+
```
189+
190+
### Verwendung mit Sprache und Button-Class-Strings
191+
192+
```javascript
193+
new AvalynxTable('.avalynx-table', {
194+
buttonClasses: {
195+
multiSortInactive: 'btn-primary btn-custom-2',
196+
multiSortActive: 'btn-primary btn-custom-3',
197+
sortButtonInactive: 'btn-outline-primary btn-custom-2',
198+
sortButtonActive: 'btn-primary btn-custom-3'
199+
}
200+
}, {
201+
sortByLabel: 'Sortiere nach',
202+
multiSortLabel: 'Mehrfachsuche',
203+
multiSortOnLabel: 'an',
204+
multiSortOffLabel: 'aus',
205+
columnLabel: 'Spalte'
206+
});
207+
```
208+
145209
## Optionen
146210

147211
AvalynxTable ermöglicht die folgenden Optionen zur Anpassung:
148212

149213
- `selector`: (string) Der Selektor, der für das Ansprechen von Tabellen innerhalb des DOM verwendet werden soll (Standard: `'.avalynx-table'`).
150-
- `options`: Ein Objekt, das die folgenden Schlüssel enthält: (**demnächst**)
214+
- `options.sortableColumns`: (`Array<number|string>`) Sortierbare Spalten per Index, Spaltentext oder `data-avalynx-table-sort-id`.
215+
- `options.sorting`: (`Array<{column:number|string,dir:string}>`) Initiale Sortierung, z.B. `[{ column: 'name', dir: 'asc' }]`.
216+
Die Sortierung ist nur aktiv, wenn dieses Array mindestens eine Regel enthält.
217+
- `options.stackedSorter`: (`boolean`) Gestapelte Sortiersteuerung anzeigen (Standard: `true`).
218+
- `options.stackedMultiSortToggle`: (`boolean`) Multi-Sort-Umschalter im Stacked-Modus anzeigen (Standard: `true`).
219+
- `options.buttonClasses`: (`object`) Class-Strings für gestapelte Buttons:
220+
- `multiSortInactive`
221+
- `multiSortActive`
222+
- `sortButtonInactive`
223+
- `sortButtonActive`
224+
- Aliase: `multiSearchInactive`, `multiSearchActive`
225+
226+
### Sortierbezogene Datenattribute
227+
228+
- `data-avalynx-table-sort-id`: Stabile ID für Header, die in `sortableColumns` und `sorting` referenziert werden kann.
229+
- `data-avalynx-sortable="false"`: Schließt eine Spalte explizit von der Sortierung aus.
230+
- `data-avalynx-table-sort-value`: Optionaler normalisierter Wert für die Sortierung von Zellinhalten.
231+
232+
### Responsive-Klassen
233+
234+
Nutzen Sie eine der integrierten Tabellenklassen, um den Stacking-Breakpoint festzulegen:
235+
236+
- `.avalynx-table` (sm)
237+
- `.avalynx-table-md`
238+
- `.avalynx-table-lg`
239+
- `.avalynx-table-xl`
240+
- `.avalynx-table-xxl`
241+
242+
### CSS-Variablen
243+
244+
Das Verhalten im Stacked-Modus kann über CSS-Variablen angepasst werden, z.B.:
245+
246+
- `--avalynx-table-cell-padding-left`
247+
- `--avalynx-table-cell-before-width`
248+
- `--avalynx-table-before-content`
249+
- `--avalynx-table-before-weight`
250+
251+
### Sprache
252+
253+
Texte werden über den dritten Constructor-Parameter `language` konfiguriert:
254+
255+
- `sortByLabel`
256+
- `multiSortLabel`
257+
- `multiSortOnLabel`
258+
- `multiSortOffLabel`
259+
- `columnLabel`
260+
- Aliase: `multiSearchLabel`, `multiSearchOnLabel`, `multiSearchOffLabel`
261+
262+
```javascript
263+
new AvalynxTable('.avalynx-table', {}, {
264+
sortByLabel: 'Sortiere nach',
265+
multiSortLabel: 'Mehrfachsuche',
266+
multiSortOnLabel: 'an',
267+
multiSortOffLabel: 'aus',
268+
columnLabel: 'Spalte'
269+
});
270+
```
151271

152272
## Mitwirken
153273

README.md

Lines changed: 123 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,21 @@ AvalynxTable is a lightweight, dependency-free table system designed for respons
1515
- **Automatic Table Enhancement**: Enhances tables by adding data attributes to table cells based on the corresponding header row. This is particularly useful for responsive designs where table cells may need to display their headers inline on smaller screens.
1616
- **Flexible Selector Support**: Supports custom selectors for targeting tables within the DOM. This allows for fine-grained control over which tables are enhanced.
1717
- **Custom Breakpoints**: Allows you to specify custom breakpoints for when tables should stack on top of each other. This is useful for creating a consistent user experience across different screen sizes.
18+
- **Opt-in Sorting**: Click table headers to sort columns in ascending/descending order when `options.sorting` is configured.
19+
- **Multi-Sort Support**: Use `Ctrl` or `Shift` on desktop for multi-column sorting. In stacked mode, a dedicated multi-sort toggle is shown.
20+
- **Configurable Sort Columns and Defaults**: Define sortable columns and initial sorting by column index, header name, or `data-avalynx-table-sort-id`.
21+
- **Custom Sort Values**: Use `data-avalynx-table-sort-value` for robust sorting of formatted values like currency.
22+
- **Stacked Sort Controls**: In stacked view, mobile-friendly sorting buttons are rendered automatically.
23+
- **Language and Button Class Overrides**: Customize sorting labels and stacked control button classes.
1824

1925
## Example
2026

2127
Here's a simple example of how to use AvalynxTable in your project:
2228

2329
* [Overview](https://avalynx-table.jbs-newmedia.de/examples/index.html)
2430
* [Table](https://avalynx-table.jbs-newmedia.de/examples/table.html)
31+
* [Table with Options Buttons](https://avalynx-table.jbs-newmedia.de/examples/table-options.html)
32+
* [Table with Sorting](https://avalynx-table.jbs-newmedia.de/examples/table-sorting.html)
2533
* [Table with Custom CSS Variables](https://avalynx-table.jbs-newmedia.de/examples/table-custom-css.html)
2634

2735
## Installation
@@ -50,8 +58,8 @@ Replace `path/to/avalynx-table.js` and `path/to/avalynx-table.css` with the actu
5058
AvalynxTable is also available via [jsDelivr](https://www.jsdelivr.com/). You can include it in your project like this:
5159

5260
```html
53-
<link href="https://cdn.jsdelivr.net/npm/avalynx-table@1.0.2/dist/css/avalynx-table.min.css" rel="stylesheet">
54-
<script src="https://cdn.jsdelivr.net/npm/avalynx-table@1.0.2/dist/js/avalynx-table.min.js"></script>
61+
<link href="https://cdn.jsdelivr.net/npm/avalynx-table@1.0.3/dist/css/avalynx-table.min.css" rel="stylesheet">
62+
<script src="https://cdn.jsdelivr.net/npm/avalynx-table@1.0.3/dist/js/avalynx-table.min.js"></script>
5563
```
5664

5765
Make sure to also include Bootstrap's JS/CSS in your project to ensure AvalynxTable displays correctly.
@@ -142,12 +150,124 @@ To use AvalynxTable in your project, first ensure you have tables marked up in y
142150
new AvalynxTable('.avalynx-table');
143151
```
144152

153+
### Usage with sorting options
154+
155+
```html
156+
<table id="table-sorting" class="avalynx-table avalynx-table-md table table-bordered table-striped">
157+
<thead>
158+
<tr>
159+
<th data-avalynx-table-sort-id="id">ID</th>
160+
<th data-avalynx-table-sort-id="name">Name</th>
161+
<th data-avalynx-table-sort-id="department">Department</th>
162+
<th data-avalynx-table-sort-id="salary">Salary</th>
163+
<th data-avalynx-sortable="false">Status</th>
164+
</tr>
165+
</thead>
166+
<tbody>
167+
<tr>
168+
<td data-avalynx-table-sort-value="1002">1002</td>
169+
<td>Max Mustermann</td>
170+
<td>Sales</td>
171+
<td data-avalynx-table-sort-value="62000">62.000 €</td>
172+
<td>Active</td>
173+
</tr>
174+
</tbody>
175+
</table>
176+
```
177+
178+
```javascript
179+
new AvalynxTable('#table-sorting', {
180+
sortableColumns: ['department', 'name', 'salary'],
181+
sorting: [
182+
{ column: 'department', dir: 'asc' },
183+
{ column: 'name', dir: 'asc' }
184+
],
185+
stackedSorter: true,
186+
stackedMultiSortToggle: true
187+
});
188+
```
189+
190+
### Usage with language and button class strings
191+
192+
```javascript
193+
new AvalynxTable('.avalynx-table', {
194+
buttonClasses: {
195+
multiSortInactive: 'btn-primary btn-custom-2',
196+
multiSortActive: 'btn-primary btn-custom-3',
197+
sortButtonInactive: 'btn-outline-primary btn-custom-2',
198+
sortButtonActive: 'btn-primary btn-custom-3'
199+
}
200+
}, {
201+
sortByLabel: 'Sort by',
202+
multiSortLabel: 'Multi-search',
203+
multiSortOnLabel: 'on',
204+
multiSortOffLabel: 'off',
205+
columnLabel: 'Column'
206+
});
207+
```
208+
145209
## Options
146210

147211
AvalynxTable allows the following options for customization:
148212

149213
- `selector`: (string) The selector to use for targeting tables within the DOM (default: `'.avalynx-table'`).
150-
- `options`: An object containing the following keys: (**coming soon**)
214+
- `options.sortableColumns`: (`Array<number|string>`) Sortable columns by index, header text, or `data-avalynx-table-sort-id`.
215+
- `options.sorting`: (`Array<{column:number|string,dir:string}>`) Initial sorting, for example `[{ column: 'name', dir: 'asc' }]`.
216+
Sorting is active only when this array contains at least one rule.
217+
- `options.stackedSorter`: (`boolean`) Show stacked sorting controls (default: `true`).
218+
- `options.stackedMultiSortToggle`: (`boolean`) Show multi sort toggle button in stacked mode (default: `true`).
219+
- `options.buttonClasses`: (`object`) Class strings for stacked buttons:
220+
- `multiSortInactive`
221+
- `multiSortActive`
222+
- `sortButtonInactive`
223+
- `sortButtonActive`
224+
- aliases: `multiSearchInactive`, `multiSearchActive`
225+
226+
### Sorting-related data attributes
227+
228+
- `data-avalynx-table-sort-id`: Stable id for a header that can be referenced in `sortableColumns` and `sorting`.
229+
- `data-avalynx-sortable="false"`: Explicitly excludes a column from sorting.
230+
- `data-avalynx-table-sort-value`: Optional normalized value used for sorting cell content.
231+
232+
### Responsive classes
233+
234+
Use one of the built-in table classes to define when stacking starts:
235+
236+
- `.avalynx-table` (sm)
237+
- `.avalynx-table-md`
238+
- `.avalynx-table-lg`
239+
- `.avalynx-table-xl`
240+
- `.avalynx-table-xxl`
241+
242+
### CSS variables
243+
244+
You can adjust stacked rendering with CSS variables, for example:
245+
246+
- `--avalynx-table-cell-padding-left`
247+
- `--avalynx-table-cell-before-width`
248+
- `--avalynx-table-before-content`
249+
- `--avalynx-table-before-weight`
250+
251+
### Language
252+
253+
Texts are configured via the third constructor parameter `language`:
254+
255+
- `sortByLabel`
256+
- `multiSortLabel`
257+
- `multiSortOnLabel`
258+
- `multiSortOffLabel`
259+
- `columnLabel`
260+
- aliases: `multiSearchLabel`, `multiSearchOnLabel`, `multiSearchOffLabel`
261+
262+
```javascript
263+
new AvalynxTable('.avalynx-table', {}, {
264+
sortByLabel: 'Sortiere nach',
265+
multiSortLabel: 'Mehrfachsuche',
266+
multiSortOnLabel: 'an',
267+
multiSortOffLabel: 'aus',
268+
columnLabel: 'Spalte'
269+
});
270+
```
151271

152272
## Contributing
153273

0 commit comments

Comments
 (0)