优化完成任务标记
This commit is contained in:
parent
4652242d6b
commit
6b7f8fd31c
@ -160,7 +160,8 @@ export default {
|
|||||||
// 网页版(提示有客户端下载)
|
// 网页版(提示有客户端下载)
|
||||||
this.repoData = (this.releases.assets || []).find(({name}) => $A.strExists(name, hostName));
|
this.repoData = (this.releases.assets || []).find(({name}) => $A.strExists(name, hostName));
|
||||||
if (this.repoData) {
|
if (this.repoData) {
|
||||||
console.log("有客户端");
|
let latestVersion = $A.leftDelete(this.releases.tag_name.toLowerCase(), "v")
|
||||||
|
console.log("Exist client: " + latestVersion);
|
||||||
this.status = 1;
|
this.status = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
disable-click/>
|
disable-click/>
|
||||||
</div>
|
</div>
|
||||||
<div class="calendar-menu" :style="calendarMenuStyles">
|
<div class="calendar-menu" :style="calendarMenuStyles">
|
||||||
<TaskMenu ref="calendarTaskMenu" :task="calendarTask"/>
|
<TaskMenu ref="calendarTaskMenu" :task="calendarTask" updateBefore/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -83,16 +83,33 @@ export default {
|
|||||||
this.setRenderRange();
|
this.setRenderRange();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
deactivated() {
|
||||||
|
this.$store.dispatch("forgetTaskCompleteTemp", true);
|
||||||
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
...mapState(['userId', 'cacheTasks']),
|
...mapState(['userId', 'cacheTasks', 'taskCompleteTemps']),
|
||||||
|
|
||||||
...mapGetters(['transforTasks']),
|
...mapGetters(['transforTasks']),
|
||||||
|
|
||||||
list() {
|
list() {
|
||||||
const datas = this.transforTasks(this.cacheTasks.filter(({complete_at, owner, end_at}) => {
|
const {cacheTasks, taskCompleteTemps} = this;
|
||||||
return !complete_at && owner && end_at;
|
const filterTask = (task, chackCompleted = true) => {
|
||||||
}));
|
if (task.complete_at && chackCompleted === true) {
|
||||||
return datas.map(data => {
|
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 isAllday = $A.rightExists(data.start_at, "00:00:00") && $A.rightExists(data.end_at, "23:59:59")
|
||||||
const task = {
|
const task = {
|
||||||
id: data.id,
|
id: data.id,
|
||||||
@ -106,12 +123,12 @@ export default {
|
|||||||
color: "#515a6e",
|
color: "#515a6e",
|
||||||
bgColor: data.color || '#E3EAFD',
|
bgColor: data.color || '#E3EAFD',
|
||||||
borderColor: data.p_color,
|
borderColor: data.p_color,
|
||||||
complete_at: data.complete_at,
|
|
||||||
priority: '',
|
priority: '',
|
||||||
preventClick: true,
|
preventClick: true,
|
||||||
preventCheckHide: true,
|
preventCheckHide: true,
|
||||||
isChecked: false,
|
isChecked: !!data.complete_at,
|
||||||
//
|
//
|
||||||
|
complete_at: data.complete_at,
|
||||||
start_at: data.start_at,
|
start_at: data.start_at,
|
||||||
end_at: data.end_at,
|
end_at: data.end_at,
|
||||||
_time: data._time,
|
_time: data._time,
|
||||||
@ -128,7 +145,11 @@ export default {
|
|||||||
if (data.flow_item_name) {
|
if (data.flow_item_name) {
|
||||||
task.title = `[${data.flow_item_name}] ${task.title}`
|
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.title = `[${this.$L('超期')}] ${task.title}`
|
||||||
task.color = "#f56c6c"
|
task.color = "#f56c6c"
|
||||||
task.bgColor = data.color || "#fef0f0"
|
task.bgColor = data.color || "#fef0f0"
|
||||||
|
@ -611,9 +611,10 @@ export default {
|
|||||||
myList() {
|
myList() {
|
||||||
const {cacheTasks, taskCompleteTemps, sortField, sortType} = this;
|
const {cacheTasks, taskCompleteTemps, sortField, sortType} = this;
|
||||||
let array = cacheTasks.filter(task => this.myFilter(task));
|
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 = $A.cloneJSON(array)
|
||||||
array.push(...taskCompleteTemps.filter(task => this.myFilter(task, false)));
|
array.push(...tmps);
|
||||||
}
|
}
|
||||||
return array.sort((a, b) => {
|
return array.sort((a, b) => {
|
||||||
if (sortType == 'asc') {
|
if (sortType == 'asc') {
|
||||||
@ -633,9 +634,10 @@ export default {
|
|||||||
helpList() {
|
helpList() {
|
||||||
const {cacheTasks, taskCompleteTemps, sortField, sortType} = this;
|
const {cacheTasks, taskCompleteTemps, sortField, sortType} = this;
|
||||||
let array = cacheTasks.filter(task => this.helpFilter(task));
|
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 = $A.cloneJSON(array)
|
||||||
array.push(...taskCompleteTemps.filter(task => this.helpFilter(task, false)));
|
array.push(...tmps);
|
||||||
}
|
}
|
||||||
return array.sort((a, b) => {
|
return array.sort((a, b) => {
|
||||||
if (sortType == 'asc') {
|
if (sortType == 'asc') {
|
||||||
|
@ -95,6 +95,10 @@ export default {
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true
|
default: true
|
||||||
},
|
},
|
||||||
|
updateBefore: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
size: {
|
size: {
|
||||||
type: String,
|
type: String,
|
||||||
default: 'small'
|
default: 'small'
|
||||||
@ -174,20 +178,34 @@ export default {
|
|||||||
const cacheTask = this.task;
|
const cacheTask = this.task;
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case 'complete':
|
case 'complete':
|
||||||
if (this.task.complete_at) return;
|
if (this.task.complete_at) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.updateBefore) {
|
||||||
|
this.$store.dispatch("saveTaskCompleteTemp", cacheTask)
|
||||||
|
}
|
||||||
this.updateTask({
|
this.updateTask({
|
||||||
complete_at: $A.formatDate("Y-m-d H:i:s")
|
complete_at: $A.formatDate("Y-m-d H:i:s")
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.$store.dispatch("saveTaskCompleteTemp", cacheTask)
|
this.$store.dispatch("saveTaskCompleteTemp", cacheTask)
|
||||||
|
}).catch(() => {
|
||||||
|
this.$store.dispatch("forgetTaskCompleteTemp", cacheTask.id)
|
||||||
})
|
})
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'uncomplete':
|
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({
|
this.updateTask({
|
||||||
complete_at: false
|
complete_at: false
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.$store.dispatch("forgetTaskCompleteTemp", cacheTask.id)
|
this.$store.dispatch("forgetTaskCompleteTemp", cacheTask.id)
|
||||||
|
}).catch(() => {
|
||||||
|
this.$store.dispatch("saveTaskCompleteTemp", cacheTask)
|
||||||
})
|
})
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -205,8 +223,9 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
updateTask(updata) {
|
updateTask(updata) {
|
||||||
return new Promise(resolve => {
|
return new Promise((resolve, reject) => {
|
||||||
if (this.loadIng) {
|
if (this.loadIng) {
|
||||||
|
reject()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
@ -220,6 +239,7 @@ export default {
|
|||||||
}).catch(({msg}) => {
|
}).catch(({msg}) => {
|
||||||
$A.modalError(msg);
|
$A.modalError(msg);
|
||||||
this.$store.dispatch("getTaskOne", this.task.id);
|
this.$store.dispatch("getTaskOne", this.task.id);
|
||||||
|
reject()
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -54,6 +54,7 @@ export default {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
this.$store.dispatch("forgetTaskCompleteTemp", true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
41
resources/assets/js/store/getters.js
vendored
41
resources/assets/js/store/getters.js
vendored
@ -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 state
|
||||||
* @param getters
|
|
||||||
* @returns {{overdue: *, today: *}}
|
* @returns {{overdue: *, today: *}}
|
||||||
*/
|
*/
|
||||||
dashboardTask(state, getters) {
|
dashboardTask(state) {
|
||||||
const todayStart = $A.Date($A.formatDate("Y-m-d 00:00:00")),
|
const todayStart = $A.Date($A.formatDate("Y-m-d 00:00:00")),
|
||||||
todayEnd = $A.Date($A.formatDate("Y-m-d 23:59:59")),
|
todayEnd = $A.Date($A.formatDate("Y-m-d 23:59:59")),
|
||||||
todayNow = $A.Date($A.formatDate("Y-m-d H:i:s"));
|
todayNow = $A.Date($A.formatDate("Y-m-d H:i:s"));
|
||||||
let {ownerTasks} = getters;
|
const filterTask = (task, chackCompleted = true) => {
|
||||||
if (state.taskCompleteTemps.length > 0) {
|
if (task.complete_at && chackCompleted === true) {
|
||||||
ownerTasks = $A.cloneJSON(ownerTasks)
|
return false;
|
||||||
ownerTasks.push(...state.taskCompleteTemps);
|
}
|
||||||
}
|
|
||||||
const todayTasks = ownerTasks.filter(task => {
|
|
||||||
if (!task.end_at) {
|
if (!task.end_at) {
|
||||||
return false;
|
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),
|
const start = $A.Date(task.start_at),
|
||||||
end = $A.Date(task.end_at);
|
end = $A.Date(task.end_at);
|
||||||
return (start <= todayStart && todayStart <= end) || (start <= todayEnd && todayEnd <= end) || (start > todayStart && todayEnd > end);
|
return (start <= todayStart && todayStart <= end) || (start <= todayEnd && todayEnd <= end) || (start > todayStart && todayEnd > end);
|
||||||
})
|
})
|
||||||
const overdueTasks = ownerTasks.filter(task => {
|
const overdueTasks = array.filter(task => {
|
||||||
if (!task.end_at) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return $A.Date(task.end_at) <= todayNow;
|
return $A.Date(task.end_at) <= todayNow;
|
||||||
})
|
})
|
||||||
return {
|
return {
|
||||||
|
11
resources/assets/sass/element.scss
vendored
11
resources/assets/sass/element.scss
vendored
@ -20,16 +20,9 @@ $--dropdown-menuItem-hover-color: #606266;
|
|||||||
min-width: 100px;
|
min-width: 100px;
|
||||||
.item {
|
.item {
|
||||||
&.red {
|
&.red {
|
||||||
color: #f00;
|
color: #f00 !important;
|
||||||
> i {
|
> i {
|
||||||
color: #f00;
|
color: #f00 !important;
|
||||||
}
|
|
||||||
}
|
|
||||||
&:hover {
|
|
||||||
&.red {
|
|
||||||
> i {
|
|
||||||
color: #f00;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,11 @@
|
|||||||
}
|
}
|
||||||
.tui-full-calendar-popup {
|
.tui-full-calendar-popup {
|
||||||
box-shadow: none;
|
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 {
|
.tui-full-calendar-popup-container {
|
||||||
border: 0;
|
border: 0;
|
||||||
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.2);
|
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.2);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user