+ {/* Row 1: Back + Title + (desktop: search + filter) + (mobile: filter icon) */}
+
+
+
{t('admin.referralNetwork.title')}
-
- {t('admin.referralNetwork.subtitle')}
-
+ {/* Desktop: search + filter inline */}
+
+
+ {networkData && }
+
+ {/* Mobile: filter icon only */}
+ {networkData && (
+
+
+
+ )}
-
-
- {networkData &&
}
+ {/* Row 2 (mobile only): full-width search */}
+
+
diff --git a/src/pages/ReferralNetwork/components/NetworkFilters.tsx b/src/pages/ReferralNetwork/components/NetworkFilters.tsx
index 4e2ff6d..d363bbb 100644
--- a/src/pages/ReferralNetwork/components/NetworkFilters.tsx
+++ b/src/pages/ReferralNetwork/components/NetworkFilters.tsx
@@ -1,3 +1,4 @@
+import { useEffect, useRef } from 'react';
import { useTranslation } from 'react-i18next';
import { useReferralNetworkStore } from '@/store/referralNetwork';
import type { NetworkGraphData } from '@/types/referralNetwork';
@@ -9,6 +10,7 @@ interface NetworkFiltersProps {
export function NetworkFilters({ data, className }: NetworkFiltersProps) {
const { t } = useTranslation();
+ const panelRef = useRef
(null);
const filters = useReferralNetworkStore((s) => s.filters);
const updateFilters = useReferralNetworkStore((s) => s.updateFilters);
@@ -16,6 +18,21 @@ export function NetworkFilters({ data, className }: NetworkFiltersProps) {
const isOpen = useReferralNetworkStore((s) => s.isFiltersOpen);
const setIsOpen = useReferralNetworkStore((s) => s.setIsFiltersOpen);
+ const hasActiveFilters =
+ filters.campaigns.length > 0 || filters.partnersOnly || filters.minReferrals > 0;
+
+ // Close on outside click
+ useEffect(() => {
+ if (!isOpen) return;
+ function handleClick(e: MouseEvent) {
+ if (panelRef.current && !panelRef.current.contains(e.target as Node)) {
+ setIsOpen(false);
+ }
+ }
+ document.addEventListener('mousedown', handleClick);
+ return () => document.removeEventListener('mousedown', handleClick);
+ }, [isOpen, setIsOpen]);
+
function toggleCampaign(campaignId: number) {
const current = filters.campaigns;
const next = current.includes(campaignId)
@@ -24,12 +41,13 @@ export function NetworkFilters({ data, className }: NetworkFiltersProps) {
updateFilters({ campaigns: next });
}
+ // Trigger button
if (!isOpen) {
return (
);
}
- return (
-
-
-
- {t('admin.referralNetwork.filters.title')}
-
-
+ // Filter panel content (shared between mobile/desktop)
+ const panelContent = (
+
+ {/* Campaigns */}
+ {data.campaigns.length > 0 && (
+
+
+
+ {data.campaigns.map((campaign) => (
+
+ ))}
+
+
+ )}
+
+ {/* Partners only */}
+
+
+ {/* Min referrals */}
+
+
+ updateFilters({ minReferrals: Number(e.target.value) })}
+ className="w-full accent-accent-500"
+ />
-
- {/* Campaigns */}
- {data.campaigns.length > 0 && (
-
-
-
- {data.campaigns.map((campaign) => (
-
- ))}
-
+ {/* Reset */}
+
+
+ );
+
+ return (
+
+ {/* Desktop: inline dropdown */}
+
+
+
+
+ {t('admin.referralNetwork.filters.title')}
+
+
- )}
-
- {/* Partners only */}
-
-
- {/* Min referrals */}
-
-
- updateFilters({ minReferrals: Number(e.target.value) })}
- className="w-full accent-accent-500"
- />
+ {panelContent}
+
- {/* Reset */}
-
+ {/* Mobile: full-width overlay below top bar */}
+
+ {/* Backdrop */}
+
setIsOpen(false)} />
+ {/* Panel */}
+
+
+
+ {t('admin.referralNetwork.filters.title')}
+
+
+
+ {panelContent}
+
);