

Project Dashboard
Key Features
Dual-View Scannability
A dedicated sidebar lists every project alongside the map, providing a quick overview of funding levels and priority tiers without losing your place on the map.
Synchronized Filtering
Filter by project mode or priority tier to update both the map and the sidebar list simultaneously, keeping the dashboard focused.
High-Performance Mapping
We use the lightweight Leaflet library and optimized GeoJSON formats to ensure maps load rapidly on any connection, making GIS data truly accessible.
Comprehensive Global Search
Our "wild search" functionality scans project names, IDs, locations, and even staff notes to retrieve specific information in seconds.
Dynamic Map Synchronization
Clicking any project in the sidebar triggers an automatic zoom-to-location on the map, providing instant geographic context for every entry.
On-Map Insights
Click any feature on the map to trigger a clear popup containing essential project details
Deep-Dive Profiles
A single click opens a comprehensive individual project page, including the full scope of work, funding history, and detailed staff observations.
Priority-Based Visuals
All map features are color-coded based on project priority, allowing you to identify the most urgent community needs at a glance.
Community Amplification
Turn a project into a conversation. Integrated social sharing tools for each project allow you to move the discussion to LinkedIn, Facebook, or X, increasing local awareness and impact.ommunity dialogue is never delayed by a back-end queue.
Project Dashboard
Tech Notes
Implementation Resources
-
Platform: Wix
-
Live Demo: https://www.planning.community/projectdashboarddemo
-
Source Code (GitHub):
Architectural Overview: Bidirectional Leaflet.js Integration (Wix Velo)
This implementation utilizes a decoupled architecture to integrate a Leaflet.js mapping engine within a Wix Velo environment. The system relies on an asynchronous, event-driven communication bridge (via the postMessage API) to synchronize the Wix UI state (Repeaters and Filters) with a custom HTML5 iFrame.
1. The View Layer (HTML/Leaflet iFrame)
The iFrame acts as a specialized renderer for GeoJSON data. It is state-neutral until it receives an array of features from the parent window.
-
Rendering Engine: Uses Leaflet 1.9.4 with CARTO Voyager tiles.
-
Styling Logic: Implements a conditional style-override function (getFeatureColor). It prioritizes business logic (hardcoded Tier 3/4 colors) over raw database values to ensure visual consistency.
-
Feature Handling: * Supports polymorphic geometries (Point, LineString, Polygon).
-
Point geometries are rendered as L.circleMarker for performance.
-
Non-Point geometries use flyToBounds for spatial fitting.
-
-
Dynamic Legend: On every data update, the script iterates through the current feature set to rebuild the legend UI, ensuring the map key always reflects filtered data.
2. The Controller Layer (Wix Velo Page Code)
The Wix side manages data orchestration, state filtering, and data normalization.
-
Data Aggregation: Queries the ProjectTracker collection. It performs dual-action filtering: updating the local dataset1 (for the Repeater UI) and a raw wixData.query (for the Map).
-
Normalization Pipeline (sendDataToMap): The database stores GeoJSON as a stringified object.
-
The controller parses this string, extracts the geometry, and attaches relevant metadata (ID, title, priority, cost) to the properties object of a standard GeoJSON Feature.
-
-
Input Debouncing: Implements a 500ms debounce on the search input to mitigate redundant API calls and UI jitter during rapid text entry.
3. State Management & Interaction
-
Selection Feedback: The highlightRepeaterItem function provides visual confirmation by cycling the background color of the active Repeater item while resetting non-active siblings.
-
Navigation Flow: Note that navigation is proxied through the parent window. Since the iFrame is sandboxed, it cannot trigger top-level window redirects directly; it must request the parent to execute wix-location commands.
Technical Constraints & Error Handling
-
Validation: The GeoJSON parser includes try/catch blocks to prevent malformed database entries from breaking the Leaflet render cycle.
-
Scale: The queries are currently capped at a limit(1000) per the applyFilters logic. If the collection grows beyond this, we will need to implement server-side clustering or bounding-box-based queries.
Layout Dimensions and Component Control Logic
1. Global Layout Architecture
The application follows a "Full-Height" viewport strategy to eliminate redundant scrollbars and maintain a persistent dashboard feel.
-
Navigation Header: Fixed height of 70px.
-
Main Application Section: Calculated height using 100vh - 70px.
-
Overflow Control: The parent section is set to hidden to allow internal scrolling only within the project list container.
2. Grid System Definitions (Application Container)
The core application utilizes a 2-Row by 2-Column CSS Grid layout immediately following the header:
-
Row 1 (Header), 72px, Reserved for the Filter Bar (Global search and dropdowns).
-
Row 2 (Content), auto (Flex-grow), Houses the Map (Left) and the Project List (Right).
-
Column 1 (Left), 1.2fr, Primary viewport for the Leaflet iFrame.
-
Column 2 (Right), min: 480px / max: 500px, Sidebar for the Project Repeater.
3. Repeater & List Header Specifications
To maintain strict alignment between the List Header (Static Container) and the Repeater Items (Dynamic Rows), both utilize a 4-column sub-grid for "Cell" distribution:
-
Col 1 (Project Name): auto (Fill remaining space)
-
Col 2 (Priority): 60px
-
Col 3 (Est. Cost): 90px
-
Col 4 (Action/Button): 40px
Note: These widths are applied to both the #headerContainer and the #boxContainer within the repeater to ensure column headers align perfectly with data rows.
4. Component Control Logic (Wix-Velo Bridge)
While the dropdowns and search inputs are native Wix UI components, they are decoupled from standard dataset behaviors to facilitate the bidirectional map sync.
-
Interaction Model: Dropdowns (#dropdownMode, #dropdownPriority) and the search input do not connect via the Wix "Connect to Data" UI panel.
-
Event Handling: All changes trigger the applyFilters() function in the page code.
-
Downstream Effects: 1. Repeater Update: Triggers DATASET.setFilter(). 2. Map Update: Simultaneously executes a wixData.query() to push a fresh GeoJSON payload to the iFrame via postMessage.
