From d8e4a4b89185616f2b7fe4692f22f705a44d5481 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sat, 5 Mar 2022 19:57:48 +0100 Subject: [PATCH] More improvements to form controls with bootstrap 5 --- .../helpers/EditDomainRedirectsModal.tsx | 6 ++-- src/servers/helpers/ServerForm.scss | 5 --- src/servers/helpers/ServerForm.tsx | 11 +++--- src/settings/RealTimeUpdatesSettings.tsx | 12 ++++--- src/settings/ShortUrlCreationSettings.tsx | 6 ++-- src/settings/ShortUrlsListSettings.tsx | 14 ++++---- src/settings/TagsSettings.tsx | 12 +++---- src/settings/VisitsSettings.tsx | 14 ++++---- src/utils/forms/FormGroupContainer.tsx | 36 ------------------- src/utils/forms/InputFormGroup.tsx | 29 +++++++++++++++ src/utils/forms/LabeledFormGroup.tsx | 17 +++++++++ 11 files changed, 84 insertions(+), 78 deletions(-) delete mode 100644 src/utils/forms/FormGroupContainer.tsx create mode 100644 src/utils/forms/InputFormGroup.tsx create mode 100644 src/utils/forms/LabeledFormGroup.tsx diff --git a/src/domains/helpers/EditDomainRedirectsModal.tsx b/src/domains/helpers/EditDomainRedirectsModal.tsx index 116ed8f3..1fd3c758 100644 --- a/src/domains/helpers/EditDomainRedirectsModal.tsx +++ b/src/domains/helpers/EditDomainRedirectsModal.tsx @@ -1,7 +1,7 @@ import { FC, useState } from 'react'; import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from 'reactstrap'; import { ShlinkDomain, ShlinkDomainRedirects } from '../../api/types'; -import { FormGroupContainer, FormGroupContainerProps } from '../../utils/forms/FormGroupContainer'; +import { InputFormGroup, InputFormGroupProps } from '../../utils/forms/InputFormGroup'; import { handleEventPreventingDefault, nonEmptyValueOrNull } from '../../utils/utils'; import { InfoTooltip } from '../../utils/InfoTooltip'; @@ -12,8 +12,8 @@ interface EditDomainRedirectsModalProps { editDomainRedirects: (domain: string, redirects: Partial) => Promise; } -const FormGroup: FC = ({ isLast, ...rest }) => ( - = ({ isLast, ...rest }) => ( + = (props) => - ; - export const ServerForm: FC = ({ onSubmit, initialValues, children, title }) => { const [ name, setName ] = useState(''); const [ url, setUrl ] = useState(''); @@ -29,9 +26,9 @@ export const ServerForm: FC = ({ onSubmit, initialValues, child return (
- Name - URL - API key + Name + URL + API key
{children}
diff --git a/src/settings/RealTimeUpdatesSettings.tsx b/src/settings/RealTimeUpdatesSettings.tsx index 8be3fced..3fd143b3 100644 --- a/src/settings/RealTimeUpdatesSettings.tsx +++ b/src/settings/RealTimeUpdatesSettings.tsx @@ -4,6 +4,7 @@ import ToggleSwitch from '../utils/ToggleSwitch'; import { SimpleCard } from '../utils/SimpleCard'; import { FormText } from '../utils/forms/FormText'; import { Settings } from './reducers/settings'; +import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup'; interface RealTimeUpdatesProps { settings: Settings; @@ -25,10 +26,11 @@ const RealTimeUpdatesSettings = ( -
- + )} -
+ ); diff --git a/src/settings/ShortUrlCreationSettings.tsx b/src/settings/ShortUrlCreationSettings.tsx index 4c70e731..18d9c2ef 100644 --- a/src/settings/ShortUrlCreationSettings.tsx +++ b/src/settings/ShortUrlCreationSettings.tsx @@ -5,6 +5,7 @@ import ToggleSwitch from '../utils/ToggleSwitch'; import { DropdownBtn } from '../utils/DropdownBtn'; import { FormText } from '../utils/forms/FormText'; import { Settings, ShortUrlCreationSettings as ShortUrlsSettings, TagFilteringMode } from './reducers/settings'; +import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup'; interface ShortUrlCreationProps { settings: Settings; @@ -50,8 +51,7 @@ export const ShortUrlCreationSettings: FC = ({ settings, -
- + = ({ settings, {tagFilteringModeHint(shortUrlCreation.tagFilteringMode)} -
+ ); }; diff --git a/src/settings/ShortUrlsListSettings.tsx b/src/settings/ShortUrlsListSettings.tsx index e7079e7f..4d43a089 100644 --- a/src/settings/ShortUrlsListSettings.tsx +++ b/src/settings/ShortUrlsListSettings.tsx @@ -3,6 +3,7 @@ import { OrderingDropdown } from '../utils/OrderingDropdown'; import { SHORT_URLS_ORDERABLE_FIELDS } from '../short-urls/data'; import { SimpleCard } from '../utils/SimpleCard'; import { DEFAULT_SHORT_URLS_ORDERING, Settings, ShortUrlsListSettings as ShortUrlsSettings } from './reducers/settings'; +import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup'; interface ShortUrlsListProps { settings: Settings; @@ -13,11 +14,12 @@ export const ShortUrlsListSettings: FC = ( { settings: { shortUrlsList }, setShortUrlsListSettings }, ) => ( - - setShortUrlsListSettings({ defaultOrdering: { field, dir } })} - /> + + setShortUrlsListSettings({ defaultOrdering: { field, dir } })} + /> + ); diff --git a/src/settings/TagsSettings.tsx b/src/settings/TagsSettings.tsx index ce6d9593..db37e167 100644 --- a/src/settings/TagsSettings.tsx +++ b/src/settings/TagsSettings.tsx @@ -1,11 +1,11 @@ import { FC } from 'react'; -import { FormGroup } from 'reactstrap'; import { SimpleCard } from '../utils/SimpleCard'; import { TagsModeDropdown } from '../tags/TagsModeDropdown'; import { capitalize } from '../utils/utils'; import { OrderingDropdown } from '../utils/OrderingDropdown'; import { TAGS_ORDERABLE_FIELDS } from '../tags/data/TagsListChildrenProps'; import { FormText } from '../utils/forms/FormText'; +import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup'; import { Settings, TagsSettings as TagsSettingsOptions } from './reducers/settings'; interface TagsProps { @@ -15,22 +15,20 @@ interface TagsProps { export const TagsSettings: FC = ({ settings: { tags }, setTagsSettings }) => ( - - + capitalize(tagsMode)} onChange={(defaultMode) => setTagsSettings({ ...tags, defaultMode })} /> Tags will be displayed as {tags?.defaultMode ?? 'cards'}. - -
- + + setTagsSettings({ ...tags, defaultOrdering: { field, dir } })} /> -
+
); diff --git a/src/settings/VisitsSettings.tsx b/src/settings/VisitsSettings.tsx index 0598cd16..dd787d9c 100644 --- a/src/settings/VisitsSettings.tsx +++ b/src/settings/VisitsSettings.tsx @@ -2,6 +2,7 @@ import { FC } from 'react'; import { SimpleCard } from '../utils/SimpleCard'; import { DateIntervalSelector } from '../utils/dates/DateIntervalSelector'; import { Settings, VisitsSettings as VisitsSettingsConfig } from './reducers/settings'; +import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup'; interface VisitsProps { settings: Settings; @@ -10,11 +11,12 @@ interface VisitsProps { export const VisitsSettings: FC = ({ settings, setVisitsSettings }) => ( - - setVisitsSettings({ defaultInterval })} - /> + + setVisitsSettings({ defaultInterval })} + /> + ); diff --git a/src/utils/forms/FormGroupContainer.tsx b/src/utils/forms/FormGroupContainer.tsx deleted file mode 100644 index e497b269..00000000 --- a/src/utils/forms/FormGroupContainer.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { FC, useRef } from 'react'; -import { v4 as uuid } from 'uuid'; -import { InputType } from 'reactstrap/types/lib/Input'; -import { FormGroup } from 'reactstrap'; - -export interface FormGroupContainerProps { - value: string; - onChange: (newValue: string) => void; - id?: string; - type?: InputType; - required?: boolean; - placeholder?: string; - className?: string; - labelClassName?: string; -} - -export const FormGroupContainer: FC = ( - { children, value, onChange, id, type, required, placeholder, className, labelClassName = '' }, -) => { - const forId = useRef(id ?? uuid()); - - return ( - - - onChange(e.target.value)} - /> - - ); -}; diff --git a/src/utils/forms/InputFormGroup.tsx b/src/utils/forms/InputFormGroup.tsx new file mode 100644 index 00000000..b0039a43 --- /dev/null +++ b/src/utils/forms/InputFormGroup.tsx @@ -0,0 +1,29 @@ +import { FC } from 'react'; +import { InputType } from 'reactstrap/types/lib/Input'; +import { LabeledFormGroup } from './LabeledFormGroup'; + +export interface InputFormGroupProps { + value: string; + onChange: (newValue: string) => void; + id?: string; + type?: InputType; + required?: boolean; + placeholder?: string; + className?: string; + labelClassName?: string; +} + +export const InputFormGroup: FC = ( + { children, value, onChange, type, required, placeholder, className, labelClassName }, +) => ( + {children}:} className={className ?? ''} labelClassName={labelClassName}> + onChange(e.target.value)} + /> + +); diff --git a/src/utils/forms/LabeledFormGroup.tsx b/src/utils/forms/LabeledFormGroup.tsx new file mode 100644 index 00000000..de52ecbc --- /dev/null +++ b/src/utils/forms/LabeledFormGroup.tsx @@ -0,0 +1,17 @@ +import { FC, ReactNode } from 'react'; + +interface LabeledFormGroupProps { + label: ReactNode; + noMargin?: boolean; + className?: string; + labelClassName?: string; +} + +export const LabeledFormGroup: FC = ( + { children, label, className = '', labelClassName = '', noMargin = false }, +) => ( +
+ + {children} +
+);