[CORL-260] Bring back sorting (#2186)

* feat: sort stream

* feat: add FieldSet component to ui

* feat: make accessible and add feature test

* test: fix snapshots
This commit is contained in:
Kiwi
2019-02-13 16:11:13 +00:00
committed by Wyatt Johnson
parent 68839c721c
commit f4037ce6fb
43 changed files with 1047 additions and 110 deletions
@@ -0,0 +1,4 @@
.root {
border: 0;
padding: 0;
}
@@ -0,0 +1,10 @@
---
name: AriaInfo
menu: UI Kit
---
import { Playground, PropsTable } from "docz";
# FieldSet
Simple `fieldset` with removed styling for accessibility purposes.
@@ -0,0 +1,14 @@
import React from "react";
import TestRenderer from "react-test-renderer";
import { PropTypesOf } from "talk-framework/types";
import FieldSet from "./FieldSet";
it("renders correctly", () => {
const props: PropTypesOf<typeof FieldSet> = {
children: "content",
};
const renderer = TestRenderer.create(<FieldSet {...props} />);
expect(renderer.toJSON()).toMatchSnapshot();
});
@@ -0,0 +1,26 @@
import cn from "classnames";
import React, { AllHTMLAttributes, Ref, StatelessComponent } from "react";
import { withForwardRef, withStyles } from "talk-ui/hocs";
import { PropTypesOf } from "talk-ui/types";
import styles from "./FieldSet.css";
interface InnerProps extends AllHTMLAttributes<HTMLElement> {
/**
* This prop can be used to add custom classnames.
* It is handled by the `withStyles `HOC.
*/
classes: typeof styles;
/** Internal: Forwarded Ref */
forwardRef?: Ref<HTMLFieldSetElement>;
}
const FieldSet: StatelessComponent<InnerProps> = props => {
const { className, classes, forwardRef: ref, ...rest } = props;
const rootClassName = cn(classes.root, className);
return <fieldset className={rootClassName} {...rest} ref={ref} />;
};
const enhanced = withForwardRef(withStyles(styles)(FieldSet));
export type FieldSetProps = PropTypesOf<typeof enhanced>;
export default enhanced;
@@ -0,0 +1,9 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`renders correctly 1`] = `
<fieldset
className="FieldSet-root"
>
content
</fieldset>
`;
@@ -0,0 +1 @@
export { default } from "./FieldSet";
@@ -3,7 +3,7 @@
display: inline-block;
}
.iconWrapper {
.afterWrapper {
position: absolute;
display: inline-flex;
justify-content: center;
@@ -60,6 +60,6 @@
width: 100%;
}
.iconWrapperDisabled {
.afterWrapperDisabled {
color: var(--palette-text-secondary);
}
@@ -38,6 +38,8 @@ export interface SelectFieldProps {
onFocus: EventHandler<FocusEvent<HTMLSelectElement>>;
onBlur: EventHandler<FocusEvent<HTMLSelectElement>>;
keyboardFocus: boolean;
afterWrapper?: React.ReactElement<any>;
}
const SelectField: StatelessComponent<SelectFieldProps> = props => {
@@ -48,6 +50,7 @@ const SelectField: StatelessComponent<SelectFieldProps> = props => {
keyboardFocus,
children,
disabled,
afterWrapper,
...rest
} = props;
@@ -56,8 +59,8 @@ const SelectField: StatelessComponent<SelectFieldProps> = props => {
[classes.keyboardFocus]: keyboardFocus,
});
const iconWrapperClassName = cn(classes.iconWrapper, {
[classes.iconWrapperDisabled]: disabled,
const afterWrapperClassName = cn(classes.afterWrapper, {
[classes.afterWrapperDisabled]: disabled,
});
return (
@@ -65,12 +68,16 @@ const SelectField: StatelessComponent<SelectFieldProps> = props => {
<select className={selectClassName} disabled={disabled} {...rest}>
{children}
</select>
<span className={iconWrapperClassName} aria-hidden>
<Icon>expand_more</Icon>
<span className={afterWrapperClassName} aria-hidden>
{afterWrapper}
</span>
</span>
);
};
SelectField.defaultProps = {
afterWrapper: <Icon>expand_more</Icon>,
};
const enhanced = withStyles(styles)(withKeyboardFocus(SelectField));
export default enhanced;
@@ -17,7 +17,7 @@ exports[`renders correctly 1`] = `
/>
<span
aria-hidden={true}
className="SelectField-iconWrapper SelectField-iconWrapperDisabled"
className="SelectField-afterWrapper SelectField-afterWrapperDisabled"
>
<span
aria-hidden="true"
+1
View File
@@ -17,6 +17,7 @@ export { default as Popup } from "./Popup";
export { default as FormField } from "./FormField";
export { default as InputDescription } from "./InputDescription";
export { default as Spinner } from "./Spinner";
export { default as FieldSet } from "./FieldSet";
export { default as HorizontalGutter } from "./HorizontalGutter";
export { default as Icon } from "./Icon";
export { default as AriaInfo } from "./AriaInfo";