@@ -109,8 +140,12 @@ export default function Locations({ countries, cities, regions }: LocationProps)
- {activeTab === 'map' ? (
- hasData ?
: (
+ {isTabDisabled() ? (
+
+
{getDisabledMessage()}
+
+ ) : activeTab === 'map' ? (
+ hasData ?
: (
@@ -123,9 +158,9 @@ export default function Locations({ countries, cities, regions }: LocationProps)
{activeTab === 'countries' && {getFlagComponent(item.country)}}
{activeTab !== 'countries' && {getFlagComponent(item.country)}}
-
+
- {activeTab === 'countries' ? getCountryName(item.country) :
+ {activeTab === 'countries' ? getCountryName(item.country) :
activeTab === 'regions' ? getRegionName(item.region, item.country) :
(item.city === 'Unknown' ? 'Unknown' : item.city)}
diff --git a/components/dashboard/TechSpecs.tsx b/components/dashboard/TechSpecs.tsx
index 252e913..dcef5a6 100644
--- a/components/dashboard/TechSpecs.tsx
+++ b/components/dashboard/TechSpecs.tsx
@@ -11,17 +11,24 @@ interface TechSpecsProps {
os: Array<{ os: string; pageviews: number }>
devices: Array<{ device: string; pageviews: number }>
screenResolutions: Array<{ screen_resolution: string; pageviews: number }>
+ collectDeviceInfo?: boolean
+ collectScreenResolution?: boolean
}
type Tab = 'browsers' | 'os' | 'devices' | 'screens'
const LIMIT = 7
-export default function TechSpecs({ browsers, os, devices, screenResolutions }: TechSpecsProps) {
+export default function TechSpecs({ browsers, os, devices, screenResolutions, collectDeviceInfo = true, collectScreenResolution = true }: TechSpecsProps) {
const [activeTab, setActiveTab] = useState('browsers')
const [isModalOpen, setIsModalOpen] = useState(false)
- const getData = () => {
+ // Filter out "Unknown" entries that result from disabled collection
+ const filterUnknown = (items: Array<{ name: string; pageviews: number; icon: React.ReactNode }>) => {
+ return items.filter(item => item.name && item.name !== 'Unknown' && item.name !== '')
+ }
+
+ const getRawData = () => {
switch (activeTab) {
case 'browsers':
return browsers.map(b => ({ name: b.browser, pageviews: b.pageviews, icon: getBrowserIcon(b.browser) }))
@@ -36,7 +43,29 @@ export default function TechSpecs({ browsers, os, devices, screenResolutions }:
}
}
- const data = getData()
+ // Check if current tab is disabled by privacy settings
+ const isTabDisabled = () => {
+ if (!collectDeviceInfo && (activeTab === 'browsers' || activeTab === 'os' || activeTab === 'devices')) {
+ return true
+ }
+ if (!collectScreenResolution && activeTab === 'screens') {
+ return true
+ }
+ return false
+ }
+
+ const getDisabledMessage = () => {
+ if (!collectDeviceInfo && (activeTab === 'browsers' || activeTab === 'os' || activeTab === 'devices')) {
+ return 'Device info collection is disabled in site settings'
+ }
+ if (!collectScreenResolution && activeTab === 'screens') {
+ return 'Screen resolution collection is disabled in site settings'
+ }
+ return 'No data available'
+ }
+
+ const rawData = getRawData()
+ const data = filterUnknown(rawData)
const hasData = data && data.length > 0
const displayedData = hasData ? data.slice(0, LIMIT) : []
const emptySlots = Math.max(0, LIMIT - displayedData.length)
@@ -77,13 +106,17 @@ export default function TechSpecs({ browsers, os, devices, screenResolutions }:
- {hasData ? (
+ {isTabDisabled() ? (
+
+
{getDisabledMessage()}
+
+ ) : hasData ? (
<>
{displayedData.map((item, index) => (
{item.icon && {item.icon}}
- {item.name === 'Unknown' ? 'Unknown' : item.name}
+ {item.name}
{formatNumber(item.pageviews)}
diff --git a/components/dashboard/TopReferrers.tsx b/components/dashboard/TopReferrers.tsx
index ea41dde..90c0e28 100644
--- a/components/dashboard/TopReferrers.tsx
+++ b/components/dashboard/TopReferrers.tsx
@@ -7,17 +7,23 @@ import { Modal } from '@ciphera-net/ui'
interface TopReferrersProps {
referrers: Array<{ referrer: string; pageviews: number }>
+ collectReferrers?: boolean
}
const LIMIT = 7
-export default function TopReferrers({ referrers }: TopReferrersProps) {
+export default function TopReferrers({ referrers, collectReferrers = true }: TopReferrersProps) {
const [isModalOpen, setIsModalOpen] = useState(false)
- const hasData = referrers && referrers.length > 0
- const displayedReferrers = hasData ? referrers.slice(0, LIMIT) : []
+ // Filter out empty/unknown referrers
+ const filteredReferrers = (referrers || []).filter(
+ ref => ref.referrer && ref.referrer !== 'Unknown' && ref.referrer !== ''
+ )
+
+ const hasData = filteredReferrers.length > 0
+ const displayedReferrers = hasData ? filteredReferrers.slice(0, LIMIT) : []
const emptySlots = Math.max(0, LIMIT - displayedReferrers.length)
- const showViewAll = hasData && referrers.length > LIMIT
+ const showViewAll = hasData && filteredReferrers.length > LIMIT
return (
<>
@@ -37,7 +43,11 @@ export default function TopReferrers({ referrers }: TopReferrersProps) {
- {hasData ? (
+ {!collectReferrers ? (
+
+
Referrer tracking is disabled in site settings
+
+ ) : hasData ? (
<>
{displayedReferrers.map((ref, index) => (