Skip to content

Search and analyze millions of government records. From procurement contracts to infrastructure projects, we make Philippine government data accessible and actionable.

License

Notifications You must be signed in to change notification settings

bettergovph/transparency-dashboard

Repository files navigation

PhilGEPS Contract Browser

A modern, responsive search interface for Philippine government procurement records built with Vite, React 19, TypeScript, Tailwind CSS v4, and MeiliSearch.

✨ Features

  • πŸ” Smart Search: Real-time full-text search across multiple fields with advanced query syntax
  • πŸ“Š Interactive Dashboard: Statistics, analytics, and visualizations for search results
  • πŸ—‚οΈ Entity Directories: Browse contractors, organizations, locations, and categories
  • πŸ“ˆ Data Insights: Charts and trends for procurement spending over time
  • 🎨 Modern UI/UX: Clean, professional design with responsive tables and mobile support
  • πŸ“± Mobile Responsive: Optimized for all screen sizes with touch-friendly interfaces
  • ⚑ Fast Performance: Powered by MeiliSearch for instant search results
  • πŸ”§ Advanced Filtering: Multi-select filters for areas, awardees, and organizations
  • πŸ“₯ CSV Export: Download search results for offline analysis

πŸ› οΈ Tech Stack

  • Frontend: Vite, React 19, TypeScript, React Router
  • Styling: Tailwind CSS v4, Figtree font, custom animations
  • Search Engine: MeiliSearch with instant search and filtering
  • UI Components: shadcn/ui (Radix UI primitives), Lucide React icons
  • Charts: Recharts for data visualization
  • SEO: React Helmet for meta tags
  • State Management: React hooks with debounced search
  • Data Processing: Python scripts with pandas and pyarrow

πŸš€ Quick Start

1. Clone and Install

git clone <repository-url>
cd philgeps
npm install

2. Environment Setup

Copy the environment example file and configure your settings:

cp .env.example .env

Edit .env with your configuration:

# MeiliSearch Configuration
VITE_MEILISEARCH_HOST=http://localhost:7700
VITE_MEILISEARCH_API_KEY=your_master_key_here
VITE_MEILISEARCH_INDEX_NAME=philgeps

# Application Configuration
VITE_APP_NAME=PHILGEPS Search
VITE_APP_DESCRIPTION=Government Procurement Search Platform

3. Start Development Server

npm run dev

Visit http://localhost:5173 to see your application running!

πŸ“‹ Search Fields

The application allows searching across these comprehensive fields:

  • reference_id - Reference ID
  • contract_no - Contract Number
  • award_title - Award Title
  • notice_title - Notice Title
  • awardee_name - Awardee Name
  • organization_name - Organization Name
  • area_of_delivery - Area of Delivery
  • business_category - Business Category
  • contract_amount - Contract Amount
  • award_date - Award Date
  • award_status - Award Status

🎯 Usage

Basic Search

  1. Type your search query in the main search bar
  2. Results appear instantly as you type with debounced search
  3. View contract details, amounts, and status information

Advanced Filtering

  1. Click the "Filters" button to open the filter panel
  2. Filter by business category (Construction, IT, Medical Equipment, etc.)
  3. Sort results by relevance, award date, or contract amount
  4. View real-time statistics and analytics

Features

  • Smart Search: Finds matches across all fields simultaneously
  • Category Icons: Visual indicators for different business categories
  • Currency Formatting: Philippine Peso (PHP) formatting for contract amounts
  • Date Formatting: Localized date display
  • Status Indicators: Color-coded award status badges
  • Responsive Cards: Hover effects and smooth transitions

πŸ”§ MeiliSearch Setup & Data Loading

For detailed instructions on downloading data, setting up MeiliSearch, and importing PhilGEPS data, see:

data/README.md

The data loading process includes:

  1. Downloading parquet files from Hugging Face
  2. Extracting data using DuckDB
  3. Importing main contract data into MeiliSearch
  4. Importing pre-aggregated filter data for efficient browsing

🎨 Customization

Styling

  • Edit src/index.css for global styles and animations
  • Modify tailwind.config.js for Tailwind CSS configuration
  • Update component styles in individual .tsx files

Components

  • Navigation: Main navigation with dropdown menus
  • EnhancedSearchInterface: Advanced search with filters, sorting, and pagination
  • Directory Pages: Contractors, Organizations, Locations, Categories list views
  • Detail Pages: Individual entity pages with statistics and charts
  • Footer: Site-wide footer component
  • SearchGuide: Interactive search syntax guide
  • UI Components: Reusable shadcn/ui components in src/components/ui/
  • ErrorBoundary: Error handling component
  • Types: TypeScript definitions in src/types/

Environment Variables

Variable Description Default
VITE_MEILISEARCH_HOST MeiliSearch server URL http://localhost:7700
VITE_MEILISEARCH_API_KEY MeiliSearch API key masterKey
VITE_MEILISEARCH_INDEX_NAME Search index name philgeps
VITE_APP_NAME Application name PHILGEPS Search
VITE_APP_DESCRIPTION App description Government Procurement Search Platform

πŸ§ͺ Development

Available Scripts

Development & Build

npm run dev      # Start development server
npm run build    # Build for production
npm run lint     # Run ESLint
npm run preview  # Preview production build

GAA Budget Data Pipeline

# Full pipeline: CSV β†’ Parquet β†’ Aggregates β†’ MeiliSearch
npm run gaa:pipeline

# Individual steps:
npm run gaa:csv-to-parquet      # Convert CSV files to Parquet
npm run gaa:create-aggregates   # Generate JSON aggregates
npm run gaa:import              # Import to MeiliSearch
npm run gaa:configure-search    # Configure MeiliSearch index

# Quick reload (skip CSV/aggregates):
npm run gaa:reload              # Re-import and configure search only

Sitemap Generation

npm run generate:sitemap             # Generate budget sitemap
npm run generate:sitemap:procurement # Generate procurement sitemap
npm run generate:sitemap:index       # Generate sitemap index
npm run generate:sitemaps:all        # Generate all sitemaps

Search & Data

npm run seed            # Seed MeiliSearch with sample data
npm run search:stats    # Display search statistics

Project Structure

philgeps/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ ui/                      # shadcn/ui components
β”‚   β”‚   β”‚   β”œβ”€β”€ autocomplete.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ button.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ card.tsx
β”‚   β”‚   β”‚   └── input.tsx
β”‚   β”‚   β”œβ”€β”€ AwardeePage.tsx          # Individual contractor detail page
β”‚   β”‚   β”œβ”€β”€ CategoriesListPage.tsx   # Categories directory
β”‚   β”‚   β”œβ”€β”€ CategoryPage.tsx         # Category detail page
β”‚   β”‚   β”œβ”€β”€ ContractorsPage.tsx      # Contractors directory
β”‚   β”‚   β”œβ”€β”€ EnhancedSearchInterface.tsx  # Main search interface
β”‚   β”‚   β”œβ”€β”€ ErrorBoundary.tsx        # Error handling
β”‚   β”‚   β”œβ”€β”€ Footer.tsx               # Site footer
β”‚   β”‚   β”œβ”€β”€ LocationPage.tsx         # Location detail page
β”‚   β”‚   β”œβ”€β”€ LocationsListPage.tsx    # Locations directory
β”‚   β”‚   β”œβ”€β”€ Navigation.tsx           # Main navigation
β”‚   β”‚   β”œβ”€β”€ OrganizationPage.tsx     # Organization detail page
β”‚   β”‚   β”œβ”€β”€ OrganizationsListPage.tsx # Organizations directory
β”‚   β”‚   └── SearchGuide.tsx          # Search syntax guide
β”‚   β”œβ”€β”€ lib/
β”‚   β”‚   β”œβ”€β”€ meilisearch.ts           # MeiliSearch client config
β”‚   β”‚   └── utils.ts                 # Utility functions
β”‚   β”œβ”€β”€ types/
β”‚   β”‚   └── search.ts                # TypeScript interfaces
β”‚   β”œβ”€β”€ App.tsx                      # Root component with routing
β”‚   β”œβ”€β”€ main.tsx                     # React 19 render root
β”‚   β”œβ”€β”€ index.css                    # Global styles
β”‚   └── App.css                      # Component styles
β”œβ”€β”€ data/
β”‚   β”œβ”€β”€ philgeps/
β”‚   β”‚   β”œβ”€β”€ import.py                # Main data import script
β”‚   β”‚   β”œβ”€β”€ import_extras.py         # Aggregated data import
β”‚   β”‚   β”œβ”€β”€ philgeps-extract.sql     # DuckDB extraction script
β”‚   β”‚   └── update_index.py          # Index update script
β”‚   β”œβ”€β”€ gaa/
β”‚   β”‚   └── import_gaa.py            # GAA data import
β”‚   β”œβ”€β”€ requirements.txt             # Python dependencies
β”‚   └── README.md                    # Data setup instructions
β”œβ”€β”€ .env.example                     # Environment variables example
β”œβ”€β”€ tailwind.config.js               # Tailwind CSS v4 config
β”œβ”€β”€ vite.config.ts                   # Vite configuration
β”œβ”€β”€ LICENSE                          # MIT License
└── README.md

πŸ› Error Handling

The application includes comprehensive error handling:

  • Error Boundary: Catches and displays React component errors
  • Search Error Handling: Graceful handling of MeiliSearch connection issues
  • Loading States: Smooth loading indicators during search operations
  • Network Error Recovery: Automatic retry mechanisms

πŸ“± Browser Support

  • Chrome (latest)
  • Firefox (latest)
  • Safari (latest)
  • Edge (latest)

πŸ“„ License

MIT License - see LICENSE file for details.

🀝 Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests if applicable
  5. Submit a pull request

πŸ“ž Support

For issues and questions:

  1. Check the MeiliSearch documentation
  2. Review the error messages in the browser console
  3. Verify your environment variables are correctly set
  4. Ensure MeiliSearch is running and accessible

Happy Searching! πŸ”

About

Search and analyze millions of government records. From procurement contracts to infrastructure projects, we make Philippine government data accessible and actionable.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published