quiz-interactions
Version:
A React UI component Library for quiz interaction types.
242 lines (198 loc) • 8.04 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _uiForms = require("@instructure/ui-forms");
var _quizI18n = require("@instructure/quiz-i18n");
var _uiLayout = require("@instructure/ui-layout");
var _quizNumberInput = require("@instructure/quiz-number-input");
var _numeric = require("instructure-validations/lib/validators/numeric");
var _NumericTypeSelect = _interopRequireDefault(require("./NumericTypeSelect"));
var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/lib/format-message"));
var _constants = require("./constants");
var PreciseResponse =
/*#__PURE__*/
function (_Component) {
(0, _inherits2.default)(PreciseResponse, _Component);
function PreciseResponse() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2.default)(this, PreciseResponse);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(PreciseResponse)).call.apply(_getPrototypeOf2, [this].concat(args)));
_this.state = {
value: '',
onClickHelp: null
};
_this.handlePrecisionChange = function (event, _, normalized) {
// When precision changes, update the value to match the new precision (add
// or remove trailing zeros)
var precision = normalized;
var value = _this.props.value;
if (precision != null && !isNaN(value)) {
var precisionNumber = parseInt(precision, 10);
var valueDecimal = (0, _quizI18n.Decimal)(value);
value = _this.props.precisionType === _constants.SIGNIFICANT_DIGITS ? valueDecimal.toPrecision(precisionNumber, _this.props.locale) : valueDecimal.toFixed(precisionNumber, _this.props.locale);
}
_this.setState({
value: value
});
_this.props.onChange(event, {
id: _this.props.id,
precision: precision,
value: value
});
};
_this.handlePrecisionTypeChange = function (event, _ref) {
var value = _ref.value;
var precisionType = value;
var precision = _this.props.precision;
if (_this.props.value) {
precision = precisionFromValue(_this.props.value, precisionType).toString();
}
_this.props.onChange(event, {
id: _this.props.id,
precision: precision,
precisionType: precisionType
});
};
_this.handleValueChange = function (event, value, normalized) {
// When the answer value changes, update the precision to match the
// precision of the answer
var precision = _this.props.precision;
if (normalized != null) {
precision = precisionFromValue(normalized, _this.props.precisionType).toString();
}
_this.setState({
value: value
});
_this.props.onChange(event, {
id: _this.props.id,
precision: precision,
value: normalized
});
};
return _this;
}
(0, _createClass2.default)(PreciseResponse, [{
key: "componentWillMount",
value: function componentWillMount() {
if (this.props.value) {
var value;
try {
value = _quizI18n.Decimal.toLocaleString(this.props.value, this.props.locale);
} catch (e) {
value = this.props.value;
}
this.setState({
value: value
});
}
}
}, {
key: "minPrecision",
value: function minPrecision() {
var value = parseFloat(this.props.value);
if (this.props.precisionType === _constants.SIGNIFICANT_DIGITS) {
return isNaN(value) ? 1 : (0, _numeric.significantDigits)(value.toString());
}
return isNaN(value) ? 0 : (0, _numeric.decimals)(value.toString());
}
}, {
key: "maxPrecision",
value: function maxPrecision() {
// These are the limits for toPrecision and toFixed in Chrome
if (this.props.precisionType === _constants.SIGNIFICANT_DIGITS) {
var value = parseFloat(this.props.value);
return value === 0 ? 1 : 21;
}
return 100;
}
}, {
key: "render",
value: function render() {
return _react.default.createElement(_uiLayout.Flex, {
alignItems: "start"
}, _react.default.createElement(_uiLayout.Flex.Item, {
grow: true,
shrink: true,
margin: "0 xx-small"
}, _react.default.createElement(_NumericTypeSelect.default, {
id: this.props.id,
onChange: this.props.onChangeType,
onClickHelp: this.props.onClickHelp,
value: _constants.PRECISE_RESPONSE
})), _react.default.createElement(_uiLayout.Flex.Item, {
grow: true,
shrink: true,
margin: "0 xx-small"
}, _react.default.createElement(_quizNumberInput.ScientificNumberInput, {
label: (0, _formatMessage.default)('Answer'),
locale: this.props.locale,
messages: this.props.messages.value,
onChange: this.handleValueChange,
value: this.state.value
})), _react.default.createElement(_uiLayout.Flex.Item, {
grow: true,
shrink: true,
margin: "0 xx-small"
}, _react.default.createElement(_quizNumberInput.ScientificNumberInput, {
label: (0, _formatMessage.default)('Precision'),
locale: this.props.locale,
max: this.maxPrecision(),
messages: this.props.messages.precision,
min: this.minPrecision(),
onChange: this.handlePrecisionChange,
step: 1,
value: this.props.precision
})), _react.default.createElement(_uiLayout.Flex.Item, {
grow: true,
shrink: true,
margin: "0 xx-small"
}, _react.default.createElement(_uiForms.Select, {
label: (0, _formatMessage.default)('Type'),
onChange: this.handlePrecisionTypeChange,
selectedOption: this.props.precisionType
}, _react.default.createElement("option", {
value: _constants.SIGNIFICANT_DIGITS
}, (0, _formatMessage.default)('Significant digits')), _react.default.createElement("option", {
value: _constants.DECIMALS
}, (0, _formatMessage.default)('Decimal places')))));
}
}]);
PreciseResponse.displayName = "PreciseResponse";
return PreciseResponse;
}(_react.Component);
exports.default = PreciseResponse;
PreciseResponse.propTypes = {
id: _propTypes.default.string.isRequired,
locale: _propTypes.default.string.isRequired,
messages: _propTypes.default.objectOf(_propTypes.default.array),
precision: _propTypes.default.string,
precisionType: _propTypes.default.oneOf([_constants.SIGNIFICANT_DIGITS, _constants.DECIMALS]).isRequired,
onChange: _propTypes.default.func.isRequired,
onChangeType: _propTypes.default.func.isRequired,
onClickHelp: _propTypes.default.func,
value: _propTypes.default.string
};
PreciseResponse.defaultProps = {
messages: void 0,
precision: void 0,
onClickHelp: void 0,
value: void 0
};
function precisionFromValue(value, precisionType) {
return precisionType === _constants.SIGNIFICANT_DIGITS ? (0, _numeric.significantDigits)(value) : (0, _numeric.decimals)(value);
}