diff --git a/apps/client/src/features/app-settings/panel/url-alias-panel/UrlAliasForm.tsx b/apps/client/src/features/app-settings/panel/url-alias-panel/UrlAliasForm.tsx new file mode 100644 index 000000000..4c3ef01f9 --- /dev/null +++ b/apps/client/src/features/app-settings/panel/url-alias-panel/UrlAliasForm.tsx @@ -0,0 +1,87 @@ +import { useEffect } from 'react'; +import { useForm } from 'react-hook-form'; +import { Button, Input } from '@chakra-ui/react'; + +import style from './UrlAliasPanel.module.scss'; + +export type UrlAliasFormValues = { + alias?: string; + pathAndParams?: string; + enabled?: boolean; +}; + +interface UrlAliasFormProps { + alias?: string; + enabled?: boolean; + pathAndParams?: string; + onCancel: () => void; + onSubmit: (values: UrlAliasFormValues) => Promise; + submitError: string | null; +} + +export default function UrlAliasForm({ + onSubmit, + onCancel, + submitError, + alias, + enabled, + pathAndParams, +}: UrlAliasFormProps) { + const { + handleSubmit, + register, + formState: { isSubmitting, isValid }, + setFocus, + } = useForm({ + defaultValues: { alias, pathAndParams, enabled }, + values: { alias, pathAndParams, enabled }, + resetOptions: { + keepDirtyValues: true, + }, + }); + + useEffect(() => { + setFocus('alias'); + }, [setFocus]); + + return ( +
+
+ +
+
+ +
+
+ + +
+ {submitError && {submitError}} +
+ ); +} diff --git a/apps/client/src/features/app-settings/panel/url-alias-panel/UrlAliasListItem.tsx b/apps/client/src/features/app-settings/panel/url-alias-panel/UrlAliasListItem.tsx index 2f5d7d3fa..e137e5625 100644 --- a/apps/client/src/features/app-settings/panel/url-alias-panel/UrlAliasListItem.tsx +++ b/apps/client/src/features/app-settings/panel/url-alias-panel/UrlAliasListItem.tsx @@ -4,6 +4,8 @@ import { IoEllipsisHorizontal } from '@react-icons/all-files/io5/IoEllipsisHoriz import { updateAliases } from '../../../../common/api/ontimeApi'; +import UrlAliasForm, { UrlAliasFormValues } from './UrlAliasForm'; + interface UrlAliasListItemProps { alias: string; enabled: boolean; @@ -29,6 +31,18 @@ export default function UrlAliasListItem({ alias, enabled, pathAndParams, onRefe setIsEditing(!isEditing); }, [isEditing]); + const handleSubmitUpdate = useCallback( + async (values: UrlAliasFormValues) => { + try { + await updateAliases(values); + await onRefetch(); + } catch (error) { + // some error handling here + } + }, + [onRefetch], + ); + const handleRenderAliases = useMemo(() => { if (!isEditing) { return ( @@ -56,18 +70,22 @@ export default function UrlAliasListItem({ alias, enabled, pathAndParams, onRefe ); } else { - // Return a form - return null; + return ( + + + + ); } - }, [alias, enabled, handleToggle, handleToggleEditMode, isEditing, pathAndParams]); + }, [alias, enabled, handleSubmitUpdate, handleToggle, handleToggleEditMode, isEditing, pathAndParams]); - return ( - - {handleRenderAliases} - {/* {new Date(updatedAt).toLocaleString()} - */} - - ); + return {handleRenderAliases}; } function ActionMenu({ onChangeEditMode }: { onChangeEditMode: () => void }) { diff --git a/apps/client/src/features/app-settings/panel/url-alias-panel/UrlAliasPanel.module.scss b/apps/client/src/features/app-settings/panel/url-alias-panel/UrlAliasPanel.module.scss index e69de29bb..dfc3e945e 100644 --- a/apps/client/src/features/app-settings/panel/url-alias-panel/UrlAliasPanel.module.scss +++ b/apps/client/src/features/app-settings/panel/url-alias-panel/UrlAliasPanel.module.scss @@ -0,0 +1,18 @@ +.form { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; +} + +.formInput { + flex: 2; + padding-right: 1rem; +} + +.actionButtons { + display: flex; + align-items: center; + gap: 0.5rem; + margin-left: 1rem; +} \ No newline at end of file