diff --git a/src/app/projects/page.js b/src/app/projects/page.js index 57138cf..b03e8f4 100644 --- a/src/app/projects/page.js +++ b/src/app/projects/page.js @@ -20,15 +20,28 @@ export default function ProjectListPage() { const [projects, setProjects] = useState([]); const [searchTerm, setSearchTerm] = useState(""); const [filteredProjects, setFilteredProjects] = useState([]); - const [filters, setFilters] = useState({ - status: 'all', - type: 'all', - customer: 'all', - mine: false + const [filters, setFilters] = useState(() => { + // Load phoneOnly filter from localStorage + const savedPhoneOnly = typeof window !== 'undefined' + ? localStorage.getItem('projectsPhoneOnlyFilter') === 'true' + : false; + return { + status: 'all', + type: 'all', + customer: 'all', + mine: false, + phoneOnly: savedPhoneOnly + }; }); const [customers, setCustomers] = useState([]); const [filtersExpanded, setFiltersExpanded] = useState(true); // Start expanded on mobile so users know filters exist + const [searchMatchType, setSearchMatchType] = useState(null); // Track what type of match was found + + // Helper function to normalize strings by removing spaces + const normalizeString = (str) => { + return str?.replace(/\s+/g, '') || ''; + }; useEffect(() => { fetch("/api/projects") @@ -74,17 +87,37 @@ export default function ProjectListPage() { // Apply search term if (searchTerm.trim()) { const searchLower = searchTerm.toLowerCase(); - filtered = filtered.filter((project) => { - return ( + const searchNormalized = normalizeString(searchLower); + let hasContactMatch = false; + + filtered = filtered.map((project) => { + const isContactMatch = normalizeString(project.contact?.toLowerCase()).includes(searchNormalized); + if (isContactMatch) hasContactMatch = true; + + // Add a flag to mark projects that matched on contact + return { + ...project, + _matchedOnContact: isContactMatch + }; + }).filter((project) => { + const baseMatches = project.project_name?.toLowerCase().includes(searchLower) || project.wp?.toLowerCase().includes(searchLower) || project.plot?.toLowerCase().includes(searchLower) || project.investment_number?.toLowerCase().includes(searchLower) || project.address?.toLowerCase().includes(searchLower) || project.customer?.toLowerCase().includes(searchLower) || - project.investor?.toLowerCase().includes(searchLower) - ); + project.investor?.toLowerCase().includes(searchLower); + + // Include contact matches only if phoneOnly is enabled + const contactMatch = filters.phoneOnly ? project._matchedOnContact : false; + + return baseMatches || contactMatch; }); + + setSearchMatchType(hasContactMatch ? 'contact' : null); + } else { + setSearchMatchType(null); } setFilteredProjects(filtered); @@ -107,10 +140,19 @@ export default function ProjectListPage() { }; const handleFilterChange = (filterType, value) => { - setFilters(prev => ({ - ...prev, - [filterType]: value - })); + setFilters(prev => { + const newFilters = { + ...prev, + [filterType]: value + }; + + // Save phoneOnly filter to localStorage + if (filterType === 'phoneOnly') { + localStorage.setItem('projectsPhoneOnlyFilter', value.toString()); + } + + return newFilters; + }); }; const clearAllFilters = () => { @@ -118,8 +160,10 @@ export default function ProjectListPage() { status: 'all', type: 'all', customer: 'all', - mine: false + mine: false, + phoneOnly: false }); + localStorage.setItem('projectsPhoneOnlyFilter', 'false'); setSearchTerm(''); }; @@ -149,7 +193,7 @@ export default function ProjectListPage() { setFiltersExpanded(!filtersExpanded); }; - const hasActiveFilters = filters.status !== 'all' || filters.type !== 'all' || filters.customer !== 'all' || filters.mine || searchTerm.trim() !== ''; + const hasActiveFilters = filters.status !== 'all' || filters.type !== 'all' || filters.customer !== 'all' || filters.mine || filters.phoneOnly || searchTerm.trim() !== ''; const getActiveFilterCount = () => { let count = 0; @@ -157,6 +201,7 @@ export default function ProjectListPage() { if (filters.type !== 'all') count++; if (filters.customer !== 'all') count++; if (filters.mine) count++; + if (filters.phoneOnly) count++; if (searchTerm.trim()) count++; return count; }; @@ -366,16 +411,17 @@ export default function ProjectListPage() { - {session?.user && ( +
- )} + + {session?.user && ( + + )} +
@@ -455,6 +528,32 @@ export default function ProjectListPage() { + + {session?.user && (