diff --git a/src/__snapshots__/storybook.test.js.snap b/src/__snapshots__/storybook.test.js.snap index a54577b15..761f7b520 100644 --- a/src/__snapshots__/storybook.test.js.snap +++ b/src/__snapshots__/storybook.test.js.snap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:71d229409bc29def35df60c1686a2f911e200934c035fc5dce872e341cd70b26 -size 1811243 +oid sha256:27ca12107fbb302d13f3614c19fdb17bf357c2e7ab7e8ce71271bc60205fd2fa +size 1811279 diff --git a/src/components/Selectors/CheckBox/CheckBox.stories.tsx b/src/components/CheckBox/CheckBox.stories.tsx similarity index 92% rename from src/components/Selectors/CheckBox/CheckBox.stories.tsx rename to src/components/CheckBox/CheckBox.stories.tsx index ae806aed2..3dd9e4f44 100644 --- a/src/components/Selectors/CheckBox/CheckBox.stories.tsx +++ b/src/components/CheckBox/CheckBox.stories.tsx @@ -1,8 +1,7 @@ import React, { useState } from 'react'; import { Stories } from '@storybook/addon-docs'; import { ComponentStory, ComponentMeta } from '@storybook/react'; -import { CheckBox, CheckBoxGroup } from '../'; -import { CheckboxValueType } from './Checkbox.types'; +import { CheckBox, CheckBoxGroup, CheckboxValueType } from './'; export default { title: 'Check Box', @@ -75,6 +74,13 @@ export default { defaultValue: true, control: { type: 'boolean' }, }, + onChange: { + action: 'change', + }, + layout: { + options: ['vertical', 'horizontal'], + control: { type: 'radio' }, + }, }, } as ComponentMeta; @@ -90,7 +96,10 @@ const CheckBoxGroup_Story: ComponentStory = (args) => { setSelected([...newSelected])} + onChange={(newSelected) => { + args.onChange(newSelected); + setSelected([...newSelected]); + }} /> ); }; @@ -136,4 +145,5 @@ Check_Box_Group.args = { id: 'test-3', }, ], + layout: 'vertical', }; diff --git a/src/components/Selectors/CheckBox/CheckBox.test.tsx b/src/components/CheckBox/CheckBox.test.tsx similarity index 93% rename from src/components/Selectors/CheckBox/CheckBox.test.tsx rename to src/components/CheckBox/CheckBox.test.tsx index 41756d4ef..3b144fbe8 100644 --- a/src/components/Selectors/CheckBox/CheckBox.test.tsx +++ b/src/components/CheckBox/CheckBox.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import Enzyme, { mount } from 'enzyme'; import Adapter from '@wojtekmaj/enzyme-adapter-react-17'; -import { CheckBox } from '../'; +import { CheckBox } from './'; Enzyme.configure({ adapter: new Adapter() }); diff --git a/src/components/Selectors/CheckBox/CheckBox.tsx b/src/components/CheckBox/CheckBox.tsx similarity index 94% rename from src/components/Selectors/CheckBox/CheckBox.tsx rename to src/components/CheckBox/CheckBox.tsx index 846e19d57..d333aa5fa 100644 --- a/src/components/Selectors/CheckBox/CheckBox.tsx +++ b/src/components/CheckBox/CheckBox.tsx @@ -1,6 +1,6 @@ import React, { FC, Ref, useEffect, useRef, useState } from 'react'; -import { generateId, mergeClasses } from '../../../shared/utilities'; -import { CheckboxProps } from './Checkbox.types'; +import { generateId, mergeClasses } from '../../shared/utilities'; +import { CheckboxProps } from './'; import styles from './checkbox.module.scss'; diff --git a/src/components/Selectors/CheckBox/CheckBoxGroup.tsx b/src/components/CheckBox/CheckBoxGroup.tsx similarity index 76% rename from src/components/Selectors/CheckBox/CheckBoxGroup.tsx rename to src/components/CheckBox/CheckBoxGroup.tsx index 8afda5a33..27ca1e81d 100644 --- a/src/components/Selectors/CheckBox/CheckBoxGroup.tsx +++ b/src/components/CheckBox/CheckBoxGroup.tsx @@ -1,17 +1,27 @@ import React, { FC, Ref } from 'react'; -import { CheckBox } from './CheckBox'; -import { mergeClasses } from '../../../shared/utilities'; -import { CheckboxGroupProps } from './Checkbox.types'; +import { mergeClasses } from '../../shared/utilities'; +import { CheckboxGroupProps, CheckBox } from './'; import styles from './checkbox.module.scss'; export const CheckBoxGroup: FC = React.forwardRef( ( - { items = [], onChange, value, classNames, style, ariaLabel, ...rest }, + { + items = [], + onChange, + value, + classNames, + style, + ariaLabel, + layout = 'vertical', + ...rest + }, ref: Ref ) => { const checkboxGroupClassNames = mergeClasses([ styles.checkboxGroup, + { [styles.vertical]: layout === 'vertical' }, + { [styles.horizontal]: layout === 'horizontal' }, classNames, ]); diff --git a/src/components/Selectors/CheckBox/Checkbox.types.ts b/src/components/CheckBox/Checkbox.types.ts similarity index 89% rename from src/components/Selectors/CheckBox/Checkbox.types.ts rename to src/components/CheckBox/Checkbox.types.ts index b45556325..ed45467a1 100644 --- a/src/components/Selectors/CheckBox/Checkbox.types.ts +++ b/src/components/CheckBox/Checkbox.types.ts @@ -1,5 +1,5 @@ import React from 'react'; -import { OcBaseProps } from '../../OcBase'; +import { OcBaseProps } from '../OcBase'; export type CheckboxValueType = string | number; @@ -62,4 +62,9 @@ export interface CheckboxGroupProps * @param checkedValue */ onChange?: (checkedValue: CheckboxValueType[]) => void; + /** + * Type of layout for the checkbox group + * @default vertical + */ + layout?: 'vertical' | 'horizontal'; } diff --git a/src/components/Selectors/CheckBox/checkbox.module.scss b/src/components/CheckBox/checkbox.module.scss similarity index 97% rename from src/components/Selectors/CheckBox/checkbox.module.scss rename to src/components/CheckBox/checkbox.module.scss index 1ab4f5e9e..5f9ef2513 100644 --- a/src/components/Selectors/CheckBox/checkbox.module.scss +++ b/src/components/CheckBox/checkbox.module.scss @@ -181,8 +181,15 @@ } .checkbox-group { - .selector { - margin-bottom: $space-m; + display: flex; + gap: $space-m; + + &.vertical { + flex-direction: column; + } + + &.horizontal { + flex-direction: row; } } diff --git a/src/components/CheckBox/index.ts b/src/components/CheckBox/index.ts new file mode 100644 index 000000000..b778516ea --- /dev/null +++ b/src/components/CheckBox/index.ts @@ -0,0 +1,3 @@ +export * from './Checkbox.types'; +export * from './CheckBox'; +export * from './CheckBoxGroup'; diff --git a/src/components/ConfigProvider/ConfigProvider.stories.tsx b/src/components/ConfigProvider/ConfigProvider.stories.tsx index d1fc1c86e..9a9c83929 100644 --- a/src/components/ConfigProvider/ConfigProvider.stories.tsx +++ b/src/components/ConfigProvider/ConfigProvider.stories.tsx @@ -14,7 +14,8 @@ import { ConfigProvider, OcThemeNames, ThemeOptions, useConfig } from './'; import { MatchScore } from '../MatchScore'; import { Spinner } from '../Spinner'; import { Stack } from '../Stack'; -import { CheckBoxGroup, RadioGroup } from '../Selectors'; +import { RadioGroup } from '../RadioButton'; +import { CheckBoxGroup } from '../CheckBox'; import { Link } from '../Link'; import { Navbar, NavbarContent } from '../Navbar'; diff --git a/src/components/Selectors/RadioButton/Radio.types.ts b/src/components/RadioButton/Radio.types.ts similarity index 90% rename from src/components/Selectors/RadioButton/Radio.types.ts rename to src/components/RadioButton/Radio.types.ts index ae42ee4e1..e732d84a1 100644 --- a/src/components/Selectors/RadioButton/Radio.types.ts +++ b/src/components/RadioButton/Radio.types.ts @@ -1,5 +1,5 @@ import React from 'react'; -import { OcBaseProps } from '../../OcBase'; +import { OcBaseProps } from '../OcBase'; export type RadioButtonValue = string | number; @@ -62,4 +62,9 @@ export interface RadioGroupProps extends OcBaseProps { * The radio button onChange event handler. */ onChange?: React.ChangeEventHandler; + /** + * Type of layout for the radio group + * @default vertical + */ + layout?: 'vertical' | 'horizontal'; } diff --git a/src/components/Selectors/RadioButton/RadioButton.stories.tsx b/src/components/RadioButton/RadioButton.stories.tsx similarity index 96% rename from src/components/Selectors/RadioButton/RadioButton.stories.tsx rename to src/components/RadioButton/RadioButton.stories.tsx index 3fa465f4c..6c88c9bfd 100644 --- a/src/components/Selectors/RadioButton/RadioButton.stories.tsx +++ b/src/components/RadioButton/RadioButton.stories.tsx @@ -1,12 +1,7 @@ import React, { useState } from 'react'; import { Stories } from '@storybook/addon-docs'; import { ComponentStory, ComponentMeta } from '@storybook/react'; -import { - CheckboxValueType, - RadioButton, - RadioButtonValue, - RadioGroup, -} from '../index'; +import { RadioButton, RadioButtonValue, RadioGroup } from './'; export default { title: 'Radio Button', @@ -104,6 +99,10 @@ export default { onChange: { action: 'change', }, + layout: { + options: ['vertical', 'horizontal'], + control: { type: 'radio' }, + }, }, } as ComponentMeta; @@ -120,6 +119,7 @@ const RadioGroup_Story: ComponentStory = (args) => { {...args} value={selected} onChange={(e) => { + args.onChange(e); setSelected(e.target.value); }} /> @@ -153,4 +153,5 @@ Radio_Group.args = { name: 'group', id: `oea2exk-${i}`, })), + layout: 'vertical', }; diff --git a/src/components/Selectors/RadioButton/RadioButton.test.tsx b/src/components/RadioButton/RadioButton.test.tsx similarity index 93% rename from src/components/Selectors/RadioButton/RadioButton.test.tsx rename to src/components/RadioButton/RadioButton.test.tsx index 129cd08fb..27fb457ce 100644 --- a/src/components/Selectors/RadioButton/RadioButton.test.tsx +++ b/src/components/RadioButton/RadioButton.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import Enzyme, { mount } from 'enzyme'; import Adapter from '@wojtekmaj/enzyme-adapter-react-17'; -import { RadioButton } from '../'; +import { RadioButton } from './'; Enzyme.configure({ adapter: new Adapter() }); diff --git a/src/components/Selectors/RadioButton/RadioButton.tsx b/src/components/RadioButton/RadioButton.tsx similarity index 95% rename from src/components/Selectors/RadioButton/RadioButton.tsx rename to src/components/RadioButton/RadioButton.tsx index 0a2b1cec6..695140464 100644 --- a/src/components/Selectors/RadioButton/RadioButton.tsx +++ b/src/components/RadioButton/RadioButton.tsx @@ -1,6 +1,6 @@ import React, { FC, Ref, useEffect, useRef, useState } from 'react'; -import { RadioButtonProps } from './Radio.types'; -import { mergeClasses, generateId } from '../../../shared/utilities'; +import { RadioButtonProps } from './'; +import { mergeClasses, generateId } from '../../shared/utilities'; import { useRadioGroup } from './RadioGroup.context'; import styles from './radio.module.scss'; diff --git a/src/components/Selectors/RadioButton/RadioGroup.context.tsx b/src/components/RadioButton/RadioGroup.context.tsx similarity index 72% rename from src/components/Selectors/RadioButton/RadioGroup.context.tsx rename to src/components/RadioButton/RadioGroup.context.tsx index cca071d7c..691809e64 100644 --- a/src/components/Selectors/RadioButton/RadioGroup.context.tsx +++ b/src/components/RadioButton/RadioGroup.context.tsx @@ -1,9 +1,5 @@ -import React, { createContext, useEffect, useState } from 'react'; -import { - IRadioButtonsContext, - RadioButtonValue, - RadioGroupContextProps, -} from './Radio.types'; +import React, { createContext } from 'react'; +import { IRadioButtonsContext, RadioGroupContextProps } from './'; const RadioGroupContext = createContext>(null); diff --git a/src/components/Selectors/RadioButton/RadioGroup.tsx b/src/components/RadioButton/RadioGroup.tsx similarity index 68% rename from src/components/Selectors/RadioButton/RadioGroup.tsx rename to src/components/RadioButton/RadioGroup.tsx index 74b59ac0b..93f90781f 100644 --- a/src/components/Selectors/RadioButton/RadioGroup.tsx +++ b/src/components/RadioButton/RadioGroup.tsx @@ -1,18 +1,28 @@ import React, { FC, Ref } from 'react'; -import { RadioButton } from '../'; +import { RadioButtonProps, RadioGroupProps, RadioButton } from './'; import { RadioGroupProvider } from './RadioGroup.context'; -import { mergeClasses } from '../../../shared/utilities'; -import { RadioButtonProps, RadioGroupProps } from './Radio.types'; +import { mergeClasses } from '../../shared/utilities'; import styles from './radio.module.scss'; export const RadioGroup: FC = React.forwardRef( ( - { onChange, items, classNames, style, ariaLabel, value, ...rest }, + { + onChange, + items, + classNames, + style, + ariaLabel, + value, + layout = 'vertical', + ...rest + }, ref: Ref ) => { const radioGroupClasses: string = mergeClasses([ styles.radioGroup, + { [styles.vertical]: layout === 'vertical' }, + { [styles.horizontal]: layout === 'horizontal' }, classNames, ]); diff --git a/src/components/RadioButton/index.ts b/src/components/RadioButton/index.ts new file mode 100644 index 000000000..66b7b5516 --- /dev/null +++ b/src/components/RadioButton/index.ts @@ -0,0 +1,3 @@ +export * from './Radio.types'; +export * from './RadioButton'; +export * from './RadioGroup'; diff --git a/src/components/Selectors/RadioButton/radio.module.scss b/src/components/RadioButton/radio.module.scss similarity index 97% rename from src/components/Selectors/RadioButton/radio.module.scss rename to src/components/RadioButton/radio.module.scss index 3978d6bdb..b1e918e33 100644 --- a/src/components/Selectors/RadioButton/radio.module.scss +++ b/src/components/RadioButton/radio.module.scss @@ -179,8 +179,15 @@ } .radio-group { - .selector { - margin-bottom: $space-m; + display: flex; + gap: $space-m; + + &.vertical { + flex-direction: column; + } + + &.horizontal { + flex-direction: row; } } diff --git a/src/components/Selectors/index.ts b/src/components/Selectors/index.ts deleted file mode 100644 index 63a01926c..000000000 --- a/src/components/Selectors/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './CheckBox/Checkbox.types'; -export * from './CheckBox/CheckBox'; -export * from './CheckBox/CheckBoxGroup'; -export * from './RadioButton/Radio.types'; -export * from './RadioButton/RadioButton'; -export * from './RadioButton/RadioGroup'; diff --git a/src/components/Table/Hooks/useFilter/FilterDropdown.tsx b/src/components/Table/Hooks/useFilter/FilterDropdown.tsx index 4f951aad9..537605ec0 100644 --- a/src/components/Table/Hooks/useFilter/FilterDropdown.tsx +++ b/src/components/Table/Hooks/useFilter/FilterDropdown.tsx @@ -11,7 +11,8 @@ import { Menu } from '../../../Menu'; import type { MenuProps } from '../../../Menu'; import Tree from '../../../Tree'; import type { DataNode, EventDataNode } from '../../../Tree'; -import { CheckBox, RadioButton } from '../../../Selectors'; +import { RadioButton } from '../../../RadioButton'; +import { CheckBox } from '../../../CheckBox'; import { Dropdown } from '../../../Dropdown'; import { Empty } from '../../../Empty'; import type { diff --git a/src/components/Table/Hooks/useSelection.tsx b/src/components/Table/Hooks/useSelection.tsx index c2f3d0d94..874a1f561 100644 --- a/src/components/Table/Hooks/useSelection.tsx +++ b/src/components/Table/Hooks/useSelection.tsx @@ -10,8 +10,8 @@ import type { import { INTERNAL_COL_DEFINE } from '../Internal'; import type { FixedType } from '../Internal/OcTable.types'; import { useMergedState } from '../../../hooks/useMergedState'; -import type { CheckboxProps } from '../../Selectors'; -import { CheckBox, RadioButton } from '../../Selectors'; +import { RadioButton } from '../../RadioButton'; +import { CheckBox, CheckboxProps } from '../../CheckBox'; import { Dropdown } from '../../Dropdown'; import { Icon, IconName, IconSize } from '../../Icon'; import { Menu } from '../../Menu'; diff --git a/src/components/Table/Table.types.tsx b/src/components/Table/Table.types.tsx index 6bc167362..32f4e4922 100644 --- a/src/components/Table/Table.types.tsx +++ b/src/components/Table/Table.types.tsx @@ -6,8 +6,8 @@ import type { OcTableProps, } from './Internal/OcTable.types'; import { GetRowKey, ExpandableConfig } from './Internal/OcTable.types'; -import type { TooltipProps } from '../Tooltip/Tooltip.types'; -import type { CheckboxProps } from '../Selectors'; +import type { TooltipProps } from '../Tooltip'; +import type { CheckboxProps } from '../CheckBox'; import type { PaginationProps } from '../Pagination'; import type { Breakpoint } from '../../shared/utilities'; import { tuple } from '../../shared/utilities'; diff --git a/src/components/Table/Tests/Table.rowSelection.test.js b/src/components/Table/Tests/Table.rowSelection.test.js index a21c6f79b..bfe354614 100644 --- a/src/components/Table/Tests/Table.rowSelection.test.js +++ b/src/components/Table/Tests/Table.rowSelection.test.js @@ -2,7 +2,7 @@ import React from 'react'; import Enzyme, { mount } from 'enzyme'; import Adapter from '@wojtekmaj/enzyme-adapter-react-17'; import Table from '../index'; -import { CheckBox } from '../../Selectors'; +import { CheckBox } from '../../CheckBox'; Enzyme.configure({ adapter: new Adapter() }); diff --git a/src/octuple.ts b/src/octuple.ts index 9d2312ab4..861b9e595 100644 --- a/src/octuple.ts +++ b/src/octuple.ts @@ -18,7 +18,7 @@ import { TwoStateButton, } from './components/Button'; -import { CheckBox, CheckBoxGroup } from './components/Selectors'; +import { CheckBox, CheckBoxGroup } from './components/CheckBox'; import { ConfigProvider } from './components/ConfigProvider'; @@ -75,7 +75,7 @@ import { Panel, PanelPlacement, PanelSize } from './components/Panel'; import { Portal } from './components/Portal'; -import { RadioButton, RadioGroup } from './components/Selectors'; +import { RadioButton, RadioGroup } from './components/RadioButton'; import Table, { ColumnGroupType,