Warum dieser Plan existiert, was er löst und wer davon profitiert.
| Aspekt | Details |
|---|---|
| Problem | Die Seite /projektpartnerportal rendert aktuell über views.view.project_offers_listing Display page_listing ohne Canvas-Chassis. Layout, Filter-Sidebar, Card-Darstellung und watchlist-bar weichen signifikant vom Figma-Frame 985-50024 ("Projektangebote", File SOLCOM — Design System — Layouts) ab. Freiberufler finden sich in der UI nicht zurecht; strukturierte Filtermechanismen und Matching-Rate fehlen im Frontend vollständig. |
| Ziel | Die Seite /projektpartnerportal so weit an Figma-Frame 985-50024 anzugleichen, dass ein visueller Side-by-Side-Verify bei 1280 px als "bestanden" gilt. Backend-Sync (Migrate, Sync-Hygiene) ist in Plan 2026-05-14-001 abgedeckt; dieser Plan fokussiert ausschließlich auf das Frontend-Alignment. Harter Go-Live-Termin: 08.07.2026. |
| Stakeholder | Freiberufler / externe Projektpartner (Primär-Nutzer der Listing-Page); SOLCOM-Redaktion (Pflege der Projektangebote); Projektleitung (Go-Live 08.07.2026 — kein Slip ohne Eskalation). |
| Figma-Quelle | figma.com/design/CHHDfbpX8Ys2LBiGs5HVK0 · Node 985-50024 File: "SOLCOM — Design System — Layouts", Frame: "Projektangebote" |
Alle vier User-Decisions (2026-05-16) und das Customer-Lens-Verdict (Option B-Hybrid) sind bindend — werden hier nicht mehr in Frage gestellt.
| # | Thema | Entscheidung | Konsequenz |
|---|---|---|---|
| D1 | Matching-Rate | Eigener Matching-Service / neues Field (field_matching_score). MVP: Stub-Field mit computed-Fallback 0. Echter Service = Phase 2. | S-11 liefert Stub; keine Blockade für S-01–S-10. |
| D2 | Laufzeit-Filter | Multi-Select-Buckets (<3 Monate, 3–6 Monate, 6–12 Monate, >12 Monate) statt Range-Slider. Kein Datenmodell-Refactor nötig. | Custom-BEF-Plugin (S-06) parst field_sf_duration zur Laufzeit in Bucket-Gruppen. |
| D3 | Breakpoints | Desktop 1280 px im MVP. Mobile/Tablet adaptive best-effort. Visual-Verify ausschließlich bei 1280 px. | S-12 prüft nur 1280 px; Responsive-Feinschliff ist Phase-2-Item. |
| D4 | Story-Anker | Plan-only, kein Jira-Push. Sub-Tasks optional via to-issues nach Stakeholder-Freigabe. | Dieser Plan ist das verbindliche Implementierungs-Dokument; Jira-Tickets entstehen nachgelagert. |
| CL | Customer-Lens-Verdict (Option B-Hybrid) | Canvas-Page-Template als Chassis für /projektpartnerportal. views_block:project_offers_listing-block_listing als Listing-Region (Block-Variante existiert bereits). BEF-Filter intern beibehalten — kein AJAX-Custom-SDC-Umbau. Slots: hero/intro, sidebar-meta (BEF-Form), listing-region (views_block), watchlist-region. Filter-Sidebar = BEF-Form mit Twig-Suggestion-Override + BEF-Widget-Overrides je Filter. Custom-BEF-Plugin für Laufzeit-Buckets als eigenständiges Slice. watchlist-bar bleibt in page.html.twig (unabhängig vom Chassis). | Klar definierte Slot-Grenzen; kein Framework-Umbau; BEF bleibt wartbar. |
/projektpartnerportalfield_matching_score int, Fallback 0)12 unabhängig deploybare Slices in Abhängigkeitsreihenfolge. S-12 setzt alle vorherigen voraus; S-11 kann parallel zu S-02–S-10 gebaut werden.
/projektpartnerportalNeues Canvas-Page-Template (route-spezifisch, nicht node.project_offer.full) mit vier Slot-Regionen: hero/intro, sidebar-meta (BEF-Form), listing-region (views_block:project_offers_listing-block_listing), watchlist-region. Block-Variante der View ist bereits vorhanden.
/projektpartnerportal rendert via Canvas-Chassisviews_block:project_offers_listing-block_listing landet in listing-regionGET /projektpartnerportal → HTTP 200, Body enthält Canvas-Chassis-Klasse.page_listing-Display in views.view.project_offers_listing.yml entfällt mit diesem Slice: das Canvas-Chassis übernimmt die Page-Rolle, die Listing-Region nutzt die Block-Variante (block_listing). Der Drop ist irreversibel via config:import: nach Merge entfernt der nächste drush cim den Display aus produktiven Mittwald-Umgebungen. Backout würde einen manuellen Display-Re-Export aus einer Pre-Merge-Datenbank verlangen. Begründung des einseitigen Drops: der Display wurde durch den Customer-Lens-Verdict (Abschnitt 02, Row CL) abgelöst und war bereits funktional toter Code (kein Aufrufer mehr nach Canvas-Chassis-Switch).Twig-Suggestion-Override für das BEF-Exposed-Form (views-exposed-form--project-offers-listing.html.twig). Ziel: 288 px Sidebar-Breite, Figma-Spacing (24 px innen, 16 px zwischen Feldern), Label-Typografie, Filter-Heading.
Twig-Override für das BEF-Widget-Search-Input-Feld. Icon-Prefix (Lupe), Placeholder-Text, Border-Radius, Focus-State laut Figma.
Twig-Override für alle BEF-Dropdown-Widgets (Branche, Stadt, Auslastung, Projektstart). Custom-Select mit Chevron-Icon, Figma-Border, Hover-State.
<select>)Twig-Override für BEF-Checkboxgroup-Widget (field_sf_industry). Custom-Checkbox mit Clay-Check, Label-Typografie, Mehrfachauswahl.
Neues BEF-Plugin (BefLaufzeitBuckets) das field_sf_duration (String) zur Laufzeit in vier Buckets gruppiert: <3 Monate, 3–6 Monate, 6–12 Monate, >12 Monate. Multi-Select, kein Datenmodell-Refactor. Eigene ADR wenn Plugin-Architektur nicht-triviale Entscheidungen erfordert (R3).
BefLaufzeitBuckets::parseDuration() mit Randfällen (null, "0", "12+"). Functional: Bucket-Filter → korrekte Listing-Einschränkung.field_sf_duration befüllt (aus Plan 2026-05-14-001).Neues SDC (result-counter) das die Treffermenge der View anzeigt (z.B. "47 Projektangebote"). Platzierung in listing-region oberhalb der Card-Liste, laut Figma-Frame.
Twig-Suggestion-Override für den Views-Pager: Prev/Next-Buttons mit Chevron-Icon, Page-Numbers, aktiver State laut Figma.
aria-current="page")?page=1.card-bubble-profile erweitern oder neue Variante anlegen die alle Field-Inventory-Felder rendert: Matching-Rate-Stub (A), Badge Branche field_sf_industry (B), Heading field_sf_job_title + Fallback title (C), Dauer/field_sf_duration/field_sf_estimated_start/field_remote_share/field_sf_city (D1–D4), Teaser field_sf_long_description (E). field_remote_share (0–100 %) → Remote/Hybrid/Onsite-Label.
line-clamp)watchlist-bar als SDC neu aufbauen: top-sticky (statt bottom-sticky), Backdrop-Blur-Hintergrund, Slot für Counter + CTA, Schliessen-Icon. Bleibt in page.html.twig verankert (unabhängig vom Canvas-Chassis). Vor Implementierung: Live-Usage-Audit (R2).
backdrop-filter:blur())Neues Drupal-Field field_matching_score (Integer, 0–100) auf Bundle project_offer. Computed-Fallback 0 für alle Datensätze. Echter Matching-Service = Phase 2 (R1). Kann parallel zu S-02–S-10 gebaut werden.
field_matching_score existiert auf project_offerproject_offer sichtbar.config/sync/.Abschluss-Slice: Pixel-Diff Figma-Frame 985-50024 vs. Live-Screenshot https://solcom.ddev.site/projektpartnerportal bei 1280 px. Side-by-Side via agent-browser. Lighthouse-Run. Vollständiger BEF-Filter-Funktionstest. watchlist-bar Regression-Check.
Vier identifizierte Risiken. R2 muss vor S-10 adressiert sein.
Diese Kriterien entscheiden ob das Feature go-live-ready ist.
/projektpartnerportal. Keine Layout-Abweichung > 8 px. Befunde dokumentiert in S-12-Worklog.https://solcom.ddev.site/projektpartnerportal./projektpartnerportal: 0 Errors nach vollständig geladenem DOM.Verwandte Docs, Decisions und External Sources. Dieser Plan ersetzt keines der referenzierten Dokumente.
#slice-4).Figma-MCP-Audit Frame 985-50024 (2026-05-17) hat einen signifikanten Diff zwischen der aktuellen BEF-Filter-Konfiguration und den Figma-Sidebar-Filtern aufgedeckt. User-Entscheidung: Status-quo halten, kein sofortiger Realign. Der Befund wird hier als Follow-up dokumentiert und dient als Grundlage für die Stakeholder-Entscheidung über den nächsten Schritt.
| Figma-Filter (985:50024) | View-Filter (aktuell, views.view.project_offers_listing) |
Status |
|---|---|---|
| 1. Jobbezeichnung — Search-Input | einsatzort (Stichwortsuche-Text) | gap |
| 2. PLZ oder Standort — Select-Dropdown | nicht vorhanden | gap |
| 3. Suchradius km — Slider (5/25/50/75/100+) | nicht vorhanden | gap |
| 4. Skills — Select-Dropdown | nicht vorhanden | gap |
| 5. Branche — Select-Dropdown | branche (Select) ✓ | match |
| 6. Remote-Anteil % — Slider (30/60/90/100) | nicht vorhanden | gap |
| 7. "Nur meine Projektliste anzeigen" — Checkbox | nicht vorhanden | gap |
| — (kein Figma-Pendant) | dauer-bucket (Pills via bef_links) | phantom |
| — (kein Figma-Pendant) | field_sf_utilisation_value (Auslastung) | phantom |
| — (kein Figma-Pendant) | field_sf_estimated_start_value (Wunschstart) | phantom |
Empfehlungen:
dauer-bucket, field_sf_utilisation_value und field_sf_estimated_start_value aus der View-Exposed-Form entfernen — sie haben kein Figma-Pendant und erzeugen UI-Rauschen.