L'atelier et les docks

L'atelier (shell-dock.js) gère trois docks à onglets, avec redimensionnement, glisser-déposer entre zones et persistance. Il s'installe au DOM prêt et pose alors la clé shell.ready, puis expose K.shell.

Zones

ZoneCléTaille par défautUsage typique
Dock gaucheleft280 pxNavigation : fichiers, explorateur de base
Dock droitright340 pxContexte : historique, assistant, tableau de bord
Dock basbottom260 pxSortie : journal, problèmes, consoles
Il y a trois docks, et pas davantage. La zone centrale n'en est pas un : elle est tenue par zone-centrale.js et exposée sous K.zone, décrite en page La zone centrale à onglets. Déclarer un panneau avec dock: 'center' lève Zone de dock inconnue : pour ouvrir un panneau au centre, on passe par K.shell.placer.

Enregistrer un panneau

K.whenShellReady(function () { K.shell.registerPanel({ id: 'phreeqc.console', source: 'phreeqc', title: { fr: 'Console PHREEQC', en: 'PHREEQC console' }, icon: ICONE_SVG, dock: 'bottom', // REQUIS : left, right ou bottom factory: function (ctx) { var etat = ctx.state || { derniere: null }; var zone = document.createElement('div'); zone.style.cssText = 'height:100%;overflow:auto;'; ctx.root.appendChild(zone); var jeton = K.events.on('phreeqc.resultat', function (e) { etat.derniere = e.id; ctx.saveState(etat); rendre(zone, e); }); return { dispose: function () { jeton.dispose(); } }; } }); });
ChampRequisDescription
idOuiLève si absent. Le shell crée d'office la commande <id>.toggle, catégorie panneau.
dockOuiLève si la zone est inconnue. C'est la zone par défaut : l'utilisateur peut déplacer le panneau ailleurs.
titleOuiLibellés FR et EN, repris dans l'onglet et dans la commande de bascule.
factoryOuiAppelée à la première ouverture. Une exception affiche Panneau indisponible sans casser le dock.
sourceNoncore par défaut.
iconNonSVG inline, en currentColor pour suivre les jetons du thème actif.

Le contexte de fabrique

MembreDescription
ctx.panelIdIdentifiant du panneau.
ctx.rootÉlément DOM racine, déjà inséré dans le corps du dock.
ctx.stateL'état persisté, ou null. Propriété, pas fonction.
ctx.saveState(o)Persiste un objet sérialisable. Écriture différée.
ctx.close()Referme le panneau depuis l'intérieur.

La fabrique retourne un contrôleur, dont le dispose() est appelé à la fermeture, au déplacement et à chaque navigation.

Un minuteur non arrêté dans dispose() continue de tourner après la fermeture du panneau. Pour un panneau qui écrit en base, comme l'acquisition LIMS, cela produit des écritures invisibles : le panneau est fermé, l'utilisateur croit le balayage arrêté, et il continue.

Persistance et cycle de vie

registerPanel Onglet disponible Ouverture factory(ctx) Navigation dispose, puis factory

La disposition est stockée sous isofind_shell_v1 et n'est pas propre à une page : un panneau ouvert dans le tableau de bord reste ouvert après navigation vers Échantillons, mais il est détruit puis reconstruit. L'illusion de permanence tient entièrement à ctx.saveState().

Déplacer un panneau

Un onglet se glisse d'un dock à l'autre. Les docks fermés s'ouvrent pendant le glissement, et le panneau est détruit puis reconstruit à l'arrivée : son instance vit dans le corps de son dock, et la rattacher ailleurs sans la reconstruire laisserait un panneau dont le contexte de rendu ne correspond plus à son parent.

Un panneau ramené à sa zone d'origine ne laisse aucune entrée dans l'état : sinon une disposition mémorisée grossirait indéfiniment de choix qui n'en sont plus.

K.shell.open(id); K.shell.close(id); K.shell.toggle(id); K.shell.isOpen(id); K.shell.move(id, 'right'); K.shell.zoneOf(id); K.shell.zones; // ['left','right','bottom'] K.shell.reset(); // referme tout, rend a chacun sa zone declaree

Instantané et restauration

var snap = K.shell.snapshot(); { docks: { left: { taille: 280, ouverts: ['core.fichiers'], actif: 'core.fichiers' }, right: { taille: 340, ouverts: [], actif: null }, bottom: { taille: 260, ouverts: ['core.journal'], actif: 'core.journal' } }, zones: { 'core.problemes': 'right' } // panneaux deplaces hors de leur dock declare } K.shell.restore(snap);
Un instantané ne contient que la disposition : quels panneaux, où, à quelle taille. Il ne contient pas l'état interne des panneaux, ni leur filtre, ni leur échantillon courant, ni leur requête SQL. Une disposition replace des panneaux, elle ne rejoue pas ce qu'ils contenaient. Confondre les deux ferait qu'appliquer une disposition écraserait le travail en cours.

restore() détruit tous les panneaux vivants avant de réécrire l'état, et non après : ils sont enfants du dock où ils se trouvent aujourd'hui, et le rendu suivant les chercherait là où la disposition les place, sans jamais les retirer de leur ancien parent.

Réinitialiser

K.shell.reset(), ou Affichage › Réinitialiser la disposition, rend à chaque panneau la zone déclarée par son auteur et referme tout. C'est le recours quand une disposition devient inutilisable : un panneau déplacé dans un dock qu'on referme ensuite est introuvable autrement que par la palette.

Les quatre hôtes d'un panneau

Depuis la V2.0, le dock n'est plus le seul endroit où un panneau peut vivre. Le même panneau, avec le même contrat de fabrique, s'affiche indifféremment dans un dock, dans un onglet de la zone centrale, dans une fenêtre flottante posée au-dessus de l'application, ou dans une fenêtre système séparée.

HôteFichierCe qu'il apporte
Dockshell-dock.jsLes trois zones décrites plus haut, à onglets et redimensionnables.
Zone centralezone-centrale.jsUn onglet, scindable et épinglable, pour les panneaux qui ont besoin de largeur.
Fenêtre flottanteshell-flottant.jsUne fenêtre déplaçable et redimensionnable, dans le cadre de l'application.
Fenêtre détachéeshell-detach.jsUne fenêtre système, pour un second écran.
K.shell.placer('core.historique', 'centre'); // dock, centre, flottant, fenetre K.shell.hote('core.historique'); // ou il se trouve, ou null K.shell.ouvertQuelquePart('core.historique');

K.shell.placer sert d'arbitre unique : il ferme le panneau là où il se trouve avant de l'ouvrir ailleurs, de sorte qu'il n'existe jamais deux instances vivantes du même panneau. Le détail des surfaces, des gestes de dépôt et du drapeau detachable est en page Surfaces et fenêtres.