# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [1.2.0] - Unreleased ### Added - **Admin menu short-name constant** — the Administrator → Components menu now shows a compact label via `COM_MOKOSUITESTORELOCATOR_SHORT` ("Store Locator"); defined in the admin sys.ini (#75) — also renamed the `COM_MOKOJOOMSTORELOCATOR` language-key stem to `COM_MOKOSUITESTORELOCATOR`. - Multi-category support with parent/child hierarchy (#1) - Categories admin CRUD — list, edit, color picker, custom marker icon - Location-category junction table (many-to-many) - Categories tab on location edit form (multi-select) - Category filtering on site frontend (`catid` parameter) - Custom map markers per category — SVG/PNG icon support (#2) - Map module JOINs category data for marker icons and colors - `access.xml` with full Joomla ACL permissions (#30) - SQL update schema with `sql/updates/mysql/` versioned files (#31) - REST API via Web Services plugin (`plg_webservices_mokosuitestorelocator`) (#29) - API controller + JSON:API view for locations CRUD at `/api/v1/mokosuitestorelocator/locations` - `LocationBridgeHelper` — static helper for cross-extension integration (#48) - `LocationSavedEvent` — fires `onStoreLocatorLocationSaved` for cache invalidation - Plugin added to package manifest - Leaflet map on location detail page with marker and popup (#57) - Leaflet.markercluster for automatic marker grouping at low zoom levels (#61) - Clustering toggle parameter in map module settings (enabled by default) - Junction table orphan cleanup on location/category delete (#60) - License key warning on install/update when no download key is configured - Download key (dlid) preserved across package upgrades - Pretty display names for all extensions in Joomla admin (e.g. "MokoSuite Store Locator" instead of raw element names) - Plugin `.sys.ini` language file for system-level name translation ### Changed - Map module dispatcher uses aliased table queries with category JOIN - ORDER BY clauses in admin and site models now validated against filter_fields allowlist - Category filter uses EXISTS subquery instead of JOIN to avoid ONLY_FULL_GROUP_BY errors (#59) - Inline `