From f3a1e185b3f039aeee8481846fcb7afff7d7a1d7 Mon Sep 17 00:00:00 2001 From: Clair Smith Date: Tue, 19 Feb 2019 15:37:27 -0600 Subject: [PATCH 1/9] DP-4562 set focus state for search on mobile (#473) --- changelogs/DP-4562.txt | 5 +++++ .../styleguide/source/assets/js/modules/mobileNav.js | 11 ++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 changelogs/DP-4562.txt diff --git a/changelogs/DP-4562.txt b/changelogs/DP-4562.txt new file mode 100644 index 0000000000..8a1488db3a --- /dev/null +++ b/changelogs/DP-4562.txt @@ -0,0 +1,5 @@ +___DESCRIPTION___ +Added +Patch +- patternlab/DP-4562: Set focus state for search on mobile menu + diff --git a/patternlab/styleguide/source/assets/js/modules/mobileNav.js b/patternlab/styleguide/source/assets/js/modules/mobileNav.js index 93e76712b1..5d1e38e793 100644 --- a/patternlab/styleguide/source/assets/js/modules/mobileNav.js +++ b/patternlab/styleguide/source/assets/js/modules/mobileNav.js @@ -2,8 +2,8 @@ let menuButton = document.querySelector(".js-header-menu-button"); let feedbackButton = document.querySelector('.ma__fixed-feedback-button'); -if(null !== menuButton){ - menuButton.addEventListener("click", function(event) { +if (null !== menuButton) { + menuButton.addEventListener("click", function (event) { event.preventDefault(); document.querySelector("body").classList.toggle("show-menu"); @@ -15,13 +15,14 @@ if(null !== menuButton){ // ****** Main Header Search button on mobile should open the mobile menu ****** let searchForm = document.querySelector(".js-header-search-menu .js-header-search-form"); -if(null !== searchForm){ - searchForm.addEventListener("submit", function(event) { - if(window.innerWidth > 620) { +if (null !== searchForm) { + searchForm.addEventListener("submit", function (event) { + if (window.innerWidth > 620) { return; } event.preventDefault(); document.querySelector("body").classList.toggle("show-menu"); + document.querySelector('.ma__header__nav-search .ma__header-search__input').focus(); feedbackButton.classList.toggle("hide-button"); }); } From 84bde01ac00724facc4225d5440644ada7303837 Mon Sep 17 00:00:00 2001 From: Minghua Sun Date: Fri, 22 Feb 2019 09:06:32 -0500 Subject: [PATCH 2/9] React/dp 12807 hotfix (#484) * set default for handleAdjust to prevent returing NaN * fix error inline styling * add change log --- changelogs/DP-12807.txt | 5 +++++ react/src/components/atoms/forms/Input/style.scss | 1 - react/src/components/atoms/forms/InputCurrency/index.js | 6 ++++-- 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 changelogs/DP-12807.txt diff --git a/changelogs/DP-12807.txt b/changelogs/DP-12807.txt new file mode 100644 index 0000000000..1f2d4a707f --- /dev/null +++ b/changelogs/DP-12807.txt @@ -0,0 +1,5 @@ +___DESCRIPTION___ +Fixed +Patch +- (React) DP-12807: Prevent InputCurrency returning NaN when default value is set to null #484 +- (React) DP-12806: Fix error message inline styling #484 diff --git a/react/src/components/atoms/forms/Input/style.scss b/react/src/components/atoms/forms/Input/style.scss index 7d59a0d485..2f63862295 100644 --- a/react/src/components/atoms/forms/Input/style.scss +++ b/react/src/components/atoms/forms/Input/style.scss @@ -14,7 +14,6 @@ #{$group}-right { display: flex; flex-direction: column; - align-items: flex-end; @media ($bp-small-max) { align-items: flex-start; } diff --git a/react/src/components/atoms/forms/InputCurrency/index.js b/react/src/components/atoms/forms/InputCurrency/index.js index 3765cb2286..8137902597 100644 --- a/react/src/components/atoms/forms/InputCurrency/index.js +++ b/react/src/components/atoms/forms/InputCurrency/index.js @@ -82,12 +82,14 @@ const Currency = (props) => ( stringValue = context.value; } const numberValue = numbro.unformat(stringValue); + // default to 0 if defaultValue is NaN + const baseValue = numberValue || 0; if (!Number.isNaN(numberValue)) { let newValue; if (direction === 'up') { - newValue = Number(Number.parseFloat(numberValue + props.step).toFixed(2)); + newValue = Number(Number.parseFloat(baseValue + props.step).toFixed(2)); } else if (direction === 'down') { - newValue = Number(Number.parseFloat(numberValue - props.step).toFixed(2)); + newValue = Number(Number.parseFloat(baseValue - props.step).toFixed(2)); } const { showError, errorMsg } = validNumber(newValue, props.min, props.max); context.updateState({ showError, errorMsg, value: toCurrency(newValue, 2) }, () => { From d581edb9a6671ff56852b00563b96dbd9faf82cd Mon Sep 17 00:00:00 2001 From: Minghua Sun Date: Fri, 1 Mar 2019 15:33:09 -0500 Subject: [PATCH 3/9] React/dp 12732 allow slider update on drag (#495) * fix onChange to allow callback on keyboard actions and track click * add onupdate prop * refactor form story * fix input relation * fix value conversion * approve screenshot * fix syncing * approve screenshot * add chnagelog * update label --- changelogs/DP-4562.txt | 8 +- ...oms_forms_Form_0_document_0_small_atom.png | Bin 37594 -> 30365 bytes .../atoms/forms/CompoundSlider/index.js | 25 ++++-- .../atoms/forms/Form/Form.stories.js | 82 +++++++----------- .../InputSlider/InputSlider.knobs.options.js | 1 + .../atoms/forms/InputSlider/index.js | 6 +- 6 files changed, 61 insertions(+), 61 deletions(-) diff --git a/changelogs/DP-4562.txt b/changelogs/DP-4562.txt index 8a1488db3a..4ed9c77968 100644 --- a/changelogs/DP-4562.txt +++ b/changelogs/DP-4562.txt @@ -1,5 +1,5 @@ ___DESCRIPTION___ -Added -Patch -- patternlab/DP-4562: Set focus state for search on mobile menu - +Fixed +Minor +- (React) DP-12732: Allows slider callback and updates form context on handler drag (Added onUpdate prop) #495 +- (React) DP-12732: Allows keyboard actions and slider track click to update value (Changed handleChange from using onSlideEnd to onChange) #495 diff --git a/react/backstop/data/bitmaps_reference/vrt_atoms_forms_Form_0_document_0_small_atom.png b/react/backstop/data/bitmaps_reference/vrt_atoms_forms_Form_0_document_0_small_atom.png index 3b117dda3415e34183e9a6d3a80799341acf856b..9ccbcaff30cc79fa2d8000d135ad9643a590d476 100644 GIT binary patch literal 30365 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 TN|(g7vlLA=9o1X=j-3536aI}8 literal 37594 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 g57+(w-+%10B6IBA0~_)DC { const { - min, max, step, disabled, domain + min, max, step, disabled, domain, onChange, onUpdate } = this.props; const decimalPlaces = countDecimals(step); - const handleDragEnd = (values) => { + const handleChange = (values) => { const value = (Number.isInteger(step)) ? values[0] : Number(Number.parseFloat(values[0]).toFixed(decimalPlaces)); context.updateState({ value }, () => { - if (typeof this.props.onChange === 'function') { - this.props.onChange(value, this.props.id); + if (typeof onChange === 'function') { + onChange(value, this.props.id); + } + }); + }; + const handleUpdate = (values) => { + const value = (Number.isInteger(step)) ? values[0] : Number(Number.parseFloat(values[0]).toFixed(decimalPlaces)); + context.updateState({ value }, () => { + if (typeof onUpdate === 'function') { + onUpdate(value, this.props.id); } }); }; @@ -157,11 +165,14 @@ class CompoundSlider extends Component { domain, step, vertical: !(this.props.axis === 'x'), - onSlideEnd: handleDragEnd, + onChange: handleChange, values: [defaultValue], mode: handleMode, disabled }; + if (onUpdate) { + sliderProps.onUpdate = handleUpdate; + } const wrapperClasses = classNames({ 'ma__input-slider': true, 'ma__input-slider--disabled': disabled, @@ -251,7 +262,9 @@ class CompoundSlider extends Component { CompoundSlider.propTypes = { /** The unique ID for the input field */ id: PropTypes.string.isRequired, - /** Custom change function */ + /** Custom update function, triggered with the values on drag (caution: high-volume updates when dragging). Only if a function is passed to onUpdate will form context get updated on drag. */ + onUpdate: PropTypes.func, + /** Custom on change function, triggered when the value of the slider has changed. This will recieve changes at the end of a slide as well as changes from clicks on rails and tracks. */ onChange: PropTypes.func, /** Default input text value */ defaultValue: PropTypes.string, diff --git a/react/src/components/atoms/forms/Form/Form.stories.js b/react/src/components/atoms/forms/Form/Form.stories.js index d8a727959f..4a01322ded 100644 --- a/react/src/components/atoms/forms/Form/Form.stories.js +++ b/react/src/components/atoms/forms/Form/Form.stories.js @@ -33,7 +33,7 @@ storiesOf('atoms/forms', module) inputSliderOptionsWithKnobs.domain = array('InputSlider.domain', [0, 1]).map((num) => Number(num)); inputSliderOptionsWithKnobs.max = number('InputSlider.max', 1); inputSliderOptionsWithKnobs.step = number('InputSlider.step', 0.01, { min: 0, max: 1, step: 0.01 }); - inputSliderOptionsWithKnobs.labelText = text('InputSlider.labelText', 'Slider (Linked to Input 3)'); + inputSliderOptionsWithKnobs.labelText = text('InputSlider.labelText', 'Slider (Linked to Input 0 and Input 1)'); const formTicks = object('InputSlider.ticks', { 0: '0%', 0.6: 'Minimum requirement', 1: '100%' }); const ticks = []; Object.keys(formTicks).forEach((tick) => ticks.push([tick, formTicks[tick]])); @@ -42,7 +42,7 @@ storiesOf('atoms/forms', module) delete InputCurrencyOptions.labelText; const inputCurrencyOptionsWithKnobs = Object.assign(...Object.entries(InputCurrencyOptions).map(([k, v]) => ( { [k]: v() }))); - inputCurrencyOptionsWithKnobs.labelText = text('InputCurrency.labelText', 'Currency Input (Set to 999 when Slider is 60)'); + inputCurrencyOptionsWithKnobs.labelText = text('InputCurrency.labelText', 'Currency Input (Set to 999 when Slider is greater than 60)'); const languages = new Map(); languages.set('Chinese', 'zh-CN'); languages.set('English', 'en-US'); @@ -55,28 +55,27 @@ storiesOf('atoms/forms', module) { (formContext) => { inputTextOptionsWithKnobs.onChange = (e, newVal, id) => { - if (formContext.hasId('test1')) { - if (formContext.getValue('test1') === 30) { - formContext.setValue({ id: 'test2', value: 25 }); - } - } // Keep test0 and test1 in sync. - if (formContext.hasId('test1') && formContext.hasId('test0')) { + if (formContext.hasId('test0') && formContext.hasId('test1') && (formContext.hasId('slider'))) { if (id === 'test0') { - formContext.setValue({ id: 'test1', value: formContext.getValue('test0') }); + const test0 = formContext.getValue('test0'); + formContext.setValue({ id: 'test1', value: 100 - test0 }); + formContext.setValue({ id: 'slider', value: test0 / 100 }); + if (test0 > 60) { + formContext.setValue({ id: 'currency-input', value: '$999.00' }); + } else { + formContext.setValue({ id: 'currency-input', value: '$0.00' }); + } } if (id === 'test1') { - formContext.setValue({ id: 'test0', value: formContext.getValue('test1') }); - } - } - if (formContext.hasId('test3')) { - if (id === 'test3') { - formContext.setValue({ id: 'slider', value: Number(formContext.getValue('test3') / 100).toFixed(2) }, () => { - // Use afterUpdate function so that slider is updated before this check. - if (formContext.getValue('slider') === 0.6) { - formContext.setValue({ id: 'currency-input', value: '$999.00' }); - } - }); + const test1 = formContext.getValue('test1'); + formContext.setValue({ id: 'test0', value: 100 - test1 }); + formContext.setValue({ id: 'slider', value: (100 - test1) / 100 }); + if ((100 - test1) > 60) { + formContext.setValue({ id: 'currency-input', value: '$999.00' }); + } else { + formContext.setValue({ id: 'currency-input', value: '$0.00' }); + } } } }; @@ -87,8 +86,9 @@ storiesOf('atoms/forms', module) ...inputTextOptionsWithKnobs, key: 'Form.InputNumber.test0', defaultValue: 0, - labelText: 'Input 0 (Linked to Input 1)', - id: 'test0' + labelText: 'Input 0 (Linked to Input 1 and Slider)', + id: 'test0', + unit: '%' } ], [ @@ -96,29 +96,10 @@ storiesOf('atoms/forms', module) { ...inputTextOptionsWithKnobs, key: 'Form.InputNumber.test1', - defaultValue: 1, - labelText: 'Input 1 (Linked to Input 0)', - id: 'test1' - } - ], - [ - 'test2', - { - ...inputTextOptionsWithKnobs, - key: 'Form.InputNumber.test2', - defaultValue: 2, - labelText: 'Input 2 (Set to 25 when Input 1 is 30)', - id: 'test2' - } - ], - [ - 'test3', - { - ...inputTextOptionsWithKnobs, - key: 'Form.InputNumber.test3', - defaultValue: 0, - labelText: 'Input 3 (Linked to Slider)', - id: 'test3' + defaultValue: 100, + labelText: 'Input 1 (Linked to Input 0 and Slider)', + id: 'test1', + unit: '%' } ] ]; @@ -126,21 +107,24 @@ storiesOf('atoms/forms', module) ids.forEach((numberProps) => { inputs.push(); }); - inputSliderOptionsWithKnobs.onChange = (newVal, id) => { + inputSliderOptionsWithKnobs.onUpdate = (newVal, id) => { if (formContext.hasId(id)) { - formContext.setValue({ id: 'test3', value: Number(formContext.getValue(id) * 100).toFixed(2) }); + formContext.setValue({ id: 'test0', value: Number(formContext.getValue(id) * 100).toFixed() }); + formContext.setValue({ id: 'test1', value: Number((1 - formContext.getValue(id)) * 100).toFixed() }); if (formContext.hasId('currency-input')) { - if (newVal === 0.6) { + if (newVal > 0.6) { // Sets currency to 999 when slider is 60%. formContext.setValue({ id: 'currency-input', value: '$999.00' }); + } else { + formContext.setValue({ id: 'currency-input', value: '$0.00' }); } } } }; return( - {inputs} + {inputs} ); diff --git a/react/src/components/atoms/forms/InputSlider/InputSlider.knobs.options.js b/react/src/components/atoms/forms/InputSlider/InputSlider.knobs.options.js index 23f18f14a4..ddc96327b3 100644 --- a/react/src/components/atoms/forms/InputSlider/InputSlider.knobs.options.js +++ b/react/src/components/atoms/forms/InputSlider/InputSlider.knobs.options.js @@ -15,6 +15,7 @@ export default { // Array knob converts numbers to strings - put it back to number. domain: () => array('InputSlider.domain', [0, 1]).map((num) => Number(num)), onChange: () => action('inputSlide.onChange'), + onUpdate: () => action('inputSlide.onUpdate'), skipped: () => boolean('InputSlider.skipped', false), displayValueFormat: () => select('InputSlider.displayValueFormat', ['percentage', 'value', null], 'percentage') }; diff --git a/react/src/components/atoms/forms/InputSlider/index.js b/react/src/components/atoms/forms/InputSlider/index.js index 81634338db..aa67d8d6dd 100644 --- a/react/src/components/atoms/forms/InputSlider/index.js +++ b/react/src/components/atoms/forms/InputSlider/index.js @@ -5,10 +5,10 @@ import CompoundSlider from '../CompoundSlider'; const InputSlider = (props) => { const { - axis, max, min, step, ticks, onChange, domain, skipped, displayValueFormat, ...inputProps + axis, max, min, step, ticks, onChange, onUpdate, domain, skipped, displayValueFormat, ...inputProps } = props; const sliderProps = { - axis, max, min, step, defaultValue: props.defaultValue, onChange, domain, skipped, displayValueFormat + axis, max, min, step, defaultValue: props.defaultValue, onChange, onUpdate, domain, skipped, displayValueFormat }; const { id, disabled } = inputProps; sliderProps.id = id; @@ -30,6 +30,8 @@ InputSlider.propTypes = { id: PropTypes.string.isRequired, /** Custom change function */ onChange: PropTypes.func, + /** Custom change function */ + onUpdate: PropTypes.func, /** Default input text value */ defaultValue: PropTypes.string, /** Max value for the field. */ From 6872719c5fe4ec3d003c3db74bd15862d59092aa Mon Sep 17 00:00:00 2001 From: Minghua Sun Date: Fri, 1 Mar 2019 15:33:23 -0500 Subject: [PATCH 4/9] React/Disable handle button when InputSlider is disabled (#494) * do not allow focus on handle when InputSlider is disabled * add changelog * allow disable trigger text in helptip * add additional changelog --- assets/scss/03-organisms/_help-tip.scss | 18 +++--- changelogs/DP-12875.txt | 8 +++ .../atoms/forms/CompoundSlider/index.js | 4 +- .../atoms/forms/CompoundSlider/style.scss | 5 ++ .../organisms/HelpTip/HelpTip.stories.js | 6 +- .../src/components/organisms/HelpTip/index.js | 61 +++++++++++-------- 6 files changed, 66 insertions(+), 36 deletions(-) create mode 100644 changelogs/DP-12875.txt diff --git a/assets/scss/03-organisms/_help-tip.scss b/assets/scss/03-organisms/_help-tip.scss index 768b56a271..4a86611091 100644 --- a/assets/scss/03-organisms/_help-tip.scss +++ b/assets/scss/03-organisms/_help-tip.scss @@ -54,12 +54,20 @@ $border-width: 1px; border-bottom: 2px dotted $c-primary; background-color: $c-bay-blue-lightest; + svg { + margin-left: 5px; + width: 16px; + height: 16px; + margin-bottom: -.1em; + fill: $c-font-link; + } + &:focus { box-shadow: 0 0 3px 3px $c-focus; outline: 0; } - &.active, &:hover { + &--active, &:hover { background-color: $c-primary; color: $c-white; @@ -68,12 +76,8 @@ $border-width: 1px; } } - svg { - margin-left: 5px; - width: 16px; - height: 16px; - margin-bottom: -.1em; - fill: $c-font-link; + &--disabled { + pointer-events: none; } } diff --git a/changelogs/DP-12875.txt b/changelogs/DP-12875.txt new file mode 100644 index 0000000000..9f9c5ba4aa --- /dev/null +++ b/changelogs/DP-12875.txt @@ -0,0 +1,8 @@ +___DESCRIPTION___ +Fixed +Patch +- (React) DP-12875: Disable handle button when InputSlider is disabled. #494 + +Changed +Minor +- (React) DP-12875: Add `disabled` prop to disable HelpTip trigger text. #494 diff --git a/react/src/components/atoms/forms/CompoundSlider/index.js b/react/src/components/atoms/forms/CompoundSlider/index.js index 21aa21681c..22bad0c6d5 100644 --- a/react/src/components/atoms/forms/CompoundSlider/index.js +++ b/react/src/components/atoms/forms/CompoundSlider/index.js @@ -9,7 +9,7 @@ import './style.css'; const Handle = (props) => { const { - handle: { id, value, percent }, getHandleProps, axis, min, max, step, displayValueFormat + handle: { id, value, percent }, getHandleProps, axis, min, max, step, displayValueFormat, disabled } = props; const decimalPlaces = countDecimals(step); const roundedValue = (Number.isInteger(step)) ? value : Number(Number.parseFloat(value).toFixed(decimalPlaces)); @@ -17,6 +17,7 @@ const Handle = (props) => { 'aria-valuemin': min, 'aria-valuemax': max, 'aria-valuenow': roundedValue, + disabled, role: 'slider', onClick: (e) => { e.preventDefault(); @@ -201,6 +202,7 @@ class CompoundSlider extends Component { max={max} step={step} displayValueFormat={this.props.displayValueFormat} + disabled={disabled} /> ))} diff --git a/react/src/components/atoms/forms/CompoundSlider/style.scss b/react/src/components/atoms/forms/CompoundSlider/style.scss index 6a33afc780..fc1cc6a203 100644 --- a/react/src/components/atoms/forms/CompoundSlider/style.scss +++ b/react/src/components/atoms/forms/CompoundSlider/style.scss @@ -65,9 +65,14 @@ $margin: 20px; &-handle { background-color: $c-gray-dark; cursor: not-allowed; + opacity: 1; &:hover { transform: none; } + + &-value { + color: $c-black; + } } } } diff --git a/react/src/components/organisms/HelpTip/HelpTip.stories.js b/react/src/components/organisms/HelpTip/HelpTip.stories.js index 3576cb412e..60935e53eb 100644 --- a/react/src/components/organisms/HelpTip/HelpTip.stories.js +++ b/react/src/components/organisms/HelpTip/HelpTip.stories.js @@ -27,7 +27,8 @@ storiesOf('organisms/HelpTip', module) id: text('helpText.id', 'helptext-id-123'), bypassMobileStyle: boolean('helpTip.bypassMobileStyle', false), hasMarkup: boolean('helpTip.hasMarkup', true), - theme: select('helpTip.theme', themeOptions, 'c-primary') + theme: select('helpTip.theme', themeOptions, 'c-primary'), + disabled: boolean('helpTip.disabled', false) }; return(); @@ -39,7 +40,8 @@ storiesOf('organisms/HelpTip', module) id: text('helpText.id', 'helptext-id-123'), bypassMobileStyle: boolean('helpTip.bypassMobileStyle', false), hasMarkup: boolean('helpTip.hasMarkup', true), - theme: select('helpTip.theme', themeOptions, 'c-primary') + theme: select('helpTip.theme', themeOptions, 'c-primary'), + disabled: boolean('helpTip.disabled', false) }; return( diff --git a/react/src/components/organisms/HelpTip/index.js b/react/src/components/organisms/HelpTip/index.js index 789a7c1040..26be4e01a4 100644 --- a/react/src/components/organisms/HelpTip/index.js +++ b/react/src/components/organisms/HelpTip/index.js @@ -52,7 +52,7 @@ class HelpTip extends Component { render() { const { - hasMarkup, triggerText, textAfter, helpText, children, id, theme, text + hasMarkup, triggerText, textAfter, helpText, children, id, theme, text, disabled } = this.props; const baseClass = classNames({ @@ -78,31 +78,38 @@ class HelpTip extends Component { return( - {triggerText.map((trigger, index) => ( - - {index === 0 && this.buildDangerouslyIfHasMarkup(splitText[index], hasMarkup)} - - this.toggleOpen(index)} - onKeyUp={(e) => this.toggleOpenForKeyUp(e, index)} - tabIndex="0" - role="button" - aria-describedby={`context-a11y-${id}-${index}`} - aria-expanded={this.state.isOpen[index]} - aria-controls={`help-tip-content-${id}-${index}`} - > - {this.buildDangerouslyIfHasMarkup(trigger, hasMarkup)} - + {triggerText.map((trigger, index) => { + const triggerTextClasses = classNames({ + 'ma__help-tip__trigger': true, + 'ma__help-tip__trigger--active': this.state.isOpen[index], + 'ma__help-tip__trigger--disabled': disabled + }); + return( + + {index === 0 && this.buildDangerouslyIfHasMarkup(splitText[index], hasMarkup)} + + this.toggleOpen(index)} + onKeyUp={(e) => this.toggleOpenForKeyUp(e, index)} + tabIndex={disabled ? -1 : 0} + role="button" + aria-describedby={`context-a11y-${id}-${index}`} + aria-expanded={this.state.isOpen[index]} + aria-controls={`help-tip-content-${id}-${index}`} + > + {this.buildDangerouslyIfHasMarkup(trigger, hasMarkup)} + + + {this.buildDangerouslyIfHasMarkup(splitText[index + 1], hasMarkup)} - {this.buildDangerouslyIfHasMarkup(splitText[index + 1], hasMarkup)} - - ))} - {triggerText.map((trigger, index) => ( + ); + })} + {triggerText.map((trigger, index) => !disabled && (

Date: Mon, 4 Mar 2019 12:30:07 -0600 Subject: [PATCH 5/9] Patternlab/DP-9294 topic card more links (#472) --- changelogs/DP-9249.txt | 6 ++++++ .../source/_patterns/02-molecules/section-links.twig | 10 +++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 changelogs/DP-9249.txt diff --git a/changelogs/DP-9249.txt b/changelogs/DP-9249.txt new file mode 100644 index 0000000000..a5cb264629 --- /dev/null +++ b/changelogs/DP-9249.txt @@ -0,0 +1,6 @@ +___DESCRIPTION___ +changed +patch +- patternlab / DP-9249: Topic card more links + + diff --git a/patternlab/styleguide/source/_patterns/02-molecules/section-links.twig b/patternlab/styleguide/source/_patterns/02-molecules/section-links.twig index b2e2bd7308..2fce87419c 100644 --- a/patternlab/styleguide/source/_patterns/02-molecules/section-links.twig +++ b/patternlab/styleguide/source/_patterns/02-molecules/section-links.twig @@ -27,6 +27,7 @@ "type": "", "href": sectionLinks.title.href, "text": "Learn More", + "labelContext": "about " ~ sectionLinks.title.text, "info": "learn more about " ~ sectionLinks.title.text } %} {% include "@atoms/decorative-link.twig" %} @@ -51,8 +52,15 @@ {% if sectionLinks.seeAll %} {% endif %}
From 1103bc48801b39e4715e4869798cdc77b39e616e Mon Sep 17 00:00:00 2001 From: Minghua Sun Date: Tue, 5 Mar 2019 12:35:19 -0500 Subject: [PATCH 6/9] React/input currency pass event to callback (#498) * pass event to InputCurrency callback function * prevent NaN value using onKeyDown for InputCurrency * add changelog * reformat changelog to md * retain sythentic events * update changelog * Update react/src/components/atoms/forms/InputCurrency/index.js --- changelogs/DP-12890.md | 4 ++++ .../atoms/forms/InputCurrency/index.js | 21 ++++++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 changelogs/DP-12890.md diff --git a/changelogs/DP-12890.md b/changelogs/DP-12890.md new file mode 100644 index 0000000000..c19dfe62b2 --- /dev/null +++ b/changelogs/DP-12890.md @@ -0,0 +1,4 @@ +___DESCRIPTION___ +Fixed +Minor +- (React) [InputCurrency] DP-12890: Pass event type to callback and fix `NaN` value when defaultValue is null using up/down buttons. #495 diff --git a/react/src/components/atoms/forms/InputCurrency/index.js b/react/src/components/atoms/forms/InputCurrency/index.js index 8137902597..81d5efc8f1 100644 --- a/react/src/components/atoms/forms/InputCurrency/index.js +++ b/react/src/components/atoms/forms/InputCurrency/index.js @@ -43,6 +43,7 @@ const Currency = (props) => ( return number; }; const handleChange = (e) => { + const { type } = e; let stringValue; if (typeof e.target.value !== 'string') { stringValue = String(e.target.value); @@ -70,11 +71,12 @@ const Currency = (props) => ( } context.updateState(update, () => { if (typeof props.onChange === 'function') { - props.onChange(numberValue, props.id); + props.onChange(numberValue, props.id, type); } }); }; const handleAdjust = (e, direction) => { + const { type } = e; let stringValue; if (typeof context.value !== 'string') { stringValue = String(context.value); @@ -94,7 +96,7 @@ const Currency = (props) => ( const { showError, errorMsg } = validNumber(newValue, props.min, props.max); context.updateState({ showError, errorMsg, value: toCurrency(newValue, 2) }, () => { if (typeof props.onChange === 'function') { - props.onChange(newValue, props.id); + props.onChange(newValue, props.id, type, direction); } }); } @@ -144,6 +146,7 @@ const Currency = (props) => ( } }, onKeyDown: (e) => { + const { type, key } = e; let stringValue; if (typeof context.value !== 'string') { stringValue = String(context.value); @@ -151,22 +154,24 @@ const Currency = (props) => ( stringValue = context.value; } const numberValue = numbro.unformat(stringValue); + // default to 0 if defaultValue is NaN + const baseValue = numberValue || 0; if (!Number.isNaN(numberValue) && stringValue.length > 0) { let newValue; - if (e.key === 'ArrowDown') { - newValue = Number(Number.parseFloat(numberValue - props.step).toFixed(2)); + if (key === 'ArrowDown') { + newValue = Number(Number.parseFloat(baseValue - props.step).toFixed(2)); const { showError, errorMsg } = validNumber(newValue, props.min, props.max); context.updateState({ showError, errorMsg, value: toCurrency(newValue, 2) }, () => { if (typeof props.onChange === 'function') { - props.onChange(newValue, props.id); + props.onChange(newValue, props.id, type, key); } }); - } else if (e.key === 'ArrowUp') { - newValue = Number(Number.parseFloat(numberValue + props.step).toFixed(2)); + } else if (key === 'ArrowUp') { + newValue = Number(Number.parseFloat(baseValue + props.step).toFixed(2)); const { showError, errorMsg } = validNumber(newValue, props.min, props.max); context.updateState({ showError, errorMsg, value: toCurrency(newValue, 2) }, () => { if (typeof props.onChange === 'function') { - props.onChange(newValue, props.id); + props.onChange(newValue, props.id, type, key); } }); } From f04cf4195d01d234ab9df332dde939d9ca6beafd Mon Sep 17 00:00:00 2001 From: Minghua Sun Date: Tue, 5 Mar 2019 17:20:10 -0500 Subject: [PATCH 7/9] consolidate changelog --- CHANGELOG.md | 16 ++++++++++++++++ changelogs/DP-12807.txt | 5 ----- changelogs/DP-12875.txt | 8 -------- changelogs/DP-12890.md | 4 ---- changelogs/DP-4562.txt | 5 ----- changelogs/DP-9249.txt | 6 ------ 6 files changed, 16 insertions(+), 28 deletions(-) delete mode 100644 changelogs/DP-12807.txt delete mode 100644 changelogs/DP-12875.txt delete mode 100644 changelogs/DP-12890.md delete mode 100644 changelogs/DP-4562.txt delete mode 100644 changelogs/DP-9249.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index da049ea49e..2ec84113a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,22 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) **For example** - DP-1234: The short description text on a [service detail](http://mayflower.digital.mass.gov/?p=pages-detail-for-service-howto-location) page banner ([@organisms/by-template/page-banner](http://mayflower.digital.mass.gov/?p=organisms-page-banner)) should now render ([PR #493](https://github.com/massgov/mayflower/pull/493)) +## 9.2.0 (05/05/2019) + +### Fixed +- (React) [InputSlider] DP-12732: Allows slider callback and updates form context on handler drag (Added onUpdate prop) #495 +- (React) [InputSlider]DP-12732: Allows keyboard actions and slider track click to update value (Changed handleChange from using onSlideEnd to onChange) #495 +- (React) [InputCurrency] DP-12807: Prevent InputCurrency returning NaN when default value is set to null #484 +- (React) [ErrorMessage] DP-12806: Fix error message inline styling #484 +- (React) [InputSlider] DP-12875: Disable handle button when InputSlider is disabled. #494 +- (React) [InputCurrency] DP-12890: Fix `NaN` value when defaultValue is null using up/down buttons. #498 + +### Changed +- (Patternlab) [SectionLinks] DP-9249: Topic card more links #472 +- (React) [HelpTip] DP-12875: Add `disabled` prop to disable HelpTip trigger text. #494 +- (React) [InputCurrency] DP-12890: Pass event type to callback #498 + + ## 9.1.1 (02/19/2019) ### Fixed diff --git a/changelogs/DP-12807.txt b/changelogs/DP-12807.txt deleted file mode 100644 index 1f2d4a707f..0000000000 --- a/changelogs/DP-12807.txt +++ /dev/null @@ -1,5 +0,0 @@ -___DESCRIPTION___ -Fixed -Patch -- (React) DP-12807: Prevent InputCurrency returning NaN when default value is set to null #484 -- (React) DP-12806: Fix error message inline styling #484 diff --git a/changelogs/DP-12875.txt b/changelogs/DP-12875.txt deleted file mode 100644 index 9f9c5ba4aa..0000000000 --- a/changelogs/DP-12875.txt +++ /dev/null @@ -1,8 +0,0 @@ -___DESCRIPTION___ -Fixed -Patch -- (React) DP-12875: Disable handle button when InputSlider is disabled. #494 - -Changed -Minor -- (React) DP-12875: Add `disabled` prop to disable HelpTip trigger text. #494 diff --git a/changelogs/DP-12890.md b/changelogs/DP-12890.md deleted file mode 100644 index c19dfe62b2..0000000000 --- a/changelogs/DP-12890.md +++ /dev/null @@ -1,4 +0,0 @@ -___DESCRIPTION___ -Fixed -Minor -- (React) [InputCurrency] DP-12890: Pass event type to callback and fix `NaN` value when defaultValue is null using up/down buttons. #495 diff --git a/changelogs/DP-4562.txt b/changelogs/DP-4562.txt deleted file mode 100644 index 4ed9c77968..0000000000 --- a/changelogs/DP-4562.txt +++ /dev/null @@ -1,5 +0,0 @@ -___DESCRIPTION___ -Fixed -Minor -- (React) DP-12732: Allows slider callback and updates form context on handler drag (Added onUpdate prop) #495 -- (React) DP-12732: Allows keyboard actions and slider track click to update value (Changed handleChange from using onSlideEnd to onChange) #495 diff --git a/changelogs/DP-9249.txt b/changelogs/DP-9249.txt deleted file mode 100644 index a5cb264629..0000000000 --- a/changelogs/DP-9249.txt +++ /dev/null @@ -1,6 +0,0 @@ -___DESCRIPTION___ -changed -patch -- patternlab / DP-9249: Topic card more links - - From bd40d2293f9a0568002a9311fd9230c3d567e292 Mon Sep 17 00:00:00 2001 From: Minghua Sun Date: Tue, 5 Mar 2019 17:44:51 -0500 Subject: [PATCH 8/9] update changelog template file --- CHANGELOG.md | 7 +++++-- changelogs/{template.txt => template.md} | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) rename changelogs/{template.txt => template.md} (61%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ec84113a7..3088fc6081 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,9 +15,13 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) ## 9.2.0 (05/05/2019) +### Added +- (Patternlab) [MobileNav] DP-4562: Set focus state for search on mobile menu #473 +- (React) [HelpTip] DP-12875: Add `disabled` prop to disable HelpTip trigger text. #494 + ### Fixed - (React) [InputSlider] DP-12732: Allows slider callback and updates form context on handler drag (Added onUpdate prop) #495 -- (React) [InputSlider]DP-12732: Allows keyboard actions and slider track click to update value (Changed handleChange from using onSlideEnd to onChange) #495 +- (React) [InputSlider] DP-12732: Allows keyboard actions and slider track click to update value (Changed handleChange from using onSlideEnd to onChange) #495 - (React) [InputCurrency] DP-12807: Prevent InputCurrency returning NaN when default value is set to null #484 - (React) [ErrorMessage] DP-12806: Fix error message inline styling #484 - (React) [InputSlider] DP-12875: Disable handle button when InputSlider is disabled. #494 @@ -25,7 +29,6 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) ### Changed - (Patternlab) [SectionLinks] DP-9249: Topic card more links #472 -- (React) [HelpTip] DP-12875: Add `disabled` prop to disable HelpTip trigger text. #494 - (React) [InputCurrency] DP-12890: Pass event type to callback #498 diff --git a/changelogs/template.txt b/changelogs/template.md similarity index 61% rename from changelogs/template.txt rename to changelogs/template.md index 48891a63dd..5e855d51aa 100644 --- a/changelogs/template.txt +++ b/changelogs/template.md @@ -1,7 +1,13 @@ +___EXAMPLE___ +Minor +Added +- (Patternlab) [MobileNav] DP-4562: Set focus state for search on mobile menu #473 +- (React) [HelpTip] DP-12875: Add `disabled` prop to disable HelpTip trigger text. #494 + ___DESCRIPTION___ -Change_type (see below) Change_impact (see below) -- (Project_prefix) DP-1234: Adds apples to apple trees for admin apple pickers #PR# +Change_type (see below) +- (Project_prefix) [ComponentName] DP-1234: Adds apples to apple trees for admin apple pickers #PR ___POST DEPLOY STEPS___ 1. Do this @@ -28,3 +34,8 @@ ___PROJECTS PREFIX___ - Patternlab - React - Docs + + +___COMPONENT NAME___ +Component name in `PascalCase` +e.g. Header, Form, InputSlider, InputTextTypeAhead From 84679425b389d79adff10eca4493adc9c53e5b89 Mon Sep 17 00:00:00 2001 From: Minghua Sun Date: Wed, 6 Mar 2019 10:12:29 -0500 Subject: [PATCH 9/9] update changelog instruction --- CHANGELOG.md | 2 +- changelogs/template.md | 2 +- docs/for-developers/changelog-instructions.md | 16 +++++++++------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3088fc6081..238bc9551e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) ## 9.2.0 (05/05/2019) ### Added -- (Patternlab) [MobileNav] DP-4562: Set focus state for search on mobile menu #473 +- (Patternlab) [Header] DP-4562: Set focus state for search on mobile menu in mobileNav module. #473 - (React) [HelpTip] DP-12875: Add `disabled` prop to disable HelpTip trigger text. #494 ### Fixed diff --git a/changelogs/template.md b/changelogs/template.md index 5e855d51aa..d42d5b0e47 100644 --- a/changelogs/template.md +++ b/changelogs/template.md @@ -1,7 +1,7 @@ ___EXAMPLE___ Minor Added -- (Patternlab) [MobileNav] DP-4562: Set focus state for search on mobile menu #473 +- (Patternlab) [Header] DP-4562: Set focus state for search on mobile menu in mobileNav module #473 - (React) [HelpTip] DP-12875: Add `disabled` prop to disable HelpTip trigger text. #494 ___DESCRIPTION___ diff --git a/docs/for-developers/changelog-instructions.md b/docs/for-developers/changelog-instructions.md index 3ee6ceee4c..2a6135f985 100644 --- a/docs/for-developers/changelog-instructions.md +++ b/docs/for-developers/changelog-instructions.md @@ -4,18 +4,20 @@ This documentation outlines a simple series of steps to keep `CHANGELOG.md` up-t ## Dev: Before You Submit a PR for a Feature Branch or Hot Fix -1. Make a copy of `changelogs/template.txt` with the ticket number as the name \(example: `DP-1234.txt`\). If there is no ticket number for the contribution, just use the branch name and your initials \(`awesome- feature-branch.txt`\). -2. Write a plain language description of the feature you're contributing. It needs to include the name, what changed, and who it impacts. -3. Write down any post deploy steps that need to be performed \(Examples: `This change will effect the local build. Make sure all developers know what steps to take after this gets in to dev`\). -4. Commit the file and open your PR. +1. Make a copy of `changelogs/template.md` with the ticket number as the name, e.g. `DP-1234.md.` If there is no ticket number for the contribution, just use the branch name and your initials, e.g. `awesome- feature-branch.md`. +2. Write a plain language description of the feature you're contributing. It needs to include the project prefix, component name, what changed, and who it impacts. +3. Write down any post deploy steps that need to be performed, e.g. +> This change will effect the local build. Make sure all developers know what steps to take after this gets in to dev. + +4. For any breaking changes, add a comment in the PR describing the necessary changes on the consumer side and link that comment in the changelog. +5. Commit the file and open your PR. ## Release Master: When you are Releasing Do this after your open your release branch: 1. In `CHANGELOG.md`, create a new section for the release with "Added", "Changed", and "Removed" sub-sections. -2. Go through each `changelogs/*.txt` file and copy the description into the appropriate sub-section of `CHANGELOG.md`. +2. Go through each `changelogs/*.md` file and copy the description into the appropriate sub-section of `CHANGELOG.md`. 3. Keep a list of post deployment steps handy for yourself. -4. After the last description is copied and you have all the post deployment steps, delete all files in `changelogs/` except for `changelogs/template.txt.` +4. After the last description is copied and you have all the post deployment steps, delete all files in `changelogs/` except for `changelogs/template.md`. 5. Commit changes to the release branch. -