Commit Graph

206 Commits

Author SHA1 Message Date
Serreau Jovann
6fab96ab44 Full mobile responsive (320px) and tablet (768px) support across all templates
- All text-[20rem] background text → text-[8rem] md:text-[20rem]
- All text-8xl → text-5xl md:text-8xl
- All text-5xl emojis → text-3xl md:text-5xl
- edit_event: w-full md:w-[80%], poster column w-full lg:w-[350px]
- account/index: tab bar overflow-x-auto, events table overflow-x-auto
- admin/events: table overflow-x-auto
- register: tab buttons overflow-x-auto
- error 404/500: responsive padding p-6 md:p-12
- base footer: flex-col sm:flex-row for bottom bar
- Add PWA bundle (spomky-labs/pwa-bundle) with composer require files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 19:11:02 +01:00
Serreau Jovann
e101541185 Fix PWA screenshots config: use format instead of sizes/type
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 19:07:07 +01:00
Serreau Jovann
44eea74d49 Use real screenshot for PWA desktop wide install UI
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 19:06:35 +01:00
Serreau Jovann
6dd1464e61 Add PWA screenshots for mobile and desktop (wide) richer install UI
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 19:05:01 +01:00
Serreau Jovann
0a83f77c25 Set PWA display-override and portrait orientation only
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 19:04:29 +01:00
Serreau Jovann
e2aa30043c Fix PWA icons: separate any/maskable purpose, add manifest id, proper sizes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 19:04:06 +01:00
Serreau Jovann
237b3b23e2 Add 96x96 favicon icons to all PWA manifest shortcuts
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 19:03:34 +01:00
Serreau Jovann
472d741f99 Complete PWA manifest: full name, description, lang, categories, shortcuts, orientation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 19:02:42 +01:00
Serreau Jovann
c4d65fcdf8 Configure PWA favicons with custom background, border radius and theme colors
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 19:01:08 +01:00
Serreau Jovann
0dd89d1b54 Add pwa_dev and pwa_prod commands using pwa:compile
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:59:58 +01:00
Serreau Jovann
f652665a06 Remove asset-map:compile commands, PWA bundle works dynamically via Twig
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:59:24 +01:00
Serreau Jovann
e3afbfacf0 Fix pwa_dev: clean compiled assets for dynamic mode, keep pwa_prod for compilation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:58:00 +01:00
Serreau Jovann
759436d850 Fix PWA: remove pwa:create (not exists), use asset-map:compile, fix favicon path
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:56:38 +01:00
Serreau Jovann
acfcd1e2df Add asset-map:compile before pwa:create in pwa_prod command
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:55:39 +01:00
Serreau Jovann
681c04bf85 Configure PWA: single pwa() call with favicon/theme injection, Imagick processor, remove duplicates
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:55:21 +01:00
Serreau Jovann
a794a10844 Add PWA bundle config and pwa() Twig function in base template
- Create pwa.yaml with manifest: name, icons (favicon.png), theme color
- Add {{ pwa() }} before stylesheets in base.html.twig head

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:54:11 +01:00
Serreau Jovann
689883b434 Add favicon, PWA commands (pwa_dev/pwa_prod), and prepare PWA deployment
- Add favicon.png link and apple-touch-icon in base.html.twig
- Add theme-color meta tag (#fabf04)
- Add pwa_dev and pwa_prod Makefile commands
- Add PWA asset generation step in Ansible playbook after cache clear
- Update Caddy static paths for favicon.png, marker.png, manifest.json, sw.js

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:53:36 +01:00
Serreau Jovann
187261170a Remove grey background behind custom map marker icon
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:48:01 +01:00
Serreau Jovann
0a758c0ccc Use custom marker.png for Leaflet map markers
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:46:39 +01:00
Serreau Jovann
b208c7529e Show full event poster without crop: object-contain instead of object-cover
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:44:07 +01:00
Serreau Jovann
4ce562df1f Adapt navbar for wide logo: remove border/shadow box, increase height, remove text label
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:42:37 +01:00
Serreau Jovann
c4e05bc5ba Add cdn.jsdelivr.net to CSP connect-src for Leaflet source maps
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:38:24 +01:00
Serreau Jovann
c1292bb2cd Switch Leaflet from unpkg to jsdelivr CDN to avoid sourcemap requests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:38:07 +01:00
Serreau Jovann
93ed10c170 Use CartoDB Positron light theme for event map, matches neo-brutalist design
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:37:32 +01:00
Serreau Jovann
91b52116c7 Replace OSM iframe with Leaflet map: marker, zoom, geocoding via Nominatim
- Add event-map.js module: loads Leaflet dynamically, geocodes address, renders map with marker at zoom 16
- Remove iframe, address text and OSM link below map
- Add CSP entries for unpkg (Leaflet), tile.openstreetmap.org (tiles), nominatim (geocoding)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:35:54 +01:00
Serreau Jovann
e2797e9731 Add analytics tunnels to dev Caddyfile: /stats/* and /assets/perf.js
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:36 +01:00
Serreau Jovann
bc2b386837 Show full dates (d/m/Y H:i), add OpenStreetMap embed below event description
- Change date display from d/m/Y + H:i to "Du d/m/Y H:i au d/m/Y H:i"
- Add map card with OSM iframe (300px), address text, and link to OpenStreetMap
- Add openstreetmap.org to CSP frame-src

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:07 +01:00
Serreau Jovann
de99ca5f62 Event detail: poster 250px left, description right in two-column layout
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:29:30 +01:00
Serreau Jovann
1dcf5a190d Add organizer info section and event contact form on event detail page
- Left: organizer card with logo, name, city, social icons, email
- Right: contact form (name, firstname, email, message) sent to organizer
- Add /evenement/{id}/contact POST route with email to organizer (replyTo sender)
- Create event_contact.html.twig email template
- Add flash messages for success/error

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:17:17 +01:00
Serreau Jovann
e7693b4f42 Redesign event detail page: show title, address, date and organizer in hero
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:55:32 +01:00
Serreau Jovann
f70f0c2af9 Add public events page, event detail route, copy URL button, organizer events list
- Add /evenements public page with Meilisearch search, KnpPaginator (12/page), event cards grid
- Add /evenement/{orgaSlug}/{id}-{eventSlug} public route with slug redirect
- Add Event::getSlug() method
- Update homepage stats with real event count
- Update organizer detail page to list their public events
- Update navbar: link Evenements to /evenements with active state
- Add copy URL button on edit event page (visible only when online)
- Add initCopyUrl() in app.js with clipboard API

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:54:02 +01:00
Serreau Jovann
fe33b80351 Enable Vite file polling for Docker volume watch compatibility
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:48:54 +01:00
Serreau Jovann
cf32225c9a Show full poster image with object-contain and max-height 350px
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:47:56 +01:00
Serreau Jovann
e18f79b2e5 Require Stripe validation to put event online, disable button and block route
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:47:31 +01:00
Serreau Jovann
0438185cd4 Force event poster height to 250px with object-cover
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:46:46 +01:00
Serreau Jovann
96b15239c5 Set edit event container to 80% width
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:45:57 +01:00
Serreau Jovann
61362096d8 Redesign edit event page: two-column layout, action buttons, poster display
- Left column: edit form (title, description, dates, address, image upload)
- Right column: sticky poster preview card with image or placeholder
- Top action bar: toggle online/offline, toggle secret/public, status badges
- Add routes: /mon-compte/evenement/{id}/en-ligne and /mon-compte/evenement/{id}/secret
- Remove is_online checkbox from form (replaced by dedicated toggle buttons)
- Meilisearch re-indexed on toggle actions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:42:08 +01:00
Serreau Jovann
ea68481829 Add admin events page with Meilisearch search, KnpPaginator, and navigation link
- Add Evenements link in admin navigation bar
- Create /admin/evenements page with event table (title, organizer, date, city, status, secret)
- Search via Meilisearch event_admin index with fallback to database
- KnpPaginator (10 per page)
- Add 3 tests (success, search, access denied)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:31:11 +01:00
Serreau Jovann
abd2fef638 Add search bar for events in /mon-compte using Meilisearch per-account index
- Search form with query parameter ?q= on events tab
- Uses event_{accountId} Meilisearch index for search
- Falls back to database query if Meilisearch unavailable

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:23:01 +01:00
Serreau Jovann
e6213ca66f Add Meilisearch event indexing with 3 indexes: global, admin, per-account
- Create EventIndexService with indexEvent() and removeEvent()
- event_global: online events where isSecret=false (public search)
- event_admin: all events regardless of status (admin search)
- event_{accountId}: all events per organizer (account search)
- Integrate indexing in create/edit/delete event controllers
- Try/catch for Meilisearch unavailability (graceful degradation)
- Add 5 unit tests for EventIndexService

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:18:45 +01:00
Serreau Jovann
3cd40f30c0 Add isSecret field to Event entity for hidden-when-online events
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:06:03 +01:00
Serreau Jovann
146a0d4da0 Add event list with pagination, edit and delete actions in account page
- Display events table sorted by startAt ASC with status (en ligne/hors ligne)
- Add KnpPaginator for events (10 per page)
- Add edit event page (/mon-compte/evenement/{id}/modifier) with all fields + isOnline toggle
- Add delete event route (/mon-compte/evenement/{id}/supprimer) with confirmation
- Add Modifier/Supprimer buttons in events table
- Move Stripe warning outside the card
- Fix test to use fresh EntityManager for event assertion

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 17:02:56 +01:00
Serreau Jovann
3c1b89ed32 Hide registration form in prod, show coming soon page instead
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 16:52:44 +01:00
Serreau Jovann
122439af1c Restore registration form, show coming soon banner in prod only, ROLE_ROOT inherits ROLE_ORGANIZER
- Registration form fully restored with both buyer/organizer tabs
- Coming soon banner only visible in prod environment
- Add role_hierarchy: ROLE_ROOT inherits ROLE_ORGANIZER and ROLE_USER

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 16:51:48 +01:00
Serreau Jovann
44e8488f49 Disable registration: show coming soon page, block form submission
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 16:50:09 +01:00
Serreau Jovann
5e74d25a7d Add info banner on registration page: inscriptions opening soon
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 16:49:17 +01:00
Serreau Jovann
1a7f5da19a Ignore PHPStan $id never assigned error for Event entity
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 16:45:48 +01:00
Serreau Jovann
ebdb3bbf5d Use Set for ALLOWED_TAGS, ignore javascript:S1874 for execCommand in SonarQube
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 16:43:52 +01:00
Serreau Jovann
d1e3de33df Improve editor and cookie-consent test coverage, fix RegExp.exec lint
- Add 5 editor tests: toolbar mousedown, _sync, exec with/without value
- Mock document.execCommand for happy-dom compatibility
- Add cookie-consent test for duplicate script guard
- Use RegExp.exec() instead of String.match() per ESLint rule

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 16:41:40 +01:00
Serreau Jovann
acc9e2a5b8 Add S/MIME private key to vault and deploy cert directory in Ansible playbook
- Store smime_private_key in encrypted vault
- Add playbook tasks: create cert directory + deploy private key with 0600 permissions
- Certificate public already in git at config/cert/certificate.pem

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 16:38:02 +01:00