diff --git a/Dubai_DLD_Properties_API_Complete.postman_collection.json b/Dubai_DLD_Properties_API_Complete.postman_collection.json new file mode 100644 index 0000000..4035182 --- /dev/null +++ b/Dubai_DLD_Properties_API_Complete.postman_collection.json @@ -0,0 +1,1144 @@ +{ + "info": { + "_postman_id": "dubai-dld-properties-api-v1", + "name": "Dubai DLD Properties API - Complete Collection", + "description": "Comprehensive Postman collection for Dubai DLD Analytics API including the new unified Properties endpoint and all existing endpoints.\n\n## New Endpoint\n- **Properties Recent**: Unified endpoint for both rent and sale queries (`/api/properties/recent`)\n\n## Features\n- Natural Language Query Processing\n- Transaction & Rental Filtering\n- Property Search (Rent/Sale)\n- Analytics & Reporting\n- Database Information", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "dubai-dld-api" + }, + "item": [ + { + "name": "🏘️ Properties (Unified Endpoint)", + "item": [ + { + "name": "Get All Properties - Rent", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=rent&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "rent", + "description": "Property type: rent or sale" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get all rental properties with pagination" + }, + "response": [] + }, + { + "name": "Get All Properties - Sale", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=sale&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "sale" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get all sale/transaction properties with pagination" + }, + "response": [] + }, + { + "name": "Rent - Filter by Area", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=rent&area_name=business+bay&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "rent" + }, + { + "key": "area_name", + "value": "business bay", + "description": "Case-insensitive partial match" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get rental properties in Business Bay area" + }, + "response": [] + }, + { + "name": "Sale - Filter by Area", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=sale&area_name=dubai+marina&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "sale" + }, + { + "key": "area_name", + "value": "dubai marina" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get sale properties in Dubai Marina area" + }, + "response": [] + }, + { + "name": "Rent - Filter by Property Type", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=rent&property_type=apartment&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "rent" + }, + { + "key": "property_type", + "value": "apartment" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get rental apartments" + }, + "response": [] + }, + { + "name": "Sale - Filter by Property Type", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=sale&property_type=villa&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "sale" + }, + { + "key": "property_type", + "value": "villa" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get sale villas" + }, + "response": [] + }, + { + "name": "Rent - Filter by Rooms", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=rent&rooms=2.0&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "rent" + }, + { + "key": "rooms", + "value": "2.0", + "description": "Decimal value: 1.0, 2.0, 3.0, etc." + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get 2-bedroom rental properties" + }, + "response": [] + }, + { + "name": "Sale - Filter by Bedrooms", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=sale&beds=3&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "sale" + }, + { + "key": "beds", + "value": "3", + "description": "String format: '3', 'studio', '3 b/r', etc." + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get 3-bedroom sale properties (can also use 'rooms' parameter)" + }, + "response": [] + }, + { + "name": "Sale - Filter by Studio", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=sale&beds=studio&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "sale" + }, + { + "key": "beds", + "value": "studio" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get studio sale properties" + }, + "response": [] + }, + { + "name": "Rent - Filter by Size Range", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=rent&size_min=1000&size_max=2000&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "rent" + }, + { + "key": "size_min", + "value": "1000", + "description": "Minimum area in sq. ft" + }, + { + "key": "size_max", + "value": "2000", + "description": "Maximum area in sq. ft" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get rental properties between 1000-2000 sq. ft" + }, + "response": [] + }, + { + "name": "Sale - Filter by Size Range", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=sale&size_min=1500&size_max=3000&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "sale" + }, + { + "key": "size_min", + "value": "1500" + }, + { + "key": "size_max", + "value": "3000" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get sale properties between 1500-3000 sq. ft" + }, + "response": [] + }, + { + "name": "Sale - Legacy Size Parameter", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=sale&size=2500&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "sale" + }, + { + "key": "size", + "value": "2500", + "description": "Legacy parameter: upper bound for area (only for sale)" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get sale properties with size <= 2500 sq. ft (legacy size parameter)" + }, + "response": [] + }, + { + "name": "Rent - Filter by Project", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=rent&project=emaar&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "rent" + }, + { + "key": "project", + "value": "emaar", + "description": "Case-insensitive partial match" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get rental properties in Emaar projects" + }, + "response": [] + }, + { + "name": "Sale - Filter by Project", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=sale&project=dubai+marina&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "sale" + }, + { + "key": "project", + "value": "dubai marina" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get sale properties in Dubai Marina projects" + }, + "response": [] + }, + { + "name": "Rent - Combined Filters", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=rent&area_name=business+bay&property_type=apartment&rooms=2.0&size_min=1000&size_max=1500&page=1&page_size=20", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "rent" + }, + { + "key": "area_name", + "value": "business bay" + }, + { + "key": "property_type", + "value": "apartment" + }, + { + "key": "rooms", + "value": "2.0" + }, + { + "key": "size_min", + "value": "1000" + }, + { + "key": "size_max", + "value": "1500" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "20" + } + ] + }, + "description": "Get 2-bedroom apartments for rent in Business Bay, 1000-1500 sq. ft" + }, + "response": [] + }, + { + "name": "Sale - Combined Filters", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=sale&area_name=dubai+marina&property_type=villa&beds=3&size_min=2000&size_max=3000&project=emaar&page=1&page_size=20", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "sale" + }, + { + "key": "area_name", + "value": "dubai marina" + }, + { + "key": "property_type", + "value": "villa" + }, + { + "key": "beds", + "value": "3" + }, + { + "key": "size_min", + "value": "2000" + }, + { + "key": "size_max", + "value": "3000" + }, + { + "key": "project", + "value": "emaar" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "20" + } + ] + }, + "description": "Get 3-bedroom villas for sale in Dubai Marina, 2000-3000 sq. ft, Emaar projects" + }, + "response": [] + }, + { + "name": "Rent - Simple Limit", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=rent&limit=10", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "rent" + }, + { + "key": "limit", + "value": "10", + "description": "Legacy limit parameter (no pagination metadata)" + } + ] + }, + "description": "Get first 10 rental properties (legacy limit)" + }, + "response": [] + }, + { + "name": "Sale - Simple Limit", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=sale&limit=50", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "sale" + }, + { + "key": "limit", + "value": "50" + } + ] + }, + "description": "Get first 50 sale properties (legacy limit)" + }, + "response": [] + }, + { + "name": "Rent - Pagination Page 2", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=rent&page=2&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "rent" + }, + { + "key": "page", + "value": "2" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "Get second page of rental properties" + }, + "response": [] + }, + { + "name": "Error - Missing Type Parameter", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "This should return 400 error - type parameter is required" + }, + "response": [] + }, + { + "name": "Error - Invalid Type", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/properties/recent?type=invalid&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "properties", "recent"], + "query": [ + { + "key": "type", + "value": "invalid" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + }, + "description": "This should return 400 error - type must be 'rent' or 'sale'" + }, + "response": [] + } + ] + }, + { + "name": "🏢 Transactions", + "item": [ + { + "name": "Get Recent Transactions", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/transactions/recent?page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "transactions", "recent"], + "query": [ + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + } + }, + "response": [] + }, + { + "name": "Filter by Area", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/transactions/recent?area_name=business+bay&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "transactions", "recent"], + "query": [ + { + "key": "area_name", + "value": "business bay" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + } + }, + "response": [] + }, + { + "name": "Filter by Property Type and Beds", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/transactions/recent?property_type=apartment&beds=3&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "transactions", "recent"], + "query": [ + { + "key": "property_type", + "value": "apartment" + }, + { + "key": "beds", + "value": "3" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "🏠 Rents", + "item": [ + { + "name": "Get Recent Rents", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/rents/recent?page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "rents", "recent"], + "query": [ + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + } + }, + "response": [] + }, + { + "name": "Filter by Area and Rooms", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/rents/recent?area_name=dubai+marina&rooms=2.0&page=1&page_size=30", + "host": ["{{baseUrl}}"], + "path": ["api", "rents", "recent"], + "query": [ + { + "key": "area_name", + "value": "dubai marina" + }, + { + "key": "rooms", + "value": "2.0" + }, + { + "key": "page", + "value": "1" + }, + { + "key": "page_size", + "value": "30" + } + ] + } + }, + "response": [] + } + ] + }, + { + "name": "🤖 Natural Language Queries", + "item": [ + { + "name": "Rental Price Trend", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"query\": \"Give me the last 6 months rental price trend for Business Bay\",\n \"sessionId\": \"test-session-123\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/query", + "host": ["{{baseUrl}}"], + "path": ["api", "query"] + }, + "description": "Natural language query for rental price trends" + }, + "response": [] + }, + { + "name": "Top Areas for Rental Transactions", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"query\": \"Which area is having more rental transactions?\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/query", + "host": ["{{baseUrl}}"], + "path": ["api", "query"] + } + }, + "response": [] + }, + { + "name": "Commercial Leasing", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"query\": \"Top 5 areas for Commercial leasing and why?\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/query", + "host": ["{{baseUrl}}"], + "path": ["api", "query"] + } + }, + "response": [] + }, + { + "name": "Average Price 3BHK", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"query\": \"Avg price of 3BHK apartment by area in last 6 months, group it by month. Show top 5 areas only.\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/api/query", + "host": ["{{baseUrl}}"], + "path": ["api", "query"] + } + }, + "response": [] + } + ] + }, + { + "name": "📊 Predefined Analytics", + "item": [ + { + "name": "Rental Trend by Area", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/queries/rental-trend/business-bay", + "host": ["{{baseUrl}}"], + "path": ["api", "queries", "rental-trend", "business-bay"] + } + }, + "response": [] + }, + { + "name": "Top Areas", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/queries/top-areas", + "host": ["{{baseUrl}}"], + "path": ["api", "queries", "top-areas"] + } + }, + "response": [] + }, + { + "name": "Commercial Leasing", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/queries/commercial-leasing", + "host": ["{{baseUrl}}"], + "path": ["api", "queries", "commercial-leasing"] + } + }, + "response": [] + }, + { + "name": "Residential Leasing", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/queries/residential-leasing", + "host": ["{{baseUrl}}"], + "path": ["api", "queries", "residential-leasing"] + } + }, + "response": [] + }, + { + "name": "Fast Moving Projects", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/queries/fast-moving-projects", + "host": ["{{baseUrl}}"], + "path": ["api", "queries", "fast-moving-projects"] + } + }, + "response": [] + }, + { + "name": "Off-Plan Uptick", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/queries/offplan-uptick", + "host": ["{{baseUrl}}"], + "path": ["api", "queries", "offplan-uptick"] + } + }, + "response": [] + }, + { + "name": "Project Summary", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/queries/project-summary", + "host": ["{{baseUrl}}"], + "path": ["api", "queries", "project-summary"] + } + }, + "response": [] + }, + { + "name": "Project Summary Detail", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/queries/project-summary-detail", + "host": ["{{baseUrl}}"], + "path": ["api", "queries", "project-summary-detail"] + } + }, + "response": [] + } + ] + }, + { + "name": "🔧 System & Info", + "item": [ + { + "name": "Health Check", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/health", + "host": ["{{baseUrl}}"], + "path": ["health"] + }, + "description": "Check if the API server is running" + }, + "response": [] + }, + { + "name": "Database Info", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/database/info", + "host": ["{{baseUrl}}"], + "path": ["api", "database", "info"] + }, + "description": "Get database table information and record counts" + }, + "response": [] + }, + { + "name": "Available Queries", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/api/queries/available", + "host": ["{{baseUrl}}"], + "path": ["api", "queries", "available"] + }, + "description": "List all available query endpoints and examples" + }, + "response": [] + } + ] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "baseUrl", + "value": "http://localhost:3000", + "type": "string" + } + ] +} + diff --git a/public/js/properties.js b/public/js/properties.js new file mode 100644 index 0000000..02c3f29 --- /dev/null +++ b/public/js/properties.js @@ -0,0 +1,539 @@ +// Properties page logic for unified rent/sale endpoint + +const API_BASE = '/api'; + +// Combined area dropdown values (from both transactions and rents) +const areas = [ + 'abu hail', 'al athbah', 'al aweer first', 'al aweer second', 'al bada', 'al baraha', + 'al barari', 'al barsha first', 'al barsha second', 'al barsha third', 'al barshaa south first', + 'al barshaa south second', 'al barshaa south third', 'al buteen', 'al dhagaya', 'al eyas', + 'al furjan', 'al garhoud', 'al goze first', 'al goze fourth', 'al goze industrial first', + 'al goze industrial fourth', 'al goze industrial second', 'al goze industrial third', 'al goze third', + 'al hamriya', 'al hebiah fifth', 'al hebiah first', 'al hebiah fourth', 'al hebiah sixth', + 'al hebiah third', 'al hudaiba', 'al jadaf', 'al jafliya', 'al karama', 'al khabeesi', + 'al khail heights', 'al khairan first', 'al khawaneej first', 'al khawaneej second', 'al kheeran', + 'al kifaf', 'al lusaily', 'al mamzer', 'al manara', 'al mararr', 'al merkadh', + 'al mizhar first', 'al mizhar fourth', 'al mizhar second', 'al mizhar third', 'al murqabat', + 'al muteena', 'al nahda first', 'al nahda second', 'al qusais', 'al qusais industrial fifth', + 'al qusais industrial first', 'al qusais industrial fourth', 'al qusais industrial third', 'al raffa', + 'al ras', 'al rashidiya', 'al rega', 'al rowaiyah third', 'al saffa first', 'al saffa second', + 'al safouh first', 'al satwa', 'al suq al kabeer', 'al thanyah fifth', 'al thanyah third', + 'al ttay', 'al twar fifth', 'al twar first', 'al twar fourth', 'al twar second', 'al twar third', + 'al waha', 'al waheda', 'al warqa first', 'al warqa fourth', 'al warqa second', 'al warqa third', + 'al warsan second', 'al warsan third', 'al wasl', 'al yelayiss 1', 'al yelayiss 2', 'al yelayiss 5', + 'al yufrah 1', 'arabian ranches i', 'arabian ranches ii', 'arabian ranches iii', + 'arabian ranches polo club', 'arjan', 'barsha heights', 'bluewaters', 'bukadra', 'burj khalifa', + 'business bay', 'business park', 'cherrywoods', 'city of arabia', 'city walk', 'damac hills', + 'discovery gardens', 'dmcc-ez2', 'down town jabal ali', 'dubai creek harbour', 'dubai design district', + 'dubai golf city', 'dubai harbour', 'dubai healthcare city - phase 1', 'dubai healthcare city - phase 2', + 'dubai hills', 'dubai industrial city', 'dubai international airport', 'dubai investment park first', + 'dubai investment park second', 'dubai land residence complex', 'dubai lifestyle city', 'dubai marina', + 'dubai maritime city', 'dubai production city', 'dubai science park', 'dubai south', 'dubai sports city', + 'dubai studio city', 'dubai water canal', 'dubai water front', 'emaar south', 'emirate living', + 'eyal nasser', 'falcon city of wonders', 'ghadeer al tair', 'ghadeer barashy', 'grand hills dubai', + 'grand views', 'hadaeq sheikh mohammed bin rashid', 'hessyan second', 'hor al anz', 'hor al anz east', + 'horizon', 'international city ph 1', 'international city ph 2 & 3', 'island 2', 'jabal ali first', + 'jabal ali industrial first', 'jabal ali industrial second', 'jabel ali hills', 'jaddaf waterfront', + 'jumeira bay', 'jumeirah beach residence', 'jumeirah first', 'jumeirah golf', 'jumeirah heights', + 'jumeirah islands', 'jumeirah lakes towers', 'jumeirah living', 'jumeirah park', 'jumeirah second', + 'jumeirah third', 'jumeirah village circle', 'jumeirah village triangle', 'la mer', 'lehbab first', + 'lehbab second', 'living legends', 'liwan', 'liwan 2', 'madinat al mataar', 'madinat dubai almelaheyah', + 'madinat hind 3', 'madinat hind 4', 'madinat latifa', 'majan', 'mankhool', 'margham', 'marsa dubai', + 'mbr district 1', 'mbr district 7', "me'aisem first", "me'aisem second", 'medyan race course villas', + 'mena jabal ali', 'meydan avenue', 'meydan one', 'millennium', 'mina rashid', 'mira', 'mirdif', + 'motor city', 'mudon', 'muhaisanah first', 'muhaisanah fourth', 'muhaisanah second', 'muhaisanah third', + 'mushrif', 'nad al hamar', 'nad al sheba gardens', 'nad al shiba first', 'nad al shiba fourth', + 'nad al shiba second', 'nad al shiba third', 'nad shamma', 'nadd hessa', 'naif', 'nazwah', 'oud metha', + 'palm deira', 'palm jabal ali', 'palm jumeirah', 'palmarosa', 'pearl jumeira', 'polo townhouses igo', + 'port saeed', 'ras al khor', 'ras al khor industrial first', 'ras al khor industrial second', + 'ras al khor industrial third', 'rega al buteen', 'remraam', 'rukan', 'saih shuaib 1', 'saih shuaib 2', + 'saih shuaib 3', 'saih shuaib 4', 'sama al jadaf', 'serena', 'silicon oasis', 'sobha heartland', + 'sufouh gardens', 'sustainable city', 'tecom site a', 'tecom site d', 'the beach', 'the field', + 'the greens', 'the lakes', 'the valley', 'the villa', 'the world', 'tilal al ghaf', 'town square', + 'trade center first', 'trade center second', 'um al sheif', 'um hurair first', 'um hurair second', + 'um ramool', 'um suqaim first', 'um suqaim second', 'um suqaim third', 'umm addamin', 'villanova', + 'wadi al amardi', 'wadi al safa 2', 'wadi al safa 3', 'wadi al safa 4', 'wadi al safa 5', + 'wadi al safa 6', 'wadi al safa 7', 'warsan first', 'warsan fourth', 'yaraah', 'zaabeel first', 'zaabeel second' +]; + +// Property types for rent +const rentPropertyTypes = [ + { value: 'all', label: 'All Types' }, + { value: 'unit', label: 'Unit' }, + { value: 'villa', label: 'Villa' }, + { value: 'virtual unit', label: 'Virtual Unit' }, + { value: 'land', label: 'Land' }, + { value: 'building', label: 'Building' } +]; + +// Property types for sale +const salePropertyTypes = [ + { value: 'all', label: 'All Types' }, + { value: 'building', label: 'Building' }, + { value: 'land', label: 'Land' }, + { value: 'unit', label: 'Unit' } +]; + +// Combined projects list (simplified - you may want to load dynamically) +const projects = [ + '014 tower', '08 life residences', '1 residences', '10 oxford by iman', '105 residences by kamdar', + '11 hills park', '15 cascade', '15 northside', '161 jumeirah lane', '17 icon bay', + '171 garden heights', '1wood residence', '2020 marquis', '23 marina', + '29 boulevard', '310 riverside crescent', '311 boulevard by bam eskan', + 'empire estates', 'empire heights', 'starz tower by danube', 'azizi feirouz i', + 'candace acacia hotel apartments', 'burj al nujoom', 'azizi riviera 35' + // Add more projects as needed +]; + +let currentType = 'rent'; +let currentPage = 1; +let lastPaging = { total: 0, page: null, page_size: 30, total_pages: 1, has_next: false, has_prev: false }; + +function populateAreas() { + const areaSelect = document.getElementById('area_name'); + areas.forEach(area => { + const option = document.createElement('option'); + option.value = area; + option.textContent = area.charAt(0).toUpperCase() + area.slice(1).replace(/\b\w/g, l => l.toUpperCase()); + areaSelect.appendChild(option); + }); +} + +function loadProjects() { + const projectSelect = document.getElementById('project'); + const sortedProjects = projects.slice().sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'base' })); + sortedProjects.forEach(project => { + const option = document.createElement('option'); + option.value = project; + option.textContent = project.length > 70 ? project.substring(0, 70) + '...' : project; + projectSelect.appendChild(option); + }); +} + +function updatePropertyTypes() { + const propertyTypeSelect = document.getElementById('property_type'); + propertyTypeSelect.innerHTML = ''; + + const types = currentType === 'rent' ? rentPropertyTypes : salePropertyTypes; + types.forEach(type => { + const option = document.createElement('option'); + option.value = type.value; + option.textContent = type.label; + propertyTypeSelect.appendChild(option); + }); +} + +function updateTypeDependentFields() { + const typeInput = document.getElementById('type'); + typeInput.value = currentType; + + // Show/hide rooms vs beds + const roomsGroup = document.getElementById('roomsGroup'); + const bedsGroup = document.getElementById('bedsGroup'); + + if (currentType === 'rent') { + roomsGroup.style.display = 'flex'; + bedsGroup.style.display = 'none'; + document.getElementById('beds').value = 'all'; + } else { + roomsGroup.style.display = 'none'; + bedsGroup.style.display = 'flex'; + document.getElementById('rooms').value = 'all'; + } + + updatePropertyTypes(); + updateTableHeaders(); +} + +function updateTableHeaders() { + const tableHead = document.getElementById('tableHead'); + + if (currentType === 'rent') { + tableHead.innerHTML = ` +
Filter and explore properties for rent or sale in Dubai
+