2022-01-13 11:11:29 +08:00

257 lines
8.6 KiB
Vue

<template>
<div :class="['project-log', taskId == 0 ? 'is-drawer' : '']">
<div class="log-title">{{$L('项目动态')}}</div>
<ul class="logs-activity">
<li v-for="itemA in lists">
<div class="logs-date">{{logDate(itemA)}}</div>
<div class="logs-section">
<Timeline>
<TimelineItem v-for="(itemB, index) in itemA.lists" :key="index">
<div slot="dot" class="logs-dot">
<UserAvatar v-if="itemB.userid" :userid="itemB.userid" :size="18" showName/>
<div v-else class="avatar-wrapper common-avatar">
<EAvatar :size="18">A</EAvatar>
<div class="avatar-name auto">{{$L('系统')}}</div>
</div>
</div>
<template v-for="log in itemB.lists">
<div class="log-summary">
<ProjectLogDetail :render="logDetail" :item="log"/>
<span v-if="operationList(log).length > 0" class="log-operation">
<Button v-for="(op, oi) in operationList(log)" :key="oi" size="small" @click="onOperation(op)">{{op.button}}</Button>
</span>
<span class="log-time">{{log.time.ymd}} {{log.time.segment}} {{log.time.hi}}</span>
</div>
<div v-if="log.project_task" class="log-task">
<em @click="openTask(log.project_task)">{{$L('关联任务')}}: {{log.project_task.name}}</em>
</div>
</template>
</TimelineItem>
</Timeline>
</div>
</li>
<li v-if="loadIng > 0" class="logs-loading"><Loading/></li>
<li v-else-if="hasMorePages" class="logs-more" @click="getMore">{{$L('加载更多')}}</li>
<li v-else-if="totalNum == 0" class="logs-none" @click="getLists(true)">{{$L('没有任何动态')}}</li>
</ul>
</div>
</template>
<script>
import ProjectLogDetail from "./ProjectLogDetail";
export default {
name: "ProjectLog",
components: {ProjectLogDetail},
props: {
projectId: {
type: Number,
default: 0
},
taskId: {
type: Number,
default: 0
},
},
data() {
return {
loadIng: 0,
lists: [],
listPage: 1,
hasMorePages: false,
totalNum: -1,
}
},
mounted() {
this.getLists(true);
},
computed: {
},
watch: {
projectId() {
this.lists = [];
this.getLists(true);
},
taskId() {
this.lists = [];
this.getLists(true);
},
loadIng(num) {
this.$emit("on-load-change", num > 0)
}
},
methods: {
logDate(itemA) {
let md = $A.formatDate("m-d");
return md == itemA.ymd ? (itemA.ymd + ' ' + this.$L('今天')) : itemA.key;
},
getLists(resetLoad) {
if (resetLoad === true) {
this.listPage = 1;
}
this.loadIng++;
this.$store.dispatch("call", {
url: 'project/log/lists',
data: {
project_id: this.projectId,
task_id: this.taskId,
page: Math.max(this.listPage, 1),
pagesize: this.pagesize,
}
}).then(({data}) => {
this.loadIng--;
if (resetLoad === true) {
this.lists = [];
}
data.data.some(log => {
let tmpTime = log.time;
let tmpKey = tmpTime.ymd + " " + tmpTime.week;
let itemA = this.lists.find(({key}) => key == tmpKey)
if (itemA) {
let itemB = itemA.lists.find(({userid}) => userid == log.userid)
if (itemB) {
itemB.lists.push(log)
} else {
itemA.lists.push({
userid: log.userid,
lists: [log]
})
}
} else {
this.lists.push({
key: tmpKey,
ymd: log.ymd,
lists: [{
userid: log.userid,
lists: [log]
}]
})
}
})
this.hasMorePages = data.current_page < data.last_page;
this.totalNum = data.total;
}).catch(() => {
this.loadIng--;
this.lists = [];
this.hasMorePages = false;
this.totalNum = 0;
});
},
getMore() {
if (!this.hasMorePages) {
return;
}
this.hasMorePages = false;
this.listPage++;
this.getLists();
},
/**
* 日志详情
* @param h
* @param detail
* @param record
* @returns {*[]}
*/
logDetail(h, {detail, record}) {
let vNode = [h('span', this.$L(detail))];
if ($A.isJson(record)) {
if ($A.isArray(record.change)) {
let [before, now] = record.change
vNode.push(h('span', ': '))
if (before) {
vNode.push(h('span', `${before} => ${now}`))
} else {
vNode.push(h('span', now))
}
}
if (record.userid) {
let userids = $A.isArray(record.userid) ? record.userid : [record.userid]
let userNode = [];
userids.some(userid => {
userNode.push(h('UserAvatar', {
props: {
size: 18,
userid
}
}))
})
if (userNode.length > 0) {
vNode.push(h('div', {
class: 'detail-user'
}, [
h('div', {
class: 'detail-user-wrap'
}, userNode)
]))
}
}
}
return h('span', {
class: 'log-text'
}, vNode)
},
/**
* 可操作事件
* @param id
* @param record
* @returns {*[]}
*/
operationList({id, record}) {
let list = [];
if (!$A.isJson(record)) {
return list
}
if (this.taskId > 0 && $A.isJson(record.flow)) {
list.push({
id,
button: '重置',
content: `确定重置为【${$A.getMiddle(record.flow.flow_item_name, "|")}】吗?`,
})
}
return list;
},
/**
* 执行操作
* @param item
*/
onOperation(item) {
$A.modalConfirm({
content: item.content,
loading: true,
onOk: () => {
this.$store.dispatch("call", {
url: 'project/task/resetfromlog',
data: {
id: item.id
}
}).then(({data, msg}) => {
$A.messageSuccess(msg);
this.$Modal.remove();
this.$store.dispatch("saveTask", data);
this.getLists(true);
}).catch(({msg}) => {
$A.modalError(msg, 301);
this.$Modal.remove();
});
}
});
},
openTask(task) {
this.$store.dispatch("openTask", task)
}
}
}
</script>