UNPKG

instantjob-recruiter-client

Version:

a set of tools for creating an instantjob recruiter react client

454 lines (391 loc) 16.4 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _extends3 = require('babel-runtime/helpers/extends'); var _extends4 = _interopRequireDefault(_extends3); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _md = require('react-icons/lib/md'); var _bind = require('classnames/bind'); var _bind2 = _interopRequireDefault(_bind); var _filterable_table = require('components/filterable_table/filterable_table'); var _filterable_table2 = _interopRequireDefault(_filterable_table); var _user_card = require('components/user_card'); var _user_card2 = _interopRequireDefault(_user_card); var _filter = require('components/filter'); var _filter2 = _interopRequireDefault(_filter); var _address_picker = require('components/address_picker'); var _address_picker2 = _interopRequireDefault(_address_picker); var _search_bar = require('components/search_bar'); var _search_bar2 = _interopRequireDefault(_search_bar); var _utilities = require('common/utilities'); var _fields = require('common/fields'); var _users = require('common/users'); var _auto_bind = require('common/auto_bind'); var _auto_bind2 = _interopRequireDefault(_auto_bind); var _store = require('common/store'); var _store2 = _interopRequireDefault(_store); var _persistent_state = require('common/persistent_state'); var _persistent_state2 = _interopRequireDefault(_persistent_state); var _base = require('selectors/base'); var _fields2 = require('selectors/fields'); var _non_exclusive_field_filter = require('components/non_exclusive_field_filter'); var _non_exclusive_field_filter2 = _interopRequireDefault(_non_exclusive_field_filter); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var cx = _bind2.default.bind(require('styles/filterable_table.scss')); var get_users = function get_users(_, props) { return props.users; }; var get_fuse_users = (0, _base.tolerant_selector)([get_users], function (users) { return (0, _keys2.default)(users).map(function (id) { return users[id]; }).filter(function (user) { return user.full_name != ""; }); }); var UserTable = function (_Component) { (0, _inherits3.default)(UserTable, _Component); function UserTable(props) { (0, _classCallCheck3.default)(this, UserTable); var _this = (0, _possibleConstructorReturn3.default)(this, (UserTable.__proto__ || (0, _getPrototypeOf2.default)(UserTable)).call(this, props)); _this.state = (0, _extends4.default)({ name_filtered_user_ids: [], name_query: "", place: props.place, radius_filter: null, users: props.users, selected_statuses: (0, _extends4.default)({}, props.initial_selected_statuses) }, _persistent_state2.default.get(props.persistent_state_key)); (0, _auto_bind2.default)(_this); return _this; } (0, _createClass3.default)(UserTable, [{ key: 'componentDidMount', value: function componentDidMount() { this.mounted = true; this.update_distances(); this.name_search_bar.set_query(this.state.name_query); } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(props) { var place_has_changed = false; if (props.place != this.props.place) { this.setState({ place: props.place }); place_has_changed = true; this.order_by_distance(); } if (place_has_changed || props.users !== this.props.users) { this.update_distances(props.users); } } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { this.mounted = false; _persistent_state2.default.store(this.props.persistent_state_key, this.state); } }, { key: 'on_name_query_change', value: function on_name_query_change(query, results) { if (this.mounted) { this.setState({ name_filtered_user_ids: results, name_query: query }); } } }, { key: 'update_distances', value: function update_distances(users) { var _this2 = this; if (!users) { users = this.props.users; } this.setState({ users: (0, _utilities.map_hash)(users, function (user) { user = (0, _extends4.default)({}, user, { status: _this2.get_table_user_status(user) }); if (_this2.state.place) { user.distance = (0, _utilities.distance)(user, { latitude: _this2.state.place.location.lat, longitude: _this2.state.place.location.lng }); } else if (user.distance) { user.distance = null; } return user; }) }); } }, { key: 'order_by', value: function order_by(_order_by, ascending) { if (this.mounted) { this.table.order_by(_order_by, ascending); } } }, { key: 'order_by_distance', value: function order_by_distance() { if (this.mounted) { this.table.order_by('distance', true); } } }, { key: 'get_table_user_status', value: function get_table_user_status(user) { if (user && user.status) { return user.status; } else { return (0, _users.get_user_status)(user); } } }, { key: 'get_forbidden_statuses', value: function get_forbidden_statuses() { return (0, _extends4.default)({}, this.props.forbidden_statuses || {}, { applied: true }); } }, { key: 'render', value: function render() { var _this3 = this; var fields = (0, _utilities.filter_hash)(this.props.fields, function (field) { return field.for_entity == 'User'; }); var fake_state = { fields: { values: this.props.values, fields: fields }, users: this.props }; var filtered_user_ids = this.state.name_filtered_user_ids; filtered_user_ids = filtered_user_ids.filter(function (id) { return _this3.state.users[id]; }); if (this.state.radius_filter && this.state.place) { filtered_user_ids = filtered_user_ids.filter(function (id) { var user = _this3.state.users[id]; return user.distance && user.distance < _this3.state.radius_filter * 1000; }); } filtered_user_ids = filtered_user_ids.filter(function (id) { var user = _this3.state.users[id]; return !_this3.get_forbidden_statuses()[_this3.get_table_user_status(user).status]; }); var existing_user_statuses = {}; filtered_user_ids.forEach(function (user_id) { return existing_user_statuses[_this3.state.users[user_id].status.status] = true; }); if (!(0, _utilities.empty_array)((0, _utilities.array_from_set)(this.state.selected_statuses).filter(function (status) { return existing_user_statuses[status]; }))) { filtered_user_ids = filtered_user_ids.filter(function (id) { var user = _this3.state.users[id]; return _this3.state.selected_statuses[_this3.get_table_user_status(user).status]; }); } return _react2.default.createElement( _filterable_table2.default, (0, _extends4.default)({ get_table_ref: function get_table_ref(table) { return _this3.table = table; } }, this.props, { persistent_state_key: this.props.persistent_state_key ? this.props.persistent_state_key + '-inner' : '', fields: fields, items: this.state.users, render_card: function render_card(user) { return _react2.default.createElement(_user_card2.default, (0, _extends4.default)({ selectable: _this3.props.selectable, selected: _this3.props.selected[user.id] }, user)); }, filtered_item_ids: filtered_user_ids, on_card_click: this.props.on_user_card_click, add_value: _fields.action_add_user_value, remove_value: _fields.action_remove_user_value, update_comment: _fields.action_update_user_comment, get_item_field_values: function get_item_field_values(item_id, field_id) { return (0, _fields2.get_user_fields)(item_id)(fake_state)[field_id].selected_values; }, item_type: 'user', filter_value: function filter_value(value_id) { var value = _this3.props.values[value_id]; if (value) { return function (id) { return value.entity_ids[id]; }; } else { return function (id) { return true; }; } } }), _react2.default.createElement( 'div', { className: cx('filterable-table__card-name-arrange') }, _react2.default.createElement( 'div', { className: cx('filterable-table__sort-name'), onClick: function onClick() { return _this3.table.order_by('full_name'); } }, _react2.default.createElement(_md.MdSortByAlpha, null) ), _react2.default.createElement( 'div', { className: cx('filterable-table__search-bar-container') }, _react2.default.createElement(_search_bar2.default, { ref: function ref(name_search_bar) { return _this3.name_search_bar = name_search_bar; }, className: cx('filterable-table__search-bar'), make_fuse: _users.new_users_fuse, items: get_fuse_users({}, this.props), default_results: (0, _keys2.default)(this.props.users), on_query_change: this.on_name_query_change }) ) ), _react2.default.createElement( 'div', { className: cx('filterable-table__card-filters') }, this.props.status_filterable ? _react2.default.createElement(_non_exclusive_field_filter2.default, { values: (0, _utilities.array_from_set)(existing_user_statuses).map(function (id) { return (0, _extends4.default)({ id: id }, (0, _users.make_user_statuses)(_this3.state.selected_statuses[id] ? 'white' : null)[id], { selected: _this3.state.selected_statuses[id] }); }).filter(function (status) { return !_this3.get_forbidden_statuses()[status.id]; }), name: "Statut", toggle_filtered_value: function toggle_filtered_value(status) { return _this3.setState({ selected_statuses: (0, _extends4.default)({}, _this3.state.selected_statuses, (0, _defineProperty3.default)({}, status.id, !_this3.state.selected_statuses[status.id])) }); }, search_enabled: false }) : null, _react2.default.createElement(_filter2.default, { label: "Dernière connexion", onClick: function onClick() { return _this3.table.order_by('last_connection'); } }), this.props.place_filterable ? _react2.default.createElement(PlaceFilter, { active: this.state.place !== null, place_selectable: this.props.place_selectable, onClick: this.props.place_selectable ? null : function () { return _this3.order_by_distance(); }, on_place_select: function on_place_select(place) { _this3.setState({ place: place }); _this3.update_distances(); _this3.order_by_distance(); }, on_clear_place_input: function on_clear_place_input() { _this3.setState({ place: null }); _this3.update_distances(); }, on_radius_change: function on_radius_change(radius_filter) { return _this3.setState({ radius_filter: radius_filter }); }, initial_query: this.state.place ? this.state.place.label : "" }) : null ) ); } }]); return UserTable; }(_react.Component); var PlaceFilter = function (_Component2) { (0, _inherits3.default)(PlaceFilter, _Component2); function PlaceFilter(props) { (0, _classCallCheck3.default)(this, PlaceFilter); var _this4 = (0, _possibleConstructorReturn3.default)(this, (PlaceFilter.__proto__ || (0, _getPrototypeOf2.default)(PlaceFilter)).call(this, props)); _this4.state = { radius: "" }; return _this4; } (0, _createClass3.default)(PlaceFilter, [{ key: 'render', value: function render() { var _this5 = this; return _react2.default.createElement( _filter2.default, { className: cx('filterable-table__filter'), active: this.props.active, label: _react2.default.createElement(_md.MdPlace, null), onClick: this.props.onClick }, _react2.default.createElement( 'div', { className: cx('filterable-table__filter-place') }, this.props.place_selectable ? _react2.default.createElement( 'div', { className: cx('filterable-table__filter-place-group') }, _react2.default.createElement( 'div', { className: cx('filterable-table__filter-place-label') }, 'Trier en fonction de la distance \xE0' ), _react2.default.createElement( 'div', { className: cx('filterable-table__filter-place-input') }, _react2.default.createElement(_address_picker2.default, this.props) ) ) : null, _react2.default.createElement( 'div', { className: cx('filterable-table__filter-place-group') }, _react2.default.createElement( 'div', { className: cx('filterable-table__filter-place-label') }, 'Filtrer les candidats au del\xE0 de' ), _react2.default.createElement( 'div', { className: cx('filterable-table__filter-place-input') }, _react2.default.createElement('input', { ref: function ref(radius_input) { return _this5.radius_input = radius_input; }, type: 'text', placeholder: '', className: cx('filterable-table__filter-place-radius-input'), value: this.state.radius, onChange: function onChange(event) { var radius = event.target.value; _this5.setState({ radius: radius }); _this5.props.on_radius_change(radius); } }), _react2.default.createElement( 'div', { className: cx('filterable-table__filter-place-radius-unit') }, 'km' ) ) ) ) ); } }]); return PlaceFilter; }(_react.Component); UserTable.defaultProps = { items: {}, fields: {}, values: {}, on_user_card_click: function on_user_card_click(user_id) {}, editable: true, selectable: false, place_filterable: true, place_selectable: true, status_filterable: true, place: null, selected: {}, on_select_all: function on_select_all(filtered_item_ids) {}, store_field_name: function store_field_name(field_id, name) {}, delete_field: function delete_field(field_id) {}, initial_selected_statuses: {}, forbidden_statuses: {} }; exports.default = UserTable;