From cadd0d02861741a46bbcf6fdf745996e30e5b940 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Mon, 23 Mar 2026 17:57:02 +0100 Subject: [PATCH] refactor(webapp): migrate ds-select to OcelotSelect (#9430) --- packages/ui/KATALOG.md | 14 +- packages/ui/PROJEKT.md | 15 +- .../components/OcelotSelect/OcelotSelect.vue | 450 ++++++++++++++++++ webapp/components/Select/LocationSelect.vue | 22 +- .../SearchableInput/SearchableInput.vue | 9 +- .../SelectUserSearch/SelectUserSearch.vue | 6 +- 6 files changed, 488 insertions(+), 28 deletions(-) create mode 100644 webapp/components/OcelotSelect/OcelotSelect.vue diff --git a/packages/ui/KATALOG.md b/packages/ui/KATALOG.md index 7162dadda..9b57d023b 100644 --- a/packages/ui/KATALOG.md +++ b/packages/ui/KATALOG.md @@ -15,7 +15,7 @@ Phase 4: Tier 1 ██████████ 100% (OsButton, OsIcon, Os Phase 4: Tier A → HTML ██████████ 100% (10 ds-* Wrapper → Plain HTML) ✅ Phase 4: Tier B ██████████ 100% (ds-chip→OsBadge✅, ds-tag→OsBadge✅, ds-grid✅, ds-number→OsNumber✅, ds-radio→HTML✅) Phase 4: Tier B ██████████ 100% (Chip→OsBadge, Tag→OsBadge, Grid→HTML, Number→OsNumber, Radio→HTML, Table→HTML) ✅ -Phase 4: Tier 2+ ████████░░ 60% (OsModal✅, ds-form entkoppelt✅, ds-input→OcelotInput✅) | Rest ausstehend (OsMenu, OsSelect, OsDropdown, OsAvatar) +Phase 4: Tier 2+ ████████░░ 70% (OsModal✅, ds-form entkoppelt✅, ds-input→OcelotInput✅, ds-select→OcelotSelect✅) | Rest ausstehend (OsMenu, OsDropdown, OsAvatar) ``` ### Statistiken @@ -32,7 +32,8 @@ Phase 4: Tier 2+ ████████░░ 60% (OsModal✅, ds-form | ✅ → OsModal | Modal (7 Nutzungen → OsModal, Focus-Trap, Scroll-Lock, A11y) | | ✅ ds-input → OcelotInput | Input (23 Dateien → OcelotInput Webapp-Komponente, lokale Imports, formValidation-kompatibel) | | ✅ ds-form entkoppelt | Form-Validierung → formValidation Mixin (async-validator), vuelidate entfernt | -| ⬜ → UI-Library | Menu, MenuItem, Select (3) — Tier 2-3 | +| ✅ ds-select → OcelotSelect | Select (3 Dateien → OcelotSelect Webapp-Komponente, lokale Imports, click-outside inline) | +| ⬜ → UI-Library | Menu, MenuItem (2) — Tier 3 | | ⬜ Nicht in Webapp | Code, CopyField, FormItem, InputError, InputLabel, Page, PageTitle, Logo, Avatar, TableCol, TableHeadCol (11) | ### OsButton Migration (Phase 3) ✅ @@ -80,7 +81,7 @@ Phase 4: Tier 2+ ████████░░ 60% (OsModal✅, ds-form | 18 | InputError | ✅ → OcelotInput | In OcelotInput integriert | | 19 | InputLabel | ✅ → OcelotInput | In OcelotInput integriert | | 20 | Radio | ✅ → HTML | 1 Datei → native `` + `
` (ReportModal) | -| 21 | Select | ⬜ Tier 4 | 3 Dateien → OsSelect | +| 21 | Select | ✅ → OcelotSelect | 3 Dateien → OcelotSelect (Webapp-Komponente, click-outside inline) | ### Layout | # | Komponente | Status | Notizen | @@ -370,7 +371,7 @@ Phase 4: Tier 2+ ████████░░ 60% (OsModal✅, ds-form ### Basis-Komponenten — UI-Library (ausstehend) - Modal → OsModal ✅ - Input → OcelotInput (Webapp-Komponente) ✅ — langfristig → OsInput in packages/ui -- Select → OsSelect +- Select → OcelotSelect (Webapp-Komponente) ✅ — langfristig → OsSelect in packages/ui - Avatar → OsAvatar (falls benötigt) ### Layout & Typography — → Plain HTML ✅ (Tier A) @@ -412,6 +413,7 @@ Phase 4: Tier 2+ ████████░░ 60% (OsModal✅, ds-form | 2026-02-19 | Claude | **Tier A Migration** | 10 ds-* Vue-Wrapper → Plain HTML + CSS, _ds-compat.scss, ~450 Nutzungen in ~90 Dateien | | 2026-02-19 | Claude | **Katalog konsolidiert** | Styleguide- und Webapp-Tabellen aktualisiert, veraltete Status korrigiert | | 2026-03-23 | Claude | **ds-input → OcelotInput** | 23 Dateien migriert, Webapp-Komponente mit lokalen Imports (tree-shakeable), FormItem/Label/Error vereint | +| 2026-03-23 | Claude | **ds-select → OcelotSelect** | 3 Dateien migriert, Webapp-Komponente, DsSelect+inputMixin+multiinputMixin vereint, Form-Kopplung entfernt, DsChip→OsBadge, DsSpinner→OsSpinner, click-outside inline | --- @@ -450,11 +452,11 @@ Phase 4: Tier 2+ ████████░░ 60% (OsModal✅, ds-form 20. [x] ds-form → formValidation Mixin (async-validator), 18 Dateien migriert, vuelidate entfernt ✅ 21. [x] ds-input → OcelotInput (23 Dateien, Webapp-Komponente mit lokalen Imports, FormItem/Label/Error vereint, formValidation-kompatibel) ✅ 22. [ ] OsMenu / OsMenuItem (17 Dateien) -23. [ ] OsSelect (3 Dateien), OsTable (7 Dateien) +23. [x] ds-select → OcelotSelect (3 Dateien, Webapp-Komponente, click-outside inline, DsChip→OsBadge) ✅ --- -**✅ Phase 0-3 abgeschlossen. Phase 4: Tier 1 + Tier A ✅, Tier B ✅ (Chip→OsBadge, Tag→OsBadge, Grid→HTML, Number→OsNumber, Radio→HTML, Table→HTML), Tier 2: OsModal ✅, ds-form entkoppelt ✅, ds-input → OcelotInput ✅, Rest ausstehend (OsMenu, OsSelect).** +**✅ Phase 0-3 abgeschlossen. Phase 4: Tier 1 + Tier A ✅, Tier B ✅ (Chip→OsBadge, Tag→OsBadge, Grid→HTML, Number→OsNumber, Radio→HTML, Table→HTML), Tier 2: OsModal ✅, ds-form entkoppelt ✅, ds-input → OcelotInput ✅, ds-select → OcelotSelect ✅, Rest ausstehend (OsMenu).** --- diff --git a/packages/ui/PROJEKT.md b/packages/ui/PROJEKT.md index 67a65fbd3..fd7d451f0 100644 --- a/packages/ui/PROJEKT.md +++ b/packages/ui/PROJEKT.md @@ -81,10 +81,10 @@ Phase 0: ██████████ 100% (6/6 Aufgaben) ✅ Phase 1: ██████████ 100% (6/6 Aufgaben) ✅ Phase 2: ██████████ 100% (26/26 Aufgaben) ✅ Phase 3: ██████████ 100% (24/24 Aufgaben) ✅ - Webapp-Integration komplett -Phase 4: ████████░░ 74% (20/27 Aufgaben) - Tier 1 ✅, Tier A ✅, Infra ✅, OsBadge ✅, ds-grid ✅, ds-table→HTML ✅, OsNumber ✅, OsModal ✅, ds-radio→HTML ✅ | Tier B ✅, OcelotInput ✅, Tier 2-3 Rest ausstehend +Phase 4: ████████░░ 78% (21/27 Aufgaben) - Tier 1 ✅, Tier A ✅, Infra ✅, OsBadge ✅, ds-grid ✅, ds-table→HTML ✅, OsNumber ✅, OsModal ✅, ds-radio→HTML ✅ | Tier B ✅, OcelotInput ✅, OcelotSelect ✅, Tier 2-3 Rest ausstehend Phase 5: ░░░░░░░░░░ 0% (0/7 Aufgaben) ─────────────────────────────────────── -Gesamt: ████████░░ 85% (82/96 Aufgaben) +Gesamt: ████████░░ 86% (83/96 Aufgaben) ``` ### Katalogisierung (Details in KATALOG.md) @@ -289,7 +289,7 @@ ds-chip + ds-tag → OsBadge (UI-Library): ✅ - [x] 0 Tier-A `ds-*` Komponenten-Tags verbleibend **Verbleibende ds-* Komponenten (6 Typen):** -- Tier C (→ UI-Library): ds-modal (7→✅ OsModal), ds-input (23→✅ OcelotInput), ds-menu/ds-menu-item (17), ds-select (3) +- Tier C (→ UI-Library): ds-modal (7→✅ OsModal), ds-input (23→✅ OcelotInput), ds-select (3→✅ OcelotSelect), ds-menu/ds-menu-item (17) - ✅ ds-form (18 Dateien) → formValidation Mixin (async-validator), vuelidate entfernt **Zuvor abgeschlossen (Session 26 - CodeRabbit Review Fixes):** @@ -419,7 +419,7 @@ ds-chip + ds-tag → OsBadge (UI-Library): ✅ - [x] ds-form → formValidation Mixin (async-validator), 18 Dateien migriert, vuelidate entfernt ✅ - [x] ds-input → OcelotInput (23 Dateien, Webapp-Komponente mit lokalen Imports, formValidation-kompatibel) ✅ - [ ] ds-menu / ds-menu-item → OsMenu / OsMenuItem -- [ ] ds-select → OsSelect +- [x] ds-select → OcelotSelect (3 Dateien, Webapp-Komponente mit lokalen Imports, click-outside inline) ✅ - [ ] Browser-Fehler untersuchen: `TypeError: Cannot read properties of undefined (reading 'heartO')` (ocelotIcons undefined im Browser trotz korrekter Webpack-Aliase) **Manuelle Setup-Aufgaben (außerhalb Code):** @@ -701,7 +701,7 @@ Jeder migrierte Button muss manuell geprüft werden: Normal, Hover, Focus, Activ - [ ] OsMenuItem (Basis: DsMenuItem, 6 Dateien) **Tier 4: Spezial-Komponenten** -- [ ] OsSelect (3 Dateien) +- [x] ds-select → OcelotSelect (3 Dateien, Webapp-Komponente, click-outside inline, DsChip→OsBadge, DsSpinner→OsSpinner) ✅ - [x] ds-table (7 Dateien) → Plain HTML `` + CSS-Klassen ✅ (kein OsTable nötig) - [x] ds-form → formValidation Mixin (async-validator), vuelidate entfernt ✅ @@ -1853,6 +1853,8 @@ Bei der Migration werden: | 2026-03-14 | **18 Formulare migriert** | CommentForm, ContributionForm, EnterNonce, GroupForm, Password/Change, PasswordReset (2), Registration (5), Signup, MySomethingList, donations, admin/users, settings (3) | | 2026-03-20 | **formValidation Fix** | `handleInput()` vor `$validateForm()` aufrufen (Reihenfolge-Bug: handleInput überschrieb handleInputValid bei synchronem async-validator Callback) | | 2026-03-23 | **ds-input → OcelotInput** | Neue Webapp-Komponente `OcelotInput.vue`: vereint DsInput + FormItem + InputLabel + InputError in einer Datei. 23 Vue-Dateien migriert mit lokalen Imports (tree-shakeable). formValidation Mixin voll kompatibel. dot-prop Abhängigkeit durch inline `getNestedValue()` ersetzt. 28 Test-Suites, 210 Tests ✅, 7 Snapshots aktualisiert. | +| 2026-03-23 | **OcelotInput: ds-icon → os-icon** | DsIcon durch OsIcon + resolveIcon() ersetzt. at.svg, envelope.svg, paperclip.svg zu Ocelot-Icons hinzugefügt. Ocelot-Icons Visual Snapshot aktualisiert. | +| 2026-03-23 | **ds-select → OcelotSelect** | Neue Webapp-Komponente `OcelotSelect.vue`: vereint DsSelect + inputMixin + multiinputMixin (~420 Zeilen). Form-Validation entfernt (von keinem Consumer genutzt). DsChip→OsBadge, DsSpinner→OsSpinner, DsIcon→OsIcon. vue-click-outside durch inline document.addEventListener ersetzt. 3 Dateien migriert, 16 Tests ✅. | --- @@ -1875,7 +1877,8 @@ Bei der Migration werden: | ✅ → UI-Library | Chip, Tag → OsBadge (2), Number → OsNumber (1) — Tier B | | ✅ ds-form entkoppelt | Form-Validierung → formValidation Mixin (async-validator), vuelidate entfernt | | ✅ ds-input → OcelotInput | Webapp-Komponente (23 Dateien), lokale Imports, FormItem/InputLabel/InputError vereint | -| ⬜ → UI-Library | Menu, MenuItem, Select (3) — Tier 2-3 | +| ✅ ds-select → OcelotSelect | Webapp-Komponente (3 Dateien), lokale Imports, click-outside inline, DsChip→OsBadge | +| ⬜ → UI-Library | Menu, MenuItem (2) — Tier 3 | | ⬜ Nicht genutzt | Code, CopyField, FormItem, InputError, InputLabel, Page, PageTitle, Logo, Avatar, TableCol, TableHeadCol (11) | --- diff --git a/webapp/components/OcelotSelect/OcelotSelect.vue b/webapp/components/OcelotSelect/OcelotSelect.vue new file mode 100644 index 000000000..4061609d8 --- /dev/null +++ b/webapp/components/OcelotSelect/OcelotSelect.vue @@ -0,0 +1,450 @@ + + + + + diff --git a/webapp/components/Select/LocationSelect.vue b/webapp/components/Select/LocationSelect.vue index 82d205012..f88d9da9a 100644 --- a/webapp/components/Select/LocationSelect.vue +++ b/webapp/components/Select/LocationSelect.vue @@ -3,7 +3,7 @@ - @@ -30,14 +32,13 @@