From b7ebdf76703b654cfe7291008eb7ea6ad4472b6b Mon Sep 17 00:00:00 2001 From: Perplexity Date: Sun, 11 Oct 2026 17:11:17 +0000 Subject: [PATCH] Add guided proposal creation wizard Replaces the single-form New Proposal modal with a multi-step wizard aligned with the backend's structured revision data: - Basics: title and proposal type (General / Funding / Policy) - Decision: decision requested, rationale, responsible party, conflict disclosure - Scope & risks: in/out-of-scope lists and risk+mitigation pairs - Funding or Policy: type-specific structured fields (max authorization with currency, target date, finished criteria, milestones; supersedes, effective date) - Narrative: optional free-form markdown via PostBuilder, mapped to the additional context section - Review: grouped summary before submission The wizard builds commonData/typeData payloads and per-step validation, and Modal gains a footer slot used for Back/Next/Create navigation. Generated API models are extended in place with the new optional fields until the backend spec is regenerated. Verification: npx vue-tsc -b and npm run build both pass cleanly. --- src/components/Sidebar.vue | 4 +- src/components/modals/Modal.vue | 34 +-- src/components/modals/ProposalModal.vue | 74 ----- src/components/modals/ProposalWizardModal.vue | 152 ++++++++++ src/components/wizard/ListInput.vue | 72 +++++ src/components/wizard/WizardBasicsStep.vue | 58 ++++ src/components/wizard/WizardDecisionStep.vue | 65 +++++ src/components/wizard/WizardFundingStep.vue | 130 +++++++++ src/components/wizard/WizardNarrativeStep.vue | 26 ++ src/components/wizard/WizardPolicyStep.vue | 37 +++ src/components/wizard/WizardReviewStep.vue | 160 +++++++++++ src/components/wizard/WizardScopeStep.vue | 90 ++++++ src/components/wizard/WizardStepper.vue | 53 ++++ src/composables/useProposalWizard.ts | 269 ++++++++++++++++++ .../typescript/models/AddProposalRequest.ts | 12 + .../models/ProposalParagraphRequest.ts | 12 + src/types/proposalWizard.ts | 46 +++ 17 files changed, 1202 insertions(+), 92 deletions(-) delete mode 100644 src/components/modals/ProposalModal.vue create mode 100644 src/components/modals/ProposalWizardModal.vue create mode 100644 src/components/wizard/ListInput.vue create mode 100644 src/components/wizard/WizardBasicsStep.vue create mode 100644 src/components/wizard/WizardDecisionStep.vue create mode 100644 src/components/wizard/WizardFundingStep.vue create mode 100644 src/components/wizard/WizardNarrativeStep.vue create mode 100644 src/components/wizard/WizardPolicyStep.vue create mode 100644 src/components/wizard/WizardReviewStep.vue create mode 100644 src/components/wizard/WizardScopeStep.vue create mode 100644 src/components/wizard/WizardStepper.vue create mode 100644 src/composables/useProposalWizard.ts create mode 100644 src/types/proposalWizard.ts diff --git a/src/components/Sidebar.vue b/src/components/Sidebar.vue index d44067f..63b8708 100644 --- a/src/components/Sidebar.vue +++ b/src/components/Sidebar.vue @@ -38,7 +38,7 @@ import { useRoute, useRouter } from "vue-router"; import ProposalContainer from "./ProposalContainer.vue"; import LoadingSpinner from "./LoadingSpinner.vue"; import { useLoading } from "../composables/useLoading.ts"; -import ProposalModal from "./modals/ProposalModal.vue"; +import ProposalWizardModal from "./modals/ProposalWizardModal.vue"; import { ContentModal, useModal } from "../composables/useModal.ts"; import FilterModal from "./modals/FilterModal.vue"; import Filter from "./icons/Filter.vue"; @@ -66,7 +66,7 @@ const handleSelection = (proposalId: number) => { }; const showNewProposalModal = () => { - showModal(ProposalModal as ContentModal); + showModal(ProposalWizardModal as ContentModal); }; const showFilterModal = () => { diff --git a/src/components/modals/Modal.vue b/src/components/modals/Modal.vue index 49b8c33..932f259 100644 --- a/src/components/modals/Modal.vue +++ b/src/components/modals/Modal.vue @@ -44,22 +44,24 @@ diff --git a/src/components/modals/ProposalModal.vue b/src/components/modals/ProposalModal.vue deleted file mode 100644 index 1c3b6be..0000000 --- a/src/components/modals/ProposalModal.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/modals/ProposalWizardModal.vue b/src/components/modals/ProposalWizardModal.vue new file mode 100644 index 0000000..10a414b --- /dev/null +++ b/src/components/modals/ProposalWizardModal.vue @@ -0,0 +1,152 @@ + + + diff --git a/src/components/wizard/ListInput.vue b/src/components/wizard/ListInput.vue new file mode 100644 index 0000000..331cfd3 --- /dev/null +++ b/src/components/wizard/ListInput.vue @@ -0,0 +1,72 @@ + + + diff --git a/src/components/wizard/WizardBasicsStep.vue b/src/components/wizard/WizardBasicsStep.vue new file mode 100644 index 0000000..32d2332 --- /dev/null +++ b/src/components/wizard/WizardBasicsStep.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/components/wizard/WizardDecisionStep.vue b/src/components/wizard/WizardDecisionStep.vue new file mode 100644 index 0000000..4ceb34e --- /dev/null +++ b/src/components/wizard/WizardDecisionStep.vue @@ -0,0 +1,65 @@ +