mirror of
https://github.com/umami-software/umami.git
synced 2025-12-08 05:12:36 +01:00
Updated filtering logic.
This commit is contained in:
parent
112005212e
commit
9d86385f5c
8 changed files with 23 additions and 31 deletions
|
|
@ -16,7 +16,7 @@ export function EventDataTable({ data = [] }) {
|
||||||
<GridTable data={data}>
|
<GridTable data={data}>
|
||||||
<GridColumn name="eventName" label={formatMessage(labels.event)}>
|
<GridColumn name="eventName" label={formatMessage(labels.event)}>
|
||||||
{row => (
|
{row => (
|
||||||
<Link href={resolveUrl({ eventName: row.eventName })} shallow={true}>
|
<Link href={resolveUrl({ event: row.eventName })} shallow={true}>
|
||||||
{row.eventName}
|
{row.eventName}
|
||||||
</Link>
|
</Link>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -6,14 +6,14 @@ import PageHeader from 'components/layout/PageHeader';
|
||||||
import Empty from 'components/common/Empty';
|
import Empty from 'components/common/Empty';
|
||||||
import { DATA_TYPES } from 'lib/constants';
|
import { DATA_TYPES } from 'lib/constants';
|
||||||
|
|
||||||
export function EventDataValueTable({ data = [], eventName }) {
|
export function EventDataValueTable({ data = [], event }) {
|
||||||
const { formatMessage, labels } = useMessages();
|
const { formatMessage, labels } = useMessages();
|
||||||
const { resolveUrl } = usePageQuery();
|
const { resolveUrl } = usePageQuery();
|
||||||
|
|
||||||
const Title = () => {
|
const Title = () => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Link href={resolveUrl({ eventName: undefined })}>
|
<Link href={resolveUrl({ event: undefined })}>
|
||||||
<Button>
|
<Button>
|
||||||
<Icon rotate={180}>
|
<Icon rotate={180}>
|
||||||
<Icons.ArrowRight />
|
<Icons.ArrowRight />
|
||||||
|
|
@ -21,7 +21,7 @@ export function EventDataValueTable({ data = [], eventName }) {
|
||||||
<Text>{formatMessage(labels.back)}</Text>
|
<Text>{formatMessage(labels.back)}</Text>
|
||||||
</Button>
|
</Button>
|
||||||
</Link>
|
</Link>
|
||||||
<Text>{eventName}</Text>
|
<Text>{event}</Text>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -26,15 +26,15 @@ function useData(websiteId, eventName) {
|
||||||
|
|
||||||
export default function WebsiteEventData({ websiteId }) {
|
export default function WebsiteEventData({ websiteId }) {
|
||||||
const {
|
const {
|
||||||
query: { eventName },
|
query: { event },
|
||||||
} = usePageQuery();
|
} = usePageQuery();
|
||||||
const { data } = useData(websiteId, eventName);
|
const { data } = useData(websiteId, event);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flexbox className={styles.container} direction="column" gap={20}>
|
<Flexbox className={styles.container} direction="column" gap={20}>
|
||||||
<EventDataMetricsBar websiteId={websiteId} />
|
<EventDataMetricsBar websiteId={websiteId} />
|
||||||
{!eventName && <EventDataTable data={data} />}
|
{!event && <EventDataTable data={data} />}
|
||||||
{eventName && <EventDataValueTable eventName={eventName} data={data} />}
|
{event && <EventDataValueTable event={event} data={data} />}
|
||||||
</Flexbox>
|
</Flexbox>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ import dateFormat from 'dateformat';
|
||||||
import debug from 'debug';
|
import debug from 'debug';
|
||||||
import { CLICKHOUSE } from 'lib/db';
|
import { CLICKHOUSE } from 'lib/db';
|
||||||
import { QueryFilters } from './types';
|
import { QueryFilters } from './types';
|
||||||
import { FILTER_COLUMNS, IGNORED_FILTERS } from './constants';
|
import { FILTER_COLUMNS } from './constants';
|
||||||
import { loadWebsite } from './load';
|
import { loadWebsite } from './load';
|
||||||
import { maxDate } from './date';
|
import { maxDate } from './date';
|
||||||
|
|
||||||
|
|
@ -66,9 +66,9 @@ function getDateFormat(date) {
|
||||||
function getFilterQuery(filters = {}) {
|
function getFilterQuery(filters = {}) {
|
||||||
const query = Object.keys(filters).reduce((arr, key) => {
|
const query = Object.keys(filters).reduce((arr, key) => {
|
||||||
const filter = filters[key];
|
const filter = filters[key];
|
||||||
|
const column = FILTER_COLUMNS[key];
|
||||||
|
|
||||||
if (filter !== undefined && !IGNORED_FILTERS.includes(key)) {
|
if (filter !== undefined && column) {
|
||||||
const column = FILTER_COLUMNS[key] || key;
|
|
||||||
arr.push(`and ${column} = {${key}:String}`);
|
arr.push(`and ${column} = {${key}:String}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,23 +48,16 @@ export const FILTER_COLUMNS = {
|
||||||
referrer: 'referrer_domain',
|
referrer: 'referrer_domain',
|
||||||
title: 'page_title',
|
title: 'page_title',
|
||||||
query: 'url_query',
|
query: 'url_query',
|
||||||
|
os: 'os',
|
||||||
|
browser: 'browser',
|
||||||
|
device: 'device',
|
||||||
|
country: 'country',
|
||||||
region: 'subdivision1',
|
region: 'subdivision1',
|
||||||
eventType: 'event_type',
|
city: 'city',
|
||||||
eventName: 'event_name',
|
language: 'language',
|
||||||
event: 'event_name',
|
event: 'event_name',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const IGNORED_FILTERS = [
|
|
||||||
'startDate',
|
|
||||||
'endDate',
|
|
||||||
'timezone',
|
|
||||||
'unit',
|
|
||||||
'eventType',
|
|
||||||
'fields',
|
|
||||||
'filters',
|
|
||||||
'groups',
|
|
||||||
];
|
|
||||||
|
|
||||||
export const COLLECTION_TYPE = {
|
export const COLLECTION_TYPE = {
|
||||||
event: 'event',
|
event: 'event',
|
||||||
identify: 'identify',
|
identify: 'identify',
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import prisma from '@umami/prisma-client';
|
import prisma from '@umami/prisma-client';
|
||||||
import moment from 'moment-timezone';
|
import moment from 'moment-timezone';
|
||||||
import { MYSQL, POSTGRESQL, getDatabaseType } from 'lib/db';
|
import { MYSQL, POSTGRESQL, getDatabaseType } from 'lib/db';
|
||||||
import { FILTER_COLUMNS, IGNORED_FILTERS, SESSION_COLUMNS } from './constants';
|
import { FILTER_COLUMNS, SESSION_COLUMNS } from './constants';
|
||||||
import { loadWebsite } from './load';
|
import { loadWebsite } from './load';
|
||||||
import { maxDate } from './date';
|
import { maxDate } from './date';
|
||||||
import { QueryFilters, QueryOptions } from './types';
|
import { QueryFilters, QueryOptions } from './types';
|
||||||
|
|
@ -70,9 +70,9 @@ function getTimestampIntervalQuery(field: string): string {
|
||||||
function getFilterQuery(filters = {}): string {
|
function getFilterQuery(filters = {}): string {
|
||||||
const query = Object.keys(filters).reduce((arr, key) => {
|
const query = Object.keys(filters).reduce((arr, key) => {
|
||||||
const filter = filters[key];
|
const filter = filters[key];
|
||||||
|
const column = FILTER_COLUMNS[key];
|
||||||
|
|
||||||
if (filter !== undefined && !IGNORED_FILTERS.includes(key)) {
|
if (filter !== undefined && column) {
|
||||||
const column = FILTER_COLUMNS[key] || key;
|
|
||||||
arr.push(`and ${column}={{${key}}}`);
|
arr.push(`and ${column}={{${key}}}`);
|
||||||
|
|
||||||
if (key === 'referrer') {
|
if (key === 'referrer') {
|
||||||
|
|
|
||||||
|
|
@ -135,9 +135,7 @@ export interface QueryFilters {
|
||||||
endDate?: Date;
|
endDate?: Date;
|
||||||
timezone?: string;
|
timezone?: string;
|
||||||
unit?: string;
|
unit?: string;
|
||||||
domain?: string;
|
|
||||||
eventType?: number;
|
eventType?: number;
|
||||||
eventName?: string;
|
|
||||||
url?: string;
|
url?: string;
|
||||||
referrer?: string;
|
referrer?: string;
|
||||||
title?: string;
|
title?: string;
|
||||||
|
|
@ -149,6 +147,7 @@ export interface QueryFilters {
|
||||||
region?: string;
|
region?: string;
|
||||||
city?: string;
|
city?: string;
|
||||||
language?: string;
|
language?: string;
|
||||||
|
event?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface QueryOptions {
|
export interface QueryOptions {
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ export default async (
|
||||||
await useAuth(req, res);
|
await useAuth(req, res);
|
||||||
|
|
||||||
if (req.method === 'GET') {
|
if (req.method === 'GET') {
|
||||||
const { websiteId, startAt, endAt, eventName } = req.query;
|
const { websiteId, startAt, endAt, event } = req.query;
|
||||||
|
|
||||||
if (!(await canViewWebsite(req.auth, websiteId))) {
|
if (!(await canViewWebsite(req.auth, websiteId))) {
|
||||||
return unauthorized(res);
|
return unauthorized(res);
|
||||||
|
|
@ -33,7 +33,7 @@ export default async (
|
||||||
const data = await getEventDataEvents(websiteId, {
|
const data = await getEventDataEvents(websiteId, {
|
||||||
startDate,
|
startDate,
|
||||||
endDate,
|
endDate,
|
||||||
eventName,
|
event,
|
||||||
});
|
});
|
||||||
|
|
||||||
return ok(res, data);
|
return ok(res, data);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue