@shipfox/client-runners 14.0.0 → 16.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 +23 -0
- package/dist/components/create-manual-registration-token-form.js +7 -7
- package/dist/components/create-manual-registration-token-form.js.map +1 -1
- package/dist/components/create-provisioner-token-form.js +7 -7
- package/dist/components/create-provisioner-token-form.js.map +1 -1
- package/dist/components/manual-registration-token-list.js +6 -6
- package/dist/components/manual-registration-token-list.js.map +1 -1
- package/dist/components/manual-registration-tokens-settings-section.js +7 -7
- package/dist/components/manual-registration-tokens-settings-section.js.map +1 -1
- package/dist/components/provisioner-token-list.js +7 -7
- package/dist/components/provisioner-token-list.js.map +1 -1
- package/dist/components/provisioner-tokens-settings-section.js +7 -7
- package/dist/components/provisioner-tokens-settings-section.js.map +1 -1
- package/dist/components/token-expiration-select.d.ts +2 -2
- package/dist/components/token-expiration-select.d.ts.map +1 -1
- package/dist/components/token-settings-sections.stories.d.ts.map +1 -1
- package/dist/feature.d.ts +16 -16
- package/dist/feature.d.ts.map +1 -1
- package/dist/hooks/api/manual-registration-tokens.d.ts +1 -1
- package/dist/hooks/api/manual-registration-tokens.d.ts.map +1 -1
- package/dist/hooks/api/provisioner-tokens.d.ts +1 -1
- package/dist/hooks/api/provisioner-tokens.d.ts.map +1 -1
- package/dist/hooks/api/token-mapper.d.ts +1 -1
- package/dist/routes/provisioners-settings.d.ts.map +1 -1
- package/dist/routes/runners-settings.d.ts.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/src/components/create-manual-registration-token-form.tsx +7 -7
- package/src/components/create-provisioner-token-form.tsx +7 -7
- package/src/components/manual-registration-token-list.tsx +6 -6
- package/src/components/manual-registration-tokens-settings-section.tsx +7 -7
- package/src/components/provisioner-token-list.tsx +7 -7
- package/src/components/provisioner-tokens-settings-section.tsx +7 -7
- 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.12ms)
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# @shipfox/client-runners
|
|
2
2
|
|
|
3
|
+
## 16.0.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [78b771c]
|
|
8
|
+
- Updated dependencies [80cde6b]
|
|
9
|
+
- @shipfox/api-runners-dto@12.2.0
|
|
10
|
+
- @shipfox/react-ui@1.1.0
|
|
11
|
+
- @shipfox/client-ui@16.0.0
|
|
12
|
+
- @shipfox/client-shell@16.0.0
|
|
13
|
+
|
|
14
|
+
## 14.0.1
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- 6aa6c7a: Migrates the integrations, triggers, runners, and projects client surfaces to semantic spacing roles and enables `no-raw-spacing` for them. Adds the `gap-x-*` and `gap-y-*` axis roles and the `-mx-inline` bleed role so grids with differing column and row rhythm, and rows that cancel their own `px-tight`, stay on the density-aware scale.
|
|
19
|
+
- Updated dependencies [88bf8e8]
|
|
20
|
+
- Updated dependencies [6aa6c7a]
|
|
21
|
+
- Updated dependencies [5c56ba6]
|
|
22
|
+
- @shipfox/react-ui@1.0.0
|
|
23
|
+
- @shipfox/client-shell@14.0.1
|
|
24
|
+
- @shipfox/client-ui@14.0.1
|
|
25
|
+
|
|
3
26
|
## 14.0.0
|
|
4
27
|
|
|
5
28
|
### Patch Changes
|
|
@@ -35,11 +35,11 @@ export function CreateManualRegistrationTokenForm({ workspaceId, onCreated }) {
|
|
|
35
35
|
return /*#__PURE__*/ _jsxs(_Fragment, {
|
|
36
36
|
children: [
|
|
37
37
|
/*#__PURE__*/ _jsxs(ModalBody, {
|
|
38
|
-
className: "gap-
|
|
38
|
+
className: "gap-group",
|
|
39
39
|
children: [
|
|
40
40
|
/*#__PURE__*/ _jsxs("form", {
|
|
41
41
|
id: CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID,
|
|
42
|
-
className: "flex w-full flex-col gap-
|
|
42
|
+
className: "flex w-full flex-col gap-inline",
|
|
43
43
|
noValidate: true,
|
|
44
44
|
onSubmit: (event)=>{
|
|
45
45
|
event.preventDefault();
|
|
@@ -48,7 +48,7 @@ export function CreateManualRegistrationTokenForm({ workspaceId, onCreated }) {
|
|
|
48
48
|
},
|
|
49
49
|
children: [
|
|
50
50
|
/*#__PURE__*/ _jsxs("div", {
|
|
51
|
-
className: "flex w-full items-end gap-
|
|
51
|
+
className: "flex w-full items-end gap-group max-[640px]:flex-col max-[640px]:items-stretch",
|
|
52
52
|
children: [
|
|
53
53
|
/*#__PURE__*/ _jsx(form.Field, {
|
|
54
54
|
name: "name",
|
|
@@ -98,7 +98,7 @@ export function CreateManualRegistrationTokenForm({ workspaceId, onCreated }) {
|
|
|
98
98
|
role: "alert",
|
|
99
99
|
type: "error",
|
|
100
100
|
children: /*#__PURE__*/ _jsxs("div", {
|
|
101
|
-
className: "flex flex-col gap-
|
|
101
|
+
className: "flex flex-col gap-inline",
|
|
102
102
|
children: [
|
|
103
103
|
/*#__PURE__*/ _jsx(Text, {
|
|
104
104
|
size: "sm",
|
|
@@ -147,10 +147,10 @@ export function CreatedManualRegistrationTokenPanel({ token }) {
|
|
|
147
147
|
variant: "secondary",
|
|
148
148
|
icon: null,
|
|
149
149
|
children: /*#__PURE__*/ _jsxs(CalloutContent, {
|
|
150
|
-
className: "flex flex-col gap-
|
|
150
|
+
className: "flex flex-col gap-cluster",
|
|
151
151
|
children: [
|
|
152
152
|
/*#__PURE__*/ _jsxs("div", {
|
|
153
|
-
className: "flex flex-col gap-
|
|
153
|
+
className: "flex flex-col gap-tight",
|
|
154
154
|
children: [
|
|
155
155
|
/*#__PURE__*/ _jsx(CalloutTitle, {
|
|
156
156
|
className: "mb-0",
|
|
@@ -162,7 +162,7 @@ export function CreatedManualRegistrationTokenPanel({ token }) {
|
|
|
162
162
|
]
|
|
163
163
|
}),
|
|
164
164
|
/*#__PURE__*/ _jsxs("div", {
|
|
165
|
-
className: "flex items-center gap-
|
|
165
|
+
className: "flex items-center gap-inline max-[640px]:flex-col max-[640px]:items-stretch",
|
|
166
166
|
children: [
|
|
167
167
|
/*#__PURE__*/ _jsx(Code, {
|
|
168
168
|
variant: "paragraph",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/create-manual-registration-token-form.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {Callout, CalloutContent, CalloutDescription, CalloutTitle} from '@shipfox/react-ui/callout';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {useCopyToClipboard} from '@shipfox/react-ui/hooks';\nimport {ModalBody, ModalFooter} from '@shipfox/react-ui/modal';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useState} from 'react';\nimport type {CreatedManualRegistrationToken} from '#core/token.js';\nimport {createTokenCommand} from '#core/token.js';\nimport {useCreateManualRegistrationTokenMutation} from '#hooks/api/manual-registration-tokens.js';\nimport {manualRegistrationTokenCreateErrorToFormError} from './form-errors.js';\nimport {\n ExpirationSelect,\n expirationCommand,\n expirationHint,\n type TokenExpirationOption,\n} from './token-expiration-select.js';\n\nexport const CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID = 'create-manual-registration-token-form';\n\nexport function CreateManualRegistrationTokenForm({\n workspaceId,\n onCreated,\n}: {\n workspaceId: string;\n onCreated: (token: CreatedManualRegistrationToken) => void;\n}) {\n const createToken = useCreateManualRegistrationTokenMutation(workspaceId);\n const [formError, setFormError] = useState<string | undefined>();\n\n const form = useForm({\n defaultValues: {name: '', expiration: '86400' as TokenExpirationOption},\n onSubmit: async ({value}) => {\n setFormError(undefined);\n const command = createTokenCommand(value.name, expirationCommand(value.expiration));\n\n try {\n const token = await createToken.mutateAsync(command);\n onCreated(token);\n } catch (error) {\n const mapped = manualRegistrationTokenCreateErrorToFormError(error);\n setFormError(mapped.message);\n }\n },\n });\n\n return (\n <>\n <ModalBody className=\"gap-16\">\n <form\n id={CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID}\n className=\"flex w-full flex-col gap-8\"\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n <div className=\"flex w-full items-end gap-16 max-[640px]:flex-col max-[640px]:items-stretch\">\n <form.Field\n name=\"name\"\n validators={{\n onBlur: ({value}) =>\n value.length <= 80 ? undefined : 'Token name must be 80 characters or fewer.',\n }}\n >\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Token name\"\n id=\"manual-registration-token-name\"\n error={fieldError(field)}\n >\n <FormFieldInput\n placeholder=\"Local runner\"\n maxLength={80}\n value={field.state.value}\n onChange={(event) => field.handleChange(event.target.value)}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n <form.Field name=\"expiration\">\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Expires\"\n id=\"manual-registration-token-expiration\"\n error={fieldError(field)}\n >\n <ExpirationSelect\n value={field.state.value}\n onValueChange={(next) => field.handleChange(next)}\n />\n </FormField>\n )}\n </form.Field>\n </div>\n <form.Subscribe selector={(state) => state.values.expiration}>\n {(expiration) => (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {expirationHint(expiration)}\n </Text>\n )}\n </form.Subscribe>\n </form>\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-8\">\n <Text size=\"sm\" bold>\n Could not create token\n </Text>\n <Text size=\"sm\">{formError}</Text>\n </div>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button\n type=\"submit\"\n form={CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID}\n isLoading={createToken.isPending}\n >\n Create token\n </Button>\n </ModalFooter>\n </>\n );\n}\n\nexport function CreatedManualRegistrationTokenPanel({\n token,\n}: {\n token: CreatedManualRegistrationToken;\n}) {\n const [copyState, setCopyState] = useState<'idle' | 'copied' | 'failed'>('idle');\n const {copy} = useCopyToClipboard({\n text: token.token,\n onCopy: () => {\n setCopyState('copied');\n window.setTimeout(() => setCopyState('idle'), 1500);\n },\n });\n\n async function handleCopy() {\n try {\n await copy();\n } catch {\n setCopyState('failed');\n window.setTimeout(() => setCopyState('idle'), 2500);\n }\n }\n\n return (\n <Callout type=\"success\" variant=\"secondary\" icon={null}>\n <CalloutContent className=\"flex flex-col gap-12\">\n <div className=\"flex flex-col gap-2\">\n <CalloutTitle className=\"mb-0\">Token created</CalloutTitle>\n <CalloutDescription>\n Copy this registration token now. It will not be shown again.\n </CalloutDescription>\n </div>\n <div className=\"flex items-center gap-8 max-[640px]:flex-col max-[640px]:items-stretch\">\n <Code variant=\"paragraph\" className=\"min-w-0 flex-1 break-all\">\n {token.token}\n </Code>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n iconLeft=\"fileCopyLine\"\n onClick={() => void handleCopy()}\n >\n {copyState === 'copied' ? 'Copied' : 'Copy'}\n </Button>\n </div>\n {copyState === 'failed' ? (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Copy failed: select and copy manually.\n </Text>\n ) : null}\n </CalloutContent>\n </Callout>\n );\n}\n"],"names":["Button","Callout","CalloutContent","CalloutDescription","CalloutTitle","FormField","FormFieldInput","fieldError","useCopyToClipboard","ModalBody","ModalFooter","Code","Text","useForm","useState","createTokenCommand","useCreateManualRegistrationTokenMutation","manualRegistrationTokenCreateErrorToFormError","ExpirationSelect","expirationCommand","expirationHint","CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID","CreateManualRegistrationTokenForm","workspaceId","onCreated","createToken","formError","setFormError","form","defaultValues","name","expiration","onSubmit","value","undefined","command","token","mutateAsync","error","mapped","message","className","id","noValidate","event","preventDefault","stopPropagation","handleSubmit","div","Field","validators","onBlur","length","field","label","placeholder","maxLength","state","onChange","handleChange","target","handleBlur","onValueChange","next","Subscribe","selector","values","size","role","type","bold","isLoading","isPending","CreatedManualRegistrationTokenPanel","copyState","setCopyState","copy","text","onCopy","window","setTimeout","handleCopy","variant","icon","iconLeft","onClick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/create-manual-registration-token-form.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {Callout, CalloutContent, CalloutDescription, CalloutTitle} from '@shipfox/react-ui/callout';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {useCopyToClipboard} from '@shipfox/react-ui/hooks';\nimport {ModalBody, ModalFooter} from '@shipfox/react-ui/modal';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useState} from 'react';\nimport type {CreatedManualRegistrationToken} from '#core/token.js';\nimport {createTokenCommand} from '#core/token.js';\nimport {useCreateManualRegistrationTokenMutation} from '#hooks/api/manual-registration-tokens.js';\nimport {manualRegistrationTokenCreateErrorToFormError} from './form-errors.js';\nimport {\n ExpirationSelect,\n expirationCommand,\n expirationHint,\n type TokenExpirationOption,\n} from './token-expiration-select.js';\n\nexport const CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID = 'create-manual-registration-token-form';\n\nexport function CreateManualRegistrationTokenForm({\n workspaceId,\n onCreated,\n}: {\n workspaceId: string;\n onCreated: (token: CreatedManualRegistrationToken) => void;\n}) {\n const createToken = useCreateManualRegistrationTokenMutation(workspaceId);\n const [formError, setFormError] = useState<string | undefined>();\n\n const form = useForm({\n defaultValues: {name: '', expiration: '86400' as TokenExpirationOption},\n onSubmit: async ({value}) => {\n setFormError(undefined);\n const command = createTokenCommand(value.name, expirationCommand(value.expiration));\n\n try {\n const token = await createToken.mutateAsync(command);\n onCreated(token);\n } catch (error) {\n const mapped = manualRegistrationTokenCreateErrorToFormError(error);\n setFormError(mapped.message);\n }\n },\n });\n\n return (\n <>\n <ModalBody className=\"gap-group\">\n <form\n id={CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID}\n className=\"flex w-full flex-col gap-inline\"\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n <div className=\"flex w-full items-end gap-group max-[640px]:flex-col max-[640px]:items-stretch\">\n <form.Field\n name=\"name\"\n validators={{\n onBlur: ({value}) =>\n value.length <= 80 ? undefined : 'Token name must be 80 characters or fewer.',\n }}\n >\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Token name\"\n id=\"manual-registration-token-name\"\n error={fieldError(field)}\n >\n <FormFieldInput\n placeholder=\"Local runner\"\n maxLength={80}\n value={field.state.value}\n onChange={(event) => field.handleChange(event.target.value)}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n <form.Field name=\"expiration\">\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Expires\"\n id=\"manual-registration-token-expiration\"\n error={fieldError(field)}\n >\n <ExpirationSelect\n value={field.state.value}\n onValueChange={(next) => field.handleChange(next)}\n />\n </FormField>\n )}\n </form.Field>\n </div>\n <form.Subscribe selector={(state) => state.values.expiration}>\n {(expiration) => (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {expirationHint(expiration)}\n </Text>\n )}\n </form.Subscribe>\n </form>\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-inline\">\n <Text size=\"sm\" bold>\n Could not create token\n </Text>\n <Text size=\"sm\">{formError}</Text>\n </div>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button\n type=\"submit\"\n form={CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID}\n isLoading={createToken.isPending}\n >\n Create token\n </Button>\n </ModalFooter>\n </>\n );\n}\n\nexport function CreatedManualRegistrationTokenPanel({\n token,\n}: {\n token: CreatedManualRegistrationToken;\n}) {\n const [copyState, setCopyState] = useState<'idle' | 'copied' | 'failed'>('idle');\n const {copy} = useCopyToClipboard({\n text: token.token,\n onCopy: () => {\n setCopyState('copied');\n window.setTimeout(() => setCopyState('idle'), 1500);\n },\n });\n\n async function handleCopy() {\n try {\n await copy();\n } catch {\n setCopyState('failed');\n window.setTimeout(() => setCopyState('idle'), 2500);\n }\n }\n\n return (\n <Callout type=\"success\" variant=\"secondary\" icon={null}>\n <CalloutContent className=\"flex flex-col gap-cluster\">\n <div className=\"flex flex-col gap-tight\">\n <CalloutTitle className=\"mb-0\">Token created</CalloutTitle>\n <CalloutDescription>\n Copy this registration token now. It will not be shown again.\n </CalloutDescription>\n </div>\n <div className=\"flex items-center gap-inline max-[640px]:flex-col max-[640px]:items-stretch\">\n <Code variant=\"paragraph\" className=\"min-w-0 flex-1 break-all\">\n {token.token}\n </Code>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n iconLeft=\"fileCopyLine\"\n onClick={() => void handleCopy()}\n >\n {copyState === 'copied' ? 'Copied' : 'Copy'}\n </Button>\n </div>\n {copyState === 'failed' ? (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Copy failed: select and copy manually.\n </Text>\n ) : null}\n </CalloutContent>\n </Callout>\n );\n}\n"],"names":["Button","Callout","CalloutContent","CalloutDescription","CalloutTitle","FormField","FormFieldInput","fieldError","useCopyToClipboard","ModalBody","ModalFooter","Code","Text","useForm","useState","createTokenCommand","useCreateManualRegistrationTokenMutation","manualRegistrationTokenCreateErrorToFormError","ExpirationSelect","expirationCommand","expirationHint","CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID","CreateManualRegistrationTokenForm","workspaceId","onCreated","createToken","formError","setFormError","form","defaultValues","name","expiration","onSubmit","value","undefined","command","token","mutateAsync","error","mapped","message","className","id","noValidate","event","preventDefault","stopPropagation","handleSubmit","div","Field","validators","onBlur","length","field","label","placeholder","maxLength","state","onChange","handleChange","target","handleBlur","onValueChange","next","Subscribe","selector","values","size","role","type","bold","isLoading","isPending","CreatedManualRegistrationTokenPanel","copyState","setCopyState","copy","text","onCopy","window","setTimeout","handleCopy","variant","icon","iconLeft","onClick"],"mappings":"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"}
|
|
@@ -35,11 +35,11 @@ export function CreateProvisionerTokenForm({ workspaceId, onCreated }) {
|
|
|
35
35
|
return /*#__PURE__*/ _jsxs(_Fragment, {
|
|
36
36
|
children: [
|
|
37
37
|
/*#__PURE__*/ _jsxs(ModalBody, {
|
|
38
|
-
className: "gap-
|
|
38
|
+
className: "gap-group",
|
|
39
39
|
children: [
|
|
40
40
|
/*#__PURE__*/ _jsxs("form", {
|
|
41
41
|
id: CREATE_PROVISIONER_TOKEN_FORM_ID,
|
|
42
|
-
className: "flex w-full flex-col gap-
|
|
42
|
+
className: "flex w-full flex-col gap-inline",
|
|
43
43
|
noValidate: true,
|
|
44
44
|
onSubmit: (event)=>{
|
|
45
45
|
event.preventDefault();
|
|
@@ -48,7 +48,7 @@ export function CreateProvisionerTokenForm({ workspaceId, onCreated }) {
|
|
|
48
48
|
},
|
|
49
49
|
children: [
|
|
50
50
|
/*#__PURE__*/ _jsxs("div", {
|
|
51
|
-
className: "flex w-full items-end gap-
|
|
51
|
+
className: "flex w-full items-end gap-group max-[640px]:flex-col max-[640px]:items-stretch",
|
|
52
52
|
children: [
|
|
53
53
|
/*#__PURE__*/ _jsx(form.Field, {
|
|
54
54
|
name: "name",
|
|
@@ -98,7 +98,7 @@ export function CreateProvisionerTokenForm({ workspaceId, onCreated }) {
|
|
|
98
98
|
role: "alert",
|
|
99
99
|
type: "error",
|
|
100
100
|
children: /*#__PURE__*/ _jsxs("div", {
|
|
101
|
-
className: "flex flex-col gap-
|
|
101
|
+
className: "flex flex-col gap-inline",
|
|
102
102
|
children: [
|
|
103
103
|
/*#__PURE__*/ _jsx(Text, {
|
|
104
104
|
size: "sm",
|
|
@@ -147,10 +147,10 @@ export function CreatedProvisionerTokenPanel({ token }) {
|
|
|
147
147
|
variant: "secondary",
|
|
148
148
|
icon: null,
|
|
149
149
|
children: /*#__PURE__*/ _jsxs(CalloutContent, {
|
|
150
|
-
className: "flex flex-col gap-
|
|
150
|
+
className: "flex flex-col gap-cluster",
|
|
151
151
|
children: [
|
|
152
152
|
/*#__PURE__*/ _jsxs("div", {
|
|
153
|
-
className: "flex flex-col gap-
|
|
153
|
+
className: "flex flex-col gap-tight",
|
|
154
154
|
children: [
|
|
155
155
|
/*#__PURE__*/ _jsx(CalloutTitle, {
|
|
156
156
|
className: "mb-0",
|
|
@@ -162,7 +162,7 @@ export function CreatedProvisionerTokenPanel({ token }) {
|
|
|
162
162
|
]
|
|
163
163
|
}),
|
|
164
164
|
/*#__PURE__*/ _jsxs("div", {
|
|
165
|
-
className: "flex items-center gap-
|
|
165
|
+
className: "flex items-center gap-inline max-[640px]:flex-col max-[640px]:items-stretch",
|
|
166
166
|
children: [
|
|
167
167
|
/*#__PURE__*/ _jsx(Code, {
|
|
168
168
|
variant: "paragraph",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/create-provisioner-token-form.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {Callout, CalloutContent, CalloutDescription, CalloutTitle} from '@shipfox/react-ui/callout';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {useCopyToClipboard} from '@shipfox/react-ui/hooks';\nimport {ModalBody, ModalFooter} from '@shipfox/react-ui/modal';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useState} from 'react';\nimport type {CreatedProvisionerToken} from '#core/token.js';\nimport {createTokenCommand} from '#core/token.js';\nimport {useCreateProvisionerTokenMutation} from '#hooks/api/provisioner-tokens.js';\nimport {provisionerTokenCreateErrorToFormError} from './provisioner-token-form-errors.js';\nimport {\n ExpirationSelect,\n expirationCommand,\n expirationHint,\n type TokenExpirationOption,\n} from './token-expiration-select.js';\n\nexport const CREATE_PROVISIONER_TOKEN_FORM_ID = 'create-provisioner-token-form';\n\nexport function CreateProvisionerTokenForm({\n workspaceId,\n onCreated,\n}: {\n workspaceId: string;\n onCreated: (token: CreatedProvisionerToken) => void;\n}) {\n const createToken = useCreateProvisionerTokenMutation(workspaceId);\n const [formError, setFormError] = useState<string | undefined>();\n\n const form = useForm({\n defaultValues: {name: '', expiration: '86400' as TokenExpirationOption},\n onSubmit: async ({value}) => {\n setFormError(undefined);\n const command = createTokenCommand(value.name, expirationCommand(value.expiration));\n\n try {\n const token = await createToken.mutateAsync(command);\n onCreated(token);\n } catch (error) {\n const mapped = provisionerTokenCreateErrorToFormError(error);\n setFormError(mapped.message);\n }\n },\n });\n\n return (\n <>\n <ModalBody className=\"gap-16\">\n <form\n id={CREATE_PROVISIONER_TOKEN_FORM_ID}\n className=\"flex w-full flex-col gap-8\"\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n <div className=\"flex w-full items-end gap-16 max-[640px]:flex-col max-[640px]:items-stretch\">\n <form.Field\n name=\"name\"\n validators={{\n onBlur: ({value}) =>\n value.length <= 80 ? undefined : 'Token name must be 80 characters or fewer.',\n }}\n >\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Token name\"\n id=\"provisioner-token-name\"\n error={fieldError(field)}\n >\n <FormFieldInput\n placeholder=\"Docker provisioner\"\n maxLength={80}\n value={field.state.value}\n onChange={(event) => field.handleChange(event.target.value)}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n <form.Field name=\"expiration\">\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Expires\"\n id=\"provisioner-token-expiration\"\n error={fieldError(field)}\n >\n <ExpirationSelect\n value={field.state.value}\n onValueChange={(next) => field.handleChange(next)}\n />\n </FormField>\n )}\n </form.Field>\n </div>\n <form.Subscribe selector={(state) => state.values.expiration}>\n {(expiration) => (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {expirationHint(expiration)}\n </Text>\n )}\n </form.Subscribe>\n </form>\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-8\">\n <Text size=\"sm\" bold>\n Could not create token\n </Text>\n <Text size=\"sm\">{formError}</Text>\n </div>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button\n type=\"submit\"\n form={CREATE_PROVISIONER_TOKEN_FORM_ID}\n isLoading={createToken.isPending}\n >\n Create token\n </Button>\n </ModalFooter>\n </>\n );\n}\n\nexport function CreatedProvisionerTokenPanel({token}: {token: CreatedProvisionerToken}) {\n const [copyState, setCopyState] = useState<'idle' | 'copied' | 'failed'>('idle');\n const {copy} = useCopyToClipboard({\n text: token.token,\n onCopy: () => {\n setCopyState('copied');\n window.setTimeout(() => setCopyState('idle'), 1500);\n },\n });\n\n async function handleCopy() {\n try {\n await copy();\n } catch {\n setCopyState('failed');\n window.setTimeout(() => setCopyState('idle'), 2500);\n }\n }\n\n return (\n <Callout type=\"success\" variant=\"secondary\" icon={null}>\n <CalloutContent className=\"flex flex-col gap-12\">\n <div className=\"flex flex-col gap-2\">\n <CalloutTitle className=\"mb-0\">Token created</CalloutTitle>\n <CalloutDescription>\n Copy this provisioner token now. It will not be shown again.\n </CalloutDescription>\n </div>\n <div className=\"flex items-center gap-8 max-[640px]:flex-col max-[640px]:items-stretch\">\n <Code variant=\"paragraph\" className=\"min-w-0 flex-1 break-all\">\n {token.token}\n </Code>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n iconLeft=\"fileCopyLine\"\n onClick={() => void handleCopy()}\n >\n {copyState === 'copied' ? 'Copied' : 'Copy'}\n </Button>\n </div>\n {copyState === 'failed' ? (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Copy failed: select and copy manually.\n </Text>\n ) : null}\n </CalloutContent>\n </Callout>\n );\n}\n"],"names":["Button","Callout","CalloutContent","CalloutDescription","CalloutTitle","FormField","FormFieldInput","fieldError","useCopyToClipboard","ModalBody","ModalFooter","Code","Text","useForm","useState","createTokenCommand","useCreateProvisionerTokenMutation","provisionerTokenCreateErrorToFormError","ExpirationSelect","expirationCommand","expirationHint","CREATE_PROVISIONER_TOKEN_FORM_ID","CreateProvisionerTokenForm","workspaceId","onCreated","createToken","formError","setFormError","form","defaultValues","name","expiration","onSubmit","value","undefined","command","token","mutateAsync","error","mapped","message","className","id","noValidate","event","preventDefault","stopPropagation","handleSubmit","div","Field","validators","onBlur","length","field","label","placeholder","maxLength","state","onChange","handleChange","target","handleBlur","onValueChange","next","Subscribe","selector","values","size","role","type","bold","isLoading","isPending","CreatedProvisionerTokenPanel","copyState","setCopyState","copy","text","onCopy","window","setTimeout","handleCopy","variant","icon","iconLeft","onClick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/create-provisioner-token-form.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {Callout, CalloutContent, CalloutDescription, CalloutTitle} from '@shipfox/react-ui/callout';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {useCopyToClipboard} from '@shipfox/react-ui/hooks';\nimport {ModalBody, ModalFooter} from '@shipfox/react-ui/modal';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useState} from 'react';\nimport type {CreatedProvisionerToken} from '#core/token.js';\nimport {createTokenCommand} from '#core/token.js';\nimport {useCreateProvisionerTokenMutation} from '#hooks/api/provisioner-tokens.js';\nimport {provisionerTokenCreateErrorToFormError} from './provisioner-token-form-errors.js';\nimport {\n ExpirationSelect,\n expirationCommand,\n expirationHint,\n type TokenExpirationOption,\n} from './token-expiration-select.js';\n\nexport const CREATE_PROVISIONER_TOKEN_FORM_ID = 'create-provisioner-token-form';\n\nexport function CreateProvisionerTokenForm({\n workspaceId,\n onCreated,\n}: {\n workspaceId: string;\n onCreated: (token: CreatedProvisionerToken) => void;\n}) {\n const createToken = useCreateProvisionerTokenMutation(workspaceId);\n const [formError, setFormError] = useState<string | undefined>();\n\n const form = useForm({\n defaultValues: {name: '', expiration: '86400' as TokenExpirationOption},\n onSubmit: async ({value}) => {\n setFormError(undefined);\n const command = createTokenCommand(value.name, expirationCommand(value.expiration));\n\n try {\n const token = await createToken.mutateAsync(command);\n onCreated(token);\n } catch (error) {\n const mapped = provisionerTokenCreateErrorToFormError(error);\n setFormError(mapped.message);\n }\n },\n });\n\n return (\n <>\n <ModalBody className=\"gap-group\">\n <form\n id={CREATE_PROVISIONER_TOKEN_FORM_ID}\n className=\"flex w-full flex-col gap-inline\"\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n <div className=\"flex w-full items-end gap-group max-[640px]:flex-col max-[640px]:items-stretch\">\n <form.Field\n name=\"name\"\n validators={{\n onBlur: ({value}) =>\n value.length <= 80 ? undefined : 'Token name must be 80 characters or fewer.',\n }}\n >\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Token name\"\n id=\"provisioner-token-name\"\n error={fieldError(field)}\n >\n <FormFieldInput\n placeholder=\"Docker provisioner\"\n maxLength={80}\n value={field.state.value}\n onChange={(event) => field.handleChange(event.target.value)}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n <form.Field name=\"expiration\">\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Expires\"\n id=\"provisioner-token-expiration\"\n error={fieldError(field)}\n >\n <ExpirationSelect\n value={field.state.value}\n onValueChange={(next) => field.handleChange(next)}\n />\n </FormField>\n )}\n </form.Field>\n </div>\n <form.Subscribe selector={(state) => state.values.expiration}>\n {(expiration) => (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {expirationHint(expiration)}\n </Text>\n )}\n </form.Subscribe>\n </form>\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-inline\">\n <Text size=\"sm\" bold>\n Could not create token\n </Text>\n <Text size=\"sm\">{formError}</Text>\n </div>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button\n type=\"submit\"\n form={CREATE_PROVISIONER_TOKEN_FORM_ID}\n isLoading={createToken.isPending}\n >\n Create token\n </Button>\n </ModalFooter>\n </>\n );\n}\n\nexport function CreatedProvisionerTokenPanel({token}: {token: CreatedProvisionerToken}) {\n const [copyState, setCopyState] = useState<'idle' | 'copied' | 'failed'>('idle');\n const {copy} = useCopyToClipboard({\n text: token.token,\n onCopy: () => {\n setCopyState('copied');\n window.setTimeout(() => setCopyState('idle'), 1500);\n },\n });\n\n async function handleCopy() {\n try {\n await copy();\n } catch {\n setCopyState('failed');\n window.setTimeout(() => setCopyState('idle'), 2500);\n }\n }\n\n return (\n <Callout type=\"success\" variant=\"secondary\" icon={null}>\n <CalloutContent className=\"flex flex-col gap-cluster\">\n <div className=\"flex flex-col gap-tight\">\n <CalloutTitle className=\"mb-0\">Token created</CalloutTitle>\n <CalloutDescription>\n Copy this provisioner token now. It will not be shown again.\n </CalloutDescription>\n </div>\n <div className=\"flex items-center gap-inline max-[640px]:flex-col max-[640px]:items-stretch\">\n <Code variant=\"paragraph\" className=\"min-w-0 flex-1 break-all\">\n {token.token}\n </Code>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n iconLeft=\"fileCopyLine\"\n onClick={() => void handleCopy()}\n >\n {copyState === 'copied' ? 'Copied' : 'Copy'}\n </Button>\n </div>\n {copyState === 'failed' ? (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Copy failed: select and copy manually.\n </Text>\n ) : null}\n </CalloutContent>\n </Callout>\n );\n}\n"],"names":["Button","Callout","CalloutContent","CalloutDescription","CalloutTitle","FormField","FormFieldInput","fieldError","useCopyToClipboard","ModalBody","ModalFooter","Code","Text","useForm","useState","createTokenCommand","useCreateProvisionerTokenMutation","provisionerTokenCreateErrorToFormError","ExpirationSelect","expirationCommand","expirationHint","CREATE_PROVISIONER_TOKEN_FORM_ID","CreateProvisionerTokenForm","workspaceId","onCreated","createToken","formError","setFormError","form","defaultValues","name","expiration","onSubmit","value","undefined","command","token","mutateAsync","error","mapped","message","className","id","noValidate","event","preventDefault","stopPropagation","handleSubmit","div","Field","validators","onBlur","length","field","label","placeholder","maxLength","state","onChange","handleChange","target","handleBlur","onValueChange","next","Subscribe","selector","values","size","role","type","bold","isLoading","isPending","CreatedProvisionerTokenPanel","copyState","setCopyState","copy","text","onCopy","window","setTimeout","handleCopy","variant","icon","iconLeft","onClick"],"mappings":";AAAA,SAAQA,MAAM,QAAO,2BAA2B;AAChD,SAAQC,OAAO,EAAEC,cAAc,EAAEC,kBAAkB,EAAEC,YAAY,QAAO,4BAA4B;AACpG,SAAQC,SAAS,EAAEC,cAAc,EAAEC,UAAU,QAAO,+BAA+B;AACnF,SAAQC,kBAAkB,QAAO,0BAA0B;AAC3D,SAAQC,SAAS,EAAEC,WAAW,QAAO,0BAA0B;AAC/D,SAAQC,IAAI,EAAEC,IAAI,QAAO,+BAA+B;AACxD,SAAQC,OAAO,QAAO,uBAAuB;AAC7C,SAAQC,QAAQ,QAAO,QAAQ;AAE/B,SAAQC,kBAAkB,QAAO,iBAAiB;AAClD,SAAQC,iCAAiC,QAAO,mCAAmC;AACnF,SAAQC,sCAAsC,QAAO,qCAAqC;AAC1F,SACEC,gBAAgB,EAChBC,iBAAiB,EACjBC,cAAc,QAET,+BAA+B;AAEtC,OAAO,MAAMC,mCAAmC,gCAAgC;AAEhF,OAAO,SAASC,2BAA2B,EACzCC,WAAW,EACXC,SAAS,EAIV;IACC,MAAMC,cAAcT,kCAAkCO;IACtD,MAAM,CAACG,WAAWC,aAAa,GAAGb;IAElC,MAAMc,OAAOf,QAAQ;QACnBgB,eAAe;YAACC,MAAM;YAAIC,YAAY;QAAgC;QACtEC,UAAU,OAAO,EAACC,KAAK,EAAC;YACtBN,aAAaO;YACb,MAAMC,UAAUpB,mBAAmBkB,MAAMH,IAAI,EAAEX,kBAAkBc,MAAMF,UAAU;YAEjF,IAAI;gBACF,MAAMK,QAAQ,MAAMX,YAAYY,WAAW,CAACF;gBAC5CX,UAAUY;YACZ,EAAE,OAAOE,OAAO;gBACd,MAAMC,SAAStB,uCAAuCqB;gBACtDX,aAAaY,OAAOC,OAAO;YAC7B;QACF;IACF;IAEA,qBACE;;0BACE,MAAC/B;gBAAUgC,WAAU;;kCACnB,MAACb;wBACCc,IAAIrB;wBACJoB,WAAU;wBACVE,UAAU;wBACVX,UAAU,CAACY;4BACTA,MAAMC,cAAc;4BACpBD,MAAME,eAAe;4BACrB,KAAKlB,KAAKmB,YAAY;wBACxB;;0CAEA,MAACC;gCAAIP,WAAU;;kDACb,KAACb,KAAKqB,KAAK;wCACTnB,MAAK;wCACLoB,YAAY;4CACVC,QAAQ,CAAC,EAAClB,KAAK,EAAC,GACdA,MAAMmB,MAAM,IAAI,KAAKlB,YAAY;wCACrC;kDAEC,CAACmB,sBACA,KAAChD;gDACCoC,WAAU;gDACVa,OAAM;gDACNZ,IAAG;gDACHJ,OAAO/B,WAAW8C;0DAElB,cAAA,KAAC/C;oDACCiD,aAAY;oDACZC,WAAW;oDACXvB,OAAOoB,MAAMI,KAAK,CAACxB,KAAK;oDACxByB,UAAU,CAACd,QAAUS,MAAMM,YAAY,CAACf,MAAMgB,MAAM,CAAC3B,KAAK;oDAC1DkB,QAAQE,MAAMQ,UAAU;;;;kDAKhC,KAACjC,KAAKqB,KAAK;wCAACnB,MAAK;kDACd,CAACuB,sBACA,KAAChD;gDACCoC,WAAU;gDACVa,OAAM;gDACNZ,IAAG;gDACHJ,OAAO/B,WAAW8C;0DAElB,cAAA,KAACnC;oDACCe,OAAOoB,MAAMI,KAAK,CAACxB,KAAK;oDACxB6B,eAAe,CAACC,OAASV,MAAMM,YAAY,CAACI;;;;;;0CAMtD,KAACnC,KAAKoC,SAAS;gCAACC,UAAU,CAACR,QAAUA,MAAMS,MAAM,CAACnC,UAAU;0CACzD,CAACA,2BACA,KAACnB;wCAAKuD,MAAK;wCAAK1B,WAAU;kDACvBrB,eAAeW;;;;;oBAKvBL,0BACC,KAACzB;wBAAQmE,MAAK;wBAAQC,MAAK;kCACzB,cAAA,MAACrB;4BAAIP,WAAU;;8CACb,KAAC7B;oCAAKuD,MAAK;oCAAKG,IAAI;8CAAC;;8CAGrB,KAAC1D;oCAAKuD,MAAK;8CAAMzC;;;;yBAGnB;;;0BAEN,KAAChB;0BACC,cAAA,KAACV;oBACCqE,MAAK;oBACLzC,MAAMP;oBACNkD,WAAW9C,YAAY+C,SAAS;8BACjC;;;;;AAMT;AAEA,OAAO,SAASC,6BAA6B,EAACrC,KAAK,EAAmC;IACpF,MAAM,CAACsC,WAAWC,aAAa,GAAG7D,SAAuC;IACzE,MAAM,EAAC8D,IAAI,EAAC,GAAGpE,mBAAmB;QAChCqE,MAAMzC,MAAMA,KAAK;QACjB0C,QAAQ;YACNH,aAAa;YACbI,OAAOC,UAAU,CAAC,IAAML,aAAa,SAAS;QAChD;IACF;IAEA,eAAeM;QACb,IAAI;YACF,MAAML;QACR,EAAE,OAAM;YACND,aAAa;YACbI,OAAOC,UAAU,CAAC,IAAML,aAAa,SAAS;QAChD;IACF;IAEA,qBACE,KAAC1E;QAAQoE,MAAK;QAAUa,SAAQ;QAAYC,MAAM;kBAChD,cAAA,MAACjF;YAAeuC,WAAU;;8BACxB,MAACO;oBAAIP,WAAU;;sCACb,KAACrC;4BAAaqC,WAAU;sCAAO;;sCAC/B,KAACtC;sCAAmB;;;;8BAItB,MAAC6C;oBAAIP,WAAU;;sCACb,KAAC9B;4BAAKuE,SAAQ;4BAAYzC,WAAU;sCACjCL,MAAMA,KAAK;;sCAEd,KAACpC;4BACCmE,MAAK;4BACLe,SAAQ;4BACRE,UAAS;4BACTC,SAAS,IAAM,KAAKJ;sCAEnBP,cAAc,WAAW,WAAW;;;;gBAGxCA,cAAc,yBACb,KAAC9D;oBAAKuD,MAAK;oBAAK1B,WAAU;8BAAgC;qBAGxD;;;;AAIZ"}
|
|
@@ -86,13 +86,13 @@ export function ManualRegistrationTokenList({ workspaceId, tokens }) {
|
|
|
86
86
|
})
|
|
87
87
|
}),
|
|
88
88
|
/*#__PURE__*/ _jsx("ul", {
|
|
89
|
-
className: "hidden flex-col gap-
|
|
89
|
+
className: "hidden flex-col gap-inline max-[760px]:flex",
|
|
90
90
|
"aria-label": "Manual registration tokens",
|
|
91
91
|
children: tokens.map((token)=>/*#__PURE__*/ _jsxs("li", {
|
|
92
|
-
className: "rounded-8 border border-border-neutral-base bg-background-neutral-base p-
|
|
92
|
+
className: "flex flex-col gap-cluster rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact",
|
|
93
93
|
children: [
|
|
94
94
|
/*#__PURE__*/ _jsxs("div", {
|
|
95
|
-
className: "flex items-start justify-between gap-
|
|
95
|
+
className: "flex items-start justify-between gap-cluster",
|
|
96
96
|
children: [
|
|
97
97
|
/*#__PURE__*/ _jsxs("div", {
|
|
98
98
|
className: "min-w-0 flex-1",
|
|
@@ -114,7 +114,7 @@ export function ManualRegistrationTokenList({ workspaceId, tokens }) {
|
|
|
114
114
|
]
|
|
115
115
|
}),
|
|
116
116
|
/*#__PURE__*/ _jsxs("dl", {
|
|
117
|
-
className: "
|
|
117
|
+
className: "grid grid-cols-2 gap-inline text-sm",
|
|
118
118
|
children: [
|
|
119
119
|
/*#__PURE__*/ _jsxs("div", {
|
|
120
120
|
children: [
|
|
@@ -218,7 +218,7 @@ function RevokeManualRegistrationTokenButton({ workspaceId, token }) {
|
|
|
218
218
|
title: "Revoke token?"
|
|
219
219
|
}),
|
|
220
220
|
/*#__PURE__*/ _jsxs(ModalBody, {
|
|
221
|
-
className: "gap-
|
|
221
|
+
className: "gap-group",
|
|
222
222
|
children: [
|
|
223
223
|
/*#__PURE__*/ _jsxs(Text, {
|
|
224
224
|
size: "sm",
|
|
@@ -272,7 +272,7 @@ export function ManualRegistrationTokenTableSkeleton() {
|
|
|
272
272
|
return /*#__PURE__*/ _jsx("div", {
|
|
273
273
|
role: "status",
|
|
274
274
|
"aria-label": "Loading manual registration tokens",
|
|
275
|
-
className: "flex flex-col gap-
|
|
275
|
+
className: "flex flex-col gap-inline",
|
|
276
276
|
children: [
|
|
277
277
|
0,
|
|
278
278
|
1,
|
|
@@ -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-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={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=\"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.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-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","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 {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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"}
|
|
@@ -20,15 +20,15 @@ export function WorkspaceManualRegistrationTokensSettingsSection({ workspaceId }
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
return /*#__PURE__*/ _jsx("div", {
|
|
23
|
-
className: "flex min-w-0 flex-col gap-
|
|
23
|
+
className: "flex min-w-0 flex-col gap-region",
|
|
24
24
|
children: /*#__PURE__*/ _jsxs("section", {
|
|
25
|
-
className: "flex flex-col gap-
|
|
25
|
+
className: "flex flex-col gap-group",
|
|
26
26
|
children: [
|
|
27
27
|
/*#__PURE__*/ _jsxs("div", {
|
|
28
|
-
className: "flex items-center justify-between gap-
|
|
28
|
+
className: "flex items-center justify-between gap-group max-[640px]:items-start",
|
|
29
29
|
children: [
|
|
30
30
|
/*#__PURE__*/ _jsxs("div", {
|
|
31
|
-
className: "flex flex-col gap-
|
|
31
|
+
className: "flex flex-col gap-tight",
|
|
32
32
|
children: [
|
|
33
33
|
/*#__PURE__*/ _jsx(Header, {
|
|
34
34
|
variant: "h3",
|
|
@@ -42,11 +42,11 @@ export function WorkspaceManualRegistrationTokensSettingsSection({ workspaceId }
|
|
|
42
42
|
]
|
|
43
43
|
}),
|
|
44
44
|
/*#__PURE__*/ _jsxs("div", {
|
|
45
|
-
className: "flex items-center gap-
|
|
45
|
+
className: "flex items-center gap-cluster",
|
|
46
46
|
children: [
|
|
47
47
|
tokensQuery.isFetching && !tokensQuery.isPending ? /*#__PURE__*/ _jsx(Icon, {
|
|
48
48
|
name: "loader4Line",
|
|
49
|
-
className: "mt-
|
|
49
|
+
className: "mt-[2px] size-18 text-foreground-neutral-muted",
|
|
50
50
|
"aria-label": "Refreshing tokens"
|
|
51
51
|
}) : null,
|
|
52
52
|
/*#__PURE__*/ _jsxs(Modal, {
|
|
@@ -75,7 +75,7 @@ export function WorkspaceManualRegistrationTokensSettingsSection({ workspaceId }
|
|
|
75
75
|
})
|
|
76
76
|
}),
|
|
77
77
|
createdToken ? /*#__PURE__*/ _jsx(ModalBody, {
|
|
78
|
-
className: "gap-
|
|
78
|
+
className: "gap-group",
|
|
79
79
|
children: /*#__PURE__*/ _jsx(CreatedManualRegistrationTokenPanel, {
|
|
80
80
|
token: createdToken
|
|
81
81
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/manual-registration-tokens-settings-section.tsx"],"sourcesContent":["import {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 type {CreatedManualRegistrationToken} from '#core/token.js';\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<CreatedManualRegistrationToken | null>(null);\n const tokens = tokensQuery.data ?? [];\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-
|
|
1
|
+
{"version":3,"sources":["../../src/components/manual-registration-tokens-settings-section.tsx"],"sourcesContent":["import {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 type {CreatedManualRegistrationToken} from '#core/token.js';\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<CreatedManualRegistrationToken | null>(null);\n const tokens = tokensQuery.data ?? [];\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-region\">\n <section className=\"flex flex-col gap-group\">\n <div className=\"flex items-center justify-between gap-group max-[640px]:items-start\">\n <div className=\"flex flex-col gap-tight\">\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-cluster\">\n {tokensQuery.isFetching && !tokensQuery.isPending ? (\n <Icon\n name=\"loader4Line\"\n className=\"mt-[2px] 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-group\">\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","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":";AAAA,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;AAE/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,SAAgD;IACxF,MAAMc,SAASL,YAAYM,IAAI,IAAI,EAAE;IAErC,SAASC,iBAAiBC,QAAiB;QACzCN,eAAeM;QACf,IAAI,CAACA,UAAU;YACbJ,gBAAgB;QAClB;IACF;IAEA,qBACE,KAACK;QAAIC,WAAU;kBACb,cAAA,MAACC;YAAQD,WAAU;;8BACjB,MAACD;oBAAIC,WAAU;;sCACb,MAACD;4BAAIC,WAAU;;8CACb,KAACrB;oCAAOuB,SAAQ;8CAAK;;8CACrB,KAACtB;oCAAKuB,MAAK;oCAAKH,WAAU;8CAAgC;;;;sCAK5D,MAACD;4BAAIC,WAAU;;gCACZV,YAAYc,UAAU,IAAI,CAACd,YAAYe,SAAS,iBAC/C,KAACjC;oCACCkC,MAAK;oCACLN,WAAU;oCACVO,cAAW;qCAEX;8CACJ,MAAClC;oCAAMmC,MAAMjB;oCAAakB,cAAcZ;;sDACtC,KAACnB;4CAAagC,OAAO;sDACnB,cAAA,KAACvC;0DAAO;;;sDAEV,MAACI;4CAAaoC,oBAAkBC;;8DAC9B,KAACnC;oDAAWuB,WAAU;8DAAU;;8DAChC,KAACxB;8DACC,cAAA,KAACI;wDACCuB,MAAK;wDACLU,eAAY;wDACZb,WAAU;kEACX;;;gDAIFP,6BACC,KAACnB;oDAAU0B,WAAU;8DACnB,cAAA,KAACjB;wDAAoC+B,OAAOrB;;mEAG9C,KAACT;oDACCK,aAAaA;oDACb0B,WAAWrB;;;;;;;;;;gBAQtBJ,YAAYe,SAAS,iBAAG,KAAClB,4CAA0C;gBAEnEG,YAAY0B,OAAO,IAAI1B,YAAYM,IAAI,KAAKgB,0BAC3C,KAAC1C;oBAAe+C,OAAO3B;oBAAa4B,SAAQ;qBAC1C;gBAEH5B,YAAYM,IAAI,KAAKgB,aAAajB,OAAOwB,MAAM,KAAK,kBACnD,KAAClC,qCACC;gBAEHU,OAAOwB,MAAM,GAAG,kBACf,KAACjC;oBAA4BG,aAAaA;oBAAaM,QAAQA;qBAC7D;;;;AAIZ"}
|
|
@@ -98,13 +98,13 @@ export function ProvisionerTokenList({ workspaceId, tokens, activeIds }) {
|
|
|
98
98
|
})
|
|
99
99
|
}),
|
|
100
100
|
/*#__PURE__*/ _jsx("ul", {
|
|
101
|
-
className: "hidden flex-col gap-
|
|
101
|
+
className: "hidden flex-col gap-inline max-[760px]:flex",
|
|
102
102
|
"aria-label": "Provisioner tokens",
|
|
103
103
|
children: tokens.map((token)=>/*#__PURE__*/ _jsxs("li", {
|
|
104
|
-
className: "rounded-8 border border-border-neutral-base bg-background-neutral-base p-
|
|
104
|
+
className: "flex flex-col gap-cluster rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact",
|
|
105
105
|
children: [
|
|
106
106
|
/*#__PURE__*/ _jsxs("div", {
|
|
107
|
-
className: "flex items-start justify-between gap-
|
|
107
|
+
className: "flex items-start justify-between gap-cluster",
|
|
108
108
|
children: [
|
|
109
109
|
/*#__PURE__*/ _jsxs("div", {
|
|
110
110
|
className: "min-w-0 flex-1",
|
|
@@ -126,7 +126,7 @@ export function ProvisionerTokenList({ workspaceId, tokens, activeIds }) {
|
|
|
126
126
|
]
|
|
127
127
|
}),
|
|
128
128
|
/*#__PURE__*/ _jsxs("dl", {
|
|
129
|
-
className: "
|
|
129
|
+
className: "grid grid-cols-2 gap-inline text-sm",
|
|
130
130
|
children: [
|
|
131
131
|
/*#__PURE__*/ _jsxs("div", {
|
|
132
132
|
children: [
|
|
@@ -186,7 +186,7 @@ function ProvisionerTokenDate({ value }) {
|
|
|
186
186
|
function ProvisionerStatusCell({ token, activeIds }) {
|
|
187
187
|
const status = provisionerConnectionStatus(token, activeIds);
|
|
188
188
|
return /*#__PURE__*/ _jsxs("span", {
|
|
189
|
-
className: "inline-flex items-center gap-
|
|
189
|
+
className: "inline-flex items-center gap-inline",
|
|
190
190
|
children: [
|
|
191
191
|
/*#__PURE__*/ _jsx(Dot, {
|
|
192
192
|
variant: status.dotVariant
|
|
@@ -266,7 +266,7 @@ function RevokeProvisionerTokenButton({ workspaceId, token }) {
|
|
|
266
266
|
title: "Revoke token?"
|
|
267
267
|
}),
|
|
268
268
|
/*#__PURE__*/ _jsxs(ModalBody, {
|
|
269
|
-
className: "gap-
|
|
269
|
+
className: "gap-group",
|
|
270
270
|
children: [
|
|
271
271
|
/*#__PURE__*/ _jsxs(Text, {
|
|
272
272
|
size: "sm",
|
|
@@ -320,7 +320,7 @@ export function ProvisionerTokenTableSkeleton() {
|
|
|
320
320
|
return /*#__PURE__*/ _jsx("div", {
|
|
321
321
|
role: "status",
|
|
322
322
|
"aria-label": "Loading provisioner tokens",
|
|
323
|
-
className: "flex flex-col gap-
|
|
323
|
+
className: "flex flex-col gap-inline",
|
|
324
324
|
children: [
|
|
325
325
|
0,
|
|
326
326
|
1,
|
|
@@ -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-10 max-[760px]:flex\" aria-label=\"Provisioner tokens\">\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={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=\"mt-12 grid grid-cols-2 gap-10 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-6\">\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-16\">\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-8\">\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":"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"}
|
|
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"}
|