Skip to content

feat: Refreshed UI - #1507

Open
andypols wants to merge 30 commits into
finos:mainfrom
qube-rt:new-ui
Open

feat: Refreshed UI#1507
andypols wants to merge 30 commits into
finos:mainfrom
qube-rt:new-ui

Conversation

@andypols

@andypols andypols commented Apr 20, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR modernises the git-proxy UI while keeping backend changes to a minimum.

resolves #1106
resolves #1123
resolves #1176
resolves #1258
resolves #1297
resolves #1420
resolves #1495

UI L&F

  • Upgraded to the latest React version
  • Replaced legacy @material-ui with GitHub’s component library (@primer/react) and Tailwind CSS (fixes Replace MUI v4 styling with Tailwind #1106).
  • Replaced legacy moment with luxon for UI date/time handling.
  • Removed the left-hand navigation and replaced it with a responsive top navigation bar.
  • Updated pages to use query parameters to preserve state, so browser back/forward navigation works as expected.

Standard top navigation:

CleanShot 2026-04-20 at 10 47 40@2x

Mobile (responsive) navigation:

CleanShot 2026-04-20 at 10 52 03@2x

Repositories

Repository list view

CleanShot 2026-04-20 at 11 12 58@2x

Repository

  • Added activity summary for the repository
  • Replaced the add-user modal with proper autocomplete. User lookup now matches on typed characters instead of showing all users. It also supports pasting a username directly

Repository view

CleanShot 2026-04-20 at 11 51 35@2x

Activities (previously Dashboard)

Activity list view

CleanShot 2026-04-20 at 11 32 52@2x

Users

User list view

CleanShot 2026-04-20 at 11 40 41@2x

User

  • Added activity summary for the user

User view

CleanShot 2026-04-20 at 11 43 41@2x

Backend APIs & Services

This branch adds the backend APIs and service-layer support needed for the new UI:

  • A new GET /api/v1/repo/:id/scm-metadata endpoint fetches and caches GitHub/GitLab repository metadata using new provider-specific logic in src/service/gitProviders. The github api endpoint is currently unauthenticated, but the implementation is structured so future PRs can add bearer-token auth and provider-specific operations such as forking or syncing.
  • A new GET /api/v1/user/:id/activity endpoint returns all pushes attributed to a user.
  • The existing GET /api/v1/user response now includes activity tab counts.
  • The existing GET /api/v1/repo response now includes activity tab counts.

@andypols
andypols requested a review from a team as a code owner April 20, 2026 11:15
@netlify

netlify Bot commented Apr 20, 2026

Copy link
Copy Markdown

Deploy Preview for endearing-brigadeiros-63f9d0 canceled.

Name Link
🔨 Latest commit f32c0e2
🔍 Latest deploy log https://app.netlify.com/projects/endearing-brigadeiros-63f9d0/deploys/6a6872b6eeab9a00088730d1

Comment thread src/ui/views/RepoDetails/RepoDetails.tsx Fixed
@codecov

codecov Bot commented Apr 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 44.12651% with 371 lines in your changes missing coverage. Please review.
✅ Project coverage is 85.70%. Comparing base (c841444) to head (9c35e3d).

Files with missing lines Patch % Lines
src/db/file/pushes.ts 26.92% 76 Missing ⚠️
src/db/mongo/pushes.ts 36.52% 73 Missing ⚠️
src/db/index.ts 27.14% 51 Missing ⚠️
src/service/gitProviders/GitLabProvider.ts 12.24% 43 Missing ⚠️
src/service/scmMetadata.ts 63.63% 40 Missing ⚠️
src/service/gitProviders/GitHubProvider.ts 29.26% 29 Missing ⚠️
src/activity/activityPrimaryStatus.ts 4.76% 20 Missing ⚠️
src/db/userProfilePushQuery.ts 51.72% 14 Missing ⚠️
src/activity/canonicalRemoteUrl.ts 64.51% 9 Missing and 2 partials ⚠️
src/db/repoActivityMerge.ts 70.00% 6 Missing ⚠️
... and 3 more
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1507      +/-   ##
==========================================
- Coverage   90.62%   85.70%   -4.92%     
==========================================
  Files          69       79      +10     
  Lines        5694     6331     +637     
  Branches      985     1021      +36     
==========================================
+ Hits         5160     5426     +266     
- Misses        516      885     +369     
- Partials       18       20       +2     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@kriswest kriswest added this to the 2.2.0 milestone Apr 20, 2026
@kriswest

Copy link
Copy Markdown
Contributor

Hey @andypols, we discussed this PR at #1506 and are (as a group) excited to see this get done. We debated whether to put this PR in scope for 2.1.0 or whether to go for 2.2.0... There are at least 2 PRs also scoped for 2.1.0 that will need UI additions:

SSH has been waiting for a long time so consensus at the meeting was (reluctantly) to do that first and then ask you to update #1507 to add the additional UI panels (or to collab with you on doing so). Hence, we've marked this for 2.2.0 (and as the only issue in that milestone currently). Does that work for you?

Also, please see the below notes from the meeting agenda:

  • there was a question about some additional issues you may or may not be taking care of with the PR (no worries if not, just needed to check and add them to the resolves list if they are getting done):
  • We need to know if feat: add server-side pagination to API endpoints #1464 is redundant and can be closed (sounds like a yes, but wanted to be 100% sure)

Agenda except from #1506

On the final question, we're expecting it to close a few renovate PRs as we drop some dependencies in favour of new ones?

@andypols

andypols commented Apr 20, 2026

Copy link
Copy Markdown
Contributor Author

Hey @kriswest

SSH has been waiting for a long time so consensus at the meeting was (reluctantly) to do that first and then ask you to update #1507 to add the additional UI panels (or to collab with you on doing so). Hence, we've marked this for 2.2.0 (and as the only issue in that milestone currently). Does that work for you?

I think the bigger issue is that planning has started to block releases rather than guide them. We used to release regularly; now worthwhile contributions sit for long periods and get pushed back further and further. SSH is a good example, and I’m concerned the UI work may end up the same way.

I’d prefer a simpler approach: merge bug fixes and useful enhancements when they’re ready. Then make release review a standing agenda item at each meeting by asking, “Is there any reason not to release the latest changes?”

I did not implement the paging in the database - we tried to leave the db layer alone and just focus on the UI. #1464 is not redundant, although its not really needed yet and can wait until the ui changes have been made.

Yes, the caching has addressed this. It will not include any project metadata

It has probably improved but will still need to be done.

No this still needs doing. Cypress is hard for us as its blocked internally for security reasons. The existing cypress tests are working locally, no idea why they are failing in the pr tests.

@kriswest

Copy link
Copy Markdown
Contributor

I think the bigger issue is that planning has started to block releases rather than guide them. We used to release regularly; now worthwhile contributions sit for long periods and get pushed back further and further. SSH is a good example, and I’m concerned the UI work may end up the same way.

The delay on the SSH feature was a decision we made collectively because the wholesale refactor of the code conflicted with everything making it very hard to merge. For 2.1.0 we've picked that and a number of other (pretty much) dev complete PRs to get merged to try and get to release relatively quickly to start clearing our backlog, with the goal of getting back to quicker releases as soon as we've got that done.

Nothing we've picked needs much new work apart from resolving conflicts and review/testing - we just had to deal with the expected conflict between your UI rebuild and a couple of the PRs that will add to the UI. There's not an easy solution to that other than one or the other going first. As per the meeting minutes, I offered to check-in with you as the meeting was keen to get both the UI and SSH etc. in ASAP.

We also have some issues with Cypress testing here - but I've got a machine I can run them on. Perhaps we can get some collab going on resolving those so that the coverage doesn't dip. It might be worth merging this into a FINOS repo branch to do that?

@kriswest

Copy link
Copy Markdown
Contributor

I think the bigger issue is that planning has started to block releases rather than guide them.

I think we switched from making smaller changes to great big ones which caused this. SSH and a new UI are not small, but not quite as massive as the whole codebase refactor. Hopefully after these we'll have a run of smaller changes.

@kriswest

kriswest commented Apr 21, 2026

Copy link
Copy Markdown
Contributor

@kriswest

Copy link
Copy Markdown
Contributor

The dependency review check may be having trouble because its a PR from a fork?? Perhaps setting
comment-summary-in-pr: on-failure at:

comment-summary-in-pr: always

will help?

@jescalada jescalada left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@andypols Fantastic contributions! Tailwind makes the UI code a lot more readable, and the UI is looking much, much better. 😃

I'm wondering if we could/should do some refactoring for the className strings, I think we might benefit from having these centralized (especially for certain elements such as buttons, form inputs, etc.).

Other than a few minor points, this is looking great!

Comment thread src/db/file/pushes.ts
Comment thread src/db/index.ts
Comment thread src/db/userProfilePushQuery.ts
Comment thread src/ui/components/ActivityBadgeGroup/ActivityBadgeGroup.tsx
Comment thread src/ui/components/CustomButtons/CodeActionButton.tsx
Comment thread src/ui/components/Navbars/DashboardUserMenu.tsx
Comment thread src/ui/services/repo.ts
Comment thread src/ui/views/PushDetails/components/StepsTimeline.tsx

@fabiovincenzi fabiovincenzi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good!
Can you open a follow-up issue for adding SCM token support so the remaining work stays tracked?

Also, the Linting job fails
Root cause is in

run: npm install --workspaces
npm install --workspaces does not install root devDependencies (where eslint lives).

Suggested fix: replace with npm ci.

Extend allow-dependencies-licenses in .github/workflows/dependency-review.yml with the three packages flagged by the failing workflow: bowser, focus-visible, and spdx-exceptions.

/** Repo card enrichment (description, language, license, fork, avatars) changes slowly. */
const SUCCESS_TTL_MS = 24 * 60 * 60 * 1000;
/** Cooldown after a failed fetch before treating cache as stale again. */
const FAILURE_TTL_MS = 15 * 60 * 1000;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider exposing as env vars with current values as defaults. 24h is hard to test against, and different deploys may want different values

Comment thread src/db/index.ts
Map<string, RepoActivityTabCounts>
> => {
const sink = start();
const [users, pushes] = await Promise.all([sink.getUsers(), sink.getPushes({ type: 'push' })]);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

getUserActivityTabCountsByUsernameloads **every** push document into memory on everyGET /api/v1/user`. Cost scales with the full push history and grows forever.

Suggest a DB-side $group aggregation so Mongo returns the counts directly. Same issue in getRepoPushRollupsByCanonicalUrl.

Comment thread src/db/index.ts

export const getSessionStore = (): MongoDBStore | undefined => start().getSessionStore();
export const getPushes = (query: Partial<PushQuery>): Promise<Action[]> => start().getPushes(query);
export const getPushesForUserProfile = async (username: string): Promise<Action[]> => {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The route handler in routes/users.ts already calls db.findUser(username) for the 404 check, then this wrapper calls findUser again. Also the two paths behave differently when the user doesn't exist (route → 404, wrapper → []).
Could the wrapper accept the already loaded User?

@linux-foundation-easycla

linux-foundation-easycla Bot commented Jun 5, 2026

Copy link
Copy Markdown

CLA Signed
The committers listed above are authorized under a signed CLA.

jescalada added a commit that referenced this pull request Jun 19, 2026
Workaround for a bug caused by a Vite dependency regression + Material UI's circular dependencies. We should remove the override once #1507 goes in
@andypols andypols self-assigned this Jul 3, 2026
andypols added 4 commits July 3, 2026 18:03
# Conflicts:
#	package-lock.json
# Conflicts:
#	package-lock.json
#	package.json
#	src/config/generated/config.ts
#	src/config/index.ts
#	src/db/index.ts
#	src/db/types.ts
#	src/proxy/index.ts
#	src/service/urls.ts
#	src/ui/components/CustomButtons/CodeActionButton.tsx
#	src/ui/views/User/UserProfile.tsx
#	test/testProxy.test.ts
Brings in commits from main (8c629c2) including ssh-agent support,
tag push, Dockerfile optimizations, and various bug fixes.
Brings in commits from main (d6264eb) including dependabot dependency
updates (uuid, globals, env-paths, github-actions, types/supertest).
# Conflicts:
#	package.json
#	src/db/mongo/pushes.ts
#	src/db/types.ts
#	src/ui/utils.tsx
#	src/ui/views/Login/Login.tsx
#	src/ui/views/PushDetails/PushDetails.tsx
#	src/ui/views/PushRequests/components/PushesTable.tsx
#	test/db/mongo/push.test.ts
@andypols
andypols force-pushed the new-ui branch 2 times, most recently from 20a76cd to 0554c3b Compare July 28, 2026 08:57
Lockfile still reflected the pre-migration react@16/@material-ui tree
after the main merge, causing npm ci to fail against @headlessui/react.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

5 participants