Naar hoofdinhoud gaan

Definitie van een modelgestuurde weergave

Schema-id: model-driven-view@2 Machineleesbaar schema: model-driven-view.schema.json

Vervangen versie: model-driven-view@1 (model-driven-view-v1.schema.json) blijft gepubliceerd en geregistreerd, zodat een oplossing die er al tegen is uitgerold, nog steeds wordt gevalideerd tegen het schema waarvoor ze is geschreven. Versie 2 voegt uitsluitend optionele eigenschappen toe — de tabel Structuur hieronder is de actuele lijst — dus elke v1-definitie is ook een geldige v2-definitie en er hoeft niets te worden herschreven.

De canonieke weergave van een weergave van modelgestuurde apps (sectie 6.7) — een lijst met records in tabelvorm, met kolommen, filters en sorteringen.

Structuur​

VeldTypeVerplichtOpmerkingen
logicalNametekenreeksjaMet uitgeversvoorvoegsel, in kleine letters snake_case.
displayNametekenreeksjaLeesbare naam van de weergave.
entitytekenreeksjaDe logische naam van de eigenaar-tabel.
descriptiontekenreeksneeDe regel die onder de titel in de titelbalk van de weergave wordt getoond.
icontekenreeksneeHet pictogram in de titelbalk van de weergave.
viewTypetekenreeksneeWaar de weergave voor dient: Public (standaard), Lookup, QuickFind, Associated, QuickView, Card, SeedData.
seedDataKindtekenreeksbij een SeedData-weergaveVerplicht bij een SeedData-weergave en geweigerd bij elke andere: Configuration (rijen die de oplossing nodig heeft om te werken; een import brengt ze altijd mee, ook in Productie) of Demonstration (voorbeeldrijen; alleen geïmporteerd als Demonstratiegegevens opnemen is aangevinkt, nooit in Productie). In het pakket meegenomen als de kind van het seedgegevensdocument.
columnsarrayjaLogische veldnamen die als kolommen worden getoond.
filtersarrayneePlatte filterclausules (met EN gecombineerd): field, operator en (bij operators met een waarde) value.
filterGroupobjectneeEen hiërarchische EN/OF-filterboom (in de stijl van Geavanceerd zoeken), met EN gecombineerd met filters.
sortsarrayneeSorteerclausules: field, descending.
actionsarrayneeOntwerpbare acties voor de opdrachtbalk.
hierarchyobjectneeAanwezig wanneer de weergave als boom wordt gerenderd in plaats van als raster.
calendarobjectneeAanwezig wanneer de weergave als kalender wordt gerenderd in plaats van als raster. Nooit samen met hierarchy.
columnPropertiesarrayneeHoe afzonderlijke kolommen worden gepresenteerd — kop, breedte, formaat, uitlijning, besturingselement. Beknopt.
commandOverridesarrayneeWat deze weergave verandert aan de opdrachten die het platform bezit.
commandOrderarrayneeEén balk, één volgorde: ingebouwde opdrachten en opdrachten van de maker door elkaar, op id.
rowSelectionbooleaansneeOf rijen een selectievakje hebben. Standaard true.

Operators: Equals, NotEquals, Contains, GreaterThan, LessThan, IsNull, IsNotNull. Elk veld waarnaar wordt verwezen (kolommen, filters, voorwaarden in filtergroepen, sorteringen), moet op de tabel bestaan.

viewType​

Het type van een weergave zegt welk oppervlak haar leest. Eén tabel kan tegelijk een standaardweergave van elk type hebben, omdat ze verschillende vragen beantwoorden:

WaardeWaar het voor dient
PublicDe normale lijstpagina van de tabel. Dit is de standaard, en wat een definitie zonder viewType is.
LookupDe kolommen die in het resultatenpaneel van een zoekveld worden getoond — meestal twee tot vier.
QuickFindDe zoekkolommen: de kolommen waartegen een getypte zoekopdracht wordt vergeleken. De columns ervan zijn de doorzochte set; de filters en sorteringen worden niet gelezen.
SeedDataDe rijen en kolommen die met de oplossing meereizen (PF22). Nooit getoond: een export van de oplossing voert haar uit — haar filters bepalen de rijen, haar columns de velden — en verpakt het resultaat als een seed-data@1-document, dat een import op id upsert. Een tabel met meerdere gebruikt haar standaardweergave, anders de eerste op logische naam.
AssociatedHet subraster met gerelateerde records. Gereserveerd — er rendert nog niets.

Een zoekveld dat geen weergave noemt, kiest er automatisch een: de standaardweergave van het type Lookup van de doeltabel, anders de standaardweergave van het type Public, ingekort tot de eerste drie kolommen, anders alleen het primaire veld van de tabel. Een zoekopdracht zonder QuickFind-weergave zoekt alleen in het primaire veld. Zoekkolommen moeten tekstvelden zijn, omdat de vergelijking een hoofdletterongevoelige "bevat" is.

calendar (een weergave die als kalender wordt gerenderd)​

Een weergave met een calendar-blok tekent haar records op een dag-, week- of maandblad geplaatst — op basis van twee van haar eigen datumvelden — in plaats van als raster. Afwezig is het raster, precies zoals bij hierarchy, dus elke opgeslagen weergave blijft geldig. Een weergave met beide blokken wordt geweigerd: een weergave wordt op één manier getekend.

Het is een toewijzing, geen gegevensmodel. Er is geen boekingstabel en geen afspraaktype: elke tabel met een datum kan op een kalender worden uitgezet, en welke van haar datums "begint" betekent, bepaalt de maker.

VeldTypeVerplichtOpmerkingen
starttekenreeksjaHet datum/tijd-veld waarop een blok wordt geplaatst. De enige verplichte rol: een record zonder begin kan niet op een blad worden geplaatst, dus er is niets om op terug te vallen. Een systeemveld is toegestaan — created_at_utc zet records uit op het moment waarop ze binnenkwamen.
endtekenreeksneeHet datum/tijd-veld waarop een blok eindigt. Afwezig is bedoeld voor een tabel die een moment vastlegt in plaats van een periode, en maakt elk blok defaultDurationMinutes lang — niet nul, want op een blok zonder hoogte kun je niet klikken.
titletekenreeksneeHet veld waaruit de eerste regel van het blok wordt gelezen. Afwezig betekent het primaire veld van de tabel, dat een raster, een zoekveldpaneel en een kruimelpad al tonen.
categorytekenreeksneeEen keuzeset-, status- of redenveld waarvan de opties de blokken kleuren en de legenda vullen.
bookedFortekenreeksneeHet veld dat noemt voor wie het tijdslot is, bescheiden onder de titel getoond. Elk type: een zoekveld wordt omgezet naar de naam van de doelrecord.
notetekenreeksneeHet veld dat wordt getoond op een blok dat hoog genoeg is voor een derde regel, en anders in de tooltip ervan.
defaultScaletekenreeksneeOp welk blad de weergave opent: Day, Week (standaard) of Month.
startHourgeheel getalneeHet eerste uur dat de dag- en weekbladen tonen, 0–23. Standaard 0.
endHourgeheel getalneeHet uur waarop die bladen eindigen, 1–24, en groter dan startHour. Standaard 24.
defaultDurationMinutesgeheel getalneeHoe lang een tijdslot is wanneer de lezer op een leeg slot klikt — waarmee de nieuwe record binnenkomt — en de hoogte van elk blok in een weergave die geen end toewijst. Minimaal 1; standaard 60.

🔴 start en end moeten datum/tijd-velden zijn, en category moet kleuren hebben. Beide worden bij het opslaan geweigerd, omdat beide ongemerkt op het scherm falen: een start die een tekstkolom is, tekent een leeg blad, en dat lees je als "er is deze week niets geboekt" — precies de conclusie waarop een lezer zal handelen en die hij niet kan controleren. De kleur staat op de eigen opties van de keuzeset, en daardoor kun je "Examen is oranje" één keer zeggen en lezen de kalender, een rastercel en een grafiek het allemaal op dezelfde manier.

startHour en endHour maken het verschil tussen een bruikbaar boekingsblad en een blad dat voor twee derde leeg opent: een kliniek die van 8 tot 7 werkt, wil geen zestien rijen middernacht. Ze zeggen waar het blad opent — de lezer wisselt nog steeds van schaal en beperkt de uren vanuit de eigen kop van het blad, omdat het venster van de lezer is en niet van de maker.

Er is bewust geen rol resource. De bladen tonen dagen naast elkaar, dus een veld dat de kolom noemt waarin een blok thuishoort, zou een toewijzing zijn die een maker kan maken en vervolgens niets ziet doen. Die komt met de as die haar tekent.

hierarchy (een weergave die als boom wordt gerenderd)​

Een weergave met een hierarchy-blok tekent haar records genest via een zoekveld — een organigram met de mensen in elke eenheid, een categorieboom, een stuklijst — in plaats van als raster. Afwezig is het raster dat elke weergave altijd al was, en daarom blijft elke opgeslagen weergave geldig.

Waar een boom voor dient, is navigatie: rijen worden venster voor venster opgehaald, dus een organigram van vijftigduizend mensen opent zonder er iets van te laden.

VeldTypeVerplichtOpmerkingen
nodeTypesarrayjaElke soort knooppunt die de boom kan tekenen. Minstens één.
orderarrayneeDe volgorde waarin segmenten onder één knooppunt worden getekend, op id van het knooppunttype. Afwezig betekent de volgorde van declaratie.
rootPickerbooleanneeOf een lezer de boom op één knooppunt mag richten — openen op een stad in plaats van op de hele organisatie.
expandRootsbooleanneeOf het eerste niveau bij het laden openklapt. Standaard true.

Elk item in nodeTypes:

VeldTypeVerplichtOpmerkingen
idtekenreeksjaHoe dit type binnen het blok heet — unit, person. Hier uniek, en waarnaar order en elke childOf.of verwijzen. Dezelfde tabel kan twee keer in één organigram voorkomen, en daarom is dit het eigen woord van de maker in plaats van een tabelnaam.
entitytekenreeksjaDe tabel waarvan deze knooppunten records zijn.
childOfobjectjaHoe dit type onder zijn bovenliggende knooppunt hangt — zie hieronder.
labeltekenreeksneeHet veld waarvan de waarde de regel van het knooppunt is. Afwezig betekent het primaire veld van de tabel.
secondarytekenreeksneeHet veld dat bescheiden na het label wordt getoond. Afwezig betekent het eigen secundaire veld van de tabel; een lege tekenreeks betekent geen — bij een eenheid is de naam van de bovenliggende eenheid de rij er direct boven, dus een organigram is een plek waar de standaard tweede regel van een tabel verkeerd is.
icontekenreeksneeHet symbool op de rij. Afwezig betekent het eigen pictogram van de tabel.
imagebooleanneeOf de rij de afbeelding van de record toont.
detailobjectneeWat het deelvenster naast het organigram vult wanneer er een is geselecteerd. Afwezig betekent het hoofdformulier van de tabel.

childOf neemt een field — het zoekveld op de tabel van dit type dat de bovenliggende record bevat — en een optionele of, het knooppunttype waaronder het hangt, op id.

🔴 Precies één knooppunttype laat of weg. Dat is de eigen tabel van de boom die onder zichzelf nest, en haar records met een lege bovenliggende record vormen het hoogste niveau van het organigram; elk ander type noemt waaronder het hangt. Heterogene knooppunten zijn het algemene geval en geen aanhangsel: eenheden, en dan de mensen daarin is hetzelfde mechanisme als provincie → stad → filiaal, gemodelleerd als drie tabellen.

Het zoekveld dat childOf.field noemt, moet naar de tabel van het bovenliggende type wijzen — naar zijn eigen tabel voor het roottype. Een zoekveld dat ergens anders naartoe wijst, beschrijft geen nesting en wordt bij het opslaan geweigerd in plaats van een niveau te renderen waar niets onder hangt.

detail neemt een kind van Form (het eigen formulier van de tabel, opgeslagen via het schrijfpad van het recordformulier), Card (een Card-weergave die is ingedeeld om te lezen in plaats van in te typen, wat iemand onder een eenheid meestal wil) of None (voor een type dat alleen structuur is), plus een optionele name voor welk formulier of welke Card-weergave.

columnProperties (hoe een kolom wordt gepresenteerd)​

Een beknopte lijst: alleen kolommen die een maker heeft geconfigureerd, komen erin voor, en een kolom zonder vermelding wordt alleen op basis van de veldmetadata gerenderd. Ze staat naast columns in plaats van die om te zetten in een lijst met objecten, zodat elke v1-definitie geldig blijft en elke lezer die alleen hoeft te weten welke kolommen een weergave heeft, onaangeroerd blijft.

VeldTypeVerplichtOpmerkingen
fieldtekenreeksjaDe kolom die dit configureert. Moet een van de columns van de weergave zijn.
labeltekenreeks | nullneeOverschrijving van de kop. Afwezig gebruikt de weergavenaam van het veld.
widthgeheel getal | nullneeBreedte in pixels, 40–1200. Afwezig laat de kolom zijn eigen grootte bepalen.
formattekenreeks | nullneeWaardeformaat. Voor een DateTime-kolom dezelfde set tokens die de datumbesturingselementen van het formulier accepteren (yyyy, yy, MM, dd, HH, mm, ss) — één opmaakvocabulaire in het hele product.
aligntekenreeks | nullneestart, center of end. Logisch, niet links/rechts, zodat het de leesrichting volgt (§6.13.6).
controlTypetekenreeks | nullneeHet besturingselement waarmee de kolom wordt gerenderd — een schakelaarsymbool voor een booleaanse waarde, een Perzische datum voor een datum.

controlType neemt Text, TextArea, Check, Toggle, Date, DateTime, Time, PersianDate, PersianDateTime, PersianTime, Lookup, PolymorphicLookup, Dropdown of Label. Afwezig neemt de eigen standaard van het veld over, en daarna die van het gegevenstype.

🔴 Het wordt altijd alleen-lezen gerenderd. Een raster heeft geen inline bewerken, dus een schakelaar hier toont een toestand in plaats van een klik te accepteren. Het is ook de enige manier waarop een kolom Jalali kan renderen in een Gregoriaanse tenant, omdat format een patroon is zonder bijbehorende kalender.

commandOverrides (een opdracht wijzigen die het platform bezit)​

Wat deze weergave verandert aan de ingebouwde opdrachten — Nieuw, Bewerken, Verwijderen, Vernieuwen, Opslaan, Opslaan en sluiten, Vastmaken. Afwezig verandert niets, en dat is wat elke weergave betekent die is gemaakt voordat dit bestond.

VeldTypeVerplichtOpmerkingen
commandtekenreeksjaDe stabiele id van de opdracht die wordt overschreven.
labeltekenreeksneeVervangt het label van het platform. Afwezig behoudt het — inclusief de vertalingen, die een getypte overschrijving onvermijdelijk kwijtraakt.
icontekenreeksneeVervangt het symbool van het platform.
initiallyHiddenbooleanneeOf de opdracht verborgen begint.
initiallyDisabledbooleanneeOf de opdracht uitgeschakeld begint.

🔴 Gekoppeld op een stabiele opdracht-id, nooit op label of positie. De id is de eigen naam van het platform en verandert niet als het label verandert, dus een overschrijving kan niet loskomen van wat ze overschrijft zodra iemand het bewerkt — en een ingebouwde opdracht kan later worden hernoemd of buiten gebruik gesteld zonder dat elk opgeslagen document moet worden bijgewerkt, want een overschrijving die een opdracht noemt die niet meer bestaat, wordt gewoon genegeerd.

🔴 Een maker mag verbergen en uitschakelen, nooit tonen of inschakelen. De Player verbergt Nieuw voor iemand die niets mag aanmaken en schakelt Verwijderen uit als er niets is geselecteerd; een overschrijving die dat ongedaan kan maken, zou een balk bouwen die aanbiedt wat de server zal weigeren.

"Initially" (aanvankelijk) is waar het om draait. Het is de toestand waarin de balk opent, geen permanente toestand — een bedrijfsregel of het eigen script van de opdracht kan haar daarna tonen. Een opdracht die voor iemand nooit mag verschijnen, is iets anders; dat is een recht, beslist op de server, waar een browser er niet tegenin kan gaan.

commandOrder (één balk, één volgorde)​

De ingebouwde opdrachten en die van de maker zelf, door elkaar zoals de maker ze heeft geordend, op id.

Een expliciete lijst in plaats van een rangnummer op elke opdracht, omdat een rangnummer op elke opdracht moet worden herschreven zodra er een verschuift, en twee opdrachten hetzelfde nummer kunnen hebben — een gelijkstand die de renderer dan anders zou beslechten dan de ontwerper deed.

🔴 Alles wat deze lijst niet noemt, behoudt zijn natuurlijke plaats, aan het einde. Daardoor overleeft de regel de tijd: een ingebouwde opdracht die volgend jaar aan het platform wordt toegevoegd, of een opdracht die een upgrade toevoegt, verschijnt in plaats van te verdwijnen omdat een opgeslagen volgorde ouder is. Een id die iets noemt wat niet meer bestaat, wordt overgeslagen.

rowSelection (of rijen een selectievakje hebben)​

Standaard true, en wat elke weergave betekent die is gemaakt voordat dit bestond: het raster krijgt een kop om alles te selecteren en een vakje per rij, en daarop werkt de opdrachtbalk.

false is voor een weergave die alleen ooit wordt gelezen — een lijst waaruit niemand verwijdert of opnieuw toewijst — waar een selectievakje een meervoudige selectie aanbiedt waar het oppervlak niets mee kan en die een kolom aan breedte kost.

filterGroup (hiërarchisch EN/OF)​

Een filterGroup is een recursief knooppunt dat zijn leden combineert met een connector:

VeldTypeVerplichtOpmerkingen
connectortekenreeksjaAnd (alle leden komen overeen) of Or (een willekeurig lid komt overeen).
conditionsarrayneeEindvoorwaarden (field, operator, value) in deze groep.
groupsarrayneeGeneste subgroepen (dezelfde vorm), voor willekeurige EN/OF-nesting.

Voorbeeld​

{
"logicalName": "par_invoice_active",
"displayName": "Active Invoices",
"entity": "par_invoice",
"viewType": "Public",
"columns": ["par_name", "par_total"],
"filters": [ { "field": "par_total", "operator": "GreaterThan", "value": 0 } ],
"filterGroup": {
"connector": "And",
"conditions": [ { "field": "par_name", "operator": "Contains", "value": "INV" } ],
"groups": [
{
"connector": "Or",
"conditions": [
{ "field": "par_total", "operator": "GreaterThan", "value": 1000 },
{ "field": "par_total", "operator": "IsNull" }
]
}
]
},
"sorts": [ { "field": "par_name", "descending": false } ]
}

Voorbeeld — een zoekveldweergave​

{
"logicalName": "par_contact_pick",
"displayName": "Contact Lookup",
"entity": "par_contact",
"viewType": "Lookup",
"columns": ["par_name", "par_email", "par_city"],
"sorts": [ { "field": "par_name", "descending": false } ]
}

Voorbeeld — een weergave voor snel zoeken​

Alleen columns wordt gelezen: dat zijn de kolommen waartegen een getypte zoekopdracht wordt vergeleken.

{
"logicalName": "par_contact_find",
"displayName": "Contact Quick Find",
"entity": "par_contact",
"viewType": "QuickFind",
"columns": ["par_name", "par_email", "par_accountnumber"]
}