File size: 4,306 Bytes
c3b4e7b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import datetime
import streamlit as st
from util import getYamlConfig

company_code = "afp_"

def update_session_state(key,):
    # Get new value from session state and change key for save it in params
    new_value = st.session_state[key]
    key = key[5:]
    
    for item in st.session_state["data_dict"][st.session_state["company_code"]]:
        if item['key'] == key:
            item['value'] = new_value
            break


def page():
    st.subheader("Définissez vos paramètres")
    st.text("L'ensemble des critères sont facultatifs.")

    st.session_state["company_code"] = company_code
    company_config = None

    # Charge la configuration YAML
    config = getYamlConfig()

    for company in config['companies']:
        if company['code'] == st.session_state["company_code"]:
            company_config = company


    # Vérifie si la structure inclut des 'parts' ou une liste de variables
    if 'parts' in company_config['variables']:
        # Cas avec 'parts' : Trie les parts et affiche les champs par onglet
        parts = company_config["variables"]["parts"]
        parts_sorted = sorted(parts, key=lambda part: part.get('number', float('inf')))
        
        # Création de tabs pour chaque 'part' trié
        tabs = st.tabs([part['name'] for part in parts_sorted])
        for part, tab in zip(parts_sorted, tabs):
            with tab:
                for field in part['fields']:
                    for field_session in st.session_state["data_dict"][st.session_state["company_code"]]:
                        if field['key'] == field_session['key']:
                            display_field(field_session)
    else:
        # Display fields directly if no parts are defined
        for field in st.session_state["data_dict"][st.session_state["company_code"]]:
            display_field(field)


def display_field(field):
    """Helper function to create the correct input based on field 'nature'."""
    key = 'form_' + field['key']
    if field['nature'] == 'radio':
        st.radio(
            field['label'],
            field['options'],
            index=field['options'].index(field.get('value')) if field.get('value') in field['options'] else 0,
            key=key,
            on_change=update_session_state,
            args=(key,)
        )

    elif field['nature'] == 'selectbox':
        st.selectbox(
            field['label'], 
            field['options'], 
            index=field['options'].index(field.get('value')) if field.get('value', []) in field['options'] else 0, 
            key=key, 
            on_change=update_session_state,
            args=(key,)
        )

    elif field['nature'] == 'multiselect':
        default_values = field.get('value', [])

        st.multiselect(
            field['label'], 
            field['options'], 
            default=default_values if default_values else None, 
            key=key, 
            on_change=update_session_state,
            args=(key,)
        )
    elif field['nature'] == 'date':
        st.date_input(
            field['label'], 
            value=datetime.date.fromisoformat("2011-09-20"),
            key=key, 
            on_change=update_session_state,
            args=(key,)
        )

    elif field['nature'] == 'numeric':
        st.number_input(field['label'], 
            value=field.get('value', 0), 
            key=key, 
            on_change=update_session_state,
            args=(key,)
        )

    elif field['nature'] == 'text_area':
        st.text_area(field['label'], 
            value=field.get('value', ""), 
            key=key, 
            on_change=update_session_state,
            args=(key,)
        )

    elif field['nature'] == 'slider':
        st.slider(field['label'], 
            value=field.get('value', [0, 1000]), 
            min_value=field.get('min', 0),        # Valeur minimale du slider
            max_value=field.get('max', 5000),        # Valeur maximale du slider
            step=field.get('step', 500),
            key=key, 
            on_change=update_session_state,
            args=(key,)
        )

    else:
        st.text_input(label=field['label'], 
            value=field.get('value', ""), 
            key=key, 
            on_change=update_session_state,
            args=(key,)
        )

page()