rename parseCarte → parseMap, fix marker icon size, remove testing checklist

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
isUnknown 2026-02-26 15:10:14 +01:00
parent 41fbe71a1f
commit 0c682c78c0
4 changed files with 31 additions and 303 deletions

View file

@ -1,276 +0,0 @@
# Map Editor Plugin - Testing Checklist
## Pre-Testing Setup
1. [ ] Build the frontend: `npm run build`
2. [ ] Ensure Kirby is running (PHP server)
3. [ ] Log into Kirby Panel
4. [ ] Navigate to the map page (e.g., `/panel/pages/map+carte`)
## Phase 1: Multi-Mode Testing (Map Page)
### Basic Marker Operations
1. [ ] **View existing markers**
- Open map page in Panel
- Verify markers are loaded and displayed on map
- Verify markers appear in sidebar list
2. [ ] **Create marker via button**
- Click "Add Marker" button in sidebar
- Verify marker appears at map center
- Verify marker appears in sidebar
- Check browser console for errors
3. [ ] **Create marker via map click**
- Click anywhere on the map
- Verify marker appears at clicked location
- Verify marker appears in sidebar
4. [ ] **Select marker**
- Click marker in sidebar
- Verify map centers on marker
- Verify marker is highlighted
5. [ ] **Drag marker**
- Drag a marker to new position
- Verify position updates in real-time
- Reload page and verify position persisted
6. [ ] **Edit marker**
- Click "Edit" button for a marker in sidebar
- Verify redirect to marker page in Panel
- Verify marker page loads correctly
7. [ ] **Delete marker**
- Click "Delete" button for a marker
- Verify confirmation dialog appears
- Confirm deletion
- Verify marker removed from map and sidebar
- Reload page and verify deletion persisted
### Map Data Persistence
8. [ ] **Map view changes**
- Pan and zoom the map
- Reload the page
- Verify map returns to same view
9. [ ] **Check YAML data**
- View the mapdata field source
- Verify it contains: background, center, zoom
- Verify it does NOT contain markers array
### Edge Cases
10. [ ] **Max markers limit**
- Create markers up to the limit (default 50)
- Verify "Add Marker" button becomes disabled
- Verify map clicks don't create new markers
11. [ ] **Geocode search**
- Use the address search in sidebar
- Search for an address
- Verify map centers on result
12. [ ] **Error handling**
- Open browser DevTools Network tab
- Try operations with network offline (simulate)
- Verify errors are logged to console
## Phase 2: Single-Mode Testing (Marker Page)
### Marker Page Structure
1. [ ] **Create test marker**
- In map page sidebar, click "Add Marker"
- Click "Edit" to open the marker page
2. [ ] **Content tab**
- Verify "Contenu" tab exists
- Edit title field
- Add blocks (heading, text, image, etc.)
- Save and verify content persists
3. [ ] **Position tab**
- Switch to "Position" tab
- Verify latitude/longitude fields on left
- Verify map preview on right
### Single-Mode Map Functionality
4. [ ] **View marker position**
- Verify single marker appears on map
- Verify marker is at coordinates shown in fields
5. [ ] **Drag marker in single mode**
- Drag the marker to a new position
- Check browser console for API call
- Reload page
- Verify new position persisted
6. [ ] **Update coordinates via fields**
- Edit latitude field (e.g., 43.8)
- Edit longitude field (e.g., 4.3)
- Save the page
- Verify marker moved on map preview
7. [ ] **Geocode search in single mode**
- Use address search (if available)
- Verify map centers on result
- Drag marker to searched location
### Single-Mode Restrictions
8. [ ] **No CRUD buttons**
- Verify no "Add Marker" button
- Verify no "Delete" button
- Verify no marker list sidebar
9. [ ] **Map size**
- Verify map height is smaller (400px) than multi-mode
## Phase 3: Integration Testing
### Subpage Management
1. [ ] **View markers as subpages**
- In map page, check sidebar "Marqueurs" section
- Verify all markers listed as subpages
- Verify ordering by num
2. [ ] **Reorder markers**
- Drag markers in Panel pages section
- Verify order updates
- View map editor
- Verify sidebar reflects new order
3. [ ] **Delete marker via Panel**
- Delete a marker subpage via Panel (not map editor)
- View map page
- Verify marker removed from map
4. [ ] **Create marker manually**
- Create a new marker subpage via Panel
- Set template to "marker"
- Add title, latitude, longitude
- View map page
- Verify marker appears on map
### Multi-Marker Performance
5. [ ] **Create 10 markers**
- Create 10 markers via map
- Verify performance is acceptable
- Check load time
6. [ ] **Create 50 markers** (optional stress test)
- Create markers up to limit
- Verify UI remains responsive
- Check browser memory usage
## Phase 4: Security & API Testing
### Authentication
1. [ ] **Logged out access**
- Log out of Panel
- Try accessing API directly (e.g., via curl)
- Verify 401 Unauthorized response
### CSRF Protection
2. [ ] **Invalid CSRF token**
- Use browser DevTools to modify X-CSRF header
- Try creating/updating/deleting marker
- Verify 403 Forbidden response
### Permissions
3. [ ] **Create restricted user** (optional)
- Create user with limited permissions
- Log in as that user
- Try marker operations
- Verify permission checks work
### API Responses
4. [ ] **Check API responses**
- Open DevTools Network tab
- Perform marker operations
- Verify responses match expected format:
```json
{
"status": "success",
"data": { ... }
}
```
5. [ ] **Test error responses**
- Try invalid coordinates (e.g., lat: 200)
- Verify 400 Bad Request response
- Verify error message is descriptive
## Phase 5: Build & Deployment
### Build Verification
1. [ ] **Clean build**
- Run `npm run build`
- Verify no errors or warnings (except font warnings)
- Check dist folder created
2. [ ] **Production test**
- Test on production server (if available)
- Verify all functionality works
### Browser Compatibility
3. [ ] **Test in Chrome**
4. [ ] **Test in Firefox**
5. [ ] **Test in Safari**
6. [ ] **Test in Edge** (optional)
## Common Issues & Solutions
### Issue: Markers not loading
- **Check**: Browser console for API errors
- **Check**: Network tab for 401/403 errors
- **Solution**: Verify user is logged in, CSRF token is valid
### Issue: Drag doesn't update position
- **Check**: Console for API errors
- **Check**: Network tab for PATCH request
- **Solution**: Verify page permissions, CSRF token
### Issue: Redirect to Panel doesn't work
- **Check**: Console for errors
- **Check**: panelUrl in API response
- **Solution**: Verify page ID format is correct
### Issue: Single mode shows multiple markers
- **Check**: MapEditor component mode prop
- **Check**: Blueprint field configuration
- **Solution**: Verify `mode: single` in blueprint
## Test Results Summary
Date: __________
Tester: __________
| Phase | Tests Passed | Tests Failed | Notes |
|-------|-------------|--------------|-------|
| Phase 1: Multi-Mode | __ / 12 | __ | |
| Phase 2: Single-Mode | __ / 9 | __ | |
| Phase 3: Integration | __ / 6 | __ | |
| Phase 4: Security | __ / 5 | __ | |
| Phase 5: Build | __ / 6 | __ | |
| **Total** | __ / 38 | __ | |
## Next Steps After Testing
- [ ] Document any bugs found
- [ ] Create GitHub issues for bugs
- [ ] Update README with usage instructions
- [ ] Add user documentation
- [ ] Consider implementing suggested improvements

View file

@ -108,7 +108,7 @@ function parseBlocks($blocksField, $page) {
case 'map':
$mapPage = $block->map()->toPages()->first();
if ($mapPage) {
$blockData['content'] = parseCarte($mapPage);
$blockData['content'] = parseMap($mapPage);
} else {
$blockData['content'] = [
'map' => $block->map()->value()
@ -141,7 +141,7 @@ function parseChapter($chapter) {
}
/**
* Parse un marqueur
* Parse a marker
*/
function parseMarker($marker) {
return [
@ -154,25 +154,25 @@ function parseMarker($marker) {
}
/**
* Parse une carte
* Parse a map
*/
function parseCarte($carte) {
function parseMap($map) {
$markers = [];
foreach ($carte->children()->listed() as $child) {
foreach ($map->children()->listed() as $child) {
if ($child->intendedTemplate()->name() === 'marker') {
$markers[] = parseMarker($child);
}
}
$staticImage = $carte->file('map-static.png');
$staticImage = $map->file('map-static.png');
return [
'id' => $carte->id(),
'uuid' => $carte->uuid()->toString(),
'id' => $map->id(),
'uuid' => $map->uuid()->toString(),
'template' => 'carte',
'title' => $carte->title()->value(),
'slug' => $carte->slug(),
'tags' => $carte->tags()->isNotEmpty() ? $carte->tags()->split() : [],
'title' => $map->title()->value(),
'slug' => $map->slug(),
'tags' => $map->tags()->isNotEmpty() ? $map->tags()->split() : [],
'image' => $staticImage ? $staticImage->url() : null,
'intro' => resolveImagesInHtml($carte->text()->value(), $carte),
'intro' => resolveImagesInHtml($map->text()->value(), $map),
'markers' => $markers
];
}
@ -187,7 +187,7 @@ function parseGeoformat($geoformat) {
if ($template === 'chapter') {
$children[] = parseChapter($child);
} elseif ($template === 'map') {
$children[] = parseCarte($child);
$children[] = parseMap($child);
}
}
@ -228,7 +228,7 @@ foreach ($page->children()->listed() as $child) {
if ($template === 'geoformat') {
$data['children'][] = parseGeoformat($child);
} elseif ($template === 'map') {
$data['children'][] = parseCarte($child);
$data['children'][] = parseMap($child);
}
}

View file

@ -76,13 +76,12 @@
v-if="marker.icon"
:src="marker.icon"
class="marker-icon"
:style="{ width: marker.iconSize + 'px', height: marker.iconSize + 'px' }"
alt=""
/>
<img
v-else
src="/assets/svg/marker-pin.svg"
class="marker-icon marker-icon--default"
class="marker-icon"
alt=""
/>
{{ marker.title }}
@ -235,13 +234,10 @@ const getBlockComponent = (type) => {
}
.marker-icon {
flex-shrink: 0;
object-fit: contain;
}
.marker-icon--default {
width: 24px;
height: 24px;
flex-shrink: 0;
object-fit: contain;
}
.marker-cover {

View file

@ -1,5 +1,9 @@
<template>
<div v-if="content.template === 'carte'" class="block-map">
<div
v-if="content.template === 'carte'"
class="block-map"
:data-slug="content.slug"
>
<h4>{{ content.title }}</h4>
<img v-if="content.image" :src="content.image" class="carte-image" alt="" />
<div v-if="content.tags && content.tags.length" class="tags">
@ -13,18 +17,22 @@
v-if="marker.icon"
:src="marker.icon"
class="marker-icon"
:style="{ width: marker.iconSize + 'px', height: marker.iconSize + 'px' }"
alt=""
/>
<img
v-else
src="/assets/svg/marker-pin.svg"
class="marker-icon marker-icon--default"
class="marker-icon"
alt=""
/>
{{ marker.title }}
</h5>
<img v-if="marker.cover" :src="marker.cover" class="marker-cover" alt="" />
<img
v-if="marker.cover"
:src="marker.cover"
class="marker-cover"
alt=""
/>
<template v-if="marker.blocks">
<component
v-for="block in visibleBlocks(marker.blocks)"
@ -51,8 +59,8 @@ import QuoteBlock from './QuoteBlock.vue';
defineProps({
content: {
type: Object,
required: true
}
required: true,
},
});
const visibleBlocks = (blocks) => {