Spaces:
Running
Running
File size: 7,492 Bytes
6252f54 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | """Hierarchical questionnaire — Domain → Capability Area → Capability → Constraints."""
import streamlit as st
from frontend.utils.api_client import get_domains, get_subdomains, get_subdomain_capabilities
from frontend.utils.terminology import domain_label, subdomain_label
def render_input_form() -> dict | None:
"""Render hierarchical questionnaire. Returns payload dict when submitted."""
st.subheader("Build Your Strategic Context")
st.caption(
"Select your organisation's focus areas step by step — "
"the AI will generate a governance-grounded roadmap tailored to your selection."
)
# ── Step 1: Domain ─────────────────────────────────────────────────────
st.markdown("##### Step 1 — Select Strategic Domains")
all_domains = st.session_state.get("_domains_cache") or get_domains()
st.session_state["_domains_cache"] = all_domains
domain_label_to_raw: dict[str, str] = {
domain_label(d["name"]): d["name"] for d in all_domains
}
domain_raw_to_obj: dict[str, dict] = {d["name"]: d for d in all_domains}
selected_domain_labels = st.multiselect(
"Strategic Domains",
options=sorted(domain_label_to_raw.keys()),
default=st.session_state.get("_sel_domain_labels", []),
help="Choose the enterprise domains relevant to your organisation",
key="sel_domains",
)
st.session_state["_sel_domain_labels"] = selected_domain_labels
selected_domain_names = [domain_label_to_raw[l] for l in selected_domain_labels]
# ── Step 2: Capability Areas (SubDomains) ──────────────────────────────
selected_subdomain_ids: list[str] = []
if selected_domain_names:
st.markdown("##### Step 2 — Select Capability Areas")
cache_key_sd = "subdomains_" + "_".join(sorted(selected_domain_names))
subdomains = st.session_state.get(cache_key_sd)
if subdomains is None:
subdomains = get_subdomains(selected_domain_names)
st.session_state[cache_key_sd] = subdomains
sd_label_to_obj: dict[str, dict] = {
subdomain_label(sd["name"]): sd for sd in subdomains
}
selected_sd_labels = st.multiselect(
"Capability Areas",
options=sorted(sd_label_to_obj.keys()),
default=sorted(sd_label_to_obj.keys()),
help="Capability areas within your selected domains",
key="sel_subdomains",
)
selected_subdomain_ids = [sd_label_to_obj[l]["id"] for l in selected_sd_labels if l in sd_label_to_obj]
# ── Step 3: Capabilities ────────────────────────────────────────────
selected_cap_ids: list[str] = []
if selected_subdomain_ids:
st.markdown("##### Step 3 — Select Strategic Capabilities")
cache_key_caps = "caps_" + "_".join(sorted(selected_subdomain_ids))
capabilities = st.session_state.get(cache_key_caps)
if capabilities is None:
capabilities = get_subdomain_capabilities(selected_subdomain_ids)
st.session_state[cache_key_caps] = capabilities
# Group by subdomain for display
if capabilities:
cap_id_to_obj: dict[str, dict] = {c["id"]: c for c in capabilities}
cap_options = [c["name"] for c in capabilities]
selected_cap_names = st.multiselect(
f"Strategic Capabilities ({len(cap_options)} available)",
options=cap_options,
default=cap_options,
help="Select the specific capabilities to include in your roadmap",
key="sel_caps",
)
selected_cap_ids = [
c["id"] for c in capabilities if c["name"] in selected_cap_names
]
complexity_map = {c["name"]: c.get("complexity", "") for c in capabilities}
if selected_cap_names:
high = sum(1 for n in selected_cap_names if complexity_map.get(n) in ("high", "very_high"))
med = sum(1 for n in selected_cap_names if complexity_map.get(n) == "medium")
low = sum(1 for n in selected_cap_names if complexity_map.get(n) == "low")
st.caption(f"Selected: {len(selected_cap_names)} capabilities · 🔴 {high} high · 🟡 {med} medium · 🟢 {low} low complexity")
else:
st.info("No capabilities found for selected areas.")
selected_cap_ids = []
else:
selected_cap_ids = []
else:
selected_cap_ids = []
st.divider()
# ── Step 4: Organisation & Constraints ─────────────────────────────────
st.markdown("##### Step 4 — Organisation Context & Constraints")
with st.form("analyze_form"):
col_left, col_right = st.columns(2)
with col_left:
org_type = st.text_input(
"Organisation Type",
placeholder="e.g. Commercial Bank, Healthcare Provider, Government Agency",
help="Describe your organisation — used to tailor AI output language and governance references",
)
budget_tier = st.select_slider(
"Budget Tier",
options=["low", "medium", "high"],
value="medium",
)
risk_tolerance = st.select_slider(
"Risk Tolerance",
options=["low", "medium", "high"],
value="medium",
)
with col_right:
timeline_months = st.slider(
"Timeline (months)",
min_value=6,
max_value=36,
value=18,
step=3,
)
goals_text = st.text_area(
"Additional Strategic Goals (optional)",
height=100,
placeholder="e.g. Achieve ISO 27001 certification, Deploy AI-driven fraud detection",
help="Supplements the capability selection above",
)
submitted = st.form_submit_button(
"Generate Strategic Roadmap",
type="primary",
width='stretch',
)
if submitted:
if not org_type.strip():
st.error("Please enter your Organisation Type.")
return None
if not selected_cap_ids and not selected_domain_names:
st.error("Please select at least one Strategic Domain in Step 1.")
return None
extra_goals = [g.strip() for g in goals_text.split(",") if g.strip()] if goals_text else []
goals = extra_goals or [f"Transform {org_type} digital capabilities"]
return {
"org_type": org_type.strip(),
"goals": goals,
"budget_tier": budget_tier,
"timeline_months": timeline_months,
"risk_tolerance": risk_tolerance,
"sector_focus": selected_domain_names,
"selected_capability_ids": selected_cap_ids,
"selected_subdomain_ids": selected_subdomain_ids,
}
return None
|