BaseView – Klasa bazowa
Źródło:
BaseView.js
BaseView jest klasą bazową dla wszystkich widoków w OrbitoViewEngine. Dziedziczy po HTMLElement, co oznacza, że każdy widok jest Custom Element.
Właściwości
groups
Tablica grup, do których należy widok. Może być używana do:
- Zarządzania widocznością grupy widoków
- Zbiorczego zbierania danych z inputów należących do tej samej grupy
- Organizacji widoków w logiczne sekcje
Grupy są automatycznie parsowane z pola groups w schemacie widoku podczas inicjalizacji.
type: text
groups:
- section-1
- editable
text: Treść widoku
viewId
Unikalny identyfikator widoku. Jeśli nie jest podany w schemacie, generowany jest automatycznie.
Zdarzenia cyklu życia
onLoad
Akcja wykonywana jednorazowo po dodaniu widoku do drzewa DOM. Obsługuje wszystkie akcje zdefiniowane w ActionHandler – tak samo jak onClick w ButtonView czy BadgeView.
| Pole | Typ | Opis |
|---|---|---|
onLoad | obiekt akcji | Akcja wykonywana po załadowaniu widoku do DOM |
type: card
title: Tytuł karty
content: []
onLoad:
action: emit
event: someEvent
Wywołanie metody API po załadowaniu:
type: card
onLoad:
action: callMethod
module: core/orders
method: init
then:
action: reload
target: ordersTable
Uwaga:
onLoadjest wywoływane tylko raz – przy pierwszym podpięciu elementu do DOM. Ponowne przeniesienie elementu w drzewie DOM nie wyzwoli akcji po raz drugi.
onEvent
Tablica listenerów EventBus. Każdy wpis pozwala wykonać dowolną akcję z ActionHandler w momencie otrzymania wskazanego eventu. Listenery są rejestrowane przy connectedCallback i automatycznie usuwane przy disconnectedCallback.
| Pole | Typ | Opis |
|---|---|---|
event | string | Nazwa eventu na EventBus |
action | obiekt akcji | Akcja do wykonania (identyczna jak onClick / onLoad) |
condition | object (opcjonalny) | Warunek sprawdzany na danych eventu przed wywołaniem akcji |
type: card
onEvent:
- event: order:updated
action:
action: reload
target: ordersTable
Z warunkiem:
type: text
onEvent:
- event: order:statusChanged
condition:
status: completed
action:
action: toast
type: success
title: Zamówienie zakończone
Operatory w condition
Składnia wzorowana na Mongo. Klucze obsługują dot-notation do odczytu zagnieżdżonych pól. Domyślnie wartość prosta oznacza równość (===).
| Operator | Opis | Przykład w YAML |
|---|---|---|
$eq | Równość (===) | status: "$eq": "active" (wewnątrz klucza) |
$neq | Nierówność (!==) | status: "$neq": "draft" |
$in | Wartość znajduje się w tablicy | status: ["new", "pending"] |
$nin | Wartość NIE znajduje się w tablicy | status: ["cancelled"] |
$size / $length | Porównanie długości tablicy lub stringu | tags: "$size": 3 |
condition:
$page.someVar: order
someView001:
$neg: "some negated value"
$event.status:
$nin:
- cancelled
- archived
Uwaga: Wartość prosta (np.
"completed") jest skrótem dla$eq. Klucze z kropką (np."meta.type") odczytują zagnieżdżone pola z danych eventu.
Operator $size / $length
Sprawdza długość wartości — działa dla tablic (liczba elementów) oraz stringów (liczba znaków). Dla wartości innego typu warunek zwraca false. $size i $length to aliasy — działają identycznie.
Wartość operatora może być:
- liczbą — dopasowanie dokładnej długości (
length === n), - obiektem z operatorami porównania:
$eq,$neq,$gt,$gte,$lt,$lte.
# tablica ma dokładnie 3 elementy
condition:
tags:
$size: 3
# co najmniej 2 elementy
condition:
tags:
$size:
$gte: 2
# string krótszy niż 10 znaków
condition:
name:
$length:
$lt: 10
onVarChange
Skrócona składnia do nasłuchiwania zmian zmiennych w VarStore. Alternatywa dla onEvent z ręczną nazwą eventu — pozwala reagować na setPageVar, setGlobalVar oraz zmiany danych widoków bez znajomości wewnętrznych nazw eventów.
| Pole | Typ | Opis |
|---|---|---|
scope | "view" | "page" | "global" | Zakres zmiennej |
key | string | Klucz zmiennej (lub viewId dla scope view) |
action | obiekt akcji | Akcja do wykonania po zmianie zmiennej |
condition | object (opcjonalny) | Warunek sprawdzany na danych eventu ({ value, key }) |
type: card
onVarChange:
- scope: page
key: activeTab
action:
action: reload
target: contentTable
Reagowanie na zmienną globalną z warunkiem:
type: text
onVarChange:
- scope: global
key: theme
condition:
value: dark
action:
action: emit
event: applyDarkMode
Reagowanie na dane innego widoku:
type: card
onVarChange:
- scope: view
key: someViewId
action:
action: reload
target: summaryPanel
Uwaga: Dane przekazane do akcji w
onVarChangedla scopepage/globalto{ key, value }, a dla scopeviewto{ viewId, value }.
onKey
Tablica skrótów klawiszowych. Każdy wpis pozwala wykonać dowolną akcję z ActionHandler po naciśnięciu wskazanej kombinacji klawiszy (np. Escape, Ctrl+S). Listenery są rejestrowane przy connectedCallback i automatycznie usuwane przy disconnectedCallback.
| Pole | Typ | Opis |
|---|---|---|
key | string | Skrót, np. "Escape", "Ctrl+S", "Mod+Shift+K". Modyfikatory można też podać jako pola boolean (ctrl, shift, alt, meta) |
action | obiekt akcji | Akcja do wykonania (identyczna jak onClick / onLoad) |
condition | object (opcjonalny) | Warunek sprawdzany przed wywołaniem akcji; dostęp do zdarzenia przez $event |
scope | "global" | "self" (opcjonalny) | global (domyślnie) – nasłuch na document; self – tylko gdy fokus jest w widoku |
preventDefault | boolean (opcjonalny) | Domyślnie true – blokuje domyślną akcję przeglądarki (np. systemowy zapis przy Ctrl+S) |
stopPropagation | boolean (opcjonalny) | Domyślnie false |
allowInInput | boolean (opcjonalny) | Domyślnie false. Gdy false, skrót jest ignorowany podczas pisania w polach edytowalnych (chyba że to Escape lub skrót z Ctrl/Cmd/Alt) |
Nazwy klawiszy odpowiadają wartościom KeyboardEvent.key (np. Enter, ArrowUp, Delete), z dodatkowymi aliasami: Esc, Up/Down/Left/Right, Space, Del, Plus, Return. Modyfikatory: Ctrl, Shift, Alt, Meta (Cmd) oraz Mod (= Ctrl na Windows/Linux lub Cmd na macOS).
type: card
onKey:
- key: Escape
action:
action: closeModal
target: editModal
- key: Ctrl+S
action:
action: callMethod
module: core/orders
method: save
Skrót wieloplatformowy z warunkiem:
type: card
onKey:
- key: Mod+Shift+K
condition:
$page.editing: true
action:
action: emit
event: openCommandPalette
Uwaga: Dane przekazane do
conditionprzez$eventto{ key, ctrl, shift, alt, meta }. Składnia warunku jest identyczna jak wonEvent.
renderIf
Warunkowe renderowanie widoku. Jeśli warunki nie są spełnione, widok nie jest budowany (nie jest tworzona jego zawartość ani widoki potomne). Gdy renderIf jest pominięte lub jest pustym obiektem, widok renderuje się normalnie.
Widok jest reaktywny — automatycznie nasłuchuje na zmienne użyte w warunkach ($page, $global oraz zmienne innych widoków) i pojawia się / znika, gdy ich wartość ulega zmianie. Listenery są rejestrowane przy connectedCallback i usuwane przy disconnectedCallback.
| Pole | Typ | Opis |
|---|---|---|
renderIf | object (opcjonalny) | Warunki (styl Mongo) decydujące o zbudowaniu widoku |
Składnia warunków jest identyczna jak w condition (sekcja onEvent). Klucz to ścieżka zmiennej, a widok nasłuchuje na jej zmiany:
$page.<klucz>— zmienna strony$global.<klucz>— zmienna globalna<viewId>.<pole>— dane innego widoku (np.select001.value)
Renderuj tylko dla roli admin:
type: card
title: Panel administracyjny
renderIf:
$global.role: admin
content: []
Renderuj gdy wybrano jedną z opcji:
type: text
content: Wybrano zamówienie aktywne lub oczekujące
renderIf:
select001.value:
$in:
- active
- pending
Wiele warunków (łączone operatorem AND):
type: button
label: Zapisz
renderIf:
$page.editMode: true
$global.role:
$neq: viewer
Uwaga: Wszystkie warunki muszą być spełnione jednocześnie (AND). Wartość prosta (np.
admin) jest skrótem dla$eq.
Notacja .$ w renderIf
Gdy widok jest renderowany jako element listy (listvar, list, kolumna datatable), w warunkach renderIf możesz użyć notacji .$, aby odwołać się do bieżącego elementu kolekcji. Symbol $ jest zamieniany na indeks aktualnego elementu.
Działa to w obu miejscach warunku:
- w wartości — np.
'{{ ordersTable.$._id }}', - w kluczu (ścieżce sprawdzanego pola) — np.
ordersTable.$.products, gdzie$zostaje zamienione na indeks bieżącego wiersza, dzięki czemu warunek odczytuje dane właśnie tego elementu listy.
Pokaż przycisk „zwiń" tylko dla rozwiniętego wiersza ($ w wartości):
type: html
renderIf:
$page.expandedOrder: '{{ ordersTable.$._id }}'
content: <span>▴ zwiń</span>
Pokaż „wyświetl pozostałe", gdy wiersz NIE jest rozwinięty i ma > 3 produkty ($ zarówno w wartości, jak i w kluczu ordersTable.$.products):
type: html
renderIf:
$page.expandedOrder:
$neq: '{{ ordersTable.$._id }}'
ordersTable.$.products: # ← $ w kluczu = indeks bieżącego wiersza
$size:
$gt: 3
content: <span>▾ wyświetl pozostałe</span>
Szczegółowy opis notacji
.$(m.in. listy zagnieżdżone i samo{{ $ }}) znajdziesz w rozdziale Listy i notacja.$.
Wygląd widoku
Każdy widok przyjmuje trzy wspólne pola opisujące wygląd. Wszystkie działają obok siebie i są nadawane po zbudowaniu widoku, więc nie kolidują z jego własnymi klasami.
| Pole | Typ | Opis |
|---|---|---|
className | string [template] | Dodatkowe klasy CSS (rozdzielone spacją) |
classIf | object | Klasy warunkowe: { "klasa": warunek } |
variantIf | object | Wariant warunkowy: { "wariant": warunek } |
classIf
Włącza klasę, gdy warunek jest spełniony, i zdejmuje ją, gdy przestaje być. Korzysta z tego samego evaluatora warunków co renderIf — działają więc operatory ($gt, $gte, $lt, $lte, $in…), porównania typowane, notacja .$ oraz operandy { valueFrom }, które porównują dwie wartości ze sobą.
classIf:
pk-green-row:
packingDetail.products.$.packedQty:
$gte:
valueFrom: packingDetail.products.$.requiredQty
Klucz może zawierać kilka klas naraz ("text-danger fw-bold"). Widok nasłuchuje zmian obu stron porównania, więc klasa przelicza się bez przeładowania strony.
variantIf
Wybiera publiczny wariant widoku — kolor przycisku, kolor odznaki, kolor tekstu. Wygrywa pierwszy spełniony warunek; gdy żaden nie pasuje, obowiązuje variant ze schematu.
type: button
label: Pakuj
variant: secondary
variantIf:
danger:
packingDetail.missingQty: { $gt: 0 }
success:
packingDetail.missingQty: 0
Zmiana wariantu przebudowuje zawartość widoku, dlatego zasoby zarejestrowane w _build() (subskrypcje, timery) są przy tym zwalniane — patrz onCleanup().
Klikalny kafelek (ove-tile / ove-tile-action)
Gdy cały kafelek (kostka z logo, opisem itp.) ma być klikalny, nie wieszaj onClick na kontenerze — nałóż na niego przezroczysty przycisk. Kontener dostaje className: ove-tile (obramowanie, tło, promień, padding), a wewnątrz niego przycisk bez etykiety, rozciągnięty na całą powierzchnię klasą className: ove-tile-action w wariancie ghost-primary, niesie właściwy onClick:
- type: flex
id: quickOptionTile
direction: row
className: ove-tile
childs:
- type: text
content: Treść kafelka
- type: button
label: ''
title: 'Wykonaj akcję'
variant: ghost-primary
className: ove-tile-action
onClick:
action: callMethod
module: core/example
method: doSomething
Kliknięcie, fokus i obsługa klawiatury zostają przy natywnym <button>, więc kontener kafelka nie musi udawać kontrolki ani dublować logiki dostępności. Hover nie zalewa przy tym kafelka szarym tłem jak zwykły przycisk — podświetla samą krawędź (ramka primary + cień), dzięki czemu logo i tekst w środku zostają czytelne pod kursorem.
Publiczne warianty zamiast style:
Widoki udostępniają nazwane opcje wyglądu, dzięki czemu schemat nie musi znać klas CSS ani wewnętrznego DOM-u widoku:
| Widok | Opcje |
|---|---|
text | size, muted, weight, dense, align, transform, variant |
input, textinput | variant (borderless, plaintext, rounded), size |
card | padding, shadow, borderless |
type: card
padding: sm
shadow: none
content:
- type: text
content: Klient
size: sm
muted: true
transform: uppercase
dense: true
- type: input
id: customerNameInput
variant: borderless
Nieznana wartość opcji jest ignorowana i zgłaszana ostrzeżeniem w konsoli — literówka w schemacie nie psuje układu strony.
Publiczne API widoku
Metody, z których korzystają akcje — dostępne w każdym widoku:
| Metoda | Opis |
|---|---|
focus() | Ustawia fokus na kontrolce widoku (akcja focus) |
selectText() | Zaznacza treść kontrolki (akcja selectText) |
setVariant(variant) | Ustawia wariant i przebudowuje widok |
onCleanup(fn) | Rejestruje sprzątanie zasobu utworzonego w _build() |
evaluateViewCondition(cond) | Sprawdza warunek w kontekście widoku |
Kontrolki wartości (input, select, checkbox, …) dokładają do tego kontrakt getValue() / setValue(value, { emitChange }), z którego korzysta akcja setValue.
Pełna lista dostępnych akcji: Dostępne Akcje (ActionHandler)
