167 lines
6.4 KiB
Python
167 lines
6.4 KiB
Python
import streamlit as st
|
|
from api import fetch_okrs
|
|
#from config import INPUT_TEMPLATE, team, cycle_definitions
|
|
from config.config import INPUT_EXAMPLE, cycle_definitions, team
|
|
from utils import extract_llm_response
|
|
|
|
import json
|
|
|
|
from ui.parameters import section_parameters
|
|
|
|
def section_user_input():
|
|
# section for input parameters
|
|
section_parameters()
|
|
|
|
# Input Section and Buttons Row
|
|
st.subheader("Enter your idea or goal:")
|
|
user_input = st.text_area(
|
|
"Input your idea here:",
|
|
value=st.session_state.get("user_input", INPUT_EXAMPLE.strip()),
|
|
height=300,
|
|
)
|
|
|
|
st.session_state['user_input'] = user_input
|
|
|
|
generate_okrs_clicked = st.button("Generate OKR Proposal")
|
|
|
|
if generate_okrs_clicked:
|
|
print("session_state:", st.session_state)
|
|
if not user_input.strip():
|
|
st.warning("Please provide some input before generating OKRs.")
|
|
else:
|
|
with st.spinner("Generating OKRs..."):
|
|
response = fetch_okrs(
|
|
user_input=user_input,
|
|
okr_cycle=st.session_state['okr_cycle'],
|
|
num_key_results=st.session_state['num_key_results'])
|
|
|
|
if response:
|
|
# Extract Objective and Key Results from response
|
|
objective, key_results, hint = extract_llm_response(response)
|
|
st.session_state["objective"] = objective
|
|
st.session_state["key_results"] = key_results
|
|
st.session_state["hint"] = hint
|
|
|
|
def section_okr_proposals():
|
|
# Display Results Only if an OKR Has Been Generated
|
|
if "objective" in st.session_state and "key_results" in st.session_state:
|
|
# Ensure team members exist in session state
|
|
if "team_members" not in st.session_state:
|
|
# Sorting the list alphabetically by the first name
|
|
sorted_names = sorted(team, key=lambda name: name.split()[0])
|
|
st.session_state["team_members"] = sorted_names # Default team members
|
|
|
|
team_members = st.session_state["team_members"]
|
|
|
|
# Display Objective Field with Responsibles Input Below It
|
|
st.subheader("Proposal Objective:")
|
|
objective_text = st.text_area(
|
|
"Proposal Objective:",
|
|
value=st.session_state.get("objective", ""),
|
|
height=100,
|
|
)
|
|
|
|
responsible_for_objective = st.multiselect(
|
|
"Select Responsibles for Objective:",
|
|
options=team_members,
|
|
default=[],
|
|
key="responsibles_objective",
|
|
max_selections=1
|
|
)
|
|
|
|
# Display Key Results with Responsibles Below Each One
|
|
st.subheader("Proposal Key Results:")
|
|
key_result_boxes = []
|
|
responsibles_for_key_results = []
|
|
|
|
for i, kr in enumerate(st.session_state["key_results"], start=1):
|
|
kr_text = st.text_area(
|
|
label=f'KR{i}',
|
|
value=kr,
|
|
key=f"proposal_kr_{i}"
|
|
)
|
|
#kr_text = st.text_area(f"Key Result {i}:", value=kr, key=f"kr_{i}")
|
|
responsible_for_kr = st.pills(
|
|
label=f"Select Responsibles for Key Result {i}:",
|
|
options=team_members,
|
|
default=[],
|
|
key=f"responsibles_kr_{i}",
|
|
selection_mode='multi'
|
|
)
|
|
|
|
key_result_boxes.append(kr_text)
|
|
responsibles_for_key_results.append(responsible_for_kr)
|
|
|
|
# Finalize Button Center-Aligned
|
|
if st.button("Finalize"):
|
|
finalized_objective = objective_text.strip()
|
|
finalized_key_results = [st.session_state[f"proposal_kr_{i+1}"].strip() for i in range(len(key_result_boxes))]
|
|
|
|
# Append initials of responsibles to Objective and Key Results
|
|
responsibles_list_objective = responsible_for_objective
|
|
initials_objective = [f"[{''.join([part[0] for part in name.split()]).upper()}]" for name in responsibles_list_objective]
|
|
initials_str_objective = ", ".join(initials_objective)
|
|
|
|
finalized_objective = f"{initials_str_objective} {finalized_objective}"
|
|
st.session_state['finalized_objective'] = finalized_objective
|
|
|
|
finalized_key_results_with_initials = []
|
|
for i, kr in enumerate(finalized_key_results):
|
|
responsibles_list_kr = responsibles_for_key_results[i]
|
|
initials_kr = [f"{''.join([part[0] for part in name.split()]).upper()}" for name in responsibles_list_kr]
|
|
initials_str_kr = ", ".join(initials_kr)
|
|
finalized_key_results_with_initials.append(f"KR{i+1}: [{initials_str_kr}] {kr}")
|
|
st.session_state['finalized_key_results_with_initials'] = finalized_key_results_with_initials
|
|
|
|
# Display finalized data in non-editable format (full width)
|
|
st.subheader("Finalized Objective:")
|
|
st.code(
|
|
body=finalized_objective,
|
|
language=None,
|
|
wrap_lines=True
|
|
)
|
|
|
|
st.subheader("Finalized Key Results:")
|
|
for kr in finalized_key_results_with_initials:
|
|
with st.container():
|
|
col1, col2 = st.columns(spec=[0.1, 0.9])
|
|
with col1:
|
|
st.caption(kr.split(':')[0])
|
|
|
|
with col2:
|
|
st.code(
|
|
body=kr.split(':')[-1],
|
|
language=None,
|
|
wrap_lines=True
|
|
)
|
|
export_data_as_json()
|
|
|
|
def export_data_as_json():
|
|
# Prepare data for export
|
|
finalized_key_results_with_initials = st.session_state.get('finalized_key_results_with_initials')
|
|
export_data = {
|
|
"user_input": st.session_state.get('user_input'),
|
|
"finalized_objective": st.session_state.get('finalized_objective'),
|
|
"key_results": [kr.split(':')[-1].strip() for kr in finalized_key_results_with_initials]
|
|
}
|
|
|
|
# Convert data to JSON string
|
|
json_data = json.dumps(export_data, indent=4)
|
|
|
|
# Add a download button
|
|
st.download_button(
|
|
label="Download Finalized OKR",
|
|
data=json_data,
|
|
file_name="okr_data.json",
|
|
mime="application/json"
|
|
)
|
|
|
|
def proposer_page():
|
|
# Streamlit App Layout
|
|
st.title("AO/PM OKR Proposer")
|
|
|
|
section_user_input()
|
|
|
|
section_okr_proposals()
|
|
|