From eabd7d9ecb538d362f99c25f9873372d514e122d Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sun, 28 Mar 2021 15:57:22 +0200 Subject: [PATCH] Added visited URL column on visits table for orphan visits --- src/visits/OrphanVisits.tsx | 1 + src/visits/VisitsStats.tsx | 23 +++++++++++++++++++---- src/visits/VisitsTable.tsx | 27 +++++++++++++++++++-------- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/visits/OrphanVisits.tsx b/src/visits/OrphanVisits.tsx index 54197a83..b79cfad8 100644 --- a/src/visits/OrphanVisits.tsx +++ b/src/visits/OrphanVisits.tsx @@ -33,6 +33,7 @@ export const OrphanVisits = ({ exportVisits }: VisitsExporter) => boundToMercure baseUrl={url} settings={settings} exportCsv={exportCsv} + isOrphanVisits > diff --git a/src/visits/VisitsStats.tsx b/src/visits/VisitsStats.tsx index 09271d2d..73e6d533 100644 --- a/src/visits/VisitsStats.tsx +++ b/src/visits/VisitsStats.tsx @@ -6,6 +6,7 @@ import { faCalendarAlt, faMapMarkedAlt, faList, faChartPie, faFileDownload } fro import { IconDefinition } from '@fortawesome/fontawesome-common-types'; import { Route, Switch, NavLink as RouterNavLink, Redirect } from 'react-router-dom'; import { Location } from 'history'; +import classNames from 'classnames'; import { DateRangeSelector } from '../utils/dates/DateRangeSelector'; import Message from '../utils/Message'; import { formatIsoDate } from '../utils/helpers/date'; @@ -31,6 +32,7 @@ export interface VisitsStatsProps { baseUrl: string; domain?: string; exportCsv: (visits: NormalizedVisit[]) => void; + isOrphanVisits?: boolean; } interface VisitsNavLinkProps { @@ -77,7 +79,7 @@ const VisitsNavLink: FC = ({ subPath, title ); const VisitsStats: FC = ( - { children, visitsInfo, getVisits, cancelGetVisits, baseUrl, domain, settings, exportCsv }, + { children, visitsInfo, getVisits, cancelGetVisits, baseUrl, domain, settings, exportCsv, isOrphanVisits = false }, ) => { const initialInterval: DateInterval = settings.visits?.defaultInterval ?? 'last30Days'; const [ dateRange, setDateRange ] = useState(intervalToDateRange(initialInterval)); @@ -171,13 +173,13 @@ const VisitsStats: FC = ( -
+
-
+
-
+
= ( onClick={highlightVisitsForProp('referer')} />
+ {isOrphanVisits && ( +
+ +
+ )} @@ -232,6 +246,7 @@ const VisitsStats: FC = ( visits={normalizedVisits} selectedVisits={highlightedVisits} setSelectedVisits={setSelectedVisits} + isOrphanVisits={isOrphanVisits} />
diff --git a/src/visits/VisitsTable.tsx b/src/visits/VisitsTable.tsx index fb99a950..0e7bcb71 100644 --- a/src/visits/VisitsTable.tsx +++ b/src/visits/VisitsTable.tsx @@ -12,7 +12,7 @@ import SimplePaginator from '../common/SimplePaginator'; import SearchField from '../utils/SearchField'; import { determineOrderDir, OrderDir } from '../utils/utils'; import { prettify } from '../utils/helpers/numbers'; -import { NormalizedVisit } from './types'; +import { NormalizedOrphanVisit, NormalizedVisit } from './types'; import './VisitsTable.scss'; interface VisitsTableProps { @@ -20,9 +20,10 @@ interface VisitsTableProps { selectedVisits?: NormalizedVisit[]; setSelectedVisits: (visits: NormalizedVisit[]) => void; matchMedia?: (query: string) => MediaQueryList; + isOrphanVisits?: boolean; } -type OrderableFields = 'date' | 'country' | 'city' | 'browser' | 'os' | 'referer'; +type OrderableFields = 'date' | 'country' | 'city' | 'browser' | 'os' | 'referer' | 'visitedUrl'; interface Order { field?: OrderableFields; @@ -30,8 +31,10 @@ interface Order { } const PAGE_SIZE = 20; -const visitMatchesSearch = ({ browser, os, referer, country, city }: NormalizedVisit, searchTerm: string) => - `${browser} ${os} ${referer} ${country} ${city}`.toLowerCase().includes(searchTerm.toLowerCase()); +const visitMatchesSearch = ({ browser, os, referer, country, city, ...rest }: NormalizedVisit, searchTerm: string) => + `${browser} ${os} ${referer} ${country} ${city} ${(rest as NormalizedOrphanVisit).visitedUrl}`.toLowerCase().includes( + searchTerm.toLowerCase(), + ); const searchVisits = (searchTerm: string, visits: NormalizedVisit[]) => visits.filter((visit) => visitMatchesSearch(visit, searchTerm)); const sortVisits = ({ field, dir }: Order, visits: NormalizedVisit[]) => !field || !dir ? visits : visits.sort( @@ -39,7 +42,7 @@ const sortVisits = ({ field, dir }: Order, visits: NormalizedVisit[]) => !field const greaterThan = dir === 'ASC' ? 1 : -1; const smallerThan = dir === 'ASC' ? -1 : 1; - return a[field] > b[field] ? greaterThan : smallerThan; + return (a as NormalizedOrphanVisit)[field] > (b as NormalizedOrphanVisit)[field] ? greaterThan : smallerThan; }, ); const calculateVisits = (allVisits: NormalizedVisit[], searchTerm: string | undefined, order: Order) => { @@ -56,6 +59,7 @@ const VisitsTable = ({ selectedVisits = [], setSelectedVisits, matchMedia = window.matchMedia, + isOrphanVisits = false, }: VisitsTableProps) => { const headerCellsClass = 'visits-table__header-cell visits-table__sticky'; const matchMobile = () => matchMedia('(max-width: 767px)').matches; @@ -132,9 +136,15 @@ const VisitsTable = ({ Referrer {renderOrderIcon('referer')} + {isOrphanVisits && ( + + Visited URL + {renderOrderIcon('visitedUrl')} + + )} - + @@ -142,7 +152,7 @@ const VisitsTable = ({ {(!resultSet.visitsGroups[page - 1] || resultSet.visitsGroups[page - 1].length === 0) && ( - + No visits found with current filtering @@ -170,6 +180,7 @@ const VisitsTable = ({ {visit.browser} {visit.os} {visit.referer} + {isOrphanVisits && {(visit as NormalizedOrphanVisit).visitedUrl}} ); })} @@ -177,7 +188,7 @@ const VisitsTable = ({ {resultSet.total > PAGE_SIZE && ( - +