"""
مكون الشريط الجانبي لنظام واهبي لتحليل العقود والمناقصات
Sidebar component for WAHBI Tender Analysis System
"""
import streamlit as st
import os
from pathlib import Path
import streamlit_option_menu as option_menu
import json
def get_user_info():
"""
استرجاع معلومات المستخدم الحالي (يُستخدم كمثال بسيط)
"""
# في بيئة الإنتاج، هذه المعلومات يجب أن تأتي من نظام المصادقة
return {
"name": "محمد أحمد",
"role": "محلل عقود",
"image": None
}
def render_sidebar():
"""
عرض الشريط الجانبي الرئيسي للتطبيق
"""
with st.sidebar:
# عرض معلومات المستخدم
user = get_user_info()
# مربع معلومات المستخدم
st.markdown(f"""
{user["name"][0] if user["name"] else "م"}
{user["name"]}
{user["role"]}
""", unsafe_allow_html=True)
# القائمة الرئيسية باستخدام كومبوننت الشريط الجانبي
selected = option_menu.option_menu(
menu_title="الوصول السريع",
options=[
"الرئيسية",
"تحليل العقود",
"حاسبة التكاليف",
"إدارة المشاريع",
"الخريطة التفاعلية",
"المساعد الذكي",
"التقارير",
"الإعدادات"
],
icons=[
"house-fill",
"file-earmark-text-fill",
"calculator-fill",
"clipboard2-data-fill",
"geo-alt-fill",
"robot",
"bar-chart-fill",
"gear-fill"
],
menu_icon="list",
default_index=0,
styles={
"container": {"padding": "0!important", "background-color": "transparent", "direction": "rtl"},
"icon": {"color": "#1E88E5", "font-size": "1rem", "float": "right", "margin-left": "10px"},
"nav-link": {
"font-size": "0.9rem",
"text-align": "right",
"direction": "rtl",
"--hover-color": "#E3F2FD",
"margin-bottom": "0.2rem",
"padding-right": "15px",
},
"nav-link-selected": {"background-color": "#1E88E5", "color": "white", "text-align": "right"},
}
)
# تخزين القيمة المحددة في session_state
st.session_state["sidebar_selected"] = selected
# إظهار حالة الاتصال بقاعدة البيانات وحالة النظام
st.markdown("""
""", unsafe_allow_html=True)
# معلومات النظام وعنوان المشروع
with st.expander("حول النظام", expanded=False):
st.markdown("""
نظام واهبي للذكاء الاصطناعي - إصدار 2.0
تحليل العقود والمناقصات
© 2025 جميع الحقوق محفوظة
""", unsafe_allow_html=True)
def get_sidebar_selection():
"""
الحصول على العنصر المحدد في القائمة الجانبية
"""
return st.session_state.get("sidebar_selected", "الرئيسية")
def render_module_sidebar(module_name, options=[]):
"""
عرض شريط جانبي مخصص للوحدة
المعلمات:
module_name (str): اسم الوحدة
options (list): قائمة بالخيارات المتاحة في الوحدة
"""
with st.sidebar:
# عنوان الوحدة
st.markdown(f"""
{module_name}
""", unsafe_allow_html=True)
# إذا تم توفير خيارات للوحدة
if options:
selected = option_menu.option_menu(
menu_title=None,
options=options,
menu_icon=None,
default_index=0,
styles={
"container": {"padding": "0!important", "background-color": "transparent", "direction": "rtl"},
"icon": {"color": "#1E88E5", "font-size": "1rem", "float": "right", "margin-left": "10px"},
"nav-link": {
"font-size": "0.9rem",
"text-align": "right",
"direction": "rtl",
"--hover-color": "#E3F2FD",
"margin-bottom": "0.2rem",
"padding-right": "15px",
"padding": "0.5rem"
},
"nav-link-selected": {"background-color": "#1E88E5", "color": "white", "text-align": "right"},
}
)
# تخزين الخيار المحدد
st.session_state[f"{module_name}_selected"] = selected
return selected
# زر للعودة إلى القائمة الرئيسية
if st.button("العودة للقائمة الرئيسية", key=f"back_btn_{module_name}"):
st.session_state["sidebar_selected"] = "الرئيسية"
st.rerun()
def get_module_selection(module_name):
"""
الحصول على العنصر المحدد في قائمة الوحدة
المعلمات:
module_name (str): اسم الوحدة
"""
return st.session_state.get(f"{module_name}_selected", None)