From 0ac2806481852249c6a2d4a032cc2c0324a58ef8 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Fri, 11 Jan 2019 21:07:21 +0100 Subject: Add toggle element to @meetfranz/forms --- packages/forms/src/index.ts | 3 +- packages/forms/src/input/index.tsx | 10 ++- packages/forms/src/input/styles.ts | 2 +- packages/forms/src/toggle/index.tsx | 117 ++++++++++++++++++++++++++++++++++ packages/forms/src/typings/generic.ts | 7 +- packages/forms/src/wrapper/index.tsx | 2 + 6 files changed, 131 insertions(+), 10 deletions(-) create mode 100644 packages/forms/src/toggle/index.tsx (limited to 'packages/forms/src') diff --git a/packages/forms/src/index.ts b/packages/forms/src/index.ts index 3f24ecaf7..a506de111 100644 --- a/packages/forms/src/index.ts +++ b/packages/forms/src/index.ts @@ -1 +1,2 @@ -export { default as Input } from './input'; +export { Input } from './input'; +export { Toggle } from './toggle'; diff --git a/packages/forms/src/input/index.tsx b/packages/forms/src/input/index.tsx index 0e19e3368..d82ee5fe3 100644 --- a/packages/forms/src/input/index.tsx +++ b/packages/forms/src/input/index.tsx @@ -16,14 +16,12 @@ import scorePasswordFunc from './scorePassword'; import styles from './styles'; -interface IProps extends IFormField, React.InputHTMLAttributes, IWithStyle { - label: string; +interface IProps extends React.InputHTMLAttributes, IFormField, IWithStyle { focus?: boolean; prefix?: string; suffix?: string; scorePassword?: boolean; showPasswordToggle?: boolean; - error?: string; } interface IState { @@ -32,15 +30,15 @@ interface IState { } @observer -class Input extends Component { +class InputComponent extends Component { public static defaultProps = { - classes: {}, focus: false, onChange: () => {}, scorePassword: false, showLabel: true, showPasswordToggle: false, type: 'text', + disabled: false, }; state = { @@ -172,4 +170,4 @@ class Input extends Component { } } -export default injectSheet(styles)(Input); +export const Input = injectSheet(styles)(InputComponent); diff --git a/packages/forms/src/input/styles.ts b/packages/forms/src/input/styles.ts index 2cdda12ee..2b34e92c3 100644 --- a/packages/forms/src/input/styles.ts +++ b/packages/forms/src/input/styles.ts @@ -1,5 +1,5 @@ +import { Theme } from '@meetfranz/theme'; import CSS from 'csstype'; -import { Theme } from '../../../theme/lib'; const prefixStyles = (theme: Theme) => ({ background: theme.inputPrefixBackground, diff --git a/packages/forms/src/toggle/index.tsx b/packages/forms/src/toggle/index.tsx new file mode 100644 index 000000000..759694dc8 --- /dev/null +++ b/packages/forms/src/toggle/index.tsx @@ -0,0 +1,117 @@ +import { Theme } from '@meetfranz/theme'; +import classnames from 'classnames'; +import CSS from 'csstype'; +import { observer } from 'mobx-react'; +import React, { Component, createRef } from 'react'; +import injectStyle from 'react-jss'; + +import { IFormField, IWithStyle, Omit } from '../typings/generic'; + +import Error from '../error'; +import Label from '../label'; +import Wrapper from '../wrapper'; + +interface IProps extends React.InputHTMLAttributes, IFormField, IWithStyle { + // field: any; +} + +const styles = (theme: Theme) => ({ + toggle: { + background: theme.toggleBackground, + borderRadius: theme.borderRadius, + height: theme.toggleHeight, + position: 'relative' as CSS.PositionProperty, + width: theme.toggleWidth, + }, + button: { + background: theme.toggleButton, + borderRadius: '100%', + boxShadow: '0 1px 4px rgba(0, 0, 0, .3)', + width: theme.toggleHeight - 2, + height: theme.toggleHeight - 2, + left: 1, + top: 1, + position: 'absolute' as CSS.PositionProperty, + transition: 'all .5s', + }, + buttonActive: { + background: theme.toggleButtonActive, + left: (theme.toggleWidth - theme.toggleHeight) + 1, + }, + input: { + visibility: 'hidden' as any, + }, + disabled: { + opacity: 0.5, + }, + toggleLabel: { + display: 'flex', + + '& > span': { + order: 1, + marginLeft: 15, + marginTop: 2, + }, + }, +}); + +@observer +class ToggleComponent extends Component { + public static defaultProps = { + onChange: () => {}, + showLabel: true, + disabled: false, + error: '', + }; + + render() { + const { + classes, + disabled, + error, + id, + label, + showLabel, + checked, + value, + onChange, + } = this.props; + + console.log('props', this.props); + + return ( + +