From 1baafb2a639d667a4d54fa72caf7754dd253ccfc Mon Sep 17 00:00:00 2001 From: wangchen Date: Mon, 10 Jul 2023 18:00:11 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=8B=89=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/index/instruct.vue | 2 +- uni_modules/uni-calendar/changelog.md | 18 ++++---- .../uni-calendar/uni-calendar-item.vue | 9 ++-- .../components/uni-calendar/uni-calendar.vue | 44 ++++++++++--------- uni_modules/uni-calendar/package.json | 2 +- uni_modules/uni-calendar/readme.md | 6 +-- 6 files changed, 43 insertions(+), 38 deletions(-) diff --git a/pages/index/instruct.vue b/pages/index/instruct.vue index 91d0d39..49c1710 100644 --- a/pages/index/instruct.vue +++ b/pages/index/instruct.vue @@ -81,7 +81,7 @@ - + diff --git a/uni_modules/uni-calendar/changelog.md b/uni_modules/uni-calendar/changelog.md index 302b60d..f291eec 100644 --- a/uni_modules/uni-calendar/changelog.md +++ b/uni_modules/uni-calendar/changelog.md @@ -1,21 +1,23 @@ +## 1.4.10(2023-04-10) +- 修复 某些情况 monthSwitch 未触发的Bug ## 1.4.9(2023-02-02) -- 修复 某些情况切换月份错误问题 +- 修复 某些情况切换月份错误的Bug ## 1.4.8(2023-01-30) -- 修复 某些情况切换月份错误问题 +- 修复 某些情况切换月份错误的Bug [详情](https://ask.dcloud.net.cn/question/161964) ## 1.4.7(2022-09-16) -- 可以使用 uni-scss 控制主题色 +- 优化 支持使用 uni-scss 控制主题色 ## 1.4.6(2022-09-08) -- fix: 表头年月切换,导致改变当前日期为选择月1号,且未触发change事件 +- 修复 表头年月切换,导致改变当前日期为选择月1号,且未触发change事件的Bug ## 1.4.5(2022-02-25) -- 修复 条件编译 nvue 不支持的 css 样式 +- 修复 条件编译 nvue 不支持的 css 样式的Bug ## 1.4.4(2022-02-25) -- 修复 条件编译 nvue 不支持的 css 样式 +- 修复 条件编译 nvue 不支持的 css 样式的Bug ## 1.4.3(2021-09-22) -- 修复 startDate、 endDate 属性失效的 bug +- 修复 startDate、 endDate 属性失效的Bug ## 1.4.2(2021-08-24) - 新增 支持国际化 ## 1.4.1(2021-08-05) -- 修复 弹出层被 tabbar 遮盖 bug +- 修复 弹出层被 tabbar 遮盖的Bug ## 1.4.0(2021-07-30) - 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) ## 1.3.16(2021-05-12) diff --git a/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue index d29ead5..bf714c2 100644 --- a/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue +++ b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue @@ -51,11 +51,10 @@ + \ No newline at end of file diff --git a/pages/index/instructDetails.vue b/pages/index/instructDetails.vue new file mode 100644 index 0000000..65c99c5 --- /dev/null +++ b/pages/index/instructDetails.vue @@ -0,0 +1,277 @@ + + + + + \ No newline at end of file diff --git a/static/images/u176.png b/static/images/u176.png new file mode 100644 index 0000000000000000000000000000000000000000..e7f2de6b18d67ca49edc9df978212ac86e7f071a GIT binary patch literal 26975 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 QApf)78At2V)4#?150=-?#sB~S literal 0 HcmV?d00001 diff --git a/static/images/u86.png b/static/images/u86.png new file mode 100644 index 0000000000000000000000000000000000000000..02db7a4acb50b74ddec73d88063f4cb21b2ebd50 GIT binary patch literal 20902 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 - - - - {{weeks.date}} - - - - - - - - + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue index 29b1b03..ec8e472 100644 --- a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue @@ -1,929 +1,929 @@ - - - - - + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json index 024f22f..56cd0a6 100644 --- a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json @@ -1,22 +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" -} +{ + "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/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js index de7509c..fa8f0f3 100644 --- a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js @@ -1,8 +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 +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/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue index 81a042a..f03dff6 100644 --- a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue @@ -1,934 +1,934 @@ - - - - - + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue index 8769e83..7650d0f 100644 --- a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue @@ -1,1032 +1,1032 @@ - - - - + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js index fc98623..3ea5bb1 100644 --- a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js @@ -1,453 +1,453 @@ -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 ? dateObj.month -1 : 12 - const year = month === 12 ? dateObj.year - 1 : dateObj.year - const date = new Date(year,month,-i).getDate() - const fullDate = `${year}-${addZero(month)}-${addZero(date)}` - let multiples = this.multipleStatus.data - let multiplesStatus = -1 - if (this.range && multiples) { - multiplesStatus = multiples.findIndex((item) => { - return this.dateEqual(item, fullDate) - }) - } - const checked = multiplesStatus !== -1 - // 获取打点信息 - const extraInfo = this.selected && this.selected.find((item) => { - if (this.dateEqual(fullDate, item.date)) { - return item - } - }) - result.push({ - fullDate, - year, - month, - date, - multiple: this.range ? checked : false, - beforeMultiple: this.isLogicBefore(fullDate, this.multipleStatus.before, this.multipleStatus.after), - afterMultiple: this.isLogicAfter(fullDate, this.multipleStatus.before, this.multipleStatus.after), - disable: (this.startDate && !dateCompare(this.startDate, fullDate)) || (this.endDate && !dateCompare(fullDate,this.endDate)), - isToday: fullDate === this.date.fullDate, - userChecked: false, - extraInfo - }) - } - 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 extraInfo = 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, - month: dateObj.month, - 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), - disable: (this.startDate && !dateCompare(this.startDate, currentDate)) || (this.endDate && !dateCompare(currentDate,this.endDate)), - isToday, - userChecked: false, - extraInfo - }) - } - return result - } - /** - * 获取下一个月日期集合 - */ - _getNextMonthDays(amount, dateObj) { - const result = [] - const month = dateObj.month + 1 - for (let i = 1; i <= amount; i++) { - const month = dateObj.month === 12 ? 1 : dateObj.month*1 + 1 - const year = month === 1 ? dateObj.year + 1 : dateObj.year - const fullDate = `${year}-${addZero(month)}-${addZero(i)}` - let multiples = this.multipleStatus.data - let multiplesStatus = -1 - if (this.range && multiples) { - multiplesStatus = multiples.findIndex((item) => { - return this.dateEqual(item, fullDate) - }) - } - const checked = multiplesStatus !== -1 - // 获取打点信息 - const extraInfo = this.selected && this.selected.find((item) => { - if (this.dateEqual(fullDate, item.date)) { - return item - } - }) - result.push({ - fullDate, - year, - date: i, - month, - multiple: this.range ? checked : false, - beforeMultiple: this.isLogicBefore(fullDate, this.multipleStatus.before, this.multipleStatus.after), - afterMultiple: this.isLogicAfter(fullDate, this.multipleStatus.before, this.multipleStatus.after), - disable: (this.startDate && !dateCompare(this.startDate, fullDate)) || (this.endDate && !dateCompare(fullDate,this.endDate)), - isToday: fullDate === this.date.fullDate, - userChecked: false, - extraInfo - }) - } - return result - } - - /** - * 获取当前日期详情 - * @param {Object} date - */ - getInfo(date) { - if (!date) { - date = new Date() - } - - return this.calendar.find(item => item.fullDate === this.getDateObj(date).fullDate) - } - - /** - * 比较时间是否相等 - */ - 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.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) { - 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) - } - - /** - * 更新默认值多选状态 - */ - 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) -} - -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 -} - +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 ? dateObj.month -1 : 12 + const year = month === 12 ? dateObj.year - 1 : dateObj.year + const date = new Date(year,month,-i).getDate() + const fullDate = `${year}-${addZero(month)}-${addZero(date)}` + let multiples = this.multipleStatus.data + let multiplesStatus = -1 + if (this.range && multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, fullDate) + }) + } + const checked = multiplesStatus !== -1 + // 获取打点信息 + const extraInfo = this.selected && this.selected.find((item) => { + if (this.dateEqual(fullDate, item.date)) { + return item + } + }) + result.push({ + fullDate, + year, + month, + date, + multiple: this.range ? checked : false, + beforeMultiple: this.isLogicBefore(fullDate, this.multipleStatus.before, this.multipleStatus.after), + afterMultiple: this.isLogicAfter(fullDate, this.multipleStatus.before, this.multipleStatus.after), + disable: (this.startDate && !dateCompare(this.startDate, fullDate)) || (this.endDate && !dateCompare(fullDate,this.endDate)), + isToday: fullDate === this.date.fullDate, + userChecked: false, + extraInfo + }) + } + 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 extraInfo = 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, + month: dateObj.month, + 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), + disable: (this.startDate && !dateCompare(this.startDate, currentDate)) || (this.endDate && !dateCompare(currentDate,this.endDate)), + isToday, + userChecked: false, + extraInfo + }) + } + return result + } + /** + * 获取下一个月日期集合 + */ + _getNextMonthDays(amount, dateObj) { + const result = [] + const month = dateObj.month + 1 + for (let i = 1; i <= amount; i++) { + const month = dateObj.month === 12 ? 1 : dateObj.month*1 + 1 + const year = month === 1 ? dateObj.year + 1 : dateObj.year + const fullDate = `${year}-${addZero(month)}-${addZero(i)}` + let multiples = this.multipleStatus.data + let multiplesStatus = -1 + if (this.range && multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, fullDate) + }) + } + const checked = multiplesStatus !== -1 + // 获取打点信息 + const extraInfo = this.selected && this.selected.find((item) => { + if (this.dateEqual(fullDate, item.date)) { + return item + } + }) + result.push({ + fullDate, + year, + date: i, + month, + multiple: this.range ? checked : false, + beforeMultiple: this.isLogicBefore(fullDate, this.multipleStatus.before, this.multipleStatus.after), + afterMultiple: this.isLogicAfter(fullDate, this.multipleStatus.before, this.multipleStatus.after), + disable: (this.startDate && !dateCompare(this.startDate, fullDate)) || (this.endDate && !dateCompare(fullDate,this.endDate)), + isToday: fullDate === this.date.fullDate, + userChecked: false, + extraInfo + }) + } + return result + } + + /** + * 获取当前日期详情 + * @param {Object} date + */ + getInfo(date) { + if (!date) { + date = new Date() + } + + return this.calendar.find(item => item.fullDate === this.getDateObj(date).fullDate) + } + + /** + * 比较时间是否相等 + */ + 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.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) { + 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) + } + + /** + * 更新默认值多选状态 + */ + 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) +} + +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} \ No newline at end of file diff --git a/uni_modules/uni-table/changelog.md b/uni_modules/uni-table/changelog.md new file mode 100644 index 0000000..cacf2a6 --- /dev/null +++ b/uni_modules/uni-table/changelog.md @@ -0,0 +1,27 @@ +## 1.2.3(2023-03-28) +- 修复 在vue3模式下可能会出现错误的问题 +## 1.2.2(2022-11-29) +- 优化 主题样式 +## 1.2.1(2022-06-06) +- 修复 微信小程序存在无使用组件的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-table](https://uniapp.dcloud.io/component/uniui/uni-table) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-07-08) +- 新增 uni-th 支持 date 日期筛选范围 +## 1.0.6(2021-07-05) +- 新增 uni-th 支持 range 筛选范围 +## 1.0.5(2021-06-28) +- 新增 uni-th 筛选功能 +## 1.0.4(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的Bug +## 1.0.3(2021-04-16) +- 新增 sortable 属性,是否开启单列排序 +- 优化 表格多选逻辑 +## 1.0.2(2021-03-22) +- uni-tr 添加 disabled 属性,用于 type=selection 时,设置某行是否可由全选按钮控制 +## 1.0.1(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-table/components/uni-table/uni-table.vue b/uni_modules/uni-table/components/uni-table/uni-table.vue new file mode 100644 index 0000000..9fe681d --- /dev/null +++ b/uni_modules/uni-table/components/uni-table/uni-table.vue @@ -0,0 +1,455 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue b/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue new file mode 100644 index 0000000..1d808b3 --- /dev/null +++ b/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-td/uni-td.vue b/uni_modules/uni-table/components/uni-td/uni-td.vue new file mode 100644 index 0000000..e0d743b --- /dev/null +++ b/uni_modules/uni-table/components/uni-td/uni-td.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-th/filter-dropdown.vue b/uni_modules/uni-table/components/uni-th/filter-dropdown.vue new file mode 100644 index 0000000..add1098 --- /dev/null +++ b/uni_modules/uni-table/components/uni-th/filter-dropdown.vue @@ -0,0 +1,511 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-th/uni-th.vue b/uni_modules/uni-table/components/uni-th/uni-th.vue new file mode 100644 index 0000000..75fa42a --- /dev/null +++ b/uni_modules/uni-table/components/uni-th/uni-th.vue @@ -0,0 +1,285 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-thead/uni-thead.vue b/uni_modules/uni-table/components/uni-thead/uni-thead.vue new file mode 100644 index 0000000..a12078a --- /dev/null +++ b/uni_modules/uni-table/components/uni-thead/uni-thead.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-tr/table-checkbox.vue b/uni_modules/uni-table/components/uni-tr/table-checkbox.vue new file mode 100644 index 0000000..f22936b --- /dev/null +++ b/uni_modules/uni-table/components/uni-tr/table-checkbox.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-tr/uni-tr.vue b/uni_modules/uni-table/components/uni-tr/uni-tr.vue new file mode 100644 index 0000000..d5cdee6 --- /dev/null +++ b/uni_modules/uni-table/components/uni-tr/uni-tr.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/uni_modules/uni-table/i18n/en.json b/uni_modules/uni-table/i18n/en.json new file mode 100644 index 0000000..cc9c4a3 --- /dev/null +++ b/uni_modules/uni-table/i18n/en.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "Reset", + "filter-dropdown.search": "Search", + "filter-dropdown.submit": "Submit", + "filter-dropdown.filter": "Filter", + "filter-dropdown.gt": "Greater or equal to", + "filter-dropdown.lt": "Less than or equal to", + "filter-dropdown.date": "Date" +} diff --git a/uni_modules/uni-table/i18n/es.json b/uni_modules/uni-table/i18n/es.json new file mode 100644 index 0000000..9c4705c --- /dev/null +++ b/uni_modules/uni-table/i18n/es.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "Reiniciar", + "filter-dropdown.search": "Búsqueda", + "filter-dropdown.submit": "Entregar", + "filter-dropdown.filter": "Filtrar", + "filter-dropdown.gt": "Mayor o igual a", + "filter-dropdown.lt": "Menos que o igual a", + "filter-dropdown.date": "Fecha" +} diff --git a/uni_modules/uni-table/i18n/fr.json b/uni_modules/uni-table/i18n/fr.json new file mode 100644 index 0000000..389a9ae --- /dev/null +++ b/uni_modules/uni-table/i18n/fr.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "Réinitialiser", + "filter-dropdown.search": "Chercher", + "filter-dropdown.submit": "Soumettre", + "filter-dropdown.filter": "Filtre", + "filter-dropdown.gt": "Supérieur ou égal à", + "filter-dropdown.lt": "Inférieur ou égal à", + "filter-dropdown.date": "Date" +} diff --git a/uni_modules/uni-table/i18n/index.js b/uni_modules/uni-table/i18n/index.js new file mode 100644 index 0000000..2293b0d --- /dev/null +++ b/uni_modules/uni-table/i18n/index.js @@ -0,0 +1,12 @@ +import en from './en.json' +import es from './es.json' +import fr from './fr.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + es, + fr, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-table/i18n/zh-Hans.json b/uni_modules/uni-table/i18n/zh-Hans.json new file mode 100644 index 0000000..0b1afab --- /dev/null +++ b/uni_modules/uni-table/i18n/zh-Hans.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "重置", + "filter-dropdown.search": "搜索", + "filter-dropdown.submit": "确定", + "filter-dropdown.filter": "筛选", + "filter-dropdown.gt": "大于等于", + "filter-dropdown.lt": "小于等于", + "filter-dropdown.date": "日期范围" +} diff --git a/uni_modules/uni-table/i18n/zh-Hant.json b/uni_modules/uni-table/i18n/zh-Hant.json new file mode 100644 index 0000000..d633f2d --- /dev/null +++ b/uni_modules/uni-table/i18n/zh-Hant.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "重置", + "filter-dropdown.search": "搜索", + "filter-dropdown.submit": "確定", + "filter-dropdown.filter": "篩選", + "filter-dropdown.gt": "大於等於", + "filter-dropdown.lt": "小於等於", + "filter-dropdown.date": "日期範圍" +} diff --git a/uni_modules/uni-table/package.json b/uni_modules/uni-table/package.json new file mode 100644 index 0000000..16cbb53 --- /dev/null +++ b/uni_modules/uni-table/package.json @@ -0,0 +1,83 @@ +{ + "id": "uni-table", + "displayName": "uni-table 表格", + "version": "1.2.3", + "description": "表格组件,多用于展示多条结构类似的数据,如", + "keywords": [ + "uni-ui", + "uniui", + "table", + "表格" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss","uni-datetime-picker"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "n", + "QQ": "y" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-table/readme.md b/uni_modules/uni-table/readme.md new file mode 100644 index 0000000..a0f93cf --- /dev/null +++ b/uni_modules/uni-table/readme.md @@ -0,0 +1,13 @@ + + +## Table 表单 +> 组件名:``uni-table``,代码块: `uTable`。 + +用于展示多条结构类似的数据 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-table) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + + From 9eeb8a0cb33cefa1b2d5ef288d6c382bc6129972 Mon Sep 17 00:00:00 2001 From: wangchen Date: Thu, 13 Jul 2023 11:12:15 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E8=A3=85=E8=88=B9=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=E9=9D=99=E6=80=81=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/index/instruct.vue | 1 - pages/index/instructDetails.vue | 284 ++++++++- uni_modules/uni-popup/changelog.md | 2 + .../components/uni-popup/uni-popup.vue | 3 +- uni_modules/uni-popup/package.json | 2 +- uni_modules/uni-transition/changelog.md | 32 +- .../uni-transition/createAnimation.js | 225 ++++---- .../uni-transition/uni-transition.vue | 539 +++++++++--------- uni_modules/uni-transition/package.json | 169 +++--- uni_modules/uni-transition/readme.md | 20 +- 10 files changed, 772 insertions(+), 505 deletions(-) diff --git a/pages/index/instruct.vue b/pages/index/instruct.vue index e07b478..477fde0 100644 --- a/pages/index/instruct.vue +++ b/pages/index/instruct.vue @@ -345,7 +345,6 @@ itemSum() { return function(item) { let sum = (60 / item) * 100 - console.log(sum); return sum }; } diff --git a/pages/index/instructDetails.vue b/pages/index/instructDetails.vue index 65c99c5..6314da3 100644 --- a/pages/index/instructDetails.vue +++ b/pages/index/instructDetails.vue @@ -12,7 +12,7 @@ 船名: 1123 - + @@ -27,7 +27,7 @@ 港口: 1123 - + @@ -42,10 +42,10 @@ 备注: 1123 - + - + @@ -54,7 +54,7 @@ 货代: 1123 - + @@ -69,10 +69,10 @@ 联系方式: 1123 - + - + @@ -201,11 +201,160 @@ 2 3 4 - 残损 + + + + + + + + + + 残损信息 + + + + + 品牌: + 车型: + 车架号/条形码: + + + + 质损发生环节: 收车交接 + 已收车 + + + + 质损上报人员: 张星星 + + + 质损上报时间: 2023/09/08 23:00 + + + 质损发生位置: 舱内 + + + + + 质损概况: 磕伤 + + + 损坏情况: 凹陷 + + + 处置情况: 其他 这是一段关于其他的描述 + + + + + 质损照片: + + + + + + + + + + + + + + + + + + + 车架号照片: + + + + + + + + + + + + + + + + + 质损发生环节: 收车交接 + 已收车 + + + 备注:这段备注很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长 + + + + 质损上报人员: 张星星 + + + 质损上报时间: 2023/09/08 23:00 + + + 质损发生位置: 舱内 + + + + + 质损概况: 磕伤 + + + 损坏情况: 凹陷 + + + 处置情况: 其他 这是一段关 + + + + + 质损照片: + + + + + + + + + + + + + + + + + + + 车架号照片: + + + + + + + + + + + + + + + + + @@ -220,18 +369,17 @@ HeadInfo }, methods: { - cs() { - console.log(1); + open() { + this.$refs.popup.open('center') + }, + close() { + this.$refs.popup.close() } } } \ No newline at end of file diff --git a/uni_modules/uni-popup/changelog.md b/uni_modules/uni-popup/changelog.md index 41abeb4..bc59f07 100644 --- a/uni_modules/uni-popup/changelog.md +++ b/uni_modules/uni-popup/changelog.md @@ -1,3 +1,5 @@ +## 1.8.3(2023-04-17) +- 修复 uni-popup 重复打开时的 bug ## 1.8.2(2023-02-02) - uni-popup-dialog 组件新增 inputType 属性 ## 1.8.1(2022-12-01) diff --git a/uni_modules/uni-popup/components/uni-popup/uni-popup.vue b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue index db90c59..54afee2 100644 --- a/uni_modules/uni-popup/components/uni-popup/uni-popup.vue +++ b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue @@ -269,8 +269,7 @@ open(direction) { // fix by mehaotian 处理快速打开关闭的情况 if (this.showPopup) { - clearTimeout(this.timer) - this.showPopup = false + return } let innerType = ['top', 'center', 'bottom', 'left', 'right', 'message', 'dialog', 'share'] if (!(direction && innerType.indexOf(direction) !== -1)) { diff --git a/uni_modules/uni-popup/package.json b/uni_modules/uni-popup/package.json index 8a17034..f40556b 100644 --- a/uni_modules/uni-popup/package.json +++ b/uni_modules/uni-popup/package.json @@ -1,7 +1,7 @@ { "id": "uni-popup", "displayName": "uni-popup 弹出层", - "version": "1.8.2", + "version": "1.8.3", "description": " Popup 组件,提供常用的弹层", "keywords": [ "uni-ui", diff --git a/uni_modules/uni-transition/changelog.md b/uni_modules/uni-transition/changelog.md index ad489f1..70c1cd4 100644 --- a/uni_modules/uni-transition/changelog.md +++ b/uni_modules/uni-transition/changelog.md @@ -1,20 +1,22 @@ +## 1.3.2(2023-05-04) +- 修复 NVUE 平台报错的问题 ## 1.3.1(2021-11-23) - 修复 init 方法初始化问题 ## 1.3.0(2021-11-19) - 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) - 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition) -## 1.2.1(2021-09-27) -- 修复 init 方法不生效的 Bug -## 1.2.0(2021-07-30) -- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.1.1(2021-05-12) -- 新增 示例地址 -- 修复 示例项目缺少组件的 Bug -## 1.1.0(2021-04-22) -- 新增 通过方法自定义动画 -- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式 -- 优化 动画触发逻辑,使动画更流畅 -- 优化 支持单独的动画类型 -- 优化 文档示例 -## 1.0.2(2021-02-05) -- 调整为 uni_modules 目录规范 +## 1.2.1(2021-09-27) +- 修复 init 方法不生效的 Bug +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.1(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的 Bug +## 1.1.0(2021-04-22) +- 新增 通过方法自定义动画 +- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式 +- 优化 动画触发逻辑,使动画更流畅 +- 优化 支持单独的动画类型 +- 优化 文档示例 +## 1.0.2(2021-02-05) +- 调整为 uni_modules 目录规范 diff --git a/uni_modules/uni-transition/components/uni-transition/createAnimation.js b/uni_modules/uni-transition/components/uni-transition/createAnimation.js index af47dbc..8f89b18 100644 --- a/uni_modules/uni-transition/components/uni-transition/createAnimation.js +++ b/uni_modules/uni-transition/components/uni-transition/createAnimation.js @@ -1,128 +1,131 @@ -// const defaultOption = { -// duration: 300, -// timingFunction: 'linear', -// delay: 0, -// transformOrigin: '50% 50% 0' -// } -// #ifdef APP-NVUE -const nvueAnimation = uni.requireNativePlugin('animation') -// #endif -class MPAnimation { - constructor(options, _this) { - this.options = options - this.animation = uni.createAnimation(options) - this.currentStepAnimates = {} - this.next = 0 - this.$ = _this - - } - - _nvuePushAnimates(type, args) { - let aniObj = this.currentStepAnimates[this.next] - let styles = {} - if (!aniObj) { - styles = { - styles: {}, - config: {} - } - } else { - styles = aniObj - } - if (animateTypes1.includes(type)) { - if (!styles.styles.transform) { - styles.styles.transform = '' +// const defaultOption = { +// duration: 300, +// timingFunction: 'linear', +// delay: 0, +// transformOrigin: '50% 50% 0' +// } +// #ifdef APP-NVUE +const nvueAnimation = uni.requireNativePlugin('animation') +// #endif +class MPAnimation { + constructor(options, _this) { + this.options = options + // 在iOS10+QQ小程序平台下,传给原生的对象一定是个普通对象而不是Proxy对象,否则会报parameter should be Object instead of ProxyObject的错误 + this.animation = uni.createAnimation({ + ...options + }) + this.currentStepAnimates = {} + this.next = 0 + this.$ = _this + + } + + _nvuePushAnimates(type, args) { + let aniObj = this.currentStepAnimates[this.next] + let styles = {} + if (!aniObj) { + styles = { + styles: {}, + config: {} + } + } else { + styles = aniObj + } + if (animateTypes1.includes(type)) { + if (!styles.styles.transform) { + styles.styles.transform = '' } let unit = '' if(type === 'rotate'){ unit = 'deg' - } - styles.styles.transform += `${type}(${args+unit}) ` - } else { - styles.styles[type] = `${args}` - } - this.currentStepAnimates[this.next] = styles - } - _animateRun(styles = {}, config = {}) { - let ref = this.$.$refs['ani'].ref - if (!ref) return + } + styles.styles.transform += `${type}(${args+unit}) ` + } else { + styles.styles[type] = `${args}` + } + this.currentStepAnimates[this.next] = styles + } + _animateRun(styles = {}, config = {}) { + let ref = this.$.$refs['ani'].ref + if (!ref) return return new Promise((resolve, reject) => { - nvueAnimation.transition(ref, { - styles, - ...config - }, res => { - resolve() - }) - }) - } - - _nvueNextAnimate(animates, step = 0, fn) { - let obj = animates[step] - if (obj) { - let { - styles, - config - } = obj - this._animateRun(styles, config).then(() => { - step += 1 - this._nvueNextAnimate(animates, step, fn) - }) - } else { - this.currentStepAnimates = {} - typeof fn === 'function' && fn() - this.isEnd = true - } - } - + nvueAnimation.transition(ref, { + styles, + ...config + }, res => { + resolve() + }) + }) + } + + _nvueNextAnimate(animates, step = 0, fn) { + let obj = animates[step] + if (obj) { + let { + styles, + config + } = obj + this._animateRun(styles, config).then(() => { + step += 1 + this._nvueNextAnimate(animates, step, fn) + }) + } else { + this.currentStepAnimates = {} + typeof fn === 'function' && fn() + this.isEnd = true + } + } + step(config = {}) { // #ifndef APP-NVUE - this.animation.step(config) - // #endif - // #ifdef APP-NVUE + this.animation.step(config) + // #endif + // #ifdef APP-NVUE this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config) this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin - this.next++ - // #endif - return this - } - - run(fn) { + this.next++ + // #endif + return this + } + + run(fn) { // #ifndef APP-NVUE - this.$.animationData = this.animation.export() + this.$.animationData = this.animation.export() this.$.timer = setTimeout(() => { - typeof fn === 'function' && fn() - }, this.$.durationTime) - // #endif - // #ifdef APP-NVUE + typeof fn === 'function' && fn() + }, this.$.durationTime) + // #endif + // #ifdef APP-NVUE this.isEnd = false let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref - if(!ref) return - this._nvueNextAnimate(this.currentStepAnimates, 0, fn) - this.next = 0 - // #endif - } -} - - -const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d', - 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY', - 'translateZ' -] -const animateTypes2 = ['opacity', 'backgroundColor'] -const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom'] -animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => { - MPAnimation.prototype[type] = function(...args) { + if(!ref) return + this._nvueNextAnimate(this.currentStepAnimates, 0, fn) + this.next = 0 + // #endif + } +} + + +const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d', + 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY', + 'translateZ' +] +const animateTypes2 = ['opacity', 'backgroundColor'] +const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom'] +animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => { + MPAnimation.prototype[type] = function(...args) { // #ifndef APP-NVUE this.animation[type](...args) - // #endif - // #ifdef APP-NVUE - this._nvuePushAnimates(type, args) - // #endif - return this - } -}) - + // #endif + // #ifdef APP-NVUE + this._nvuePushAnimates(type, args) + // #endif + return this + } +}) + export function createAnimation(option, _this) { - if(!_this) return - clearTimeout(_this.timer) - return new MPAnimation(option, _this) + if(!_this) return + clearTimeout(_this.timer) + return new MPAnimation(option, _this) } diff --git a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue index be5e794..bfbba93 100644 --- a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue +++ b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue @@ -1,277 +1,286 @@ - - - - + return this + }, + /** + * ref 触发 执行动画 + */ + run(fn) { + if (!this.animation) return + this.animation.run(fn) + }, + // 开始过度动画 + open() { + clearTimeout(this.timer) + this.transform = '' + this.isShow = true + let { opacity, transform } = this.styleInit(false) + if (typeof opacity !== 'undefined') { + this.opacity = opacity + } + this.transform = transform + // 确保动态样式已经生效后,执行动画,如果不加 nextTick ,会导致 wx 动画执行异常 + this.$nextTick(() => { + // TODO 定时器保证动画完全执行,目前有些问题,后面会取消定时器 + this.timer = setTimeout(() => { + this.animation = createAnimation(this.config, this) + this.tranfromInit(false).step() + this.animation.run() + this.$emit('change', { + detail: this.isShow + }) + }, 20) + }) + }, + // 关闭过度动画 + close(type) { + if (!this.animation) return + this.tranfromInit(true) + .step() + .run(() => { + this.isShow = false + this.animationData = null + this.animation = null + let { opacity, transform } = this.styleInit(false) + this.opacity = opacity || 1 + this.transform = transform + this.$emit('change', { + detail: this.isShow + }) + }) + }, + // 处理动画开始前的默认样式 + styleInit(type) { + let styles = { + transform: '' + } + let buildStyle = (type, mode) => { + if (mode === 'fade') { + styles.opacity = this.animationType(type)[mode] + } else { + styles.transform += this.animationType(type)[mode] + ' ' + } + } + if (typeof this.modeClass === 'string') { + buildStyle(type, this.modeClass) + } else { + this.modeClass.forEach(mode => { + buildStyle(type, mode) + }) + } + return styles + }, + // 处理内置组合动画 + tranfromInit(type) { + let buildTranfrom = (type, mode) => { + let aniNum = null + if (mode === 'fade') { + aniNum = type ? 0 : 1 + } else { + aniNum = type ? '-100%' : '0' + if (mode === 'zoom-in') { + aniNum = type ? 0.8 : 1 + } + if (mode === 'zoom-out') { + aniNum = type ? 1.2 : 1 + } + if (mode === 'slide-right') { + aniNum = type ? '100%' : '0' + } + if (mode === 'slide-bottom') { + aniNum = type ? '100%' : '0' + } + } + this.animation[this.animationMode()[mode]](aniNum) + } + if (typeof this.modeClass === 'string') { + buildTranfrom(type, this.modeClass) + } else { + this.modeClass.forEach(mode => { + buildTranfrom(type, mode) + }) + } + + return this.animation + }, + animationType(type) { + return { + fade: type ? 1 : 0, + 'slide-top': `translateY(${type ? '0' : '-100%'})`, + 'slide-right': `translateX(${type ? '0' : '100%'})`, + 'slide-bottom': `translateY(${type ? '0' : '100%'})`, + 'slide-left': `translateX(${type ? '0' : '-100%'})`, + 'zoom-in': `scaleX(${type ? 1 : 0.8}) scaleY(${type ? 1 : 0.8})`, + 'zoom-out': `scaleX(${type ? 1 : 1.2}) scaleY(${type ? 1 : 1.2})` + } + }, + // 内置动画类型与实际动画对应字典 + animationMode() { + return { + fade: 'opacity', + 'slide-top': 'translateY', + 'slide-right': 'translateX', + 'slide-bottom': 'translateY', + 'slide-left': 'translateX', + 'zoom-in': 'scale', + 'zoom-out': 'scale' + } + }, + // 驼峰转中横线 + toLine(name) { + return name.replace(/([A-Z])/g, '-$1').toLowerCase() + } + } +} + + diff --git a/uni_modules/uni-transition/package.json b/uni_modules/uni-transition/package.json index 379e9aa..ea995a2 100644 --- a/uni_modules/uni-transition/package.json +++ b/uni_modules/uni-transition/package.json @@ -1,87 +1,84 @@ -{ - "id": "uni-transition", - "displayName": "uni-transition 过渡动画", - "version": "1.3.1", - "description": "元素的简单过渡动画", - "keywords": [ - "uni-ui", - "uniui", - "动画", - "过渡", - "过渡动画" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" - }, - "uni_modules": { - "dependencies": ["uni-scss"], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "y" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } +{ + "id": "uni-transition", + "displayName": "uni-transition 过渡动画", + "version": "1.3.2", + "description": "元素的简单过渡动画", + "keywords": [ + "uni-ui", + "uniui", + "动画", + "过渡", + "过渡动画" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } \ No newline at end of file diff --git a/uni_modules/uni-transition/readme.md b/uni_modules/uni-transition/readme.md index 1e104fe..2f8a77e 100644 --- a/uni_modules/uni-transition/readme.md +++ b/uni_modules/uni-transition/readme.md @@ -1,11 +1,11 @@ - - -## Transition 过渡动画 -> **组件名:uni-transition** -> 代码块: `uTransition` - - -元素过渡动画 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition) + + +## Transition 过渡动画 +> **组件名:uni-transition** +> 代码块: `uTransition` + + +元素过渡动画 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition) #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file