diff --git a/.gitignore b/.gitignore index ef1147bde..4e42cb183 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,6 @@ package-lock.json /scripts/ssh.mjs /pnpm-publish-summary.json + +# materials +!/packages/materials/src/uni-ui/lib diff --git a/packages/materials/src/uni-ui/index.ts b/packages/materials/src/uni-ui/index.ts index 26b1455dd..2534b57bd 100644 --- a/packages/materials/src/uni-ui/index.ts +++ b/packages/materials/src/uni-ui/index.ts @@ -14,54 +14,55 @@ import UniDataPicker from '@dcloudio/uni-ui/lib/uni-data-picker/uni-data-picker. import UniDataPickerview from '@dcloudio/uni-ui/lib/uni-data-pickerview/uni-data-pickerview.vue'; import UniDataSelect from '@dcloudio/uni-ui/lib/uni-data-select/uni-data-select.vue'; import UniDateformat from '@dcloudio/uni-ui/lib/uni-dateformat/uni-dateformat.vue'; -import UniDatetimePicker from '@dcloudio/uni-ui/lib/uni-datetime-picker/uni-datetime-picker.vue'; -import UniDrawer from '@dcloudio/uni-ui/lib/uni-drawer/uni-drawer.vue'; -import UniEasyinput from '@dcloudio/uni-ui/lib/uni-easyinput/uni-easyinput.vue'; -import UniFob from '@dcloudio/uni-ui/lib/uni-fab/uni-fab.vue'; -import UniFov from '@dcloudio/uni-ui/lib/uni-fav/uni-fav.vue'; -import UniFilePicker from '@dcloudio/uni-ui/lib/uni-file-picker/uni-file-picker.vue'; -import UniForms from '@dcloudio/uni-ui/lib/uni-forms/uni-forms.vue'; -import UniFormsItem from '@dcloudio/uni-ui/lib/uni-forms-item/uni-forms-item.vue'; -import UniGoodsNav from '@dcloudio/uni-ui/lib/uni-goods-nav/uni-goods-nav.vue'; -import UniGrid from '@dcloudio/uni-ui/lib/uni-grid/uni-grid.vue'; -import UniGridItem from '@dcloudio/uni-ui/lib/uni-grid-item/uni-grid-item.vue'; -import UniGroup from '@dcloudio/uni-ui/lib/uni-group/uni-group.vue'; -import UniIcons from '@dcloudio/uni-ui/lib/uni-icons/uni-icons.vue'; -import UniIndexedList from '@dcloudio/uni-ui/lib/uni-indexed-list/uni-indexed-list.vue'; -import UniLink from '@dcloudio/uni-ui/lib/uni-link/uni-link.vue'; -import UniList from '@dcloudio/uni-ui/lib/uni-list/uni-list.vue'; -import UniListItem from '@dcloudio/uni-ui/lib/uni-list-item/uni-list-item.vue'; -import UniListChat from '@dcloudio/uni-ui/lib/uni-list-chat/uni-list-chat.vue'; -import UniListAd from '@dcloudio/uni-ui/lib/uni-list-ad/uni-list-ad.vue'; -import UniLoadMore from '@dcloudio/uni-ui/lib/uni-load-more/uni-load-more.vue'; -import UniNavBar from '@dcloudio/uni-ui/lib/uni-nav-bar/uni-nav-bar.vue'; -import UniNoticeBar from '@dcloudio/uni-ui/lib/uni-notice-bar/uni-notice-bar.vue'; -import UniNumberBox from '@dcloudio/uni-ui/lib/uni-number-box/uni-number-box.vue'; -import UniPagination from '@dcloudio/uni-ui/lib/uni-pagination/uni-pagination.vue'; -import UniPopup from '@dcloudio/uni-ui/lib/uni-popup/uni-popup.vue'; -import UniPopupMessage from '@dcloudio/uni-ui/lib/uni-popup-message/uni-popup-message.vue'; -import UniPopupDialog from '@dcloudio/uni-ui/lib/uni-popup-dialog/uni-popup-dialog.vue'; -import UniPopupShare from '@dcloudio/uni-ui/lib/uni-popup-share/uni-popup-share.vue'; -import UniRate from '@dcloudio/uni-ui/lib/uni-rate/uni-rate.vue'; -import UniRow from '@dcloudio/uni-ui/lib/uni-row/uni-row.vue'; -import UniCol from '@dcloudio/uni-ui/lib/uni-col/uni-col.vue'; -import UniSearchBar from '@dcloudio/uni-ui/lib/uni-search-bar/uni-search-bar.vue'; -import UniSection from '@dcloudio/uni-ui/lib/uni-section/uni-section.vue'; -import UniSegmentedControl from '@dcloudio/uni-ui/lib/uni-segmented-control/uni-segmented-control.vue'; -import UniSteps from '@dcloudio/uni-ui/lib/uni-steps/uni-steps.vue'; -import UniSwipeAction from '@dcloudio/uni-ui/lib/uni-swipe-action/uni-swipe-action.vue'; -import UniSwipeActionItem from '@dcloudio/uni-ui/lib/uni-swipe-action-item/uni-swipe-action-item.vue'; -import UniSwiperDot from '@dcloudio/uni-ui/lib/uni-swiper-dot/uni-swiper-dot.vue'; -import UniTable from '@dcloudio/uni-ui/lib/uni-table/uni-table.vue'; -import UniThead from '@dcloudio/uni-ui/lib/uni-thead/uni-thead.vue'; -import UniTBody from '@dcloudio/uni-ui/lib/uni-tbody/uni-tbody.vue'; -import UniTr from '@dcloudio/uni-ui/lib/uni-tr/uni-tr.vue'; -import UniTh from '@dcloudio/uni-ui/lib/uni-th/uni-th.vue'; -import UniTd from '@dcloudio/uni-ui/lib/uni-td/uni-td.vue'; -import UniTag from '@dcloudio/uni-ui/lib/uni-tag/uni-tag.vue'; -import UniTitle from '@dcloudio/uni-ui/lib/uni-title/uni-title.vue'; -import UniTooltip from '@dcloudio/uni-ui/lib/uni-tooltip/uni-tooltip.vue'; -import UniTransition from '@dcloudio/uni-ui/lib/uni-transition/uni-transition.vue'; +// import UniDatetimePicker from '@dcloudio/uni-ui/lib/uni-datetime-picker/uni-datetime-picker.vue'; +import UniDatetimePicker from './lib/uni-datetime-picker/uni-datetime-picker.vue'; +// import UniDrawer from '@dcloudio/uni-ui/lib/uni-drawer/uni-drawer.vue'; +// import UniEasyinput from '@dcloudio/uni-ui/lib/uni-easyinput/uni-easyinput.vue'; +// import UniFob from '@dcloudio/uni-ui/lib/uni-fab/uni-fab.vue'; +// import UniFov from '@dcloudio/uni-ui/lib/uni-fav/uni-fav.vue'; +// import UniFilePicker from '@dcloudio/uni-ui/lib/uni-file-picker/uni-file-picker.vue'; +// import UniForms from '@dcloudio/uni-ui/lib/uni-forms/uni-forms.vue'; +// import UniFormsItem from '@dcloudio/uni-ui/lib/uni-forms-item/uni-forms-item.vue'; +// import UniGoodsNav from '@dcloudio/uni-ui/lib/uni-goods-nav/uni-goods-nav.vue'; +// import UniGrid from '@dcloudio/uni-ui/lib/uni-grid/uni-grid.vue'; +// import UniGridItem from '@dcloudio/uni-ui/lib/uni-grid-item/uni-grid-item.vue'; +// import UniGroup from '@dcloudio/uni-ui/lib/uni-group/uni-group.vue'; +// import UniIcons from '@dcloudio/uni-ui/lib/uni-icons/uni-icons.vue'; +// import UniIndexedList from '@dcloudio/uni-ui/lib/uni-indexed-list/uni-indexed-list.vue'; +// import UniLink from '@dcloudio/uni-ui/lib/uni-link/uni-link.vue'; +// import UniList from '@dcloudio/uni-ui/lib/uni-list/uni-list.vue'; +// import UniListItem from '@dcloudio/uni-ui/lib/uni-list-item/uni-list-item.vue'; +// import UniListChat from '@dcloudio/uni-ui/lib/uni-list-chat/uni-list-chat.vue'; +// import UniListAd from '@dcloudio/uni-ui/lib/uni-list-ad/uni-list-ad.vue'; +// import UniLoadMore from '@dcloudio/uni-ui/lib/uni-load-more/uni-load-more.vue'; +// import UniNavBar from '@dcloudio/uni-ui/lib/uni-nav-bar/uni-nav-bar.vue'; +// import UniNoticeBar from '@dcloudio/uni-ui/lib/uni-notice-bar/uni-notice-bar.vue'; +// import UniNumberBox from '@dcloudio/uni-ui/lib/uni-number-box/uni-number-box.vue'; +// import UniPagination from '@dcloudio/uni-ui/lib/uni-pagination/uni-pagination.vue'; +// import UniPopup from '@dcloudio/uni-ui/lib/uni-popup/uni-popup.vue'; +// import UniPopupMessage from '@dcloudio/uni-ui/lib/uni-popup-message/uni-popup-message.vue'; +// import UniPopupDialog from '@dcloudio/uni-ui/lib/uni-popup-dialog/uni-popup-dialog.vue'; +// import UniPopupShare from '@dcloudio/uni-ui/lib/uni-popup-share/uni-popup-share.vue'; +// import UniRate from '@dcloudio/uni-ui/lib/uni-rate/uni-rate.vue'; +// import UniRow from '@dcloudio/uni-ui/lib/uni-row/uni-row.vue'; +// import UniCol from '@dcloudio/uni-ui/lib/uni-col/uni-col.vue'; +// import UniSearchBar from '@dcloudio/uni-ui/lib/uni-search-bar/uni-search-bar.vue'; +// import UniSection from '@dcloudio/uni-ui/lib/uni-section/uni-section.vue'; +// import UniSegmentedControl from '@dcloudio/uni-ui/lib/uni-segmented-control/uni-segmented-control.vue'; +// import UniSteps from '@dcloudio/uni-ui/lib/uni-steps/uni-steps.vue'; +// import UniSwipeAction from '@dcloudio/uni-ui/lib/uni-swipe-action/uni-swipe-action.vue'; +// import UniSwipeActionItem from '@dcloudio/uni-ui/lib/uni-swipe-action-item/uni-swipe-action-item.vue'; +// import UniSwiperDot from '@dcloudio/uni-ui/lib/uni-swiper-dot/uni-swiper-dot.vue'; +// import UniTable from '@dcloudio/uni-ui/lib/uni-table/uni-table.vue'; +// import UniThead from '@dcloudio/uni-ui/lib/uni-thead/uni-thead.vue'; +// import UniTBody from '@dcloudio/uni-ui/lib/uni-tbody/uni-tbody.vue'; +// import UniTr from '@dcloudio/uni-ui/lib/uni-tr/uni-tr.vue'; +// import UniTh from '@dcloudio/uni-ui/lib/uni-th/uni-th.vue'; +// import UniTd from '@dcloudio/uni-ui/lib/uni-td/uni-td.vue'; +// import UniTag from '@dcloudio/uni-ui/lib/uni-tag/uni-tag.vue'; +// import UniTitle from '@dcloudio/uni-ui/lib/uni-title/uni-title.vue'; +// import UniTooltip from '@dcloudio/uni-ui/lib/uni-tooltip/uni-tooltip.vue'; +// import UniTransition from '@dcloudio/uni-ui/lib/uni-transition/uni-transition.vue'; // 62 const components = { @@ -79,54 +80,54 @@ const components = { UniDataPickerview, UniDataSelect, UniDateformat, - UniDatetimePicker, - UniDrawer, - UniEasyinput, - UniFob, - UniFov, - UniFilePicker, - UniForms, - UniFormsItem, - UniGoodsNav, - UniGrid, - UniGridItem, - UniGroup, - UniIcons, - UniIndexedList, - UniLink, - UniList, - UniListItem, - UniListChat, - UniListAd, - UniLoadMore, - UniNavBar, - UniNoticeBar, - UniNumberBox, - UniPagination, - UniPopup, - UniPopupMessage, - UniPopupDialog, - UniPopupShare, - UniRate, - UniRow, - UniCol, - UniSearchBar, - UniSection, - UniSegmentedControl, - UniSteps, - UniSwipeAction, - UniSwipeActionItem, - UniSwiperDot, - UniTable, - UniThead, - UniTBody, - UniTr, - UniTh, - UniTd, - UniTag, - UniTitle, - UniTooltip, - UniTransition + UniDatetimePicker + // UniDrawer, + // UniEasyinput, + // UniFob, + // UniFov, + // UniFilePicker, + // UniForms, + // UniFormsItem, + // UniGoodsNav, + // UniGrid, + // UniGridItem, + // UniGroup, + // UniIcons, + // UniIndexedList, + // UniLink, + // UniList, + // UniListItem, + // UniListChat, + // UniListAd, + // UniLoadMore, + // UniNavBar, + // UniNoticeBar, + // UniNumberBox, + // UniPagination, + // UniPopup, + // UniPopupMessage, + // UniPopupDialog, + // UniPopupShare, + // UniRate, + // UniRow, + // UniCol, + // UniSearchBar, + // UniSection, + // UniSegmentedControl, + // UniSteps, + // UniSwipeAction, + // UniSwipeActionItem, + // UniSwiperDot, + // UniTable, + // UniThead, + // UniTBody, + // UniTr, + // UniTh, + // UniTd, + // UniTag, + // UniTitle, + // UniTooltip, + // UniTransition }; export { UniBadge, UniBreadcrumb, UniBreadcrumbItem }; diff --git a/packages/materials/src/uni-ui/lib/uni-datetime-picker/calendar-item.vue b/packages/materials/src/uni-ui/lib/uni-datetime-picker/calendar-item.vue new file mode 100644 index 000000000..dba988799 --- /dev/null +++ b/packages/materials/src/uni-ui/lib/uni-datetime-picker/calendar-item.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/packages/materials/src/uni-ui/lib/uni-datetime-picker/calendar.vue b/packages/materials/src/uni-ui/lib/uni-datetime-picker/calendar.vue new file mode 100644 index 000000000..0f9e121e8 --- /dev/null +++ b/packages/materials/src/uni-ui/lib/uni-datetime-picker/calendar.vue @@ -0,0 +1,947 @@ + + + + + diff --git a/packages/materials/src/uni-ui/lib/uni-datetime-picker/i18n/en.json b/packages/materials/src/uni-ui/lib/uni-datetime-picker/i18n/en.json new file mode 100644 index 000000000..024f22f6b --- /dev/null +++ b/packages/materials/src/uni-ui/lib/uni-datetime-picker/i18n/en.json @@ -0,0 +1,22 @@ +{ + "uni-datetime-picker.selectDate": "select date", + "uni-datetime-picker.selectTime": "select time", + "uni-datetime-picker.selectDateTime": "select date and time", + "uni-datetime-picker.startDate": "start date", + "uni-datetime-picker.endDate": "end date", + "uni-datetime-picker.startTime": "start time", + "uni-datetime-picker.endTime": "end time", + "uni-datetime-picker.ok": "ok", + "uni-datetime-picker.clear": "clear", + "uni-datetime-picker.cancel": "cancel", + "uni-datetime-picker.year": "-", + "uni-datetime-picker.month": "", + "uni-calender.MON": "MON", + "uni-calender.TUE": "TUE", + "uni-calender.WED": "WED", + "uni-calender.THU": "THU", + "uni-calender.FRI": "FRI", + "uni-calender.SAT": "SAT", + "uni-calender.SUN": "SUN", + "uni-calender.confirm": "confirm" +} diff --git a/packages/materials/src/uni-ui/lib/uni-datetime-picker/i18n/index.js b/packages/materials/src/uni-ui/lib/uni-datetime-picker/i18n/index.js new file mode 100644 index 000000000..de7509c87 --- /dev/null +++ b/packages/materials/src/uni-ui/lib/uni-datetime-picker/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/packages/materials/src/uni-ui/lib/uni-datetime-picker/i18n/zh-Hans.json b/packages/materials/src/uni-ui/lib/uni-datetime-picker/i18n/zh-Hans.json new file mode 100644 index 000000000..d2df5e722 --- /dev/null +++ b/packages/materials/src/uni-ui/lib/uni-datetime-picker/i18n/zh-Hans.json @@ -0,0 +1,22 @@ +{ + "uni-datetime-picker.selectDate": "选择日期", + "uni-datetime-picker.selectTime": "选择时间", + "uni-datetime-picker.selectDateTime": "选择日期时间", + "uni-datetime-picker.startDate": "开始日期", + "uni-datetime-picker.endDate": "结束日期", + "uni-datetime-picker.startTime": "开始时间", + "uni-datetime-picker.endTime": "结束时间", + "uni-datetime-picker.ok": "确定", + "uni-datetime-picker.clear": "清除", + "uni-datetime-picker.cancel": "取消", + "uni-datetime-picker.year": "年", + "uni-datetime-picker.month": "月", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六", + "uni-calender.confirm": "确认" +} \ No newline at end of file diff --git a/packages/materials/src/uni-ui/lib/uni-datetime-picker/i18n/zh-Hant.json b/packages/materials/src/uni-ui/lib/uni-datetime-picker/i18n/zh-Hant.json new file mode 100644 index 000000000..d23fa3c39 --- /dev/null +++ b/packages/materials/src/uni-ui/lib/uni-datetime-picker/i18n/zh-Hant.json @@ -0,0 +1,22 @@ +{ + "uni-datetime-picker.selectDate": "選擇日期", + "uni-datetime-picker.selectTime": "選擇時間", + "uni-datetime-picker.selectDateTime": "選擇日期時間", + "uni-datetime-picker.startDate": "開始日期", + "uni-datetime-picker.endDate": "結束日期", + "uni-datetime-picker.startTime": "開始时间", + "uni-datetime-picker.endTime": "結束时间", + "uni-datetime-picker.ok": "確定", + "uni-datetime-picker.clear": "清除", + "uni-datetime-picker.cancel": "取消", + "uni-datetime-picker.year": "年", + "uni-datetime-picker.month": "月", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六", + "uni-calender.confirm": "確認" +} \ No newline at end of file diff --git a/packages/materials/src/uni-ui/lib/uni-datetime-picker/time-picker.vue b/packages/materials/src/uni-ui/lib/uni-datetime-picker/time-picker.vue new file mode 100644 index 000000000..181769244 --- /dev/null +++ b/packages/materials/src/uni-ui/lib/uni-datetime-picker/time-picker.vue @@ -0,0 +1,940 @@ + + + + + diff --git a/packages/materials/src/uni-ui/lib/uni-datetime-picker/uni-datetime-picker.vue b/packages/materials/src/uni-ui/lib/uni-datetime-picker/uni-datetime-picker.vue new file mode 100644 index 000000000..b54ae0315 --- /dev/null +++ b/packages/materials/src/uni-ui/lib/uni-datetime-picker/uni-datetime-picker.vue @@ -0,0 +1,1232 @@ + + + + diff --git a/packages/materials/src/uni-ui/lib/uni-datetime-picker/util.js b/packages/materials/src/uni-ui/lib/uni-datetime-picker/util.js new file mode 100644 index 000000000..6e9f47db8 --- /dev/null +++ b/packages/materials/src/uni-ui/lib/uni-datetime-picker/util.js @@ -0,0 +1,421 @@ +class Calendar { + constructor({ + selected, + startDate, + endDate, + range, + } = {}) { + // 当前日期 + this.date = this.getDateObj(new Date()) // 当前初入日期 + // 打点信息 + this.selected = selected || []; + // 起始时间 + this.startDate = startDate + // 终止时间 + this.endDate = endDate + // 是否范围选择 + this.range = range + // 多选状态 + this.cleanMultipleStatus() + // 每周日期 + this.weeks = {} + this.lastHover = false + } + /** + * 设置日期 + * @param {Object} date + */ + setDate(date) { + const selectDate = this.getDateObj(date) + this.getWeeks(selectDate.fullDate) + } + + /** + * 清理多选状态 + */ + cleanMultipleStatus() { + this.multipleStatus = { + before: '', + after: '', + data: [] + } + } + + setStartDate(startDate) { + this.startDate = startDate + } + + setEndDate(endDate) { + this.endDate = endDate + } + + getPreMonthObj(date) { + date = fixIosDateFormat(date) + date = new Date(date) + + const oldMonth = date.getMonth() + date.setMonth(oldMonth - 1) + const newMonth = date.getMonth() + if (oldMonth !== 0 && newMonth - oldMonth === 0) { + date.setMonth(newMonth - 1) + } + return this.getDateObj(date) + } + getNextMonthObj(date) { + date = fixIosDateFormat(date) + date = new Date(date) + + const oldMonth = date.getMonth() + date.setMonth(oldMonth + 1) + const newMonth = date.getMonth() + if (newMonth - oldMonth > 1) { + date.setMonth(newMonth - 1) + } + return this.getDateObj(date) + } + + /** + * 获取指定格式Date对象 + */ + getDateObj(date) { + date = fixIosDateFormat(date) + date = new Date(date) + + return { + fullDate: getDate(date), + year: date.getFullYear(), + month: addZero(date.getMonth() + 1), + date: addZero(date.getDate()), + day: date.getDay() + } + } + + /** + * 获取上一个月日期集合 + */ + getPreMonthDays(amount, dateObj) { + const result = [] + for (let i = amount - 1; i >= 0; i--) { + const month = dateObj.month - 1 + result.push({ + date: new Date(dateObj.year, month, -i).getDate(), + month, + disable: true + }) + } + return result + } + /** + * 获取本月日期集合 + */ + getCurrentMonthDays(amount, dateObj) { + const result = [] + const fullDate = this.date.fullDate + for (let i = 1; i <= amount; i++) { + const currentDate = `${dateObj.year}-${dateObj.month}-${addZero(i)}` + const isToday = fullDate === currentDate + // 获取打点信息 + const info = this.selected && this.selected.find((item) => { + if (this.dateEqual(currentDate, item.date)) { + return item + } + }) + + // 日期禁用 + let disableBefore = true + let disableAfter = true + if (this.startDate) { + disableBefore = dateCompare(this.startDate, currentDate) + } + + if (this.endDate) { + disableAfter = dateCompare(currentDate, this.endDate) + } + + let multiples = this.multipleStatus.data + let multiplesStatus = -1 + if (this.range && multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, currentDate) + }) + } + const checked = multiplesStatus !== -1 + + result.push({ + fullDate: currentDate, + year: dateObj.year, + date: i, + multiple: this.range ? checked : false, + beforeMultiple: this.isLogicBefore(currentDate, this.multipleStatus.before, this.multipleStatus.after), + afterMultiple: this.isLogicAfter(currentDate, this.multipleStatus.before, this.multipleStatus.after), + month: dateObj.month, + disable: (this.startDate && !dateCompare(this.startDate, currentDate)) || (this.endDate && !dateCompare( + currentDate, this.endDate)), + isToday, + userChecked: false, + extraInfo: info + }) + } + return result + } + /** + * 获取下一个月日期集合 + */ + _getNextMonthDays(amount, dateObj) { + const result = [] + const month = dateObj.month + 1 + for (let i = 1; i <= amount; i++) { + result.push({ + date: i, + month, + disable: true + }) + } + return result + } + + /** + * 获取当前日期详情 + * @param {Object} date + */ + getInfo(date) { + if (!date) { + date = new Date() + } + const res = this.calendar.find(item => item.fullDate === this.getDateObj(date).fullDate) + return res ? res : this.getDateObj(date) + } + + /** + * 比较时间是否相等 + */ + dateEqual(before, after) { + before = new Date(fixIosDateFormat(before)) + after = new Date(fixIosDateFormat(after)) + return before.valueOf() === after.valueOf() + } + + /** + * 比较真实起始日期 + */ + + isLogicBefore(currentDate, before, after) { + let logicBefore = before + if (before && after) { + logicBefore = dateCompare(before, after) ? before : after + } + return this.dateEqual(logicBefore, currentDate) + } + + isLogicAfter(currentDate, before, after) { + let logicAfter = after + if (before && after) { + logicAfter = dateCompare(before, after) ? after : before + } + return this.dateEqual(logicAfter, currentDate) + } + + /** + * 获取日期范围内所有日期 + * @param {Object} begin + * @param {Object} end + */ + geDateAll(begin, end) { + var arr = [] + var ab = begin.split('-') + var ae = end.split('-') + var db = new Date() + db.setFullYear(ab[0], ab[1] - 1, ab[2]) + var de = new Date() + de.setFullYear(ae[0], ae[1] - 1, ae[2]) + var unixDb = db.getTime() - 24 * 60 * 60 * 1000 + var unixDe = de.getTime() - 24 * 60 * 60 * 1000 + for (var k = unixDb; k <= unixDe;) { + k = k + 24 * 60 * 60 * 1000 + arr.push(this.getDateObj(new Date(parseInt(k))).fullDate) + } + return arr + } + + /** + * 获取多选状态 + */ + setMultiple(fullDate) { + if (!this.range) return + + let { + before, + after + } = this.multipleStatus + if (before && after) { + if (!this.lastHover) { + this.lastHover = true + return + } + this.multipleStatus.before = fullDate + this.multipleStatus.after = '' + this.multipleStatus.data = [] + this.multipleStatus.fulldate = '' + this.lastHover = false + } else { + if (!before) { + this.multipleStatus.before = fullDate + this.multipleStatus.after = undefined; + this.lastHover = false + } else { + this.multipleStatus.after = fullDate + if (dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus + .after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus + .before); + } + this.lastHover = true + } + } + this.getWeeks(fullDate) + } + + /** + * 鼠标 hover 更新多选状态 + */ + setHoverMultiple(fullDate) { + //抖音小程序点击会触发hover事件,需要避免一下 + // #ifndef MP-TOUTIAO + if (!this.range || this.lastHover) return + const { + before + } = this.multipleStatus + + if (!before) { + this.multipleStatus.before = fullDate + } else { + this.multipleStatus.after = fullDate + if (dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before); + } + } + this.getWeeks(fullDate) + // #endif + + } + + /** + * 更新默认值多选状态 + */ + setDefaultMultiple(before, after) { + this.multipleStatus.before = before + this.multipleStatus.after = after + if (before && after) { + if (dateCompare(before, after)) { + this.multipleStatus.data = this.geDateAll(before, after); + this.getWeeks(after) + } else { + this.multipleStatus.data = this.geDateAll(after, before); + this.getWeeks(before) + } + } + } + + /** + * 获取每周数据 + * @param {Object} dateData + */ + getWeeks(dateData) { + const { + year, + month, + } = this.getDateObj(dateData) + + const preMonthDayAmount = new Date(year, month - 1, 1).getDay() + const preMonthDays = this.getPreMonthDays(preMonthDayAmount, this.getDateObj(dateData)) + + const currentMonthDayAmount = new Date(year, month, 0).getDate() + const currentMonthDays = this.getCurrentMonthDays(currentMonthDayAmount, this.getDateObj(dateData)) + + const nextMonthDayAmount = 42 - preMonthDayAmount - currentMonthDayAmount + const nextMonthDays = this._getNextMonthDays(nextMonthDayAmount, this.getDateObj(dateData)) + + const calendarDays = [...preMonthDays, ...currentMonthDays, ...nextMonthDays] + + const weeks = new Array(6) + for (let i = 0; i < calendarDays.length; i++) { + const index = Math.floor(i / 7) + if (!weeks[index]) { + weeks[index] = new Array(7) + } + weeks[index][i % 7] = calendarDays[i] + } + + this.calendar = calendarDays + this.weeks = weeks + } +} + +function getDateTime(date, hideSecond) { + return `${getDate(date)} ${getTime(date, hideSecond)}` +} + +function getDate(date) { + date = fixIosDateFormat(date) + date = new Date(date) + const year = date.getFullYear() + const month = date.getMonth() + 1 + const day = date.getDate() + return `${year}-${addZero(month)}-${addZero(day)}` +} + +function getTime(date, hideSecond) { + date = fixIosDateFormat(date) + date = new Date(date) + const hour = date.getHours() + const minute = date.getMinutes() + const second = date.getSeconds() + return hideSecond ? `${addZero(hour)}:${addZero(minute)}` : `${addZero(hour)}:${addZero(minute)}:${addZero(second)}` +} + +function addZero(num) { + if (num < 10) { + num = `0${num}` + } + return num +} + +function getDefaultSecond(hideSecond) { + return hideSecond ? '00:00' : '00:00:00' +} + +function dateCompare(startDate, endDate) { + startDate = new Date(fixIosDateFormat(startDate)) + endDate = new Date(fixIosDateFormat(endDate)) + return startDate <= endDate +} + +function checkDate(date) { + const dateReg = /((19|20)\d{2})(-|\/)\d{1,2}(-|\/)\d{1,2}/g + return date.match(dateReg) +} +//ios低版本15及以下,无法匹配 没有 ’秒‘ 时的情况,所以需要在末尾 秒 加上 问号 +const dateTimeReg = /^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])( [0-5]?[0-9]:[0-5]?[0-9](:[0-5]?[0-9])?)?$/; + +function fixIosDateFormat(value) { + if (typeof value === 'string' && dateTimeReg.test(value)) { + value = value.replace(/-/g, '/') + } + return value +} + +export { + Calendar, + getDateTime, + getDate, + getTime, + addZero, + getDefaultSecond, + dateCompare, + checkDate, + fixIosDateFormat +}