diff --git a/package.components.json b/package.components.json index 927e06604..d231f5b9b 100644 --- a/package.components.json +++ b/package.components.json @@ -1,6 +1,6 @@ { "name": "@umami/components", - "version": "0.127.0", + "version": "0.128.0", "description": "Umami React components.", "author": "Mike Cao ", "license": "MIT", diff --git a/src/app/(main)/settings/preferences/DateRangeSetting.tsx b/src/app/(main)/settings/preferences/DateRangeSetting.tsx index e47ce0b69..c0e8221e8 100644 --- a/src/app/(main)/settings/preferences/DateRangeSetting.tsx +++ b/src/app/(main)/settings/preferences/DateRangeSetting.tsx @@ -14,7 +14,10 @@ export function DateRangeSetting() { setDate(value); }; - const handleReset = () => setItem(DATE_RANGE_CONFIG, DEFAULT_DATE_RANGE_VALUE); + const handleReset = () => { + setItem(DATE_RANGE_CONFIG, DEFAULT_DATE_RANGE_VALUE); + setDate(DEFAULT_DATE_RANGE_VALUE); + }; return ( diff --git a/src/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage.tsx b/src/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage.tsx index d5c129eec..0dc7bcc14 100644 --- a/src/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage.tsx +++ b/src/app/(main)/settings/websites/[websiteId]/WebsiteSettingsPage.tsx @@ -2,12 +2,15 @@ import { WebsiteProvider } from '@/app/(main)/websites/WebsiteProvider'; import { WebsiteSettings } from '@/app/(main)/websites/[websiteId]/settings/WebsiteSettings'; import { WebsiteSettingsHeader } from '@/app/(main)/websites/[websiteId]/settings/WebsiteSettingsHeader'; +import { Column } from '@umami/react-zen'; export function WebsiteSettingsPage({ websiteId }: { websiteId: string }) { return ( - - + + + + ); } diff --git a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx index 4a2ffdf0a..0f9f81236 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteHeader.tsx @@ -7,7 +7,7 @@ import { WebsiteShareForm } from '@/app/(main)/websites/[websiteId]/settings/Web import { useMessages, useNavigation, useWebsite } from '@/components/hooks'; import { LinkButton } from '@/components/common/LinkButton'; -export function WebsiteHeader() { +export function WebsiteHeader({ showActions }: { showActions?: boolean }) { const website = useWebsite(); const { renderUrl, pathname } = useNavigation(); const isSettings = pathname.endsWith('/settings'); @@ -20,15 +20,18 @@ export function WebsiteHeader() { } marginBottom="3"> - - - - - - - Edit - - + + {showActions && ( + + + + + + + Edit + + + )} ); diff --git a/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx b/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx index e25541e9a..617669212 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteLayout.tsx @@ -21,7 +21,7 @@ export function WebsiteLayout({ websiteId, children }: { websiteId: string; chil )} - + {children} diff --git a/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx b/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx index 3696b7861..df476e79b 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx @@ -1,14 +1,5 @@ import { Text } from '@umami/react-zen'; -import { - Eye, - User, - Clock, - Sheet, - Tag, - ChartPie, - UserPlus, - GitCompareArrows, -} from '@/components/icons'; +import { Eye, User, Clock, Ungroup, Tag, ChartPie, UserPlus, GitCompare } from '@/components/icons'; import { Lightning, Path, Money, Target, Funnel, Magnet, Network } from '@/components/svg'; import { useMessages, useNavigation } from '@/components/hooks'; import { SideMenu } from '@/components/common/SideMenu'; @@ -56,13 +47,13 @@ export function WebsiteNav({ websiteId }: { websiteId: string }) { { id: 'compare', label: formatMessage(labels.compare), - icon: , + icon: , path: renderPath('/compare'), }, { id: 'breakdown', label: formatMessage(labels.breakdown), - icon: , + icon: , path: renderPath('/breakdown'), }, ], diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionActivity.tsx similarity index 97% rename from src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.tsx rename to src/app/(main)/websites/[websiteId]/sessions/SessionActivity.tsx index 4ed55427a..4dcf08b42 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionActivity.tsx @@ -47,7 +47,7 @@ export function SessionActivity({ return ( - {showHeader && {formatTimezoneDate(createdAt, 'PPPP')}} + {showHeader && {formatTimezoneDate(createdAt, 'PPPP')}} {formatTimezoneDate(createdAt, 'pp')} diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionData.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionData.tsx similarity index 100% rename from src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionData.tsx rename to src/app/(main)/websites/[websiteId]/sessions/SessionData.tsx diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionInfo.tsx similarity index 93% rename from src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx rename to src/app/(main)/websites/[websiteId]/sessions/SessionInfo.tsx index 4ebb462c3..c2127cf57 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionInfo.tsx @@ -1,5 +1,5 @@ import { ReactNode } from 'react'; -import { Icon, TextField, Column, Row, Label, Text } from '@umami/react-zen'; +import { Icon, TextField, Column, Row, Label } from '@umami/react-zen'; import { useFormat, useLocale, useMessages, useRegionNames } from '@/components/hooks'; import { TypeIcon } from '@/components/common/TypeIcon'; import { KeyRound, Calendar } from '@/components/icons'; @@ -15,7 +15,7 @@ export function SessionInfo({ data }) { return ( - + }> @@ -83,7 +83,7 @@ const Info = ({ {icon && {icon}} - {children || '—'} + {children || '—'} ); diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionProfile.tsx similarity index 58% rename from src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.tsx rename to src/app/(main)/websites/[websiteId]/sessions/SessionProfile.tsx index 86e3cdbf2..bdbfbc580 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionProfile.tsx @@ -1,37 +1,52 @@ -'use client'; -import { Grid, Row, Column, Tabs, TabList, Tab, TabPanel } from '@umami/react-zen'; +import { Grid, Row, Column, Tabs, TabList, Tab, TabPanel, Icon, Button } from '@umami/react-zen'; import { Avatar } from '@/components/common/Avatar'; import { LoadingPanel } from '@/components/common/LoadingPanel'; +import { X } from '@/components/icons'; import { useMessages, useWebsiteSessionQuery } from '@/components/hooks'; import { SessionActivity } from './SessionActivity'; import { SessionData } from './SessionData'; import { SessionInfo } from './SessionInfo'; import { SessionStats } from './SessionStats'; -import { Panel } from '@/components/common/Panel'; -export function SessionDetailsPage({ +export function SessionProfile({ websiteId, sessionId, + onClose, }: { websiteId: string; sessionId: string; + onClose?: () => void; }) { const { data, isLoading, error } = useWebsiteSessionQuery(websiteId, sessionId); const { formatMessage, labels } = useMessages(); return ( - + {data && ( - - - - - - - - - - + + + + + + + + + + + + + + {formatMessage(labels.activity)} @@ -49,9 +64,9 @@ export function SessionDetailsPage({ - - - + + + )} ); diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.tsx index ea4b5f037..e66302ad6 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionProperties.tsx @@ -1,5 +1,5 @@ import { useMemo, useState } from 'react'; -import { Select, ListItem, Grid } from '@umami/react-zen'; +import { Select, ListItem, Grid, Column } from '@umami/react-zen'; import { useMessages, useSessionDataPropertiesQuery, @@ -24,25 +24,26 @@ export function SessionProperties({ websiteId }: { websiteId: string }) { data={data} error={error} minHeight="300px" - gap="6" > - {data && ( - - - - )} - {propertyName && } + + {data && ( + + + + )} + {propertyName && } + ); } @@ -84,7 +85,6 @@ const SessionValues = ({ websiteId, propertyName }) => { data={data} error={error} minHeight="300px" - gap="6" > {data && ( diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionStats.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionStats.tsx similarity index 100% rename from src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionStats.tsx rename to src/app/(main)/websites/[websiteId]/sessions/SessionStats.tsx diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx index 68eef29c6..ae0d41043 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx @@ -1,18 +1,35 @@ 'use client'; import { Key, useState } from 'react'; -import { TabList, Tab, Tabs, TabPanel, Column } from '@umami/react-zen'; +import { TabList, Tab, Tabs, TabPanel, Column, Modal, Dialog } from '@umami/react-zen'; import { SessionsDataTable } from './SessionsDataTable'; import { SessionProperties } from './SessionProperties'; -import { useMessages } from '@/components/hooks'; +import { useMessages, useNavigation } from '@/components/hooks'; import { Panel } from '@/components/common/Panel'; import { WebsiteControls } from '@/app/(main)/websites/[websiteId]/WebsiteControls'; import { getItem, setItem } from '@/lib/storage'; +import { SessionProfile } from '@/app/(main)/websites/[websiteId]/sessions/SessionProfile'; const KEY_NAME = 'umami.sessions.tab'; export function SessionsPage({ websiteId }) { const [tab, setTab] = useState(getItem(KEY_NAME) || 'activity'); const { formatMessage, labels } = useMessages(); + const { + router, + query: { session }, + updateParams, + } = useNavigation(); + + const handleClose = (close: () => void) => { + router.push(updateParams({ session: undefined })); + close(); + }; + + const handleOpenChange = (isOpen: boolean) => { + if (!isOpen) { + router.push(updateParams({ session: undefined })); + } + }; const handleSelect = (value: Key) => { setItem(KEY_NAME, value); @@ -36,6 +53,26 @@ export function SessionsPage({ websiteId }) { + + + {({ close }) => { + return ( + handleClose(close)} + /> + ); + }} + + ); } diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx index fa3be6c7b..391c57f43 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx @@ -1,6 +1,6 @@ import Link from 'next/link'; import { DataColumn, DataTable } from '@umami/react-zen'; -import { useFormat, useMessages } from '@/components/hooks'; +import { useFormat, useMessages, useNavigation } from '@/components/hooks'; import { Avatar } from '@/components/common/Avatar'; import { TypeIcon } from '@/components/common/TypeIcon'; import { DateDistance } from '@/components/common/DateDistance'; @@ -8,12 +8,13 @@ import { DateDistance } from '@/components/common/DateDistance'; export function SessionsTable({ data = [] }: { data: any[]; showDomain?: boolean }) { const { formatMessage, labels } = useMessages(); const { formatValue } = useFormat(); + const { updateParams } = useNavigation(); return ( {(row: any) => ( - + )} diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/page.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/page.tsx deleted file mode 100644 index 8d85a7c73..000000000 --- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/page.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { SessionDetailsPage } from './SessionDetailsPage'; -import { Metadata } from 'next'; - -export default async function WebsitePage({ - params, -}: { - params: Promise<{ websiteId: string; sessionId: string }>; -}) { - const { websiteId, sessionId } = await params; - - return ; -} - -export const metadata: Metadata = { - title: 'Websites', -}; diff --git a/src/app/share/[...shareId]/SharePage.tsx b/src/app/share/[...shareId]/SharePage.tsx index 0fa3c0bfe..f33798a1c 100644 --- a/src/app/share/[...shareId]/SharePage.tsx +++ b/src/app/share/[...shareId]/SharePage.tsx @@ -6,6 +6,7 @@ import { useShareTokenQuery } from '@/components/hooks'; import { PageBody } from '@/components/common/PageBody'; import { Header } from './Header'; import { Footer } from './Footer'; +import { WebsiteHeader } from '@/app/(main)/websites/[websiteId]/WebsiteHeader'; export function SharePage({ shareId }) { const { shareToken, isLoading } = useShareTokenQuery(shareId); @@ -19,6 +20,7 @@ export function SharePage({ shareId }) {
+