diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionData.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionData.tsx index 6b18cb57..39b6afd1 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionData.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionData.tsx @@ -10,22 +10,24 @@ export function SessionData({ websiteId, sessionId }: { websiteId: string; sessi const { data, ...query } = useSessionData(websiteId, sessionId); return ( - + <>
{formatMessage(labels.properties)}
- {!data?.length && } - {data?.map(({ dataKey, dataType, stringValue }) => { - return ( -
-
-
- {dataKey} + + {!data?.length && } + {data?.map(({ dataKey, dataType, stringValue }) => { + return ( +
+
+
+ {dataKey} +
+
{DATA_TYPES[dataType]}
-
{DATA_TYPES[dataType]}
+
{stringValue}
-
{stringValue}
-
- ); - })} - + ); + })} + + ); } diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionStats.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionStats.tsx index 6953405e..3265e592 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionStats.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionStats.tsx @@ -1,31 +1,15 @@ import { useMessages } from 'components/hooks'; import MetricCard from 'components/metrics/MetricCard'; import MetricsBar from 'components/metrics/MetricsBar'; -import { formatShortTime } from 'lib/format'; export function SessionStats({ data }) { const { formatMessage, labels } = useMessages(); - const duration = (new Date(data?.lastAt).getTime() - new Date(data?.firstAt).getTime()) / 1000; - let dateFormat; - - if (duration > 86400) { - dateFormat = ['d', 'm']; - } else if (duration > 3600) { - dateFormat = ['h', 'm']; - } else { - dateFormat = ['m', 's']; - } return ( - `${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), dateFormat, ' ')}`} - /> ); } diff --git a/src/components/messages.ts b/src/components/messages.ts index 0b32d0d8..f711a4f6 100644 --- a/src/components/messages.ts +++ b/src/components/messages.ts @@ -141,7 +141,6 @@ export const labels = defineMessages({ bounceRate: { id: 'label.bounce-rate', defaultMessage: 'Bounce rate' }, viewsPerVisit: { id: 'label.views-per-visit', defaultMessage: 'Views per visit' }, visitDuration: { id: 'label.visit-duration', defaultMessage: 'Visit duration' }, - sessionDuration: { id: 'label.session-duration', defaultMessage: 'Session duration' }, desktop: { id: 'label.desktop', defaultMessage: 'Desktop' }, laptop: { id: 'label.laptop', defaultMessage: 'Laptop' }, tablet: { id: 'label.tablet', defaultMessage: 'Tablet' }, diff --git a/src/queries/analytics/events/getWebsiteEvents.ts b/src/queries/analytics/events/getWebsiteEvents.ts index 86668161..2fe2bda2 100644 --- a/src/queries/analytics/events/getWebsiteEvents.ts +++ b/src/queries/analytics/events/getWebsiteEvents.ts @@ -14,10 +14,12 @@ export function getWebsiteEvents( async function relationalQuery(websiteId: string, filters: QueryFilters, pageParams?: PageParams) { const { pagedQuery } = prisma; + const { query } = pageParams; const where = { ...filters, id: websiteId, + ...prisma.getSearchParameters(query, [{ eventName: 'contains' }, { urlPath: 'contains' }]), }; return pagedQuery('website_event', { where }, pageParams); @@ -47,7 +49,12 @@ async function clickhouseQuery(websiteId: string, filters: QueryFilters, pagePar where website_id = {websiteId:UUID} ${dateQuery} ${filterQuery} - ${query ? `and (positionCaseInsensitive(event_name, {query:String}) > 0)` : ''} + ${ + query + ? `and (positionCaseInsensitive(event_name, {query:String}) > 0 + or positionCaseInsensitive(url_path, {query:String}) > 0)` + : '' + } order by created_at desc `, { ...params, query }, diff --git a/src/queries/analytics/sessions/getWebsiteSessions.ts b/src/queries/analytics/sessions/getWebsiteSessions.ts index 2b22a0c8..518769b0 100644 --- a/src/queries/analytics/sessions/getWebsiteSessions.ts +++ b/src/queries/analytics/sessions/getWebsiteSessions.ts @@ -14,12 +14,10 @@ export async function getWebsiteSessions( async function relationalQuery(websiteId: string, filters: QueryFilters, pageParams: PageParams) { const { pagedQuery } = prisma; - const { query } = pageParams; const where = { ...filters, id: websiteId, - ...prisma.getSearchParameters(query, [{ eventName: 'contains' }, { urlPath: 'contains' }]), }; return pagedQuery('session', { where }, pageParams); @@ -28,7 +26,6 @@ async function relationalQuery(websiteId: string, filters: QueryFilters, pagePar async function clickhouseQuery(websiteId: string, filters: QueryFilters, pageParams?: PageParams) { const { pagedQuery, parseFilters } = clickhouse; const { params, dateQuery, filterQuery } = await parseFilters(websiteId, filters); - const { query } = pageParams; return pagedQuery( ` @@ -52,14 +49,22 @@ async function clickhouseQuery(websiteId: string, filters: QueryFilters, pagePar where website_id = {websiteId:UUID} ${dateQuery} ${filterQuery} - ${query ? `and (positionCaseInsensitive(event_name, {query:String}) > 0)` : ''} group by session_id, website_id, hostname, browser, os, device, screen, language, country, subdivision1, city order by lastAt desc `, params, pageParams, - ).then((result: any) => ({ - ...result, - visits: Number(result.visits), - })); + ).then((result: any) => { + return { + ...result, + data: result.data.map((row: any) => { + return { + ...row, + createdAt: row.firstAt, + visits: Number(row.visits), + views: Number(row.views), + }; + }), + }; + }); }