diff --git a/next.config.js b/next.config.js index 7554e2262d..acb83a9217 100644 --- a/next.config.js +++ b/next.config.js @@ -168,7 +168,7 @@ const config = { destination: '/api/scripts/telemetry', }, { - source: '/teams/:teamId/:path*', + source: '/teams/:teamId/:path((?!settings).*)*', destination: '/:path*', }, ]; diff --git a/package.json b/package.json index 7f5c7c489e..d002388f8a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "umami", - "version": "2.12.0", + "version": "2.12.1", "description": "A simple, fast, privacy-focused alternative to Google Analytics.", "author": "Umami Software, Inc. ", "license": "MIT", diff --git a/src/app/(main)/reports/journey/JourneyView.module.css b/src/app/(main)/reports/journey/JourneyView.module.css index 0975d2c0f8..908f02cb0b 100644 --- a/src/app/(main)/reports/journey/JourneyView.module.css +++ b/src/app/(main)/reports/journey/JourneyView.module.css @@ -121,7 +121,7 @@ } .name { - font-weight: 500; + max-width: 200px; } .count { diff --git a/src/app/(main)/reports/journey/JourneyView.tsx b/src/app/(main)/reports/journey/JourneyView.tsx index 73338c83ed..ae980a6e46 100644 --- a/src/app/(main)/reports/journey/JourneyView.tsx +++ b/src/app/(main)/reports/journey/JourneyView.tsx @@ -1,5 +1,5 @@ import { useContext, useMemo, useState } from 'react'; -import { TooltipPopup } from 'react-basics'; +import { TextOverflow, TooltipPopup } from 'react-basics'; import { firstBy } from 'thenby'; import classNames from 'classnames'; import { useEscapeKey, useMessages } from 'components/hooks'; @@ -191,7 +191,9 @@ export default function JourneyView() { })} onClick={() => handleClick(name, columnIndex, paths)} > -
{name}
+
+ {name} +
{formatLongNumber(nodeCount)} diff --git a/src/app/(main)/teams/[teamId]/layout.tsx b/src/app/(main)/teams/[teamId]/layout.tsx index c804c7463b..e10cdb9431 100644 --- a/src/app/(main)/teams/[teamId]/layout.tsx +++ b/src/app/(main)/teams/[teamId]/layout.tsx @@ -1,8 +1,13 @@ import TeamProvider from './TeamProvider'; import { Metadata } from 'next'; +import TeamSettingsLayout from './settings/TeamSettingsLayout'; export default function ({ children, params: { teamId } }) { - return {children}; + return ( + + {children} + + ); } export const metadata: Metadata = { diff --git a/src/app/(main)/teams/[teamId]/settings/TeamSettingsLayout.tsx b/src/app/(main)/teams/[teamId]/settings/TeamSettingsLayout.tsx new file mode 100644 index 0000000000..f7df620a71 --- /dev/null +++ b/src/app/(main)/teams/[teamId]/settings/TeamSettingsLayout.tsx @@ -0,0 +1,29 @@ +'use client'; +import { ReactNode } from 'react'; +import { useMessages, useTeamUrl } from 'components/hooks'; +import MenuLayout from 'components/layout/MenuLayout'; + +export default function TeamSettingsLayout({ children }: { children: ReactNode }) { + const { formatMessage, labels } = useMessages(); + const { teamId } = useTeamUrl(); + + const items = [ + { + key: 'team', + label: formatMessage(labels.team), + url: `/teams/${teamId}/settings/team`, + }, + { + key: 'websites', + label: formatMessage(labels.websites), + url: `/teams/${teamId}/settings/websites`, + }, + { + key: 'members', + label: formatMessage(labels.members), + url: `/teams/${teamId}/settings/members`, + }, + ].filter(n => n); + + return {children}; +} diff --git a/src/app/(main)/settings/teams/[teamId]/members/TeamMemberEditButton.tsx b/src/app/(main)/teams/[teamId]/settings/members/TeamMemberEditButton.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/members/TeamMemberEditButton.tsx rename to src/app/(main)/teams/[teamId]/settings/members/TeamMemberEditButton.tsx diff --git a/src/app/(main)/settings/teams/[teamId]/members/TeamMemberEditForm.tsx b/src/app/(main)/teams/[teamId]/settings/members/TeamMemberEditForm.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/members/TeamMemberEditForm.tsx rename to src/app/(main)/teams/[teamId]/settings/members/TeamMemberEditForm.tsx diff --git a/src/app/(main)/settings/teams/[teamId]/members/TeamMemberRemoveButton.tsx b/src/app/(main)/teams/[teamId]/settings/members/TeamMemberRemoveButton.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/members/TeamMemberRemoveButton.tsx rename to src/app/(main)/teams/[teamId]/settings/members/TeamMemberRemoveButton.tsx diff --git a/src/app/(main)/settings/teams/[teamId]/members/TeamMembersDataTable.tsx b/src/app/(main)/teams/[teamId]/settings/members/TeamMembersDataTable.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/members/TeamMembersDataTable.tsx rename to src/app/(main)/teams/[teamId]/settings/members/TeamMembersDataTable.tsx diff --git a/src/app/(main)/settings/teams/[teamId]/members/TeamMembersPage.tsx b/src/app/(main)/teams/[teamId]/settings/members/TeamMembersPage.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/members/TeamMembersPage.tsx rename to src/app/(main)/teams/[teamId]/settings/members/TeamMembersPage.tsx diff --git a/src/app/(main)/settings/teams/[teamId]/members/TeamMembersTable.tsx b/src/app/(main)/teams/[teamId]/settings/members/TeamMembersTable.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/members/TeamMembersTable.tsx rename to src/app/(main)/teams/[teamId]/settings/members/TeamMembersTable.tsx diff --git a/src/app/(main)/settings/teams/[teamId]/members/page.tsx b/src/app/(main)/teams/[teamId]/settings/members/page.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/members/page.tsx rename to src/app/(main)/teams/[teamId]/settings/members/page.tsx diff --git a/src/app/(main)/settings/teams/[teamId]/team/TeamDeleteForm.tsx b/src/app/(main)/teams/[teamId]/settings/team/TeamDeleteForm.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/team/TeamDeleteForm.tsx rename to src/app/(main)/teams/[teamId]/settings/team/TeamDeleteForm.tsx diff --git a/src/app/(main)/settings/teams/[teamId]/team/TeamDetails.tsx b/src/app/(main)/teams/[teamId]/settings/team/TeamDetails.tsx similarity index 95% rename from src/app/(main)/settings/teams/[teamId]/team/TeamDetails.tsx rename to src/app/(main)/teams/[teamId]/settings/team/TeamDetails.tsx index 0c5fe991ea..70858ee4f5 100644 --- a/src/app/(main)/settings/teams/[teamId]/team/TeamDetails.tsx +++ b/src/app/(main)/teams/[teamId]/settings/team/TeamDetails.tsx @@ -5,7 +5,7 @@ import PageHeader from 'components/layout/PageHeader'; import { ROLES } from 'lib/constants'; import { useContext, useState } from 'react'; import { Flexbox, Item, Tabs } from 'react-basics'; -import TeamLeaveButton from '../../TeamLeaveButton'; +import TeamLeaveButton from 'app/(main)/settings/teams/TeamLeaveButton'; import TeamManage from './TeamManage'; import TeamEditForm from './TeamEditForm'; diff --git a/src/app/(main)/settings/teams/[teamId]/team/TeamEditForm.tsx b/src/app/(main)/teams/[teamId]/settings/team/TeamEditForm.tsx similarity index 94% rename from src/app/(main)/settings/teams/[teamId]/team/TeamEditForm.tsx rename to src/app/(main)/teams/[teamId]/settings/team/TeamEditForm.tsx index fc192df131..c2029ca6d7 100644 --- a/src/app/(main)/settings/teams/[teamId]/team/TeamEditForm.tsx +++ b/src/app/(main)/teams/[teamId]/settings/team/TeamEditForm.tsx @@ -11,7 +11,7 @@ import { } from 'react-basics'; import { getRandomChars } from 'next-basics'; import { useContext, useRef, useState } from 'react'; -import { useApi, useMessages } from 'components/hooks'; +import { useApi, useMessages, useModified } from 'components/hooks'; import { TeamContext } from 'app/(main)/teams/[teamId]/TeamProvider'; const generateId = () => getRandomChars(16); @@ -26,12 +26,14 @@ export function TeamEditForm({ teamId, allowEdit }: { teamId: string; allowEdit? const ref = useRef(null); const [accessCode, setAccessCode] = useState(team.accessCode); const { showToast } = useToasts(); + const { touch } = useModified(); const cloudMode = !!process.env.cloudMode; const handleSubmit = async (data: any) => { mutate(data, { onSuccess: async () => { ref.current.reset(data); + touch('teams'); showToast({ message: formatMessage(messages.saved), variant: 'success' }); }, }); diff --git a/src/app/(main)/settings/teams/[teamId]/team/TeamManage.tsx b/src/app/(main)/teams/[teamId]/settings/team/TeamManage.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/team/TeamManage.tsx rename to src/app/(main)/teams/[teamId]/settings/team/TeamManage.tsx diff --git a/src/app/(main)/settings/teams/[teamId]/team/TeamPage.tsx b/src/app/(main)/teams/[teamId]/settings/team/TeamPage.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/team/TeamPage.tsx rename to src/app/(main)/teams/[teamId]/settings/team/TeamPage.tsx diff --git a/src/app/(main)/settings/teams/[teamId]/team/page.tsx b/src/app/(main)/teams/[teamId]/settings/team/page.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/team/page.tsx rename to src/app/(main)/teams/[teamId]/settings/team/page.tsx diff --git a/src/app/(main)/settings/teams/[teamId]/websites/TeamWebsiteRemoveButton.tsx b/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsiteRemoveButton.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/websites/TeamWebsiteRemoveButton.tsx rename to src/app/(main)/teams/[teamId]/settings/websites/TeamWebsiteRemoveButton.tsx diff --git a/src/app/(main)/settings/teams/[teamId]/websites/TeamWebsitesDataTable.tsx b/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesDataTable.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/websites/TeamWebsitesDataTable.tsx rename to src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesDataTable.tsx diff --git a/src/app/(main)/settings/teams/[teamId]/websites/TeamWebsitesPage.tsx b/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesPage.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/websites/TeamWebsitesPage.tsx rename to src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesPage.tsx diff --git a/src/app/(main)/settings/teams/[teamId]/websites/TeamWebsitesTable.tsx b/src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesTable.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/websites/TeamWebsitesTable.tsx rename to src/app/(main)/teams/[teamId]/settings/websites/TeamWebsitesTable.tsx diff --git a/src/app/(main)/teams/[teamId]/settings/websites/[websiteId]/page.tsx b/src/app/(main)/teams/[teamId]/settings/websites/[websiteId]/page.tsx new file mode 100644 index 0000000000..a689529687 --- /dev/null +++ b/src/app/(main)/teams/[teamId]/settings/websites/[websiteId]/page.tsx @@ -0,0 +1,5 @@ +import Page from 'app/(main)/settings/websites/[websiteId]/page'; + +export default function ({ params }) { + return ; +} diff --git a/src/app/(main)/settings/teams/[teamId]/websites/page.tsx b/src/app/(main)/teams/[teamId]/settings/websites/page.tsx similarity index 100% rename from src/app/(main)/settings/teams/[teamId]/websites/page.tsx rename to src/app/(main)/teams/[teamId]/settings/websites/page.tsx diff --git a/src/components/metrics/MetricCard.tsx b/src/components/metrics/MetricCard.tsx index 5b11156e0a..a5fd758ec3 100644 --- a/src/components/metrics/MetricCard.tsx +++ b/src/components/metrics/MetricCard.tsx @@ -37,7 +37,7 @@ export const MetricCard = ({ return (
{showLabel &&
{label}
} - + {props?.x?.to(x => formatValue(x))} {showChange && (