{"version":3,"file":"admin-report-page-4638f445.mjs","sources":["../../../common/resources/client/admin/analytics/use-admin-report.ts","../../../common/resources/client/charts/chart-layout.tsx","../../../common/resources/client/charts/chart-loading-indicator.tsx","../../../common/resources/client/charts/base-chart.tsx","../../../common/resources/client/charts/data/format-report-data.ts","../../../common/resources/client/charts/chart-colors.tsx","../../../common/resources/client/charts/line-chart.tsx","../../../common/resources/client/charts/polar-area-chart.tsx","../../../common/resources/client/charts/bar-chart.tsx","../../../common/resources/client/admin/analytics/geo-chart/use-google-geo-chart.ts","../../../common/resources/client/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger-icon.tsx","../../../common/resources/client/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger.tsx","../../../common/resources/client/i18n/formatted-country-name.tsx","../../../common/resources/client/admin/analytics/geo-chart/geo-chart.tsx","../../../common/resources/client/admin/analytics/visitors-report-charts.tsx","../../../common/resources/client/admin/analytics/admin-header-report.tsx","../../../common/resources/client/admin/analytics/report-date-selector.tsx","../../../common/resources/client/admin/analytics/admin-report-page.tsx"],"sourcesContent":["import {keepPreviousData, useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\nimport {apiClient} from '../../http/query-client';\nimport {VisitorsReportData} from './visitors-report-data';\nimport {IconTree} from '../../icons/create-svg-icon';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {ReactElement} from 'react';\nimport {SvgIconProps} from '@common/icons/svg-icon';\n\nconst Endpoint = 'admin/reports';\n\nexport interface HeaderDatum {\n icon: IconTree[] | ReactElement;\n name: string;\n type?: 'number' | 'fileSize' | 'percentage';\n currentValue: number;\n previousValue?: number;\n percentageChange?: number;\n}\n\ninterface FetchAnalyticsReportResponse extends BackendResponse {\n visitorsReport: VisitorsReportData;\n headerReport: HeaderDatum[];\n}\n\ninterface Payload {\n types?: ('visitors' | 'header')[];\n dateRange?: DateRangeValue;\n}\nexport function useAdminReport(payload: Payload = {}) {\n return useQuery({\n queryKey: [Endpoint, payload],\n queryFn: () => fetchAnalyticsReport(payload),\n placeholderData: keepPreviousData,\n });\n}\n\nfunction fetchAnalyticsReport({\n types,\n dateRange,\n}: Payload): Promise {\n const params: Record = {};\n if (types) {\n params.types = types.join(',');\n }\n if (dateRange) {\n params.startDate = dateRange.start.toAbsoluteString();\n params.endDate = dateRange.end.toAbsoluteString();\n params.timezone = dateRange.start.timeZone;\n }\n return apiClient.get(Endpoint, {params}).then(response => response.data);\n}\n","import {ReactNode, Ref} from 'react';\nimport clsx from 'clsx';\n\nexport interface ChartLayoutProps {\n title: ReactNode;\n description?: ReactNode;\n className?: string;\n children: ReactNode;\n contentIsFlex?: boolean;\n contentClassName?: string;\n minHeight?: string;\n contentRef?: Ref;\n isLoading?: boolean;\n}\nexport function ChartLayout(props: ChartLayoutProps) {\n const {\n title,\n description,\n children,\n className,\n contentIsFlex = true,\n contentClassName,\n contentRef,\n minHeight = 'min-h-440',\n } = props;\n\n return (\n \n
\n
{title}
\n {description &&
{description}
}\n
\n \n {children}\n \n \n );\n}\n","import {ProgressCircle} from '@common/ui/progress/progress-circle';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ChartLoadingIndicator() {\n return (\n
\n \n \n
\n );\n}\n","import type {ChartData, ChartOptions, ChartType} from 'chart.js';\nimport {lazy, Suspense} from 'react';\nimport {ChartLayout, ChartLayoutProps} from './chart-layout';\nimport {ChartLoadingIndicator} from '@common/charts/chart-loading-indicator';\n\nconst LazyChart = lazy(() => import('./lazy-chart'));\n\nexport interface BaseChartProps\n extends Omit {\n type: Type;\n data: ChartData;\n options?: ChartOptions;\n hideLegend?: boolean;\n}\nexport function BaseChart(\n props: BaseChartProps\n) {\n const {title, description, className, contentRef, isLoading} = props;\n\n return (\n \n }>\n \n {isLoading && }\n \n \n );\n}\n","import {DateFormatter, parseAbsoluteToLocal} from '@internationalized/date';\nimport memoize from 'nano-memoize';\nimport {ChartType} from 'chart.js';\nimport {\n FormattedDatasetItem,\n FormattedReportData,\n} from './formatted-dataset-item';\nimport {\n DatasetItem,\n RangedDatasetGranularity,\n ReportMetric,\n} from '../../admin/analytics/report-metric';\nimport {shallowEqual} from '../../utils/shallow-equal';\n\ninterface Options {\n localeCode: string;\n shareFirstDatasetLabels?: boolean;\n}\n\ntype FormattedDatasetLabels = Omit;\n\nexport function formatReportData(\n report: ReportMetric | undefined,\n {localeCode = 'en', shareFirstDatasetLabels = true}: Options,\n): FormattedReportData {\n if (!report) return {datasets: []};\n\n const firstDatasetLabels: FormattedDatasetLabels[] = [];\n\n return {\n ...report,\n datasets: report.datasets.map((dataset, datasetIndex) => {\n const data = dataset.data.map((datasetItem, itemIndex) => {\n let label: FormattedDatasetLabels;\n // when there are multiple datasets, we'll need to use labels from the first dataset, so charts are\n // overlapped over one another, otherwise they will be side by side, if labels in all datasets are not identical.\n if (datasetIndex === 0 || !shareFirstDatasetLabels) {\n label = generateDatasetLabels(\n datasetItem,\n report.granularity,\n localeCode,\n );\n firstDatasetLabels[itemIndex] = label;\n } else {\n label = firstDatasetLabels[itemIndex];\n }\n return {\n ...label,\n value: datasetItem.value,\n };\n });\n\n return {...dataset, data};\n }),\n };\n}\n\nfunction generateDatasetLabels(\n datum: DatasetItem,\n granularity: RangedDatasetGranularity | undefined,\n locale: string,\n): FormattedDatasetLabels {\n if (datum.label) {\n return {label: datum.label};\n }\n\n if (!datum.date) {\n return {label: ''};\n }\n\n return generateTimeLabels(datum, granularity, locale);\n}\n\nfunction generateTimeLabels(\n {date: isoDate, endDate: isoEndDate}: DatasetItem,\n granularity: RangedDatasetGranularity | undefined = 'day',\n locale: string,\n): Omit {\n const date = parseAbsoluteToLocal(isoDate!).toDate();\n const endDate = isoEndDate ? parseAbsoluteToLocal(isoEndDate).toDate() : null;\n\n switch (granularity) {\n case 'minute':\n return {\n label: getFormatter(locale, {\n second: '2-digit',\n }).format(date),\n tooltipTitle: getFormatter(locale, {\n day: '2-digit',\n hour: 'numeric',\n minute: 'numeric',\n second: '2-digit',\n }).format(date),\n };\n case 'hour':\n return {\n label: getFormatter(locale, {\n hour: 'numeric',\n minute: 'numeric',\n }).format(date),\n tooltipTitle: getFormatter(locale, {\n month: 'short',\n day: '2-digit',\n hour: 'numeric',\n minute: 'numeric',\n }).format(date),\n };\n case 'day':\n return {\n label: getFormatter(locale, {\n day: '2-digit',\n weekday: 'short',\n }).format(date),\n tooltipTitle: getFormatter(locale, {\n day: '2-digit',\n weekday: 'short',\n month: 'short',\n }).format(date),\n };\n case 'week':\n return {\n label: getFormatter(locale, {\n month: 'short',\n day: '2-digit',\n }).format(date),\n tooltipTitle: getFormatter(locale, {\n day: '2-digit',\n month: 'long',\n year: 'numeric',\n }).formatRange(date, endDate as Date),\n };\n case 'month':\n return {\n label: getFormatter(locale, {\n month: 'short',\n year: 'numeric',\n }).format(date),\n tooltipTitle: getFormatter(locale, {\n month: 'long',\n year: 'numeric',\n }).format(date),\n };\n case 'year':\n return {\n label: getFormatter(locale, {\n year: 'numeric',\n }).format(date),\n tooltipTitle: getFormatter(locale, {\n year: 'numeric',\n }).format(date),\n };\n }\n}\n\nconst getFormatter = memoize(\n (locale, options: Intl.DateTimeFormatOptions) => {\n return new DateFormatter(locale, options);\n },\n {\n equals: (a, b) => {\n return shallowEqual(a, b);\n },\n callTimeout: undefined as any,\n },\n);\n","import {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nconst primaryColor = getBootstrapData().themes.all[0].colors['--be-primary'];\nexport const ChartColors = [\n [\n `rgb(${primaryColor.replaceAll(' ', ',')})`,\n `rgba(${primaryColor.replaceAll(' ', ',')},0.2)`,\n ],\n ['rgb(255,112,67)', 'rgb(255,112,67,0.2)'],\n ['rgb(255,167,38)', 'rgb(255,167,38,0.2)'],\n ['rgb(141,110,99)', 'rgb(141,110,99,0.2)'],\n ['rgb(102,187,106)', 'rgba(102,187,106,0.2)'],\n ['rgb(92,107,192)', 'rgb(92,107,192,0.2)'],\n];\n","import {BaseChart, BaseChartProps} from './base-chart';\nimport {DatasetItem, ReportMetric} from '../admin/analytics/report-metric';\nimport {useMemo} from 'react';\nimport {formatReportData} from './data/format-report-data';\nimport {useSelectedLocale} from '../i18n/selected-locale';\nimport {ChartData, ChartOptions} from 'chart.js';\nimport {ChartColors} from './chart-colors';\nimport {FormattedDatasetItem} from './data/formatted-dataset-item';\nimport clsx from 'clsx';\n\nconst LineChartOptions: ChartOptions<'line'> = {\n parsing: {\n xAxisKey: 'label',\n yAxisKey: 'value',\n },\n datasets: {\n line: {\n fill: 'origin',\n tension: 0.1,\n pointBorderWidth: 4,\n pointHitRadius: 10,\n },\n },\n plugins: {\n tooltip: {\n intersect: false,\n mode: 'index',\n },\n },\n};\n\ninterface LineChartProps extends Omit, 'type' | 'data'> {\n data?: ReportMetric;\n}\nexport function LineChart({data, className, ...props}: LineChartProps) {\n const {localeCode} = useSelectedLocale();\n const formattedData: ChartData<'line', FormattedDatasetItem[]> =\n useMemo(() => {\n const formattedData = formatReportData(data, {localeCode});\n formattedData.datasets = formattedData.datasets.map((dataset, i) => ({\n ...dataset,\n backgroundColor: ChartColors[i][1],\n borderColor: ChartColors[i][0],\n pointBackgroundColor: ChartColors[i][0],\n }));\n return formattedData;\n }, [data, localeCode]);\n\n return (\n \n );\n}\n","import {BaseChart, BaseChartProps} from './base-chart';\nimport {ChartData, ChartOptions} from 'chart.js';\nimport {ChartColors} from './chart-colors';\nimport {useSelectedLocale} from '../i18n/selected-locale';\nimport {useMemo} from 'react';\nimport {formatReportData} from './data/format-report-data';\nimport {DatasetItem, ReportMetric} from '../admin/analytics/report-metric';\nimport {FormattedDatasetItem} from './data/formatted-dataset-item';\nimport clsx from 'clsx';\n\nconst PolarAreaChartOptions: ChartOptions<'polarArea'> = {\n parsing: {\n key: 'value',\n },\n plugins: {\n tooltip: {\n intersect: true,\n },\n },\n};\n\ninterface PolarAreaChartProps\n extends Omit, 'type' | 'data'> {\n data?: ReportMetric;\n}\nexport function PolarAreaChart({\n data,\n className,\n ...props\n}: PolarAreaChartProps) {\n const {localeCode} = useSelectedLocale();\n const formattedData: ChartData<'polarArea', FormattedDatasetItem[]> =\n useMemo(() => {\n const formattedData = formatReportData(data, {localeCode});\n formattedData.labels = formattedData.datasets[0]?.data.map(d => d.label);\n formattedData.datasets = formattedData.datasets.map((dataset, i) => ({\n ...dataset,\n backgroundColor: ChartColors.map(c => c[1]),\n borderColor: ChartColors.map(c => c[0]),\n borderWidth: 2,\n }));\n return formattedData;\n }, [data, localeCode]);\n\n return (\n \n );\n}\n","import {BaseChart, BaseChartProps} from './base-chart';\nimport {ChartData, ChartOptions} from 'chart.js';\nimport {ChartColors} from './chart-colors';\nimport {useSelectedLocale} from '../i18n/selected-locale';\nimport {FormattedDatasetItem} from './data/formatted-dataset-item';\nimport {useMemo} from 'react';\nimport {formatReportData} from './data/format-report-data';\nimport {DatasetItem, ReportMetric} from '../admin/analytics/report-metric';\nimport clsx from 'clsx';\n\ninterface BarChartProps extends Omit, 'type' | 'data'> {\n direction?: 'horizontal' | 'vertical';\n individualBarColors?: boolean;\n data?: ReportMetric;\n}\nexport function BarChart({\n data,\n direction = 'vertical',\n individualBarColors = false,\n className,\n ...props\n}: BarChartProps) {\n const {localeCode} = useSelectedLocale();\n const formattedData: ChartData<'bar', FormattedDatasetItem[]> =\n useMemo(() => {\n const formattedData = formatReportData(data, {localeCode});\n formattedData.datasets = formattedData.datasets.map((dataset, i) => ({\n ...dataset,\n backgroundColor: individualBarColors\n ? ChartColors.map(c => c[1])\n : ChartColors[i][1],\n borderColor: individualBarColors\n ? ChartColors.map(c => c[0])\n : ChartColors[i][0],\n borderWidth: 2,\n }));\n return formattedData;\n }, [data, localeCode, individualBarColors]);\n\n const isHorizontal = direction === 'horizontal';\n const options: ChartOptions<'bar'> = useMemo(() => {\n return {\n indexAxis: isHorizontal ? 'y' : 'x',\n parsing: {\n xAxisKey: isHorizontal ? 'value' : 'label',\n yAxisKey: isHorizontal ? 'label' : 'value',\n },\n };\n }, [isHorizontal]);\n\n return (\n \n );\n}\n","import lazyLoader from '../../../utils/http/lazy-loader';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {RefObject, useCallback, useEffect, useRef} from 'react';\nimport {useThemeSelector} from '@common/ui/themes/theme-selector-context';\nimport {themeValueToHex} from '@common/ui/themes/utils/theme-value-to-hex';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {LocationDatasetItem} from '@common/admin/analytics/report-metric';\n\nconst loaderUrl = 'https://www.gstatic.com/charts/loader.js';\n\ninterface UseGoogleGeoChartProps {\n placeholderRef: RefObject;\n data: LocationDatasetItem[];\n onCountrySelected?: (countryCode: string) => void;\n country?: string;\n}\nexport function useGoogleGeoChart({\n placeholderRef,\n data,\n country,\n onCountrySelected,\n}: UseGoogleGeoChartProps) {\n const {trans} = useTrans();\n const {analytics} = useSettings();\n const apiKey = analytics?.gchart_api_key;\n const {selectedTheme} = useThemeSelector();\n const geoChartRef = useRef();\n // only allow selecting countries, not cities\n const regionInteractivity = !!onCountrySelected && !country;\n const drawGoogleChart = useCallback(() => {\n if (typeof google === 'undefined') return;\n\n const seedData = data.map(location => [location.label, location.value]);\n seedData.unshift([\n country ? trans(message('City')) : trans(message('Country')),\n trans(message('Clicks')),\n ]);\n\n const backgroundColor = `${themeValueToHex(\n selectedTheme.colors['--be-paper']\n )}`;\n const chartColor = `${themeValueToHex(\n selectedTheme.colors['--be-primary']\n )}`;\n\n const options: google.visualization.GeoChartOptions = {\n colorAxis: {colors: [chartColor]},\n backgroundColor,\n region: country ? country.toUpperCase() : undefined,\n resolution: country ? 'provinces' : 'countries',\n displayMode: country ? 'markers' : 'regions',\n enableRegionInteractivity: regionInteractivity,\n };\n\n if (\n !geoChartRef.current &&\n placeholderRef.current &&\n google?.visualization?.GeoChart\n ) {\n geoChartRef.current = new google.visualization.GeoChart(\n placeholderRef.current\n );\n }\n geoChartRef.current?.draw(\n google.visualization.arrayToDataTable(seedData),\n options\n );\n }, [\n selectedTheme,\n data,\n placeholderRef,\n trans,\n country,\n regionInteractivity,\n ]);\n\n const initGoogleGeoChart = useCallback(async () => {\n if (lazyLoader.isLoadingOrLoaded(loaderUrl)) return;\n await lazyLoader.loadAsset(loaderUrl, {type: 'js'});\n await google.charts.load('current', {\n packages: ['geochart'],\n mapsApiKey: apiKey,\n });\n drawGoogleChart();\n }, [apiKey, drawGoogleChart]);\n\n useEffect(() => {\n if (geoChartRef.current && onCountrySelected) {\n google.visualization.events.addListener(\n geoChartRef.current,\n 'regionClick',\n (a: {region: string}) => onCountrySelected?.(a.region)\n );\n }\n\n return () => {\n if (geoChartRef.current) {\n google.visualization.events.removeAllListeners(geoChartRef.current);\n }\n };\n // this will correctly run when geochart instance is set on ref\n }, [onCountrySelected, geoChartRef.current]);\n\n // on component load: load chart library then draw, otherwise just draw\n useEffect(() => {\n initGoogleGeoChart();\n }, [initGoogleGeoChart]);\n\n // redraw chart if data or theme changes\n useEffect(() => {\n drawGoogleChart();\n }, [selectedTheme, drawGoogleChart, data]);\n\n return {drawGoogleChart};\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const InfoDialogTriggerIcon = createSvgIcon(\n ,\n 'InfoDialogTrigger'\n);\n","import {IconButton} from '@common/ui/buttons/icon-button';\nimport {InfoDialogTriggerIcon} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger-icon';\nimport {Dialog, DialogSize} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport React, {ReactNode} from 'react';\nimport clsx from 'clsx';\n\ninterface InfoDialogTriggerProps {\n title?: ReactNode;\n body: ReactNode;\n dialogSize?: DialogSize;\n className?: string;\n}\nexport function InfoDialogTrigger({\n title,\n body,\n dialogSize = 'sm',\n className,\n}: InfoDialogTriggerProps) {\n return (\n \n \n \n \n \n {title && (\n \n {title}\n \n )}\n {body}\n \n \n );\n}\n","import {useSelectedLocale} from '@common/i18n/selected-locale';\nimport {Fragment, memo} from 'react';\n\ninterface Props {\n code: string;\n}\nexport const FormattedCountryName = memo(({code: countryCode}: Props) => {\n const {localeCode} = useSelectedLocale();\n const regionNames = new Intl.DisplayNames([localeCode], {type: 'region'});\n let formattedName: string | undefined;\n\n try {\n formattedName = regionNames.of(countryCode.toUpperCase());\n } catch (e) {}\n\n return {formattedName};\n});\n","import {\n LocationDatasetItem,\n ReportMetric,\n} from '@common/admin/analytics/report-metric';\nimport React, {useMemo, useRef} from 'react';\nimport {useGoogleGeoChart} from './use-google-geo-chart';\nimport {ChartLayout, ChartLayoutProps} from '@common/charts/chart-layout';\nimport {Trans} from '@common/i18n/trans';\nimport {ChartLoadingIndicator} from '@common/charts/chart-loading-indicator';\nimport {Button} from '@common/ui/buttons/button';\nimport {ArrowBackIcon} from '@common/icons/material/ArrowBack';\nimport clsx from 'clsx';\nimport {InfoDialogTrigger} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger';\nimport {FormattedCountryName} from '@common/i18n/formatted-country-name';\n\ninterface GeoChartData extends Partial {\n data?: ReportMetric;\n onCountrySelected?: (countryCode: string | undefined) => void;\n country?: string;\n}\nexport function GeoChart({\n data: metricData,\n isLoading,\n onCountrySelected,\n country,\n ...layoutProps\n}: GeoChartData) {\n const placeholderRef = useRef(null);\n const regionInteractivity = !!onCountrySelected;\n\n // memo data to avoid redrawing chart on rerender\n const initialData = metricData?.datasets[0].data;\n const data = useMemo(() => {\n return initialData || [];\n }, [initialData]);\n useGoogleGeoChart({placeholderRef, data, country, onCountrySelected});\n\n return (\n \n \n {country ? (\n \n ({})\n \n ) : null}\n {regionInteractivity && }\n \n }\n contentIsFlex={isLoading}\n >\n {isLoading && }\n
\n \n
\n
\n {data.map(location => (\n {\n onCountrySelected?.(location.code);\n }}\n >\n
\n {location.label}\n
\n
({location.percentage})%
\n
\n ))}\n
\n {country && (\n }\n onClick={() => {\n onCountrySelected?.(undefined);\n }}\n >\n \n \n )}\n
\n \n \n );\n}\n\nfunction InfoTrigger() {\n return (\n }\n body={\n \n }\n />\n );\n}\n","import React, {Fragment} from 'react';\nimport {LineChart} from '@common/charts/line-chart';\nimport {Trans} from '@common/i18n/trans';\nimport {PolarAreaChart} from '@common/charts/polar-area-chart';\nimport {BarChart} from '@common/charts/bar-chart';\nimport {VisitorsReportData} from '@common/admin/analytics/visitors-report-data';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {GeoChart} from '@common/admin/analytics/geo-chart/geo-chart';\n\nexport const AdminReportPageColGap = 'gap-12 md:gap-24 mb-12 md:mb-24';\nconst rowClassName = `flex flex-col md:flex-row md:items-center overflow-x-auto ${AdminReportPageColGap}`;\n\ninterface AdminReportChartsProps {\n report?: VisitorsReportData;\n isLoading: boolean;\n}\nexport function VisitorsReportCharts({\n report,\n isLoading,\n}: AdminReportChartsProps) {\n const totalViews = report?.pageViews.total;\n return (\n \n
\n }\n description={\n totalViews ? (\n }}\n />\n ) : null\n }\n />\n }\n />\n
\n
\n }\n />\n }\n />\n
\n
\n );\n}\n","import {HeaderDatum} from '@common/admin/analytics/use-admin-report';\nimport React, {\n cloneElement,\n Fragment,\n isValidElement,\n ReactElement,\n} from 'react';\nimport {TrendingUpIcon} from '@common/icons/material/TrendingUp';\nimport {TrendingDownIcon} from '@common/icons/material/TrendingDown';\nimport {createSvgIconFromTree} from '@common/icons/create-svg-icon';\nimport {AdminReportPageColGap} from '@common/admin/analytics/visitors-report-charts';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {FormattedBytes} from '@common/uploads/formatted-bytes';\nimport {TrendingFlatIcon} from '@common/icons/material/TrendingFlat';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\n\ninterface AdminHeaderReportProps {\n report?: HeaderDatum[];\n isLoading?: boolean;\n}\nexport function AdminHeaderReport({report, isLoading}: AdminHeaderReportProps) {\n return (\n \n {report?.map(datum => (\n \n ))}\n \n );\n}\n\ninterface ValueMetricItemProps {\n datum: HeaderDatum;\n isLoading?: boolean;\n}\nfunction ReportItem({datum, isLoading = false}: ValueMetricItemProps) {\n let icon;\n if (isValidElement(datum.icon)) {\n icon = cloneElement(datum.icon, {size: 'lg'});\n } else {\n const IconEl = createSvgIconFromTree(datum.icon);\n icon = ;\n }\n\n return (\n \n
\n {icon}\n
\n
\n
\n
\n \n {isLoading ? (\n \n \n \n ) : (\n \n \n \n )}\n \n
\n
\n
\n

{datum.name}

\n {(datum.percentageChange != null || datum.previousValue != null) && (\n
\n \n
\n )}\n
\n
\n \n );\n}\n\ninterface FormattedValueProps {\n datum: HeaderDatum;\n}\nfunction FormattedValue({datum}: FormattedValueProps) {\n switch (datum.type) {\n case 'fileSize':\n return ;\n case 'percentage':\n return (\n \n );\n default:\n return ;\n }\n}\n\ninterface TrendingIndicatorProps {\n datum: HeaderDatum;\n}\nfunction TrendingIndicator({datum}: TrendingIndicatorProps) {\n const percentage = calculatePercentage(datum);\n let icon: ReactElement;\n if (percentage > 0) {\n icon = ;\n } else if (percentage === 0) {\n icon = ;\n } else {\n icon = ;\n }\n\n return (\n \n {icon}\n
{percentage}%
\n
\n );\n}\n\nfunction calculatePercentage({\n percentageChange,\n previousValue,\n currentValue,\n}: HeaderDatum) {\n if (\n percentageChange != null ||\n previousValue == null ||\n currentValue == null\n ) {\n return percentageChange ?? 0;\n }\n\n if (previousValue === 0) {\n return 100;\n }\n\n return Math.round(((currentValue - previousValue) / previousValue) * 100);\n}\n","import {useDateRangePickerState} from '@common/ui/forms/input-field/date/date-range-picker/use-date-range-picker-state';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport {DateRangeIcon} from '@common/icons/material/DateRange';\nimport {FormattedDateTimeRange} from '@common/i18n/formatted-date-time-range';\nimport {DateRangeDialog} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-dialog';\nimport React from 'react';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {DateFormatPresets} from '@common/i18n/formatted-date';\nimport {DateRangeComparePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-presets';\nimport {Granularity} from '@common/ui/forms/input-field/date/date-picker/use-date-picker-state';\n\nconst monthDayFormat: Intl.DateTimeFormatOptions = {\n month: 'short',\n day: '2-digit',\n};\n\ninterface ReportDataSelectorProps {\n value: DateRangeValue;\n disabled?: boolean;\n onChange: (value: DateRangeValue) => void;\n compactOnMobile?: boolean;\n enableCompare?: boolean;\n granularity?: Granularity;\n}\nexport function ReportDateSelector({\n value,\n onChange,\n disabled,\n compactOnMobile = true,\n enableCompare = false,\n granularity = 'minute',\n}: ReportDataSelectorProps) {\n const isMobile = useIsMobileMediaQuery();\n return (\n {\n if (value) {\n onChange(value);\n }\n }}\n >\n }\n disabled={disabled}\n >\n \n \n \n \n );\n}\n\ninterface DateSelectorDialogProps {\n value: DateRangeValue;\n enableCompare: boolean;\n granularity: Granularity;\n}\nfunction DateSelectorDialog({\n value,\n enableCompare,\n granularity,\n}: DateSelectorDialogProps) {\n const isMobile = useIsMobileMediaQuery();\n const state = useDateRangePickerState({\n granularity,\n defaultValue: {\n start: value.start,\n end: value.end,\n preset: value.preset,\n },\n closeDialogOnSelection: false,\n });\n const compareHasInitialValue = !!value.compareStart && !!value.compareEnd;\n const compareState = useDateRangePickerState({\n granularity,\n defaultValue: compareHasInitialValue\n ? {\n start: value.compareStart,\n end: value.compareEnd,\n preset: value.comparePreset,\n }\n : DateRangeComparePresets[0].getRangeValue(state.selectedValue),\n });\n return (\n \n );\n}\n","import React, {useState} from 'react';\nimport {useAdminReport} from './use-admin-report';\nimport {Trans} from '../../i18n/trans';\nimport {StaticPageTitle} from '../../seo/static-page-title';\nimport {AdminHeaderReport} from '@common/admin/analytics/admin-header-report';\nimport {VisitorsReportCharts} from '@common/admin/analytics/visitors-report-charts';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {DateRangePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-presets';\nimport {ReportDateSelector} from '@common/admin/analytics/report-date-selector';\n\nexport default function AdminReportPage() {\n const [dateRange, setDateRange] = useState(() => {\n // This week\n return DateRangePresets[2].getRangeValue();\n });\n const {isLoading, data} = useAdminReport({dateRange});\n const title = ;\n\n return (\n
\n
\n {title}\n

{title}

\n \n
\n \n \n
\n );\n}\n"],"names":["formattedData","value"],"mappings":"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"}