UNPKG

@pisell/pisellos

Version:

一个可扩展的前端模块化SDK框架,支持插件系统

273 lines (266 loc) 14.7 kB
var _excluded = ["form_id", "id", "times"]; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } 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 _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } import dayjs from 'dayjs'; /** * 生成当前月份的所有日期 * @param startDate 开始日期 * @param endDate 结束日期 * @param type 类型:按月查 | 按周查 * @returns 日期列表 */ export var generateMonthDates = function generateMonthDates(startDate, endDate, type) { // 如果是按月查询需要从01号开始,如果是按周查询以开始结束时间为准 var start = type === 'day' ? dayjs(startDate).format('YYYY-MM-DD') : dayjs(startDate).format('YYYY-MM-01'); var end = dayjs(endDate).format('YYYY-MM-DD'); var dates = []; var currentDate = dayjs(start); while (dayjs(currentDate).isBefore(dayjs(end), 'day') || dayjs(currentDate).isSame(dayjs(end), 'day')) { dates.push({ date: dayjs(currentDate).format('YYYY-MM-DD'), week: dayjs(currentDate).format('ddd'), weekNum: dayjs(currentDate).day(), status: 'available' }); currentDate = dayjs(currentDate).add(1, 'day'); } return dates; }; /** * 禁用所有日期 * @param dates 日期列表 * @returns 日期列表 */ export var disableAllDates = function disableAllDates(dates) { return dates.map(function (date) { return _objectSpread(_objectSpread({}, date), {}, { status: 'unavailable' }); }); }; /** * 禁用某一天之前的日期,如不传则默认今天 * @param dates 日期列表 * @param oneDay 日期 * @returns 日期列表 */ export var disableDatesBeforeOneDay = function disableDatesBeforeOneDay(dates, oneDay) { var day = oneDay ? dayjs(oneDay).format('YYYY-MM-DD') : dayjs().format('YYYY-MM-DD'); return dates.map(function (date) { if (dayjs(date.date).isBefore(day, 'day')) { return _objectSpread(_objectSpread({}, date), {}, { status: 'unavailable' }); } else { return date; } }); }; /** * 根据资源中的日期处理出每个日期下存在的可用资源,根据form_id进行分类 * @param resources 资源列表 * @param dates 日期列表 * @returns 日期列表 */ export var handleAvailableDateByResource = function handleAvailableDateByResource(resources, dates) { var dateMap = {}; resources.forEach(function (resource) { var form_id = resource.form_id, id = resource.id, times = resource.times, others = _objectWithoutProperties(resource, _excluded); times.forEach(function (time) { var start_at = time.start_at; var date = dayjs(start_at).format('YYYY-MM-DD'); if (!dateMap[date]) { dateMap[date] = [_objectSpread(_objectSpread({ form_id: form_id, id: id }, others), {}, { times: [time] })]; } else { var _dateMap$date$filter; var temp = (_dateMap$date$filter = dateMap[date].filter(function (item) { return item.id === id; })) === null || _dateMap$date$filter === void 0 ? void 0 : _dateMap$date$filter[0]; if (temp) { temp.times.push(time); } else { dateMap[date].push(_objectSpread(_objectSpread({ form_id: form_id, id: id }, others), {}, { times: [time] })); } } }); }); return dates.map(function (date) { var resource = dateMap[date.date]; if (resource) { return _objectSpread(_objectSpread({}, date), {}, { resource: resource }); } else { return _objectSpread(_objectSpread({}, date), {}, { status: 'unavailable', resource: [] }); } }); }; /** * 根据规则判定哪些日期是可用的 * @param dates 日期列表 * @param rules 提前量规则 * @returns 日期列表 */ export var handleAvailableDatesByRules = function handleAvailableDatesByRules(dates, rules) { var newDates = disableDatesBeforeOneDay(dates); if (!(rules !== null && rules !== void 0 && rules.length)) { return newDates; } var scheduleMap = {}; // 日程列表 var latestStartDate = ''; // 最晚开始日期 var earliestEndDate = ''; // 最早结束日期 var resourceFormIds = []; rules.forEach(function (rule) { var _rule$schedule, _rule$resourceFormIds; // 如果有日程列表,需要将它去重加入到scheduleMap if (rule !== null && rule !== void 0 && (_rule$schedule = rule.schedule) !== null && _rule$schedule !== void 0 && _rule$schedule.length) { var _iterator = _createForOfIteratorHelper(rule.schedule), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var item = _step.value; // 判断item.date是否在dates的开始和结束日期范围内,如果不在则跳过 if (dayjs(item.date).isBefore(dayjs(newDates[0].date), 'day')) { continue; } // 判断日程日期是否超过了dates中的最后一个日期,如果超过了则循环break if (dayjs(item.date).isAfter(dayjs(newDates[newDates.length - 1].date), 'day')) { break; } // 在范围内的日程如果scheduleMap中不存在,则加入到scheduleMap if (!scheduleMap[item.date]) { scheduleMap[item.date] = item; } else { if (!item.isExcluded) { scheduleMap[item.date].isExcluded = false; } } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } var _ref = (rule === null || rule === void 0 ? void 0 : rule.cut_off_time) || {}, future_day = _ref.future_day, unit = _ref.unit, unit_type = _ref.unit_type; // 预定天数存在,则开始计算从当前时间开始往后推预定天数作为结束时间 if (future_day) { var endDate = dayjs().add(future_day, 'day'); if (!earliestEndDate || endDate.isBefore(dayjs(earliestEndDate), 'day')) { earliestEndDate = endDate.format('YYYY-MM-DD'); } } else if (future_day === 0) { var _endDate = dayjs(); if (!earliestEndDate || _endDate.isBefore(dayjs(earliestEndDate), 'day')) { earliestEndDate = _endDate.format('YYYY-MM-DD'); } } // 如果存在提前预约时间,则开始计算从当前时间开始往后推提前预约时间作为开始时间 if (unit && unit_type) { var startDate = dayjs(dayjs().add(unit, unit_type).format('YYYY-MM-DD')); if (!latestStartDate || startDate.isAfter(dayjs(latestStartDate), 'day')) { latestStartDate = startDate.format('YYYY-MM-DD'); } } if (rule !== null && rule !== void 0 && (_rule$resourceFormIds = rule.resourceFormIds) !== null && _rule$resourceFormIds !== void 0 && _rule$resourceFormIds.length) { // 去重 resourceFormIds = _toConsumableArray(new Set([].concat(_toConsumableArray(resourceFormIds), _toConsumableArray(rule === null || rule === void 0 ? void 0 : rule.resourceFormIds)))); } }); newDates = newDates.map(function (date) { var _date$resource, _resourceFormIds; var disabledDate = _objectSpread(_objectSpread({}, date), {}, { status: 'unavailable' }); var hasScheduleConfig = rules.find(function (n) { var _n$schedule; return (_n$schedule = n.schedule) === null || _n$schedule === void 0 ? void 0 : _n$schedule.length; }); // 如果外面穿了 schedule,但是这个时候scheduleMap为空,则设置为不可用 // 这种情况为,商品设置了 5.1-5.31 可用,资源设置了 5.1-6.30 可用,session 类商品详情弹窗里里看到的6 月以后的日期都应该是不可用的 if (Object.keys(scheduleMap).length === 0 && hasScheduleConfig) { return _objectSpread(_objectSpread({}, date), {}, { color: '', status: 'unavailable' }); } // 根据日程判断日期是否可用 if (Object.keys(scheduleMap).length) { var schedule = scheduleMap[date.date]; // 如果日程不存在 或者 日程存在但是需要排除,则设置为不可用 if (!schedule || schedule !== null && schedule !== void 0 && schedule.isExcluded) { return _objectSpread(_objectSpread({}, date), {}, { color: schedule === null || schedule === void 0 ? void 0 : schedule.color, status: 'unavailable' }); } else { date.color = schedule === null || schedule === void 0 ? void 0 : schedule.color; disabledDate.color = schedule === null || schedule === void 0 ? void 0 : schedule.color; } } // 如果资源不存在,则设置为不可用 if (!(date !== null && date !== void 0 && (_date$resource = date.resource) !== null && _date$resource !== void 0 && _date$resource.length)) { return disabledDate; } if (latestStartDate || earliestEndDate) { // 如果时间在最早开始时间之前,则设置为不可用 if (latestStartDate && dayjs(date.date).isBefore(latestStartDate, 'day')) { return disabledDate; } // 如果时间在最早结束时间之后,则设置为不可用 if (earliestEndDate && dayjs(date.date).isAfter(earliestEndDate, 'day')) { return disabledDate; } } // 如果存在资源form_id,则开始计算资源form_id在日期上是否全部存在 if ((_resourceFormIds = resourceFormIds) !== null && _resourceFormIds !== void 0 && _resourceFormIds.length) { var hasReourceCount = 0; resourceFormIds.forEach(function (formId) { var _date$resource2; if ((date === null || date === void 0 || (_date$resource2 = date.resource) === null || _date$resource2 === void 0 ? void 0 : _date$resource2.find(function (item) { return item.form_id === formId; })) !== undefined) { hasReourceCount++; } }); // 如果所需要的资源在日期上不足,则设置为不可用 if (hasReourceCount < resourceFormIds.length) { return disabledDate; } } return date; }); return newDates; };