Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/guardianship/gated.js

    r792af53 rd56d471  
    6060  'shaer:externalPlayback': 'external_playback',
    6161};
    62 /**
    63  * De gates die deze Klonkt kent, met hun SOORT.
    64  *
    65  * Wat gated wordt is een ontwerpkeuze van de implementatie: de FEP levert het
    66  * mechanisme (voorstel, tally, settle) en een paar voorbeelden, niet de lijst.
    67  * Deze catalogus is die lijst, op een plek. Een gate erbij hoort een regel data
    68  * te zijn en geen nieuw stuk scherm.
    69  *
    70  * `kind` is niet decoratief. De gates verschillen in hoe ze werken en dat mag
    71  * een guardian niet hoeven raden:
    72  *
    73  *   setting     een stand, aan of uit, terug te draaien
    74  *   perRequest  geen stand maar een stroom beslissingen (5.3 volgverzoeken)
    75  *   handover    draagt gezag OVER; onomkeerbaar zodra de ward hem gebruikt
    76  *
    77  * `needs` is de trap uit shaer-ahy: zien < afspelen. Je kunt niet afspelen wat
    78  * je niet mag zien, dus dat tweede is pas te bewegen als het eerste openstaat.
    79  */
    80 export const GATE_CATALOGUE = [
    81   { feature: 'shaer:externalEmbeds', kind: 'setting', reversible: true },
    82   { feature: 'shaer:externalPlayback', kind: 'setting', reversible: true, needs: 'shaer:externalEmbeds' },
    83   // Altijd aan voor een ward (5.3): niet te verzetten, wel te tonen. Een paneel
    84   // dat alleen verstelbare dingen laat zien verzwijgt de helft van wat er geldt.
    85   { feature: 'shaer:follows', kind: 'perRequest', reversible: true, fixed: true },
    86 ];
    87 
    88 /**
    89  * De gates van een ward als rijen voor het paneel. Puur, zodat de regels
    90  * getoetst kunnen worden zonder database of scherm.
    91  *
    92  * @param settings       {feature: true|false|null} -- null is ONBEKEND, niet uit
    93  * @param guardianCount  aantal guardians, of null als we het niet weten
    94  * @param proposals      [{feature, value, status}] lopende voorstellen
    95  * @param waiting        {feature: aantal} wat er per gate op een besluit wacht
    96  */
    97 export function gateRows({ settings = {}, guardianCount = null, proposals = [], waiting = {} } = {}) {
    98   return GATE_CATALOGUE.map((g) => {
    99     const value = Object.prototype.hasOwnProperty.call(settings, g.feature) ? settings[g.feature] : null;
    100     // De trap: het bovenliggende moet OPEN staan. Onbekend telt niet als dicht --
    101     // bij een ward elders kennen we de stand niet, en verbergen betekende daar
    102     // ooit dat een voorstel nooit geopend kon worden.
    103     const blockedBy = g.needs && settings[g.needs] === false ? g.needs : null;
    104     return {
    105       feature: g.feature,
    106       kind: g.kind,
    107       reversible: !!g.reversible,
    108       value,
    109       // Vast staat vast: tonen mag, verzetten niet.
    110       adjustable: !g.fixed && !blockedBy,
    111       blockedBy: blockedBy || undefined,
    112       // Zonder bekend aantal guardians GEEN drempel verzinnen. Nul of een gok
    113       // leest als een feit, en dit is precies waar een guardian op afgaat.
    114       threshold: (guardianCount && guardianCount > 0)
    115         ? { need: thresholdFor(guardianCount), of: guardianCount } : null,
    116       proposal: proposals.find((p) => p.feature === g.feature) || undefined,
    117       waiting: waiting[g.feature] || undefined,
    118     };
    119   });
    120 }
    121 
    12262export function featureColumn(feature) {
    12363  return Object.prototype.hasOwnProperty.call(FEATURES, feature) ? FEATURES[feature] : null;
     
    299239
    300240export default {
    301   GATE_CATALOGUE, gateRows,
    302241  tallyGatedSetting, thresholdFor, featureColumn, recordGatedVote, gatedProgress, GATED_WINDOW_MS,
    303242  parseGatedSetting, buildGatedOffer, rememberGatedOffer, recallGatedOffer,
Note: See TracChangeset for help on using the changeset viewer.