diff --git a/resources/assets/js/components/AppDown.vue b/resources/assets/js/components/AppDown.vue index 8bad1925..94557efe 100644 --- a/resources/assets/js/components/AppDown.vue +++ b/resources/assets/js/components/AppDown.vue @@ -160,7 +160,8 @@ export default { // 网页版(提示有客户端下载) this.repoData = (this.releases.assets || []).find(({name}) => $A.strExists(name, hostName)); if (this.repoData) { - console.log("有客户端"); + let latestVersion = $A.leftDelete(this.releases.tag_name.toLowerCase(), "v") + console.log("Exist client: " + latestVersion); this.status = 1; } } diff --git a/resources/assets/js/pages/manage/calendar.vue b/resources/assets/js/pages/manage/calendar.vue index 9706bc08..8c18eb15 100644 --- a/resources/assets/js/pages/manage/calendar.vue +++ b/resources/assets/js/pages/manage/calendar.vue @@ -37,7 +37,7 @@ disable-click/>
@@ -83,16 +83,33 @@ export default { this.setRenderRange(); }, + deactivated() { + this.$store.dispatch("forgetTaskCompleteTemp", true); + }, + computed: { - ...mapState(['userId', 'cacheTasks']), + ...mapState(['userId', 'cacheTasks', 'taskCompleteTemps']), ...mapGetters(['transforTasks']), list() { - const datas = this.transforTasks(this.cacheTasks.filter(({complete_at, owner, end_at}) => { - return !complete_at && owner && end_at; - })); - return datas.map(data => { + const {cacheTasks, taskCompleteTemps} = this; + const filterTask = (task, chackCompleted = true) => { + if (task.complete_at && chackCompleted === true) { + return false; + } + if (!task.end_at) { + return false; + } + return task.owner; + } + let array = cacheTasks.filter(task => filterTask(task)); + let tmps = taskCompleteTemps.filter(task => filterTask(task, false)); + if (tmps.length > 0) { + array = $A.cloneJSON(array) + array.push(...tmps); + } + return this.transforTasks(array).map(data => { const isAllday = $A.rightExists(data.start_at, "00:00:00") && $A.rightExists(data.end_at, "23:59:59") const task = { id: data.id, @@ -106,12 +123,12 @@ export default { color: "#515a6e", bgColor: data.color || '#E3EAFD', borderColor: data.p_color, - complete_at: data.complete_at, priority: '', preventClick: true, preventCheckHide: true, - isChecked: false, + isChecked: !!data.complete_at, // + complete_at: data.complete_at, start_at: data.start_at, end_at: data.end_at, _time: data._time, @@ -128,7 +145,11 @@ export default { if (data.flow_item_name) { task.title = `[${data.flow_item_name}] ${task.title}` } - if (data.overdue) { + if (data.complete_at) { + task.color = "#c3c2c2" + task.bgColor = "#f3f3f3" + task.borderColor = "#e3e3e3" + } else if (data.overdue) { task.title = `[${this.$L('超期')}] ${task.title}` task.color = "#f56c6c" task.bgColor = data.color || "#fef0f0" diff --git a/resources/assets/js/pages/manage/components/ProjectList.vue b/resources/assets/js/pages/manage/components/ProjectList.vue index 2f9cb093..aaa13c15 100644 --- a/resources/assets/js/pages/manage/components/ProjectList.vue +++ b/resources/assets/js/pages/manage/components/ProjectList.vue @@ -611,9 +611,10 @@ export default { myList() { const {cacheTasks, taskCompleteTemps, sortField, sortType} = this; let array = cacheTasks.filter(task => this.myFilter(task)); - if (taskCompleteTemps.length > 0) { + let tmps = taskCompleteTemps.filter(task => this.myFilter(task, false)); + if (tmps.length > 0) { array = $A.cloneJSON(array) - array.push(...taskCompleteTemps.filter(task => this.myFilter(task, false))); + array.push(...tmps); } return array.sort((a, b) => { if (sortType == 'asc') { @@ -633,9 +634,10 @@ export default { helpList() { const {cacheTasks, taskCompleteTemps, sortField, sortType} = this; let array = cacheTasks.filter(task => this.helpFilter(task)); - if (taskCompleteTemps.length > 0) { + let tmps = taskCompleteTemps.filter(task => this.helpFilter(task, false)); + if (tmps.length > 0) { array = $A.cloneJSON(array) - array.push(...taskCompleteTemps.filter(task => this.helpFilter(task, false))); + array.push(...tmps); } return array.sort((a, b) => { if (sortType == 'asc') { diff --git a/resources/assets/js/pages/manage/components/TaskMenu.vue b/resources/assets/js/pages/manage/components/TaskMenu.vue index e9e51aaa..cb01c14e 100644 --- a/resources/assets/js/pages/manage/components/TaskMenu.vue +++ b/resources/assets/js/pages/manage/components/TaskMenu.vue @@ -95,6 +95,10 @@ export default { type: Boolean, default: true }, + updateBefore: { + type: Boolean, + default: false + }, size: { type: String, default: 'small' @@ -174,20 +178,34 @@ export default { const cacheTask = this.task; switch (command) { case 'complete': - if (this.task.complete_at) return; + if (this.task.complete_at) { + return; + } + if (this.updateBefore) { + this.$store.dispatch("saveTaskCompleteTemp", cacheTask) + } this.updateTask({ complete_at: $A.formatDate("Y-m-d H:i:s") }).then(() => { this.$store.dispatch("saveTaskCompleteTemp", cacheTask) + }).catch(() => { + this.$store.dispatch("forgetTaskCompleteTemp", cacheTask.id) }) break; case 'uncomplete': - if (!this.task.complete_at) return; + if (!this.task.complete_at) { + return; + } + if (this.updateBefore) { + this.$store.dispatch("forgetTaskCompleteTemp", cacheTask.id) + } this.updateTask({ complete_at: false }).then(() => { this.$store.dispatch("forgetTaskCompleteTemp", cacheTask.id) + }).catch(() => { + this.$store.dispatch("saveTaskCompleteTemp", cacheTask) }) break; @@ -205,8 +223,9 @@ export default { }, updateTask(updata) { - return new Promise(resolve => { + return new Promise((resolve, reject) => { if (this.loadIng) { + reject() return; } // @@ -220,6 +239,7 @@ export default { }).catch(({msg}) => { $A.modalError(msg); this.$store.dispatch("getTaskOne", this.task.id); + reject() }); }) }, diff --git a/resources/assets/js/pages/manage/project.vue b/resources/assets/js/pages/manage/project.vue index 831f6c93..4e6236f9 100644 --- a/resources/assets/js/pages/manage/project.vue +++ b/resources/assets/js/pages/manage/project.vue @@ -54,6 +54,7 @@ export default { } }); }); + this.$store.dispatch("forgetTaskCompleteTemp", true); }); } } diff --git a/resources/assets/js/store/getters.js b/resources/assets/js/store/getters.js index 3a881d4e..c1e8eb11 100644 --- a/resources/assets/js/store/getters.js +++ b/resources/assets/js/store/getters.js @@ -108,47 +108,36 @@ export default { } }, - /** - * 我所有的任务(未完成) - * @param state - * @returns {unknown[]} - */ - ownerTasks(state) { - return state.cacheTasks.filter(({complete_at, owner}) => { - if (complete_at) { - return false; - } - return owner; - }) - }, - /** * 仪表盘任务数据 * @param state - * @param getters * @returns {{overdue: *, today: *}} */ - dashboardTask(state, getters) { + dashboardTask(state) { const todayStart = $A.Date($A.formatDate("Y-m-d 00:00:00")), todayEnd = $A.Date($A.formatDate("Y-m-d 23:59:59")), todayNow = $A.Date($A.formatDate("Y-m-d H:i:s")); - let {ownerTasks} = getters; - if (state.taskCompleteTemps.length > 0) { - ownerTasks = $A.cloneJSON(ownerTasks) - ownerTasks.push(...state.taskCompleteTemps); - } - const todayTasks = ownerTasks.filter(task => { + const filterTask = (task, chackCompleted = true) => { + if (task.complete_at && chackCompleted === true) { + return false; + } if (!task.end_at) { return false; } + return task.owner; + } + let array = state.cacheTasks.filter(task => filterTask(task)); + let tmps = state.taskCompleteTemps.filter(task => filterTask(task, false)); + if (tmps.length > 0) { + array = $A.cloneJSON(array) + array.push(...tmps); + } + const todayTasks = array.filter(task => { const start = $A.Date(task.start_at), end = $A.Date(task.end_at); return (start <= todayStart && todayStart <= end) || (start <= todayEnd && todayEnd <= end) || (start > todayStart && todayEnd > end); }) - const overdueTasks = ownerTasks.filter(task => { - if (!task.end_at) { - return false; - } + const overdueTasks = array.filter(task => { return $A.Date(task.end_at) <= todayNow; }) return { diff --git a/resources/assets/sass/element.scss b/resources/assets/sass/element.scss index 232379ce..0df34d3c 100644 --- a/resources/assets/sass/element.scss +++ b/resources/assets/sass/element.scss @@ -20,16 +20,9 @@ $--dropdown-menuItem-hover-color: #606266; min-width: 100px; .item { &.red { - color: #f00; + color: #f00 !important; > i { - color: #f00; - } - } - &:hover { - &.red { - > i { - color: #f00; - } + color: #f00 !important; } } } diff --git a/resources/assets/sass/pages/page-calendar.scss b/resources/assets/sass/pages/page-calendar.scss index 63b4f3d6..6e4458b2 100644 --- a/resources/assets/sass/pages/page-calendar.scss +++ b/resources/assets/sass/pages/page-calendar.scss @@ -65,6 +65,11 @@ } .tui-full-calendar-popup { box-shadow: none; + .tui-full-calendar-section-header { + .tui-full-calendar-ic-checkbox-checked { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAhFBMVEUAAACLz3CLz3CLz3CKzm6Gy2+Lz3CLz3CL0HCLz3CLz3CLz3CLz3CMz3GLz3CKz3CLz3CL0HCJ0G+KznCN0HCL0HCLz3CKz3CLz3CLz3CLz3CMz3CLz3CLz3GL0XCL0HCN0XKLz3CLz3CMz3CLz3CM0HCM0G+FzHCLz3CKz3CMz3CLz3Bod5CFAAAAK3RSTlMA18RAOQ3s8+Pc0rmyq3tpiUwTgBnovyDMjmNSRjUvJQX5yKB0WisKppuUFLaY7gAAAotJREFUeNrtm+FymkAUhc8KqIAgSkyUtkmsmqa97/9+HWeSudpCd8qZ7E0m+73A9/1gxmXx4IK0nbipvDFTN2lT9JDVToLh6gx/sHQSFLfEFZUEp8IFczFgrv5CTChe/TsxYvfy/IkZy7M/c2KGywDUYkgNIBdDciARUxI0YkqDiZgygRNTHKZiyhRiTAyIATEgBsSAGBADYsAnCJgdmtIywKUAOrsA94QzJyKA95/pbALcPV7piADGryzDB+Rnv3IkAhi/UhMBjF9pQwbk3/A3JRXA+7GjAng/DqEC5v3+dMYE8P6nQsIEzFOPnw7g/QpC+R8K4QJ4f5iAzaA/TMAm6fdvZQgY+wW2fn9A0a66Bee/2xLH8kp/Rr1MB/3jAxaP0ALCPzagzPBCM9r/XcYH3K4BLfD4vw75xwdMbqB4CmaD/vEB2ztc0RD+MQHFg+c85fffDPv9AbPUd6Lz+ydCBDyjh1//6WcCGngK1L8a8lMBJTwFfj8XIC16+SnX7Af9bIDUngLSrwFEwaD/VogA5YheDj7/Wv1MgL9g/8XjpwNk+c8Cyq8BYwqePX46QOkGCmi/BowrqFi/Bvg4wYv6y7e4Kz4Rfj5AnzY/WSlcwHAB5+cD9ivKzwfIbEX4qQA99RB+NkDfO4b5sRAigHjzpP0C6u6D9wuo2z/eL+DvXx8Zv4C4gVd/qABxCeFnApQT5+cDpOP8fICcLv2VxbfjlQZUNh+vU/XbBIj6jQLm9wDWlZgFyOaYHJ3Ix/gDQwyIATEgBsSAGODBfuBgPvEwH7m0YkqLVExJYfsQuPcwdjOf+5kPHoFKjKio0e3Hn90WUCyGt7v3Nf0GsjqXYOR1hh6SJsz8v0mg/AZRXmaRKXtJBwAAAABJRU5ErkJggg==); + } + } .tui-full-calendar-popup-container { border: 0; box-shadow: 0 1px 6px rgba(0, 0, 0, 0.2);