diff --git a/src/Boxer/index.ts b/src/Boxer/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/Boxer/todo.md b/src/Boxer/todo.md new file mode 100644 index 0000000..4d829cb --- /dev/null +++ b/src/Boxer/todo.md @@ -0,0 +1,8 @@ +- [ ] Auto Complete +- [ ] Multi Select +- [ ] Virtualize +- [ ] Search +- [ ] Clear, Menu buttons +- [ ] Headerspec API +- [ ] Relspec API +- [ ] SocketSpec API diff --git a/src/FormerControllers/Buttons/ButtonCtrl.tsx b/src/FormerControllers/Buttons/ButtonCtrl.tsx new file mode 100644 index 0000000..841a672 --- /dev/null +++ b/src/FormerControllers/Buttons/ButtonCtrl.tsx @@ -0,0 +1,35 @@ +import { Button, type ButtonProps, Tooltip } from '@mantine/core'; +import { useState } from 'react'; + +import type { SpecialIDProps } from '../FormerControllers.types'; + +const ButtonCtrl = ( + props: { + onClick?: (e?: React.MouseEvent) => Promise; + } & Omit & + SpecialIDProps +) => { + const [loading, setLoading] = useState(false); + return ( + + + + ); +}; + +export { ButtonCtrl }; +export default ButtonCtrl; diff --git a/src/FormerControllers/Buttons/IconButtonCtrl.tsx b/src/FormerControllers/Buttons/IconButtonCtrl.tsx new file mode 100644 index 0000000..f901be3 --- /dev/null +++ b/src/FormerControllers/Buttons/IconButtonCtrl.tsx @@ -0,0 +1,36 @@ +import { ActionIcon, type ActionIconProps, Tooltip, VisuallyHidden } from '@mantine/core'; +import { useState } from 'react'; + +import type { SpecialIDProps } from '../FormerControllers.types'; + +const IconButtonCtrl = ( + props: { + onClick?: (e?: React.MouseEvent) => Promise; + } & Omit & + SpecialIDProps +) => { + const [loading, setLoading] = useState(false); + return ( + + { + if (props.onClick) { + setLoading(true); + props.onClick(e).finally(() => setLoading(false)); + } + }} + > + {props.children} + Action Button: {props.tooltip ?? props.sid ?? ''} + + + ); +}; + +export { IconButtonCtrl }; +export default IconButtonCtrl; diff --git a/src/FormerControllers/FormerControllers.types.ts b/src/FormerControllers/FormerControllers.types.ts new file mode 100644 index 0000000..16ff93e --- /dev/null +++ b/src/FormerControllers/FormerControllers.types.ts @@ -0,0 +1,8 @@ +import type { ControllerProps } from 'react-hook-form'; + +export type FormerControllersProps = Omit; + +export interface SpecialIDProps { + sid?: string; + tooltip?: string; +} diff --git a/src/FormerControllers/Inputs/NativeSelectCtrl.tsx b/src/FormerControllers/Inputs/NativeSelectCtrl.tsx new file mode 100644 index 0000000..6028bcf --- /dev/null +++ b/src/FormerControllers/Inputs/NativeSelectCtrl.tsx @@ -0,0 +1,30 @@ +import { NativeSelect, type NativeSelectProps, Tooltip } from '@mantine/core'; +import { Controller } from 'react-hook-form'; + +import type { FormerControllersProps, SpecialIDProps } from '../FormerControllers.types'; + +const NativeSelectCtrl = (props: FormerControllersProps & NativeSelectProps & SpecialIDProps) => { + const { control, name, sid, tooltip, ...innerProps } = props; + return ( + ( + + + {props.children} + + + )} + /> + ); +}; + +export { NativeSelectCtrl }; +export default NativeSelectCtrl; diff --git a/src/FormerControllers/Inputs/NumberInputCtrl.tsx b/src/FormerControllers/Inputs/NumberInputCtrl.tsx new file mode 100644 index 0000000..f42ad9c --- /dev/null +++ b/src/FormerControllers/Inputs/NumberInputCtrl.tsx @@ -0,0 +1,36 @@ +import { NumberInput, type NumberInputProps, Tooltip } from '@mantine/core'; +import { Controller } from 'react-hook-form'; + +import type { FormerControllersProps, SpecialIDProps } from '../FormerControllers.types'; + +const NumberInputCtrl = (props: FormerControllersProps & NumberInputProps & SpecialIDProps) => { + const { control, name, sid, tooltip, ...textProps } = props; + return ( + ( + + + field.onChange(num !== undefined && num !== null ? Number(num) : undefined) + } + value={ + field.value !== undefined && field.value !== null ? Number(field.value) : undefined + } + > + {props.children} + + + )} + /> + ); +}; + +export { NumberInputCtrl }; +export default NumberInputCtrl; diff --git a/src/FormerControllers/Inputs/PasswordInputCtrl.tsx b/src/FormerControllers/Inputs/PasswordInputCtrl.tsx new file mode 100644 index 0000000..b03ce40 --- /dev/null +++ b/src/FormerControllers/Inputs/PasswordInputCtrl.tsx @@ -0,0 +1,30 @@ +import { PasswordInput, type PasswordInputProps, Tooltip } from '@mantine/core'; +import { Controller } from 'react-hook-form'; + +import type { FormerControllersProps, SpecialIDProps } from '../FormerControllers.types'; + +const PasswordInputCtrl = (props: FormerControllersProps & PasswordInputProps & SpecialIDProps) => { + const { control, name, sid, tooltip, ...textProps } = props; + return ( + ( + + + {props.children} + + + )} + /> + ); +}; + +export { PasswordInputCtrl }; +export default PasswordInputCtrl; diff --git a/src/FormerControllers/Inputs/SwitchCtrl.tsx b/src/FormerControllers/Inputs/SwitchCtrl.tsx new file mode 100644 index 0000000..6e0b982 --- /dev/null +++ b/src/FormerControllers/Inputs/SwitchCtrl.tsx @@ -0,0 +1,32 @@ +import { Switch, type SwitchProps, Tooltip } from '@mantine/core'; +import { Controller } from 'react-hook-form'; + +import type { FormerControllersProps, SpecialIDProps } from '../FormerControllers.types'; + +const SwitchCtrl = (props: FormerControllersProps & SpecialIDProps & SwitchProps) => { + const { control, name, sid, tooltip, ...innerProps } = props; + return ( + ( + + { + field.onChange((e.currentTarget ?? e.target)?.checked); + }} + /> + + )} + /> + ); +}; + +export { SwitchCtrl }; +export default SwitchCtrl; diff --git a/src/FormerControllers/Inputs/TextAreaCtrl.tsx b/src/FormerControllers/Inputs/TextAreaCtrl.tsx new file mode 100644 index 0000000..18e1cee --- /dev/null +++ b/src/FormerControllers/Inputs/TextAreaCtrl.tsx @@ -0,0 +1,31 @@ +import { Textarea, type TextareaProps, Tooltip } from '@mantine/core'; +import { Controller } from 'react-hook-form'; + +import type { FormerControllersProps, SpecialIDProps } from '../FormerControllers.types'; + +const TextAreaCtrl = (props: FormerControllersProps & SpecialIDProps & TextareaProps) => { + const { control, name, sid, tooltip, ...innerProps } = props; + return ( + ( + + + + )} + /> + ); +}; + +export { TextAreaCtrl }; +export default TextAreaCtrl; diff --git a/src/FormerControllers/Inputs/TextInputCtrl.tsx b/src/FormerControllers/Inputs/TextInputCtrl.tsx new file mode 100644 index 0000000..cd3ee10 --- /dev/null +++ b/src/FormerControllers/Inputs/TextInputCtrl.tsx @@ -0,0 +1,30 @@ +import { TextInput, type TextInputProps, Tooltip } from '@mantine/core'; +import { Controller } from 'react-hook-form'; + +import type { FormerControllersProps, SpecialIDProps } from '../FormerControllers.types'; + +const TextInputCtrl = (props: FormerControllersProps & SpecialIDProps & TextInputProps) => { + const { control, name, sid, tooltip, ...textProps } = props; + return ( + ( + + + {props.children} + + + )} + /> + ); +}; + +export { TextInputCtrl }; +export default TextInputCtrl; diff --git a/src/FormerControllers/index.ts b/src/FormerControllers/index.ts new file mode 100644 index 0000000..7f75a82 --- /dev/null +++ b/src/FormerControllers/index.ts @@ -0,0 +1,7 @@ +export { ButtonCtrl } from './Buttons/ButtonCtrl'; +export { IconButtonCtrl } from './Buttons/IconButtonCtrl'; +export { NativeSelectCtrl } from './Inputs/NativeSelectCtrl'; +export { PasswordInputCtrl } from './Inputs/PasswordInputCtrl'; +export { SwitchCtrl } from './Inputs/SwitchCtrl'; +export { TextAreaCtrl } from './Inputs/TextAreaCtrl'; +export { TextInputCtrl } from './Inputs/TextInputCtrl'; diff --git a/src/lib.ts b/src/lib.ts index b067119..4cc5bd1 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -1,5 +1,6 @@ -export * from './Gridler' - +export * from './Former'; +export * from './FormerControllers'; +export * from './Gridler'; export { type MantineBetterMenuInstance, @@ -7,4 +8,4 @@ export { MantineBetterMenusProvider, type MantineBetterMenuStoreState, useMantineBetterMenus, -} from "./MantineBetterMenu"; \ No newline at end of file +} from './MantineBetterMenu';