vmi-virtual-memorial/vmi-wd-frontend / c2064dd

Browse files

hasDoc to search pages

Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
c2064dd9cfaed258c9fcca52785ef45d9c49e6d1
Parents
fe6cc03
Tree
8427e6c

2 changed files

StatusFile+-
M app/memorial/search/page.tsx 24 7
M lib/api.ts 4 2
app/memorial/search/page.tsxmodified
@@ -14,6 +14,7 @@ export default function MemorialSearchPage() {
14
   const [dateFrom, setDateFrom] = useState('');
14
   const [dateFrom, setDateFrom] = useState('');
15
   const [dateTo, setDateTo] = useState('');
15
   const [dateTo, setDateTo] = useState('');
16
   const [noDate, setNoDate] = useState(false);
16
   const [noDate, setNoDate] = useState(false);
17
+  const [hasDocument, setHasDocument] = useState(false);
17
   
18
   
18
   // Results state
19
   // Results state
19
   const [results, setResults] = useState<PersonDetail[]>([]);
20
   const [results, setResults] = useState<PersonDetail[]>([]);
@@ -31,7 +32,7 @@ export default function MemorialSearchPage() {
31
         // Get filters
32
         // Get filters
32
         const filterData = await getSearchFilters();
33
         const filterData = await getSearchFilters();
33
         setFilters(filterData);
34
         setFilters(filterData);
34
-        
35
+
35
         // Load all people initially
36
         // Load all people initially
36
         const params = {
37
         const params = {
37
           q: '',
38
           q: '',
@@ -39,9 +40,10 @@ export default function MemorialSearchPage() {
39
           conflict: '',
40
           conflict: '',
40
           date_from: '',
41
           date_from: '',
41
           date_to: '',
42
           date_to: '',
42
-          no_date: false
43
+          no_date: false,
44
+          has_document: false
43
         };
45
         };
44
-        
46
+
45
         const data = await searchPeople(params);
47
         const data = await searchPeople(params);
46
         setResults(data.results);
48
         setResults(data.results);
47
         setTotalCount(data.count);
49
         setTotalCount(data.count);
@@ -50,14 +52,14 @@ export default function MemorialSearchPage() {
50
         console.error('Failed to initialize:', err);
52
         console.error('Failed to initialize:', err);
51
       }
53
       }
52
     }
54
     }
53
-    
55
+
54
     initialize();
56
     initialize();
55
   }, []);
57
   }, []);
56
 
58
 
57
   const performSearch = async () => {
59
   const performSearch = async () => {
58
     setLoading(true);
60
     setLoading(true);
59
     setHasSearched(true);
61
     setHasSearched(true);
60
-    
62
+
61
     try {
63
     try {
62
       const params = {
64
       const params = {
63
         q: searchTerm,
65
         q: searchTerm,
@@ -65,9 +67,10 @@ export default function MemorialSearchPage() {
65
         conflict: selectedConflicts.join(','),
67
         conflict: selectedConflicts.join(','),
66
         date_from: dateFrom,
68
         date_from: dateFrom,
67
         date_to: dateTo,
69
         date_to: dateTo,
68
-        no_date: noDate
70
+        no_date: noDate,
71
+        has_document: hasDocument
69
       };
72
       };
70
-      
73
+
71
       const data = await searchPeople(params);
74
       const data = await searchPeople(params);
72
       setResults(data.results);
75
       setResults(data.results);
73
       setTotalCount(data.count);
76
       setTotalCount(data.count);
@@ -108,6 +111,7 @@ export default function MemorialSearchPage() {
108
     setDateFrom('');
111
     setDateFrom('');
109
     setDateTo('');
112
     setDateTo('');
110
     setNoDate(false);
113
     setNoDate(false);
114
+    setHasDocument(false);
111
   };
115
   };
112
 
116
 
113
   return (
117
   return (
@@ -130,6 +134,19 @@ export default function MemorialSearchPage() {
130
               <h2 className="text-2xl font-bold text-vmi-red mb-6">Search Filters</h2>
134
               <h2 className="text-2xl font-bold text-vmi-red mb-6">Search Filters</h2>
131
               
135
               
132
               <form onSubmit={handleSubmit} className="space-y-6">
136
               <form onSubmit={handleSubmit} className="space-y-6">
137
+                {/* Memorial Document Filter */}
138
+                <div>
139
+                  <label className="flex items-center cursor-pointer hover:bg-gray-50 p-2 rounded">
140
+                    <input
141
+                      type="checkbox"
142
+                      checked={hasDocument}
143
+                      onChange={(e) => setHasDocument(e.target.checked)}
144
+                      className="mr-3 text-vmi-red focus:ring-vmi-gold w-4 h-4"
145
+                    />
146
+                    <span className="text-sm font-bold text-gray-700">Memorial Document Available</span>
147
+                  </label>
148
+                </div>
149
+
133
                 {/* Name Search */}
150
                 {/* Name Search */}
134
                 <div>
151
                 <div>
135
                   <label htmlFor="search" className="block text-sm font-bold text-gray-700 mb-2">
152
                   <label htmlFor="search" className="block text-sm font-bold text-gray-700 mb-2">
lib/api.tsmodified
@@ -126,6 +126,7 @@ export interface SearchParams {
126
   date_from?: string;
126
   date_from?: string;
127
   date_to?: string;
127
   date_to?: string;
128
   no_date?: boolean;
128
   no_date?: boolean;
129
+  has_document?: boolean;
129
 }
130
 }
130
 
131
 
131
 // Fetch all conflicts
132
 // Fetch all conflicts
@@ -169,14 +170,15 @@ export async function getMemorialIndex(): Promise<Conflict[]> {
169
 // Search people with filters
170
 // Search people with filters
170
 export async function searchPeople(params: SearchParams): Promise<{ count: number; results: PersonDetail[] }> {
171
 export async function searchPeople(params: SearchParams): Promise<{ count: number; results: PersonDetail[] }> {
171
   const queryParams = new URLSearchParams();
172
   const queryParams = new URLSearchParams();
172
-  
173
+
173
   if (params.q) queryParams.append('q', params.q);
174
   if (params.q) queryParams.append('q', params.q);
174
   if (params.class_year) queryParams.append('class_year', params.class_year);
175
   if (params.class_year) queryParams.append('class_year', params.class_year);
175
   if (params.conflict) queryParams.append('conflict', params.conflict);
176
   if (params.conflict) queryParams.append('conflict', params.conflict);
176
   if (params.date_from) queryParams.append('date_from', params.date_from);
177
   if (params.date_from) queryParams.append('date_from', params.date_from);
177
   if (params.date_to) queryParams.append('date_to', params.date_to);
178
   if (params.date_to) queryParams.append('date_to', params.date_to);
178
   if (params.no_date !== undefined) queryParams.append('no_date', params.no_date.toString());
179
   if (params.no_date !== undefined) queryParams.append('no_date', params.no_date.toString());
179
-  
180
+  if (params.has_document !== undefined) queryParams.append('has_document', params.has_document.toString());
181
+
180
   const response = await fetch(`${API_BASE_URL}/memorial/persons/search/?${queryParams.toString()}`);
182
   const response = await fetch(`${API_BASE_URL}/memorial/persons/search/?${queryParams.toString()}`);
181
   if (!response.ok) {
183
   if (!response.ok) {
182
     throw new Error('Failed to search people');
184
     throw new Error('Failed to search people');