Pliki, kamera i schemat z serwera
Źródło:
FileService.js,FilePreviewView.js,FilePickerView.js,CameraView.js,DynamicView.js,schemaGuard.js
Plik w schemacie opisuje się źródłem, a nie znacznikiem HTML: adresem, treścią tekstową albo base64 z odpowiedzi API. Budową Blob, tymczasowym objectURL i zwolnieniem pamięci zajmuje się FileService. Dozwolone są wyłącznie adresy http(s), blob:, data: i ścieżki względne — javascript: i inne wykonywalne schematy są odrzucane, bo url bywa budowany z danych zwróconych przez backend.
filepreview — podgląd pliku
type: filepreview
id: invoicePreview
title: Faktura
valueFrom: orderDetail.invoice # obiekt albo string (base64 / adres)
source: base64 # base64 | text | url — gdy `valueFrom` daje string
mimeType: application/pdf
filename: faktura.pdf
height: 420px
actions: true # przyciski Pobierz / Otwórz (domyślnie true)
emptyMessage: Brak pliku
- Plik można podać wprost:
contentBase64,contentalbourl— sprawdzane w tej kolejności. GdyvalueFromwskazuje obiekt, widok czyta z niego polacontentBase64/content/url,mimeTypeorazfilename(alboname), więc odpowiedź API nie wymaga mapowania. - Podgląd dobierany jest do typu: obraz jako
img, PDF i pliki tekstowe w izolowanej ramce (sandbox), pozostałe jako karta z nazwą pliku. mimeTypebez wartości jest zgadywany z nazwy pliku lub adresu.- Przyciski Pobierz i Otwórz uruchamiają akcje
downloadFile/openFile; ich podpisy zmieniadownloadLabeliopenLabel, aactions: falseukrywa cały pasek. - Tymczasowy
objectURLzbudowany z base64 jest zwalniany przy zmianie pliku i przy odmontowaniu widoku, więc podgląd nie wycieka pamięcią.
filepicker — wybór pliku
type: filepicker
id: attachment
label: Załącznik
accept: image/*,.pdf
maxSize: 5MB
multiple: false
mode: file # file | base64
buttonLabel: Wybierz plik
- Domyślnie wartością kontrolki jest obiekt
File(a przymultiple: truetablicaFile) — dokładnie to, co przyjmujeFormDataprzy wysyłce. mode: base64włącza się jawnie, bo base64 powiększa dane o ok. 33%. Wartością jest wtedy deskryptor{ name, mimeType, size, contentBase64 }.acceptprzyjmuje typy MIME i rozszerzenia (image/*,.pdf), amaxSizezapis w rodzaju5MB,500kbalbo liczbę bajtów. Pliki niepasujące są odrzucane z komunikatem pod kontrolką i nie zostają w polu.- Pliku nie da się ustawić programowo (ograniczenie przeglądarki) —
setValue(null)czyści zarówno stan, jak i pole.
camera — zdjęcia jako wartość kontrolki
type: camera
id: damagePhotos
label: Zdjęcia uszkodzeń
facingMode: environment # environment (tylna) | user (przednia)
mimeType: image/jpeg
quality: 0.9
maxPhotos: 5
gallery: true
captureKey: true # spacja robi zdjęcie (domyślnie true)
onCapture:
action: callMethod
module: core/orders
method: photo.add
- Widok pokazuje podgląd z kamery, przycisk zdjęcia i galerię miniatur z możliwością usunięcia pojedynczego zdjęcia.
- Wartością kontrolki jest tablica zdjęć
{ name, mimeType, width, height, contentBase64 }, więc wysyła się je zwykłymwithData— bez ukrytych pól i skryptów.onCapturewidzi w$valuenowe zdjęcie,onChange— całą tablicę. - Ścieżki mediów są zatrzymywane przy odmontowaniu widoku oraz przy przebudowie zawartości (
renderIf,variantIf) — inaczej dioda kamery świeciłaby po zamknięciu modala. - Odmowa uprawnień lub brak kamery kończy się czytelnym komunikatem („Brak zgody na dostęp do kamery”, „Nie znaleziono kamery”, „Kamera jest używana przez inną aplikację”) i przyciskiem ponowienia, a nie pustym prostokątem.
schemaFrom — schemat widoku z serwera
type: dynamic
module: core/shipping
method: carrierDropdown
schemaFrom: data.view # ścieżka do schematu w odpowiedzi API
allow: [html] # zgoda na typy wstawiające surowy kod strony
allowActions: [callMethod, reload] # zawężenie listy dozwolonych akcji
Serwer zwraca wtedy opis widoku, a nie gotowy HTML. Zdalny schemat jest danymi z zewnątrz, więc przed renderowaniem przechodzi walidację (schemaGuard.js):
| Element schematu | Polityka |
|---|---|
| Typy widoków | Dozwolone wyłącznie znane typy silnika |
html, cssbox | Wymagają jawnej zgody allow: [html] — wstawiają surowy HTML i CSS |
| Akcje | Dozwolone wyłącznie znane akcje; allowActions dodatkowo zawęża listę |
components | Zabronione — rejestr komponentów jest wspólny dla całej strony |
actionDefinitions | Dozwolone — obowiązują tylko w poddrzewie zwróconego schematu |
Nazwane akcje wyszukiwane są w górę drzewa od widoku wywołującego, więc definicja ze zdalnego schematu nie nadpisuje niczego na stronie — inaczej niż rejestracja komponentu, która byłaby globalna (patrz Komponenty i sloty).
Schemat nie może też być dowolnie duży ani zapętlony:
| Limit | Wartość |
|---|---|
| Maksymalne zagnieżdżenie widoków | 20 |
| Maksymalna liczba węzłów widoków | 500 |
| Zbieranych błędów walidacji | 20 (dalsze nie wnoszą nic do diagnostyki) |
Niepoprawny schemat nie jest renderowany: widok pokazuje komunikat (schemaErrorMessage), a lista błędów trafia do konsoli.
Powiązane: Dostępne Akcje (ActionHandler) · Kontrolki wartości · Komponenty i sloty · DynamicView · FilePreviewView
