@shipfox/client-runners 17.0.0 → 21.0.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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +26 -0
- package/dist/components/manual-registration-token-list.d.ts.map +1 -1
- package/dist/components/manual-registration-token-list.js +2 -1
- package/dist/components/manual-registration-token-list.js.map +1 -1
- package/dist/components/provisioner-token-list.d.ts.map +1 -1
- package/dist/components/provisioner-token-list.js +2 -1
- package/dist/components/provisioner-token-list.js.map +1 -1
- package/dist/components/token-settings-sections.stories.js +1 -1
- package/dist/components/token-settings-sections.stories.js.map +1 -1
- package/dist/routes/provisioners-settings.d.ts +3 -0
- package/dist/routes/provisioners-settings.js +3 -0
- package/dist/routes/provisioners-settings.js.map +1 -1
- package/dist/routes/runners-settings.d.ts +3 -0
- package/dist/routes/runners-settings.js +3 -0
- package/dist/routes/runners-settings.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/src/components/manual-registration-token-list.tsx +3 -2
- package/src/components/provisioner-token-list.tsx +3 -2
- package/src/components/token-settings-sections.stories.tsx +1 -1
- package/src/routes/provisioners-settings.tsx +1 -0
- package/src/routes/runners-settings.tsx +1 -0
- package/tsconfig.build.tsbuildinfo +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
$ shipfox-swc
|
|
2
|
-
Successfully compiled: 24 files with swc (
|
|
2
|
+
Successfully compiled: 24 files with swc (338.11ms)
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# @shipfox/client-runners
|
|
2
2
|
|
|
3
|
+
## 21.0.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [0f4abe4]
|
|
8
|
+
- Updated dependencies [71d0c44]
|
|
9
|
+
- Updated dependencies [9c21429]
|
|
10
|
+
- Updated dependencies [30beb8f]
|
|
11
|
+
- Updated dependencies [16733a7]
|
|
12
|
+
- Updated dependencies [163c40a]
|
|
13
|
+
- Updated dependencies [c4376a1]
|
|
14
|
+
- Updated dependencies [6703982]
|
|
15
|
+
- Updated dependencies [f1d127e]
|
|
16
|
+
- Updated dependencies [0e860d7]
|
|
17
|
+
- @shipfox/react-ui@2.0.0
|
|
18
|
+
- @shipfox/client-shell@21.0.0
|
|
19
|
+
- @shipfox/client-ui@21.0.0
|
|
20
|
+
|
|
21
|
+
## 17.0.1
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- Updated dependencies [9e16946]
|
|
26
|
+
- Updated dependencies [4fa8526]
|
|
27
|
+
- @shipfox/api-runners-dto@12.4.0
|
|
28
|
+
|
|
3
29
|
## 17.0.0
|
|
4
30
|
|
|
5
31
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manual-registration-token-list.d.ts","sourceRoot":"","sources":["../../src/components/manual-registration-token-list.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manual-registration-token-list.d.ts","sourceRoot":"","sources":["../../src/components/manual-registration-token-list.tsx"],"names":[],"mappings":"AA6BA,OAAO,EAAC,KAAK,uBAAuB,EAAmB,MAAM,gBAAgB,CAAC;AAU9E,wBAAgB,2BAA2B,CAAC,EAC1C,WAAW,EACX,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,uBAAuB,EAAE,CAAC;CACnC,+BA4EA;AA8FD,wBAAgB,6BAA6B,gCAQ5C;AAED,wBAAgB,oCAAoC,gCAYnD"}
|
|
@@ -4,6 +4,7 @@ import { Callout } from '@shipfox/react-ui/callout';
|
|
|
4
4
|
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@shipfox/react-ui/dropdown-menu';
|
|
5
5
|
import { EmptyState } from '@shipfox/react-ui/empty-state';
|
|
6
6
|
import { Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, ModalTitle } from '@shipfox/react-ui/modal';
|
|
7
|
+
import { Panel } from '@shipfox/react-ui/panel';
|
|
7
8
|
import { Skeleton } from '@shipfox/react-ui/skeleton';
|
|
8
9
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@shipfox/react-ui/table';
|
|
9
10
|
import { Code, Text } from '@shipfox/react-ui/typography';
|
|
@@ -17,7 +18,7 @@ import { TokenName } from './token-name.js';
|
|
|
17
18
|
export function ManualRegistrationTokenList({ workspaceId, tokens }) {
|
|
18
19
|
return /*#__PURE__*/ _jsxs(_Fragment, {
|
|
19
20
|
children: [
|
|
20
|
-
/*#__PURE__*/ _jsx(
|
|
21
|
+
/*#__PURE__*/ _jsx(Panel, {
|
|
21
22
|
className: "max-[760px]:hidden",
|
|
22
23
|
children: /*#__PURE__*/ _jsxs(Table, {
|
|
23
24
|
className: "table-fixed",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/manual-registration-token-list.tsx"],"sourcesContent":["import {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 {useState} from 'react';\nimport {type ManualRegistrationToken, tokenDisplayName} from '#core/token.js';\nimport {useRevokeManualRegistrationTokenMutation} from '#hooks/api/manual-registration-tokens.js';\nimport {manualRegistrationTokenErrorMessage} from './manual-registration-token-errors.js';\nimport {\n formatManualRegistrationTokenDate,\n formatManualRegistrationTokenTimestamp,\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: ManualRegistrationToken[];\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={tokenDisplayName(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.expiresAt} />\n </TableCell>\n <TableCell>\n <ManualRegistrationTokenDate value={token.createdAt} />\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-inline max-[760px]:flex\"\n aria-label=\"Manual registration tokens\"\n >\n {tokens.map((token) => (\n <li\n key={token.id}\n className=\"flex flex-col gap-cluster rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact\"\n >\n <div className=\"flex items-start justify-between gap-cluster\">\n <div className=\"min-w-0 flex-1\">\n <TokenName name={tokenDisplayName(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=\"grid grid-cols-2 gap-inline text-sm\">\n <div>\n <dt className=\"text-foreground-neutral-muted\">Expires</dt>\n <dd>\n <ManualRegistrationTokenDate value={token.expiresAt} />\n </dd>\n </div>\n <div>\n <dt className=\"text-foreground-neutral-muted\">Created</dt>\n <dd>\n <ManualRegistrationTokenDate value={token.createdAt} />\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: ManualRegistrationToken;\n}) {\n const revokeToken = useRevokeManualRegistrationTokenMutation(workspaceId);\n const [open, setOpen] = useState(false);\n const tokenName = tokenDisplayName(token);\n\n async function handleRevoke() {\n try {\n await revokeToken.mutateAsync(token.id);\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-group\">\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-inline\"\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","useState","tokenDisplayName","useRevokeManualRegistrationTokenMutation","manualRegistrationTokenErrorMessage","formatManualRegistrationTokenDate","formatManualRegistrationTokenTimestamp","TokenDate","TokenName","ManualRegistrationTokenList","workspaceId","tokens","div","className","map","token","name","variant","prefix","ManualRegistrationTokenDate","value","expiresAt","createdAt","RevokeManualRegistrationTokenButton","id","ul","aria-label","li","dl","dt","dd","date","timestamp","revokeToken","open","setOpen","tokenName","handleRevoke","mutateAsync","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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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/manual-registration-token-list.tsx"],"sourcesContent":["import {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 {Panel} from '@shipfox/react-ui/panel';\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 {useState} from 'react';\nimport {type ManualRegistrationToken, tokenDisplayName} from '#core/token.js';\nimport {useRevokeManualRegistrationTokenMutation} from '#hooks/api/manual-registration-tokens.js';\nimport {manualRegistrationTokenErrorMessage} from './manual-registration-token-errors.js';\nimport {\n formatManualRegistrationTokenDate,\n formatManualRegistrationTokenTimestamp,\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: ManualRegistrationToken[];\n}) {\n return (\n <>\n <Panel 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={tokenDisplayName(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.expiresAt} />\n </TableCell>\n <TableCell>\n <ManualRegistrationTokenDate value={token.createdAt} />\n </TableCell>\n <TableCell className=\"text-right\">\n <RevokeManualRegistrationTokenButton workspaceId={workspaceId} token={token} />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </Panel>\n <ul\n className=\"hidden flex-col gap-inline max-[760px]:flex\"\n aria-label=\"Manual registration tokens\"\n >\n {tokens.map((token) => (\n <li\n key={token.id}\n className=\"flex flex-col gap-cluster rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact\"\n >\n <div className=\"flex items-start justify-between gap-cluster\">\n <div className=\"min-w-0 flex-1\">\n <TokenName name={tokenDisplayName(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=\"grid grid-cols-2 gap-inline text-sm\">\n <div>\n <dt className=\"text-foreground-neutral-muted\">Expires</dt>\n <dd>\n <ManualRegistrationTokenDate value={token.expiresAt} />\n </dd>\n </div>\n <div>\n <dt className=\"text-foreground-neutral-muted\">Created</dt>\n <dd>\n <ManualRegistrationTokenDate value={token.createdAt} />\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: ManualRegistrationToken;\n}) {\n const revokeToken = useRevokeManualRegistrationTokenMutation(workspaceId);\n const [open, setOpen] = useState(false);\n const tokenName = tokenDisplayName(token);\n\n async function handleRevoke() {\n try {\n await revokeToken.mutateAsync(token.id);\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-group\">\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-inline\"\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","Panel","Skeleton","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","Code","Text","useState","tokenDisplayName","useRevokeManualRegistrationTokenMutation","manualRegistrationTokenErrorMessage","formatManualRegistrationTokenDate","formatManualRegistrationTokenTimestamp","TokenDate","TokenName","ManualRegistrationTokenList","workspaceId","tokens","className","map","token","name","variant","prefix","ManualRegistrationTokenDate","value","expiresAt","createdAt","RevokeManualRegistrationTokenButton","id","ul","aria-label","li","div","dl","dt","dd","date","timestamp","revokeToken","open","setOpen","tokenName","handleRevoke","mutateAsync","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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provisioner-token-list.d.ts","sourceRoot":"","sources":["../../src/components/provisioner-token-list.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provisioner-token-list.d.ts","sourceRoot":"","sources":["../../src/components/provisioner-token-list.tsx"],"names":[],"mappings":"AA+BA,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,gBAAgB,CAAC;AAUxB,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,MAAM,EACN,SAAS,GACV,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAChC,+BAmFA;AAqHD,wBAAgB,sBAAsB,gCAQrC;AAED,wBAAgB,6BAA6B,gCAQ5C"}
|
|
@@ -5,6 +5,7 @@ import { Dot } from '@shipfox/react-ui/dot';
|
|
|
5
5
|
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@shipfox/react-ui/dropdown-menu';
|
|
6
6
|
import { EmptyState } from '@shipfox/react-ui/empty-state';
|
|
7
7
|
import { Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, ModalTitle } from '@shipfox/react-ui/modal';
|
|
8
|
+
import { Panel } from '@shipfox/react-ui/panel';
|
|
8
9
|
import { RelativeTime } from '@shipfox/react-ui/relative-time';
|
|
9
10
|
import { Skeleton } from '@shipfox/react-ui/skeleton';
|
|
10
11
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@shipfox/react-ui/table';
|
|
@@ -19,7 +20,7 @@ import { TokenName } from './token-name.js';
|
|
|
19
20
|
export function ProvisionerTokenList({ workspaceId, tokens, activeIds }) {
|
|
20
21
|
return /*#__PURE__*/ _jsxs(_Fragment, {
|
|
21
22
|
children: [
|
|
22
|
-
/*#__PURE__*/ _jsx(
|
|
23
|
+
/*#__PURE__*/ _jsx(Panel, {
|
|
23
24
|
className: "max-[760px]:hidden",
|
|
24
25
|
children: /*#__PURE__*/ _jsxs(Table, {
|
|
25
26
|
className: "table-fixed",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/provisioner-token-list.tsx"],"sourcesContent":["import {Button, IconButton} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {Dot} from '@shipfox/react-ui/dot';\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 {RelativeTime} from '@shipfox/react-ui/relative-time';\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 {useState} from 'react';\nimport {\n type ProvisionerToken,\n provisionerConnectionStatus,\n provisionerTokenDisplayName,\n} from '#core/token.js';\nimport {useRevokeProvisionerTokenMutation} from '#hooks/api/provisioner-tokens.js';\nimport {provisionerTokenErrorMessage} from './provisioner-token-errors.js';\nimport {\n formatProvisionerTokenDate,\n formatProvisionerTokenTimestamp,\n} from './provisioner-token-format.js';\nimport {TokenDate} from './token-date.js';\nimport {TokenName} from './token-name.js';\n\nexport function ProvisionerTokenList({\n workspaceId,\n tokens,\n activeIds,\n}: {\n workspaceId: string;\n tokens: ProvisionerToken[];\n activeIds: ReadonlySet<string>;\n}) {\n return (\n <>\n <div className=\"max-[760px]:hidden\">\n <Table className=\"table-fixed\">\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[28%]\">Name</TableHead>\n <TableHead>Prefix</TableHead>\n <TableHead className=\"w-[18%]\">Status</TableHead>\n <TableHead className=\"w-112\">Expires</TableHead>\n <TableHead className=\"w-112\">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={provisionerTokenDisplayName(token)} />\n </TableCell>\n <TableCell>\n <Code variant=\"paragraph\" className=\"block truncate\">\n {token.prefix}\n </Code>\n </TableCell>\n <TableCell>\n <ProvisionerStatusCell token={token} activeIds={activeIds} />\n </TableCell>\n <TableCell>\n <ProvisionerTokenDate value={token.expiresAt} />\n </TableCell>\n <TableCell>\n <ProvisionerTokenDate value={token.createdAt} />\n </TableCell>\n <TableCell className=\"text-right\">\n <RevokeProvisionerTokenButton workspaceId={workspaceId} token={token} />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n <ul className=\"hidden flex-col gap-inline max-[760px]:flex\" aria-label=\"Provisioner tokens\">\n {tokens.map((token) => (\n <li\n key={token.id}\n className=\"flex flex-col gap-cluster rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact\"\n >\n <div className=\"flex items-start justify-between gap-cluster\">\n <div className=\"min-w-0 flex-1\">\n <TokenName name={provisionerTokenDisplayName(token)} />\n <Code variant=\"paragraph\" className=\"block truncate text-foreground-neutral-muted\">\n {token.prefix}\n </Code>\n </div>\n <RevokeProvisionerTokenButton workspaceId={workspaceId} token={token} />\n </div>\n <dl className=\"grid grid-cols-2 gap-inline text-sm\">\n <div>\n <dt className=\"text-foreground-neutral-muted\">Status</dt>\n <dd>\n <ProvisionerStatusCell token={token} activeIds={activeIds} />\n </dd>\n </div>\n <div>\n <dt className=\"text-foreground-neutral-muted\">Expires</dt>\n <dd>\n <ProvisionerTokenDate value={token.expiresAt} />\n </dd>\n </div>\n <div>\n <dt className=\"text-foreground-neutral-muted\">Created</dt>\n <dd>\n <ProvisionerTokenDate value={token.createdAt} />\n </dd>\n </div>\n </dl>\n </li>\n ))}\n </ul>\n </>\n );\n}\n\nfunction ProvisionerTokenDate({value}: {value: string | null}) {\n return (\n <TokenDate\n value={value}\n date={formatProvisionerTokenDate(value)}\n timestamp={formatProvisionerTokenTimestamp(value)}\n />\n );\n}\n\nfunction ProvisionerStatusCell({\n token,\n activeIds,\n}: {\n token: ProvisionerToken;\n activeIds: ReadonlySet<string>;\n}) {\n const status = provisionerConnectionStatus(token, activeIds);\n\n return (\n <span className=\"inline-flex items-center gap-inline\">\n <Dot variant={status.dotVariant} />\n {status.kind === 'last-seen' ? (\n <span>\n {status.label} <RelativeTime value={status.lastSeenAt} />\n </span>\n ) : (\n <span>{status.label}</span>\n )}\n </span>\n );\n}\n\nfunction RevokeProvisionerTokenButton({\n workspaceId,\n token,\n}: {\n workspaceId: string;\n token: ProvisionerToken;\n}) {\n const revokeToken = useRevokeProvisionerTokenMutation(workspaceId);\n const [open, setOpen] = useState(false);\n const tokenName = provisionerTokenDisplayName(token);\n\n async function handleRevoke() {\n try {\n await revokeToken.mutateAsync(token.id);\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} 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-group\">\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {tokenName} will stop authenticating this provisioner. Runners it already provisioned\n keep running until their leases expire.\n </Text>\n {revokeToken.isError ? (\n <Callout role=\"alert\" type=\"error\">\n <Text size=\"sm\">{provisionerTokenErrorMessage(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 EmptyProvisionerTokens() {\n return (\n <EmptyState\n icon=\"key2Line\"\n title=\"No usable provisioner registration tokens\"\n description=\"Create a token to connect a provisioner that provisions runners on demand.\"\n />\n );\n}\n\nexport function ProvisionerTokenTableSkeleton() {\n return (\n <div role=\"status\" aria-label=\"Loading provisioner tokens\" className=\"flex flex-col gap-inline\">\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","Dot","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","EmptyState","Modal","ModalBody","ModalContent","ModalFooter","ModalHeader","ModalTitle","RelativeTime","Skeleton","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","Code","Text","useState","provisionerConnectionStatus","provisionerTokenDisplayName","useRevokeProvisionerTokenMutation","provisionerTokenErrorMessage","formatProvisionerTokenDate","formatProvisionerTokenTimestamp","TokenDate","TokenName","ProvisionerTokenList","workspaceId","tokens","activeIds","div","className","map","token","name","variant","prefix","ProvisionerStatusCell","ProvisionerTokenDate","value","expiresAt","createdAt","RevokeProvisionerTokenButton","id","ul","aria-label","li","dl","dt","dd","date","timestamp","status","span","dotVariant","kind","label","lastSeenAt","revokeToken","open","setOpen","tokenName","handleRevoke","mutateAsync","handleOpenChange","nextOpen","reset","openRevokeConfirmation","asChild","type","size","icon","align","onSelect","onOpenChange","aria-describedby","undefined","title","isError","role","error","onClick","isLoading","isPending","EmptyProvisionerTokens","description","ProvisionerTokenTableSkeleton","row"],"mappings":";AAAA,SAAQA,MAAM,EAAEC,UAAU,QAAO,2BAA2B;AAC5D,SAAQC,OAAO,QAAO,4BAA4B;AAClD,SAAQC,GAAG,QAAO,wBAAwB;AAC1C,SACEC,YAAY,EACZC,mBAAmB,EACnBC,gBAAgB,EAChBC,mBAAmB,QACd,kCAAkC;AACzC,SAAQC,UAAU,QAAO,gCAAgC;AACzD,SACEC,KAAK,EACLC,SAAS,EACTC,YAAY,EACZC,WAAW,EACXC,WAAW,EACXC,UAAU,QACL,0BAA0B;AACjC,SAAQC,YAAY,QAAO,kCAAkC;AAC7D,SAAQC,QAAQ,QAAO,6BAA6B;AACpD,SACEC,KAAK,EACLC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,WAAW,EACXC,QAAQ,QACH,0BAA0B;AACjC,SAAQC,IAAI,EAAEC,IAAI,QAAO,+BAA+B;AACxD,SAAQC,QAAQ,QAAO,QAAQ;AAC/B,SAEEC,2BAA2B,EAC3BC,2BAA2B,QACtB,iBAAiB;AACxB,SAAQC,iCAAiC,QAAO,mCAAmC;AACnF,SAAQC,4BAA4B,QAAO,gCAAgC;AAC3E,SACEC,0BAA0B,EAC1BC,+BAA+B,QAC1B,gCAAgC;AACvC,SAAQC,SAAS,QAAO,kBAAkB;AAC1C,SAAQC,SAAS,QAAO,kBAAkB;AAE1C,OAAO,SAASC,qBAAqB,EACnCC,WAAW,EACXC,MAAM,EACNC,SAAS,EAKV;IACC,qBACE;;0BACE,KAACC;gBAAIC,WAAU;0BACb,cAAA,MAACtB;oBAAMsB,WAAU;;sCACf,KAAClB;sCACC,cAAA,MAACC;;kDACC,KAACF;wCAAUmB,WAAU;kDAAU;;kDAC/B,KAACnB;kDAAU;;kDACX,KAACA;wCAAUmB,WAAU;kDAAU;;kDAC/B,KAACnB;wCAAUmB,WAAU;kDAAQ;;kDAC7B,KAACnB;wCAAUmB,WAAU;kDAAQ;;kDAC7B,KAACnB;wCAAUmB,WAAU;kDAAkB;;;;;sCAG3C,KAACrB;sCACEkB,OAAOI,GAAG,CAAC,CAACC,sBACX,MAACnB;;sDACC,KAACH;sDACC,cAAA,KAACc;gDAAUS,MAAMf,4BAA4Bc;;;sDAE/C,KAACtB;sDACC,cAAA,KAACI;gDAAKoB,SAAQ;gDAAYJ,WAAU;0DACjCE,MAAMG,MAAM;;;sDAGjB,KAACzB;sDACC,cAAA,KAAC0B;gDAAsBJ,OAAOA;gDAAOJ,WAAWA;;;sDAElD,KAAClB;sDACC,cAAA,KAAC2B;gDAAqBC,OAAON,MAAMO,SAAS;;;sDAE9C,KAAC7B;sDACC,cAAA,KAAC2B;gDAAqBC,OAAON,MAAMQ,SAAS;;;sDAE9C,KAAC9B;4CAAUoB,WAAU;sDACnB,cAAA,KAACW;gDAA6Bf,aAAaA;gDAAaM,OAAOA;;;;mCAnBpDA,MAAMU,EAAE;;;;;0BA0B/B,KAACC;gBAAGb,WAAU;gBAA8Cc,cAAW;0BACpEjB,OAAOI,GAAG,CAAC,CAACC,sBACX,MAACa;wBAECf,WAAU;;0CAEV,MAACD;gCAAIC,WAAU;;kDACb,MAACD;wCAAIC,WAAU;;0DACb,KAACN;gDAAUS,MAAMf,4BAA4Bc;;0DAC7C,KAAClB;gDAAKoB,SAAQ;gDAAYJ,WAAU;0DACjCE,MAAMG,MAAM;;;;kDAGjB,KAACM;wCAA6Bf,aAAaA;wCAAaM,OAAOA;;;;0CAEjE,MAACc;gCAAGhB,WAAU;;kDACZ,MAACD;;0DACC,KAACkB;gDAAGjB,WAAU;0DAAgC;;0DAC9C,KAACkB;0DACC,cAAA,KAACZ;oDAAsBJ,OAAOA;oDAAOJ,WAAWA;;;;;kDAGpD,MAACC;;0DACC,KAACkB;gDAAGjB,WAAU;0DAAgC;;0DAC9C,KAACkB;0DACC,cAAA,KAACX;oDAAqBC,OAAON,MAAMO,SAAS;;;;;kDAGhD,MAACV;;0DACC,KAACkB;gDAAGjB,WAAU;0DAAgC;;0DAC9C,KAACkB;0DACC,cAAA,KAACX;oDAAqBC,OAAON,MAAMQ,SAAS;;;;;;;;uBA5B7CR,MAAMU,EAAE;;;;AAqCzB;AAEA,SAASL,qBAAqB,EAACC,KAAK,EAAyB;IAC3D,qBACE,KAACf;QACCe,OAAOA;QACPW,MAAM5B,2BAA2BiB;QACjCY,WAAW5B,gCAAgCgB;;AAGjD;AAEA,SAASF,sBAAsB,EAC7BJ,KAAK,EACLJ,SAAS,EAIV;IACC,MAAMuB,SAASlC,4BAA4Be,OAAOJ;IAElD,qBACE,MAACwB;QAAKtB,WAAU;;0BACd,KAACpC;gBAAIwC,SAASiB,OAAOE,UAAU;;YAC9BF,OAAOG,IAAI,KAAK,4BACf,MAACF;;oBACED,OAAOI,KAAK;oBAAC;kCAAC,KAACjD;wBAAagC,OAAOa,OAAOK,UAAU;;;+BAGvD,KAACJ;0BAAMD,OAAOI,KAAK;;;;AAI3B;AAEA,SAASd,6BAA6B,EACpCf,WAAW,EACXM,KAAK,EAIN;IACC,MAAMyB,cAActC,kCAAkCO;IACtD,MAAM,CAACgC,MAAMC,QAAQ,GAAG3C,SAAS;IACjC,MAAM4C,YAAY1C,4BAA4Bc;IAE9C,eAAe6B;QACb,IAAI;YACF,MAAMJ,YAAYK,WAAW,CAAC9B,MAAMU,EAAE;YACtCiB,QAAQ;QACV,EAAE,OAAM;QACN,2DAA2D;QAC7D;IACF;IAEA,SAASI,iBAAiBC,QAAiB;QACzCL,QAAQK;QACR,IAAIA,UAAU;YACZP,YAAYQ,KAAK;QACnB;IACF;IAEA,SAASC;QACPT,YAAYQ,KAAK;QACjBN,QAAQ;IACV;IAEA,qBACE;;0BACE,MAAChE;;kCACC,KAACG;wBAAoBqE,OAAO;kCAC1B,cAAA,KAAC3E;4BACC4E,MAAK;4BACLC,MAAK;4BACLnC,SAAQ;4BACRoC,MAAK;4BACL1B,cAAY,CAAC,KAAK,EAAEgB,UAAU,cAAc,CAAC;;;kCAGjD,KAAChE;wBAAoB2E,OAAM;wBAAMF,MAAK;kCACpC,cAAA,KAACxE;4BAAiB2E,UAAUN;sCAAwB;;;;;0BAGxD,KAAClE;gBAAM0D,MAAMA;gBAAMe,cAAcV;0BAC/B,cAAA,MAAC7D;oBAAawE,oBAAkBC;oBAAW7C,WAAU;;sCACnD,KAACzB;4BAAWyB,WAAU;sCAAU;;sCAChC,KAAC1B;4BAAYwE,OAAM;;sCACnB,MAAC3E;4BAAU6B,WAAU;;8CACnB,MAACf;oCAAKsD,MAAK;oCAAKvC,WAAU;;wCACvB8B;wCAAU;;;gCAGZH,YAAYoB,OAAO,iBAClB,KAACpF;oCAAQqF,MAAK;oCAAQV,MAAK;8CACzB,cAAA,KAACrD;wCAAKsD,MAAK;kDAAMjD,6BAA6BqC,YAAYsB,KAAK;;qCAE/D;;;sCAEN,MAAC5E;;8CACC,KAACZ;oCAAO8E,MAAK;oCAAKnC,SAAQ;oCAAY8C,SAAS,IAAMrB,QAAQ;8CAAQ;;8CAGrE,KAACpE;oCACC8E,MAAK;oCACLnC,SAAQ;oCACR+C,WAAWxB,YAAYyB,SAAS;oCAChCF,SAASnB;8CACV;;;;;;;;;AAQb;AAEA,OAAO,SAASsB;IACd,qBACE,KAACpF;QACCuE,MAAK;QACLM,OAAM;QACNQ,aAAY;;AAGlB;AAEA,OAAO,SAASC;IACd,qBACE,KAACxD;QAAIiD,MAAK;QAASlC,cAAW;QAA6Bd,WAAU;kBAClE;YAAC;YAAG;YAAG;SAAE,CAACC,GAAG,CAAC,CAACuD,oBACd,KAAC/E;gBAAmBuB,WAAU;eAAfwD;;AAIvB"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/provisioner-token-list.tsx"],"sourcesContent":["import {Button, IconButton} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {Dot} from '@shipfox/react-ui/dot';\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 {Panel} from '@shipfox/react-ui/panel';\nimport {RelativeTime} from '@shipfox/react-ui/relative-time';\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 {useState} from 'react';\nimport {\n type ProvisionerToken,\n provisionerConnectionStatus,\n provisionerTokenDisplayName,\n} from '#core/token.js';\nimport {useRevokeProvisionerTokenMutation} from '#hooks/api/provisioner-tokens.js';\nimport {provisionerTokenErrorMessage} from './provisioner-token-errors.js';\nimport {\n formatProvisionerTokenDate,\n formatProvisionerTokenTimestamp,\n} from './provisioner-token-format.js';\nimport {TokenDate} from './token-date.js';\nimport {TokenName} from './token-name.js';\n\nexport function ProvisionerTokenList({\n workspaceId,\n tokens,\n activeIds,\n}: {\n workspaceId: string;\n tokens: ProvisionerToken[];\n activeIds: ReadonlySet<string>;\n}) {\n return (\n <>\n <Panel className=\"max-[760px]:hidden\">\n <Table className=\"table-fixed\">\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[28%]\">Name</TableHead>\n <TableHead>Prefix</TableHead>\n <TableHead className=\"w-[18%]\">Status</TableHead>\n <TableHead className=\"w-112\">Expires</TableHead>\n <TableHead className=\"w-112\">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={provisionerTokenDisplayName(token)} />\n </TableCell>\n <TableCell>\n <Code variant=\"paragraph\" className=\"block truncate\">\n {token.prefix}\n </Code>\n </TableCell>\n <TableCell>\n <ProvisionerStatusCell token={token} activeIds={activeIds} />\n </TableCell>\n <TableCell>\n <ProvisionerTokenDate value={token.expiresAt} />\n </TableCell>\n <TableCell>\n <ProvisionerTokenDate value={token.createdAt} />\n </TableCell>\n <TableCell className=\"text-right\">\n <RevokeProvisionerTokenButton workspaceId={workspaceId} token={token} />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </Panel>\n <ul className=\"hidden flex-col gap-inline max-[760px]:flex\" aria-label=\"Provisioner tokens\">\n {tokens.map((token) => (\n <li\n key={token.id}\n className=\"flex flex-col gap-cluster rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact\"\n >\n <div className=\"flex items-start justify-between gap-cluster\">\n <div className=\"min-w-0 flex-1\">\n <TokenName name={provisionerTokenDisplayName(token)} />\n <Code variant=\"paragraph\" className=\"block truncate text-foreground-neutral-muted\">\n {token.prefix}\n </Code>\n </div>\n <RevokeProvisionerTokenButton workspaceId={workspaceId} token={token} />\n </div>\n <dl className=\"grid grid-cols-2 gap-inline text-sm\">\n <div>\n <dt className=\"text-foreground-neutral-muted\">Status</dt>\n <dd>\n <ProvisionerStatusCell token={token} activeIds={activeIds} />\n </dd>\n </div>\n <div>\n <dt className=\"text-foreground-neutral-muted\">Expires</dt>\n <dd>\n <ProvisionerTokenDate value={token.expiresAt} />\n </dd>\n </div>\n <div>\n <dt className=\"text-foreground-neutral-muted\">Created</dt>\n <dd>\n <ProvisionerTokenDate value={token.createdAt} />\n </dd>\n </div>\n </dl>\n </li>\n ))}\n </ul>\n </>\n );\n}\n\nfunction ProvisionerTokenDate({value}: {value: string | null}) {\n return (\n <TokenDate\n value={value}\n date={formatProvisionerTokenDate(value)}\n timestamp={formatProvisionerTokenTimestamp(value)}\n />\n );\n}\n\nfunction ProvisionerStatusCell({\n token,\n activeIds,\n}: {\n token: ProvisionerToken;\n activeIds: ReadonlySet<string>;\n}) {\n const status = provisionerConnectionStatus(token, activeIds);\n\n return (\n <span className=\"inline-flex items-center gap-inline\">\n <Dot variant={status.dotVariant} />\n {status.kind === 'last-seen' ? (\n <span>\n {status.label} <RelativeTime value={status.lastSeenAt} />\n </span>\n ) : (\n <span>{status.label}</span>\n )}\n </span>\n );\n}\n\nfunction RevokeProvisionerTokenButton({\n workspaceId,\n token,\n}: {\n workspaceId: string;\n token: ProvisionerToken;\n}) {\n const revokeToken = useRevokeProvisionerTokenMutation(workspaceId);\n const [open, setOpen] = useState(false);\n const tokenName = provisionerTokenDisplayName(token);\n\n async function handleRevoke() {\n try {\n await revokeToken.mutateAsync(token.id);\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} 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-group\">\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {tokenName} will stop authenticating this provisioner. Runners it already provisioned\n keep running until their leases expire.\n </Text>\n {revokeToken.isError ? (\n <Callout role=\"alert\" type=\"error\">\n <Text size=\"sm\">{provisionerTokenErrorMessage(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 EmptyProvisionerTokens() {\n return (\n <EmptyState\n icon=\"key2Line\"\n title=\"No usable provisioner registration tokens\"\n description=\"Create a token to connect a provisioner that provisions runners on demand.\"\n />\n );\n}\n\nexport function ProvisionerTokenTableSkeleton() {\n return (\n <div role=\"status\" aria-label=\"Loading provisioner tokens\" className=\"flex flex-col gap-inline\">\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","Dot","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","EmptyState","Modal","ModalBody","ModalContent","ModalFooter","ModalHeader","ModalTitle","Panel","RelativeTime","Skeleton","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","Code","Text","useState","provisionerConnectionStatus","provisionerTokenDisplayName","useRevokeProvisionerTokenMutation","provisionerTokenErrorMessage","formatProvisionerTokenDate","formatProvisionerTokenTimestamp","TokenDate","TokenName","ProvisionerTokenList","workspaceId","tokens","activeIds","className","map","token","name","variant","prefix","ProvisionerStatusCell","ProvisionerTokenDate","value","expiresAt","createdAt","RevokeProvisionerTokenButton","id","ul","aria-label","li","div","dl","dt","dd","date","timestamp","status","span","dotVariant","kind","label","lastSeenAt","revokeToken","open","setOpen","tokenName","handleRevoke","mutateAsync","handleOpenChange","nextOpen","reset","openRevokeConfirmation","asChild","type","size","icon","align","onSelect","onOpenChange","aria-describedby","undefined","title","isError","role","error","onClick","isLoading","isPending","EmptyProvisionerTokens","description","ProvisionerTokenTableSkeleton","row"],"mappings":"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"}
|
|
@@ -230,7 +230,7 @@ export const CreatedTokenPanels = {
|
|
|
230
230
|
};
|
|
231
231
|
function StorySurface({ children }) {
|
|
232
232
|
return /*#__PURE__*/ _jsx("div", {
|
|
233
|
-
className: "min-h-screen bg-background-
|
|
233
|
+
className: "min-h-screen bg-background-subtle-base p-24",
|
|
234
234
|
children: /*#__PURE__*/ _jsx("div", {
|
|
235
235
|
className: "mx-auto flex w-full max-w-[920px] flex-col gap-32",
|
|
236
236
|
children: children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/token-settings-sections.stories.tsx"],"sourcesContent":["import type {ManualRegistrationTokenDto, ProvisionerTokenDto} from '@shipfox/api-runners-dto';\nimport {configureApiClient} from '@shipfox/client-api';\nimport {RelativeTimeProvider} from '@shipfox/react-ui/relative-time';\nimport {Toaster} from '@shipfox/react-ui/toast';\nimport {Code} from '@shipfox/react-ui/typography';\nimport type {Decorator, Meta, StoryObj} from '@storybook/react';\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query';\nimport type {ReactNode} from 'react';\nimport {within} from 'storybook/test';\nimport type {\n CreatedProvisionerToken,\n ManualRegistrationToken,\n ProvisionerToken,\n} from '#core/token.js';\nimport {CreatedManualRegistrationTokenPanel} from './create-manual-registration-token-form.js';\nimport {CreatedProvisionerTokenPanel} from './create-provisioner-token-form.js';\nimport {\n EmptyManualRegistrationTokens,\n ManualRegistrationTokenList,\n ManualRegistrationTokenTableSkeleton,\n} from './manual-registration-token-list.js';\nimport {WorkspaceManualRegistrationTokensSettingsSection} from './manual-registration-tokens-settings-section.js';\nimport {\n EmptyProvisionerTokens,\n ProvisionerTokenList,\n ProvisionerTokenTableSkeleton,\n} from './provisioner-token-list.js';\nimport {WorkspaceProvisionerTokensSettingsSection} from './provisioner-tokens-settings-section.js';\n\nconst WORKSPACE_ID = '11111111-1111-4111-8111-111111111111';\nconst NOW = '2026-06-26T12:00:00.000Z';\nconst EIGHT_MINUTES_AGO = '2026-06-26T11:52:00.000Z';\nconst EXPIRES_AT = '2026-09-24T12:00:00.000Z';\nconst CREATED_AT = '2026-06-20T12:00:00.000Z';\n\ntype Scenario = 'populated' | 'empty' | 'loading' | 'errors';\n\ninterface TokenSettingsSectionsStoryProps {\n scenario: Scenario;\n}\n\nconst withQueryClient: Decorator = (Story) => {\n const queryClient = new QueryClient({defaultOptions: {queries: {retry: false}}});\n return (\n <QueryClientProvider client={queryClient}>\n <RelativeTimeProvider>\n <Story />\n </RelativeTimeProvider>\n <Toaster />\n </QueryClientProvider>\n );\n};\n\nfunction TokenSettingsSectionsStory({scenario}: TokenSettingsSectionsStoryProps) {\n configureApiClient({\n baseUrl: 'https://api.example.test',\n fetchImpl: fetchForScenario(scenario),\n });\n\n return (\n <StorySurface>\n <WorkspaceManualRegistrationTokensSettingsSection workspaceId={WORKSPACE_ID} />\n <WorkspaceProvisionerTokensSettingsSection workspaceId={WORKSPACE_ID} />\n </StorySurface>\n );\n}\n\nconst meta = {\n title: 'Runners/TokenSettingsSections',\n component: TokenSettingsSectionsStory,\n parameters: {layout: 'fullscreen'},\n decorators: [withQueryClient],\n args: {scenario: 'populated'},\n} satisfies Meta<typeof TokenSettingsSectionsStory>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Playground: Story = {\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await canvas.findAllByText('Deploy runner');\n await canvas.findAllByText('Docker autoscaler');\n await canvas.findAllByText('Connected');\n await canvas.findAllByText('Never connected');\n },\n};\n\nexport const DataStates: Story = {\n render: () => (\n <StorySurface>\n <StateExample label=\"Manual empty\">\n <EmptyManualRegistrationTokens />\n </StateExample>\n <StateExample label=\"Manual loading\">\n <ManualRegistrationTokenTableSkeleton />\n </StateExample>\n <StateExample label=\"Provisioner empty\">\n <EmptyProvisionerTokens />\n </StateExample>\n <StateExample label=\"Provisioner loading\">\n <ProvisionerTokenTableSkeleton />\n </StateExample>\n </StorySurface>\n ),\n};\n\nexport const Errors: Story = {\n args: {scenario: 'errors'},\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await canvas.findByText(\"Couldn't load manual registration tokens\");\n await canvas.findByText(\"Couldn't load provisioner registration tokens\");\n },\n};\n\nexport const Statuses: Story = {\n render: () => (\n <StorySurface>\n <ProvisionerTokenList\n workspaceId={WORKSPACE_ID}\n tokens={[\n provisionerTokenModel({\n id: '33333333-3333-4333-8333-333333333333',\n name: 'Docker autoscaler',\n lastSeenAt: NOW,\n }),\n provisionerTokenModel({\n id: '44444444-4444-4444-8444-444444444444',\n name: 'Kubernetes spot pool',\n lastSeenAt: EIGHT_MINUTES_AGO,\n }),\n provisionerTokenModel({\n id: '55555555-5555-4555-8555-555555555555',\n name: 'Buildkite migration pool',\n lastSeenAt: null,\n }),\n ]}\n activeIds={new Set(['33333333-3333-4333-8333-333333333333'])}\n />\n </StorySurface>\n ),\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await canvas.findAllByText('Connected');\n await canvas.findAllByText('Last seen');\n await canvas.findAllByText('Never connected');\n },\n};\n\nexport const Content: Story = {\n render: () => (\n <StorySurface>\n <StateExample label=\"Existing tokens\">\n <div className=\"flex flex-col gap-24\">\n <ManualRegistrationTokenList\n workspaceId={WORKSPACE_ID}\n tokens={[\n manualRegistrationToken({name: 'Deploy runner', prefix: 'sf_mrt_deploy'}),\n manualRegistrationToken({\n id: '66666666-6666-4666-8666-666666666666',\n name: 'macOS build host',\n prefix: 'sf_mrt_macos',\n expiresAt: null,\n }),\n ]}\n />\n <ProvisionerTokenList\n workspaceId={WORKSPACE_ID}\n tokens={provisionerTokenModels()}\n activeIds={new Set(['33333333-3333-4333-8333-333333333333'])}\n />\n </div>\n </StateExample>\n <StateExample label=\"Long names\">\n <div className=\"flex flex-col gap-24\">\n <ManualRegistrationTokenList\n workspaceId={WORKSPACE_ID}\n tokens={[\n manualRegistrationToken({\n name: 'self-hosted-runner-for-production-release-candidate-validation-on-metal',\n prefix: 'sf_mrt_release_candidate_validation',\n }),\n ]}\n />\n <ProvisionerTokenList\n workspaceId={WORKSPACE_ID}\n tokens={[\n provisionerTokenModel({\n name: 'docker-provisioner-for-west-coast-gpu-burst-capacity-and-fallback',\n prefix: 'sf_pt_west_coast_gpu_burst',\n lastSeenAt: EIGHT_MINUTES_AGO,\n }),\n ]}\n activeIds={new Set()}\n />\n </div>\n </StateExample>\n </StorySurface>\n ),\n};\n\nexport const CreatedTokenPanels: Story = {\n render: () => (\n <StorySurface>\n <StateExample label=\"Manual token reveal\">\n <CreatedManualRegistrationTokenPanel\n token={{\n id: '77777777-7777-4777-8777-777777777777',\n token: 'sf_mrt_4nJvNrs23ExampleManualTokenValue',\n prefix: 'sf_mrt_4nJv',\n name: 'Deploy runner',\n workspaceId: WORKSPACE_ID,\n expiresAt: EXPIRES_AT,\n createdAt: CREATED_AT,\n }}\n />\n </StateExample>\n <StateExample label=\"Provisioner token reveal\">\n <CreatedProvisionerTokenPanel token={createdProvisionerToken()} />\n </StateExample>\n </StorySurface>\n ),\n};\n\nfunction StorySurface({children}: {children: ReactNode}) {\n return (\n <div className=\"min-h-screen bg-background-neutral-background p-24\">\n <div className=\"mx-auto flex w-full max-w-[920px] flex-col gap-32\">{children}</div>\n </div>\n );\n}\n\nfunction StateExample({label, children}: {label: string; children: ReactNode}) {\n return (\n <div className=\"flex flex-col gap-8\">\n <Code variant=\"label\" className=\"text-foreground-neutral-subtle\">\n {label}\n </Code>\n <div className=\"rounded-8 border border-border-neutral-base bg-background-neutral-base p-16\">\n {children}\n </div>\n </div>\n );\n}\n\nfunction fetchForScenario(scenario: Scenario): typeof fetch {\n return (input) => {\n const url = requestUrl(input);\n if (scenario === 'loading') return new Promise<Response>(() => undefined);\n if (url.pathname.endsWith('/runners/manual-registration-tokens')) {\n if (scenario === 'errors') return Promise.resolve(errorResponse());\n return Promise.resolve(\n jsonResponse({\n manual_registration_tokens: scenario === 'empty' ? [] : [manualToken()],\n }),\n );\n }\n if (url.pathname.endsWith('/provisioners/tokens')) {\n if (scenario === 'errors') return Promise.resolve(errorResponse());\n return Promise.resolve(\n jsonResponse({\n tokens: scenario === 'empty' ? [] : provisionerTokens(),\n }),\n );\n }\n if (url.pathname.endsWith('/provisioners/active')) {\n return Promise.resolve(\n jsonResponse({\n provisioners:\n scenario === 'empty'\n ? []\n : [\n {\n id: '33333333-3333-4333-8333-333333333333',\n name: 'Docker autoscaler',\n prefix: 'sf_pt_docker',\n last_seen_at: NOW,\n },\n ],\n }),\n );\n }\n return Promise.resolve(jsonResponse({}, {status: 404}));\n };\n}\n\nfunction provisionerTokens(): ProvisionerTokenDto[] {\n return [\n provisionerToken({\n id: '33333333-3333-4333-8333-333333333333',\n name: 'Docker autoscaler',\n prefix: 'sf_pt_docker',\n last_seen_at: NOW,\n }),\n provisionerToken({\n id: '44444444-4444-4444-8444-444444444444',\n name: 'Kubernetes spot pool',\n prefix: 'sf_pt_spot',\n last_seen_at: EIGHT_MINUTES_AGO,\n }),\n provisionerToken({\n id: '55555555-5555-4555-8555-555555555555',\n name: 'Buildkite migration pool',\n prefix: 'sf_pt_migrate',\n last_seen_at: null,\n }),\n ];\n}\n\nfunction manualRegistrationToken(\n overrides: Partial<ManualRegistrationToken> = {},\n): ManualRegistrationToken {\n return {\n id: '22222222-2222-4222-8222-222222222222',\n workspaceId: WORKSPACE_ID,\n prefix: 'sf_mrt_deploy',\n name: 'Deploy runner',\n expiresAt: EXPIRES_AT,\n revokedAt: null,\n createdAt: CREATED_AT,\n updatedAt: CREATED_AT,\n ...overrides,\n };\n}\n\nfunction provisionerTokenModel(overrides: Partial<ProvisionerToken> = {}): ProvisionerToken {\n return {\n ...manualRegistrationToken(),\n createdByUserId: '99999999-9999-4999-8999-999999999999',\n revokedByUserId: null,\n lastSeenAt: NOW,\n ...overrides,\n };\n}\n\nfunction provisionerTokenModels(): ProvisionerToken[] {\n return [\n provisionerTokenModel({id: '33333333-3333-4333-8333-333333333333', name: 'Docker autoscaler'}),\n provisionerTokenModel({\n id: '44444444-4444-4444-8444-444444444444',\n name: 'Kubernetes spot pool',\n lastSeenAt: EIGHT_MINUTES_AGO,\n }),\n provisionerTokenModel({\n id: '55555555-5555-4555-8555-555555555555',\n name: 'Buildkite migration pool',\n lastSeenAt: null,\n }),\n ];\n}\n\nfunction createdProvisionerToken(): CreatedProvisionerToken {\n return {\n ...provisionerTokenModel({name: 'Docker autoscaler'}),\n token: 'sf_pt_Rv8YwrExampleProvisionerTokenValue',\n };\n}\n\nfunction manualToken(\n overrides: Partial<ManualRegistrationTokenDto> = {},\n): ManualRegistrationTokenDto {\n return {\n id: '22222222-2222-4222-8222-222222222222',\n workspace_id: WORKSPACE_ID,\n prefix: 'sf_mrt_deploy',\n name: 'Deploy runner',\n expires_at: EXPIRES_AT,\n revoked_at: null,\n created_at: CREATED_AT,\n updated_at: CREATED_AT,\n ...overrides,\n };\n}\n\nfunction provisionerToken(overrides: Partial<ProvisionerTokenDto> = {}): ProvisionerTokenDto {\n return {\n id: '33333333-3333-4333-8333-333333333333',\n scope: 'workspace',\n workspace_id: WORKSPACE_ID,\n prefix: 'sf_pt_docker',\n name: 'Docker autoscaler',\n created_by_user_id: '99999999-9999-4999-8999-999999999999',\n revoked_by_user_id: null,\n expires_at: EXPIRES_AT,\n revoked_at: null,\n last_seen_at: NOW,\n created_at: CREATED_AT,\n updated_at: CREATED_AT,\n ...overrides,\n };\n}\n\nfunction requestUrl(input: RequestInfo | URL): URL {\n if (typeof input === 'string') return new URL(input);\n if (input instanceof URL) return input;\n return new URL(input.url);\n}\n\nfunction jsonResponse(body: unknown, init: ResponseInit = {}) {\n return new Response(JSON.stringify(body), {\n status: 200,\n headers: {'content-type': 'application/json'},\n ...init,\n });\n}\n\nfunction errorResponse() {\n return jsonResponse({code: 'server-error'}, {status: 500, statusText: 'Server error'});\n}\n"],"names":["configureApiClient","RelativeTimeProvider","Toaster","Code","QueryClient","QueryClientProvider","within","CreatedManualRegistrationTokenPanel","CreatedProvisionerTokenPanel","EmptyManualRegistrationTokens","ManualRegistrationTokenList","ManualRegistrationTokenTableSkeleton","WorkspaceManualRegistrationTokensSettingsSection","EmptyProvisionerTokens","ProvisionerTokenList","ProvisionerTokenTableSkeleton","WorkspaceProvisionerTokensSettingsSection","WORKSPACE_ID","NOW","EIGHT_MINUTES_AGO","EXPIRES_AT","CREATED_AT","withQueryClient","Story","queryClient","defaultOptions","queries","retry","client","TokenSettingsSectionsStory","scenario","baseUrl","fetchImpl","fetchForScenario","StorySurface","workspaceId","meta","title","component","parameters","layout","decorators","args","Playground","play","canvasElement","canvas","findAllByText","DataStates","render","StateExample","label","Errors","findByText","Statuses","tokens","provisionerTokenModel","id","name","lastSeenAt","activeIds","Set","Content","div","className","manualRegistrationToken","prefix","expiresAt","provisionerTokenModels","CreatedTokenPanels","token","createdAt","createdProvisionerToken","children","variant","input","url","requestUrl","Promise","undefined","pathname","endsWith","resolve","errorResponse","jsonResponse","manual_registration_tokens","manualToken","provisionerTokens","provisioners","last_seen_at","status","provisionerToken","overrides","revokedAt","updatedAt","createdByUserId","revokedByUserId","workspace_id","expires_at","revoked_at","created_at","updated_at","scope","created_by_user_id","revoked_by_user_id","URL","body","init","Response","JSON","stringify","headers","code","statusText"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/token-settings-sections.stories.tsx"],"sourcesContent":["import type {ManualRegistrationTokenDto, ProvisionerTokenDto} from '@shipfox/api-runners-dto';\nimport {configureApiClient} from '@shipfox/client-api';\nimport {RelativeTimeProvider} from '@shipfox/react-ui/relative-time';\nimport {Toaster} from '@shipfox/react-ui/toast';\nimport {Code} from '@shipfox/react-ui/typography';\nimport type {Decorator, Meta, StoryObj} from '@storybook/react';\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query';\nimport type {ReactNode} from 'react';\nimport {within} from 'storybook/test';\nimport type {\n CreatedProvisionerToken,\n ManualRegistrationToken,\n ProvisionerToken,\n} from '#core/token.js';\nimport {CreatedManualRegistrationTokenPanel} from './create-manual-registration-token-form.js';\nimport {CreatedProvisionerTokenPanel} from './create-provisioner-token-form.js';\nimport {\n EmptyManualRegistrationTokens,\n ManualRegistrationTokenList,\n ManualRegistrationTokenTableSkeleton,\n} from './manual-registration-token-list.js';\nimport {WorkspaceManualRegistrationTokensSettingsSection} from './manual-registration-tokens-settings-section.js';\nimport {\n EmptyProvisionerTokens,\n ProvisionerTokenList,\n ProvisionerTokenTableSkeleton,\n} from './provisioner-token-list.js';\nimport {WorkspaceProvisionerTokensSettingsSection} from './provisioner-tokens-settings-section.js';\n\nconst WORKSPACE_ID = '11111111-1111-4111-8111-111111111111';\nconst NOW = '2026-06-26T12:00:00.000Z';\nconst EIGHT_MINUTES_AGO = '2026-06-26T11:52:00.000Z';\nconst EXPIRES_AT = '2026-09-24T12:00:00.000Z';\nconst CREATED_AT = '2026-06-20T12:00:00.000Z';\n\ntype Scenario = 'populated' | 'empty' | 'loading' | 'errors';\n\ninterface TokenSettingsSectionsStoryProps {\n scenario: Scenario;\n}\n\nconst withQueryClient: Decorator = (Story) => {\n const queryClient = new QueryClient({defaultOptions: {queries: {retry: false}}});\n return (\n <QueryClientProvider client={queryClient}>\n <RelativeTimeProvider>\n <Story />\n </RelativeTimeProvider>\n <Toaster />\n </QueryClientProvider>\n );\n};\n\nfunction TokenSettingsSectionsStory({scenario}: TokenSettingsSectionsStoryProps) {\n configureApiClient({\n baseUrl: 'https://api.example.test',\n fetchImpl: fetchForScenario(scenario),\n });\n\n return (\n <StorySurface>\n <WorkspaceManualRegistrationTokensSettingsSection workspaceId={WORKSPACE_ID} />\n <WorkspaceProvisionerTokensSettingsSection workspaceId={WORKSPACE_ID} />\n </StorySurface>\n );\n}\n\nconst meta = {\n title: 'Runners/TokenSettingsSections',\n component: TokenSettingsSectionsStory,\n parameters: {layout: 'fullscreen'},\n decorators: [withQueryClient],\n args: {scenario: 'populated'},\n} satisfies Meta<typeof TokenSettingsSectionsStory>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Playground: Story = {\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await canvas.findAllByText('Deploy runner');\n await canvas.findAllByText('Docker autoscaler');\n await canvas.findAllByText('Connected');\n await canvas.findAllByText('Never connected');\n },\n};\n\nexport const DataStates: Story = {\n render: () => (\n <StorySurface>\n <StateExample label=\"Manual empty\">\n <EmptyManualRegistrationTokens />\n </StateExample>\n <StateExample label=\"Manual loading\">\n <ManualRegistrationTokenTableSkeleton />\n </StateExample>\n <StateExample label=\"Provisioner empty\">\n <EmptyProvisionerTokens />\n </StateExample>\n <StateExample label=\"Provisioner loading\">\n <ProvisionerTokenTableSkeleton />\n </StateExample>\n </StorySurface>\n ),\n};\n\nexport const Errors: Story = {\n args: {scenario: 'errors'},\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await canvas.findByText(\"Couldn't load manual registration tokens\");\n await canvas.findByText(\"Couldn't load provisioner registration tokens\");\n },\n};\n\nexport const Statuses: Story = {\n render: () => (\n <StorySurface>\n <ProvisionerTokenList\n workspaceId={WORKSPACE_ID}\n tokens={[\n provisionerTokenModel({\n id: '33333333-3333-4333-8333-333333333333',\n name: 'Docker autoscaler',\n lastSeenAt: NOW,\n }),\n provisionerTokenModel({\n id: '44444444-4444-4444-8444-444444444444',\n name: 'Kubernetes spot pool',\n lastSeenAt: EIGHT_MINUTES_AGO,\n }),\n provisionerTokenModel({\n id: '55555555-5555-4555-8555-555555555555',\n name: 'Buildkite migration pool',\n lastSeenAt: null,\n }),\n ]}\n activeIds={new Set(['33333333-3333-4333-8333-333333333333'])}\n />\n </StorySurface>\n ),\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await canvas.findAllByText('Connected');\n await canvas.findAllByText('Last seen');\n await canvas.findAllByText('Never connected');\n },\n};\n\nexport const Content: Story = {\n render: () => (\n <StorySurface>\n <StateExample label=\"Existing tokens\">\n <div className=\"flex flex-col gap-24\">\n <ManualRegistrationTokenList\n workspaceId={WORKSPACE_ID}\n tokens={[\n manualRegistrationToken({name: 'Deploy runner', prefix: 'sf_mrt_deploy'}),\n manualRegistrationToken({\n id: '66666666-6666-4666-8666-666666666666',\n name: 'macOS build host',\n prefix: 'sf_mrt_macos',\n expiresAt: null,\n }),\n ]}\n />\n <ProvisionerTokenList\n workspaceId={WORKSPACE_ID}\n tokens={provisionerTokenModels()}\n activeIds={new Set(['33333333-3333-4333-8333-333333333333'])}\n />\n </div>\n </StateExample>\n <StateExample label=\"Long names\">\n <div className=\"flex flex-col gap-24\">\n <ManualRegistrationTokenList\n workspaceId={WORKSPACE_ID}\n tokens={[\n manualRegistrationToken({\n name: 'self-hosted-runner-for-production-release-candidate-validation-on-metal',\n prefix: 'sf_mrt_release_candidate_validation',\n }),\n ]}\n />\n <ProvisionerTokenList\n workspaceId={WORKSPACE_ID}\n tokens={[\n provisionerTokenModel({\n name: 'docker-provisioner-for-west-coast-gpu-burst-capacity-and-fallback',\n prefix: 'sf_pt_west_coast_gpu_burst',\n lastSeenAt: EIGHT_MINUTES_AGO,\n }),\n ]}\n activeIds={new Set()}\n />\n </div>\n </StateExample>\n </StorySurface>\n ),\n};\n\nexport const CreatedTokenPanels: Story = {\n render: () => (\n <StorySurface>\n <StateExample label=\"Manual token reveal\">\n <CreatedManualRegistrationTokenPanel\n token={{\n id: '77777777-7777-4777-8777-777777777777',\n token: 'sf_mrt_4nJvNrs23ExampleManualTokenValue',\n prefix: 'sf_mrt_4nJv',\n name: 'Deploy runner',\n workspaceId: WORKSPACE_ID,\n expiresAt: EXPIRES_AT,\n createdAt: CREATED_AT,\n }}\n />\n </StateExample>\n <StateExample label=\"Provisioner token reveal\">\n <CreatedProvisionerTokenPanel token={createdProvisionerToken()} />\n </StateExample>\n </StorySurface>\n ),\n};\n\nfunction StorySurface({children}: {children: ReactNode}) {\n return (\n <div className=\"min-h-screen bg-background-subtle-base p-24\">\n <div className=\"mx-auto flex w-full max-w-[920px] flex-col gap-32\">{children}</div>\n </div>\n );\n}\n\nfunction StateExample({label, children}: {label: string; children: ReactNode}) {\n return (\n <div className=\"flex flex-col gap-8\">\n <Code variant=\"label\" className=\"text-foreground-neutral-subtle\">\n {label}\n </Code>\n <div className=\"rounded-8 border border-border-neutral-base bg-background-neutral-base p-16\">\n {children}\n </div>\n </div>\n );\n}\n\nfunction fetchForScenario(scenario: Scenario): typeof fetch {\n return (input) => {\n const url = requestUrl(input);\n if (scenario === 'loading') return new Promise<Response>(() => undefined);\n if (url.pathname.endsWith('/runners/manual-registration-tokens')) {\n if (scenario === 'errors') return Promise.resolve(errorResponse());\n return Promise.resolve(\n jsonResponse({\n manual_registration_tokens: scenario === 'empty' ? [] : [manualToken()],\n }),\n );\n }\n if (url.pathname.endsWith('/provisioners/tokens')) {\n if (scenario === 'errors') return Promise.resolve(errorResponse());\n return Promise.resolve(\n jsonResponse({\n tokens: scenario === 'empty' ? [] : provisionerTokens(),\n }),\n );\n }\n if (url.pathname.endsWith('/provisioners/active')) {\n return Promise.resolve(\n jsonResponse({\n provisioners:\n scenario === 'empty'\n ? []\n : [\n {\n id: '33333333-3333-4333-8333-333333333333',\n name: 'Docker autoscaler',\n prefix: 'sf_pt_docker',\n last_seen_at: NOW,\n },\n ],\n }),\n );\n }\n return Promise.resolve(jsonResponse({}, {status: 404}));\n };\n}\n\nfunction provisionerTokens(): ProvisionerTokenDto[] {\n return [\n provisionerToken({\n id: '33333333-3333-4333-8333-333333333333',\n name: 'Docker autoscaler',\n prefix: 'sf_pt_docker',\n last_seen_at: NOW,\n }),\n provisionerToken({\n id: '44444444-4444-4444-8444-444444444444',\n name: 'Kubernetes spot pool',\n prefix: 'sf_pt_spot',\n last_seen_at: EIGHT_MINUTES_AGO,\n }),\n provisionerToken({\n id: '55555555-5555-4555-8555-555555555555',\n name: 'Buildkite migration pool',\n prefix: 'sf_pt_migrate',\n last_seen_at: null,\n }),\n ];\n}\n\nfunction manualRegistrationToken(\n overrides: Partial<ManualRegistrationToken> = {},\n): ManualRegistrationToken {\n return {\n id: '22222222-2222-4222-8222-222222222222',\n workspaceId: WORKSPACE_ID,\n prefix: 'sf_mrt_deploy',\n name: 'Deploy runner',\n expiresAt: EXPIRES_AT,\n revokedAt: null,\n createdAt: CREATED_AT,\n updatedAt: CREATED_AT,\n ...overrides,\n };\n}\n\nfunction provisionerTokenModel(overrides: Partial<ProvisionerToken> = {}): ProvisionerToken {\n return {\n ...manualRegistrationToken(),\n createdByUserId: '99999999-9999-4999-8999-999999999999',\n revokedByUserId: null,\n lastSeenAt: NOW,\n ...overrides,\n };\n}\n\nfunction provisionerTokenModels(): ProvisionerToken[] {\n return [\n provisionerTokenModel({id: '33333333-3333-4333-8333-333333333333', name: 'Docker autoscaler'}),\n provisionerTokenModel({\n id: '44444444-4444-4444-8444-444444444444',\n name: 'Kubernetes spot pool',\n lastSeenAt: EIGHT_MINUTES_AGO,\n }),\n provisionerTokenModel({\n id: '55555555-5555-4555-8555-555555555555',\n name: 'Buildkite migration pool',\n lastSeenAt: null,\n }),\n ];\n}\n\nfunction createdProvisionerToken(): CreatedProvisionerToken {\n return {\n ...provisionerTokenModel({name: 'Docker autoscaler'}),\n token: 'sf_pt_Rv8YwrExampleProvisionerTokenValue',\n };\n}\n\nfunction manualToken(\n overrides: Partial<ManualRegistrationTokenDto> = {},\n): ManualRegistrationTokenDto {\n return {\n id: '22222222-2222-4222-8222-222222222222',\n workspace_id: WORKSPACE_ID,\n prefix: 'sf_mrt_deploy',\n name: 'Deploy runner',\n expires_at: EXPIRES_AT,\n revoked_at: null,\n created_at: CREATED_AT,\n updated_at: CREATED_AT,\n ...overrides,\n };\n}\n\nfunction provisionerToken(overrides: Partial<ProvisionerTokenDto> = {}): ProvisionerTokenDto {\n return {\n id: '33333333-3333-4333-8333-333333333333',\n scope: 'workspace',\n workspace_id: WORKSPACE_ID,\n prefix: 'sf_pt_docker',\n name: 'Docker autoscaler',\n created_by_user_id: '99999999-9999-4999-8999-999999999999',\n revoked_by_user_id: null,\n expires_at: EXPIRES_AT,\n revoked_at: null,\n last_seen_at: NOW,\n created_at: CREATED_AT,\n updated_at: CREATED_AT,\n ...overrides,\n };\n}\n\nfunction requestUrl(input: RequestInfo | URL): URL {\n if (typeof input === 'string') return new URL(input);\n if (input instanceof URL) return input;\n return new URL(input.url);\n}\n\nfunction jsonResponse(body: unknown, init: ResponseInit = {}) {\n return new Response(JSON.stringify(body), {\n status: 200,\n headers: {'content-type': 'application/json'},\n ...init,\n });\n}\n\nfunction errorResponse() {\n return jsonResponse({code: 'server-error'}, {status: 500, statusText: 'Server error'});\n}\n"],"names":["configureApiClient","RelativeTimeProvider","Toaster","Code","QueryClient","QueryClientProvider","within","CreatedManualRegistrationTokenPanel","CreatedProvisionerTokenPanel","EmptyManualRegistrationTokens","ManualRegistrationTokenList","ManualRegistrationTokenTableSkeleton","WorkspaceManualRegistrationTokensSettingsSection","EmptyProvisionerTokens","ProvisionerTokenList","ProvisionerTokenTableSkeleton","WorkspaceProvisionerTokensSettingsSection","WORKSPACE_ID","NOW","EIGHT_MINUTES_AGO","EXPIRES_AT","CREATED_AT","withQueryClient","Story","queryClient","defaultOptions","queries","retry","client","TokenSettingsSectionsStory","scenario","baseUrl","fetchImpl","fetchForScenario","StorySurface","workspaceId","meta","title","component","parameters","layout","decorators","args","Playground","play","canvasElement","canvas","findAllByText","DataStates","render","StateExample","label","Errors","findByText","Statuses","tokens","provisionerTokenModel","id","name","lastSeenAt","activeIds","Set","Content","div","className","manualRegistrationToken","prefix","expiresAt","provisionerTokenModels","CreatedTokenPanels","token","createdAt","createdProvisionerToken","children","variant","input","url","requestUrl","Promise","undefined","pathname","endsWith","resolve","errorResponse","jsonResponse","manual_registration_tokens","manualToken","provisionerTokens","provisioners","last_seen_at","status","provisionerToken","overrides","revokedAt","updatedAt","createdByUserId","revokedByUserId","workspace_id","expires_at","revoked_at","created_at","updated_at","scope","created_by_user_id","revoked_by_user_id","URL","body","init","Response","JSON","stringify","headers","code","statusText"],"mappings":"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"}
|
|
@@ -2,6 +2,9 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { defineRoute, useActiveWorkspace } from '@shipfox/client-shell/runtime';
|
|
3
3
|
import { WorkspaceProvisionerTokensSettingsSection } from '#index.js';
|
|
4
4
|
export default defineRoute({
|
|
5
|
+
staticData: {
|
|
6
|
+
frame: 'content'
|
|
7
|
+
},
|
|
5
8
|
component: ()=>/*#__PURE__*/ _jsx(WorkspaceProvisionerTokensSettingsSection, {
|
|
6
9
|
workspaceId: useActiveWorkspace().id
|
|
7
10
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/provisioners-settings.tsx"],"sourcesContent":["import {defineRoute, useActiveWorkspace} from '@shipfox/client-shell/runtime';\nimport {WorkspaceProvisionerTokensSettingsSection} from '#index.js';\n\nexport default defineRoute({\n component: () => (\n <WorkspaceProvisionerTokensSettingsSection workspaceId={useActiveWorkspace().id} />\n ),\n});\n"],"names":["defineRoute","useActiveWorkspace","WorkspaceProvisionerTokensSettingsSection","component","workspaceId","id"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,kBAAkB,QAAO,gCAAgC;AAC9E,SAAQC,yCAAyC,QAAO,YAAY;AAEpE,eAAeF,YAAY;IACzBG,WAAW,kBACT,
|
|
1
|
+
{"version":3,"sources":["../../src/routes/provisioners-settings.tsx"],"sourcesContent":["import {defineRoute, useActiveWorkspace} from '@shipfox/client-shell/runtime';\nimport {WorkspaceProvisionerTokensSettingsSection} from '#index.js';\n\nexport default defineRoute({\n staticData: {frame: 'content'},\n component: () => (\n <WorkspaceProvisionerTokensSettingsSection workspaceId={useActiveWorkspace().id} />\n ),\n});\n"],"names":["defineRoute","useActiveWorkspace","WorkspaceProvisionerTokensSettingsSection","staticData","frame","component","workspaceId","id"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,kBAAkB,QAAO,gCAAgC;AAC9E,SAAQC,yCAAyC,QAAO,YAAY;AAEpE,eAAeF,YAAY;IACzBG,YAAY;QAACC,OAAO;IAAS;IAC7BC,WAAW,kBACT,KAACH;YAA0CI,aAAaL,qBAAqBM,EAAE;;AAEnF,GAAG"}
|
|
@@ -2,6 +2,9 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { defineRoute, useActiveWorkspace } from '@shipfox/client-shell/runtime';
|
|
3
3
|
import { WorkspaceManualRegistrationTokensSettingsSection } from '#index.js';
|
|
4
4
|
export default defineRoute({
|
|
5
|
+
staticData: {
|
|
6
|
+
frame: 'content'
|
|
7
|
+
},
|
|
5
8
|
component: ()=>/*#__PURE__*/ _jsx(WorkspaceManualRegistrationTokensSettingsSection, {
|
|
6
9
|
workspaceId: useActiveWorkspace().id
|
|
7
10
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/runners-settings.tsx"],"sourcesContent":["import {defineRoute, useActiveWorkspace} from '@shipfox/client-shell/runtime';\nimport {WorkspaceManualRegistrationTokensSettingsSection} from '#index.js';\n\nexport default defineRoute({\n component: () => (\n <WorkspaceManualRegistrationTokensSettingsSection workspaceId={useActiveWorkspace().id} />\n ),\n});\n"],"names":["defineRoute","useActiveWorkspace","WorkspaceManualRegistrationTokensSettingsSection","component","workspaceId","id"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,kBAAkB,QAAO,gCAAgC;AAC9E,SAAQC,gDAAgD,QAAO,YAAY;AAE3E,eAAeF,YAAY;IACzBG,WAAW,kBACT,
|
|
1
|
+
{"version":3,"sources":["../../src/routes/runners-settings.tsx"],"sourcesContent":["import {defineRoute, useActiveWorkspace} from '@shipfox/client-shell/runtime';\nimport {WorkspaceManualRegistrationTokensSettingsSection} from '#index.js';\n\nexport default defineRoute({\n staticData: {frame: 'content'},\n component: () => (\n <WorkspaceManualRegistrationTokensSettingsSection workspaceId={useActiveWorkspace().id} />\n ),\n});\n"],"names":["defineRoute","useActiveWorkspace","WorkspaceManualRegistrationTokensSettingsSection","staticData","frame","component","workspaceId","id"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,kBAAkB,QAAO,gCAAgC;AAC9E,SAAQC,gDAAgD,QAAO,YAAY;AAE3E,eAAeF,YAAY;IACzBG,YAAY;QAACC,OAAO;IAAS;IAC7BC,WAAW,kBACT,KAACH;YAAiDI,aAAaL,qBAAqBM,EAAE;;AAE1F,GAAG"}
|