diff --git a/asm_app/public/hospital.png b/asm_app/public/hospital.png new file mode 100644 index 0000000..a0165d9 Binary files /dev/null and b/asm_app/public/hospital.png differ diff --git a/asm_app/src/config/api.ts b/asm_app/src/config/api.ts index bb3a2a7..179026e 100644 --- a/asm_app/src/config/api.ts +++ b/asm_app/src/config/api.ts @@ -1,3 +1,5 @@ +import { DEFAULT_FRAPPE_BASE_URL } from './defaults'; + // API Configuration Types interface ApiConfig { BASE_URL: string; @@ -7,8 +9,10 @@ interface ApiConfig { } const API_CONFIG: ApiConfig = { - // Use same-origin relative URLs in production so the app works on any domain. - BASE_URL: import.meta.env.VITE_FRAPPE_BASE_URL || '', + // Backend URL - Use proxy in development, direct URL in production + BASE_URL: import.meta.env.DEV + ? '' // Use relative URLs in development (goes through Vite proxy) + : import.meta.env.VITE_FRAPPE_BASE_URL || DEFAULT_FRAPPE_BASE_URL, // API Endpoints ENDPOINTS: { diff --git a/asm_app/src/config/defaults.ts b/asm_app/src/config/defaults.ts new file mode 100644 index 0000000..55e84fb --- /dev/null +++ b/asm_app/src/config/defaults.ts @@ -0,0 +1,13 @@ +/** + * Default Application Configurations & Fallbacks for Assir ASM UI App + * Centralized constants for hospital/tenant names, default warehouses, logos, and endpoints. + */ + +export const DEFAULT_HOSPITAL = 'Assir Central Hospital'; +export const DEFAULT_WAREHOUSE = 'Stores - AGH'; + +// Fallback Frappe Backend Base URL +export const DEFAULT_FRAPPE_BASE_URL = 'https://asir-ch.seeraarabia.com'; + +// Default logos +export const DEFAULT_HOSPITAL_LOGO = '/files/hospital.png'; diff --git a/asm_app/src/pages/WorkOrderDetail.tsx b/asm_app/src/pages/WorkOrderDetail.tsx index e679998..8652cd5 100644 --- a/asm_app/src/pages/WorkOrderDetail.tsx +++ b/asm_app/src/pages/WorkOrderDetail.tsx @@ -17,6 +17,7 @@ import CommentSection from '../components/CommentSection'; import WoFeedbackSummary from '../components/WoFeedbackSummary'; import apiService from '../services/apiService'; import API_CONFIG from '../config/api'; +import { DEFAULT_WAREHOUSE } from '../config/defaults'; import useDefaultHospital from '../hooks/useDefaultHospital'; import { isSiteEnabledHospital, buildMobileTeamSiteFilters } from '../utils/hospitalUtils'; import useUserPhccSiteFilter from '../hooks/useUserPhccSiteFilter'; @@ -339,9 +340,6 @@ const WorkOrderDetail: React.FC = () => { docData: workOrderDocData, // Pass document data for condition evaluation }); - // Default warehouse for new stock items - const DEFAULT_WAREHOUSE = 'Al Jouf Central Warehouse - AJH'; - // Stock warnings state const [stockWarnings, setStockWarnings] = useState>({}); diff --git a/asm_ui_app/hooks.py b/asm_ui_app/hooks.py index 032c1ed..38d4a88 100644 --- a/asm_ui_app/hooks.py +++ b/asm_ui_app/hooks.py @@ -83,7 +83,8 @@ app_license = "mit" # ------------ # before_install = "asm_ui_app.install.before_install" -# after_install = "asm_ui_app.install.after_install" +after_install = "asm_ui_app.install.after_install" +after_migrate = "asm_ui_app.install.after_migrate" # Uninstallation # ------------ diff --git a/asm_ui_app/install.py b/asm_ui_app/install.py new file mode 100644 index 0000000..9036bc9 --- /dev/null +++ b/asm_ui_app/install.py @@ -0,0 +1,64 @@ +import os +import frappe + + +def after_install(): + """Executed after the app is installed on a site.""" + setup_default_files() + + +def after_migrate(): + """Executed after 'bench migrate' is run on a site.""" + setup_default_files() + + +def setup_default_files(): + """Ensure default app assets (e.g., hospital.png) are added to the Frappe File DocType. + + This makes the image available at '/files/hospital.png' and visible in Desk File List. + """ + files_to_setup = [ + { + "file_name": "hospital.png", + "relative_path": ["public", "images", "hospital.png"], + "fallback_relative_path": ["public", "asm_app", "hospital.png"], + "is_private": 0, + "folder": "Home", + } + ] + + for item in files_to_setup: + file_name = item["file_name"] + + # 1. Check if the file already exists in File DocType + if frappe.db.exists("File", {"file_name": file_name}) or frappe.db.exists("File", {"file_url": f"/files/{file_name}"}): + continue + + # 2. Locate the source file in app directory + source_path = frappe.get_app_path("asm_ui_app", *item["relative_path"]) + if not os.path.exists(source_path) and "fallback_relative_path" in item: + source_path = frappe.get_app_path("asm_ui_app", *item["fallback_relative_path"]) + + if not os.path.exists(source_path): + frappe.logger().warning(f"[asm_ui_app] Source file not found for default file setup: {source_path}") + continue + + # 3. Read binary content + with open(source_path, "rb") as f: + file_content = f.read() + + # 4. Create Frappe File document + # Setting is_private=0 and providing content automatically writes to sites//public/files/ + try: + file_doc = frappe.get_doc({ + "doctype": "File", + "file_name": file_name, + "content": file_content, + "is_private": item.get("is_private", 0), + "folder": item.get("folder", "Home"), + }) + file_doc.insert(ignore_permissions=True) + frappe.db.commit() + frappe.logger().info(f"[asm_ui_app] Successfully added default file '{file_name}' to File DocType.") + except Exception as e: + frappe.logger().error(f"[asm_ui_app] Failed to add default file '{file_name}' to File DocType: {e}") diff --git a/asm_ui_app/public/asm_app/hospital.png b/asm_ui_app/public/asm_app/hospital.png new file mode 100644 index 0000000..a0165d9 Binary files /dev/null and b/asm_ui_app/public/asm_app/hospital.png differ diff --git a/asm_ui_app/public/images/hospital.png b/asm_ui_app/public/images/hospital.png new file mode 100644 index 0000000..a0165d9 Binary files /dev/null and b/asm_ui_app/public/images/hospital.png differ