Implemented the output contract and readiness semantics for review packs. Also added spec 348. Includes changes to ChooseEnvironment, CustomerReviewWorkspace, GenerateReviewPackJob and related blade views. Added comprehensive tests. Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #419
8.4 KiB
Feature Specification: Spec 348 - Choose Environment Enterprise Selector
Feature Branch: 348-choose-environment-enterprise-selector
Created: 2026-06-02
Status: Draft
Type: Narrow UI productization / operator context selection
Input: User asked to implement the enterprise best-practice findings from the in-app browser review of /admin/choose-environment.
Spec Candidate Check
- Problem: The environment chooser is conceptually correct but its card grid overflows at common desktop/tablet widths, hides secondary actions below the list, and does not scale well when a workspace has many environments.
- Today's failure: Long environment names/domains and the raw
MANAGED_ENVIRONMENTbadge can spill out of cards, making the first context-selection step feel unreliable for enterprise operators. - User-visible improvement: The selector becomes a stable single-column work surface with search, top-level secondary actions, localized empty/search states, and card content that cannot overflow.
- Smallest enterprise-capable version: Rework the existing
/admin/choose-environmentpage and its custom Blade only. Add a Livewire search property and focused Feature tests. - Explicit non-goals: No new route, no new model/table, no new selector framework, no new global design component, no role/capability change, no destructive action, no provider integration change.
- Permanent complexity imported: One public Livewire string property, one filtered collection method, localization keys, and focused tests.
- Why now: The page is the first environment-context decision after workspace selection, and visible overflow undermines trust before the operator enters an admin workflow.
- Why not local: The fix is local and intentionally stays local; a broader selector framework would be disproportionate.
- Approval class: Cleanup.
- Red flags triggered: UI surface change only. No persistence, status, taxonomy, or abstraction red flags.
- Score: Nutzen: 2 | Dringlichkeit: 2 | Scope: 2 | Komplexitaet: 2 | Produktnaehe: 2 | Wiederverwendung: 1 | Gesamt: 11/12
- Decision: approve.
Spec Scope Fields
- Scope: workspace + environment selector.
- Primary Routes:
/admin/choose-environment. - Data Ownership: No data model ownership changes. Existing workspace and managed-environment records remain authoritative.
- RBAC: Existing workspace membership, environment entitlement, operability, and deny-as-not-found checks remain authoritative.
UI Surface Impact
- No UI surface impact
- Existing page changed
- New page/route added
- Navigation changed
- Filament panel/provider surface changed
- New table/form/state added
- Customer-facing surface changed
- Dangerous action changed
- Workspace/environment context presentation changed
UI/Productization Coverage
- Route/page/surface:
/admin/choose-environment,App\Filament\Pages\ChooseEnvironment,resources/views/filament/pages/choose-environment.blade.php. - Current or new page archetype: Workspace / Tenant Context, continuing route inventory row
UI-004. - Design depth: Domain Pattern Surface.
- Repo-truth level: repo-verified.
- Existing pattern reused: Filament page, existing environment lifecycle presentation, existing workspace context, existing secondary action destinations.
- New pattern required: none. The page keeps a local selector layout.
- Screenshot required: no persistent audit screenshot for this narrow cleanup; browser verification is sufficient.
- Page audit required: no new report required; route inventory classification stays valid.
- Customer-safe review required: no.
- Dangerous-action review required: no destructive/high-impact action is added.
- Coverage files updated or explicitly not needed: Active spec documents the checked impact; durable route classification
UI-004remains accurate.
Cross-Cutting / Shared Pattern Reuse
- Cross-cutting feature?: yes, narrowly.
- Interaction classes: context selector, secondary action links, status badges.
- Existing patterns to extend: TenantPilot enterprise UI standards for static/interactive rows, action hierarchy, and status-as-badge semantics.
- Allowed deviation and why: none.
- Consistency impact: Search and secondary actions must stay neutral; status remains badges; hidden raw provider/technical labels must not dominate the selector.
OperationRun UX Impact
N/A - no OperationRun start, completion, or link semantics touched.
Provider Boundary / Platform Core Check
- Shared provider/platform boundary touched?: yes, vocabulary only.
- Boundary classification: platform-core selector wording.
- Seams affected: visible labels and search matching over existing environment fields.
- Neutral platform terms preserved: workspace, environment, active operating context.
- Provider-specific semantics retained and why: none added.
Proportionality Review
- New source of truth?: no.
- New persisted entity/table/artifact?: no.
- New abstraction?: no.
- New enum/state/reason family?: no.
- New cross-domain UI framework/taxonomy?: no.
- Current operator problem: overflow and poor scanability on the first environment-context decision.
- Existing structure is insufficient because: the current dynamic grid produces columns too narrow for the Filament simple layout.
- Narrowest correct implementation: one-page layout adjustment plus one local search property.
- Ownership cost: one method and a few localized strings.
- Alternative intentionally rejected: new reusable selector component; not justified by one page.
- Release truth: current-release cleanup.
Testing / Lane / Runtime Impact
- Test purpose / classification: Feature.
- Validation lane(s): fast-feedback.
- Why sufficient: The change is server-rendered Blade plus Livewire state; focused HTTP and Livewire Feature assertions prove visibility, filtering, and hidden raw label behavior.
- New or expanded test families: none.
- Fixture/helper cost impact: uses existing factories and
createUserWithTenant(). - Heavy-family visibility / justification: no browser test added; in-app browser verification covers the visual regression for this task.
- Planned validation commands:
cd apps/platform && ./vendor/bin/sail artisan test tests/Feature/Workspaces/ChooseEnvironmentPageTest.php --compactcd apps/platform && ./vendor/bin/sail pint app/Filament/Pages/ChooseEnvironment.php tests/Feature/Workspaces/ChooseEnvironmentPageTest.phpgit diff --check
User Scenarios & Testing
User Story 1 - Select an environment without layout ambiguity (P1)
As a workspace operator, I need each environment row to stay readable at desktop, tablet, and mobile widths so I can safely choose the intended context.
Acceptance Criteria
- The chooser uses a single-column selector layout inside the Filament simple layout.
- Raw
MANAGED_ENVIRONMENTlabels are not default-visible for ordinary managed environments. - Status remains shown as a small badge.
User Story 2 - Find one environment in a larger workspace (P1)
As an MSP/operator, I need search on the selector so I can narrow the list by environment name, domain, status, or visible context.
Acceptance Criteria
- Search filters the selectable environment collection without changing authorization scope.
- The result count is visible while searching.
- A no-results state provides a clear reset action.
User Story 3 - Reach secondary context actions immediately (P2)
As an operator, I need Add Environment and Switch Workspace visible near the top so I do not scroll past long environment lists for context-management actions.
Acceptance Criteria
- Secondary actions render in the selector header.
- Actions use neutral styling and real routes.
- No destructive action is introduced.
Requirements
- FR-348-001: The selector MUST not use dynamic two-/three-column grids inside the simple page container.
- FR-348-002: Environment cards MUST include stable
data-testidattributes for browser and feature assertions. - FR-348-003: Search MUST use Livewire v4-compatible debounced binding.
- FR-348-004: Existing workspace/environment entitlement and operability checks MUST remain unchanged.
- FR-348-005: The page MUST remain free of destructive/high-impact actions.