Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions app/pages/project/instances/NetworkingTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import {
useInstanceSelector,
useProjectSelector,
} from '~/hooks/use-params'
import { useQuickActions } from '~/hooks/use-quick-actions'
import { confirmAction } from '~/stores/confirm-action'
import { confirmDelete } from '~/stores/confirm-delete'
import { addToast } from '~/stores/toast'
Expand Down Expand Up @@ -636,6 +637,53 @@ export default function NetworkingTab() {
const subnetDisabledReason =
availableSubnets.length === 0 ? 'No available external subnets' : null

useQuickActions(
() => [
...(!ephemeralDisabledReason
? [
{
value: 'Attach ephemeral IP',
navGroup: 'Actions',
action: () => setAttachEphemeralModalOpen(true),
},
]
: []),
...(!floatingDisabledReason
? [
{
value: 'Attach floating IP',
navGroup: 'Actions',
action: () => setAttachFloatingModalOpen(true),
},
]
: []),
...(instanceCan.updateNic({ runState: instance.runState })
? [
{
value: 'Add network interface',
navGroup: 'Actions',
action: () => setCreateModalOpen(true),
},
]
: []),
...(!subnetDisabledReason
? [
{
value: 'Attach external subnet',
navGroup: 'Actions',
action: () => setAttachSubnetModalOpen(true),
},
]
: []),
],
[
ephemeralDisabledReason,
floatingDisabledReason,
instance.runState,
subnetDisabledReason,
]
)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I’d want to make sure these live conditional ones update the way you’d expect. I think they will, but it’s good to check.

return (
<div className="space-y-5">
<CardBlock>
Expand Down
21 changes: 21 additions & 0 deletions app/pages/project/instances/StorageTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import { DiskStateBadge, DiskTypeBadge, ReadOnlyBadge } from '~/components/State
import { AttachDiskModalForm } from '~/forms/disk-attach'
import { CreateDiskSideModalForm } from '~/forms/disk-create'
import { getInstanceSelector, useInstanceSelector } from '~/hooks/use-params'
import { useQuickActions } from '~/hooks/use-quick-actions'
import { DiskDetailSideModal } from '~/pages/project/disks/DiskDetailSideModal'
import { confirmAction } from '~/stores/confirm-action'
import { addToast } from '~/stores/toast'
Expand Down Expand Up @@ -339,6 +340,26 @@ export default function StorageTab() {
getCoreRowModel: getCoreRowModel(),
})

const canAttachDisk = instanceCan.attachDisk(instance)
useQuickActions(
() =>
canAttachDisk
? [
{
value: 'Attach existing disk',
navGroup: 'Actions',
action: () => setShowDiskAttach(true),
},
{
value: 'Create disk',
navGroup: 'Actions',
action: () => setShowDiskCreate(true),
},
]
: [],
[canAttachDisk]
)

return (
<div className="space-y-5">
<CardBlock>
Expand Down
19 changes: 17 additions & 2 deletions app/pages/project/vpcs/RouterPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import { MoreActionsMenu } from '~/components/MoreActionsMenu'
import { routeFormMessage } from '~/forms/vpc-router-route-common'
import { makeCrumb } from '~/hooks/use-crumbs'
import { getVpcRouterSelector, useVpcRouterSelector } from '~/hooks/use-params'
import { useQuickActions } from '~/hooks/use-quick-actions'
import { confirmAction } from '~/stores/confirm-action'
import { addToast } from '~/stores/toast'
import { TypeValueCell } from '~/table/cells/TypeValueCell'
Expand Down Expand Up @@ -176,6 +177,20 @@ export default function RouterPage() {
// https://github.com/oxidecomputer/omicron/blob/914f5fd7d51f9b060dcc0382a30b607e25df49b2/nexus/src/app/vpc_router.rs#L201-L205
const canCreateNewRoute = routerData.kind === 'custom'

useQuickActions(
() =>
canCreateNewRoute
? [
{
value: 'Add route',
navGroup: 'Actions',
action: pb.vpcRouterRoutesNew({ project, vpc, router }),
},
]
: [],
[canCreateNewRoute, project, vpc, router]
)

return (
<>
<PageHeader>
Expand Down Expand Up @@ -205,14 +220,14 @@ export default function RouterPage() {
<CardBlock.Header title="Routes" description="Rules for directing network traffic">
{canCreateNewRoute ? (
<CreateLink to={pb.vpcRouterRoutesNew({ project, vpc, router })}>
New route
Add route
</CreateLink>
) : (
<CreateButton
disabled
disabledReason={routeFormMessage.noNewRoutesOnSystemRouter}
>
New route
Add route
</CreateButton>
)}
</CardBlock.Header>
Expand Down
17 changes: 17 additions & 0 deletions app/pages/project/vpcs/VpcFirewallRulesTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {
import { ListPlusCell } from '~/components/ListPlusCell'
import { ProtocolBadge } from '~/components/ProtocolBadge'
import { getVpcSelector, useVpcSelector } from '~/hooks/use-params'
import { useQuickActions } from '~/hooks/use-quick-actions'
import { confirmDelete } from '~/stores/confirm-delete'
import { EnabledCell } from '~/table/cells/EnabledCell'
import { LinkCell } from '~/table/cells/LinkCell'
Expand Down Expand Up @@ -169,6 +170,22 @@ export default function VpcFirewallRulesTab() {

const table = useReactTable({ columns, data: rules, getCoreRowModel: getCoreRowModel() })

useQuickActions(
() => [
{
value: 'New firewall rule',
navGroup: 'Actions',
action: pb.vpcFirewallRulesNew(vpcSelector),
},
...rules.map((r) => ({
value: r.name,
navGroup: 'Edit firewall rule',
action: pb.vpcFirewallRuleEdit({ ...vpcSelector, rule: r.name }),
})),
],
[vpcSelector, rules]
)

const emptyState = (
<TableEmptyBox>
<EmptyMessage
Expand Down
19 changes: 18 additions & 1 deletion app/pages/project/vpcs/VpcRoutersTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { api, getListQFn, q, queryClient, useApiMutation, type VpcRouter } from
import { HL } from '~/components/HL'
import { routeFormMessage } from '~/forms/vpc-router-route-common'
import { getVpcSelector, useVpcSelector } from '~/hooks/use-params'
import { useQuickActions } from '~/hooks/use-quick-actions'
import { confirmDelete } from '~/stores/confirm-delete'
import { addToast } from '~/stores/toast'
import { makeLinkCell } from '~/table/cells/LinkCell'
Expand Down Expand Up @@ -103,12 +104,28 @@ export default function VpcRoutersTab() {
)

const columns = useColsWithActions(staticColumns, makeActions)
const { table } = useQueryTable({
const { table, query } = useQueryTable({
query: vpcRouterList({ project, vpc }),
columns,
emptyState,
})

useQuickActions(
() => [
{
value: 'New router',
navGroup: 'Actions',
action: pb.vpcRoutersNew({ project, vpc }),
},
...(query.data?.items || []).map((r) => ({
value: r.name,
navGroup: 'Edit router',
action: pb.vpcRouterEdit({ project, vpc, router: r.name }),
})),
],
[project, vpc, query.data]
)

return (
<>
<div className="mb-3 flex justify-end space-x-2">
Expand Down
19 changes: 18 additions & 1 deletion app/pages/project/vpcs/VpcSubnetsTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { Outlet, type LoaderFunctionArgs } from 'react-router'
import { api, getListQFn, queryClient, useApiMutation, type VpcSubnet } from '@oxide/api'

import { getVpcSelector, useVpcSelector } from '~/hooks/use-params'
import { useQuickActions } from '~/hooks/use-quick-actions'
import { confirmDelete } from '~/stores/confirm-delete'
import { addToast } from '~/stores/toast'
import { makeLinkCell } from '~/table/cells/LinkCell'
Expand Down Expand Up @@ -96,13 +97,29 @@ export default function VpcSubnetsTab() {
/>
)

const { table } = useQueryTable({
const { table, query } = useQueryTable({
query: subnetList(vpcSelector),
columns,
emptyState,
rowHeight: 'large',
})

useQuickActions(
() => [
{
value: 'New VPC subnet',
navGroup: 'Actions',
action: pb.vpcSubnetsNew(vpcSelector),
},
...(query.data?.items || []).map((s) => ({
value: s.name,
navGroup: 'Edit VPC subnet',
action: pb.vpcSubnetsEdit({ ...vpcSelector, subnet: s.name }),
})),
],
[vpcSelector, query.data]
)

return (
<>
<div className="mb-3 flex justify-end space-x-2">
Expand Down
6 changes: 6 additions & 0 deletions app/pages/settings/SSHKeysPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { Key16Icon, Key24Icon } from '@oxide/design-system/icons/react'
import { DocsPopover } from '~/components/DocsPopover'
import { HL } from '~/components/HL'
import { makeCrumb } from '~/hooks/use-crumbs'
import { useQuickActions } from '~/hooks/use-quick-actions'
import { confirmDelete } from '~/stores/confirm-delete'
import { addToast } from '~/stores/toast'
import { makeLinkCell } from '~/table/cells/LinkCell'
Expand Down Expand Up @@ -88,6 +89,11 @@ export default function SSHKeysPage() {
onClick={() => navigate(pb.sshKeysNew())}
/>
)
useQuickActions(
() => [{ value: 'Add SSH key', navGroup: 'Actions', action: pb.sshKeysNew() }],
[]
)

const { table } = useQueryTable({ query: sshKeyList, columns, emptyState })

return (
Expand Down
12 changes: 12 additions & 0 deletions app/pages/system/FleetAccessPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import {
FleetAccessEditUserSideModal,
} from '~/forms/fleet-access'
import { useCurrentUser } from '~/hooks/use-current-user'
import { useQuickActions } from '~/hooks/use-quick-actions'
import { confirmDelete } from '~/stores/confirm-delete'
import { addToast } from '~/stores/toast'
import { getActionsCol } from '~/table/columns/action-col'
Expand Down Expand Up @@ -238,6 +239,17 @@ export default function FleetAccessPage() {
[fleetPolicy, updatePolicy, me, navigate]
)

useQuickActions(
() => [
{
value: 'Add user or group',
navGroup: 'Actions',
action: () => setAddModalOpen(true),
},
],
[]
)

const tableInstance = useReactTable({
columns,
data: rows,
Expand Down
15 changes: 15 additions & 0 deletions app/pages/system/networking/IpPoolPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import { MoreActionsMenu } from '~/components/MoreActionsMenu'
import { QueryParamTabs } from '~/components/QueryParamTabs'
import { makeCrumb } from '~/hooks/use-crumbs'
import { getIpPoolSelector, useIpPoolSelector } from '~/hooks/use-params'
import { useQuickActions } from '~/hooks/use-quick-actions'
import { confirmAction } from '~/stores/confirm-action'
import { confirmDelete } from '~/stores/confirm-delete'
import { addToast } from '~/stores/toast'
Expand Down Expand Up @@ -272,6 +273,13 @@ function IpRangesTable() {
],
[pool, removeRange]
)
useQuickActions(
() => [
{ value: 'Add range', navGroup: 'Actions', action: pb.ipPoolRangeAdd({ pool }) },
],
[pool]
)

const columns = useColsWithActions(ipRangesStaticCols, makeRangeActions)
const { table } = useQueryTable({ query: ipPoolRangeList({ pool }), columns, emptyState })

Expand Down Expand Up @@ -414,6 +422,13 @@ function LinkedSilosTable() {

const [showLinkModal, setShowLinkModal] = useState(false)

useQuickActions(
() => [
{ value: 'Link silo', navGroup: 'Actions', action: () => setShowLinkModal(true) },
],
[]
)

const emptyState = (
<EmptyMessage
icon={<IpGlobal24Icon />}
Expand Down
19 changes: 19 additions & 0 deletions app/pages/system/networking/SubnetPoolPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import { MoreActionsMenu } from '~/components/MoreActionsMenu'
import { QueryParamTabs } from '~/components/QueryParamTabs'
import { makeCrumb } from '~/hooks/use-crumbs'
import { getSubnetPoolSelector, useSubnetPoolSelector } from '~/hooks/use-params'
import { useQuickActions } from '~/hooks/use-quick-actions'
import { confirmAction } from '~/stores/confirm-action'
import { confirmDelete } from '~/stores/confirm-delete'
import { addToast } from '~/stores/toast'
Expand Down Expand Up @@ -231,6 +232,17 @@ function MembersTable() {
],
[subnetPool, removeMember]
)
useQuickActions(
() => [
{
value: 'Add member',
navGroup: 'Actions',
action: pb.subnetPoolMemberAdd({ subnetPool }),
},
],
[subnetPool]
)

const columns = useColsWithActions(membersStaticCols, makeMemberActions)
const { table } = useQueryTable({
query: subnetPoolMemberList({ subnetPool }),
Expand Down Expand Up @@ -396,6 +408,13 @@ function LinkedSilosTable() {

const [showLinkModal, setShowLinkModal] = useState(false)

useQuickActions(
() => [
{ value: 'Link silo', navGroup: 'Actions', action: () => setShowLinkModal(true) },
],
[]
)

const emptyState = (
<EmptyMessage
icon={<Subnet24Icon />}
Expand Down
8 changes: 8 additions & 0 deletions app/pages/system/silos/SiloIdpsTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { Badge } from '@oxide/design-system/ui'
import { api, getListQFn, queryClient, type IdentityProvider } from '~/api'
import { makeCrumb } from '~/hooks/use-crumbs'
import { getSiloSelector, useSiloSelector } from '~/hooks/use-params'
import { useQuickActions } from '~/hooks/use-quick-actions'
import { LinkCell } from '~/table/cells/LinkCell'
import { Columns } from '~/table/columns/common'
import { useQueryTable } from '~/table/QueryTable'
Expand Down Expand Up @@ -59,6 +60,13 @@ export default function SiloIdpsTab() {
[silo]
)

useQuickActions(
() => [
{ value: 'New provider', navGroup: 'Actions', action: pb.siloIdpsNew({ silo }) },
],
[silo]
)

const { table } = useQueryTable({
query: siloIdpList(silo),
columns,
Expand Down
Loading
Loading