UNPKG

instantjob-recruiter-client

Version:

a set of tools for creating an instantjob recruiter react client

562 lines (499 loc) 21 kB
'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 _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); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactList = require('react-list'); var _reactList2 = _interopRequireDefault(_reactList); var _utilities = require('../common/utilities'); var _constants = require('../common/constants'); var _moment = require('../common/moment'); var _moment2 = _interopRequireDefault(_moment); var _calendar = require('../common/calendar'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var column_width = 40; var diameter = 24; var min_height = diameter * 24; var number_of_days = 365; var tolerant_equal = function tolerant_equal(previous, next) { if (previous === next) { return true; } else { return false; } }; var props_selector = function props_selector(selectors, builder) { var previous_values = selectors.map(function () { return null; }); var result = void 0; return function (props) { var next_values = selectors.map(function (selector) { return selector(props); }); if (next_values.reduce(function (unchanged, value, index) { return unchanged && tolerant_equal(value, previous_values[index]); }, true)) { return result; } else { return builder.apply(undefined, (0, _toConsumableArray3.default)(next_values)); } }; }; var get_all_days_events = function get_all_days_events(props) { return props.day_events; }; var get_all_hours_events = function get_all_hours_events(props) { return props.hour_events; }; var get_day = function get_day(day_number) { return (0, _moment2.default)().startOf('day').add(day_number, 'days'); }; var make_get_day_events = function make_get_day_events(day_number) { return props_selector([get_all_days_events, get_all_hours_events], function (all_days_events, all_hours_events) { var day = get_day(day_number); var events = [all_days_events, all_hours_events].map(function (all_events) { return (0, _keys2.default)(all_events).reduce(function (events, hue) { return (0, _extends4.default)({}, events, (0, _defineProperty3.default)({}, hue, all_events[hue].filter(function (e) { return (0, _calendar.event_intersects)(e, day, 1, 'day'); }))); }, {}); }); return { day_events: events[0], hour_events: events[1] }; }); }; var make_get_day_hours = function make_get_day_hours(day_number) { return props_selector([make_get_day_events(day_number)], function (events) { return (0, _utilities.range)(26).map(function (hour_id) { var hour = get_day(day_number).add(hour_id - 1, 'hours'); var find_corresponding_event = function find_corresponding_event(events) { return events.reduce(function (corresponding, e) { return (0, _calendar.event_intersects)(e, hour, 1, 'hour') ? e : corresponding; }, null); }; return (0, _keys2.default)(events.hour_events).reduce(function (result, hue) { var event = find_corresponding_event(events.hour_events[hue]); if (event) { return (0, _extends4.default)({}, result, { event: event, hue: hue }); } else { return result; } }, { hour: hour }); }).map(function (_ref, index, hours) { var hour = _ref.hour, event = _ref.event, hue = _ref.hue; if (index > 0 && index < 26) { if (event) { var start = hue == hours[index - 1].hue; var end = hue == hours[index + 1].hue; var category = void 0; if (start) { if (end) { category = 'middle'; } else { category = 'start'; } } else { if (end) { category = 'end'; } else { category = 'one'; } } return { category: category, hue: hue, event: event, hour: hour }; } else { return { category: 'none', hue: (0, _constants.color)('primary', 'light'), hour: hour }; } } else { return null; } }).slice(1, 25); }); }; var make_get_day_event = function make_get_day_event(day_number) { return props_selector([make_get_day_events(day_number)], function (events) { return (0, _keys2.default)(events.day_events).reduce(function (result, hue) { return events.day_events[hue].length > 0 ? { hue: hue, day_event: events.day_events[hue][0] } : result; }, (0, _keys2.default)(events.hour_events).reduce(function (result, hue) { return events.hour_events[hue].length > 0 ? { hue: hue, day_event: events.hour_events[hue][0] } : result; }, { hue: null, day_event: false })); }); }; var Week = function (_Component) { (0, _inherits3.default)(Week, _Component); function Week(props) { (0, _classCallCheck3.default)(this, Week); var _this = (0, _possibleConstructorReturn3.default)(this, (Week.__proto__ || (0, _getPrototypeOf2.default)(Week)).call(this, props)); _this.state = { width: 100, height: min_height }; _this.day_event_getters = (0, _utilities.range)(number_of_days).map(function (day_number) { return make_get_day_event(day_number); }); _this.day_hours_getters = (0, _utilities.range)(number_of_days).map(function (day_number) { return make_get_day_hours(day_number); }); _this.update_dimensions = _this.update_dimensions.bind(_this); _this.render_day_header = _this.render_day_header.bind(_this); _this.render_day = _this.render_day.bind(_this); _this.on_days_scroll = _this.on_days_scroll.bind(_this); _this.scroll_to_day = _this.scroll_to_day.bind(_this); return _this; } (0, _createClass3.default)(Week, [{ key: 'componentDidMount', value: function componentDidMount() { var _this2 = this; this.update_dimensions(); $(window).resize(this.update_dimensions); $(this.days_container).scroll(function () { return $(_this2.day_headers_container).scrollLeft($(_this2.days_container).scrollLeft()); }); $(this.day_headers_container).scroll(function () { return $(_this2.days_container).scrollLeft($(_this2.day_headers_container).scrollLeft()); }); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { $(window).off("resize", this.update_dimensions); } }, { key: 'scroll_to_day', value: function scroll_to_day(day) { $(this.days_container).scrollLeft(day.diff(get_day(0), 'days') * column_width); } }, { key: 'render_day_header', value: function render_day_header(day_number, key) { var _this3 = this; var _day_event_getters$da = this.day_event_getters[day_number](this.props), hue = _day_event_getters$da.hue, day_event = _day_event_getters$da.day_event; var day = get_day(day_number); return _react2.default.createElement(DayHeader, { key: key, day: day, hue: day_event ? hue : null, on_click: function on_click() { return _this3.props.on_day_click(day, day_event); } }); } }, { key: 'render_day', value: function render_day(day_number, key) { var _day_event_getters$da2 = this.day_event_getters[day_number](this.props), hue = _day_event_getters$da2.hue, day_event = _day_event_getters$da2.day_event; return _react2.default.createElement(Day, { key: key, background_hue: day_event.full_days ? hue : null, hours: this.day_hours_getters[day_number](this.props), on_click: day_event.full_days ? function () {} : this.props.on_hour_click, height: (this.state.height > min_height ? this.state.height : min_height) - 84 }); } }, { key: 'update_dimensions', value: function update_dimensions() { var width = $(this.container).width(); var height = $(this.container).height(); if (width != this.state.width || height != this.state.height) { this.setState({ width: width, height: height }); } } }, { key: 'render', value: function render() { var _this4 = this; var start = (0, _moment2.default)().startOf('day'); return _react2.default.createElement( 'div', { style: { flex: 1, display: 'flex', flexDirection: 'column', alignItems: 'stretch' }, ref: function ref(container) { return _this4.container = container; } }, _react2.default.createElement( 'div', { style: { marginLeft: 40, height: 84 + this.props.scrollbar_size, flexShrink: 0, overflowX: 'scroll', width: this.state.width - 40 }, ref: function ref(day_headers_container) { return _this4.day_headers_container = day_headers_container; } }, _react2.default.createElement(_reactList2.default, { ref: function ref(day_headers) { return _this4.day_headers = day_headers; }, axis: 'x', length: number_of_days, itemRenderer: function itemRenderer(column, key) { return _this4.render_day_header(column, key); }, type: 'uniform' }) ), _react2.default.createElement( 'div', { style: { height: this.state.height - 84, display: 'flex', flexDirection: 'row', overflowY: 'auto', width: this.state.width } }, _react2.default.createElement( 'div', { style: { width: 40, flexShrink: 0, display: 'flex', flexDirection: 'column', alignItems: 'stretch', height: (this.state.height > min_height ? this.state.height : min_height) - 84 } }, (0, _utilities.range)(13).map(function (hour) { return _react2.default.createElement(DisplayedHour, { hour: 2 * hour, key: hour }); }) ), _react2.default.createElement( 'div', { style: { height: (this.state.height > min_height ? this.state.height : min_height) - 84 + this.props.scrollbar_size, width: this.state.width - 40, overflowX: 'scroll', overflowY: 'hidden' }, ref: function ref(days_container) { return _this4.days_container = days_container; } }, _react2.default.createElement(_reactList2.default, { axis: 'x', length: number_of_days, itemRenderer: function itemRenderer(column, key) { return _this4.render_day(column, key); }, type: 'uniform' }) ) ) ); } }, { key: 'on_days_scroll', value: function on_days_scroll() { this.day_headers.scrollTo($(this.days_container).scrollLeft() / column_width); } }]); return Week; }(_react.Component); Week.defaultProps = { on_day_click: function on_day_click() {}, on_hour_click: function on_hour_click() {}, day_events: {}, hour_events: {} }; var DayHeader = function (_Component2) { (0, _inherits3.default)(DayHeader, _Component2); function DayHeader() { (0, _classCallCheck3.default)(this, DayHeader); return (0, _possibleConstructorReturn3.default)(this, (DayHeader.__proto__ || (0, _getPrototypeOf2.default)(DayHeader)).apply(this, arguments)); } (0, _createClass3.default)(DayHeader, [{ key: 'render', value: function render() { return _react2.default.createElement( 'div', { style: (0, _defineProperty3.default)({ width: column_width, display: 'flex', flexDirection: 'column', flexShrink: 0, alignItems: 'stretch' }, 'display', 'inline-block') }, _react2.default.createElement( 'div', { style: { height: column_width, flexShrink: 0, display: 'flex', justifyContent: 'center', alignItems: 'center' } }, _react2.default.createElement( 'div', { onClick: this.props.on_click, style: { width: diameter, height: diameter, borderRadius: diameter / 2, backgroundColor: this.props.hue ? this.props.hue : 'white', color: this.props.hue ? 'white' : (0, _constants.color)('primary'), textAlign: 'center', verticalAlign: 'middle', display: 'flex', justifyContent: 'center', flexDirection: 'column' } }, _react2.default.createElement( 'span', { style: { fontSize: 12 } }, this.props.day.date() ) ) ), _react2.default.createElement( 'div', { style: { height: 14, flexShrink: 0, display: 'flex', justifyContent: 'center', alignItems: 'center' } }, this.props.day.date() == 1 ? _react2.default.createElement( 'span', { style: { color: (0, _constants.color)('primary'), fontSize: 10 } }, this.props.day.format("MMM") ) : null ), _react2.default.createElement( 'div', { style: { height: 30, flexShrink: 0, display: 'flex', justifyContent: 'center', alignItems: 'center' } }, _react2.default.createElement( 'span', { style: { color: (0, _constants.color)('primary', 'light'), fontWeight: 900 } }, this.props.day.format("dd")[0] ) ) ); } }]); return DayHeader; }(_react.Component); var Day = function (_Component3) { (0, _inherits3.default)(Day, _Component3); 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: 'render', value: function render() { var _this7 = this; return _react2.default.createElement( 'div', { style: { width: column_width, display: 'inline-block', height: this.props.height } }, _react2.default.createElement( 'div', { style: { width: column_width, height: this.props.height, display: 'flex', flexDirection: 'column', alignItems: 'stretch', overflow: 'hidden' } }, this.props.hours.map(function (_ref3, index) { var hour_hue = _ref3.hue, category = _ref3.category, event = _ref3.event, hour = _ref3.hour; return _react2.default.createElement(Hour, { key: index, hue: _this7.props.background_hue ? _this7.props.background_hue : hour_hue, category: _this7.props.background_hue ? 'middle' : category, on_click: function on_click() { return _this7.props.on_click(hour, event); } }); }) ) ); } }]); return Day; }(_react.Component); var DisplayedHour = function DisplayedHour(props) { switch (props.hour) { case 0: return _react2.default.createElement('div', { style: { flex: 0.6, display: 'flex', justifyContent: 'center', alignItems: 'center' } }); case 24: return _react2.default.createElement('div', { style: { flex: 0.4, display: 'flex', justifyContent: 'center', alignItems: 'center' } }); default: return _react2.default.createElement( 'div', { style: { flex: 1, display: 'flex', justifyContent: 'center', alignItems: 'center', backgroundColor: props.hour % 2 ? (0, _constants.color)('important') : 'white' } }, _react2.default.createElement( 'span', { style: { textAlign: 'center' } }, props.hour, 'h' ) ); } }; var Hour = function (_Component4) { (0, _inherits3.default)(Hour, _Component4); function Hour() { (0, _classCallCheck3.default)(this, Hour); return (0, _possibleConstructorReturn3.default)(this, (Hour.__proto__ || (0, _getPrototypeOf2.default)(Hour)).apply(this, arguments)); } (0, _createClass3.default)(Hour, [{ key: 'render', value: function render() { return _react2.default.createElement( 'div', { style: { flex: 1, position: 'relative', display: 'flex', justifyContent: 'center', alignItems: 'center' }, onClick: this.props.on_click }, _react2.default.createElement(Sticker, this.props), _react2.default.createElement('div', { style: { backgroundColor: this.props.category == "none" ? (0, _constants.color)('primary', 'light') : 'white', width: 2, height: 2, borderRadius: 1, zIndex: 1 } }) ); } }]); return Hour; }(_react.Component); var Sticker = function (_Component5) { (0, _inherits3.default)(Sticker, _Component5); 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, _extends4.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, _extends4.default)({}, styles.middle_sticker, { backgroundColor: this.props.hue }) }) ); case 'start': return _react2.default.createElement( 'div', { style: styles.sticker_container }, _react2.default.createElement( 'div', { style: (0, _extends4.default)({}, styles.filler, { justifyContent: 'flex-start' }) }, _react2.default.createElement('div', { style: (0, _extends4.default)({}, styles.half_sticker, { backgroundColor: this.props.hue }) }), _react2.default.createElement('div', { style: styles.half_sticker }) ), _react2.default.createElement('div', { style: (0, _extends4.default)({}, styles.one_sticker, { backgroundColor: this.props.hue }) }) ); case 'end': return _react2.default.createElement( 'div', { style: styles.sticker_container }, _react2.default.createElement( 'div', { style: (0, _extends4.default)({}, styles.filler, { justifyContent: 'flex-end' }) }, _react2.default.createElement('div', { style: styles.half_sticker }), _react2.default.createElement('div', { style: (0, _extends4.default)({}, styles.half_sticker, { backgroundColor: this.props.hue }) }) ), _react2.default.createElement('div', { style: (0, _extends4.default)({}, styles.one_sticker, { backgroundColor: this.props.hue }) }) ); default: return _react2.default.createElement('div', null); } } }]); return Sticker; }(_react.Component); var styles = { sticker_container: { position: 'absolute', top: 0, bottom: 0, left: (column_width - diameter) / 2, right: (column_width - diameter) / 2, display: 'flex', alignItems: 'stretch', flexDirection: 'column', justifyContent: 'center' }, middle_sticker: { flex: 1 }, filler: { display: 'flex', position: 'absolute', left: 0, right: 0, top: 0, bottom: 0, flexDirection: 'column', alignItems: 'stretch' }, half_sticker: { flex: 1 }, one_sticker: { borderRadius: diameter / 2, height: diameter, width: diameter } }; exports.default = Week;