UNPKG

quiz-interactions

Version:

A React UI component Library for quiz interaction types.

276 lines (232 loc) 9.98 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); 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 _uiThemeable = require("@instructure/ui-themeable"); var _uiButtons = require("@instructure/ui-buttons"); var _uiElements = require("@instructure/ui-elements"); var _uiA11y = require("@instructure/ui-a11y"); var _uiIcons = require("@instructure/ui-icons"); var _quizCommon = require("@instructure/quiz-common"); var _theme = _interopRequireDefault(require("./theme")); var _isImage = _interopRequireDefault(require("../isImage")); var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/lib/format-message")); var _dec, _class, _class2, _temp; var styles = { componentId: 'baDOS', template: function template(theme) { return "\n\n.baDOS_evhB{padding:".concat(theme.entryWrapperPadding || 'inherit', " 0;width:100%}\n\n.baDOS_bLsK p{margin:0;padding-left:").concat(theme.userResponsePaddingLeft || 'inherit', ";word-wrap:break-word}\n\n.baDOS_bLsK a[target=_blank]{line-height:0}\n\n.baDOS_bSHd{align-items:center;border:solid ").concat(theme.previewBoxBorderWidth || 'inherit', " ").concat(theme.previewBoxColor || 'inherit', ";color:").concat(theme.fileIconColor || 'inherit', ";display:flex;height:8rem;justify-content:center;width:8rem}\n\n.baDOS_cImq{flex:0 0 auto;max-height:100%;max-width:100%}\n\n.baDOS_bAtv{display:flex}\n\n.baDOS_bkFK{color:inherit;cursor:pointer;flex:1;text-decoration:none}\n\n.baDOS_bkFK:focus{border:1px solid ").concat(theme.focusBorderColor || 'inherit', ";box-shadow:none;outline:0.1875rem solid ").concat(theme.focusOutlineColor || 'inherit', ";outline-offset:-0.1875rem}\n\n.baDOS_dxSv{margin-left:").concat(theme.removeButtonMargin || 'inherit', "}\n\n.baDOS_boUa{min-width:10rem}\n\n.baDOS_dJEx{max-width:100%}"); }, 'entryWrapper': 'baDOS_evhB', 'userResponse': 'baDOS_bLsK', 'previewContainer': 'baDOS_bSHd', 'previewImg': 'baDOS_cImq', 'fileLinkWrapper': 'baDOS_bAtv', 'fileLink': 'baDOS_bkFK', 'removeButton': 'baDOS_dxSv', 'nameContainer': 'baDOS_boUa', 'modalImage': 'baDOS_dJEx' }; var SPACE_KEY = 0x20; var ENTER_KEY = 0x0D; var _ref = /*#__PURE__*/ _react.default.createElement(_uiIcons.IconDocumentLine, { size: "medium" }); var _ref2 = /*#__PURE__*/ _react.default.createElement(_uiIcons.IconTrashLine, null); var FilesList = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/ function (_Component) { (0, _inherits2.default)(FilesList, _Component); function FilesList() { var _getPrototypeOf2; var _this; (0, _classCallCheck2.default)(this, FilesList); 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)(FilesList)).call.apply(_getPrototypeOf2, [this].concat(args))); _this.state = { isModalOpen: false, modalContent: { name: 'empty', url: '' } }; _this.handleCloseModal = function () { _this.setState({ isModalOpen: false }); }; _this.handleOpenModal = function (modalContent) { _this.setState({ isModalOpen: true, modalContent: modalContent }); }; _this.handleOpenUrl = function (url) { window.open(url, '_blank'); }; _this.spinnerTheme = function () { return { backgroundColor: _this.theme.spinnerColor }; }; _this.renderImagePreview = function (url, name) { return _react.default.createElement("div", { className: styles.previewContainer }, _react.default.createElement("img", { src: url, alt: name, className: styles.previewImg })); }; _this.renderFilePreview = function () { return _react.default.createElement("div", { className: styles.previewContainer }, _ref); }; _this.renderPreview = function (file) { var url = file.url, size = file.size, name = file.name, isUploading = file.isUploading; if (!url && !isUploading) { return _react.default.createElement("div", { className: styles.userResponse }, _react.default.createElement(_uiElements.Text, { color: "primary" }, (0, _formatMessage.default)('(no answer)'))); } var isImage = (0, _isImage.default)(name); var onClick = isImage ? function () { return _this.handleOpenModal(file); } : function () { return _this.handleOpenUrl(url); }; var containerProps = _this.props.readOnly ? {} : { tabIndex: '0', role: 'button' }; return _react.default.createElement("div", { className: styles.fileLinkWrapper }, _react.default.createElement("div", Object.assign({}, containerProps, { onClick: onClick, className: styles.fileLink, onKeyPress: _this.makeKeyPressHandler(onClick) }), _react.default.createElement("div", { className: styles.userResponse }, isImage ? _this.renderImagePreview(url, name) : _this.renderFilePreview(), _react.default.createElement("div", { className: styles.nameContainer }, _react.default.createElement("div", null, _react.default.createElement(_uiElements.Text, { color: "brand" }, name)), _react.default.createElement("div", null, _react.default.createElement(_uiElements.Text, { color: "primary" }, (0, _formatMessage.default)('{size, number}Kb', { size: Math.round(size * 0.001), description: 'size of file in kilobytes' }))), !isUploading ? null : _react.default.createElement(_uiElements.Spinner, { theme: _this.spinnerTheme(), renderTitle: (0, _formatMessage.default)('Loading'), size: "small" })))), _this.props.makeRemoveHandler && _react.default.createElement("div", { className: styles.removeButton, "data-role": "removeButton" }, _react.default.createElement(_uiButtons.Button, { onClick: _this.props.makeRemoveHandler(file), name: "Close", size: "small", variant: "icon", readOnly: _this.props.readOnly }, _ref2, _react.default.createElement(_uiA11y.ScreenReaderContent, null, (0, _formatMessage.default)('Remove File Named {name}', { name: name }))))); }; _this.renderPreviews = function () { var _this$props = _this.props, files = _this$props.files, showIfEmpty = _this$props.showIfEmpty; if (typeof files === 'undefined') { return _react.default.createElement("div", { className: styles.entryWrapper }, _react.default.createElement(_uiElements.Text, { color: "primary" }, (0, _formatMessage.default)('(response not displayed)'))); } if (showIfEmpty && (!files || files.length === 0)) { return _react.default.createElement("div", { className: styles.entryWrapper }, _react.default.createElement(_uiElements.Text, { color: "primary" }, (0, _formatMessage.default)('(no answer)'))); } return files.map(function (file) { return _react.default.createElement("div", { className: styles.entryWrapper, key: file.id }, _this.renderPreview(file)); }); }; return _this; } (0, _createClass2.default)(FilesList, [{ key: "makeKeyPressHandler", value: function makeKeyPressHandler(callback) { return function (event) { if (event.charCode === SPACE_KEY || event.charCode === ENTER_KEY) { event.preventDefault(); callback(); } }; } }, { key: "render", value: function render() { var _this$state = this.state, modalContent = _this$state.modalContent, isModalOpen = _this$state.isModalOpen; return _react.default.createElement("div", null, _react.default.createElement("div", null, this.renderPreviews()), _react.default.createElement(_quizCommon.SimpleModal, { isModalOpen: isModalOpen, title: modalContent.name, label: modalContent.name, onModalDismiss: this.handleCloseModal }, _react.default.createElement("img", { className: styles.modalImage, src: modalContent.url, alt: modalContent.name }))); } }]); FilesList.displayName = "FilesList"; return FilesList; }(_react.Component), _class2.propTypes = { files: _propTypes.default.arrayOf(_propTypes.default.shape({ id: _propTypes.default.number.isRequired, name: _propTypes.default.string.isRequired, url: _propTypes.default.string, size: _propTypes.default.number.isRequired, isUploading: _propTypes.default.bool })), makeRemoveHandler: _propTypes.default.func, showIfEmpty: _propTypes.default.bool, readOnly: _propTypes.default.bool }, _class2.defaultProps = { files: void 0, makeRemoveHandler: void 0, showIfEmpty: false, readOnly: false }, _temp)) || _class); exports.default = FilesList;