Skip to content

Commit

Permalink
Update number format component (#15)
Browse files Browse the repository at this point in the history
* updated react-number-format to new 5.0.0 version.  Implemented r-paper-number-format-numeric-text-field component.  Added selecting of entire text field on focus.

* Added r-paper-number-format-pattern-text-field-test.  Added/fixed unit tests

* Updated Readme.  Added decorator to handle select all on focus.

* Updated Package Number to 3.0.0-beta.13 to reflect breaking change in how RPaperReactNumberFormatTextField has changed.
  • Loading branch information
ctwoolsey authored Oct 6, 2022
1 parent 0ef7dd7 commit c2d5ec6
Show file tree
Hide file tree
Showing 26 changed files with 454 additions and 156 deletions.
1 change: 1 addition & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
* `ember test` – Runs the test suite on the current Ember version
* `ember test --server` – Runs the test suite in "watch mode"
* `ember try:each` – Runs the test suite against multiple Ember versions
* To Run on Browser - `ember serve` then - `localhost:4200/tests`

## Generating Basic Component
* `ember g r-paper <dasherized-react-component-name>`
Expand Down
49 changes: 43 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -710,9 +710,9 @@ If `@nativeOnChange={{true}}`:
The onChange function will return the event object. If `nativeOnChange` is not defined or false, the unmasked value will be returned. The event object returns the following object a target object with a `value` and `maskedValue`.


## TextField - NumberFormatTextField
## TextField - NumberFormatNumericTextField
***
This component uses all of the regular TextField properties as well as that of ReactNumberFormat.
This component uses all of the regular TextField properties as well as that of ReactNumberFormat Numeric.
[Explore React Number Format Docs](https://github.com/s-yadav/react-number-format)

This component will only accept numbers as input.
Expand All @@ -739,12 +739,12 @@ export default class TestClass extends Component {
},
};

this.inputMaskTypes.addNumberFormatType(
this.inputMaskTypes.addNumberFormatNumericType(
'currencyNoDecimal',
currencyNoDecimalNMask
);

this.inputMaskTypes.addNumberFormatType(
this.inputMaskTypes.addNumberFormatNumericType(
'percentageWithDecimal',
percentageWithDecimalNFMask
);
Expand All @@ -753,13 +753,50 @@ export default class TestClass extends Component {
```
And to use it:
```handlebars
<RPaperNumberFormatTextField @label="Regular NMask" @maskName="currencyNoDecimal"/>
<RPaperNumberFormatTextField @label="NF Percent Mask" @maskName="percentageWithDecimal"/>
<RPaperNumberFormatNumericTextField @label="Regular NMask" @maskName="currencyNoDecimal"/>
<RPaperNumberFormatNumericTextField @label="NF Percent Mask" @maskName="percentageWithDecimal"/>
```

If `@nativeOnChange={{true}}`:
The onChange function will return the event object. If `nativeOnChange` is not defined or false, the unmasked value will be returned. The event object returns the following object a target object with a `value` and `maskedValue`.

This component will by default select the entire text area when focus is received. If this trait is not desired, the attribute `@selectAllOnFocus={{false}}` must be explicitly set.

## TextField - NumberFormatPatternTextField
***
This component uses all of the regular TextField properties as well as that of ReactNumberFormat Pattern.
[Explore React Number Format Docs](https://github.com/s-yadav/react-number-format)

This component will only accept numbers as input.

The service `inputMaskTypes` is available to predefine masks for this component.
```javascript
export default class TestClass extends Component {
@service inputMaskTypes

constructor() {
super(...arguments);

const myPatternFormat = {
format: "### ###",
};

this.inputMaskTypes.addNumberFormatPatternType(
'myPattern',
myPatternFormat
);
}
}
```
And to use it:
```handlebars
<RPaperNumberFormatPatternTextField @label="Format Mask" @maskName="myPattern"/>
```

If `@nativeOnChange={{true}}`:
The onChange function will return the event object. If `nativeOnChange` is not defined or false, the unmasked value will be returned. The event object returns the following object a target object with a `value` and `maskedValue`.

This component will by default select the entire text area when focus is received. If this trait is not desired, the attribute `@selectAllOnFocus={{false}}` must be explicitly set.

## Tooltip
***
Expand Down
32 changes: 32 additions & 0 deletions addon/components/r-paper-number-format-numeric-text-field.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { ReactNumberFormatNumericTextField } from '../react-component-lib/react-number-format-numeric-text-field'
import { NUMBER_FORMAT_NUMERIC_TEXT_FIELD } from '../constants/number-format-numeric-text-field';
import { NumberFormatNumericTextFieldPropObj } from '../prop-files/number-format-numeric-text-field-props';
import { TextFieldPropObj } from '../prop-files/text-field-props';
import BaseEmberPaperReact from './base/base-ember-paper-react';
import { usesErrorValidation } from '../decorators/uses-error-validation';
import { changeHandlerValueReturn } from '../decorators/change-handler-value-return';
import { selectTextOnFocus } from '../decorators/select-text-on-focus';
import { inject as service } from '@ember/service';

@usesErrorValidation
@changeHandlerValueReturn
@selectTextOnFocus
export default class RPaperNumberFormatNumericTextFieldComponent extends BaseEmberPaperReact {
@service inputMaskTypes;

constructor() {
super(...arguments);
this.componentType = NUMBER_FORMAT_NUMERIC_TEXT_FIELD.COMPONENT_TYPE;
this.loadPropObject(TextFieldPropObj, NumberFormatNumericTextFieldPropObj);
this.reactElement = ReactNumberFormatNumericTextField;
}

initializeProps() {
super.initializeProps();
if (this.args.maskName) {
const mask = this.inputMaskTypes.getNumberFormatNumericType(this.args.maskName);
Object.assign(this.propsToPass, mask);
}
}
}

4 changes: 4 additions & 0 deletions addon/components/r-paper-number-format-pattern-text-field.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<span class={{this.componentType}} ...attributes
{{ember-paper-reactable this.inserted this.changeReactState this.changeArgs}}
{{did-update this.setValidation @errors}} {{did-update this.setValidation @isTouched}}
></span>
34 changes: 34 additions & 0 deletions addon/components/r-paper-number-format-pattern-text-field.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { ReactNumberFormatPatternTextField } from '../react-component-lib/react-number-format-pattern-text-field'
import { NUMBER_FORMAT_PATTERN_TEXT_FIELD } from '../constants/number-format-pattern-text-field';
import { NumberFormatPatternTextFieldPropObj } from '../prop-files/number-format-pattern-text-field-props';
import { TextFieldPropObj } from '../prop-files/text-field-props';
import BaseEmberPaperReact from './base/base-ember-paper-react';
import { usesErrorValidation } from '../decorators/uses-error-validation';
import { changeHandlerValueReturn } from '../decorators/change-handler-value-return';
import { selectTextOnFocus } from '../decorators/select-text-on-focus';
import { inject as service } from '@ember/service';

@usesErrorValidation
@changeHandlerValueReturn
@selectTextOnFocus
export default class RPaperNumberFormatPatternTextFieldComponent extends BaseEmberPaperReact {
@service inputMaskTypes;

constructor() {
super(...arguments);
this.componentType = NUMBER_FORMAT_PATTERN_TEXT_FIELD.COMPONENT_TYPE;
this.loadPropObject(TextFieldPropObj, NumberFormatPatternTextFieldPropObj);
this.reactElement = ReactNumberFormatPatternTextField;
}

initializeProps() {
super.initializeProps();
if (this.args.maskName) {
const mask = this.inputMaskTypes.getNumberFormatPatternType(this.args.maskName);
Object.assign(this.propsToPass, mask);
}
}
}



30 changes: 0 additions & 30 deletions addon/components/r-paper-number-format-text-field.js

This file was deleted.

14 changes: 14 additions & 0 deletions addon/constants/number-format-numeric-text-field.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { BASE_EMBER_COMPONENT_PREFIX } from './constants';

const IDS = {
NUMBER_FORMAT_NUMERIC_TEXT_FIELD: `NumberFormatNumericTextField`
}

const NUMBER_FORMAT_NUMERIC_TEXT_FIELD = {
ID: IDS.NUMBER_FORMAT_NUMERIC_TEXT_FIELD,
COMPONENT_TYPE: `${BASE_EMBER_COMPONENT_PREFIX}-number-format-numeric-text-field`,
}

export {
NUMBER_FORMAT_NUMERIC_TEXT_FIELD
}
14 changes: 14 additions & 0 deletions addon/constants/number-format-pattern-text-field.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { REACT_COMPONENT_PREFIX, BASE_EMBER_COMPONENT_PREFIX } from './constants';

const IDS = {
NUMBER_FORMAT_PATTERN_TEXT_FIELD: `${REACT_COMPONENT_PREFIX}NumberFormatPatternTextField`
}

const NUMBER_FORMAT_PATTERN_TEXT_FIELD = {
ID: IDS.NUMBER_FORMAT_PATTERN_TEXT_FIELD,
COMPONENT_TYPE: `${BASE_EMBER_COMPONENT_PREFIX}-number-format-pattern-text-field`,
}

export {
NUMBER_FORMAT_PATTERN_TEXT_FIELD
}
14 changes: 0 additions & 14 deletions addon/constants/number-format-text-field.js

This file was deleted.

26 changes: 26 additions & 0 deletions addon/decorators/select-text-on-focus.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { action } from '@ember/object';
import { later } from '@ember/runloop';
import { TEXT_FIELD } from '../constants/text-field';

function selectTextOnFocus(c){
return class SelectTextOnFocus extends c {

initializeProps() {
super.initializeProps();
this.propsToPass.onFocus = this.onFocusHandler;
}

@action
onFocusHandler(event) {
this.args.onFocus && this.args.onFocus(event);
if (this.args.selectAllOnFocus !== false) {
later(this, function() {
this.reactRef.current.componentRef.current.querySelector(`.${TEXT_FIELD.BASE_INPUT_CLASS}`).select();
}, 50);
}
}

}
}

export { selectTextOnFocus }
37 changes: 37 additions & 0 deletions addon/prop-files/number-format-common-text-field-props.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
const props = {
customInput: undefined,
value: undefined,
defaultValue: undefined,
displayType: undefined,
getInputRef: undefined,
isAllowed: undefined,
valueIsNumericString: undefined,
onValueChange: undefined,
renderText: undefined,
type: undefined,
ref: undefined
};

const propsNotForComponent = {
}

const stateProps = {
value: undefined
}

const statefulPropsNotForComponent = {
}

const NumberFormatCommonTextFieldProps = () => { return Object.assign({}, props) };
const NumberFormatCommonTextFieldStateProps = () => {return Object.assign({}, stateProps) };
const NumberFormatCommonTextFieldPropsNotForComponent = () => {return Object.assign({}, propsNotForComponent)};
const NumberFormatCommonTextFieldStatePropsNotForComponent = () => {return Object.assign({}, statefulPropsNotForComponent)};

const NumberFormatCommonTextFieldPropObj = {
props: NumberFormatCommonTextFieldProps,
stateProps: NumberFormatCommonTextFieldStateProps,
propsNotForComponent: NumberFormatCommonTextFieldPropsNotForComponent,
statefulPropsNotForComponent: NumberFormatCommonTextFieldStatePropsNotForComponent
}

export { NumberFormatCommonTextFieldPropObj }
37 changes: 37 additions & 0 deletions addon/prop-files/number-format-numeric-text-field-props.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { NumberFormatCommonTextFieldPropObj } from './number-format-common-text-field-props';

const props = {
allowLeadingZeros: undefined,
allowNegative: undefined,
allowedDecimalSeparators: undefined,
thousandSeparator: undefined,
decimalScale: undefined,
fixedDecimalScale: undefined,
decimalSeparator: undefined,
prefix: undefined,
suffix: undefined,
thousandsGroupStyle: undefined,
};

const propsNotForComponent = {
}

const stateProps = {
}

const statefulPropsNotForComponent = {
}

const NumberFormatNumericTextFieldProps = () => { return Object.assign({}, NumberFormatCommonTextFieldPropObj.props(), props) };
const NumberFormatNumericTextFieldStateProps = () => {return Object.assign({}, NumberFormatCommonTextFieldPropObj.stateProps(), stateProps) };
const NumberFormatNumericTextFieldPropsNotForComponent = () => {return Object.assign({}, NumberFormatCommonTextFieldPropObj.propsNotForComponent(), propsNotForComponent)};
const NumberFormatNumericTextFieldStatePropsNotForComponent = () => {return Object.assign({}, NumberFormatCommonTextFieldPropObj.statefulPropsNotForComponent(), statefulPropsNotForComponent)};

const NumberFormatNumericTextFieldPropObj = {
props: NumberFormatNumericTextFieldProps,
stateProps: NumberFormatNumericTextFieldStateProps,
propsNotForComponent: NumberFormatNumericTextFieldPropsNotForComponent,
statefulPropsNotForComponent: NumberFormatNumericTextFieldStatePropsNotForComponent
}

export { NumberFormatNumericTextFieldPropObj }
31 changes: 31 additions & 0 deletions addon/prop-files/number-format-pattern-text-field-props.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { NumberFormatCommonTextFieldPropObj } from './number-format-common-text-field-props';

const props = {
allowEmptyFormatting: undefined,
format: undefined,
mask: undefined,
patternChar: undefined,
};

const propsNotForComponent = {
}

const stateProps = {
}

const statefulPropsNotForComponent = {
}

const NumberFormatPatternTextFieldProps = () => { return Object.assign({}, NumberFormatCommonTextFieldPropObj.props(), props) };
const NumberFormatPatternTextFieldStateProps = () => {return Object.assign({}, NumberFormatCommonTextFieldPropObj.stateProps(), stateProps) };
const NumberFormatPatternTextFieldPropsNotForComponent = () => {return Object.assign({}, NumberFormatCommonTextFieldPropObj.propsNotForComponent(), propsNotForComponent)};
const NumberFormatPatternTextFieldStatePropsNotForComponent = () => {return Object.assign({}, NumberFormatCommonTextFieldPropObj.statefulPropsNotForComponent(), statefulPropsNotForComponent)};

const NumberFormatPatternTextFieldPropObj = {
props: NumberFormatPatternTextFieldProps,
stateProps: NumberFormatPatternTextFieldStateProps,
propsNotForComponent: NumberFormatPatternTextFieldPropsNotForComponent,
statefulPropsNotForComponent: NumberFormatPatternTextFieldStatePropsNotForComponent
}

export { NumberFormatPatternTextFieldPropObj }
Loading

0 comments on commit c2d5ec6

Please sign in to comment.