Skip to content

Commit 57aa700

Browse files
karpikplCopilotCopilot
authored
Pr 341 - New UI (#343)
* Initial plan * chore: initial plan for scope simplification Agent-Logs-Url: https://github.com/github-copilot-resources/copilot-metrics-viewer/sessions/81026c05-5fdd-4927-87d1-7727ce887d45 Co-authored-by: karpikpl <3539908+karpikpl@users.noreply.github.com> * feat: simplify team scope - replace team-organization/team-enterprise with organization/enterprise + team parameter Agent-Logs-Url: https://github.com/github-copilot-resources/copilot-metrics-viewer/sessions/81026c05-5fdd-4927-87d1-7727ce887d45 Co-authored-by: karpikpl <3539908+karpikpl@users.noreply.github.com> * feat: fix SeatsAnalysisViewer isTeamView and add Historical mode warning for team URLs (Phase 3 & 10) Agent-Logs-Url: https://github.com/github-copilot-resources/copilot-metrics-viewer/sessions/3d48083a-f37a-493a-a0a5-f3cfb5f04a5c Co-authored-by: karpikpl <3539908+karpikpl@users.noreply.github.com> * feat: dashboard parity, dark mode, responsive charts, agent activity overhaul - Restructure Organization tab KPIs: Row 1 shows IDE Active Users, Agent Adoption %, Most Used Chat Model (matches official dashboard emphasis) - Add 10 new charts to Organization tab: DAU/WAU lines, avg chat req/user, requests per chat mode, model usage per day (100% stacked area), chat model donut, model per chat mode grouped bar, language usage per day (100% stacked area), language donut, model per language stacked bar - Add help links bar (How are these calculated / interpret / playbook) - Add chart layout toggle (1-col / 2-col) for wide screens - Constrain all chart heights (220-260px) with maintainAspectRatio: false so charts scale properly and stay compact on wide monitors - Complete overhaul of AgentActivityViewer: new KPI tiles (Lines changed with AI, Agent Contribution %, Avg lines deleted per user), 7 charts side-by-side showing user-initiated vs agent-initiated code changes by mode/model/language - Fix dark mode: add .v-theme--light/.v-theme--dark CSS variable blocks in global.css; add moon/sun toggle in MainComponent toolbar; persist in localStorage via useState('app-theme') in default.vue - Add dark theme definition to vuetify.config.ts - Fix theme-aware colors in help links (color=primary variant=tonal) - Add agent_edit entries to mock data totals_by_language_feature - Update e2e test selectors for renamed KPI labels and .text-h5 class Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: weekend shading on charts, 5-tile header KPI row - Add weekendPlugin: custom Chart.js inline plugin (zero new deps) that draws subtle grey bands on Saturday/Sunday columns across all 8 date-based Line/Bar charts in MetricsViewer; each chart subtitle notes 'Shaded columns = weekends' in italic - Expand header KPI row from 3 to 5 tiles: add 'Most used chat mode' (feature with highest user-initiated requests) and 'Total chat requests' (compact-formatted sum of all non-completion interactions) - Resize Row 1 tiles from 320px → 260px and center container so all 5 tiles fit in a single row on standard monitors - Fix mock data: add monthly_active_agent_users (5/6 = 83% adoption), give agent_edit and chat_panel_agent_mode realistic user_initiated_interaction_count values so KPI tiles show representative data (claude-opus-4.6, Ask mode, 1.3k requests) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * UI polish: neutral toolbar, grid tiles, gradient fills, system font, hide date range - Toolbar: color='surface' + bottom border (was indigo) - v3 migration banner hidden by default (showMigrationBanner: false) - Date range selector hidden behind calendar toggle icon (showDateRange: false) - KPI tiles: CSS grid auto-fit layout, removed all fixed widths/heights - Row 2 tiles: elevation=1, no fixed dimensions, removed dateRangeDescription captions - Chart.js defaults: system-ui font family, size 12 - gradientFillPlugin: replaces flat rgba with top→bottom gradient on all Line charts with fill:true - Donut charts: maintainAspectRatio:false + fixed 260px height container for alignment - All Line charts: [gradientFillPlugin, weekendPlugin] plugins Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix dark mode: surface colors, help panel, Languages/Editors tab content Dark mode fixes: - Replace color="white" with color="surface" on all KPI tile cards (SeatsAnalysisViewer, CopilotChatViewer, PullRequestViewer, TeamsComponent, UserMetricsViewer, BreakdownComponent) - Replace color="blue-grey-lighten-5" with color="surface-variant" in BreakdownComponent CLI summary card Help panel (MetricsViewer): - Replace tonal primary card (unreadable dark mode) with outlined neutral card - Add 2-sentence context: what this dashboard shows and what acceptance rates measure - Use proper link styling (text-primary span + icon) instead of bare <a> tags Languages tab (BreakdownComponent): - Replace minimal v-alert with rich intro card explaining unique value vs Org tab - Explains what features contribute to language data Editors tab (BreakdownComponent): - Rich intro card listing IDE surfaces: VS Code, JetBrains, CLI, GitHub.com, etc. - Explains why acceptance rates don't apply to CLI/GitHub.com Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix: add copilot_cli display name and rename tile to 'Top Copilot feature' - Add copilot_cli → 'CLI' to FEATURE_DISPLAY map so real org data shows 'CLI' instead of raw key 'copilot_cli' - Rename 'Most used chat mode' tile → 'Top Copilot feature' since CLI is not a chat mode; updated tooltip text accordingly Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: center overview tiles in AgentModeViewer, fix date card dark mode color - Add justify="center" to v-row so 3 tiles center on wide screens - Replace color="blue-grey lighten-5" with color="surface-variant" variant="tonal" so the date range card adapts to dark/light theme Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: remove fixed-width isolated stat card in BreakdownComponent The single 'Number of X' card had style='width:300px' with mx-auto inside a CSS grid, making it float as an isolated centered white box. - Remove inline width/height and mx-auto so the card fills the grid column - Remove color='surface' variant='elevated' that caused white background in dark mode Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: unified UI across all tabs + user/chat charts + CLI as editor Organization tab: - KPI values get accent colors (text-primary/success/info) - Long text (model/feature names) use clamp() auto-scaling via .kpi-text-value Shared chart utilities: - New app/utils/chartPlugins.ts: weekendPlugin, gradientFillPlugin, PALETTE, formatCompact, makeLineOptions, makeBarOptions - MetricsViewer.vue imports from shared utils (removed duplicated plugin defs) Tab header unification (all tabs now match Organization tab style): - AgentActivityViewer: replaced tonal primary card with outlined card + description + links using text-primary (visible in dark mode) - CopilotChatViewer: added standard outlined header card - UserMetricsViewer: added standard outlined header card Copilot Chat tab (complete rewrite): - Removed fixed 300px tiles — now uses tiles-container CSS grid - 3 KPI tiles: Chat Interactions, Code Actions, Action Rate (with progress bar) - 3 charts: daily interactions line (gradient+weekends), daily active users bar, daily action rate % line — all responsive with maintainAspectRatio:false Editors tab: - CLI (copilot_cli) now injected as a synthetic 'CLI (copilot_cli)' editor row - Appears in enhanced editor table and top-5 charts, sorted by interactions User Metrics tab: - Added top-10 users bar chart (horizontal, Interactions + Copilot LOC) - Added engagement distribution doughnut (High/Medium/Low/Inactive) - Fixed tiles: removed fixed width/height + mx-auto, now uses CSS grid - Added text-primary/success/info colors to KPI values - Progress bar on Active Users tile - Removed scoped .tiles-container style that conflicted with global Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * UI polish: unify all tabs, fix KPI colors, gradient toolbar, restyle GitHub.com/Seats/Breakdown - global.css: explicit text-primary/success/info/error/warning overrides (fixes KPI colors) - global.css: subtle gradient on .app-toolbar for modern look - MainComponent.vue: add app-toolbar class to v-toolbar - All info panels: flex:1 on description div so it grows, LEARN MORE stays compact - AgentModeViewer: full restyle - info header, unified KPI tiles with colors, cards-with-titles for all charts/tables, removed v-main/v-container wrapper - SeatsAnalysisViewer: full restyle - info header with LEARN MORE links, unified KPI tiles with colored values (blue/yellow/red), cards for chart+table, removed mx-auto + inline width/height - BreakdownComponent: Top Language/Editor KPI tile, color-coded feature chips, info panel moved full-width above charts, all charts wrapped in v-card, removed v-main/v-container wrapper, standardized mx-4 margins Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * UI: add chart size toggle and consistent containers to all tabs - Fix AgentActivityViewer missing chartColumns in return statement - Add v-container + v-btn-toggle to PullRequestViewer, AgentModeViewer, SeatsAnalysisViewer, UserMetricsViewer, BreakdownComponent - Make chart cols responsive to chartColumns (1-col or 2-col layout) - All components now match MetricsViewer's px-4 elevation-2 container pattern - All 281 unit tests passing Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix: x-axis dates missing (d.date -> d.day) + chart card alignment - Fix critical bug: MetricsViewer was using d.date which doesn't exist on ReportDayTotals (the field is d.day), causing all chart x-axis labels to be empty strings - Add explicit x: { ticks: { maxTicksLimit: 14 } } to all MetricsViewer chart options to ensure x-axis labels always render - Add legend: { position: 'bottom' } consistently across all options - Add d-flex + flex-grow-1 to chart cards so pairs in same visual row stretch to equal height, fixing the alignment mismatch Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix: align Organization tab chart styles with other tabs - Add y-axis title 'Users' to IDE DAU/WAU charts (matches AgentModeViewer) - Add interaction: { mode: 'index', intersect: false } for consistent cross-hair tooltips across line charts Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Models tab: charts side by side, tables full-width underneath - Lines Added by Feature and Lines Added by Model now share a row - Feature Summary and Model Summary each take full width, stacked below Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Toolbar: blue gradient in light mode Light mode toolbar uses a blue gradient (1565c0→1976d2→1e88e5). Dark mode keeps existing charcoal (#1a1b2e). White text/icons remain unchanged on both. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Remove Least-Used Languages/IDEs section Removes the '5 Least-Used' bar chart from both Languages and Editors tabs. Cleans up the ref declaration, both computed blocks, and the template row. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add full-width chart toggle option to all tabs Third toggle button (mdi-fullscreen) sets chartColumns='full': - Container becomes fluid with px-0 (no side margins) - Charts expand to full page width - BreakdownComponent mx-4 table wrapper also removed in full mode Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: add LOC suggested/added splits, P3 info card, P4 trend arrows AgentActivityViewer: - Add Suggested vs Added split to user-initiated per-model and per-language charts - Add Added vs Deleted split to agent-initiated per-model and per-language charts - Add new aggregate summary charts: user-initiated by mode (Suggested/Added) and agent-initiated by mode (Added/Deleted) alongside existing time series - Add chart_panel_edit_mode and chat_panel_plan_mode to FEATURE_DISPLAY map - Update chart subtitles to better describe what each chart shows AgentModeViewer: - Add premium requests info card (v-alert) at bottom of Models tab with dynamic billing settings link and model multipliers docs link MetricsViewer: - Add KPI trend arrows (first-half vs second-half comparison) on 4 tiles: IDE Active Users, Agent Adoption %, Total Chat Requests, Acceptance Rate - Add chat_panel_plan_mode to FEATURE_DISPLAY map Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix * fix: address PR #343 review comments - e2e-tests/pages/DashboardPage.ts: update KPI locators from .text-h5 to .kpi-value-sm to match redesigned tile structure (fixes storage pipeline test failure) - app/components/MetricsViewer.vue: replace no-op map+standalone expression with forEach for cumulativeNumberLOCAccepted - app/components/CopilotChatViewer.vue: convert setup() snapshot reads to watchEffect so KPI values and charts react to prop updates - app/model/Options.ts: validate rawScope against allowed values before assigning; unknown values default to 'organization' - app/assets/global.css: scope font-family override to :not(.v-icon):not(.mdi) to preserve MDI icon rendering - app/plugins/suppress-devtools-warn.client.ts: remove plugin per review feedback Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: update all e2e page object locators for redesigned KPI tiles The UI redesign replaced .text-h4/.text-h5 value elements with .kpi-value and .kpi-value-sm classes, and renamed 'Cumulative Chat Interactions' to 'Chat Interactions'. Update all stale locators across e2e page objects: - CopilotChatTab.ts: 'Cumulative Chat Interactions' → 'Chat Interactions', .text-h4 → .kpi-value - GitHubTab.ts: same label/class rename - EditorsTab.ts: .text-h4 → .kpi-value - LanguagesTab.ts: .text-h4 → .kpi-value - SeatAnalysisTab.ts: .text-h4 → .kpi-value - UserMetricsTab.ts: all three KPI values .text-h4 → .kpi-value - real-data-teams.spec.ts: two inline .text-h4 → .kpi-value Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor: rename github-tab → models-tab; GitHubTab → ModelsTab; .github-com-container → .models-container - Rename e2e-tests/github-tab.spec.ts → models-tab.spec.ts - Rename e2e-tests/pages/GitHubTab.ts → ModelsTab.ts (class GitHubTab → ModelsTab) - Update DashboardPage.ts: githubTabLink → modelsTabLink, gotoGitHubTab() → gotoModelsTab(), tab name 'github.com' → 'models' - Add class='models-container' to AgentModeViewer.vue root div (was unclassed) - Replace .github-com-container with .models-container throughout Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: reorganize charts between Organization and Models tabs - Move Active Users Over Time from Models tab to Organization tab - Move Feature Usage Over Time (expanded to all features) to Organization tab - Move 3 model charts (Model Usage Per Day, Chat Model Usage, Model Usage Per Chat Mode) from Organization tab to Models tab via new reportData prop - Add Feature Activity Breakdown bar chart to Organization tab - Shared y-axis scale for IDE DAU/WAU charts - Clean up unused imports/refs from MetricsViewer (ArcElement, Doughnut, stackedAreaOptions, donutOptions, model chart refs) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chore: bump version to 3.3.0 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: make 'Requests per chat mode' full-width to avoid empty column Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: apply full-width mode to table containers in UserMetricsViewer Both table containers (Per-User Metrics and User Metrics History) now use :fluid="chartColumns === 'full'" matching the charts container, so the full-width toggle consistently affects all sections. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(e2e): fix stale locators in models-tab spec - statisticsTitle: was looking for non-existent 'Copilot Statistics' h2; now targets the always-present info panel heading in .models-container - featureUsageTitle: 'Feature Usage Over Time' moved to Org tab; now targets 'Top Models by Interactions' v-card-title in Models tab - activeUsersTitle: 'Active Users Over Time' moved to Org tab; now targets 'Model Usage Per Day' v-card-title in Models tab - modelFeatureTitle / featureSummaryTitle / modelSummaryTitle: were using h2 selector but v-card-title renders as div; switched to .v-card-title - gotoModelsTab: no longer wastes 15s timing out on missing statisticsTitle - beforeAll .v-card-title wait: made non-fatal (.catch) so webkit CI slowness can't cause a cascade failure of all serial tests - expectChartSectionsVisible: accepts any v-card-title in models-container Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(e2e): fix allModelsCard locator — card title is 'Unique Models' not 'All Models' Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(charts): fix acceptance rate y-axis — set max to 120% with % tick labels Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(charts): use 120% max on all percentage y-axes for visual headroom Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: refresh all README screenshots with current UI and anonymized org/user names Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: refresh screenshots — models tab rename, feature usage & active users charts, date range filter - Rename github-com-tab → models-tab, remove expanded screenshot - main-metrics-dashboard: full page org tab - Total_suggestions_count: now shows Feature Usage Over Time chart - Acceptance_rate_bycount: now shows Active Users Over Time chart - date-range-filter: now shows picker open - Update README section titles and descriptions to match Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: update csv-export-functionality screenshot with current API response tab Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(preview): use NUXT_PUBLIC_ENABLE_HISTORICAL_MODE to correctly enable teams tab ENABLE_HISTORICAL_MODE is not picked up by Nuxt public runtimeConfig. The correct env var is NUXT_PUBLIC_ENABLE_HISTORICAL_MODE which maps to config.public.enableHistoricalMode, required for teams tab visibility. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(teams): bind :theme to v-autocomplete so dropdown uses correct dark/light mode colors Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(teams): complete Teams tab redesign — single-team deep dive + comparison mode - Two modes based on selection count: - 1 team → deep dive (KPIs, time-series, language donut, editor bar, models bar, user table) - 2+ teams → comparison (summary cards, overlapping line charts, language/editor/models grouped bars) - Single-team mode shows: - 4 KPI tiles: active users, acceptance rate, interactions, top language - Column toggle (1/2 col) matching org view pattern - Acceptance rate + active users time-series charts (220px, compact) - Language distribution donut chart (top 10 by code generations) - Editor usage horizontal bar chart (interactions per editor) - Top models by interactions bar chart (from reportData.totals_by_model_feature) - Language acceptance rates table (top 15 languages) - Per-user activity table (fetched non-fatally, shows 503 sign-in prompt if needed) - Comparison mode shows: - Per-team summary cards (active users, acceptance rate, interactions) - Acceptance rate + active users overlapping line charts - Language and editor grouped bar charts - Models comparison grouped bar chart - Data improvements: - PerTeamData now stores reportData: ReportDayTotals[] from API - Language/editor aggregation prefers new reportData (totals_by_ide, totals_by_language_feature) with fallback to legacy metrics.breakdown - Models use reportData.totals_by_model_feature (correct path) - User metrics fetch is non-fatal; shows contextual error for 503 - perTeamData is reactive ref (was local variable) so all computeds update - Removed: sequential h2+LineChart layout, Selected Teams Quick Links card, old summary tiles, unused chart data refs (suggestions, lines, feature usage) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: update Playwright tests for redesigned Teams tab - 'No Teams Selected' → 'No Team Selected' (single team mode) - Remove assertions for removed UI elements: 'Selected Teams' section, 'Teams Selected' tile, 'Total Active Users' tile - Add assertions for new comparison mode: 'Comparison' chip, per-team summary cards showing team names - Update chart titles: 'Language/Editor Usage by Team' → 'Language/Editor Usage — by Team' (em dash) - Replace .comparison-summary-card (non-existent) with card name checks - Add empty state hints: '1 team → Deep Dive', '2+ teams → Comparison' Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: Teams tab header and KPI tiles match org style - Replace card-title/subtitle header with outlined info panel matching Organization Dashboard layout (description text on top, no extra margin) - Move team selector to its own flat card below the info panel - Replace v-row/v-col KPI grid with tiles-container + elevation-4 cards matching org tile style (text-h6 label, kpi-value with color, subtitle) - Add color/subtitle fields to singleTeamKPIs: Active Users (primary), Acceptance Rate (success/green), Interactions (primary), Top Language (primary) - Team header uses outlined compact card with icon, name, date range Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: resolve dateRangeDesc ReferenceError in singleTeamKPIs computed dateRangeDesc was only defined in the setup() return object, not as a local variable. The singleTeamKPIs computed threw ReferenceError when accessing dateRangeDesc.value, causing KPI tiles to not render. Fix: use props.dateRangeDescription directly inside the computed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(teams): add Feature Usage Over Time chart to single-team deep dive Add a new full-width line chart showing feature interactions per day (Completions, Chat, Edit, Agent, etc.) between the language/editor row and the models/language-table row in the Teams single-team deep dive. - Import PALETTE from chartPlugins for consistent colors - Add FEATURE_DISPLAY map and featureLabel helper (mirrors MetricsViewer) - Add singleTeamFeatureUsageData computed from perTeamData[0].reportData - Chart only renders when feature data is present (v-if guard) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(teams): align team selector card to match other cards (outlined, mx-4) Replace flat unstyled selector card with outlined variant matching the Teams Dashboard description card above and team header cards below. Also use density=compact and flex layout instead of v-row/v-col grid. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(teams): add Model Usage Over Time chart to fill gap below Top Models Add a line chart below 'Top Models by Interactions' showing daily model interaction counts over time (one line per model). Only renders when model data is present, filling the empty space when Language Acceptance Rates table is taller than the bar chart. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: add Teams tab screenshots (comparison + single-team deep dive) - teams-comparison.png: two teams selected side-by-side (My Secrets Team + Nested A Team) showing acceptance rate, active users, language, editor, and model comparison charts - teams-single-team.png: single team deep dive showing KPI tiles, all time-series/donut/bar charts including new Feature Usage Over Time and Model Usage Over Time charts, plus user activity table User names anonymized; captured from preview deployment. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: update Teams section in README with single-team and comparison screenshots Replace single 'Teams Comparison' screenshot with two screenshots: - teams-single-team.png: full deep-dive view (KPI tiles, all charts, user table) - teams-comparison.png: multi-team side-by-side comparison Also rename section from 'Teams Comparison' to 'Teams Tab' to reflect that it now covers both single-team deep dive and comparison modes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: use 1-day report JSON as mock template; clarify scope/team docs Agent-Logs-Url: https://github.com/github-copilot-resources/copilot-metrics-viewer/sessions/a6472326-3d05-45a8-9dd2-4134ded24382 Co-authored-by: karpikpl <3539908+karpikpl@users.noreply.github.com> * feat: remove NUXT_PUBLIC_GITHUB_TEAM UI-lock behavior The env var's only effect was to lock the UI to a single team view, hide the Teams tab, rename tabs to 'team', and show a historical warning. All of this is now superseded by the Teams tab (dynamic selection) and URL routing (/orgs/x/teams/y). The Options.githubTeam field is kept for dynamic team queries from the Teams tab and URL params. Changes: - MainComponent.vue: remove githubTeam guard on Teams tab, remove getDisplayTabName team branch, remove showTeamHistoricalWarning banner - server/middleware/github.ts: remove event.context.team from env var, remove 'team' scope assignment - app/pages/index.vue: remove config.public.githubTeam = route.params.team (Options.fromRoute already handles URL params correctly) - nuxt.config.ts: remove githubTeam from runtimeConfig.public - server/tasks/daily-sync.ts, server/sync-entry.ts: remove githubTeam from syncBulk calls (buildReportUrl ignores teamSlug anyway) - shared/utils/getDisplayName.ts: remove team name display branch - DEPLOYMENT.md, README.md: remove NUXT_PUBLIC_GITHUB_TEAM documentation - tests: update MainComponent.teams.spec.ts and github-middleware.nuxt.spec.ts Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(e2e): update team title test to match removed team name suffix getDisplayName no longer appends '| Team : <slug>' to the page title since NUXT_PUBLIC_GITHUB_TEAM was removed. The URL-based team context is visible in the Teams tab, not the page title. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: karpikpl <3539908+karpikpl@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 18e68b7 commit 57aa700

68 files changed

Lines changed: 4480 additions & 2086 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ NUXT_OAUTH_GITHUB_CLIENT_SECRET=
2828
# to use a corporate proxy
2929
# HTTP_PROXY=http://proxy.company.com:8080
3030

31-
ENABLE_HISTORICAL_MODE=true
31+
ENABLE_HISTORICAL_MODE=false
3232
NUXT_PUBLIC_USE_NEW_API=true
3333

3434
# Comma-separated list of tab names to hide from the dashboard UI.

.env.example

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
NUXT_PUBLIC_IS_DATA_MOCKED=true
1111

1212
# Determines the scope of the API calls.
13-
# Can be 'enterprise', 'organization', 'team-organization', or 'team-enterprise'
13+
# Can be 'enterprise' or 'organization'. Legacy values 'team-organization'/'team-enterprise' are auto-normalized.
1414
NUXT_PUBLIC_SCOPE=organization
1515

1616
# Determines the enterprise or organization name to target API calls.

.github/workflows/preview-deploy.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ jobs:
261261
NUXT_SESSION_PASSWORD=${{ secrets.NUXT_SESSION_PASSWORD }} \
262262
NUXT_GITHUB_TOKEN=${{ secrets.PREVIEW_GITHUB_TOKEN }} \
263263
DATABASE_URL=${{ steps.dburl.outputs.database_url }} \
264-
ENABLE_HISTORICAL_MODE=true \
264+
NUXT_PUBLIC_ENABLE_HISTORICAL_MODE=true \
265265
SYNC_ENABLED=false \
266266
NITRO_PORT=3000 \
267267
NUXT_PUBLIC_IS_DATA_MOCKED=false \
@@ -279,7 +279,7 @@ jobs:
279279
NUXT_SESSION_PASSWORD=${{ secrets.NUXT_SESSION_PASSWORD }} \
280280
NUXT_GITHUB_TOKEN=${{ secrets.PREVIEW_GITHUB_TOKEN }} \
281281
DATABASE_URL=${{ steps.dburl.outputs.database_url }} \
282-
ENABLE_HISTORICAL_MODE=true \
282+
NUXT_PUBLIC_ENABLE_HISTORICAL_MODE=true \
283283
SYNC_ENABLED=false \
284284
NITRO_PORT=3000 \
285285
NUXT_PUBLIC_IS_DATA_MOCKED=false \
@@ -336,7 +336,7 @@ jobs:
336336
--env-vars \
337337
NUXT_GITHUB_TOKEN=${{ secrets.PREVIEW_GITHUB_TOKEN }} \
338338
DATABASE_URL=${{ steps.dburl.outputs.database_url }} \
339-
ENABLE_HISTORICAL_MODE=true \
339+
NUXT_PUBLIC_ENABLE_HISTORICAL_MODE=true \
340340
NUXT_PUBLIC_IS_DATA_MOCKED=false \
341341
NUXT_PUBLIC_SCOPE=${{ secrets.PREVIEW_SCOPE || 'organization' }} \
342342
NUXT_PUBLIC_GITHUB_ORG=${{ secrets.PREVIEW_GITHUB_ORG }}

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,6 @@ playwright-logs
3131
test-results
3232
test-results-old
3333
results.xml
34+
35+
cody-test-org
36+
AgentPlan.md

DEPLOYMENT.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -286,10 +286,9 @@ These endpoints respond in ~200ms without making external API calls and do not r
286286
| Variable | Description | Required |
287287
|----------|-------------|----------|
288288
| `NUXT_GITHUB_TOKEN` | GitHub PAT with Copilot metrics permission | Yes (unless OAuth) |
289-
| `NUXT_PUBLIC_SCOPE` | `organization`, `enterprise`, `team-organization`, or `team-enterprise` | Yes |
290-
| `NUXT_PUBLIC_GITHUB_ORG` | GitHub organization slug | For org/team-org scope |
291-
| `NUXT_PUBLIC_GITHUB_ENT` | GitHub enterprise slug | For enterprise/team-ent scope |
292-
| `NUXT_PUBLIC_GITHUB_TEAM` | GitHub team slug | For team scopes |
289+
| `NUXT_PUBLIC_SCOPE` | `organization` or `enterprise` (legacy `team-organization`/`team-enterprise` have been removed; existing values are auto-normalized) | Yes |
290+
| `NUXT_PUBLIC_GITHUB_ORG` | GitHub organization slug | For org scope |
291+
| `NUXT_PUBLIC_GITHUB_ENT` | GitHub enterprise slug | For enterprise scope |
293292
| `NUXT_SESSION_PASSWORD` | Session encryption key (min 32 chars) | Yes |
294293
| `DATABASE_URL` | PostgreSQL connection string | Historical mode only |
295294
| `ENABLE_HISTORICAL_MODE` | `true` to read metrics from database | Historical mode only |

README.md

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,18 @@ Users can now filter metrics for custom date ranges up to 100 days, with an intu
5555
<img width="800" alt="Date Range Filter" src="./images/date-range-filter.png">
5656
</p>
5757

58-
### Teams Comparison
59-
Compare Copilot metrics across multiple teams within your organization to understand adoption patterns and identify high-performing teams.
58+
### Teams Tab
59+
Select **one team** for a full deep-dive view with KPI tiles, time-series charts (acceptance rate, active users, feature usage, model usage), language and editor breakdowns, and a per-user activity table. Select **two or more teams** to compare them side by side.
6060

6161
> [!NOTE]
6262
> GitHub's Copilot Usage Metrics API does not provide team-level endpoints. Team metrics are **derived** by fetching per-user daily metrics from the organization/enterprise endpoint, resolving team membership via the GitHub Teams API, and aggregating per-user data in-memory. This works in both Direct API mode (28-day window) and Historical mode (full history).
6363
64+
**Single team deep dive:**
65+
<p align="center">
66+
<img width="800" alt="Teams Single Team Deep Dive" src="./images/teams-single-team.png">
67+
</p>
68+
69+
**Multi-team comparison:**
6470
<p align="center">
6571
<img width="800" alt="Teams Comparison" src="./images/teams-comparison.png">
6672
</p>
@@ -73,15 +79,11 @@ In **Historical mode** (with PostgreSQL), the User Metrics tab also displays per
7379
<p align="center">
7480
<img width="800" alt="Per-User Metrics" src="./images/user-metrics.png">
7581
</p>
76-
### GitHub.com Integration & Model Analytics
77-
View comprehensive statistics for GitHub.com features including Chat, PR Summaries, and detailed model usage analytics. Each section provides expandable details showing model types, editors, and usage patterns.
78-
79-
<p align="center">
80-
<img width="800" alt="GitHub.com Tab" src="./images/github-com-tab.png">
81-
</p>
82+
### Models Tab
83+
View model usage analytics including model adoption over time, chat model distribution, and usage per chat mode (Ask, Agent, Edit, Inline).
8284

8385
<p align="center">
84-
<img width="800" alt="Model Usage Details" src="./images/github-com-models-expanded.png">
86+
<img width="800" alt="Models Tab" src="./images/models-tab.png">
8587
</p>
8688

8789
### CSV Export Functionality
@@ -102,18 +104,18 @@ Here are the key metrics visualized in these charts:
102104
<img width="800" alt="Key Metrics Overview" src="./images/main-metrics-dashboard.png">
103105
</p>
104106

105-
1. **Acceptance Rate:** This metric represents the ratio of accepted lines and suggestions to the total suggested by GitHub Copilot. This rate is an indicator of the relevance and usefulness of Copilot's suggestions. However, as with any metric, it should be used with caution as developers use Copilot in many different ways (research, confirm, verify, etc., not always "inject").
107+
1. **Active Users Over Time:** Tracks daily, weekly, and monthly active users across all Copilot features — IDE completions, chat, agent mode, CLI, and PR summaries.
106108
<p align="center">
107-
<img width="800" alt="image" src="./images/Acceptance_rate_bycount.png">
109+
<img width="800" alt="Active Users Over Time" src="./images/Acceptance_rate_bycount.png">
108110
</p>
109111

110-
2. **Total Suggestions:** This chart illustrates the total number of code suggestions made by GitHub Copilot. It offers a view of the tool's activity and its engagement with users over time.
111-
112-
3. **Total Acceptances:** This visualization focuses on the total number of suggestions accepted by users.
112+
2. **Feature Usage Over Time:** Shows user-initiated interactions per feature per day, covering IDE chat, agent mode, edit mode, inline chat, CLI, PR summaries, and more.
113113
<p align="center">
114-
<img width="800" alt="image" src="./images/Total_suggestions_count.png">
114+
<img width="800" alt="Feature Usage Over Time" src="./images/Total_suggestions_count.png">
115115
</p>
116116

117+
3. **Code Completions:** Tracks total inline code suggestions shown and accepted over time.
118+
117119
4. **Total Lines Suggested:** Showcases the total number of lines of code suggested by GitHub Copilot. This gives an idea of the volume of code generation and assistance provided.
118120

119121
5. **Total Lines Accepted:** As the name suggests, the total lines of code accepted by users (full acceptances) offering insights into how much of the suggested code is actually being utilized and incorporated into the codebase.
@@ -201,7 +203,6 @@ Public variables:
201203
- `NUXT_PUBLIC_SCOPE`
202204
- `NUXT_PUBLIC_GITHUB_ENT`
203205
- `NUXT_PUBLIC_GITHUB_ORG`
204-
- `NUXT_PUBLIC_GITHUB_TEAM`
205206
- `NUXT_PUBLIC_HIDDEN_TABS`
206207
- `NUXT_PUBLIC_ENABLE_HISTORICAL_MODE`
207208

@@ -214,11 +215,13 @@ can be overridden by route parameters, e.g.
214215

215216
#### NUXT_PUBLIC_SCOPE (Required!)
216217

217-
The `NUXT_PUBLIC_SCOPE` environment variable in the `.env` file determines the default scope of the API calls made by the application. It can be set to 'enterprise', 'organization', 'team-organization' or 'team-enterprise'.
218+
The `NUXT_PUBLIC_SCOPE` environment variable in the `.env` file determines the default scope of the API calls made by the application. It can be set to `'enterprise'` or `'organization'`.
218219

219-
- If set to 'enterprise', the application will target API calls to the GitHub Enterprise account defined in the `NUXT_PUBLIC_GITHUB_ENT` variable.
220-
- If set to 'organization', the application will target API calls to the GitHub Organization account defined in the `NUXT_PUBLIC_GITHUB_ORG` variable.
221-
- If set to 'team-organization' or 'team-enterprise', the application will display team-level metrics derived from per-user data for the team defined in `NUXT_PUBLIC_GITHUB_TEAM` within the specified organization or enterprise.
220+
- If set to `'enterprise'`, the application will target API calls to the GitHub Enterprise account defined in the `NUXT_PUBLIC_GITHUB_ENT` variable.
221+
- If set to `'organization'`, the application will target API calls to the GitHub Organization account defined in the `NUXT_PUBLIC_GITHUB_ORG` variable.
222+
- To view team-level metrics, use the Teams tab or navigate to `/orgs/<org>/teams/<team>` — team filtering is applied as a post-processing step.
223+
224+
> **Note:** Legacy values `'team-organization'` and `'team-enterprise'` are still accepted and automatically normalized to `'organization'` and `'enterprise'` respectively for backward compatibility.
222225
223226
For example, if you want to target the API calls to an organization, you would set `NUXT_PUBLIC_SCOPE=organization` in the `.env` file.
224227

@@ -234,18 +237,6 @@ NUXT_PUBLIC_GITHUB_ORG=<YOUR-ORGANIZATION>
234237
NUXT_PUBLIC_GITHUB_ENT=
235238
````
236239

237-
#### NUXT_PUBLIC_GITHUB_TEAM
238-
239-
The `NUXT_PUBLIC_GITHUB_TEAM` environment variable filters metrics for a specific GitHub team within an Organization or Enterprise account.
240-
‼️ Important ‼️ When this variable is set, all displayed metrics will pertain exclusively to the specified team. To view metrics for the entire Organization or Enterprise, remove this environment variable.
241-
242-
> [!NOTE]
243-
> Team metrics are **derived from per-user data**, not from a dedicated team API endpoint. The application resolves team membership via the GitHub Teams API and aggregates per-user metrics for team members. There is no minimum team size requirement.
244-
245-
````
246-
NUXT_PUBLIC_GITHUB_TEAM=
247-
````
248-
249240
#### NUXT_PUBLIC_IS_DATA_MOCKED
250241

251242
Variable is false by default. To view mocked data switch it to true or use query parameter `?mock=true`.

app/assets/global.css

Lines changed: 131 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,48 @@
1515
}
1616
}
1717

18+
/* System font stack — matches GitHub's look */
19+
.v-application, .v-application *:not(.v-icon):not(.mdi) {
20+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif;
21+
}
22+
23+
/* KPI tile grid — Row 1 (5 tiles) and Row 2 (4 tiles) each in independent auto-fit grids */
1824
.tiles-container {
19-
display: flex;
20-
justify-content: flex-start;
21-
flex-wrap: wrap;
22-
}
25+
display: grid;
26+
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
27+
gap: 10px;
28+
padding: 4px 16px;
29+
}
2330
.tiles-text {
2431
display: flex;
2532
flex-direction: column;
2633
align-items: center;
2734
text-align: center;
2835
}
2936

37+
/* Unified KPI value — all tiles use the same base size; long text scales down gracefully */
38+
.kpi-value {
39+
font-size: clamp(1.4rem, 3.2vw, 2.8rem);
40+
font-weight: 700;
41+
line-height: 1.15;
42+
word-break: break-word;
43+
overflow-wrap: break-word;
44+
}
45+
/* Secondary / de-emphasised row (row 2 tiles) */
46+
.kpi-value-sm {
47+
font-size: clamp(1.1rem, 2.2vw, 1.9rem);
48+
font-weight: 600;
49+
line-height: 1.2;
50+
}
51+
/* Legacy alias kept for any remaining usages */
52+
.kpi-text-value {
53+
font-size: clamp(1.4rem, 3.2vw, 2.8rem);
54+
font-weight: 700;
55+
line-height: 1.15;
56+
word-break: break-word;
57+
overflow-wrap: break-word;
58+
}
59+
3060
.error-message {
3161
color: red;
3262
}
@@ -199,7 +229,47 @@
199229
background-color: var(--app-accent-weak) !important;
200230
}
201231

202-
/* ── Global tooltip card style ── */
232+
/* ── Explicit text color utilities (ensures CSS vars work in SSR/module builds) ── */
233+
.text-primary { color: rgb(var(--v-theme-primary)) !important; }
234+
.text-success { color: rgb(var(--v-theme-success)) !important; }
235+
.text-info { color: rgb(var(--v-theme-info)) !important; }
236+
.text-error { color: rgb(var(--v-theme-error)) !important; }
237+
.text-warning { color: rgb(var(--v-theme-warning)) !important; }
238+
239+
/* ── Toolbar ── */
240+
.app-toolbar {
241+
background: linear-gradient(135deg, #1565c0 0%, #1976d2 50%, #1e88e5 100%) !important;
242+
border-bottom: none !important;
243+
}
244+
.v-theme--dark .app-toolbar {
245+
background: #1a1b2e !important;
246+
border-bottom: 1px solid rgba(255,255,255,0.10) !important;
247+
}
248+
249+
/* Force white text/icons inside the charcoal toolbar */
250+
.app-toolbar .v-toolbar-title,
251+
.app-toolbar .toolbar-title,
252+
.app-toolbar .v-btn,
253+
.app-toolbar .v-icon,
254+
.app-toolbar .error-message,
255+
.app-toolbar .user-info {
256+
color: rgba(255, 255, 255, 0.92) !important;
257+
}
258+
.app-toolbar .v-btn:hover {
259+
background: rgba(255, 255, 255, 0.1) !important;
260+
}
261+
/* Tabs inside toolbar: inactive = muted white, active = bright white + underline */
262+
.app-toolbar .v-tab {
263+
color: rgba(255, 255, 255, 0.55) !important;
264+
}
265+
.app-toolbar .v-tab--selected {
266+
color: #ffffff !important;
267+
}
268+
.app-toolbar .v-tabs .v-tabs-slider-wrapper .v-tabs-slider {
269+
background: #ffffff !important;
270+
}
271+
272+
/* ── Global tooltip card style ── */
203273
.metric-tooltip {
204274
background-color: #1a237e !important;
205275
max-width: 380px;
@@ -209,4 +279,59 @@
209279
color: #ffffff !important;
210280
font-size: 13px !important;
211281
line-height: 1.45;
212-
}
282+
}
283+
/* ── Vuetify theme CSS variable definitions ──────────────────────────────
284+
The vuetify-nuxt-module extracts SCSS at build time without runtime
285+
variable injection. We define them here so theme switching works. */
286+
287+
.v-theme--light {
288+
--v-theme-background: 255,255,255;
289+
--v-theme-on-background: 0,0,0;
290+
--v-theme-surface: 255,255,255;
291+
--v-theme-on-surface: 0,0,0;
292+
--v-theme-surface-variant: 245,245,245;
293+
--v-theme-on-surface-variant: 66,66,66;
294+
--v-theme-primary: 25,118,210;
295+
--v-theme-on-primary: 255,255,255;
296+
--v-theme-secondary: 66,66,66;
297+
--v-theme-on-secondary: 255,255,255;
298+
--v-theme-error: 255,82,82;
299+
--v-theme-info: 33,150,243;
300+
--v-theme-success: 76,175,80;
301+
--v-theme-warning: 255,193,7;
302+
--v-border-color: 0,0,0;
303+
--v-border-opacity: 0.12;
304+
--v-high-emphasis-opacity: 0.87;
305+
--v-medium-emphasis-opacity: 0.6;
306+
--v-disabled-opacity: 0.38;
307+
--v-hover-opacity: 0.04;
308+
--v-focus-opacity: 0.12;
309+
--v-activated-opacity: 0.12;
310+
--v-theme-overlay-multiplier: 1;
311+
}
312+
313+
.v-theme--dark {
314+
--v-theme-background: 18,18,18;
315+
--v-theme-on-background: 255,255,255;
316+
--v-theme-surface: 30,30,30;
317+
--v-theme-on-surface: 255,255,255;
318+
--v-theme-surface-variant: 45,45,45;
319+
--v-theme-on-surface-variant: 200,200,200;
320+
--v-theme-primary: 144,202,249;
321+
--v-theme-on-primary: 0,0,0;
322+
--v-theme-secondary: 176,190,197;
323+
--v-theme-on-secondary: 0,0,0;
324+
--v-theme-error: 239,154,154;
325+
--v-theme-info: 100,181,246;
326+
--v-theme-success: 165,214,167;
327+
--v-theme-warning: 255,224,130;
328+
--v-border-color: 255,255,255;
329+
--v-border-opacity: 0.12;
330+
--v-high-emphasis-opacity: 1;
331+
--v-medium-emphasis-opacity: 0.7;
332+
--v-disabled-opacity: 0.5;
333+
--v-hover-opacity: 0.08;
334+
--v-focus-opacity: 0.12;
335+
--v-activated-opacity: 0.12;
336+
--v-theme-overlay-multiplier: 2;
337+
}

0 commit comments

Comments
 (0)