[{"data":1,"prerenderedAt":1241},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Fclient\u002Fadmin":189},[4],{"title":5,"path":6,"stem":7,"children":8,"page":52},"Fr","\u002Ffr","fr",[9],{"title":10,"path":11,"stem":12,"children":13},"Qu'est-ce que Fougere","\u002Ffr\u002Fdocs","fr\u002Fdocs\u002Findex",[14,15,19,23,27,31,53,78,123,148],{"title":10,"path":11,"stem":12},{"title":16,"path":17,"stem":18},"Démarrer","\u002Ffr\u002Fdocs\u002Fgetting-started","fr\u002Fdocs\u002F01.getting-started",{"title":20,"path":21,"stem":22},"Une app que vous avez déjà","\u002Ffr\u002Fdocs\u002Fexisting-app","fr\u002Fdocs\u002F02.existing-app",{"title":24,"path":25,"stem":26},"Apportez votre schéma","\u002Ffr\u002Fdocs\u002Fbring-your-schema","fr\u002Fdocs\u002F03.bring-your-schema",{"title":28,"path":29,"stem":30},"La CLI","\u002Ffr\u002Fdocs\u002Fcli","fr\u002Fdocs\u002F04.cli",{"title":32,"path":33,"stem":34,"children":35,"page":52},"Concepts","\u002Ffr\u002Fdocs\u002Fconcepts","fr\u002Fdocs\u002F2.concepts",[36,40,44,48],{"title":37,"path":38,"stem":39},"Philosophie","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fphilosophy","fr\u002Fdocs\u002F2.concepts\u002F1.philosophy",{"title":41,"path":42,"stem":43},"La Frond","\u002Ffr\u002Fdocs\u002Fconcepts\u002Ffrond","fr\u002Fdocs\u002F2.concepts\u002F2.frond",{"title":45,"path":46,"stem":47},"Le chemin le plus court","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fshortest-path","fr\u002Fdocs\u002F2.concepts\u002F3.shortest-path",{"title":49,"path":50,"stem":51},"Le socle","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fthe-base","fr\u002Fdocs\u002F2.concepts\u002F4.the-base",false,{"title":54,"path":55,"stem":56,"children":57,"page":52},"Schéma","\u002Ffr\u002Fdocs\u002Fschema","fr\u002Fdocs\u002F3.schema",[58,62,66,70,74],{"title":59,"path":60,"stem":61},"Entités","\u002Ffr\u002Fdocs\u002Fschema\u002Fentities","fr\u002Fdocs\u002F3.schema\u002F1.entities",{"title":63,"path":64,"stem":65},"Vues","\u002Ffr\u002Fdocs\u002Fschema\u002Fviews","fr\u002Fdocs\u002F3.schema\u002F2.views",{"title":67,"path":68,"stem":69},"La carte d'identité","\u002Ffr\u002Fdocs\u002Fschema\u002Fcard","fr\u002Fdocs\u002F3.schema\u002F3.card",{"title":71,"path":72,"stem":73},"Standard Schema","\u002Ffr\u002Fdocs\u002Fschema\u002Fstandard-schema","fr\u002Fdocs\u002F3.schema\u002F4.standard-schema",{"title":75,"path":76,"stem":77},"Comment un schéma bouge","\u002Ffr\u002Fdocs\u002Fschema\u002Fevolution","fr\u002Fdocs\u002F3.schema\u002F5.evolution",{"title":79,"path":80,"stem":81,"children":82,"page":52},"Métier","\u002Ffr\u002Fdocs\u002Fbusiness","fr\u002Fdocs\u002F4.business",[83,87,91,95,99,103,107,111,115,119],{"title":84,"path":85,"stem":86},"Handlers","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fhandlers","fr\u002Fdocs\u002F4.business\u002F1.handlers",{"title":88,"path":89,"stem":90},"Les ports","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fports","fr\u002Fdocs\u002F4.business\u002F10.ports",{"title":92,"path":93,"stem":94},"Presenters","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fpresenters","fr\u002Fdocs\u002F4.business\u002F2.presenters",{"title":96,"path":97,"stem":98},"Collectors","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fcollectors","fr\u002Fdocs\u002F4.business\u002F3.collectors",{"title":100,"path":101,"stem":102},"Erreurs","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ferrors","fr\u002Fdocs\u002F4.business\u002F4.errors",{"title":104,"path":105,"stem":106},"Seeds","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fseeds","fr\u002Fdocs\u002F4.business\u002F5.seeds",{"title":108,"path":109,"stem":110},"Les faits","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ffacts","fr\u002Fdocs\u002F4.business\u002F6.facts",{"title":112,"path":113,"stem":114},"Le port Storage","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fstorage","fr\u002Fdocs\u002F4.business\u002F7.storage",{"title":116,"path":117,"stem":118},"Des écritures qui tiennent ou tombent ensemble","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ftogether","fr\u002Fdocs\u002F4.business\u002F8.together",{"title":120,"path":121,"stem":122},"Les repositories","\u002Ffr\u002Fdocs\u002Fbusiness\u002Frepositories","fr\u002Fdocs\u002F4.business\u002F9.repositories",{"title":124,"path":125,"stem":126,"children":127,"page":52},"Client","\u002Ffr\u002Fdocs\u002Fclient","fr\u002Fdocs\u002F5.client",[128,132,136,140,144],{"title":129,"path":130,"stem":131},"Queries & commands","\u002Ffr\u002Fdocs\u002Fclient\u002Fqueries-commands","fr\u002Fdocs\u002F5.client\u002F1.queries-commands",{"title":133,"path":134,"stem":135},"Formulaires","\u002Ffr\u002Fdocs\u002Fclient\u002Fforms","fr\u002Fdocs\u002F5.client\u002F2.forms",{"title":137,"path":138,"stem":139},"Session","\u002Ffr\u002Fdocs\u002Fclient\u002Fsession","fr\u002Fdocs\u002F5.client\u002F3.session",{"title":141,"path":142,"stem":143},"invoke","\u002Ffr\u002Fdocs\u002Fclient\u002Finvoke","fr\u002Fdocs\u002F5.client\u002F4.invoke",{"title":145,"path":146,"stem":147},"Back-office","\u002Ffr\u002Fdocs\u002Fclient\u002Fadmin","fr\u002Fdocs\u002F5.client\u002F5.admin",{"title":149,"path":150,"stem":151,"children":152,"page":52},"Infrastructure","\u002Ffr\u002Fdocs\u002Finfra","fr\u002Fdocs\u002F6.infra",[153,157,161,165,169,173,177,181,185],{"title":154,"path":155,"stem":156},"Le gradient","\u002Ffr\u002Fdocs\u002Finfra\u002Fgradient","fr\u002Fdocs\u002F6.infra\u002F1.gradient",{"title":158,"path":159,"stem":160},"Surfaces — REST & GraphQL","\u002Ffr\u002Fdocs\u002Finfra\u002Fsurfaces","fr\u002Fdocs\u002F6.infra\u002F2.surfaces",{"title":162,"path":163,"stem":164},"Déploiement","\u002Ffr\u002Fdocs\u002Finfra\u002Fdeployment","fr\u002Fdocs\u002F6.infra\u002F3.deployment",{"title":166,"path":167,"stem":168},"Hôtes","\u002Ffr\u002Fdocs\u002Finfra\u002Fhosts","fr\u002Fdocs\u002F6.infra\u002F4.hosts",{"title":170,"path":171,"stem":172},"Les sources","\u002Ffr\u002Fdocs\u002Finfra\u002Fsources","fr\u002Fdocs\u002F6.infra\u002F5.sources",{"title":174,"path":175,"stem":176},"Le cycle de vie","\u002Ffr\u002Fdocs\u002Finfra\u002Flifecycle","fr\u002Fdocs\u002F6.infra\u002F6.lifecycle",{"title":178,"path":179,"stem":180},"L'identité entre Fronds","\u002Ffr\u002Fdocs\u002Finfra\u002Fidentity","fr\u002Fdocs\u002F6.infra\u002F7.identity",{"title":182,"path":183,"stem":184},"Observabilité","\u002Ffr\u002Fdocs\u002Finfra\u002Fobservability","fr\u002Fdocs\u002F6.infra\u002F8.observability",{"title":186,"path":187,"stem":188},"Tests","\u002Ffr\u002Fdocs\u002Finfra\u002Ftesting","fr\u002Fdocs\u002F6.infra\u002F9.testing",{"id":190,"title":145,"body":191,"description":1236,"extension":1237,"meta":1238,"navigation":270,"path":146,"seo":1239,"stem":147,"__hash__":1240},"docs_fr\u002Ffr\u002Fdocs\u002F5.client\u002F5.admin.md",{"type":192,"value":193,"toc":1226},"minimark",[194,198,216,219,247,278,285,290,446,458,462,465,508,519,523,535,725,752,756,759,892,911,936,940,957,1086,1090,1097,1105,1123,1133,1137,1189,1193,1216,1222],[195,196,145],"h1",{"id":197},"back-office",[199,200,201,202,206,207,211,212,215],"p",{},"Un back-office pose quatre questions : quels sujets existent, ce qu'une ligne affiche, ce\nqu'un formulaire fournit, et quels verbes sont permis. ",[203,204,205],"strong",{},"La carte d'identité répond déjà\naux quatre",", donc ",[208,209,210],"code",{},"@fougere\u002Fadmin"," ne génère rien et ne déclare rien — il lit\n",[208,213,214],{},"rpc.discover"," au chargement et rend la réponse.",[199,217,218],{},"C'est là que ça diffère d'un CMS. Payload, Strapi et Directus vendent la dérivation d'un\nback-office à partir d'une déclaration de contenu ; ici la déclaration était déjà là, à\nfaire cinq autres métiers, et le panneau est sa sixième projection.",[220,221,226],"pre",{"className":222,"code":223,"language":224,"meta":225,"style":225},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","pnpm add @fougere\u002Fadmin react-admin\n","bash","",[208,227,228],{"__ignoreMap":225},[229,230,233,237,241,244],"span",{"class":231,"line":232},"line",1,[229,234,236],{"class":235},"sbgvK","pnpm",[229,238,240],{"class":239},"s_sjI"," add",[229,242,243],{"class":239}," @fougere\u002Fadmin",[229,245,246],{"class":239}," react-admin\n",[220,248,252],{"className":249,"code":250,"language":251,"meta":225,"style":225},"language-tsx shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F app\u002Fadmin.tsx — le fichier entier\nimport { FougereAdmin } from '@fougere\u002Fadmin\u002Freact';\n\nexport default () => \u003CFougereAdmin \u002F>;\n","tsx",[208,253,254,259,265,272],{"__ignoreMap":225},[229,255,256],{"class":231,"line":232},[229,257,258],{},"\u002F\u002F app\u002Fadmin.tsx — le fichier entier\n",[229,260,262],{"class":231,"line":261},2,[229,263,264],{},"import { FougereAdmin } from '@fougere\u002Fadmin\u002Freact';\n",[229,266,268],{"class":231,"line":267},3,[229,269,271],{"emptyLinePlaceholder":270},true,"\n",[229,273,275],{"class":231,"line":274},4,[229,276,277],{},"export default () => \u003CFougereAdmin \u002F>;\n",[199,279,280,281,284],{},"Trois lignes, toutes les entités, pour toujours. Un nouveau\n",[208,282,283],{},"class Invoice extends entity({…})"," apparaît dans le menu au chargement suivant, parce que\nla carte a gagné une porte — pas parce qu'un fichier a été écrit.",[286,287,289],"h2",{"id":288},"doù-chaque-écran-est-lu","D'où chaque écran est lu",[291,292,293,309],"table",{},[294,295,296],"thead",{},[297,298,299,303,306],"tr",{},[300,301,302],"th",{},"Écran",[300,304,305],{},"Lu depuis",[300,307,308],{},"Fonction",[310,311,312,326,342,358,384,400,417,433],"tbody",{},[297,313,314,318,323],{},[315,316,317],"td",{},"Le menu",[315,319,320],{},[208,321,322],{},"card.fronds[].doors[]",[315,324,325],{},"une porte sans schéma n'est pas du mobilier",[297,327,328,331,337],{},[315,329,330],{},"Les colonnes d'une liste",[315,332,333,336],{},[208,334,335],{},"Visibility.output"," + le shape",[315,338,339],{},[208,340,341],{},"tableColumnsOf",[297,343,344,347,353],{},[315,345,346],{},"Les champs d'un formulaire",[315,348,349,352],{},[208,350,351],{},"Visibility.input"," + l'axe lifecycle",[315,354,355],{},[208,356,357],{},"formFieldsOf",[297,359,360,363,379],{},[315,361,362],{},"Ses bornes",[315,364,365,368,369,372,373,372,376],{},[208,366,367],{},"shape"," → ",[208,370,371],{},"minlength",", ",[208,374,375],{},"max",[208,377,378],{},"pattern",[315,380,381],{},[208,382,383],{},"field.attrs",[297,385,386,389,395],{},[315,387,388],{},"L'identité d'une ligne",[315,390,391,392],{},"le rôle ",[208,393,394],{},"primary",[315,396,397],{},[208,398,399],{},"FieldSet.of(fields).primary",[297,401,402,405,410],{},[315,403,404],{},"Les boutons",[315,406,407],{},[208,408,409],{},"door.ops",[315,411,412,413,416],{},"pas d'op ",[208,414,415],{},"create",", pas de bouton créer",[297,418,419,422,427],{},[315,420,421],{},"Un refus",[315,423,424],{},[208,425,426],{},"VALIDATION_FAILED",[315,428,429,432],{},[208,430,431],{},"errorsByField",", champ par champ",[297,434,435,438,443],{},[315,436,437],{},"La topologie",[315,439,440],{},[208,441,442],{},"rpc.topology",[315,444,445],{},"le seul écran auquel la carte ne répond pas",[199,447,448,450,451,453,454,457],{},[208,449,341],{}," et ",[208,452,357],{}," sont duales l'une de l'autre, et c'est la paire que\n",[455,456,133],"a",{"href":134}," utilise déjà — l'une lit ce qui peut sortir, l'autre\nce qu'un client peut fournir. Le panneau n'ajoute aucune troisième lecture.",[286,459,461],{"id":460},"le-gradient-latteint","Le gradient l'atteint",[199,463,464],{},"Le panneau parle au point d'appel et ne connaît rien d'autre. Donc ceci ne change rien\npour lui :",[220,466,470],{"className":467,"code":468,"language":469,"meta":225,"style":225},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F fougere.config.ts\nremotes: { billing: 'https:\u002F\u002Fbilling.internal' }\n","ts",[208,471,472,478],{"__ignoreMap":225},[229,473,474],{"class":231,"line":232},[229,475,477],{"class":476},"sutJx","\u002F\u002F fougere.config.ts\n",[229,479,480,483,487,490,493,495,499,502,505],{"class":231,"line":261},[229,481,482],{"class":235},"remotes",[229,484,486],{"class":485},"sP7_E",":",[229,488,489],{"class":485}," {",[229,491,492],{"class":235}," billing",[229,494,486],{"class":485},[229,496,498],{"class":497},"sjJ54"," '",[229,500,501],{"class":239},"https:\u002F\u002Fbilling.internal",[229,503,504],{"class":497},"'",[229,506,507],{"class":485}," }\n",[199,509,510,511,514,515,518],{},"La porte ",[208,512,513],{},"invoice"," part dans un autre process, la carte l'annonce toujours, le même build\nrend les mêmes écrans. ",[203,516,517],{},"Un CMS headless ne peut pas faire ça"," — son back-office est lié à\nsa propre API par construction, et la frontière de process est le produit.",[286,520,522],{"id":521},"les-facettes-se-déclarent-ne-se-devinent-pas","Les facettes se déclarent, ne se devinent pas",[199,524,525,526,529,530,534],{},"Certaines choses qu'un rendu veut ne sont pas dans le shape. ",[208,527,528],{},"oneOf('draft', 'published')","\ndit que l'ensemble est clos ; il ne dit jamais quel membre signifie ",[531,532,533],"em",{},"publié",". C'est une\nvraie affirmation sur un domaine, et c'est un humain qui la fait :",[220,536,538],{"className":467,"code":537,"language":469,"meta":225,"style":225},"import { defineAdminExtension } from '@fougere\u002Fadmin';\n\ndefineAdminExtension({\n  resource: 'post',\n  facets: {\n    editorial: {\n      title: 'title',\n      state: { field: 'status', draft: ['draft'], published: ['published'] },\n    },\n  },\n})\n",[208,539,540,567,571,583,601,612,622,639,704,710,716],{"__ignoreMap":225},[229,541,542,546,548,552,555,558,560,562,564],{"class":231,"line":232},[229,543,545],{"class":544},"sVHd0","import",[229,547,489],{"class":485},[229,549,551],{"class":550},"su5hD"," defineAdminExtension",[229,553,554],{"class":485}," }",[229,556,557],{"class":544}," from",[229,559,498],{"class":497},[229,561,210],{"class":239},[229,563,504],{"class":497},[229,565,566],{"class":485},";\n",[229,568,569],{"class":231,"line":261},[229,570,271],{"emptyLinePlaceholder":270},[229,572,573,577,580],{"class":231,"line":267},[229,574,576],{"class":575},"sGLFI","defineAdminExtension",[229,578,579],{"class":550},"(",[229,581,582],{"class":485},"{\n",[229,584,585,589,591,593,596,598],{"class":231,"line":274},[229,586,588],{"class":587},"skxfh","  resource",[229,590,486],{"class":485},[229,592,498],{"class":497},[229,594,595],{"class":239},"post",[229,597,504],{"class":497},[229,599,600],{"class":485},",\n",[229,602,604,607,609],{"class":231,"line":603},5,[229,605,606],{"class":587},"  facets",[229,608,486],{"class":485},[229,610,611],{"class":485}," {\n",[229,613,615,618,620],{"class":231,"line":614},6,[229,616,617],{"class":587},"    editorial",[229,619,486],{"class":485},[229,621,611],{"class":485},[229,623,625,628,630,632,635,637],{"class":231,"line":624},7,[229,626,627],{"class":587},"      title",[229,629,486],{"class":485},[229,631,498],{"class":497},[229,633,634],{"class":239},"title",[229,636,504],{"class":497},[229,638,600],{"class":485},[229,640,642,645,647,649,652,654,656,659,661,664,667,669,672,674,677,679,682,684,687,689,691,693,696,698,701],{"class":231,"line":641},8,[229,643,644],{"class":587},"      state",[229,646,486],{"class":485},[229,648,489],{"class":485},[229,650,651],{"class":587}," field",[229,653,486],{"class":485},[229,655,498],{"class":497},[229,657,658],{"class":239},"status",[229,660,504],{"class":497},[229,662,663],{"class":485},",",[229,665,666],{"class":587}," draft",[229,668,486],{"class":485},[229,670,671],{"class":550}," [",[229,673,504],{"class":497},[229,675,676],{"class":239},"draft",[229,678,504],{"class":497},[229,680,681],{"class":550},"]",[229,683,663],{"class":485},[229,685,686],{"class":587}," published",[229,688,486],{"class":485},[229,690,671],{"class":550},[229,692,504],{"class":497},[229,694,695],{"class":239},"published",[229,697,504],{"class":497},[229,699,700],{"class":550},"] ",[229,702,703],{"class":485},"},\n",[229,705,707],{"class":231,"line":706},9,[229,708,709],{"class":485},"    },\n",[229,711,713],{"class":231,"line":712},10,[229,714,715],{"class":485},"  },\n",[229,717,719,722],{"class":231,"line":718},11,[229,720,721],{"class":485},"}",[229,723,724],{"class":550},")\n",[199,726,727,728,731,732,372,734,372,736,739,740,743,744,747,748,751],{},"Rien n'est inféré, et c'est délibéré. Une version antérieure lisait les ",[531,729,730],{},"noms"," de champs —\n",[208,733,634],{},[208,735,658],{},[208,737,738],{},"['draft', 'pending', 'review']"," — et une entité qui écrivait ",[208,741,742],{},"titre"," ou\n",[208,745,746],{},"brouillon"," perdait sa facette sans un message. Fougere reconnaît un champ à sa ",[203,749,750],{},"forme",",\njamais à un mot, et une mauvaise réponse silencieuse est pire qu'une absence. Sans aucune\nfacette déclarée, le tableau dérivé reste tout le back-office.",[286,753,755],{"id":754},"les-extensions-sont-des-deltas","Les extensions sont des deltas",[199,757,758],{},"Une extension ne nomme que ce qu'elle change. Elle ne fige jamais une ressource, donc un\nchamp ajouté à l'entité demain apparaît quand même :",[220,760,762],{"className":467,"code":761,"language":469,"meta":225,"style":225},"defineAdminExtension({\n  resource: 'post',\n  label: 'Articles',\n  fields: { internalNote: { hidden: true }, title: { label: 'Titre' } },\n  operations: { publish: { confirm: 'Publier cet article ?' } },\n})\n",[208,763,764,772,786,802,854,886],{"__ignoreMap":225},[229,765,766,768,770],{"class":231,"line":232},[229,767,576],{"class":575},[229,769,579],{"class":550},[229,771,582],{"class":485},[229,773,774,776,778,780,782,784],{"class":231,"line":261},[229,775,588],{"class":587},[229,777,486],{"class":485},[229,779,498],{"class":497},[229,781,595],{"class":239},[229,783,504],{"class":497},[229,785,600],{"class":485},[229,787,788,791,793,795,798,800],{"class":231,"line":267},[229,789,790],{"class":587},"  label",[229,792,486],{"class":485},[229,794,498],{"class":497},[229,796,797],{"class":239},"Articles",[229,799,504],{"class":497},[229,801,600],{"class":485},[229,803,804,807,809,811,814,816,818,821,823,827,830,833,835,837,840,842,844,847,849,851],{"class":231,"line":274},[229,805,806],{"class":587},"  fields",[229,808,486],{"class":485},[229,810,489],{"class":485},[229,812,813],{"class":587}," internalNote",[229,815,486],{"class":485},[229,817,489],{"class":485},[229,819,820],{"class":587}," hidden",[229,822,486],{"class":485},[229,824,826],{"class":825},"syTEX"," true",[229,828,829],{"class":485}," },",[229,831,832],{"class":587}," title",[229,834,486],{"class":485},[229,836,489],{"class":485},[229,838,839],{"class":587}," label",[229,841,486],{"class":485},[229,843,498],{"class":497},[229,845,846],{"class":239},"Titre",[229,848,504],{"class":497},[229,850,554],{"class":485},[229,852,853],{"class":485}," },\n",[229,855,856,859,861,863,866,868,870,873,875,877,880,882,884],{"class":231,"line":603},[229,857,858],{"class":587},"  operations",[229,860,486],{"class":485},[229,862,489],{"class":485},[229,864,865],{"class":587}," publish",[229,867,486],{"class":485},[229,869,489],{"class":485},[229,871,872],{"class":587}," confirm",[229,874,486],{"class":485},[229,876,498],{"class":497},[229,878,879],{"class":239},"Publier cet article ?",[229,881,504],{"class":497},[229,883,554],{"class":485},[229,885,853],{"class":485},[229,887,888,890],{"class":231,"line":614},[229,889,721],{"class":485},[229,891,724],{"class":550},[199,893,894,895,372,898,372,901,372,904,372,907,910],{},"Pour plus fin, un rendu remplace un champ, et toutes les props de React Admin marchent\ntoujours — ",[208,896,897],{},"theme",[208,899,900],{},"layout",[208,902,903],{},"authProvider",[208,905,906],{},"i18nProvider",[208,908,909],{},"dashboard"," :",[220,912,914],{"className":249,"code":913,"language":251,"meta":225,"style":225},"\u003CFougereAdmin\n  renderers={{ fields: { 'user.role': ({ column }) => \u003CChipField source={column.name} \u002F> } }}\n  resourceComponents={{ post: { list: MyPostList } }}\n\u002F>\n",[208,915,916,921,926,931],{"__ignoreMap":225},[229,917,918],{"class":231,"line":232},[229,919,920],{},"\u003CFougereAdmin\n",[229,922,923],{"class":231,"line":261},[229,924,925],{},"  renderers={{ fields: { 'user.role': ({ column }) => \u003CChipField source={column.name} \u002F> } }}\n",[229,927,928],{"class":231,"line":267},[229,929,930],{},"  resourceComponents={{ post: { list: MyPostList } }}\n",[229,932,933],{"class":231,"line":274},[229,934,935],{},"\u002F>\n",[286,937,939],{"id":938},"il-ne-parle-aucune-langue","Il ne parle aucune langue",[199,941,942,943,946,947,950,951,953,954,956],{},"Chaque phrase visible passe par une clé : ",[208,944,945],{},"fougere.admin.*"," pour les widgets du panneau,\n",[208,948,949],{},"entity.field"," pour un champ — la convention qu'énonce ",[208,952,357],{},", avec le nom dérivé\ncomme repli. Un back-office non traduit est donc en anglais, et un ",[208,955,906],{}," qui\nremplit ces clés est toute la traduction.",[220,958,960],{"className":467,"code":959,"language":469,"meta":225,"style":225},"polyglotI18nProvider(() => ({\n  ...frenchMessages,\n  fougere: { admin: { overview: { title: \"Vue d'ensemble\" } } },\n  post: { title: 'Titre', status: 'Statut' },\n}), 'fr')\n",[208,961,962,981,992,1034,1069],{"__ignoreMap":225},[229,963,964,967,969,972,976,979],{"class":231,"line":232},[229,965,966],{"class":575},"polyglotI18nProvider",[229,968,579],{"class":550},[229,970,971],{"class":485},"()",[229,973,975],{"class":974},"sbsja"," =>",[229,977,978],{"class":550}," (",[229,980,582],{"class":485},[229,982,983,987,990],{"class":231,"line":261},[229,984,986],{"class":985},"smGrS","  ...",[229,988,989],{"class":550},"frenchMessages",[229,991,600],{"class":485},[229,993,994,997,999,1001,1004,1006,1008,1011,1013,1015,1017,1019,1022,1025,1028,1030,1032],{"class":231,"line":267},[229,995,996],{"class":587},"  fougere",[229,998,486],{"class":485},[229,1000,489],{"class":485},[229,1002,1003],{"class":587}," admin",[229,1005,486],{"class":485},[229,1007,489],{"class":485},[229,1009,1010],{"class":587}," overview",[229,1012,486],{"class":485},[229,1014,489],{"class":485},[229,1016,832],{"class":587},[229,1018,486],{"class":485},[229,1020,1021],{"class":497}," \"",[229,1023,1024],{"class":239},"Vue d'ensemble",[229,1026,1027],{"class":497},"\"",[229,1029,554],{"class":485},[229,1031,554],{"class":485},[229,1033,853],{"class":485},[229,1035,1036,1039,1041,1043,1045,1047,1049,1051,1053,1055,1058,1060,1062,1065,1067],{"class":231,"line":274},[229,1037,1038],{"class":587},"  post",[229,1040,486],{"class":485},[229,1042,489],{"class":485},[229,1044,832],{"class":587},[229,1046,486],{"class":485},[229,1048,498],{"class":497},[229,1050,846],{"class":239},[229,1052,504],{"class":497},[229,1054,663],{"class":485},[229,1056,1057],{"class":587}," status",[229,1059,486],{"class":485},[229,1061,498],{"class":497},[229,1063,1064],{"class":239},"Statut",[229,1066,504],{"class":497},[229,1068,853],{"class":485},[229,1070,1071,1073,1076,1078,1080,1082,1084],{"class":231,"line":603},[229,1072,721],{"class":485},[229,1074,1075],{"class":550},")",[229,1077,663],{"class":485},[229,1079,498],{"class":497},[229,1081,7],{"class":239},[229,1083,504],{"class":497},[229,1085,724],{"class":550},[286,1087,1089],{"id":1088},"la-seule-page-qui-nest-pas-une-porte","La seule page qui n'est pas une porte",[199,1091,1092,1093,1096],{},"Chaque écran ci-dessus rend une porte. ",[203,1094,1095],{},"Topologie"," rend l'app :",[220,1098,1103],{"className":1099,"code":1101,"language":1102},[1100],"language-text","catalog  ici        1 entité · 1 porte     → blog (12)\nblog     ailleurs   sa forme est publiée par le processus qui la possède   ← catalog (12)\n","text",[208,1104,1101],{"__ignoreMap":225},[199,1106,1107,1108,1110,1111,1114,1115,1118,1119,1122],{},"Elle est lue depuis ",[208,1109,442],{},", pas depuis la carte — la carte dit ce qu'un processus\n",[531,1112,1113],{},"héberge",", celle-ci dit dans quelle forme il est : quels Fronds tournent dans le processus\nauquel le panneau parle, lesquels ont répondu d'ailleurs, et chaque chemin d'appel observé\nentre les deux. Rien là-dedans n'est déclaré : un Frond est distant parce qu'il a ",[531,1116,1117],{},"répondu",",\njamais parce que ",[208,1120,1121],{},"remotes:"," l'a dit.",[199,1124,1125,1126,1132],{},"Cette op est servie par ",[455,1127,1129],{"href":1128},"\u002Fdocs\u002Finfra\u002Fobservability",[208,1130,1131],{},"@fougere\u002Fobservability",", donc un\npanneau branché sur une app qui ne s'observe pas reçoit un refus — et la page dit quelles\ndeux lignes manquent. L'entrée de menu reste dans les deux cas : la cacher cacherait le seul\nendroit qui peut expliquer l'absence.",[286,1134,1136],{"id":1135},"ce-quil-ne-fera-pas","Ce qu'il ne fera pas",[1138,1139,1140,1159,1165,1179],"ul",{},[1141,1142,1143,1146,1147,1150,1151,1154,1155,1158],"li",{},[203,1144,1145],{},"Retirer une ressource ou une opération."," Cacher une porte dans le navigateur pendant\nque la façade la sert encore se lit comme un droit et n'applique rien. Ce qu'une porte\nsert à un public donné, c'est ce qu'énonce une ",[455,1148,1149],{"href":159},"surface"," —\npointez le panneau sur ",[208,1152,1153],{},"\u002F_fougere\u002Fcall\u002Fadmin"," et la carte répond restreinte. Un ",[531,1156,1157],{},"champ","\npeut toujours être caché : ça ne change rien à ce qui est joignable.",[1141,1160,1161,1164],{},[203,1162,1163],{},"Écrire hors de la façade."," Il tourne dans un navigateur, donc il ne peut atteindre que\nle point d'appel — juges, presenters et middlewares sont sur le chemin de chaque lecture\net de chaque écriture qu'il fait. C'est une conséquence, pas une précaution.",[1141,1166,1167,1170,1171,1174,1175,1178],{},[203,1168,1169],{},"Agréger."," Le seul agrégat du port Storage est ",[208,1172,1173],{},"count",", donc le tableau de bord compte des\nlignes et le dit. « Le chiffre d'affaires sur trente jours » est une opération à écrire,\ndans un ",[455,1176,1177],{"href":121},"repository"," ; le panneau rend son résultat, il\nn'invente pas la requête.",[1141,1180,1181,1184,1185,1188],{},[203,1182,1183],{},"Posséder vos pages."," C'est un panneau pour qui administre les données. Les écrans de\nl'application restent les vôtres, bâtis sur\n",[455,1186,1187],{"href":130},"queries et commands",".",[286,1190,1192],{"id":1191},"un-manque-connu","Un manque connu",[199,1194,1195,1196,1199,1200,1203,1204,1207,1208,1211,1212,1215],{},"Le ",[208,1197,1198],{},"total"," d'une liste ne survit pas au fil : ",[208,1201,1202],{},"ListResult"," étend ",[208,1205,1206],{},"Array",", et\n",[208,1209,1210],{},"JSON.stringify"," jette les propriétés d'un tableau. Le provider n'en dépend pas — il\ndemande une ligne de plus que la page et renvoie ",[208,1213,1214],{},"pageInfo"," — donc la pagination est\nexacte. Un compte de lignes dans un en-tête peut être absent sous un découpage.",[199,1217,1218,1219,1221],{},"Suite : ",[455,1220,154],{"href":155}," — déplacer une Frond hors process.",[1223,1224,1225],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":225,"searchDepth":261,"depth":261,"links":1227},[1228,1229,1230,1231,1232,1233,1234,1235],{"id":288,"depth":261,"text":289},{"id":460,"depth":261,"text":461},{"id":521,"depth":261,"text":522},{"id":754,"depth":261,"text":755},{"id":938,"depth":261,"text":939},{"id":1088,"depth":261,"text":1089},{"id":1135,"depth":261,"text":1136},{"id":1191,"depth":261,"text":1192},"Un panneau React Admin dérivé de la carte d'identité — aucun fichier généré, aucune entité déclarée deux fois, et les mêmes écrans que la Frond soit dans ce process ou derrière une adresse.","md",{},{"title":145,"description":1236},"4rE_m5_E8fMb8WhKA4wzp7yncQnh0aFFz2rMQNyv_mI",1788598419830]