UNPKG

ndla-ui

Version:

UI component library for NDLA.

402 lines (355 loc) 18.6 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _reactBemHelper = require('react-bem-helper'); var _reactBemHelper2 = _interopRequireDefault(_reactBemHelper); var _common = require('ndla-icons/common'); var _action = require('ndla-icons/action'); var _ndlaUi = require('ndla-ui'); var _ndlaModal = require('ndla-modal'); var _ndlaModal2 = _interopRequireDefault(_ndlaModal); var _ndlaButton = require('ndla-button'); var _ndlaButton2 = _interopRequireDefault(_ndlaButton); var _debounce = require('lodash/debounce'); var _debounce2 = _interopRequireDefault(_debounce); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* * Copyright (c) 2016-present, NDLA. * * This source code is licensed under the GPLv3 license found in the * LICENSE file in the root directory of this source tree. * FRI OG BEGRENSET */ var filterClasses = new _reactBemHelper2.default({ name: 'filter', prefix: 'c-' }); var FilterListPhone = function (_Component) { _inherits(FilterListPhone, _Component); function FilterListPhone(props) { _classCallCheck(this, FilterListPhone); var _this = _possibleConstructorReturn(this, (FilterListPhone.__proto__ || Object.getPrototypeOf(FilterListPhone)).call(this, props)); _this.state = { isNarrowScreen: false, visibleCount: props.defaultVisibleCount }; _this.setScreenSizeDebounced = (0, _debounce2.default)(function () { return _this.setScreenSize(false); }, 50); return _this; } _createClass(FilterListPhone, [{ key: 'componentDidMount', value: function componentDidMount() { this.setScreenSize(true); window.addEventListener('resize', this.setScreenSizeDebounced); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { this.setScreenSizeDebounced.cancel(); window.removeEventListener('resize', this.setScreenSizeDebounced); } }, { key: 'setScreenSize', value: function setScreenSize() { var initial = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; var isNarrowScreen = (window.innerWidth || document.documentElement.clientWidth) < 768; /* eslint react/no-did-mount-set-state: 0 */ if (initial && isNarrowScreen || !initial) { this.setState({ isNarrowScreen: isNarrowScreen }); } /* eslint react/no-did-mount-set-state: 1 */ } }, { key: 'render', value: function render() { var _this2 = this; var _props = this.props, modifiers = _props.modifiers, label = _props.label, labelNotVisible = _props.labelNotVisible, options = _props.options, values = _props.values, _onChange = _props.onChange, defaultVisibleCount = _props.defaultVisibleCount, showLabel = _props.showLabel, hideLabel = _props.hideLabel, messages = _props.messages, alignedGroup = _props.alignedGroup, collapseMobile = _props.collapseMobile, activeFiltersNarrow = _props.activeFiltersNarrow; var showAll = defaultVisibleCount === null || options.length <= defaultVisibleCount; var labelModifiers = []; if (labelNotVisible) { labelModifiers.push('hidden'); } if (this.state.isNarrowScreen) { var currentlyActiveFilters = options.filter(function (option) { return values.some(function (value) { return value === option.value; }); }); return _react2.default.createElement( 'div', { className: activeFiltersNarrow && filterClasses('narrow-active-filters').className }, currentlyActiveFilters.length > 0 && _react2.default.createElement(_ndlaUi.ActiveFilters, { filters: currentlyActiveFilters, onFilterRemove: function onFilterRemove(value) { _onChange(values.filter(function (option) { return option !== value; }), value); } }), _react2.default.createElement( _ndlaModal2.default, { size: 'fullscreen', animation: 'slide-up', backgroundColor: 'grey', activateButton: _react2.default.createElement( _ndlaButton2.default, _extends({ outline: true }, filterClasses('modal-button')), messages.openFilter ) }, function (onClose) { return _react2.default.createElement( _react.Fragment, null, _react2.default.createElement( _ndlaModal.ModalHeader, { modifier: ['grey-dark', 'left-align'] }, _react2.default.createElement(_ndlaModal.ModalCloseButton, { title: _react2.default.createElement( _react.Fragment, null, _react2.default.createElement(_action.Cross, null), ' ', messages.closeFilter ), onClick: onClose }) ), _react2.default.createElement( _ndlaModal.ModalBody, { modifier: 'no-side-padding-mobile' }, _react2.default.createElement( 'h1', filterClasses('label'), label ), _react2.default.createElement( 'ul', filterClasses('item-wrapper', { 'aligned-grouping': alignedGroup, 'collapse-mobile': collapseMobile }), options.map(function (option) { return _react2.default.createElement( 'li', _extends({}, filterClasses('item'), { key: option.value }), _react2.default.createElement('input', _extends({}, filterClasses('input'), { type: 'checkbox', id: option.value, value: option.value, checked: values.some(function (value) { return value === option.value; }), onChange: function onChange(event) { var newValues = null; if (event.currentTarget.checked) { newValues = [].concat(_toConsumableArray(values), [option.value]); } else { newValues = values.filter(function (value) { return value !== option.value; }); } if (_onChange) { _onChange(newValues, option.value); } } })), _react2.default.createElement( 'label', { htmlFor: option.value }, _react2.default.createElement('span', filterClasses('item-checkbox')), _react2.default.createElement( 'span', filterClasses('text'), option.title ), option.icon ? (0, _react.createElement)(option.icon, { className: 'c-icon--22 u-margin-left-small ' + filterClasses('icon').className }) : null ) ); }) ), _react2.default.createElement( 'div', filterClasses('usefilter-wrapper'), _react2.default.createElement( _ndlaButton2.default, { outline: true, onClick: onClose }, messages.useFilter ) ) ) ); } ) ); } return _react2.default.createElement( 'section', filterClasses('list', modifiers), _react2.default.createElement( 'h1', filterClasses('label', labelModifiers), label ), _react2.default.createElement( 'ul', filterClasses('item-wrapper'), options.map(function (option, index) { var itemModifiers = []; var checked = values.some(function (value) { return value === option.value; }); if (!showAll && !checked && index + 1 > _this2.state.visibleCount) { itemModifiers.push('hidden'); } if (option.noResults) { itemModifiers.push('no-results'); } return _react2.default.createElement( 'li', _extends({}, filterClasses('item', itemModifiers), { key: option.value }), _react2.default.createElement('input', _extends({}, filterClasses('input'), { type: 'checkbox', id: option.value, value: option.value, tabIndex: option.noResults ? -1 : 0, checked: checked, onChange: function onChange(event) { var newValues = null; if (event.currentTarget.checked) { newValues = [].concat(_toConsumableArray(values), [option.value]); } else { newValues = values.filter(function (value) { return value !== option.value; }); } if (_onChange) { _onChange(newValues, option.value); } } })), _react2.default.createElement( 'label', { htmlFor: option.value }, _react2.default.createElement('span', filterClasses('item-checkbox')), _react2.default.createElement( 'span', filterClasses('text'), option.title ), option.icon ? (0, _react.createElement)(option.icon, { className: 'c-icon--22 u-margin-left-small ' + filterClasses('icon').className }) : null ) ); }) ), !showAll && _react2.default.createElement( 'button', _extends({}, filterClasses('expand'), { type: 'button', onClick: function onClick() { _this2.setState(function (prevState) { if (prevState.visibleCount === defaultVisibleCount) { return { visibleCount: options.length }; } return { visibleCount: defaultVisibleCount }; }); } }), this.state.visibleCount === defaultVisibleCount ? _react2.default.createElement( _react.Fragment, null, _react2.default.createElement( 'span', null, showLabel ), ' ', _react2.default.createElement(_common.ChevronDown, null) ) : _react2.default.createElement( _react.Fragment, null, _react2.default.createElement( 'span', null, hideLabel ), ' ', _react2.default.createElement(_common.ChevronUp, null) ) ) ); } }]); return FilterListPhone; }(_react.Component); var valueShape = _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]); FilterListPhone.propTypes = { children: _propTypes2.default.node, label: _propTypes2.default.string.isRequired, labelNotVisible: _propTypes2.default.bool, modifiers: _propTypes2.default.string, onChange: _propTypes2.default.func, // isRequired options: _propTypes2.default.arrayOf(_propTypes2.default.shape({ title: _propTypes2.default.string.isRequired, value: valueShape.isRequired, icon: _propTypes2.default.func, noResults: _propTypes2.default.bool })).isRequired, values: _propTypes2.default.arrayOf(valueShape), defaultVisibleCount: _propTypes2.default.number, showLabel: _propTypes2.default.string, hideLabel: _propTypes2.default.string, onToggle: _propTypes2.default.func, alignedGroup: _propTypes2.default.bool, collapseMobile: _propTypes2.default.bool, activeFiltersNarrow: _propTypes2.default.bool, messages: _propTypes2.default.shape({ useFilter: _propTypes2.default.string.isRequired, openFilter: _propTypes2.default.string.isRequired, closeFilter: _propTypes2.default.string.isRequired }).isRequired }; FilterListPhone.defaultProps = { modifiers: '', values: [], defaultVisibleCount: null, onToggle: null, alignedGroup: false, collapseMobile: true }; exports.default = FilterListPhone;