UNPKG

instantjob-recruiter-client

Version:

a set of tools for creating an instantjob recruiter react client

708 lines (599 loc) 22.3 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.Field = undefined; var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray'); var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); var _promise = require('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); 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 _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _bind = require('classnames/bind'); var _bind2 = _interopRequireDefault(_bind); var _md = require('react-icons/lib/md'); var _reactDropzone = require('react-dropzone'); var _reactDropzone2 = _interopRequireDefault(_reactDropzone); var _file_dropzone = require('./file_dropzone'); var _file_dropzone2 = _interopRequireDefault(_file_dropzone); var _time_ago = require('components/utils/time_ago'); var _time_ago2 = _interopRequireDefault(_time_ago); var _progress_indicator = require('./progress_indicator'); var _progress_indicator2 = _interopRequireDefault(_progress_indicator); var _constants = require('../common/constants'); var _event_system = require('../common/event_system'); var _event_system2 = _interopRequireDefault(_event_system); var _auto_bind = require('../common/auto_bind'); var _auto_bind2 = _interopRequireDefault(_auto_bind); var _utilities = require('../common/utilities'); var _base = require('../reducers/base'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var cx = _bind2.default.bind(require('../styles/user_profile.scss')); var value_width = 200; function field_is_empty(_ref) { var category = _ref.category, values = _ref.values, comment = _ref.comment, file = _ref.file, value = _ref.value; switch (category) { case 'comment': return !comment; case 'non_exclusive': return (0, _utilities.empty_array)(values.filter((0, _utilities.property_getter)('selected'))); case 'file': return !file; case 'exclusive': return !value; } } var add_empty_property_to_field = function add_empty_property_to_field(field) { return (0, _extends3.default)({}, field, { empty: field_is_empty(field) }); }; var UserProfile = function (_Component) { (0, _inherits3.default)(UserProfile, _Component); function UserProfile(props) { (0, _classCallCheck3.default)(this, UserProfile); var _this = (0, _possibleConstructorReturn3.default)(this, (UserProfile.__proto__ || (0, _getPrototypeOf2.default)(UserProfile)).call(this, props)); _this.state = (0, _extends3.default)({}, props.user, { progress: 0 }); _this.render_agency = _this.render_agency.bind(_this); return _this; } (0, _createClass3.default)(UserProfile, [{ key: 'componentDidMount', value: function componentDidMount() { var _this2 = this; setTimeout(function () { return _this2.setState({ progress: 6 }); }, 500); } }, { key: 'render_agency', value: function render_agency(agency) { var _this3 = this; var fields = agency.fields.map(function (_ref2) { var id = _ref2.id; return _this3.agency_fields[id]; }).filter(Boolean); if (!(0, _utilities.empty_array)(fields)) { return _react2.default.createElement(Agency, (0, _extends3.default)({}, agency, { fields: fields, key: agency.id })); } else { return _react2.default.createElement('div', { key: agency.id }); } } }, { key: 'render', value: function render() { var _this4 = this; var agencies = this.props.agencies; var instant_job_fields = _constants.instant_job_users_fields.map(function (field) { return (0, _extends3.default)({}, field, { comment: _this4.state[field.id] || "", update: function update(comment) { _this4.setState((0, _defineProperty3.default)({}, field.id, comment)); return _this4.props.update_instant_job_field(field.id, comment); } }); }).map(add_empty_property_to_field); this.agency_fields = (0, _utilities.hash_with_key)((0, _utilities.flatten_array)(this.props.agencies.map((0, _utilities.property_getter)('fields'))).map(add_empty_property_to_field).filter(function (_ref3) { var category = _ref3.category, values = _ref3.values; return category != 'non_exclusive' || !(0, _utilities.empty_array)(values); })); var progress_fields = [].concat((0, _toConsumableArray3.default)(instant_job_fields), (0, _toConsumableArray3.default)((0, _utilities.array_from_hash)(this.agency_fields))).filter(function (_ref4) { var locked = _ref4.locked; return !locked; }); return _react2.default.createElement( 'div', { className: cx('user-profile') }, _react2.default.createElement( 'div', { className: cx('user-profile__header') }, _react2.default.createElement( 'div', { className: cx('user-profile__header-title') }, 'Votre profil' ), _react2.default.createElement(_progress_indicator2.default, { completed: progress_fields.filter(function (_ref5) { var empty = _ref5.empty; return !empty; }).length, total: progress_fields.length, text: 'Compl\xE9t\xE9 \xE0 ##%' }) ), _react2.default.createElement(Agency, { key: 'instantjob', title: "Informations InstantJob", subtitle: "Ces informations seront partagées avec l'ensemble des employeurs avec qui vous avez choisi de travailler.", fields: instant_job_fields }), agencies.map(this.render_agency) ); } }]); return UserProfile; }(_react.Component); UserProfile.defaultProps = { agencies: [], user: {}, update_field: function update_field() { return new _promise2.default(function (resolve, reject) { return resolve(); }); }, update_instant_job_field: function update_instant_job_field() { return new _promise2.default(function (resolve, reject) { return resolve(); }); } }; var Agency = function (_Component2) { (0, _inherits3.default)(Agency, _Component2); function Agency(props) { (0, _classCallCheck3.default)(this, Agency); var _this5 = (0, _possibleConstructorReturn3.default)(this, (Agency.__proto__ || (0, _getPrototypeOf2.default)(Agency)).call(this, props)); _this5.render_field = _this5.render_field.bind(_this5); return _this5; } (0, _createClass3.default)(Agency, [{ key: 'render_field', value: function render_field(field) { return _react2.default.createElement(Field, (0, _extends3.default)({}, field, { key: field.id })); } }, { key: 'render', value: function render() { var _props = this.props, fields = _props.fields, title = _props.title, name = _props.name, subtitle = _props.subtitle; return _react2.default.createElement( 'div', { className: cx('user-profile__agency') }, _react2.default.createElement( 'div', { className: cx('user-profile__agency-header') }, _react2.default.createElement( 'div', { className: cx('user-profile__agency-header-title') }, name ? 'Informations pour ' + name : title ), _react2.default.createElement( 'div', { className: cx('user-profile__agency-header-subtitle') }, subtitle || "Ces informations sont demandées spécifiquement par cet employeur et ne sont pas partagées avec vos autrs employeurs." ) ), fields.map(this.render_field) ); } }]); return Agency; }(_react.Component); var Field = exports.Field = function (_Component3) { (0, _inherits3.default)(Field, _Component3); function Field(props) { (0, _classCallCheck3.default)(this, Field); var _this6 = (0, _possibleConstructorReturn3.default)(this, (Field.__proto__ || (0, _getPrototypeOf2.default)(Field)).call(this, props)); _this6.state = { synchronisations: {}, synchronized: true }; _this6.idGenerator = 1, _this6.render_indicator = _this6.render_indicator.bind(_this6); _this6.render_content = _this6.render_content.bind(_this6); return _this6; } (0, _createClass3.default)(Field, [{ key: 'render_indicator', value: function render_indicator() { var state = void 0, icon = void 0; var _props2 = this.props, locked = _props2.locked, empty = _props2.empty; var synchronized = (0, _utilities.empty_set)(this.state.synchronisations); if (locked) { state = 'locked'; icon = _react2.default.createElement(_md.MdLock, null); } else if (!synchronized) { state = 'synchronizing'; icon = _react2.default.createElement(_md.MdCached, null); } else if (empty) { state = 'empty'; } else { state = 'synchronized'; icon = _react2.default.createElement(_md.MdDone, null); } return _react2.default.createElement( 'div', { className: cx('user-profile__field-header-indicator', 'user-profile__field-header-indicator_' + state) }, icon ); } }, { key: 'render_content', value: function render_content() { var _this7 = this; var field = this.props; var props = (0, _extends3.default)({}, field, { update: function update() { var synchronisation_id = _this7.idGenerator++; var toggle_synchronisation = function toggle_synchronisation() { return _this7.setState((0, _base.toggle_item_id)(_this7.state, "synchronisations", synchronisation_id)); }; toggle_synchronisation(); field.update.apply(field, arguments).then(toggle_synchronisation); } }); switch (field.category) { case 'comment': return _react2.default.createElement(CommentField, props); case 'non_exclusive': return _react2.default.createElement(NonExclusiveField, props); case 'file': return _react2.default.createElement(FileField, props); case 'exclusive': return _react2.default.createElement(ExclusiveField, props); } } }, { key: 'render', value: function render() { var name = this.props.name; return _react2.default.createElement( 'div', { className: cx('user-profile__field') }, _react2.default.createElement( 'div', { className: cx('user-profile__field-header') }, name, this.render_indicator() ), this.render_content() ); } }]); return Field; }(_react.Component); var CommentField = function (_Component4) { (0, _inherits3.default)(CommentField, _Component4); function CommentField(props) { (0, _classCallCheck3.default)(this, CommentField); var _this8 = (0, _possibleConstructorReturn3.default)(this, (CommentField.__proto__ || (0, _getPrototypeOf2.default)(CommentField)).call(this, props)); _this8.state = { comment: props.comment, focused: false }; _this8.onFocus = _this8.onFocus.bind(_this8); _this8.onChange = _this8.onChange.bind(_this8); _this8.onBlur = _this8.onBlur.bind(_this8); return _this8; } (0, _createClass3.default)(CommentField, [{ key: 'onFocus', value: function onFocus() { this.setState({ focused: true }); this.initial_comment = this.state.comment; } }, { key: 'onChange', value: function onChange(_ref6) { var comment = _ref6.target.value; if (!this.state.focused && comment != this.state.comment) { this.props.update(comment); } this.setState({ comment: comment }); } }, { key: 'onBlur', value: function onBlur() { this.setState({ focused: false }); if (this.state.comment != this.initial_comment) { this.props.update(this.state.comment); } } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(_ref7) { var comment = _ref7.comment; if (comment != this.state.comment && !this.state.focused) { this.setState({ comment: comment }); } } }, { key: 'render', value: function render() { var _state = this.state, comment = _state.comment, focused = _state.focused; var className = cx('user-profile__field-input', { 'user-profile__field-input_empty': !comment, 'user-profile__field-input_focused': focused }); if (this.props.locked) { return _react2.default.createElement( 'div', { className: className }, comment ); } else { return _react2.default.createElement('input', { className: className, type: 'text', value: comment || "", onFocus: this.onFocus, onChange: this.onChange, onBlur: this.onBlur }); } } }]); return CommentField; }(_react.Component); CommentField.defaultProps = { comment: "" }; var NonExclusiveField = function (_Component5) { (0, _inherits3.default)(NonExclusiveField, _Component5); function NonExclusiveField(props) { (0, _classCallCheck3.default)(this, NonExclusiveField); var _this9 = (0, _possibleConstructorReturn3.default)(this, (NonExclusiveField.__proto__ || (0, _getPrototypeOf2.default)(NonExclusiveField)).call(this, props)); _this9.state = { width: 500 }; _this9.update_width = _this9.update_width.bind(_this9); _this9.render_value = _this9.render_value.bind(_this9); _this9.toggle_value = _this9.toggle_value.bind(_this9); return _this9; } (0, _createClass3.default)(NonExclusiveField, [{ key: 'componentDidMount', value: function componentDidMount() { this.update_width(); this.cancel_update_width = _event_system2.default.register("window_resize", this.update_width); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { this.cancel_update_width(); } }, { key: 'update_width', value: function update_width() { var width = $(this.values_container).width(); if (width != this.state.width) { this.setState({ width: width }); } } }, { key: 'toggle_value', value: function toggle_value(index) { var _this10 = this; return function () { var _props3 = _this10.props, values = _props3.values, update = _props3.update; update([].concat((0, _toConsumableArray3.default)(values.slice(0, index)), [(0, _utilities.property_toggler)('selected')(values[index])], (0, _toConsumableArray3.default)(values.slice(index + 1)))); }; } }, { key: 'render_value', value: function render_value(width) { var _this11 = this; return function (_ref8, index) { var id = _ref8.id, name = _ref8.name, selected = _ref8.selected; return _react2.default.createElement( 'div', { onClick: _this11.toggle_value(index), key: id, className: cx('user-profile__field-values-value', { 'user-profile__field-values-value_selected': selected }), style: { width: width } }, _react2.default.createElement( 'div', { className: cx('user-profile__field-values-value-outline') }, _react2.default.createElement( 'div', { className: cx('user-profile__field-values-value-name') }, name ), _react2.default.createElement( 'div', { className: cx('user-profile__field-values-value-icon') }, selected ? _react2.default.createElement(_md.MdDone, null) : null ) ) ); }; } }, { key: 'render', value: function render() { var _this12 = this; var available_width = this.state.width; var columns_number = Math.floor(available_width / value_width) || 1; var width = 100 / columns_number + '%'; var values = this.props.values; return _react2.default.createElement( 'div', { ref: function ref(values_container) { return _this12.values_container = values_container; }, className: cx('user-profile__field-values') }, values.map(this.render_value(width)) ); } }]); return NonExclusiveField; }(_react.Component); var FileField = function (_Component6) { (0, _inherits3.default)(FileField, _Component6); function FileField(props) { (0, _classCallCheck3.default)(this, FileField); var _this13 = (0, _possibleConstructorReturn3.default)(this, (FileField.__proto__ || (0, _getPrototypeOf2.default)(FileField)).call(this, props)); (0, _auto_bind2.default)(_this13); return _this13; } (0, _createClass3.default)(FileField, [{ key: 'on_files_drop', value: function on_files_drop(_ref9) { var _ref10 = (0, _slicedToArray3.default)(_ref9, 1), file = _ref10[0]; this.props.update(file); } }, { key: 'view', value: function view() { var _props$file = this.props.file, url = _props$file.url, name = _props$file.name; (0, _utilities.download_file)(url, name); } }, { key: 'render', value: function render() { var file = this.props.file; if (file) { if (file.uploading) { return _react2.default.createElement(_progress_indicator2.default, { small: true, className: cx('user-profile__field-dropzone'), completed: file.uploading, total: 100, text: '##%' }); } else { var updated_at = file.updated_at, url = file.url; return _react2.default.createElement( 'div', { className: cx('user-profile__field-file') }, _react2.default.createElement( 'div', { onClick: this.view, className: cx('user-profile__field-file-preview') }, _react2.default.createElement(_md.MdInsertDriveFile, null) ), _react2.default.createElement( 'div', { className: cx('user-profile__field-file-updated-at') }, 'Mis \xE0 jour ', _react2.default.createElement( _time_ago2.default, null, updated_at ) ), _react2.default.createElement( _reactDropzone2.default, { style: {}, onDrop: this.on_files_drop }, _react2.default.createElement( 'div', { className: cx('user-profile__field-file-update') }, 'Choisir un autre fichier' ) ) ); } } else { return _react2.default.createElement( 'div', { className: cx('user-profile__field-dropzone') }, _react2.default.createElement( _file_dropzone2.default, { on_files_drop: this.on_files_drop }, 'D\xE9poser un fichier' ) ); } } }]); return FileField; }(_react.Component); var ExclusiveField = function (_Component7) { (0, _inherits3.default)(ExclusiveField, _Component7); function ExclusiveField(props) { (0, _classCallCheck3.default)(this, ExclusiveField); var _this14 = (0, _possibleConstructorReturn3.default)(this, (ExclusiveField.__proto__ || (0, _getPrototypeOf2.default)(ExclusiveField)).call(this, props)); (0, _auto_bind2.default)(_this14); return _this14; } (0, _createClass3.default)(ExclusiveField, [{ key: 'update', value: function update(values) { var _this15 = this; var selected_value_id = this.get_selected_value_id(); values.forEach(function (value) { if (value.id == selected_value_id && !value.selected) { return _this15.props.update(null); } if (value.selected && value.id != selected_value_id) { return _this15.props.update(value); } }); return new _promise2.default(function (resolve, reject) { return resolve(); }); } }, { key: 'get_selected_value_id', value: function get_selected_value_id() { var value = this.props.value; var _ref11 = value || {}, id = _ref11.id; return id; } }, { key: 'render', value: function render() { var values = this.props.values; var selected_value_id = this.get_selected_value_id(); return _react2.default.createElement(NonExclusiveField, { values: values.map(function (value) { return (0, _extends3.default)({}, value, { selected: value.id == selected_value_id }); }), update: this.update }); } }]); return ExclusiveField; }(_react.Component); exports.default = UserProfile;