Files
inter-hub/Web/View/RequirementCandidates/Edit.hs
Bernd Worsch 840b0e5c7b feat(P2+P3): IHF Phase 2 complete; register Phase 3 workplan
Phase 2 — Structured Feedback and Triage (IHUB-WP-0002):
- Schema: annotation_threads, requirement_candidates, triage_states,
  reviewer_assignments; annotations extended with severity + thread_id
- AnnotationThreadsController: create threads, assign annotations
- RequirementCandidatesController: CRUD, escalation, triage lifecycle,
  reviewer assignment, my-queue
- Annotation severity (low/medium/high/critical) with Tailwind color cues
- TriageDashboardAction on HubsController with autoRefresh
- Integration tests (T01–T09), SCOPE.md updated, docs/phase2-summary.md

Phase 3 — Governance and Decision Linkage (IHUB-WP-0003):
- Workplan registered: 9 tasks, State Hub workstream 5f201ee3

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-29 10:42:56 +00:00

56 lines
1.9 KiB
Haskell

module Web.View.RequirementCandidates.Edit where
import Web.Types
import Generated.Types
import IHP.Prelude
import IHP.ViewPrelude
data EditView = EditView
{ candidate :: !RequirementCandidate
, widgets :: ![Widget]
, threads :: ![AnnotationThread]
}
instance View EditView where
html EditView { .. } = [hsx|
<div class="mb-6 flex items-center gap-2 text-sm text-gray-500">
<a href={RequirementCandidatesAction} class="hover:text-gray-700">Candidates</a>
<span>/</span>
<a href={ShowRequirementCandidateAction { requirementCandidateId = candidate.id }}
class="hover:text-gray-700">{candidate.title}</a>
<span>/</span>
<span>Edit</span>
</div>
<div class="max-w-lg">
<h1 class="text-2xl font-semibold mb-6">Edit Candidate</h1>
{renderForm candidate widgets threads}
</div>
|]
renderForm :: RequirementCandidate -> [Widget] -> [AnnotationThread] -> Html
renderForm candidate widgets threads = formFor candidate [hsx|
{(textField #title) { fieldLabel = "Title" }}
{(textareaField #description) { fieldLabel = "Description" }}
{selectField #sourceWidgetId (widgetOptions widgets)}
{selectField #sourceThreadId (threadOptions threads)}
{selectField #category categoryOptions}
{submitButton}
|]
widgetOptions :: [Widget] -> [(Text, Text)]
widgetOptions = map (\w -> (w.name, show w.id))
threadOptions :: [AnnotationThread] -> [(Text, Text)]
threadOptions threads = ("None", "") : map (\t -> (t.title, show t.id)) threads
categoryOptions :: [(Text, Text)]
categoryOptions =
[ ("Friction", "friction")
, ("Defect", "defect")
, ("Wish", "wish")
, ("Policy Concern", "policy_concern")
, ("Documentation Gap", "doc_gap")
, ("Trust", "trust")
, ("Other", "other")
]