@xen-orchestra/web-core 0.46.0 → 0.47.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.
- package/lib/components/console/VtsLayoutConsole.vue +1 -1
- package/lib/components/console/VtsRemoteConsole.vue +3 -2
- package/lib/components/table/cells/VtsLinkCell.vue +23 -4
- package/lib/icons/object-icons.ts +22 -0
- package/lib/locales/en.json +20 -5
- package/lib/locales/fr.json +20 -5
- package/lib/packages/remote-resource/sse.store.ts +3 -1
- package/lib/tables/column-definitions/link-or-text-column.ts +22 -0
- package/lib/tables/column-sets/snapshot-columns.ts +19 -0
- package/lib/utils/ip-address.utils.ts +18 -0
- package/package.json +1 -1
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<UiTableCell>
|
|
3
|
-
<
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
<div class="vts-link-cell">
|
|
4
|
+
<UiLink size="medium" :icon :to :href :target class="link">
|
|
5
|
+
<slot />
|
|
6
|
+
<VtsIcon v-if="rightIcon" v-tooltip="rightIcon.tooltip ?? false" :name="rightIcon.icon" size="medium" />
|
|
7
|
+
</UiLink>
|
|
8
|
+
<span v-if="slots.suffix" class="interpunct" />
|
|
9
|
+
<slot name="suffix" />
|
|
10
|
+
</div>
|
|
7
11
|
</UiTableCell>
|
|
8
12
|
</template>
|
|
9
13
|
|
|
@@ -24,9 +28,24 @@ export type VtsLinkCellProps = LinkOptions & {
|
|
|
24
28
|
}
|
|
25
29
|
|
|
26
30
|
defineProps<VtsLinkCellProps>()
|
|
31
|
+
|
|
32
|
+
const slots = defineSlots<{
|
|
33
|
+
default(): any
|
|
34
|
+
suffix?(): any
|
|
35
|
+
}>()
|
|
27
36
|
</script>
|
|
28
37
|
|
|
29
38
|
<style lang="postcss" scoped>
|
|
39
|
+
.vts-link-cell {
|
|
40
|
+
display: flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
gap: 0.8rem;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.interpunct::before {
|
|
46
|
+
content: '•';
|
|
47
|
+
}
|
|
48
|
+
|
|
30
49
|
.link {
|
|
31
50
|
line-height: 1.5;
|
|
32
51
|
}
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
faArrowLeft,
|
|
7
7
|
faBarsProgress,
|
|
8
8
|
faBoxesStacked,
|
|
9
|
+
faCamera,
|
|
9
10
|
faCircle,
|
|
10
11
|
faCity,
|
|
11
12
|
faClock,
|
|
@@ -118,6 +119,21 @@ const schedule = defineIcon([
|
|
|
118
119
|
},
|
|
119
120
|
])
|
|
120
121
|
|
|
122
|
+
const camera = defineIcon([
|
|
123
|
+
{
|
|
124
|
+
icon: faCircle,
|
|
125
|
+
color: 'var(--color-neutral-background-primary)',
|
|
126
|
+
translate: [7, 5.5],
|
|
127
|
+
size: 13,
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
icon: faCamera,
|
|
131
|
+
color: 'var(--color-neutral-txt-primary)',
|
|
132
|
+
translate: [7, 5.5],
|
|
133
|
+
size: 10,
|
|
134
|
+
},
|
|
135
|
+
])
|
|
136
|
+
|
|
121
137
|
export const objectIcons = defineIconPack({
|
|
122
138
|
instance: constructIcon(faSatellite),
|
|
123
139
|
pool: constructIcon(faCity),
|
|
@@ -159,6 +175,12 @@ export const objectIcons = defineIconPack({
|
|
|
159
175
|
'vm:suspended': [constructIcon(faDesktop), ...constructCircleStatus('suspended-circle')],
|
|
160
176
|
'vm:warning': [constructIcon(faDesktop), ...constructCircleStatus('warning-circle')],
|
|
161
177
|
'vm:halted': [constructIcon(faDesktop), ...constructCircleStatus('halted-circle')],
|
|
178
|
+
'vm-snapshot': [
|
|
179
|
+
constructIcon(faDesktop),
|
|
180
|
+
{
|
|
181
|
+
icon: camera,
|
|
182
|
+
},
|
|
183
|
+
],
|
|
162
184
|
sr: constructIcon(faDatabase),
|
|
163
185
|
'sr:unknown': [
|
|
164
186
|
{
|
package/lib/locales/en.json
CHANGED
|
@@ -150,6 +150,7 @@
|
|
|
150
150
|
"backup:full-replication": "Full replication",
|
|
151
151
|
"backup:incremental": "Incremental backup",
|
|
152
152
|
"backup:incremental-replication": "Incremental replication",
|
|
153
|
+
"backup:last-replication": "Last replication",
|
|
153
154
|
"backup:mirror:full": "Mirror full backup",
|
|
154
155
|
"backup:mirror:incremental": "Mirror incremental backup",
|
|
155
156
|
"backup:pool-metadata": "Pool metadata",
|
|
@@ -237,6 +238,7 @@
|
|
|
237
238
|
"crash-dump-storage-repository": "Crash dump storage repository",
|
|
238
239
|
"created-by": "Created by",
|
|
239
240
|
"created-on": "Created on",
|
|
241
|
+
"creation-date": "Creation date",
|
|
240
242
|
"cron-pattern": "Cron pattern",
|
|
241
243
|
"current": "Current",
|
|
242
244
|
"current-attach": "Current attach",
|
|
@@ -332,6 +334,7 @@
|
|
|
332
334
|
"hosts-status": "Hosts status",
|
|
333
335
|
"hyper-threading": "Hyper threading (SMT)",
|
|
334
336
|
"id": "ID",
|
|
337
|
+
"included": "Included",
|
|
335
338
|
"in-last-three-runs": "In their last 3 runs",
|
|
336
339
|
"in-progress": "In progress",
|
|
337
340
|
"info": "Info",
|
|
@@ -427,7 +430,9 @@
|
|
|
427
430
|
"last-n-backup-archives": "Last backup archive | Last {n} backup archives",
|
|
428
431
|
"last-n-backup-runs": "Last backup run | Last {n} backup runs",
|
|
429
432
|
"last-n-runs": "Last run | Last {n} runs",
|
|
433
|
+
"last-revert": "Last revert",
|
|
430
434
|
"last-run-number": "Last run #{n}",
|
|
435
|
+
"last-snapshot": "Last snapshot",
|
|
431
436
|
"last-week": "Last week",
|
|
432
437
|
"learn-more": "Learn more",
|
|
433
438
|
"lets-go!": "Let's go!",
|
|
@@ -436,7 +441,7 @@
|
|
|
436
441
|
"license-type": "License type",
|
|
437
442
|
"licensing": "Licensing",
|
|
438
443
|
"load-average": "Load average",
|
|
439
|
-
"loading": "Loading
|
|
444
|
+
"loading": "Loading",
|
|
440
445
|
"loading-hosts": "Loading hosts…",
|
|
441
446
|
"local": "Local",
|
|
442
447
|
"locked": "Locked",
|
|
@@ -452,11 +457,13 @@
|
|
|
452
457
|
"management-agent-not-detected": "Management agent not detected",
|
|
453
458
|
"management-agent-version": "Management agent version",
|
|
454
459
|
"management-ip": "Management IP",
|
|
460
|
+
"manual": "Manual",
|
|
455
461
|
"manufacturer-info": "Manufacturer info",
|
|
456
462
|
"master": "Primary host",
|
|
457
463
|
"maximum-cpu-limit": "Maximum CPU limit",
|
|
458
464
|
"maximum-dynamic-memory": "Maximum dynamic memory",
|
|
459
465
|
"maximum-static-memory": "Maximum static memory",
|
|
466
|
+
"memory": "Memory",
|
|
460
467
|
"memory-usage": "Memory usage",
|
|
461
468
|
"merge-backups-synchronously": "Merge backups synchronously",
|
|
462
469
|
"message": "Message",
|
|
@@ -514,17 +521,17 @@
|
|
|
514
521
|
"new-vm": "New VM",
|
|
515
522
|
"new-vm:add": "Add a new VM",
|
|
516
523
|
"new-vm:description": "VM description",
|
|
517
|
-
"new-vm:install-source": "Installation source",
|
|
518
524
|
"new-vm:feature-not-supported": "This is our new VM creation form. Cloud-init configuration, Advanced options and vTPM management are not yet supported. Updated version will be available soon in 2026. In the meanwhile, full feature set is available here in {xo-5}",
|
|
525
|
+
"new-vm:install-source": "Installation source",
|
|
519
526
|
"new-vm:name": "VM name",
|
|
520
527
|
"new-vm:network-config": "Network configuration is only compatible with {noCloudLink}.",
|
|
521
|
-
"new-vm:network-config-more": "See {documentationLink} for more info.",
|
|
522
528
|
"new-vm:network-config-documentation": "Network config documentation",
|
|
529
|
+
"new-vm:network-config-more": "See {documentationLink} for more info.",
|
|
523
530
|
"new-vm:network-config-nocloud-datasource": "the NoCloud datasource",
|
|
524
531
|
"new-vm:user-config-variables": "Template variables",
|
|
525
|
-
"new-vm:user-config-variables-name": "{'{name}'}: the VM's name. It must not contain '_'",
|
|
526
|
-
"new-vm:user-config-variables-index": "{'{index}'}: the VM's index, it will take 0 in case of single VM",
|
|
527
532
|
"new-vm:user-config-variables-escape": "Escape any variable with a preceding backslash '\\'",
|
|
533
|
+
"new-vm:user-config-variables-index": "{'{index}'}: the VM's index, it will take 0 in case of single VM",
|
|
534
|
+
"new-vm:user-config-variables-name": "{'{name}'}: the VM's name. It must not contain '_'",
|
|
528
535
|
"news": "News",
|
|
529
536
|
"news-name": "{name} news",
|
|
530
537
|
"nic-type": "NIC type",
|
|
@@ -552,6 +559,7 @@
|
|
|
552
559
|
"no-selected-vm-can-be-exported": "No selected VM can be exported",
|
|
553
560
|
"no-selected-vm-can-be-migrated": "No selected VM can be migrated",
|
|
554
561
|
"no-server-detected": "No servers detected",
|
|
562
|
+
"no-snapshot-detected": "No snapshots detected",
|
|
555
563
|
"no-storage-repository-detected": "No storage repositories detected",
|
|
556
564
|
"no-task": "No tasks",
|
|
557
565
|
"no-task-detected": "No tasks detected",
|
|
@@ -563,6 +571,7 @@
|
|
|
563
571
|
"none": "None",
|
|
564
572
|
"normal": "Normal",
|
|
565
573
|
"not-found": "Not found",
|
|
574
|
+
"not-included": "Not included",
|
|
566
575
|
"not-resident-on": "Not resident on",
|
|
567
576
|
"not-running": "Not running",
|
|
568
577
|
"not-yet-available": "Information is not yet available",
|
|
@@ -595,6 +604,7 @@
|
|
|
595
604
|
"other-properties": "Other properties",
|
|
596
605
|
"other-settings": "Other settings",
|
|
597
606
|
"page-not-found": "This page is not to be found…",
|
|
607
|
+
"page-please-wait": "Hold tight, astronaut! The page is getting ready to take off.{newline}We're just aligning the thrusters and calibrating the systems. It won't be long now, stay tuned!",
|
|
598
608
|
"pagination:all": "@:all",
|
|
599
609
|
"partially-connected": "Partially connected",
|
|
600
610
|
"password": "Password",
|
|
@@ -612,6 +622,7 @@
|
|
|
612
622
|
"pifs": "PIFs",
|
|
613
623
|
"pifs-status": "PIFs status",
|
|
614
624
|
"please-confirm-to-continue": "This action cannot be undone. Are you sure you want to continue?",
|
|
625
|
+
"please-wait": "Please wait",
|
|
615
626
|
"pool": "Pool",
|
|
616
627
|
"pool-connection-error-auth-failed": "An error occurred while connecting to the pool. The username or password appears to be incorrect.",
|
|
617
628
|
"pool-connection-error-duplicate": "An error occurred while connecting to the pool. This pool seems to be already connected.",
|
|
@@ -739,6 +750,7 @@
|
|
|
739
750
|
"skipped": "Skipped",
|
|
740
751
|
"smart-mode": "Smart mode",
|
|
741
752
|
"snapshot": "Snapshot",
|
|
753
|
+
"snapshot-created-on": "Snapshot created on",
|
|
742
754
|
"snapshot-mode": "Snapshot mode",
|
|
743
755
|
"snapshots": "Snapshots",
|
|
744
756
|
"sockets-with-cores-per-socket": "{nSockets} sockets × {nCores} cores/socket",
|
|
@@ -840,11 +852,13 @@
|
|
|
840
852
|
"total-used:": "Total used:",
|
|
841
853
|
"transfer-size": "Transfer size",
|
|
842
854
|
"translation-tool": "Translation tool",
|
|
855
|
+
"trigger": "Trigger",
|
|
843
856
|
"unable-to-connect-to": "Unable to connect to {ip}",
|
|
844
857
|
"unable-to-connect-to-the-pool": "Unable to connect to the pool",
|
|
845
858
|
"unable-to-connect-to-xo-server": "Unable to connect to XO server.",
|
|
846
859
|
"unknown": "Unknown",
|
|
847
860
|
"unlocked": "Unlocked",
|
|
861
|
+
"unnamed": "Unnamed",
|
|
848
862
|
"unreachable-hosts": "Unreachable hosts",
|
|
849
863
|
"unreachable-hosts-reload-page": "Done, reload the page",
|
|
850
864
|
"untitled": "Untitled",
|
|
@@ -853,6 +867,7 @@
|
|
|
853
867
|
"used": "Used",
|
|
854
868
|
"used-for-backup": "Used for backup",
|
|
855
869
|
"used-space": "Used space",
|
|
870
|
+
"used-space-on-sr": "Used space on SR",
|
|
856
871
|
"user-config": "User config",
|
|
857
872
|
"username": "Username",
|
|
858
873
|
"uuid": "UUID",
|
package/lib/locales/fr.json
CHANGED
|
@@ -150,6 +150,7 @@
|
|
|
150
150
|
"backup:full-replication": "Réplication complète",
|
|
151
151
|
"backup:incremental": "Sauvegarde incrémentielle",
|
|
152
152
|
"backup:incremental-replication": "Réplication incrémentielle",
|
|
153
|
+
"backup:last-replication": "Dernière réplication",
|
|
153
154
|
"backup:mirror:full": "Sauvegarde complète en miroir",
|
|
154
155
|
"backup:mirror:incremental": "Sauvegarde incrémentielle en miroir",
|
|
155
156
|
"backup:pool-metadata": "Métadonnées du pool",
|
|
@@ -237,6 +238,7 @@
|
|
|
237
238
|
"crash-dump-storage-repository": "Dépôt de stockage des log de crash",
|
|
238
239
|
"created-by": "Créé par",
|
|
239
240
|
"created-on": "Créé le",
|
|
241
|
+
"creation-date": "Date de création",
|
|
240
242
|
"cron-pattern": "Pattern cron",
|
|
241
243
|
"current": "Actuel",
|
|
242
244
|
"current-attach": "Attachement actuel",
|
|
@@ -332,6 +334,7 @@
|
|
|
332
334
|
"hosts-status": "Statut des hôtes",
|
|
333
335
|
"hyper-threading": "Hyper-threading (SMT)",
|
|
334
336
|
"id": "ID",
|
|
337
|
+
"included": "Inclus",
|
|
335
338
|
"in-last-three-runs": "Dans leurs trois derniers runs",
|
|
336
339
|
"in-progress": "En cours",
|
|
337
340
|
"info": "Info",
|
|
@@ -427,7 +430,9 @@
|
|
|
427
430
|
"last-n-backup-archives": "Dernier run d'archivage | {n} derniers archivages",
|
|
428
431
|
"last-n-backup-runs": "Dernier run de sauvegarde | {n} dernières sauvegardes",
|
|
429
432
|
"last-n-runs": "Dernier run | {n} derniers runs",
|
|
433
|
+
"last-revert": "Dernière restauration",
|
|
430
434
|
"last-run-number": "Dernière exécution #{n}",
|
|
435
|
+
"last-snapshot": "Dernier instantané",
|
|
431
436
|
"last-week": "Semaine dernière",
|
|
432
437
|
"learn-more": "En savoir plus",
|
|
433
438
|
"lets-go!": "Allons-y !",
|
|
@@ -436,7 +441,7 @@
|
|
|
436
441
|
"license-type": "Type de licence",
|
|
437
442
|
"licensing": "Licences",
|
|
438
443
|
"load-average": "Charge système",
|
|
439
|
-
"loading": "Chargement
|
|
444
|
+
"loading": "Chargement",
|
|
440
445
|
"loading-hosts": "Chargement des hôtes…",
|
|
441
446
|
"local": "Local",
|
|
442
447
|
"locked": "Verrouillé",
|
|
@@ -452,11 +457,13 @@
|
|
|
452
457
|
"management-agent-not-detected": "Agent de gestion non détecté",
|
|
453
458
|
"management-agent-version": "Version de l'agent de gestion",
|
|
454
459
|
"management-ip": "IP principale",
|
|
460
|
+
"manual": "Manuel",
|
|
455
461
|
"manufacturer-info": "Informations sur le fabricant",
|
|
456
462
|
"master": "Hôte primaire",
|
|
457
463
|
"maximum-cpu-limit": "Nombre maximal de CPU",
|
|
458
464
|
"maximum-dynamic-memory": "Mémoire dynamique maximale",
|
|
459
465
|
"maximum-static-memory": "Mémoire statique maximale",
|
|
466
|
+
"memory": "Mémoire",
|
|
460
467
|
"memory-usage": "Utilisation de la mémoire",
|
|
461
468
|
"merge-backups-synchronously": "Fusionner les sauvegardes de manière synchrone",
|
|
462
469
|
"message": "Message",
|
|
@@ -514,17 +521,17 @@
|
|
|
514
521
|
"new-vm": "Nouvelle VM",
|
|
515
522
|
"new-vm:add": "Ajouter une nouvelle VM",
|
|
516
523
|
"new-vm:description": "Description de la VM",
|
|
517
|
-
"new-vm:install-source": "Source d'installation",
|
|
518
524
|
"new-vm:feature-not-supported": "Ceci est notre nouveau formulaire de création de VM. La configuration Cloud-init, les options avancées et la gestion vTPM ne sont pas encore prises en charge. Une version mise à jour sera disponible prochainement en 2026. En attendant, l'ensemble des fonctionnalités est disponible ici sur {xo-5}",
|
|
525
|
+
"new-vm:install-source": "Source d'installation",
|
|
519
526
|
"new-vm:name": "Nom de la VM",
|
|
520
527
|
"new-vm:network-config": "La configuration réseau est uniquement compatible avec {noCloudLink}.",
|
|
521
|
-
"new-vm:network-config-more": "Voir {documentationLink} pour plus d'informations.",
|
|
522
528
|
"new-vm:network-config-documentation": "la documentation de la configuration réseau",
|
|
529
|
+
"new-vm:network-config-more": "Voir {documentationLink} pour plus d'informations.",
|
|
523
530
|
"new-vm:network-config-nocloud-datasource": "la source de données NoCloud",
|
|
524
531
|
"new-vm:user-config-variables": "Variables de modèle",
|
|
525
|
-
"new-vm:user-config-variables-name": "{'{name}'}: le nom de la VM. Il ne doit pas contenir '_'",
|
|
526
|
-
"new-vm:user-config-variables-index": "{'{index}'}: l'index de la VM, il prendra 0 en cas de VM unique",
|
|
527
532
|
"new-vm:user-config-variables-escape": "Échapper toute variable avec un antislash précédant '\\'",
|
|
533
|
+
"new-vm:user-config-variables-index": "{'{index}'}: l'index de la VM, il prendra 0 en cas de VM unique",
|
|
534
|
+
"new-vm:user-config-variables-name": "{'{name}'}: le nom de la VM. Il ne doit pas contenir '_'",
|
|
528
535
|
"news": "Actualités",
|
|
529
536
|
"news-name": "Actualités {name}",
|
|
530
537
|
"nic-type": "Type de carte réseau (NIC)",
|
|
@@ -552,6 +559,7 @@
|
|
|
552
559
|
"no-selected-vm-can-be-exported": "Aucune VM sélectionnée ne peut être exportée",
|
|
553
560
|
"no-selected-vm-can-be-migrated": "Aucune VM sélectionnée ne peut être migrée",
|
|
554
561
|
"no-server-detected": "Aucun serveur détecté",
|
|
562
|
+
"no-snapshot-detected": "Aucun instantané détecté",
|
|
555
563
|
"no-storage-repository-detected": "Aucun dépôt de stockage détecté",
|
|
556
564
|
"no-task": "Aucune tâche",
|
|
557
565
|
"no-task-detected": "Aucune tâche détectée",
|
|
@@ -563,6 +571,7 @@
|
|
|
563
571
|
"none": "Aucun",
|
|
564
572
|
"normal": "Normal",
|
|
565
573
|
"not-found": "Non trouvé",
|
|
574
|
+
"not-included": "Non inclus",
|
|
566
575
|
"not-resident-on": "Non résident sur",
|
|
567
576
|
"not-running": "Pas en cours d'exécution",
|
|
568
577
|
"not-yet-available": "Information pas encore disponible",
|
|
@@ -595,6 +604,7 @@
|
|
|
595
604
|
"other-properties": "Autres propriétés",
|
|
596
605
|
"other-settings": "Autres paramètres",
|
|
597
606
|
"page-not-found": "Cette page est introuvable…",
|
|
607
|
+
"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 !",
|
|
598
608
|
"pagination:all": "Tous",
|
|
599
609
|
"partially-connected": "Partiellement connecté",
|
|
600
610
|
"password": "Mot de passe",
|
|
@@ -612,6 +622,7 @@
|
|
|
612
622
|
"pifs": "PIFs",
|
|
613
623
|
"pifs-status": "Statut des PIFs",
|
|
614
624
|
"please-confirm-to-continue": "Cette action ne peut pas être annulée. Êtes-vous sûr de vouloir continuer ?",
|
|
625
|
+
"please-wait": "Veuillez patienter",
|
|
615
626
|
"pool": "Pool",
|
|
616
627
|
"pool-connection-error-auth-failed": "Une erreur s'est produite lors de la connexion au pool. Le nom d'utilisateur ou le mot de passe semble incorrect.",
|
|
617
628
|
"pool-connection-error-duplicate": "Une erreur s'est produite lors de la connexion au pool, il semble déjà être connecté.",
|
|
@@ -739,6 +750,7 @@
|
|
|
739
750
|
"skipped": "Ignoré",
|
|
740
751
|
"smart-mode": "Mode intelligent",
|
|
741
752
|
"snapshot": "Instantané",
|
|
753
|
+
"snapshot-created-on": "Instantané créé le",
|
|
742
754
|
"snapshot-mode": "Mode de sauvegarde",
|
|
743
755
|
"snapshots": "Instantanés",
|
|
744
756
|
"sockets-with-cores-per-socket": "{nSockets} sockets × {nCores} cœurs/socket",
|
|
@@ -840,11 +852,13 @@
|
|
|
840
852
|
"total-used:": "Total utilisé :",
|
|
841
853
|
"transfer-size": "Taille transférée",
|
|
842
854
|
"translation-tool": "Outil de traduction",
|
|
855
|
+
"trigger": "Déclencheur",
|
|
843
856
|
"unable-to-connect-to": "Impossible de se connecter à {ip}",
|
|
844
857
|
"unable-to-connect-to-the-pool": "Impossible de se connecter au Pool",
|
|
845
858
|
"unable-to-connect-to-xo-server": "Impossible de se connecter au serveur XO.",
|
|
846
859
|
"unknown": "Inconnu",
|
|
847
860
|
"unlocked": "Déverrouillé",
|
|
861
|
+
"unnamed": "Sans nom",
|
|
848
862
|
"unreachable-hosts": "Hôtes inaccessibles",
|
|
849
863
|
"unreachable-hosts-reload-page": "C'est fait. Rafraîchir la page",
|
|
850
864
|
"untitled": "Sans titre",
|
|
@@ -853,6 +867,7 @@
|
|
|
853
867
|
"used": "Utilisé",
|
|
854
868
|
"used-for-backup": "Utilisé pour la sauvegarde",
|
|
855
869
|
"used-space": "Espace utilisé",
|
|
870
|
+
"used-space-on-sr": "Espace utilisé sur le SR",
|
|
856
871
|
"user-config": "Configuration utilisateur",
|
|
857
872
|
"username": "Nom d'utilisateur",
|
|
858
873
|
"uuid": "UUID",
|
|
@@ -54,6 +54,8 @@ export const useSseStore = defineStore('sse', () => {
|
|
|
54
54
|
|
|
55
55
|
const hasErrorSse = computed(() => isError.value || sse.value.errorSse !== null)
|
|
56
56
|
|
|
57
|
+
const isConnected = computed(() => sse.value.id !== undefined)
|
|
58
|
+
|
|
57
59
|
function setErrorSse(error: unknown | null) {
|
|
58
60
|
sse.value.errorSse = error
|
|
59
61
|
}
|
|
@@ -164,5 +166,5 @@ export const useSseStore = defineStore('sse', () => {
|
|
|
164
166
|
window.location.reload()
|
|
165
167
|
}
|
|
166
168
|
|
|
167
|
-
return { watch, unwatch, retry, hasErrorSse, setErrorSse, setPing }
|
|
169
|
+
return { watch, unwatch, retry, hasErrorSse, setErrorSse, setPing, isConnected }
|
|
168
170
|
})
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import VtsLinkCell, { type VtsLinkCellProps } from '@core/components/table/cells/VtsLinkCell.vue'
|
|
2
|
+
import VtsTextCell from '@core/components/table/cells/VtsTextCell.vue'
|
|
3
|
+
import { defineColumn } from '@core/packages/table'
|
|
4
|
+
import { renderHeadCell } from '@core/tables/helpers/render-head-cell.ts'
|
|
5
|
+
import type { HeaderConfig } from '@core/tables/types.ts'
|
|
6
|
+
import { h } from 'vue'
|
|
7
|
+
|
|
8
|
+
export const useLinkOrTextColumn = defineColumn((config?: HeaderConfig) => ({
|
|
9
|
+
renderHead: () => renderHeadCell(config?.headerIcon, config?.headerLabel),
|
|
10
|
+
renderBody: (link: { label: string; suffix?: string } & VtsLinkCellProps) => {
|
|
11
|
+
const { label, suffix, ...linkCellProps } = link
|
|
12
|
+
|
|
13
|
+
if (!linkCellProps.href && !linkCellProps.to) {
|
|
14
|
+
return h(VtsTextCell, () => label)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return h(VtsLinkCell, linkCellProps, {
|
|
18
|
+
default: () => label,
|
|
19
|
+
suffix: suffix ? () => h('span', suffix) : undefined,
|
|
20
|
+
})
|
|
21
|
+
},
|
|
22
|
+
}))
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { defineColumns } from '@core/packages/table'
|
|
2
|
+
import { useDateColumn } from '@core/tables/column-definitions/date-column.ts'
|
|
3
|
+
import { useLinkColumn } from '@core/tables/column-definitions/link-column.ts'
|
|
4
|
+
import { useLinkOrTextColumn } from '@core/tables/column-definitions/link-or-text-column.ts'
|
|
5
|
+
import { useSelectItemColumn } from '@core/tables/column-definitions/select-item-column.ts'
|
|
6
|
+
import { useTruncatedTextColumn } from '@core/tables/column-definitions/truncated-text-column.ts'
|
|
7
|
+
import { useI18n } from 'vue-i18n'
|
|
8
|
+
|
|
9
|
+
export const useSnapshotColumns = defineColumns(() => {
|
|
10
|
+
const { t } = useI18n()
|
|
11
|
+
|
|
12
|
+
return {
|
|
13
|
+
name: useLinkColumn({ headerLabel: () => t('name') }),
|
|
14
|
+
description: useTruncatedTextColumn({ headerLabel: () => t('description') }),
|
|
15
|
+
creationDate: useDateColumn({ headerLabel: () => t('creation-date'), dateStyle: 'short', timeStyle: 'medium' }),
|
|
16
|
+
trigger: useLinkOrTextColumn({ headerLabel: () => t('trigger'), headerIcon: 'fa:square-caret-down' }),
|
|
17
|
+
selectItem: useSelectItemColumn(),
|
|
18
|
+
}
|
|
19
|
+
})
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const getIpAddressesByDevice = (addresses: Record<string, string>) =>
|
|
2
|
+
Object.entries(addresses).reduce<Record<string, string[]>>((acc, [key, address]) => {
|
|
3
|
+
const [device] = key.split('/')
|
|
4
|
+
acc[device] = acc[device] ?? []
|
|
5
|
+
acc[device].push(address)
|
|
6
|
+
return acc
|
|
7
|
+
}, {})
|
|
8
|
+
|
|
9
|
+
export const getUniqueIpAddressesForDevice = (
|
|
10
|
+
addresses: Record<string, string> | undefined,
|
|
11
|
+
device: string
|
|
12
|
+
): string[] => {
|
|
13
|
+
if (!addresses) {
|
|
14
|
+
return []
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return [...new Set(getIpAddressesByDevice(addresses)[device])]
|
|
18
|
+
}
|