Skip to content

Commit

Permalink
fix(color-picker-error-messages): add input error state ui and examples
Browse files Browse the repository at this point in the history
  • Loading branch information
Jade Pennig committed Aug 2, 2017
1 parent dd85217 commit b982bf7
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 44 deletions.
20 changes: 15 additions & 5 deletions ui/components/color-picker/base/_index.scss
Expand Up @@ -16,6 +16,12 @@
*/ */
.slds-color-picker { .slds-color-picker {
position: relative; position: relative;

.slds-form-error {
padding-top: $spacing-x-small;
color: $color-text-error;
font-size: 0.75rem;
}
} }


/** /**
Expand Down Expand Up @@ -56,8 +62,12 @@
* @selector .slds-color-picker__summary-input * @selector .slds-color-picker__summary-input
* @restrict .slds-color-picker__summary > input * @restrict .slds-color-picker__summary > input
*/ */
.slds-input.slds-color-picker__summary-input { .slds-color-picker__summary-input {
width: $size-xx-small; display: inline-block;

.slds-input {
width: $size-xx-small;
}
} }


/** /**
Expand All @@ -77,13 +87,13 @@
background: $color-background; background: $color-background;
} }


.slds-tabs--default__item { .slds-tabs_default__item {
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.05rem; letter-spacing: 0.05rem;
} }


.slds-tabs--default__content { .slds-tabs_default__content {
padding: $spacing-x-small 0; padding: $spacing-x-small 0 $spacing-xx-small;
} }
} }


Expand Down
12 changes: 11 additions & 1 deletion ui/components/color-picker/base/example.jsx
Expand Up @@ -9,6 +9,11 @@ export default (
); );


export const states = [ export const states = [
{
id: 'summary-error',
label: 'Summary Error',
element: <ColorPicker hasSummaryError />
},
{ {
id: 'color-picker-open', id: 'color-picker-open',
label: 'Open, default tab selected', label: 'Open, default tab selected',
Expand All @@ -17,6 +22,11 @@ export const states = [
{ {
id: 'custom-tab-selected', id: 'custom-tab-selected',
label: 'Open, custom tab selected', label: 'Open, custom tab selected',
element: <ColorPicker selectedTabIndex={1} isOpen /> element: <ColorPicker isOpen selectedTabIndex={1} />
},
{
id: 'custom-tab-selected-error',
label: 'Open, custom tab selected, error state',
element: <ColorPicker isOpen hasCustomError selectedTabIndex={1} />
} }
]; ];
5 changes: 5 additions & 0 deletions ui/components/color-picker/custom-only/example.jsx
Expand Up @@ -13,5 +13,10 @@ export const states = [
id: 'custom-color-picker-open', id: 'custom-color-picker-open',
label: 'Open', label: 'Open',
element: <ColorPicker isOpen hasPredefined={false} /> element: <ColorPicker isOpen hasPredefined={false} />
},
{
id: 'custom-color-picker-open-error',
label: 'Open with Error',
element: <ColorPicker isOpen hasCustomError hasPredefined={false} />
} }
]; ];
119 changes: 81 additions & 38 deletions ui/components/color-picker/index.jsx
Expand Up @@ -44,6 +44,8 @@ const swatchColors = [
'#b85d0d' '#b85d0d'
]; ];


const errorMessage = 'Please ensure value is correct';

/** /**
* Swatch Subcomponent * Swatch Subcomponent
*/ */
Expand All @@ -60,33 +62,49 @@ const Swatch = (props) => {
/** /**
* Summary Subcomponent * Summary Subcomponent
*/ */
export const ColorPickerSummary = () => ( export const ColorPickerSummary = (props) => {
<div className="slds-color-picker__summary"> const { hasSummaryError } = props;
<label const errorId = 'color-picker-summary-error';
className="slds-color-picker__summary-label"
htmlFor="color-picker-summary-input" return (
> <div className="slds-color-picker__summary">
Choose Color <label
</label> className="slds-color-picker__summary-label"

htmlFor="color-picker-summary-input"
<Button className="slds-color-picker__summary-button slds-button_icon slds-button_icon-more" aria-haspopup title="Choose Color"> >
<Swatch color="hsl(220, 46%, 55%)" suppressAssistiveText /> Choose Color
<SvgIcon </label>
className="slds-button__icon slds-button__icon_small"
sprite="utility" <Button className="slds-color-picker__summary-button slds-button_icon slds-button_icon-more" aria-haspopup title="Choose Color">
symbol="down" <Swatch color="hsl(220, 46%, 55%)" suppressAssistiveText />
/> <SvgIcon
<span className="slds-assistive-text">Choose a color</span> className="slds-button__icon slds-button__icon_small"
</Button> sprite="utility"

symbol="down"
<input />
type="text" <span className="slds-assistive-text">Choose a color</span>
className="slds-color-picker__summary-input slds-input" </Button>
id="color-picker-summary-input"
defaultValue="#5679C0" <FormElement
/> className={classNames('slds-color-picker__summary-input', {
</div> 'slds-has-error': hasSummaryError
); })}
>
<Input
id="color-picker-summary-input"
defaultValue="#5679C0"
aria-describedby={ hasSummaryError ? errorId : null }
/>
</FormElement>

{hasSummaryError ? (
<p className="slds-form-error" id={errorId}>
{errorMessage}
</p>
) : null}
</div>
)
};


/** /**
* Swatches (list of Swatch elements) Subcomponent * Swatches (list of Swatch elements) Subcomponent
Expand All @@ -112,12 +130,14 @@ export const ColorPickerSwatches = (props) => {
/** /**
* Custom Picker Subcomponent * Custom Picker Subcomponent
*/ */
const ColorPickerCustom = () => { const ColorPickerCustom = (props) => {
const rangeInputId = _.uniqueId('color-picker-input-range-'); const rangeInputId = _.uniqueId('color-picker-input-range-');
const hexInputId = _.uniqueId('color-picker-input-hex-'); const hexInputId = _.uniqueId('color-picker-input-hex-');
const rInputId = _.uniqueId('color-picker-input-r-'); const rInputId = _.uniqueId('color-picker-input-r-');
const gInputId = _.uniqueId('color-picker-input-g-'); const gInputId = _.uniqueId('color-picker-input-g-');
const bInputId = _.uniqueId('color-picker-input-b-'); const bInputId = _.uniqueId('color-picker-input-b-');
const { hasCustomError } = props;
const customErrorId = 'color-picker-custom-error';


return ( return (
<div className="slds-color-picker__custom"> <div className="slds-color-picker__custom">
Expand All @@ -144,10 +164,16 @@ const ColorPickerCustom = () => {
<div className="slds-color-picker__custom-inputs"> <div className="slds-color-picker__custom-inputs">
<FormElement <FormElement
label="Hex" label="Hex"
className="slds-color-picker__input-custom-hex" className={classNames('slds-color-picker__input-custom-hex', {
'slds-has-error': hasCustomError
})}
inputId={hexInputId} inputId={hexInputId}
> >
<Input id={hexInputId} defaultValue="#5679C0" /> <Input
id={hexInputId}
defaultValue="#5679C0"
aria-describedby={ hasCustomError ? customErrorId : null }
/>
</FormElement> </FormElement>


<FormElement label={<abbr title="Red">R</abbr>} inputId={rInputId}> <FormElement label={<abbr title="Red">R</abbr>} inputId={rInputId}>
Expand All @@ -162,6 +188,12 @@ const ColorPickerCustom = () => {
<Input defaultValue="192" id={bInputId} /> <Input defaultValue="192" id={bInputId} />
</FormElement> </FormElement>
</div> </div>

{ hasCustomError ? (
<p className="slds-form-error" id={customErrorId}>
{errorMessage}
</p>
) : null }
</div> </div>
); );
} }
Expand All @@ -171,8 +203,8 @@ const ColorPickerCustom = () => {
*/ */
const ColorPickerFooter = () => ( const ColorPickerFooter = () => (
<div className="slds-color-picker__selector-footer"> <div className="slds-color-picker__selector-footer">
<Button className="slds-button--neutral">Cancel</Button> <Button className="slds-button_neutral">Cancel</Button>
<Button className="slds-button--brand">Done</Button> <Button className="slds-button_brand">Done</Button>
</div> </div>
); );


Expand All @@ -186,7 +218,7 @@ const ColorPickerTabs = (props) => (
</Tabs.Item> </Tabs.Item>


<Tabs.Item title="Custom" id="color-picker-custom"> <Tabs.Item title="Custom" id="color-picker-custom">
<ColorPickerCustom /> <ColorPickerCustom hasCustomError={props.hasCustomError} />
</Tabs.Item> </Tabs.Item>
</Tabs> </Tabs>
); );
Expand All @@ -198,6 +230,11 @@ class ColorPicker extends React.Component {
this.state = { this.state = {
selectedTabIndex: props.selectedTabIndex || 0 selectedTabIndex: props.selectedTabIndex || 0
}; };

this.isFullFeatureMode = this.isFullFeatureMode.bind(this)
this.isPredefinedMode = this.isPredefinedMode.bind(this)
this.isCustomOnlyMode = this.isCustomOnlyMode.bind(this)
this.isSwatchesOnlyMode = this.isSwatchesOnlyMode.bind(this)
} }


isFullFeatureMode() { isFullFeatureMode() {
Expand All @@ -222,21 +259,27 @@ class ColorPicker extends React.Component {


render () { render () {
const { selectedTabIndex } = this.state; const { selectedTabIndex } = this.state;
const { isOpen } = this.props; const { isOpen, hasSummaryError, hasCustomError } = this.props;
const popoverState = isOpen ? 'slds-show' : 'slds-hide'; const popoverState = isOpen ? 'slds-show' : 'slds-hide';
const colorPickerSummary = this.isSwatchesOnlyMode() ? null : <ColorPickerSummary />; const colorPickerSummary = this.isSwatchesOnlyMode() ? null : (
<ColorPickerSummary hasSummaryError={hasSummaryError} />
);
const footerContent = this.isSwatchesOnlyMode() ? null : <ColorPickerFooter />; const footerContent = this.isSwatchesOnlyMode() ? null : <ColorPickerFooter />;

let colorPickerContent = null; let colorPickerContent = null;


if (this.isFullFeatureMode()) { if (this.isFullFeatureMode()) {
colorPickerContent = <ColorPickerTabs selectedTabIndex={selectedTabIndex} /> colorPickerContent = (
<ColorPickerTabs
hasCustomError={hasCustomError}
selectedTabIndex={selectedTabIndex}
/>
)
} }
else if (this.isPredefinedMode()) { else if (this.isPredefinedMode()) {
colorPickerContent = <ColorPickerSwatches /> colorPickerContent = <ColorPickerSwatches />
} }
else if (this.isCustomOnlyMode()) { else if (this.isCustomOnlyMode()) {
colorPickerContent = <ColorPickerCustom /> colorPickerContent = <ColorPickerCustom hasCustomError={hasCustomError} />
} }
else if (this.isSwatchesOnlyMode()) { else if (this.isSwatchesOnlyMode()) {
colorPickerContent = <ColorPickerSwatches /> colorPickerContent = <ColorPickerSwatches />
Expand Down

0 comments on commit b982bf7

Please sign in to comment.