GSMEthesis commited on
Commit
7ff99cf
·
verified ·
1 Parent(s): 76db210

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -31
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
- <button id="confirm_{0}" style="background-color: #6a0dad; color: white; border: none; border-radius: 8px; padding: 8px 16px; margin-top: 10px; cursor: pointer;"
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
- localStorage.setItem(key, value); // ذخیره موقت در localStorage
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(key).value = savedValue;
 
 
 
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=200) # افزایش ارتفاع برای نمایش دکمه
804
 
805
- # دریافت مقدار از فرم یا session_state
806
- if st.session_state.get(f"slider_value_{key}", None) is not None:
807
- current_value = st.session_state[f"slider_value_{key}"]
808
- st.session_state[key] = current_value # ذخیره در session_state با کلید اصلی
809
- else:
810
- current_value = st.session_state.get(key, default_value)
 
 
 
 
 
 
 
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():