feat: complete store locator implementation (Phases 1-3) #53

Merged
jmiller merged 6 commits from fix/rename-src-to-source-v2 into main 2026-06-23 16:10:29 +00:00
Owner

Summary

Completes the core store locator implementation across three phases, taking the extension from scaffolding stubs to a fully functional Joomla 4/5 store locator package.

Phase 1: Admin CRUD (c415d48)

  • LocationController (FormController) for save/cancel/apply
  • LocationsController (AdminController) for bulk publish/unpublish/delete
  • Location edit view with tabbed form (Details, Address, Contact)
  • Admin list renders data rows with edit links and published toggle
  • LocationTable::check() — title validation, auto-alias, lat/lng range, timestamps
  • LocationsModel::populateState() with search/published filters and ordering
  • filter_locations.xml with search tools bar
  • Closes #32, Filter XML forms for admin list sidebar (#33)

Phase 2: Site Frontend (4b37489)

  • Site DisplayController, LocationsModel (search/city/state filters), LocationModel
  • Locations list and detail templates with Schema.org LocalBusiness markup
  • SEF URL Router with menu/standard/nomenu rules
  • Menu item types: "All Locations" list and "Location Detail" picker
  • Site language strings
  • Addresses #50

Phase 3: Map & Search Modules (4894a70)

  • Map dispatcher loads published locations with coordinates from DB
  • Leaflet.js + OpenStreetMap tiles with markers, popups, auto-fit bounds
  • Leaflet CSS/JS via Joomla Web Asset Manager
  • Search dispatcher loads distinct cities/states for dropdown filters
  • City dropdown, radius dropdown, geolocation "Use My Location" button
  • Hidden lat/lng fields for proximity search passthrough
  • Addresses #51, #3, #35

Also includes

  • source/ directory rename from src/ (6d7838a)
  • MokoSuite naming update in README
  • Makefile removed (no longer used)
  • .gitignore fix for source/packages/*/site/

What's NOT in this PR (Phase 4+)

  • Proximity/Haversine distance filtering (lat/lng passed but not filtered)
  • Marker clustering (Leaflet.markercluster)
  • ACL permissions (#30), SQL update schema (#31), XSS audit (#34)
  • Multi-category (#1), custom markers (#2), REST API (#29), Shop integration (#48)

Test Plan

  • Package installs cleanly on Joomla 4.4+ / 5.x
  • Admin: create, edit, publish, unpublish, delete locations
  • Admin: search/filter/sort in locations list
  • Site: locations list view renders with pagination
  • Site: location detail view shows full info with Schema.org markup
  • Site: SEF URLs work via menu items
  • Map module: Leaflet map renders with markers and popups
  • Search module: city dropdown populated, radius options display
  • Search module: geolocation button sets lat/lng fields
  • Search form submits to component locations view with filters
## Summary Completes the core store locator implementation across three phases, taking the extension from scaffolding stubs to a fully functional Joomla 4/5 store locator package. ### Phase 1: Admin CRUD (`c415d48`) - `LocationController` (FormController) for save/cancel/apply - `LocationsController` (AdminController) for bulk publish/unpublish/delete - Location edit view with tabbed form (Details, Address, Contact) - Admin list renders data rows with edit links and published toggle - `LocationTable::check()` — title validation, auto-alias, lat/lng range, timestamps - `LocationsModel::populateState()` with search/published filters and ordering - `filter_locations.xml` with search tools bar - Closes #32, #33 ### Phase 2: Site Frontend (`4b37489`) - Site DisplayController, LocationsModel (search/city/state filters), LocationModel - Locations list and detail templates with Schema.org `LocalBusiness` markup - SEF URL Router with menu/standard/nomenu rules - Menu item types: "All Locations" list and "Location Detail" picker - Site language strings - Addresses #50 ### Phase 3: Map & Search Modules (`4894a70`) - Map dispatcher loads published locations with coordinates from DB - Leaflet.js + OpenStreetMap tiles with markers, popups, auto-fit bounds - Leaflet CSS/JS via Joomla Web Asset Manager - Search dispatcher loads distinct cities/states for dropdown filters - City dropdown, radius dropdown, geolocation "Use My Location" button - Hidden lat/lng fields for proximity search passthrough - Addresses #51, #3, #35 ### Also includes - `source/` directory rename from `src/` (`6d7838a`) - MokoSuite naming update in README - Makefile removed (no longer used) - `.gitignore` fix for `source/packages/*/site/` ## What's NOT in this PR (Phase 4+) - Proximity/Haversine distance filtering (lat/lng passed but not filtered) - Marker clustering (Leaflet.markercluster) - ACL permissions (#30), SQL update schema (#31), XSS audit (#34) - Multi-category (#1), custom markers (#2), REST API (#29), Shop integration (#48) ## Test Plan - [ ] Package installs cleanly on Joomla 4.4+ / 5.x - [ ] Admin: create, edit, publish, unpublish, delete locations - [ ] Admin: search/filter/sort in locations list - [ ] Site: locations list view renders with pagination - [ ] Site: location detail view shows full info with Schema.org markup - [ ] Site: SEF URLs work via menu items - [ ] Map module: Leaflet map renders with markers and popups - [ ] Search module: city dropdown populated, radius options display - [ ] Search module: geolocation button sets lat/lng fields - [ ] Search form submits to component locations view with filters
jmiller added 4 commits 2026-06-23 15:58:09 +00:00
Add full admin editing capability for store locations:
- LocationController (FormController) for save/cancel/apply
- LocationsController (AdminController) for bulk publish/unpublish/delete
- Location edit view with tabbed form (Details, Address, Contact)
- Admin list renders data rows with edit links and published toggle
- LocationTable::check() validates title, auto-alias, lat/lng, timestamps
- LocationsModel with populateState(), search/published filters, ordering
- filter_locations.xml with search tools bar
- Language strings for filters, sort options, save messages

Also includes MokoSuite-renamed package scaffolding (source/packages/).
Removes unused Makefile.

Closes #32 — populateState for filter persistence
Closes #33 — filter XML forms for admin list

Authored-by: Moko Consulting
Build the complete public-facing frontend for the store locator:
- Site DisplayController routing to list and detail views
- LocationsModel with search, city, and state filters (published only)
- LocationModel for single location by ID
- Locations list template with Schema.org LocalBusiness markup
- Location detail template with address, contact, hours, map placeholder
- SEF URL router with menu/standard/nomenu rules
- Menu item types: "All Locations" list and "Location Detail" picker
- Site language strings for views and menu items
- Router wired into component extension class and service provider
- .gitignore exception for source/packages/*/site/

Addresses #50

Authored-by: Moko Consulting
Rename from MokoJoomStoreLocator to MokoSuiteStoreLocator, update
package element names, add implemented vs planned feature sections,
add development instructions.

Authored-by: Moko Consulting
feat: wire up map and search modules with Leaflet and geolocation (Phase 3)
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Generic: Project CI / Tests (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Blocked by required conditions
Joomla: Extension CI / PHPStan Analysis (pull_request) Blocked by required conditions
Universal: PR Check / Build RC Package (pull_request) Blocked by required conditions
Universal: PR Check / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Report Issues (pull_request) Blocked by required conditions
Universal: PR Check / Branch Policy (pull_request) Failing after 2s
Universal: Build & Release / Promote to RC (pull_request) Failing after 7s
Universal: Build & Release / Build & Release Pipeline (pull_request) Has been skipped
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 7s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 6s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 7s
Generic: Repo Health / Access control (pull_request) Successful in 2s
Universal: PR Check / Validate PR (pull_request) Failing after 6s
Generic: Project CI / Lint & Validate (pull_request) Successful in 27s
4894a703c2
Map module:
- Dispatcher queries published locations with coordinates from DB
- Leaflet.js + OpenStreetMap tile layer integration
- Markers with popup info (name, address, phone)
- Auto-fit bounds to show all markers
- Leaflet CSS/JS via Joomla Web Asset Manager

Search module:
- Dispatcher loads distinct cities/states for dropdown filters
- Builds radius options from module params
- City dropdown filter (toggled by show_city_filter param)
- Radius dropdown with configurable values and unit (miles/km)
- Geolocation "Use My Location" button via browser API
- Hidden lat/lng fields for proximity search passthrough
- New language strings for all search UI elements

Both dispatchers now implement DatabaseAwareInterface for DB access.

Addresses #51, #3, #35

Authored-by: Moko Consulting
jmiller added 1 commit 2026-06-23 16:02:34 +00:00
chore: fix script.php location, update README and changelog for release
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Project CI / Tests (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Blocked by required conditions
Joomla: Extension CI / PHPStan Analysis (pull_request) Blocked by required conditions
Universal: PR Check / Build RC Package (pull_request) Blocked by required conditions
Universal: PR Check / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 2s
Universal: PR Check / Branch Policy (pull_request) Failing after 1s
Generic: Repo Health / Access control (pull_request) Successful in 1s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 4s
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 4s
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 5s
Universal: PR Check / Validate PR (pull_request) Failing after 4s
Generic: Project CI / Lint & Validate (pull_request) Successful in 33s
f73e536d05
- Move script.php to source/ (alongside package manifest) with MokoSuite naming
- Update README: map and search now listed as implemented, not planned
- Set changelog version to 1.0.0

Authored-by: Moko Consulting
jmiller added 1 commit 2026-06-23 16:08:52 +00:00
fix: code review fixes, Joomla 5/6 compat, XSS prevention
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Project CI / Tests (pull_request) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Blocked by required conditions
Joomla: Extension CI / PHPStan Analysis (pull_request) Blocked by required conditions
Generic: Repo Health / Access control (push) Successful in 2s
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Access control (pull_request) Successful in 3s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 8s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 7s
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 9s
Generic: Project CI / Lint & Validate (pull_request) Successful in 34s
Universal: Build & Release / Promote to RC (pull_request) Has been skipped
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Branch Cleanup / Delete merged branch (pull_request) Successful in 2s
Universal: Workflow Sync Trigger / Sync workflows to live repos (pull_request) Failing after 3s
Universal: Build & Release / Build & Release Pipeline (pull_request) Failing after 10s
e26d0ed400
Security:
- Fix stored XSS in Leaflet popup — HTML-escape loc.title/address/phone
- Use HTMLHelper::_('content.prepare') for description output

Joomla 5/6 compatibility:
- Bump PHP minimum to 8.2, Joomla minimum to 5.0.0
- script.php implements InstallerScriptInterface with typed signatures
- Restore updateservers and dlid in package manifest
- Update all manifest creationDates to 2026-06-23

Code quality:
- Replace hard-coded English errors with Text::_() language strings
- Add COM_MOKOJOOMSTORELOCATOR_ERROR_* language keys
- Use Text::_() for Locations list toolbar title
- Import missing Text class in LocationTable and Locations HtmlView

Documentation:
- Update CLAUDE.md: MokoSuite naming, source/ paths, PHP 8.2, namespace
- Update README: Joomla 5/6, PHP 8.2+, MySQL 8.0+

Authored-by: Moko Consulting
jmiller merged commit d3e73a0ea4 into main 2026-06-23 16:10:29 +00:00
jmiller deleted branch fix/rename-src-to-source-v2 2026-06-23 16:10:30 +00:00
Sign in to join this conversation.