@shipfox/client-runners 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/main.ts +1 -0
- package/.storybook/preview.css +4 -0
- package/.storybook/preview.tsx +64 -0
- package/.turbo/turbo-build.log +2 -0
- package/.turbo/turbo-type$colon$emit.log +1 -0
- package/.turbo/turbo-type.log +1 -0
- package/CHANGELOG.md +112 -0
- package/LICENSE +21 -0
- package/dist/components/create-manual-registration-token-form.d.ts +10 -0
- package/dist/components/create-manual-registration-token-form.d.ts.map +1 -0
- package/dist/components/create-manual-registration-token-form.js +206 -0
- package/dist/components/create-manual-registration-token-form.js.map +1 -0
- package/dist/components/create-provisioner-token-form.d.ts +10 -0
- package/dist/components/create-provisioner-token-form.d.ts.map +1 -0
- package/dist/components/create-provisioner-token-form.js +206 -0
- package/dist/components/create-provisioner-token-form.js.map +1 -0
- package/dist/components/form-errors.d.ts +6 -0
- package/dist/components/form-errors.d.ts.map +1 -0
- package/dist/components/form-errors.js +9 -0
- package/dist/components/form-errors.js.map +1 -0
- package/dist/components/manual-registration-token-errors.d.ts +2 -0
- package/dist/components/manual-registration-token-errors.d.ts.map +1 -0
- package/dist/components/manual-registration-token-errors.js +14 -0
- package/dist/components/manual-registration-token-errors.js.map +1 -0
- package/dist/components/manual-registration-token-format.d.ts +5 -0
- package/dist/components/manual-registration-token-format.d.ts.map +1 -0
- package/dist/components/manual-registration-token-format.js +14 -0
- package/dist/components/manual-registration-token-format.js.map +1 -0
- package/dist/components/manual-registration-token-list.d.ts +8 -0
- package/dist/components/manual-registration-token-list.d.ts.map +1 -0
- package/dist/components/manual-registration-token-list.js +293 -0
- package/dist/components/manual-registration-token-list.js.map +1 -0
- package/dist/components/manual-registration-tokens-settings-section.d.ts +4 -0
- package/dist/components/manual-registration-tokens-settings-section.d.ts.map +1 -0
- package/dist/components/manual-registration-tokens-settings-section.js +109 -0
- package/dist/components/manual-registration-tokens-settings-section.js.map +1 -0
- package/dist/components/provisioner-token-errors.d.ts +2 -0
- package/dist/components/provisioner-token-errors.d.ts.map +1 -0
- package/dist/components/provisioner-token-errors.js +13 -0
- package/dist/components/provisioner-token-errors.js.map +1 -0
- package/dist/components/provisioner-token-form-errors.d.ts +6 -0
- package/dist/components/provisioner-token-form-errors.d.ts.map +1 -0
- package/dist/components/provisioner-token-form-errors.js +9 -0
- package/dist/components/provisioner-token-form-errors.js.map +1 -0
- package/dist/components/provisioner-token-format.d.ts +21 -0
- package/dist/components/provisioner-token-format.d.ts.map +1 -0
- package/dist/components/provisioner-token-format.js +36 -0
- package/dist/components/provisioner-token-format.js.map +1 -0
- package/dist/components/provisioner-token-list.d.ts +9 -0
- package/dist/components/provisioner-token-list.d.ts.map +1 -0
- package/dist/components/provisioner-token-list.js +344 -0
- package/dist/components/provisioner-token-list.js.map +1 -0
- package/dist/components/provisioner-tokens-settings-section.d.ts +4 -0
- package/dist/components/provisioner-tokens-settings-section.d.ts.map +1 -0
- package/dist/components/provisioner-tokens-settings-section.js +117 -0
- package/dist/components/provisioner-tokens-settings-section.js.map +1 -0
- package/dist/components/token-date.d.ts +6 -0
- package/dist/components/token-date.d.ts.map +1 -0
- package/dist/components/token-date.js +27 -0
- package/dist/components/token-date.js.map +1 -0
- package/dist/components/token-expiration-select.d.ts +11 -0
- package/dist/components/token-expiration-select.d.ts.map +1 -0
- package/dist/components/token-expiration-select.js +68 -0
- package/dist/components/token-expiration-select.js.map +1 -0
- package/dist/components/token-name.d.ts +4 -0
- package/dist/components/token-name.d.ts.map +1 -0
- package/dist/components/token-name.js +24 -0
- package/dist/components/token-name.js.map +1 -0
- package/dist/components/token-settings-sections.stories.d.ts +26 -0
- package/dist/components/token-settings-sections.stories.d.ts.map +1 -0
- package/dist/components/token-settings-sections.stories.js +370 -0
- package/dist/components/token-settings-sections.stories.js.map +1 -0
- package/dist/hooks/api/manual-registration-tokens.d.ts +83 -0
- package/dist/hooks/api/manual-registration-tokens.d.ts.map +1 -0
- package/dist/hooks/api/manual-registration-tokens.js +53 -0
- package/dist/hooks/api/manual-registration-tokens.js.map +1 -0
- package/dist/hooks/api/provisioner-tokens.d.ts +125 -0
- package/dist/hooks/api/provisioner-tokens.d.ts.map +1 -0
- package/dist/hooks/api/provisioner-tokens.js +81 -0
- package/dist/hooks/api/provisioner-tokens.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -0
- package/package.json +88 -0
- package/src/components/create-manual-registration-token-form.tsx +197 -0
- package/src/components/create-provisioner-token-form.tsx +193 -0
- package/src/components/form-errors.test.ts +24 -0
- package/src/components/form-errors.ts +9 -0
- package/src/components/manual-registration-token-errors.ts +13 -0
- package/src/components/manual-registration-token-format.test.ts +48 -0
- package/src/components/manual-registration-token-format.ts +18 -0
- package/src/components/manual-registration-token-list.tsx +246 -0
- package/src/components/manual-registration-tokens-settings-section.test.tsx +251 -0
- package/src/components/manual-registration-tokens-settings-section.tsx +110 -0
- package/src/components/provisioner-token-errors.ts +12 -0
- package/src/components/provisioner-token-form-errors.test.ts +35 -0
- package/src/components/provisioner-token-form-errors.ts +9 -0
- package/src/components/provisioner-token-format.test.ts +96 -0
- package/src/components/provisioner-token-format.ts +40 -0
- package/src/components/provisioner-token-list.tsx +280 -0
- package/src/components/provisioner-tokens-settings-section.test.tsx +362 -0
- package/src/components/provisioner-tokens-settings-section.tsx +114 -0
- package/src/components/token-date.tsx +27 -0
- package/src/components/token-expiration-select.tsx +64 -0
- package/src/components/token-name.tsx +19 -0
- package/src/components/token-settings-sections.stories.tsx +360 -0
- package/src/hooks/api/manual-registration-tokens.test.ts +87 -0
- package/src/hooks/api/manual-registration-tokens.ts +71 -0
- package/src/hooks/api/provisioner-tokens.test.ts +127 -0
- package/src/hooks/api/provisioner-tokens.ts +102 -0
- package/src/index.ts +4 -0
- package/test/setup.ts +3 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +3 -0
- package/tsconfig.test.json +8 -0
- package/vercel.json +8 -0
- package/vitest.config.ts +74 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/manual-registration-token-list.tsx"],"sourcesContent":["import type {ManualRegistrationTokenDto} from '@shipfox/api-runners-dto';\nimport {Button, IconButton} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@shipfox/react-ui/dropdown-menu';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalTitle,\n} from '@shipfox/react-ui/modal';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@shipfox/react-ui/table';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {useQueryClient} from '@tanstack/react-query';\nimport {useState} from 'react';\nimport {\n manualRegistrationTokenQueryKeys,\n useRevokeManualRegistrationTokenMutation,\n} from '#hooks/api/manual-registration-tokens.js';\nimport {manualRegistrationTokenErrorMessage} from './manual-registration-token-errors.js';\nimport {\n formatManualRegistrationTokenDate,\n formatManualRegistrationTokenTimestamp,\n manualRegistrationTokenDisplayName,\n} from './manual-registration-token-format.js';\nimport {TokenDate} from './token-date.js';\nimport {TokenName} from './token-name.js';\n\nexport function ManualRegistrationTokenList({\n workspaceId,\n tokens,\n}: {\n workspaceId: string;\n tokens: ManualRegistrationTokenDto[];\n}) {\n return (\n <>\n <div className=\"max-[760px]:hidden\">\n <Table className=\"table-fixed\">\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[34%]\">Name</TableHead>\n <TableHead>Prefix</TableHead>\n <TableHead className=\"w-128\">Expires</TableHead>\n <TableHead className=\"w-128\">Created</TableHead>\n <TableHead className=\"w-80 text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {tokens.map((token) => (\n <TableRow key={token.id}>\n <TableCell>\n <TokenName name={manualRegistrationTokenDisplayName(token)} />\n </TableCell>\n <TableCell>\n <Code variant=\"paragraph\" className=\"block truncate\">\n {token.prefix}\n </Code>\n </TableCell>\n <TableCell>\n <ManualRegistrationTokenDate value={token.expires_at} />\n </TableCell>\n <TableCell>\n <ManualRegistrationTokenDate value={token.created_at} />\n </TableCell>\n <TableCell className=\"text-right\">\n <RevokeManualRegistrationTokenButton workspaceId={workspaceId} token={token} />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n <ul\n className=\"hidden flex-col gap-10 max-[760px]:flex\"\n aria-label=\"Manual registration tokens\"\n >\n {tokens.map((token) => (\n <li\n key={token.id}\n className=\"rounded-8 border border-border-neutral-base bg-background-neutral-base p-14\"\n >\n <div className=\"flex items-start justify-between gap-12\">\n <div className=\"min-w-0 flex-1\">\n <TokenName name={manualRegistrationTokenDisplayName(token)} />\n <Code variant=\"paragraph\" className=\"block truncate text-foreground-neutral-muted\">\n {token.prefix}\n </Code>\n </div>\n <RevokeManualRegistrationTokenButton workspaceId={workspaceId} token={token} />\n </div>\n <dl className=\"mt-12 grid grid-cols-2 gap-10 text-sm\">\n <div>\n <dt className=\"text-foreground-neutral-muted\">Expires</dt>\n <dd>\n <ManualRegistrationTokenDate value={token.expires_at} />\n </dd>\n </div>\n <div>\n <dt className=\"text-foreground-neutral-muted\">Created</dt>\n <dd>\n <ManualRegistrationTokenDate value={token.created_at} />\n </dd>\n </div>\n </dl>\n </li>\n ))}\n </ul>\n </>\n );\n}\n\nfunction ManualRegistrationTokenDate({value}: {value: string | null}) {\n return (\n <TokenDate\n value={value}\n date={formatManualRegistrationTokenDate(value)}\n timestamp={formatManualRegistrationTokenTimestamp(value)}\n />\n );\n}\n\nfunction RevokeManualRegistrationTokenButton({\n workspaceId,\n token,\n}: {\n workspaceId: string;\n token: ManualRegistrationTokenDto;\n}) {\n const queryClient = useQueryClient();\n const revokeToken = useRevokeManualRegistrationTokenMutation();\n const [open, setOpen] = useState(false);\n const tokenName = manualRegistrationTokenDisplayName(token);\n\n async function handleRevoke() {\n try {\n await revokeToken.mutateAsync({workspaceId, tokenId: token.id});\n await queryClient.invalidateQueries({\n queryKey: manualRegistrationTokenQueryKeys.list(workspaceId),\n });\n setOpen(false);\n } catch {\n // React Query stores the error for the inline modal alert.\n }\n }\n\n function handleOpenChange(nextOpen: boolean) {\n setOpen(nextOpen);\n if (nextOpen) {\n revokeToken.reset();\n }\n }\n\n function openRevokeConfirmation() {\n revokeToken.reset();\n setOpen(true);\n }\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <IconButton\n type=\"button\"\n size=\"sm\"\n variant=\"transparent\"\n icon=\"more2Line\"\n aria-label={`Open ${tokenName} registration token actions`}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" size=\"sm\">\n <DropdownMenuItem onSelect={openRevokeConfirmation}>Revoke token</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n <Modal open={open} onOpenChange={handleOpenChange}>\n <ModalContent aria-describedby={undefined} className=\"max-w-[420px]\">\n <ModalTitle className=\"sr-only\">Revoke token</ModalTitle>\n <ModalHeader title=\"Revoke token?\" />\n <ModalBody className=\"gap-16\">\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {tokenName} will stop creating new runner sessions. Existing sessions and job leases\n expire on their own.\n </Text>\n {revokeToken.isError ? (\n <Callout role=\"alert\" type=\"error\">\n <Text size=\"sm\">{manualRegistrationTokenErrorMessage(revokeToken.error)}</Text>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button size=\"sm\" variant=\"secondary\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button\n size=\"sm\"\n variant=\"danger\"\n isLoading={revokeToken.isPending}\n onClick={handleRevoke}\n >\n Revoke\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </>\n );\n}\n\nexport function EmptyManualRegistrationTokens() {\n return (\n <EmptyState\n icon=\"key2Line\"\n title=\"No usable manual registration tokens\"\n description=\"Create a token to connect a runner to this workspace.\"\n />\n );\n}\n\nexport function ManualRegistrationTokenTableSkeleton() {\n return (\n <div\n role=\"status\"\n aria-label=\"Loading manual registration tokens\"\n className=\"flex flex-col gap-8\"\n >\n {[0, 1, 2].map((row) => (\n <Skeleton key={row} className=\"h-44 w-full\" />\n ))}\n </div>\n );\n}\n"],"names":["Button","IconButton","Callout","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","EmptyState","Modal","ModalBody","ModalContent","ModalFooter","ModalHeader","ModalTitle","Skeleton","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","Code","Text","useQueryClient","useState","manualRegistrationTokenQueryKeys","useRevokeManualRegistrationTokenMutation","manualRegistrationTokenErrorMessage","formatManualRegistrationTokenDate","formatManualRegistrationTokenTimestamp","manualRegistrationTokenDisplayName","TokenDate","TokenName","ManualRegistrationTokenList","workspaceId","tokens","div","className","map","token","name","variant","prefix","ManualRegistrationTokenDate","value","expires_at","created_at","RevokeManualRegistrationTokenButton","id","ul","aria-label","li","dl","dt","dd","date","timestamp","queryClient","revokeToken","open","setOpen","tokenName","handleRevoke","mutateAsync","tokenId","invalidateQueries","queryKey","list","handleOpenChange","nextOpen","reset","openRevokeConfirmation","asChild","type","size","icon","align","onSelect","onOpenChange","aria-describedby","undefined","title","isError","role","error","onClick","isLoading","isPending","EmptyManualRegistrationTokens","description","ManualRegistrationTokenTableSkeleton","row"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manual-registration-tokens-settings-section.d.ts","sourceRoot":"","sources":["../../src/components/manual-registration-tokens-settings-section.tsx"],"names":[],"mappings":"AAyBA,wBAAgB,gDAAgD,CAAC,EAC/D,WAAW,GACZ,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;CACrB,+BAgFA"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { QueryLoadError } from '@shipfox/client-ui';
|
|
3
|
+
import { Button } from '@shipfox/react-ui/button';
|
|
4
|
+
import { Icon } from '@shipfox/react-ui/icon';
|
|
5
|
+
import { Modal, ModalBody, ModalContent, ModalHeader, ModalTitle, ModalTrigger } from '@shipfox/react-ui/modal';
|
|
6
|
+
import { Header, Text } from '@shipfox/react-ui/typography';
|
|
7
|
+
import { useState } from 'react';
|
|
8
|
+
import { useManualRegistrationTokensQuery } from '#hooks/api/manual-registration-tokens.js';
|
|
9
|
+
import { CreatedManualRegistrationTokenPanel, CreateManualRegistrationTokenForm } from './create-manual-registration-token-form.js';
|
|
10
|
+
import { EmptyManualRegistrationTokens, ManualRegistrationTokenList, ManualRegistrationTokenTableSkeleton } from './manual-registration-token-list.js';
|
|
11
|
+
export function WorkspaceManualRegistrationTokensSettingsSection({ workspaceId }) {
|
|
12
|
+
const tokensQuery = useManualRegistrationTokensQuery(workspaceId);
|
|
13
|
+
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
14
|
+
const [createdToken, setCreatedToken] = useState(null);
|
|
15
|
+
const tokens = tokensQuery.data?.manual_registration_tokens ?? [];
|
|
16
|
+
function handleOpenChange(nextOpen) {
|
|
17
|
+
setIsModalOpen(nextOpen);
|
|
18
|
+
if (!nextOpen) {
|
|
19
|
+
setCreatedToken(null);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
23
|
+
className: "flex min-w-0 flex-col gap-32",
|
|
24
|
+
children: /*#__PURE__*/ _jsxs("section", {
|
|
25
|
+
className: "flex flex-col gap-16",
|
|
26
|
+
children: [
|
|
27
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
28
|
+
className: "flex items-center justify-between gap-16 max-[640px]:items-start",
|
|
29
|
+
children: [
|
|
30
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
31
|
+
className: "flex flex-col gap-4",
|
|
32
|
+
children: [
|
|
33
|
+
/*#__PURE__*/ _jsx(Header, {
|
|
34
|
+
variant: "h3",
|
|
35
|
+
children: "Runner registration tokens"
|
|
36
|
+
}),
|
|
37
|
+
/*#__PURE__*/ _jsx(Text, {
|
|
38
|
+
size: "sm",
|
|
39
|
+
className: "text-foreground-neutral-muted",
|
|
40
|
+
children: "Register individual runner agents that run jobs directly in this workspace. Tokens are reusable until revoked."
|
|
41
|
+
})
|
|
42
|
+
]
|
|
43
|
+
}),
|
|
44
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
45
|
+
className: "flex items-center gap-12",
|
|
46
|
+
children: [
|
|
47
|
+
tokensQuery.isFetching && !tokensQuery.isPending ? /*#__PURE__*/ _jsx(Icon, {
|
|
48
|
+
name: "loader4Line",
|
|
49
|
+
className: "mt-2 size-18 text-foreground-neutral-muted",
|
|
50
|
+
"aria-label": "Refreshing tokens"
|
|
51
|
+
}) : null,
|
|
52
|
+
/*#__PURE__*/ _jsxs(Modal, {
|
|
53
|
+
open: isModalOpen,
|
|
54
|
+
onOpenChange: handleOpenChange,
|
|
55
|
+
children: [
|
|
56
|
+
/*#__PURE__*/ _jsx(ModalTrigger, {
|
|
57
|
+
asChild: true,
|
|
58
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
59
|
+
children: "Create token"
|
|
60
|
+
})
|
|
61
|
+
}),
|
|
62
|
+
/*#__PURE__*/ _jsxs(ModalContent, {
|
|
63
|
+
"aria-describedby": undefined,
|
|
64
|
+
children: [
|
|
65
|
+
/*#__PURE__*/ _jsx(ModalTitle, {
|
|
66
|
+
className: "sr-only",
|
|
67
|
+
children: "Create manual registration token"
|
|
68
|
+
}),
|
|
69
|
+
/*#__PURE__*/ _jsx(ModalHeader, {
|
|
70
|
+
children: /*#__PURE__*/ _jsx(Text, {
|
|
71
|
+
size: "lg",
|
|
72
|
+
"aria-hidden": "true",
|
|
73
|
+
className: "overflow-ellipsis overflow-hidden whitespace-nowrap",
|
|
74
|
+
children: "Create manual registration token"
|
|
75
|
+
})
|
|
76
|
+
}),
|
|
77
|
+
createdToken ? /*#__PURE__*/ _jsx(ModalBody, {
|
|
78
|
+
className: "gap-16",
|
|
79
|
+
children: /*#__PURE__*/ _jsx(CreatedManualRegistrationTokenPanel, {
|
|
80
|
+
token: createdToken
|
|
81
|
+
})
|
|
82
|
+
}) : /*#__PURE__*/ _jsx(CreateManualRegistrationTokenForm, {
|
|
83
|
+
workspaceId: workspaceId,
|
|
84
|
+
onCreated: setCreatedToken
|
|
85
|
+
})
|
|
86
|
+
]
|
|
87
|
+
})
|
|
88
|
+
]
|
|
89
|
+
})
|
|
90
|
+
]
|
|
91
|
+
})
|
|
92
|
+
]
|
|
93
|
+
}),
|
|
94
|
+
tokensQuery.isPending ? /*#__PURE__*/ _jsx(ManualRegistrationTokenTableSkeleton, {}) : null,
|
|
95
|
+
tokensQuery.isError && tokensQuery.data === undefined ? /*#__PURE__*/ _jsx(QueryLoadError, {
|
|
96
|
+
query: tokensQuery,
|
|
97
|
+
subject: "manual registration tokens"
|
|
98
|
+
}) : null,
|
|
99
|
+
tokensQuery.data !== undefined && tokens.length === 0 ? /*#__PURE__*/ _jsx(EmptyManualRegistrationTokens, {}) : null,
|
|
100
|
+
tokens.length > 0 ? /*#__PURE__*/ _jsx(ManualRegistrationTokenList, {
|
|
101
|
+
workspaceId: workspaceId,
|
|
102
|
+
tokens: tokens
|
|
103
|
+
}) : null
|
|
104
|
+
]
|
|
105
|
+
})
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
//# sourceMappingURL=manual-registration-tokens-settings-section.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/manual-registration-tokens-settings-section.tsx"],"sourcesContent":["import type {CreateManualRegistrationTokenResponseDto} from '@shipfox/api-runners-dto';\nimport {QueryLoadError} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {\n Modal,\n ModalBody,\n ModalContent,\n ModalHeader,\n ModalTitle,\n ModalTrigger,\n} from '@shipfox/react-ui/modal';\nimport {Header, Text} from '@shipfox/react-ui/typography';\nimport {useState} from 'react';\nimport {useManualRegistrationTokensQuery} from '#hooks/api/manual-registration-tokens.js';\nimport {\n CreatedManualRegistrationTokenPanel,\n CreateManualRegistrationTokenForm,\n} from './create-manual-registration-token-form.js';\nimport {\n EmptyManualRegistrationTokens,\n ManualRegistrationTokenList,\n ManualRegistrationTokenTableSkeleton,\n} from './manual-registration-token-list.js';\n\nexport function WorkspaceManualRegistrationTokensSettingsSection({\n workspaceId,\n}: {\n workspaceId: string;\n}) {\n const tokensQuery = useManualRegistrationTokensQuery(workspaceId);\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [createdToken, setCreatedToken] = useState<CreateManualRegistrationTokenResponseDto | null>(\n null,\n );\n const tokens = tokensQuery.data?.manual_registration_tokens ?? [];\n\n function handleOpenChange(nextOpen: boolean) {\n setIsModalOpen(nextOpen);\n if (!nextOpen) {\n setCreatedToken(null);\n }\n }\n\n return (\n <div className=\"flex min-w-0 flex-col gap-32\">\n <section className=\"flex flex-col gap-16\">\n <div className=\"flex items-center justify-between gap-16 max-[640px]:items-start\">\n <div className=\"flex flex-col gap-4\">\n <Header variant=\"h3\">Runner registration tokens</Header>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Register individual runner agents that run jobs directly in this workspace. Tokens are\n reusable until revoked.\n </Text>\n </div>\n <div className=\"flex items-center gap-12\">\n {tokensQuery.isFetching && !tokensQuery.isPending ? (\n <Icon\n name=\"loader4Line\"\n className=\"mt-2 size-18 text-foreground-neutral-muted\"\n aria-label=\"Refreshing tokens\"\n />\n ) : null}\n <Modal open={isModalOpen} onOpenChange={handleOpenChange}>\n <ModalTrigger asChild>\n <Button>Create token</Button>\n </ModalTrigger>\n <ModalContent aria-describedby={undefined}>\n <ModalTitle className=\"sr-only\">Create manual registration token</ModalTitle>\n <ModalHeader>\n <Text\n size=\"lg\"\n aria-hidden=\"true\"\n className=\"overflow-ellipsis overflow-hidden whitespace-nowrap\"\n >\n Create manual registration token\n </Text>\n </ModalHeader>\n {createdToken ? (\n <ModalBody className=\"gap-16\">\n <CreatedManualRegistrationTokenPanel token={createdToken} />\n </ModalBody>\n ) : (\n <CreateManualRegistrationTokenForm\n workspaceId={workspaceId}\n onCreated={setCreatedToken}\n />\n )}\n </ModalContent>\n </Modal>\n </div>\n </div>\n\n {tokensQuery.isPending ? <ManualRegistrationTokenTableSkeleton /> : null}\n\n {tokensQuery.isError && tokensQuery.data === undefined ? (\n <QueryLoadError query={tokensQuery} subject=\"manual registration tokens\" />\n ) : null}\n\n {tokensQuery.data !== undefined && tokens.length === 0 ? (\n <EmptyManualRegistrationTokens />\n ) : null}\n\n {tokens.length > 0 ? (\n <ManualRegistrationTokenList workspaceId={workspaceId} tokens={tokens} />\n ) : null}\n </section>\n </div>\n );\n}\n"],"names":["QueryLoadError","Button","Icon","Modal","ModalBody","ModalContent","ModalHeader","ModalTitle","ModalTrigger","Header","Text","useState","useManualRegistrationTokensQuery","CreatedManualRegistrationTokenPanel","CreateManualRegistrationTokenForm","EmptyManualRegistrationTokens","ManualRegistrationTokenList","ManualRegistrationTokenTableSkeleton","WorkspaceManualRegistrationTokensSettingsSection","workspaceId","tokensQuery","isModalOpen","setIsModalOpen","createdToken","setCreatedToken","tokens","data","manual_registration_tokens","handleOpenChange","nextOpen","div","className","section","variant","size","isFetching","isPending","name","aria-label","open","onOpenChange","asChild","aria-describedby","undefined","aria-hidden","token","onCreated","isError","query","subject","length"],"mappings":";AACA,SAAQA,cAAc,QAAO,qBAAqB;AAClD,SAAQC,MAAM,QAAO,2BAA2B;AAChD,SAAQC,IAAI,QAAO,yBAAyB;AAC5C,SACEC,KAAK,EACLC,SAAS,EACTC,YAAY,EACZC,WAAW,EACXC,UAAU,EACVC,YAAY,QACP,0BAA0B;AACjC,SAAQC,MAAM,EAAEC,IAAI,QAAO,+BAA+B;AAC1D,SAAQC,QAAQ,QAAO,QAAQ;AAC/B,SAAQC,gCAAgC,QAAO,2CAA2C;AAC1F,SACEC,mCAAmC,EACnCC,iCAAiC,QAC5B,6CAA6C;AACpD,SACEC,6BAA6B,EAC7BC,2BAA2B,EAC3BC,oCAAoC,QAC/B,sCAAsC;AAE7C,OAAO,SAASC,iDAAiD,EAC/DC,WAAW,EAGZ;IACC,MAAMC,cAAcR,iCAAiCO;IACrD,MAAM,CAACE,aAAaC,eAAe,GAAGX,SAAS;IAC/C,MAAM,CAACY,cAAcC,gBAAgB,GAAGb,SACtC;IAEF,MAAMc,SAASL,YAAYM,IAAI,EAAEC,8BAA8B,EAAE;IAEjE,SAASC,iBAAiBC,QAAiB;QACzCP,eAAeO;QACf,IAAI,CAACA,UAAU;YACbL,gBAAgB;QAClB;IACF;IAEA,qBACE,KAACM;QAAIC,WAAU;kBACb,cAAA,MAACC;YAAQD,WAAU;;8BACjB,MAACD;oBAAIC,WAAU;;sCACb,MAACD;4BAAIC,WAAU;;8CACb,KAACtB;oCAAOwB,SAAQ;8CAAK;;8CACrB,KAACvB;oCAAKwB,MAAK;oCAAKH,WAAU;8CAAgC;;;;sCAK5D,MAACD;4BAAIC,WAAU;;gCACZX,YAAYe,UAAU,IAAI,CAACf,YAAYgB,SAAS,iBAC/C,KAAClC;oCACCmC,MAAK;oCACLN,WAAU;oCACVO,cAAW;qCAEX;8CACJ,MAACnC;oCAAMoC,MAAMlB;oCAAamB,cAAcZ;;sDACtC,KAACpB;4CAAaiC,OAAO;sDACnB,cAAA,KAACxC;0DAAO;;;sDAEV,MAACI;4CAAaqC,oBAAkBC;;8DAC9B,KAACpC;oDAAWwB,WAAU;8DAAU;;8DAChC,KAACzB;8DACC,cAAA,KAACI;wDACCwB,MAAK;wDACLU,eAAY;wDACZb,WAAU;kEACX;;;gDAIFR,6BACC,KAACnB;oDAAU2B,WAAU;8DACnB,cAAA,KAAClB;wDAAoCgC,OAAOtB;;mEAG9C,KAACT;oDACCK,aAAaA;oDACb2B,WAAWtB;;;;;;;;;;gBAQtBJ,YAAYgB,SAAS,iBAAG,KAACnB,4CAA0C;gBAEnEG,YAAY2B,OAAO,IAAI3B,YAAYM,IAAI,KAAKiB,0BAC3C,KAAC3C;oBAAegD,OAAO5B;oBAAa6B,SAAQ;qBAC1C;gBAEH7B,YAAYM,IAAI,KAAKiB,aAAalB,OAAOyB,MAAM,KAAK,kBACnD,KAACnC,qCACC;gBAEHU,OAAOyB,MAAM,GAAG,kBACf,KAAClC;oBAA4BG,aAAaA;oBAAaM,QAAQA;qBAC7D;;;;AAIZ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisioner-token-errors.d.ts","sourceRoot":"","sources":["../../src/components/provisioner-token-errors.ts"],"names":[],"mappings":"AAEA,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASnE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ApiError } from '@shipfox/client-api';
|
|
2
|
+
export function provisionerTokenErrorMessage(error) {
|
|
3
|
+
if (error instanceof ApiError) {
|
|
4
|
+
if (error.code === 'network-error') {
|
|
5
|
+
return "We couldn't reach the server. Check your connection and try again.";
|
|
6
|
+
}
|
|
7
|
+
return error.message;
|
|
8
|
+
}
|
|
9
|
+
if (error instanceof Error) return error.message;
|
|
10
|
+
return 'Something went wrong. Try again.';
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=provisioner-token-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/provisioner-token-errors.ts"],"sourcesContent":["import {ApiError} from '@shipfox/client-api';\n\nexport function provisionerTokenErrorMessage(error: unknown): string {\n if (error instanceof ApiError) {\n if (error.code === 'network-error') {\n return \"We couldn't reach the server. Check your connection and try again.\";\n }\n return error.message;\n }\n if (error instanceof Error) return error.message;\n return 'Something went wrong. Try again.';\n}\n"],"names":["ApiError","provisionerTokenErrorMessage","error","code","message","Error"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,sBAAsB;AAE7C,OAAO,SAASC,6BAA6BC,KAAc;IACzD,IAAIA,iBAAiBF,UAAU;QAC7B,IAAIE,MAAMC,IAAI,KAAK,iBAAiB;YAClC,OAAO;QACT;QACA,OAAOD,MAAME,OAAO;IACtB;IACA,IAAIF,iBAAiBG,OAAO,OAAOH,MAAME,OAAO;IAChD,OAAO;AACT"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type ProvisionerTokenCreateFormErrorMapping = {
|
|
2
|
+
kind: 'form';
|
|
3
|
+
message: string;
|
|
4
|
+
};
|
|
5
|
+
export declare function provisionerTokenCreateErrorToFormError(error: unknown): ProvisionerTokenCreateFormErrorMapping;
|
|
6
|
+
//# sourceMappingURL=provisioner-token-form-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisioner-token-form-errors.d.ts","sourceRoot":"","sources":["../../src/components/provisioner-token-form-errors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,sCAAsC,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,CAAC;AAErF,wBAAgB,sCAAsC,CACpD,KAAK,EAAE,OAAO,GACb,sCAAsC,CAExC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { provisionerTokenErrorMessage } from './provisioner-token-errors.js';
|
|
2
|
+
export function provisionerTokenCreateErrorToFormError(error) {
|
|
3
|
+
return {
|
|
4
|
+
kind: 'form',
|
|
5
|
+
message: provisionerTokenErrorMessage(error)
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=provisioner-token-form-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/provisioner-token-form-errors.ts"],"sourcesContent":["import {provisionerTokenErrorMessage} from './provisioner-token-errors.js';\n\nexport type ProvisionerTokenCreateFormErrorMapping = {kind: 'form'; message: string};\n\nexport function provisionerTokenCreateErrorToFormError(\n error: unknown,\n): ProvisionerTokenCreateFormErrorMapping {\n return {kind: 'form', message: provisionerTokenErrorMessage(error)};\n}\n"],"names":["provisionerTokenErrorMessage","provisionerTokenCreateErrorToFormError","error","kind","message"],"mappings":"AAAA,SAAQA,4BAA4B,QAAO,gCAAgC;AAI3E,OAAO,SAASC,uCACdC,KAAc;IAEd,OAAO;QAACC,MAAM;QAAQC,SAASJ,6BAA6BE;IAAM;AACpE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ProvisionerTokenDto } from '@shipfox/api-runners-dto';
|
|
2
|
+
import type { DotVariant } from '@shipfox/react-ui/dot';
|
|
3
|
+
export type ProvisionerConnectionStatus = {
|
|
4
|
+
kind: 'connected';
|
|
5
|
+
dotVariant: DotVariant;
|
|
6
|
+
label: 'Connected';
|
|
7
|
+
} | {
|
|
8
|
+
kind: 'last-seen';
|
|
9
|
+
dotVariant: DotVariant;
|
|
10
|
+
label: 'Last seen';
|
|
11
|
+
lastSeenAt: string;
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'never-connected';
|
|
14
|
+
dotVariant: DotVariant;
|
|
15
|
+
label: 'Never connected';
|
|
16
|
+
};
|
|
17
|
+
export declare function formatProvisionerTokenDate(value: string | null): string;
|
|
18
|
+
export declare function formatProvisionerTokenTimestamp(value: string | null): string | undefined;
|
|
19
|
+
export declare function provisionerTokenDisplayName(token: Pick<ProvisionerTokenDto, 'name'>): string;
|
|
20
|
+
export declare function provisionerConnectionStatus(token: Pick<ProvisionerTokenDto, 'id' | 'last_seen_at'>, activeIds: ReadonlySet<string>): ProvisionerConnectionStatus;
|
|
21
|
+
//# sourceMappingURL=provisioner-token-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisioner-token-format.d.ts","sourceRoot":"","sources":["../../src/components/provisioner-token-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAGtD,MAAM,MAAM,2BAA2B,GACnC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAC,GAC/D;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,GACnF;IAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAC,CAAC;AAEhF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAGvE;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAGxF;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG,MAAM,CAE5F;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,cAAc,CAAC,EACvD,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,GAC7B,2BAA2B,CAa7B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { formatDate, formatTimestamp } from '@shipfox/react-ui/utils';
|
|
2
|
+
export function formatProvisionerTokenDate(value) {
|
|
3
|
+
if (!value) return 'Never';
|
|
4
|
+
return formatDate(value);
|
|
5
|
+
}
|
|
6
|
+
export function formatProvisionerTokenTimestamp(value) {
|
|
7
|
+
if (!value) return undefined;
|
|
8
|
+
return formatTimestamp(value);
|
|
9
|
+
}
|
|
10
|
+
export function provisionerTokenDisplayName(token) {
|
|
11
|
+
return token.name || 'Unnamed provisioner';
|
|
12
|
+
}
|
|
13
|
+
export function provisionerConnectionStatus(token, activeIds) {
|
|
14
|
+
if (activeIds.has(token.id)) {
|
|
15
|
+
return {
|
|
16
|
+
kind: 'connected',
|
|
17
|
+
dotVariant: 'success',
|
|
18
|
+
label: 'Connected'
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (token.last_seen_at) {
|
|
22
|
+
return {
|
|
23
|
+
kind: 'last-seen',
|
|
24
|
+
dotVariant: 'neutral',
|
|
25
|
+
label: 'Last seen',
|
|
26
|
+
lastSeenAt: token.last_seen_at
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
kind: 'never-connected',
|
|
31
|
+
dotVariant: 'neutral',
|
|
32
|
+
label: 'Never connected'
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=provisioner-token-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/provisioner-token-format.ts"],"sourcesContent":["import type {ProvisionerTokenDto} from '@shipfox/api-runners-dto';\nimport type {DotVariant} from '@shipfox/react-ui/dot';\nimport {formatDate, formatTimestamp} from '@shipfox/react-ui/utils';\n\nexport type ProvisionerConnectionStatus =\n | {kind: 'connected'; dotVariant: DotVariant; label: 'Connected'}\n | {kind: 'last-seen'; dotVariant: DotVariant; label: 'Last seen'; lastSeenAt: string}\n | {kind: 'never-connected'; dotVariant: DotVariant; label: 'Never connected'};\n\nexport function formatProvisionerTokenDate(value: string | null): string {\n if (!value) return 'Never';\n return formatDate(value);\n}\n\nexport function formatProvisionerTokenTimestamp(value: string | null): string | undefined {\n if (!value) return undefined;\n return formatTimestamp(value);\n}\n\nexport function provisionerTokenDisplayName(token: Pick<ProvisionerTokenDto, 'name'>): string {\n return token.name || 'Unnamed provisioner';\n}\n\nexport function provisionerConnectionStatus(\n token: Pick<ProvisionerTokenDto, 'id' | 'last_seen_at'>,\n activeIds: ReadonlySet<string>,\n): ProvisionerConnectionStatus {\n if (activeIds.has(token.id)) {\n return {kind: 'connected', dotVariant: 'success', label: 'Connected'};\n }\n if (token.last_seen_at) {\n return {\n kind: 'last-seen',\n dotVariant: 'neutral',\n label: 'Last seen',\n lastSeenAt: token.last_seen_at,\n };\n }\n return {kind: 'never-connected', dotVariant: 'neutral', label: 'Never connected'};\n}\n"],"names":["formatDate","formatTimestamp","formatProvisionerTokenDate","value","formatProvisionerTokenTimestamp","undefined","provisionerTokenDisplayName","token","name","provisionerConnectionStatus","activeIds","has","id","kind","dotVariant","label","last_seen_at","lastSeenAt"],"mappings":"AAEA,SAAQA,UAAU,EAAEC,eAAe,QAAO,0BAA0B;AAOpE,OAAO,SAASC,2BAA2BC,KAAoB;IAC7D,IAAI,CAACA,OAAO,OAAO;IACnB,OAAOH,WAAWG;AACpB;AAEA,OAAO,SAASC,gCAAgCD,KAAoB;IAClE,IAAI,CAACA,OAAO,OAAOE;IACnB,OAAOJ,gBAAgBE;AACzB;AAEA,OAAO,SAASG,4BAA4BC,KAAwC;IAClF,OAAOA,MAAMC,IAAI,IAAI;AACvB;AAEA,OAAO,SAASC,4BACdF,KAAuD,EACvDG,SAA8B;IAE9B,IAAIA,UAAUC,GAAG,CAACJ,MAAMK,EAAE,GAAG;QAC3B,OAAO;YAACC,MAAM;YAAaC,YAAY;YAAWC,OAAO;QAAW;IACtE;IACA,IAAIR,MAAMS,YAAY,EAAE;QACtB,OAAO;YACLH,MAAM;YACNC,YAAY;YACZC,OAAO;YACPE,YAAYV,MAAMS,YAAY;QAChC;IACF;IACA,OAAO;QAACH,MAAM;QAAmBC,YAAY;QAAWC,OAAO;IAAiB;AAClF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ProvisionerTokenDto } from '@shipfox/api-runners-dto';
|
|
2
|
+
export declare function ProvisionerTokenList({ workspaceId, tokens, activeIds, }: {
|
|
3
|
+
workspaceId: string;
|
|
4
|
+
tokens: ProvisionerTokenDto[];
|
|
5
|
+
activeIds: ReadonlySet<string>;
|
|
6
|
+
}): import("react").JSX.Element;
|
|
7
|
+
export declare function EmptyProvisionerTokens(): import("react").JSX.Element;
|
|
8
|
+
export declare function ProvisionerTokenTableSkeleton(): import("react").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=provisioner-token-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisioner-token-list.d.ts","sourceRoot":"","sources":["../../src/components/provisioner-token-list.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,0BAA0B,CAAC;AA8ClE,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,MAAM,EACN,SAAS,GACV,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAChC,+BAmFA;AA4HD,wBAAgB,sBAAsB,gCAQrC;AAED,wBAAgB,6BAA6B,gCAQ5C"}
|