Skip to content

Commit

Permalink
refactor: tabs navigation
Browse files Browse the repository at this point in the history
  • Loading branch information
ankormoreankor committed Jan 30, 2025
1 parent 89713dc commit 81bb55e
Show file tree
Hide file tree
Showing 15 changed files with 130 additions and 119 deletions.
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@
"[ignore]": {
"editor.defaultFormatter": "foxundermoon.shell-format"
},
"prettier.trailingComma": "none"
"prettier.trailingComma": "none",
"eslint.workingDirectories": [{ "pattern": "./apps/*/" }, { "pattern": "./packages/*/" }]
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import RootViewWrapper from './root-view-wrapper'

const Layout = () => {
return (
<div className="bg-background-1 sticky top-[55px] z-40">
<div className="bg-background-1 top-14.5 sticky z-40">
<ProjectSettingsTabNav useTranslationStore={useTranslationStore} />
</div>
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const RepoViewWrapper: FC<PropsWithChildren<React.HTMLAttributes<HTMLElement>>>
path="*"
element={
<>
<div className="layer-high bg-background-1 sticky top-[55px]">
<div className="layer-high bg-background-1 top-14.5 sticky">
<RepoSubheader useTranslationStore={useTranslationStore} />
</div>
{children}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export const ProfileSettingsLayout = () => {

return (
<>
<div className="bg-background-1 sticky top-[55px] z-40">
<div className="bg-background-1 sticky top-14.5 z-40">
<ProfileSettingsTabNav activeTab={activeTab} useTranslationStore={useTranslationStore} />
</div>
<Outlet />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { useTranslationStore } from '../../i18n/stores/i18n-store'
export const ProjectSettingsLayout = () => {
return (
<>
<div className="bg-background-1 sticky top-[55px] z-40">
<div className="bg-background-1 sticky top-14.5 z-40">
<ProjectSettingsTabNav useTranslationStore={useTranslationStore} />
</div>
<Outlet />
Expand Down
2 changes: 1 addition & 1 deletion apps/gitness/src/pages-v2/repo/repo-layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const RepoLayout = () => {

return (
<>
<div className="layer-high sticky top-[55px] bg-background-1">
<div className="layer-high bg-background-1 top-14.5 sticky">
<RepoSubheader showPipelinesTab={!isMFE} useTranslationStore={useTranslationStore} />
</div>
<Outlet />
Expand Down
51 changes: 27 additions & 24 deletions packages/ui/src/components/repo-subheader.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useMemo } from 'react'
import { NavLink, useLocation } from 'react-router-dom'
import { useCallback, useMemo } from 'react'
import { useLocation, useNavigate } from 'react-router-dom'

import { Tabs, TabsList, TabsTrigger } from '@/components'
import { SandboxLayout, TranslationStore } from '@/views'
Expand All @@ -23,9 +23,12 @@ export const RepoSubheader = ({
useTranslationStore: () => TranslationStore
showPipelinesTab?: boolean
}) => {
const navigate = useNavigate()
const location = useLocation()
const { t } = useTranslationStore()

const makeHandleTabChange = useCallback((tab: string) => () => navigate(tab), [navigate])

const activeTab = useMemo(() => {
// Prioritize 'pulls' over 'commits' if both are present in the pathname
if (location.pathname.includes(RepoTabsKeys.PULLS)) {
Expand All @@ -36,32 +39,32 @@ export const RepoSubheader = ({
}, [location.pathname])

return (
<SandboxLayout.SubHeader className="h-[45px] overflow-hidden">
<SandboxLayout.SubHeader className="top-14.5 h-11">
<Tabs variant="navigation" value={activeTab}>
<TabsList>
<NavLink to={RepoTabsKeys.SUMMARY}>
<TabsTrigger value="summary">{t('views:repos.summary', 'Summary')}</TabsTrigger>
</NavLink>
<NavLink to={RepoTabsKeys.CODE}>
<TabsTrigger value="code">{t('views:repos.files', 'Files')}</TabsTrigger>
</NavLink>
<TabsTrigger role="link" value="summary" onClick={makeHandleTabChange(RepoTabsKeys.SUMMARY)}>
{t('views:repos.summary', 'Summary')}
</TabsTrigger>
<TabsTrigger role="link" value="code" onClick={makeHandleTabChange(RepoTabsKeys.CODE)}>
{t('views:repos.files', 'Files')}
</TabsTrigger>
{showPipelinesTab && (
<NavLink to={RepoTabsKeys.PIPELINES}>
<TabsTrigger value="pipelines">{t('views:repos.pipelines', 'Pipelines')}</TabsTrigger>
</NavLink>
<TabsTrigger role="link" value="pipelines" onClick={makeHandleTabChange(RepoTabsKeys.PIPELINES)}>
{t('views:repos.pipelines', 'Pipelines')}
</TabsTrigger>
)}
<NavLink to={RepoTabsKeys.COMMITS}>
<TabsTrigger value="commits">{t('views:repos.commits', 'Commits')}</TabsTrigger>
</NavLink>
<NavLink to={RepoTabsKeys.PULLS}>
<TabsTrigger value="pulls">{t('views:repos.pull-requests', 'Pull Requests')}</TabsTrigger>
</NavLink>
<NavLink to={RepoTabsKeys.BRANCHES}>
<TabsTrigger value="branches">{t('views:repos.branches', 'Branches')}</TabsTrigger>
</NavLink>
<NavLink to={RepoTabsKeys.SETTINGS}>
<TabsTrigger value="settings">{t('views:repos.settings', 'Settings')}</TabsTrigger>
</NavLink>
<TabsTrigger role="link" value="commits" onClick={makeHandleTabChange(RepoTabsKeys.COMMITS)}>
{t('views:repos.commits', 'Commits')}
</TabsTrigger>
<TabsTrigger role="link" value="pulls" onClick={makeHandleTabChange(RepoTabsKeys.PULLS)}>
{t('views:repos.pull-requests', 'Pull Requests')}
</TabsTrigger>
<TabsTrigger role="link" value="branches" onClick={makeHandleTabChange(RepoTabsKeys.BRANCHES)}>
{t('views:repos.branches', 'Branches')}
</TabsTrigger>
<TabsTrigger role="link" value="settings" onClick={makeHandleTabChange(RepoTabsKeys.SETTINGS)}>
{t('views:repos.settings', 'Settings')}
</TabsTrigger>
</TabsList>
</Tabs>
</SandboxLayout.SubHeader>
Expand Down
2 changes: 1 addition & 1 deletion packages/ui/src/components/topbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ const Topbar = {
return (
<div
className={cx(
`grid w-full ${gridCols} font-regular h-[55px] items-center gap-6 border-b border-borders-5 px-5 text-sm`,
`grid w-full ${gridCols} font-regular h-14.5 items-center gap-6 border-b border-borders-5 px-5 text-sm`,
className
)}
>
Expand Down
94 changes: 44 additions & 50 deletions packages/ui/src/views/layouts/PullRequestLayout.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { NavLink, Outlet } from 'react-router-dom'
import { useCallback } from 'react'
import { Outlet, useLocation, useNavigate } from 'react-router-dom'

import { Badge, Icon, Spacer, Tabs, TabsList, TabsTrigger } from '@components/index'
import { TabsTriggerProps } from '@radix-ui/react-tabs'
import { TranslationStore } from '@views/repo'
import { PullRequestHeader } from '@views/repo/pull-request/components/pull-request-header'
import { IPullRequestStore } from '@views/repo/pull-request/pull-request.types'
Expand Down Expand Up @@ -30,10 +32,26 @@ const PullRequestLayout: React.FC<PullRequestLayoutProps> = ({
}) => {
const { pullRequest } = usePullRequestStore()
const { t } = useTranslationStore()
const navigate = useNavigate()
const location = useLocation()

const getIsActiveTab = useCallback(
(tab: string) => (location.pathname.endsWith(tab) ? 'active' : 'inactive'),
[location.pathname]
)
const makeHandleTabChange = useCallback((tab: string) => () => navigate(tab), [navigate])

const getTabProps = (tab: PullRequestTabsKeys): TabsTriggerProps => ({
value: tab,
...{ 'data-state': getIsActiveTab(tab) },
onClick: makeHandleTabChange(tab),
className: 'gap-x-1.5',
role: 'link'
})

return (
<SandboxLayout.Main fullWidth>
<SandboxLayout.Content className="px-6 max-w-[1500px]">
<SandboxLayout.Content className="max-w-[1500px] px-6">
{pullRequest && (
<>
<PullRequestHeader
Expand All @@ -59,54 +77,30 @@ const PullRequestLayout: React.FC<PullRequestLayoutProps> = ({
)}
<Tabs variant="tabnav">
<TabsList className="left-1/2 w-[calc(100%+48px)] -translate-x-1/2 px-6">
<NavLink to={PullRequestTabsKeys.CONVERSATION}>
{({ isActive }) => (
<TabsTrigger
className="gap-x-1.5"
value={PullRequestTabsKeys.CONVERSATION}
data-state={isActive ? 'active' : 'inactive'}
>
<div className="flex items-center gap-x-1">
<Icon size={14} name="comments" />
{t('views:pullRequests.conversation')}
</div>
</TabsTrigger>
)}
</NavLink>
<NavLink to={PullRequestTabsKeys.COMMITS}>
{({ isActive }) => (
<TabsTrigger
className="gap-x-1.5"
value={PullRequestTabsKeys.COMMITS}
data-state={isActive ? 'active' : 'inactive'}
>
<div className="flex items-center gap-x-1">
<Icon size={14} name="tube-sign" />
{t('views:repos.commits')}
</div>
<Badge variant="outline" size="xs" borderRadius="base">
{pullRequest?.stats?.commits}
</Badge>
</TabsTrigger>
)}
</NavLink>
<NavLink to={PullRequestTabsKeys.CHANGES}>
{({ isActive }) => (
<TabsTrigger
className="gap-x-1.5"
value={PullRequestTabsKeys.CHANGES}
data-state={isActive ? 'active' : 'inactive'}
>
<div className="flex items-center gap-x-1">
<Icon size={14} name="changes" />
{t('views:pullRequests.changes')}
</div>
<Badge variant="outline" size="xs" borderRadius="base">
{pullRequest?.stats?.files_changed}
</Badge>
</TabsTrigger>
)}
</NavLink>
<TabsTrigger {...getTabProps(PullRequestTabsKeys.CONVERSATION)}>
<div className="flex items-center gap-x-1">
<Icon size={14} name="comments" />
{t('views:pullRequests.conversation')}
</div>
</TabsTrigger>
<TabsTrigger {...getTabProps(PullRequestTabsKeys.COMMITS)}>
<div className="flex items-center gap-x-1">
<Icon size={14} name="tube-sign" />
{t('views:repos.commits')}
</div>
<Badge variant="outline" size="xs" borderRadius="base">
{pullRequest?.stats?.commits}
</Badge>
</TabsTrigger>
<TabsTrigger {...getTabProps(PullRequestTabsKeys.CHANGES)}>
<div className="flex items-center gap-x-1">
<Icon size={14} name="changes" />
{t('views:pullRequests.changes')}
</div>
<Badge variant="outline" size="xs" borderRadius="base">
{pullRequest?.stats?.files_changed}
</Badge>
</TabsTrigger>
</TabsList>
</Tabs>
<Spacer size={7} />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { NavLink } from 'react-router-dom'
import { useCallback } from 'react'
import { useNavigate } from 'react-router-dom'

import { Tabs, TabsList, TabsTrigger } from '@/components'
import { SandboxLayout, TranslationStore } from '@/views'
Expand All @@ -11,17 +12,21 @@ function ProfileSettingsTabNav({
useTranslationStore: () => TranslationStore
}) {
const { t } = useTranslationStore()
const navigate = useNavigate()

const makeHandleTabChange = useCallback((tab: string) => () => navigate(tab), [navigate])

return (
<>
<SandboxLayout.SubHeader className="h-[45px] overflow-hidden">
<SandboxLayout.SubHeader className="h-11">
<Tabs variant="navigation" value={activeTab}>
<TabsList fontSize="xs">
<NavLink to={`general`}>
<TabsTrigger value="general">{t('views:profileSettings.GeneralTab', 'General')}</TabsTrigger>
</NavLink>
<NavLink to={`keys`}>
<TabsTrigger value="keys">{t('views:profileSettings.KeysTab', 'Keys and Tokens')}</TabsTrigger>
</NavLink>
<TabsTrigger role="link" value="general" onClick={makeHandleTabChange('general')}>
{t('views:profileSettings.GeneralTab', 'General')}
</TabsTrigger>
<TabsTrigger role="link" value="keys" onClick={makeHandleTabChange('keys')}>
{t('views:profileSettings.KeysTab', 'Keys and Tokens')}
</TabsTrigger>
</TabsList>
</Tabs>
</SandboxLayout.SubHeader>
Expand Down
6 changes: 3 additions & 3 deletions packages/ui/src/views/project/project-settings-tab-nav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ const ProjectSettingsTabNav: FC<ProjectSettingsTabNavProps> = ({ useTranslationS
<SandboxLayout.SubHeader className="h-11">
<Tabs variant="navigation" value={activeTab}>
<TabsList fontSize="xs">
<TabsTrigger value="general" onClick={makeHandleTabChange('general')}>
<TabsTrigger role="link" value="general" onClick={makeHandleTabChange('general')}>
{t('views:projectSettings.tabs.general', 'General')}
</TabsTrigger>
<TabsTrigger value="members" onClick={makeHandleTabChange('members')}>
<TabsTrigger role="link" value="members" onClick={makeHandleTabChange('members')}>
{t('views:projectSettings.tabs.members', 'Members')}
</TabsTrigger>
<TabsTrigger value="labels" onClick={makeHandleTabChange('labels')}>
<TabsTrigger role="link" value="labels" onClick={makeHandleTabChange('labels')}>
{t('views:projectSettings.tabs.labels', 'Labels')}
</TabsTrigger>
</TabsList>
Expand Down
52 changes: 28 additions & 24 deletions packages/ui/src/views/repo/repo-layout/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useMemo } from 'react'
import { NavLink, Outlet, useLocation } from 'react-router-dom'
import { useCallback, useMemo } from 'react'
import { Outlet, useLocation, useNavigate } from 'react-router-dom'

import { Tabs, TabsList, TabsTrigger } from '@/components'
import { SandboxLayout, TranslationStore } from '@/views'
Expand All @@ -20,6 +20,10 @@ export const RepoLayout = ({ useTranslationStore }: { useTranslationStore: () =>
const location = useLocation()
const { t } = useTranslationStore()

const navigate = useNavigate()

const makeHandleTabChange = useCallback((tab: string) => () => navigate(tab), [navigate])

const activeTab = useMemo(() => {
// Prioritize 'pulls' over 'commits' if both are present in the pathname
if (location.pathname.includes(RepoTabsKeys.PULLS)) {
Expand All @@ -31,30 +35,30 @@ export const RepoLayout = ({ useTranslationStore }: { useTranslationStore: () =>

return (
<>
<SandboxLayout.SubHeader className="h-[45px] overflow-hidden">
<SandboxLayout.SubHeader className="h-11 ">
<Tabs variant="navigation" value={activeTab}>
<TabsList>
<NavLink to={RepoTabsKeys.SUMMARY}>
<TabsTrigger value="summary">{t('views:repos.summary', 'Summary')}</TabsTrigger>
</NavLink>
<NavLink to={RepoTabsKeys.CODE}>
<TabsTrigger value="code">{t('views:repos.files', 'Files')}</TabsTrigger>
</NavLink>
<NavLink to={RepoTabsKeys.PIPELINES}>
<TabsTrigger value="pipelines">{t('views:repos.pipelines', 'Pipelines')}</TabsTrigger>
</NavLink>
<NavLink to={RepoTabsKeys.COMMITS}>
<TabsTrigger value="commits">{t('views:repos.commits', 'Commits')}</TabsTrigger>
</NavLink>
<NavLink to={RepoTabsKeys.PULLS}>
<TabsTrigger value="pulls">{t('views:repos.pull-requests', 'Pull Requests')}</TabsTrigger>
</NavLink>
<NavLink to={RepoTabsKeys.BRANCHES}>
<TabsTrigger value="branches">{t('views:repos.branches', 'Branches')}</TabsTrigger>
</NavLink>
<NavLink to={RepoTabsKeys.SETTINGS}>
<TabsTrigger value="settings">{t('views:repos.settings', 'Settings')}</TabsTrigger>
</NavLink>
<TabsTrigger role="link" value="summary" onClick={makeHandleTabChange(RepoTabsKeys.SUMMARY)}>
{t('views:repos.summary', 'Summary')}
</TabsTrigger>
<TabsTrigger role="link" value="code" onClick={makeHandleTabChange(RepoTabsKeys.CODE)}>
{t('views:repos.files', 'Files')}
</TabsTrigger>
<TabsTrigger role="link" value="pipelines" onClick={makeHandleTabChange(RepoTabsKeys.PIPELINES)}>
{t('views:repos.pipelines', 'Pipelines')}
</TabsTrigger>
<TabsTrigger role="link" value="commits" onClick={makeHandleTabChange(RepoTabsKeys.COMMITS)}>
{t('views:repos.commits', 'Commits')}
</TabsTrigger>
<TabsTrigger role="link" value="pulls" onClick={makeHandleTabChange(RepoTabsKeys.PULLS)}>
{t('views:repos.pull-requests', 'Pull Requests')}
</TabsTrigger>
<TabsTrigger role="link" value="branches" onClick={makeHandleTabChange(RepoTabsKeys.BRANCHES)}>
{t('views:repos.branches', 'Branches')}
</TabsTrigger>
<TabsTrigger role="link" value="settings" onClick={makeHandleTabChange(RepoTabsKeys.SETTINGS)}>
{t('views:repos.settings', 'Settings')}
</TabsTrigger>
</TabsList>
</Tabs>
</SandboxLayout.SubHeader>
Expand Down
1 change: 1 addition & 0 deletions packages/ui/src/views/tailwind-values-exporter.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const TailwindValuesExporter = () => <div className="top-14.5 h-14.5 sr-only" />
3 changes: 3 additions & 0 deletions packages/ui/tailwind.ts
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,9 @@ export default {
animation: {
'accordion-down': 'accordion-down 0.2s ease-out',
'accordion-up': 'accordion-up 0.2s ease-out'
},
spacing: {
'14.5': '3.625rem'
}
}
},
Expand Down
Loading

0 comments on commit 81bb55e

Please sign in to comment.