File size: 3,939 Bytes
ef365c3
a3d26e6
8b93442
a3d26e6
92b1222
 
 
 
 
 
 
 
 
 
 
a3d26e6
 
 
c709917
 
8b93442
 
 
 
 
 
 
 
59ba192
8b93442
 
 
 
 
92b1222
 
 
8b93442
 
 
 
 
 
 
 
92b1222
8b93442
92b1222
 
 
 
 
 
 
 
 
8b93442
92b1222
 
 
 
 
 
 
 
 
8b93442
92b1222
 
 
 
 
 
 
 
 
 
8b93442
92b1222
 
ef365c3
92b1222
 
 
 
 
8b93442
92b1222
 
 
 
 
 
 
8b93442
92b1222
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8b93442
92b1222
 
 
 
 
 
3a8ddd8
a3d26e6
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
import datetime
import streamlit as st
from util import getYamlConfig

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:
        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.")

    # Charge la configuration YAML
    config = getYamlConfig()
    
    # Vérifie si la structure inclut des 'parts' ou une liste de variables
    if 'parts' in config['variables']:
        # Cas avec 'parts' : Trie les parts et affiche les champs par onglet
        parts = 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:
                        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:
            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()