diff --git a/components/WebsiteDetails.js b/components/WebsiteDetails.js index e3a7e2c2..f24332ba 100644 --- a/components/WebsiteDetails.js +++ b/components/WebsiteDetails.js @@ -1,12 +1,12 @@ import React, { useState } from 'react'; import { FormattedMessage } from 'react-intl'; -import { useRouter } from 'next/router'; import classNames from 'classnames'; import WebsiteChart from 'components/metrics/WebsiteChart'; import WorldMap from 'components/common/WorldMap'; import Page from 'components/layout/Page'; import MenuLayout from 'components/layout/MenuLayout'; -import Button from 'components/common/Button'; +import Link from 'components/common/Link'; +import Loading from 'components/common/Loading'; import Arrow from 'assets/arrow-right.svg'; import styles from './WebsiteDetails.module.css'; import PagesTable from './metrics/PagesTable'; @@ -18,7 +18,7 @@ import CountriesTable from './metrics/CountriesTable'; import EventsTable from './metrics/EventsTable'; import EventsChart from './metrics/EventsChart'; import useFetch from 'hooks/useFetch'; -import Loading from 'components/common/Loading'; +import usePageQuery from 'hooks/usePageQuery'; const views = { url: PagesTable, @@ -31,31 +31,26 @@ const views = { }; export default function WebsiteDetails({ websiteId, token }) { - const router = useRouter(); const { data } = useFetch(`/api/website/${websiteId}`, { token }); const [chartLoaded, setChartLoaded] = useState(false); const [countryData, setCountryData] = useState(); const [eventsData, setEventsData] = useState(); const { - query: { id, view }, - basePath, - asPath, - } = router; - - const path = `${basePath}/${asPath.split('/')[1]}/${id.join('/')}`; + resolve, + query: { view }, + } = usePageQuery(); const BackButton = () => ( - + + ); const menuOptions = [ @@ -64,31 +59,31 @@ export default function WebsiteDetails({ websiteId, token }) { }, { label: , - value: `${path}?view=url`, + value: resolve({ view: 'url' }), }, { label: , - value: `${path}?view=referrer`, + value: resolve({ view: 'referrer' }), }, { label: , - value: `${path}?view=browser`, + value: resolve({ view: 'browser' }), }, { label: , - value: `${path}?view=os`, + value: resolve({ view: 'os' }), }, { label: , - value: `${path}?view=device`, + value: resolve({ view: 'device' }), }, { label: , - value: `${path}?view=country`, + value: resolve({ view: 'country' }), }, { label: , - value: `${path}?view=event`, + value: resolve({ view: 'event' }), }, ]; @@ -97,7 +92,6 @@ export default function WebsiteDetails({ websiteId, token }) { token, websiteDomain: data?.domain, limit: 10, - onExpand: handleExpand, }; const DetailsComponent = views[view]; @@ -108,10 +102,6 @@ export default function WebsiteDetails({ websiteId, token }) { } } - function handleExpand(value) { - router.push(`${path}?view=${value}`); - } - if (!data) { return null; } @@ -179,7 +169,7 @@ export default function WebsiteDetails({ websiteId, token }) { contentClassName={styles.content} menu={menuOptions} > - + )} diff --git a/components/WebsiteDetails.module.css b/components/WebsiteDetails.module.css index ca80dca0..0e1065c6 100644 --- a/components/WebsiteDetails.module.css +++ b/components/WebsiteDetails.module.css @@ -16,7 +16,6 @@ } .backButton { - align-self: flex-start; margin-bottom: 16px; } diff --git a/components/WebsiteList.js b/components/WebsiteList.js index b1819748..0df24877 100644 --- a/components/WebsiteList.js +++ b/components/WebsiteList.js @@ -34,9 +34,7 @@ export default function WebsiteList({ userId }) { } > )} diff --git a/components/common/Button.js b/components/common/Button.js index b973b36e..5e92d0d8 100644 --- a/components/common/Button.js +++ b/components/common/Button.js @@ -13,7 +13,8 @@ export default function Button({ className, tooltip, tooltipId, - disabled = false, + disabled, + iconRight, onClick = () => {}, ...props }) { @@ -30,14 +31,14 @@ export default function Button({ [styles.action]: variant === 'action', [styles.danger]: variant === 'danger', [styles.light]: variant === 'light', - [styles.disabled]: disabled, + [styles.iconRight]: iconRight, })} disabled={disabled} onClick={!disabled ? onClick : null} {...props} > - {icon && } - {children} + {icon && } + {children &&
{children}
} {tooltip && {tooltip}} ); diff --git a/components/common/Button.module.css b/components/common/Button.module.css index 324bbb22..f4fd8546 100644 --- a/components/common/Button.module.css +++ b/components/common/Button.module.css @@ -10,7 +10,6 @@ border: 0; outline: none; cursor: pointer; - white-space: nowrap; position: relative; } @@ -22,12 +21,15 @@ color: var(--gray900); } -.large { - font-size: var(--font-size-large); +.label { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + max-width: 300px; } -.medium { - font-size: var(--font-size-normal); +.large { + font-size: var(--font-size-large); } .small { @@ -38,7 +40,8 @@ font-size: var(--font-size-xsmall); } -.action { +.action, +.action:active { color: var(--gray50); background: var(--gray900); } @@ -64,6 +67,19 @@ background: inherit; } +.button .icon + * { + margin-left: 10px; +} + +.button.iconRight .icon { + order: 1; + margin-left: 10px; +} + +.button.iconRight .icon + * { + margin: 0; +} + .button:disabled { cursor: default; color: var(--gray500); diff --git a/components/common/Icon.module.css b/components/common/Icon.module.css index 47d0ab0d..5b431668 100644 --- a/components/common/Icon.module.css +++ b/components/common/Icon.module.css @@ -5,10 +5,6 @@ vertical-align: middle; } -.icon + * { - margin-left: 10px; -} - .icon svg { fill: currentColor; } diff --git a/components/common/Link.js b/components/common/Link.js index c3a5fa7e..466e018c 100644 --- a/components/common/Link.js +++ b/components/common/Link.js @@ -1,12 +1,23 @@ import React from 'react'; import classNames from 'classnames'; import NextLink from 'next/link'; +import Icon from './Icon'; import styles from './Link.module.css'; -export default function Link({ className, children, ...props }) { +export default function Link({ className, icon, children, size, iconRight, ...props }) { return ( - {children} + + {icon && } + {children} + ); } diff --git a/components/common/Link.module.css b/components/common/Link.module.css index 24d8f84c..ea6d281d 100644 --- a/components/common/Link.module.css +++ b/components/common/Link.module.css @@ -4,6 +4,8 @@ a.link:visited { position: relative; color: var(--gray900); text-decoration: none; + display: inline-flex; + align-items: center; } a.link:before { @@ -21,3 +23,28 @@ a.link:hover:before { width: 100%; transition: width 100ms; } + +a.link.large { + font-size: var(--font-size-large); +} + +a.link.small { + font-size: var(--font-size-small); +} + +a.link.xsmall { + font-size: var(--font-size-xsmall); +} + +a.link .icon + * { + margin-left: 10px; +} + +a.link.iconRight .icon { + order: 1; + margin-left: 10px; +} + +a.link.iconRight .icon + * { + margin: 0; +} diff --git a/components/metrics/BrowsersTable.js b/components/metrics/BrowsersTable.js index f092e62f..97f9bfbd 100644 --- a/components/metrics/BrowsersTable.js +++ b/components/metrics/BrowsersTable.js @@ -3,7 +3,7 @@ import { FormattedMessage } from 'react-intl'; import MetricsTable from './MetricsTable'; import { browserFilter } from 'lib/filters'; -export default function BrowsersTable({ websiteId, token, limit, onExpand }) { +export default function BrowsersTable({ websiteId, token, limit }) { return ( } @@ -13,7 +13,6 @@ export default function BrowsersTable({ websiteId, token, limit, onExpand }) { token={token} limit={limit} dataFilter={browserFilter} - onExpand={onExpand} /> ); } diff --git a/components/metrics/CountriesTable.js b/components/metrics/CountriesTable.js index 1f516653..58548d06 100644 --- a/components/metrics/CountriesTable.js +++ b/components/metrics/CountriesTable.js @@ -3,13 +3,7 @@ import MetricsTable from './MetricsTable'; import { countryFilter, percentFilter } from 'lib/filters'; import { FormattedMessage } from 'react-intl'; -export default function CountriesTable({ - websiteId, - token, - limit, - onDataLoad = () => {}, - onExpand, -}) { +export default function CountriesTable({ websiteId, token, limit, onDataLoad = () => {} }) { return ( } @@ -20,7 +14,6 @@ export default function CountriesTable({ limit={limit} dataFilter={countryFilter} onDataLoad={data => onDataLoad(percentFilter(data))} - onExpand={onExpand} /> ); } diff --git a/components/metrics/DevicesTable.js b/components/metrics/DevicesTable.js index 85d2bdfd..7d87d1c1 100644 --- a/components/metrics/DevicesTable.js +++ b/components/metrics/DevicesTable.js @@ -4,7 +4,7 @@ import { deviceFilter } from 'lib/filters'; import { FormattedMessage } from 'react-intl'; import { getDeviceMessage } from 'components/messages'; -export default function DevicesTable({ websiteId, token, limit, onExpand }) { +export default function DevicesTable({ websiteId, token, limit }) { return ( } @@ -15,7 +15,6 @@ export default function DevicesTable({ websiteId, token, limit, onExpand }) { limit={limit} dataFilter={deviceFilter} renderLabel={({ x }) => getDeviceMessage(x)} - onExpand={onExpand} /> ); } diff --git a/components/metrics/EventsChart.js b/components/metrics/EventsChart.js index afc3e952..113c6f56 100644 --- a/components/metrics/EventsChart.js +++ b/components/metrics/EventsChart.js @@ -6,11 +6,13 @@ import useFetch from 'hooks/useFetch'; import useDateRange from 'hooks/useDateRange'; import useTimezone from 'hooks/useTimezone'; import { EVENT_COLORS } from 'lib/constants'; +import usePageQuery from '../../hooks/usePageQuery'; export default function EventsChart({ websiteId, token }) { const [dateRange] = useDateRange(websiteId); const { startDate, endDate, unit, modified } = dateRange; const [timezone] = useTimezone(); + const { query } = usePageQuery(); const { data } = useFetch( `/api/website/${websiteId}/events`, @@ -19,6 +21,7 @@ export default function EventsChart({ websiteId, token }) { end_at: +endDate, unit, tz: timezone, + url: query.url, token, }, { update: [modified] }, diff --git a/components/metrics/EventsTable.js b/components/metrics/EventsTable.js index 948b9f7a..9a7a09cb 100644 --- a/components/metrics/EventsTable.js +++ b/components/metrics/EventsTable.js @@ -3,7 +3,7 @@ import { FormattedMessage } from 'react-intl'; import MetricsTable from './MetricsTable'; import styles from './EventsTable.module.css'; -export default function EventsTable({ websiteId, token, limit, onExpand, onDataLoad }) { +export default function EventsTable({ websiteId, token, limit, onDataLoad }) { return ( } @@ -13,7 +13,6 @@ export default function EventsTable({ websiteId, token, limit, onExpand, onDataL token={token} limit={limit} renderLabel={({ x }) =>