@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":"DeleteFlavorModal-C4nAi7gY.mjs","names":["React","useState","useEffect","useMemo","useErrorTranslation","Modal","Button","Status","Stack","DescriptionList","DescriptionTerm","DescriptionDefinition","TextInput","Message","toast","buildInitialSpecs","extraSpecs","Object","entries","map","key","value","isEditing","createExtraSpecsPromise","client","project","flavorId","compute","getExtraSpecs","query","project_id","EditSpecModalInner","flavor","isLoading","onClose","initialSpecs","useLingui","translateError","specs","setSpecs","errors","setErrors","isAddingNew","setIsAddingNew","newKey","setNewKey","newValue","setNewValue","operationInProgress","setOperationInProgress","validationMessage","setValidationMessage","isModalDisabled","some","e","validateKey","rowIndex","normalized","trim","t","isDuplicate","entry","idx","handleAddNew","keyError","length","createExtraSpecs","mutate","id","extra_specs","success","description","error","errorMsg","Error","message","handleCancelAdd","handleEdit","index","i","editingValue","handleSaveEdit","spec","trimmedValue","handleCancelEdit","handleDelete","deleteExtraSpec","filter","_","handleValueChange","prev","next","handleClose","open","onCancel","size","title","cancelButtonLabel","disableCancelButton","status","className","div","variant","text","direction","label","onClick","disabled","body","alignTerms","onChange","target","placeholder","invalid","autoFocus","gap","icon","aria-label","Fragment","span","data-testid","EditSpecModal","isOpen","extraSpecsData","setExtraSpecsData","isLoadingSpecs","setIsLoadingSpecs","loadError","setLoadError","cancelled","loadData","getFlavorCreatedToast","name","message","description","getFlavorDeletedToast","getFlavorAccessAddedToast","projectId","flavorName","getFlavorAccessRemovedToast","getFlavorAccessAddErrorToast","errorMessage","getFlavorAccessRemoveErrorToast","React","useState","useEffect","useMemo","useErrorTranslation","Modal","Message","DescriptionList","DescriptionTerm","DescriptionDefinition","Stack","Status","Button","TextInput","toast","getFlavorAccessAddedToast","getFlavorAccessRemovedToast","getFlavorAccessRemoveErrorToast","buildInitialAccess","flavorAccess","map","access","projectId","tenant_id","createPermissionsPromise","client","project","compute","canUser","query","project_id","permission","then","canAdd","canRemove","createFlavorAccessPromise","flavorId","getFlavorAccess","ManageAccessModalInner","flavor","isLoading","onClose","initialAccess","useLingui","translateError","setAccess","errors","setErrors","isAddingNew","setIsAddingNew","newProjectId","setNewProjectId","deletingProjectIds","setDeletingProjectIds","Set","addingProjectId","setAddingProjectId","isPublicFlavor","validateProjectId","normalized","trim","t","isDuplicate","some","entry","handleAddNew","error","trimmedProjectId","addTenantAccess","mutate","id","targetProjectId","prev","message","options","name","success","errorMessage","Error","handleCancelAdd","handleDelete","add","removeTenantAccess","filter","a","next","delete","handleClose","flavorName","open","onCancel","size","title","p","className","isAnyOperationInProgress","status","div","variant","text","direction","label","onClick","disabled","length","span","value","onChange","e","target","placeholder","invalid","autoFocus","wrapperClassName","icon","progress","isDeleting","has","Fragment","gap","alignment","data-testid","ManageAccessModal","isOpen","flavorAccessData","setFlavorAccessData","permissionsData","setPermissionsData","isLoadingData","setIsLoadingData","loadError","setLoadError","cancelled","loadData","accessData","permissions","Promise","all","deduped","idx","arr","findIndex","body","z","useForm","useStore","React","useState","Modal","Stack","Form","FormSection","TextInput","DescriptionList","DescriptionTerm","DescriptionDefinition","Message","useErrorTranslation","useModalTracking","DeleteFlavorModal","client","isOpen","onClose","project","flavor","onSuccess","useLingui","translateError","isLoading","setIsLoading","formError","setFormError","trackClose","markSubmitted","resetTracking","actionPrefix","formSchema","object","confirm","string","refine","value","message","t","form","defaultValues","validators","onSubmit","id","compute","deleteFlavor","mutate","project_id","flavorId","handleClose","error","errorMessage","canDelete","store","state","isSubmitting","values","reset","confirmLabel","flavorName","name","open","onCancel","title","size","confirmButtonLabel","confirmButtonVariant","onConfirm","handleSubmit","cancelButtonLabel","disableConfirmButton","disableCancelButton","disableCloseButton","direction","gap","variant","p","className","vcpus","ram","disk","swap","Number","e","preventDefault","Field","children","field","label","onChange","handleChange","target","placeholder","autoFocus","disabled","required"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/flavors/-components/EditSpecModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/flavors/-components/FlavorToastNotifications.tsx","../../src/client/routes/_auth/projects/$projectId/compute/flavors/-components/ManageAccessModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/flavors/-components/DeleteFlavorModal.tsx"],"sourcesContent":["import React, { useState, useEffect, useMemo } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\nimport {\n Modal,\n Button,\n Status,\n Stack,\n DescriptionList,\n DescriptionTerm,\n DescriptionDefinition,\n TextInput,\n Message,\n toast,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Flavor } from \"@/server/Compute/types/flavor\"\n\ninterface EditSpecModalProps {\n client: TrpcClient\n isOpen: boolean\n onClose: () => void\n project: string\n flavor: Flavor | null\n}\n\ninterface SpecEntry {\n key: string\n value: string\n isEditing?: boolean\n editingValue?: string\n}\n\nfunction buildInitialSpecs(extraSpecs: Record<string, string>): SpecEntry[] {\n return Object.entries(extraSpecs).map(([key, value]) => ({\n key,\n value,\n isEditing: false,\n }))\n}\n\nconst createExtraSpecsPromise = (client: TrpcClient, project: string, flavorId: string) => {\n return client.compute.getExtraSpecs.query({\n project_id: project,\n flavorId: flavorId,\n })\n}\n\nfunction EditSpecModalInner({\n client,\n project,\n flavor,\n isLoading,\n onClose,\n initialSpecs,\n}: {\n client: TrpcClient\n project: string\n flavor: Flavor\n isLoading: boolean\n onClose: () => void\n initialSpecs: SpecEntry[]\n}) {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n\n const [specs, setSpecs] = useState<SpecEntry[]>(initialSpecs)\n const [errors, setErrors] = useState<{ [key: string]: string }>({})\n const [isAddingNew, setIsAddingNew] = useState(false)\n const [newKey, setNewKey] = useState(\"\")\n const [newValue, setNewValue] = useState(\"\")\n const [operationInProgress, setOperationInProgress] = useState(false)\n const [validationMessage, setValidationMessage] = useState<string | null>(null)\n\n const isModalDisabled = operationInProgress || isAddingNew || specs.some((e) => e.isEditing)\n\n const validateKey = (key: string, rowIndex?: number): string | null => {\n const normalized = key?.trim()\n if (!normalized) {\n return t`Key is required`\n }\n const isDuplicate = specs.some((entry, idx) => entry.key.trim() === normalized && idx !== rowIndex)\n if (isDuplicate) {\n return t`A property with this key already exists`\n }\n return null\n }\n\n const handleAddNew = async () => {\n const keyError = validateKey(newKey, specs.length)\n if (keyError) {\n setErrors({ newKey: \"error\" })\n setValidationMessage(keyError)\n return\n }\n if (!newValue.trim()) {\n setErrors({ newValue: \"error\" })\n setValidationMessage(t`Value is required`)\n return\n }\n\n setOperationInProgress(true)\n try {\n await client.compute.createExtraSpecs.mutate({\n project_id: project,\n flavorId: flavor.id,\n extra_specs: { [newKey.trim()]: newValue.trim() },\n })\n\n setSpecs([...specs, { key: newKey.trim(), value: newValue.trim(), isEditing: false }])\n setNewKey(\"\")\n setNewValue(\"\")\n setIsAddingNew(false)\n setErrors({})\n setValidationMessage(null)\n\n toast.success(t`Property Created`, {\n description: t`Property was successfully created.`,\n })\n } catch (error) {\n const errorMsg = translateError(error instanceof Error ? error.message : \"Failed to create property\")\n setValidationMessage(errorMsg)\n } finally {\n setOperationInProgress(false)\n }\n }\n\n const handleCancelAdd = () => {\n setNewKey(\"\")\n setNewValue(\"\")\n setIsAddingNew(false)\n setErrors({})\n setValidationMessage(null)\n }\n\n const handleEdit = (index: number) => {\n setSpecs(\n specs.map((e, i) => (i === index ? { ...e, isEditing: true, editingValue: e.value } : { ...e, isEditing: false }))\n )\n setIsAddingNew(false)\n }\n\n const handleSaveEdit = async (index: number) => {\n const spec = specs[index]\n\n if (!spec.value.trim()) {\n setErrors({ [`edit-value-${index}`]: \"error\" })\n setValidationMessage(t`Value is required`)\n return\n }\n\n setOperationInProgress(true)\n try {\n const trimmedValue = spec.value.trim()\n\n // Create/update the spec (OpenStack API handles upsert)\n await client.compute.createExtraSpecs.mutate({\n project_id: project,\n flavorId: flavor.id,\n extra_specs: { [spec.key]: trimmedValue },\n })\n\n setSpecs(specs.map((e, i) => (i === index ? { key: spec.key, value: trimmedValue, isEditing: false } : e)))\n setErrors({})\n setValidationMessage(null)\n\n toast.success(t`Property Updated`, {\n description: t`Property was successfully updated.`,\n })\n } catch (error) {\n const errorMsg = translateError(error instanceof Error ? error.message : \"Failed to update property\")\n setValidationMessage(errorMsg)\n } finally {\n setOperationInProgress(false)\n }\n }\n\n const handleCancelEdit = (index: number) => {\n setSpecs(\n specs.map((e, i) => (i === index ? { key: e.key, value: e.editingValue ?? e.value, isEditing: false } : e))\n )\n setErrors({})\n setValidationMessage(null)\n }\n\n const handleDelete = async (index: number) => {\n const spec = specs[index]\n setOperationInProgress(true)\n\n try {\n await client.compute.deleteExtraSpec.mutate({\n project_id: project,\n flavorId: flavor.id,\n key: spec.key,\n })\n\n setSpecs(specs.filter((_, i) => i !== index))\n setErrors({})\n setValidationMessage(null)\n\n toast.success(t`Property Deleted`, {\n description: t`Property was successfully deleted.`,\n })\n } catch (error) {\n const errorMsg = translateError(error instanceof Error ? error.message : \"Failed to delete property\")\n setValidationMessage(errorMsg)\n } finally {\n setOperationInProgress(false)\n }\n }\n\n const handleValueChange = (index: number, value: string) => {\n setSpecs(specs.map((entry, i) => (i === index ? { ...entry, value } : entry)))\n if (errors[`edit-value-${index}`]) {\n setErrors((prev) => {\n const next = { ...prev }\n delete next[`edit-value-${index}`]\n return next\n })\n setValidationMessage(null)\n }\n }\n\n const handleClose = () => {\n if (!operationInProgress) {\n setIsAddingNew(false)\n setNewKey(\"\")\n setNewValue(\"\")\n setErrors({})\n setValidationMessage(null)\n onClose()\n }\n }\n\n return (\n <Modal\n open\n onCancel={handleClose}\n size=\"xl\"\n title={t`Edit Metadata`}\n cancelButtonLabel={t`Close`}\n disableCancelButton={operationInProgress}\n >\n {isLoading ? (\n <Status status=\"progress\" title={t`Loading Metadata...`} className=\"mt-0\" />\n ) : (\n <div>\n {validationMessage && <Message variant=\"error\" text={validationMessage} className=\"mb-4\" />}\n\n <Stack direction=\"horizontal\" className=\"mb-4 justify-end\">\n <Button label={t`Add Property`} onClick={() => setIsAddingNew(true)} disabled={isModalDisabled} />\n </Stack>\n\n {specs.length === 0 && !isAddingNew ? (\n <Status\n status=\"empty\"\n title={t`No Metadata Properties Found`}\n body={t`Click \"Add Property\" to create one.`}\n className=\"m-0\"\n />\n ) : (\n <DescriptionList className=\"mb-6 grid-cols-2\" alignTerms=\"left\">\n <>\n {isAddingNew && (\n <>\n <DescriptionTerm className=\"col-span-1\">\n <TextInput\n value={newKey}\n onChange={(e) => {\n setNewKey(e.target.value)\n if (errors.newKey) {\n setErrors((prev) => {\n const next = { ...prev }\n delete next.newKey\n return next\n })\n setValidationMessage(null)\n }\n }}\n placeholder={t`property_key`}\n invalid={!!errors.newKey}\n autoFocus\n disabled={operationInProgress}\n />\n </DescriptionTerm>\n <DescriptionDefinition className=\"col-span-1 flex items-center gap-2\">\n <div className=\"flex-1\">\n <TextInput\n value={newValue}\n onChange={(e) => {\n setNewValue(e.target.value)\n if (errors.newValue) {\n setErrors((prev) => {\n const next = { ...prev }\n delete next.newValue\n return next\n })\n setValidationMessage(null)\n }\n }}\n placeholder={t`Value`}\n invalid={!!errors.newValue}\n disabled={operationInProgress}\n />\n </div>\n <Stack direction=\"horizontal\" gap=\"2\" className=\"shrink-0\">\n <Button\n size=\"small\"\n variant=\"primary\"\n onClick={handleAddNew}\n icon=\"check\"\n title={t`Save`}\n aria-label={t`Save`}\n disabled={operationInProgress}\n />\n <Button\n size=\"small\"\n variant=\"subdued\"\n onClick={handleCancelAdd}\n icon=\"close\"\n title={t`Discard`}\n aria-label={t`Discard`}\n disabled={operationInProgress}\n />\n </Stack>\n </DescriptionDefinition>\n </>\n )}\n </>\n\n <>\n {specs.map((entry, index) => (\n <React.Fragment key={index}>\n <DescriptionTerm className=\"col-span-1\">\n {entry.isEditing ? (\n <span className=\"jn:text-theme-high block break-all\" title={entry.key}>\n {entry.key}\n </span>\n ) : (\n <span className=\"jn:text-theme-high block break-all\" title={entry.key}>\n {entry.key}\n </span>\n )}\n </DescriptionTerm>\n <DescriptionDefinition className=\"col-span-1 flex items-center gap-2\">\n {entry.isEditing ? (\n <>\n <div className=\"flex-1\">\n <TextInput\n value={entry.value}\n onChange={(e) => handleValueChange(index, e.target.value)}\n invalid={!!errors[`edit-value-${index}`]}\n disabled={operationInProgress}\n />\n </div>\n <Stack direction=\"horizontal\" gap=\"2\" className=\"shrink-0\">\n <Button\n size=\"small\"\n variant=\"primary\"\n onClick={() => handleSaveEdit(index)}\n icon=\"check\"\n title={t`Save`}\n aria-label={t`Save`}\n disabled={operationInProgress}\n />\n <Button\n size=\"small\"\n variant=\"subdued\"\n onClick={() => handleCancelEdit(index)}\n icon=\"close\"\n title={t`Discard`}\n aria-label={t`Discard`}\n disabled={operationInProgress}\n />\n </Stack>\n </>\n ) : (\n <>\n <span className=\"jn:text-theme-default flex-1 break-all\" title={entry.value}>\n {entry.value}\n </span>\n <Stack direction=\"horizontal\" gap=\"2\" className=\"shrink-0\">\n <Button\n size=\"small\"\n variant=\"subdued\"\n onClick={() => handleEdit(index)}\n icon=\"edit\"\n data-testid={`edit-${entry.key}`}\n title={t`Edit`}\n disabled={isModalDisabled}\n />\n <Button\n size=\"small\"\n onClick={() => handleDelete(index)}\n icon=\"deleteForever\"\n data-testid={`delete-${entry.key}`}\n title={t`Delete`}\n aria-label={t`Delete`}\n disabled={isModalDisabled}\n />\n </Stack>\n </>\n )}\n </DescriptionDefinition>\n </React.Fragment>\n ))}\n </>\n </DescriptionList>\n )}\n </div>\n )}\n </Modal>\n )\n}\n\nexport const EditSpecModal: React.FC<EditSpecModalProps> = ({ client, isOpen, onClose, project, flavor }) => {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n\n const [extraSpecsData, setExtraSpecsData] = useState<Record<string, string> | null>(null)\n const [isLoadingSpecs, setIsLoadingSpecs] = useState(false)\n const [loadError, setLoadError] = useState<string | null>(null)\n\n useEffect(() => {\n if (!isOpen || !flavor?.id) {\n setExtraSpecsData(null)\n setLoadError(null)\n return\n }\n\n let cancelled = false\n setIsLoadingSpecs(true)\n setLoadError(null)\n\n const loadData = async () => {\n try {\n const specs = await createExtraSpecsPromise(client, project, flavor.id)\n if (cancelled) return\n setExtraSpecsData(specs)\n } catch (error) {\n if (cancelled) return\n setLoadError(error instanceof Error ? error.message : \"Failed to Load Metadata\")\n } finally {\n if (!cancelled) setIsLoadingSpecs(false)\n }\n }\n\n loadData()\n return () => {\n cancelled = true\n }\n }, [isOpen, flavor?.id, client, project])\n\n const initialSpecs = useMemo(() => (extraSpecsData ? buildInitialSpecs(extraSpecsData) : []), [extraSpecsData])\n\n if (!isOpen || !flavor) {\n return null\n }\n\n if (isLoadingSpecs) {\n return (\n <Modal open onCancel={onClose} size=\"xl\" title={t`Edit Metadata`}>\n <Status status=\"progress\" title={t`Loading Metadata...`} className=\"mt-0\" />\n </Modal>\n )\n }\n\n if (loadError) {\n return (\n <Modal open onCancel={onClose} size=\"xl\" title={t`Edit Metadata`}>\n <Status status=\"error\" title={t`Failed to Load Metadata`} body={translateError(loadError)} className=\"mt-0\" />\n </Modal>\n )\n }\n\n return (\n <EditSpecModalInner\n key={flavor.id}\n client={client}\n project={project}\n flavor={flavor}\n isLoading={false}\n onClose={onClose}\n initialSpecs={initialSpecs}\n />\n )\n}\n","import { ReactNode } from \"react\"\nimport { NotificationOptions } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\n\ntype ToastReturnType = { message: ReactNode } & NotificationOptions\n\nexport const getFlavorCreatedToast = (name: string): ToastReturnType => ({\n message: <Trans>Flavor Created</Trans>,\n description: <Trans>Flavor \"{name}\" was successfully created.</Trans>,\n})\n\nexport const getFlavorDeletedToast = (name: string): ToastReturnType => ({\n message: <Trans>Flavor Deleted</Trans>,\n description: <Trans>Flavor \"{name}\" was successfully deleted.</Trans>,\n})\n\nexport const getFlavorAccessAddedToast = (projectId: string, flavorName: string): ToastReturnType => ({\n message: <Trans>Access Added</Trans>,\n description: (\n <Trans>\n Project \"{projectId}\" now has access to flavor \"{flavorName}\".\n </Trans>\n ),\n})\n\nexport const getFlavorAccessRemovedToast = (projectId: string, flavorName: string): ToastReturnType => ({\n message: <Trans>Access Removed</Trans>,\n description: (\n <Trans>\n Access for project \"{projectId}\" to flavor \"{flavorName}\" was successfully revoked.\n </Trans>\n ),\n})\n\nexport const getFlavorAccessAddErrorToast = (projectId: string, errorMessage: string): ToastReturnType => ({\n message: <Trans>Failed to Add Access</Trans>,\n description: (\n <Trans>\n Could not add access for project \"{projectId}\": {errorMessage}\n </Trans>\n ),\n})\n\nexport const getFlavorAccessRemoveErrorToast = (projectId: string, errorMessage: string): ToastReturnType => ({\n message: <Trans>Failed to Remove Access</Trans>,\n description: (\n <Trans>\n Could not remove access for project \"{projectId}\": {errorMessage}\n </Trans>\n ),\n})\n","import React, { useState, useEffect, useMemo } from \"react\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\nimport {\n Modal,\n Message,\n DescriptionList,\n DescriptionTerm,\n DescriptionDefinition,\n Stack,\n Status,\n Button,\n TextInput,\n toast,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Flavor } from \"@/server/Compute/types/flavor\"\nimport {\n getFlavorAccessAddedToast,\n getFlavorAccessRemovedToast,\n getFlavorAccessRemoveErrorToast,\n} from \"./FlavorToastNotifications\"\n\ninterface ManageAccessProps {\n client: TrpcClient\n isOpen: boolean\n onClose: () => void\n project: string\n flavor: Flavor | null\n}\n\ninterface FlavorAccess {\n flavor_id: string\n tenant_id: string\n}\n\ninterface AccessEntry {\n projectId: string\n}\n\nfunction buildInitialAccess(flavorAccess: FlavorAccess[]): AccessEntry[] {\n return flavorAccess.map((access) => ({\n projectId: access.tenant_id,\n }))\n}\n\nconst createPermissionsPromise = (client: TrpcClient, project: string) => {\n return client.compute.canUser\n .query({\n project_id: project,\n permission: [\"flavors:add_project\", \"flavors:remove_project\"],\n })\n .then(([canAdd, canRemove]) => ({ canAdd, canRemove }))\n}\n\nconst createFlavorAccessPromise = (client: TrpcClient, project: string, flavorId: string) => {\n return client.compute.getFlavorAccess.query({\n project_id: project,\n flavorId: flavorId,\n })\n}\n\nfunction ManageAccessModalInner({\n client,\n project,\n flavor,\n isLoading,\n onClose,\n initialAccess,\n canAdd,\n canRemove,\n}: {\n client: TrpcClient\n project: string\n flavor: Flavor\n isLoading: boolean\n onClose: () => void\n initialAccess: AccessEntry[]\n canAdd: boolean\n canRemove: boolean\n}) {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n\n const [access, setAccess] = useState<AccessEntry[]>(initialAccess)\n const [errors, setErrors] = useState<{ [key: string]: string }>({})\n const [isAddingNew, setIsAddingNew] = useState(false)\n const [newProjectId, setNewProjectId] = useState(\"\")\n const [deletingProjectIds, setDeletingProjectIds] = useState<Set<string>>(new Set())\n const [addingProjectId, setAddingProjectId] = useState(false)\n\n const isPublicFlavor = flavor[\"os-flavor-access:is_public\"] !== false\n\n const validateProjectId = (projectId: string): string | null => {\n const normalized = projectId?.trim()\n if (!normalized) {\n return t`Project ID is required`\n }\n const isDuplicate = access.some((entry) => entry.projectId.trim() === normalized)\n if (isDuplicate) {\n return t`This project already has access`\n }\n return null\n }\n\n const handleAddNew = async () => {\n const error = validateProjectId(newProjectId)\n if (error) {\n setErrors({ newProjectId: error })\n return\n }\n\n const trimmedProjectId = newProjectId.trim()\n setAddingProjectId(true)\n setErrors({})\n\n try {\n await client.compute.addTenantAccess.mutate({\n project_id: project,\n flavorId: flavor.id,\n targetProjectId: trimmedProjectId,\n })\n\n setAccess((prev) => [...prev, { projectId: trimmedProjectId }])\n setNewProjectId(\"\")\n setIsAddingNew(false)\n\n const { message, ...options } = getFlavorAccessAddedToast(trimmedProjectId, flavor.name)\n toast.success(message, options)\n } catch (error) {\n const errorMessage = translateError(error instanceof Error ? error.message : \"Failed to add access\")\n setErrors({ newProjectId: errorMessage })\n // Error shown inline via Message component above the form\n } finally {\n setAddingProjectId(false)\n }\n }\n\n const handleCancelAdd = () => {\n setNewProjectId(\"\")\n setIsAddingNew(false)\n setErrors({})\n }\n\n const handleDelete = async (projectId: string) => {\n setErrors({})\n setDeletingProjectIds((prev) => new Set(prev).add(projectId))\n\n try {\n await client.compute.removeTenantAccess.mutate({\n project_id: project,\n flavorId: flavor.id,\n targetProjectId: projectId,\n })\n\n setAccess((prev) => prev.filter((a) => a.projectId !== projectId))\n\n const { message, ...options } = getFlavorAccessRemovedToast(projectId, flavor.name)\n toast.success(message, options)\n } catch (error) {\n const errorMessage = translateError(error instanceof Error ? error.message : \"Failed to remove access\")\n const { message, ...options } = getFlavorAccessRemoveErrorToast(projectId, errorMessage)\n toast.error(message, options)\n } finally {\n setDeletingProjectIds((prev) => {\n const next = new Set(prev)\n next.delete(projectId)\n return next\n })\n }\n }\n\n const handleClose = () => {\n setIsAddingNew(false)\n setNewProjectId(\"\")\n setErrors({})\n onClose()\n }\n\n if (isPublicFlavor) {\n const flavorName = flavor.name\n return (\n <Modal open onCancel={handleClose} size=\"large\" title={t`Manage Access - ${flavorName}`}>\n <p className=\"jn:text-theme-light py-8 text-center\">\n {t`This is a public flavor. All projects have access to it.`}\n </p>\n </Modal>\n )\n }\n\n const flavorName = flavor.name\n const isAnyOperationInProgress = addingProjectId || deletingProjectIds.size > 0\n\n return (\n <Modal open onCancel={handleClose} size=\"large\" title={t`Manage Access - ${flavorName}`}>\n {isLoading ? (\n <Status status=\"progress\" title={t`Loading Access...`} className=\"mt-0\" />\n ) : (\n <div>\n {errors.newProjectId && <Message variant=\"error\" text={errors.newProjectId} className=\"mb-4\" />}\n\n {canAdd && (\n <Stack direction=\"horizontal\" className=\"mb-4 justify-end\">\n <Button\n label={t`Add Project`}\n onClick={() => setIsAddingNew(true)}\n disabled={isAddingNew || isAnyOperationInProgress}\n />\n </Stack>\n )}\n\n {access.length === 0 && !isAddingNew ? (\n <p className=\"jn:text-theme-light py-8 text-center\">\n {canAdd\n ? t`No project access configured. Click \"Add Project\" to grant access.`\n : t`No project access configured.`}\n </p>\n ) : (\n <DescriptionList className=\"mb-6\">\n <>\n {isAddingNew && (\n <>\n <DescriptionTerm className=\"flex items-center justify-end\">\n <span className=\"jn:text-theme-high\">{t`Project`}</span>\n </DescriptionTerm>\n <DescriptionDefinition>\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"flex-1\">\n <TextInput\n value={newProjectId}\n onChange={(e) => {\n setNewProjectId(e.target.value)\n if (errors.newProjectId) {\n setErrors({})\n }\n }}\n placeholder={t`Enter project ID`}\n invalid={!!errors.newProjectId}\n autoFocus\n wrapperClassName=\"w-full\"\n disabled={addingProjectId}\n />\n </div>\n <div className=\"flex shrink-0 gap-2\">\n <Button\n size=\"small\"\n variant=\"primary\"\n onClick={handleAddNew}\n icon=\"check\"\n title={t`Add`}\n disabled={addingProjectId}\n progress={addingProjectId}\n />\n <Button\n size=\"small\"\n variant=\"subdued\"\n onClick={handleCancelAdd}\n icon=\"close\"\n title={t`Cancel`}\n disabled={addingProjectId}\n />\n </div>\n </div>\n </DescriptionDefinition>\n </>\n )}\n </>\n\n <>\n {access.map((entry) => {\n const isDeleting = deletingProjectIds.has(entry.projectId)\n return (\n <React.Fragment key={entry.projectId}>\n <DescriptionTerm>\n <span className=\"jn:text-theme-high\">{t`Project`}</span>\n </DescriptionTerm>\n <DescriptionDefinition>\n <Stack direction=\"horizontal\" gap=\"2\" alignment=\"center\" className=\"justify-between\">\n <span className=\"jn:text-theme-high block max-w-xs truncate\" title={entry.projectId}>\n {entry.projectId}\n </span>\n {canRemove && (\n <Button\n size=\"small\"\n onClick={() => handleDelete(entry.projectId)}\n icon=\"deleteForever\"\n data-testid={`delete-${entry.projectId}`}\n title={t`Remove`}\n disabled={isDeleting || isAddingNew}\n progress={isDeleting}\n />\n )}\n </Stack>\n </DescriptionDefinition>\n </React.Fragment>\n )\n })}\n </>\n </DescriptionList>\n )}\n </div>\n )}\n </Modal>\n )\n}\n\nexport const ManageAccessModal: React.FC<ManageAccessProps> = ({ client, isOpen, onClose, project, flavor }) => {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n\n const [flavorAccessData, setFlavorAccessData] = useState<FlavorAccess[] | null>(null)\n const [permissionsData, setPermissionsData] = useState<{ canAdd: boolean; canRemove: boolean } | null>(null)\n const [isLoadingData, setIsLoadingData] = useState(true)\n const [loadError, setLoadError] = useState<string | null>(null)\n\n useEffect(() => {\n if (!isOpen || !flavor?.id) {\n setFlavorAccessData(null)\n setPermissionsData(null)\n setLoadError(null)\n return\n }\n\n let cancelled = false\n setIsLoadingData(true)\n setLoadError(null)\n\n const loadData = async () => {\n try {\n const [accessData, permissions] = await Promise.all([\n createFlavorAccessPromise(client, project, flavor.id),\n createPermissionsPromise(client, project),\n ])\n if (cancelled) return\n // Deduplicate\n const deduped = accessData.filter(\n (entry, idx, arr) => arr.findIndex((e) => e.tenant_id === entry.tenant_id) === idx\n )\n setFlavorAccessData(deduped)\n setPermissionsData(permissions)\n } catch (error) {\n if (cancelled) return\n setLoadError(error instanceof Error ? error.message : \"Failed to Load Access Data\")\n } finally {\n if (!cancelled) setIsLoadingData(false)\n }\n }\n\n loadData()\n return () => {\n cancelled = true\n }\n }, [isOpen, flavor?.id, client, project])\n\n const initialAccess = useMemo(\n () => (flavorAccessData ? buildInitialAccess(flavorAccessData) : []),\n [flavorAccessData]\n )\n\n if (!isOpen || !flavor) {\n return null\n }\n\n const flavorName = flavor.name\n\n if (isLoadingData) {\n return (\n <Modal open onCancel={onClose} size=\"large\" title={t`Manage Access - ${flavorName}`}>\n <Status status=\"progress\" title={t`Loading Access...`} className=\"mt-0\" />\n </Modal>\n )\n }\n\n if (loadError) {\n return (\n <Modal open onCancel={onClose} size=\"large\" title={t`Manage Access - ${flavorName}`}>\n <Status status=\"error\" title={t`Failed to Load Access`} body={translateError(loadError)} className=\"mt-0\" />\n </Modal>\n )\n }\n\n return (\n <ManageAccessModalInner\n key={flavor.id}\n client={client}\n project={project}\n flavor={flavor}\n isLoading={false}\n onClose={onClose}\n initialAccess={initialAccess}\n canAdd={permissionsData?.canAdd ?? false}\n canRemove={permissionsData?.canRemove ?? false}\n />\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport React, { useState } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport {\n Modal,\n Stack,\n Form,\n FormSection,\n TextInput,\n DescriptionList,\n DescriptionTerm,\n DescriptionDefinition,\n Message,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Flavor } from \"@/server/Compute/types/flavor\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\nimport { useModalTracking } from \"@/client/hooks/useModalTracking\"\n\ninterface DeleteFlavorModalProps {\n client: TrpcClient\n isOpen: boolean\n onClose: () => void\n project: string\n flavor: Flavor | null\n onSuccess: () => void\n}\n\nexport const DeleteFlavorModal: React.FC<DeleteFlavorModalProps> = ({\n client,\n isOpen,\n onClose,\n project,\n flavor,\n onSuccess,\n}) => {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n const [isLoading, setIsLoading] = useState(false)\n const [formError, setFormError] = useState<string | null>(null)\n\n const { trackClose, markSubmitted, resetTracking } = useModalTracking({\n isOpen,\n actionPrefix: \"compute.flavor.delete\",\n })\n\n const formSchema = z.object({\n confirm: z.string().refine((value) => value === \"delete\", {\n message: t`Type \"delete\" 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 (!flavor?.id) {\n setFormError(t`No flavor selected for deletion.`)\n return\n }\n\n if (isLoading) return\n\n markSubmitted()\n setFormError(null)\n\n try {\n setIsLoading(true)\n\n await client.compute.deleteFlavor.mutate({\n project_id: project,\n flavorId: flavor.id,\n })\n onSuccess()\n handleClose()\n } catch (error) {\n const errorMessage = (error as Error)?.message\n ? translateError((error as Error).message)\n : t`Failed to delete flavor. Please try again.`\n setFormError(errorMessage)\n } finally {\n setIsLoading(false)\n }\n },\n })\n\n const canDelete = useStore(form.store, (state) => state.isSubmitting || state.values.confirm !== \"delete\")\n\n const handleClose = () => {\n trackClose()\n setIsLoading(false)\n setFormError(null)\n form.reset()\n resetTracking()\n onClose()\n }\n\n const confirmLabel = isLoading ? t`Deleting...` : t`Delete Flavor`\n const flavorName = flavor?.name\n\n return (\n <Modal\n open={isOpen}\n onCancel={handleClose}\n title={t`Delete Flavor \"${flavorName}\"`}\n size=\"small\"\n confirmButtonLabel={confirmLabel}\n confirmButtonVariant=\"primary-danger\"\n onConfirm={form.handleSubmit}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={canDelete || isLoading}\n disableCancelButton={isLoading}\n disableCloseButton={isLoading}\n >\n <Stack direction=\"vertical\" gap=\"4\">\n {formError && <Message variant=\"error\">{formError}</Message>}\n\n <p className=\"text-theme-default\">\n <Trans>This action cannot be undone. The flavor will be permanently deleted.</Trans>\n </p>\n\n {flavor && (\n <DescriptionList>\n <DescriptionTerm>{t`Name`}</DescriptionTerm>\n <DescriptionDefinition>{flavor.name}</DescriptionDefinition>\n\n <DescriptionTerm>{t`ID`}</DescriptionTerm>\n <DescriptionDefinition>{flavor.id}</DescriptionDefinition>\n\n <DescriptionTerm>{t`VCPUs`}</DescriptionTerm>\n <DescriptionDefinition>{flavor.vcpus}</DescriptionDefinition>\n\n <DescriptionTerm>{t`RAM`}</DescriptionTerm>\n <DescriptionDefinition>{flavor.ram} MiB</DescriptionDefinition>\n\n <DescriptionTerm>{t`Disk`}</DescriptionTerm>\n <DescriptionDefinition>{flavor.disk} GiB</DescriptionDefinition>\n\n <DescriptionTerm>{t`Swap`}</DescriptionTerm>\n <DescriptionDefinition>\n {flavor.swap === 0 || flavor.swap === \"\" ? <Trans>None</Trans> : `${Number(flavor.swap)} MiB`}\n </DescriptionDefinition>\n </DescriptionList>\n )}\n\n <Form\n className=\"mb-0\"\n id=\"delete-flavor-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 id={field.name}\n name={field.name}\n label={t`Type \"delete\" to confirm`}\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder=\"delete\"\n autoFocus\n disabled={isLoading}\n required\n />\n )}\n />\n </FormSection>\n </Form>\n </Stack>\n </Modal>\n )\n}\n"],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import { jsx as e } from "react/jsx-runtime";
2
- import { createContext as t, useCallback as n, useState as r } from "react";
3
- //#region src/client/context/DynamicBreadcrumbContext.tsx
4
- var i = /*#__PURE__*/ t({
5
- crumbs: /* @__PURE__ */ new Map(),
6
- setCrumb: () => {}
7
- });
8
- function a({ children: t }) {
9
- let [a, o] = r(() => /* @__PURE__ */ new Map()), s = n((e, t) => {
10
- o((n) => {
11
- let r = new Map(n);
12
- return t === null ? r.delete(e) : r.set(e, t), r;
13
- });
14
- }, []);
15
- return /*#__PURE__*/ e(i.Provider, {
16
- value: {
17
- crumbs: a,
18
- setCrumb: s
19
- },
20
- children: t
21
- });
22
- }
23
- //#endregion
24
- export { a as n, i as t };
25
-
26
- //# sourceMappingURL=DynamicBreadcrumbContext-CVcUQFou.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DynamicBreadcrumbContext-CVcUQFou.mjs","names":["createContext","useCallback","useState","DynamicBreadcrumbContext","crumbs","Map","setCrumb","DynamicBreadcrumbProvider","children","setCrumbs","routeId","crumb","prev","next","delete","set","Provider","value"],"sources":["../../src/client/context/DynamicBreadcrumbContext.tsx"],"sourcesContent":["import { createContext, useCallback, useState } from \"react\"\nimport type { ReactNode } from \"react\"\nimport type { Crumb } from \"@/client/routes/routeInfo\"\n\nexport const DynamicBreadcrumbContext = createContext<{\n crumbs: Map<string, Crumb>\n setCrumb: (routeId: string, crumb: Crumb | null) => void\n}>({ crumbs: new Map(), setCrumb: () => {} })\n\nexport function DynamicBreadcrumbProvider({ children }: { children: ReactNode }) {\n const [crumbs, setCrumbs] = useState(() => new Map<string, Crumb>())\n\n const setCrumb = useCallback((routeId: string, crumb: Crumb | null) => {\n setCrumbs((prev) => {\n const next = new Map(prev)\n if (crumb === null) {\n next.delete(routeId)\n } else {\n next.set(routeId, crumb)\n }\n return next\n })\n }, [])\n\n return <DynamicBreadcrumbContext.Provider value={{ crumbs, setCrumb }}>{children}</DynamicBreadcrumbContext.Provider>\n}\n"],"mappings":";;;AAIA,IAAaG,IAA2BH,gBAGrC;CAAEI,wBAAQ,IAAIC,IAAAA;CAAOC,gBAAU,CAAO;AAAE,CAAA;AAE3C,SAAgBC,EAA0B,EAAEC,eAAmC;CAC7E,IAAM,CAACJ,GAAQK,KAAaP,wBAAe,IAAIG,IAAAA,CAAAA,GAEzCC,IAAWL,GAAaS,GAAiBC,MAAAA;EAC7CF,GAAWG,MAAAA;GACT,IAAMC,IAAO,IAAIR,IAAIO,CAAAA;GAMrB,OALID,MAAU,OACZE,EAAKC,OAAOJ,CAAAA,IAEZG,EAAKE,IAAIL,GAASC,CAAAA,GAEbE;EACT,CAAA;CACF,GAAG,CAAA,CAAE;CAEL,OAAO,gBAACV,EAAyBa,UAAQ;EAACC,OAAO;GAAEb;GAAQE;EAAS;EAAIE;;AAC1E"}
@@ -1,85 +0,0 @@
1
- import { $ as e, J as t, Q as n, R as r, U as i, W as a, i as o, it as s } from "./build-WuxXRAqf.mjs";
2
- import { t as c } from "./cn-DM4Cy3jv.mjs";
3
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
4
- import { useCallback as d, useState as f } from "react";
5
- import { useLingui as p } from "@lingui/react";
6
- //#region src/client/components/ListToolbar/valueLabels.ts
7
- var m = (e, t) => e?.valueLabels && Object.hasOwn(e.valueLabels, t) ? e.valueLabels[t] : t, h = ({ selectedFilters: e, onDelete: t, onClear: r, filters: a }) => {
8
- let { i18n: s, _: c } = p();
9
- return /*#__PURE__*/ u(n, {
10
- gap: "2",
11
- wrap: !0,
12
- alignment: "start",
13
- distribution: "start",
14
- children: [e.map((e) => {
15
- let n = a?.find((t) => t.filterName === e.name);
16
- return /*#__PURE__*/ l(i, {
17
- closeable: !0,
18
- pillKey: n?.displayName ?? e.name,
19
- pillValue: m(n, e.value),
20
- onClose: () => t(e)
21
- }, `${e.name}:${e.value}`);
22
- }), e.length > 1 && /*#__PURE__*/ l(o, {
23
- size: "small",
24
- label: s._({ id: "yYxB17" }),
25
- onClick: r
26
- })]
27
- });
28
- };
29
- //#endregion
30
- //#region src/client/components/ListToolbar/FiltersInput.tsx
31
- function g(e) {
32
- return e == null ? !0 : typeof e == "string" || Array.isArray(e) ? e.length === 0 : e instanceof Map || e instanceof Set ? e.size === 0 : typeof e == "object" && Object.keys(e).length === 0;
33
- }
34
- var _ = ({ filters: n, onChange: i, selectClassName: o = "", comboboxClassName: h = "" }) => {
35
- let { i18n: _, _: v } = p(), [y, b] = f(""), [x, S] = f(""), C = n.find((e) => e.filterName === y), w = C?.values?.filter((e) => e), T = d((e) => {
36
- S(e), !g(y) && !g(e) && i({
37
- name: y,
38
- value: e
39
- }), setTimeout(() => {
40
- S("");
41
- }, 0);
42
- }, [
43
- y,
44
- S,
45
- i
46
- ]), E = () => ({
47
- className: c("w-full sm:min-w-0 sm:flex-1", o),
48
- name: "filter",
49
- "data-testid": "select-filterValue",
50
- label: _._({ id: "0cVgUw" }),
51
- value: y,
52
- onChange: (e) => {
53
- b(String(e));
54
- }
55
- }), D = () => ({
56
- className: c("w-full sm:min-w-0 sm:flex-1", h),
57
- name: "filterValue",
58
- "data-testid": "combobox-filterValue",
59
- value: x,
60
- disabled: !y,
61
- onChange: T
62
- });
63
- return /*#__PURE__*/ u(e, {
64
- className: "flex w-full flex-col sm:w-auto sm:flex-row sm:items-end",
65
- children: [/*#__PURE__*/ l(s, {
66
- ...E(),
67
- children: n?.map(({ displayName: e, filterName: t }) => /*#__PURE__*/ l(r, {
68
- value: t,
69
- label: e,
70
- "data-testid": t
71
- }, t))
72
- }), /*#__PURE__*/ l(t, {
73
- ...D(),
74
- children: w?.map((e) => /*#__PURE__*/ l(a, {
75
- value: e,
76
- label: m(C, e),
77
- "data-testid": e
78
- }, e))
79
- })]
80
- });
81
- };
82
- //#endregion
83
- export { h as n, _ as t };
84
-
85
- //# sourceMappingURL=FiltersInput-Becwxo_J.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FiltersInput-Becwxo_J.mjs","names":["resolveValueLabel","filter","value","valueLabels","Object","hasOwn","Button","Pill","Stack","resolveValueLabel","SelectedFilters","selectedFilters","onDelete","onClear","filters","useLingui","gap","wrap","alignment","distribution","map","filter","def","find","f","filterName","name","closeable","pillKey","displayName","pillValue","value","onClose","length","size","label","t","onClick","useCallback","useState","InputGroup","ComboBox","ComboBoxOption","SelectOption","Select","cn","resolveValueLabel","isEmpty","value","Array","isArray","length","Map","Set","size","Object","keys","FiltersInput","filters","onChange","selectClassName","comboboxClassName","useLingui","selectedFilterName","setSelectedFilterName","selectedFilterValue","setSelectedFilterValue","selectedFilterDef","find","filter","filterName","filterValues","values","handleValueChange","name","setTimeout","getSelectProps","className","label","t","String","getComboBoxProps","disabled","map","displayName","data-testid"],"sources":["../../src/client/components/ListToolbar/valueLabels.ts","../../src/client/components/ListToolbar/SelectedFilters.tsx","../../src/client/components/ListToolbar/FiltersInput.tsx"],"sourcesContent":["import { Filter } from \"./types\"\n\n/**\n * Resolves the human-readable label a filter defines for one of its raw values,\n * falling back to the raw value when no label is defined for it.\n *\n * Uses `Object.hasOwn` instead of a plain lookup because filter values can originate\n * from the URL: a plain `valueLabels[value]` would resolve `__proto__` (or `constructor`,\n * `toString`, …) to an inherited `Object.prototype` member, which is not nullish and so\n * would slip past a `??` fallback and reach the render as a non-string.\n */\nexport const resolveValueLabel = (filter: Filter | undefined, value: string): string =>\n filter?.valueLabels && Object.hasOwn(filter.valueLabels, value) ? filter.valueLabels[value] : value\n","import { useLingui } from \"@lingui/react/macro\"\nimport { Button, Pill, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { Filter, SelectedFilter } from \"./types\"\nimport { resolveValueLabel } from \"./valueLabels\"\n\nexport type SelectedFiltersProps = {\n /**\n * Array of currently active filters to be displayed as closeable pills.\n */\n selectedFilters: SelectedFilter[]\n\n /**\n * Callback function invoked when a user removes an individual filter pill.\n */\n onDelete: (filter: SelectedFilter) => void\n\n /**\n * Callback function invoked when the \"Clear all\" button is clicked.\n */\n onClear: () => void\n\n /**\n * Optional filter definitions used to resolve human-readable labels for pills;\n * when omitted, raw name/value are shown.\n */\n filters?: Filter[]\n}\n\n/**\n * SelectedFilters Component\n *\n * Displays currently active filters as closeable pill components with individual\n * remove buttons and an optional \"Clear all\" button (shown when 2+ filters are active).\n *\n * The pills are arranged in a flexible, wrapping layout that adapts to available space.\n */\nexport const SelectedFilters = ({ selectedFilters, onDelete, onClear, filters }: SelectedFiltersProps) => {\n const { t } = useLingui()\n\n return (\n <Stack gap=\"2\" wrap={true} alignment=\"start\" distribution=\"start\">\n {/* Render a closeable pill for each selected filter */}\n {selectedFilters.map((filter) => {\n const def = filters?.find((f) => f.filterName === filter.name)\n return (\n <Pill\n key={`${filter.name}:${filter.value}`}\n closeable\n pillKey={def?.displayName ?? filter.name}\n pillValue={resolveValueLabel(def, filter.value)}\n onClose={() => onDelete(filter)}\n />\n )\n })}\n {selectedFilters.length > 1 && <Button size=\"small\" label={t`Clear all`} onClick={onClear} />}\n </Stack>\n )\n}\n","import { useCallback, useState } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n InputGroup,\n ComboBox,\n ComboBoxProps,\n ComboBoxOption,\n SelectOption,\n Select,\n SelectProps,\n} from \"@cloudoperators/juno-ui-components\"\nimport { cn } from \"@/client/utils/cn\"\nimport { Filter, SelectedFilter } from \"./types\"\nimport { resolveValueLabel } from \"./valueLabels\"\n\nexport type FiltersInputProps = {\n filters: Filter[]\n onChange: (filter: SelectedFilter) => void\n selectClassName?: string\n comboboxClassName?: string\n}\n\nfunction isEmpty(value: unknown) {\n if (value == null) return true\n if (typeof value === \"string\" || Array.isArray(value)) return value.length === 0\n if (value instanceof Map || value instanceof Set) return value.size === 0\n if (typeof value === \"object\") return Object.keys(value).length === 0\n return false\n}\n\nexport const FiltersInput = ({\n filters,\n onChange,\n selectClassName = \"\",\n comboboxClassName = \"\",\n}: FiltersInputProps) => {\n const { t } = useLingui()\n\n const [selectedFilterName, setSelectedFilterName] = useState<string>(\"\")\n const [selectedFilterValue, setSelectedFilterValue] = useState<string>(\"\")\n\n const selectedFilterDef = filters.find((filter) => filter.filterName === selectedFilterName)\n const filterValues: string[] | undefined = selectedFilterDef?.values?.filter((value) => value)\n\n const handleValueChange = useCallback(\n (value: string) => {\n setSelectedFilterValue(value)\n if (!isEmpty(selectedFilterName) && !isEmpty(value)) {\n onChange({\n name: selectedFilterName,\n value: value,\n })\n }\n setTimeout(() => {\n setSelectedFilterValue(\"\")\n }, 0)\n },\n [selectedFilterName, setSelectedFilterValue, onChange]\n )\n\n const getSelectProps = (): SelectProps & { \"data-testid\"?: string } => ({\n className: cn(\"w-full sm:min-w-0 sm:flex-1\", selectClassName),\n name: \"filter\",\n \"data-testid\": \"select-filterValue\",\n label: t`Filter by`,\n value: selectedFilterName,\n onChange: (value: string | number | string[] | undefined) => {\n setSelectedFilterName(String(value))\n },\n })\n\n const getComboBoxProps = (): ComboBoxProps & { \"data-testid\"?: string } => ({\n className: cn(\"w-full sm:min-w-0 sm:flex-1\", comboboxClassName),\n name: \"filterValue\",\n \"data-testid\": \"combobox-filterValue\",\n value: selectedFilterValue,\n disabled: !selectedFilterName,\n onChange: handleValueChange,\n })\n\n return (\n <InputGroup className=\"flex w-full flex-col sm:w-auto sm:flex-row sm:items-end\">\n <Select {...getSelectProps()}>\n {filters?.map(({ displayName, filterName }) => (\n <SelectOption value={filterName} label={displayName} key={filterName} data-testid={filterName} />\n ))}\n </Select>\n <ComboBox {...getComboBoxProps()}>\n {filterValues?.map((value) => (\n <ComboBoxOption\n value={value}\n key={value}\n label={resolveValueLabel(selectedFilterDef, value)}\n data-testid={value}\n />\n ))}\n </ComboBox>\n </InputGroup>\n )\n}\n"],"mappings":"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"}