@pnp/spfx-property-controls
Version:
Reusable property pane controls for SharePoint Framework solutions
119 lines • 4.85 kB
JavaScript
import * as React from 'react';
import { TextField } from '@fluentui/react/lib/TextField';
import * as telemetry from '../../common/telemetry';
import { Async } from '@fluentui/react/lib/Utilities';
import * as strings from 'PropertyControlStrings';
import { GeneralHelper } from '../../helpers/GeneralHelper';
export default class PropertyFieldNumberHost extends React.Component {
constructor(props) {
super(props);
/**
* Validate if field value is a number
* @param value
*/
this._validateNumber = (value) => {
const nrValue = !GeneralHelper.isDefined(this.props.precision) || this.props.precision === 0 ? parseInt(value) : parseFloat(value);
if (isNaN(nrValue)) {
return `${strings.NotNumberValidationMessage} ${value}.`;
}
const { minValue, maxValue } = this.props;
// Check if number is lower or equal to minimum value
if (GeneralHelper.isDefined(minValue) && nrValue < minValue) {
return `${strings.MinimumNumberValidationMessage} ${minValue}`;
}
// Check if the number is greater than the maximum value
if (GeneralHelper.isDefined(maxValue) && nrValue > maxValue) {
return `${strings.MaximumNumberValidationMessage} ${maxValue}`;
}
if (this.props.onGetErrorMessage) {
return this.props.onGetErrorMessage(nrValue);
}
else {
return '';
}
};
/**
* On field change event handler
*/
this._onChanged = (value) => {
let nrValue;
const { precision } = this.props;
if (!GeneralHelper.isDefined(precision)) {
nrValue = parseFloat(value);
}
else if (precision === 0) {
nrValue = parseInt(value);
}
else {
const multiplier = Math.pow(10, precision);
nrValue = Math.round((parseFloat(value) + 0.000000000000001) * multiplier) / multiplier;
}
// Update state
this.setState({
value,
roundedValue: nrValue
});
const { minValue, maxValue } = this.props;
if (!isNaN(nrValue)) {
if ((!GeneralHelper.isDefined(minValue) || nrValue >= minValue) && (!GeneralHelper.isDefined(maxValue) || nrValue <= maxValue)) {
// Trigger change for the web part
this.props.onChanged(nrValue);
}
}
else {
this.props.onChanged(undefined);
}
};
telemetry.track('PropertyFieldNumber', {
disabled: props.disabled
});
let value = null;
let nrValue = undefined;
if (GeneralHelper.isDefined(props.value)) {
value = props.value.toString();
if (!GeneralHelper.isDefined(props.precision)) {
nrValue = props.value;
}
else if (props.precision === 0) {
nrValue = parseInt(value);
}
else {
const multiplier = Math.pow(10, props.precision);
nrValue = Math.round((parseFloat(value) + 0.000000000000001) * multiplier) / multiplier;
}
}
this.state = {
value: value,
roundedValue: nrValue
};
this._async = new Async(this);
this._delayedChange = this._async.debounce(this._onChanged, this.props.deferredValidationTime ? this.props.deferredValidationTime : 200);
}
/**
* componentDidUpdate lifecycle hook
*
* @param prevProps
* @param prevState
*/
componentDidUpdate(prevProps, prevState) {
if (prevProps.value !== this.props.value && this.props.value !== this.state.roundedValue) {
this.setState({
value: GeneralHelper.isDefined(this.props.value) ? this.props.value.toString() : null
});
}
}
/**
* componentWillUnmount lifecycle hook
*/
componentWillUnmount() {
this._async.dispose();
}
/**
* Render field
*/
render() {
return (React.createElement("div", null,
React.createElement(TextField, { label: this.props.label, ariaLabel: this.props.ariaLabel, onChange: (e, value) => this._delayedChange(value), defaultValue: this.state.value, description: this.props.description, placeholder: this.props.placeholder, errorMessage: this.props.errorMessage, onGetErrorMessage: this._validateNumber, deferredValidationTime: this.props.deferredValidationTime, disabled: this.props.disabled })));
}
}
//# sourceMappingURL=PropertyFieldNumberHost.js.map