FB Prompts Edit =============== Edit Firebase "prompts" collection. :: import streamlit as st import firebase_admin from firebase_admin import credentials, firestore import json from datetime import datetime import os from dotenv import load_dotenv # Load environment variables load_dotenv() # Initialize Firebase def initialize_firebase(): """Initialize Firebase connection""" try: # Check if Firebase is already initialized firebase_admin.get_app() except ValueError: # Initialize Firebase with service account if os.path.exists('firebase-credentials.json'): cred = credentials.Certificate('firebase-credentials.json') firebase_admin.initialize_app(cred) else: st.error("Firebase credentials file not found. Please add 'firebase-credentials.json' to the project root.") st.stop() # Initialize Firebase initialize_firebase() db = firestore.client() def add_prompt(title, prompt_text, tags): """Add a new prompt to Firebase""" try: doc_ref = db.collection('prompts').document() doc_ref.set({ 'name': title, 'note': prompt_text, 'tags': tags, 'created_at': datetime.now(), 'updated_at': datetime.now() }) return True except Exception as e: st.error(f"Error adding prompt: {e}") return False def get_all_prompts(): """Get all prompts from Firebase""" try: prompts = [] docs = db.collection('prompts').order_by('updated_at', direction=firestore.Query.DESCENDING).stream() for doc in docs: prompt_data = doc.to_dict() prompt_data['id'] = doc.id prompts.append(prompt_data) return prompts except Exception as e: st.error(f"Error fetching prompts: {e}") return [] def update_prompt(prompt_id, title, prompt_text, tags): """Update an existing prompt""" try: doc_ref = db.collection('prompts').document(prompt_id) doc_ref.update({ 'name': title, 'note': prompt_text, 'tags': tags, 'updated_at': datetime.now() }) return True except Exception as e: st.error(f"Error updating prompt: {e}") return False def delete_prompt(prompt_id): """Delete a prompt""" try: db.collection('prompts').document(prompt_id).delete() return True except Exception as e: st.error(f"Error deleting prompt: {e}") return False def search_prompts(query, tags_filter=None): """Search prompts by title, text, or tags""" try: prompts = get_all_prompts() filtered_prompts = [] for prompt in prompts: # Search in title and prompt text title_match = query.lower() in prompt['name'].lower() if query else True text_match = query.lower() in prompt['note'].lower() if query else True # Filter by tags tags_match = True if tags_filter: prompt_tags = [tag.lower() for tag in prompt['tags']] tags_match = any(filter_tag.lower() in prompt_tags for filter_tag in tags_filter) if (title_match or text_match) and tags_match: filtered_prompts.append(prompt) return filtered_prompts except Exception as e: st.error(f"Error searching prompts: {e}") return [] # Streamlit UI st.set_page_config( page_title="Prompt Notes", page_icon="📝", layout="wide", initial_sidebar_state="expanded" ) # Custom CSS for better styling st.markdown(""" """, unsafe_allow_html=True) # Header st.markdown('

📝 Prompt Notes

', unsafe_allow_html=True) # Sidebar for navigation st.sidebar.title("Navigation") page = st.sidebar.selectbox( "Choose a page", ["View Prompts", "Add New Prompt", "Search Prompts"] ) if page == "View Prompts": st.header("All Prompts") # Get all prompts prompts = get_all_prompts() if not prompts: st.info("No prompts found. Add your first prompt!") else: for prompt in prompts: with st.expander(f"📄 {prompt['title']}", expanded=False): col1, col2 = st.columns([3, 1]) with col1: st.markdown(f"**Title:** {prompt['title']}") st.markdown(f"**Prompt:**") st.text_area("", prompt['prompt_text'], height=150, key=f"view_{prompt['id']}", disabled=True) st.markdown("**Tags:**") for tag in prompt['tags']: st.markdown(f'{tag}', unsafe_allow_html=True) st.markdown(f"**Created:** {prompt['created_at'].strftime('%Y-%m-%d %H:%M')}") st.markdown(f"**Updated:** {prompt['updated_at'].strftime('%Y-%m-%d %H:%M')}") with col2: if st.button("Edit", key=f"edit_{prompt['id']}"): st.session_state.editing_prompt = prompt st.session_state.current_page = "Edit Prompt" st.rerun() if st.button("Delete", key=f"delete_{prompt['id']}"): if delete_prompt(prompt['id']): st.success("Prompt deleted successfully!") st.rerun() elif page == "Add New Prompt": st.header("Add New Prompt") with st.form("add_prompt_form"): title = st.text_input("Title", placeholder="Enter prompt title...") prompt_text = st.text_area("Prompt Text", placeholder="Enter your prompt here...", height=200) tags_input = st.text_input("Tags (comma-separated)", placeholder="e.g., coding, python, ai") submitted = st.form_submit_button("Add Prompt") if submitted: if title and prompt_text: # Process tags tags = [tag.strip() for tag in tags_input.split(',') if tag.strip()] if tags_input else [] if add_prompt(title, prompt_text, tags): st.success("Prompt added successfully!") st.rerun() else: st.error("Please fill in both title and prompt text.") elif page == "Search Prompts": st.header("Search Prompts") # Search form with st.form("search_form"): col1, col2 = st.columns(2) with col1: search_query = st.text_input("Search query", placeholder="Search in title and prompt text...") with col2: tags_filter = st.text_input("Filter by tags (comma-separated)", placeholder="e.g., coding, python") search_submitted = st.form_submit_button("Search") # Display search results if search_submitted or search_query or tags_filter: tags_filter_list = [tag.strip() for tag in tags_filter.split(',') if tag.strip()] if tags_filter else None results = search_prompts(search_query, tags_filter_list) if not results: st.info("No prompts found matching your search criteria.") else: st.success(f"Found {len(results)} prompt(s)") for prompt in results: with st.expander(f"📄 {prompt['title']}", expanded=False): st.markdown(f"**Title:** {prompt['title']}") st.markdown(f"**Prompt:**") st.text_area("", prompt['prompt_text'], height=150, key=f"search_{prompt['id']}", disabled=True) st.markdown("**Tags:**") for tag in prompt['tags']: st.markdown(f'{tag}', unsafe_allow_html=True) st.markdown(f"**Updated:** {prompt['updated_at'].strftime('%Y-%m-%d %H:%M')}") # Handle editing state if hasattr(st.session_state, 'editing_prompt') and st.session_state.editing_prompt: st.header("Edit Prompt") prompt = st.session_state.editing_prompt with st.form("edit_prompt_form"): title = st.text_input("Title", value=prompt['title']) prompt_text = st.text_area("Prompt Text", value=prompt['prompt_text'], height=200) tags_input = st.text_input("Tags (comma-separated)", value=", ".join(prompt['tags'])) col1, col2 = st.columns(2) with col1: if st.form_submit_button("Update Prompt"): if title and prompt_text: tags = [tag.strip() for tag in tags_input.split(',') if tag.strip()] if tags_input else [] if update_prompt(prompt['id'], title, prompt_text, tags): st.success("Prompt updated successfully!") del st.session_state.editing_prompt st.rerun() else: st.error("Please fill in both title and prompt text.") with col2: if st.form_submit_button("Cancel"): del st.session_state.editing_prompt st.rerun() # Footer st.markdown("---") st.markdown("**Prompt Notes** - Built with Streamlit and Firebase")