instantjob-recruiter-client
Version:
a set of tools for creating an instantjob recruiter react client
614 lines (536 loc) • 20.8 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _extends5 = require('babel-runtime/helpers/extends');
var _extends6 = _interopRequireDefault(_extends5);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _bind = require('classnames/bind');
var _bind2 = _interopRequireDefault(_bind);
var _infinite_list = require('./infinite_list');
var _infinite_list2 = _interopRequireDefault(_infinite_list);
var _reactDnd = require('react-dnd');
var _reactDndHtml5Backend = require('react-dnd-html5-backend');
var _md = require('react-icons/lib/md');
var _constants = require('../common/constants');
var _utilities = require('../common/utilities');
var _moment = require('../common/moment');
var _moment2 = _interopRequireDefault(_moment);
var _auto_bind = require('../common/auto_bind');
var _auto_bind2 = _interopRequireDefault(_auto_bind);
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/input_calendar.scss'));
var get_start_end = function get_start_end(start_id, end_id) {
var start_of_week = (0, _moment2.default)().startOf('week');
var start = start_id,
end = end_id;
if (start > end) {
start = end;
end = start_id;
}
return {
start: (0, _moment2.default)(start_of_week).add(start - 1, 'days'),
end: (0, _moment2.default)(start_of_week).add(end - 1, 'days').endOf('day')
};
};
var get_events = function get_events(props, state) {
if (state.is_dragging && props.drag_color) {
if (state.paint) {
return (0, _extends6.default)({}, props.events, (0, _defineProperty3.default)({}, props.drag_color, [].concat((0, _toConsumableArray3.default)(props.events[props.drag_color] || []), [(0, _extends6.default)({
id: 'temp'
}, get_start_end(state.start, state.end), {
full_days: true
})])));
} else {
var _extends3;
var other_events = (0, _extends6.default)({}, props.events);
if (other_events[props.drag_color]) {
delete other_events[props.drag_color];
}
return (0, _extends6.default)({}, other_events, (_extends3 = {}, (0, _defineProperty3.default)(_extends3, "", [(0, _extends6.default)({
id: 'temp'
}, get_start_end(state.start, state.end), {
full_days: true
})]), (0, _defineProperty3.default)(_extends3, props.drag_color, props.events[props.drag_color] || []), _extends3));
}
} else {
return props.events;
}
};
var make_get_week_events = (0, _utilities.make_memoized)(function (week_number) {
return (0, _base.tolerant_selector)([get_events], function (events) {
var week = (0, _moment2.default)().startOf('week').add(week_number, 'weeks');
var hues = (0, _keys2.default)(events);
return hues.reduce(function (other_events, hue) {
return (0, _extends6.default)({}, other_events, (0, _defineProperty3.default)({}, hue, events[hue].filter(function (e) {
return (0, _calendar.event_intersects)(e, (0, _moment2.default)(week).subtract(1, 'day'), 9, 'days');
})));
}, {});
});
});
var make_get_week_days = (0, _utilities.make_memoized)(function (week_number) {
return (0, _base.tolerant_selector)([make_get_week_events(week_number)], function (events) {
var week = (0, _moment2.default)().startOf('week').add(week_number, 'weeks');
var days = (0, _utilities.range)(9).map(function (day) {
var date = (0, _moment2.default)(week).add(day - 1, 'days');
var hued_event = (0, _keys2.default)(events).reduce(function (hued_event, hue) {
if (hued_event) {
return hued_event;
} else {
return events[hue].reduce(function (hued_event, e) {
if (hued_event) {
return hued_event;
} else {
if ((0, _calendar.event_intersects)(e, date, 1, 'day')) {
return { event: e, hue: hue };
} else {
return null;
}
}
}, null);
}
}, null);
return (0, _extends6.default)({ date: date }, hued_event);
});
var days_event_are_continuous = function days_event_are_continuous(i) {
return days[i].hue == days[i + 1].hue;
};
for (var i = 0; i < 7; i++) {
var category = void 0;
if (days[i + 1].event) {
if (days_event_are_continuous(i)) {
if (days_event_are_continuous(i + 1)) {
category = "middle";
} else {
category = "end";
}
} else {
if (days_event_are_continuous(i + 1)) {
category = "start";
} else {
category = "one";
}
}
} else {
category = "none";
}
days[i + 1].category = category;
}
delete days[0];
delete days[8];
return days;
});
});
var Calendar = function (_Component) {
(0, _inherits3.default)(Calendar, _Component);
function Calendar(props) {
(0, _classCallCheck3.default)(this, Calendar);
var _this = (0, _possibleConstructorReturn3.default)(this, (Calendar.__proto__ || (0, _getPrototypeOf2.default)(Calendar)).call(this, props));
(0, _auto_bind2.default)(_this);
return _this;
}
(0, _createClass3.default)(Calendar, [{
key: 'componentDidMount',
value: function componentDidMount() {
this.update_month((0, _moment2.default)());
}
}, {
key: 'scroll_to_week',
value: function scroll_to_week(week) {
this.weeks.scroll_to_week(week);
}
}, {
key: 'render',
value: function render() {
var _this2 = this;
return _react2.default.createElement(
'div',
{ className: cx('input-calendar'), style: { display: "flex", flexDirection: 'column', alignItems: 'stretch', flex: 1 } },
_react2.default.createElement(
'div',
{ style: { flexShrink: 0, height: 30, display: "flex", flexDirection: "column", justifyContent: 'center', alignItems: "center" } },
_react2.default.createElement('div', { ref: function ref(month_label) {
return _this2.month_label = month_label;
}, style: { textAlign: 'center', color: (0, _constants.color)('primary', 'light'), fontWeight: 900 } })
),
_react2.default.createElement(
'div',
{ style: { marginLeft: this.props.hide_navigation ? 0 : 50, flexShrink: 0, height: 30, display: "flex", flexDirection: "row", alignItems: "center", justifyContent: "space-around", borderBottomStyle: "solid", borderBottomWidth: 2, borderBottomColor: (0, _constants.color)('primary', 'light') } },
["L", "M", "M", "J", "V", "S", "D"].map(function (day, index) {
return _react2.default.createElement(WeekDay, { day: day, key: index });
})
),
_react2.default.createElement(
'div',
{ style: { flex: 1, cursor: this.props.drag_color ? 'ew-resize' : 'initial', display: 'flex', alignItems: 'stretch' } },
_react2.default.createElement(Weeks, {
ref: function ref(weeks) {
return _this2.weeks = weeks;
},
update_month: this.update_month,
events: this.props.events,
on_click: this.props.on_click,
drag_color: this.props.drag_color,
on_drag_and_drop: this.props.on_drag_and_drop,
on_navigate_to_week: this.props.on_navigate_to_week,
hide_navigation: this.props.hide_navigation
})
)
);
}
}, {
key: 'update_month',
value: function update_month(month) {
$(this.month_label).text((0, _utilities.capitalize_first_letter)(month.isSame((0, _moment2.default)(), 'year') ? month.format("MMMM") : month.format("MMMM YYYY")));
}
}]);
return Calendar;
}(_react.Component);
var Weeks = function (_Component2) {
(0, _inherits3.default)(Weeks, _Component2);
function Weeks(props) {
(0, _classCallCheck3.default)(this, Weeks);
var _this3 = (0, _possibleConstructorReturn3.default)(this, (Weeks.__proto__ || (0, _getPrototypeOf2.default)(Weeks)).call(this, props));
_this3.state = {
is_dragging: false,
start: 0,
end: 0,
paint: true
};
(0, _auto_bind2.default)(_this3);
_this3.current_month = (0, _moment2.default)().startOf('month');
return _this3;
}
(0, _createClass3.default)(Weeks, [{
key: 'is_week_loaded',
value: function is_week_loaded(week) {
return week < this.state.week_count - this.state.week_offset;
}
}, {
key: 'on_week_click',
value: function on_week_click(date, event) {
this.props.on_click(date, event);
}
}, {
key: 'drag_start',
value: function drag_start(day, paint) {
this.setState({ start: day, end: day, is_dragging: true, paint: paint });
}
}, {
key: 'drag_hover',
value: function drag_hover(day) {
this.setState({ end: day });
}
}, {
key: 'drag_end',
value: function drag_end(day) {
this.setState({ is_dragging: false });
var _get_start_end = get_start_end(this.state.start, this.state.end),
start = _get_start_end.start,
end = _get_start_end.end;
this.props.on_drag_and_drop(start, end, this.state.paint);
}
}, {
key: 'scroll_to_week',
value: function scroll_to_week(week) {
this.list.scroll_to_item(week);
}
}, {
key: 'handle_scroll',
value: function handle_scroll(scrollTop) {
var month = (0, _moment2.default)().startOf('week').add(scrollTop / row_height, 'weeks');
if (!month.isSame(this.current_month, 'month')) {
this.current_month = month;
this.props.update_month(month);
}
}
}, {
key: 'render_week',
value: function render_week(index) {
return _react2.default.createElement(Week, {
key: index,
days: make_get_week_days(index)(this.props, this.state),
on_click: this.on_week_click,
week: index,
drag_start: this.drag_start,
drag_hover: this.drag_hover,
drag_end: this.drag_end,
on_navigate_to_week: this.props.on_navigate_to_week,
hide_navigation: this.props.hide_navigation
});
}
}, {
key: 'render',
value: function render() {
var _this4 = this;
return _react2.default.createElement(
_infinite_list2.default,
{
item_height: row_height,
handle_scroll: this.handle_scroll,
ref: function ref(list) {
return _this4.list = list;
}
},
this.render_week
);
}
}]);
return Weeks;
}(_react.Component);
var WeekDay = function (_Component3) {
(0, _inherits3.default)(WeekDay, _Component3);
function WeekDay() {
(0, _classCallCheck3.default)(this, WeekDay);
return (0, _possibleConstructorReturn3.default)(this, (WeekDay.__proto__ || (0, _getPrototypeOf2.default)(WeekDay)).apply(this, arguments));
}
(0, _createClass3.default)(WeekDay, [{
key: 'render',
value: function render() {
return _react2.default.createElement(
'span',
{ style: { color: (0, _constants.color)('primary', 'light'), fontWeight: 900 } },
this.props.day
);
}
}]);
return WeekDay;
}(_react.Component);
var Week = function (_Component4) {
(0, _inherits3.default)(Week, _Component4);
function Week(props) {
(0, _classCallCheck3.default)(this, Week);
var _this6 = (0, _possibleConstructorReturn3.default)(this, (Week.__proto__ || (0, _getPrototypeOf2.default)(Week)).call(this, props));
(0, _auto_bind2.default)(_this6);
return _this6;
}
(0, _createClass3.default)(Week, [{
key: 'on_navigate_to_week',
value: function on_navigate_to_week() {
this.props.on_navigate_to_week(this.props.week);
}
}, {
key: 'render',
value: function render() {
var _this7 = this;
return _react2.default.createElement(
'div',
{ className: cx('input-calendar__week'), style: { height: 50, width: this.props.width, display: 'flex', flexDirection: 'row', alignItems: 'stretch', justifyContent: 'space-around' } },
this.props.hide_navigation ? null : _react2.default.createElement(
'div',
{ onClick: this.on_navigate_to_week, className: cx('input-calendar__week-link') },
_react2.default.createElement(_md.MdSubdirectoryArrowRight, null)
),
this.props.days.map(function (day, index) {
return _react2.default.createElement(DragDropDay, {
drag_start: _this7.props.drag_start,
drag_hover: _this7.props.drag_hover,
drag_end: _this7.props.drag_end,
day: _this7.props.week * 7 + index,
event: day.event,
hue: day.hue,
category: day.category,
on_click: _this7.props.on_click,
date: day.date,
key: index
});
})
);
}
}]);
return Week;
}(_react.Component);
var Day = function (_Component5) {
(0, _inherits3.default)(Day, _Component5);
function Day() {
(0, _classCallCheck3.default)(this, Day);
return (0, _possibleConstructorReturn3.default)(this, (Day.__proto__ || (0, _getPrototypeOf2.default)(Day)).apply(this, arguments));
}
(0, _createClass3.default)(Day, [{
key: 'shouldComponentUpdate',
value: function shouldComponentUpdate(props) {
return props.day !== this.props.day || props.event !== this.props.event || props.hue !== this.props.hue || props.category !== this.props.category || !props.date.isSame(this.props.date);
}
}, {
key: 'componentDidMount',
value: function componentDidMount() {
this.props.connectDragPreview((0, _reactDndHtml5Backend.getEmptyImage)(), { captureDraggingState: true });
}
}, {
key: 'render',
value: function render() {
var _this9 = this;
var hue = void 0;
switch (this.props.category) {
case "none":
hue = (0, _constants.color)('primary');
break;
default:
hue = this.props.hue ? 'white' : (0, _constants.color)('primary');
}
return this.props.connectDropTarget(this.props.connectDragSource(_react2.default.createElement(
'div',
{ onClick: function onClick() {
return _this9.props.on_click(_this9.props.date, _this9.props.event);
}, style: { flex: 1, position: 'relative', display: 'flex', flexDirection: 'column', justifyContent: 'center', alignItems: 'center', backgroundColor: this.props.date.month() % 2 == 0 ? 'white' : (0, _constants.color)('black', 'pale') } },
_react2.default.createElement(Sticker, { category: this.props.category, hue: this.props.hue }),
_react2.default.createElement(
'div',
{ style: { color: hue, zIndex: 1 } },
this.props.date.format("D")
),
this.props.date.date() == 1 ? _react2.default.createElement(
'div',
{ style: { color: this.props.hue ? this.props.hue : hue, zIndex: 1, fontSize: 10, position: 'absolute', bottom: 1, left: 0, right: 0, textAlign: 'center' } },
this.props.date.format("MMM")
) : null
)));
}
}]);
return Day;
}(_react.Component);
var DragDropDay = (0, _reactDnd.DropTarget)("generic-calendar__day", {
hover: function hover(props, monitor, component) {
var period = monitor.getItem();
if (period) {
if (period.end != props.day) {
props.drag_hover(props.day);
period.end = props.day;
}
}
}
}, function (connect, monitor) {
return {
connectDropTarget: connect.dropTarget()
};
})((0, _reactDnd.DragSource)("generic-calendar__day", {
beginDrag: function beginDrag(props) {
props.drag_start(props.day, !props.event);
return { start: props.day, end: props.day };
},
endDrag: function endDrag(props) {
props.drag_end();
}
}, function (connect, monitor) {
return {
connectDragSource: connect.dragSource(),
connectDragPreview: connect.dragPreview(),
isDragging: monitor.isDragging()
};
})(Day));
var Sticker = function (_Component6) {
(0, _inherits3.default)(Sticker, _Component6);
function Sticker() {
(0, _classCallCheck3.default)(this, Sticker);
return (0, _possibleConstructorReturn3.default)(this, (Sticker.__proto__ || (0, _getPrototypeOf2.default)(Sticker)).apply(this, arguments));
}
(0, _createClass3.default)(Sticker, [{
key: 'render',
value: function render() {
switch (this.props.category) {
case 'one':
return _react2.default.createElement(
'div',
{ style: styles.sticker_container },
_react2.default.createElement('div', { style: (0, _extends6.default)({}, styles.one_sticker, { backgroundColor: this.props.hue }) })
);
case 'middle':
return _react2.default.createElement(
'div',
{ style: styles.sticker_container },
_react2.default.createElement('div', { style: (0, _extends6.default)({}, styles.middle_sticker, { backgroundColor: this.props.hue }) })
);
case 'end':
return _react2.default.createElement(
'div',
{ style: styles.sticker_container },
_react2.default.createElement(
'div',
{ style: (0, _extends6.default)({}, styles.filler, { justifyContent: 'flex-start' }) },
_react2.default.createElement('div', { style: (0, _extends6.default)({}, styles.half_sticker, { backgroundColor: this.props.hue }) }),
_react2.default.createElement('div', { style: styles.half_sticker })
),
_react2.default.createElement('div', { style: (0, _extends6.default)({}, styles.one_sticker, { backgroundColor: this.props.hue }) })
);
case 'start':
return _react2.default.createElement(
'div',
{ style: styles.sticker_container },
_react2.default.createElement(
'div',
{ style: (0, _extends6.default)({}, styles.filler, { justifyContent: 'flex-end' }) },
_react2.default.createElement('div', { style: styles.half_sticker }),
_react2.default.createElement('div', { style: (0, _extends6.default)({}, styles.half_sticker, { backgroundColor: this.props.hue }) })
),
_react2.default.createElement('div', { style: (0, _extends6.default)({}, styles.one_sticker, { backgroundColor: this.props.hue }) })
);
default:
return _react2.default.createElement('div', null);
}
}
}]);
return Sticker;
}(_react.Component);
var row_height = 50;
var diameter = 24;
var styles = {
sticker_container: {
position: 'absolute',
left: 0,
right: 0,
top: (row_height - diameter) / 2,
bottom: (row_height - diameter) / 2,
display: 'flex',
alignItems: 'stretch',
flexDirection: 'row',
justifyContent: 'center'
},
middle_sticker: {
flex: 1
},
filler: {
display: 'flex',
position: 'absolute',
left: 0,
right: 0,
top: 0,
bottom: 0,
flexDirection: 'row',
alignItems: 'stretch'
},
half_sticker: {
flex: 1
},
one_sticker: {
borderRadius: diameter / 2,
height: diameter,
width: diameter
}
};
Calendar.defaultProps = {
events: {},
on_click: function on_click() {},
drag_color: '',
on_drag_and_drop: function on_drag_and_drop(start, end, paint) {},
hide_navigation: false
};
exports.default = Calendar;