@cobaltcore-dev/aurora 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/AuroraApp.d.ts +10 -0
- package/dist/client/{ContentHeader-DtBiIwRY.mjs → ContentHeader-B_PWrxbw.mjs} +17 -17
- package/dist/client/{ContentHeader-DtBiIwRY.mjs.map → ContentHeader-B_PWrxbw.mjs.map} +1 -1
- package/dist/client/{DeleteFlavorModal-rmuYIafD.mjs → DeleteFlavorModal-BkPrQKyE.mjs} +146 -146
- package/dist/client/{DeleteFlavorModal-rmuYIafD.mjs.map → DeleteFlavorModal-BkPrQKyE.mjs.map} +1 -1
- package/dist/client/{EditSecurityGroupModal-B7Sz9puM.mjs → EditSecurityGroupModal-ad4uzlt0.mjs} +14 -14
- package/dist/client/{EditSecurityGroupModal-B7Sz9puM.mjs.map → EditSecurityGroupModal-ad4uzlt0.mjs.map} +1 -1
- package/dist/client/{FloatingIpActionModals-CfRJiZqD.mjs → FloatingIpActionModals-lKMwLuL8.mjs} +51 -51
- package/dist/client/{FloatingIpActionModals-CfRJiZqD.mjs.map → FloatingIpActionModals-lKMwLuL8.mjs.map} +1 -1
- package/dist/client/{ImageToastNotifications-Cw30RXsw.mjs → ImageToastNotifications--U13YiQ_.mjs} +328 -328
- package/dist/client/{ImageToastNotifications-Cw30RXsw.mjs.map → ImageToastNotifications--U13YiQ_.mjs.map} +1 -1
- package/dist/client/{ListToolbar-DuazvsAu.mjs → ListToolbar-C5lzTrit.mjs} +56 -56
- package/dist/client/{ListToolbar-DuazvsAu.mjs.map → ListToolbar-C5lzTrit.mjs.map} +1 -1
- package/dist/client/{RouteError-Cyto623-.mjs → RouteError-iP1Vd6bY.mjs} +2 -2
- package/dist/client/{RouteError-Cyto623-.mjs.map → RouteError-iP1Vd6bY.mjs.map} +1 -1
- package/dist/client/{_flavorId-B-1fYadl.mjs → _flavorId-BaNXUJhA.mjs} +49 -49
- package/dist/client/_flavorId-BaNXUJhA.mjs.map +1 -0
- package/dist/client/{_flavorId-BYfIHIV_.mjs → _flavorId-CnO76tuy.mjs} +10 -10
- package/dist/client/_flavorId-CnO76tuy.mjs.map +1 -0
- package/dist/client/{_floatingIpId-IrnN-ozB.mjs → _floatingIpId-C8G20nNt.mjs} +2 -2
- package/dist/client/{_floatingIpId-IrnN-ozB.mjs.map → _floatingIpId-C8G20nNt.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-FQ5P2qMV.mjs → _floatingIpId-DdKnjdIV.mjs} +36 -36
- package/dist/client/{_floatingIpId-FQ5P2qMV.mjs.map → _floatingIpId-DdKnjdIV.mjs.map} +1 -1
- package/dist/client/{_imageId-Tx_9bqEc.mjs → _imageId-DdSbxFqG.mjs} +135 -135
- package/dist/client/_imageId-DdSbxFqG.mjs.map +1 -0
- package/dist/client/{_pcaId-CFuKY82d.mjs → _pcaId-DFkYJEb5.mjs} +136 -136
- package/dist/client/{_pcaId-CFuKY82d.mjs.map → _pcaId-DFkYJEb5.mjs.map} +1 -1
- package/dist/client/{_pcaId-Bck7S7gJ.mjs → _pcaId-DX_S-3hE.mjs} +2 -2
- package/dist/client/{_pcaId-Bck7S7gJ.mjs.map → _pcaId-DX_S-3hE.mjs.map} +1 -1
- package/dist/client/{_projectId-PSpuCKO7.mjs → _projectId-DYrcZ3E3.mjs} +9 -9
- package/dist/client/{_projectId-PSpuCKO7.mjs.map → _projectId-DYrcZ3E3.mjs.map} +1 -1
- package/dist/client/{_projectId-B1VjDd0Z.mjs → _projectId-Dha4XqX4.mjs} +3 -3
- package/dist/client/{_projectId-B1VjDd0Z.mjs.map → _projectId-Dha4XqX4.mjs.map} +1 -1
- package/dist/client/_projectId-DsSVV2EA.mjs +316 -0
- package/dist/client/_projectId-DsSVV2EA.mjs.map +1 -0
- package/dist/client/{_projectId-Pxp-RXK4.mjs → _projectId-KH5si25Q.mjs} +2 -2
- package/dist/client/{_projectId-Pxp-RXK4.mjs.map → _projectId-KH5si25Q.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-VV2lUcGQ.mjs → _securityGroupId-DgaSqYex.mjs} +2 -2
- package/dist/client/{_securityGroupId-VV2lUcGQ.mjs.map → _securityGroupId-DgaSqYex.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-Dqi6ddw4.mjs → _securityGroupId-O7FXfx0M.mjs} +306 -306
- package/dist/client/{_securityGroupId-Dqi6ddw4.mjs.map → _securityGroupId-O7FXfx0M.mjs.map} +1 -1
- package/dist/client/{about-B2AzqxFI.mjs → about-DN8n8sN8.mjs} +8 -8
- package/dist/client/{about-B2AzqxFI.mjs.map → about-DN8n8sN8.mjs.map} +1 -1
- package/dist/client/{build-Cf7iWbpH.mjs → build-CZRvXrAL.mjs} +1047 -1042
- package/dist/client/{build-Cf7iWbpH.mjs.map → build-CZRvXrAL.mjs.map} +1 -1
- package/dist/client/{constants-CCgR6fKI.mjs → constants-akdIBeTX.mjs} +6 -6
- package/dist/client/{constants-CCgR6fKI.mjs.map → constants-akdIBeTX.mjs.map} +1 -1
- package/dist/client/{containers-BWERuY0O.mjs → containers-BE2QiLBs.mjs} +748 -748
- package/dist/client/{containers-BWERuY0O.mjs.map → containers-BE2QiLBs.mjs.map} +1 -1
- package/dist/client/containers-Cs5vOeR2.mjs.map +1 -1
- package/dist/client/{containers-DovytjVP.mjs → containers-DmwhE9Uz.mjs} +6 -6
- package/dist/client/containers-DmwhE9Uz.mjs.map +1 -0
- package/dist/client/flavors-BXPYAFyQ.mjs.map +1 -1
- package/dist/client/{flavors-CUiALHcB.mjs → flavors-CY7A6--v.mjs} +2 -2
- package/dist/client/{flavors-CUiALHcB.mjs.map → flavors-CY7A6--v.mjs.map} +1 -1
- package/dist/client/{flavors-Bovz-I2U.mjs → flavors-pEcGkCut.mjs} +150 -150
- package/dist/client/{flavors-Bovz-I2U.mjs.map → flavors-pEcGkCut.mjs.map} +1 -1
- package/dist/client/{floatingips-BrjDiY2t.mjs → floatingips-BtL4d4m-.mjs} +118 -118
- package/dist/client/{floatingips-BrjDiY2t.mjs.map → floatingips-BtL4d4m-.mjs.map} +1 -1
- package/dist/client/{images-DaaCUXMI.mjs → images-C19gCFSy.mjs} +389 -389
- package/dist/client/{images-DaaCUXMI.mjs.map → images-C19gCFSy.mjs.map} +1 -1
- package/dist/client/images-DM9I8G0p.mjs.map +1 -1
- package/dist/client/{images-BZP3pBqj.mjs → images-I9gQfRa7.mjs} +2 -2
- package/dist/client/{images-BZP3pBqj.mjs.map → images-I9gQfRa7.mjs.map} +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.js +416 -418
- package/dist/client/index.js.map +1 -1
- package/dist/client/objects-B4yrYf_a.mjs.map +1 -1
- package/dist/client/{objects-D4zBka5e.mjs → objects-BrYe_RaJ.mjs} +6 -6
- package/dist/client/objects-BrYe_RaJ.mjs.map +1 -0
- package/dist/client/{objects-Cw4Vu01M.mjs → objects-DOYFFn3Y.mjs} +1013 -1013
- package/dist/client/{objects-Cw4Vu01M.mjs.map → objects-DOYFFn3Y.mjs.map} +1 -1
- package/dist/client/{overview-2J54-loz.mjs → overview-BjRSFSBh.mjs} +2 -2
- package/dist/client/{overview-2J54-loz.mjs.map → overview-BjRSFSBh.mjs.map} +1 -1
- package/dist/client/{overview-BnmukbFh.mjs → overview-C4gjtc2q.mjs} +7 -7
- package/dist/client/{overview-BnmukbFh.mjs.map → overview-C4gjtc2q.mjs.map} +1 -1
- package/dist/client/{overview-D0AAvsmL.mjs → overview-CmQkJ4Hh.mjs} +2 -2
- package/dist/client/{overview-D0AAvsmL.mjs.map → overview-CmQkJ4Hh.mjs.map} +1 -1
- package/dist/client/{overview-BtIXpYBo.mjs → overview-DTLIAKkJ.mjs} +2 -2
- package/dist/client/{overview-BtIXpYBo.mjs.map → overview-DTLIAKkJ.mjs.map} +1 -1
- package/dist/client/{pca-V2aaOxZA.mjs → pca-CYFJxSZ2.mjs} +70 -70
- package/dist/client/{pca-V2aaOxZA.mjs.map → pca-CYFJxSZ2.mjs.map} +1 -1
- package/dist/client/{pca-BqZycwCu.mjs → pca-DzixU9Dl.mjs} +2 -2
- package/dist/client/{pca-BqZycwCu.mjs.map → pca-DzixU9Dl.mjs.map} +1 -1
- package/dist/client/projects-BsN4bvU2.mjs.map +1 -1
- package/dist/client/{projects-0feOw_b6.mjs → projects-BtyjXGq2.mjs} +2 -2
- package/dist/client/projects-BtyjXGq2.mjs.map +1 -0
- package/dist/client/projects-D3hOC1cy.mjs +95 -0
- package/dist/client/projects-D3hOC1cy.mjs.map +1 -0
- package/dist/client/{projects-jyIHL6DE.mjs → projects-DwVawmll.mjs} +2 -2
- package/dist/client/projects-DwVawmll.mjs.map +1 -0
- package/dist/client/{securitygroups-B4MkSBtI.mjs → securitygroups-DMCIDHQS.mjs} +114 -114
- package/dist/client/{securitygroups-B4MkSBtI.mjs.map → securitygroups-DMCIDHQS.mjs.map} +1 -1
- package/package.json +3 -3
- package/dist/client/_flavorId-B-1fYadl.mjs.map +0 -1
- package/dist/client/_flavorId-BYfIHIV_.mjs.map +0 -1
- package/dist/client/_imageId-Tx_9bqEc.mjs.map +0 -1
- package/dist/client/_projectId-Bs4W9hos.mjs +0 -283
- package/dist/client/_projectId-Bs4W9hos.mjs.map +0 -1
- package/dist/client/containers-DovytjVP.mjs.map +0 -1
- package/dist/client/objects-D4zBka5e.mjs.map +0 -1
- package/dist/client/projects-0feOw_b6.mjs.map +0 -1
- package/dist/client/projects-C1IYOvFQ.mjs +0 -144
- package/dist/client/projects-C1IYOvFQ.mjs.map +0 -1
- package/dist/client/projects-jyIHL6DE.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flavors-Bovz-I2U.mjs","names":["DataGrid","DataGridHeadCell","DataGridRow","DataGridCell","ContentHeading","PopupMenu","PopupMenuOptions","PopupMenuItem","Spinner","Stack","Pagination","DeleteFlavorModal","useState","EditSpecModal","ManageAccessModal","Link","useParams","useNavigate","FlavorListContainer","flavors","isLoading","client","project","onFlavorDeleted","canDeleteFlavor","canMangageAccess","currentPage","totalPages","onPageChange","useLingui","navigate","deleteModalOpen","setDeleteModalOpen","specModalOpen","setSpecModalOpen","accessModalOpen","setAccessModalOpen","selectedFlavor","setSelectedFlavor","projectId","from","openDeleteModal","flavor","openSpecModal","openAccessModal","closeDeleteModal","handleDeleteSuccess","name","div","data-testid","colSpan","distribution","alignment","variant","length","columns","className","p","minContentColumns","map","id","onClick","to","params","flavorId","vcpus","ram","disk","swap","e","stopPropagation","t","label","pages","onPressPrevious","Math","max","onPressNext","min","onSelectChange","page","isOpen","onClose","onSuccess","validateField","field","value","t","undefined","idStr","String","trim","idRegex","test","msg","nameStr","length","vcpus","Number","isNaN","ram","disk","swap","rxtx","str","ephemeral","cleanFlavorData","flavor","result","name","isValidValue","isValidNumber","id","description","rxtx_factor","Boolean","React","useState","Modal","Form","FormRow","FormSection","TextInput","Message","Spinner","Stack","Checkbox","validateField","cleanFlavorData","useErrorTranslation","CreateFlavorModal","client","isOpen","onClose","project","onSuccess","useLingui","translateError","newFlavor","setNewFlavor","errors","setErrors","isLoading","setIsLoading","generalError","setGeneralError","handleInputChange","e","name","value","type","checked","target","prev","newState","handleNumericInputChange","handleBlur","error","handleSubmit","preventDefault","newErrors","requiredFields","forEach","key","optionalFields","undefined","Object","keys","length","t","flavorData","compute","createFlavor","mutate","project_id","flavor","handleClose","errorMessage","message","dismissError","onCancel","size","title","open","onConfirm","cancelButtonLabel","confirmButtonLabel","distribution","alignment","variant","onDismiss","text","id","label","onChange","onBlur","errortext","required","description","String","vcpus","Number","ram","disk","swap","defaultValue","rxtx_factor","helptext","use","Suspense","useState","startTransition","useEffect","useCallback","useSearch","useNavigate","Message","Button","Stack","Spinner","ListToolbar","FlavorListContainer","CreateFlavorModal","PAGE_SIZE","createFlavorsPromise","client","project","sortBy","sortDirection","searchTerm","compute","getFlavorsByProjectId","query","project_id","createPermissionsPromise","canUser","permission","then","canCreate","canDelete","canManageAccess","FlavorsContent","flavorsPromise","permissionsPromise","onFlavorDeleted","onFlavorCreated","setSearchTerm","sortSettings","handleSortChange","createModalOpen","setCreateModalOpen","currentPage","onPageChange","useLingui","flavors","privateFlavorError","permissions","totalPages","Math","max","ceil","length","safePage","min","paginatedFlavors","slice","isOpen","onClose","onSuccess","className","text","t","variant","onSort","onSearch","actions","label","onClick","isLoading","canDeleteFlavor","canMangageAccess","Flavors","navigate","searchParams","strict","setSortSettings","options","value","search","page","success","setSuccess","setFlavorsPromise","refetchFlavors","handleFlavorDeleted","flavorName","message","timestamp","Date","now","setTimeout","undefined","handleFlavorCreated","newSortSettings","settings","toString","prev","replace","handleSearchChange","term","searchValue","handlePageChange","div","onDismiss","dismissible","fallback","distribution","alignment","direction","size","useLingui","Flavors","ContentHeader","Route","RouteComponent","t","projectId","useParams","trpcClient","useRouteContext","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/-components/FlavorListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/-components/flavorValidation.ts","../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/-components/CreateFlavorModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/List.tsx","../../src/client/routes/_auth/projects/$projectId/compute/flavors/index.tsx?tsr-split=component"],"sourcesContent":["import { Flavor } from \"@/server/Compute/types/flavor\"\nimport {\n DataGrid,\n DataGridHeadCell,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n PopupMenu,\n PopupMenuOptions,\n PopupMenuItem,\n Spinner,\n Stack,\n Pagination,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { DeleteFlavorModal } from \"./DeleteFlavorModal\"\nimport { useState } from \"react\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport { EditSpecModal } from \"./EditSpecModal\"\nimport { ManageAccessModal } from \"./ManageAccessModal\"\nimport { Link, useParams, useNavigate } from \"@tanstack/react-router\"\n\ninterface FlavorListContainerProps {\n flavors?: Flavor[]\n isLoading: boolean\n client: TrpcClient\n project: string\n onFlavorDeleted?: (flavorName: string) => void\n canDeleteFlavor?: boolean\n canMangageAccess?: boolean\n currentPage?: number\n totalPages?: number\n onPageChange?: (page: number) => void\n}\n\nexport const FlavorListContainer = ({\n flavors,\n isLoading,\n client,\n project,\n onFlavorDeleted,\n canDeleteFlavor,\n canMangageAccess,\n currentPage = 1,\n totalPages = 1,\n onPageChange,\n}: FlavorListContainerProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const [deleteModalOpen, setDeleteModalOpen] = useState(false)\n const [specModalOpen, setSpecModalOpen] = useState(false)\n const [accessModalOpen, setAccessModalOpen] = useState(false)\n const [selectedFlavor, setSelectedFlavor] = useState<Flavor | null>(null)\n\n const { projectId } = useParams({\n from: \"/_auth/projects/$projectId/compute/flavors/\",\n })\n\n const openDeleteModal = (flavor: Flavor) => {\n setSelectedFlavor(flavor)\n setDeleteModalOpen(true)\n }\n\n const openSpecModal = (flavor: Flavor) => {\n setSelectedFlavor(flavor)\n setSpecModalOpen(true)\n }\n\n const openAccessModal = (flavor: Flavor) => {\n setSelectedFlavor(flavor)\n setAccessModalOpen(true)\n }\n\n const closeDeleteModal = () => {\n setDeleteModalOpen(false)\n setSelectedFlavor(null)\n }\n\n const handleDeleteSuccess = () => {\n if (selectedFlavor && onFlavorDeleted) {\n onFlavorDeleted(selectedFlavor.name || \"\")\n }\n closeDeleteModal()\n }\n\n if (isLoading) {\n return (\n <div data-testid=\"loading\">\n <div data-testid=\"loading\">\n <DataGridRow>\n <DataGridCell colSpan={3}>\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n <Trans>Loading...</Trans>\n </Stack>\n </DataGridCell>\n </DataGridRow>\n </div>\n </div>\n )\n }\n\n if (!flavors || flavors.length === 0) {\n return (\n <DataGrid columns={7} className=\"flavors\" data-testid=\"no-flavors\">\n <DataGridRow>\n <DataGridCell colSpan={7}>\n <ContentHeading>\n <Trans>No flavors found</Trans>\n </ContentHeading>\n <p>\n <Trans>\n There are no flavors available for this project with the current filters applied. Try adjusting your\n filter criteria or create a new flavor.\n </Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n )\n }\n\n return (\n <>\n <DataGrid columns={6} minContentColumns={[5]} className=\"flavors\" data-testid=\"flavors-table\">\n <DataGridRow>\n <DataGridHeadCell>\n <Trans>Name</Trans>\n </DataGridHeadCell>\n <DataGridHeadCell>\n <Trans>vCPU</Trans>\n </DataGridHeadCell>\n <DataGridHeadCell>\n <Trans>RAM (MiB)</Trans>\n </DataGridHeadCell>\n <DataGridHeadCell>\n <Trans>Root Disk (GiB)</Trans>\n </DataGridHeadCell>\n <DataGridHeadCell>\n <Trans>Swap (MiB)</Trans>\n </DataGridHeadCell>\n <DataGridHeadCell></DataGridHeadCell>\n </DataGridRow>\n\n {flavors.map((flavor) => (\n <DataGridRow\n key={flavor.id}\n data-testid={`flavor-row-${flavor.id}`}\n onClick={() =>\n navigate({\n to: \"/projects/$projectId/compute/flavors/$flavorId\",\n params: { projectId, flavorId: flavor.id },\n })\n }\n >\n <DataGridCell>{flavor.name || flavor.id}</DataGridCell>\n <DataGridCell>{flavor.vcpus || \"–\"}</DataGridCell>\n <DataGridCell>{flavor.ram || \"–\"}</DataGridCell>\n <DataGridCell>{flavor.disk || \"–\"}</DataGridCell>\n <DataGridCell>{flavor.swap || \"–\"}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()}>\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem>\n <Link\n to=\"/projects/$projectId/compute/flavors/$flavorId\"\n params={{ projectId: projectId, flavorId: flavor.id }}\n className=\"text-theme-default\"\n >\n {t`Details`}\n </Link>\n </PopupMenuItem>\n <PopupMenuItem label={t`Metadata`} onClick={() => openSpecModal(flavor)} />\n\n {canMangageAccess && (\n <PopupMenuItem label={t`Manage Access`} onClick={() => openAccessModal(flavor)} />\n )}\n {canDeleteFlavor && (\n <PopupMenuItem label={t`Delete Flavor`} onClick={() => openDeleteModal(flavor)} />\n )}\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n ))}\n </DataGrid>\n {totalPages > 1 && (\n <div className=\"flex justify-center py-4\">\n <Pagination\n variant=\"input\"\n currentPage={currentPage}\n pages={totalPages}\n onPressPrevious={() => onPageChange?.(Math.max(currentPage - 1, 1))}\n onPressNext={() => onPageChange?.(Math.min(currentPage + 1, totalPages))}\n onSelectChange={(page) => onPageChange?.(page)}\n />\n </div>\n )}\n <DeleteFlavorModal\n client={client}\n isOpen={deleteModalOpen}\n onClose={closeDeleteModal}\n project={project}\n flavor={selectedFlavor}\n onSuccess={handleDeleteSuccess}\n />\n <EditSpecModal\n client={client}\n isOpen={specModalOpen}\n onClose={() => setSpecModalOpen(false)}\n project={project}\n flavor={selectedFlavor}\n />\n\n <ManageAccessModal\n client={client}\n isOpen={accessModalOpen}\n onClose={() => setAccessModalOpen(false)}\n project={project}\n flavor={selectedFlavor}\n />\n </>\n )\n}\n","import { msg } from \"@lingui/core/macro\"\nimport { MessageDescriptor } from \"@lingui/core\"\nimport { Flavor } from \"@/server/Compute/types/flavor\"\n\nexport const validateField = (\n field: FlavorFormField,\n value: string | number | boolean | null | undefined,\n t: (descriptor: MessageDescriptor) => string\n): string | undefined => {\n switch (field) {\n case \"id\":\n if (!value) return undefined\n {\n const idStr = String(value).trim()\n const idRegex = /^[a-zA-Z0-9.\\-_]*$/\n return idRegex.test(idStr)\n ? undefined\n : t(msg`ID must only contain alphanumeric characters, hyphens, underscores, and dots.`)\n }\n\n case \"name\": {\n const nameStr = String(value || \"\").trim()\n return nameStr.length >= 2 && nameStr.length <= 50 ? undefined : t(msg`Name must be 2-50 characters long.`)\n }\n\n case \"vcpus\": {\n const vcpus = Number(value)\n return !isNaN(vcpus) && vcpus >= 1 ? undefined : t(msg`VCPUs must be an integer ≥ 1.`)\n }\n\n case \"ram\": {\n const ram = Number(value)\n return !isNaN(ram) && ram >= 128 ? undefined : t(msg`RAM must be an integer ≥ 128 MB.`)\n }\n\n case \"disk\": {\n const disk = Number(value)\n return !isNaN(disk) && disk >= 0 ? undefined : t(msg`Root Disk must be an integer ≥ 0.`)\n }\n\n case \"swap\":\n if (value === \"\" || value === undefined || value === null) return undefined\n {\n const swap = Number(value)\n return !isNaN(swap) && swap >= 0 ? undefined : t(msg`Swap Disk must be an integer ≥ 0.`)\n }\n\n case \"rxtx_factor\": {\n const rxtx = Number(value)\n return !isNaN(rxtx) && rxtx >= 1 ? undefined : t(msg`RX/TX Factor must be an integer ≥ 1.`)\n }\n\n case \"description\":\n if (!value) return undefined\n {\n const str = String(value)\n return str.length < 65535 ? undefined : t(msg`Description must be less than 65535 characters.`)\n }\n\n case \"OS-FLV-EXT-DATA:ephemeral\": {\n const ephemeral = Number(value)\n return !isNaN(ephemeral) && ephemeral >= 0 ? undefined : t(msg`Ephemeral Disk must be an integer ≥ 0.`)\n }\n\n case \"os-flavor-access:is_public\": {\n if (value === undefined || value === null) {\n return undefined\n }\n if (typeof value === \"boolean\") {\n return undefined\n }\n if (typeof value === \"string\" && (value === \"true\" || value === \"false\")) {\n return undefined\n }\n return t(msg`Invalid value for public flavor setting.`)\n }\n\n default:\n return undefined\n }\n}\n\nexport type FlavorFormField =\n | \"id\"\n | \"name\"\n | \"vcpus\"\n | \"ram\"\n | \"disk\"\n | \"swap\"\n | \"description\"\n | \"rxtx_factor\"\n | \"OS-FLV-EXT-DATA:ephemeral\"\n | \"os-flavor-access:is_public\"\n\nexport interface FieldErrors {\n id?: string\n name?: string\n vcpus?: string\n ram?: string\n disk?: string\n swap?: string\n rxtx_factor?: string\n description?: string\n \"OS-FLV-EXT-DATA:ephemeral\"?: string\n \"os-flavor-access:is_public\"?: string\n}\n\nexport const cleanFlavorData = (flavor: Partial<Flavor>) => {\n const result: {\n name: string\n vcpus: number\n ram: number\n disk: number\n \"OS-FLV-EXT-DATA:ephemeral\"?: number\n id?: string\n swap?: number\n rxtx_factor?: number\n description?: string\n \"os-flavor-access:is_public\"?: boolean\n } = {\n name: String(flavor.name),\n vcpus: Number(flavor.vcpus),\n ram: Number(flavor.ram),\n disk: Number(flavor.disk),\n }\n\n const isValidValue = (value: string | undefined | null) => {\n return value !== undefined && value !== null && value !== \"\" && String(value).trim() !== \"\"\n }\n\n const isValidNumber = (value: string | number | undefined | null) => {\n return value !== undefined && value !== null && value !== \"\" && String(value).trim() !== \"\" && !isNaN(Number(value))\n }\n\n if (isValidValue(flavor.id)) {\n result.id = String(flavor.id).trim()\n }\n\n if (isValidValue(flavor.description)) {\n result.description = String(flavor.description).trim()\n }\n\n if (isValidNumber(flavor.swap)) {\n result.swap = Number(flavor.swap)\n }\n\n if (isValidNumber(flavor.rxtx_factor)) {\n result.rxtx_factor = Number(flavor.rxtx_factor)\n }\n\n if (isValidNumber(flavor[\"OS-FLV-EXT-DATA:ephemeral\"])) {\n result[\"OS-FLV-EXT-DATA:ephemeral\"] = Number(flavor[\"OS-FLV-EXT-DATA:ephemeral\"])\n }\n\n if (flavor[\"os-flavor-access:is_public\"] !== undefined) {\n result[\"os-flavor-access:is_public\"] = Boolean(flavor[\"os-flavor-access:is_public\"])\n }\n\n return result\n}\n","import React, { useState } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport {\n Modal,\n Form,\n FormRow,\n FormSection,\n TextInput,\n Message,\n Spinner,\n Stack,\n Checkbox,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Flavor } from \"@/server/Compute/types/flavor\"\nimport { validateField, FlavorFormField, FieldErrors } from \"./flavorValidation\"\nimport { cleanFlavorData } from \"./flavorValidation\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\n\ninterface CreateFlavorModalProps {\n client: TrpcClient\n isOpen: boolean\n onClose: () => void\n project: string\n onSuccess: (name: string) => void\n}\n\nexport const CreateFlavorModal: React.FC<CreateFlavorModalProps> = ({\n client,\n isOpen,\n onClose,\n project,\n onSuccess,\n}) => {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n const [newFlavor, setNewFlavor] = useState<Partial<Flavor>>({\n \"os-flavor-access:is_public\": true,\n })\n const [errors, setErrors] = useState<FieldErrors>({})\n const [isLoading, setIsLoading] = useState(false)\n const [generalError, setGeneralError] = useState<string | null>(null)\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { name, value, type, checked } = e.target\n\n setNewFlavor((prev) => {\n const newState = {\n ...prev,\n [name]: type === \"checkbox\" ? checked : value,\n }\n\n return newState\n })\n if (generalError) setGeneralError(null)\n }\n\n const handleNumericInputChange = (name: FlavorFormField, value: number | undefined) => {\n setNewFlavor((prev) => ({\n ...prev,\n [name]: value,\n }))\n if (generalError) setGeneralError(null)\n }\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const { name, value } = e.target\n const error = validateField(name as FlavorFormField, value, t)\n setErrors((prev) => ({\n ...prev,\n [name]: error,\n }))\n }\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n setGeneralError(null)\n\n const newErrors: FieldErrors = {}\n\n const requiredFields: FlavorFormField[] = [\"name\", \"vcpus\", \"ram\", \"disk\"]\n requiredFields.forEach((key) => {\n const error = validateField(key, newFlavor[key], t)\n if (error) {\n newErrors[key] = error\n }\n })\n\n const optionalFields: FlavorFormField[] = [\n \"id\",\n \"swap\",\n \"OS-FLV-EXT-DATA:ephemeral\",\n \"rxtx_factor\",\n \"description\",\n \"os-flavor-access:is_public\",\n ]\n optionalFields.forEach((key) => {\n const value = newFlavor[key]\n\n if (value !== undefined && value !== \"\" && value !== null) {\n const error = validateField(key, value, t)\n if (error) {\n newErrors[key] = error\n }\n }\n })\n\n if (Object.keys(newErrors).length > 0) {\n setErrors(newErrors)\n setGeneralError(t`Please fix the validation errors below.`)\n return\n }\n\n try {\n setIsLoading(true)\n\n const flavorData = cleanFlavorData(newFlavor)\n\n await client.compute.createFlavor.mutate({\n project_id: project,\n flavor: flavorData,\n })\n\n onSuccess(flavorData.name)\n handleClose()\n } catch (error) {\n const errorMessage = (error as Error)?.message\n ? translateError((error as Error).message)\n : t`Failed to create flavor. Please try again.`\n setGeneralError(errorMessage)\n } finally {\n setIsLoading(false)\n }\n }\n\n const handleClose = () => {\n setNewFlavor({\n \"os-flavor-access:is_public\": true,\n })\n setErrors({})\n setGeneralError(null)\n onClose()\n }\n\n const dismissError = () => {\n setGeneralError(null)\n }\n\n return (\n <Modal\n onCancel={handleClose}\n size=\"large\"\n title={t`Create Flavor`}\n open={isOpen}\n onConfirm={handleSubmit}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Create New Flavor`}\n >\n {isLoading && (\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n )}\n {!isLoading && (\n <Form>\n {generalError && (\n <FormRow>\n <Message onDismiss={dismissError} text={generalError} variant=\"error\" />\n </FormRow>\n )}\n\n <FormSection>\n <FormRow>\n <TextInput\n id=\"id\"\n name=\"id\"\n label={t`Flavor ID`}\n value={newFlavor.id || \"\"}\n onChange={handleInputChange}\n onBlur={handleBlur}\n errortext={errors.id}\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"name\"\n name=\"name\"\n label={t`Flavor Name`}\n value={newFlavor.name || \"\"}\n onChange={handleInputChange}\n onBlur={handleBlur}\n errortext={errors.name}\n required\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"description\"\n name=\"description\"\n label={t`Description`}\n value={newFlavor.description || \"\"}\n onChange={handleInputChange}\n onBlur={handleBlur}\n errortext={errors.description}\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"vcpus\"\n name=\"vcpus\"\n label={t`VCPUs`}\n value={String(newFlavor.vcpus || \"\")}\n onChange={(e) => handleNumericInputChange(\"vcpus\", Number(e.target.value))}\n onBlur={handleBlur}\n errortext={errors.vcpus}\n type=\"number\"\n required\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"ram\"\n name=\"ram\"\n label={t`RAM (MiB)`}\n value={String(newFlavor.ram || \"\")}\n onChange={(e) => handleNumericInputChange(\"ram\", Number(e.target.value))}\n onBlur={handleBlur}\n errortext={errors.ram}\n type=\"number\"\n required\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"disk\"\n name=\"disk\"\n label={t`Disk (GiB)`}\n value={String(newFlavor.disk || \"\")}\n onChange={(e) => handleNumericInputChange(\"disk\", Number(e.target.value))}\n onBlur={handleBlur}\n errortext={errors.disk}\n type=\"number\"\n required\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"OS-FLV-EXT-DATA:ephemeral\"\n name=\"OS-FLV-EXT-DATA:ephemeral\"\n label={t`Ephemeral Disk (GiB)`}\n value={String(newFlavor[\"OS-FLV-EXT-DATA:ephemeral\"] || \"\")}\n onChange={(e) => handleNumericInputChange(\"OS-FLV-EXT-DATA:ephemeral\", Number(e.target.value))}\n onBlur={handleBlur}\n errortext={errors[\"OS-FLV-EXT-DATA:ephemeral\"]}\n type=\"number\"\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"swap\"\n name=\"swap\"\n label={t`Swap (MiB)`}\n value={String(newFlavor.swap || \"\")}\n onChange={(e) => handleNumericInputChange(\"swap\", e.target.value ? Number(e.target.value) : undefined)}\n onBlur={handleBlur}\n errortext={errors.swap}\n type=\"number\"\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"rxtx_factor\"\n name=\"rxtx_factor\"\n label={t`RX/TX Factor`}\n defaultValue={1}\n value={String(newFlavor.rxtx_factor || \"\")}\n onChange={(e) => handleNumericInputChange(\"rxtx_factor\", Number(e.target.value))}\n onBlur={handleBlur}\n errortext={errors.rxtx_factor}\n type=\"number\"\n />\n </FormRow>\n <FormRow>\n <Checkbox\n name=\"os-flavor-access:is_public\"\n label={t`Public Flavor`}\n helptext={t`If checked, this flavor will be available to all tenants. If unchecked, access must be explicitly granted to specific tenants.`}\n checked={!!newFlavor[\"os-flavor-access:is_public\"]}\n onChange={handleInputChange}\n />\n </FormRow>\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { use, Suspense, useState, startTransition, useEffect, useCallback } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { useSearch, useNavigate } from \"@tanstack/react-router\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport { Flavor } from \"@/server/Compute/types/flavor\"\nimport { Message, Button, Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\nimport { ListToolbar } from \"@/client/components/ListToolbar\"\nimport { SortSettings } from \"@/client/components/ListToolbar/types\"\nimport { FlavorListContainer } from \"./-components/FlavorListContainer\"\nimport { CreateFlavorModal } from \"./-components/CreateFlavorModal\"\nimport type { FlavorsSearchParams } from \"@/client/routes/_auth/projects/$projectId/compute/flavors\"\n\nconst PAGE_SIZE = 50\n\ninterface FlavorsProps {\n client: TrpcClient\n project: string\n}\n\ntype RequiredSortSettings = {\n options: SortSettings[\"options\"]\n sortBy: string\n sortDirection: \"asc\" | \"desc\"\n}\n\nconst createFlavorsPromise = (\n client: TrpcClient,\n project: string,\n sortBy: string,\n sortDirection: string,\n searchTerm: string\n) => {\n return client.compute.getFlavorsByProjectId.query({\n project_id: project,\n sortBy,\n sortDirection,\n searchTerm,\n })\n}\n\nconst createPermissionsPromise = (client: TrpcClient, project: string) => {\n return client.compute.canUser\n .query({\n project_id: project,\n permission: [\"flavors:create\", \"flavors:delete\", \"flavors:list_projects\"],\n })\n .then(([canCreate, canDelete, canManageAccess]) => ({ canCreate, canDelete, canManageAccess }))\n}\n\nfunction FlavorsContent({\n flavorsPromise,\n permissionsPromise,\n client,\n project,\n onFlavorDeleted,\n onFlavorCreated,\n searchTerm,\n setSearchTerm,\n sortSettings,\n handleSortChange,\n createModalOpen,\n setCreateModalOpen,\n currentPage,\n onPageChange,\n}: {\n flavorsPromise: Promise<{ flavors: Flavor[]; privateFlavorError?: string }>\n permissionsPromise: Promise<{ canCreate: boolean; canDelete: boolean; canManageAccess: boolean }>\n client: TrpcClient\n project: string\n onFlavorDeleted: (name: string) => void\n onFlavorCreated: (name: string) => void\n searchTerm: string\n setSearchTerm: (term: string) => void\n sortSettings: SortSettings\n handleSortChange: (settings: SortSettings) => void\n createModalOpen: boolean\n setCreateModalOpen: (open: boolean) => void\n currentPage: number\n onPageChange: (page: number) => void\n}) {\n const { t } = useLingui()\n const { flavors, privateFlavorError } = use(flavorsPromise)\n const permissions = use(permissionsPromise)\n\n const totalPages = Math.max(1, Math.ceil(flavors.length / PAGE_SIZE))\n const safePage = Math.min(currentPage, totalPages)\n const paginatedFlavors = flavors.slice((safePage - 1) * PAGE_SIZE, safePage * PAGE_SIZE)\n\n useEffect(() => {\n if (currentPage > totalPages) onPageChange(1)\n }, [totalPages, currentPage, onPageChange])\n\n return (\n <>\n <CreateFlavorModal\n client={client}\n isOpen={createModalOpen}\n project={project}\n onClose={() => setCreateModalOpen(false)}\n onSuccess={onFlavorCreated}\n />\n\n {privateFlavorError && (\n <Message\n className=\"mb-4\"\n text={t`Private flavors could not be loaded. You may be seeing an incomplete list.`}\n variant=\"warning\"\n />\n )}\n\n <ListToolbar\n sortSettings={sortSettings}\n searchTerm={searchTerm}\n onSort={handleSortChange}\n onSearch={setSearchTerm}\n actions={\n permissions.canCreate ? (\n <Button variant=\"primary\" label={t`Create Flavor`} onClick={() => setCreateModalOpen(true)} />\n ) : null\n }\n />\n\n <FlavorListContainer\n flavors={paginatedFlavors}\n isLoading={false}\n client={client}\n project={project}\n onFlavorDeleted={onFlavorDeleted}\n canDeleteFlavor={permissions.canDelete}\n canMangageAccess={permissions.canManageAccess}\n currentPage={safePage}\n totalPages={totalPages}\n onPageChange={onPageChange}\n />\n </>\n )\n}\nexport const Flavors = ({ client, project }: FlavorsProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const searchParams = useSearch({ strict: false }) as FlavorsSearchParams\n\n const [sortSettings, setSortSettings] = useState<RequiredSortSettings>({\n options: [\n { label: t`Name`, value: \"name\" },\n { label: t`VCPUs`, value: \"vcpus\" },\n { label: t`RAM`, value: \"ram\" },\n { label: t`Root Disk`, value: \"disk\" },\n { label: t`Swap`, value: \"swap\" },\n ],\n sortBy: searchParams.sortBy || \"name\",\n sortDirection: searchParams.sortDirection || \"asc\",\n })\n\n const [searchTerm, setSearchTerm] = useState(searchParams.search || \"\")\n const currentPage = searchParams.page ?? 1\n const [success, setSuccess] = useState<{ message: string; timestamp: number } | undefined>()\n const [createModalOpen, setCreateModalOpen] = useState(false)\n\n const [flavorsPromise, setFlavorsPromise] = useState(() =>\n createFlavorsPromise(client, project, sortSettings.sortBy, sortSettings.sortDirection, searchTerm)\n )\n const [permissionsPromise] = useState(() => createPermissionsPromise(client, project))\n\n const refetchFlavors = () => {\n startTransition(() => {\n setFlavorsPromise(\n createFlavorsPromise(client, project, sortSettings.sortBy, sortSettings.sortDirection, searchTerm)\n )\n })\n }\n\n const handleFlavorDeleted = (flavorName: string) => {\n setSuccess({\n message: t`Flavor \"${flavorName}\" has been successfully deleted.`,\n timestamp: Date.now(),\n })\n setTimeout(() => setSuccess(undefined), 5000)\n refetchFlavors()\n }\n\n const handleFlavorCreated = (flavorName: string) => {\n setSuccess({\n message: t`Flavor \"${flavorName}\" has been successfully created.`,\n timestamp: Date.now(),\n })\n setTimeout(() => setSuccess(undefined), 5000)\n refetchFlavors()\n }\n\n const handleSortChange = (newSortSettings: SortSettings) => {\n const settings: RequiredSortSettings = {\n options: newSortSettings.options,\n sortBy: newSortSettings.sortBy?.toString() || \"name\",\n sortDirection: newSortSettings.sortDirection || \"asc\",\n }\n\n setSortSettings(settings)\n navigate({\n search: ((prev: FlavorsSearchParams) => ({\n ...prev,\n sortBy: settings.sortBy,\n sortDirection: settings.sortDirection,\n page: undefined,\n })) as unknown as true,\n replace: true,\n })\n startTransition(() => {\n setFlavorsPromise(createFlavorsPromise(client, project, settings.sortBy, settings.sortDirection, searchTerm))\n })\n }\n\n const handleSearchChange = (term: string | number | string[] | undefined) => {\n const searchValue = typeof term === \"string\" ? term : \"\"\n setSearchTerm(searchValue)\n\n navigate({\n search: ((prev: FlavorsSearchParams) => ({\n ...prev,\n search: searchValue || undefined,\n page: undefined,\n })) as unknown as true,\n replace: true,\n })\n startTransition(() => {\n setFlavorsPromise(\n createFlavorsPromise(client, project, sortSettings.sortBy, sortSettings.sortDirection, searchValue)\n )\n })\n }\n\n const handlePageChange = useCallback(\n (page: number) => {\n navigate({\n search: ((prev: FlavorsSearchParams) => ({\n ...prev,\n page: page === 1 ? undefined : page,\n })) as unknown as true,\n })\n },\n [navigate]\n )\n\n return (\n <div className=\"relative\">\n {success && (\n <Message\n className=\"absolute -top-14 right-0 left-0 z-50\"\n text={success.message}\n variant=\"info\"\n onDismiss={() => setSuccess(undefined)}\n dismissible\n />\n )}\n\n <Suspense\n fallback={\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Flavors...</Trans>\n </Stack>\n }\n >\n <FlavorsContent\n flavorsPromise={flavorsPromise}\n permissionsPromise={permissionsPromise}\n client={client}\n project={project}\n onFlavorDeleted={handleFlavorDeleted}\n onFlavorCreated={handleFlavorCreated}\n searchTerm={searchTerm}\n setSearchTerm={handleSearchChange}\n sortSettings={sortSettings}\n handleSortChange={handleSortChange}\n createModalOpen={createModalOpen}\n setCreateModalOpen={setCreateModalOpen}\n currentPage={currentPage}\n onPageChange={handlePageChange}\n />\n </Suspense>\n </div>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { Flavors } from \"../-components/Flavors/List\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/flavors/\")({\n staticData: {\n section: \"compute\",\n service: \"flavors\",\n sectionCrumb: { labelKey: \"Compute\" },\n crumb: { labelKey: \"Flavors\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Flavors` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n const { trpcClient } = Route.useRouteContext()\n return (\n <>\n <ContentHeader title={t`Flavors`} projectId={projectId} />\n <Flavors project={projectId} client={trpcClient!} />\n </>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"flavors-pEcGkCut.mjs","names":["DataGrid","DataGridHeadCell","DataGridRow","DataGridCell","ContentHeading","PopupMenu","PopupMenuOptions","PopupMenuItem","Spinner","Stack","Pagination","DeleteFlavorModal","useState","EditSpecModal","ManageAccessModal","Link","useParams","useNavigate","FlavorListContainer","flavors","isLoading","client","project","onFlavorDeleted","canDeleteFlavor","canMangageAccess","currentPage","totalPages","onPageChange","useLingui","navigate","deleteModalOpen","setDeleteModalOpen","specModalOpen","setSpecModalOpen","accessModalOpen","setAccessModalOpen","selectedFlavor","setSelectedFlavor","projectId","from","openDeleteModal","flavor","openSpecModal","openAccessModal","closeDeleteModal","handleDeleteSuccess","name","div","data-testid","colSpan","distribution","alignment","variant","length","columns","className","p","minContentColumns","map","id","onClick","to","params","flavorId","vcpus","ram","disk","swap","e","stopPropagation","t","label","pages","onPressPrevious","Math","max","onPressNext","min","onSelectChange","page","isOpen","onClose","onSuccess","validateField","field","value","t","undefined","idStr","String","trim","idRegex","test","msg","nameStr","length","vcpus","Number","isNaN","ram","disk","swap","rxtx","str","ephemeral","cleanFlavorData","flavor","result","name","isValidValue","isValidNumber","id","description","rxtx_factor","Boolean","React","useState","Modal","Form","FormRow","FormSection","TextInput","Message","Spinner","Stack","Checkbox","validateField","cleanFlavorData","useErrorTranslation","CreateFlavorModal","client","isOpen","onClose","project","onSuccess","useLingui","translateError","newFlavor","setNewFlavor","errors","setErrors","isLoading","setIsLoading","generalError","setGeneralError","handleInputChange","e","name","value","type","checked","target","prev","newState","handleNumericInputChange","handleBlur","error","handleSubmit","preventDefault","newErrors","requiredFields","forEach","key","optionalFields","undefined","Object","keys","length","t","flavorData","compute","createFlavor","mutate","project_id","flavor","handleClose","errorMessage","message","dismissError","onCancel","size","title","open","onConfirm","cancelButtonLabel","confirmButtonLabel","distribution","alignment","variant","onDismiss","text","id","label","onChange","onBlur","errortext","required","description","String","vcpus","Number","ram","disk","swap","defaultValue","rxtx_factor","helptext","use","Suspense","useState","startTransition","useEffect","useCallback","useSearch","useNavigate","Message","Button","Stack","Spinner","ListToolbar","FlavorListContainer","CreateFlavorModal","PAGE_SIZE","createFlavorsPromise","client","project","sortBy","sortDirection","searchTerm","compute","getFlavorsByProjectId","query","project_id","createPermissionsPromise","canUser","permission","then","canCreate","canDelete","canManageAccess","FlavorsContent","flavorsPromise","permissionsPromise","onFlavorDeleted","onFlavorCreated","setSearchTerm","sortSettings","handleSortChange","createModalOpen","setCreateModalOpen","currentPage","onPageChange","useLingui","flavors","privateFlavorError","permissions","totalPages","Math","max","ceil","length","safePage","min","paginatedFlavors","slice","isOpen","onClose","onSuccess","className","text","t","variant","onSort","onSearch","actions","label","onClick","isLoading","canDeleteFlavor","canMangageAccess","Flavors","navigate","searchParams","strict","setSortSettings","options","value","search","page","success","setSuccess","setFlavorsPromise","refetchFlavors","handleFlavorDeleted","flavorName","message","timestamp","Date","now","setTimeout","undefined","handleFlavorCreated","newSortSettings","settings","toString","prev","replace","handleSearchChange","term","searchValue","handlePageChange","div","onDismiss","dismissible","fallback","distribution","alignment","direction","size","useLingui","Flavors","ContentHeader","Route","RouteComponent","t","projectId","useParams","trpcClient","useRouteContext","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/-components/FlavorListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/-components/flavorValidation.ts","../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/-components/CreateFlavorModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/List.tsx","../../src/client/routes/_auth/projects/$projectId/compute/flavors/index.tsx?tsr-split=component"],"sourcesContent":["import { Flavor } from \"@/server/Compute/types/flavor\"\nimport {\n DataGrid,\n DataGridHeadCell,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n PopupMenu,\n PopupMenuOptions,\n PopupMenuItem,\n Spinner,\n Stack,\n Pagination,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { DeleteFlavorModal } from \"./DeleteFlavorModal\"\nimport { useState } from \"react\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport { EditSpecModal } from \"./EditSpecModal\"\nimport { ManageAccessModal } from \"./ManageAccessModal\"\nimport { Link, useParams, useNavigate } from \"@tanstack/react-router\"\n\ninterface FlavorListContainerProps {\n flavors?: Flavor[]\n isLoading: boolean\n client: TrpcClient\n project: string\n onFlavorDeleted?: (flavorName: string) => void\n canDeleteFlavor?: boolean\n canMangageAccess?: boolean\n currentPage?: number\n totalPages?: number\n onPageChange?: (page: number) => void\n}\n\nexport const FlavorListContainer = ({\n flavors,\n isLoading,\n client,\n project,\n onFlavorDeleted,\n canDeleteFlavor,\n canMangageAccess,\n currentPage = 1,\n totalPages = 1,\n onPageChange,\n}: FlavorListContainerProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const [deleteModalOpen, setDeleteModalOpen] = useState(false)\n const [specModalOpen, setSpecModalOpen] = useState(false)\n const [accessModalOpen, setAccessModalOpen] = useState(false)\n const [selectedFlavor, setSelectedFlavor] = useState<Flavor | null>(null)\n\n const { projectId } = useParams({\n from: \"/_auth/projects/$projectId/compute/flavors/\",\n })\n\n const openDeleteModal = (flavor: Flavor) => {\n setSelectedFlavor(flavor)\n setDeleteModalOpen(true)\n }\n\n const openSpecModal = (flavor: Flavor) => {\n setSelectedFlavor(flavor)\n setSpecModalOpen(true)\n }\n\n const openAccessModal = (flavor: Flavor) => {\n setSelectedFlavor(flavor)\n setAccessModalOpen(true)\n }\n\n const closeDeleteModal = () => {\n setDeleteModalOpen(false)\n setSelectedFlavor(null)\n }\n\n const handleDeleteSuccess = () => {\n if (selectedFlavor && onFlavorDeleted) {\n onFlavorDeleted(selectedFlavor.name || \"\")\n }\n closeDeleteModal()\n }\n\n if (isLoading) {\n return (\n <div data-testid=\"loading\">\n <div data-testid=\"loading\">\n <DataGridRow>\n <DataGridCell colSpan={3}>\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n <Trans>Loading...</Trans>\n </Stack>\n </DataGridCell>\n </DataGridRow>\n </div>\n </div>\n )\n }\n\n if (!flavors || flavors.length === 0) {\n return (\n <DataGrid columns={7} className=\"flavors\" data-testid=\"no-flavors\">\n <DataGridRow>\n <DataGridCell colSpan={7}>\n <ContentHeading>\n <Trans>No flavors found</Trans>\n </ContentHeading>\n <p>\n <Trans>\n There are no flavors available for this project with the current filters applied. Try adjusting your\n filter criteria or create a new flavor.\n </Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n )\n }\n\n return (\n <>\n <DataGrid columns={6} minContentColumns={[5]} className=\"flavors\" data-testid=\"flavors-table\">\n <DataGridRow>\n <DataGridHeadCell>\n <Trans>Name</Trans>\n </DataGridHeadCell>\n <DataGridHeadCell>\n <Trans>vCPU</Trans>\n </DataGridHeadCell>\n <DataGridHeadCell>\n <Trans>RAM (MiB)</Trans>\n </DataGridHeadCell>\n <DataGridHeadCell>\n <Trans>Root Disk (GiB)</Trans>\n </DataGridHeadCell>\n <DataGridHeadCell>\n <Trans>Swap (MiB)</Trans>\n </DataGridHeadCell>\n <DataGridHeadCell></DataGridHeadCell>\n </DataGridRow>\n\n {flavors.map((flavor) => (\n <DataGridRow\n key={flavor.id}\n data-testid={`flavor-row-${flavor.id}`}\n onClick={() =>\n navigate({\n to: \"/projects/$projectId/compute/flavors/$flavorId\",\n params: { projectId, flavorId: flavor.id },\n })\n }\n >\n <DataGridCell>{flavor.name || flavor.id}</DataGridCell>\n <DataGridCell>{flavor.vcpus || \"–\"}</DataGridCell>\n <DataGridCell>{flavor.ram || \"–\"}</DataGridCell>\n <DataGridCell>{flavor.disk || \"–\"}</DataGridCell>\n <DataGridCell>{flavor.swap || \"–\"}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()}>\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem>\n <Link\n to=\"/projects/$projectId/compute/flavors/$flavorId\"\n params={{ projectId: projectId, flavorId: flavor.id }}\n className=\"text-theme-default\"\n >\n {t`Details`}\n </Link>\n </PopupMenuItem>\n <PopupMenuItem label={t`Metadata`} onClick={() => openSpecModal(flavor)} />\n\n {canMangageAccess && (\n <PopupMenuItem label={t`Manage Access`} onClick={() => openAccessModal(flavor)} />\n )}\n {canDeleteFlavor && (\n <PopupMenuItem label={t`Delete Flavor`} onClick={() => openDeleteModal(flavor)} />\n )}\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n ))}\n </DataGrid>\n {totalPages > 1 && (\n <div className=\"flex justify-center py-4\">\n <Pagination\n variant=\"input\"\n currentPage={currentPage}\n pages={totalPages}\n onPressPrevious={() => onPageChange?.(Math.max(currentPage - 1, 1))}\n onPressNext={() => onPageChange?.(Math.min(currentPage + 1, totalPages))}\n onSelectChange={(page) => onPageChange?.(page)}\n />\n </div>\n )}\n <DeleteFlavorModal\n client={client}\n isOpen={deleteModalOpen}\n onClose={closeDeleteModal}\n project={project}\n flavor={selectedFlavor}\n onSuccess={handleDeleteSuccess}\n />\n <EditSpecModal\n client={client}\n isOpen={specModalOpen}\n onClose={() => setSpecModalOpen(false)}\n project={project}\n flavor={selectedFlavor}\n />\n\n <ManageAccessModal\n client={client}\n isOpen={accessModalOpen}\n onClose={() => setAccessModalOpen(false)}\n project={project}\n flavor={selectedFlavor}\n />\n </>\n )\n}\n","import { msg } from \"@lingui/core/macro\"\nimport { MessageDescriptor } from \"@lingui/core\"\nimport { Flavor } from \"@/server/Compute/types/flavor\"\n\nexport const validateField = (\n field: FlavorFormField,\n value: string | number | boolean | null | undefined,\n t: (descriptor: MessageDescriptor) => string\n): string | undefined => {\n switch (field) {\n case \"id\":\n if (!value) return undefined\n {\n const idStr = String(value).trim()\n const idRegex = /^[a-zA-Z0-9.\\-_]*$/\n return idRegex.test(idStr)\n ? undefined\n : t(msg`ID must only contain alphanumeric characters, hyphens, underscores, and dots.`)\n }\n\n case \"name\": {\n const nameStr = String(value || \"\").trim()\n return nameStr.length >= 2 && nameStr.length <= 50 ? undefined : t(msg`Name must be 2-50 characters long.`)\n }\n\n case \"vcpus\": {\n const vcpus = Number(value)\n return !isNaN(vcpus) && vcpus >= 1 ? undefined : t(msg`VCPUs must be an integer ≥ 1.`)\n }\n\n case \"ram\": {\n const ram = Number(value)\n return !isNaN(ram) && ram >= 128 ? undefined : t(msg`RAM must be an integer ≥ 128 MB.`)\n }\n\n case \"disk\": {\n const disk = Number(value)\n return !isNaN(disk) && disk >= 0 ? undefined : t(msg`Root Disk must be an integer ≥ 0.`)\n }\n\n case \"swap\":\n if (value === \"\" || value === undefined || value === null) return undefined\n {\n const swap = Number(value)\n return !isNaN(swap) && swap >= 0 ? undefined : t(msg`Swap Disk must be an integer ≥ 0.`)\n }\n\n case \"rxtx_factor\": {\n const rxtx = Number(value)\n return !isNaN(rxtx) && rxtx >= 1 ? undefined : t(msg`RX/TX Factor must be an integer ≥ 1.`)\n }\n\n case \"description\":\n if (!value) return undefined\n {\n const str = String(value)\n return str.length < 65535 ? undefined : t(msg`Description must be less than 65535 characters.`)\n }\n\n case \"OS-FLV-EXT-DATA:ephemeral\": {\n const ephemeral = Number(value)\n return !isNaN(ephemeral) && ephemeral >= 0 ? undefined : t(msg`Ephemeral Disk must be an integer ≥ 0.`)\n }\n\n case \"os-flavor-access:is_public\": {\n if (value === undefined || value === null) {\n return undefined\n }\n if (typeof value === \"boolean\") {\n return undefined\n }\n if (typeof value === \"string\" && (value === \"true\" || value === \"false\")) {\n return undefined\n }\n return t(msg`Invalid value for public flavor setting.`)\n }\n\n default:\n return undefined\n }\n}\n\nexport type FlavorFormField =\n | \"id\"\n | \"name\"\n | \"vcpus\"\n | \"ram\"\n | \"disk\"\n | \"swap\"\n | \"description\"\n | \"rxtx_factor\"\n | \"OS-FLV-EXT-DATA:ephemeral\"\n | \"os-flavor-access:is_public\"\n\nexport interface FieldErrors {\n id?: string\n name?: string\n vcpus?: string\n ram?: string\n disk?: string\n swap?: string\n rxtx_factor?: string\n description?: string\n \"OS-FLV-EXT-DATA:ephemeral\"?: string\n \"os-flavor-access:is_public\"?: string\n}\n\nexport const cleanFlavorData = (flavor: Partial<Flavor>) => {\n const result: {\n name: string\n vcpus: number\n ram: number\n disk: number\n \"OS-FLV-EXT-DATA:ephemeral\"?: number\n id?: string\n swap?: number\n rxtx_factor?: number\n description?: string\n \"os-flavor-access:is_public\"?: boolean\n } = {\n name: String(flavor.name),\n vcpus: Number(flavor.vcpus),\n ram: Number(flavor.ram),\n disk: Number(flavor.disk),\n }\n\n const isValidValue = (value: string | undefined | null) => {\n return value !== undefined && value !== null && value !== \"\" && String(value).trim() !== \"\"\n }\n\n const isValidNumber = (value: string | number | undefined | null) => {\n return value !== undefined && value !== null && value !== \"\" && String(value).trim() !== \"\" && !isNaN(Number(value))\n }\n\n if (isValidValue(flavor.id)) {\n result.id = String(flavor.id).trim()\n }\n\n if (isValidValue(flavor.description)) {\n result.description = String(flavor.description).trim()\n }\n\n if (isValidNumber(flavor.swap)) {\n result.swap = Number(flavor.swap)\n }\n\n if (isValidNumber(flavor.rxtx_factor)) {\n result.rxtx_factor = Number(flavor.rxtx_factor)\n }\n\n if (isValidNumber(flavor[\"OS-FLV-EXT-DATA:ephemeral\"])) {\n result[\"OS-FLV-EXT-DATA:ephemeral\"] = Number(flavor[\"OS-FLV-EXT-DATA:ephemeral\"])\n }\n\n if (flavor[\"os-flavor-access:is_public\"] !== undefined) {\n result[\"os-flavor-access:is_public\"] = Boolean(flavor[\"os-flavor-access:is_public\"])\n }\n\n return result\n}\n","import React, { useState } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport {\n Modal,\n Form,\n FormRow,\n FormSection,\n TextInput,\n Message,\n Spinner,\n Stack,\n Checkbox,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Flavor } from \"@/server/Compute/types/flavor\"\nimport { validateField, FlavorFormField, FieldErrors } from \"./flavorValidation\"\nimport { cleanFlavorData } from \"./flavorValidation\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\n\ninterface CreateFlavorModalProps {\n client: TrpcClient\n isOpen: boolean\n onClose: () => void\n project: string\n onSuccess: (name: string) => void\n}\n\nexport const CreateFlavorModal: React.FC<CreateFlavorModalProps> = ({\n client,\n isOpen,\n onClose,\n project,\n onSuccess,\n}) => {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n const [newFlavor, setNewFlavor] = useState<Partial<Flavor>>({\n \"os-flavor-access:is_public\": true,\n })\n const [errors, setErrors] = useState<FieldErrors>({})\n const [isLoading, setIsLoading] = useState(false)\n const [generalError, setGeneralError] = useState<string | null>(null)\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { name, value, type, checked } = e.target\n\n setNewFlavor((prev) => {\n const newState = {\n ...prev,\n [name]: type === \"checkbox\" ? checked : value,\n }\n\n return newState\n })\n if (generalError) setGeneralError(null)\n }\n\n const handleNumericInputChange = (name: FlavorFormField, value: number | undefined) => {\n setNewFlavor((prev) => ({\n ...prev,\n [name]: value,\n }))\n if (generalError) setGeneralError(null)\n }\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const { name, value } = e.target\n const error = validateField(name as FlavorFormField, value, t)\n setErrors((prev) => ({\n ...prev,\n [name]: error,\n }))\n }\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n setGeneralError(null)\n\n const newErrors: FieldErrors = {}\n\n const requiredFields: FlavorFormField[] = [\"name\", \"vcpus\", \"ram\", \"disk\"]\n requiredFields.forEach((key) => {\n const error = validateField(key, newFlavor[key], t)\n if (error) {\n newErrors[key] = error\n }\n })\n\n const optionalFields: FlavorFormField[] = [\n \"id\",\n \"swap\",\n \"OS-FLV-EXT-DATA:ephemeral\",\n \"rxtx_factor\",\n \"description\",\n \"os-flavor-access:is_public\",\n ]\n optionalFields.forEach((key) => {\n const value = newFlavor[key]\n\n if (value !== undefined && value !== \"\" && value !== null) {\n const error = validateField(key, value, t)\n if (error) {\n newErrors[key] = error\n }\n }\n })\n\n if (Object.keys(newErrors).length > 0) {\n setErrors(newErrors)\n setGeneralError(t`Please fix the validation errors below.`)\n return\n }\n\n try {\n setIsLoading(true)\n\n const flavorData = cleanFlavorData(newFlavor)\n\n await client.compute.createFlavor.mutate({\n project_id: project,\n flavor: flavorData,\n })\n\n onSuccess(flavorData.name)\n handleClose()\n } catch (error) {\n const errorMessage = (error as Error)?.message\n ? translateError((error as Error).message)\n : t`Failed to create flavor. Please try again.`\n setGeneralError(errorMessage)\n } finally {\n setIsLoading(false)\n }\n }\n\n const handleClose = () => {\n setNewFlavor({\n \"os-flavor-access:is_public\": true,\n })\n setErrors({})\n setGeneralError(null)\n onClose()\n }\n\n const dismissError = () => {\n setGeneralError(null)\n }\n\n return (\n <Modal\n onCancel={handleClose}\n size=\"large\"\n title={t`Create Flavor`}\n open={isOpen}\n onConfirm={handleSubmit}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Create New Flavor`}\n >\n {isLoading && (\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n )}\n {!isLoading && (\n <Form>\n {generalError && (\n <FormRow>\n <Message onDismiss={dismissError} text={generalError} variant=\"error\" />\n </FormRow>\n )}\n\n <FormSection>\n <FormRow>\n <TextInput\n id=\"id\"\n name=\"id\"\n label={t`Flavor ID`}\n value={newFlavor.id || \"\"}\n onChange={handleInputChange}\n onBlur={handleBlur}\n errortext={errors.id}\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"name\"\n name=\"name\"\n label={t`Flavor Name`}\n value={newFlavor.name || \"\"}\n onChange={handleInputChange}\n onBlur={handleBlur}\n errortext={errors.name}\n required\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"description\"\n name=\"description\"\n label={t`Description`}\n value={newFlavor.description || \"\"}\n onChange={handleInputChange}\n onBlur={handleBlur}\n errortext={errors.description}\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"vcpus\"\n name=\"vcpus\"\n label={t`VCPUs`}\n value={String(newFlavor.vcpus || \"\")}\n onChange={(e) => handleNumericInputChange(\"vcpus\", Number(e.target.value))}\n onBlur={handleBlur}\n errortext={errors.vcpus}\n type=\"number\"\n required\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"ram\"\n name=\"ram\"\n label={t`RAM (MiB)`}\n value={String(newFlavor.ram || \"\")}\n onChange={(e) => handleNumericInputChange(\"ram\", Number(e.target.value))}\n onBlur={handleBlur}\n errortext={errors.ram}\n type=\"number\"\n required\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"disk\"\n name=\"disk\"\n label={t`Disk (GiB)`}\n value={String(newFlavor.disk || \"\")}\n onChange={(e) => handleNumericInputChange(\"disk\", Number(e.target.value))}\n onBlur={handleBlur}\n errortext={errors.disk}\n type=\"number\"\n required\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"OS-FLV-EXT-DATA:ephemeral\"\n name=\"OS-FLV-EXT-DATA:ephemeral\"\n label={t`Ephemeral Disk (GiB)`}\n value={String(newFlavor[\"OS-FLV-EXT-DATA:ephemeral\"] || \"\")}\n onChange={(e) => handleNumericInputChange(\"OS-FLV-EXT-DATA:ephemeral\", Number(e.target.value))}\n onBlur={handleBlur}\n errortext={errors[\"OS-FLV-EXT-DATA:ephemeral\"]}\n type=\"number\"\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"swap\"\n name=\"swap\"\n label={t`Swap (MiB)`}\n value={String(newFlavor.swap || \"\")}\n onChange={(e) => handleNumericInputChange(\"swap\", e.target.value ? Number(e.target.value) : undefined)}\n onBlur={handleBlur}\n errortext={errors.swap}\n type=\"number\"\n />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"rxtx_factor\"\n name=\"rxtx_factor\"\n label={t`RX/TX Factor`}\n defaultValue={1}\n value={String(newFlavor.rxtx_factor || \"\")}\n onChange={(e) => handleNumericInputChange(\"rxtx_factor\", Number(e.target.value))}\n onBlur={handleBlur}\n errortext={errors.rxtx_factor}\n type=\"number\"\n />\n </FormRow>\n <FormRow>\n <Checkbox\n name=\"os-flavor-access:is_public\"\n label={t`Public Flavor`}\n helptext={t`If checked, this flavor will be available to all tenants. If unchecked, access must be explicitly granted to specific tenants.`}\n checked={!!newFlavor[\"os-flavor-access:is_public\"]}\n onChange={handleInputChange}\n />\n </FormRow>\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { use, Suspense, useState, startTransition, useEffect, useCallback } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { useSearch, useNavigate } from \"@tanstack/react-router\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport { Flavor } from \"@/server/Compute/types/flavor\"\nimport { Message, Button, Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\nimport { ListToolbar } from \"@/client/components/ListToolbar\"\nimport { SortSettings } from \"@/client/components/ListToolbar/types\"\nimport { FlavorListContainer } from \"./-components/FlavorListContainer\"\nimport { CreateFlavorModal } from \"./-components/CreateFlavorModal\"\nimport type { FlavorsSearchParams } from \"@/client/routes/_auth/projects/$projectId/compute/flavors\"\n\nconst PAGE_SIZE = 50\n\ninterface FlavorsProps {\n client: TrpcClient\n project: string\n}\n\ntype RequiredSortSettings = {\n options: SortSettings[\"options\"]\n sortBy: string\n sortDirection: \"asc\" | \"desc\"\n}\n\nconst createFlavorsPromise = (\n client: TrpcClient,\n project: string,\n sortBy: string,\n sortDirection: string,\n searchTerm: string\n) => {\n return client.compute.getFlavorsByProjectId.query({\n project_id: project,\n sortBy,\n sortDirection,\n searchTerm,\n })\n}\n\nconst createPermissionsPromise = (client: TrpcClient, project: string) => {\n return client.compute.canUser\n .query({\n project_id: project,\n permission: [\"flavors:create\", \"flavors:delete\", \"flavors:list_projects\"],\n })\n .then(([canCreate, canDelete, canManageAccess]) => ({ canCreate, canDelete, canManageAccess }))\n}\n\nfunction FlavorsContent({\n flavorsPromise,\n permissionsPromise,\n client,\n project,\n onFlavorDeleted,\n onFlavorCreated,\n searchTerm,\n setSearchTerm,\n sortSettings,\n handleSortChange,\n createModalOpen,\n setCreateModalOpen,\n currentPage,\n onPageChange,\n}: {\n flavorsPromise: Promise<{ flavors: Flavor[]; privateFlavorError?: string }>\n permissionsPromise: Promise<{ canCreate: boolean; canDelete: boolean; canManageAccess: boolean }>\n client: TrpcClient\n project: string\n onFlavorDeleted: (name: string) => void\n onFlavorCreated: (name: string) => void\n searchTerm: string\n setSearchTerm: (term: string) => void\n sortSettings: SortSettings\n handleSortChange: (settings: SortSettings) => void\n createModalOpen: boolean\n setCreateModalOpen: (open: boolean) => void\n currentPage: number\n onPageChange: (page: number) => void\n}) {\n const { t } = useLingui()\n const { flavors, privateFlavorError } = use(flavorsPromise)\n const permissions = use(permissionsPromise)\n\n const totalPages = Math.max(1, Math.ceil(flavors.length / PAGE_SIZE))\n const safePage = Math.min(currentPage, totalPages)\n const paginatedFlavors = flavors.slice((safePage - 1) * PAGE_SIZE, safePage * PAGE_SIZE)\n\n useEffect(() => {\n if (currentPage > totalPages) onPageChange(1)\n }, [totalPages, currentPage, onPageChange])\n\n return (\n <>\n <CreateFlavorModal\n client={client}\n isOpen={createModalOpen}\n project={project}\n onClose={() => setCreateModalOpen(false)}\n onSuccess={onFlavorCreated}\n />\n\n {privateFlavorError && (\n <Message\n className=\"mb-4\"\n text={t`Private flavors could not be loaded. You may be seeing an incomplete list.`}\n variant=\"warning\"\n />\n )}\n\n <ListToolbar\n sortSettings={sortSettings}\n searchTerm={searchTerm}\n onSort={handleSortChange}\n onSearch={setSearchTerm}\n actions={\n permissions.canCreate ? (\n <Button variant=\"primary\" label={t`Create Flavor`} onClick={() => setCreateModalOpen(true)} />\n ) : null\n }\n />\n\n <FlavorListContainer\n flavors={paginatedFlavors}\n isLoading={false}\n client={client}\n project={project}\n onFlavorDeleted={onFlavorDeleted}\n canDeleteFlavor={permissions.canDelete}\n canMangageAccess={permissions.canManageAccess}\n currentPage={safePage}\n totalPages={totalPages}\n onPageChange={onPageChange}\n />\n </>\n )\n}\nexport const Flavors = ({ client, project }: FlavorsProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const searchParams = useSearch({ strict: false }) as FlavorsSearchParams\n\n const [sortSettings, setSortSettings] = useState<RequiredSortSettings>({\n options: [\n { label: t`Name`, value: \"name\" },\n { label: t`VCPUs`, value: \"vcpus\" },\n { label: t`RAM`, value: \"ram\" },\n { label: t`Root Disk`, value: \"disk\" },\n { label: t`Swap`, value: \"swap\" },\n ],\n sortBy: searchParams.sortBy || \"name\",\n sortDirection: searchParams.sortDirection || \"asc\",\n })\n\n const [searchTerm, setSearchTerm] = useState(searchParams.search || \"\")\n const currentPage = searchParams.page ?? 1\n const [success, setSuccess] = useState<{ message: string; timestamp: number } | undefined>()\n const [createModalOpen, setCreateModalOpen] = useState(false)\n\n const [flavorsPromise, setFlavorsPromise] = useState(() =>\n createFlavorsPromise(client, project, sortSettings.sortBy, sortSettings.sortDirection, searchTerm)\n )\n const [permissionsPromise] = useState(() => createPermissionsPromise(client, project))\n\n const refetchFlavors = () => {\n startTransition(() => {\n setFlavorsPromise(\n createFlavorsPromise(client, project, sortSettings.sortBy, sortSettings.sortDirection, searchTerm)\n )\n })\n }\n\n const handleFlavorDeleted = (flavorName: string) => {\n setSuccess({\n message: t`Flavor \"${flavorName}\" has been successfully deleted.`,\n timestamp: Date.now(),\n })\n setTimeout(() => setSuccess(undefined), 5000)\n refetchFlavors()\n }\n\n const handleFlavorCreated = (flavorName: string) => {\n setSuccess({\n message: t`Flavor \"${flavorName}\" has been successfully created.`,\n timestamp: Date.now(),\n })\n setTimeout(() => setSuccess(undefined), 5000)\n refetchFlavors()\n }\n\n const handleSortChange = (newSortSettings: SortSettings) => {\n const settings: RequiredSortSettings = {\n options: newSortSettings.options,\n sortBy: newSortSettings.sortBy?.toString() || \"name\",\n sortDirection: newSortSettings.sortDirection || \"asc\",\n }\n\n setSortSettings(settings)\n navigate({\n search: ((prev: FlavorsSearchParams) => ({\n ...prev,\n sortBy: settings.sortBy,\n sortDirection: settings.sortDirection,\n page: undefined,\n })) as unknown as true,\n replace: true,\n })\n startTransition(() => {\n setFlavorsPromise(createFlavorsPromise(client, project, settings.sortBy, settings.sortDirection, searchTerm))\n })\n }\n\n const handleSearchChange = (term: string | number | string[] | undefined) => {\n const searchValue = typeof term === \"string\" ? term : \"\"\n setSearchTerm(searchValue)\n\n navigate({\n search: ((prev: FlavorsSearchParams) => ({\n ...prev,\n search: searchValue || undefined,\n page: undefined,\n })) as unknown as true,\n replace: true,\n })\n startTransition(() => {\n setFlavorsPromise(\n createFlavorsPromise(client, project, sortSettings.sortBy, sortSettings.sortDirection, searchValue)\n )\n })\n }\n\n const handlePageChange = useCallback(\n (page: number) => {\n navigate({\n search: ((prev: FlavorsSearchParams) => ({\n ...prev,\n page: page === 1 ? undefined : page,\n })) as unknown as true,\n })\n },\n [navigate]\n )\n\n return (\n <div className=\"relative\">\n {success && (\n <Message\n className=\"absolute -top-14 right-0 left-0 z-50\"\n text={success.message}\n variant=\"info\"\n onDismiss={() => setSuccess(undefined)}\n dismissible\n />\n )}\n\n <Suspense\n fallback={\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Flavors...</Trans>\n </Stack>\n }\n >\n <FlavorsContent\n flavorsPromise={flavorsPromise}\n permissionsPromise={permissionsPromise}\n client={client}\n project={project}\n onFlavorDeleted={handleFlavorDeleted}\n onFlavorCreated={handleFlavorCreated}\n searchTerm={searchTerm}\n setSearchTerm={handleSearchChange}\n sortSettings={sortSettings}\n handleSortChange={handleSortChange}\n createModalOpen={createModalOpen}\n setCreateModalOpen={setCreateModalOpen}\n currentPage={currentPage}\n onPageChange={handlePageChange}\n />\n </Suspense>\n </div>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { Flavors } from \"../-components/Flavors/List\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/flavors/\")({\n staticData: {\n section: \"compute\",\n service: \"flavors\",\n sectionCrumb: { labelKey: \"Compute\" },\n crumb: { labelKey: \"Flavors\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Flavors` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n const { trpcClient } = Route.useRouteContext()\n return (\n <>\n <ContentHeader title={t`Flavors`} projectId={projectId} />\n <Flavors project={projectId} client={trpcClient!} />\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;AAoCA,IAAakB,KAAuB,EAClCC,YACAC,cACAC,WACAC,YACAC,oBACAC,oBACAC,qBACAC,iBAAc,GACdC,gBAAa,GACbC,sBACyB;CACzB,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,GAAAA,EACRC,IAAWb,GAAAA,EACX,CAACc,GAAiBC,KAAsBpB,EAAS,GAAA,EACjD,CAACqB,GAAeC,KAAoBtB,EAAS,GAAA,EAC7C,CAACuB,GAAiBC,KAAsBxB,EAAS,GAAA,EACjD,CAACyB,GAAgBC,KAAqB1B,EAAwB,KAAA,EAE9D,EAAE2B,iBAAcvB,EAAU,EAC9BwB,MAAM,+CACR,CAAA,EAEMC,KAAmBC,MAAAA;AAEvBV,EADAM,EAAkBI,EAAAA,EAClBV,EAAmB,GAAA;IAGfW,KAAiBD,MAAAA;AAErBR,EADAI,EAAkBI,EAAAA,EAClBR,EAAiB,GAAA;IAGbU,KAAmBF,MAAAA;AAEvBN,EADAE,EAAkBI,EAAAA,EAClBN,EAAmB,GAAA;IAGfS,UAAmB;AAEvBP,EADAN,EAAmB,GAAA,EACnBM,EAAkB,KAAA;;AA+CpB,QArCIlB,IAEA,kBAAC4B,OAAAA;EAAIC,eAAY;YACf,kBAACD,OAAAA;GAAIC,eAAY;aACf,kBAAC/C,GAAAA,EAAAA,UACC,kBAACC,GAAAA;IAAa+C,SAAS;cACrB,kBAACzC,GAAAA;KAAM0C,cAAa;KAASC,WAAU;gBACrC,kBAAC5C,GAAAA,EAAQ6C,SAAQ,WAAA,CAAA,EACjB,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,CAAA;;;;MASV,CAAClC,KAAWA,EAAQmC,WAAW,IAE/B,kBAACtD,GAAAA;EAASuD,SAAS;EAAGC,WAAU;EAAUP,eAAY;YACpD,kBAAC/C,GAAAA,EAAAA,UACC,kBAACC,GAAAA;GAAa+C,SAAS;cACrB,kBAAC9C,GAAAA,EAAAA,UACC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA,EAEF,kBAACqD,KAAAA,EAAAA,UACC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA,CAAA;;MAYV,kBAAA,GAAA,EAAA,UAAA;EACE,kBAACzD,GAAAA;GAASuD,SAAS;GAAGG,mBAAmB,CAAC,EAAE;GAAEF,WAAU;GAAUP,eAAY;cAC5E,kBAAC/C,GAAAA,EAAAA,UAAAA;IACC,kBAACD,GAAAA,EAAAA,UACC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA;IAEF,kBAACA,GAAAA,EAAAA,UACC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA;IAEF,kBAACA,GAAAA,EAAAA,UACC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA;IAEF,kBAACA,GAAAA,EAAAA,UACC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA;IAEF,kBAACA,GAAAA,EAAAA,UACC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA;IAEF,kBAACA,GAAAA,EAAAA,CAAAA;SAGFkB,EAAQwC,KAAKjB,MACZ,kBAACxC,GAAAA;IAEC+C,eAAa,cAAcP,EAAOkB;IAClCC,eACE/B,EAAS;KACPgC,IAAI;KACJC,QAAQ;MAAExB;MAAWyB,UAAUtB,EAAOkB;MAAG;KAC3C,CAAA;;KAGF,kBAACzD,GAAAA,EAAAA,UAAcuC,EAAOK,QAAQL,EAAOkB,IAAAA,CAAAA;KACrC,kBAACzD,GAAAA,EAAAA,UAAcuC,EAAOuB,SAAS,KAAA,CAAA;KAC/B,kBAAC9D,GAAAA,EAAAA,UAAcuC,EAAOwB,OAAO,KAAA,CAAA;KAC7B,kBAAC/D,GAAAA,EAAAA,UAAcuC,EAAOyB,QAAQ,KAAA,CAAA;KAC9B,kBAAChE,GAAAA,EAAAA,UAAcuC,EAAO0B,QAAQ,KAAA,CAAA;KAC9B,kBAACjE,GAAAA;MAAa0D,UAAUQ,MAAMA,EAAEC,iBAAe;gBAC7C,kBAACjE,GAAAA,EAAAA,UACC,kBAACC,GAAAA,EAAAA,UAAAA;OACC,kBAACC,GAAAA,EAAAA,UACC,kBAACQ,GAAAA;QACC+C,IAAG;QACHC,QAAQ;SAAaxB;SAAWyB,UAAUtB,EAAOkB;SAAG;QACpDJ,WAAU;kBAETe,EAAAA,EAAC,EAAA,IAAA,UAAQ,CAAA;;OAGd,kBAAChE,GAAAA;QAAciE,OAAOD,EAAAA,EAAC,EAAA,IAAA,UAAS,CAAA;QAAGV,eAAelB,EAAcD,EAAAA;;OAE/DjB,KACC,kBAAClB,GAAAA;QAAciE,OAAOD,EAAAA,EAAC,EAAA,IAAA,UAAc,CAAA;QAAGV,eAAejB,EAAgBF,EAAAA;;OAExElB,KACC,kBAACjB,GAAAA;QAAciE,OAAOD,EAAAA,EAAC,EAAA,IAAA,UAAc,CAAA;QAAGV,eAAepB,EAAgBC,EAAAA;;;;;MAhC1EA,EAAOkB,GAAE,CAAA,CAAA;;EAwCnBjC,IAAa,KACZ,kBAACqB,OAAAA;GAAIQ,WAAU;aACb,kBAAC9C,GAAAA;IACC2C,SAAQ;IACK3B;IACb+C,OAAO9C;IACP+C,uBAAuB9C,IAAe+C,KAAKC,IAAIlD,IAAc,GAAG,EAAA,CAAA;IAChEmD,mBAAmBjD,IAAe+C,KAAKG,IAAIpD,IAAc,GAAGC,EAAAA,CAAAA;IAC5DoD,iBAAiBC,MAASpD,IAAeoD,EAAAA;;;EAI/C,kBAACrE,GAAAA;GACSU;GACR4D,QAAQlD;GACRmD,SAASrC;GACAvB;GACToB,QAAQL;GACR8C,iBA9HsB;AAI1BtC,IAHIR,KAAkBd,KACpBA,EAAgBc,EAAeU,QAAQ,GAAA,EAEzCF,GAAAA;;;EA4HE,kBAAChC,GAAAA;GACSQ;GACR4D,QAAQhD;GACRiD,eAAehD,EAAiB,GAAA;GACvBZ;GACToB,QAAQL;;EAGV,kBAACvB,GAAAA;GACSO;GACR4D,QAAQ9C;GACR+C,eAAe9C,EAAmB,GAAA;GACzBd;GACToB,QAAQL;;;GCxNH+C,KACXC,GACAC,GACAC,MAAAA;AAEA,SAAQF,GAAR;EACE,KAAK;AACH,OAAI,CAACC,EAAO;GACZ;IACE,IAAMG,IAAQC,OAAOJ,EAAAA,CAAOK,MAAI;AAEhC,WADgB,qBACDE,KAAKJ,EAAAA,GAChBD,KAAAA,IACAD,EAAEO,EAAAA,IAAAA,UAAiF,CAAA;;EAG3F,KAAK,QAAQ;GACX,IAAMC,IAAUL,OAAOJ,KAAS,GAAA,CAAIK,MAAI;AACxC,UAAOI,EAAQC,UAAU,KAAKD,EAAQC,UAAU,KAAKR,KAAAA,IAAYD,EAAEO,EAAAA,IAAAA,UAAsC,CAAA;;EAG3G,KAAK,SAAS;GACZ,IAAMG,IAAQC,OAAOZ,EAAAA;AACrB,UAAO,CAACa,MAAMF,EAAAA,IAAUA,KAAS,IAAIT,KAAAA,IAAYD,EAAEO,EAAAA,IAAAA,UAAiC,CAAA;;EAGtF,KAAK,OAAO;GACV,IAAMM,IAAMF,OAAOZ,EAAAA;AACnB,UAAO,CAACa,MAAMC,EAAAA,IAAQA,KAAO,MAAMZ,KAAAA,IAAYD,EAAEO,EAAAA,IAAAA,UAAoC,CAAA;;EAGvF,KAAK,QAAQ;GACX,IAAMO,IAAOH,OAAOZ,EAAAA;AACpB,UAAO,CAACa,MAAME,EAAAA,IAASA,KAAQ,IAAIb,KAAAA,IAAYD,EAAEO,EAAAA,IAAAA,UAAqC,CAAA;;EAGxF,KAAK;AACH,OAAIR,MAAU,MAAMA,KAAiC,KAAM;GAC3D;IACE,IAAMgB,IAAOJ,OAAOZ,EAAAA;AACpB,WAAO,CAACa,MAAMG,EAAAA,IAASA,KAAQ,IAAId,KAAAA,IAAYD,EAAEO,EAAAA,IAAAA,UAAqC,CAAA;;EAG1F,KAAK,eAAe;GAClB,IAAMS,IAAOL,OAAOZ,EAAAA;AACpB,UAAO,CAACa,MAAMI,EAAAA,IAASA,KAAQ,IAAIf,KAAAA,IAAYD,EAAEO,EAAAA,IAAAA,UAAwC,CAAA;;EAG3F,KAAK,cAID,QAHGR,IAESI,OAAOJ,EAAAA,CACRU,SAAS,QAAQR,KAAAA,IAAYD,EAAEO,EAAAA,IAAAA,UAAmD,CAAA,GAHnF;EAMd,KAAK,6BAA6B;GAChC,IAAMW,IAAYP,OAAOZ,EAAAA;AACzB,UAAO,CAACa,MAAMM,EAAAA,IAAcA,KAAa,IAAIjB,KAAAA,IAAYD,EAAEO,EAAAA,IAAAA,UAA0C,CAAA;;EAGvG,KAAK,6BAUH,QATIR,KAAiC,QAGjC,OAAOA,KAAU,aAGjB,OAAOA,KAAU,aAAaA,MAAU,UAAUA,MAAU,WAC9D,SAEKC,EAAEO,EAAAA,IAAAA,UAA4C,CAAA;EAGvD,QACE;;GA6BOY,KAAmBC,MAAAA;CAC9B,IAAMC,IAWF;EACFC,MAAMnB,OAAOiB,EAAOE,KAAI;EACxBZ,OAAOC,OAAOS,EAAOV,MAAK;EAC1BG,KAAKF,OAAOS,EAAOP,IAAG;EACtBC,MAAMH,OAAOS,EAAON,KAAI;EAC1B,EAEMS,KAAgBxB,MACbA,KAAiC,QAAQA,MAAU,MAAMI,OAAOJ,EAAAA,CAAOK,MAAI,KAAO,IAGrFoB,KAAiBzB,MACdA,KAAiC,QAAQA,MAAU,MAAMI,OAAOJ,EAAAA,CAAOK,MAAI,KAAO,MAAM,CAACQ,MAAMD,OAAOZ,EAAAA,CAAAA;AA2B/G,QAxBIwB,EAAaH,EAAOK,GAAE,KACxBJ,EAAOI,KAAKtB,OAAOiB,EAAOK,GAAE,CAAErB,MAAI,GAGhCmB,EAAaH,EAAOM,YAAW,KACjCL,EAAOK,cAAcvB,OAAOiB,EAAOM,YAAW,CAAEtB,MAAI,GAGlDoB,EAAcJ,EAAOL,KAAI,KAC3BM,EAAON,OAAOJ,OAAOS,EAAOL,KAAI,GAG9BS,EAAcJ,EAAOO,YAAW,KAClCN,EAAOM,cAAchB,OAAOS,EAAOO,YAAW,GAG5CH,EAAcJ,EAAO,6BAA4B,KACnDC,EAAO,+BAA+BV,OAAOS,EAAO,6BAA4B,GAG9EA,EAAO,kCAAkCnB,KAAAA,MAC3CoB,EAAO,gCAAgCO,EAAQR,EAAO,gCAGjDC;GCnIIsB,KAAuD,EAClEC,WACAC,WACAC,YACAC,YACAC,mBACD;CACC,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,GAAAA,EACR,EAAEC,sBAAmBR,GAAAA,EACrB,CAACS,GAAWC,KAAgBtB,EAA0B,EAC1D,8BAA8B,IAChC,CAAA,EACM,CAACuB,GAAQC,KAAaxB,EAAsB,EAAC,CAAA,EAC7C,CAACyB,GAAWC,KAAgB1B,EAAS,GAAA,EACrC,CAAC2B,GAAcC,KAAmB5B,EAAwB,KAAA,EAE1D6B,KAAqBC,MAAAA;EACzB,IAAM,EAAEC,SAAMC,UAAOC,SAAMC,eAAYJ,EAAEK;AAUzC,EARAb,GAAcc,OACK;GACf,GAAGA;IACFL,IAAOE,MAAS,aAAaC,IAAUF;GAC1C,EAGF,EACIL,KAAcC,EAAgB,KAAA;IAG9BU,KAA4BP,GAAuBC,MAAAA;AAKvD,EAJAV,GAAcc,OAAU;GACtB,GAAGA;IACFL,IAAOC;GACV,EAAA,EACIL,KAAcC,EAAgB,KAAA;IAG9BW,KAAcT,MAAAA;EAClB,IAAM,EAAEC,SAAMC,aAAUF,EAAEK,QACpBK,IAAQ9B,EAAcqB,GAAyBC,GAAAA,EAAAA;AACrDR,KAAWY,OAAU;GACnB,GAAGA;IACFL,IAAOS;GACV,EAAA;IAGIC,IAAe,OAAOX,MAAAA;AAE1BF,EADAE,EAAEY,gBAAc,EAChBd,EAAgB,KAAA;EAEhB,IAAMe,IAAyB,EAAC;AA6BhC,MA3B0C;GAAC;GAAQ;GAAS;GAAO;GAAO,CAC3DE,SAASC,MAAAA;GACtB,IAAMN,IAAQ9B,EAAcoC,GAAKzB,EAAUyB,IAAI,EAAA;AAC/C,GAAIN,MACFG,EAAUG,KAAON;IAErB,EAE0C;GACxC;GACA;GACA;GACA;GACA;GACA;GACD,CACcK,SAASC,MAAAA;GACtB,IAAMd,IAAQX,EAAUyB;AAExB,OAAId,MAAUgB,KAAAA,KAAahB,MAAU,MAAMA,MAAU,MAAM;IACzD,IAAMQ,IAAQ9B,EAAcoC,GAAKd,GAAAA,EAAAA;AACjC,IAAIQ,MACFG,EAAUG,KAAON;;IAGvB,EAEIS,OAAOC,KAAKP,EAAAA,CAAWQ,SAAS,GAAG;AAErCvB,GADAJ,EAAUmB,EAAAA,EACVf,EAAgBwB,EAAAA,EAAC,EAAA,IAAA,UAAwC,CAAA,CAAA;AACzD;;AAGF,MAAI;AACF1B,KAAa,GAAA;GAEb,IAAM2B,IAAa1C,EAAgBU,EAAAA;AAQnCsC,GANA,MAAM7C,EAAOwC,QAAQC,aAAaC,OAAO;IACvCC,YAAYxC;IACZyC,QAAQL;IACV,CAAA,EAEAnC,EAAUmC,EAAWtB,KAAI,EACzB4B,GAAAA;WACOnB,GAAO;AAIdZ,KAHqB,GAAkBiC,UACnCzC,EAAe,EAAiByC,QAAO,GACvCT,EAAAA,EAAC,EAAA,IAAA,UAA2C,CAAA,CAChCQ;YACR;AACRlC,KAAa,GAAA;;IAIXiC,UAAc;AAMlB3C,EALAM,EAAa,EACX,8BAA8B,IAChC,CAAA,EACAE,EAAU,EAAC,CAAA,EACXI,EAAgB,KAAA,EAChBZ,GAAAA;;AAOF,QACE,kBAACf,GAAAA;EACC8D,UAAUJ;EACVK,MAAK;EACLC,OAAOb,EAAAA,EAAC,EAAA,IAAA,UAAc,CAAA;EACtBc,MAAMnD;EACNoD,WAAW1B;EACX2B,mBAAmBhB,EAAAA,EAAC,EAAA,IAAA,UAAO,CAAA;EAC3BiB,oBAAoBjB,EAAAA,EAAC,EAAA,IAAA,UAAkB,CAAA;aAEtC3B,KACC,kBAACjB,GAAAA;GAAM8D,cAAa;GAASC,WAAU;aACrC,kBAAChE,GAAAA,EAAQiE,SAAQ,WAAA,CAAA;MAGpB,CAAC/C,KACA,kBAACvB,GAAAA,EAAAA,UAAAA,CACEyB,KACC,kBAACxB,GAAAA,EAAAA,UACC,kBAACG,GAAAA;GAAQmE,iBAvBA;AACnB7C,MAAgB,KAAA;;GAsB4B8C,MAAM/C;GAAc6C,SAAQ;SAIlE,kBAACpE,GAAAA,EAAAA,UAAAA;GACC,kBAACD,GAAAA,EAAAA,UACC,kBAACE,GAAAA;IACCsE,IAAG;IACH5C,MAAK;IACL6C,OAAOxB,EAAAA,EAAC,EAAA,IAAA,UAAU,CAAA;IAClBpB,OAAOX,EAAUsD,MAAM;IACvBE,UAAUhD;IACViD,QAAQvC;IACRwC,WAAWxD,EAAOoD;;GAGtB,kBAACxE,GAAAA,EAAAA,UACC,kBAACE,GAAAA;IACCsE,IAAG;IACH5C,MAAK;IACL6C,OAAOxB,EAAAA,EAAC,EAAA,IAAA,UAAY,CAAA;IACpBpB,OAAOX,EAAUU,QAAQ;IACzB8C,UAAUhD;IACViD,QAAQvC;IACRwC,WAAWxD,EAAOQ;IAClBiD,UAAQ;;GAGZ,kBAAC7E,GAAAA,EAAAA,UACC,kBAACE,GAAAA;IACCsE,IAAG;IACH5C,MAAK;IACL6C,OAAOxB,EAAAA,EAAC,EAAA,IAAA,UAAY,CAAA;IACpBpB,OAAOX,EAAU4D,eAAe;IAChCJ,UAAUhD;IACViD,QAAQvC;IACRwC,WAAWxD,EAAO0D;;GAGtB,kBAAC9E,GAAAA,EAAAA,UACC,kBAACE,GAAAA;IACCsE,IAAG;IACH5C,MAAK;IACL6C,OAAOxB,EAAAA,EAAC,EAAA,IAAA,UAAM,CAAA;IACdpB,OAAOkD,OAAO7D,EAAU8D,SAAS,GAAA;IACjCN,WAAW/C,MAAMQ,EAAyB,SAAS8C,OAAOtD,EAAEK,OAAOH,MAAK,CAAA;IACxE8C,QAAQvC;IACRwC,WAAWxD,EAAO4D;IAClBlD,MAAK;IACL+C,UAAQ;;GAGZ,kBAAC7E,GAAAA,EAAAA,UACC,kBAACE,GAAAA;IACCsE,IAAG;IACH5C,MAAK;IACL6C,OAAOxB,EAAAA,EAAC,EAAA,IAAA,UAAU,CAAA;IAClBpB,OAAOkD,OAAO7D,EAAUgE,OAAO,GAAA;IAC/BR,WAAW/C,MAAMQ,EAAyB,OAAO8C,OAAOtD,EAAEK,OAAOH,MAAK,CAAA;IACtE8C,QAAQvC;IACRwC,WAAWxD,EAAO8D;IAClBpD,MAAK;IACL+C,UAAQ;;GAGZ,kBAAC7E,GAAAA,EAAAA,UACC,kBAACE,GAAAA;IACCsE,IAAG;IACH5C,MAAK;IACL6C,OAAOxB,EAAAA,EAAC,EAAA,IAAA,UAAW,CAAA;IACnBpB,OAAOkD,OAAO7D,EAAUiE,QAAQ,GAAA;IAChCT,WAAW/C,MAAMQ,EAAyB,QAAQ8C,OAAOtD,EAAEK,OAAOH,MAAK,CAAA;IACvE8C,QAAQvC;IACRwC,WAAWxD,EAAO+D;IAClBrD,MAAK;IACL+C,UAAQ;;GAGZ,kBAAC7E,GAAAA,EAAAA,UACC,kBAACE,GAAAA;IACCsE,IAAG;IACH5C,MAAK;IACL6C,OAAOxB,EAAAA,EAAC,EAAA,IAAA,UAAqB,CAAA;IAC7BpB,OAAOkD,OAAO7D,EAAU,gCAAgC,GAAA;IACxDwD,WAAW/C,MAAMQ,EAAyB,6BAA6B8C,OAAOtD,EAAEK,OAAOH,MAAK,CAAA;IAC5F8C,QAAQvC;IACRwC,WAAWxD,EAAO;IAClBU,MAAK;;GAGT,kBAAC9B,GAAAA,EAAAA,UACC,kBAACE,GAAAA;IACCsE,IAAG;IACH5C,MAAK;IACL6C,OAAOxB,EAAAA,EAAC,EAAA,IAAA,UAAW,CAAA;IACnBpB,OAAOkD,OAAO7D,EAAUkE,QAAQ,GAAA;IAChCV,WAAW/C,MAAMQ,EAAyB,QAAQR,EAAEK,OAAOH,QAAQoD,OAAOtD,EAAEK,OAAOH,MAAK,GAAIgB,KAAAA,EAAAA;IAC5F8B,QAAQvC;IACRwC,WAAWxD,EAAOgE;IAClBtD,MAAK;;GAGT,kBAAC9B,GAAAA,EAAAA,UACC,kBAACE,GAAAA;IACCsE,IAAG;IACH5C,MAAK;IACL6C,OAAOxB,EAAAA,EAAC,EAAA,IAAA,UAAa,CAAA;IACrBoC,cAAc;IACdxD,OAAOkD,OAAO7D,EAAUoE,eAAe,GAAA;IACvCZ,WAAW/C,MAAMQ,EAAyB,eAAe8C,OAAOtD,EAAEK,OAAOH,MAAK,CAAA;IAC9E8C,QAAQvC;IACRwC,WAAWxD,EAAOkE;IAClBxD,MAAK;;GAGT,kBAAC9B,GAAAA,EAAAA,UACC,kBAACM,GAAAA;IACCsB,MAAK;IACL6C,OAAOxB,EAAAA,EAAC,EAAA,IAAA,UAAc,CAAA;IACtBsC,UAAUtC,EAAAA,EAAC,EAAA,IAAA,UAA+H,CAAA;IAC1IlB,SAAS,CAAC,CAACb,EAAU;IACrBwD,UAAUhD;;;;GCpRpB6E,IAAY,IAaZC,KACJC,GACAC,GACAC,GACAC,GACAC,MAEOJ,EAAOK,QAAQC,sBAAsBC,MAAM;CAChDC,YAAYP;CACZC;CACAC;CACAC;CACF,CAAA,EAGIK,KAA4BT,GAAoBC,MAC7CD,EAAOK,QAAQK,QACnBH,MAAM;CACLC,YAAYP;CACZU,YAAY;EAAC;EAAkB;EAAkB;EAAwB;CAC3E,CAAA,CACCC,MAAM,CAACC,GAAWC,GAAWC,QAAsB;CAAEF;CAAWC;CAAWC;CAAgB,EAAA;AAGhG,SAASC,EAAe,EACtBC,mBACAC,uBACAlB,WACAC,YACAkB,oBACAC,oBACAhB,eACAiB,kBACAC,iBACAC,qBACAC,oBACAC,uBACAC,gBACAC,mBAgBD;CACC,IAAM,EAAA,MAAA,GAAA,MAAQC,GAAAA,EACR,EAAEC,YAASC,0BAAuB/C,EAAIkC,EAAAA,EACtCc,IAAchD,EAAImC,EAAAA,EAElBc,IAAaC,KAAKC,IAAI,GAAGD,KAAKE,KAAKN,EAAQO,SAAStC,EAAAA,CAAAA,EACpDuC,IAAWJ,KAAKK,IAAIZ,GAAaM,EAAAA,EACjCO,IAAmBV,EAAQW,OAAOH,IAAW,KAAKvC,GAAWuC,IAAWvC,EAAAA;AAM9E,QAJAX,QAAU;AACR,EAAIuC,IAAcM,KAAYL,EAAa,EAAA;IAC1C;EAACK;EAAYN;EAAaC;EAAa,CAAA,EAGxC,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC9B,GAAAA;GACSG;GACRyC,QAAQjB;GACCvB;GACTyC,eAAejB,EAAmB,GAAA;GAClCkB,WAAWvB;;EAGZU,KACC,kBAACvC,GAAAA;GACCqD,WAAU;GACVC,MAAMC,EAAAA,EAAC,EAAA,IAAA,UAA2E,CAAA;GAClFC,SAAQ;;EAIZ,kBAACpD,GAAAA;GACe2B;GACFlB;GACZ4C,QAAQzB;GACR0B,UAAU5B;GACV6B,SACEnB,EAAYlB,YACV,kBAACrB,GAAAA;IAAOuD,SAAQ;IAAUI,OAAOL,EAAAA,EAAC,EAAA,IAAA,UAAc,CAAA;IAAGM,eAAe3B,EAAmB,GAAA;QACnF;;EAIR,kBAAC7B,GAAAA;GACCiC,SAASU;GACTc,WAAW;GACHrD;GACCC;GACQkB;GACjBmC,iBAAiBvB,EAAYjB;GAC7ByC,kBAAkBxB,EAAYhB;GAC9BW,aAAaW;GACDL;GACEL;;;;AAKtB,IAAa6B,KAAW,EAAExD,WAAQC,iBAAuB;CACvD,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQ2B,GAAAA,EACR6B,IAAWnE,GAAAA,EACXoE,IAAerE,EAAU,EAAEsE,QAAQ,IAAM,CAAA,EAEzC,CAACrC,GAAcsC,KAAmB3E,EAA+B;EACrE4E,SAAS;GACP;IAAEV,OAAOL,EAAAA,EAAC,EAAA,IAAA,UAAK,CAAA;IAAGgB,OAAO;IAAO;GAChC;IAAEX,OAAOL,EAAAA,EAAC,EAAA,IAAA,UAAM,CAAA;IAAGgB,OAAO;IAAQ;GAClC;IAAEX,OAAOL,EAAAA,EAAC,EAAA,IAAA,UAAI,CAAA;IAAGgB,OAAO;IAAM;GAC9B;IAAEX,OAAOL,EAAAA,EAAC,EAAA,IAAA,UAAU,CAAA;IAAGgB,OAAO;IAAO;GACrC;IAAEX,OAAOL,EAAAA,EAAC,EAAA,IAAA,UAAK,CAAA;IAAGgB,OAAO;IAAO;GACjC;EACD5D,QAAQwD,EAAaxD,UAAU;EAC/BC,eAAeuD,EAAavD,iBAAiB;EAC/C,CAAA,EAEM,CAACC,GAAYiB,KAAiBpC,EAASyE,EAAaK,UAAU,GAAA,EAC9DrC,IAAcgC,EAAaM,QAAQ,GACnC,CAACC,GAASC,KAAcjF,GAAAA,EACxB,CAACuC,GAAiBC,KAAsBxC,EAAS,GAAA,EAEjD,CAACgC,GAAgBkD,KAAqBlF,QAC1Cc,EAAqBC,GAAQC,GAASqB,EAAapB,QAAQoB,EAAanB,eAAeC,EAAAA,CAAAA,EAEnF,CAACc,KAAsBjC,QAAewB,EAAyBT,GAAQC,EAAAA,CAAAA,EAEvEmE,UAAiB;AACrBlF,UAAgB;AACdiF,KACEpE,EAAqBC,GAAQC,GAASqB,EAAapB,QAAQoB,EAAanB,eAAeC,EAAAA,CAAAA;IAE3F;IAGIiE,KAAuBC,MAAAA;AAM3BF,EALAF,EAAW;GACTK,SAASzB,EAAAA,EAAC;;cAAWwB,eAAAA;IAA2C,CAAA;GAChEE,WAAWC,KAAKC,KAAG;GACrB,CAAA,EACAC,iBAAiBT,EAAWU,KAAAA,EAAAA,EAAY,IAAA,EACxCR,GAAAA;IAGIS,KAAuBP,MAAAA;AAM3BF,EALAF,EAAW;GACTK,SAASzB,EAAAA,EAAC;;cAAWwB,eAAAA;IAA2C,CAAA;GAChEE,WAAWC,KAAKC,KAAG;GACrB,CAAA,EACAC,iBAAiBT,EAAWU,KAAAA,EAAAA,EAAY,IAAA,EACxCR,GAAAA;IAGI7C,KAAoBuD,MAAAA;EACxB,IAAMC,IAAiC;GACrClB,SAASiB,EAAgBjB;GACzB3D,QAAQ4E,EAAgB5E,QAAQ8E,UAAAA,IAAc;GAC9C7E,eAAe2E,EAAgB3E,iBAAiB;GAClD;AAYAjB,EAVA0E,EAAgBmB,EAAAA,EAChBtB,EAAS;GACPM,SAAUkB,OAA+B;IACvC,GAAGA;IACH/E,QAAQ6E,EAAS7E;IACjBC,eAAe4E,EAAS5E;IACxB6D,MAAMY,KAAAA;IACR;GACAM,SAAS;GACX,CAAA,EACAhG,QAAgB;AACdiF,KAAkBpE,EAAqBC,GAAQC,GAAS8E,EAAS7E,QAAQ6E,EAAS5E,eAAeC,EAAAA,CAAAA;IACnG;IAGI+E,KAAsBC,MAAAA;EAC1B,IAAMC,IAAc,OAAOD,KAAS,WAAWA,IAAO;AAWtDlG,EAVAmC,EAAcgE,EAAAA,EAEd5B,EAAS;GACPM,SAAUkB,OAA+B;IACvC,GAAGA;IACHlB,QAAQsB,KAAeT,KAAAA;IACvBZ,MAAMY,KAAAA;IACR;GACAM,SAAS;GACX,CAAA,EACAhG,QAAgB;AACdiF,KACEpE,EAAqBC,GAAQC,GAASqB,EAAapB,QAAQoB,EAAanB,eAAekF,EAAAA,CAAAA;IAE3F;IAGIC,IAAmBlG,GACtB4E,MAAAA;AACCP,IAAS,EACPM,SAAUkB,OAA+B;GACvC,GAAGA;GACHjB,MAAMA,MAAS,IAAIY,KAAAA,IAAYZ;GACjC,GACF,CAAA;IAEF,CAACP,EAAS,CAAA;AAGZ,QACE,kBAAC8B,OAAAA;EAAI3C,WAAU;aACZqB,KACC,kBAAC1E,GAAAA;GACCqD,WAAU;GACVC,MAAMoB,EAAQM;GACdxB,SAAQ;GACRyC,iBAAiBtB,EAAWU,KAAAA,EAAAA;GAC5Ba,aAAW;MAIf,kBAACzG,GAAAA;GACC0G,UACE,kBAACjG,GAAAA;IAAMmD,WAAU;IAAgB+C,cAAa;IAASC,WAAU;IAASC,WAAU;eAClF,kBAACnG,GAAAA;KAAQqD,SAAQ;KAAU+C,MAAK;KAAQlD,WAAU;QAClD,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,CAAA;;aAIJ,kBAAC5B,GAAAA;IACiBC;IACIC;IACZlB;IACCC;IACTkB,iBAAiBkD;IACjBjD,iBAAiByD;IACLzE;IACZiB,eAAe8D;IACD7D;IACIC;IACDC;IACGC;IACPC;IACbC,cAAc2D;;;;;;;ACnQxB,SAASa,IAAAA;CACP,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQJ,GAAAA,EACR,EAAEM,iBAAcH,EAAMI,WAAS,EAC/B,EAAEC,kBAAeL,EAAMM,iBAAe;AAC5C,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAA;EAAc,OAAOJ,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA;EAAsBC;KAC7C,kBAAC,GAAA;EAAQ,SAASA;EAAW,QAAQE"}
|