UNPKG

instantjob-recruiter-client

Version:

a set of tools for creating an instantjob recruiter react client

695 lines (595 loc) 25.5 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _promise = require('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); 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 _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); var _extends4 = require('babel-runtime/helpers/extends'); var _extends5 = _interopRequireDefault(_extends4); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactRedux = require('react-redux'); var _bind = require('classnames/bind'); var _bind2 = _interopRequireDefault(_bind); var _md = require('react-icons/lib/md'); var _stylesReact = require('./styles.react.scss'); var _selected_items = require('components/filterable_list/selected_items'); var _selected_items2 = _interopRequireDefault(_selected_items); var _non_exclusive_field = require('components/non_exclusive_field'); var _non_exclusive_field2 = _interopRequireDefault(_non_exclusive_field); var _comment_field = require('components/comment_field'); var _comment_field2 = _interopRequireDefault(_comment_field); var _file_field = require('components/file_field'); var _file_field2 = _interopRequireDefault(_file_field); var _filter = require('components/filter'); var _filter2 = _interopRequireDefault(_filter); var _button = require('components/utils/button'); var _button2 = _interopRequireDefault(_button); var _list = require('components/list'); var _list2 = _interopRequireDefault(_list); var _search_bar = require('components/search_bar'); var _search_bar2 = _interopRequireDefault(_search_bar); var _horizontal_scrollable_view = require('components/utils/horizontal_scrollable_view'); var _horizontal_scrollable_view2 = _interopRequireDefault(_horizontal_scrollable_view); var _non_exclusive_field_filter = require('components/non_exclusive_field_filter'); var _non_exclusive_field_filter2 = _interopRequireDefault(_non_exclusive_field_filter); var _secondary_actions = require('components/utils/secondary_actions'); var _secondary_actions2 = _interopRequireDefault(_secondary_actions); var _base = require('selectors/base'); var _fields = require('selectors/fields'); var _fields2 = require('common/fields'); var _store = require('common/store'); var _store2 = _interopRequireDefault(_store); var _auto_bind = require('common/auto_bind'); var _auto_bind2 = _interopRequireDefault(_auto_bind); var _request = require('common/request'); var _request2 = _interopRequireDefault(_request); var _persistent_state = require('common/persistent_state'); var _persistent_state2 = _interopRequireDefault(_persistent_state); var _event_system = require('common/event_system'); var _event_system2 = _interopRequireDefault(_event_system); var _utilities = require('common/utilities'); var _display = require('actions/display'); var _fields3 = require('actions/fields'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var cx = _bind2.default.bind(require('styles/filterable_table.scss')); var get_values_with_selection = (0, _utilities.make_persistent)(function (values, selected, locked, existing_values) { var existing_value_ids = {}; existing_values.forEach(function (values) { return values.forEach(function (_ref) { var id = _ref.id; return existing_value_ids[id] = true; }); }); return values.filter(function (_ref2) { var id = _ref2.id; return existing_value_ids[id] || selected[id] || locked[id]; }).map(function (value) { return (0, _extends5.default)({}, value, { selected: selected[value.id], locked: locked[value.id] }); }); }); var compare = function compare(a, b) { var null_values = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; var ascending = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; var is_null = function is_null(c) { return (0, _utilities.array_contains)([null, undefined].concat((0, _toConsumableArray3.default)(null_values)), c, true); }; var a_is_null = is_null(a), b_is_null = is_null(b); if (b_is_null) { if (a_is_null) { return 0; } else { return -1; } } else { if (a_is_null) { return 1; } else { if (a > b) { return ascending ? 1 : -1; } else if (a < b) { return ascending ? -1 : 1; } else { return 0; } } } }; var counter = 0; var FilterableTable = function (_Component) { (0, _inherits3.default)(FilterableTable, _Component); function FilterableTable(props) { (0, _classCallCheck3.default)(this, FilterableTable); var _this = (0, _possibleConstructorReturn3.default)(this, (FilterableTable.__proto__ || (0, _getPrototypeOf2.default)(FilterableTable)).call(this, props)); _this.state = (0, _extends5.default)({ comment_filtered_item_ids: {}, value_filters: {}, order_by: null, order_by_field: null, ascending: true, edit_field_mode: false }, _persistent_state2.default.get(props.persistent_state_key)); (0, _auto_bind2.default)(_this); return _this; } (0, _createClass3.default)(FilterableTable, [{ key: 'componentDidMount', value: function componentDidMount() { this.mounted = true; this.props.get_table_ref(this); this.selected_items_box = 'filterable_table_selected_items_' + counter++; } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { this.mounted = false; _persistent_state2.default.store(this.props.persistent_state_key, this.state); } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(_ref3) { var items = _ref3.items, selected = _ref3.selected; if (items !== this.props.items || selected !== this.props.selected) { _event_system2.default.post(this.selected_items_box, (0, _utilities.array_from_set)(selected).map(function (id) { return items[id]; })); } } }, { key: 'start_edit_field', value: function start_edit_field(field_id) { this.setState({ edit_field_mode: field_id }); } }, { key: 'on_comment_query_change', value: function on_comment_query_change(field_id, query, results) { if (this.mounted && !(0, _base.tolerant_equal)(results, this.state.comment_filtered_item_ids[field_id])) { this.setState({ comment_filtered_item_ids: (0, _extends5.default)({}, this.state.comment_filtered_item_ids, (0, _defineProperty3.default)({}, field_id, results)) }); } } }, { key: 'toggle_filtered_value', value: function toggle_filtered_value(value) { if (this.mounted) { this.setState({ value_filters: (0, _extends5.default)({}, this.state.value_filters, (0, _defineProperty3.default)({}, value.id, !this.state.value_filters[value.id])) }); } } }, { key: 'order_by', value: function order_by(_order_by) { var ascending = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; if (this.mounted) { if (this.state.order_by == _order_by) { this.setState({ ascending: ascending === null ? !this.state.ascending : ascending }); } else { this.setState({ order_by: _order_by, ascending: ascending === null ? true : ascending }); } } } }, { key: 'order_by_comment', value: function order_by_comment(field_id) { if (this.mounted) { if (this.state.order_by == 'comment' && this.state.order_by_field == field_id) { this.setState({ ascending: !this.state.ascending }); } else { this.setState({ order_by: 'comment', order_by_field: field_id, ascending: true }); } } } }, { key: 'get_filtered_item_ids', value: function get_filtered_item_ids() { var _this2 = this; var order = (0, _utilities.map_hash)(this.props.items, function (item) { if (_this2.state.order_by == 'comment') { var comments = _this2.props.fields[_this2.state.order_by_field].comments; return comments[item.id]; } else { return item[_this2.state.order_by]; } }); return (0, _keys2.default)(this.state.comment_filtered_item_ids).reduce(function (filtered_item_ids, field_id) { var results = _this2.state.comment_filtered_item_ids[field_id]; if (results) { var results_set = (0, _utilities.set_from_array)(results); return filtered_item_ids.filter(function (id) { return results_set[id]; }); } else { return filtered_item_ids; } }, [].concat((0, _toConsumableArray3.default)((0, _utilities.array_from_set)(this.state.value_filters)), (0, _toConsumableArray3.default)((0, _utilities.array_from_set)(this.props.locked_values))).reduce(function (filtered_item_ids, value_id) { return filtered_item_ids.filter(_this2.props.filter_value(value_id)); }, this.props.filtered_item_ids)).filter(function (id) { return _this2.props.items[id]; }).sort(function (id1, id2) { return compare(order[id1], order[id2], ["", " "], _this2.state.ascending); }); } }, { key: 'view_selected', value: function view_selected() { var _props = this.props, on_card_click = _props.on_card_click, render_card = _props.render_card; _store2.default.dispatch((0, _display.show_popover)(_selected_items2.default, { on_card_click: on_card_click, render_card: render_card, box: this.selected_items_box }, "")); } }, { key: 'render', value: function render() { var _this3 = this; var _props2 = this.props, actions = _props2.actions, selectable = _props2.selectable, selected = _props2.selected, create_field = _props2.create_field; var fake_state = { fields: this.props }; var fields = (0, _fields.get_fields)(fake_state); var filtered_item_ids = this.get_filtered_item_ids(); var all_selected = (0, _utilities.for_all)(filtered_item_ids, function (id) { return _this3.props.selected[id]; }); var secondary_actions_active = (0, _utilities.array_sum)(actions.map(function (_ref4) { var badge = _ref4.badge; return badge || 0; })); return _react2.default.createElement( 'div', { className: cx('filterable-table', { 'filterable-table_selectable': this.props.selectable }) }, this.props.title ? _react2.default.createElement( 'div', { className: cx('filterable-table__top') }, _react2.default.createElement( 'div', { className: cx('filterable-table__top-title') }, this.props.title ), _react2.default.createElement( 'div', { className: cx('filterable-table__top-actions') }, (0, _utilities.empty_set)(selected) ? null : _react2.default.createElement( _stylesReact.ItemsCounter, { onClick: this.view_selected }, _react2.default.createElement( _stylesReact.Count, null, (0, _utilities.set_count)(selected) ), _react2.default.createElement(_md.MdPerson, null) ), actions.length > 0 ? _react2.default.createElement( _secondary_actions2.default, { active: secondary_actions_active }, actions ) : null, this.props.main_action ? _react2.default.createElement(_button2.default, this.props.main_action) : null ) ) : null, _react2.default.createElement( _horizontal_scrollable_view2.default, null, _react2.default.createElement( 'div', { className: cx('filterable-table__main') }, _react2.default.createElement( 'div', { className: cx('filterable-table__header') }, this.props.selectable ? _react2.default.createElement( 'div', { className: cx('filterable-table__all-items') }, _react2.default.createElement( 'div', { className: cx('filterable-table__items-count') }, filtered_item_ids.length ), _react2.default.createElement( 'div', { className: cx('filterable-table__select-all-checkbox', { 'filterable-table__select-all-checkbox_selected': all_selected }), onClick: function onClick() { return _this3.props.on_select_all(filtered_item_ids); } }, all_selected ? _react2.default.createElement(_md.MdCheckBox, null) : _react2.default.createElement(_md.MdCheckBoxOutlineBlank, null) ) ) : null, _react2.default.createElement( 'div', { className: cx('filterable-table__card-header') }, this.props.children ), _react2.default.createElement( 'div', { className: cx('filterable-table__fields-header') }, fields.map(function (field) { var props = { key: field.id, id: field.id, name: field.name }; switch (field.category) { case 'non_exclusive': return _react2.default.createElement(_non_exclusive_field_filter2.default, (0, _extends5.default)({}, props, { values: get_values_with_selection(field.values, _this3.state.value_filters, _this3.props.locked_values, filtered_item_ids.map(function (item_id) { return _this3.props.get_item_field_values(item_id, field.id); })), toggle_filtered_value: _this3.toggle_filtered_value, className: cx('filterable-table__filter_field'), stop_recycling: function stop_recycling() { return _this3.props.stop_recycling(field.id); } })); case 'comment': return _react2.default.createElement(CommentFieldFilter, (0, _extends5.default)({}, props, { comments: (0, _keys2.default)(field.comments).map(function (id) { return { id: id, comment: field.comments[id] }; }), default_results: (0, _keys2.default)(_this3.props.items), on_query_change: function on_query_change(query, results) { return _this3.on_comment_query_change(field.id, query, results); }, sort_items: function sort_items() { return _this3.order_by_comment(field.id); } })); case 'file': return _react2.default.createElement(FileFieldFilter, props); default: return null; } }), this.props.editable && create_field ? _react2.default.createElement( _button2.default, { icon: _md.MdAddCircle, onClick: create_field, discreet: true, className: cx('filterable-table__add-field-button') }, 'Nouveau Champ' ) : null ) ), _react2.default.createElement( 'div', { className: cx('filterable-table__rows') }, _react2.default.createElement( _list2.default, { item_height: 60 }, filtered_item_ids.map(function (id) { return _react2.default.createElement(Item, { key: id, item: _this3.props.items[id], fields: fields, get_item_field_values: _this3.props.get_item_field_values, add_value: function add_value(value_id) { return _this3.props.add_value(id, value_id); }, remove_value: function remove_value(value_id) { return _this3.props.remove_value(id, value_id); }, update_comment: function update_comment(field_id, comment) { return _this3.props.update_comment(id, field_id, comment); }, editable: _this3.props.editable, selectable: _this3.props.selectable, selected: _this3.props.selected[id], render_card: _this3.props.render_card, on_card_click: function on_card_click() { return _this3.props.on_card_click(id); }, item_type: _this3.props.item_type }); }) ) ) ) ) ); } }]); return FilterableTable; }(_react.Component); var Item = function (_Component2) { (0, _inherits3.default)(Item, _Component2); function Item() { (0, _classCallCheck3.default)(this, Item); return (0, _possibleConstructorReturn3.default)(this, (Item.__proto__ || (0, _getPrototypeOf2.default)(Item)).apply(this, arguments)); } (0, _createClass3.default)(Item, [{ key: 'shouldComponentUpdate', value: function shouldComponentUpdate(props) { return props.item !== this.props.item || props.fields !== this.props.fields || props.selected !== this.props.selected; } }, { key: 'render', value: function render() { var _this5 = this; return _react2.default.createElement( 'div', { className: cx('filterable-table__item') }, _react2.default.createElement( 'div', { className: cx('filterable-table__card', { 'filterable-table__card_selected': this.props.selected }), onClick: this.props.on_card_click }, this.props.render_card(this.props.item) ), this.props.fields.map(function (field) { var props = (0, _extends5.default)({ key: field.id }, field, { editable: _this5.props.editable, edit_mode: 'click', show_label: false }); switch (field.category) { case "non_exclusive": return _react2.default.createElement(ItemNonExclusiveField, (0, _extends5.default)({}, props, { selected_values: _this5.props.get_item_field_values(_this5.props.item.id, field.id), add_value: _this5.props.add_value, remove_value: _this5.props.remove_value, allow_creating_values: (0, _fields2.allow_creating_value)(_this5.props.item_type, field) })); case "comment": return _react2.default.createElement(ItemCommentField, (0, _extends5.default)({}, props, { comment: field.comments[_this5.props.item.id], update_comment: function update_comment(comment) { return _this5.props.update_comment(field.id, comment); } })); case "file": return _react2.default.createElement(ItemFileField, (0, _extends5.default)({}, props, { file: field.files[_this5.props.item.id], user_id: _this5.props.item.id })); default: return null; } }), _react2.default.createElement('div', { key: 'dummy1', className: cx('filterable-table__field') }), _react2.default.createElement('div', { key: 'dummy2', className: cx('filterable-table__field') }) ); } }]); return Item; }(_react.Component); var ItemNonExclusiveField = function ItemNonExclusiveField(props) { return _react2.default.createElement( 'div', { className: cx('filterable-table__field') }, _react2.default.createElement(_non_exclusive_field2.default, (0, _extends5.default)({}, props, { ellipsis: 3, value_ellipsis: 65, field_ellipsis: 150, on_select_value: props.add_value, on_deselect_value: props.remove_value, create_value: function create_value(value_name) { return new _promise2.default(function (resolve, reject) { var characters = value_name.split(""); if ((0, _utilities.array_contains)(characters, ',') || (0, _utilities.array_contains)(characters, ';')) { _store2.default.dispatch((0, _display.alert_failure)('Les caract\xE8res \',\' et \';\' sont interdits dans le nom d\'une valeur.')); reject(); } else { (0, _fields2.action_create_value)(props.id, value_name).then(resolve); } }); } })) ); }; var ItemCommentField = function ItemCommentField(props) { return _react2.default.createElement( 'div', { className: cx('filterable-table__field') }, _react2.default.createElement(_comment_field2.default, (0, _extends5.default)({}, props, { comment_ellipsis: 300, on_submit_comment: props.update_comment })) ); }; var ItemFileField = function ItemFileField(props) { return _react2.default.createElement( 'div', { className: cx('filterable-table__field') }, _react2.default.createElement(_file_field2.default, props) ); }; var CommentFieldFilter = function (_Component3) { (0, _inherits3.default)(CommentFieldFilter, _Component3); function CommentFieldFilter(props) { (0, _classCallCheck3.default)(this, CommentFieldFilter); var _this6 = (0, _possibleConstructorReturn3.default)(this, (CommentFieldFilter.__proto__ || (0, _getPrototypeOf2.default)(CommentFieldFilter)).call(this, props)); _this6.state = { active: false }; _this6.on_query_change = _this6.on_query_change.bind(_this6); return _this6; } (0, _createClass3.default)(CommentFieldFilter, [{ key: 'on_query_change', value: function on_query_change(query, results) { if (this.state.active == (query == "")) { this.setState({ active: !this.state.active }); } this.props.on_query_change(query, results); } }, { key: 'render', value: function render() { var _this7 = this; return _react2.default.createElement( _filter2.default, { className: cx('filterable-table__filter', 'filterable-table__filter_field'), active: this.state.active, label: this.props.name, onClick: this.props.sort_items }, _react2.default.createElement(_search_bar2.default, { ref: function ref(search_bar) { return _this7.search_bar = search_bar; }, className: cx('filterable-table__filter-search-bar'), extend: false, make_fuse: _fields2.new_comments_fuse, items: this.props.comments, default_results: this.props.default_results, on_query_change: this.on_query_change }) ); } }]); return CommentFieldFilter; }(_react.Component); var FileFieldFilter = function FileFieldFilter(_ref5) { var name = _ref5.name; return _react2.default.createElement(_filter2.default, { className: cx('filterable-table__filter', 'filterable-table__filter_field'), active: false, label: name }); }; FilterableTable.defaultProps = { items: {}, fields: {}, values: {}, on_card_click: function on_card_click(item_id) {}, editable: true, selectable: false, shareable_with_users: false, selected: {}, locked_values: {}, on_select_all: function on_select_all(filtered_item_ids) {}, get_item_field_values: function get_item_field_values(item_id, field_id) { return null; }, filter_value: function filter_value(value_id) { return function (id) { return true; }; }, actions: [], get_table_ref: function get_table_ref(table) {}, item_type: null, persistent_state_key: "" }; exports.default = FilterableTable;