UNPKG

instantjob-recruiter-client

Version:

a set of tools for creating an instantjob recruiter react client

533 lines (477 loc) 22.6 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.get_proposals = exports.get_user_deals = exports.get_mission_proposals = exports.get_default_deal = exports.get_displayed_deals = exports.get_deals = exports.get_initially_selected_recruiters = exports.get_mission_users = exports.get_user_missions_events = exports.get_user_missions = exports.get_missions = undefined; var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties'); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _extends3 = require('babel-runtime/helpers/extends'); var _extends4 = _interopRequireDefault(_extends3); var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); exports.deal_status = deal_status; var _base = require('selectors/base'); var _calendar = require('selectors/calendar'); var _users = require('selectors/users'); var _recruiters = require('selectors/recruiters'); var _fields = require('selectors/fields'); var _moment = require('common/moment'); var _moment2 = _interopRequireDefault(_moment); var _utilities = require('common/utilities'); var _missions = require('common/missions'); var _workplaces = require('common/workplaces'); var _calendar2 = require('common/calendar'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var get_raw_deals = function get_raw_deals(state) { return state.missions.deals; }; var get_raw_missions = function get_raw_missions(state) { return state.missions.missions; }; var get_raw_events = function get_raw_events(state) { return state.missions.events; }; var get_raw_mission_users = function get_raw_mission_users(state) { return state.missions.users; }; var get_raw_workplaces = function get_raw_workplaces(state) { return state.missions.workplaces; }; var get_raw_users = function get_raw_users(state) { return state.users.users; }; var get_profile_id = function get_profile_id(state) { return state.profile.id; }; var get_raw_agency = function get_raw_agency(state) { return state.profile.agency; }; var get_raw_values = function get_raw_values(state) { return state.fields.values; }; var get_raw_fields = function get_raw_fields(state) { return state.fields.fields; }; var get_missions = exports.get_missions = (0, _base.tolerant_selector)([get_raw_missions, get_raw_mission_users, get_raw_events, get_raw_workplaces, _users.get_users, _fields.get_fields, _fields.get_fields_by_mission, get_raw_agency], function (missions, mission_users, events, workplaces, users, fields, fields_by_mission, _ref) { var workplace_shared_with_user = _ref.workplace_shared_with_user; var day_events_by_mission = {}; var hour_events_by_mission = {}; var not_full_days = {}; var start = {}; var end = {}; (0, _utilities.array_from_hash)(events).forEach(function (e) { if (!e.deleted_at) { var events_by_mission = void 0; if (e.full_days) { events_by_mission = day_events_by_mission; } else { not_full_days[e.calenderable_id] = true; events_by_mission = hour_events_by_mission; } events_by_mission[e.calenderable_id] = [].concat((0, _toConsumableArray3.default)(events_by_mission[e.calenderable_id] || []), [e]); if (!start[e.calenderable_id] || (0, _moment2.default)(e.start).isBefore(start[e.calenderable_id])) { start[e.calenderable_id] = e.start; } if (!end[e.calenderable_id] || (0, _moment2.default)(e.end).isAfter(end[e.calenderable_id])) { end[e.calenderable_id] = e.end; } } }); var allowed_users_statuses = (0, _utilities.set_from_array)(["active", "mail", "pending"]); return (0, _utilities.map_hash)(missions, function (mission) { var _mission = mission, id = _mission.id, users_count = _mission.users_count, workplace_id = _mission.workplace_id, recruiter_id = _mission.recruiter_id; var users_status = mission_users[id] || {}; var grouped_users_status = (0, _utilities.group_hash_by_value)(users_status, ['new', 'accepted', 'rejected', 'assigned', 'impossible']); grouped_users_status.available = (0, _keys2.default)(users).filter(function (user_id) { return !users_status[user_id]; }).filter(function (user_id) { return users[user_id] && allowed_users_statuses[users[user_id].status.status]; }); var status = mission_status((0, _extends4.default)({}, mission, { grouped_users_status: grouped_users_status })); var assigned_count = grouped_users_status.assigned.length; var accepted_count = grouped_users_status.accepted.length; var day_events = day_events_by_mission[id] || []; var hour_events = hour_events_by_mission[id] || []; var fields = (0, _utilities.array_from_hash)(fields_by_mission[id] || {}).map(function (field) { var shared_with_user = field.shared_with_user; if (shared_with_user) { return (0, _extends4.default)({}, field, (0, _utilities.create_hash)(["on_select_value", "on_deselect_value", "on_clear", "on_submit_comment"], function (action) { return function () { (0, _missions.action_notify_updated_mission)(mission.id); return field[action].apply(field, arguments); }; })); } return field; }); mission = (0, _extends4.default)({}, mission, { status: status, sent: status != 'draft', day_events: day_events, hour_events: hour_events, events: [].concat((0, _toConsumableArray3.default)(day_events), (0, _toConsumableArray3.default)(hour_events)), grouped_users_status: grouped_users_status, users_status: users_status, workplace: workplaces[workplace_id] || {}, full_days: !not_full_days[id], start: start[id], end: end[id], assigned_count: assigned_count, accepted_count: accepted_count, empty_count: mission.users_count - assigned_count, waiting_count: grouped_users_status.new.length, fields: fields }); return (0, _extends4.default)({}, mission, { update: function update(new_mission) { (0, _missions.action_update_mission)(mission, (0, _extends4.default)({ id: id }, new_mission)); }, cancel: function cancel() { (0, _missions.action_cancel_mission)(mission); }, create_workplace: function create_workplace(workplace_name) { return (0, _workplaces.action_create_workplace)(workplace_name); }, set_workplace: function set_workplace(workplace_id) { (0, _missions.action_notify_updated_mission)(mission.id); (0, _missions.action_update_mission)(mission, { id: id, workplace_id: workplace_id }); }, update_events: function update_events(events) { (0, _missions.action_notify_updated_mission)(mission.id); return (0, _missions.action_update_mission_events)(mission.id, events); }, send: function send(user_ids) { return (0, _missions.action_send_mission)(mission, user_ids); }, assign: function assign(user_ids) { return (0, _missions.action_assign_mission)(mission, user_ids); }, unassign: function unassign(user_ids) { return (0, _missions.action_unassign_mission)(mission, user_ids); }, toggle_publish: function toggle_publish() { return (0, _missions.action_toggle_publish_mission)(mission); }, cancel_update_notification: function cancel_update_notification() { return (0, _missions.action_cancel_notify_updated_mission)(mission); } }); }); }); function mission_status(_ref2) { var grouped_users_status = _ref2.grouped_users_status, users_count = _ref2.users_count, published = _ref2.published; if (grouped_users_status.assigned.length >= users_count) { return "assigned"; } else if ((0, _utilities.for_all)(["new", "rejected", "assigned", "accepted"], function (status) { return grouped_users_status[status].length == 0; }) && !published) { return "draft"; } else if (grouped_users_status.new.length + grouped_users_status.accepted.length + grouped_users_status.assigned.length < users_count && !published) { return "pending_selection"; } else if (grouped_users_status.accepted.length > 0) { return "pending_assignement"; } else { return "sent"; } } var make_mission_periods = function make_mission_periods(mission) { return (0, _calendar2.make_periods)(mission.events).map(function (period) { return (0, _extends4.default)({}, period, { mission_start: mission.start, mission_end: mission.end, mission_status: mission.status, mission_workplace: mission.workplace, mission_id: mission.id }); }); }; var get_user_missions = exports.get_user_missions = (0, _utilities.make_memoized)(function (user_id) { return (0, _base.tolerant_selector)([get_mission_proposals], function (missions) { var user_missions = (0, _utilities.filter_hash)(missions, function (mission) { return mission.users_status[user_id]; }); return (0, _utilities.array_from_hash)(user_missions).map(function (mission) { return (0, _extends4.default)({}, mission, { user_status: mission.users_status[user_id], periods: make_mission_periods(mission) // deprecated, do not use }); }).filter(function (_ref3) { var user_status = _ref3.user_status; return (0, _utilities.set_from_array)(["new", "accepted", "rejected", "assigned"])[user_status]; }); }); }); var get_user_missions_events = exports.get_user_missions_events = (0, _utilities.make_memoized)(function (user_id) { return (0, _base.tolerant_selector)([get_user_missions(user_id)], function (missions) { return (0, _utilities.flatten_array)(missions.map((0, _utilities.property_getter)('events'))); }); }); var get_mission_users = exports.get_mission_users = (0, _utilities.make_memoized)(function (mission_id, status) { return (0, _base.tolerant_selector)([get_missions, _users.get_users, _fields.get_mission_values_by_mission, _fields.get_values_by_field, get_raw_values, get_raw_fields], function (missions, users, mission_values_by_mission, values_by_field, values, fields) { var _ref4 = missions[mission_id] || {}, grouped_users_status = _ref4.grouped_users_status; if (grouped_users_status) { var user_ids_set = (0, _utilities.set_from_array)(grouped_users_status[status]); if (status == "available") { var accepted_values = {}; mission_values_by_mission[mission_id].forEach(function (value_id) { var field_id = values[value_id].field_id; var _fields$field_id = fields[field_id], for_entity = _fields$field_id.for_entity, category = _fields$field_id.category, recycled = _fields$field_id.recycled; if (for_entity == 'User' && recycled) { if (category == 'non_exclusive') { user_ids_set = (0, _utilities.set_intersection)(user_ids_set, values[value_id].entity_ids); } else if (category == 'exclusive') { accepted_values[field_id] = (0, _extends4.default)({}, accepted_values[field_id] || {}, (0, _defineProperty3.default)({}, value_id, true)); } } }); (0, _utilities.array_from_hash)(fields).forEach(function (_ref5) { var id = _ref5.id, category = _ref5.category, for_entity = _ref5.for_entity, recycled = _ref5.recycled, value_id_for = _ref5.value_id_for; if (for_entity == 'User' && recycled && category == 'exclusive') { var _values = accepted_values[id]; if (_values) { user_ids_set = (0, _utilities.filter_set)(user_ids_set, function (user_id) { return _values[value_id_for[user_id]]; }); } } }); } return (0, _utilities.filter_hash)(users, function (_ref6) { var id = _ref6.id, status = _ref6.status.status; return user_ids_set[id] && status != 'applied'; }); } else { return {}; } }); }); var get_initially_selected_recruiters = exports.get_initially_selected_recruiters = (0, _base.tolerant_selector)([_recruiters.get_recruiters, get_profile_id], function (recruiters, profile_id) { if (profile_id) { var _ref7 = recruiters[profile_id] || {}, team_id = _ref7.team_id, administrator = _ref7.administrator; if (administrator) { return []; } else if (team_id) { return (0, _utilities.array_from_hash)(recruiters).filter(function (_ref8) { var id = _ref8.team_id; return id == team_id; }).map((0, _utilities.property_getter)('id')); } else { return [profile_id]; } } else { return []; } }); var get_deals = (0, _base.tolerant_selector)([get_raw_deals, get_missions, get_raw_workplaces, _recruiters.get_recruiters, _fields.get_mission_fields_by_deal, _fields.get_fields_by_deal], function (deals, all_missions, workplaces, recruiters, mission_fields_by_deal, fields_by_deal) { var template_mission_ids = (0, _utilities.set_from_hash)((0, _utilities.map_hash)(deals, (0, _utilities.property_getter)('template_mission_id'))); var missions_by_deal = (0, _utilities.split_array)((0, _utilities.array_from_hash)((0, _utilities.filter_hash)(all_missions, function (_ref9) { var id = _ref9.id, deleted_at = _ref9.deleted_at; return !deleted_at && !template_mission_ids[id]; })), (0, _utilities.property_getter)('deal_id'), (0, _keys2.default)(deals)); return (0, _utilities.map_hash)(deals, function (deal) { var _deal = deal, id = _deal.id, template_mission_id = _deal.template_mission_id, custom_field_ids = _deal.custom_field_ids, has_custom_events = _deal.has_custom_events, has_custom_workplace = _deal.has_custom_workplace, recruiter_id = _deal.recruiter_id; function filter_fields(_ref10) { var keep_custom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var fields = _ref10.fields, mission = (0, _objectWithoutProperties3.default)(_ref10, ['fields']); return (0, _extends4.default)({}, mission, { fields: (fields || []).filter(function (_ref11) { var id = _ref11.id, category = _ref11.category; return Boolean(keep_custom) == Boolean(custom_field_ids[id] || category == 'computed'); }) }); } function add_deals_fields(_ref12) { var fields = _ref12.fields, mission = (0, _objectWithoutProperties3.default)(_ref12, ['fields']); return (0, _extends4.default)({}, mission, { fields: [].concat((0, _toConsumableArray3.default)(fields), (0, _toConsumableArray3.default)((0, _utilities.array_from_hash)(fields_by_deal[id] || {}))) }); } var template_mission = add_deals_fields(filter_fields(all_missions[template_mission_id] || {}, false)); var missions = missions_by_deal[id].map(function (mission) { return filter_fields(mission, true); }).filter(function (_ref13) { var deleted_at = _ref13.deleted_at; return !deleted_at; }); var counts = {}; new Array('users_count', 'accepted_count', 'assigned_count', 'empty_count', 'waiting_count').forEach(function (count) { counts[count] = (0, _utilities.array_sum)(missions.map((0, _utilities.property_getter)(count, 0))); }); var start = has_custom_events ? (0, _utilities.array_minimum)(missions.map((0, _utilities.property_getter)('start')), function (a, b) { return (0, _moment2.default)(a).isBefore(b); }) : template_mission.start; var end = has_custom_events ? (0, _utilities.array_maximum)(missions.map((0, _utilities.property_getter)('end')), function (a, b) { return (0, _moment2.default)(b).isBefore(b); }) : template_mission.end; var events = has_custom_events ? (0, _utilities.flatten_array)(missions.map((0, _utilities.property_getter)('events'))) : template_mission.events; var workplace_ids = has_custom_workplace ? missions.map((0, _utilities.property_getter)('workplace_id')) : [template_mission.workplace_id]; var own_workplaces = workplace_ids.map(function (workplace_id) { return workplaces[workplace_id] || {}; }); deal = (0, _extends4.default)({}, deal, counts, { missions: missions, sent: (0, _utilities.exist)(missions, (0, _utilities.property_getter)('sent')), template_mission: template_mission, status: deal_status(missions), workplace_ids: workplace_ids, workplaces: own_workplaces, workplace: own_workplaces[0], recruiter: recruiters[recruiter_id] || {}, start: start, end: end, events: events, fields: mission_fields_by_deal[id], has_custom_fields: (0, _missions.deal_has_custom_fields)(deal) }); return (0, _extends4.default)({}, deal, { cancel: function cancel() { (0, _missions.action_cancel_deal)(deal); }, duplicate: function duplicate() { (0, _missions.action_duplicate_deal)(deal); }, add_mission: function add_mission() { (0, _missions.action_add_mission)(deal); }, customize_fields: function customize_fields() { (0, _missions.action_customize_deal_fields)(deal); }, export_users: function export_users() { return (0, _missions.action_export_users)(deal); } }); }); }); exports.get_deals = get_deals; function deal_status(missions) { var statuses = (0, _utilities.split_array)(missions, (0, _utilities.property_getter)('status'), ['pending_selection', 'pending_assignement', 'assigned', 'sent', 'draft']); if (statuses['assigned'].length == missions.length) { return 'assigned'; } else if (statuses['pending_selection'].length) { return 'pending_selection'; } else if (statuses['pending_assignement'].length) { return 'pending_assignement'; } else if (statuses['draft'].length) { return 'draft'; } else { return 'sent'; } } var get_displayed_deals = exports.get_displayed_deals = (0, _base.tolerant_selector)([get_deals, _recruiters.get_recruiters], function (deals, recruiters) { var default_deal_ids = (0, _utilities.set_from_array)((0, _utilities.array_from_hash)(recruiters).map((0, _utilities.property_getter)('default_deal_id'))); return (0, _utilities.array_from_hash)(deals).filter(function (_ref14) { var id = _ref14.id, deleted_at = _ref14.deleted_at; return !deleted_at && !default_deal_ids[id]; }); }); var get_default_deal = exports.get_default_deal = (0, _base.tolerant_selector)([get_profile_id, _recruiters.get_recruiters, get_deals], function (id, recruiters, deals) { var _ref15 = recruiters[id] || {}, default_deal_id = _ref15.default_deal_id; return deals[default_deal_id]; }); var get_mission_proposals = exports.get_mission_proposals = (0, _base.tolerant_selector)([get_missions, get_deals, get_raw_agency, _recruiters.get_recruiters], function (missions, deals, agency, recruiters) { return (0, _utilities.map_hash)(missions, function (mission) { var deal = deals[mission.deal_id]; var _ref16 = deal || { custom_field_ids: {} }, has_custom_events = _ref16.has_custom_events, has_custom_workplace = _ref16.has_custom_workplace, template_mission_id = _ref16.template_mission_id, custom_field_ids = _ref16.custom_field_ids, recruiter_id = _ref16.recruiter_id; var template_mission = missions[template_mission_id] || {}; var status = mission.status; var sent = mission.sent; if (template_mission_id == mission.id) { status = deal.status; sent = deal.sent; } var fields = template_mission.fields, workplace = template_mission.workplace; var workplace_shared_with_user = agency.workplace_shared_with_user; function get_event_properties(_ref17) { var start = _ref17.start, end = _ref17.end, events = _ref17.events; return { start: start, end: end, events: events }; } var real_workplace = has_custom_workplace ? mission.workplace : workplace; return (0, _extends4.default)({}, mission, { deal: deal, status: status, sent: sent, real_workplace: real_workplace, workplace: workplace_shared_with_user ? real_workplace : null, agency: agency, recruiter: recruiters[recruiter_id] || {} }, get_event_properties(has_custom_events ? mission : template_mission), { fields: (fields || []).filter((0, _utilities.property_getter)('shared_with_user')).map(function (field, index) { if (custom_field_ids[field.id]) { return mission.fields[index]; } else { return field; } }) }); }); }); var get_user_deals = exports.get_user_deals = (0, _utilities.make_memoized)(function (user_id) { return (0, _base.tolerant_selector)([get_user_missions(user_id), get_deals], function (missions, deals) { var deal_ids = {}; missions.forEach(function (_ref18) { var deal_id = _ref18.deal_id; return deal_ids[deal_id] = true; }); return (0, _utilities.array_from_hash)(deals).filter(function (_ref19) { var id = _ref19.id; return deal_ids[id]; }); }); }); var get_proposals = (0, _utilities.make_memoized)(function (mission_id) { return (0, _base.tolerant_selector)([get_missions, _users.get_users, _fields.get_fields_by_proposal], function (missions, users, fields_by_proposal) { var _ref20 = missions[mission_id] || { assigned_proposals: [] }, assigned_proposals = _ref20.assigned_proposals; return assigned_proposals.map(function (_ref21) { var user_id = _ref21.user_id, proposal = (0, _objectWithoutProperties3.default)(_ref21, ['user_id']); return (0, _extends4.default)({}, proposal, { mission_id: mission_id, user: users[user_id] || {}, fields: (0, _utilities.array_from_hash)(fields_by_proposal[proposal.id]) || [] }); }); }); }); exports.get_proposals = get_proposals;