Skip to content

Redesign event symbol picker with unified icons#1549

Open
paaaaaaul0101 wants to merge 10 commits into
PhotoboothProject:devfrom
paaaaaaul0101:pr/event-icons-picker-clean
Open

Redesign event symbol picker with unified icons#1549
paaaaaaul0101 wants to merge 10 commits into
PhotoboothProject:devfrom
paaaaaaul0101:pr/event-icons-picker-clean

Conversation

@paaaaaaul0101

@paaaaaaul0101 paaaaaaul0101 commented May 25, 2026

Copy link
Copy Markdown
Contributor

Prerequisites checklist

  • I have read the contributing guidelines.

What is the purpose of this pull request? (put an "x" next to an item)

  • Documentation update
  • Bug fix
  • New feature
  • Other, please explain:

What changes did you make? (Give an overview)

  • Reworked the event symbol picker to a single unified flow for Lucide, Iconify, legacy Font Awesome and custom uploaded images.
  • Added direct symbol input/apply support (e.g. iconify:lets-icons:camera-fill or square-user-round).
  • Added custom image management in the picker:
    • upload own SVG/image
    • delete selected custom image
    • delete custom images directly from the custom-image overview tiles
  • Localized newly added picker/admin/API strings via language keys (removed hardcoded German UI labels).
  • Improved category handling so source separation is hidden in UI while icon coverage is preserved.
  • Fixed static-analysis issues from the picker refactor so CI PHPStan is green again.

Tests:

  • php tools/phpstan/vendor/bin/phpstan analyze --configuration phpstan.neon
  • composer cgl:ci
  • php tools/phplint/vendor/bin/phplint
  • Manual language switch check in picker UI (DE/EN)

Is there anything you'd like reviewers to focus on?

  • i18n coverage of the event-symbol picker flow
  • validation/sanitization paths for direct input and custom-image actions

AI used to create this Pull Request?

I used AI selectively in the code, for minor suggestions, alternatives or for understanding.
The idea, concept and logic behind the changes are my own.

@paaaaaaul0101

Copy link
Copy Markdown
Contributor Author

I wanted the icon selection to feel much more open, transparent, and practical for real event use. Before, the options felt too limited and not easy to browse. With this change, I now have a much larger but still meaningful icon choice, organized in a clearer way, with search and direct input so I can quickly pick exactly what I need. I also wanted full flexibility, so I kept the old icons, added support for custom SVG/image uploads, and made custom images manageable (including removal).

@paaaaaaul0101 paaaaaaul0101 changed the title feat: redesign event symbol picker with unified icons Redesign event symbol picker with unified icons May 26, 2026
$assetService = AssetService::getInstance();

echo '<script src="' . $assetService->getUrl('api/settings.php') . '"></script>';
echo '<script src="' . $assetService->getUrl('node_modules/lucide/dist/umd/lucide.min.js') . '"></script>';

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This introduces runtime dependencies on node_modules/lucide/..., node_modules/iconify-icon/..., and also assets/js/admin/iconSelect.js, but the release archive builder does not ship those new paths. scripts/pack-build.js only archives a fixed allowlist of node_modules packages and resources/; it does not include lucide, iconify-icon, or the assets/ tree. In a zip-based install these requests become 404s, so the picker/start-page rendering will work in dev checkouts but break in packaged releases.

$languageService = LanguageService::getInstance();
$attributes = self::buildAttributes($setting);
$selectedIcon = EventSymbolUtility::normalize((string) ($setting['value'] ?? 'camera'));
$iconCatalog = EventIconCatalogUtility::getCatalog();

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Calling EventIconCatalogUtility::getCatalog() while rendering the admin form makes opening the settings page depend on synchronous third-party HTTP calls. When the 24h cache is stale, getCatalog() will rebuild before falling back, and that rebuild fans out to Lucide plus many Iconify searches with a 12s timeout each. On offline or slow booths this can stall the entire admin page load instead of staying local and responsive.

…r-clean

# Conflicts:
#	lib/configsetup.inc.php
#	src/Configuration/Section/EventConfiguration.php
#	template/components/stage.start.php
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants