@cobaltcore-dev/aurora 2.1.1 → 2.2.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 (173) hide show
  1. package/README.md +31 -25
  2. package/dist/client/AuroraApp.d.ts +9 -2
  3. package/dist/client/context/AppConfigContext.d.ts +44 -0
  4. package/dist/client/index.d.ts +2 -0
  5. package/dist/client/index.js +41221 -845
  6. package/dist/client/index.js.map +1 -1
  7. package/dist/client/trpcClient.d.ts +314 -0
  8. package/dist/client/utils/appConfigGating.d.ts +21 -0
  9. package/dist/server/index.d.ts +694 -3
  10. package/dist/server/index.js +1748 -722
  11. package/package.json +3 -3
  12. package/dist/client/AuthProvider-CVSAwW9f.mjs +0 -83
  13. package/dist/client/AuthProvider-CVSAwW9f.mjs.map +0 -1
  14. package/dist/client/ContentHeader-fKKZVu-o.mjs +0 -116
  15. package/dist/client/ContentHeader-fKKZVu-o.mjs.map +0 -1
  16. package/dist/client/DeleteFlavorModal-C4nAi7gY.mjs +0 -724
  17. package/dist/client/DeleteFlavorModal-C4nAi7gY.mjs.map +0 -1
  18. package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs +0 -26
  19. package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs.map +0 -1
  20. package/dist/client/FiltersInput-Becwxo_J.mjs +0 -85
  21. package/dist/client/FiltersInput-Becwxo_J.mjs.map +0 -1
  22. package/dist/client/FloatingIpActionModals-Cq10WljB.mjs +0 -466
  23. package/dist/client/FloatingIpActionModals-Cq10WljB.mjs.map +0 -1
  24. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs +0 -26
  25. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs.map +0 -1
  26. package/dist/client/Slot-CWb612-_.mjs +0 -28
  27. package/dist/client/Slot-CWb612-_.mjs.map +0 -1
  28. package/dist/client/SortInput-4g7nSTHW.mjs +0 -34
  29. package/dist/client/SortInput-4g7nSTHW.mjs.map +0 -1
  30. package/dist/client/StorageNotFound-B-zVinVD.mjs +0 -30
  31. package/dist/client/StorageNotFound-B-zVinVD.mjs.map +0 -1
  32. package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs +0 -28
  33. package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs.map +0 -1
  34. package/dist/client/_-CAsCx-Ay.mjs +0 -6
  35. package/dist/client/_-CAsCx-Ay.mjs.map +0 -1
  36. package/dist/client/_auth-SrDjHL6j.mjs +0 -12
  37. package/dist/client/_auth-SrDjHL6j.mjs.map +0 -1
  38. package/dist/client/_flavorId-BPvssEzn.mjs +0 -277
  39. package/dist/client/_flavorId-BPvssEzn.mjs.map +0 -1
  40. package/dist/client/_flavorId-CFUBcU-l.mjs +0 -27
  41. package/dist/client/_flavorId-CFUBcU-l.mjs.map +0 -1
  42. package/dist/client/_flavorId-CZcIp0Ih.mjs +0 -22
  43. package/dist/client/_flavorId-CZcIp0Ih.mjs.map +0 -1
  44. package/dist/client/_floatingIpId-B8r64AL9.mjs +0 -196
  45. package/dist/client/_floatingIpId-B8r64AL9.mjs.map +0 -1
  46. package/dist/client/_floatingIpId-lEobpOER.mjs +0 -26
  47. package/dist/client/_floatingIpId-lEobpOER.mjs.map +0 -1
  48. package/dist/client/_imageId-BAezmV0Y.mjs +0 -526
  49. package/dist/client/_imageId-BAezmV0Y.mjs.map +0 -1
  50. package/dist/client/_imageId-D-jqz3e3.mjs +0 -40
  51. package/dist/client/_imageId-D-jqz3e3.mjs.map +0 -1
  52. package/dist/client/_imageId-gMdrdnVt.mjs +0 -22
  53. package/dist/client/_imageId-gMdrdnVt.mjs.map +0 -1
  54. package/dist/client/_projectId-BYccdAtX.mjs +0 -77
  55. package/dist/client/_projectId-BYccdAtX.mjs.map +0 -1
  56. package/dist/client/_projectId-CBjZC1tv.mjs +0 -283
  57. package/dist/client/_projectId-CBjZC1tv.mjs.map +0 -1
  58. package/dist/client/_projectId-CLEa1zgw.mjs +0 -30
  59. package/dist/client/_projectId-CLEa1zgw.mjs.map +0 -1
  60. package/dist/client/_projectId-D3VOH5lN.mjs +0 -94
  61. package/dist/client/_projectId-D3VOH5lN.mjs.map +0 -1
  62. package/dist/client/_securityGroupId-BwgZnoiR.mjs +0 -29
  63. package/dist/client/_securityGroupId-BwgZnoiR.mjs.map +0 -1
  64. package/dist/client/_securityGroupId-Cz2NUHdB.mjs +0 -1819
  65. package/dist/client/_securityGroupId-Cz2NUHdB.mjs.map +0 -1
  66. package/dist/client/_serviceType-DS8DxsrP.mjs +0 -20
  67. package/dist/client/_serviceType-DS8DxsrP.mjs.map +0 -1
  68. package/dist/client/_serviceType-M8d9rOT6.mjs +0 -6
  69. package/dist/client/_serviceType-M8d9rOT6.mjs.map +0 -1
  70. package/dist/client/_storageType-BNpP1A2N.mjs +0 -13
  71. package/dist/client/_storageType-BNpP1A2N.mjs.map +0 -1
  72. package/dist/client/_storageType-BxSGKhAI.mjs +0 -15
  73. package/dist/client/_storageType-BxSGKhAI.mjs.map +0 -1
  74. package/dist/client/_storageType-DZYCmiLt.mjs +0 -30
  75. package/dist/client/_storageType-DZYCmiLt.mjs.map +0 -1
  76. package/dist/client/_storageType-UqAMP-8d.mjs +0 -859
  77. package/dist/client/_storageType-UqAMP-8d.mjs.map +0 -1
  78. package/dist/client/_storageType-u51_7OwJ.mjs +0 -7
  79. package/dist/client/_storageType-u51_7OwJ.mjs.map +0 -1
  80. package/dist/client/about-BmQTyLWc.mjs +0 -92
  81. package/dist/client/about-BmQTyLWc.mjs.map +0 -1
  82. package/dist/client/assets/__mocks__/svgMock.d.ts +0 -3
  83. package/dist/client/aurora-CIml-f2f.mjs +0 -19
  84. package/dist/client/aurora-CIml-f2f.mjs.map +0 -1
  85. package/dist/client/build-WuxXRAqf.mjs +0 -14530
  86. package/dist/client/build-WuxXRAqf.mjs.map +0 -1
  87. package/dist/client/cn-DM4Cy3jv.mjs +0 -10
  88. package/dist/client/cn-DM4Cy3jv.mjs.map +0 -1
  89. package/dist/client/flavors-CJVSNz6R.mjs +0 -15
  90. package/dist/client/flavors-CJVSNz6R.mjs.map +0 -1
  91. package/dist/client/flavors-CflJDIEH.mjs +0 -667
  92. package/dist/client/flavors-CflJDIEH.mjs.map +0 -1
  93. package/dist/client/flavors-DWMZ6TuJ.mjs +0 -8
  94. package/dist/client/flavors-DWMZ6TuJ.mjs.map +0 -1
  95. package/dist/client/floatingips-Cz9k80cc.mjs +0 -8
  96. package/dist/client/floatingips-Cz9k80cc.mjs.map +0 -1
  97. package/dist/client/floatingips-DXnRlLvV.mjs +0 -551
  98. package/dist/client/floatingips-DXnRlLvV.mjs.map +0 -1
  99. package/dist/client/floatingips-HRbuLxiN.mjs +0 -22
  100. package/dist/client/floatingips-HRbuLxiN.mjs.map +0 -1
  101. package/dist/client/floatingips-nN1kQmsu.mjs +0 -14
  102. package/dist/client/floatingips-nN1kQmsu.mjs.map +0 -1
  103. package/dist/client/formatBytes-CZv_XyCY.mjs +0 -38
  104. package/dist/client/formatBytes-CZv_XyCY.mjs.map +0 -1
  105. package/dist/client/helpers-1PpYf-fC.mjs +0 -6
  106. package/dist/client/helpers-1PpYf-fC.mjs.map +0 -1
  107. package/dist/client/hooks-D0yKIumu.mjs +0 -22
  108. package/dist/client/hooks-D0yKIumu.mjs.map +0 -1
  109. package/dist/client/imageHelpers-DBhL2ebL.mjs +0 -1272
  110. package/dist/client/imageHelpers-DBhL2ebL.mjs.map +0 -1
  111. package/dist/client/images-BsylWUiH.mjs +0 -2011
  112. package/dist/client/images-BsylWUiH.mjs.map +0 -1
  113. package/dist/client/images-NBf2bV43.mjs +0 -8
  114. package/dist/client/images-NBf2bV43.mjs.map +0 -1
  115. package/dist/client/images-zQq1nSVv.mjs +0 -15
  116. package/dist/client/images-zQq1nSVv.mjs.map +0 -1
  117. package/dist/client/md-kvaGCNAK.mjs +0 -336
  118. package/dist/client/md-kvaGCNAK.mjs.map +0 -1
  119. package/dist/client/network-DuZm76BZ.mjs +0 -8
  120. package/dist/client/network-DuZm76BZ.mjs.map +0 -1
  121. package/dist/client/objects-BudUAfWY.mjs +0 -12909
  122. package/dist/client/objects-BudUAfWY.mjs.map +0 -1
  123. package/dist/client/objects-Dc7sKUr8.mjs +0 -67
  124. package/dist/client/objects-Dc7sKUr8.mjs.map +0 -1
  125. package/dist/client/objects-Dw7oeTq2.mjs +0 -80
  126. package/dist/client/objects-Dw7oeTq2.mjs.map +0 -1
  127. package/dist/client/objects-_g7nGIn5.mjs +0 -25
  128. package/dist/client/objects-_g7nGIn5.mjs.map +0 -1
  129. package/dist/client/objects-eBxvY6_n.mjs +0 -78
  130. package/dist/client/objects-eBxvY6_n.mjs.map +0 -1
  131. package/dist/client/projects-yiK0HGSA.mjs +0 -7
  132. package/dist/client/projects-yiK0HGSA.mjs.map +0 -1
  133. package/dist/client/routeInfo-DP3v74Wg.mjs +0 -19
  134. package/dist/client/routeInfo-DP3v74Wg.mjs.map +0 -1
  135. package/dist/client/routes-CJj7SR_K.mjs +0 -10
  136. package/dist/client/routes-CJj7SR_K.mjs.map +0 -1
  137. package/dist/client/routes-xofA3ksU.mjs +0 -110
  138. package/dist/client/routes-xofA3ksU.mjs.map +0 -1
  139. package/dist/client/securitygroups-CSmsBzUb.mjs +0 -581
  140. package/dist/client/securitygroups-CSmsBzUb.mjs.map +0 -1
  141. package/dist/client/securitygroups-CtKne8UQ.mjs +0 -8
  142. package/dist/client/securitygroups-CtKne8UQ.mjs.map +0 -1
  143. package/dist/client/securitygroups-T7kaNFEp.mjs +0 -15
  144. package/dist/client/securitygroups-T7kaNFEp.mjs.map +0 -1
  145. package/dist/client/securitygroups-WLB1_IM6.mjs +0 -22
  146. package/dist/client/securitygroups-WLB1_IM6.mjs.map +0 -1
  147. package/dist/client/securitygroups-o0IXZM6S.mjs +0 -14
  148. package/dist/client/securitygroups-o0IXZM6S.mjs.map +0 -1
  149. package/dist/client/serviceCatalog-B3lKWC9V.mjs +0 -6
  150. package/dist/client/serviceCatalog-B3lKWC9V.mjs.map +0 -1
  151. package/dist/client/services-D1PbooD1.mjs +0 -6
  152. package/dist/client/services-D1PbooD1.mjs.map +0 -1
  153. package/dist/client/services-DEMVtFyn.mjs +0 -9
  154. package/dist/client/services-DEMVtFyn.mjs.map +0 -1
  155. package/dist/client/storageProviders-CJ5rOh13.mjs +0 -15
  156. package/dist/client/storageProviders-CJ5rOh13.mjs.map +0 -1
  157. package/dist/client/trpcClient-D7gpR7YG.mjs +0 -71
  158. package/dist/client/trpcClient-D7gpR7YG.mjs.map +0 -1
  159. package/dist/client/useBreadcrumbs-ha3IlaxX.mjs +0 -54
  160. package/dist/client/useBreadcrumbs-ha3IlaxX.mjs.map +0 -1
  161. package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs +0 -83
  162. package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs.map +0 -1
  163. package/dist/client/useModal-DCs1OJh7.mjs +0 -12
  164. package/dist/client/useModal-DCs1OJh7.mjs.map +0 -1
  165. package/dist/client/useModalTracking-BYd37pXm.mjs +0 -37
  166. package/dist/client/useModalTracking-BYd37pXm.mjs.map +0 -1
  167. package/dist/client/useProjectId-DBc5lpoU.mjs +0 -11
  168. package/dist/client/useProjectId-DBc5lpoU.mjs.map +0 -1
  169. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs +0 -294
  170. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs.map +0 -1
  171. package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs +0 -19
  172. package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs.map +0 -1
  173. package/dist/client/utils/trpcErrors.d.ts +0 -13
@@ -1 +0,0 @@
1
- {"version":3,"file":"_storageType-UqAMP-8d.mjs","names":["useState","trpcReact","Modal","TextInput","Stack","Message","useProjectId","useModalTracking","CreateContainerModal","isOpen","onClose","onSuccess","onPartialSuccess","maxContainerNameLength","existingContainers","useLingui","projectId","containerName","setContainerName","nameError","setNameError","submitError","setSubmitError","trackClose","markSubmitted","resetTracking","actionPrefix","utils","useUtils","createContainerMutation","storage","swift","createContainer","useMutation","data","listContainers","invalidate","name","trim","optionsApplied","optionsError","t","handleClose","onError","error","code","message","reset","validateName","trimmed","length","includes","some","c","handleNameChange","e","value","target","handleSubmit","mutate","project_id","container","handleKeyDown","key","title","open","onCancel","confirmButtonLabel","isPending","onConfirm","cancelButtonLabel","size","disableConfirmButton","disableCancelButton","disableCloseButton","direction","gap","variant","dismissible","onDismiss","role","aria-live","data-testid","p","className","label","required","onChange","onKeyDown","invalid","errortext","undefined","disabled","autoFocus","placeholder","useEffect","useState","useNavigate","useParams","Button","Checkbox","DataGrid","DataGridHeadCell","DataGridRow","DataGridCell","PopupMenu","PopupMenuItem","PopupMenuOptions","PopupMenuToggle","Status","formatBytesBinary","formatSwiftDate","useVirtualizedTableBody","CreateContainerModal","EmptyContainerModal","DeleteContainerModal","EditContainerMetadataModal","ManageContainerAccessModal","ContainerTableView","containers","createModalOpen","setCreateModalOpen","maxContainerNameLength","existingContainers","onCreateSuccess","onCreatePartialSuccess","onEmptySuccess","onEmptyError","onDeleteSuccess","onDeleteError","onPropertiesSuccess","onPropertiesError","onAclSuccess","onAclError","selectedContainers","setSelectedContainers","hasAnyBulkAction","projectId","provider","storageType","from","useLingui","navigate","scrollbarWidth","setScrollbarWidth","emptyModalContainer","setEmptyModalContainer","deleteModalContainer","setDeleteModalContainer","propertiesModalContainer","setPropertiesModalContainer","accessControlModalContainer","setAccessControlModalContainer","ref","tableBodyRef","elementRef","parentRef","height","bodyHeight","virtualItems","totalSize","measureElement","count","length","current","width","offsetWidth","clientWidth","handleSelectContainer","containerName","includes","filter","name","columnCount","gridColumnTemplate","div","className","style","paddingRight","columns","data-testid","marginRight","colSpan","status","title","t","body","position","map","virtualRow","container","index","isSelected","handleRowNavigate","to","params","data-index","top","left","transform","start","display","gridTemplateColumns","alignItems","tabIndex","onClick","onKeyDown","e","key","preventDefault","stopPropagation","checked","onChange","span","toLocaleString","last_modified","bytes","as","icon","aria-label","label","isOpen","onClose","onSuccess","onPartialSuccess","onError","Tooltip","TooltipTrigger","TooltipContent","Icon","formatBytesBinary","LimitItem","label","value","undefined","span","className","icon","size","CapabilityItem","Section","title","children","ContainerLimitsTooltip","serviceInfo","accountInfo","open","useLingui","swift","capabilityMap","account_quotas","t","container_quotas","bulk_delete","bulk_upload","slo","container_sync","tempurl","symlink","versioned_writes","capabilities","Object","entries","filter","key","map","triggerEvent","placement","objectCount","toLocaleString","bytesUsed","quotaBytes","max_file_size","max_container_name_length","max_object_name_length","container_listing_limit","account_listing_limit","max_header_size","max_meta_count","max_meta_name_length","max_meta_value_length","max_meta_overall_size","max_deletes_per_request","max_containers_per_extraction","max_manifest_segments","length","cap","z","useForm","useStore","useState","trpcReact","Modal","Status","Stack","Form","FormSection","TextInput","useProjectId","useModalTracking","MAX_VISIBLE","CONFIRM_WORD","EmptyContainersModal","isOpen","containers","onClose","onComplete","i18n","useLingui","projectId","progress","setProgress","trackClose","markSubmitted","resetTracking","actionPrefix","formSchema","object","confirm","string","transform","val","trim","refine","value","message","t","form","defaultValues","validators","onSubmit","emptyContainerMutation","isPending","emptiedCount","totalDeleted","errors","total","length","i","current","container","deleted","mutateAsync","project_id","name","err","Error","String","push","utils","storage","swift","listContainers","invalidate","handleClose","canEmpty","store","state","isSubmitting","values","useUtils","emptyContainer","useMutation","reset","totalCount","visibleContainers","slice","hiddenCount","progressCurrent","progressTotal","title","open","onCancel","confirmButtonLabel","confirmButtonVariant","cancelButtonLabel","onConfirm","handleSubmit","disableConfirmButton","disableCancelButton","disableCloseButton","size","status","className","div","p","strong","direction","gap","map","count","span","_","plural","id","e","preventDefault","Field","children","field","label","placeholder","onChange","handleChange","target","disabled","autoFocus","required","useState","useEffect","useRef","startTransition","SortInput","trpcReact","Button","Checkbox","DataGridToolbar","PopupMenu","PopupMenuItem","PopupMenuOptions","PopupMenuToggle","SearchInput","Status","Stack","toast","formatBytesBinary","parseSwiftDate","ContainerTableView","getContainerCreatedToast","getContainerCreatedWithWarningToast","getContainerEmptiedToast","getContainerEmptyErrorToast","getContainerDeletedToast","getContainerDeleteErrorToast","getContainerUpdatedToast","getContainerUpdateErrorToast","getContainerAclUpdatedToast","getContainerAclUpdateErrorToast","getContainersEmptyCompleteToast","ContainerLimitsTooltip","EmptyContainersModal","useNavigate","Route","useProjectId","SwiftContainers","i18n","useLingui","projectId","navigate","from","fullPath","sortBy","sortDirection","search","searchParam","useSearch","hasAnyBulkAction","createModalOpen","setCreateModalOpen","emptyAllModalOpen","setEmptyAllModalOpen","selectedContainers","setSelectedContainers","localSearchTerm","setLocalSearchTerm","debounceTimer","undefined","clearTimeout","current","handleCreateSuccess","containerName","message","options","success","handleCreatePartialSuccess","reason","warning","handleEmptySuccess","deletedCount","handleEmptyError","errorMessage","error","handleDeleteSuccess","handleDeleteError","handlePropertiesSuccess","handlePropertiesError","handleAclSuccess","handleAclError","handleEmptyAllComplete","emptiedCount","totalDeleted","errors","length","failedContainerNames","Set","map","e","split","prev","filter","name","has","severity","sortSettings","label","t","value","data","containers","isLoading","storage","swift","listContainers","useQuery","project_id","format","accountInfo","getAccountMetadata","serviceInfo","getServiceInfo","sortContainers","sort","a","b","comparison","localeCompare","count","bytes","last_modified","at","getTime","bt","filteredContainers","container","toLowerCase","includes","sortedContainers","handleSearchChange","term","handleSortChange","newSortSettings","resolvedSortBy","toString","resolvedDirection","status","title","body","bytesUsed","quotaBytes","remainingBytes","selectedContainerSummaries","c","hasSelection","selectedCount","totalCount","filteredCount","isFiltered","displayedNames","allSelected","every","n","someSelected","some","handleToggleSelectAll","div","className","direction","distribution","alignment","gap","selectClassName","onSortByChange","v","onSortDirectionChange","dir","variant","onClick","placeholder","data-testid","onInput","currentTarget","window","setTimeout","onSearch","onClear","checked","indeterminate","onChange","as","disabled","size","icon","_","plural","span","maxContainerNameLength","max_container_name_length","existingContainers","onCreateSuccess","onCreatePartialSuccess","onEmptySuccess","onEmptyError","onDeleteSuccess","onDeleteError","onPropertiesSuccess","onPropertiesError","onAclSuccess","onAclError","isOpen","onClose","onComplete","useParams","ErrorBoundary","SwiftContainers","CephBuckets","Trans","useLingui","ContentHeader","STORAGE_PROVIDER","StorageDashboard","project","provider","from","select","params","projectId","storageType","t","pageTitle","SWIFT","CEPH","SplitComponent","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/-components/Swift/Containers/CreateContainerModal.tsx","../../src/client/routes/_auth/projects/$projectId/storage/-components/Swift/Containers/ContainerTableView.tsx","../../src/client/routes/_auth/projects/$projectId/storage/-components/Swift/Containers/ContainerLimitsTooltip.tsx","../../src/client/routes/_auth/projects/$projectId/storage/-components/Swift/Containers/EmptyContainersModal.tsx","../../src/client/routes/_auth/projects/$projectId/storage/-components/Swift/Containers/index.tsx","../../src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/index.tsx?tsr-split=component"],"sourcesContent":["import { useState } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { Modal, TextInput, Stack, Message } from \"@cloudoperators/juno-ui-components\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\nimport { useModalTracking } from \"@/client/hooks/useModalTracking\"\nimport { ContainerSummary } from \"@/server/Storage/types/swift\"\n\ninterface CreateContainerModalProps {\n isOpen: boolean\n onClose: () => void\n onSuccess?: (containerName: string) => void\n onPartialSuccess?: (containerName: string, reason: string) => void\n maxContainerNameLength?: number\n existingContainers?: ContainerSummary[]\n}\n\nexport const CreateContainerModal = ({\n isOpen,\n onClose,\n onSuccess,\n onPartialSuccess,\n maxContainerNameLength = 256,\n existingContainers = [],\n}: CreateContainerModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [containerName, setContainerName] = useState(\"\")\n const [nameError, setNameError] = useState<string | null>(null)\n const [submitError, setSubmitError] = useState<string | null>(null)\n\n const { trackClose, markSubmitted, resetTracking } = useModalTracking({\n isOpen,\n actionPrefix: \"storage.swift.container.create\",\n })\n\n const utils = trpcReact.useUtils()\n\n const createContainerMutation = trpcReact.storage.swift.createContainer.useMutation({\n onSuccess: (data) => {\n utils.storage.swift.listContainers.invalidate()\n const name = containerName.trim()\n if (data.optionsApplied) {\n onSuccess?.(name)\n } else {\n onPartialSuccess?.(name, data.optionsError ?? t`The container's settings could not be applied.`)\n }\n handleClose()\n },\n onError: (error) => {\n if (error.data?.code === \"CONFLICT\") {\n setNameError(t`A container with this name already exists`)\n setSubmitError(null)\n } else {\n setSubmitError(error.message || t`The container could not be created. Try again or choose a different name.`)\n }\n\n resetTracking()\n },\n })\n\n const handleClose = () => {\n trackClose()\n setContainerName(\"\")\n setNameError(null)\n setSubmitError(null)\n resetTracking()\n createContainerMutation.reset()\n onClose()\n }\n\n const validateName = (name: string): boolean => {\n const trimmed = name.trim()\n\n if (!trimmed) {\n setNameError(t`Container name is required`)\n return false\n }\n if (trimmed.length > maxContainerNameLength) {\n setNameError(t`Container name must be ${maxContainerNameLength} characters or fewer`)\n return false\n }\n if (trimmed.includes(\"/\")) {\n setNameError(t`Container name cannot contain slashes`)\n return false\n }\n\n if (existingContainers.some((c) => c.name === trimmed)) {\n setNameError(t`A container with this name already exists`)\n return false\n }\n\n setNameError(null)\n return true\n }\n\n const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setContainerName(value)\n setSubmitError(null)\n if (nameError) validateName(value)\n }\n\n const handleSubmit = () => {\n if (!validateName(containerName)) return\n setSubmitError(null)\n markSubmitted()\n createContainerMutation.mutate({\n project_id: projectId,\n container: containerName.trim(),\n })\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n handleSubmit()\n }\n }\n\n if (!isOpen) return null\n\n return (\n <Modal\n title={t`Create Container`}\n open={isOpen}\n onCancel={handleClose}\n confirmButtonLabel={createContainerMutation.isPending ? t`Creating...` : t`Create`}\n onConfirm={handleSubmit}\n cancelButtonLabel={t`Cancel`}\n size=\"small\"\n disableConfirmButton={createContainerMutation.isPending || !containerName.trim()}\n disableCancelButton={createContainerMutation.isPending}\n disableCloseButton={createContainerMutation.isPending}\n >\n <Stack direction=\"vertical\" gap=\"6\">\n {submitError && (\n <Message\n variant=\"error\"\n dismissible\n onDismiss={() => setSubmitError(null)}\n role=\"alert\"\n aria-live=\"assertive\"\n data-testid=\"create-container-error\"\n >\n {submitError}\n </Message>\n )}\n <p className=\"text-theme-default\">\n <Trans>\n Inside a project, objects are stored in containers. Containers are where you define access permissions and\n quotas.\n </Trans>\n </p>\n <TextInput\n label={t`Container name`}\n required\n value={containerName}\n onChange={handleNameChange}\n onKeyDown={handleKeyDown}\n invalid={!!nameError}\n errortext={nameError || undefined}\n disabled={createContainerMutation.isPending}\n autoFocus\n placeholder={t`Enter container name`}\n />\n </Stack>\n </Modal>\n )\n}\n","import { useEffect, useState } from \"react\"\nimport { useNavigate, useParams } from \"@tanstack/react-router\"\nimport {\n Button,\n Checkbox,\n DataGrid,\n DataGridHeadCell,\n DataGridRow,\n DataGridCell,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n PopupMenuToggle,\n Status,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { ContainerSummary } from \"@/server/Storage/types/swift\"\nimport { formatBytesBinary } from \"@/client/utils/formatBytes\"\nimport { formatSwiftDate } from \"@/client/utils/formatSwiftDate\"\nimport { useVirtualizedTableBody } from \"@/client/hooks/useVirtualizedTableBody\"\nimport { CreateContainerModal } from \"./CreateContainerModal\"\nimport { EmptyContainerModal } from \"./EmptyContainerModal\"\nimport { DeleteContainerModal } from \"./DeleteContainerModal\"\nimport { EditContainerMetadataModal } from \"./EditContainerMetadataModal\"\nimport { ManageContainerAccessModal } from \"./ManageContainerAccessModal\"\n\ninterface ContainerTableViewProps {\n containers: ContainerSummary[]\n createModalOpen: boolean\n setCreateModalOpen: (open: boolean) => void\n maxContainerNameLength?: number\n existingContainers?: ContainerSummary[]\n onCreateSuccess: (containerName: string) => void\n onCreatePartialSuccess: (containerName: string, reason: string) => void\n onEmptySuccess: (containerName: string, deletedCount: number) => void\n onEmptyError: (containerName: string, errorMessage: string) => void\n onDeleteSuccess: (containerName: string) => void\n onDeleteError: (containerName: string, errorMessage: string) => void\n onPropertiesSuccess: (containerName: string) => void\n onPropertiesError: (containerName: string, errorMessage: string) => void\n onAclSuccess: (containerName: string) => void\n onAclError: (containerName: string, errorMessage: string) => void\n selectedContainers: string[]\n setSelectedContainers: (containers: string[]) => void\n // When false, the row-selection column (header checkbox + per-row checkboxes)\n // is dropped entirely and the grid renders one fewer column. Defaults to true\n // so existing callers that don't pass it keep the selectable layout.\n hasAnyBulkAction?: boolean\n}\n\nexport const ContainerTableView = ({\n containers,\n createModalOpen,\n setCreateModalOpen,\n maxContainerNameLength,\n existingContainers = [],\n onCreateSuccess,\n onCreatePartialSuccess,\n onEmptySuccess,\n onEmptyError,\n onDeleteSuccess,\n onDeleteError,\n onPropertiesSuccess,\n onPropertiesError,\n onAclSuccess,\n onAclError,\n selectedContainers,\n setSelectedContainers,\n hasAnyBulkAction = true,\n}: ContainerTableViewProps) => {\n const { projectId, provider, storageType } = useParams({\n from: \"/_auth/projects/$projectId/storage/$provider/$storageType/\",\n })\n\n const { t } = useLingui()\n const navigate = useNavigate()\n\n const [scrollbarWidth, setScrollbarWidth] = useState(0)\n const [emptyModalContainer, setEmptyModalContainer] = useState<ContainerSummary | null>(null)\n const [deleteModalContainer, setDeleteModalContainer] = useState<ContainerSummary | null>(null)\n const [propertiesModalContainer, setPropertiesModalContainer] = useState<ContainerSummary | null>(null)\n const [accessControlModalContainer, setAccessControlModalContainer] = useState<ContainerSummary | null>(null)\n\n // Height measured from the space actually left below the table, plus a\n // virtualizer that stays silent until that height is known.\n const {\n ref: tableBodyRef,\n elementRef: parentRef,\n height: bodyHeight,\n virtualItems,\n totalSize,\n measureElement,\n } = useVirtualizedTableBody({ count: containers.length })\n\n // Calculate scrollbar width\n useEffect(() => {\n if (parentRef.current) {\n const width = parentRef.current.offsetWidth - parentRef.current.clientWidth\n setScrollbarWidth(width)\n }\n }, [containers.length, bodyHeight])\n\n const handleSelectContainer = (containerName: string) => {\n if (selectedContainers.includes(containerName)) {\n setSelectedContainers(selectedContainers.filter((name) => name !== containerName))\n } else {\n setSelectedContainers([...selectedContainers, containerName])\n }\n }\n\n // Column count and template depend on whether the selection column is shown.\n // With selection: checkbox, name, count, last modified, size, actions menu (6).\n // Without selection: the leading 40px checkbox column is dropped (5).\n const columnCount = hasAnyBulkAction ? 6 : 5\n const gridColumnTemplate = hasAnyBulkAction\n ? \"40px minmax(200px, 2fr) minmax(100px, 1fr) minmax(180px, 2fr) minmax(100px, 1fr) 60px\"\n : \"minmax(200px, 2fr) minmax(100px, 1fr) minmax(180px, 2fr) minmax(100px, 1fr) 60px\"\n\n return (\n <>\n <div className=\"relative\">\n {/* Table Header with scrollbar padding */}\n <div style={{ paddingRight: `${scrollbarWidth}px` }}>\n <DataGrid\n columns={columnCount}\n gridColumnTemplate={gridColumnTemplate}\n className=\"containers\"\n data-testid=\"containers-table-header\"\n >\n <DataGridRow>\n {hasAnyBulkAction && <DataGridHeadCell />}\n <DataGridHeadCell>\n <Trans>Container Name</Trans>\n </DataGridHeadCell>\n <DataGridHeadCell>\n <Trans>Object Count</Trans>\n </DataGridHeadCell>\n <DataGridHeadCell>\n <Trans>Last Modified</Trans>\n </DataGridHeadCell>\n <DataGridHeadCell>\n <Trans>Total Size</Trans>\n </DataGridHeadCell>\n <DataGridHeadCell style={{ marginRight: `-${scrollbarWidth}px` }} />\n </DataGridRow>\n\n {(!containers || containers.length === 0) && (\n <DataGridRow>\n <DataGridCell colSpan={columnCount}>\n <Status\n status=\"empty\"\n title={t`No containers found`}\n body={t`There are no containers available with the current search criteria. Try adjusting your search term.`}\n />\n </DataGridCell>\n </DataGridRow>\n )}\n </DataGrid>\n </div>\n\n {/* Virtualized Table Body — sized to the space actually left below the\n table, so banners above it shrink the table instead of growing the\n page. */}\n <div\n ref={tableBodyRef}\n className=\"overflow-auto\"\n style={{ height: `${bodyHeight ?? 0}px` }}\n data-testid=\"containers-table-body\"\n >\n <DataGrid\n columns={columnCount}\n gridColumnTemplate={gridColumnTemplate}\n style={{\n height: `${totalSize}px`,\n width: \"100%\",\n position: \"relative\",\n }}\n >\n {virtualItems.map((virtualRow) => {\n const container = containers[virtualRow.index]\n const isSelected = selectedContainers.includes(container.name)\n\n const handleRowNavigate = () =>\n navigate({\n to: \"/projects/$projectId/storage/$provider/$storageType/$containerName/objects\",\n params: { projectId, provider, storageType, containerName: container.name },\n })\n\n return (\n <DataGridRow\n key={container.name}\n data-index={virtualRow.index}\n ref={measureElement}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n transform: `translateY(${virtualRow.start}px)`,\n display: \"grid\",\n gridTemplateColumns: gridColumnTemplate,\n alignItems: \"stretch\",\n }}\n data-testid={`container-row-${container.name}`}\n tabIndex={0}\n onClick={handleRowNavigate}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n handleRowNavigate()\n }\n }}\n >\n {hasAnyBulkAction && (\n <DataGridCell\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.stopPropagation()\n }\n }}\n >\n <Checkbox\n checked={isSelected}\n onChange={() => handleSelectContainer(container.name)}\n data-testid={`select-container-${container.name}`}\n />\n </DataGridCell>\n )}\n <DataGridCell className=\"min-w-0 overflow-hidden\">\n <span className=\"block truncate\" title={container.name}>\n {container.name}\n </span>\n </DataGridCell>\n <DataGridCell>{container.count.toLocaleString()}</DataGridCell>\n <DataGridCell>{formatSwiftDate(container.last_modified) ?? t`N/A`}</DataGridCell>\n <DataGridCell>{formatBytesBinary(container.bytes)}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()}>\n <PopupMenu>\n <PopupMenuToggle as=\"div\">\n <Button\n icon=\"moreVert\"\n title={t`Container actions`}\n aria-label={t`Container actions`}\n className=\"!bg-transparent\"\n />\n </PopupMenuToggle>\n <PopupMenuOptions>\n <PopupMenuItem\n label={t`Manage Access`}\n onClick={() => setAccessControlModalContainer(container)}\n data-testid={`access-control-action-${container.name}`}\n />\n <PopupMenuItem\n label={t`Preview and Edit metadata`}\n onClick={() => setPropertiesModalContainer(container)}\n data-testid={`properties-action-${container.name}`}\n />\n <PopupMenuItem\n label={t`Empty Container`}\n onClick={() => setEmptyModalContainer(container)}\n data-testid={`empty-action-${container.name}`}\n />\n <PopupMenuItem\n label={t`Delete Container`}\n onClick={() => setDeleteModalContainer(container)}\n data-testid={`delete-action-${container.name}`}\n />\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n )\n })}\n </DataGrid>\n </div>\n </div>\n\n <CreateContainerModal\n isOpen={createModalOpen}\n onClose={() => setCreateModalOpen(false)}\n onSuccess={onCreateSuccess}\n onPartialSuccess={onCreatePartialSuccess}\n maxContainerNameLength={maxContainerNameLength}\n existingContainers={existingContainers}\n />\n\n <EmptyContainerModal\n isOpen={emptyModalContainer !== null}\n container={emptyModalContainer}\n onClose={() => setEmptyModalContainer(null)}\n onSuccess={onEmptySuccess}\n onError={onEmptyError}\n />\n\n <DeleteContainerModal\n isOpen={deleteModalContainer !== null}\n container={deleteModalContainer}\n onClose={() => setDeleteModalContainer(null)}\n onSuccess={onDeleteSuccess}\n onError={onDeleteError}\n />\n\n <EditContainerMetadataModal\n isOpen={propertiesModalContainer !== null}\n container={propertiesModalContainer}\n onClose={() => setPropertiesModalContainer(null)}\n onSuccess={onPropertiesSuccess}\n onError={onPropertiesError}\n />\n\n <ManageContainerAccessModal\n isOpen={accessControlModalContainer !== null}\n container={accessControlModalContainer}\n onClose={() => setAccessControlModalContainer(null)}\n onSuccess={onAclSuccess}\n onError={onAclError}\n />\n </>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Tooltip, TooltipTrigger, TooltipContent, Icon } from \"@cloudoperators/juno-ui-components\"\nimport { ServiceInfo, AccountInfo } from \"@/server/Storage/types/swift\"\nimport { formatBytesBinary } from \"@/client/utils/formatBytes\"\n\ninterface ContainerLimitsTooltipProps {\n serviceInfo?: ServiceInfo\n accountInfo?: AccountInfo\n open?: boolean\n}\n\ninterface LimitItemProps {\n label: string\n value?: string | number\n}\n\nconst LimitItem = ({ label, value }: LimitItemProps) => {\n if (value === undefined || value === null) return null\n return (\n <span className=\"flex items-start gap-1.5\">\n <Icon icon=\"check\" size=\"16px\" className=\"text-theme-success mt-0.5 shrink-0\" />\n <span>\n <span className=\"font-medium\">{label}:</span> {value}\n </span>\n </span>\n )\n}\n\nconst CapabilityItem = ({ label }: { label: string }) => (\n <span className=\"flex items-start gap-1.5\">\n <Icon icon=\"check\" size=\"16px\" className=\"text-theme-success mt-0.5 shrink-0\" />\n <span>{label}</span>\n </span>\n)\n\nconst Section = ({ title, children }: { title: React.ReactNode; children: React.ReactNode }) => (\n <span className=\"flex flex-col gap-1.5\">\n <span className=\"text-theme-default block font-semibold\">{title}</span>\n {children}\n </span>\n)\n\nexport const ContainerLimitsTooltip = ({ serviceInfo, accountInfo, open }: ContainerLimitsTooltipProps) => {\n const { t } = useLingui()\n\n const swift = serviceInfo?.swift\n\n const capabilityMap = {\n account_quotas: t`Account quotas`,\n container_quotas: t`Container quotas`,\n bulk_delete: t`Efficient bulk deletion`,\n bulk_upload: t`Bulk upload of archive files`,\n slo: t`Static large object support`,\n container_sync: t`Container syncing`,\n tempurl: t`Temporary URLs`,\n symlink: t`Symlinks`,\n versioned_writes: t`Versioned writes`,\n } as const\n\n const capabilities = Object.entries(capabilityMap)\n .filter(([key]) => swift?.[key as keyof typeof swift])\n .map(([, label]) => label)\n\n return (\n <Tooltip triggerEvent=\"hover\" placement=\"bottom-end\" open={open}>\n <TooltipTrigger className=\"max-h-5\">\n <span>\n <Icon icon=\"info\" size=\"20px\" className=\"text-theme-light hover:text-theme-default cursor-pointer\" />\n </span>\n </TooltipTrigger>\n <TooltipContent className=\"z-10 w-72 text-sm\">\n <span className=\"flex flex-col gap-3 p-1\">\n {/* Account stats */}\n {accountInfo && (\n <Section title={<Trans>Account</Trans>}>\n <LimitItem label={t`Objects`} value={accountInfo.objectCount.toLocaleString()} />\n <LimitItem label={t`Used`} value={formatBytesBinary(accountInfo.bytesUsed)} />\n {accountInfo.quotaBytes !== undefined && (\n <LimitItem label={t`Quota`} value={formatBytesBinary(accountInfo.quotaBytes)} />\n )}\n </Section>\n )}\n\n {/* Limits */}\n {swift && (\n <Section title={<Trans>Limits</Trans>}>\n <LimitItem\n label={t`Max file size`}\n value={swift.max_file_size !== undefined ? formatBytesBinary(swift.max_file_size) : undefined}\n />\n <LimitItem label={t`Max container name length`} value={swift.max_container_name_length} />\n <LimitItem label={t`Max object name length`} value={swift.max_object_name_length} />\n <LimitItem label={t`Container listing limit`} value={swift.container_listing_limit?.toLocaleString()} />\n <LimitItem label={t`Account listing limit`} value={swift.account_listing_limit?.toLocaleString()} />\n <LimitItem label={t`Max header size`} value={swift.max_header_size} />\n <LimitItem label={t`Max meta count`} value={swift.max_meta_count} />\n <LimitItem label={t`Max meta name length`} value={swift.max_meta_name_length} />\n <LimitItem label={t`Max meta value length`} value={swift.max_meta_value_length} />\n <LimitItem label={t`Max meta overall size`} value={swift.max_meta_overall_size} />\n {swift.bulk_delete && (\n <LimitItem\n label={t`Max deletes per request`}\n value={swift.bulk_delete.max_deletes_per_request.toLocaleString()}\n />\n )}\n {swift.bulk_upload && (\n <LimitItem\n label={t`Max containers per extraction`}\n value={swift.bulk_upload.max_containers_per_extraction.toLocaleString()}\n />\n )}\n {swift.slo && (\n <LimitItem label={t`Max SLO segments`} value={swift.slo.max_manifest_segments.toLocaleString()} />\n )}\n </Section>\n )}\n\n {/* Capabilities */}\n {capabilities.length > 0 && (\n <Section title={<Trans>Capabilities</Trans>}>\n {capabilities.map((cap) => (\n <CapabilityItem key={cap} label={cap} />\n ))}\n </Section>\n )}\n </span>\n </TooltipContent>\n </Tooltip>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { useState } from \"react\"\nimport { Plural, Trans, useLingui } from \"@lingui/react/macro\"\nimport { plural } from \"@lingui/core/macro\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { Modal, Status, Stack, Form, FormSection, TextInput } from \"@cloudoperators/juno-ui-components\"\nimport { ContainerSummary } from \"@/server/Storage/types/swift\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\nimport { useModalTracking } from \"@/client/hooks/useModalTracking\"\n\n// Max number of container names shown in the list before truncating\nconst MAX_VISIBLE = 20\n\n// The literal word the user must type to confirm this destructive action.\n// The gating logic (isConfirmed) compares against this constant, NOT the\n// translated label — so a mistranslated label can never weaken or break the\n// confirmation gate. The English label below should name the same word for clarity.\nconst CONFIRM_WORD = \"empty\"\n\ninterface EmptyContainersResult {\n emptiedCount: number\n totalDeleted: number\n errors: string[]\n}\n\ninterface EmptyContainersModalProps {\n isOpen: boolean\n containers: ContainerSummary[]\n onClose: () => void\n onComplete?: (result: EmptyContainersResult) => void\n}\n\nexport const EmptyContainersModal = ({ isOpen, containers, onClose, onComplete }: EmptyContainersModalProps) => {\n const { t, i18n } = useLingui()\n const projectId = useProjectId()\n\n const [progress, setProgress] = useState<{ current: number; total: number } | null>(null)\n\n const { trackClose, markSubmitted, resetTracking } = useModalTracking({\n isOpen,\n actionPrefix: \"storage.swift.containers.empty\",\n })\n\n const formSchema = z.object({\n confirm: z\n .string()\n .transform((val) => val.trim())\n .refine((value) => value === CONFIRM_WORD, {\n message: t`Type \"${CONFIRM_WORD}\" to confirm`,\n }),\n })\n\n const form = useForm({\n defaultValues: {\n confirm: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async () => {\n if (emptyContainerMutation.isPending || progress !== null) return\n\n markSubmitted()\n let emptiedCount = 0\n let totalDeleted = 0\n const errors: string[] = []\n const total = containers.length\n\n for (let i = 0; i < containers.length; i++) {\n setProgress({ current: i + 1, total })\n const container = containers[i]\n\n try {\n const deleted = await emptyContainerMutation.mutateAsync({ project_id: projectId, container: container.name })\n totalDeleted += deleted\n emptiedCount++\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n errors.push(`${container.name}: ${message}`)\n }\n }\n\n if (emptiedCount > 0) {\n await utils.storage.swift.listContainers.invalidate()\n }\n\n onComplete?.({ emptiedCount, totalDeleted, errors })\n\n handleClose()\n },\n })\n\n const canEmpty = useStore(form.store, (state) => state.isSubmitting || state.values.confirm.trim() !== CONFIRM_WORD)\n\n const utils = trpcReact.useUtils()\n\n const emptyContainerMutation = trpcReact.storage.swift.emptyContainer.useMutation()\n\n const handleClose = () => {\n trackClose()\n emptyContainerMutation.reset()\n setProgress(null)\n form.reset()\n resetTracking()\n onClose()\n }\n\n if (!isOpen || containers.length === 0) return null\n\n const totalCount = containers.length\n const visibleContainers = containers.slice(0, MAX_VISIBLE)\n const hiddenCount = totalCount - visibleContainers.length\n const isPending = emptyContainerMutation.isPending || progress !== null\n const progressCurrent = progress?.current\n const progressTotal = progress?.total\n\n return (\n <Modal\n title={<Plural value={totalCount} one=\"Empty Container\" other=\"Empty # Containers\" />}\n open={isOpen}\n onCancel={() => {\n trackClose()\n handleClose()\n }}\n confirmButtonLabel={isPending ? t`Emptying...` : t`Empty`}\n confirmButtonVariant=\"primary-danger\"\n cancelButtonLabel={t`Cancel`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || canEmpty}\n disableCancelButton={isPending}\n disableCloseButton={isPending}\n size=\"small\"\n >\n {isPending ? (\n <Status\n status=\"progress\"\n title={\n progress ? t`Emptying Container ${progressCurrent} of ${progressTotal}, Please Wait...` : t`Emptying...`\n }\n className=\"mt-0\"\n />\n ) : (\n <div>\n <p>\n <Trans>All objects in the selected containers will be permanently deleted. This cannot be undone.</Trans>\n </p>\n <p>\n <Trans>\n For <strong>dynamic</strong> and <strong>static large objects</strong> only the manifests are deleted —\n the related segments are not deleted.\n </Trans>\n </p>\n <div className=\"my-6\">\n <p className=\"text-sm font-semibold\">\n <Trans>Containers to be emptied:</Trans>\n </p>\n <div className=\"bg-theme-background-lvl-2 mt-2 max-h-48 overflow-y-auto rounded p-3\">\n <Stack direction=\"vertical\" gap=\"1\">\n {visibleContainers.map((container) => {\n const count = container.count\n return (\n <div key={container.name} className=\"text-theme-default overflow-x-hidden text-sm wrap-anywhere\">\n {container.name}\n {count != null && (\n <span className=\"text-theme-light ml-2\">\n ({i18n._(plural(count, { one: \"# object\", other: \"# objects\" }))})\n </span>\n )}\n </div>\n )\n })}\n {hiddenCount > 0 && (\n <div className=\"text-theme-light pt-2 text-sm\">\n <Trans>… and {hiddenCount} more</Trans>\n </div>\n )}\n </Stack>\n </div>\n </div>\n\n <Form\n className=\"mb-0\"\n id=\"empty-containers-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <form.Field\n name=\"confirm\"\n children={(field) => (\n <TextInput\n label={t`Type \"empty\" to confirm`}\n placeholder={CONFIRM_WORD}\n id={field.name}\n name={field.name}\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n disabled={isPending}\n autoFocus\n required\n />\n )}\n />\n </FormSection>\n </Form>\n </div>\n )}\n </Modal>\n )\n}\n","import { useState, useEffect, useRef, startTransition } from \"react\"\nimport { Plural, Trans, useLingui } from \"@lingui/react/macro\"\nimport { plural } from \"@lingui/core/macro\"\nimport { SortInput } from \"@/client/components/ListToolbar/SortInput\"\nimport { SortSettings } from \"@/client/components/ListToolbar/types\"\nimport { ContainerSummary } from \"@/server/Storage/types/swift\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport {\n Button,\n Checkbox,\n DataGridToolbar,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n PopupMenuToggle,\n SearchInput,\n Status,\n Stack,\n toast,\n} from \"@cloudoperators/juno-ui-components\"\nimport { formatBytesBinary } from \"@/client/utils/formatBytes\"\nimport { parseSwiftDate } from \"@/client/utils/formatSwiftDate\"\nimport { ContainerTableView } from \"./ContainerTableView\"\nimport {\n getContainerCreatedToast,\n getContainerCreatedWithWarningToast,\n getContainerEmptiedToast,\n getContainerEmptyErrorToast,\n getContainerDeletedToast,\n getContainerDeleteErrorToast,\n getContainerUpdatedToast,\n getContainerUpdateErrorToast,\n getContainerAclUpdatedToast,\n getContainerAclUpdateErrorToast,\n getContainersEmptyCompleteToast,\n} from \"./ContainerToastNotifications\"\nimport { ContainerLimitsTooltip } from \"./ContainerLimitsTooltip\"\nimport { EmptyContainersModal } from \"./EmptyContainersModal\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Route } from \"../../../$provider/$storageType/\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\n\nexport const SwiftContainers = () => {\n const { t, i18n } = useLingui()\n const projectId = useProjectId()\n const navigate = useNavigate({ from: Route.fullPath })\n\n // Sort and search state are persisted in the URL so they survive navigation,\n // browser back/forward, and deep links.\n const { sortBy, sortDirection, search: searchParam = \"\" } = Route.useSearch()\n\n // Whether the list exposes any bulk action — drives the selection column in\n // ContainerTableView and the Zone 3 bulk-action controls. Hardcoded to true\n // for now; the only bulk action today is the destructive Empty.\n //\n // TODO(perms): wire this to the real Swift container permission source\n // (e.g. a usePermissions hook or a tRPC permissions query) instead of\n // hardcoding it.\n const hasAnyBulkAction = true\n\n const [createModalOpen, setCreateModalOpen] = useState(false)\n const [emptyAllModalOpen, setEmptyAllModalOpen] = useState(false)\n const [selectedContainers, setSelectedContainers] = useState<string[]>([])\n\n // Local mirror of the committed search term so typing stays responsive while\n // the URL commit is debounced (see Zone 2 SearchInput below).\n const [localSearchTerm, setLocalSearchTerm] = useState(searchParam)\n const debounceTimer = useRef<number | undefined>(undefined)\n useEffect(() => () => clearTimeout(debounceTimer.current), [])\n\n // Keep the input in sync when the committed search term changes from outside\n // the input — browser back/forward, deep links, or programmatic navigation —\n // so the field never drifts from the URL-backed filter state. When the change\n // originated from our own debounced commit, searchParam already equals\n // localSearchTerm, so this is a no-op and won't disturb the caret.\n useEffect(() => {\n setLocalSearchTerm(searchParam)\n }, [searchParam])\n\n const handleCreateSuccess = (containerName: string) => {\n const { message, ...options } = getContainerCreatedToast(containerName)\n toast.success(message, options)\n }\n\n const handleCreatePartialSuccess = (containerName: string, reason: string) => {\n const { message, ...options } = getContainerCreatedWithWarningToast(containerName, reason)\n toast.warning(message, options)\n }\n\n const handleEmptySuccess = (containerName: string, deletedCount: number) => {\n const { message, ...options } = getContainerEmptiedToast(containerName, deletedCount)\n toast.success(message, options)\n }\n\n const handleEmptyError = (containerName: string, errorMessage: string) => {\n const { message, ...options } = getContainerEmptyErrorToast(containerName, errorMessage)\n toast.error(message, options)\n }\n\n const handleDeleteSuccess = (containerName: string) => {\n const { message, ...options } = getContainerDeletedToast(containerName)\n toast.success(message, options)\n }\n\n const handleDeleteError = (containerName: string, errorMessage: string) => {\n const { message, ...options } = getContainerDeleteErrorToast(containerName, errorMessage)\n toast.error(message, options)\n }\n\n const handlePropertiesSuccess = (containerName: string) => {\n const { message, ...options } = getContainerUpdatedToast(containerName)\n toast.success(message, options)\n }\n\n const handlePropertiesError = (containerName: string, errorMessage: string) => {\n const { message, ...options } = getContainerUpdateErrorToast(containerName, errorMessage)\n toast.error(message, options)\n }\n\n const handleAclSuccess = (containerName: string) => {\n const { message, ...options } = getContainerAclUpdatedToast(containerName)\n toast.success(message, options)\n }\n\n const handleAclError = (containerName: string, errorMessage: string) => {\n const { message, ...options } = getContainerAclUpdateErrorToast(containerName, errorMessage)\n toast.error(message, options)\n }\n\n const handleEmptyAllComplete = ({\n emptiedCount,\n totalDeleted,\n errors,\n }: {\n emptiedCount: number\n totalDeleted: number\n errors: string[]\n }) => {\n if (errors.length === 0) {\n setSelectedContainers([])\n } else {\n // Extract the container name from each error string formatted as \"<containerName>: <message>\".\n // Using exact name extraction avoids the false-positive substring match that\n // errorMessage.includes(containerName) would produce (e.g. \"foo\" matched inside \"foobar\" error).\n const failedContainerNames = new Set(errors.map((e) => e.split(\": \")[0]))\n setSelectedContainers((prev) => prev.filter((name) => failedContainerNames.has(name)))\n }\n\n const { message, severity, ...options } = getContainersEmptyCompleteToast(emptiedCount, totalDeleted, errors)\n toast[severity](message, options)\n }\n\n const sortSettings: SortSettings = {\n options: [\n { label: t`Container Name`, value: \"name\" },\n { label: t`Object Count`, value: \"count\" },\n { label: t`Total Size`, value: \"bytes\" },\n { label: t`Last Modified`, value: \"last_modified\" },\n ],\n sortBy: sortBy ?? \"name\",\n sortDirection: sortDirection ?? \"asc\",\n }\n\n // Fetch containers from tRPC\n const {\n data: containers,\n isLoading,\n error,\n } = trpcReact.storage.swift.listContainers.useQuery({\n project_id: projectId,\n format: \"json\",\n })\n\n // Fetch account metadata for quota information\n const { data: accountInfo } = trpcReact.storage.swift.getAccountMetadata.useQuery({\n project_id: projectId,\n })\n\n // Fetch Swift service info\n const { data: serviceInfo } = trpcReact.storage.swift.getServiceInfo.useQuery()\n\n // Sort containers based on sort settings\n const sortContainers = (containers: ContainerSummary[]): ContainerSummary[] => {\n return [...containers].sort((a, b) => {\n let comparison: number\n\n switch (sortBy ?? \"name\") {\n case \"name\":\n comparison = a.name.localeCompare(b.name)\n break\n case \"count\":\n comparison = a.count - b.count\n break\n case \"bytes\":\n comparison = a.bytes - b.bytes\n break\n case \"last_modified\": {\n // Both missing → equal (keeps the comparator transitive); exactly one\n // missing → push it to the end.\n if (!a.last_modified && !b.last_modified) return 0\n if (!a.last_modified || !b.last_modified) {\n return a.last_modified ? -1 : 1\n }\n // #1236: Swift listing timestamps are UTC without a \"Z\" — parse them as\n // UTC so the ordering is correct (matters near DST boundaries). If a\n // (non-empty) value can't be parsed, treat the pair as equal so the\n // order is left untouched (matches the old NaN behaviour).\n const at = parseSwiftDate(a.last_modified)?.getTime()\n const bt = parseSwiftDate(b.last_modified)?.getTime()\n comparison = at == null || bt == null ? 0 : at - bt\n break\n }\n default:\n comparison = a.name.localeCompare(b.name)\n }\n\n return (sortDirection ?? \"asc\") === \"desc\" ? -comparison : comparison\n })\n }\n\n // Filter containers based on search term\n const filteredContainers = (containers || []).filter((container) =>\n container.name.toLowerCase().includes(searchParam.toLowerCase())\n )\n\n // Apply sorting to filtered containers\n const sortedContainers = sortContainers(filteredContainers)\n\n const handleSearchChange = (term: string | number | string[] | undefined) => {\n const value = typeof term === \"string\" ? term : \"\"\n startTransition(() => {\n navigate({\n search: (prev) => ({ ...prev, search: value || undefined }),\n })\n })\n }\n\n const handleSortChange = (newSortSettings: SortSettings) => {\n const resolvedSortBy = (newSortSettings.sortBy?.toString() || \"name\") as\n \"name\" | \"count\" | \"bytes\" | \"last_modified\"\n const resolvedDirection = (newSortSettings.sortDirection || \"asc\") as \"asc\" | \"desc\"\n startTransition(() => {\n navigate({\n search: (prev) => ({\n ...prev,\n sortBy: resolvedSortBy,\n sortDirection: resolvedDirection,\n }),\n })\n })\n }\n\n // Handle loading state\n if (isLoading) {\n return <Status status=\"progress\" title={t`Loading Containers...`} />\n }\n\n // Handle error state\n if (error) {\n return <Status status=\"error\" title={t`Error Loading Containers`} body={error.message} />\n }\n\n // Calculate quota information\n const bytesUsed = accountInfo?.bytesUsed || 0\n const quotaBytes = accountInfo?.quotaBytes || 0\n const remainingBytes = quotaBytes > 0 ? quotaBytes - bytesUsed : 0\n\n // Resolve selected ContainerSummary objects from the full unfiltered list so\n // the modal always operates on what was actually selected — not the filtered\n // subset currently visible in the table.\n const selectedContainerSummaries = (containers || []).filter((c) => selectedContainers.includes(c.name))\n const hasSelection = selectedContainerSummaries.length > 0\n const selectedCount = selectedContainerSummaries.length\n\n const totalCount = (containers || []).length\n const filteredCount = filteredContainers.length\n const isFiltered = filteredCount !== totalCount\n\n // Select-all operates on the currently displayed (filtered + sorted) rows.\n const displayedNames = sortedContainers.map((c) => c.name)\n const allSelected = displayedNames.length > 0 && displayedNames.every((n) => selectedContainers.includes(n))\n const someSelected = displayedNames.some((n) => selectedContainers.includes(n))\n\n const handleToggleSelectAll = () => {\n if (allSelected) {\n setSelectedContainers((prev) => prev.filter((n) => !displayedNames.includes(n)))\n } else {\n setSelectedContainers((prev) => [...new Set([...prev, ...displayedNames])])\n }\n }\n\n return (\n <div className=\"relative\">\n <Stack direction=\"vertical\">\n {/* Zone 1 — sort controls and the create action (plain Stack, no background) */}\n <Stack distribution=\"end\" alignment=\"center\" gap=\"2\" className=\"pb-2\">\n <Stack gap=\"0.5\" alignment=\"center\">\n <SortInput\n options={sortSettings.options}\n sortBy={sortSettings.sortBy}\n sortDirection={sortSettings.sortDirection ?? \"asc\"}\n selectClassName=\"min-w-40\"\n onSortByChange={(v) =>\n handleSortChange({ ...sortSettings, sortBy: v, sortDirection: sortSettings.sortDirection })\n }\n onSortDirectionChange={(dir) => handleSortChange({ ...sortSettings, sortDirection: dir })}\n />\n </Stack>\n <Button variant=\"primary\" className=\"whitespace-nowrap\" onClick={() => setCreateModalOpen(true)}>\n <Trans>Create Container</Trans>\n </Button>\n </Stack>\n\n {/* Zone 2 — search (+ filter pills). DataGridToolbar provides the background.\n Swift containers expose no filterable dimensions yet, so there is no\n FiltersInput / SelectedFilters here. When filter dimensions are added,\n add FiltersInput alongside the search (switch the inner Stack to\n distribution=\"between\") and render SelectedFilters below, using\n applyFilterSelection from urlHelpers for merge logic. */}\n <DataGridToolbar>\n <Stack direction=\"vertical\" gap=\"2\">\n <Stack distribution=\"end\" alignment=\"center\">\n <SearchInput\n placeholder={t`Search containers...`}\n data-testid=\"searchbar\"\n value={localSearchTerm}\n onInput={(e: React.FormEvent<HTMLInputElement>) => {\n const v = e.currentTarget.value\n setLocalSearchTerm(v)\n clearTimeout(debounceTimer.current)\n debounceTimer.current = window.setTimeout(() => handleSearchChange(v), 500)\n }}\n onSearch={(v) => {\n clearTimeout(debounceTimer.current)\n handleSearchChange(typeof v === \"string\" ? v : \"\")\n }}\n onClear={() => {\n clearTimeout(debounceTimer.current)\n setLocalSearchTerm(\"\")\n handleSearchChange(\"\")\n }}\n />\n </Stack>\n </Stack>\n </DataGridToolbar>\n\n {/* Zone 3 — bulk actions (gated) plus the container/quota info.\n Unlike the Images reference (where Zone 3 carries only bulk actions and is\n omitted entirely without permissions), this bar also hosts the Swift-specific\n count + remaining-quota + limits info, which must always be visible. So the\n bar always renders; only the bulk controls are gated. Bulk controls\n sit on the left; the count + quota are pushed right via ml-auto so they\n stay right-aligned regardless of whether the bulk block renders. */}\n <DataGridToolbar>\n <Stack distribution=\"start\" gap=\"2\" alignment=\"center\" className=\"text-sm\">\n {hasAnyBulkAction ? (\n <Stack gap=\"2\" alignment=\"center\">\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected && !allSelected}\n onChange={handleToggleSelectAll}\n />\n <PopupMenu className=\"flex items-center\">\n <PopupMenuToggle as=\"div\">\n <Button disabled={!hasSelection} size=\"small\" icon=\"moreVert\" label={t`Actions`} />\n </PopupMenuToggle>\n {hasSelection && (\n <PopupMenuOptions>\n <PopupMenuItem\n disabled={!hasSelection}\n label={i18n._(\n plural(selectedCount, {\n one: \"Empty Container\",\n other: \"Empty # Containers\",\n })\n )}\n onClick={() => setEmptyAllModalOpen(true)}\n />\n </PopupMenuOptions>\n )}\n </PopupMenu>\n </Stack>\n ) : (\n <span />\n )}\n\n <div className=\"text-theme-light ml-auto flex items-center gap-1\" data-testid=\"containers-info-block\">\n {isFiltered ? (\n <Plural\n value={filteredCount}\n one={`${filteredCount} of ${totalCount} container`}\n other={`${filteredCount} of ${totalCount} containers`}\n />\n ) : (\n <Plural value={totalCount} one={`${totalCount} container`} other={`${totalCount} containers`} />\n )}\n {quotaBytes > 0 && (\n <>\n <span>,</span>\n <span>\n <Trans>Remaining Quota:</Trans>{\" \"}\n <span className=\"text-theme-default font-semibold\">{formatBytesBinary(remainingBytes)}</span>\n </span>\n </>\n )}\n <ContainerLimitsTooltip serviceInfo={serviceInfo} accountInfo={accountInfo} />\n </div>\n </Stack>\n </DataGridToolbar>\n </Stack>\n\n <ContainerTableView\n containers={sortedContainers}\n createModalOpen={createModalOpen}\n setCreateModalOpen={setCreateModalOpen}\n maxContainerNameLength={serviceInfo?.swift?.max_container_name_length}\n existingContainers={containers}\n onCreateSuccess={handleCreateSuccess}\n onCreatePartialSuccess={handleCreatePartialSuccess}\n onEmptySuccess={handleEmptySuccess}\n onEmptyError={handleEmptyError}\n onDeleteSuccess={handleDeleteSuccess}\n onDeleteError={handleDeleteError}\n onPropertiesSuccess={handlePropertiesSuccess}\n onPropertiesError={handlePropertiesError}\n onAclSuccess={handleAclSuccess}\n onAclError={handleAclError}\n selectedContainers={selectedContainers}\n setSelectedContainers={setSelectedContainers}\n hasAnyBulkAction={hasAnyBulkAction}\n />\n\n <EmptyContainersModal\n isOpen={emptyAllModalOpen}\n containers={selectedContainerSummaries}\n onClose={() => setEmptyAllModalOpen(false)}\n onComplete={handleEmptyAllComplete}\n />\n </div>\n )\n}\n","import { createFileRoute, useParams, type NotFoundRouteComponent } from \"@tanstack/react-router\"\nimport { z } from \"zod\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { SwiftContainers } from \"../../-components/Swift/Containers\"\nimport { CephBuckets } from \"../../-components/Ceph/Buckets\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { guardStorageRoute } from \"../../-components/utils/serviceAvailability\"\nimport { StorageNotFound } from \"../../-components/StorageNotFound\"\nimport { STORAGE_PROVIDER, isStorageProvider } from \"@/client/utils/storageProviders\"\n\n// Search params schema\n// - sortBy: active sort column — persisted for deep links and back navigation\n// - sortDirection: \"asc\" | \"desc\" — persisted alongside sortBy\n// - search: active filter string — persisted so deep links preserve the current search\nconst containersSearchSchema = z.object({\n sortBy: z.enum([\"name\", \"count\", \"bytes\", \"last_modified\"]).optional(),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional(),\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/storage/$provider/$storageType/\")({\n staticData: {\n section: \"storage\",\n service: \"containers\",\n analytics: {\n name: \"storage.objectstore.list\",\n },\n } satisfies RouteInfo,\n validateSearch: containersSearchSchema,\n head: ({ match }) => ({\n meta: [\n {\n title: isStorageProvider(match.params.provider)\n ? match.params.provider === STORAGE_PROVIDER.SWIFT\n ? \"Object Storage (Swift)\"\n : \"Object Storage (Ceph)\"\n : \"Object Storage\",\n },\n ],\n }),\n component: () => {\n return <StorageDashboard />\n },\n notFoundComponent: StorageNotFound as NotFoundRouteComponent,\n loader: async ({ context, params }) => {\n const { trpcClient } = context\n if (!trpcClient) {\n throw new Error(\"trpcClient is not available in route context\")\n }\n const availableServices = (await trpcClient.auth.getAvailableServices.query()) ?? []\n guardStorageRoute(availableServices, params)\n },\n})\n\nfunction StorageDashboard() {\n const { project, provider } = useParams({\n from: \"/_auth/projects/$projectId/storage/$provider/$storageType/\",\n select: (params) => {\n return { project: params.projectId, provider: params.provider, storageType: params.storageType }\n },\n })\n\n const { t } = useLingui()\n\n let pageTitle: string\n switch (provider) {\n case STORAGE_PROVIDER.SWIFT:\n pageTitle = t`Object Storage (Swift)`\n break\n case STORAGE_PROVIDER.CEPH:\n pageTitle = t`Object Storage (Ceph)`\n break\n default:\n pageTitle = t`Storage Overview`\n }\n\n return (\n <div>\n <ContentHeader title={pageTitle} projectId={project} />\n {project ? (\n <ErrorBoundary\n resetKeys={[project, provider]}\n fallback={\n <div className=\"p-4 text-center\">\n <Trans>Error loading component</Trans>\n </div>\n }\n >\n {(() => {\n switch (provider) {\n case STORAGE_PROVIDER.SWIFT:\n return <SwiftContainers />\n case STORAGE_PROVIDER.CEPH:\n return <CephBuckets />\n default:\n return <div>Storage Overview Page</div> // replace when available\n }\n })()}\n </ErrorBoundary>\n ) : (\n <div className=\"p-4 text-center\">\n <Trans>No project selected</Trans>\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import { t as e } from "./StorageNotFound-B-zVinVD.mjs";
2
- //#region src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/index.tsx?tsr-split=notFoundComponent
3
- var t = e;
4
- //#endregion
5
- export { t as notFoundComponent };
6
-
7
- //# sourceMappingURL=_storageType-u51_7OwJ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_storageType-u51_7OwJ.mjs","names":["StorageNotFound","SplitNotFoundComponent","notFoundComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/index.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { createFileRoute, useParams, type NotFoundRouteComponent } from \"@tanstack/react-router\"\nimport { z } from \"zod\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { SwiftContainers } from \"../../-components/Swift/Containers\"\nimport { CephBuckets } from \"../../-components/Ceph/Buckets\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { guardStorageRoute } from \"../../-components/utils/serviceAvailability\"\nimport { StorageNotFound } from \"../../-components/StorageNotFound\"\nimport { STORAGE_PROVIDER, isStorageProvider } from \"@/client/utils/storageProviders\"\n\n// Search params schema\n// - sortBy: active sort column — persisted for deep links and back navigation\n// - sortDirection: \"asc\" | \"desc\" — persisted alongside sortBy\n// - search: active filter string — persisted so deep links preserve the current search\nconst containersSearchSchema = z.object({\n sortBy: z.enum([\"name\", \"count\", \"bytes\", \"last_modified\"]).optional(),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional(),\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/storage/$provider/$storageType/\")({\n staticData: {\n section: \"storage\",\n service: \"containers\",\n analytics: {\n name: \"storage.objectstore.list\",\n },\n } satisfies RouteInfo,\n validateSearch: containersSearchSchema,\n head: ({ match }) => ({\n meta: [\n {\n title: isStorageProvider(match.params.provider)\n ? match.params.provider === STORAGE_PROVIDER.SWIFT\n ? \"Object Storage (Swift)\"\n : \"Object Storage (Ceph)\"\n : \"Object Storage\",\n },\n ],\n }),\n component: () => {\n return <StorageDashboard />\n },\n notFoundComponent: StorageNotFound as NotFoundRouteComponent,\n loader: async ({ context, params }) => {\n const { trpcClient } = context\n if (!trpcClient) {\n throw new Error(\"trpcClient is not available in route context\")\n }\n const availableServices = (await trpcClient.auth.getAvailableServices.query()) ?? []\n guardStorageRoute(availableServices, params)\n },\n})\n\nfunction StorageDashboard() {\n const { project, provider } = useParams({\n from: \"/_auth/projects/$projectId/storage/$provider/$storageType/\",\n select: (params) => {\n return { project: params.projectId, provider: params.provider, storageType: params.storageType }\n },\n })\n\n const { t } = useLingui()\n\n let pageTitle: string\n switch (provider) {\n case STORAGE_PROVIDER.SWIFT:\n pageTitle = t`Object Storage (Swift)`\n break\n case STORAGE_PROVIDER.CEPH:\n pageTitle = t`Object Storage (Ceph)`\n break\n default:\n pageTitle = t`Storage Overview`\n }\n\n return (\n <div>\n <ContentHeader title={pageTitle} projectId={project} />\n {project ? (\n <ErrorBoundary\n resetKeys={[project, provider]}\n fallback={\n <div className=\"p-4 text-center\">\n <Trans>Error loading component</Trans>\n </div>\n }\n >\n {(() => {\n switch (provider) {\n case STORAGE_PROVIDER.SWIFT:\n return <SwiftContainers />\n case STORAGE_PROVIDER.CEPH:\n return <CephBuckets />\n default:\n return <div>Storage Overview Page</div> // replace when available\n }\n })()}\n </ErrorBoundary>\n ) : (\n <div className=\"p-4 text-center\">\n <Trans>No project selected</Trans>\n </div>\n )}\n </div>\n )\n}\n"],"mappings":";;AAeA,IAAAC,IA8BqBD"}
@@ -1,92 +0,0 @@
1
- import { A as e, at as t } from "./build-WuxXRAqf.mjs";
2
- import { jsx as n, jsxs as r } from "react/jsx-runtime";
3
- import { Trans as i } from "@lingui/react";
4
- //#region src/client/routes/about.tsx?tsr-split=component
5
- function a() {
6
- return /*#__PURE__*/ n(e, {
7
- className: "flex flex-col items-center justify-center px-6 py-12 sm:px-12 md:px-20",
8
- children: /*#__PURE__*/ r("div", {
9
- className: "mx-auto w-full lg:w-2/3",
10
- children: [
11
- /*#__PURE__*/ n(t, {
12
- className: "mb-6 text-center",
13
- children: /*#__PURE__*/ n(i, { id: "t95VRV" })
14
- }),
15
- /*#__PURE__*/ n("p", {
16
- className: "mb-8 text-center",
17
- children: /*#__PURE__*/ n(i, {
18
- id: "sSNyf3",
19
- components: { 0: /*#__PURE__*/ n("strong", {}) }
20
- })
21
- }),
22
- /*#__PURE__*/ n(t, {
23
- className: "mb-4 text-center",
24
- children: /*#__PURE__*/ n(i, { id: "4pOfUd" })
25
- }),
26
- /*#__PURE__*/ n("p", {
27
- className: "mb-8 text-center",
28
- children: /*#__PURE__*/ n(i, { id: "HAkrpK" })
29
- }),
30
- /*#__PURE__*/ n(t, {
31
- className: "mb-4 text-center",
32
- children: /*#__PURE__*/ n(i, { id: "wzqqS+" })
33
- }),
34
- /*#__PURE__*/ r("ul", {
35
- className: "mb-8 list-disc space-y-4 pl-6",
36
- children: [
37
- /*#__PURE__*/ n("li", { children: /*#__PURE__*/ n("p", { children: /*#__PURE__*/ n(i, {
38
- id: "3oChIh",
39
- components: { 0: /*#__PURE__*/ n("strong", {}) }
40
- }) }) }),
41
- /*#__PURE__*/ n("li", { children: /*#__PURE__*/ n("p", { children: /*#__PURE__*/ n(i, {
42
- id: "INUP6f",
43
- components: { 0: /*#__PURE__*/ n("strong", {}) }
44
- }) }) }),
45
- /*#__PURE__*/ n("li", { children: /*#__PURE__*/ n("p", { children: /*#__PURE__*/ n(i, {
46
- id: "AlbUVn",
47
- components: { 0: /*#__PURE__*/ n("strong", {}) }
48
- }) }) }),
49
- /*#__PURE__*/ n("li", { children: /*#__PURE__*/ n("p", { children: /*#__PURE__*/ n(i, {
50
- id: "2ysnjX",
51
- components: { 0: /*#__PURE__*/ n("strong", {}) }
52
- }) }) })
53
- ]
54
- }),
55
- /*#__PURE__*/ n(t, {
56
- className: "mb-4 text-center",
57
- children: /*#__PURE__*/ n(i, { id: "D7qT9F" })
58
- }),
59
- /*#__PURE__*/ n("p", {
60
- className: "mb-8 text-center",
61
- children: /*#__PURE__*/ n(i, { id: "v9Dn8m" })
62
- }),
63
- /*#__PURE__*/ r("ul", {
64
- className: "mb-8 list-disc space-y-4 pl-6",
65
- children: [/*#__PURE__*/ n("li", { children: /*#__PURE__*/ n("p", { children: /*#__PURE__*/ n(i, {
66
- id: "/QIkBY",
67
- components: { 0: /*#__PURE__*/ n("strong", {}) }
68
- }) }) }), /*#__PURE__*/ n("li", { children: /*#__PURE__*/ n("p", { children: /*#__PURE__*/ n(i, {
69
- id: "1VDqZj",
70
- components: { 0: /*#__PURE__*/ n("strong", {}) }
71
- }) }) })]
72
- }),
73
- /*#__PURE__*/ n(t, {
74
- className: "mb-4 text-center",
75
- children: /*#__PURE__*/ n(i, { id: "JB0bhm" })
76
- }),
77
- /*#__PURE__*/ n("p", {
78
- className: "mb-6 text-center",
79
- children: /*#__PURE__*/ n(i, { id: "OxaeYj" })
80
- }),
81
- /*#__PURE__*/ n("p", {
82
- className: "text-center",
83
- children: /*#__PURE__*/ n(i, { id: "XLk16/" })
84
- })
85
- ]
86
- })
87
- });
88
- }
89
- //#endregion
90
- export { a as component };
91
-
92
- //# sourceMappingURL=about-BmQTyLWc.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"about-BmQTyLWc.mjs","names":["Trans","Container","ContentHeading","About","component"],"sources":["../../src/client/routes/about.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { Container, ContentHeading } from \"@cloudoperators/juno-ui-components/index\"\n\nexport const Route = createFileRoute(\"/about\")({\n component: About,\n})\n\nfunction About() {\n return (\n <Container className=\"flex flex-col items-center justify-center px-6 py-12 sm:px-12 md:px-20\">\n <div className=\"mx-auto w-full lg:w-2/3\">\n <ContentHeading className=\"mb-6 text-center\">\n <Trans>About Aurora Dashboard</Trans>\n </ContentHeading>\n <p className=\"mb-8 text-center\">\n <Trans>\n Welcome to <strong>Aurora Dashboard</strong>, your next-generation cloud management solution. We are\n dedicated to simplifying how you interact with and manage your cloud infrastructure. Designed with\n efficiency, scalability, and usability at its core, Aurora empowers you to streamline operations and unlock\n the full potential of your cloud resources.\n </Trans>\n </p>\n <ContentHeading className=\"mb-4 text-center\">\n <Trans>Our Mission</Trans>\n </ContentHeading>\n <p className=\"mb-8 text-center\">\n <Trans>\n At Aurora, our mission is to provide a centralized platform that unifies cloud management. We aim to\n simplify the complexities of provisioning, configuring, and scaling resources across diverse cloud\n environments while enabling seamless growth for your business.\n </Trans>\n </p>\n <ContentHeading className=\"mb-4 text-center\">\n <Trans>Key Features</Trans>\n </ContentHeading>\n <ul className=\"mb-8 list-disc space-y-4 pl-6\">\n <li>\n <p>\n <Trans>\n <strong>Unified Cloud Management:</strong> Consolidates all your cloud assets into one intuitive\n interface.\n </Trans>\n </p>\n </li>\n <li>\n <p>\n <Trans>\n <strong>Effortless Resource Provisioning:</strong> Quickly provision, configure, and deploy resources\n like servers, networks, and volumes with just a few clicks.\n </Trans>\n </p>\n </li>\n <li>\n <p>\n <Trans>\n <strong>Optimized Scalability:</strong> Built for businesses of all sizes, Aurora grows with you,\n supporting simple environments and intricate multi-cloud setups alike.\n </Trans>\n </p>\n </li>\n <li>\n <p>\n <Trans>\n <strong>Enhanced Productivity:</strong> By reducing operational complexity, Aurora helps your team focus\n on what truly matters—innovating and driving business success.\n </Trans>\n </p>\n </li>\n </ul>\n <ContentHeading className=\"mb-4 text-center\">\n <Trans>Why Choose Aurora?</Trans>\n </ContentHeading>\n <p className=\"mb-8 text-center\">\n <Trans>\n Aurora Dashboard is more than just a tool—it's your partner in navigating the cloud. Whether you're a small\n startup or a global enterprise, Aurora provides the flexibility, power, and simplicity you need to achieve\n your goals.\n </Trans>\n </p>\n <ul className=\"mb-8 list-disc space-y-4 pl-6\">\n <li>\n <p>\n <Trans>\n <strong>Secure & Reliable:</strong> Your data and operations are safeguarded with enterprise-grade\n security and robust reliability.\n </Trans>\n </p>\n </li>\n <li>\n <p>\n <Trans>\n <strong>Future-Ready:</strong> Aurora is designed to evolve with the latest trends in cloud technology,\n ensuring your solution is always cutting-edge.\n </Trans>\n </p>\n </li>\n </ul>\n <ContentHeading className=\"mb-4 text-center\">\n <Trans>Get Involved</Trans>\n </ContentHeading>\n <p className=\"mb-6 text-center\">\n <Trans>\n We are building Aurora Dashboard to serve you better. Your feedback is invaluable in shaping a tool that\n meets the unique needs of businesses like yours. Stay connected and join us as we redefine cloud management.\n </Trans>\n </p>\n <p className=\"text-center\">\n <Trans>Together, we can unlock the true potential of your cloud infrastructure.</Trans>\n </p>\n </div>\n </Container>\n )\n}\n"],"mappings":";;;;AAQA,SAASG,IAAAA;CACP,OACE,gBAAC,GAAA;EAAU,WAAU;EACnB,UAAA,gBAAC,OAAA;GAAI,WAAU;;IACb,gBAAC,GAAA;KAAe,WAAU;KACxB,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAEF,gBAAC,KAAA;KAAE,WAAU;KACX,UAAA,gBAAA,GAAA;;MACc,YAAA,EAAA,GAAA,gBAAA,UAAA,CAAA,CAAA,EAAA;;;IAMhB,gBAAC,GAAA;KAAe,WAAU;KACxB,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAEF,gBAAC,KAAA;KAAE,WAAU;KACX,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAMF,gBAAC,GAAA;KAAe,WAAU;KACxB,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAEF,gBAAC,MAAA;KAAG,WAAU;;MACZ,gBAAC,MAAA,EACC,UAAA,gBAAC,KAAA,EACC,UAAA,gBAAA,GAAA;;OACG,YAAA,EAAA,GAAA,gBAAA,UAAA,CAAA,CAAA,EAAA;;MAKP,gBAAC,MAAA,EACC,UAAA,gBAAC,KAAA,EACC,UAAA,gBAAA,GAAA;;OACG,YAAA,EAAA,GAAA,gBAAA,UAAA,CAAA,CAAA,EAAA;;MAKP,gBAAC,MAAA,EACC,UAAA,gBAAC,KAAA,EACC,UAAA,gBAAA,GAAA;;OACG,YAAA,EAAA,GAAA,gBAAA,UAAA,CAAA,CAAA,EAAA;;MAKP,gBAAC,MAAA,EACC,UAAA,gBAAC,KAAA,EACC,UAAA,gBAAA,GAAA;;OACG,YAAA,EAAA,GAAA,gBAAA,UAAA,CAAA,CAAA,EAAA;;;;IAMT,gBAAC,GAAA;KAAe,WAAU;KACxB,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAEF,gBAAC,KAAA;KAAE,WAAU;KACX,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAMF,gBAAC,MAAA;KAAG,WAAU;KACZ,UAAA,CAAA,gBAAC,MAAA,EACC,UAAA,gBAAC,KAAA,EACC,UAAA,gBAAA,GAAA;;MACG,YAAA,EAAA,GAAA,gBAAA,UAAA,CAAA,CAAA,EAAA;KAKP,CAAA,EAAA,CAAA,EAAA,CAAA,GAAA,gBAAC,MAAA,EACC,UAAA,gBAAC,KAAA,EACC,UAAA,gBAAA,GAAA;;MACG,YAAA,EAAA,GAAA,gBAAA,UAAA,CAAA,CAAA,EAAA;;;IAMT,gBAAC,GAAA;KAAe,WAAU;KACxB,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAEF,gBAAC,KAAA;KAAE,WAAU;KACX,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAKF,gBAAC,KAAA;KAAE,WAAU;KACX,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;;;AAKV"}
@@ -1,3 +0,0 @@
1
- declare const SvgMock: () => null;
2
- export default SvgMock;
3
- export { SvgMock as ReactComponent };
@@ -1,19 +0,0 @@
1
- import { n as e } from "./AuthProvider-CVSAwW9f.mjs";
2
- import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
- import { Trans as r } from "@lingui/react";
4
- //#region src/client/routes/_auth/aurora.tsx?tsr-split=component
5
- function i() {
6
- let { user: i } = e();
7
- return /*#__PURE__*/ n("div", {
8
- className: "grid gap-2 p-2",
9
- children: [/*#__PURE__*/ n("p", { children: [
10
- /*#__PURE__*/ t(r, { id: "1zZ1IK" }),
11
- " ",
12
- i?.name
13
- ] }), /*#__PURE__*/ t("p", { children: /*#__PURE__*/ t(r, { id: "RSMPjT" }) })]
14
- });
15
- }
16
- //#endregion
17
- export { i as component };
18
-
19
- //# sourceMappingURL=aurora-CIml-f2f.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aurora-CIml-f2f.mjs","names":["useAuth","Trans","DashboardPage","user","name","component"],"sources":["../../src/client/routes/_auth/aurora.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\n\nimport { useAuth } from \"../../store/AuthProvider\"\nimport { Trans } from \"@lingui/react/macro\"\n\nexport const Route = createFileRoute(\"/_auth/aurora\")({\n component: DashboardPage,\n})\n\nfunction DashboardPage() {\n const { user } = useAuth()\n\n return (\n <div className=\"grid gap-2 p-2\">\n <p>\n <Trans>Hi</Trans> {user?.name}\n </p>\n <p>\n <Trans>You are currently on the dashboard route.</Trans>\n </p>\n </div>\n )\n}\n"],"mappings":";;;;AASA,SAASE,IAAAA;CACP,IAAM,EAAEC,YAASH,EAAAA;CAEjB,OACE,gBAAC,OAAA;EAAI,WAAU;EACb,UAAA,CAAA,gBAAC,KAAA,EAAA,UAAA;GACC,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;GAAiB;GAAEG,GAAMC;EAE3B,EAAA,CAAA,GAAA,gBAAC,KAAA,EACC,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA,EAAA,CAAA,CAAA;;AAIR"}