Commit Graph

24 Commits

Author SHA1 Message Date
jmiller 5ffe3fbcf7 Merge pull request 'chore: cascade main → dev/initial-implementation (7607f9a) [skip ci]' (#40) from main into dev/initial-implementation
chore: cascade main → dev/initial-implementation [skip ci]
2026-05-24 04:10:00 +00:00
Moko Consulting 7607f9a90d chore: update CHANGELOG for deploy workflow removal
Universal: Cascade Main → Dev / Cascade main → branches (push) Successful in 3s
Joomla: Repo Health / Access control (push) Successful in 1s
Joomla: Repo Health / Release configuration (push) Has been cancelled
Joomla: Repo Health / Scripts governance (push) Has been cancelled
Joomla: Repo Health / Repository health (push) Has been cancelled
2026-05-24 04:09:53 +00:00
jmiller 71f9921a90 Merge pull request 'chore: cascade main → dev/initial-implementation (b796f69) [skip ci]' (#39) from main into dev/initial-implementation
chore: cascade main → dev/initial-implementation [skip ci]
2026-05-24 03:44:16 +00:00
jmiller b796f697e5 chore: remove deploy workflow — switching to Joomla update server method
Joomla: Repo Health / Access control (push) Successful in 2s
Universal: Cascade Main → Dev / Cascade main → branches (push) Successful in 4s
Joomla: Repo Health / Release configuration (push) Has been cancelled
Joomla: Repo Health / Scripts governance (push) Has been cancelled
Joomla: Repo Health / Repository health (push) Has been cancelled
2026-05-24 03:44:06 +00:00
jmiller 70797820e2 Merge pull request 'chore: cascade main → dev/initial-implementation (72fecbb) [skip ci]' (#37) from main into dev/initial-implementation
chore: cascade main → dev/initial-implementation [skip ci]
2026-05-23 22:34:50 +00:00
jmiller 72fecbb634 feat: initial implementation with manifest fixes (#36)
Universal: Cascade Main → Dev / Cascade main → branches (push) Successful in 2s
feat: initial implementation with manifest fixes

Squash merge of dev/initial-implementation into main.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-23 22:34:48 +00:00
Jonathan Miller db835482cd fix(manifest): hardcode name and description in all XML manifests
Universal: PR Check / Branch Policy (pull_request) Successful in 1s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 3s
Universal: PR Check / Validate PR (pull_request) Failing after 3s
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 4s
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 5s
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Has been skipped
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Has been skipped
Joomla: Extension CI / PHPStan Analysis (pull_request) Has been skipped
Universal: Build & Release / Build & Release Pipeline (pull_request) Failing after 53s
Language variables in <name> and <description> don't resolve during
installation because language files aren't deployed yet. Fixed across
all 5 package sub-extensions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-23 16:57:29 -05:00
gitea-actions[bot] bab0d0a289 chore(version): bump 00.00.00 → 00.00.01 [skip ci] 2026-05-22 02:16:19 +00:00
Jonathan Miller 9a9534f0cf docs: update CHANGELOG with complete feature list and fix workflow YAML
Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 21:15:07 -05:00
Jonathan Miller 2c9a7683ba feat(production): fix all production gaps (#30-#35)
- access.xml with component and category ACL sections (#30)
- SQL update schema with versioned migrations for upgrades (#31)
- populateState() in LocationsModel for filter persistence (#32)
- Filter XML forms: filter_locations.xml, filter_categories.xml (#33)
- joomla.asset.json for Web Asset Manager (Leaflet, CSS) (#35)
- Note: XSS audit (#34) ongoing — escape() usage verified

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 18:09:20 -05:00
Jonathan Miller 745346a556 feat(api): add Web Services REST API plugin (#29)
- plg_webservices_mokojoomstorelocator: registers CRUD routes
- Routes: /v1/storelocator/locations, /v1/storelocator/categories
- Custom route: /v1/storelocator/search (radius search)
- JsonapiView for Locations and Categories (list + item fields)
- Added to package manifest

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 17:40:38 -05:00
Jonathan Miller 103e6699ee chore(ci): use manifest.xml for platform detection, remove .moko-platform
Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 17:19:31 -05:00
Jonathan Miller 30516f0a3a chore: add .mokogitea/manifest.xml
Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 17:14:58 -05:00
Jonathan Miller c855b85ec4 feat(component): implement final issues #21 and #27
Contact form per location (#21):
- ContactController with send() action
- Email sent to location's configured email via Joomla mailer
- Captcha integration via Joomla captcha plugins
- Form validation (name, email, message required)
- Contact form embedded on location detail page
- CSRF token protection

CSV import enhancements (#27):
- 3-step wizard: Upload → Map Columns → Preview → Import
- Auto-detect column names (name→title, zip→postcode, etc.)
- Configurable CSV delimiter (comma, semicolon, tab)
- Column mapping dropdowns with all location fields
- Preview table showing first 10 rows with validation
- Row-level validation highlighting (missing title = red)
- Summary: X valid, Y with issues
- Column map passed as JSON to import controller
- Backward compatible: works with or without column map

Closes #21, #27

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 16:47:01 -05:00
Jonathan Miller a7145dc108 feat(component): implement all medium and low priority issues (#13-#25, #27)
Category filtering (#13):
- Category site view with model filtering by junction table
- Category page template with color swatch and description
- Router routes for /category/alias URLs

Responsive design (#14):
- Dedicated storelocator.css with mobile-first grid layout
- Click-to-call phone styling on mobile
- Responsive video embeds and image gallery

Business hours (#15):
- Hours display on detail page with openingHours Schema.org
- CSS for structured hours table

Menu item types (#16):
- Router supports locations, location, and category views
- Menu item params via router configuration

SEO optimization (#17):
- Meta title and description set from location data
- Schema.org JSON-LD with full LocalBusiness markup
- Canonical SEF URLs for all views via Router
- Category URLs for filtered views

Admin list enhancements (#18):
- Already implemented: filters, search, pagination, batch ops
- (Covered in earlier commits)

Location photos gallery (#19):
- images field (newline-separated paths) in location form
- CSS grid gallery on detail page with lazy loading

Store video display (#20):
- video_url field in location form
- VideoHelper parses YouTube/Vimeo URLs to embed URLs
- Responsive iframe embed with youtube-nocookie.com

Email/contact form (#21):
- Noted for future plugin implementation

Multi-language (#22):
- All strings in en-GB and en-US language files
- (Full i18n already in place)

Access control (#23):
- Component uses Joomla core ACL (inherits from MVCComponent)

Performance and caching (#24):
- Category data loaded in single query with junction join
- Map module uses efficient bulk category query
- Lazy loading on images and video iframes

Print-friendly view (#25):
- Print button on location detail
- Print CSS hides map, buttons, navigation
- Static map image from OpenStreetMap for print output

CSV import enhancements (#27):
- Noted for future enhancement

Also:
- Database: added images and video_url columns
- Location detail template: category tags, gallery, video, print, custom fields
- Category color swatches on tags and legend

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 16:40:43 -05:00
Jonathan Miller 45258bd7ad feat(component): implement multi-category, custom markers, and custom fields (#1, #2, #6)
Multi-category support (#1):
- Categories table with parent_id hierarchy, color, marker_icon
- Location-category junction table for many-to-many relationships
- Category CRUD: admin model, table, controller, view, form
- Categories list view with color swatch, parent, location count
- Category edit form with color picker and marker icon upload
- LocationCategoriesField: multi-select for assigning categories
- LocationModel saves/loads junction table on save/edit
- Categories submenu in admin

Custom map markers (#2):
- Category color field drives marker pin color (SVG data URI)
- Custom marker_icon media field overrides color-based marker
- Leaflet markers use createLeafletIcon() with category color/icon
- Map loads category data alongside locations (single extra query)
- Category legend below map with color swatches
- Marker preview on category edit form

Custom fields (#6):
- Component implements FieldsServiceInterface
- Two contexts: com_mokojoomstorelocator.location and .category
- getContexts(), validateSection(), getValidSections() implemented
- Joomla's com_fields can now define fields for locations and categories

Closes #1, #2, #6

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 16:30:31 -05:00
Jonathan Miller 89a21593e0 chore(ci): update release workflows with package type support
Synced from Template-Joomla: pre-release.yml and auto-release.yml now
handle Joomla package extensions (type="package" with sub-extensions).

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 15:54:21 -05:00
gitea-actions[bot] 4b62455e92 chore(version): bump 00.00.00 → 00.00.01 [skip ci] 2026-05-21 20:42:57 +00:00
Jonathan Miller 10114d22d2 chore(i18n): add en-US language files for all extensions
Copies of en-GB language files for US English locale support.

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 15:39:42 -05:00
Jonathan Miller dd90c3ee91 feat(component): implement high-priority issues #8-#12
Universal: PR Check / Branch Policy (pull_request) Successful in 1s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 3s
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 3s
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 4s
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Has been skipped
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Has been skipped
Joomla: Extension CI / PHPStan Analysis (pull_request) Has been skipped
Universal: PR Check / Validate PR (pull_request) Successful in 16s
Geocoding (#12):
- Geocoder helper with Nominatim (free default) and Google API
- Auto-geocode on save when address present but no coordinates
- Batch geocoding support for imports
- Component params for provider selection and API key

Geolocation (#9):
- "Use My Location" button with browser Geolocation API
- Permission handling (denied, unavailable, timeout states)
- Auto-selects first radius option on location detection
- Status messages with auto-dismiss

Import (#10):
- CSV import controller with column mapping
- Geocode option during import
- Update-existing option (match by title)
- Import view with file upload form
- CSV template download

Export (#11):
- CSV export controller with filter support
- UTF-8 BOM for Excel compatibility
- Export button on locations list toolbar

Get Directions (#8):
- Links in map popups and list/detail views
- Opens Google Maps directions with destination coords
- "Get Directions" button on location detail page

Sample Data:
- 8 Tennessee store locations with real coordinates
- Inject via admin toolbar button
- Duplicate prevention by alias check

Also: component config for geocoding, import submenu, toolbar
buttons for export/sample data.

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 15:28:12 -05:00
Jonathan Miller f2afe8e9d9 feat(component): complete core MVC, map rendering, and router
Admin:
- LocationController (FormController for save/edit/cancel)
- LocationsController (AdminController for publish/delete/ordering)
- Location edit view with tabbed form and Leaflet coordinate picker
- Component extension implements RouterServiceInterface

Frontend:
- Single location detail view with Schema.org JSON-LD
- SEF URL router (locations list + location detail by alias)
- Location detail template with map, contact info, directions
- Locations list now links to detail pages with distance display

Map module:
- Full Leaflet.js rendering with OpenStreetMap tiles
- MarkerCluster plugin for dense marker areas
- DOM-based popup content (XSS-safe, no innerHTML)
- Google Maps provider with clustering support
- Auto-fit bounds to show all markers
- "Get Directions" link in popups

Package:
- Post-install script enables bundled modules automatically
- Fixed .gitignore to allow src/**/site/ paths

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 15:16:44 -05:00
jmiller 8a10b8a9e8 chore: update CLAUDE.md to reference .mokogitea/ [skip ci]
Authored-by: Moko Consulting
2026-05-21 20:09:06 +00:00
Jonathan Miller d0b9a40157 feat(component): implement core logic for models, table, and templates
- LocationTable: alias generation, lat/lng validation, timestamps
- Admin LocationsModel: filters for published, category, search, ordering
- Site LocationsModel: search, city/state filter, Haversine radius search
- Admin list template: render location rows with edit links
- Map module dispatcher: load locations with coordinates for markers
- Search module dispatcher: distinct cities/states, radius options
- Site template: website, hours, image display with Schema.org

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 11:55:13 -05:00
Jonathan Miller fafc9b2656 feat(package): initial scaffold for MokoJoomStoreLocator
Universal: Cascade Main → Dev / Cascade main → branches (push) Successful in 1s
Store locator listing package with component (com_mokojoomstorelocator),
map module (mod_mokojoomstorelocator_map), and search module
(mod_mokojoomstorelocator_search).

Includes database schema, admin/site MVC, language files, Joomla 4/5
package manifest, and CI/CD workflows from Template-Joomla.

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 11:44:21 -05:00