mirror of
https://github.com/lukaszraczylo/git-velocity.git
synced 2026-10-12 23:23:32 +00:00
* 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
119 lines
4.6 KiB
Vue
119 lines
4.6 KiB
Vue
<script setup>
|
|
import { ref, inject, computed } from 'vue'
|
|
import { RouterLink, useRoute } from 'vue-router'
|
|
|
|
const route = useRoute()
|
|
const globalData = inject('globalData')
|
|
const mobileMenuOpen = ref(false)
|
|
|
|
const repositories = computed(() => globalData.value?.Repositories || [])
|
|
</script>
|
|
|
|
<template>
|
|
<nav class="sticky top-0 z-50 bg-gray-900/80 backdrop-blur-md border-b border-gray-700 shadow-lg">
|
|
<div class="container mx-auto px-4">
|
|
<div class="flex items-center justify-between h-16">
|
|
<!-- Logo -->
|
|
<RouterLink to="/" class="flex items-center space-x-2">
|
|
<i class="fas fa-rocket text-2xl bg-gradient-to-r from-primary-400 to-accent-400 bg-clip-text text-transparent"></i>
|
|
<span class="text-xl font-bold bg-gradient-to-r from-primary-400 to-accent-400 bg-clip-text text-transparent">Git Velocity</span>
|
|
</RouterLink>
|
|
|
|
<!-- Desktop Navigation -->
|
|
<div class="hidden md:flex items-center space-x-6">
|
|
<RouterLink
|
|
to="/"
|
|
:class="route.path === '/' ? 'text-primary-500 font-medium' : 'text-gray-200 font-medium hover:text-primary-400 transition-colors'"
|
|
>
|
|
Dashboard
|
|
</RouterLink>
|
|
<RouterLink
|
|
to="/leaderboard"
|
|
:class="route.path === '/leaderboard' ? 'text-primary-500 font-medium' : 'text-gray-200 font-medium hover:text-primary-400 transition-colors'"
|
|
>
|
|
Leaderboard
|
|
</RouterLink>
|
|
<RouterLink
|
|
to="/how-scoring-works"
|
|
:class="route.path === '/how-scoring-works' ? 'text-primary-500 font-medium' : 'text-gray-200 font-medium hover:text-primary-400 transition-colors'"
|
|
>
|
|
How Scoring Works
|
|
</RouterLink>
|
|
<RouterLink
|
|
v-for="repo in repositories"
|
|
:key="`${repo.Owner}/${repo.Name}`"
|
|
:to="`/repos/${repo.Owner}/${repo.Name}`"
|
|
:class="route.path.includes(`/repos/${repo.Owner}/${repo.Name}`) ? 'text-primary-500 font-medium' : 'text-gray-200 font-medium hover:text-primary-400 transition-colors'"
|
|
>
|
|
{{ repo.Name }}
|
|
</RouterLink>
|
|
</div>
|
|
|
|
<!-- Mobile Menu Button -->
|
|
<button
|
|
class="md:hidden p-2 rounded-lg hover:bg-gray-700 transition"
|
|
@click="mobileMenuOpen = !mobileMenuOpen"
|
|
>
|
|
<i class="fas fa-bars text-gray-200"></i>
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Mobile Menu -->
|
|
<div v-if="mobileMenuOpen" class="md:hidden py-2 border-t border-gray-700">
|
|
<div class="flex flex-col space-y-1">
|
|
<RouterLink
|
|
to="/"
|
|
:class="[
|
|
'block px-4 py-3 rounded-lg text-base font-medium transition-colors',
|
|
route.path === '/'
|
|
? 'bg-primary-900/20 text-primary-400'
|
|
: 'text-gray-200 hover:bg-gray-800'
|
|
]"
|
|
@click="mobileMenuOpen = false"
|
|
>
|
|
<i class="fas fa-home mr-3 w-5 text-center"></i>Dashboard
|
|
</RouterLink>
|
|
<RouterLink
|
|
to="/leaderboard"
|
|
:class="[
|
|
'block px-4 py-3 rounded-lg text-base font-medium transition-colors',
|
|
route.path === '/leaderboard'
|
|
? 'bg-primary-900/20 text-primary-400'
|
|
: 'text-gray-200 hover:bg-gray-800'
|
|
]"
|
|
@click="mobileMenuOpen = false"
|
|
>
|
|
<i class="fas fa-trophy mr-3 w-5 text-center"></i>Leaderboard
|
|
</RouterLink>
|
|
<RouterLink
|
|
to="/how-scoring-works"
|
|
:class="[
|
|
'block px-4 py-3 rounded-lg text-base font-medium transition-colors',
|
|
route.path === '/how-scoring-works'
|
|
? 'bg-primary-900/20 text-primary-400'
|
|
: 'text-gray-200 hover:bg-gray-800'
|
|
]"
|
|
@click="mobileMenuOpen = false"
|
|
>
|
|
<i class="fas fa-calculator mr-3 w-5 text-center"></i>How Scoring Works
|
|
</RouterLink>
|
|
<RouterLink
|
|
v-for="repo in repositories"
|
|
:key="`${repo.Owner}/${repo.Name}`"
|
|
:to="`/repos/${repo.Owner}/${repo.Name}`"
|
|
:class="[
|
|
'block px-4 py-3 rounded-lg text-base font-medium transition-colors',
|
|
route.path.includes(`/repos/${repo.Owner}/${repo.Name}`)
|
|
? 'bg-primary-900/20 text-primary-400'
|
|
: 'text-gray-200 hover:bg-gray-800'
|
|
]"
|
|
@click="mobileMenuOpen = false"
|
|
>
|
|
<i class="fas fa-code-branch mr-3 w-5 text-center"></i>{{ repo.Name }}
|
|
</RouterLink>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
</template>
|