@xen-orchestra/web-core 0.56.0 → 0.58.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 (80) hide show
  1. package/lib/assets/css/base.pcss +5 -0
  2. package/lib/components/copy-all-menu-item/VtsCopyAllMenuItem.vue +48 -0
  3. package/lib/components/copy-button/VtsCopyButton.vue +2 -2
  4. package/lib/components/input-wrapper/VtsInputWrapper.vue +2 -2
  5. package/lib/components/layout/VtsLayoutSidebar.vue +116 -43
  6. package/lib/components/menu/MenuItem.vue +9 -1
  7. package/lib/components/menu/MenuList.vue +4 -2
  8. package/lib/components/menu/VtsActionsMenu.vue +24 -24
  9. package/lib/components/modal/VtsActionModal.vue +44 -9
  10. package/lib/components/modal/VtsBlockedModal.vue +1 -1
  11. package/lib/components/modal/VtsDeleteModal.vue +1 -1
  12. package/lib/components/overlay/VtsOverlayButton.vue +35 -0
  13. package/lib/components/overlay/VtsOverlayCancelButton.vue +16 -0
  14. package/lib/components/overlay/VtsOverlayConfirmButton.vue +25 -0
  15. package/lib/components/overlay/VtsOverlayList.vue +82 -0
  16. package/lib/components/progress-bar/VtsProgressBar.vue +5 -3
  17. package/lib/components/select/VtsSelect.vue +0 -3
  18. package/lib/components/space-card/VtsSpaceCard.vue +1 -1
  19. package/lib/components/table/cells/VtsProgressBarCell.vue +1 -1
  20. package/lib/components/table/cells/VtsUserNameCell.vue +29 -0
  21. package/lib/components/task/VtsQuickTaskButton.vue +1 -1
  22. package/lib/components/task/VtsQuickTaskList.vue +1 -1
  23. package/lib/components/tree/VtsTreeItem.vue +4 -4
  24. package/lib/components/ui/head-bar/UiHeadBar.vue +1 -1
  25. package/lib/components/ui/input/UiInput.vue +53 -9
  26. package/lib/components/ui/query-search-bar/UiQuerySearchBar.vue +1 -15
  27. package/lib/components/ui/quick-task-item/UiQuickTaskItem.vue +1 -1
  28. package/lib/components/ui/quick-task-panel/UiQuickTaskPanel.vue +1 -1
  29. package/lib/components/ui/task-item/UiTaskItem.vue +14 -6
  30. package/lib/components/ui/task-list/UiTaskList.vue +1 -1
  31. package/lib/components/ui/text-area/UiTextarea.vue +12 -14
  32. package/lib/components/ui/tree-item-label/UiTreeItemLabel.vue +34 -14
  33. package/lib/components/vif-connection-toggle-modal/VtsVifConnectionToggleModal.vue +43 -0
  34. package/lib/composables/copy.composable.ts +6 -0
  35. package/lib/composables/table/multi-select.composable.md +33 -0
  36. package/lib/layouts/CoreLayout.vue +74 -62
  37. package/lib/locales/cs.json +50 -2
  38. package/lib/locales/de.json +3 -0
  39. package/lib/locales/en.json +63 -2
  40. package/lib/locales/fr.json +63 -2
  41. package/lib/locales/ko.json +2 -0
  42. package/lib/locales/nl.json +132 -1
  43. package/lib/locales/pt.json +1 -1
  44. package/lib/locales/sk.json +50 -2
  45. package/lib/packages/form-validation/custom-rules/ip-addresses.rule.ts +15 -0
  46. package/lib/packages/form-validation/custom-rules/ip.regex.ts +26 -0
  47. package/lib/packages/form-validation/custom-rules/ipv4-or-cidr.rule.ts +2 -3
  48. package/lib/packages/form-validation/index.ts +2 -0
  49. package/lib/packages/hide-permanently/README.md +60 -0
  50. package/lib/packages/hide-permanently/types.ts +3 -0
  51. package/lib/packages/hide-permanently/use-hide-permanently.ts +15 -0
  52. package/lib/packages/overlay/OverlayComponent.vue +18 -0
  53. package/lib/packages/overlay/README.md +300 -0
  54. package/lib/packages/overlay/create-event-handler.ts +73 -0
  55. package/lib/packages/overlay/injection-keys.ts +3 -0
  56. package/lib/packages/overlay/is-thenable.ts +3 -0
  57. package/lib/packages/overlay/symbols.ts +5 -0
  58. package/lib/packages/overlay/types.ts +95 -0
  59. package/lib/packages/overlay/use-overlay-escape.ts +34 -0
  60. package/lib/packages/overlay/use-overlay-store.ts +38 -0
  61. package/lib/packages/overlay/use-overlay-trigger.ts +33 -0
  62. package/lib/packages/overlay/use-overlay.ts +114 -0
  63. package/lib/packages/progress/use-progress.ts +12 -2
  64. package/lib/packages/remote-resource/define-remote-resource.ts +55 -26
  65. package/lib/packages/remote-resource/sse.store.ts +4 -4
  66. package/lib/packages/sidebar/index.ts +2 -0
  67. package/lib/packages/sidebar/sidebar.store.ts +55 -0
  68. package/lib/packages/sidebar/types.ts +21 -0
  69. package/lib/packages/sidebar/use-sidebar-resize.ts +47 -0
  70. package/lib/packages/sidebar/use-sidebar-responsive-expand.ts +19 -0
  71. package/lib/tables/column-definitions/user-name-column.ts +10 -0
  72. package/lib/tables/column-sets/server-columns.ts +2 -2
  73. package/lib/tables/column-sets/user-columns.ts +16 -0
  74. package/lib/types/object.type.ts +9 -1
  75. package/lib/types/task.type.ts +5 -12
  76. package/lib/utils/injection-keys.util.ts +3 -1
  77. package/lib/utils/ip-address.utils.ts +7 -0
  78. package/lib/utils/sr.utils.ts +4 -0
  79. package/package.json +2 -1
  80. package/lib/stores/sidebar.store.ts +0 -79
@@ -39,6 +39,7 @@
39
39
  "action:create-network": "Vytvoriť sieť",
40
40
  "action:create-traffic-rule": "Vytvoriť pravidlo pre prevádzku",
41
41
  "action:create-vdi": "Vytvoriť obraz virt. disku",
42
+ "action:create-vif": "Vytvoriť virt. sieťové rozhranie",
42
43
  "action:delete": "Odstrániť",
43
44
  "action:delete-filter": "Odstrániť filter",
44
45
  "action:delete-group": "Odstrániť skupinu",
@@ -61,27 +62,34 @@
61
62
  "action:disconnect-n-vifs": "Odpojiť 1 virt. sieťové rozhranie | Odpojiť {n} virt. sieťové rozhrania | Odpojiť {n} virt. sieťových rozhraní",
62
63
  "action:download-bugtools-archive": "Stiahnuť archív s výstupom bugtools",
63
64
  "action:duplicate": "Zduplikovať",
65
+ "action:duplicate-n-vms": "Zduplikovať 1 virt. stroj | Zduplikovať {n} virt. stroje | Zduplikovať {n} virt. strojov",
64
66
  "action:edit": "Upraviť",
65
67
  "action:edit-config": "Upraviť konfiguráciu",
66
68
  "action:enable-light-mode": "Zapnúť svetlý režim",
67
69
  "action:export": "Export",
70
+ "action:export-content": "Exportovať obsah",
68
71
  "action:export-n-vms": "Exportovať 1 virt. stroj | Exportovať {n} virt. strojov",
69
72
  "action:export-n-vms-manually": "Exportovať 1 virt. stroj ručne | Exportovať {n} virt. strojov ručne",
70
73
  "action:export-table-to": "Exportovať tabuľku do {type}",
74
+ "action:export-vdi": "Exportovať obraz virt. disku",
71
75
  "action:export-vm": "Exportovať virt. stroj | Exportovať virt. stroje",
72
76
  "action:filter": "Filtrovať",
77
+ "action:force-migrate-on-sr": "Vynútiť presťahovanie na repozitár úložiska",
73
78
  "action:force-reboot": "Vynútiť reštart",
74
79
  "action:force-shutdown": "Vynútiť vypnutie",
75
80
  "action:forget": "Zabudnúť",
76
81
  "action:go-back": "Prejsť späť",
77
82
  "action:group": "Skupina",
78
83
  "action:hide": "Skryť",
84
+ "action:import": "Naimportovať",
85
+ "action:import-export": "Import/Export",
79
86
  "action:install-app": "Inštalovať {name}",
80
87
  "action:install-guest-tools": "Nainštalovať nástroje do hosťa",
81
88
  "action:load-now": "Načítať teraz",
82
89
  "action:log-out": "Odhlásiť sa",
83
90
  "action:migrate": "Migrovať",
84
91
  "action:migrate-n-vms": "Migrovať 1 virt. stroj | Migrovať {n} virt. strojov",
92
+ "action:migrate-vdi-on-sr": "Presťahovať na repozitár úložiska",
85
93
  "action:move-filters-to-parent-group": "Presunúť filtre do nadradenej skupiny",
86
94
  "action:open": "Otvoriť",
87
95
  "action:open-app": "@:action:open {name}",
@@ -152,6 +160,8 @@
152
160
  "allocated-space": "Pridelený priestor",
153
161
  "allow": "Umožniť",
154
162
  "allow-self-signed-ssl": "Je možné že bude potrebné vo vami využívanom prehliadači povoliť sami sebou podpísané SSL certifikáty",
163
+ "allowed-ips": "Umožnené IP adresy",
164
+ "allowed-ips-example": "Napríklad: 192.168.0.1; 2001:db8::1",
155
165
  "and": "A",
156
166
  "any-property": "Akákoľvek vlastnosť",
157
167
  "api-error-details": "Podrobnosti o chybe rozhrania API",
@@ -220,6 +230,7 @@
220
230
  "build-number": "Číslo zostavenia",
221
231
  "by": "Od",
222
232
  "bytes:gi": "GiB",
233
+ "bytes:kbs": "kB/s",
223
234
  "bytes:ki": "KiB",
224
235
  "bytes:mi": "MiB",
225
236
  "cancel": "Zrušiť",
@@ -240,6 +251,7 @@
240
251
  "community": "Komunita",
241
252
  "community-name": "{name} komunita",
242
253
  "compression": "Kompresia",
254
+ "compression-not-available": "Pre repozitárov úložiska z rovnakého fondu nie je kompresia k dispozícii.",
243
255
  "concurrency": "Súbežnosť",
244
256
  "configuration": "Konfigurácia",
245
257
  "configure-for-protected": "Aby ste zaistili ochranu svojich virt. strojov, zvážte nastavenie {backup-job}",
@@ -282,6 +294,7 @@
282
294
  "creating-new-network": "Vytváranie novej siete",
283
295
  "creating-new-traffic-rule": "Vytvoriť nové pravidlo pre prevádzku",
284
296
  "creating-new-vdi": "Vytvára sa nový obraz virt. disku",
297
+ "creating-new-vif": "Vytváranie nového virt. sieťového rozhrania",
285
298
  "creation-date": "Dátum vytvorenia",
286
299
  "cron-pattern": "Vzorec plánovania (cron)",
287
300
  "current": "Súčasné",
@@ -306,6 +319,8 @@
306
319
  "deploy-xoa-status:waiting": "Čaká sa až XOA odpovie…",
307
320
  "descending": "zostupne",
308
321
  "description": "Popis",
322
+ "destination-sr": "Cieľový repozitár úložiska",
323
+ "destination-sr-mandatory": "Je potrebné určiť cieľový repozitár úložiska.",
309
324
  "device": "Zariadenie",
310
325
  "device-config": "Konfigurácia zariadenia",
311
326
  "dhcp": "DHCP",
@@ -332,6 +347,9 @@
332
347
  "documentation-name": "Dokumentácia pre {name}",
333
348
  "done": "Hotovo",
334
349
  "drop": "Zahodiť",
350
+ "duplicate-vm:error-message": "Pri duplikovaní virt. stroje došlo k chybe. Skontrolujte nastavenia (názov, repozitár úložiska, kompresiu) a skúste to znova.",
351
+ "duplicating-vm": "Duplikovanie virt. stroje",
352
+ "duplication-method": "Metóda duplikácie",
335
353
  "duration": "Trvanie",
336
354
  "empty": "Prázdne",
337
355
  "enabled": "Povolené",
@@ -352,6 +370,7 @@
352
370
  "failed": "Neúspešné",
353
371
  "failure": "Zlyhanie",
354
372
  "fast-clone": "Rýchly klon",
373
+ "fast-clone-available": "Rýchly klon je k dispozícii iba pre zastavené virt. stroje.",
355
374
  "fetching-fresh-data": "Získavanie aktuálnych údajov",
356
375
  "field:exceeds-max-characters": "Je potrebné, aby zadanie v kolónke bolo dlhé najviac {max} znakov.",
357
376
  "file": "Súbor",
@@ -369,6 +388,7 @@
369
388
  "free-space": "Voľné miesto",
370
389
  "free-space-on-sr": "Voľný priestor na repozitári úložiska",
371
390
  "from-vm": "Od virt. stroje",
391
+ "full-copy": "Úplná kópia",
372
392
  "fullscreen": "Celá obrazovka",
373
393
  "gateway": "Prehod",
374
394
  "general": "Všeobecné",
@@ -378,6 +398,7 @@
378
398
  "graphics-display": "Grafika a zobrazenie",
379
399
  "groups": "Skupiny",
380
400
  "guest-tools": "Nástroje pre hostí",
401
+ "gzip": "GZIP",
381
402
  "hardware": "Hardvér",
382
403
  "hardware-specifications": "Hardvérové špecifikácie",
383
404
  "heartbeat-storage-repository": "Repozitár úložiska kontroly stavu",
@@ -412,6 +433,9 @@
412
433
  "interfaces": "Rozhrania",
413
434
  "interrupted": "Prerušené",
414
435
  "invalid-field": "Neplatné pole",
436
+ "invalid-ip-addresses": "Jedna alebo viac neplatných IP adries",
437
+ "invalid-mac-address": "Neplatná MAC adresa",
438
+ "invalid-rate-limit": "Obmedzovanie rýchlosti nemôže byť záporné",
415
439
  "ip-address": "IP adresa",
416
440
  "ip-address-info": "Pravidlo je možné uplatniť na jednotlivú IP adresu alebo podsieť (v CIDR formáte). Príklady: 192.168.1.10 alebo 10.20.0.0/16",
417
441
  "ip-address-invalid": "Formát IP adresy nie je platný.",
@@ -455,6 +479,8 @@
455
479
  "job:create:in-progress": "Prebieha vytváranie…",
456
480
  "job:delete:in-progress": "Prebieha odstraňovanie…",
457
481
  "job:disconnect:in-progress": "Prebieha odpájanie…",
482
+ "job:export:in-progress": "Prebieha export…",
483
+ "job:migrate:in-progress": "Sťahovanie prebieha…",
458
484
  "job:network-delete:has-n-physical-pif-connected": "Sieť má pripojené jedno fyzické rozhranie | Sieť má pripojené {n} fyzické rozhrania | Sieť má pripojených {n} fyzických rozhraní",
459
485
  "job:network-delete:has-n-vif-attached": "Sieť má pripojené jedno virtuálne rozhranie | Sieť má pripojená {n} virtuálne rozhranie | Sieť má pripojených {n} virtuálnych rozhraní",
460
486
  "job:pbd-plug:missing-pbd": "Žiadne fyzické blokové zariadenia na pripojenie",
@@ -474,6 +500,12 @@
474
500
  "job:vbd-disconnect:vbd-disconnected": "Virt. blokové zariadenie je odpojené",
475
501
  "job:vdi-delete:missing-vdi": "Žiadne virt. disky na zmazanie",
476
502
  "job:vdi-delete:vbd-attached": "Nie je možné zmazať virt. disk, ku ktorému je pripojené virtuálne blokové zariadenie",
503
+ "job:vdi-detach:in-progress": "Prebieha rušenie priloženia…",
504
+ "job:vdi-export:format-required": "Vyžaduje sa formát exportu obrazu virt. disku",
505
+ "job:vdi-export:missing-vdi": "Žiadny obraz virt. disku na export",
506
+ "job:vdi-migrate:in-progress": "Prebieha sťahovanie…",
507
+ "job:vdi-migrate:missing-sr": "Je potrebný repozitár úložiska",
508
+ "job:vdi-migrate:missing-vdi": "Nevybraný žiadny obraz virt. disku",
477
509
  "job:vif-connect:missing-vif": "Žiadna virt. sieťové rozhrania na pripojenie",
478
510
  "job:vif-connect:vif-already-connected": "Virt. sieťové rozhranie už je pripojené",
479
511
  "job:vif-delete:blocked-operation": "Mazanie virt. sieťového rozhrania je blokované",
@@ -657,6 +689,8 @@
657
689
  "new-vdi:add": "Pridať nový obraz virt. disku",
658
690
  "new-vdi:error-message": "Pri pridávaní obrazu virt. disku došlo k chybe. Skontrolujte nastavenie (názov, repozitár úložiska, pridelený priestor) a skúste to znova.",
659
691
  "new-vif": "Nové VIF",
692
+ "new-vif:add": "Pridať nové virt. sieťové rozhranie",
693
+ "new-vif:error-message": "Došlo k chybe pri vytváraní nového virt. sieťového rozhrania. Skontrolujte nastavenia a skúste to znova.",
660
694
  "new-vm": "Nový VM",
661
695
  "new-vm:add": "Pridať nový virt. stroj",
662
696
  "new-vm:description": "Popis VM",
@@ -725,6 +759,7 @@
725
759
  "operation:clean-reboot": "Reštartovanie",
726
760
  "operation:clean-shutdown": "Vypínanie",
727
761
  "operation:destroy": "Odstraňovanie",
762
+ "operation:duplicate": "Duplikovanie",
728
763
  "operation:force-reboot": "Vynútené reštartovanie",
729
764
  "operation:force-shutdown": "Vynútené vypínanie",
730
765
  "operation:pause": "Pozastavenie",
@@ -741,6 +776,7 @@
741
776
  "other": "Iné",
742
777
  "other-properties": "Ostatné vlastnosti",
743
778
  "other-settings": "Ďalšie nastavenia",
779
+ "ova": "OVA",
744
780
  "page-not-found": "Táto stránka sa nedá nájsť…",
745
781
  "page-please-wait": "Drž sa pevne, astronaut! Stránka sa pripravuje na start.{newline}Práve nastavujeme trysky a kalibrujeme systémy. Už to dlho nepotrvá, zostaňte naladení!",
746
782
  "pagination:all": "@:all",
@@ -885,8 +921,9 @@
885
921
  "see-details": "Zobraziť podrobnosti",
886
922
  "select-compression": "Vyberte kompresiu",
887
923
  "select-destination-host": "Vyberte cieľového hostiteľa",
924
+ "select-format": "Vyberte formát",
888
925
  "select-host": "Vyberte hostiteľa",
889
- "select-to-see-details": "Ak chcete zobraziť podrobnosti, vyberte prvok",
926
+ "select-to-see-details": "Podrobnosti si zobrazíte kliknutím na {icon}",
890
927
  "selected-vms-in-execution": "Niektoré z vybraných virt. stroje sú spustené",
891
928
  "self-signed-certificates": "Samy sebou podpísané certifikáty",
892
929
  "send-us-feedback": "Pošlite nám spätnú väzbu",
@@ -927,6 +964,7 @@
927
964
  "sr-disconnect-info-pool-mixed": "Lokálne repozitára úložiska budú odpojené od svojich príslušných hostiteľov. Zdieľané repozitáre budú odpojené od všetkých hostiteľov v tomto fonde.",
928
965
  "sr-disconnect-info-pool-shared": "Repozitár úložiska bude odpojený od {hostsCount} hostiteľov v tomto fonde. | Každý zdieľaný repozitár úložiska bude odpojený od všetkých hostiteľov v tomto fonde.",
929
966
  "sr-disconnect-title": "Chystáte sa odpojiť 1 repozitár úložiska | Chystáte sa odpojiť {n} repozitára úložiska | Chystáte sa odpojiť {n} repozitárov úložiska",
967
+ "sr-required": "Je potrebný repozitár úložiska.",
930
968
  "ssh-account": "SSH účet",
931
969
  "ssh-key": "SSH kľúč",
932
970
  "ssh-login": "SSH prihlasovacie meno",
@@ -1022,6 +1060,8 @@
1022
1060
  "traffic-rule": "Pravidlo pre prevádzku",
1023
1061
  "traffic-rule-delete-warning": "Túto akciu nemožno vziať späť. Označené pravidlo pre prevádzku bude nevratne zmazané.",
1024
1062
  "traffic-rules": "Pravidlá pre prevádzku",
1063
+ "traffic-rules:format-warning": "Chyba nastavenia: Pravidlá pre prevádzku nie sú v očakávanom formáte. {check-doc} ohľadom toho, ako ich previesť.",
1064
+ "traffic-rules:format-warning:check-doc": "Pozrite sa do najaktuálnejšej dokumentácie",
1025
1065
  "traffic-rules:info-message": "Implementácia poradia pravidiel pre prevádzku ešte prebieha. Chovanie môže byť nebezpečné.",
1026
1066
  "traffic-rules:no-traffic-rules-detected": "Nezjištěná žiadna pravidla pre prevádzku",
1027
1067
  "transfer-size": "Objem prenosu",
@@ -1038,7 +1078,10 @@
1038
1078
  "unable-to-create-new-network": "Nebolo možné vytvoriť novú sieť",
1039
1079
  "unable-to-create-new-traffic-rule": "Nebolo možné vytvoriť nové pravidlo pre prevádzku",
1040
1080
  "unable-to-create-new-vdi": "Nebolo možné vytvoriť nový obraz virt. disku",
1081
+ "unable-to-create-new-vif": "Nebolo možné vytvoriť nové virt. sieťové rozhranie",
1041
1082
  "unable-to-delete-network": "Sieť nebolo možné zmazať",
1083
+ "unable-to-duplicate-vm": "Nebolo možné zduplikovať virt. stroj",
1084
+ "unable-to-migrate-vdi": "Nebolo možné presťahovať obraz virt. disku na repozitár úložiska",
1042
1085
  "unknown": "Neznámo",
1043
1086
  "unlocked": "Odomknuté",
1044
1087
  "unnamed": "Bez názvu",
@@ -1072,6 +1115,7 @@
1072
1115
  "vdi-in-use": "Obraz virt. disku už je využívaný",
1073
1116
  "vdi-name": "Názov obrazu virt. disku",
1074
1117
  "vdi-not-attached-to-vm": "Nepripojený žiadny virt. stroj",
1118
+ "vdi-on-different-sr-warning": "Tento repozitár úložiska je lokálny pre hostiteľa, ktorý nedrží ostatné disky virt. stroje. Virt. stroj nebude môcť naštartovať pokiaľ sa nebudú všetky jeho disky nachádzať na rovnakom hostiteľovi alebo na zdieľanom úložisku.",
1075
1119
  "vdi-snapshot-source": "Zdroj obrazu virt. disku",
1076
1120
  "vdi-snpashot-time": "Dátum zachytenia stavu",
1077
1121
  "vdi-throughput": "Objemy čítania/zápisov na virt. disky",
@@ -1102,6 +1146,8 @@
1102
1146
  "vm-is-running": "Virt. stroj je spustený",
1103
1147
  "vm-limit-topology": "Limit topológie virt. stroje",
1104
1148
  "vm-management": "Správa VM",
1149
+ "vm-name": "Názov virt. stroje",
1150
+ "vm-name-required": "Je potrebný názov virt. stroje.",
1105
1151
  "vm-not-running": "Virt. stroj nie je spustený",
1106
1152
  "vm-off": "Tento virtuálny stroj je vypnutý.",
1107
1153
  "vm-protected-deletion": "Tento virtuálny počítač je momentálne chránený pred vymazaním.",
@@ -1156,5 +1202,7 @@
1156
1202
  "xoa-password-confirm-different": "Heslo do XOA nebolo zadané dvakrát rovnako",
1157
1203
  "xoa-ssh-account": "Účet pre SSH prístup do XOA",
1158
1204
  "xoa-ssh-password-confirm-different": "Heslo pre SSH nebolo zadané dvakrát rovnako",
1159
- "you-are-currently-on": "V tejto chvíli sa nachádzate na: {0}"
1205
+ "xva": "XVA",
1206
+ "you-are-currently-on": "V tejto chvíli sa nachádzate na: {0}",
1207
+ "zstd": "ZSTD"
1160
1208
  }
@@ -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>