+
-
+
= (
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 && (
- |
+ |
|