DataTableView
Źródło:
views/DataTableView.js
DataTableView
Rozbudowana tabela danych z paginacją, wyszukiwaniem, sortowaniem, selekcją i akcjami. Styl zgodny z Tabler UI.
Źródło danych
Tabela obsługuje dwa źródła — reszta konfiguracji (kolumny, selekcja, akcje, stopka) jest dla obu identyczna:
# 1. Lokalne — tablica ze stanu; filtrowanie, sortowanie i strony liczone lokalnie
data:
varPath: $page.payments # $page.* | $global.* | $props.* | <viewId>[.pole]
searchFields: [title, note] # pola przeszukiwane (domyślnie wszystkie proste)
paginate: false # wyłącza stronicowanie i stopkę (domyślnie włączone)
# 2. API — zapytanie do modułu; stronę wyników zwraca serwer
dataSource:
module: core/orders
method: list
Źródło lokalne odświeża się samo po zmianie wskazanej zmiennej — bez reload.
Układ karty
- Nagłówek (
card-header) niesie tytuł, pole wyszukiwania i przyciski akcji. Renderuje się tylko wtedy, gdy schemat podajetitle,queryKey,search: truealbo niepustą listęactions— tabela bez żadnego z nich nie rysuje nagłówka, więc nadaje się do wstawienia w cudzą kartę bez efektu karty w karcie. - Stopka (
card-footer) niesie informację o liczbie wyników, kontrolkę liczby wierszy na stronę i paginację. Domyślnie jest;footer: falsewyłącza ją w całości, adata.paginate: falseukrywa ją automatycznie — bez stronicowania nie ma czego stronicować, a licznik „od–do” tylko wprowadzałby w błąd. embedded: true— tabela przeznaczona do wstawienia wcontentcudzej karty (card,modal). Host nie dostaje klasycard, tylkoove-datatable-embedded, a<table>tracicard-table(ta klasa rozsuwa skrajne komórki o padding karty, co w cudzymcard-bodydałoby podwójny margines). Nagłówek i stopka renderują się na zwykłych zasadach, ale w tym trybie sensowna jest tabela beztitlei zfooter: false— inaczej znów widać ramy karty w karcie.minHeight(string CSS, np.0,200px) ustawia minimalną wysokość obszaru tabeli. Domyślnie300px, ale tylko gdy tabela ma stopkę — paginacja zmienia liczbę wierszy i bez rezerwy układ skakałby przy każdej zmianie strony. Bez stopki tabela zajmuje tyle, ile mają wiersze. Jawna wartość wygrywa w obu przypadkach.
Schema
type: datatable
id: ordersTable
title: Zamówienia
perPage: 10
perPageOptions:
- 10
- 25
- 50
- 100
footer: false # bez paska z licznikiem i paginacją
columns:
- header: ID Zamówienia
field: orderId # sama wartość z wiersza — bez szablonu
sortable: true # `sortKey` domyślnie równy `field`
width: 150px
- header: Nazwa Klienta
field: customer.name
- header: Kwota
field: amount
align: end
decimals: 2
suffix: " PLN"
summary: sum # wiersz podsumowań w stopce tabeli
- header: Status
content: # pełna swoboda — dowolne widoki w komórce
- type: badge
label: "{{ ordersTable.$.status }}"
- header: ""
width: 1%
actions: # kolumna akcji wiersza
- icon: pencil
title: Edytuj
action: openModal
target: editModal
dataSource:
module: core/products
method: search
params:
status: active
minQty: "#minQty" # wartość z kontrolki o id "minQty"
statusId: "$local.statusId" # wartość z localStorage klucza "ove_statusId"
responsePath: data
totalPath: pagination.total
pageParam: page
perPageParam: perPage
sortParam: sort
sortDirParam: sortDir
queryKey: name
searchPlaceholder: "Szukaj..."
actions:
- icon: plus
label: Dodaj
variant: primary
action: openModal
target: addModal
emptyMessage: Brak danych
loadingMessage: Ładowanie...
selectable: false
selectKey: _id
Parametry
type- Typ widoku:"datatable"id- Identyfikator widoku (wymagane)title- Tytuł tabeli (opcjonalne)perPage- Liczba wyników na stronę (domyślnie: 10)perPageOptions- Opcje wyboru liczby wyników (opcjonalne)footer-falseukrywa stopkę karty (licznik wyników, liczba wierszy, paginacja); domyślnie stopka jestembedded-truerenderuje tabelę bez własnej karty (do wstawienia wcontentcudzej karty); domyślniefalseminHeight- Minimalna wysokość obszaru tabeli (string CSS); domyślnie300pxze stopką, bez stopki brakcolumns- Tablica definicji kolumn:header- Nagłówek kolumnyfield- Ścieżka do wartości w wierszu (customer.name); komórka pokazuje samą wartośćcontent- Tablica widoków w komórce (ma pierwszeństwo przedfield)actions- Lista akcji wiersza renderowana jako przyciski (ma pierwszeństwo przedcontent)align- Wyrównanie:start,center,endwidth- Szerokość kolumny (150px,1%)sortable/sortKey- Sortowanie (sortKeydomyślnie równyfield)decimals,prefix,suffix,emptyText[template] - Formatowanie wartościfieldsummary- Podsumowanie w stopce:sum,avg,min,max,count(albo obiekt{ agg, field, decimals, prefix, suffix })summaryValue[template] - Gotowa wartość podsumowania zamiast agregacjiclassName/cellClassName- Dodatkowe klasy nagłówka / komórek
data- Lokalne źródło danych (varPath,searchFields,paginate)dataSource- Źródło danych z APIqueryKey- Nazwa parametru wyszukiwania w API (pokazuje pole wyszukiwania jeśli podane)search-truepokazuje pole wyszukiwania dla źródła lokalnego (bez parametru API)searchPlaceholder- Placeholder dla pola wyszukiwania (opcjonalne)actions- Akcje w nagłówku tabeli (opcjonalne)emptyMessage- Komunikat gdy brak wyników (opcjonalne)loadingMessage- Komunikat ładowania (opcjonalne)selectable- Czy wiersze są zaznaczalne (opcjonalne)selectKey- Klucz identyfikatora dla zaznaczania (opcjonalne)rowKey- Klucz identyfikujący wiersz przy edycji (domyślnieselectKey, potem_id)editable- Edycja wiersza w miejscu (patrz niżej)
Edycja wiersza
rowKey: id
editable:
fields: # wspólny opis pól (`formFields.js`)
- key: qty
type: number
min: 0
required: true
- key: note
save:
module: core/orders
method: product.update
params:
orderId: { valueFrom: $page.orderId }
rowKeyParam: productId # nazwa parametru z identyfikatorem (domyślnie `rowKey`)
onlyChanged: true
refresh: [orderDetail]
columns:
- header: Ilość
field: qty # w trybie edycji zamienia się w kontrolkę pola `qty`
Tabela dokłada kolumnę z przyciskami ✎ / ✓ / ✕. Edycja działa na roboczej kopii danych (FormDraft), więc anulowanie nie wymaga przeładowania, a walidacja pól wykonuje się przed wysłaniem. Edytowany wiersz rozpoznawany jest po rowKey, więc przetrwa sortowanie i odświeżenie danych; gdy zniknie ze zbioru, edycja się zamyka. Błąd zapisu pokazuje się pod wierszem, a wiersz zostaje w trybie edycji.
Emitowane zdarzenia
datatable:loaded:${id}- po załadowaniu danychdatatable:pageChange:${id}- po zmianie stronydatatable:search:${id}- po wyszukiwaniudatatable:sort:${id}- po sortowaniudatatable:select:${id}- po zaznaczeniu wierszydatatable:rowClick:${id}- po kliknięciu w wierszdatatable:editRow:${id}- po otwarciu edycji wierszadatatable:cancelRow:${id}- po anulowaniu edycjidatatable:savedRow:${id}- po udanym zapisie wiersza
Podsumowania a źródło danych
Źródło lokalne agreguje wszystkie przefiltrowane wiersze, źródło API — tylko wiersze bieżącej strony (przeglądarka nie zna pozostałych). Dla sum z serwera użyj summaryValue z wartością zwróconą w odpowiedzi.
