Implémentation : sous le capot
L’état de Workspace v2 est géré par le store d’espaces de travail du framework. La plupart du code applicatif doit utiliser les APIs publiques au lieu de modifier directement le store :
launchWorkspace2pour ouvrir ou restaurer un espace de travaillaunchWorkspaceGroup2pour ouvrir un groupe avant le premier lancement de workspace lorsque votre application a besoin d’un contexte de groupe ou d’un menu d’actions app-widecloseWorkspaceGroup2pour fermer le groupe actuelWorkspace2DefinitionProps.closeWorkspacepour fermer un espace de travail depuis son composantWorkspace2DefinitionProps.launchChildWorkspacepour ouvrir des espaces de travail enfants dans la même fenêtre
Forme du store
Le store v2 suit les définitions enregistrées et l’interface actuellement ouverte :
registeredGroupsByName- définitions de groupes enregistrées depuisworkspaceGroups2registeredWindowsByName- définitions de fenêtres enregistrées depuisworkspaceWindows2registeredWorkspacesByName- définitions d’espaces de travail enregistrées depuisworkspaces2openedGroup- le groupe actuellement ouvert et ses props de groupeopenedWindows- les fenêtres ouvertes dans ce groupe, y compris la pile d’espaces de travail de chaque fenêtreisMostRecentlyOpenedWindowHidden- indique si la fenêtre au premier plan est actuellement masquéeworkspaceTitleByWorkspaceName- les titres fournis par chaque wrapper<Workspace2>rendu
Chaque fenêtre ouverte contient windowName, props, maximized et openedWorkspaces. Chaque espace de travail ouvert stocke son workspaceName, ses props de lancement, son uuid généré et son état hasUnsavedChanges.
Lire le contexte d’un espace de travail
Dans un composant d’espace de travail, utilisez les props fournies par Workspace2DefinitionProps ou le hook useWorkspace2Context pour lire le contexte de l’espace de travail courant :
import { useWorkspace2Context } from '@openmrs/esm-framework';
export function WorkspaceDebugPanel() {
const { workspaceName, windowName, workspaceProps, windowProps, groupProps } = useWorkspace2Context();
return (
<pre>
{JSON.stringify(
{
workspaceName,
windowName,
workspaceProps,
windowProps,
groupProps,
},
null,
2,
)}
</pre>
);
}Le store d’espaces de travail de bas niveau est un détail d’implémentation. Préférez les APIs publiques de lancement, fermeture, groupe et contexte sauf si vous travaillez dans le framework lui-même. Si un composant doit fermer toute la fenêtre au lieu de se fermer seulement lui-même avec ses espaces de travail enfants, appelez closeWorkspace({ closeWindow: true }).
Changements non enregistrés
Workspace v2 n’utilise pas promptBeforeClosing. À la place, transmettez hasUnsavedChanges au wrapper <Workspace2> :
<Workspace2 title={t('editVisit', 'Edit visit')} hasUnsavedChanges={formState.isDirty}>
{/* workspace content */}
</Workspace2>Quand un utilisateur ferme un espace de travail, ferme une fenêtre, change des props incompatibles ou change de groupe, le système vérifie les indicateurs hasUnsavedChanges des espaces de travail concernés et affiche une confirmation si nécessaire.
Après l’enregistrement, fermez l’espace de travail sans afficher l’invite de changements non enregistrés :
await closeWorkspace({ discardUnsavedChanges: true });