Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| import numpy as np | |
| import os | |
| # Configure the page to be mobile-friendly | |
| st.set_page_config(layout="centered", page_title="Halal Restaurant Data Viewer") | |
| # URLs for the logos | |
| MAIN_LOGO_URL = "https://islamictrusthk.org/assets/images/top-logo.png" | |
| SIDEBAR_LOGO_URL = "https://bot.islamictrusthk.org/assets/content_files/20240606095159123011.png" | |
| # Inject custom CSS for better mobile compatibility | |
| st.markdown( | |
| """ | |
| <style> | |
| /* Adjust font sizes for mobile devices */ | |
| @media (max-width: 600px) { | |
| .stTextInput, .stMultiSelect { | |
| font-size: 14px; | |
| } | |
| .stDataFrame { | |
| font-size: 12px; | |
| } | |
| .stButton button { | |
| font-size: 14px; | |
| } | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True, | |
| ) | |
| # Directory to save uploaded files | |
| UPLOAD_DIR = "uploaded_files" | |
| os.makedirs(UPLOAD_DIR, exist_ok=True) | |
| # Function to load data | |
| def load_data(file_path): | |
| df = pd.read_excel(file_path) | |
| df.fillna("Not Available", inplace=True) | |
| return df | |
| # Function to convert dataframe to CSV | |
| def convert_df_to_csv(df): | |
| return df.to_csv(index=False).encode('utf-8') | |
| # Function to format date | |
| def format_date_column(df, column): | |
| df[column] = pd.to_datetime(df[column], errors='coerce').dt.date | |
| return df | |
| # Function to verify required columns exist | |
| def verify_columns(df, required_columns): | |
| missing_columns = [col for col in required_columns if col not in df.columns] | |
| return missing_columns | |
| # Function to display data in tiles | |
| def display_tiles(df, cols): | |
| for i, (_, row) in enumerate(df.iterrows()): | |
| col = cols[i % len(cols)] | |
| with col: | |
| st.markdown(f"**Company Name:** {row['Company Name']}") | |
| st.markdown(f"**Region:** {row['Region']}") | |
| st.markdown(f"**Factory Type:** {row['Factory Type']}") | |
| st.markdown(f"**Expiry Date:** {row['Expiry Date']}") | |
| st.markdown(f"**Contact:** {row['Contact']}") | |
| st.markdown(f"**Phone:** {row['Phone']}") | |
| st.markdown(f"**E-mail:** {row['E-mail']}") | |
| st.markdown("---") | |
| # Initialize session state | |
| if 'df' not in st.session_state: | |
| st.session_state.df = None | |
| if 'authenticated' not in st.session_state: | |
| st.session_state.authenticated = False | |
| if 'login_attempt' not in st.session_state: | |
| st.session_state.login_attempt = False | |
| # List of valid usernames and passwords | |
| user_credentials = { | |
| 'ubaid': 'Password@123', | |
| 'bot': 'Trust@123' | |
| } | |
| # Authentication function | |
| def authenticate(username, password): | |
| if username in user_credentials and user_credentials[username] == password: | |
| return True | |
| return False | |
| # Authentication block | |
| if not st.session_state.authenticated: | |
| st.title("Login") | |
| username = st.text_input("Username") | |
| password = st.text_input("Password", type="password") | |
| login_button = st.button("Login") | |
| if login_button: | |
| if authenticate(username, password): | |
| st.session_state.authenticated = True | |
| st.session_state.login_attempt = False # Reset the login attempt flag | |
| else: | |
| st.session_state.login_attempt = True | |
| st.error("Invalid username or password") | |
| if st.session_state.login_attempt: | |
| st.warning("Please try again.") | |
| else: | |
| st.write("User authenticated successfully") | |
| st.image(MAIN_LOGO_URL, use_column_width=True) | |
| st.title("HK Halal Restaurants Viewer") | |
| # File upload logic | |
| with st.sidebar: | |
| st.image(SIDEBAR_LOGO_URL, use_column_width=True) | |
| st.title("File Management") | |
| # File uploader | |
| uploaded_file = st.file_uploader("Choose an Excel file", type="xlsx") | |
| if uploaded_file: | |
| try: | |
| # Save the uploaded file | |
| file_path = os.path.join(UPLOAD_DIR, uploaded_file.name) | |
| with open(file_path, "wb") as f: | |
| f.write(uploaded_file.getbuffer()) | |
| st.success(f"File '{uploaded_file.name}' uploaded successfully.") | |
| df = load_data(file_path) | |
| st.session_state.df = df | |
| except Exception as e: | |
| st.error(f"An error occurred: {e}") | |
| # Manage existing files | |
| st.subheader("Manage Existing Files") | |
| existing_files = [f for f in os.listdir(UPLOAD_DIR) if f.endswith(".xlsx")] | |
| if existing_files: | |
| selected_file = st.selectbox("Select a file to view or delete", existing_files) | |
| if st.button("Delete Selected File"): | |
| os.remove(os.path.join(UPLOAD_DIR, selected_file)) | |
| st.success(f"File '{selected_file}' deleted successfully.") | |
| st.session_state.df = None # Reset the dataframe in session state | |
| if st.button("Load Selected File") or st.session_state.df is None: | |
| try: | |
| file_path = os.path.join(UPLOAD_DIR, selected_file) | |
| df = load_data(file_path) | |
| st.session_state.df = df | |
| except Exception as e: | |
| st.error(f"An error occurred: {e}") | |
| else: | |
| st.info("No files available.") | |
| # Display and filter the loaded dataframe if available | |
| if st.session_state.df is not None: | |
| df = st.session_state.df | |
| # Define required columns | |
| required_columns = [ | |
| 'Issued Date', 'Expiry Date', 'Cert. No', 'Company Name', 'Address', 'Region', | |
| 'Factory Type', 'Contact', 'Phone', 'E-mail', 'Status', 'Member Since' | |
| ] | |
| # Verify required columns | |
| missing_columns = verify_columns(df, required_columns) | |
| if missing_columns: | |
| st.error(f"The following required columns are missing from the uploaded file: {', '.join(missing_columns)}") | |
| else: | |
| # Format the date columns to remove time | |
| df = format_date_column(df, 'Issued Date') | |
| df = format_date_column(df, 'Expiry Date') | |
| # Display the dataframe | |
| st.subheader("Loaded Data") | |
| st.dataframe(df) | |
| # Filter functionality | |
| st.subheader("Filters") | |
| # Use columns for a more responsive layout | |
| col1, col2, col3, col4 = st.columns(4) | |
| with col1: | |
| # Filter by Company Name | |
| company_name_filter = st.text_input("Company Name contains") | |
| with col2: | |
| # Filter by Region | |
| region_filter = st.multiselect("Region", df['Region'].drop_duplicates()) | |
| with col3: | |
| # Filter by Factory Type | |
| factory_type_filter = st.multiselect("Factory Type", df['Factory Type'].drop_duplicates()) | |
| with col4: | |
| # Filter by Expiry Date | |
| expiry_date_filter = st.date_input("Expiry Date", []) | |
| # Apply filters | |
| filtered_df = df.copy() | |
| if company_name_filter: | |
| filtered_df = filtered_df[filtered_df['Company Name'].str.contains(company_name_filter, case=False, na=False)] | |
| if region_filter: | |
| filtered_df = filtered_df[filtered_df['Region'].isin(region_filter)] | |
| if factory_type_filter: | |
| filtered_df = filtered_df[filtered_df['Factory Type'].isin(factory_type_filter)] | |
| if expiry_date_filter: | |
| if len(expiry_date_filter) == 1: | |
| filtered_df = filtered_df[filtered_df['Expiry Date'] == expiry_date_filter[0]] | |
| elif len(expiry_date_filter) == 2: | |
| start_date, end_date = expiry_date_filter | |
| filtered_df = filtered_df[(filtered_df['Expiry Date'] >= start_date) & (filtered_df['Expiry Date'] <= end_date)] | |
| # Display the filtered dataframe in a tile format | |
| st.subheader("Filtered Data") | |
| if not filtered_df.empty: | |
| num_cols = 3 # Number of columns for the tile layout | |
| cols = st.columns(num_cols) | |
| display_tiles(filtered_df, cols) | |
| # Download button for filtered data | |
| csv = convert_df_to_csv(filtered_df) | |
| st.download_button( | |
| label="Download filtered data as CSV", | |
| data=csv, | |
| file_name='filtered_data.csv', | |
| mime='text/csv', | |
| ) | |
| else: | |
| st.info("No data matches the filter criteria.") |