77 lines
2.1 KiB
Vue
77 lines
2.1 KiB
Vue
<template>
|
||
<div v-loading="loading" class="g-commit-list">
|
||
<template v-for="(item, index) in commitList" :key="index">
|
||
<Card simple class="g-commit-list-card overflow-hidden">
|
||
<div class="g-commit-list-card-head flex items-center text-light px-20 gap-20">
|
||
<Icon name="gt-commit" />{{ item.time }}
|
||
</div>
|
||
<CommitItem v-for="option in item.actions" :key="option.id" v-bind="option" :branch="props.branch" />
|
||
</Card>
|
||
</template>
|
||
</div>
|
||
</template>
|
||
|
||
<script setup lang="ts">
|
||
import { computed } from 'vue';
|
||
import dayjs from 'dayjs';
|
||
import type { Commit } from '@/components/CommitItem/type';
|
||
|
||
import CommitItem from '@/components/CommitItem/index.vue';
|
||
|
||
interface IProps {
|
||
list: Array<Commit>;
|
||
loadMore?: boolean;
|
||
loadMoreText?: string;
|
||
branch?: string;
|
||
loading?:boolean;
|
||
}
|
||
const props = withDefaults(defineProps<IProps>(), {
|
||
loadMoreText: ''
|
||
});
|
||
|
||
// @TODO
|
||
// 1. 前端将传入的commit数组,自动按照日期进行整合。如果后端能按日期提供数据,则需要调整代码逻辑
|
||
// 2. 此处暂未按照日期进行排序
|
||
const commitList = computed(() => {
|
||
const timeMap = props.list.reduce((res: { [key: string]: any }, cur: Commit) => {
|
||
const time = dayjs(cur.createTime || cur.created_at).format('YYYY-MM-DD');
|
||
res[time] = res[time] || { time, actions: [] };
|
||
const {
|
||
id,
|
||
title,
|
||
message,
|
||
id: repoId,
|
||
authored_name: namespace,
|
||
verification_status: statusText,
|
||
committed_date: createTime,
|
||
committer_avatar_url: userAvatar,
|
||
author_name: username
|
||
} = cur;
|
||
const curItem = { ...cur, id, title, message, repoId, namespace, statusText, createTime, userAvatar, username };
|
||
curItem.repoId = res[time]?.repoId;
|
||
res[time].actions.push(curItem);
|
||
return res;
|
||
}, {});
|
||
|
||
return Object.entries(timeMap).map(([, value]) => value);
|
||
});
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.g-commit-list {
|
||
margin-bottom: 12px;
|
||
:deep(.devui-icon__container) {
|
||
vertical-align: middle;
|
||
}
|
||
&-card {
|
||
margin-top: 12px;
|
||
&:first-of-type {
|
||
margin-top: 0;
|
||
}
|
||
&-head {
|
||
height: 36px;
|
||
}
|
||
}
|
||
}
|
||
</style>
|