إنتقل إلى المحتوى الرئيسي

Strani

Kako strani delujejo v arhitekturi Orb - usmerjanje, vezava lastnosti, rezine in navigacija.

Povezano:


Pregled

V jeziku Orb je Stran pot, ki sestavlja lastnosti za upodabljanje UI. Temeljni sestav je:

Orbital = Entiteta + Lastnosti + Strani

Medtem ko Entitete definirajo podatke in Lastnosti definirajo obnasanje, Strani definirajo, kje uporabniki komunicirajo s sistemom. Strani so vodene z lastnostmi - ne vsebujejo UI neposredno, ampak se sklicujejo na lastnosti, katerih ucinki render-ui zapolnijo stran.


Definicija strani

Stran je definirana v .orb programu z naslednjo strukturo:

{
"name": "TaskListPage",
"path": "/tasks",
"viewType": "list",
"primaryEntity": "Task",
"traits": [
{ "ref": "TaskBrowser", "linkedEntity": "Task" },
{ "ref": "FilterPanel", "linkedEntity": "Task" }
]
}

Lastnosti strani

LastnostObveznoOpis
nameDaIdentifikator v PascalCase (npr. TaskListPage)
pathDaURL pot, ki se zacne z /
viewTypeNeSemanticni namig: list, detail, create, edit, dashboard, custom
primaryEntityNeGlavna entiteta, na kateri ta stran deluje
traitsDaSeznam referenc na lastnosti, ki poganjajo UI
isInitialNeAli je to vstopna stran

Poti in vzorci poti

Poti strani definirajo URL poti za vaso aplikacijo.

Pravila poti

  • Mora se zaceti z /
  • Veljavni znaki: crke, stevilke, pomisljaji, podcrke, dvopicja, posevnice
  • Mora biti edinstvena med vsemi stranmi v programu

Staticne poti

Preproste poti brez dinamicnih segmentov:

{ "path": "/tasks" }
{ "path": "/dashboard" }
{ "path": "/settings/profile" }

Dinamicni segmenti

Uporabite sintakso z dvopicjem za dinamicne parametre:

{ "path": "/tasks/:id" }
{ "path": "/users/:userId/tasks/:taskId" }
{ "path": "/projects/:projectId/members/:memberId" }

Dinamicni segmenti so izvleceni in na voljo v:

  • Obremenitvah dogodkov (@payload.id)
  • Ucinkih navigacije
  • Iskanju entitet

Primeri poti

PotOpis
/tasksStran seznama nalog
/tasks/:idPodrobnosti posamezne naloge
/tasks/createUstvarjanje nove naloge
/tasks/:id/editUrejanje obstojece naloge
/users/:id/profileUporabniski profil
/dashboardPregledna plosca

Tipi pogledov

Tipi pogledov so semanticni namigi o namenu strani:

TipNamenTipicni vzorci
listPrikaz zbirke entitetentity-table, entity-cards, entity-list
detailPrikaz posamezne entiteteentity-detail, stats
createUstvarjanje nove entiteteform
editUrejanje obstojece entiteteform
dashboardPregled z vec razdelkidashboard-grid, stats
customPrilagojena postavitevKaterikoli vzorci

Pomembno: Tipi pogledov ne omejujejo UI - dejansko upodabljanje nadzirajo ucinki render-ui v lastnostih. Tipi pogledov so metapodatki za:

  • Dokumentacijo
  • Namige za generiranje kode
  • Ogrodje UI

Vezava Stran-Lastnost

Strani se sklicujejo na lastnosti, ki zagotavljajo njihovo obnasanje in UI.

Reference na lastnosti

{
"pages": [
{
"name": "TaskListPage",
"path": "/tasks",
"traits": [
{ "ref": "TaskBrowser", "linkedEntity": "Task" },
{ "ref": "QuickActions", "linkedEntity": "Task", "config": { "showCreate": true } }
]
}
]
}

Struktura PageTraitRef

LastnostObveznoOpis
refDaIme lastnosti ali pot (npr. "TaskBrowser", "Std.traits.CRUD")
linkedEntityNeEntiteta, na kateri ta lastnost deluje
configNeKonfiguracija, specificna za lastnost

Vec lastnosti na stran

Stran ima lahko vec lastnosti, od katerih vsaka prispeva UI v razlicne rezine:

{
"name": "DashboardPage",
"path": "/dashboard",
"traits": [
{ "ref": "StatsSummary", "linkedEntity": "Analytics" },
{ "ref": "RecentActivity", "linkedEntity": "Activity" },
{ "ref": "QuickActions", "linkedEntity": "Task" }
]
}

Ucinki render-ui vsake lastnosti ciljajo dolocene rezine.

linkedEntity na lastnostih

Lastnost linkedEntity veze lastnost na doloceno entiteto:

{ "ref": "StatusManager", "linkedEntity": "Task" }

To pomeni:

  • Vezave @entity v lastnosti se razresijo na podatke Task
  • Ucinki, kot je persist, delujejo na zbirki Task
  • Avtomat stanj lastnosti upravlja primerke Task

Glej Vezava Lastnost-Entiteta za podrobnosti.


Primarna entiteta

Lastnost primaryEntity oznacuje glavno entiteto, na kateri stran deluje:

{
"name": "TaskDetailPage",
"path": "/tasks/:id",
"primaryEntity": "Task",
"traits": [
{ "ref": "TaskViewer" },
{ "ref": "CommentList", "linkedEntity": "Comment" }
]
}

Uporaba:

  • Privzeta entiteta za lastnosti brez eksplicitnega linkedEntity
  • Preverjanje, da entiteta obstaja
  • Namigi za generiranje kode
  • Ni obvezno, ce vse lastnosti eksplicitno dolocijo svojo entiteto

Rezine in upodabljanje UI

Lastnosti upodabljajo UI prek ucinkov render-ui, ki ciljajo rezine - poimenovana podrocja na strani.

Razpolozljive rezine

RezinaNamen
mainPrimarno podrocje vsebine
sidebarStranski panel
modalModalno prekrivanje
drawerPredalni panel
overlayCelozaslonsko prekrivanje
centerSrediscna vsebina
toastObvestila toast
hud-topZgornji HUD (igralni UI)
hud-bottomSpodnji HUD (igralni UI)
floatingPlavajoci element
systemNevidne sistemske komponente

Ucinek render-ui

Lastnosti zapolnijo rezine z ucinkom render-ui:

["render-ui", "main", {
"type": "entity-table",
"entity": "Task",
"columns": ["title", "status", "dueDate"],
"itemActions": [
{ "event": "VIEW", "label": "View" },
{ "event": "EDIT", "label": "Edit" }
]
}]

Tok rezin

┌─────────────────────────────────────────────────────────────┐
│ Stran: TaskListPage │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Rezina: main │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ Vzorec: entity-table (iz TaskBrowser) │ │ │
│ │ │ - Stolpci: title, status, dueDate │ │ │
│ │ │ - Akcije: VIEW, EDIT │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Rezina: sidebar │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ Vzorec: filter-panel (iz FilterPanel) │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘

Vec upodobitev v isto rezino

Ce vec lastnosti upodablja v isto rezino, se zlagajo (kasnejsi nadomesti ali doda, odvisno od tipa vzorca):

// Lastnost A
["render-ui", "main", { "type": "stats", ... }]

// Lastnost B (kasneje na strani)
["render-ui", "main", { "type": "entity-table", ... }]

Navigacija med stranmi se izvaja prek ucinka navigate v lastnostih.

Ucinek navigate

["navigate", "/tasks/:id", { "id": "@payload.taskId" }]

Format: ["navigate", pot, parametri?]

ArgumentOpis
potCiljna pot strani (lahko vkljucuje dinamicne segmente)
parametriNeobvezni objekt za zapolnitev dinamicnih segmentov

Primeri navigacije

Preprosta navigacija:

["navigate", "/dashboard"]

Z ID-jem entitete:

["navigate", "/tasks/@entity.id"]

Z obremenitvijo:

["navigate", "/tasks/:id", { "id": "@payload.taskId" }]

Gnezdena pot:

["navigate", "/users/:userId/tasks/:taskId", {
"userId": "@entity.assigneeId",
"taskId": "@entity.id"
}]

Navigacija se tipicno zgodi po spremembi stanja:

{
"from": "editing",
"to": "saved",
"event": "SAVE",
"effects": [
["persist", "update", "Task", "@entity.id", "@payload"],
["notify", "Task saved!", "success"],
["navigate", "/tasks/@entity.id"]
]
}

Glej Ucinki za vec podrobnosti.


Zacetna stran

Oznacite stran kot vstopno tocko z isInitial:

{
"name": "HomePage",
"path": "/",
"isInitial": true,
"traits": [
{ "ref": "WelcomeBanner" }
]
}

Obnasanje:

  • Aplikacija najprej nalozi to stran
  • Preusmeritve iz korena (/) vodijo sem
  • Samo ena stran naj bo oznacena kot zacetna na Orbital enoto

Preverjanje strani

Strani se preverjajo ob prevajanju s temi pravili:

Obvezna polja

  • name - Mora biti v PascalCase
  • path - Mora se zaceti z /, samo veljavni znaki
  • traits - Mora imeti vsaj eno referenco na lastnost

Napake pri preverjanju

NapakaOpis
PageMissingNameIme strani je obvezno
PageMissingPathPot strani je obvezna
PageInvalidPathPot ne ustreza vzorcu
PageEmptyTraitsSeznam lastnosti ne sme biti prazen
PageInvalidTraitRefReferencirana lastnost ne obstaja
PageInvalidViewTypeviewType ni na veljavnem seznamu
PageDuplicatePathDruga stran uporablja isto pot

Celoten primer

Celoten primer strani z vec lastnostmi:

orbital TaskManagement {
entity Task {
id : string!
title : string!
status : string
assigneeId : string
}
trait TaskBrowser -> Task {
initial: idle
state idle {
INIT -> viewing
(fetch Task { })
(render-ui main { type: "entity-table", entity: "Task", fields: ["title", "status", "assigneeId"], columns: ["title", "status", "assigneeId"], itemActions: [{ event: "VIEW", label: "View" }] })
}
state viewing {
VIEW -> viewing
(navigate "/tasks/@payload.id" { id: "@entity.id" })
}
}
trait TaskViewer -> Task {
initial: loading
state loading {
INIT -> viewing
(fetch Task { id: "@payload.id" })
(render-ui main { type: "detail-panel", entity: "Task", fields: ["title", "status", "assigneeId"] })
}
state viewing {
EDIT -> viewing
(navigate "/tasks/@entity.id/edit")
BACK -> viewing
(navigate "/tasks" { id: "@entity.id" })
}
}
page "/tasks" -> TaskBrowser
page "/tasks/:id" -> TaskViewer
}

Kljucna nacela

  1. Strani vodene z lastnostmi - Strani so vsebniki za reference na lastnosti. UI izhaja iz ucinkov render-ui v lastnostih, ne iz definicij strani.

  2. Arhitektura rezin - UI tece skozi standardizirane rezine (main, sidebar, modal), kar omogoca sestavo postavitev brez trdega kodiranja.

  3. Pot kot pogodba - Pot strani je primarni vmesnik - definira URL, na katerega uporabniki navigirajo.

  4. Eksplicitna vezava entitete - linkedEntity na referencah lastnosti naredi relacije entitet eksplicitne.

  5. Brez stanja strani - Strani so zgolj sestavne. Vse stanje zivi v avtomatih stanj lastnosti.

  6. Navigacija vodena z ucinki - Navigacija je ucinek, ki ga sprozijo prehodi lastnosti, ne lastnost strani.


Povzetek

Sistem strani v Orb zagotavlja:

  1. Usmerjanje - Navigacija na osnovi poti z dinamicnimi segmenti
  2. Sestava lastnosti - Vec lastnosti na stran, vsaka prispeva UI
  3. Rezine - Poimenovana podrocja za postavitev UI (main, sidebar, modal itd.)
  4. Tipi pogledov - Semanticni namigi za namen strani (list, detail, dashboard)
  5. Navigacija - Usmerjanje med stranmi, vodeno z ucinki
  6. Vezava entitete - Eksplicitne relacije entitet prek linkedEntity
  7. Preverjanje - Prevajalnik uveljavlja edinstvenost poti in obstoj lastnosti

Strani so plast za usmerjanje in sestavo - definirajo, kam uporabniki gredo, medtem ko lastnosti definirajo, kaj se dogaja, in entitete definirajo, kateri podatki so vpleteni.