mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-14 08:02:15 +03:00
feat: autofill name and url in rest endpoint form
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/9859 GitOrigin-RevId: 5c5c43bc9f7485d5668ebc12bebea0a3e52cd9bc
This commit is contained in:
parent
318634c7a1
commit
28d5f43b9b
@ -17,6 +17,8 @@ import { IndicatorCard } from '../../../../../new-components/IndicatorCard';
|
|||||||
import clsx from 'clsx';
|
import clsx from 'clsx';
|
||||||
import { openInGraphiQL } from '../../../../../features/RestEndpoints/components/RestEndpointDetails/utils';
|
import { openInGraphiQL } from '../../../../../features/RestEndpoints/components/RestEndpointDetails/utils';
|
||||||
import { Analytics } from '../../../../../features/Analytics';
|
import { Analytics } from '../../../../../features/Analytics';
|
||||||
|
import { parse } from 'graphql';
|
||||||
|
import { useDebouncedEffect } from '../../../../../hooks/useDebounceEffect';
|
||||||
|
|
||||||
const editorOptions = {
|
const editorOptions = {
|
||||||
minLines: 10,
|
minLines: 10,
|
||||||
@ -78,7 +80,7 @@ const validationSchema = z.object({
|
|||||||
request: z
|
request: z
|
||||||
.string()
|
.string()
|
||||||
.min(1, { message: 'Please add a GraphQL query' })
|
.min(1, { message: 'Please add a GraphQL query' })
|
||||||
.refine(val => isQueryValid(val), 'Please add a valid GraphQL query'),
|
.refine(val => isQueryValid(val), 'Please add a valid named GraphQL query'),
|
||||||
});
|
});
|
||||||
|
|
||||||
export const RestEndpointForm: React.FC<RestEndpointFormProps> = ({
|
export const RestEndpointForm: React.FC<RestEndpointFormProps> = ({
|
||||||
@ -93,6 +95,7 @@ export const RestEndpointForm: React.FC<RestEndpointFormProps> = ({
|
|||||||
setFocus,
|
setFocus,
|
||||||
watch,
|
watch,
|
||||||
formState: { errors },
|
formState: { errors },
|
||||||
|
setValue,
|
||||||
},
|
},
|
||||||
Form,
|
Form,
|
||||||
} = useConsoleForm({
|
} = useConsoleForm({
|
||||||
@ -108,6 +111,40 @@ export const RestEndpointForm: React.FC<RestEndpointFormProps> = ({
|
|||||||
|
|
||||||
const request = watch('request');
|
const request = watch('request');
|
||||||
|
|
||||||
|
const [userChangedName, setUserChangedName] = React.useState(false);
|
||||||
|
const [userChangedUrl, setUserChangedUrl] = React.useState(false);
|
||||||
|
|
||||||
|
useDebouncedEffect(
|
||||||
|
() => {
|
||||||
|
if (request) {
|
||||||
|
try {
|
||||||
|
const parsedQuery = parse(request);
|
||||||
|
if (parsedQuery?.definitions?.length > 0) {
|
||||||
|
const operation = parsedQuery.definitions[0];
|
||||||
|
if ('name' in operation) {
|
||||||
|
if (!userChangedName) {
|
||||||
|
setValue('name', operation.name?.value);
|
||||||
|
}
|
||||||
|
if (!userChangedUrl) {
|
||||||
|
setValue(
|
||||||
|
'url',
|
||||||
|
operation.name?.value
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/[^a-z0-9]+/g, '-')
|
||||||
|
.replace(/(^-|-$)+/g, '')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
500,
|
||||||
|
[request]
|
||||||
|
);
|
||||||
|
|
||||||
const prependLabel = `${globals.dataApiUrl}/api/rest/`.replace(/\/\//, '/');
|
const prependLabel = `${globals.dataApiUrl}/api/rest/`.replace(/\/\//, '/');
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -147,7 +184,15 @@ export const RestEndpointForm: React.FC<RestEndpointFormProps> = ({
|
|||||||
</Analytics>
|
</Analytics>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<InputField name="name" label="Name" placeholder="Name" />
|
<InputField
|
||||||
|
name="name"
|
||||||
|
label="Name"
|
||||||
|
placeholder="Name"
|
||||||
|
inputTransform={str => {
|
||||||
|
setUserChangedName(true);
|
||||||
|
return str;
|
||||||
|
}}
|
||||||
|
/>
|
||||||
<Textarea
|
<Textarea
|
||||||
name="comment"
|
name="comment"
|
||||||
label="Description (Optional)"
|
label="Description (Optional)"
|
||||||
@ -160,7 +205,12 @@ export const RestEndpointForm: React.FC<RestEndpointFormProps> = ({
|
|||||||
placeholder="Location"
|
placeholder="Location"
|
||||||
description={`This is the location of your endpoint (must be unique).`}
|
description={`This is the location of your endpoint (must be unique).`}
|
||||||
prependLabel={prependLabel}
|
prependLabel={prependLabel}
|
||||||
|
inputTransform={str => {
|
||||||
|
setUserChangedUrl(true);
|
||||||
|
return str;
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<IndicatorCard
|
<IndicatorCard
|
||||||
className={clsx(errors?.url ? 'mt-1' : '-mt-4', 'py-3')}
|
className={clsx(errors?.url ? 'mt-1' : '-mt-4', 'py-3')}
|
||||||
showIcon
|
showIcon
|
||||||
|
@ -21,7 +21,7 @@ const Landing = () => {
|
|||||||
size="sm"
|
size="sm"
|
||||||
onClick={() => dispatch(_push('/api/rest/create'))}
|
onClick={() => dispatch(_push('/api/rest/create'))}
|
||||||
>
|
>
|
||||||
Create REST
|
Create Endpoint
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<div className="pb-md pr-md">
|
<div className="pb-md pr-md">
|
||||||
|
@ -67,7 +67,7 @@ const ListComponent: React.FC<ListComponentProps> = ({
|
|||||||
size="sm"
|
size="sm"
|
||||||
onClick={() => dispatch(_push('/api/rest/create'))}
|
onClick={() => dispatch(_push('/api/rest/create'))}
|
||||||
>
|
>
|
||||||
Create REST
|
Create Endpoint
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<div className="">
|
<div className="">
|
||||||
|
Loading…
Reference in New Issue
Block a user