UNPKG

quiz-interactions

Version:

A React UI component Library for quiz interaction types.

242 lines (198 loc) 8.04 kB
"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); }