instantjob-recruiter-client
Version:
a set of tools for creating an instantjob recruiter react client
625 lines (550 loc) • 20.7 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.get_days_chunks = exports.get_start_end = exports.get_periods = exports.chunks_count_in_day = exports.chunk_length_in_minutes = exports.chunks_count_in_hour = exports.day_id = undefined;
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
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 _reactDnd = require('react-dnd');
var _hover = require('components/utils/hover');
var _hover2 = _interopRequireDefault(_hover);
var _reactDndHtml5Backend = require('react-dnd-html5-backend');
var _auto_bind = require('../../common/auto_bind');
var _auto_bind2 = _interopRequireDefault(_auto_bind);
var _moment = require('../../common/moment');
var _moment2 = _interopRequireDefault(_moment);
var _utilities = require('../../common/utilities');
var _calendar = require('../../common/calendar');
var _base = require('../../selectors/base');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var cx = _bind2.default.bind(require('../../styles/time_pickers.scss'));
var is_between = function is_between(a, b, c) {
return a >= b && a < c || a >= c && a < b;
};
var day_id = exports.day_id = function day_id(day) {
return day.format("YYYY-MM-DD");
};
var get_events_periods = function get_events_periods(events) {
return (0, _calendar.make_periods)(events);
};
var get_day_periods = (0, _utilities.make_memoized)(function (day) {
return (0, _base.tolerant_selector)([get_events_periods], function (periods) {
var _intersecting_periods = (0, _calendar.intersecting_periods_interval)(periods, (0, _moment2.default)(day), (0, _moment2.default)(day).endOf('day')),
lower = _intersecting_periods.lower,
upper = _intersecting_periods.upper;
return periods.slice(lower, upper);
});
});
var get_event_hours = (0, _utilities.make_memoized)(function (day) {
return (0, _base.tolerant_selector)([get_day_periods(day)], function (periods) {
return (0, _utilities.set_from_array)((0, _utilities.range)(24).filter(function (hour) {
var start = (0, _moment2.default)(day).add(hour, 'hours');
var end = (0, _moment2.default)(start).endOf('hour');
var _intersecting_periods2 = (0, _calendar.intersecting_periods_interval)(periods, start, end),
lower = _intersecting_periods2.lower,
upper = _intersecting_periods2.upper;
return lower != upper;
}));
});
});
var chunks_count_in_hour = exports.chunks_count_in_hour = 4;
var chunk_length_in_minutes = exports.chunk_length_in_minutes = 60 / chunks_count_in_hour;
var chunks_count_in_day = exports.chunks_count_in_day = 24 * chunks_count_in_hour;
var get_periods = exports.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 = exports.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 get_days_chunks = exports.get_days_chunks = function get_days_chunks(events) {
var days = {};
events.forEach(function (event) {
var current = (0, _moment2.default)(event.start);
while (current.isBefore(event.end)) {
var id = day_id(current);
if (!days[id]) {
days[id] = {};
}
if (!event.full_days) {
days[id][(60 * current.hour() + current.minutes()) / chunk_length_in_minutes] = true;
}
current.add(chunk_length_in_minutes, 'minutes');
}
});
return days;
};
var TimePickers = function (_Component) {
(0, _inherits3.default)(TimePickers, _Component);
function TimePickers(props) {
(0, _classCallCheck3.default)(this, TimePickers);
var _this = (0, _possibleConstructorReturn3.default)(this, (TimePickers.__proto__ || (0, _getPrototypeOf2.default)(TimePickers)).call(this, props));
(0, _auto_bind2.default)(_this);
return _this;
}
(0, _createClass3.default)(TimePickers, [{
key: 'render_displayed_hour',
value: function render_displayed_hour(hour) {
return _react2.default.createElement(
'div',
{ key: hour, className: cx('time-pickers__header-hour') },
hour % 2 == 0 ? hour + 'h' : null
);
}
}, {
key: 'render_day',
value: function render_day(_ref) {
var date = _ref.date,
chunks = _ref.chunks;
return _react2.default.createElement(
'div',
{ key: date.format(), className: cx('time-pickers__day') },
_react2.default.createElement(
'div',
{ className: cx('time-pickers__day-label') },
this.props.day_label ? date.format('D MMMM' + ((0, _moment2.default)().isSame(date, 'year') ? '' : ' YYYY')) : ""
),
_react2.default.createElement(TimePicker, {
color: this.props.full_day_color && (0, _utilities.for_all)((0, _utilities.range)(chunks_count_in_day), function (chunk) {
return chunks[chunk];
}) ? this.props.full_day_color : this.props.drag_color,
on_drag_and_drop: this.props.on_drag_and_drop,
chunks: chunks,
date: date,
events: this.props.events,
flip: this.props.flip
})
);
}
}, {
key: 'render',
value: function render() {
return _react2.default.createElement(
'div',
{ className: cx('time-pickers') },
_react2.default.createElement(
'div',
{ className: cx('time-pickers__header') },
(0, _utilities.range)(25).map(this.render_displayed_hour)
),
_react2.default.createElement(
'div',
{ className: cx('time-pickers__days') },
this.props.days.map(this.render_day),
_react2.default.createElement('div', { key: 'bottom-filler', className: cx('time-pickers__days-bottom-filler') })
)
);
}
}]);
return TimePickers;
}(_react.Component);
var TimePicker = function (_Component2) {
(0, _inherits3.default)(TimePicker, _Component2);
function TimePicker(props) {
(0, _classCallCheck3.default)(this, TimePicker);
var _this2 = (0, _possibleConstructorReturn3.default)(this, (TimePicker.__proto__ || (0, _getPrototypeOf2.default)(TimePicker)).call(this, props));
_this2.state = {
is_dragging: false,
start: 0,
end: 0
};
(0, _auto_bind2.default)(_this2);
return _this2;
}
(0, _createClass3.default)(TimePicker, [{
key: 'shouldComponentUpdate',
value: function shouldComponentUpdate(props, state) {
var _this3 = this;
return !props.date.isSame(this.props.date) || props.color !== this.props.color || (0, _utilities.exist)((0, _utilities.range)(chunks_count_in_day), function (chunk) {
return props.chunks[chunk] !== _this3.props.chunks[chunk];
}) || state !== this.state;
}
}, {
key: 'dragging_paint',
value: function dragging_paint(_ref2) {
var start = _ref2.start,
end = _ref2.end;
if (start < end) {
return !this.count(start + 1);
} else if (start > end) {
return !this.count(start - 1);
} else {
return this.count(start + 1) == this.count(start - 1) ? this.count(start) == 0 : this.count(start) > 0;
}
}
}, {
key: 'offset',
value: function offset(_ref3) {
var start = _ref3.start,
end = _ref3.end;
var offset = 0;
if (start <= end) {
offset = chunks_count_in_hour - 1;
}
var count = this.count(start);
if (!this.props.chunks[start * chunks_count_in_hour]) {
count = chunks_count_in_hour - count;
}
return (count + offset) % chunks_count_in_hour - offset;
}
}, {
key: 'count',
value: function count(hour) {
var _this4 = this;
return (0, _utilities.range)(hour * chunks_count_in_hour, (hour + 1) * chunks_count_in_hour).filter(function (chunk) {
return _this4.props.chunks[chunk];
}).length;
}
}, {
key: 'paint',
value: function paint(hour) {
return (0, _utilities.for_all)(this.get_chunks(hour), (0, _utilities.property_getter)('active'));
}
}, {
key: 'get_chunks',
value: function get_chunks(hour) {
return this.get_active_chunks().slice(hour * chunks_count_in_hour, (hour + 1) * chunks_count_in_hour);
}
}, {
key: 'drag_start',
value: function drag_start(hour) {
this.setState({ start: hour, end: hour, is_dragging: true });
}
}, {
key: 'drag_hover',
value: function drag_hover(hour) {
this.setState({ end: hour });
}
}, {
key: 'drag_end',
value: function drag_end() {
this.setState({ is_dragging: false });
this.props.flip(this.props.date, this.get_dragging_chunks(), this.dragging_paint(this.state));
}
}, {
key: 'get_dragging_chunks',
value: function get_dragging_chunks() {
var _state = this.state,
start = _state.start,
end = _state.end;
var offset = this.offset(this.state);
if (start > end) {
start = this.state.end;
end = this.state.start;
}
return (0, _utilities.range)(start * chunks_count_in_hour + offset, (end + 1) * chunks_count_in_hour + offset);
}
}, {
key: 'get_active_chunks',
value: function get_active_chunks() {
var _this5 = this;
var active_chunks = (0, _utilities.range)(chunks_count_in_day).map(function (chunk) {
return _this5.props.chunks[chunk];
});
var paint = this.dragging_paint(this.state);
if (this.state.is_dragging) {
this.get_dragging_chunks().forEach(function (chunk) {
return active_chunks[chunk] = paint;
});
}
return active_chunks.map(function (active, index) {
return {
active: active,
start: active && (index == 0 || !active_chunks[index - 1]),
end: active && (index + 1 == chunks_count_in_day || !active_chunks[index + 1])
};
});
}
}, {
key: 'on_hour_click',
value: function on_hour_click(hour) {
this.props.flip(this.props.date, (0, _utilities.range)(hour * chunks_count_in_hour, (hour + 1) * chunks_count_in_hour), !this.paint(hour));
}
}, {
key: 'get_selectors',
value: function get_selectors() {
var _this6 = this;
return this.get_active_chunks().map(function (_ref4, chunk) {
var start = _ref4.start,
end = _ref4.end;
var select = void 0,
offset = void 0;
if (start) {
var chunk_base = chunks_count_in_hour * Math.floor(chunk / chunks_count_in_hour);
select = function select(index) {
_this6.props.flip(_this6.props.date, (0, _utilities.range)(chunk_base + index, chunk_base + chunks_count_in_hour), true);
_this6.props.flip(_this6.props.date, (0, _utilities.range)(chunk_base, chunk_base + index), false);
};
offset = -10;
} else if (end) {
chunk = chunk + 1;
var _chunk_base = chunks_count_in_hour * Math.floor(chunk / chunks_count_in_hour);
select = function select(index) {
_this6.props.flip(_this6.props.date, (0, _utilities.range)(_chunk_base + index, _chunk_base + chunks_count_in_hour), false);
_this6.props.flip(_this6.props.date, (0, _utilities.range)(_chunk_base, _chunk_base + index), true);
};
offset = +10;
}
if (select) {
return { position: chunk * 20 / chunks_count_in_hour + offset, chunk: chunk, select: select };
}
}).filter(Boolean);
}
}, {
key: 'render_selector',
value: function render_selector(selector, index) {
return _react2.default.createElement(Selector, (0, _extends3.default)({ key: index }, selector));
}
}, {
key: 'render_hour',
value: function render_hour(hour) {
var events_colors = (0, _utilities.array_from_set)((0, _utilities.filter_hash)((0, _utilities.map_hash)(this.props.events, get_event_hours(day_id(this.props.date))), function (active_hours) {
return active_hours[hour];
}));
return _react2.default.createElement(DragDropHour, {
key: hour,
hour: hour,
drag_start: this.drag_start,
drag_hover: this.drag_hover,
drag_end: this.drag_end,
onClick: this.on_hour_click,
chunks: this.get_chunks(hour),
event_color: events_colors[0],
active_color: this.props.color
});
}
}, {
key: 'render',
value: function render() {
return _react2.default.createElement(
'div',
{ className: cx('time-pickers__day-hours') },
_react2.default.createElement(
'div',
{ className: cx('time-pickers__day-hours-slider') },
(0, _utilities.range)(24).map(this.render_hour)
),
_react2.default.createElement(
'div',
{ className: cx('time-pickers__day-hours-selectors') },
this.get_selectors().map(this.render_selector)
)
);
}
}]);
return TimePicker;
}(_react.Component);
var Hour = function (_Component3) {
(0, _inherits3.default)(Hour, _Component3);
function Hour(props) {
(0, _classCallCheck3.default)(this, Hour);
var _this7 = (0, _possibleConstructorReturn3.default)(this, (Hour.__proto__ || (0, _getPrototypeOf2.default)(Hour)).call(this, props));
(0, _auto_bind2.default)(_this7);
return _this7;
}
(0, _createClass3.default)(Hour, [{
key: 'componentDidMount',
value: function componentDidMount() {
this.props.connectDragPreview((0, _reactDndHtml5Backend.getEmptyImage)(), { captureDraggingState: true });
}
}, {
key: 'onClick',
value: function onClick() {
this.props.onClick(this.props.hour);
}
}, {
key: 'render_chunk',
value: function render_chunk(_ref5, index) {
var active = _ref5.active,
start = _ref5.start,
end = _ref5.end;
var active_color = this.props.active_color;
return _react2.default.createElement(
'div',
{ key: index, style: { backgroundColor: active ? active_color : null }, className: cx('time-pickers__hour-box-chunk') },
start ? _react2.default.createElement(
'div',
{ style: { backgroundColor: active_color }, className: cx('time-pickers__hour-box-chunk-start') },
_react2.default.createElement('div', { className: cx('time-pickers__hour-box-chunk-handle') })
) : null,
end ? _react2.default.createElement(
'div',
{ style: { backgroundColor: active_color }, className: cx('time-pickers__hour-box-chunk-end') },
_react2.default.createElement('div', { className: cx('time-pickers__hour-box-chunk-handle') })
) : null
);
}
}, {
key: 'render',
value: function render() {
var _props = this.props,
chunks = _props.chunks,
connectDropTarget = _props.connectDropTarget,
connectDragSource = _props.connectDragSource,
event_color = _props.event_color;
return connectDropTarget(connectDragSource(_react2.default.createElement(
'div',
{ className: cx('time-pickers__hour') },
_react2.default.createElement(
'div',
{
style: { backgroundColor: event_color },
onClick: this.onClick,
className: cx('time-pickers__hour-box')
},
chunks.map(this.render_chunk)
)
)));
}
}]);
return Hour;
}(_react.Component);
var DragDropHour = (0, _reactDnd.DropTarget)("time-pickers__hour", {
hover: function hover(props, monitor, component) {
var period = monitor.getItem();
if (period) {
if (period.end != props.hour) {
props.drag_hover(props.hour);
period.end = props.hour;
}
}
}
}, function (connect, monitor) {
return {
connectDropTarget: connect.dropTarget()
};
})((0, _reactDnd.DragSource)("time-pickers__hour", {
beginDrag: function beginDrag(props) {
props.drag_start(props.hour);
return { start: props.hour, end: props.hour };
},
endDrag: function endDrag(props) {
props.drag_end();
}
}, function (connect, monitor) {
return {
connectDragSource: connect.dragSource(),
connectDragPreview: connect.dragPreview(),
isDragging: monitor.isDragging()
};
})(Hour));
var Selector = function (_Component4) {
(0, _inherits3.default)(Selector, _Component4);
function Selector(props) {
(0, _classCallCheck3.default)(this, Selector);
var _this8 = (0, _possibleConstructorReturn3.default)(this, (Selector.__proto__ || (0, _getPrototypeOf2.default)(Selector)).call(this, props));
(0, _auto_bind2.default)(_this8);
return _this8;
}
(0, _createClass3.default)(Selector, [{
key: 'render_chunk',
value: function render_chunk(index) {
var _props2 = this.props,
chunk = _props2.chunk,
select = _props2.select;
return _react2.default.createElement(
'div',
{
key: index,
className: cx('time-pickers__selector-chunks-chunk', { 'time-pickers__selector-chunks-chunk_selected': index == chunk % chunks_count_in_hour }),
onClick: function onClick() {
return select(index);
}
},
this.get_chunk(chunks_count_in_hour * Math.floor(chunk / chunks_count_in_hour) + index)
);
}
}, {
key: 'get_chunk',
value: function get_chunk(chunk) {
var minutes = chunk_length_in_minutes * (chunk % chunks_count_in_hour);
return Math.floor(chunk / chunks_count_in_hour) + 'h' + (minutes < 10 ? 0 : "") + minutes;
}
}, {
key: 'render',
value: function render() {
var _this9 = this;
var _props3 = this.props,
position = _props3.position,
chunk = _props3.chunk;
return _react2.default.createElement(
'div',
{ style: { left: position }, className: cx('time-pickers__selector') },
_react2.default.createElement(
'div',
{ className: cx('time-pickers__selector-container') },
_react2.default.createElement(
_hover2.default,
null,
function (hover) {
return hover ? _react2.default.createElement(
'div',
{ className: cx('time-pickers__selector-chunks') },
(0, _utilities.range)(chunks_count_in_hour).map(_this9.render_chunk)
) : _react2.default.createElement(
'div',
{ className: cx('time-pickers__selector-chunk') },
_this9.get_chunk(chunk)
);
}
)
)
);
}
}]);
return Selector;
}(_react.Component);
TimePickers.defaultProps = {
day_label: true,
days: [],
on_drag_and_drop: function on_drag_and_drop(date, start, end, paint) {},
full_day_color: '',
drag_color: '',
events: {}
};
exports.default = TimePickers;