任务数据逻辑
This commit is contained in:
parent
ba5f635687
commit
a1c7efeb85
@ -44,7 +44,7 @@ import 'tui-date-picker/dist/tui-date-picker.css';
|
||||
import 'tui-time-picker/dist/tui-time-picker.css';
|
||||
import 'tui-calendar-hi/dist/tui-calendar-hi.css'
|
||||
|
||||
import {mapState} from "vuex";
|
||||
import {mapState, mapGetters} from "vuex";
|
||||
import Calendar from "./components/Calendar";
|
||||
import moment from "moment";
|
||||
|
||||
@ -76,17 +76,10 @@ export default {
|
||||
computed: {
|
||||
...mapState(['userId', 'projects', 'tasks']),
|
||||
|
||||
...mapGetters(['ownerTask']),
|
||||
|
||||
list() {
|
||||
let datas = $A.cloneJSON(this.tasks);
|
||||
datas = datas.filter((data) => {
|
||||
if (data.complete_at) {
|
||||
return false;
|
||||
}
|
||||
if (!data.end_at) {
|
||||
return false;
|
||||
}
|
||||
return data.owner;
|
||||
})
|
||||
const datas = $A.cloneJSON(this.ownerTask);
|
||||
return datas.map(data => {
|
||||
let isAllday = $A.rightExists(data.start_at, "00:00:00") && $A.rightExists(data.end_at, "23:59:59")
|
||||
let task = {
|
||||
@ -109,11 +102,14 @@ export default {
|
||||
if (data.p_name) {
|
||||
task.priority = '<span class="priority" style="background-color:' + data.p_color + '">' + data.p_name + '</span>';
|
||||
}
|
||||
if (data.top_task === true) {
|
||||
task.title = '[' + this.$L('子任务') + '] ' + task.title
|
||||
}
|
||||
if (data.overdue) {
|
||||
task.title = '[' + $A.L('超期') + '] ' + task.title
|
||||
task.title = '[' + this.$L('超期') + '] ' + task.title
|
||||
task.color = "#f56c6c"
|
||||
task.bgColor = "#fef0f0"
|
||||
task.priority+= '<span class="overdue">' + $A.L('超期未完成') + '</span>';
|
||||
task.priority+= '<span class="overdue">' + this.$L('超期未完成') + '</span>';
|
||||
}
|
||||
if (!task.borderColor) {
|
||||
task.borderColor = task.bgColor;
|
||||
@ -286,7 +282,7 @@ export default {
|
||||
break;
|
||||
|
||||
case "edit":
|
||||
this.$store.dispatch("openTask", data.id)
|
||||
this.$store.dispatch("openTask", data)
|
||||
break;
|
||||
|
||||
case "delete":
|
||||
|
@ -532,6 +532,8 @@ export default {
|
||||
|
||||
...mapGetters(['projectData', 'tablePanel']),
|
||||
|
||||
...mapGetters(['ownerTask']),
|
||||
|
||||
userWaitRemove() {
|
||||
const {userids, useridbak} = this.userData;
|
||||
if (!userids) {
|
||||
@ -570,8 +572,8 @@ export default {
|
||||
},
|
||||
|
||||
myList() {
|
||||
const {projectId, tasks, searchText, userId, completeTask, sortField, sortType} = this;
|
||||
const array = tasks.filter((task) => {
|
||||
const {projectId, ownerTask, searchText, completeTask, sortField, sortType} = this;
|
||||
const array = ownerTask.filter((task) => {
|
||||
if (task.project_id != projectId) {
|
||||
return false;
|
||||
}
|
||||
@ -585,7 +587,7 @@ export default {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return task.task_user && task.task_user.find(({userid, owner}) => userid == userId && owner == 1);
|
||||
return true;
|
||||
});
|
||||
return array.sort((a, b) => {
|
||||
if (sortType == 'asc') {
|
||||
@ -605,7 +607,7 @@ export default {
|
||||
helpList() {
|
||||
const {projectId, tasks, searchText, userId, completeTask, sortField, sortType} = this;
|
||||
const array = tasks.filter((task) => {
|
||||
if (task.project_id != projectId) {
|
||||
if (task.project_id != projectId || task.parent_id > 0) {
|
||||
return false;
|
||||
}
|
||||
if (!this.tablePanel('completedTask')) {
|
||||
@ -638,7 +640,7 @@ export default {
|
||||
undoneList() {
|
||||
const {projectId, tasks, searchText, completeTask, sortField, sortType} = this;
|
||||
const array = tasks.filter((task) => {
|
||||
if (task.project_id != projectId) {
|
||||
if (task.project_id != projectId || task.parent_id > 0) {
|
||||
return false;
|
||||
}
|
||||
if (!this.tablePanel('completedTask')) {
|
||||
@ -671,7 +673,7 @@ export default {
|
||||
completedCount() {
|
||||
const {projectId, tasks} = this;
|
||||
return tasks.filter((task) => {
|
||||
if (task.project_id != projectId) {
|
||||
if (task.project_id != projectId || task.parent_id > 0) {
|
||||
return false;
|
||||
}
|
||||
return task.complete_at;
|
||||
@ -681,7 +683,7 @@ export default {
|
||||
completedList() {
|
||||
const {projectId, tasks, searchText} = this;
|
||||
const array = tasks.filter((task) => {
|
||||
if (task.project_id != projectId) {
|
||||
if (task.project_id != projectId || task.parent_id > 0) {
|
||||
return false;
|
||||
}
|
||||
if (searchText) {
|
||||
@ -1154,11 +1156,7 @@ export default {
|
||||
},
|
||||
|
||||
openTask(task, receive) {
|
||||
if (task.parent_id > 0) {
|
||||
this.$store.dispatch("openTask", task.parent_id)
|
||||
} else {
|
||||
this.$store.dispatch("openTask", task.id)
|
||||
}
|
||||
this.$store.dispatch("openTask", task)
|
||||
if (receive === true) {
|
||||
// 向任务窗口发送领取任务请求
|
||||
setTimeout(() => {
|
||||
|
@ -108,8 +108,7 @@
|
||||
class="pick"
|
||||
:title="$L('你确认领取任务吗?')"
|
||||
placement="bottom"
|
||||
@on-ok="onOwner(true)"
|
||||
transfer>
|
||||
@on-ok="onOwner(true)">
|
||||
<Button type="primary">{{$L('我要领取任务')}}</Button>
|
||||
</Poptip>
|
||||
<ETooltip v-if="$Electron" :content="$L('新窗口打开')">
|
||||
|
@ -2,7 +2,7 @@
|
||||
<div class="task-rows">
|
||||
<div v-for="(item, key) in list" :key="key">
|
||||
<Row class="task-row" :style="item.color ? {backgroundColor: item.color, borderBottomColor: item.color} : {}">
|
||||
<em v-if="item.p_name && item.parent_id === 0" class="priority-color" :style="{backgroundColor:item.p_color}"></em>
|
||||
<em v-if="item.p_name && isTopTask(item)" class="priority-color" :style="{backgroundColor:item.p_color}"></em>
|
||||
<Col span="12" :class="['row-name', item.complete_at ? 'complete' : '']">
|
||||
<Icon
|
||||
v-if="item.sub_num > 0 || (item.parent_id===0 && fastAddTask)"
|
||||
@ -50,7 +50,7 @@
|
||||
</template>
|
||||
</EDropdownMenu>
|
||||
</EDropdown>
|
||||
<div class="item-title" @click="openTask(item)">{{item.name}}</div>
|
||||
<div class="item-title" @click="openTask(item)"><span v-if="item.top_task === true">{{$L('子任务')}}</span>{{item.name}}</div>
|
||||
<div class="item-icons" @click="openTask(item)">
|
||||
<div v-if="item.desc" class="item-icon">
|
||||
<i class="taskfont"></i>
|
||||
@ -71,10 +71,11 @@
|
||||
</Col>
|
||||
<Col span="3" class="row-column">
|
||||
<EDropdown
|
||||
v-if="item.parent_id === 0"
|
||||
v-if="isTopTask(item)"
|
||||
trigger="click"
|
||||
size="small"
|
||||
placement="bottom"
|
||||
:disabled="item.top_task === true"
|
||||
@command="dropTask(item, $event)">
|
||||
<div class="task-column">{{columnName(item.column_id)}}</div>
|
||||
<EDropdownMenu slot="dropdown">
|
||||
@ -86,10 +87,11 @@
|
||||
</Col>
|
||||
<Col span="3" class="row-priority">
|
||||
<EDropdown
|
||||
v-if="item.p_name && item.parent_id === 0"
|
||||
v-if="item.p_name && isTopTask(item)"
|
||||
trigger="click"
|
||||
size="small"
|
||||
placement="bottom"
|
||||
:disabled="item.top_task === true"
|
||||
@command="dropTask(item, $event)">
|
||||
<TaskPriority :backgroundColor="item.p_color">{{item.p_name}}</TaskPriority>
|
||||
<EDropdownMenu slot="dropdown">
|
||||
@ -210,6 +212,10 @@ export default {
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
isTopTask(item) {
|
||||
return item.parent_id === 0 || item.top_task === true
|
||||
},
|
||||
|
||||
columnName(column_id) {
|
||||
const column = this.columns.find(({id}) => id == column_id)
|
||||
return column ? column.name : '';
|
||||
@ -249,11 +255,7 @@ export default {
|
||||
},
|
||||
|
||||
openTask(task, receive) {
|
||||
if (task.parent_id > 0) {
|
||||
this.$store.dispatch("openTask", task.parent_id)
|
||||
} else {
|
||||
this.$store.dispatch("openTask", task.id)
|
||||
}
|
||||
this.$store.dispatch("openTask", task)
|
||||
if (receive === true) {
|
||||
// 向任务窗口发送领取任务请求
|
||||
setTimeout(() => {
|
||||
|
@ -35,9 +35,9 @@
|
||||
:key="item.id"
|
||||
:class="{complete: item.complete_at}"
|
||||
:style="item.color ? {backgroundColor: item.color} : {}"
|
||||
@click="$store.dispatch('openTask', item.id)">
|
||||
@click="openTask(item)">
|
||||
<em
|
||||
v-if="item.p_name && item.parent_id === 0"
|
||||
v-if="item.p_name"
|
||||
class="priority-color"
|
||||
:style="{backgroundColor:item.p_color}"></em>
|
||||
<EDropdown
|
||||
@ -79,7 +79,7 @@
|
||||
</template>
|
||||
</EDropdownMenu>
|
||||
</EDropdown>
|
||||
<div class="item-title">{{item.name}}</div>
|
||||
<div class="item-title"><span v-if="item.top_task === true">{{$L('子任务')}}</span>{{item.name}}</div>
|
||||
<div v-if="item.desc" class="item-icon">
|
||||
<i class="taskfont"></i>
|
||||
</div>
|
||||
@ -102,6 +102,7 @@
|
||||
<script>
|
||||
import {mapGetters, mapState} from "vuex";
|
||||
import AppDown from "../../components/AppDown";
|
||||
import {Store} from "le5le-store";
|
||||
|
||||
export default {
|
||||
components: {AppDown},
|
||||
@ -232,6 +233,10 @@ export default {
|
||||
}
|
||||
},
|
||||
|
||||
openTask(task) {
|
||||
this.$store.dispatch("openTask", task)
|
||||
},
|
||||
|
||||
updateTask(task, updata) {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (this.taskLoad[task.id] === true) {
|
||||
|
100
resources/assets/js/store/actions.js
vendored
100
resources/assets/js/store/actions.js
vendored
@ -301,7 +301,7 @@ export default {
|
||||
//
|
||||
let index = state.cacheUserBasic.findIndex(({userid}) => userid == data.userid);
|
||||
if (index > -1) {
|
||||
data = Object.assign(state.cacheUserBasic[index], data)
|
||||
data = Object.assign({}, state.cacheUserBasic[index], data)
|
||||
state.cacheUserBasic.splice(index, 1, data);
|
||||
} else {
|
||||
state.cacheUserBasic.push(data)
|
||||
@ -427,7 +427,7 @@ export default {
|
||||
} else if (state.method.isJson(data)) {
|
||||
let index = state.files.findIndex(({id}) => id == data.id);
|
||||
if (index > -1) {
|
||||
state.files.splice(index, 1, Object.assign(state.files[index], data));
|
||||
state.files.splice(index, 1, Object.assign({}, state.files[index], data));
|
||||
} else {
|
||||
state.files.push(data)
|
||||
}
|
||||
@ -525,7 +525,7 @@ export default {
|
||||
}
|
||||
let index = state.projects.findIndex(({id}) => id == data.id);
|
||||
if (index > -1) {
|
||||
state.projects.splice(index, 1, Object.assign(state.projects[index], data));
|
||||
state.projects.splice(index, 1, Object.assign({}, state.projects[index], data));
|
||||
} else {
|
||||
state.projects.push(data);
|
||||
}
|
||||
@ -726,7 +726,7 @@ export default {
|
||||
} else if (state.method.isJson(data)) {
|
||||
let index = state.columns.findIndex(({id}) => id == data.id);
|
||||
if (index > -1) {
|
||||
state.columns.splice(index, 1, Object.assign(state.columns[index], data));
|
||||
state.columns.splice(index, 1, Object.assign({}, state.columns[index], data));
|
||||
} else {
|
||||
state.columns.push(data);
|
||||
}
|
||||
@ -854,12 +854,12 @@ export default {
|
||||
} else if (state.method.isJson(data)) {
|
||||
let index = state.tasks.findIndex(({id}) => id == data.id);
|
||||
if (index > -1) {
|
||||
state.tasks.splice(index, 1, Object.assign(state.tasks[index], data));
|
||||
state.tasks.splice(index, 1, Object.assign({}, state.tasks[index], data));
|
||||
} else {
|
||||
state.tasks.push(data);
|
||||
}
|
||||
//
|
||||
if (index > -1 && data.parent_id) {
|
||||
if (data.parent_id > 0 && state.tasks.findIndex(({id}) => id == data.parent_id) === -1) {
|
||||
dispatch("getTaskOne", data.parent_id);
|
||||
}
|
||||
if (data.is_update_complete) {
|
||||
@ -1008,44 +1008,42 @@ export default {
|
||||
* @param dispatch
|
||||
*/
|
||||
getDashboardTasks({state, dispatch}) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
let loadIng = 2;
|
||||
let error = 0;
|
||||
let call = (err) => {
|
||||
if (err) {
|
||||
error++;
|
||||
}
|
||||
loadIng--;
|
||||
if (loadIng == 0) {
|
||||
if (error > 0) {
|
||||
reject()
|
||||
} else {
|
||||
resolve()
|
||||
}
|
||||
}
|
||||
if (state.cacheLoading["loadDashboardTasks"] === true) {
|
||||
return;
|
||||
}
|
||||
state.cacheLoading["loadDashboardTasks"] = true;
|
||||
//
|
||||
let loadIng = 2;
|
||||
let call = () => {
|
||||
if (loadIng <= 0) {
|
||||
state.cacheLoading["loadDashboardTasks"] = false;
|
||||
return;
|
||||
}
|
||||
//
|
||||
dispatch("getTasks", {
|
||||
complete: "no",
|
||||
time: [
|
||||
$A.formatDate("Y-m-d 00:00:00"),
|
||||
$A.formatDate("Y-m-d 23:59:59")
|
||||
]
|
||||
}).then(() => {
|
||||
call();
|
||||
}).catch(() => {
|
||||
call(true);
|
||||
})
|
||||
//
|
||||
dispatch("getTasks", {
|
||||
complete: "no",
|
||||
time_before: $A.formatDate("Y-m-d H:i:s")
|
||||
}).then(() => {
|
||||
call();
|
||||
}).catch(() => {
|
||||
call(true);
|
||||
})
|
||||
})
|
||||
loadIng--;
|
||||
if (loadIng == 1) {
|
||||
dispatch("getTasks", {
|
||||
complete: "no",
|
||||
time: [
|
||||
$A.formatDate("Y-m-d 00:00:00"),
|
||||
$A.formatDate("Y-m-d 23:59:59")
|
||||
]
|
||||
}).then(() => {
|
||||
setTimeout(call);
|
||||
}).catch(() => {
|
||||
setTimeout(call);
|
||||
})
|
||||
} else if (loadIng == 0) {
|
||||
dispatch("getTasks", {
|
||||
complete: "no",
|
||||
time_before: $A.formatDate("Y-m-d H:i:s")
|
||||
}).then(() => {
|
||||
setTimeout(call);
|
||||
}).catch(() => {
|
||||
setTimeout(call);
|
||||
})
|
||||
}
|
||||
}
|
||||
call();
|
||||
},
|
||||
|
||||
/**
|
||||
@ -1195,9 +1193,17 @@ export default {
|
||||
* 打开任务详情页
|
||||
* @param state
|
||||
* @param dispatch
|
||||
* @param task_id
|
||||
* @param task
|
||||
*/
|
||||
openTask({state, dispatch}, task_id) {
|
||||
openTask({state, dispatch}, task) {
|
||||
let task_id = task;
|
||||
if (state.method.isJson(task)) {
|
||||
if (task.parent_id > 0) {
|
||||
task_id = task.parent_id;
|
||||
} else {
|
||||
task_id = task.id;
|
||||
}
|
||||
}
|
||||
state.taskId = task_id;
|
||||
if (task_id > 0) {
|
||||
dispatch("getTaskOne", task_id).then(() => {
|
||||
@ -1346,7 +1352,7 @@ export default {
|
||||
} else if (state.method.isJson(data)) {
|
||||
let index = state.dialogs.findIndex(({id}) => id == data.id);
|
||||
if (index > -1) {
|
||||
state.dialogs.splice(index, 1, Object.assign(state.dialogs[index], data));
|
||||
state.dialogs.splice(index, 1, Object.assign({}, state.dialogs[index], data));
|
||||
} else {
|
||||
state.dialogs.push(data);
|
||||
}
|
||||
@ -1509,7 +1515,7 @@ export default {
|
||||
} else if (state.method.isJson(data)) {
|
||||
let index = state.dialogMsgs.findIndex(({id}) => id == data.id);
|
||||
if (index > -1) {
|
||||
state.dialogMsgs.splice(index, 1, Object.assign(state.dialogMsgs[index], data));
|
||||
state.dialogMsgs.splice(index, 1, Object.assign({}, state.dialogMsgs[index], data));
|
||||
} else {
|
||||
state.dialogMsgs.push(data);
|
||||
}
|
||||
|
78
resources/assets/js/store/getters.js
vendored
78
resources/assets/js/store/getters.js
vendored
@ -18,7 +18,7 @@ export default {
|
||||
});
|
||||
project.columns.forEach((column) => {
|
||||
column.tasks = state.method.cloneJSON(state.tasks.filter((task) => {
|
||||
return task.column_id == column.id;
|
||||
return task.column_id == column.id && task.parent_id == 0;
|
||||
})).sort((a, b) => {
|
||||
if (a.sort != b.sort) {
|
||||
return a.sort - b.sort;
|
||||
@ -74,35 +74,63 @@ export default {
|
||||
}
|
||||
},
|
||||
|
||||
dashboardData(state) {
|
||||
|
||||
ownerTask(state) {
|
||||
return state.tasks.filter(({complete_at, parent_id, end_at, owner}) => {
|
||||
if (parent_id > 0) {
|
||||
const index = state.tasks.findIndex(data => {
|
||||
if (data.id != parent_id) {
|
||||
return false;
|
||||
}
|
||||
if (data.complete_at) {
|
||||
return false;
|
||||
}
|
||||
if (!data.end_at) {
|
||||
return false;
|
||||
}
|
||||
return data.owner;
|
||||
});
|
||||
if (index > -1) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (complete_at) {
|
||||
return false;
|
||||
}
|
||||
if (!end_at) {
|
||||
return false;
|
||||
}
|
||||
return owner;
|
||||
}).map(task => {
|
||||
if (task.parent_id > 0) {
|
||||
const tmp = state.tasks.find(({id}) => id == task.parent_id);
|
||||
if (tmp) {
|
||||
return Object.assign({}, tmp, {
|
||||
id: task.id,
|
||||
parent_id: task.parent_id,
|
||||
name: task.name,
|
||||
start_at: task.start_at,
|
||||
end_at: task.end_at,
|
||||
sub_num: 0,
|
||||
top_task: true,
|
||||
});
|
||||
}
|
||||
}
|
||||
return task;
|
||||
})
|
||||
},
|
||||
|
||||
dashboardData(state, getters) {
|
||||
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"));
|
||||
const todayTasks = state.tasks.filter(data => {
|
||||
if (data.complete_at) {
|
||||
return false;
|
||||
}
|
||||
if (!data.end_at) {
|
||||
return false;
|
||||
}
|
||||
if (!data.owner) {
|
||||
return false;
|
||||
}
|
||||
const start = $A.Date(data.start_at),
|
||||
end = $A.Date(data.end_at);
|
||||
const todayTasks = getters.ownerTask.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 = state.tasks.filter(data => {
|
||||
if (data.complete_at) {
|
||||
return false;
|
||||
}
|
||||
if (!data.end_at) {
|
||||
return false;
|
||||
}
|
||||
if (!data.owner) {
|
||||
return false;
|
||||
}
|
||||
return $A.Date(data.end_at) <= todayNow;
|
||||
const overdueTasks = getters.ownerTask.filter(task => {
|
||||
return $A.Date(task.end_at) <= todayNow;
|
||||
})
|
||||
return {
|
||||
today: todayTasks,
|
||||
|
@ -659,6 +659,20 @@
|
||||
flex: 1;
|
||||
padding: 0 22px 0 8px;
|
||||
cursor: pointer;
|
||||
> span {
|
||||
font-size: 12px;
|
||||
height: 18px;
|
||||
line-height: 16px;
|
||||
padding: 0 3px;
|
||||
border-radius: 3px;
|
||||
color: #8bcf70;
|
||||
background-color: rgba(139, 207, 112, 0);
|
||||
border: 1px solid #8bcf70;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
margin-top: 3px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
}
|
||||
.item-icons {
|
||||
display: flex;
|
||||
|
14
resources/assets/sass/pages/page-dashboard.scss
vendored
14
resources/assets/sass/pages/page-dashboard.scss
vendored
@ -133,6 +133,20 @@
|
||||
flex: 1;
|
||||
padding-left: 6px;
|
||||
line-height: 22px;
|
||||
> span {
|
||||
font-size: 12px;
|
||||
height: 18px;
|
||||
line-height: 16px;
|
||||
padding: 0 3px;
|
||||
border-radius: 3px;
|
||||
color: #8bcf70;
|
||||
background-color: rgba(139, 207, 112, 0);
|
||||
border: 1px solid #8bcf70;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
margin-top: 2px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
}
|
||||
.item-icon {
|
||||
display: flex;
|
||||
|
Loading…
x
Reference in New Issue
Block a user