@activecollab/components
Version:
ActiveCollab Components
417 lines (414 loc) • 21.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SelectDate = void 0;
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _moment = _interopRequireDefault(require("moment"));
var _DatePickerForm = require("./DatePickerForm");
var _SelectDateTarget = require("./SelectDateTarget");
var _Styles = require("./Styles");
var _dateUtils = require("../../utils/dateUtils");
var _Localization = require("../Localization");
var _Menu = require("../Menu/Menu");
var _Tooltip = require("../Tooltip/Tooltip");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var getUtcTimestampFromDate = function getUtcTimestampFromDate(date) {
return _moment.default.utc([date.getFullYear(), date.getMonth(), date.getDate()]).unix();
};
var isDayInRange = function isDayInRange(day, data) {
if (data.repeating) {
var from = new Date(day.getFullYear(), data.from.getMonth(), data.from.getDate());
var to = new Date(day.getFullYear(), data.to.getMonth(), data.to.getDate());
return day >= from && day <= to;
}
return day >= data.from && day <= data.to;
};
var SelectDate = exports.SelectDate = function SelectDate(_ref) {
var _ref$changeMode = _ref.changeMode,
mode = _ref$changeMode === void 0 ? "instant" : _ref$changeMode,
_ref$trigger = _ref.trigger,
labelType = _ref$trigger === void 0 ? "text" : _ref$trigger,
_ref$saveButtonText = _ref.saveButtonText,
saveButtonText = _ref$saveButtonText === void 0 ? "Save" : _ref$saveButtonText,
_ref$cancelButtonText = _ref.cancelButtonText,
cancelButtonText = _ref$cancelButtonText === void 0 ? "Cancel" : _ref$cancelButtonText,
_ref$clearButtonText = _ref.clearButtonText,
clearButtonText = _ref$clearButtonText === void 0 ? "Clear" : _ref$clearButtonText,
_ref$modalHeaderText = _ref.modalHeaderText,
modalHeaderText = _ref$modalHeaderText === void 0 ? "Discard changes?" : _ref$modalHeaderText,
_ref$modalDiscardMess = _ref.modalDiscardMessage,
modalDiscardMessage = _ref$modalDiscardMess === void 0 ? "All unsaved changes will be lost." : _ref$modalDiscardMess,
_ref$modalDiscardBtnT = _ref.modalDiscardBtnText,
modalDiscardBtnText = _ref$modalDiscardBtnT === void 0 ? "OK" : _ref$modalDiscardBtnT,
_ref$modalCancelBtnTe = _ref.modalCancelBtnText,
modalCancelBtnText = _ref$modalCancelBtnTe === void 0 ? "Cancel" : _ref$modalCancelBtnTe,
onDayClick = _ref.onDayClick,
onSave = _ref.onSave,
onCancel = _ref.onCancel,
onToggleDatePicker = _ref.onToggleDatePicker,
_ref$required = _ref.required,
dateRequired = _ref$required === void 0 ? false : _ref$required,
_ref$defaultTimezoneA = _ref.defaultTimezoneAware,
defaultTimezoneAware = _ref$defaultTimezoneA === void 0 ? false : _ref$defaultTimezoneA,
_ref$longDateFormat = _ref.longDateFormat,
longDateFormat = _ref$longDateFormat === void 0 ? false : _ref$longDateFormat,
_ref$defaultShowDateP = _ref.defaultShowDatePicker,
defaultShowDatePicker = _ref$defaultShowDateP === void 0 ? false : _ref$defaultShowDateP,
_ref$firstDayOfWeek = _ref.firstDayOfWeek,
firstDayOfWeek = _ref$firstDayOfWeek === void 0 ? 0 : _ref$firstDayOfWeek,
selectedDays = _ref.selectedDays,
_ref$selectionMode = _ref.selectionMode,
selectionMode = _ref$selectionMode === void 0 ? "custom" : _ref$selectionMode,
menuClassName = _ref.menuClassName,
targetClassName = _ref.targetClassName,
icon = _ref.icon,
_ref$defaultLabelText = _ref.defaultLabelText,
defaultLabelText = _ref$defaultLabelText === void 0 ? "Set..." : _ref$defaultLabelText,
targetTextClassName = _ref.targetTextClassName,
targetIconClassName = _ref.targetIconClassName,
backgroundElementClass = _ref.backgroundElementClass,
passedDateFormat = _ref.dateFormat,
defaultMonth = _ref.defaultMonth,
_ref$daysToModify = _ref.daysToModify,
daysToModify = _ref$daysToModify === void 0 ? [] : _ref$daysToModify,
_ref$weekends = _ref.weekends,
weekends = _ref$weekends === void 0 ? [] : _ref$weekends,
_ref$weekendLabel = _ref.weekendLabel,
weekendLabel = _ref$weekendLabel === void 0 ? "Weekend" : _ref$weekendLabel,
_ref$nonWorkingDaysOf = _ref.nonWorkingDaysOfWeek,
nonWorkingDaysOfWeek = _ref$nonWorkingDaysOf === void 0 ? [] : _ref$nonWorkingDaysOf,
_ref$nonWorkingDaysOf2 = _ref.nonWorkingDaysOfWeekLabel,
nonWorkingDaysOfWeekLabel = _ref$nonWorkingDaysOf2 === void 0 ? "Unavailable" : _ref$nonWorkingDaysOf2,
_ref$weekendIsSelecta = _ref.weekendIsSelectable,
weekendIsSelectable = _ref$weekendIsSelecta === void 0 ? false : _ref$weekendIsSelecta,
tooltipText = _ref.tooltipText,
popperTooltipClassName = _ref.popperTooltipClassName,
popperClassName = _ref.popperClassName,
popperTooltipStyle = _ref.popperTooltipStyle,
position = _ref.position,
disableDaysBefore = _ref.disableDaysBefore;
var _useState = (0, _react.useState)(defaultTimezoneAware),
_useState2 = _slicedToArray(_useState, 2),
timezoneAware = _useState2[0],
setTimezoneAware = _useState2[1];
var localization = (0, _Localization.useLocalization)();
var dateFormat = passedDateFormat ? passedDateFormat : localization.dateFormat;
var labelText = (0, _react.useMemo)(function () {
if (!selectedDays) {
return defaultLabelText;
} else {
var endDate = timezoneAware ? _moment.default.unix(selectedDays.to).local() : _moment.default.unix(selectedDays.to).utc();
var startDate = timezoneAware ? _moment.default.unix(selectedDays.from).local() : _moment.default.unix(selectedDays.from).utc();
var formattedEndDate = (0, _dateUtils.formatDate)(endDate, dateFormat, longDateFormat);
var formattedStartDate = (0, _dateUtils.formatDate)(startDate, dateFormat, longDateFormat);
if (selectedDays.from === selectedDays.to) {
return formattedEndDate;
}
return "".concat(formattedStartDate, " - ").concat(formattedEndDate);
}
}, [selectedDays, dateFormat, timezoneAware, defaultLabelText, longDateFormat]);
var modifiedDates = (0, _react.useMemo)(function () {
if (typeof selectedDays === "object" && !!selectedDays.from && !!selectedDays.to) {
if (timezoneAware) {
return {
from: _moment.default.unix(selectedDays.from).toDate(),
to: _moment.default.unix(selectedDays.to).toDate()
};
}
var offsetFrom = _moment.default.unix(selectedDays.from).utcOffset() * 60;
var offsetTo = _moment.default.unix(selectedDays.to).utcOffset() * 60;
return {
from: new Date((selectedDays.from - offsetFrom) * 1000),
to: new Date((selectedDays.to - offsetTo) * 1000)
};
}
}, [selectedDays, timezoneAware]);
var handleModifiedSave = (0, _react.useCallback)(function (selectedDates) {
setTimezoneAware(false);
if (typeof onSave === "function") {
if (typeof selectedDates === "object" && Object.prototype.hasOwnProperty.call(selectedDates, "from") && Object.prototype.hasOwnProperty.call(selectedDates, "to")) {
onSave({
from: getUtcTimestampFromDate(selectedDates.from),
to: getUtcTimestampFromDate(selectedDates.to)
});
} else {
onSave(undefined);
}
}
}, [onSave]);
var getDefaultMonth = (0, _react.useCallback)(function () {
var date = new Date();
if (typeof selectedDays === "object" && !!selectedDays.from) {
date = timezoneAware ? new Date(selectedDays.from * 1000) : new Date((selectedDays.from - _moment.default.unix(selectedDays.from).utcOffset() * 60) * 1000);
} else if (defaultMonth) {
date = defaultMonth;
}
// forcing second day in month
return new Date(date.getFullYear(), date.getMonth(), 2);
}, [defaultMonth, selectedDays, timezoneAware]);
var _useState3 = (0, _react.useState)(getDefaultMonth),
_useState4 = _slicedToArray(_useState3, 2),
month = _useState4[0],
setMonth = _useState4[1];
var handleMonthChange = (0, _react.useCallback)(function (month) {
setMonth(month);
}, [setMonth]);
var _useState5 = (0, _react.useState)(modifiedDates),
_useState6 = _slicedToArray(_useState5, 2),
newDates = _useState6[0],
setNewDates = _useState6[1];
var _useState7 = (0, _react.useState)(false),
_useState8 = _slicedToArray(_useState7, 2),
showDiscardModal = _useState8[0],
setShowDiscardModal = _useState8[1];
var _useState9 = (0, _react.useState)(defaultShowDatePicker),
_useState10 = _slicedToArray(_useState9, 2),
showDatePicker = _useState10[0],
setShowDatePicker = _useState10[1];
var disabledSaveButton = (0, _react.useMemo)(function () {
return (modifiedDates === null || modifiedDates === void 0 ? void 0 : modifiedDates.from) === (newDates === null || newDates === void 0 ? void 0 : newDates.from) && (modifiedDates === null || modifiedDates === void 0 ? void 0 : modifiedDates.to) === (newDates === null || newDates === void 0 ? void 0 : newDates.to);
}, [modifiedDates, newDates]);
(0, _react.useEffect)(function () {
setShowDatePicker(defaultShowDatePicker);
}, [defaultShowDatePicker]);
(0, _react.useEffect)(function () {
setNewDates(modifiedDates);
}, [modifiedDates]);
(0, _react.useEffect)(function () {
typeof onToggleDatePicker === "function" && onToggleDatePicker(showDatePicker);
}, [showDatePicker, onToggleDatePicker]);
(0, _react.useEffect)(function () {
if (!showDatePicker) {
setMonth(getDefaultMonth());
}
}, [showDatePicker, getDefaultMonth]);
var handleSave = (0, _react.useCallback)(function () {
handleModifiedSave(newDates);
setShowDatePicker(false);
}, [newDates, handleModifiedSave]);
var handleChange = (0, _react.useCallback)(function (dates) {
if (mode !== "atomic") {
handleModifiedSave(dates);
}
setNewDates(dates);
}, [mode, handleModifiedSave]);
var handleBeforeCloseMenu = (0, _react.useCallback)(function () {
var result = true;
if (modifiedDates && !newDates || !modifiedDates && newDates) {
result = false;
}
var selectedDaysFrom = modifiedDates === null || modifiedDates === void 0 ? void 0 : modifiedDates.from;
var selectedDaysTo = modifiedDates === null || modifiedDates === void 0 ? void 0 : modifiedDates.to;
var newDatesFrom = newDates === null || newDates === void 0 ? void 0 : newDates.from;
var newDatesTo = newDates === null || newDates === void 0 ? void 0 : newDates.to;
if (selectedDaysFrom && newDatesFrom && selectedDaysTo && newDatesTo && ((0, _moment.default)(selectedDaysFrom).format("DD-MM-YYYY") !== (0, _moment.default)(newDatesFrom).format("DD-MM-YYYY") || (0, _moment.default)(selectedDaysTo).format("DD-MM-YYYY") !== (0, _moment.default)(newDatesTo).format("DD-MM-YYYY"))) {
result = false;
}
if (!result) {
setShowDiscardModal(true);
}
return result;
}, [modifiedDates, newDates]);
var handleClose = (0, _react.useCallback)(function () {
if (mode !== "atomic" || handleBeforeCloseMenu()) {
typeof onCancel === "function" && onCancel();
setShowDatePicker(false);
}
}, [mode, onCancel, handleBeforeCloseMenu]);
var handleCancel = (0, _react.useCallback)(function (event) {
event && event.preventDefault();
return handleClose();
}, [handleClose]);
var handleShowDatePicker = (0, _react.useCallback)(function () {
setShowDatePicker(!showDatePicker);
}, [showDatePicker]);
var handleCloseDiscardModal = (0, _react.useCallback)(function () {
setShowDiscardModal(false);
}, []);
var handleClear = (0, _react.useCallback)(function () {
if (!dateRequired) {
setNewDates(undefined);
if (mode === "instant") {
handleModifiedSave(undefined);
}
}
}, [mode, dateRequired, handleModifiedSave]);
var handleSaveDiscardModal = (0, _react.useCallback)(function () {
setNewDates(modifiedDates);
setShowDiscardModal(false);
setShowDatePicker(false);
}, [modifiedDates]);
var modifiers = (0, _react.useMemo)(function () {
var userAvailabilities = daysToModify.filter(function (data) {
return data.type === "user_day_off";
});
var globalDaysOff = daysToModify.filter(function (data) {
return data.type === "global_day_off";
});
var selectableGlobalDaysOff = daysToModify.filter(function (data) {
return data.type === "selectable_global_day_off";
});
return {
userAvailability: function userAvailability(day) {
// construct new date because react-day-picker returns date with hours set
var currentDay = new Date(day.getFullYear(), day.getMonth(), day.getDate());
return userAvailabilities.some(function (data) {
return isDayInRange(currentDay, data);
});
},
weekend: function weekend(day) {
return weekends.some(function (value) {
return day.getDay() === value;
});
},
nonWorkingDay: function nonWorkingDay(day) {
// return true if day is weekend day
if (weekends.some(function (value) {
return value === day.getDay();
})) {
return true;
}
var nonWorkingDays = [...selectableGlobalDaysOff, ...globalDaysOff];
var currentDay = new Date(day.getFullYear(), day.getMonth(), day.getDate());
return nonWorkingDays.some(function (data) {
return isDayInRange(currentDay, data);
});
},
day_disabled: function day_disabled(day) {
if (disableDaysBefore) {
if (day.toJSON().slice(0, 10) < disableDaysBefore.toJSON().slice(0, 10)) {
return true;
}
}
// return true if day is weekend day
if (!weekendIsSelectable && weekends.some(function (value) {
return value === day.getDay();
})) {
return true;
}
// construct new date because react-day-picker returns date with hours set
var currentDay = new Date(day.getFullYear(), day.getMonth(), day.getDate());
return globalDaysOff.some(function (data) {
return isDayInRange(currentDay, data);
});
},
nonWorkingDaysOfWeek: {
dayOfWeek: nonWorkingDaysOfWeek
}
};
}, [daysToModify, nonWorkingDaysOfWeek, weekends, disableDaysBefore, weekendIsSelectable]);
var renderDay = (0, _react.useCallback)(function (props) {
var titles = [];
if (weekends.some(function (value) {
return props.date.getDay() === value;
})) {
titles.push(weekendLabel);
}
if (nonWorkingDaysOfWeek.includes(props.date.getDay())) {
titles.push(nonWorkingDaysOfWeekLabel);
}
// construct new date because react-day-picker returns date with hours set
var currentDay = new Date(props.date.getFullYear(), props.date.getMonth(), props.date.getDate());
daysToModify.forEach(function (data) {
if (isDayInRange(currentDay, data)) {
titles.push(data.title);
}
});
var child = /*#__PURE__*/_react.default.createElement("div", {
className: "c-DayPicker-Day-Number"
}, props.date.getDate());
if (titles.length) {
var title = /*#__PURE__*/_react.default.createElement("div", {
key: "title-wrapper-".concat(props.date.getDate())
}, titles.map(function (title, index) {
return /*#__PURE__*/_react.default.createElement("div", {
key: "title-text-".concat(index)
}, title);
}));
return /*#__PURE__*/_react.default.createElement(_Tooltip.Tooltip, {
title: title,
popperTooltipClassName: popperTooltipClassName,
popperTooltipStyle: popperTooltipStyle
}, child);
}
return child;
}, [weekends, nonWorkingDaysOfWeek, daysToModify, weekendLabel, nonWorkingDaysOfWeekLabel, popperTooltipClassName, popperTooltipStyle]);
var renderDatePickerForm = (0, _react.useCallback)(function () {
return /*#__PURE__*/_react.default.createElement(_DatePickerForm.DatePickerForm, {
onMonthChange: handleMonthChange,
month: month,
mode: mode,
selectionMode: selectionMode,
dateRequired: dateRequired,
selectedDays: newDates,
firstDayOfWeek: firstDayOfWeek,
saveButtonText: saveButtonText,
cancelButtonText: cancelButtonText,
clearButtonText: clearButtonText,
onDayClick: onDayClick,
onSave: handleSave,
onChange: handleChange,
onCancel: handleCancel,
onClear: handleClear,
disabledSaveButton: disabledSaveButton,
modifiers: modifiers,
renderDay: renderDay
});
}, [handleMonthChange, month, mode, selectionMode, dateRequired, newDates, firstDayOfWeek, saveButtonText, cancelButtonText, clearButtonText, onDayClick, handleSave, handleChange, handleCancel, handleClear, disabledSaveButton, modifiers, renderDay]);
var renderTargetEl = (0, _react.useMemo)(function () {
if (labelType === "icon" && icon) {
return /*#__PURE__*/_react.default.createElement(_SelectDateTarget.SelectDateTarget, {
icon: icon,
title: tooltipText,
targetIconClassName: targetIconClassName,
forceHideTooltip: showDatePicker,
popperTooltipClassName: popperTooltipClassName,
popperTooltipStyle: popperTooltipStyle,
active: showDatePicker
});
}
if (typeof labelType === "function") {
return labelType(labelText);
}
return /*#__PURE__*/_react.default.createElement(_Styles.StyledSelectDateButton, {
type: "button",
className: (0, _classnames.default)("date-picker-target", targetClassName)
}, /*#__PURE__*/_react.default.createElement("span", {
className: targetTextClassName
}, labelText));
}, [icon, labelText, labelType, popperTooltipClassName, popperTooltipStyle, showDatePicker, targetClassName, targetIconClassName, targetTextClassName, tooltipText]);
return /*#__PURE__*/_react.default.createElement(_Styles.StyledSelectDate, {
className: "select-date"
}, labelType !== "inline" ? /*#__PURE__*/_react.default.createElement(_Menu.Menu, {
target: renderTargetEl,
open: showDatePicker,
onOpen: handleShowDatePicker,
onBeforeClose: handleBeforeCloseMenu,
onClose: handleClose,
position: position,
menuClassName: menuClassName,
popperClassName: popperClassName,
backgroundElementClass: backgroundElementClass
}, renderDatePickerForm()) : renderDatePickerForm(), mode === "atomic" ? /*#__PURE__*/_react.default.createElement(_Styles.StyledConfirmDialog, {
className: "modal-select-date",
open: showDiscardModal,
onCancel: handleCloseDiscardModal,
onConfirm: handleSaveDiscardModal,
dialogTitle: modalHeaderText,
dialogContent: modalDiscardMessage,
cancelBtnText: modalCancelBtnText,
confirmBtnText: modalDiscardBtnText
}) : null);
};
SelectDate.displayName = "SelectDate";
//# sourceMappingURL=SelectDate.js.map