Tableaux de bord et interfaces d’administration

Tableau de pipeline de planification des consultations externes

Dans le scénario de planification des rotations en clinique externe, terminez le tableau des flux du planning : il comprend du contenu réel, des contrôles exploitables, un retour d’état clair et une mise en page adaptée à toutes les tailles.

Tableaux de bord et interfaces d’administrationTableau de pipeline de processusHTMLCSS GridJavaScript
Après activation de JavaScript, ce cas peut être modifié, exécuté et enregistré. Code source fixe ci-dessous :
<!doctype html>
<html lang="fr" dir="ltr">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Tableau de pipeline de planification des consultations externes</title>
  <style>
    :root { --ink:#24213a; --paper:#f6f1e8; --accent:#e6a23c; --secondary:#a8a1d8; --line:color-mix(in srgb, var(--ink) 18%, transparent); --shadow:0 24px 60px color-mix(in srgb, var(--ink) 16%, transparent); color-scheme:light; }
    * { box-sizing:border-box; }
    html { min-width:320px; background:var(--paper); }
    body { min-height:100vh; margin:0; overflow-x:hidden; color:var(--ink); font-family:Optima,"Songti SC",serif; background:radial-gradient(ellipse at top left,color-mix(in srgb,var(--secondary) 32%,transparent),transparent 42%),radial-gradient(ellipse at bottom right,color-mix(in srgb,var(--accent) 18%,transparent),transparent 45%),var(--paper); }
    button,input,select,textarea { color:inherit; font:inherit; }
    button,[role="button"],input,select,textarea { accent-color:var(--accent); }
    button { cursor:pointer; }
    button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible { outline:3px solid var(--accent); outline-offset:3px; }
    [hidden] { display:none !important; }
    @media (max-width:700px) { .mast h1 { line-height:1.08 !important; letter-spacing:-.035em !important; overflow-wrap:anywhere; } }
    @media (prefers-reduced-motion:reduce) { *,*::before,*::after { scroll-behavior:auto !important; animation-duration:.01ms !important; animation-iteration-count:1 !important; transition-duration:.01ms !important; } }
    .page{width:min(1100px,calc(100% - 34px));margin:auto;padding:68px 0}.mast{display:grid;grid-template-columns:1fr auto;align-items:center;gap:40px;margin:0 4vw 36px}.mast h1{font-family:Optima,"Songti SC",serif;font-weight:700;font-size:clamp(40px,8vw,86px);letter-spacing:-.025em;margin:0;line-height:1.02}.eyebrow{display:block;margin-bottom:12px;color:var(--accent);font-size:12px;letter-spacing:.2em}.intro{max-width:60ch;line-height:1.9}.scenario{display:grid;width:108px;height:108px;place-items:center;padding:12px;border:1px solid var(--line);border-radius:50%;text-align:center}.demo{border-radius:72px 18px 72px 18px;box-shadow:0 28px 80px color-mix(in srgb,var(--ink) 14%,transparent);position:relative;min-height:430px;overflow:hidden;padding:clamp(28px,5vw,58px);background:color-mix(in srgb,var(--paper) 84%,transparent)}@media(max-width:700px){.page{width:calc(100% - 18px);padding:24px 0}.mast{grid-template-columns:1fr;margin-inline:12px}.scenario{width:auto;height:auto;border-radius:999px}.demo{padding:18px}}
    .panel{padding:18px;border:3px solid var(--ink);background:var(--paper);box-shadow:8px 8px 0 var(--ink)}.stack{display:grid;gap:12px}.row{display:flex;flex-wrap:wrap;gap:8px}.action{min-height:42px;padding:8px 13px;border:3px solid var(--ink);background:var(--paper);font-weight:900}.action.primary,.action.is-active{color:var(--paper);background:var(--ink)}.status{min-height:24px;padding:8px;color:var(--paper);background:var(--ink);font-weight:900}.metric{font-size:clamp(34px,8vw,76px);font-weight:900;letter-spacing:-.08em}.muted{font-weight:600}.chip{padding:5px 8px;border:2px solid var(--ink);font-weight:900}.meter{height:14px;border:3px solid var(--ink)}.meter>i{display:block;height:100%;background:var(--ink)}
    .composition-deck{display:grid;grid-template-rows:auto 1fr;border:1px solid var(--line);border-radius:24px;overflow:hidden;background:color-mix(in srgb,var(--ink) 4%,var(--paper))}.deck-bar{display:flex;justify-content:space-between;gap:18px;align-items:center;padding:12px 18px;color:var(--paper);background:var(--ink);font:700 12px/1 ui-monospace,monospace}.deck-lights{display:flex;gap:7px}.deck-lights i{width:10px;height:10px;border-radius:50%;background:var(--accent)}.deck-lights i:nth-child(2){background:var(--secondary)}.deck-lights i:nth-child(3){background:color-mix(in srgb,var(--paper) 55%,transparent)}.composition-deck .demo{border:0;border-radius:0;box-shadow:none}
    .pipeline-console{display:grid;gap:16px}.pipeline-console>header,.pipeline-console>footer{display:flex;justify-content:space-between;gap:16px;align-items:end}.pipeline-console h2{margin:.25em 0}.pipeline-console>header>output{font:800 13px/1.4 ui-monospace,monospace}.pipeline-stages{display:grid;grid-template-columns:repeat(4,minmax(180px,1fr));gap:8px;overflow:auto}.pipeline-stages>section{min-height:310px;border-top:7px solid var(--stage-color,var(--accent));background:color-mix(in srgb,var(--secondary) 10%,var(--paper))}.pipeline-stages>section:nth-child(2){--stage-color:#4c72b0}.pipeline-stages>section:nth-child(3){--stage-color:#b8792f}.pipeline-stages>section:nth-child(4){--stage-color:#3e8c63}.pipeline-stages section>header{display:grid;grid-template-columns:auto 1fr auto;gap:8px;align-items:center;padding:13px}.pipeline-stages h3{margin:0;font-size:14px}.pipeline-stages section>div{display:grid;gap:8px;padding:0 9px 12px}.pipeline-stages [data-pipeline-card]{display:grid;grid-template-columns:1fr auto;gap:6px;width:100%;padding:13px;border:1px solid var(--line);border-radius:4px;background:var(--paper);text-align:left}.pipeline-stages [data-pipeline-card][aria-pressed="true"]{outline:3px solid var(--accent);outline-offset:1px}.pipeline-stages [data-pipeline-card] small{grid-column:1}.pipeline-stages [data-pipeline-card] i{grid-column:2;grid-row:1/3;align-self:center;font-style:normal}.pipeline-console>footer{padding:15px;border-left:6px solid var(--accent);background:var(--paper)}.pipeline-console>footer div{display:grid;gap:4px}.pipeline-console>footer .action{flex:none}@media(max-width:720px){.pipeline-console>header,.pipeline-console>footer{align-items:stretch;flex-direction:column}.pipeline-stages{grid-template-columns:repeat(4,230px)}}.workflow-session{display:grid;gap:14px}.session-command{display:grid;grid-template-columns:1fr auto minmax(170px,.45fr) auto;gap:16px;align-items:end;padding:18px;border-block:4px double var(--ink)}.session-command h2{margin:.2em 0}.session-command output{font:900 clamp(28px,5vw,54px)/1 ui-monospace,monospace}.session-command label{display:grid;grid-template-columns:1fr auto;gap:7px;font-size:12px}.session-command input{grid-column:1/-1;width:100%}#workflowSessionProgress{height:12px;overflow:hidden;border-radius:2px;background:var(--line)}#workflowSessionProgress i{display:block;width:0;height:100%;background:var(--accent)}.session-stage{min-width:0;transition:filter .25s,transform .25s}.session-stage[data-session-phase="running"]{transform:translateY(-3px)}.session-stage[data-session-phase="paused"]{filter:grayscale(.65)}.session-stage[data-session-phase="complete"]{filter:contrast(.78);opacity:.72}.session-log{display:grid;grid-template-columns:auto 1fr;gap:18px;align-items:start}.session-log ol{display:flex;flex-wrap:wrap;gap:7px;padding:0;margin:0;list-style:none}.session-log li{padding:5px 8px;border:1px solid var(--line);font-size:12px}@media(max-width:900px){.session-stage{order:-1}.session-command{grid-template-columns:1fr auto}.session-command label{grid-column:1/-1}.session-log{grid-template-columns:1fr}}
  </style>
</head>
<body data-aesthetic="organic" data-composition="control-deck">
  <main class="page">
    <header class="mast"><div><span class="eyebrow">organic / tableau de pipeline de processus / INTERMEDIATE</span><h1>Tableau de pipeline de planification des consultations externes</h1><p class="intro">Dans le scénario de planification des rotations en clinique externe, terminez le tableau des flux du planning : il comprend du contenu réel, des contrôles exploitables, un retour d’état clair et une mise en page adaptée à toutes les tailles.</p></div><span class="scenario">Planning de clinique</span></header>
    <div class="composition-deck"><div class="deck-bar"><span>CONTROL DECK · 04</span><span>Tableau de pipeline de processus</span><span class="deck-lights" aria-hidden="true"><i></i><i></i><i></i></span></div><section class="demo" aria-label="Zone interactive du panneau de pipeline du flux de travail du planning ambulatoire"><div class="workflow-session"><header class="session-command"><div><span class="eyebrow">Planification ambulatoire SESSION</span><h2>Chronomètre du guichet de consultation</h2></div><output id="workflowSessionClock">00:45</output><label>Durée du tour<input id="workflowSessionLength" type="range" min="15" max="90" step="15" value="45"><span>s</span></label><button id="workflowSessionToggle" class="action primary" type="button">Commencer le service de garde</button></header><div id="workflowSessionProgress" role="progressbar" aria-label="Avancement des guichets de consultation" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"><i></i></div><section id="workflowCore" class="workflow-core session-stage" data-session-phase="ready" tabindex="-1"><!-- 11DZ_CORE_START:dashboards-admin-pipeline-board --><section class="pipeline-console"><header><div><span class="eyebrow">STAGE PIPELINE</span><h2>Pipeline de planification des services ambulatoires</h2></div><output id="pipelineSummary">Total 0 · 4 processus</output></header><div id="pipelineStages" class="pipeline-stages"><section data-pipeline-stage="0"><header><span>01</span><h3>Piste</h3><output>0</output></header><div><button type="button" data-pipeline-card="1" aria-pressed="true"><b>Inspiration pour le planning des consultations ambulatoires</b><small>Poids 31</small><i aria-hidden="true">→</i></button><button type="button" data-pipeline-card="2" aria-pressed="false"><b>Dossier de planification des consultations externes</b><small>Poids 44</small><i aria-hidden="true">→</i></button><button type="button" data-pipeline-card="3" aria-pressed="false"><b>Coordination du planning de consultation</b><small>poids 57</small><i aria-hidden="true">→</i></button></div></section><section data-pipeline-stage="1"><header><span>02</span><h3>Évaluation</h3><output>0</output></header><div><button type="button" data-pipeline-card="0" aria-pressed="false"><b>Planification des consultations externes</b><small>Poids 18</small><i aria-hidden="true">→</i></button></div></section><section data-pipeline-stage="2"><header><span>03</span><h3>Plan</h3><output>0</output></header><div></div></section><section data-pipeline-stage="3"><header><span>04</span><h3>Terminé</h3><output>0</output></header><div></div></section></div><footer><div><span>Processus en cours</span><strong id="pipelineActive">Planification des consultations externes</strong></div><button id="pipelineAdvance" class="action primary" type="button" data-core-bridge="dashboards-admin-pipeline-board">Passer à l’étape suivante</button><button id="pipelineRestart" class="action" type="button">Réinitialiser le pipeline</button></footer></section><!-- 11DZ_CORE_END --></section><footer class="session-log"><strong id="workflowSessionScore">0 points de contrôle interactifs</strong><ol id="workflowSessionLaps" aria-label="Journal de ronde"></ol></footer></div><p id="status" class="status" role="status" aria-live="polite"></p></section></div>
  </main>
  <script>
    'use strict';
    const statusOutput = document.querySelector('#status');
    const announce = message => { statusOutput.textContent = message; };
    /* 11DZ_CORE_SCRIPT_START:dashboards-admin-pipeline-board */
const pipelineCards=[{"label":"Planification des consultations externes","value":18,"stage":1},{"label":"Inspiration pour le planning des consultations ambulatoires","value":31,"stage":0},{"label":"Dossier de planification des consultations externes","value":44,"stage":0},{"label":"Coordination du planning de consultation","value":57,"stage":0}];const pipelineStageLabels=["Piste","Évaluation","Plan","Terminé"];let pipelineActive=0;const pipelineStages=[...document.querySelectorAll('[data-pipeline-stage]')];function renderPipeline(){pipelineStages.forEach(stage=>stage.querySelector(':scope>div').replaceChildren());pipelineCards.forEach((card,index)=>{const button=document.createElement('button');button.type='button';button.dataset.pipelineCard=String(index);button.setAttribute('aria-pressed',String(index===pipelineActive));button.innerHTML='<b>'+card.label+'</b><small>Poids '+card.value+'</small><i aria-hidden="true">→</i>';button.addEventListener('click',()=>{pipelineActive=index;renderPipeline();});pipelineStages[card.stage].querySelector(':scope>div').append(button);});pipelineStages.forEach((stage,index)=>{stage.querySelector('output').textContent=pipelineCards.filter(card=>card.stage===index).length;});const active=pipelineCards[pipelineActive];document.querySelector('#pipelineActive').textContent=active.label+' · '+pipelineStageLabels[active.stage];document.querySelector('#pipelineSummary').textContent='Valeur totale '+pipelineCards.reduce((sum,card)=>sum+card.value,0)+' · '+pipelineCards.length+' processus';document.querySelector('#pipelineAdvance').disabled=active.stage===pipelineStages.length-1;announce(active.label+' Actuellement situé à '+pipelineStageLabels[active.stage]);}document.querySelector('#pipelineAdvance').addEventListener('click',()=>{const active=pipelineCards[pipelineActive];active.stage=Math.min(pipelineStages.length-1,active.stage+1);renderPipeline();});document.querySelector('#pipelineRestart').addEventListener('click',()=>{pipelineCards.forEach((card,index)=>{card.stage=index===0?1:0;});pipelineActive=0;renderPipeline();});renderPipeline();
/* 11DZ_CORE_SCRIPT_END */
const workflowBridgeSpec={"name":"dashboards-admin-pipeline-board","selector":"[data-core-bridge=\"dashboards-admin-pipeline-board\"]","mode":"click","key":"Enter"};const workflowBridgeCore=document.querySelector('#workflowCore');const workflowBridgeControl=workflowBridgeCore.querySelector(workflowBridgeSpec.selector);if(!workflowBridgeControl)throw new Error('Missing core bridge: '+workflowBridgeSpec.name);const workflowBridgeControlledId=workflowBridgeControl.getAttribute('aria-controls');const workflowBridgeControlled=workflowBridgeControlledId?document.getElementById(workflowBridgeControlledId):null;workflowBridgeCore.dataset.workflowBridge=workflowBridgeSpec.name;workflowBridgeCore.dataset.workflowVersion='0';function workflowBridgeSerialize(){const visualNode=workflowBridgeCore.firstElementChild||workflowBridgeCore;const visual=getComputedStyle(visualNode);const outputs=[...workflowBridgeCore.querySelectorAll('output,[role="status"],[aria-live],meter,progress')].map(node=>node.textContent.trim()+'|'+node.getAttribute('aria-valuenow')+'|'+node.getAttribute('value'));const canvas=[...workflowBridgeCore.querySelectorAll('canvas')].map(node=>{try{return node.toDataURL().slice(-160);}catch{return 'canvas-unavailable';}});return JSON.stringify({html:workflowBridgeCore.innerHTML,status:statusOutput.textContent,outputs,canvas,visual:[visual.display,visual.visibility,visual.opacity,visual.transform,visual.filter,visual.backgroundColor,visual.width,visual.height],scroll:workflowBridgeSpec.mode==='scroll'?workflowBridgeControl.scrollTop:null});}let workflowBridgeLastEffect=workflowBridgeSerialize();function workflowBridgeSummary(){const label=(workflowBridgeControl.getAttribute('aria-label')||workflowBridgeControl.textContent||workflowBridgeControl.value||workflowBridgeSpec.name).trim().replace(/\s+/g,' ').slice(0,72);return label+' · Version de base '+workflowBridgeCore.dataset.workflowVersion;}function workflowBridgeCommit(){const effect=workflowBridgeSerialize();if(effect===workflowBridgeLastEffect)return {changed:false,summary:workflowBridgeSummary()};workflowBridgeLastEffect=effect;workflowBridgeCore.dataset.workflowVersion=String(Number(workflowBridgeCore.dataset.workflowVersion||0)+1);return {changed:true,summary:workflowBridgeSummary()};}function workflowBridgeScheduleCommit(){queueMicrotask(workflowBridgeCommit);setTimeout(workflowBridgeCommit,0);}workflowBridgeControl.addEventListener("click",workflowBridgeScheduleCommit);const workflowBridgeStateTargets=new Set(workflowBridgeCore.querySelectorAll('dialog'));if(workflowBridgeControlled&&workflowBridgeCore.contains(workflowBridgeControlled))workflowBridgeStateTargets.add(workflowBridgeControlled);workflowBridgeStateTargets.forEach(target=>['close','cancel','toggle'].forEach(eventName=>target.addEventListener(eventName,workflowBridgeScheduleCommit)));function workflowBridgeActivate(){workflowBridgeControl.focus();workflowBridgeControl.click();const result=workflowBridgeCommit();setTimeout(workflowBridgeCommit,0);return result;}function workflowBridgeReset(){workflowBridgeCore.dataset.workflowVersion='0';workflowBridgeLastEffect=workflowBridgeSerialize();}
const workflowSessionCore=document.querySelector('#workflowCore');const workflowSessionToggle=document.querySelector('#workflowSessionToggle');const workflowSessionLength=document.querySelector('#workflowSessionLength');const workflowSessionState={phase:'ready',elapsed:0,limit:Number(workflowSessionLength.value),checkpoints:[],timer:null};function workflowSessionFormat(seconds){return String(Math.floor(seconds/60)).padStart(2,'0')+':'+String(seconds%60).padStart(2,'0');}function workflowSessionDrive(){const percent=Math.min(100,Math.round(workflowSessionState.elapsed/workflowSessionState.limit*100));document.querySelector('#workflowSessionClock').textContent=workflowSessionFormat(Math.max(0,workflowSessionState.limit-workflowSessionState.elapsed));const progress=document.querySelector('#workflowSessionProgress');progress.setAttribute('aria-valuenow',String(percent));progress.querySelector('i').style.width=percent+'%';workflowSessionCore.dataset.sessionPhase=workflowSessionState.phase;document.querySelector('#workflowSessionScore').textContent=workflowSessionState.checkpoints.length+' points de contrôle d’interaction';}function workflowSessionLap(label){workflowSessionState.checkpoints.push({label,at:workflowSessionState.elapsed});const item=document.createElement('li');item.textContent=label+' · '+workflowSessionFormat(workflowSessionState.elapsed);document.querySelector('#workflowSessionLaps').append(item);workflowSessionDrive();}function workflowSessionStop(complete=false){clearInterval(workflowSessionState.timer);workflowSessionState.timer=null;workflowSessionState.phase=complete?'complete':'paused';workflowSessionToggle.textContent=complete?'Recommencer':'Tour suivant';workflowSessionToggle.setAttribute('aria-pressed','false');workflowSessionDrive();announce(complete?'Cycle terminé au guichet ambulatoire':'La ronde est suspendue');}function workflowSessionStart(){if(workflowSessionState.phase==='complete'){workflowSessionState.elapsed=0;workflowSessionState.checkpoints=[];document.querySelector('#workflowSessionLaps').replaceChildren();}workflowSessionState.phase='running';workflowSessionToggle.textContent='Tour de pause';workflowSessionToggle.setAttribute('aria-pressed','true');const bridge=workflowBridgeActivate();workflowSessionLap(bridge.summary);clearInterval(workflowSessionState.timer);workflowSessionState.timer=setInterval(()=>{workflowSessionState.elapsed+=1;if(workflowSessionState.elapsed>=workflowSessionState.limit){workflowSessionStop(true);return;}workflowSessionDrive();},1000);workflowSessionDrive();announce('Le tour de la salle de consultation a commencé · '+bridge.summary);}workflowSessionToggle.addEventListener('click',()=>workflowSessionState.phase==='running'?workflowSessionStop():workflowSessionStart());workflowSessionLength.addEventListener('input',()=>{workflowSessionState.limit=Number(workflowSessionLength.value);workflowSessionState.elapsed=Math.min(workflowSessionState.elapsed,workflowSessionState.limit);workflowSessionDrive();});workflowSessionCore.addEventListener('keydown',event=>{if(event.key==='Enter'||event.key===' '){workflowSessionLap('Opérations au clavier');}});workflowSessionCore.addEventListener('click',event=>{if(event.target.closest('[data-core-bridge]'))workflowSessionLap('Opération principale · '+workflowBridgeSummary());});document.addEventListener('visibilitychange',()=>{if(document.hidden&&workflowSessionState.phase==='running')workflowSessionStop();});workflowSessionDrive();
workflowBridgeReset();
  </script>
</body>
</html>
Commentaires sur la pageVous avez découvert un problème ou avez une suggestion d’amélioration ?
Les fonctions de retour nécessitent l’utilisation de la version en ligne

Veuillez activer JavaScript dans la version en ligne avant de soumettre ; les fonctionnalités locales de l’outil ou du cas ne sont pas affectées.

Aller vers la version en ligne pour envoyer des commentaires