@xen-orchestra/web-core 0.56.0 → 0.57.0

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.
Files changed (68) hide show
  1. package/lib/assets/css/base.pcss +5 -0
  2. package/lib/components/input-wrapper/VtsInputWrapper.vue +2 -2
  3. package/lib/components/layout/VtsLayoutSidebar.vue +116 -43
  4. package/lib/components/menu/MenuItem.vue +9 -1
  5. package/lib/components/menu/MenuList.vue +4 -2
  6. package/lib/components/menu/VtsActionsMenu.vue +24 -24
  7. package/lib/components/modal/VtsActionModal.vue +44 -9
  8. package/lib/components/modal/VtsBlockedModal.vue +1 -1
  9. package/lib/components/modal/VtsDeleteModal.vue +1 -1
  10. package/lib/components/overlay/VtsOverlayButton.vue +35 -0
  11. package/lib/components/overlay/VtsOverlayCancelButton.vue +16 -0
  12. package/lib/components/overlay/VtsOverlayConfirmButton.vue +25 -0
  13. package/lib/components/overlay/VtsOverlayList.vue +82 -0
  14. package/lib/components/progress-bar/VtsProgressBar.vue +5 -3
  15. package/lib/components/select/VtsSelect.vue +0 -3
  16. package/lib/components/space-card/VtsSpaceCard.vue +1 -1
  17. package/lib/components/table/cells/VtsProgressBarCell.vue +1 -1
  18. package/lib/components/table/cells/VtsUserNameCell.vue +29 -0
  19. package/lib/components/task/VtsQuickTaskButton.vue +1 -1
  20. package/lib/components/task/VtsQuickTaskList.vue +1 -1
  21. package/lib/components/tree/VtsTreeItem.vue +4 -4
  22. package/lib/components/ui/head-bar/UiHeadBar.vue +1 -1
  23. package/lib/components/ui/input/UiInput.vue +53 -9
  24. package/lib/components/ui/query-search-bar/UiQuerySearchBar.vue +1 -15
  25. package/lib/components/ui/quick-task-item/UiQuickTaskItem.vue +1 -1
  26. package/lib/components/ui/quick-task-panel/UiQuickTaskPanel.vue +1 -1
  27. package/lib/components/ui/task-item/UiTaskItem.vue +14 -6
  28. package/lib/components/ui/task-list/UiTaskList.vue +1 -1
  29. package/lib/components/ui/text-area/UiTextarea.vue +12 -14
  30. package/lib/components/vif-connection-toggle-modal/VtsVifConnectionToggleModal.vue +43 -0
  31. package/lib/composables/table/multi-select.composable.md +33 -0
  32. package/lib/layouts/CoreLayout.vue +74 -62
  33. package/lib/locales/en.json +63 -2
  34. package/lib/locales/fr.json +63 -2
  35. package/lib/packages/form-validation/custom-rules/ip-addresses.rule.ts +15 -0
  36. package/lib/packages/form-validation/custom-rules/ip.regex.ts +26 -0
  37. package/lib/packages/form-validation/custom-rules/ipv4-or-cidr.rule.ts +2 -3
  38. package/lib/packages/form-validation/index.ts +2 -0
  39. package/lib/packages/hide-permanently/README.md +60 -0
  40. package/lib/packages/hide-permanently/types.ts +3 -0
  41. package/lib/packages/hide-permanently/use-hide-permanently.ts +15 -0
  42. package/lib/packages/overlay/OverlayComponent.vue +18 -0
  43. package/lib/packages/overlay/README.md +285 -0
  44. package/lib/packages/overlay/create-event-handler.ts +80 -0
  45. package/lib/packages/overlay/injection-keys.ts +3 -0
  46. package/lib/packages/overlay/is-thenable.ts +3 -0
  47. package/lib/packages/overlay/symbols.ts +5 -0
  48. package/lib/packages/overlay/types.ts +94 -0
  49. package/lib/packages/overlay/use-overlay-escape.ts +34 -0
  50. package/lib/packages/overlay/use-overlay-store.ts +33 -0
  51. package/lib/packages/overlay/use-overlay-trigger.ts +33 -0
  52. package/lib/packages/overlay/use-overlay.ts +99 -0
  53. package/lib/packages/progress/use-progress.ts +12 -2
  54. package/lib/packages/sidebar/index.ts +2 -0
  55. package/lib/packages/sidebar/sidebar.store.ts +55 -0
  56. package/lib/packages/sidebar/types.ts +21 -0
  57. package/lib/packages/sidebar/use-sidebar-resize.ts +47 -0
  58. package/lib/packages/sidebar/use-sidebar-responsive-expand.ts +19 -0
  59. package/lib/tables/column-definitions/user-name-column.ts +10 -0
  60. package/lib/tables/column-sets/server-columns.ts +2 -2
  61. package/lib/tables/column-sets/user-columns.ts +16 -0
  62. package/lib/types/object.type.ts +9 -1
  63. package/lib/types/task.type.ts +5 -12
  64. package/lib/utils/injection-keys.util.ts +3 -1
  65. package/lib/utils/ip-address.utils.ts +7 -0
  66. package/lib/utils/sr.utils.ts +4 -0
  67. package/package.json +2 -1
  68. package/lib/stores/sidebar.store.ts +0 -79
@@ -32,13 +32,14 @@
32
32
  "action:copy-all": "Copier tout",
33
33
  "action:copy-host": "Copier l'hôte",
34
34
  "action:copy-id": "Copier l'ID",
35
- "action:copy-info-json": "Copier les informations en JSON",
35
+ "action:copy-info-json": "Copier les infos de l'objet au format JSON",
36
36
  "action:create": "Créer",
37
37
  "action:create-bonded-network": "Créer un réseau lié",
38
38
  "action:create-internal-network": "Créer un réseau interne",
39
39
  "action:create-network": "Créer un réseau",
40
40
  "action:create-traffic-rule": "Créer une règle de trafic",
41
41
  "action:create-vdi": "Créer un VDI",
42
+ "action:create-vif": "Créer un VIF",
42
43
  "action:delete": "Supprimer",
43
44
  "action:delete-filter": "Supprimer le filtre",
44
45
  "action:delete-group": "Supprimer le groupe",
@@ -53,16 +54,20 @@
53
54
  "action:deploy-xoa": "Déployer XOA",
54
55
  "action:detach-n-vdis": "Détacher 1 VDI | Détacher {n} VDIs",
55
56
  "action:detach-vdi": "Détacher le VDI",
57
+ "action:disable-host": "Désactiver l'hôte",
56
58
  "action:disconnect": "Déconnecter",
57
59
  "action:disconnect-n": "Déconnecter {n}",
58
60
  "action:disconnect-n-srs": "Déconnecter 1 SR | Déconnecter {n} SRs",
59
61
  "action:disconnect-n-vbds": "Déconnecter 1 VBD | Déconnecter {n} VBDs",
60
62
  "action:disconnect-n-vdis": "Déconnecter 1 VDI | Déconnecter {n} VDIs",
61
63
  "action:disconnect-n-vifs": "Déconnecter 1 VIF | Déconnecter {n} VIFs",
64
+ "action:disconnect-pool": "Déconnecter le pool",
62
65
  "action:download-bugtools-archive": "Télécharger l’archive bugtools",
63
66
  "action:duplicate": "Dupliquer",
67
+ "action:duplicate-n-vms": "Dupliquer 1 VM | Dupliquer {n} VMs",
64
68
  "action:edit": "Modifier",
65
69
  "action:edit-config": "Modifier config",
70
+ "action:enable-host": "Activer l'hôte",
66
71
  "action:enable-light-mode": "Activer le mode clair",
67
72
  "action:export": "Exporter",
68
73
  "action:export-content": "Exporter le contenu",
@@ -151,6 +156,7 @@
151
156
  "alarm-type:sr_io_throughput_total_per_host": "Le débit total de l'IO SR par hôte dépasse @:n-percent",
152
157
  "alarm-type:unknown": "Type d'alarme inconnu",
153
158
  "alarms": "Alarmes",
159
+ "alert-user-roles": "Des rôles peuvent être attribués à un utilisateur directement ou via des groupes. Les rôles hérités d’un groupe ne peuvent pas être supprimés au niveau de l’utilisateur. Pour les révoquer, mettez à jour les rôles du groupe ou retirez l’utilisateur du groupe. Vous pouvez toujours ajouter des rôles individuels aux rôles hérités.",
154
160
  "all": "Tout",
155
161
  "all-done!": "Tout est terminé !",
156
162
  "all-good!": "Tout va bien !",
@@ -158,6 +164,8 @@
158
164
  "allocated-space": "Espace alloué",
159
165
  "allow": "Autoriser",
160
166
  "allow-self-signed-ssl": "Vous devrez peut-être autoriser les certificats SSL auto-signés depuis votre navigateur",
167
+ "allowed-ips": "IPs autorisées",
168
+ "allowed-ips-example": "Par exemple : 192.168.0.1; 2001:db8::1",
161
169
  "and": "Et",
162
170
  "any-property": "N'importe quelle propriété",
163
171
  "api-error-details": "Détails de l'erreur API",
@@ -226,6 +234,7 @@
226
234
  "build-number": "Numéro de build",
227
235
  "by": "Par",
228
236
  "bytes:gi": "Gio",
237
+ "bytes:kbs": "kB/s",
229
238
  "bytes:ki": "Kio",
230
239
  "bytes:mi": "Mio",
231
240
  "cancel": "Annuler",
@@ -246,12 +255,14 @@
246
255
  "community": "Communauté",
247
256
  "community-name": "Communauté {name}",
248
257
  "compression": "Compression",
258
+ "compression-not-available": "La compression n'est pas disponible pour les SRs du même pool.",
249
259
  "concurrency": "Concurrence",
250
260
  "configuration": "Configuration",
251
261
  "configure-for-protected": "Pour garantir la protection de vos VMs, vous pouvez configurer un {backup-job}",
252
262
  "configure-in-xo-5": "Configurer dans XO 5",
253
263
  "confirm-cancel?": "Êtes-vous sûr de vouloir annuler ?",
254
264
  "confirm-delete": "Vous êtes sur le point de supprimer {0}",
265
+ "confirm-disconnect": "Vous êtes sur le point de déconnecter {0}",
255
266
  "confirm-vm-revert": "Confirmer la restauration de la VM à l'instantané",
256
267
  "connect": "Se connecter",
257
268
  "connected": "Connecté",
@@ -288,6 +299,7 @@
288
299
  "creating-new-network": "Création du nouveau réseau",
289
300
  "creating-new-traffic-rule": "Création de la nouvelle règle de trafic",
290
301
  "creating-new-vdi": "Création du nouveau VDI",
302
+ "creating-new-vif": "Création du nouveau VIF",
291
303
  "creation-date": "Date de création",
292
304
  "cron-pattern": "Pattern cron",
293
305
  "current": "Actuel",
@@ -340,7 +352,11 @@
340
352
  "documentation-name": "Documentation {name}",
341
353
  "done": "Terminé",
342
354
  "drop": "Rejeter",
355
+ "duplicate-vm:error-message": "Une erreur s'est produite lors de la duplication de la VM. Veuillez vérifier vos paramètres (nom, dépôt de stockage, compression) et réessayer.",
356
+ "duplicating-vm": "Duplication de la VM",
357
+ "duplication-method": "Méthode de duplication",
343
358
  "duration": "Durée",
359
+ "email": "Email",
344
360
  "empty": "Vide",
345
361
  "enabled": "Activé",
346
362
  "end-date": "Date de fin",
@@ -360,6 +376,7 @@
360
376
  "failed": "Échoué",
361
377
  "failure": "Échec",
362
378
  "fast-clone": "Clonage rapide",
379
+ "fast-clone-available": "Clonage rapide disponible uniquement pour les VMs arrêtées.",
363
380
  "fetching-fresh-data": "Récupération de données à jour",
364
381
  "field:exceeds-max-characters": "Le champ doit contenir {max} caractères ou moins.",
365
382
  "file": "Fichier",
@@ -377,6 +394,7 @@
377
394
  "free-space": "Espace libre",
378
395
  "free-space-on-sr": "Espace libre sur le SR",
379
396
  "from-vm": "Depuis la VM",
397
+ "full-copy": "Copie complète",
380
398
  "fullscreen": "Plein écran",
381
399
  "gateway": "Passerelle",
382
400
  "general": "Général",
@@ -386,6 +404,7 @@
386
404
  "graphics-display": "Graphique & Affichage",
387
405
  "groups": "Groupes",
388
406
  "guest-tools": "Guest Tools",
407
+ "gzip": "GZIP",
389
408
  "hardware": "Matériel",
390
409
  "hardware-specifications": "Spécifications matérielles",
391
410
  "heartbeat-storage-repository": "Dépôt de stockage pour le heartbeat de la haute disponibilité",
@@ -420,6 +439,9 @@
420
439
  "interfaces": "Interfaces",
421
440
  "interrupted": "Interrompu",
422
441
  "invalid-field": "Champ invalide",
442
+ "invalid-ip-addresses": "Une ou plusieurs adresses IPs invalides",
443
+ "invalid-mac-address": "Adresse MAC invalide",
444
+ "invalid-rate-limit": "La limite de débit ne peut pas être négative",
423
445
  "ip-address": "Adresse IP",
424
446
  "ip-address-info": "Vous pouvez appliquer une règle à une seule adresse IP ou à un sous-réseau au format CIDR. Exemples : 192.168.1.10 ou 10.20.0.0/16",
425
447
  "ip-address-invalid": "Le format de l'adresse IP est invalide.",
@@ -462,8 +484,13 @@
462
484
  "job:connect:in-progress": "Connexion en cours…",
463
485
  "job:create:in-progress": "Création en cours…",
464
486
  "job:delete:in-progress": "Suppression en cours…",
487
+ "job:disable:in-progress": "Désactivation en cours…",
465
488
  "job:disconnect:in-progress": "Déconnexion en cours…",
489
+ "job:enable:in-progress": "Activation en cours…",
466
490
  "job:export:in-progress": "Export en cours…",
491
+ "job:host-disable:bad-power-state": "L'hôte n'est pas lancé",
492
+ "job:host-disable:missing-host": "L'hôte est manquant",
493
+ "job:host-enable:missing-host": "L'hôte est manquant",
467
494
  "job:migrate:in-progress": "Migration en cours…",
468
495
  "job:network-delete:has-n-physical-pif-connected": "Le réseau a un PIF physique connecté | Le réseau a {n} PIFs physiques connectés",
469
496
  "job:network-delete:has-n-vif-attached": "Le réseau a un VIF attaché | Le réseau a {n} VIFs attachés",
@@ -471,6 +498,9 @@
471
498
  "job:pbd-plug:pbd-connected": "Un ou plusieurs PBDs sont déjà connectés",
472
499
  "job:pbd-unplug:missing-pbd": "Aucun PBD à déconnecter",
473
500
  "job:pbd-unplug:pbd-disconnected": "Un ou plusieurs PBDs sont déjà déconnectés",
501
+ "job:server-connect:missing-server": "Aucun serveur à connecter",
502
+ "job:server-disconnect:missing-server": "Aucun serveur à déconnecter",
503
+ "job:server-disconnect:server-disconnected": "Un ou plusieurs serveurs sont déjà déconnectés",
474
504
  "job:snapshot-delete:missing-snapshot": "Aucun instantané à supprimer",
475
505
  "job:sr-connect:missing-sr": "Aucun SR à connecter",
476
506
  "job:sr-delete:missing-sr": "Aucun SR à supprimer",
@@ -556,6 +586,7 @@
556
586
  "language": "Langue",
557
587
  "language-preferences": "Choix de la langue",
558
588
  "last": "Dernier",
589
+ "last-login": "Dernière connexion",
559
590
  "last-n-backup-archives": "Dernier run d'archivage | {n} derniers archivages",
560
591
  "last-n-backup-runs": "Dernier run de sauvegarde | {n} dernières sauvegardes",
561
592
  "last-n-runs": "Dernier run | {n} derniers runs",
@@ -607,10 +638,15 @@
607
638
  "modal:action:vm-force-shutdown": "@:action:force-shutdown la VM",
608
639
  "modal:action:vm-reboot": "@:action:reboot la VM",
609
640
  "modal:action:vm-shutdown": "@:action:shutdown la VM",
641
+ "modal:confirm-host-disable": "Êtes-vous sûr que vous voulez désactiver {host}?",
642
+ "modal:confirm-host-enable": "Êtes-vous sûr que vous voulez activer {host}?",
610
643
  "modal:confirm-vm-force-reboot": "Confirmer le redémarrage forcé de la VM",
611
644
  "modal:confirm-vm-force-shutdown": "Confirmer l'arrêt forcé de la VM",
612
645
  "modal:confirm-vm-reboot": "Confirmer le redémarrage de la VM",
613
646
  "modal:confirm-vm-shutdown": "Confirmer l'arrêt de la VM",
647
+ "modal:host-disable-message": "L’hôte sera marqué comme indisponible pour le démarrage ou la réception de nouvelles VMs. Les VMs déjà en cours d’exécution ne sont pas affectées.",
648
+ "modal:host-enable-message": "L’hôte redevient disponible pour démarrer ou recevoir des VMs.",
649
+ "modal:pool-disconnect-message": "Le pool ne pourra plus être géré depuis XO. Vous pourrez le reconnecter ultérieurement.",
614
650
  "modal:vm-force-reboot-message": "Cela redémarrera immédiatement la VM sans arrêt propre. Des pertes de données peuvent survenir et les processus en cours seront interrompus.",
615
651
  "modal:vm-force-shutdown-message": "Cela éteindra immédiatement la VM sans arrêt propre. Des pertes de données peuvent survenir et les processus en cours seront interrompus.",
616
652
  "modal:vm-reboot-message": "Redémarre la VM de manière propre en l'éteignant puis en la redémarrant. Les processus en cours seront fermés correctement.",
@@ -673,9 +709,18 @@
673
709
  "new-vdi:add": "Ajouter un nouveau VDI",
674
710
  "new-vdi:error-message": "Une erreur s'est produite lors de la création du VDI. Veuillez vérifier vos paramètres (nom, dépôt de stockage, espace alloué) et réessayer.",
675
711
  "new-vif": "Nouveau VIF",
712
+ "new-vif:add": "Ajouter un nouveau VIF",
713
+ "new-vif:error-message": "Une erreur s'est produite lors de la création du VIF. Veuillez vérifier vos paramètres et réessayer.",
676
714
  "new-vm": "Nouvelle VM",
677
715
  "new-vm:add": "Ajouter une nouvelle VM",
678
716
  "new-vm:description": "Description de la VM",
717
+ "new-vm:ha-best-effort": "Au mieux",
718
+ "new-vm:ha-best-effort-description": "Si l'hôte tombe en panne, HA tente de redémarrer la VM sur un autre hôte, mais seulement après toutes les VM « Redémarrer ». Non garanti.",
719
+ "new-vm:ha-disabled": "Désactivé",
720
+ "new-vm:ha-disabled-description": "HA ne redémarre jamais cette VM automatiquement.",
721
+ "new-vm:ha-pool-disabled": "HA est désactivée sur ce pool. La valeur est enregistrée mais ne prendra effet qu'une fois HA activée.",
722
+ "new-vm:ha-restart": "Redémarrer",
723
+ "new-vm:ha-restart-description": "Si la VM ou son hôte tombe en panne, HA la redémarre sur un autre hôte. Garanti tant que le pool n'est pas surprovisionné.",
679
724
  "new-vm:install-source": "Source d'installation",
680
725
  "new-vm:name": "Nom de la VM",
681
726
  "new-vm:network-config": "La configuration réseau est uniquement compatible avec {noCloudLink}.",
@@ -700,6 +745,7 @@
700
745
  "no-custom-field-detected": "Aucun champ personnalisé détecté",
701
746
  "no-data": "Aucune donnée",
702
747
  "no-data-to-calculate": "Aucune donnée à calculer",
748
+ "no-group-attached": "Pas de groupe attaché",
703
749
  "no-host-attached": "Aucun hôte attaché",
704
750
  "no-host-detected": "Aucun hôte détecté",
705
751
  "no-job-vm": "Cette VM ne fait partie d'aucun job actif.",
@@ -709,6 +755,7 @@
709
755
  "no-pools-detected": "Aucun pool détecté",
710
756
  "no-replicated-vm": "Cette VM n'est pas répliquée. Configurez une tâche de réplication pour l'activer.",
711
757
  "no-result": "Aucun résultat",
758
+ "no-role-applied": "Pas de rôle appliqué",
712
759
  "no-schedule-available": "Aucune planification disponible",
713
760
  "no-selected-vm-can-be-exported": "Aucune VM sélectionnée ne peut être exportée",
714
761
  "no-selected-vm-can-be-migrated": "Aucune VM sélectionnée ne peut être migrée",
@@ -717,6 +764,7 @@
717
764
  "no-storage-repository-detected": "Aucun dépôt de stockage détecté",
718
765
  "no-task": "Aucune tâche",
719
766
  "no-task-detected": "Aucune tâche détectée",
767
+ "no-user-detected": "Aucun utilisateur détecté",
720
768
  "no-vdi-attached": "Aucun VDI attaché",
721
769
  "no-vdi-detected": "Aucun VDI détecté",
722
770
  "no-vif-detected": "Aucun VIF détecté",
@@ -741,6 +789,7 @@
741
789
  "operation:clean-reboot": "Redémarrage",
742
790
  "operation:clean-shutdown": "Arrêt",
743
791
  "operation:destroy": "Suppression",
792
+ "operation:duplicate": "Duplication",
744
793
  "operation:force-reboot": "Redémarrage forcé",
745
794
  "operation:force-shutdown": "Arrêt forcé",
746
795
  "operation:pause": "Mise en pause",
@@ -757,6 +806,7 @@
757
806
  "other": "Autre",
758
807
  "other-properties": "Autres propriétés",
759
808
  "other-settings": "Autres paramètres",
809
+ "ova": "OVA",
760
810
  "page-not-found": "Cette page est introuvable…",
761
811
  "page-please-wait": "Accrochez-vous, astronaute ! La page est sur le point de décoller.{newline}Nous alignons les propulseurs et calibrons les systèmes. Plus que quelques instants, restez à l'écoute !",
762
812
  "pagination:all": "Tous",
@@ -819,6 +869,7 @@
819
869
  "protocol": "Protocole",
820
870
  "protocol:port": "@:{'protocol'}:@:{'port'}",
821
871
  "provider-solutions": "Solutions {provider}",
872
+ "providers": "Fournisseurs",
822
873
  "provisioning": "Provisionnement",
823
874
  "proxy": "Proxy",
824
875
  "proxy-url": "URL du Proxy",
@@ -886,6 +937,7 @@
886
937
  "rest-api": "API REST",
887
938
  "retry": "Réessayer",
888
939
  "roles": "Rôles",
940
+ "roles-applied": "Rôles appliqués",
889
941
  "root-by-default": "\"root\" par défaut.",
890
942
  "rule-type": "Type de règle",
891
943
  "run": "Run",
@@ -944,6 +996,7 @@
944
996
  "sr-disconnect-info-pool-mixed": "Les SRs locaux seront déconnectés de leurs hôtes respectifs. Les SRs partagés seront déconnectés de tous les hôtes de ce pool.",
945
997
  "sr-disconnect-info-pool-shared": "Le SR sera déconnecté de {hostsCount} hôtes de ce pool. | Chaque SR partagé sera déconnecté de tous les hôtes de ce pool.",
946
998
  "sr-disconnect-title": "Vous êtes sur le point de déconnecter 1 SR | Vous êtes sur le point de déconnecter {n} SRs",
999
+ "sr-required": "Le dépôt de stockage est requis.",
947
1000
  "ssh-account": "Compte SSH",
948
1001
  "ssh-key": "Clé SSH",
949
1002
  "ssh-login": "Nom d'utilisateur SSH",
@@ -1057,7 +1110,9 @@
1057
1110
  "unable-to-create-new-network": "Impossible de créer un nouveau réseau",
1058
1111
  "unable-to-create-new-traffic-rule": "Impossible de créer une nouvelle règle de trafic",
1059
1112
  "unable-to-create-new-vdi": "Impossible de créer un nouveau VDI",
1113
+ "unable-to-create-new-vif": "Impossible de créer un nouveau VIF",
1060
1114
  "unable-to-delete-network": "Impossible de supprimer le réseau",
1115
+ "unable-to-duplicate-vm": "Impossible de dupliquer la VM",
1061
1116
  "unable-to-migrate-vdi": "Impossible de migrer le VDI sur le SR",
1062
1117
  "unknown": "Inconnu",
1063
1118
  "unlocked": "Déverrouillé",
@@ -1072,6 +1127,7 @@
1072
1127
  "used-for-backup": "Utilisé pour la sauvegarde",
1073
1128
  "used-space": "Espace utilisé",
1074
1129
  "used-space-on-sr": "Espace utilisé sur le SR",
1130
+ "user": "Utilisateur",
1075
1131
  "user-config": "Configuration utilisateur",
1076
1132
  "user-management": "Gestion des utilisateurs",
1077
1133
  "username": "Nom d'utilisateur",
@@ -1123,6 +1179,8 @@
1123
1179
  "vm-is-running": "La VM est en cours d'exécution",
1124
1180
  "vm-limit-topology": "Limite de topologie physique des VMs",
1125
1181
  "vm-management": "Gestion de la VM",
1182
+ "vm-name": "Nom de la VM",
1183
+ "vm-name-required": "Le nom de la VM est requis.",
1126
1184
  "vm-not-running": "VM non démarrée",
1127
1185
  "vm-off": "Cette machine virtuelle est éteinte.",
1128
1186
  "vm-protected-deletion": "Cette VM est actuellement protégée contre la suppression.",
@@ -1174,8 +1232,11 @@
1174
1232
  "xoa-deploy-retry": "Ré-essayer de déployer une XOA",
1175
1233
  "xoa-deploy-successful!": "XOA deployée avec succès !",
1176
1234
  "xoa-ip": "Adresse IP XOA",
1235
+ "xoa-manager": "Manager XOA",
1177
1236
  "xoa-password-confirm-different": "La confirmation du mot de passe XOA est différente",
1178
1237
  "xoa-ssh-account": "Compte SSH de la XOA",
1179
1238
  "xoa-ssh-password-confirm-different": "La confirmation du mot de passe SSH est différente",
1180
- "you-are-currently-on": "Vous êtes actuellement sur : {0}"
1239
+ "xva": "XVA",
1240
+ "you-are-currently-on": "Vous êtes actuellement sur : {0}",
1241
+ "zstd": "ZSTD"
1181
1242
  }
@@ -0,0 +1,15 @@
1
+ import { parseIpList } from '@core/utils/ip-address.utils.ts'
2
+ import { createRule, type Maybe } from '@regle/core'
3
+ import { isFilled } from '@regle/rules'
4
+ import { IPV4_REGEX, IPV6_REGEX } from './ip.regex.ts'
5
+
6
+ export const ipAddresses = createRule({
7
+ validator(value: Maybe<string>, separator: string = ';') {
8
+ if (!isFilled(value)) {
9
+ return true
10
+ }
11
+
12
+ return parseIpList(value, separator).every(ip => IPV4_REGEX.test(ip) || IPV6_REGEX.test(ip))
13
+ },
14
+ message: 'One or more invalid IP addresses',
15
+ })
@@ -0,0 +1,26 @@
1
+ const IPV4_OCTET = '(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)'
2
+
3
+ const V6_SEGMENT = '[0-9a-fA-F]{1,4}'
4
+
5
+ export const IPV4_ADDRESS = `${IPV4_OCTET}(\\.${IPV4_OCTET}){3}`
6
+
7
+ export const IPV4_CIDR_PREFIX = '(3[0-2]|[12]?\\d)'
8
+
9
+ export const IPV4_REGEX = new RegExp(`^${IPV4_ADDRESS}$`)
10
+
11
+ export const IPV6_REGEX = new RegExp(
12
+ '^(' +
13
+ `(${V6_SEGMENT}:){7}${V6_SEGMENT}|` +
14
+ `(${V6_SEGMENT}:){1,7}:|` +
15
+ `(${V6_SEGMENT}:){1,6}:${V6_SEGMENT}|` +
16
+ `(${V6_SEGMENT}:){1,5}(:${V6_SEGMENT}){1,2}|` +
17
+ `(${V6_SEGMENT}:){1,4}(:${V6_SEGMENT}){1,3}|` +
18
+ `(${V6_SEGMENT}:){1,3}(:${V6_SEGMENT}){1,4}|` +
19
+ `(${V6_SEGMENT}:){1,2}(:${V6_SEGMENT}){1,5}|` +
20
+ `${V6_SEGMENT}:(:${V6_SEGMENT}){1,6}|` +
21
+ `:((:${V6_SEGMENT}){1,7}|:)|` +
22
+ `fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|` +
23
+ `::(ffff(:0{1,4})?:)?${IPV4_ADDRESS}|` +
24
+ `(${V6_SEGMENT}:){1,4}:${IPV4_ADDRESS}` +
25
+ ')$'
26
+ )
@@ -1,9 +1,8 @@
1
1
  import { createRule, type Maybe } from '@regle/core'
2
2
  import { isFilled } from '@regle/rules'
3
+ import { IPV4_ADDRESS, IPV4_CIDR_PREFIX } from './ip.regex.ts'
3
4
 
4
- const IPV4_OCTET = '(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)'
5
- const IPV4_CIDR_PREFIX = '(3[0-2]|[12]?\\d)'
6
- const IP_OR_CIDR_REGEX = new RegExp(`^${IPV4_OCTET}(\\.${IPV4_OCTET}){3}(/${IPV4_CIDR_PREFIX})?$`)
5
+ const IP_OR_CIDR_REGEX = new RegExp(`^${IPV4_ADDRESS}(/${IPV4_CIDR_PREFIX})?$`)
7
6
 
8
7
  export const ipv4OrCidr = createRule({
9
8
  validator(value: Maybe<string>) {
@@ -1,5 +1,7 @@
1
1
  export * from './custom-rules/out-of-range.rule.ts'
2
2
  export * from './custom-rules/ipv4-or-cidr.rule.ts'
3
+ export * from './custom-rules/ip-addresses.rule.ts'
4
+ export * from './custom-rules/ip.regex.ts'
3
5
  export * from './merge-validation-configs.ts'
4
6
  export * from './types.ts'
5
7
  export * from './use-form-validation.ts'
@@ -0,0 +1,60 @@
1
+ # Hide Permanently
2
+
3
+ A composable to permanently hide an element (e.g. an informational alert) once the user dismisses it.
4
+
5
+ Hidden IDs are stored in Local Storage (`permanently-hidden-items` key), so the element stays hidden across page reloads and sessions.
6
+
7
+ ## Registering IDs
8
+
9
+ Each hideable element is identified by a unique ID, to prevent collisions.
10
+
11
+ The application must register IDs by augmenting the `PermanentlyHideableItems` interface in a `.d.ts` file:
12
+
13
+ ```ts
14
+ declare module '@xen-orchestra/web-core/packages/hide-permanently/types.ts' {
15
+ interface PermanentlyHideableItems {
16
+ 'my-first-id': true
17
+ 'my-second-id': true
18
+ }
19
+ }
20
+
21
+ export {}
22
+ ```
23
+
24
+ ## `useHidePermanently`
25
+
26
+ ```ts
27
+ const { isVisible: isUserInfoVisible, hidePermanently: hideUserInfoPermanently } = useHidePermanently(id)
28
+
29
+ // or, with array destructuring:
30
+ const [isUserInfoVisible, hideUserInfoPermanently] = useHidePermanently(id)
31
+ ```
32
+
33
+ ### Arguments
34
+
35
+ | Argument | Type | Required | Description |
36
+ | -------- | ----------------------- | :------: | --------------------------------- |
37
+ | `id` | `PermanentlyHideableId` | ✓ | The registered ID of the element. |
38
+
39
+ ### Returns
40
+
41
+ | Property | Type | Description |
42
+ | ----------------- | ---------------------- | ----------------------------------------------------- |
43
+ | `isVisible` | `ComputedRef<boolean>` | Whether the element is visible (i.e. not hidden yet). |
44
+ | `hidePermanently` | `() => void` | Hides the element permanently. |
45
+
46
+ ## Example
47
+
48
+ ```vue
49
+ <template>
50
+ <div v-if="isHelpTextVisible">
51
+ Some dismissible help text
52
+
53
+ <button type="button" @click="hideHelpTextPermanently()">Don't show again</button>
54
+ </div>
55
+ </template>
56
+
57
+ <script lang="ts" setup>
58
+ const [isHelpTextVisible, hideHelpTextPermanently] = useHidePermanently('my-first-id')
59
+ </script>
60
+ ```
@@ -0,0 +1,3 @@
1
+ export interface PermanentlyHideableItems {}
2
+
3
+ export type PermanentlyHideableId = keyof PermanentlyHideableItems & string
@@ -0,0 +1,15 @@
1
+ import type { PermanentlyHideableId } from '@core/packages/hide-permanently/types.ts'
2
+ import { makeDestructurable, useLocalStorage } from '@vueuse/core'
3
+ import { computed } from 'vue'
4
+
5
+ export function useHidePermanently(id: PermanentlyHideableId) {
6
+ const hiddenItems = useLocalStorage('permanently-hidden-items', new Set<PermanentlyHideableId>())
7
+
8
+ const isVisible = computed(() => !hiddenItems.value.has(id))
9
+
10
+ function hidePermanently() {
11
+ hiddenItems.value.add(id)
12
+ }
13
+
14
+ return makeDestructurable({ isVisible, hidePermanently } as const, [isVisible, hidePermanently] as const)
15
+ }
@@ -0,0 +1,18 @@
1
+ <template>
2
+ <component :is="overlay.component" v-bind="overlay.props" />
3
+ </template>
4
+
5
+ <script lang="ts" setup>
6
+ import { IK_OVERLAY_KEY } from '@core/packages/overlay/injection-keys.ts'
7
+ import type { Overlay } from '@core/packages/overlay/types.ts'
8
+ import { computed, provide } from 'vue'
9
+
10
+ const { overlay } = defineProps<{
11
+ overlay: Overlay
12
+ }>()
13
+
14
+ provide(
15
+ IK_OVERLAY_KEY,
16
+ computed(() => overlay.key)
17
+ )
18
+ </script>