diff --git a/components/pages/WebsiteDetails.js b/components/pages/WebsiteDetails.js index 44412a5f..dc8ed19d 100644 --- a/components/pages/WebsiteDetails.js +++ b/components/pages/WebsiteDetails.js @@ -1,26 +1,29 @@ -import { useState } from 'react'; -import { Column, Loading } from 'react-basics'; -import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; +import Arrow from 'assets/arrow-right.svg'; import classNames from 'classnames'; -import WebsiteChart from 'components/metrics/WebsiteChart'; +import Link from 'components/common/Link'; import WorldMap from 'components/common/WorldMap'; -import Page from 'components/layout/Page'; import GridRow from 'components/layout/GridRow'; import MenuLayout from 'components/layout/MenuLayout'; -import Link from 'components/common/Link'; -import PagesTable from 'components/metrics/PagesTable'; -import ReferrersTable from 'components/metrics/ReferrersTable'; +import Page from 'components/layout/Page'; import BrowsersTable from 'components/metrics/BrowsersTable'; -import OSTable from 'components/metrics/OSTable'; -import DevicesTable from 'components/metrics/DevicesTable'; import CountriesTable from 'components/metrics/CountriesTable'; +import DevicesTable from 'components/metrics/DevicesTable'; import LanguagesTable from 'components/metrics/LanguagesTable'; -import ScreenTable from 'components/metrics/ScreenTable'; +import OSTable from 'components/metrics/OSTable'; +import PagesTable from 'components/metrics/PagesTable'; import QueryParametersTable from 'components/metrics/QueryParametersTable'; -import usePageQuery from 'hooks/usePageQuery'; +import ReferrersTable from 'components/metrics/ReferrersTable'; +import ScreenTable from 'components/metrics/ScreenTable'; +import WebsiteChart from 'components/metrics/WebsiteChart'; import useApi from 'hooks/useApi'; +import usePageQuery from 'hooks/usePageQuery'; import { DEFAULT_ANIMATION_DURATION } from 'lib/constants'; -import Arrow from 'assets/arrow-right.svg'; +import { useState } from 'react'; +import { Column, Loading } from 'react-basics'; +import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; +import EventDataButton from './../common/EventDataButton'; +import EventsChart from './../metrics/EventsChart'; +import EventsTable from './../metrics/EventsTable'; import styles from './WebsiteDetails.module.css'; const messages = defineMessages({ @@ -32,6 +35,7 @@ const messages = defineMessages({ devices: { id: 'metrics.devices', defaultMessage: 'Devices' }, countries: { id: 'metrics.countries', defaultMessage: 'Countries' }, languages: { id: 'metrics.languages', defaultMessage: 'Languages' }, + events: { id: 'metrics.events', defaultMessage: 'Events' }, query: { id: 'metrics.query-parameters', defaultMessage: 'Query parameters' }, }); @@ -44,6 +48,7 @@ const views = { screen: ScreenTable, country: CountriesTable, language: LanguagesTable, + event: EventsTable, query: QueryParametersTable, }; @@ -54,6 +59,7 @@ export default function WebsiteDetails({ websiteId }) { ); const [chartLoaded, setChartLoaded] = useState(false); const [countryData, setCountryData] = useState(); + const [eventsData, setEventsData] = useState(); const { resolve, query: { view }, @@ -104,6 +110,10 @@ export default function WebsiteDetails({ websiteId }) { label: formatMessage(messages.screens), value: resolve({ view: 'screen' }), }, + { + label: formatMessage(messages.events), + value: resolve({ view: 'event' }), + }, { label: formatMessage(messages.query), value: resolve({ view: 'query' }), @@ -172,6 +182,15 @@ export default function WebsiteDetails({ websiteId }) { + 0 })}> + + + + + + + + )} {view && chartLoaded && ( diff --git a/pages/api/websites/[id]/metrics.ts b/pages/api/websites/[id]/metrics.ts index 25759531..c6375f08 100644 --- a/pages/api/websites/[id]/metrics.ts +++ b/pages/api/websites/[id]/metrics.ts @@ -139,8 +139,8 @@ export default async ( startDate, endDate, column, - table, filters, + type, }); return ok(res, data); diff --git a/queries/analytics/pageview/getPageviewMetrics.ts b/queries/analytics/pageview/getPageviewMetrics.ts index 1e619fb8..8b82721c 100644 --- a/queries/analytics/pageview/getPageviewMetrics.ts +++ b/queries/analytics/pageview/getPageviewMetrics.ts @@ -12,8 +12,8 @@ export async function getPageviewMetrics( startDate: Date; endDate: Date; column: Prisma.WebsiteEventScalarFieldEnum | Prisma.SessionScalarFieldEnum; - table: string; filters: object; + type: string; }, ] ) { @@ -30,11 +30,16 @@ async function relationalQuery( endDate: Date; column: Prisma.WebsiteEventScalarFieldEnum | Prisma.SessionScalarFieldEnum; filters: object; + type: string; }, ) { - const { startDate, endDate, column, filters = {} } = data; + const { startDate, endDate, column, filters = {}, type } = data; const { rawQuery, parseFilters } = prisma; - const params = [startDate, endDate]; + const params: any = [ + startDate, + endDate, + type === 'event' ? EVENT_TYPE.customEvent : EVENT_TYPE.pageView, + ]; const { filterQuery, joinSession } = parseFilters(filters, params); return rawQuery( @@ -43,7 +48,7 @@ async function relationalQuery( ${joinSession} where website_id='${websiteId}' and website_event.created_at between $1 and $2 - and event_type = ${EVENT_TYPE.pageView} + and event_type = $3 ${filterQuery} group by 1 order by 2 desc`, @@ -58,12 +63,17 @@ async function clickhouseQuery( endDate: Date; column: Prisma.WebsiteEventScalarFieldEnum | Prisma.SessionScalarFieldEnum; filters: object; + type: string; }, ) { - const { startDate, endDate, column, filters = {} } = data; + const { startDate, endDate, column, filters = {}, type } = data; const { rawQuery, parseFilters, getBetweenDates } = clickhouse; const website = await cache.fetchWebsite(websiteId); - const params = [websiteId, website?.revId || 0, EVENT_TYPE.pageView]; + const params = [ + websiteId, + website?.revId || 0, + type === 'event' ? EVENT_TYPE.customEvent : EVENT_TYPE.pageView, + ]; const { filterQuery } = parseFilters(filters, params); return rawQuery( diff --git a/queries/analytics/pageview/getPageviews.js b/queries/analytics/pageview/getPageviews.js index 03f8a485..7854e13e 100644 --- a/queries/analytics/pageview/getPageviews.js +++ b/queries/analytics/pageview/getPageviews.js @@ -32,7 +32,7 @@ async function clickhouseQuery(websites, startAt) { created_at, url from event - where event_name = '' + where event_type = 1 and ${ websites && websites.length > 0 ? `website_id in (${getCommaSeparatedStringFormat(websites)})` diff --git a/queries/analytics/session/getSessionMetrics.ts b/queries/analytics/session/getSessionMetrics.ts index 04e1801a..cbaf235e 100644 --- a/queries/analytics/session/getSessionMetrics.ts +++ b/queries/analytics/session/getSessionMetrics.ts @@ -58,7 +58,7 @@ async function clickhouseQuery( from event as x where website_id = $1 and rev_id = $2 - and event_name = '' + and event_type = 1 and ${getBetweenDates('created_at', startDate, endDate)} ${filterQuery} group by x diff --git a/queries/analytics/stats/getWebsiteStats.ts b/queries/analytics/stats/getWebsiteStats.ts index bf5cdd96..779a67b8 100644 --- a/queries/analytics/stats/getWebsiteStats.ts +++ b/queries/analytics/stats/getWebsiteStats.ts @@ -67,7 +67,7 @@ async function clickhouseQuery( min(created_at) min_time, max(created_at) max_time from event - where event_name = '' + where event_type = 1 and website_id = $1 and rev_id = $2 and ${getBetweenDates('created_at', startDate, endDate)}