Workbench Plugin Contract v1
Zavezujoča pogodba z oznako različice, prek katere paket prispeva k delovni površini: k vrstici
dejavnosti, stranski vrstici, pomožni vrstici, spodnji plošči, vrstici stanja, ukazni vrstici in
paleti ukazov ter k seznamu modulov. Ta stran je povzetek za upravljavce in avtorje paketov.
Zavezujoča in popolna specifikacija (API, življenjski cikel, vedenje ob napakah, primer) je v
repozitoriju, v angleščini: lib/plugins/wkfluentui/docs/contract-v1.md.
Sorodno: Pregled wkfluentui · Pogodba o slogih
Zakaj ta pogodba obstaja
Pred Contract v1 je paket k delovni površini prispeval prek petih ločenih mehanizmov, ki jih je
lupina prepoznala samo z method_exists() (getModuleInfo(), getShellRegions(),
getShellBadge(), getShellViews() in dogodek WKFLUENTUI_ADMIN_COMMANDS). Vsaj eden od
njih ni prenašal nobene prave informacije več: vrnjene vrednosti getShellRegions() ne prebere
nobena koda – signal je bil že sam obstoj metode. Paket ni mogel vprašati, ali delovna površina
spodnjo ploščo sploh podpira, preden jo je uporabil, in ni imel mesta, kjer bi pravico opredelil
ožje kot »ali ta uporabnik sploh sme odpreti zaslon«.
Nič od tega ni izklopljeno. Paket, ki uporablja katero od petih starih metod, deluje
nespremenjeno naprej: prilagojevalnik (helper/legacyadapter.php) jih samodejno prevede v isto
obliko opisa, ki jo uporablja Contract v1.
Trije načini vključitve
| Način | Pomen |
|---|---|
classic | golo do=admin (brez mode=fluentui) ali navadna stran wikija brez oznake <module> – delovna površina ne sodeluje |
contributed | običajni primer: wkfluentui okoli vsebine, ki jo da zaslon, zgradi celotno lupino, in to izključno iz prispevkov, ki jih je zaslon prijavil |
selfHosted | paket sam pokliče widgets→workbench() iz svoje metode html() – prijavi ga zgolj najava brez kind |
Sedem področij
| Področje | Kje se prikaže | Opomba |
|---|---|---|
activityBar | vrstica dejavnosti za preklapljanje modulov | prispevati je mogoče samo značko – ikona sama pride samodejno iz seznama nameščenih skrbniških paketov |
sidebar | leva stranska vrstica s pogledi | ime kot v dosedanjem registru pogledov |
auxbar | desna pomožna vrstica s pogledi (ali drugi dokument v razdeljenem pogledu) | prav tako |
bottomPanel | spodnja plošča | v dosedanjem registru panel; preimenovano, ker se golo ime zunaj datoteke, ki ga definira, bere kot »katera koli plošča« |
statusBar | vrstica stanja | prispevek kind: view navede eno dejstvo o tem, kje je bralec – glejte spodaj |
commandPalette | ukazna vrstica (vidna) in paleta ukazov (z iskanjem, Ctrl+Shift+P) | glejte spodaj |
adminModule | seznam modulov za <module name=„…“> | ustreznica getModuleInfo() v v1 |
Vrstica stanja sprejme dejstva, ne oznak HTML
Vsa druga področja sprejmejo zaupanja vreden HTML klicatelja; to sprejme navadno besedilo, posebne znake v njem pa za HTML kodira lupina. Vrstica stanja ima eno vrstico, prispevek, ki bi lahko odprl element, pa bi zasedel vse, kar ostane od nje.
| Polje | Pomen |
|---|---|
label | besedilo |
href | kam vodi, če kam vodi |
disabledReason | prikaže se kot naslov (kratek namig ob prehodu z miško) |
badge.tone | warning ali error za obarvanje |
priority | kako pomemben je podatek – glejte spodaj |
Veljavnost je enaka kot pri ukazu: prispevek, katerega lastnik je prikazani zaslon, se prikaže; prispevek, katerega lastnik sploh nima skrbniškega zaslona, velja povsod; prispevek, ki pripada drugemu zaslonu, se ne prikaže. To je dobesedno isto preverjanje, ne drugo z enakim besedilom.
Dve meji za preživetje, izpeljani iz ene številke. Pod 1024 px odpade vse, kar nima
prioritete; pod 768 px poleg tega vse pod helper_plugin_wkfluentui_widgets::STATUS_PHONE_PRIORITY
(80). Prispevek sme priority navesti sam; vrednost se omeji na razpon 10–95, da noben prispevek
ne prehiti poti nazaj iz delovne površine, prispevek brez navedbe pa dobi 85.
priority ni order. order razvršča znotraj področja, priority odloča, kaj ostane
pri ozkem zaslonu. Če bi bili eno polje, bi nov vrstni red v stranski vrstici spremenil, kaj telefon
pokaže v vrstici stanja.
Pogled sme ''html'' podati kot callable
Tabela deskriptorja navaja html kot string | callable; viewStack() pogled s praznim
telesom izpusti.
Razlika ni kozmetična. Dogodek za prijavo prispevkov se sproži enkrat, pri skrbniškem zaslonu pa
še preden je zaslon izrisan. Niz mora biti torej mogoče izračunati ob prijavi, callable pa se
razreši ob sestavljanju, torej potem, ko je lastna metoda html() že tekla. Prav zato
obstaja.
Callable, ki vrže izjemo, stane samo ta pogled, napaka pa se zabeleži v dnevnik.
Zmožnost: workbench.view.html.callable.
Zaslon sme svoje delovne predmete prispevati kot zavihke
Register vrstice z zavihki vodi za vsako delovno območje urejen seznam neprosojnih nizov. Vrstica zato poleg modulov poimenuje tudi predmete, s katerimi dela zaslon – pri urejevalniku nastavitev je tak predmet območje, pri delovni površini za poizvedbe poizvedba. To je enkrat zgrajeno v gostitelju, ker bi bila alternativa v obeh primerih druga vrstica z zavihki v vsebini.
| Pravilo | Zakaj |
|---|---|
Oznako lupina razširi v <modul>:<predmet> | shranjena oznaka tako vedno pove, kdo jo zna prevesti nazaj |
| Zavihki zaslona nadomestijo njegov zavihek modula | zavihek za »upravitelja nastavitev« ob zavihkih za območja, ki jih upravlja, bi bil druga raven zavihkov v preobleki prve |
| Kontrolnike za premikanje dobijo samo zavihki modulov | obrazec pošlje vidni vrstni red v seznam modulov; oznaka predmeta tam ob naslednjem klicu ne bi bila razrešljiva in bi s seboj odnesla premeščene zavihke modulov |
| Zaslon sam zapiše svoje pripenjanje | lupina namenoma ne ve, kaj oznaka poimenuje |
| Zavihek brez naslova ali naslova URL se zavrže | ne bi bil dosegljiv, ne bi ga bilo mogoče shraniti med zaznamke in ga ne bi bilo mogoče ločiti od soseda |
Zmožnost: workbench.screen.tabs.v1.
Štiri kljuke za zaslon vgrajenega paketa
Nadomestni zaslon wkfluentui izriše za vgrajeni paket DokuWikija, zato ga pogodba v1 ne
doseže: nativeViewsFor($owner) primerja lastnika prispevka s prikazanim zaslonom – lastnik bi bil
wkfluentui, zaslon config, in ta dva se nikoli ne srečata. Prijava pod imenom vgrajenega
paketa bi pomenila, da se ta paket izdaja za drugega.
Tak zaslon zato neposredno odgovori na štiri neobvezne metode: commands(), views(),
statusItems() in tabs(). Vse štiri tečejo skozi eno zavarovano točko, zato napaka stane
natanko ta en odgovor in se zabeleži v dnevnik.
Lastni pogled zaslona izpodrine splošni pogled lupine za isto področje. Zaslon, ki izriše lastno
navigacijo, ne sme poleg nje dobiti še splošnega kazala, zaslon z lastnim stolpcem s kontekstom pa ne
še plugin.info.txt. To je isto pravilo, ki že velja za paket, ki gosti delovno površino sam – in
ista vrsta napake: nič ne spodleti, pojavi se preprosto druga stranska vrstica.
Pravice
permission je callable (brez argumentov, vrne bool) ali null. Dodatno k ACL, nikoli namesto
nje – skrbniški zaslon, na katerem prispevek temelji, ostane nespremenjeno zaščiten z lastnim
preverjanjem DokuWikija isAccessibleByCurrentUser(). Vrednost permission, ki ni niti null
niti klicljiva, velja za napačno prijavo in prispevek izključi – ne za manjkajočo, ki bi ga
spustila skozi. Preverjanje, ki vrže izjemo, velja za zavrnitev, ne za sesutje, in se ne zabeleži
kot napaka: »ta uporabnik tega ne sme videti« je mehanizem, ki deluje, ne okvara.
Prepoznavanje zmožnosti
helper_plugin_wkfluentui_capabilities::has($name) – ime, ki ga paket preveri, preden zmožnost
uporabi, namesto da bi preverjal številko različice ali razred. Razlog: zmožnost je lahko izdana
pozneje kot različica, ki jo je napovedala.
Dve dodatni imeni:
| Zmožnost | Pomen |
|---|---|
workbench.view.html.callable | html pogleda je lahko callable in se razreši ob sestavljanju |
workbench.screen.tabs.v1 | zaslon sme svoje delovne predmete poimenovati v eni vrstici z zavihki |
Med dogodkom za prijavo has() odgovarja samo z osnovnim besediščem – in to je vsa resnica, ne
kompromis. Ko teče lastna obravnava dogodka, provides nobenega drugega prispevajočega paketa še
ni zbran. Vprašanje po zmožnosti tujega paketa v tistem trenutku nima odgovora in dobi false.
all() se za čas dogodka označi, list() pa medtem odgovarja z osnovnim besediščem, ne da bi
si rezultat zapomnil. Poizvedba o zmožnosti iz lastne obravnave dogodka zato dogodka ne sproži
znova.