@plumile/backoffice-react 0.1.178 → 0.1.181
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +1 -1
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js +1 -0
- package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js +1 -1
- package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js.map +1 -1
- package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +1 -1
- package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js.map +1 -1
- package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js +2 -0
- package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +0 -2
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js +0 -1
- package/lib/esm/components/backoffice/links/BackofficeInlineLink.js +2 -2
- package/lib/esm/components/backoffice/links/BackofficeInlineLink.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeLink.js +2 -2
- package/lib/esm/components/backoffice/links/BackofficeLink.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +241 -228
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +2 -2
- package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js.map +1 -1
- package/lib/esm/hooks/useBackofficeListRefetch.js +18 -16
- package/lib/esm/hooks/useBackofficeListRefetch.js.map +1 -1
- package/lib/esm/hooks/useBackofficeListUrlState.js +23 -21
- package/lib/esm/hooks/useBackofficeListUrlState.js.map +1 -1
- package/lib/esm/i18n/locales/en/backofficeReact.js +1 -0
- package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
- package/lib/esm/i18n/locales/fr/backofficeReact.js +1 -0
- package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
- package/lib/esm/index.js +26 -25
- package/lib/esm/pages/BackofficeEntityDetailFramePage.js +45 -0
- package/lib/esm/pages/BackofficeEntityDetailFramePage.js.map +1 -0
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +74 -60
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.js +3 -3
- package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListDataPage.js +146 -0
- package/lib/esm/pages/BackofficeEntityListDataPage.js.map +1 -0
- package/lib/esm/pages/BackofficeEntityListPage.js +121 -132
- package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListRouteContext.js +15 -0
- package/lib/esm/pages/BackofficeEntityListRouteContext.js.map +1 -0
- package/lib/esm/pages/detail/buildTabsItems.js +1 -1
- package/lib/esm/pages/detail/buildTabsItems.js.map +1 -1
- package/lib/esm/provider/BackofficeProvider.js +63 -63
- package/lib/esm/provider/BackofficeProvider.js.map +1 -1
- package/lib/esm/relay/RelayProvider.js +2 -13
- package/lib/esm/relay/environment.js +2 -463
- package/lib/esm/relay/shortAccessTokenEnvironment.js +2 -15
- package/lib/esm/relay/useRelayOperationActivity.js +2 -0
- package/lib/esm/router/createBackofficeRoutes.js +169 -119
- package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
- package/lib/types/components/backoffice/links/BackofficeInlineLink.d.ts +3 -2
- package/lib/types/components/backoffice/links/BackofficeInlineLink.d.ts.map +1 -1
- package/lib/types/components/backoffice/links/BackofficeLink.d.ts +3 -2
- package/lib/types/components/backoffice/links/BackofficeLink.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/backofficeEntityListScaffold.css.d.ts +1 -0
- package/lib/types/components/backoffice/scaffolds/backofficeEntityListScaffold.css.d.ts.map +1 -1
- package/lib/types/hooks/useBackofficeListRefetch.d.ts +5 -4
- package/lib/types/hooks/useBackofficeListRefetch.d.ts.map +1 -1
- package/lib/types/hooks/useBackofficeListUrlState.d.ts.map +1 -1
- package/lib/types/i18n/resources.d.ts +2 -0
- package/lib/types/i18n/resources.d.ts.map +1 -1
- package/lib/types/index.d.ts +3 -2
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailFramePage.d.ts +14 -0
- package/lib/types/pages/BackofficeEntityDetailFramePage.d.ts.map +1 -0
- package/lib/types/pages/BackofficeEntityDetailLayoutPage.d.ts +2 -2
- package/lib/types/pages/BackofficeEntityDetailLayoutPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.d.ts +2 -11
- package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListDataPage.d.ts +8 -0
- package/lib/types/pages/BackofficeEntityListDataPage.d.ts.map +1 -0
- package/lib/types/pages/BackofficeEntityListPage.d.ts +5 -4
- package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListRouteContext.d.ts +22 -0
- package/lib/types/pages/BackofficeEntityListRouteContext.d.ts.map +1 -0
- package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
- package/lib/types/relay/RelayProvider.d.ts +1 -6
- package/lib/types/relay/RelayProvider.d.ts.map +1 -1
- package/lib/types/relay/environment.d.ts +1 -119
- package/lib/types/relay/environment.d.ts.map +1 -1
- package/lib/types/relay/shortAccessTokenEnvironment.d.ts +4 -3
- package/lib/types/relay/shortAccessTokenEnvironment.d.ts.map +1 -1
- package/lib/types/relay/useRelayOperationActivity.d.ts +2 -0
- package/lib/types/relay/useRelayOperationActivity.d.ts.map +1 -0
- package/lib/types/router/createBackofficeRoutes.d.ts +2 -0
- package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
- package/package.json +14 -12
- package/lib/esm/relay/RelayProvider.js.map +0 -1
- package/lib/esm/relay/environment.js.map +0 -1
- package/lib/esm/relay/shortAccessTokenEnvironment.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backofficeReact.js","names":[],"sources":["../../../../../src/i18n/locales/fr/backofficeReact.json"],"sourcesContent":["{\n \"actions\": {\n \"form\": {\n \"cancel\": \"Annuler\",\n \"errors\": {\n \"invalidJson\": \"{{label}} doit être un JSON valide.\",\n \"invalidJsonArray\": \"{{label}} doit être un tableau JSON valide.\",\n \"invalidJsonObject\": \"{{label}} doit être un objet JSON valide.\",\n \"invalidNumber\": \"{{label}} doit être un nombre valide.\",\n \"invalidPayload\": \"La charge utile soumise est invalide.\",\n \"required\": \"{{label}} est requis.\",\n \"submitFailed\": \"Impossible de terminer cette action. Veuillez réessayer.\"\n },\n \"submitting\": \"Envoi...\"\n },\n \"view\": \"Voir\"\n },\n \"auth\": {\n \"acceptInvitation\": {\n \"actions\": {\n \"backToLogin\": \"Retour à la connexion\"\n },\n \"errors\": {\n \"alreadyAccepted\": \"Cette invitation a déjà été acceptée.\",\n \"default\": \"Impossible d'accepter l'invitation.\",\n \"emailMismatch\": \"Cette invitation a été envoyée à une autre adresse email.\",\n \"expired\": \"Le lien d'invitation a expiré.\",\n \"invalidToken\": \"Le lien d'invitation est invalide.\",\n \"missingToken\": \"Le lien d'invitation est manquant ou invalide.\",\n \"passwordMismatch\": \"Le mot de passe et sa confirmation ne correspondent pas.\",\n \"passwordPolicyViolation\": \"Votre mot de passe ne respecte pas la politique de sécurité.\",\n \"rateLimited\": \"Trop de tentatives. Veuillez réessayer plus tard.\",\n \"unavailable\": \"L'acceptation d'invitation n'est pas disponible.\"\n },\n \"form\": {\n \"confirmLabel\": \"Confirmer le mot de passe\",\n \"confirmPlaceholder\": \"Confirmez votre mot de passe\",\n \"passwordLabel\": \"Mot de passe\",\n \"passwordPlaceholder\": \"Créez un mot de passe\",\n \"submit\": \"Accepter l'invitation\"\n },\n \"mfaSubtitle\": \"Entrez le code de vérification pour continuer.\",\n \"mfaTitle\": \"Vérifiez votre identité\",\n \"status\": {\n \"success\": \"Invitation acceptée.\",\n \"workingButton\": \"Traitement...\"\n },\n \"subtitle\": \"Créez votre compte pour rejoindre.\",\n \"title\": \"Accepter l'invitation\"\n },\n \"emailCapture\": {\n \"continue\": \"Continuer\",\n \"description\": \"Entrez votre email professionnel pour continuer.\",\n \"emailLabel\": \"Email professionnel\",\n \"emailPlaceholder\": \"vous@entreprise.com\",\n \"forgotPassword\": \"Mot de passe oublié ?\"\n },\n \"loginFlow\": {\n \"errors\": {\n \"accountLocked\": \"Trop de tentatives. Veuillez réessayer plus tard.\",\n \"emailRequired\": \"Entrez une adresse email pour continuer.\",\n \"invalidCredentials\": \"Email ou mot de passe incorrect.\",\n \"invalidEmail\": \"Entrez une adresse email valide.\",\n \"passkeyUnavailable\": \"Les passkeys ne sont pas disponibles.\",\n \"rateLimited\": \"Trop de tentatives. Veuillez réessayer plus tard.\",\n \"tryAgain\": \"Une erreur est survenue. Veuillez réessayer.\"\n },\n \"methods\": {\n \"title\": \"Choisissez une méthode de connexion\"\n },\n \"passkey\": {\n \"description\": \"Utilisez la passkey associée à {{email}}.\",\n \"title\": \"Utiliser une passkey\"\n },\n \"subtitle\": {\n \"default\": \"Choisissez une méthode de connexion pour continuer.\",\n \"mfa\": \"Entrez le code de vérification pour continuer.\"\n },\n \"title\": {\n \"default\": \"Se connecter\",\n \"mfa\": \"Authentification à deux facteurs\"\n }\n },\n \"logout\": {\n \"errors\": {\n \"default\": \"Échec de la déconnexion.\"\n }\n },\n \"methodChooser\": {\n \"actions\": {\n \"back\": \"Retour\"\n },\n \"locked\": \"Trop de tentatives. Veuillez réessayer plus tard.\",\n \"lockedWithTime\": \"Trop de tentatives. Veuillez réessayer à {{time}}.\",\n \"methods\": {\n \"other\": \"{{method}}\",\n \"passkey\": \"Passkey\",\n \"password\": \"Mot de passe\"\n },\n \"prompt\": \"Choisissez comment vous connecter pour <strong>{{email}}</strong>.\"\n },\n \"mfa\": {\n \"actions\": {\n \"back\": \"Retour\",\n \"submit\": \"Vérifier\"\n },\n \"errors\": {\n \"expired\": \"La session de vérification a expiré. Réessayez.\",\n \"invalidChallenge\": \"La session de vérification est invalide. Reprenez la connexion.\",\n \"invalidCode\": \"Code invalide. Réessayez.\",\n \"shortCode\": \"Entrez le code à 6 chiffres.\",\n \"tooManyAttempts\": \"Trop de tentatives. Veuillez réessayer plus tard.\",\n \"verificationFailed\": \"La vérification a échoué. Réessayez.\"\n },\n \"form\": {\n \"label\": \"Code de vérification\",\n \"placeholder\": \"123456\"\n },\n \"helper\": {\n \"default\": \"Entrez le code à 6 chiffres de votre authentificateur.\",\n \"withEmail\": \"Entrez le code à 6 chiffres envoyé à {{email}}.\"\n }\n },\n \"oidc\": {\n \"buttons\": {\n \"apple\": \"Continuer avec Apple\",\n \"generic\": \"Continuer avec un SSO\",\n \"google\": \"Continuer avec Google\"\n }\n },\n \"passkey\": {\n \"actions\": {\n \"showMethods\": \"Utiliser une autre méthode\",\n \"submit\": \"Continuer avec la passkey\",\n \"submitting\": \"En attente de la passkey...\"\n },\n \"errors\": {\n \"cancelled\": \"La connexion par passkey a été annulée.\",\n \"challengeExpired\": \"La demande de passkey a expiré. Réessayez.\",\n \"emailRequired\": \"Entrez votre email pour continuer.\",\n \"failed\": \"Échec de la connexion par passkey.\",\n \"invalidAssertion\": \"La réponse de passkey est invalide. Réessayez.\",\n \"invalidChallenge\": \"La demande de passkey est invalide. Réessayez.\",\n \"invalidEmail\": \"Entrez une adresse email valide.\",\n \"locked\": \"Trop de tentatives. Veuillez réessayer plus tard.\",\n \"lockedWithTime\": \"Trop de tentatives. Veuillez réessayer à {{time}}.\",\n \"noCredential\": \"L'authentificateur n'a retourné aucun identifiant.\",\n \"notAvailable\": \"Les passkeys ne sont pas disponibles sur cet appareil.\",\n \"notFound\": \"Aucune passkey n'est associée à ce compte.\"\n },\n \"form\": {\n \"emailLabel\": \"Email\",\n \"emailPlaceholder\": \"vous@entreprise.com\"\n },\n \"helper\": \"Utilisez une passkey à la place de votre mot de passe.\"\n },\n \"passwordLogin\": {\n \"forgotPassword\": \"Mot de passe oublié ?\",\n \"title\": \"Se connecter\"\n },\n \"passwordResetComplete\": {\n \"errors\": {\n \"expired\": \"Ce lien de réinitialisation a expiré.\",\n \"invalid\": \"Le lien de réinitialisation est invalide ou expiré.\",\n \"minLength\": \"Le mot de passe doit contenir au moins {{minLength}} caractères.\",\n \"mismatch\": \"Les mots de passe ne correspondent pas.\",\n \"missingToken\": \"Le lien de réinitialisation est manquant ou invalide.\",\n \"policyViolation\": \"Votre nouveau mot de passe ne respecte pas la politique de sécurité.\"\n },\n \"form\": {\n \"confirmLabel\": \"Confirmer le mot de passe\",\n \"confirmPlaceholder\": \"Saisissez à nouveau votre mot de passe\",\n \"description\": \"Entrez un nouveau mot de passe pour votre compte.\",\n \"passwordLabel\": \"Mot de passe\",\n \"passwordPlaceholder\": \"Entrez un nouveau mot de passe\",\n \"submit\": \"Mettre à jour le mot de passe\",\n \"title\": \"Nouveau mot de passe\"\n },\n \"subtitle\": \"Choisissez un mot de passe robuste pour sécuriser votre compte.\",\n \"success\": {\n \"action\": \"Retour à la connexion\",\n \"description\": \"Votre mot de passe a été modifié.\",\n \"helper\": \"Vous pouvez maintenant vous connecter avec votre nouveau mot de passe.\",\n \"title\": \"Mot de passe mis à jour\"\n },\n \"title\": \"Définir un nouveau mot de passe\"\n },\n \"passwordResetRequest\": {\n \"errors\": {\n \"emailRequired\": \"Entrez une adresse email.\",\n \"invalidEmail\": \"Veuillez saisir une adresse email valide.\",\n \"rateLimited\": \"Trop de demandes. Veuillez patienter puis réessayer.\",\n \"startFailed\": \"Impossible de démarrer la réinitialisation.\"\n },\n \"form\": {\n \"description\": \"Entrez l'email de votre compte.\",\n \"emailLabel\": \"Email\",\n \"emailPlaceholder\": \"vous@entreprise.com\",\n \"submit\": \"Envoyer le lien de réinitialisation\"\n },\n \"sent\": {\n \"action\": \"Envoyer un autre email\",\n \"description\": \"Nous avons envoyé un lien de réinitialisation à {{email}}.\",\n \"helper\": \"Si vous ne le voyez pas, vérifiez les spams ou réessayez.\",\n \"title\": \"Vérifiez votre email\"\n },\n \"title\": \"Réinitialiser votre mot de passe\"\n },\n \"verifyEmail\": {\n \"actions\": {\n \"continue\": \"Continuer\",\n \"return\": \"Retour à la connexion\"\n },\n \"errors\": {\n \"alreadyVerified\": \"Cette adresse email est déjà vérifiée.\",\n \"expired\": \"Ce lien de vérification a expiré.\",\n \"invalid\": \"Le lien de vérification est invalide ou expiré.\",\n \"missingToken\": \"Le lien de vérification est manquant ou invalide.\"\n },\n \"status\": {\n \"success\": \"Email vérifié. Vous pouvez continuer.\",\n \"verifying\": \"Vérification...\",\n \"verifyingButton\": \"Vérification\"\n },\n \"subtitle\": \"Confirmez votre adresse email pour continuer.\",\n \"title\": \"Vérifier votre email\"\n }\n },\n \"common\": {\n \"actions\": {\n \"close\": \"Fermer\",\n \"copied\": \"Copié\",\n \"copy\": \"Copier\",\n \"pick\": \"Choisir\",\n \"retry\": \"Réessayer\"\n },\n \"boolean\": {\n \"no\": \"Non\",\n \"yes\": \"Oui\"\n },\n \"breadcrumb\": \"Fil d'Ariane\",\n \"errors\": {\n \"unexpected\": \"Une erreur inattendue est survenue.\"\n },\n \"loading\": \"Chargement...\",\n \"notAvailable\": \"N/D\",\n \"time\": {\n \"lastDay\": \"24 h\",\n \"lastHour\": \"1 h\",\n \"lastSevenDays\": \"7 j\",\n \"lastThirtyDays\": \"30 j\"\n }\n },\n \"dashboard\": {\n \"actions\": {\n \"openList\": \"Ouvrir la liste\",\n \"openTool\": \"Ouvrir l'outil\"\n },\n \"subtitle\": \"Vue d'ensemble du contexte Work.\",\n \"title\": \"Tableau de bord\"\n },\n \"detail\": {\n \"actionResult\": {\n \"message\": \"Message\",\n \"status\": \"Statut\"\n },\n \"actions\": {\n \"backToList\": \"Retour à la liste\",\n \"viewDetails\": \"Voir le détail\"\n },\n \"columns\": {\n \"charged\": \"Facturé\",\n \"events\": \"Événements\",\n \"markup\": \"Marge\",\n \"name\": \"Nom\",\n \"rawCost\": \"Coût réel\"\n },\n \"notFound\": \"Introuvable\",\n \"notFoundDescription\": \"Cet élément n'existe pas ou n'est plus disponible.\"\n },\n \"emptyState\": {\n \"listEmpty\": {\n \"description\": \"Aucun enregistrement à afficher.\",\n \"title\": \"Aucun résultat\"\n },\n \"listEmptyFiltered\": {\n \"actions\": {\n \"reset\": \"Réinitialiser les filtres\"\n },\n \"description\": \"Aucun résultat ne correspond aux filtres actuels.\"\n }\n },\n \"filters\": {\n \"actions\": {\n \"applyFilter\": \"Appliquer le filtre {{label}}\",\n \"changeFilterValue\": \"Modifier {{label}}\",\n \"clearFilter\": \"Effacer le filtre {{label}}\",\n \"filterBy\": \"Filtrer par {{label}}\"\n },\n \"all\": \"Tous {{label}}\",\n \"boolean\": {\n \"no\": \"Non\",\n \"yes\": \"Oui\"\n },\n \"drawer\": {\n \"emptySearchResults\": \"Aucun filtre ne correspond à cette recherche.\"\n },\n \"placeholders\": {\n \"anyEntity\": \"Tous\",\n \"search\": \"Rechercher {{label}}\",\n \"unresolved\": \"ID introuvable\"\n },\n \"sections\": {\n \"default\": \"Filtres\"\n },\n \"trigger\": \"Filtres\",\n \"triggerWithCount_one\": \"Filtres ({{count}})\",\n \"triggerWithCount_many\": \"Filtres ({{count}})\",\n \"triggerWithCount_other\": \"Filtres ({{count}})\"\n },\n \"flags\": {\n \"agentManaged\": {\n \"agentManaged\": \"Géré par un agent\",\n \"userManaged\": \"Géré par un utilisateur\"\n },\n \"capability\": {\n \"allowed\": \"Autorisé\",\n \"denied\": \"Refusé\"\n },\n \"default\": {\n \"default\": \"Par défaut\",\n \"notDefault\": \"Non par défaut\"\n },\n \"deployedProduction\": {\n \"deployed\": \"Déployé\",\n \"notDeployed\": \"Non déployé\"\n },\n \"enabled\": {\n \"disabled\": \"Désactivé\",\n \"enabled\": \"Activé\"\n },\n \"encrypted\": {\n \"encrypted\": \"Chiffré\",\n \"notEncrypted\": \"Non chiffré\"\n },\n \"failure\": {\n \"failed\": \"Échoué\",\n \"ok\": \"OK\"\n },\n \"forced\": {\n \"forced\": \"Forcé\",\n \"normal\": \"Normal\"\n },\n \"locked\": {\n \"locked\": \"Verrouillé\",\n \"unlocked\": \"Déverrouillé\"\n }\n },\n \"format\": {\n \"currency\": \"{{value, currency}}\",\n \"number\": \"{{value, number}}\",\n \"percent\": \"{{value, percent}}\"\n },\n \"history\": \"\",\n \"hub\": {\n \"empty\": {\n \"description\": \"Aucun élément disponible ne correspond aux filtres actuels.\",\n \"title\": \"Aucun élément\"\n },\n \"itemKinds\": {\n \"entity\": \"Liste\",\n \"tool\": \"Outil\"\n },\n \"search\": {\n \"placeholder\": \"Rechercher\"\n },\n \"subtitle\": \"Choisissez un élément pour continuer.\"\n },\n \"list\": {\n \"actions\": {\n \"refresh\": \"Actualiser\",\n \"refreshing\": \"Actualisation…\",\n \"retry\": \"Réessayer\"\n },\n \"errors\": {\n \"tableFailed\": \"Le tableau n'a pas pu se charger.\",\n \"title\": \"Erreur du tableau\"\n },\n \"loaded_one\": \"{{count, number}} élément chargé\",\n \"loaded_many\": \"{{count, number}} éléments chargés\",\n \"loaded_other\": \"{{count, number}} éléments chargés\",\n \"loadMore\": {\n \"end\": \"Fin des résultats\",\n \"loading\": \"Chargement…\"\n },\n \"showing\": \"Affichage de {{shown, number}} sur {{total, number}}\",\n \"sort\": {\n \"label\": \"Ordre de tri\"\n },\n \"title\": \"\"\n },\n \"overview\": \"\",\n \"picker\": {\n \"errors\": {\n \"loadFailed\": \"Échec du chargement.\"\n },\n \"searchRequired\": \"Saisissez un ID pour rechercher.\",\n \"title\": \"Sélectionner un ID\",\n \"unavailable\": \"Sélecteur indisponible pour {{entity}}.\"\n },\n \"relations\": {\n \"menu\": {\n \"label\": \"Relations\"\n },\n \"openFilteredList\": \"Ouvrir la liste filtrée : {{label}}\"\n },\n \"review\": {\n \"status\": {\n \"approved\": \"Approuvé\",\n \"changesRequested\": \"Modifications demandées\",\n \"pending\": \"En attente\",\n \"unknown\": \"Inconnu\"\n }\n },\n \"sidebar\": {\n \"actions\": {\n \"collapseSidebar\": \"Fermer\",\n \"expandSidebar\": \"Ouvrir\",\n \"pin\": \"Épingler\",\n \"reorder\": \"Réordonner\",\n \"unpin\": \"Désépingler\"\n },\n \"items\": {\n \"dashboard\": \"Tableau de bord\"\n },\n \"navigationAriaLabel\": \"Navigation backoffice\",\n \"profile\": {\n \"actions\": {\n \"signOut\": \"Se déconnecter\"\n },\n \"menuAriaLabel\": \"Ouvrir le menu profil\",\n \"title\": \"Profil\",\n \"unknownUser\": \"Utilisateur inconnu\"\n },\n \"search\": {\n \"placeholder\": \"Rechercher...\"\n },\n \"sections\": {\n \"pinned\": \"Épinglés\",\n \"recent\": \"Récents\"\n }\n },\n \"tools\": {\n \"errors\": {\n \"description\": \"Impossible d'exécuter cet outil.\",\n \"details\": \"Détails de l'erreur\",\n \"label\": \"Erreur\",\n \"title\": \"Erreur d'outil\",\n \"unknown\": \"Erreur inconnue\"\n },\n \"forms\": {\n \"actions\": {\n \"insertExample\": \"Insérer l'exemple\",\n \"run\": \"Exécuter\"\n },\n \"inputJsonLabel\": \"JSON d'entrée\"\n },\n \"loading\": {\n \"description\": \"Exécution de l'outil...\"\n },\n \"output\": \"Résultat\"\n }\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"backofficeReact.js","names":[],"sources":["../../../../../src/i18n/locales/fr/backofficeReact.json"],"sourcesContent":["{\n \"actions\": {\n \"form\": {\n \"cancel\": \"Annuler\",\n \"errors\": {\n \"invalidJson\": \"{{label}} doit être un JSON valide.\",\n \"invalidJsonArray\": \"{{label}} doit être un tableau JSON valide.\",\n \"invalidJsonObject\": \"{{label}} doit être un objet JSON valide.\",\n \"invalidNumber\": \"{{label}} doit être un nombre valide.\",\n \"invalidPayload\": \"La charge utile soumise est invalide.\",\n \"required\": \"{{label}} est requis.\",\n \"submitFailed\": \"Impossible de terminer cette action. Veuillez réessayer.\"\n },\n \"submitting\": \"Envoi...\"\n },\n \"view\": \"Voir\"\n },\n \"auth\": {\n \"acceptInvitation\": {\n \"actions\": {\n \"backToLogin\": \"Retour à la connexion\"\n },\n \"errors\": {\n \"alreadyAccepted\": \"Cette invitation a déjà été acceptée.\",\n \"default\": \"Impossible d'accepter l'invitation.\",\n \"emailMismatch\": \"Cette invitation a été envoyée à une autre adresse email.\",\n \"expired\": \"Le lien d'invitation a expiré.\",\n \"invalidToken\": \"Le lien d'invitation est invalide.\",\n \"missingToken\": \"Le lien d'invitation est manquant ou invalide.\",\n \"passwordMismatch\": \"Le mot de passe et sa confirmation ne correspondent pas.\",\n \"passwordPolicyViolation\": \"Votre mot de passe ne respecte pas la politique de sécurité.\",\n \"rateLimited\": \"Trop de tentatives. Veuillez réessayer plus tard.\",\n \"unavailable\": \"L'acceptation d'invitation n'est pas disponible.\"\n },\n \"form\": {\n \"confirmLabel\": \"Confirmer le mot de passe\",\n \"confirmPlaceholder\": \"Confirmez votre mot de passe\",\n \"passwordLabel\": \"Mot de passe\",\n \"passwordPlaceholder\": \"Créez un mot de passe\",\n \"submit\": \"Accepter l'invitation\"\n },\n \"mfaSubtitle\": \"Entrez le code de vérification pour continuer.\",\n \"mfaTitle\": \"Vérifiez votre identité\",\n \"status\": {\n \"success\": \"Invitation acceptée.\",\n \"workingButton\": \"Traitement...\"\n },\n \"subtitle\": \"Créez votre compte pour rejoindre.\",\n \"title\": \"Accepter l'invitation\"\n },\n \"emailCapture\": {\n \"continue\": \"Continuer\",\n \"description\": \"Entrez votre email professionnel pour continuer.\",\n \"emailLabel\": \"Email professionnel\",\n \"emailPlaceholder\": \"vous@entreprise.com\",\n \"forgotPassword\": \"Mot de passe oublié ?\"\n },\n \"loginFlow\": {\n \"errors\": {\n \"accountLocked\": \"Trop de tentatives. Veuillez réessayer plus tard.\",\n \"emailRequired\": \"Entrez une adresse email pour continuer.\",\n \"invalidCredentials\": \"Email ou mot de passe incorrect.\",\n \"invalidEmail\": \"Entrez une adresse email valide.\",\n \"passkeyUnavailable\": \"Les passkeys ne sont pas disponibles.\",\n \"rateLimited\": \"Trop de tentatives. Veuillez réessayer plus tard.\",\n \"tryAgain\": \"Une erreur est survenue. Veuillez réessayer.\"\n },\n \"methods\": {\n \"title\": \"Choisissez une méthode de connexion\"\n },\n \"passkey\": {\n \"description\": \"Utilisez la passkey associée à {{email}}.\",\n \"title\": \"Utiliser une passkey\"\n },\n \"subtitle\": {\n \"default\": \"Choisissez une méthode de connexion pour continuer.\",\n \"mfa\": \"Entrez le code de vérification pour continuer.\"\n },\n \"title\": {\n \"default\": \"Se connecter\",\n \"mfa\": \"Authentification à deux facteurs\"\n }\n },\n \"logout\": {\n \"errors\": {\n \"default\": \"Échec de la déconnexion.\"\n }\n },\n \"methodChooser\": {\n \"actions\": {\n \"back\": \"Retour\"\n },\n \"locked\": \"Trop de tentatives. Veuillez réessayer plus tard.\",\n \"lockedWithTime\": \"Trop de tentatives. Veuillez réessayer à {{time}}.\",\n \"methods\": {\n \"other\": \"{{method}}\",\n \"passkey\": \"Passkey\",\n \"password\": \"Mot de passe\"\n },\n \"prompt\": \"Choisissez comment vous connecter pour <strong>{{email}}</strong>.\"\n },\n \"mfa\": {\n \"actions\": {\n \"back\": \"Retour\",\n \"submit\": \"Vérifier\"\n },\n \"errors\": {\n \"expired\": \"La session de vérification a expiré. Réessayez.\",\n \"invalidChallenge\": \"La session de vérification est invalide. Reprenez la connexion.\",\n \"invalidCode\": \"Code invalide. Réessayez.\",\n \"shortCode\": \"Entrez le code à 6 chiffres.\",\n \"tooManyAttempts\": \"Trop de tentatives. Veuillez réessayer plus tard.\",\n \"verificationFailed\": \"La vérification a échoué. Réessayez.\"\n },\n \"form\": {\n \"label\": \"Code de vérification\",\n \"placeholder\": \"123456\"\n },\n \"helper\": {\n \"default\": \"Entrez le code à 6 chiffres de votre authentificateur.\",\n \"withEmail\": \"Entrez le code à 6 chiffres envoyé à {{email}}.\"\n }\n },\n \"oidc\": {\n \"buttons\": {\n \"apple\": \"Continuer avec Apple\",\n \"generic\": \"Continuer avec un SSO\",\n \"google\": \"Continuer avec Google\"\n }\n },\n \"passkey\": {\n \"actions\": {\n \"showMethods\": \"Utiliser une autre méthode\",\n \"submit\": \"Continuer avec la passkey\",\n \"submitting\": \"En attente de la passkey...\"\n },\n \"errors\": {\n \"cancelled\": \"La connexion par passkey a été annulée.\",\n \"challengeExpired\": \"La demande de passkey a expiré. Réessayez.\",\n \"emailRequired\": \"Entrez votre email pour continuer.\",\n \"failed\": \"Échec de la connexion par passkey.\",\n \"invalidAssertion\": \"La réponse de passkey est invalide. Réessayez.\",\n \"invalidChallenge\": \"La demande de passkey est invalide. Réessayez.\",\n \"invalidEmail\": \"Entrez une adresse email valide.\",\n \"locked\": \"Trop de tentatives. Veuillez réessayer plus tard.\",\n \"lockedWithTime\": \"Trop de tentatives. Veuillez réessayer à {{time}}.\",\n \"noCredential\": \"L'authentificateur n'a retourné aucun identifiant.\",\n \"notAvailable\": \"Les passkeys ne sont pas disponibles sur cet appareil.\",\n \"notFound\": \"Aucune passkey n'est associée à ce compte.\"\n },\n \"form\": {\n \"emailLabel\": \"Email\",\n \"emailPlaceholder\": \"vous@entreprise.com\"\n },\n \"helper\": \"Utilisez une passkey à la place de votre mot de passe.\"\n },\n \"passwordLogin\": {\n \"forgotPassword\": \"Mot de passe oublié ?\",\n \"title\": \"Se connecter\"\n },\n \"passwordResetComplete\": {\n \"errors\": {\n \"expired\": \"Ce lien de réinitialisation a expiré.\",\n \"invalid\": \"Le lien de réinitialisation est invalide ou expiré.\",\n \"minLength\": \"Le mot de passe doit contenir au moins {{minLength}} caractères.\",\n \"mismatch\": \"Les mots de passe ne correspondent pas.\",\n \"missingToken\": \"Le lien de réinitialisation est manquant ou invalide.\",\n \"policyViolation\": \"Votre nouveau mot de passe ne respecte pas la politique de sécurité.\"\n },\n \"form\": {\n \"confirmLabel\": \"Confirmer le mot de passe\",\n \"confirmPlaceholder\": \"Saisissez à nouveau votre mot de passe\",\n \"description\": \"Entrez un nouveau mot de passe pour votre compte.\",\n \"passwordLabel\": \"Mot de passe\",\n \"passwordPlaceholder\": \"Entrez un nouveau mot de passe\",\n \"submit\": \"Mettre à jour le mot de passe\",\n \"title\": \"Nouveau mot de passe\"\n },\n \"subtitle\": \"Choisissez un mot de passe robuste pour sécuriser votre compte.\",\n \"success\": {\n \"action\": \"Retour à la connexion\",\n \"description\": \"Votre mot de passe a été modifié.\",\n \"helper\": \"Vous pouvez maintenant vous connecter avec votre nouveau mot de passe.\",\n \"title\": \"Mot de passe mis à jour\"\n },\n \"title\": \"Définir un nouveau mot de passe\"\n },\n \"passwordResetRequest\": {\n \"errors\": {\n \"emailRequired\": \"Entrez une adresse email.\",\n \"invalidEmail\": \"Veuillez saisir une adresse email valide.\",\n \"rateLimited\": \"Trop de demandes. Veuillez patienter puis réessayer.\",\n \"startFailed\": \"Impossible de démarrer la réinitialisation.\"\n },\n \"form\": {\n \"description\": \"Entrez l'email de votre compte.\",\n \"emailLabel\": \"Email\",\n \"emailPlaceholder\": \"vous@entreprise.com\",\n \"submit\": \"Envoyer le lien de réinitialisation\"\n },\n \"sent\": {\n \"action\": \"Envoyer un autre email\",\n \"description\": \"Nous avons envoyé un lien de réinitialisation à {{email}}.\",\n \"helper\": \"Si vous ne le voyez pas, vérifiez les spams ou réessayez.\",\n \"title\": \"Vérifiez votre email\"\n },\n \"title\": \"Réinitialiser votre mot de passe\"\n },\n \"verifyEmail\": {\n \"actions\": {\n \"continue\": \"Continuer\",\n \"return\": \"Retour à la connexion\"\n },\n \"errors\": {\n \"alreadyVerified\": \"Cette adresse email est déjà vérifiée.\",\n \"expired\": \"Ce lien de vérification a expiré.\",\n \"invalid\": \"Le lien de vérification est invalide ou expiré.\",\n \"missingToken\": \"Le lien de vérification est manquant ou invalide.\"\n },\n \"status\": {\n \"success\": \"Email vérifié. Vous pouvez continuer.\",\n \"verifying\": \"Vérification...\",\n \"verifyingButton\": \"Vérification\"\n },\n \"subtitle\": \"Confirmez votre adresse email pour continuer.\",\n \"title\": \"Vérifier votre email\"\n }\n },\n \"common\": {\n \"actions\": {\n \"close\": \"Fermer\",\n \"copied\": \"Copié\",\n \"copy\": \"Copier\",\n \"pick\": \"Choisir\",\n \"retry\": \"Réessayer\"\n },\n \"boolean\": {\n \"no\": \"Non\",\n \"yes\": \"Oui\"\n },\n \"breadcrumb\": \"Fil d'Ariane\",\n \"errors\": {\n \"unexpected\": \"Une erreur inattendue est survenue.\"\n },\n \"loading\": \"Chargement...\",\n \"notAvailable\": \"N/D\",\n \"time\": {\n \"lastDay\": \"24 h\",\n \"lastHour\": \"1 h\",\n \"lastSevenDays\": \"7 j\",\n \"lastThirtyDays\": \"30 j\"\n }\n },\n \"dashboard\": {\n \"actions\": {\n \"openList\": \"Ouvrir la liste\",\n \"openTool\": \"Ouvrir l'outil\"\n },\n \"subtitle\": \"Vue d'ensemble du contexte Work.\",\n \"title\": \"Tableau de bord\"\n },\n \"detail\": {\n \"actionResult\": {\n \"message\": \"Message\",\n \"status\": \"Statut\"\n },\n \"actions\": {\n \"backToList\": \"Retour à la liste\",\n \"viewDetails\": \"Voir le détail\"\n },\n \"columns\": {\n \"charged\": \"Facturé\",\n \"events\": \"Événements\",\n \"markup\": \"Marge\",\n \"name\": \"Nom\",\n \"rawCost\": \"Coût réel\"\n },\n \"notFound\": \"Introuvable\",\n \"notFoundDescription\": \"Cet élément n'existe pas ou n'est plus disponible.\"\n },\n \"emptyState\": {\n \"listEmpty\": {\n \"description\": \"Aucun enregistrement à afficher.\",\n \"title\": \"Aucun résultat\"\n },\n \"listEmptyFiltered\": {\n \"actions\": {\n \"reset\": \"Réinitialiser les filtres\"\n },\n \"description\": \"Aucun résultat ne correspond aux filtres actuels.\"\n }\n },\n \"filters\": {\n \"actions\": {\n \"applyFilter\": \"Appliquer le filtre {{label}}\",\n \"changeFilterValue\": \"Modifier {{label}}\",\n \"clearFilter\": \"Effacer le filtre {{label}}\",\n \"filterBy\": \"Filtrer par {{label}}\"\n },\n \"all\": \"Tous {{label}}\",\n \"boolean\": {\n \"no\": \"Non\",\n \"yes\": \"Oui\"\n },\n \"drawer\": {\n \"emptySearchResults\": \"Aucun filtre ne correspond à cette recherche.\"\n },\n \"placeholders\": {\n \"anyEntity\": \"Tous\",\n \"search\": \"Rechercher {{label}}\",\n \"unresolved\": \"ID introuvable\"\n },\n \"sections\": {\n \"default\": \"Filtres\"\n },\n \"trigger\": \"Filtres\",\n \"triggerWithCount_one\": \"Filtres ({{count}})\",\n \"triggerWithCount_many\": \"Filtres ({{count}})\",\n \"triggerWithCount_other\": \"Filtres ({{count}})\"\n },\n \"flags\": {\n \"agentManaged\": {\n \"agentManaged\": \"Géré par un agent\",\n \"userManaged\": \"Géré par un utilisateur\"\n },\n \"capability\": {\n \"allowed\": \"Autorisé\",\n \"denied\": \"Refusé\"\n },\n \"default\": {\n \"default\": \"Par défaut\",\n \"notDefault\": \"Non par défaut\"\n },\n \"deployedProduction\": {\n \"deployed\": \"Déployé\",\n \"notDeployed\": \"Non déployé\"\n },\n \"enabled\": {\n \"disabled\": \"Désactivé\",\n \"enabled\": \"Activé\"\n },\n \"encrypted\": {\n \"encrypted\": \"Chiffré\",\n \"notEncrypted\": \"Non chiffré\"\n },\n \"failure\": {\n \"failed\": \"Échoué\",\n \"ok\": \"OK\"\n },\n \"forced\": {\n \"forced\": \"Forcé\",\n \"normal\": \"Normal\"\n },\n \"locked\": {\n \"locked\": \"Verrouillé\",\n \"unlocked\": \"Déverrouillé\"\n }\n },\n \"format\": {\n \"currency\": \"{{value, currency}}\",\n \"number\": \"{{value, number}}\",\n \"percent\": \"{{value, percent}}\"\n },\n \"history\": \"\",\n \"hub\": {\n \"empty\": {\n \"description\": \"Aucun élément disponible ne correspond aux filtres actuels.\",\n \"title\": \"Aucun élément\"\n },\n \"itemKinds\": {\n \"entity\": \"Liste\",\n \"tool\": \"Outil\"\n },\n \"search\": {\n \"placeholder\": \"Rechercher\"\n },\n \"subtitle\": \"Choisissez un élément pour continuer.\"\n },\n \"list\": {\n \"actions\": {\n \"refresh\": \"Actualiser\",\n \"refreshing\": \"Actualisation…\",\n \"retry\": \"Réessayer\"\n },\n \"errors\": {\n \"tableFailed\": \"Le tableau n'a pas pu se charger.\",\n \"title\": \"Erreur du tableau\"\n },\n \"loaded_one\": \"{{count, number}} élément chargé\",\n \"loaded_many\": \"{{count, number}} éléments chargés\",\n \"loaded_other\": \"{{count, number}} éléments chargés\",\n \"loadMore\": {\n \"end\": \"Fin des résultats\",\n \"loading\": \"Chargement…\"\n },\n \"refreshingRows\": \"Filtrage en cours…\",\n \"showing\": \"Affichage de {{shown, number}} sur {{total, number}}\",\n \"sort\": {\n \"label\": \"Ordre de tri\"\n },\n \"title\": \"\"\n },\n \"overview\": \"\",\n \"picker\": {\n \"errors\": {\n \"loadFailed\": \"Échec du chargement.\"\n },\n \"searchRequired\": \"Saisissez un ID pour rechercher.\",\n \"title\": \"Sélectionner un ID\",\n \"unavailable\": \"Sélecteur indisponible pour {{entity}}.\"\n },\n \"relations\": {\n \"menu\": {\n \"label\": \"Relations\"\n },\n \"openFilteredList\": \"Ouvrir la liste filtrée : {{label}}\"\n },\n \"review\": {\n \"status\": {\n \"approved\": \"Approuvé\",\n \"changesRequested\": \"Modifications demandées\",\n \"pending\": \"En attente\",\n \"unknown\": \"Inconnu\"\n }\n },\n \"sidebar\": {\n \"actions\": {\n \"collapseSidebar\": \"Fermer\",\n \"expandSidebar\": \"Ouvrir\",\n \"pin\": \"Épingler\",\n \"reorder\": \"Réordonner\",\n \"unpin\": \"Désépingler\"\n },\n \"items\": {\n \"dashboard\": \"Tableau de bord\"\n },\n \"navigationAriaLabel\": \"Navigation backoffice\",\n \"profile\": {\n \"actions\": {\n \"signOut\": \"Se déconnecter\"\n },\n \"menuAriaLabel\": \"Ouvrir le menu profil\",\n \"title\": \"Profil\",\n \"unknownUser\": \"Utilisateur inconnu\"\n },\n \"search\": {\n \"placeholder\": \"Rechercher...\"\n },\n \"sections\": {\n \"pinned\": \"Épinglés\",\n \"recent\": \"Récents\"\n }\n },\n \"tools\": {\n \"errors\": {\n \"description\": \"Impossible d'exécuter cet outil.\",\n \"details\": \"Détails de l'erreur\",\n \"label\": \"Erreur\",\n \"title\": \"Erreur d'outil\",\n \"unknown\": \"Erreur inconnue\"\n },\n \"forms\": {\n \"actions\": {\n \"insertExample\": \"Insérer l'exemple\",\n \"run\": \"Exécuter\"\n },\n \"inputJsonLabel\": \"JSON d'entrée\"\n },\n \"loading\": {\n \"description\": \"Exécution de l'outil...\"\n },\n \"output\": \"Résultat\"\n }\n}\n"],"mappings":""}
|
package/lib/esm/index.js
CHANGED
|
@@ -49,28 +49,29 @@ import { BackofficeToolsErrorFallback as Q } from "./components/backoffice/tools
|
|
|
49
49
|
import { BackofficeToolsJsonForm as $ } from "./components/backoffice/tools/BackofficeToolsJsonForm.js";
|
|
50
50
|
import { BackofficeToolsQueryBoundary as te } from "./components/backoffice/tools/BackofficeToolsQueryBoundary.js";
|
|
51
51
|
import { parseToolJson as ne } from "./components/backoffice/tools/parseToolJson.js";
|
|
52
|
-
import { configureRelayEnvironment as re, getEnvironment as ie, getNetwork as ae,
|
|
53
|
-
import { base64UrlToBuffer as
|
|
54
|
-
import { createUseAuth as
|
|
55
|
-
import { useBackofficeListUrlState as
|
|
56
|
-
import { useConditionalSubscription as
|
|
57
|
-
import
|
|
58
|
-
import
|
|
59
|
-
import { useRefetchNeededReload as
|
|
60
|
-
import { createI18nInstance as
|
|
61
|
-
import { backofficeReactI18nResources as
|
|
62
|
-
import { useReviewStatusLabel as
|
|
63
|
-
import {
|
|
64
|
-
import {
|
|
65
|
-
import {
|
|
66
|
-
import {
|
|
67
|
-
import {
|
|
68
|
-
import {
|
|
69
|
-
import {
|
|
70
|
-
import {
|
|
71
|
-
import {
|
|
72
|
-
import {
|
|
73
|
-
import {
|
|
74
|
-
import {
|
|
75
|
-
import {
|
|
76
|
-
|
|
52
|
+
import { configureRelayEnvironment as re, getEnvironment as ie, getNetwork as ae, getRelayOperationActivitySnapshot as oe, getRelayTransportSnapshot as se, reconnectRelayWebSocket as ce, refreshRelayWebSocketAuthentication as le, resetRelayStore as ue, subscribeRelayOperationActivity as de, subscribeRelayTransport as fe } from "./relay/environment.js";
|
|
53
|
+
import { base64UrlToBuffer as pe, bufferToBase64Url as me, mapWebAuthnRegistrationError as he, parseSignCount as ge } from "./modules/webauthn.js";
|
|
54
|
+
import { createUseAuth as _e } from "./hooks/useAuth.js";
|
|
55
|
+
import { useBackofficeListUrlState as ve } from "./hooks/useBackofficeListUrlState.js";
|
|
56
|
+
import { useConditionalSubscription as ye } from "./hooks/useConditionalSubscription.js";
|
|
57
|
+
import be from "./hooks/useCopyToClipboard.js";
|
|
58
|
+
import xe from "./hooks/useInfiniteConnection.js";
|
|
59
|
+
import { useRefetchNeededReload as Se } from "./hooks/useRefetchNeededReload.js";
|
|
60
|
+
import { createI18nInstance as Ce } from "./i18n/createI18nInstance.js";
|
|
61
|
+
import { backofficeReactI18nResources as we, withBackofficeReactI18nResources as Te } from "./i18n/resources.js";
|
|
62
|
+
import { useReviewStatusLabel as Ee } from "./i18n/useReviewStatusLabel.js";
|
|
63
|
+
import { BackofficeProvider as De } from "./provider/BackofficeProvider.js";
|
|
64
|
+
import { createBackofficeLazyValue as Oe } from "./provider/lazyValue.js";
|
|
65
|
+
import { decodeBase64ToUtf8 as ke, encodeUtf8ToBase64 as Ae } from "./modules/base64.js";
|
|
66
|
+
import { formatFileSize as je } from "./modules/formatFileSize.js";
|
|
67
|
+
import { uploadFilesSequentially as Me } from "./modules/uploads.js";
|
|
68
|
+
import { resolveVisibleDetailPages as Ne } from "./pages/detail/pageResolution.js";
|
|
69
|
+
import { createInlineDataReader as Pe } from "./relay/createInlineReader.js";
|
|
70
|
+
import { appendNodeToConnections as Fe } from "./relay/connectionUtils.js";
|
|
71
|
+
import { RelayProvider as Ie } from "./relay/RelayProvider.js";
|
|
72
|
+
import { useRelayOperationActivity as Le } from "./relay/useRelayOperationActivity.js";
|
|
73
|
+
import { configureBackofficeShortAccessTokenRelayEnvironment as Re, configureShortAccessTokenRelayEnvironment as ze } from "./relay/shortAccessTokenEnvironment.js";
|
|
74
|
+
import { useMutationAction as Be } from "./relay/useMutationAction.js";
|
|
75
|
+
import { identityView as Ve } from "./relay/identityView.js";
|
|
76
|
+
import { useCursorResumableSubscription as He } from "./subscriptions/useCursorResumableSubscription.js";
|
|
77
|
+
export { o as AcceptInvitationScreen, e as AuthRefreshNotice, v as BackofficeBillingUsageChart, w as BackofficeDetailBadgeRow, G as BackofficeEntityLink, E as BackofficeEntitySummaryHeader, D as BackofficeEnumLabel, g as BackofficeErrorBoundary, I as BackofficeFilterAction, W as BackofficeFilterableCell, Y as BackofficeFormattedCurrency, ee as BackofficeFormattedNumber, z as BackofficeHubTemplate, X as BackofficeInlineFilterRow, S as BackofficeInlineLink, K as BackofficeLazyEntityCount, O as BackofficeLifecycleTimelineSection, B as BackofficeLink, V as BackofficeLinkLabel, U as BackofficeOverviewLayout, De as BackofficeProvider, k as BackofficeReferenceValue, q as BackofficeRelatedCountLink, A as BackofficeRelationGrid, A as BackofficeRelationsSummaryGrid, H as BackofficeRightPageLayout, j as BackofficeStatusGroup, T as BackofficeStatusMetaBadge, J as BackofficeTabbedDetailShell, M as BackofficeTokenUsageBreakdown, Z as BackofficeToolsDocPanel, Q as BackofficeToolsErrorFallback, $ as BackofficeToolsJsonForm, te as BackofficeToolsQueryBoundary, N as BackofficeUsageCostBreakdown, L as EntityFilterValue, R as EntityFilterValueText, h as EntityIdFilterField, _ as EntityIdPickerDialog, i as LoginFlow, s as PasswordResetCompleteScreen, c as PasswordResetRequestScreen, Ie as RelayProvider, n as TotpQrCode, l as VerifyEmailScreen, Fe as appendNodeToConnections, we as backofficeReactI18nResources, pe as base64UrlToBuffer, me as bufferToBase64Url, C as buildDataTableColumns, r as buildTotpOtpAuthUri, Re as configureBackofficeShortAccessTokenRelayEnvironment, re as configureRelayEnvironment, ze as configureShortAccessTokenRelayEnvironment, P as createBackofficeEntityLinkProps, Oe as createBackofficeLazyValue, Ce as createI18nInstance, Pe as createInlineDataReader, _e as createUseAuth, ke as decodeBase64ToUtf8, Ae as encodeUtf8ToBase64, je as formatFileSize, F as formatListAsMarkdown, ie as getEnvironment, ae as getNetwork, oe as getRelayOperationActivitySnapshot, se as getRelayTransportSnapshot, Ve as identityView, he as mapWebAuthnRegistrationError, ge as parseSignCount, ne as parseToolJson, ce as reconnectRelayWebSocket, le as refreshRelayWebSocketAuthentication, u as requireField, d as requireLinkedRecordId, ue as resetRelayStore, f as resolveAgentStartOutcome, b as resolveBackofficeLink, y as resolveBackofficeTargetIcon, p as resolveMutationOutcome, Ne as resolveVisibleDetailPages, de as subscribeRelayOperationActivity, fe as subscribeRelayTransport, a as synchronizeAuthStatusQuery, Me as uploadFilesSequentially, t as useAuthRefreshStateSnapshot, m as useBackofficeConfig, x as useBackofficeLink, ve as useBackofficeListUrlState, ye as useConditionalSubscription, be as useCopyToClipboard, He as useCursorResumableSubscription, xe as useInfiniteConnection, Be as useMutationAction, Se as useRefetchNeededReload, Le as useRelayOperationActivity, Ee as useReviewStatusLabel, Te as withBackofficeReactI18nResources };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useBackofficeReactTranslation as e } from "../i18n/useBackofficeReactTranslation.js";
|
|
2
|
+
import { BackofficeRightPageLayout as t } from "../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js";
|
|
3
|
+
import { BackofficeStaticRouteFallback as n } from "../components/backoffice/routing/BackofficeRouteFallback.js";
|
|
4
|
+
import { Suspense as r } from "react";
|
|
5
|
+
import { jsx as i } from "react/jsx-runtime";
|
|
6
|
+
import { useTranslation as a } from "react-i18next";
|
|
7
|
+
import { BackofficePageHeader as o } from "@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js";
|
|
8
|
+
import { DetailPageTemplate as s } from "@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js";
|
|
9
|
+
//#region src/pages/BackofficeEntityDetailFramePage.tsx
|
|
10
|
+
var c = ({ entityManifest: r, id: c }) => {
|
|
11
|
+
let { t: l } = a(), { t: u } = e(), d = u("common.loading");
|
|
12
|
+
return /* @__PURE__ */ i(t, {
|
|
13
|
+
breadcrumb: [{
|
|
14
|
+
kind: "link",
|
|
15
|
+
target: {
|
|
16
|
+
kind: "entity-list",
|
|
17
|
+
entityId: r.id
|
|
18
|
+
},
|
|
19
|
+
label: r.label(l)
|
|
20
|
+
}, {
|
|
21
|
+
kind: "current",
|
|
22
|
+
target: {
|
|
23
|
+
kind: "entity-detail",
|
|
24
|
+
entityId: r.id,
|
|
25
|
+
id: c
|
|
26
|
+
},
|
|
27
|
+
label: d
|
|
28
|
+
}],
|
|
29
|
+
children: /* @__PURE__ */ i(s, {
|
|
30
|
+
headerNode: /* @__PURE__ */ i(o, { title: d }),
|
|
31
|
+
headerDensity: "compact",
|
|
32
|
+
children: /* @__PURE__ */ i(n, { label: d })
|
|
33
|
+
})
|
|
34
|
+
});
|
|
35
|
+
}, l = ({ children: e, entityManifest: t, prepared: n }) => /* @__PURE__ */ i(r, {
|
|
36
|
+
fallback: /* @__PURE__ */ i(c, {
|
|
37
|
+
entityManifest: t,
|
|
38
|
+
id: n.id
|
|
39
|
+
}),
|
|
40
|
+
children: e
|
|
41
|
+
});
|
|
42
|
+
//#endregion
|
|
43
|
+
export { c as BackofficeEntityDetailFrameFallback, l as BackofficeEntityDetailFramePage, l as default };
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=BackofficeEntityDetailFramePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackofficeEntityDetailFramePage.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailFramePage.tsx"],"sourcesContent":["import { Suspense, type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedDetailFrameRoute,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { BackofficeStaticRouteFallback } from '../components/backoffice/routing/BackofficeRouteFallback.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\n\nexport type BackofficeEntityDetailFramePageProps = {\n children?: ReactNode;\n entityManifest: BackofficeEntityManifestItem;\n prepared: BackofficePreparedDetailFrameRoute;\n};\n\nexport const BackofficeEntityDetailFrameFallback = ({\n entityManifest,\n id,\n}: {\n entityManifest: BackofficeEntityManifestItem;\n id: string;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const loadingLabel = t('common.loading');\n\n return (\n <BackofficeRightPageLayout\n breadcrumb={[\n {\n kind: 'link',\n target: {\n kind: 'entity-list',\n entityId: entityManifest.id,\n },\n label: entityManifest.label(tApp),\n },\n {\n kind: 'current',\n target: {\n kind: 'entity-detail',\n entityId: entityManifest.id,\n id,\n },\n label: loadingLabel,\n },\n ]}\n >\n <DetailPageTemplate\n headerNode={<BackofficePageHeader title={loadingLabel} />}\n headerDensity=\"compact\"\n >\n <BackofficeStaticRouteFallback label={loadingLabel} />\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n );\n};\n\nexport const BackofficeEntityDetailFramePage = ({\n children,\n entityManifest,\n prepared,\n}: BackofficeEntityDetailFramePageProps): JSX.Element => {\n return (\n <Suspense\n fallback={\n <BackofficeEntityDetailFrameFallback\n entityManifest={entityManifest}\n id={prepared.id}\n />\n }\n >\n {children}\n </Suspense>\n );\n};\n\nexport default BackofficeEntityDetailFramePage;\n"],"mappings":";;;;;;;;;AAoBA,IAAa,KAAuC,EAClD,mBACA,YAIiB;CACjB,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,IAAe,EAAE,gBAAgB;CAEvC,OACE,kBAAC,GAAD;EACE,YAAY,CACV;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAe;GAC3B;GACA,OAAO,EAAe,MAAM,CAAI;EAClC,GACA;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,UAAU,EAAe;IACzB;GACF;GACA,OAAO;EACT,CACF;YAEA,kBAAC,GAAD;GACE,YAAY,kBAAC,GAAD,EAAsB,OAAO,EAAe,CAAA;GACxD,eAAc;aAEd,kBAAC,GAAD,EAA+B,OAAO,EAAe,CAAA;EACnC,CAAA;CACK,CAAA;AAE/B,GAEa,KAAmC,EAC9C,aACA,mBACA,kBAGE,kBAAC,GAAD;CACE,UACE,kBAAC,GAAD;EACkB;EAChB,IAAI,EAAS;CACd,CAAA;CAGF;AACO,CAAA"}
|
|
@@ -13,91 +13,102 @@ import { resolveHeaderItems as h } from "./BackofficeEntityDetailPage.view-helpe
|
|
|
13
13
|
import { BackofficeEntityDetailLayoutContextProvider as g } from "./detail/BackofficeEntityDetailLayoutContext.js";
|
|
14
14
|
import { buildTabsItems as te } from "./detail/buildTabsItems.js";
|
|
15
15
|
import { BackofficeRedirect as _ } from "./BackofficeRedirect.js";
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import { useTranslation as
|
|
19
|
-
import * as
|
|
20
|
-
import { Spinner as
|
|
21
|
-
import
|
|
22
|
-
import { FormattedDate as
|
|
23
|
-
import { BACKOFFICE_DATE_TIME_OPTIONS as
|
|
24
|
-
import
|
|
25
|
-
import { Tag as
|
|
26
|
-
import { buildBackofficeFallbackListHref as
|
|
27
|
-
import { setWhereValue as
|
|
28
|
-
import
|
|
29
|
-
import { BackofficePageHeader as
|
|
30
|
-
import { Tabs as
|
|
31
|
-
import { DetailPageTemplate as
|
|
32
|
-
import { BackofficeKeyValueList as
|
|
33
|
-
import { BackofficeRelationsMenu as
|
|
16
|
+
import { Suspense as ne, useContext as re } from "react";
|
|
17
|
+
import { jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
18
|
+
import { useTranslation as b } from "react-i18next";
|
|
19
|
+
import * as x from "react-relay";
|
|
20
|
+
import { Spinner as S } from "@plumile/ui/backoffice/atoms/spinner/Spinner.js";
|
|
21
|
+
import C from "@plumile/router/routing/RoutingContext.js";
|
|
22
|
+
import { FormattedDate as w } from "@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js";
|
|
23
|
+
import { BACKOFFICE_DATE_TIME_OPTIONS as T } from "@plumile/backoffice-core/constants.js";
|
|
24
|
+
import ie from "@plumile/router/routing/Link.js";
|
|
25
|
+
import { Tag as ae } from "@plumile/ui/backoffice/atoms/tag/Tag.js";
|
|
26
|
+
import { buildBackofficeFallbackListHref as oe, buildBackofficeListHref as se, buildBackofficeListLink as ce } from "@plumile/backoffice-core/state/buildListHref.js";
|
|
27
|
+
import { setWhereValue as le } from "@plumile/backoffice-core/filters/where.js";
|
|
28
|
+
import E from "@plumile/router/routing/useLocation.js";
|
|
29
|
+
import { BackofficePageHeader as D } from "@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js";
|
|
30
|
+
import { Tabs as O } from "@plumile/ui/atomic/molecules/tabs/Tabs.js";
|
|
31
|
+
import { DetailPageTemplate as k } from "@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js";
|
|
32
|
+
import { BackofficeKeyValueList as A } from "@plumile/ui/backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.js";
|
|
33
|
+
import { BackofficeRelationsMenu as j } from "@plumile/ui/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js";
|
|
34
34
|
//#region src/pages/BackofficeEntityDetailLayoutPage.tsx
|
|
35
|
-
var { usePreloadedQuery:
|
|
35
|
+
var { usePreloadedQuery: M } = x, N = (e) => e.trim().replace(/^\/+|\/+$/g, ""), P = (e, t, n) => [n.pages.mainPage, ...n.pages.subPages ?? []].find((r) => e === n.routes.detailPage(t, r.id))?.path ?? "", F = () => /* @__PURE__ */ v("span", {
|
|
36
36
|
className: f,
|
|
37
|
-
children: /* @__PURE__ */
|
|
38
|
-
}),
|
|
39
|
-
let { t
|
|
37
|
+
children: /* @__PURE__ */ v(S, { size: 12 })
|
|
38
|
+
}), I = () => {
|
|
39
|
+
let { t } = e();
|
|
40
|
+
return /* @__PURE__ */ v("div", {
|
|
41
|
+
role: "status",
|
|
42
|
+
"aria-live": "polite",
|
|
43
|
+
"aria-busy": "true",
|
|
44
|
+
children: /* @__PURE__ */ v(S, {
|
|
45
|
+
size: 20,
|
|
46
|
+
ariaLabel: t("common.loading")
|
|
47
|
+
})
|
|
48
|
+
});
|
|
49
|
+
}, L = ({ config: s, prepared: f, layoutNodeRef: x, children: S }) => {
|
|
50
|
+
let { t: M } = b(), { t: L } = e(), { entities: R, entityRegistry: z } = t(), { pathname: B } = E(), V = re(C), H = n(s.layoutPage.fragment, x), U = s.layoutPage.toView(H), W = P(B, f.id, s), G = c({
|
|
40
51
|
mainPage: s.pages.mainPage,
|
|
41
52
|
subPages: s.pages.subPages,
|
|
42
53
|
activePagePath: W,
|
|
43
54
|
node: U
|
|
44
55
|
});
|
|
45
|
-
if (!G.hasVisiblePages || G.activePage == null) return /* @__PURE__ */
|
|
56
|
+
if (!G.hasVisiblePages || G.activePage == null) return /* @__PURE__ */ v(_, { to: s.routes.list });
|
|
46
57
|
let { activePage: K } = G;
|
|
47
|
-
if (W !== "" &&
|
|
58
|
+
if (W !== "" && N(K.path) !== N(W)) return /* @__PURE__ */ v(_, { to: s.routes.detailPage(f.id, K.id) });
|
|
48
59
|
let q = te({
|
|
49
60
|
pages: G.pages,
|
|
50
61
|
id: f.id,
|
|
51
|
-
tApp:
|
|
62
|
+
tApp: M,
|
|
52
63
|
detailPageHref: s.routes.detailPage
|
|
53
64
|
}), J = h(s.header, U, {
|
|
54
|
-
tApp:
|
|
65
|
+
tApp: M,
|
|
55
66
|
t: L,
|
|
56
67
|
resolveEntityHref: (e, t) => {
|
|
57
68
|
let n = R[e];
|
|
58
69
|
return n == null ? null : n.routes.detail(t);
|
|
59
70
|
},
|
|
60
|
-
renderLink: (e, t) => /* @__PURE__ */
|
|
71
|
+
renderLink: (e, t) => /* @__PURE__ */ v(ie, {
|
|
61
72
|
to: e,
|
|
62
|
-
|
|
73
|
+
preloadOnHover: "code-and-data",
|
|
63
74
|
children: t
|
|
64
75
|
}),
|
|
65
|
-
renderDate: (e, t) => /* @__PURE__ */
|
|
76
|
+
renderDate: (e, t) => /* @__PURE__ */ v(w, {
|
|
66
77
|
value: e,
|
|
67
|
-
options:
|
|
78
|
+
options: T,
|
|
68
79
|
fallback: t
|
|
69
80
|
}),
|
|
70
|
-
renderTag: (e, t) => /* @__PURE__ */
|
|
81
|
+
renderTag: (e, t) => /* @__PURE__ */ v(ae, {
|
|
71
82
|
tone: e,
|
|
72
83
|
children: t
|
|
73
84
|
}),
|
|
74
|
-
renderBadgeRow: (e) => /* @__PURE__ */
|
|
85
|
+
renderBadgeRow: (e) => /* @__PURE__ */ v(r, { items: e })
|
|
75
86
|
}), Y = (s.relations ?? []).flatMap((e) => {
|
|
76
87
|
let { filterId: t, path: n, target: r, whereKey: i } = e, a = m(e.value(U));
|
|
77
88
|
if (a == null) return [];
|
|
78
89
|
let s = R[r];
|
|
79
90
|
if (s?.hasList !== !0) return [];
|
|
80
|
-
let c =
|
|
91
|
+
let c = le(null, i, a, n);
|
|
81
92
|
if (c == null) return [];
|
|
82
93
|
let l = z.getLoadedListEntity(r), u = t;
|
|
83
94
|
u ?? (u = i, n != null && (u = `${i}.${n.join(".")}`));
|
|
84
95
|
let d;
|
|
85
|
-
return d = l == null ?
|
|
96
|
+
return d = l == null ? oe(s.routes.list, c, [{
|
|
86
97
|
id: u,
|
|
87
98
|
value: a
|
|
88
|
-
}]) :
|
|
99
|
+
}]) : se(l.config, { where: c }), [{
|
|
89
100
|
id: e.id,
|
|
90
|
-
label: p(e.label,
|
|
91
|
-
count: /* @__PURE__ */
|
|
101
|
+
label: p(e.label, M),
|
|
102
|
+
count: /* @__PURE__ */ v(o, {
|
|
92
103
|
entity: r,
|
|
93
|
-
loadingFallback: /* @__PURE__ */
|
|
104
|
+
loadingFallback: /* @__PURE__ */ v(F, {}),
|
|
94
105
|
where: c
|
|
95
106
|
}),
|
|
96
107
|
href: d,
|
|
97
108
|
onClick: async (e) => {
|
|
98
109
|
if (V == null || e.defaultPrevented || e.button !== 0 || e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) return;
|
|
99
110
|
e.preventDefault();
|
|
100
|
-
let t =
|
|
111
|
+
let t = ce((await z.loadListEntity(r)).config, { where: c }), n = "";
|
|
101
112
|
t.search !== "" && (n = `?${t.search}`), V.history.push({
|
|
102
113
|
pathname: t.pathname,
|
|
103
114
|
search: n,
|
|
@@ -105,45 +116,45 @@ var { usePreloadedQuery: N } = S, P = (e) => e.trim().replace(/^\/+|\/+$/g, ""),
|
|
|
105
116
|
});
|
|
106
117
|
}
|
|
107
118
|
}];
|
|
108
|
-
}),
|
|
119
|
+
}), ue = a({
|
|
109
120
|
config: s,
|
|
110
|
-
tApp:
|
|
121
|
+
tApp: M,
|
|
111
122
|
entityId: f.id,
|
|
112
123
|
layoutView: U,
|
|
113
|
-
pageLabel: K.label(
|
|
124
|
+
pageLabel: K.label(M),
|
|
114
125
|
pageId: K.id
|
|
115
126
|
}), X;
|
|
116
|
-
(J.status != null || J.badges != null) && (X = /* @__PURE__ */
|
|
127
|
+
(J.status != null || J.badges != null) && (X = /* @__PURE__ */ y("div", {
|
|
117
128
|
className: u,
|
|
118
129
|
children: [J.status, J.badges]
|
|
119
130
|
}));
|
|
120
131
|
let Z = null;
|
|
121
|
-
J.items != null && J.items.length > 0 && (Z = /* @__PURE__ */
|
|
132
|
+
J.items != null && J.items.length > 0 && (Z = /* @__PURE__ */ v("div", {
|
|
122
133
|
className: d,
|
|
123
|
-
children: /* @__PURE__ */
|
|
134
|
+
children: /* @__PURE__ */ v(A, { items: J.items })
|
|
124
135
|
}));
|
|
125
136
|
let Q;
|
|
126
|
-
Y.length > 0 && (Q = /* @__PURE__ */
|
|
137
|
+
Y.length > 0 && (Q = /* @__PURE__ */ v("div", {
|
|
127
138
|
className: ee,
|
|
128
|
-
children: /* @__PURE__ */
|
|
139
|
+
children: /* @__PURE__ */ v(j, {
|
|
129
140
|
label: L("relations.menu.label"),
|
|
130
141
|
items: Y
|
|
131
142
|
})
|
|
132
143
|
}));
|
|
133
|
-
let
|
|
144
|
+
let de = /* @__PURE__ */ y("div", {
|
|
134
145
|
className: l,
|
|
135
|
-
children: [/* @__PURE__ */
|
|
146
|
+
children: [/* @__PURE__ */ v(D, {
|
|
136
147
|
title: J.title,
|
|
137
148
|
subtitle: J.subtitle,
|
|
138
149
|
meta: X,
|
|
139
150
|
actions: Q
|
|
140
151
|
}), Z]
|
|
141
152
|
}), $ = null;
|
|
142
|
-
return G.pages.length > 1 && ($ = /* @__PURE__ */
|
|
153
|
+
return G.pages.length > 1 && ($ = /* @__PURE__ */ v(O, {
|
|
143
154
|
items: q,
|
|
144
155
|
activeId: K.id,
|
|
145
156
|
variant: "underline"
|
|
146
|
-
})), /* @__PURE__ */
|
|
157
|
+
})), /* @__PURE__ */ v(g, {
|
|
147
158
|
value: {
|
|
148
159
|
activePage: K,
|
|
149
160
|
config: s,
|
|
@@ -152,19 +163,22 @@ var { usePreloadedQuery: N } = S, P = (e) => e.trim().replace(/^\/+|\/+$/g, ""),
|
|
|
152
163
|
tabsItems: q,
|
|
153
164
|
visiblePages: G.pages
|
|
154
165
|
},
|
|
155
|
-
children: /* @__PURE__ */
|
|
156
|
-
breadcrumb:
|
|
157
|
-
children: /* @__PURE__ */
|
|
158
|
-
headerNode:
|
|
166
|
+
children: /* @__PURE__ */ v(i, {
|
|
167
|
+
breadcrumb: ue,
|
|
168
|
+
children: /* @__PURE__ */ v(k, {
|
|
169
|
+
headerNode: de,
|
|
159
170
|
tabsNode: $,
|
|
160
171
|
headerDensity: "compact",
|
|
161
|
-
children: /* @__PURE__ */
|
|
172
|
+
children: /* @__PURE__ */ v(ne, {
|
|
173
|
+
fallback: /* @__PURE__ */ v(I, {}),
|
|
174
|
+
children: S
|
|
175
|
+
})
|
|
162
176
|
})
|
|
163
177
|
})
|
|
164
178
|
});
|
|
165
179
|
}, R = ({ config: t, prepared: n, children: r }) => {
|
|
166
|
-
let { t: a } =
|
|
167
|
-
return l == null ? /* @__PURE__ */
|
|
180
|
+
let { t: a } = b(), { t: o } = e(), c = M(t.layoutPage.query, n.layoutQuery), l = t.layoutPage.resolveNode(c, { id: n.id });
|
|
181
|
+
return l == null ? /* @__PURE__ */ v(i, {
|
|
168
182
|
breadcrumb: [{
|
|
169
183
|
kind: "link",
|
|
170
184
|
target: {
|
|
@@ -181,8 +195,8 @@ var { usePreloadedQuery: N } = S, P = (e) => e.trim().replace(/^\/+|\/+$/g, ""),
|
|
|
181
195
|
},
|
|
182
196
|
label: o("detail.notFound")
|
|
183
197
|
}],
|
|
184
|
-
children: /* @__PURE__ */
|
|
185
|
-
}) : /* @__PURE__ */
|
|
198
|
+
children: /* @__PURE__ */ v(s, { listHref: t.routes.list })
|
|
199
|
+
}) : /* @__PURE__ */ v(L, {
|
|
186
200
|
config: t,
|
|
187
201
|
prepared: n,
|
|
188
202
|
layoutNodeRef: l,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeEntityDetailLayoutPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailLayoutPage.tsx"],"sourcesContent":["import { type JSX, type ReactNode, useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport Link from '@plumile/router/routing/Link.js';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\nimport useLocation from '@plumile/router/routing/useLocation.js';\n\nimport { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport {\n buildBackofficeFallbackListHref,\n buildBackofficeListHref,\n buildBackofficeListLink,\n} from '@plumile/backoffice-core/state/buildListHref.js';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedDetailLayoutRoute,\n BackofficeResolvedDetailLayoutFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { FormattedDate } from '@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js';\nimport { Tabs } from '@plumile/ui/atomic/molecules/tabs/Tabs.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { BackofficeKeyValueList } from '@plumile/ui/backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport {\n BackofficeRelationsMenu,\n type BackofficeRelationsMenuItem,\n} from '@plumile/ui/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport { BackofficeDetailBadgeRow } from '../components/backoffice/detail/BackofficeDetailBadgeRow.js';\nimport { BackofficeLazyEntityCount } from '../components/backoffice/refs/BackofficeLazyEntityCount.js';\nimport { BackofficeEntityDetailNotFound } from '../components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityDetailBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeFragment } from '../relay/typedRelayHooks.js';\nimport * as pageStyles from './backofficeEntityDetailPage.css.js';\nimport {\n resolveLabel,\n resolveRelationValue,\n} from './BackofficeEntityDetailPage.helpers.js';\nimport { resolveHeaderItems } from './BackofficeEntityDetailPage.view-helpers.js';\nimport { BackofficeEntityDetailLayoutContextProvider } from './detail/BackofficeEntityDetailLayoutContext.js';\nimport { buildTabsItems } from './detail/buildTabsItems.js';\nimport { resolveVisibleDetailPages } from './detail/pageResolution.js';\nimport { BackofficeRedirect } from './BackofficeRedirect.js';\n\nconst { usePreloadedQuery } = ReactRelay;\n\nconst normalizePath = (value: string): string => {\n return value.trim().replace(/^\\/+|\\/+$/g, '');\n};\n\nconst resolveActivePagePath = (\n pathname: string,\n id: string,\n config: BackofficeResolvedDetailLayoutFacetConfig,\n): string => {\n const pages = [config.pages.mainPage, ...(config.pages.subPages ?? [])];\n const activePage = pages.find((page) => {\n return pathname === config.routes.detailPage(id, page.id);\n });\n return activePage?.path ?? '';\n};\n\nconst RelationCountLoading = (): JSX.Element => {\n return (\n <span className={pageStyles.relationCountLoading}>\n <Spinner size={12} />\n </span>\n );\n};\n\nexport type BackofficeEntityDetailLayoutPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutRoute;\n children?: ReactNode;\n};\n\ntype BackofficeEntityDetailLayoutPageContentProps = {\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutRoute;\n layoutNodeRef: unknown;\n children?: ReactNode;\n};\n\nconst BackofficeEntityDetailLayoutPageContent = ({\n config,\n prepared,\n layoutNodeRef,\n children,\n}: BackofficeEntityDetailLayoutPageContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities, entityRegistry } = useBackofficeConfig();\n const { pathname } = useLocation();\n const routing = useContext(RoutingContext);\n const layoutNode = useBackofficeFragment<unknown, unknown>(\n config.layoutPage.fragment,\n layoutNodeRef,\n );\n\n const layoutView = config.layoutPage.toView(layoutNode);\n const activePagePath = resolveActivePagePath(pathname, prepared.id, config);\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath,\n node: layoutView,\n });\n\n if (!resolvedPages.hasVisiblePages || resolvedPages.activePage == null) {\n return <BackofficeRedirect to={config.routes.list} />;\n }\n\n const { activePage } = resolvedPages;\n if (\n activePagePath !== '' &&\n normalizePath(activePage.path) !== normalizePath(activePagePath)\n ) {\n return (\n <BackofficeRedirect\n to={config.routes.detailPage(prepared.id, activePage.id)}\n />\n );\n }\n\n const tabsItems = buildTabsItems({\n pages: resolvedPages.pages,\n id: prepared.id,\n tApp,\n detailPageHref: config.routes.detailPage,\n });\n const resolveEntityHref = (entityId: string, refId: string) => {\n const entityConfig = entities[entityId];\n if (entityConfig == null) {\n return null;\n }\n return entityConfig.routes.detail(refId);\n };\n const header = resolveHeaderItems(config.header, layoutView, {\n tApp,\n t,\n resolveEntityHref,\n renderLink: (href, label) => {\n return (\n <Link to={href} preloadOnMouseEnter>\n {label}\n </Link>\n );\n },\n renderDate: (value, fallback) => {\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n },\n renderTag: (tone, label) => {\n return <Tag tone={tone}>{label}</Tag>;\n },\n renderBadgeRow: (items) => {\n return <BackofficeDetailBadgeRow items={items} />;\n },\n });\n const relationMenuItems: BackofficeRelationsMenuItem[] = (\n config.relations ?? []\n ).flatMap((relation) => {\n const { filterId: configuredFilterId, path, target, whereKey } = relation;\n const value = resolveRelationValue(relation.value(layoutView));\n if (value == null) {\n return [];\n }\n\n const entityManifest = entities[target];\n if (entityManifest?.hasList !== true) {\n return [];\n }\n\n const where = setWhereValue(null, whereKey, value, path);\n if (where == null) {\n return [];\n }\n\n const loadedEntity = entityRegistry.getLoadedListEntity(target);\n let filterId = configuredFilterId;\n if (filterId == null) {\n filterId = whereKey;\n if (path != null) {\n filterId = `${whereKey}.${path.join('.')}`;\n }\n }\n\n let href: string;\n if (loadedEntity == null) {\n href = buildBackofficeFallbackListHref(\n entityManifest.routes.list,\n where,\n [\n {\n id: filterId,\n value,\n },\n ],\n );\n } else {\n href = buildBackofficeListHref(loadedEntity.config, { where });\n }\n\n return [\n {\n id: relation.id,\n label: resolveLabel(relation.label, tApp),\n count: (\n <BackofficeLazyEntityCount\n entity={target}\n loadingFallback={<RelationCountLoading />}\n where={where}\n />\n ),\n href,\n onClick: async (event) => {\n if (\n routing == null ||\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n\n event.preventDefault();\n\n const listEntity = await entityRegistry.loadListEntity(target);\n const next = buildBackofficeListLink(listEntity.config, { where });\n\n let search = '';\n if (next.search !== '') {\n search = `?${next.search}`;\n }\n\n routing.history.push({\n pathname: next.pathname,\n search,\n hash: '',\n });\n },\n },\n ];\n });\n const breadcrumb = buildEntityDetailBreadcrumb({\n config,\n tApp,\n entityId: prepared.id,\n layoutView,\n pageLabel: activePage.label(tApp),\n pageId: activePage.id,\n });\n let headerMetaNode: JSX.Element | undefined;\n if (header.status != null || header.badges != null) {\n headerMetaNode = (\n <div className={pageStyles.headerMeta}>\n {header.status}\n {header.badges}\n </div>\n );\n }\n let headerItemsNode: JSX.Element | null = null;\n if (header.items != null && header.items.length > 0) {\n headerItemsNode = (\n <div className={pageStyles.headerMetaList}>\n <BackofficeKeyValueList items={header.items} />\n </div>\n );\n }\n let headerActionsNode: JSX.Element | undefined;\n if (relationMenuItems.length > 0) {\n headerActionsNode = (\n <div className={pageStyles.headerRelationGroup}>\n <BackofficeRelationsMenu\n label={t('relations.menu.label')}\n items={relationMenuItems}\n />\n </div>\n );\n }\n\n const headerNode = (\n <div className={pageStyles.headerBlock}>\n <BackofficePageHeader\n title={header.title}\n subtitle={header.subtitle}\n meta={headerMetaNode}\n actions={headerActionsNode}\n />\n {headerItemsNode}\n </div>\n );\n let tabsNode: JSX.Element | null = null;\n if (resolvedPages.pages.length > 1) {\n tabsNode = (\n <Tabs items={tabsItems} activeId={activePage.id} variant=\"underline\" />\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutContextProvider\n value={{\n activePage,\n config,\n entityId: prepared.id,\n layoutView,\n tabsItems,\n visiblePages: resolvedPages.pages,\n }}\n >\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n headerNode={headerNode}\n tabsNode={tabsNode}\n headerDensity=\"compact\"\n >\n <>{children}</>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n </BackofficeEntityDetailLayoutContextProvider>\n );\n};\n\nexport const BackofficeEntityDetailLayoutPage = ({\n config,\n prepared,\n children,\n}: BackofficeEntityDetailLayoutPageProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const layoutQueryData = usePreloadedQuery(\n config.layoutPage.query,\n prepared.layoutQuery,\n );\n const layoutNodeRef = config.layoutPage.resolveNode(layoutQueryData, {\n id: prepared.id,\n });\n\n if (layoutNodeRef == null) {\n return (\n <BackofficeRightPageLayout\n breadcrumb={[\n {\n kind: 'link',\n target: {\n kind: 'entity-list',\n entityId: config.id,\n },\n label: config.label(tApp),\n },\n {\n kind: 'current',\n target: {\n kind: 'entity-detail',\n entityId: config.id,\n id: prepared.id,\n },\n label: t('detail.notFound'),\n },\n ]}\n >\n <BackofficeEntityDetailNotFound listHref={config.routes.list} />\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutPageContent\n config={config}\n prepared={prepared}\n layoutNodeRef={layoutNodeRef}\n >\n {children}\n </BackofficeEntityDetailLayoutPageContent>\n );\n};\n\nexport default BackofficeEntityDetailLayoutPage;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackofficeEntityDetailLayoutPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailLayoutPage.tsx"],"sourcesContent":["import { Suspense, type JSX, type ReactNode, useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport Link from '@plumile/router/routing/Link.js';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\nimport useLocation from '@plumile/router/routing/useLocation.js';\n\nimport { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport {\n buildBackofficeFallbackListHref,\n buildBackofficeListHref,\n buildBackofficeListLink,\n} from '@plumile/backoffice-core/state/buildListHref.js';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedDetailLayoutDataRoute,\n BackofficeResolvedDetailLayoutFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { FormattedDate } from '@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js';\nimport { Tabs } from '@plumile/ui/atomic/molecules/tabs/Tabs.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { BackofficeKeyValueList } from '@plumile/ui/backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport {\n BackofficeRelationsMenu,\n type BackofficeRelationsMenuItem,\n} from '@plumile/ui/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport { BackofficeDetailBadgeRow } from '../components/backoffice/detail/BackofficeDetailBadgeRow.js';\nimport { BackofficeLazyEntityCount } from '../components/backoffice/refs/BackofficeLazyEntityCount.js';\nimport { BackofficeEntityDetailNotFound } from '../components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityDetailBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeFragment } from '../relay/typedRelayHooks.js';\nimport * as pageStyles from './backofficeEntityDetailPage.css.js';\nimport {\n resolveLabel,\n resolveRelationValue,\n} from './BackofficeEntityDetailPage.helpers.js';\nimport { resolveHeaderItems } from './BackofficeEntityDetailPage.view-helpers.js';\nimport { BackofficeEntityDetailLayoutContextProvider } from './detail/BackofficeEntityDetailLayoutContext.js';\nimport { buildTabsItems } from './detail/buildTabsItems.js';\nimport { resolveVisibleDetailPages } from './detail/pageResolution.js';\nimport { BackofficeRedirect } from './BackofficeRedirect.js';\n\nconst { usePreloadedQuery } = ReactRelay;\n\nconst normalizePath = (value: string): string => {\n return value.trim().replace(/^\\/+|\\/+$/g, '');\n};\n\nconst resolveActivePagePath = (\n pathname: string,\n id: string,\n config: BackofficeResolvedDetailLayoutFacetConfig,\n): string => {\n const pages = [config.pages.mainPage, ...(config.pages.subPages ?? [])];\n const activePage = pages.find((page) => {\n return pathname === config.routes.detailPage(id, page.id);\n });\n return activePage?.path ?? '';\n};\n\nconst RelationCountLoading = (): JSX.Element => {\n return (\n <span className={pageStyles.relationCountLoading}>\n <Spinner size={12} />\n </span>\n );\n};\n\nconst DetailPageContentLoading = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n return (\n <div role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <Spinner size={20} ariaLabel={t('common.loading')} />\n </div>\n );\n};\n\nexport type BackofficeEntityDetailLayoutPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutDataRoute;\n children?: ReactNode;\n};\n\ntype BackofficeEntityDetailLayoutPageContentProps = {\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutDataRoute;\n layoutNodeRef: unknown;\n children?: ReactNode;\n};\n\nconst BackofficeEntityDetailLayoutPageContent = ({\n config,\n prepared,\n layoutNodeRef,\n children,\n}: BackofficeEntityDetailLayoutPageContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities, entityRegistry } = useBackofficeConfig();\n const { pathname } = useLocation();\n const routing = useContext(RoutingContext);\n const layoutNode = useBackofficeFragment<unknown, unknown>(\n config.layoutPage.fragment,\n layoutNodeRef,\n );\n\n const layoutView = config.layoutPage.toView(layoutNode);\n const activePagePath = resolveActivePagePath(pathname, prepared.id, config);\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath,\n node: layoutView,\n });\n\n if (!resolvedPages.hasVisiblePages || resolvedPages.activePage == null) {\n return <BackofficeRedirect to={config.routes.list} />;\n }\n\n const { activePage } = resolvedPages;\n if (\n activePagePath !== '' &&\n normalizePath(activePage.path) !== normalizePath(activePagePath)\n ) {\n return (\n <BackofficeRedirect\n to={config.routes.detailPage(prepared.id, activePage.id)}\n />\n );\n }\n\n const tabsItems = buildTabsItems({\n pages: resolvedPages.pages,\n id: prepared.id,\n tApp,\n detailPageHref: config.routes.detailPage,\n });\n const resolveEntityHref = (entityId: string, refId: string) => {\n const entityConfig = entities[entityId];\n if (entityConfig == null) {\n return null;\n }\n return entityConfig.routes.detail(refId);\n };\n const header = resolveHeaderItems(config.header, layoutView, {\n tApp,\n t,\n resolveEntityHref,\n renderLink: (href, label) => {\n return (\n <Link to={href} preloadOnHover=\"code-and-data\">\n {label}\n </Link>\n );\n },\n renderDate: (value, fallback) => {\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n },\n renderTag: (tone, label) => {\n return <Tag tone={tone}>{label}</Tag>;\n },\n renderBadgeRow: (items) => {\n return <BackofficeDetailBadgeRow items={items} />;\n },\n });\n const relationMenuItems: BackofficeRelationsMenuItem[] = (\n config.relations ?? []\n ).flatMap((relation) => {\n const { filterId: configuredFilterId, path, target, whereKey } = relation;\n const value = resolveRelationValue(relation.value(layoutView));\n if (value == null) {\n return [];\n }\n\n const entityManifest = entities[target];\n if (entityManifest?.hasList !== true) {\n return [];\n }\n\n const where = setWhereValue(null, whereKey, value, path);\n if (where == null) {\n return [];\n }\n\n const loadedEntity = entityRegistry.getLoadedListEntity(target);\n let filterId = configuredFilterId;\n if (filterId == null) {\n filterId = whereKey;\n if (path != null) {\n filterId = `${whereKey}.${path.join('.')}`;\n }\n }\n\n let href: string;\n if (loadedEntity == null) {\n href = buildBackofficeFallbackListHref(\n entityManifest.routes.list,\n where,\n [\n {\n id: filterId,\n value,\n },\n ],\n );\n } else {\n href = buildBackofficeListHref(loadedEntity.config, { where });\n }\n\n return [\n {\n id: relation.id,\n label: resolveLabel(relation.label, tApp),\n count: (\n <BackofficeLazyEntityCount\n entity={target}\n loadingFallback={<RelationCountLoading />}\n where={where}\n />\n ),\n href,\n onClick: async (event) => {\n if (\n routing == null ||\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n\n event.preventDefault();\n\n const listEntity = await entityRegistry.loadListEntity(target);\n const next = buildBackofficeListLink(listEntity.config, { where });\n\n let search = '';\n if (next.search !== '') {\n search = `?${next.search}`;\n }\n\n routing.history.push({\n pathname: next.pathname,\n search,\n hash: '',\n });\n },\n },\n ];\n });\n const breadcrumb = buildEntityDetailBreadcrumb({\n config,\n tApp,\n entityId: prepared.id,\n layoutView,\n pageLabel: activePage.label(tApp),\n pageId: activePage.id,\n });\n let headerMetaNode: JSX.Element | undefined;\n if (header.status != null || header.badges != null) {\n headerMetaNode = (\n <div className={pageStyles.headerMeta}>\n {header.status}\n {header.badges}\n </div>\n );\n }\n let headerItemsNode: JSX.Element | null = null;\n if (header.items != null && header.items.length > 0) {\n headerItemsNode = (\n <div className={pageStyles.headerMetaList}>\n <BackofficeKeyValueList items={header.items} />\n </div>\n );\n }\n let headerActionsNode: JSX.Element | undefined;\n if (relationMenuItems.length > 0) {\n headerActionsNode = (\n <div className={pageStyles.headerRelationGroup}>\n <BackofficeRelationsMenu\n label={t('relations.menu.label')}\n items={relationMenuItems}\n />\n </div>\n );\n }\n\n const headerNode = (\n <div className={pageStyles.headerBlock}>\n <BackofficePageHeader\n title={header.title}\n subtitle={header.subtitle}\n meta={headerMetaNode}\n actions={headerActionsNode}\n />\n {headerItemsNode}\n </div>\n );\n let tabsNode: JSX.Element | null = null;\n if (resolvedPages.pages.length > 1) {\n tabsNode = (\n <Tabs items={tabsItems} activeId={activePage.id} variant=\"underline\" />\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutContextProvider\n value={{\n activePage,\n config,\n entityId: prepared.id,\n layoutView,\n tabsItems,\n visiblePages: resolvedPages.pages,\n }}\n >\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n headerNode={headerNode}\n tabsNode={tabsNode}\n headerDensity=\"compact\"\n >\n <Suspense fallback={<DetailPageContentLoading />}>\n {children}\n </Suspense>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n </BackofficeEntityDetailLayoutContextProvider>\n );\n};\n\nexport const BackofficeEntityDetailLayoutPage = ({\n config,\n prepared,\n children,\n}: BackofficeEntityDetailLayoutPageProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const layoutQueryData = usePreloadedQuery(\n config.layoutPage.query,\n prepared.layoutQuery,\n );\n const layoutNodeRef = config.layoutPage.resolveNode(layoutQueryData, {\n id: prepared.id,\n });\n\n if (layoutNodeRef == null) {\n return (\n <BackofficeRightPageLayout\n breadcrumb={[\n {\n kind: 'link',\n target: {\n kind: 'entity-list',\n entityId: config.id,\n },\n label: config.label(tApp),\n },\n {\n kind: 'current',\n target: {\n kind: 'entity-detail',\n entityId: config.id,\n id: prepared.id,\n },\n label: t('detail.notFound'),\n },\n ]}\n >\n <BackofficeEntityDetailNotFound listHref={config.routes.list} />\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutPageContent\n config={config}\n prepared={prepared}\n layoutNodeRef={layoutNodeRef}\n >\n {children}\n </BackofficeEntityDetailLayoutPageContent>\n );\n};\n\nexport default BackofficeEntityDetailLayoutPage;\n"],"mappings":"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"}
|
|
@@ -162,7 +162,7 @@ var ye = (e) => {
|
|
|
162
162
|
size: c,
|
|
163
163
|
isDisabled: u,
|
|
164
164
|
"aria-label": o,
|
|
165
|
-
|
|
165
|
+
preloadOnHover: "code-and-data",
|
|
166
166
|
children: r
|
|
167
167
|
}, e.id) : _(e) ? /* @__PURE__ */ w(D, {
|
|
168
168
|
type: "button",
|
|
@@ -274,7 +274,7 @@ var ye = (e) => {
|
|
|
274
274
|
}),
|
|
275
275
|
renderLink: (e, t) => /* @__PURE__ */ w(A, {
|
|
276
276
|
to: e,
|
|
277
|
-
|
|
277
|
+
preloadOnHover: "code-and-data",
|
|
278
278
|
children: t
|
|
279
279
|
}),
|
|
280
280
|
renderTaggedValue: (e, t) => /* @__PURE__ */ w(u, {
|
|
@@ -299,7 +299,7 @@ var ye = (e) => {
|
|
|
299
299
|
keyPrefix: String(t),
|
|
300
300
|
renderLink: (e, t) => /* @__PURE__ */ w(A, {
|
|
301
301
|
to: e,
|
|
302
|
-
|
|
302
|
+
preloadOnHover: "code-and-data",
|
|
303
303
|
children: t
|
|
304
304
|
}),
|
|
305
305
|
renderDate: (e, t) => /* @__PURE__ */ w(O, {
|