Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -738,8 +738,11 @@ h3 {
|
|
| 738 |
""", unsafe_allow_html=True)
|
| 739 |
|
| 740 |
# ========== توابع اصلی ==========
|
|
|
|
|
|
|
|
|
|
| 741 |
def custom_likert_slider(question_data):
|
| 742 |
-
"""نمایش سوال لیکرت با اسلایدر نقطهای و
|
| 743 |
question = question_data["question"]
|
| 744 |
key = question_data["key"]
|
| 745 |
points = question_data["scale"]
|
|
@@ -749,7 +752,7 @@ def custom_likert_slider(question_data):
|
|
| 749 |
default_value = (points + 1) // 2
|
| 750 |
current_value = st.session_state.get(key, default_value)
|
| 751 |
|
| 752 |
-
# HTML و JavaScript برای اسلایدر
|
| 753 |
html = """
|
| 754 |
<div id="container_{0}" style="direction: ltr; font-family: 'B Nazanin'; margin-bottom: 30px;">
|
| 755 |
<label style="font-size: 16px; font-weight: bold; display: block; text-align: right;">{1}</label>
|
|
@@ -757,42 +760,33 @@ def custom_likert_slider(question_data):
|
|
| 757 |
<span>{2}</span>
|
| 758 |
<span>{3}</span>
|
| 759 |
</div>
|
| 760 |
-
<input type="range" id="{0}" min="1" max="{4}" step="1" value="{5}"
|
| 761 |
style="width: 100%; height: 10px; accent-color: #6a0dad; margin-bottom: 15px;"
|
| 762 |
oninput="updateSlider('{0}')"
|
| 763 |
onchange="updateSlider('{0}')">
|
| 764 |
<div style="text-align: center; margin-top: 10px; direction: rtl;">
|
| 765 |
پاسخ انتخابشده: <strong><span id="output_{0}">{5}</span></strong>
|
| 766 |
</div>
|
| 767 |
-
<
|
| 768 |
-
onclick="confirmValue('{0}')">تأیید</button>
|
| 769 |
</div>
|
| 770 |
|
| 771 |
<script>
|
| 772 |
function updateSlider(key) {{
|
| 773 |
-
const slider = document.getElementById(key);
|
| 774 |
const value = parseInt(slider.value);
|
| 775 |
document.getElementById('output_' + key).innerText = value;
|
| 776 |
-
|
| 777 |
-
|
| 778 |
-
|
| 779 |
-
function confirmValue(key) {{
|
| 780 |
-
const value = parseInt(document.getElementById(key).value);
|
| 781 |
-
// ارسال مقدار به Streamlit با یک متغیر مخفی
|
| 782 |
-
const hiddenInput = document.createElement('input');
|
| 783 |
-
hiddenInput.type = 'hidden';
|
| 784 |
-
hiddenInput.name = 'slider_value_' + key;
|
| 785 |
-
hiddenInput.value = value;
|
| 786 |
-
document.getElementById('container_' + key).appendChild(hiddenInput);
|
| 787 |
-
// کلیک کردن روی یک دکمه مخفی در Streamlit برای دریافت مقدار
|
| 788 |
-
window.parent.document.querySelector('[data-testid="stButton"] > button').click();
|
| 789 |
}}
|
| 790 |
|
| 791 |
window.addEventListener('load', () => {{
|
| 792 |
const key = '{0}';
|
| 793 |
const savedValue = localStorage.getItem(key);
|
| 794 |
if (savedValue) {{
|
| 795 |
-
document.getElementById(
|
|
|
|
|
|
|
|
|
|
| 796 |
document.getElementById('output_' + key).innerText = savedValue;
|
| 797 |
}}
|
| 798 |
}});
|
|
@@ -800,22 +794,25 @@ def custom_likert_slider(question_data):
|
|
| 800 |
""".format(key, question, labels[0], labels[1], points, current_value)
|
| 801 |
|
| 802 |
# رندر کامپوننت HTML
|
| 803 |
-
components.html(html, height=
|
| 804 |
|
| 805 |
-
# دریافت مقدار
|
| 806 |
-
|
| 807 |
-
|
| 808 |
-
st.
|
| 809 |
-
|
| 810 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 811 |
|
| 812 |
# برای دیباگ: نمایش مقدار فعلی
|
| 813 |
st.write(f"مقدار فعلی برای {key}: {current_value}")
|
| 814 |
|
| 815 |
-
# دکمه مخفی برای دریافت مقدار (فعال میشه با کلیک روی دکمه تأیید)
|
| 816 |
-
if st.button("دریافت مقدار", key=f"hidden_btn_{key}", type="primary", help="این دکمه توسط JavaScript فعال میشه"):
|
| 817 |
-
pass # این فقط برای دریافت مقدار از hidden input استفاده میشه
|
| 818 |
-
|
| 819 |
return current_value
|
| 820 |
|
| 821 |
def create_ride_map():
|
|
|
|
| 738 |
""", unsafe_allow_html=True)
|
| 739 |
|
| 740 |
# ========== توابع اصلی ==========
|
| 741 |
+
import streamlit as st
|
| 742 |
+
import streamlit.components.v1 as components
|
| 743 |
+
|
| 744 |
def custom_likert_slider(question_data):
|
| 745 |
+
"""نمایش سوال لیکرت با اسلایدر نقطهای و ذخیره مستقیم مقدار با دکمه تأیید"""
|
| 746 |
question = question_data["question"]
|
| 747 |
key = question_data["key"]
|
| 748 |
points = question_data["scale"]
|
|
|
|
| 752 |
default_value = (points + 1) // 2
|
| 753 |
current_value = st.session_state.get(key, default_value)
|
| 754 |
|
| 755 |
+
# HTML و JavaScript برای اسلایدر
|
| 756 |
html = """
|
| 757 |
<div id="container_{0}" style="direction: ltr; font-family: 'B Nazanin'; margin-bottom: 30px;">
|
| 758 |
<label style="font-size: 16px; font-weight: bold; display: block; text-align: right;">{1}</label>
|
|
|
|
| 760 |
<span>{2}</span>
|
| 761 |
<span>{3}</span>
|
| 762 |
</div>
|
| 763 |
+
<input type="range" id="slider_{0}" min="1" max="{4}" step="1" value="{5}"
|
| 764 |
style="width: 100%; height: 10px; accent-color: #6a0dad; margin-bottom: 15px;"
|
| 765 |
oninput="updateSlider('{0}')"
|
| 766 |
onchange="updateSlider('{0}')">
|
| 767 |
<div style="text-align: center; margin-top: 10px; direction: rtl;">
|
| 768 |
پاسخ انتخابشده: <strong><span id="output_{0}">{5}</span></strong>
|
| 769 |
</div>
|
| 770 |
+
<input type="hidden" id="hidden_{0}" name="hidden_{0}" value="{5}">
|
|
|
|
| 771 |
</div>
|
| 772 |
|
| 773 |
<script>
|
| 774 |
function updateSlider(key) {{
|
| 775 |
+
const slider = document.getElementById('slider_' + key);
|
| 776 |
const value = parseInt(slider.value);
|
| 777 |
document.getElementById('output_' + key).innerText = value;
|
| 778 |
+
document.getElementById('hidden_' + key).value = value; // بهروزرسانی مقدار مخفی
|
| 779 |
+
localStorage.setItem(key, value); // ذخیره در localStorage
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 780 |
}}
|
| 781 |
|
| 782 |
window.addEventListener('load', () => {{
|
| 783 |
const key = '{0}';
|
| 784 |
const savedValue = localStorage.getItem(key);
|
| 785 |
if (savedValue) {{
|
| 786 |
+
const slider = document.getElementById('slider_' + key);
|
| 787 |
+
const hiddenInput = document.getElementById('hidden_' + key);
|
| 788 |
+
slider.value = savedValue;
|
| 789 |
+
hiddenInput.value = savedValue;
|
| 790 |
document.getElementById('output_' + key).innerText = savedValue;
|
| 791 |
}}
|
| 792 |
}});
|
|
|
|
| 794 |
""".format(key, question, labels[0], labels[1], points, current_value)
|
| 795 |
|
| 796 |
# رندر کامپوننت HTML
|
| 797 |
+
components.html(html, height=150)
|
| 798 |
|
| 799 |
+
# فرم برای دریافت مقدار
|
| 800 |
+
with st.form(key=f"form_{key}"):
|
| 801 |
+
# مقدار رو از hidden input نمیتونیم مستقیم بخونیم، پس از دکمه استفاده میکنیم
|
| 802 |
+
if st.form_submit_button("ذخیره پاسخ"):
|
| 803 |
+
saved_value = localStorage.getItem(key) # خواندن از localStorage
|
| 804 |
+
if saved_value:
|
| 805 |
+
st.session_state[key] = int(saved_value)
|
| 806 |
+
st.success(f"مقدار {saved_value} برای {key} ذخیره شد!")
|
| 807 |
+
else:
|
| 808 |
+
st.warning("لطفاً اسلایدر را تنظیم کنید و دوباره تلاش کنید.")
|
| 809 |
+
|
| 810 |
+
# مقدار فعلی
|
| 811 |
+
current_value = st.session_state.get(key, default_value)
|
| 812 |
|
| 813 |
# برای دیباگ: نمایش مقدار فعلی
|
| 814 |
st.write(f"مقدار فعلی برای {key}: {current_value}")
|
| 815 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 816 |
return current_value
|
| 817 |
|
| 818 |
def create_ride_map():
|