Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -738,33 +738,23 @@ h3 {
|
|
| 738 |
""", unsafe_allow_html=True)
|
| 739 |
|
| 740 |
# ========== توابع اصلی ==========
|
|
|
|
| 741 |
def enhanced_likert_scale(question_data):
|
| 742 |
"""لیکرت اسکیل با خط و نقاط - کاملاً واکنشگرا"""
|
| 743 |
question = question_data["question"]
|
| 744 |
key = question_data["key"]
|
| 745 |
scale = question_data["scale"]
|
| 746 |
-
labels = question_data.get("labels", ["کاملاً مخالفم", "کاملاً موافقم"])
|
| 747 |
-
|
|
|
|
| 748 |
if key not in st.session_state:
|
| 749 |
st.session_state[key] = None
|
| 750 |
-
|
| 751 |
# نمایش سوال
|
| 752 |
st.markdown(f"<div style='text-align:center; font-weight:bold; margin-bottom:15px;'>{question}</div>",
|
| 753 |
unsafe_allow_html=True)
|
| 754 |
-
|
| 755 |
-
# ایجاد
|
| 756 |
-
selected_value = st.selectbox(
|
| 757 |
-
"لطفاً یک گزینه را انتخاب کنید:",
|
| 758 |
-
options=range(1, scale+1), # گزینهها از 1 تا scale
|
| 759 |
-
index=st.session_state.get(key) - 1 if st.session_state.get(key) else 0, # پیشفرض انتخاب شده
|
| 760 |
-
key=f"select_{key}",
|
| 761 |
-
format_func=lambda x: labels[x-1] # برچسبها برای هر گزینه
|
| 762 |
-
)
|
| 763 |
-
|
| 764 |
-
# ذخیره انتخاب کاربر
|
| 765 |
-
st.session_state[key] = selected_value
|
| 766 |
-
|
| 767 |
-
# نمایش خط و دکمهها با HTML/CSS
|
| 768 |
scale_html = f"""
|
| 769 |
<style>
|
| 770 |
.likert-line {{
|
|
@@ -822,28 +812,60 @@ def enhanced_likert_scale(question_data):
|
|
| 822 |
}}
|
| 823 |
}}
|
| 824 |
</style>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 825 |
"""
|
| 826 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 827 |
# نمایش مقدار انتخاب شده
|
| 828 |
if st.session_state.get(key):
|
| 829 |
-
scale_html += f"<div class='likert-value'>پاسخ شما: {
|
| 830 |
|
| 831 |
scale_html += "</div>"
|
| 832 |
-
|
| 833 |
-
# تزریق
|
| 834 |
-
components.html(scale_html
|
| 835 |
-
|
| 836 |
-
|
| 837 |
-
|
| 838 |
-
|
| 839 |
-
|
| 840 |
-
|
| 841 |
-
|
| 842 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 843 |
return st.session_state.get(key)
|
| 844 |
|
| 845 |
-
|
| 846 |
-
|
| 847 |
def create_ride_map():
|
| 848 |
"""ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""
|
| 849 |
# نقاط تقریبی برای مناطق عمومی جنوب و غرب تهران
|
|
|
|
| 738 |
""", unsafe_allow_html=True)
|
| 739 |
|
| 740 |
# ========== توابع اصلی ==========
|
| 741 |
+
|
| 742 |
def enhanced_likert_scale(question_data):
|
| 743 |
"""لیکرت اسکیل با خط و نقاط - کاملاً واکنشگرا"""
|
| 744 |
question = question_data["question"]
|
| 745 |
key = question_data["key"]
|
| 746 |
scale = question_data["scale"]
|
| 747 |
+
labels = question_data.get("labels", \["کاملاً مخالفم", "کاملاً موافقم"])
|
| 748 |
+
|
| 749 |
+
```
|
| 750 |
if key not in st.session_state:
|
| 751 |
st.session_state[key] = None
|
| 752 |
+
|
| 753 |
# نمایش سوال
|
| 754 |
st.markdown(f"<div style='text-align:center; font-weight:bold; margin-bottom:15px;'>{question}</div>",
|
| 755 |
unsafe_allow_html=True)
|
| 756 |
+
|
| 757 |
+
# ایجاد خط و نقاط با HTML/CSS
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 758 |
scale_html = f"""
|
| 759 |
<style>
|
| 760 |
.likert-line {{
|
|
|
|
| 812 |
}}
|
| 813 |
}}
|
| 814 |
</style>
|
| 815 |
+
|
| 816 |
+
<div class='likert-container'>
|
| 817 |
+
<div class='likert-labels'>
|
| 818 |
+
<span>{labels[1]}</span>
|
| 819 |
+
<span>{labels[0]}</span>
|
| 820 |
+
</div>
|
| 821 |
+
<div class='likert-line'>
|
| 822 |
"""
|
| 823 |
|
| 824 |
+
# اضافه کردن نقاط
|
| 825 |
+
for i in range(scale):
|
| 826 |
+
value = scale - i
|
| 827 |
+
is_selected = st.session_state.get(key) == value
|
| 828 |
+
scale_html += f"<div class='likert-dot {'selected' if is_selected else ''}' onclick='setLikertValue({value})'></div>"
|
| 829 |
+
|
| 830 |
+
scale_html += "</div>"
|
| 831 |
+
|
| 832 |
# نمایش مقدار انتخاب شده
|
| 833 |
if st.session_state.get(key):
|
| 834 |
+
scale_html += f"<div class='likert-value'>پاسخ شما: {st.session_state[key]}</div>"
|
| 835 |
|
| 836 |
scale_html += "</div>"
|
| 837 |
+
|
| 838 |
+
# تزریق JavaScript برای مدیریت کلیک
|
| 839 |
+
components.html(scale_html + """
|
| 840 |
+
<script>
|
| 841 |
+
function setLikertValue(value) {
|
| 842 |
+
const streamlitDoc = window.parent.document;
|
| 843 |
+
const buttons = streamlitDoc.querySelectorAll('button[data-testid="stButton"]'); // جستجوی دکمهها در DOM
|
| 844 |
+
buttons.forEach(btn => {
|
| 845 |
+
if (btn.textContent.trim() === String(value)) {
|
| 846 |
+
btn.click(); // کلیک روی دکمه مورد نظر برای انتخاب مقدار
|
| 847 |
+
}
|
| 848 |
+
});
|
| 849 |
+
}
|
| 850 |
+
</script>
|
| 851 |
+
""", height=80)
|
| 852 |
+
|
| 853 |
+
# دکمههای واقعی (مخفی و کوچک)
|
| 854 |
+
btn_cols = st.columns(scale)
|
| 855 |
+
for i in range(scale):
|
| 856 |
+
with btn_cols[i]:
|
| 857 |
+
value = scale - i
|
| 858 |
+
if st.button(
|
| 859 |
+
str(value),
|
| 860 |
+
key=f"{key}_btn_{value}",
|
| 861 |
+
type="primary" if st.session_state.get(key) == value else "secondary",
|
| 862 |
+
help="این دکمهها مخفی هستند" # پیام راهنما
|
| 863 |
+
):
|
| 864 |
+
st.session_state[key] = value
|
| 865 |
+
st.rerun()
|
| 866 |
+
|
| 867 |
return st.session_state.get(key)
|
| 868 |
|
|
|
|
|
|
|
| 869 |
def create_ride_map():
|
| 870 |
"""ایجاد نقشه سفر با Folium - نسخه اصلاح شده با مناطق عمومی"""
|
| 871 |
# نقاط تقریبی برای مناطق عمومی جنوب و غرب تهران
|