instantjob-recruiter-client
Version:
a set of tools for creating an instantjob recruiter react client
446 lines (377 loc) • 15.3 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _extends6 = require('babel-runtime/helpers/extends');
var _extends7 = _interopRequireDefault(_extends6);
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 _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _bind = require('classnames/bind');
var _bind2 = _interopRequireDefault(_bind);
var _reactRedux = require('react-redux');
var _md = require('react-icons/lib/md');
var _generic_calendar = require('../generic_calendar');
var _generic_calendar2 = _interopRequireDefault(_generic_calendar);
var _button = require('components/utils/button');
var _button2 = _interopRequireDefault(_button);
var _time_pickers = require('./time_pickers');
var _time_pickers2 = _interopRequireDefault(_time_pickers);
var _constants = require('../../common/constants');
var _utilities = require('../../common/utilities');
var _request = require('../../common/request');
var _request2 = _interopRequireDefault(_request);
var _store = require('../../common/store');
var _store2 = _interopRequireDefault(_store);
var _auto_bind = require('../../common/auto_bind');
var _auto_bind2 = _interopRequireDefault(_auto_bind);
var _moment = require('../../common/moment');
var _moment2 = _interopRequireDefault(_moment);
var _calendar = require('../../common/calendar');
var _event_system = require('../../common/event_system');
var _event_system2 = _interopRequireDefault(_event_system);
var _calendar2 = require('../../selectors/calendar');
var _missions = require('../../selectors/missions');
var _base = require('../../reducers/base');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var cx = _bind2.default.bind(require('../../styles/input_calendar.scss'));
var chunks_count_in_hour = 4;
var chunk_length_in_minutes = 60 / chunks_count_in_hour;
var chunks_count_in_day = 24 * chunks_count_in_hour;
var day_id = function day_id(day) {
return day.format("YYYY-MM-DD");
};
var get_periods = function get_periods(chunk_set) {
var periods = [],
period_started = void 0,
start = null;
var add_period = function add_period(end) {
return periods.push({ start: start, end: end });
};
(0, _utilities.range)(chunks_count_in_day).forEach(function (chunk) {
if (chunk_set[chunk]) {
if (!period_started) {
start = chunk;
period_started = true;
}
} else {
if (period_started) {
add_period(chunk - 1);
period_started = false;
}
}
});
if (period_started) {
add_period(chunks_count_in_day - 1);
}
return periods;
};
var get_start_end = function get_start_end(day, start_id, end_id) {
var start_of_day = (0, _moment2.default)(day);
var start = start_id,
end = end_id;
if (start > end) {
start = end;
end = start_id;
}
return {
start: (0, _moment2.default)(start_of_day).add(start * chunk_length_in_minutes, 'minutes'),
end: (0, _moment2.default)(start_of_day).add((end + 1) * chunk_length_in_minutes, 'minutes')
};
};
var AgencyEditUserCalendarStatic = function (_Component) {
(0, _inherits3.default)(AgencyEditUserCalendarStatic, _Component);
function AgencyEditUserCalendarStatic(props) {
(0, _classCallCheck3.default)(this, AgencyEditUserCalendarStatic);
var _this = (0, _possibleConstructorReturn3.default)(this, (AgencyEditUserCalendarStatic.__proto__ || (0, _getPrototypeOf2.default)(AgencyEditUserCalendarStatic)).call(this, props));
(0, _auto_bind2.default)(_this);
var active = {};
props.agency_events.forEach(function (event) {
var current = (0, _moment2.default)(event.start);
while (current.isBefore(event.end)) {
var id = day_id(current);
if (!active[id]) {
active[id] = {};
}
active[id][(60 * current.hour() + current.minutes()) / chunk_length_in_minutes] = true;
current.add(chunk_length_in_minutes, 'minutes');
}
});
_this.state = {
active: active,
mode: "month",
week: 0
};
return _this;
}
(0, _createClass3.default)(AgencyEditUserCalendarStatic, [{
key: 'componentDidMount',
value: function componentDidMount() {
_event_system2.default.register('dismiss_popover', this.update_user_events);
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate() {
if (this.should_scroll_to_week) {
this.calendar.scroll_to_week(this.should_scroll_to_week);
this.should_scroll_to_week = false;
}
}
}, {
key: 'on_day_click',
value: function on_day_click(date) {
var id = day_id(date);
if (this.is_full_day(id)) {
this.setState({
active: (0, _extends7.default)({}, this.state.active, (0, _defineProperty3.default)({}, id, this.empty_day()))
});
} else if (this.is_empty_day(id)) {
this.setState({
active: (0, _extends7.default)({}, this.state.active, (0, _defineProperty3.default)({}, id, this.full_day()))
});
} else {
this.on_navigate_to_week(date.endOf('week').diff((0, _moment2.default)(), 'week'));
}
}
}, {
key: 'full_day',
value: function full_day() {
return (0, _utilities.set_from_array)((0, _utilities.range)(chunks_count_in_day));
}
}, {
key: 'empty_day',
value: function empty_day() {
return false;
}
}, {
key: 'is_empty_day',
value: function is_empty_day(id) {
var day = this.state.active[id];
return !day || (0, _utilities.empty_set)(day);
}
}, {
key: 'is_full_day',
value: function is_full_day(id) {
var _this2 = this;
var day = this.state.active[id];
return day && (0, _utilities.for_all)((0, _utilities.range)(chunks_count_in_day), function (chunk) {
return _this2.state.active[id][chunk];
});
}
}, {
key: 'on_create_days_period',
value: function on_create_days_period(start, end) {
var paint = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
var day_ids = [],
current = (0, _moment2.default)(start),
condition = paint ? this.is_empty_day : this.is_full_day;
while (current.isBefore(end)) {
var id = day_id(current);
if (condition(id)) {
day_ids.push(id);
}
current.add(1, 'day');
}
this.setState({ active: (0, _extends7.default)({}, this.state.active, (0, _utilities.map_hash)((0, _utilities.set_from_array)(day_ids), paint ? this.full_day : this.empty_day)) });
}
}, {
key: 'on_create_chunks_period',
value: function on_create_chunks_period(date, chunks) {
var paint = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
var id = day_id(date);
this.setState(function (_ref) {
var active = _ref.active;
return { active: (0, _extends7.default)({}, active, (0, _defineProperty3.default)({}, id, (0, _extends7.default)({}, active[id] || {}, (0, _utilities.create_hash)(chunks, function () {
return paint;
})))) };
});
}
}, {
key: 'get_day_events',
value: function get_day_events() {
return (0, _utilities.array_from_set)(this.state.active).filter(this.is_full_day).map(function (day) {
return {
start: (0, _moment2.default)(day),
end: (0, _moment2.default)(day).endOf('day'),
full_days: true
};
});
}
}, {
key: 'get_hour_events',
value: function get_hour_events() {
var _this3 = this;
var partially_busy_days = (0, _utilities.array_from_set)(this.state.active).filter(function (id) {
return !_this3.is_full_day(id) && !_this3.is_empty_day(id);
});
var events = [];
var add_events = function add_events(day, active_chunks) {
get_periods(active_chunks).forEach(function (_ref2) {
var start = _ref2.start,
end = _ref2.end;
events.push((0, _extends7.default)({}, get_start_end(day, start, end), {
full_days: false
}));
});
};
partially_busy_days.forEach(function (day) {
return add_events(day, _this3.state.active[day]);
});
return events;
}
}, {
key: 'update_user_events',
value: function update_user_events() {
this.props.update_user_events([].concat((0, _toConsumableArray3.default)(this.get_day_events()), (0, _toConsumableArray3.default)(this.get_hour_events())));
}
}, {
key: 'on_navigate_to_week',
value: function on_navigate_to_week(week) {
this.setState({ week: week, mode: "week" });
}
}, {
key: 'on_navigate_to_month',
value: function on_navigate_to_month() {
this.setState({ mode: "month" });
this.should_scroll_to_week = this.state.week;
}
}, {
key: 'on_next_week',
value: function on_next_week() {
this.setState({ week: this.state.week + 1 });
}
}, {
key: 'on_previous_week',
value: function on_previous_week() {
this.setState({ week: this.state.week - 1 });
}
}, {
key: 'get_start_of_week',
value: function get_start_of_week() {
return (0, _moment2.default)().startOf('week').add(this.state.week, 'weeks');
}
}, {
key: 'render',
value: function render() {
var _events,
_this4 = this,
_extends5;
var _props = this.props,
user_events = _props.user_events,
mission_events = _props.mission_events;
var events = (_events = {}, (0, _defineProperty3.default)(_events, (0, _constants.color)('important', 'light'), user_events), (0, _defineProperty3.default)(_events, (0, _constants.color)('primary'), mission_events), _events);
switch (this.state.mode) {
case "week":
var start_of_week = this.get_start_of_week();
return _react2.default.createElement(
'div',
{ className: cx('input-calendar', 'input-calendar_week') },
_react2.default.createElement(
'div',
{ className: cx('input-calendar__nav') },
_react2.default.createElement(
_button2.default,
{
className: cx('input-calendar__nav-back'),
back: true,
onClick: this.on_navigate_to_month
},
'Retour vue ',
start_of_week.format('MMMM' + ((0, _moment2.default)().isSame(start_of_week, 'year') ? '' : ' YYYY'))
),
_react2.default.createElement(
'div',
{ className: cx('input-calendar__nav-weeks') },
_react2.default.createElement(
'div',
{ onClick: this.on_previous_week, className: cx('input-calendar__nav-weeks-control') },
_react2.default.createElement(_md.MdKeyboardArrowLeft, null)
),
_react2.default.createElement(
'div',
{ className: cx('input-calendar__nav-weeks-current') },
'Semaine ',
start_of_week.week()
),
_react2.default.createElement(
'div',
{ onClick: this.on_next_week, className: cx('input-calendar__nav-weeks-control') },
_react2.default.createElement(_md.MdKeyboardArrowRight, null)
)
)
),
_react2.default.createElement(_time_pickers2.default, {
events: events,
days: (0, _utilities.range)(7).map(function (day) {
var date = (0, _moment2.default)(start_of_week).add(day, 'days');
return {
date: date,
chunks: _this4.state.active[day_id(date)] || {}
};
}),
drag_color: (0, _constants.color)('attention'),
full_day_color: (0, _constants.color)('important'),
flip: this.on_create_chunks_period
})
);
case "month":
return _react2.default.createElement(
'div',
{ className: cx('input-calendar', 'input-calendar_month') },
_react2.default.createElement(_generic_calendar2.default, {
ref: function ref(calendar) {
return _this4.calendar = calendar;
},
events: (0, _extends7.default)({}, events, (_extends5 = {}, (0, _defineProperty3.default)(_extends5, (0, _constants.color)('attention'), this.get_hour_events()), (0, _defineProperty3.default)(_extends5, (0, _constants.color)('important'), this.get_day_events()), _extends5)),
on_click: this.on_day_click,
drag_color: (0, _constants.color)('important'),
on_drag_and_drop: this.on_create_days_period,
on_navigate_to_week: this.on_navigate_to_week
})
);
}
}
}]);
return AgencyEditUserCalendarStatic;
}(_react.Component);
var AgencyEditUserCalendar = (0, _reactRedux.connect)(function (state, _ref3) {
var user_id = _ref3.user_id;
var _get_user_events = (0, _calendar2.get_user_events)(user_id)(state),
user_events = _get_user_events.user,
agency_events = _get_user_events.agency;
var mission_events = (0, _missions.get_user_missions_events)(user_id)(state);
return {
user_events: user_events,
agency_events: agency_events,
mission_events: mission_events
};
}, function (dispatch, _ref4) {
var user_id = _ref4.user_id;
return {
update_user_events: function update_user_events(new_events) {
var state = _store2.default.getState();
var _get_user_events2 = (0, _calendar2.get_user_events)(user_id)(state),
old_events = _get_user_events2.agency;
var _events_difference = (0, _calendar.events_difference)(old_events, new_events),
remove = _events_difference.remove,
add = _events_difference.add;
_request2.default.put('users/' + user_id + '/events', { remove_events: (remove || []).map(function (event) {
return event.id;
}), events: add });
}
};
})(AgencyEditUserCalendarStatic);
exports.default = AgencyEditUserCalendar;