wrd_drishti / src /pages /Repository.tsx
devarshia5's picture
Upload 30 files
523c564 verified
Raw
History Blame Contribute Delete
7.84 kB
import React, { useState } from 'react';
import { Card, CardContent } from '@/src/components/ui/Card';
import { Input } from '@/src/components/ui/Input';
import { Button } from '@/src/components/ui/Button';
import { Badge } from '@/src/components/ui/Badge';
import {
Search,
Filter,
FileText,
Download,
Eye,
MessageSquare,
Calendar,
Building
} from 'lucide-react';
import { useNavigate } from 'react-router-dom';
const documents = [
{
id: 'GR-2023-01',
title: 'Guidelines for Flood Management and Evacuation Procedures',
type: 'GR',
department: 'Disaster Management',
date: '2023-06-15',
summary: 'Comprehensive guidelines for district administrations regarding flood preparedness, evacuation protocols, and relief camp management.'
},
{
id: 'ACT-1976',
title: 'Maharashtra Irrigation Act, 1976',
type: 'Act',
department: 'Water Resources',
date: '1976-08-05',
summary: 'An Act to unify and amend the law relating to irrigation in the State of Maharashtra.'
},
{
id: 'CIR-2024-45',
title: 'Standard Operating Procedure for Dam Gate Operations during Monsoon',
type: 'Circular',
department: 'Water Resources',
date: '2024-05-10',
summary: 'Updated SOPs for dam engineers regarding phased water discharge and coordination with downstream authorities.'
},
{
id: 'GR-2022-89',
title: 'Compensation Policy for Crop Damage due to Floods',
type: 'GR',
department: 'Revenue & Forest',
date: '2022-09-22',
summary: 'Revised compensation rates and assessment methodology for agricultural losses caused by natural calamities including floods.'
},
{
id: 'ACT-2005',
title: 'Maharashtra Water Resources Regulatory Authority Act, 2005',
type: 'Act',
department: 'Water Resources',
date: '2005-05-04',
summary: 'Act to provide for the establishment of the Maharashtra Water Resources Regulatory Authority to regulate water resources within the State.'
},
];
export function Repository() {
const [searchQuery, setSearchQuery] = useState('');
const [activeFilter, setActiveFilter] = useState('All');
const navigate = useNavigate();
const filteredDocs = documents.filter(doc => {
const matchesSearch = doc.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
doc.id.toLowerCase().includes(searchQuery.toLowerCase());
const matchesFilter = activeFilter === 'All' || doc.type === activeFilter;
return matchesSearch && matchesFilter;
});
const handleAskAI = (docTitle: string) => {
navigate(`/ai-assistant?q=Summarize the key points of ${encodeURIComponent(docTitle)}`);
};
return (
<div className="space-y-6 max-w-6xl mx-auto">
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4">
<div>
<h1 className="text-2xl font-bold tracking-tight text-slate-900">Centralized Repository</h1>
<p className="text-slate-500">Search and access GRs, Acts, and Circulars</p>
</div>
<Button onClick={() => navigate('/ai-assistant')} className="bg-indigo-600 hover:bg-indigo-700 text-white">
<MessageSquare className="mr-2 h-4 w-4" />
Ask AI Assistant
</Button>
</div>
<Card className="border-none shadow-md bg-white/50 backdrop-blur-sm">
<CardContent className="p-4 sm:p-6">
<div className="flex flex-col sm:flex-row gap-4">
<div className="relative flex-1">
<Search className="absolute left-3 top-3 h-5 w-5 text-slate-400" />
<Input
type="text"
placeholder="Search by title, GR number, or keywords..."
className="pl-10 h-12 text-base bg-white"
value={searchQuery}
onChange={(e) => setSearchQuery(e.target.value)}
/>
</div>
<Button variant="outline" className="h-12 px-6 bg-white shrink-0">
<Filter className="mr-2 h-4 w-4" />
Advanced Filters
</Button>
</div>
<div className="flex flex-wrap gap-2 mt-4">
{['All', 'GR', 'Act', 'Circular'].map(filter => (
<Badge
key={filter}
variant={activeFilter === filter ? 'default' : 'secondary'}
className="cursor-pointer px-3 py-1 text-sm"
onClick={() => setActiveFilter(filter)}
>
{filter}
</Badge>
))}
</div>
</CardContent>
</Card>
<div className="space-y-4">
{filteredDocs.map((doc) => (
<Card key={doc.id} className="overflow-hidden transition-all hover:shadow-md border-slate-200">
<CardContent className="p-0">
<div className="flex flex-col sm:flex-row">
<div className="p-6 flex-1">
<div className="flex items-start justify-between">
<div>
<div className="flex items-center space-x-2 mb-2">
<Badge variant={
doc.type === 'GR' ? 'default' :
doc.type === 'Act' ? 'destructive' : 'secondary'
}>
{doc.type}
</Badge>
<span className="text-xs font-medium text-slate-500">{doc.id}</span>
</div>
<h3 className="text-lg font-semibold text-slate-900 mb-2 leading-tight">
{doc.title}
</h3>
<p className="text-sm text-slate-600 mb-4 line-clamp-2">
{doc.summary}
</p>
</div>
</div>
<div className="flex flex-wrap items-center gap-4 text-xs text-slate-500">
<div className="flex items-center">
<Building className="mr-1 h-3.5 w-3.5" />
{doc.department}
</div>
<div className="flex items-center">
<Calendar className="mr-1 h-3.5 w-3.5" />
{doc.date}
</div>
</div>
</div>
<div className="bg-slate-50 border-t sm:border-t-0 sm:border-l border-slate-100 p-4 sm:p-6 flex sm:flex-col items-center justify-center gap-3 sm:w-48">
<Button variant="outline" size="sm" className="w-full justify-start bg-white">
<Eye className="mr-2 h-4 w-4" /> View
</Button>
<Button variant="outline" size="sm" className="w-full justify-start bg-white">
<Download className="mr-2 h-4 w-4" /> Download
</Button>
<Button
variant="secondary"
size="sm"
className="w-full justify-start bg-indigo-50 text-indigo-700 hover:bg-indigo-100 border-indigo-100"
onClick={() => handleAskAI(doc.title)}
>
<MessageSquare className="mr-2 h-4 w-4" /> Ask AI
</Button>
</div>
</div>
</CardContent>
</Card>
))}
{filteredDocs.length === 0 && (
<div className="text-center py-12">
<FileText className="mx-auto h-12 w-12 text-slate-300 mb-4" />
<h3 className="text-lg font-medium text-slate-900">No documents found</h3>
<p className="text-slate-500">Try adjusting your search or filters.</p>
</div>
)}
</div>
</div>
);
}