mirror of
https://github.com/lukaszraczylo/git-velocity.git
synced 2026-06-18 03:43:56 +00:00
7ba4d438dd
* feat(scoring): add tests bonus and fix average calculations - [x] Add CommitsWithTests metric to track commits with test file changes - [x] Add TestsBonus to score breakdown (15 points per commit with tests) - [x] Fix AvgTimeToMerge calculation to use count of PRs with valid data - [x] Fix AvgReviewTime calculation to use count of reviews with valid data - [x] Fix AvgPRSize calculation to only include merged PRs - [x] Add trackActivityDay helper to deduplicate activity tracking code - [x] Track activity days for PR creation, reviews, and issue comments - [x] Separate issue close tracking from issue open tracking - [x] Update early bird window from 5am-9am to 6am-9am - [x] Add time-based multipliers to velocity timeline scoring - [x] Update GraphQL query to fetch OPEN, MERGED, CLOSED PRs - [x] Fix PR filtering logic to handle all PR states correctly - [x] Improve watch handlers in Vue components to prevent double-loading - [x] Fix formatDuration to handle zero and negative values - [x] Update scoring documentation to include Tests component * refactor: use standard library and consolidate constants - [x] Replace custom contains function with slices.Contains - [x] Remove duplicate contains function implementations - [x] Extract magic numbers to named constants in formatters - [x] Create constants composable for app-wide values - [x] Add ESLint configuration with browser globals - [x] Add lint npm scripts to package.json - [x] Reorder Vue template attributes for consistency - [x] Remove unused variable in AchievementProgress - [x] Add pnpm lock file
61 lines
1.9 KiB
Vue
61 lines
1.9 KiB
Vue
<script setup>
|
|
import { RouterLink } from 'vue-router'
|
|
import Card from './Card.vue'
|
|
import Avatar from './Avatar.vue'
|
|
import { formatNumber, slugify } from '../composables/formatters'
|
|
import { DEFAULT_TEAM_COLOR } from '../composables/constants'
|
|
|
|
defineProps({
|
|
team: {
|
|
type: Object,
|
|
required: true
|
|
}
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<RouterLink
|
|
:to="`/teams/${slugify(team.name)}`"
|
|
class="block group"
|
|
>
|
|
<Card hover>
|
|
<div class="flex items-center justify-between mb-4">
|
|
<h3 class="font-semibold text-white group-hover:text-primary-500 transition">
|
|
{{ team.name }}
|
|
</h3>
|
|
<span
|
|
class="w-3 h-3 rounded-full"
|
|
:style="{ backgroundColor: team.color || DEFAULT_TEAM_COLOR }"
|
|
></span>
|
|
</div>
|
|
|
|
<div class="flex items-center space-x-2 mb-4">
|
|
<template v-for="member in (team.member_metrics || []).slice(0, 5)" :key="member.login">
|
|
<Avatar :name="member.name || member.login" :src="member.avatar_url" size="sm" />
|
|
</template>
|
|
<span
|
|
v-if="(team.member_metrics?.length || 0) > 5"
|
|
class="w-8 h-8 rounded-full bg-gray-700 flex items-center justify-center text-gray-300 text-xs font-bold"
|
|
>
|
|
+{{ team.member_metrics.length - 5 }}
|
|
</span>
|
|
</div>
|
|
|
|
<div class="grid grid-cols-2 gap-4 text-center">
|
|
<div>
|
|
<div class="text-lg font-semibold bg-gradient-to-r from-primary-400 to-accent-400 bg-clip-text text-transparent">
|
|
{{ formatNumber(team.total_score) }}
|
|
</div>
|
|
<div class="text-xs text-gray-400">Total Score</div>
|
|
</div>
|
|
<div>
|
|
<div class="text-lg font-semibold text-white">
|
|
{{ team.members?.length || 0 }}
|
|
</div>
|
|
<div class="text-xs text-gray-400">Members</div>
|
|
</div>
|
|
</div>
|
|
</Card>
|
|
</RouterLink>
|
|
</template>
|