diff --git a/audit_management/fixtures/custom_html_block.json b/audit_management/fixtures/custom_html_block.json
new file mode 100644
index 0000000..31a0474
--- /dev/null
+++ b/audit_management/fixtures/custom_html_block.json
@@ -0,0 +1,13 @@
+[
+ {
+ "docstatus": 0,
+ "doctype": "Custom HTML Block",
+ "html": "\n\n
\n \n \n Responsive Card Layout\n\n\n \n \n
\n

\n
\n
\n \n\n
\n
\n
\n
Welcome to Audit Management
\n
\n
\n\n
\n\n
\n \n \n \n \n \n \n
\n\n\n
\n\n\n
\n\n\n
\n\n\n
\n\n\n
\n\n\n
\n
\n\n\n",
+ "modified": "2025-07-15 11:00:35.067750",
+ "name": "Audit Management",
+ "private": 0,
+ "roles": [],
+ "script": "// Check if the user is a System Manager or Administrator\nif (\n frappe.user.has_role(\"System Manager\") ||\n frappe.user.has_role(\"Administrator\") ||\n frappe.user.has_role(\"Audit Manager\")\n) {\n get_name();\n get_records_count();\n\n const statuses = [\n { id: \"listLink\", url: `/app/my-audits?status=%5B\"is\"%2C\"set\"%5D` },\n { id: \"listDraft\", url: `/app/my-audits/view/list?status=Draft` },\n { id: \"listClose\", url: `/app/my-audits/view/list?status=Close` },\n { id: \"listPendingAll\", url: `/app/my-audits/view/list?status=Pending` },\n { id: \"listPendingBM\", url: `/app/my-audits/view/list?bm_user_status=Pending` },\n { id: \"listPendingDH\", url: `/app/my-audits/view/list?dh_user_status=Pending` },\n { id: \"listPendingCOM\", url: `/app/my-audits/view/list?com_user_status=Pending` },\n { id: \"listPendingRM\", url: `/app/my-audits/view/list?rm_user_status=Pending` },\n { id: \"listPendingROM\", url: `/app/my-audits/view/list?rom_user_status=Pending` },\n { id: \"listPendingZM\", url: `/app/my-audits/view/list?zm_user_status=Pending` },\n { id: \"listPendingZOM\", url: `/app/my-audits/view/list?zom_user_status=Pending` },\n { id: \"listPendingGM\", url: `/app/my-audits/view/list?gm_user_status=Pending` },\n { id: \"listPendingHR\", url: `/app/my-audits/view/list?hr_user_status=Pending` },\n { id: \"listPendingCOO\", url: `/app/my-audits/view/list?coo_user_status=Pending` },\n { id: \"listPendingCEO\", url: `/app/my-audits/view/list?ceo_user_status=Pending` },\n { id: \"listResponseBM\", url: `/app/my-audits/view/list?bm_user_status=Responded` },\n { id: \"listResponseDH\", url: `/app/my-audits/view/list?dh_user_status=Responded` },\n { id: \"listResponseCOM\", url: `/app/my-audits/view/list?com_user_status=Responded` },\n { id: \"listResponseRM\", url: `/app/my-audits/view/list?rm_user_status=Responded` },\n { id: \"listResponseROM\", url: `/app/my-audits/view/list?rom_user_status=Responded` },\n { id: \"listResponseZM\", url: `/app/my-audits/view/list?zm_user_status=Responded` },\n { id: \"listResponseZOM\", url: `/app/my-audits/view/list?zom_user_status=Responded` },\n { id: \"listResponseGM\", url: `/app/my-audits/view/list?gm_user_status=Responded` },\n { id: \"listResponseHR\", url: `/app/my-audits/view/list?hr_user_status=Responded` },\n { id: \"listResponseCOO\", url: `/app/my-audits/view/list?coo_user_status=Responded` },\n { id: \"listResponseCEO\", url: `/app/my-audits/view/list?ceo_user_status=Responded` },\n { id: \"listNoResponseBM\", url: `/app/my-audits/view/list?bm_user_status=No Response` },\n { id: \"listNoResponseDH\", url: `/app/my-audits/view/list?dh_user_status=No Response` },\n { id: \"listNoResponseCOM\", url: `/app/my-audits/view/list?com_user_status=No Response` },\n { id: \"listNoResponseRM\", url: `/app/my-audits/view/list?rm_user_status=No Response` },\n { id: \"listNoResponseROM\", url: `/app/my-audits/view/list?rom_user_status=No Response` },\n { id: \"listNoResponseZM\", url: `/app/my-audits/view/list?zm_user_status=No Response` },\n { id: \"listNoResponseZOM\", url: `/app/my-audits/view/list?zom_user_status=No Response` },\n { id: \"listNoResponseGM\", url: `/app/my-audits/view/list?gm_user_status=No Response` },\n { id: \"listNoResponseHR\", url: `/app/my-audits/view/list?hr_user_status=No Response` },\n { id: \"listNoResponseCOO\", url: `/app/my-audits/view/list?coo_user_status=No Response` },\n { id: \"listNoResponseCEO\", url: `/app/my-audits/view/list?ceo_user_status=No Response` }\n ];\n\n // Loop through the statuses array and update href attributes\n statuses.forEach(({ id, url }) => {\n const element = root_element.querySelector(`#${id}`);\n if (element) {\n element.href = url;\n } else {\n console.error(`Element with ID '${id}' not found.`);\n }\n });\n\n console.log(\"Updated href attributes for SMBG Team Leader\");\n}\n\n// Check if the user is both a BDO and a BDE (Audit Manager role)\nelse if (frappe.user.has_role(\"Audit Member\") && frappe.session.user !== \"4857@sahayog.com\") {\n var sessionUser = frappe.session.user;\n var empID = sessionUser.split(\"@\")[0]; // Extracting employee ID\n console.log(empID);\n\n get_name();\n get_records_count();\n\n const statuses = [\n { id: \"listLink\", url: `/app/my-audits?status=%5B\"is\"%2C\"set\"%5D&query_generated_by_empid=${empID}` },\n { id: \"listDraft\", url: `/app/my-audits/view/list?status=Draft&query_generated_by_empid=${empID}` },\n { id: \"listClose\", url: `/app/my-audits/view/list?status=Close&query_generated_by_empid=${empID}` },\n { id: \"listPendingAll\", url: `/app/my-audits/view/list?status=Pending&query_generated_by_empid=${empID}` },\n { id: \"listPendingBM\", url: `/app/my-audits/view/list?bm_user_status=Pending&query_generated_by_empid=${empID}` },\n { id: \"listPendingDH\", url: `/app/my-audits/view/list?dh_user_status=Pending&query_generated_by_empid=${empID}` },\n { id: \"listPendingCOM\", url: `/app/my-audits/view/list?com_user_status=Pending&query_generated_by_empid=${empID}` },\n { id: \"listPendingRM\", url: `/app/my-audits/view/list?rm_user_status=Pending&query_generated_by_empid=${empID}` },\n { id: \"listPendingROM\", url: `/app/my-audits/view/list?rom_user_status=Pending&query_generated_by_empid=${empID}` },\n { id: \"listPendingZM\", url: `/app/my-audits/view/list?zm_user_status=Pending&query_generated_by_empid=${empID}` },\n { id: \"listPendingZOM\", url: `/app/my-audits/view/list?zom_user_status=Pending&query_generated_by_empid=${empID}` },\n { id: \"listPendingGM\", url: `/app/my-audits/view/list?gm_user_status=Pending&query_generated_by_empid=${empID}` },\n { id: \"listPendingHR\", url: `/app/my-audits/view/list?hr_user_status=Pending&query_generated_by_empid=${empID}` },\n { id: \"listPendingCOO\", url: `/app/my-audits/view/list?coo_user_status=Pending&query_generated_by_empid=${empID}` },\n { id: \"listPendingCEO\", url: `/app/my-audits/view/list?ceo_user_status=Pending&query_generated_by_empid=${empID}` },\n { id: \"listResponseBM\", url: `/app/my-audits/view/list?bm_user_status=Responded&query_generated_by_empid=${empID}` },\n { id: \"listResponseDH\", url: `/app/my-audits/view/list?dh_user_status=Responded&query_generated_by_empid=${empID}` },\n { id: \"listResponseCOM\", url: `/app/my-audits/view/list?com_user_status=Responded&query_generated_by_empid=${empID}` },\n { id: \"listResponseRM\", url: `/app/my-audits/view/list?rm_user_status=Responded&query_generated_by_empid=${empID}` },\n { id: \"listResponseROM\", url: `/app/my-audits/view/list?rom_user_status=Responded&query_generated_by_empid=${empID}` },\n { id: \"listResponseZM\", url: `/app/my-audits/view/list?zm_user_status=Responded&query_generated_by_empid=${empID}` },\n { id: \"listResponseZOM\", url: `/app/my-audits/view/list?zom_user_status=Responded&query_generated_by_empid=${empID}` },\n { id: \"listResponseGM\", url: `/app/my-audits/view/list?gm_user_status=Responded&query_generated_by_empid=${empID}` },\n { id: \"listResponseHR\", url: `/app/my-audits/view/list?hr_user_status=Responded&query_generated_by_empid=${empID}` },\n { id: \"listResponseCOO\", url: `/app/my-audits/view/list?coo_user_status=Responded&query_generated_by_empid=${empID}` },\n { id: \"listResponseCEO\", url: `/app/my-audits/view/list?ceo_user_status=Responded&query_generated_by_empid=${empID}` },\n \n { id: \"listNoResponseBM\", url: `/app/my-audits/view/list?bm_user_status=No Response&query_generated_by_empid=${empID}` },\n { id: \"listNoResponseDH\", url: `/app/my-audits/view/list?dh_user_status=No Response&query_generated_by_empid=${empID}` },\n { id: \"listNoResponseCOM\", url: `/app/my-audits/view/list?com_user_status=No Response&query_generated_by_empid=${empID}` },\n { id: \"listNoResponseRM\", url: `/app/my-audits/view/list?rm_user_status=No Response&query_generated_by_empid=${empID}` },\n { id: \"listNoResponseROM\", url: `/app/my-audits/view/list?rom_user_status=No Response&query_generated_by_empid=${empID}` },\n { id: \"listNoResponseZM\", url: `/app/my-audits/view/list?zm_user_status=No Response&query_generated_by_empid=${empID}` },\n { id: \"listNoResponseZOM\", url: `/app/my-audits/view/list?zom_user_status=No Response&query_generated_by_empid=${empID}` },\n { id: \"listNoResponseGM\", url: `/app/my-audits/view/list?gm_user_status=No Response&query_generated_by_empid=${empID}` },\n { id: \"listNoResponseHR\", url: `/app/my-audits/view/list?hr_user_status=No Response&query_generated_by_empid=${empID}` },\n { id: \"listNoResponseCOO\", url: `/app/my-audits/view/list?coo_user_status=No Response&query_generated_by_empid=${empID}` },\n { id: \"listNoResponseCEO\", url: `/app/my-audits/view/list?ceo_user_status=No Response&query_generated_by_empid=${empID}` }\n ];\n\n // Update href attributes dynamically\n statuses.forEach(({ id, url }) => {\n const element = root_element.querySelector(`#${id}`);\n if (element) {\n element.href = url; // Update href attribute\n } else {\n console.error(`Element with ID '${id}' not found.`); // Log error if element not found\n }\n });\n\n console.log(\"Updated href attributes for Audit Member.\");\n}\n\nelse if (frappe.session.user === \"4857@sahayog.com\") {\n const empIDs = [3649, 6105 ,6929]; // Employee IDs as an array\n const empIDParam = encodeURIComponent(JSON.stringify([\"in\", empIDs]));\n \n get_name();\n get_records_count();\n \n const statuses = [\n { id: \"listLink\", url: `/app/my-audits?status=%5B\"is\"%2C\"set\"%5D&query_generated_by_empid=${empIDParam}` },\n { id: \"listDraft\", url: `/app/my-audits/view/list?status=Draft&query_generated_by_empid=${empIDParam}` },\n { id: \"listClose\", url: `/app/my-audits/view/list?status=Close&query_generated_by_empid=${empIDParam}` },\n { id: \"listPendingAll\", url: `/app/my-audits/view/list?status=Pending&query_generated_by_empid=${empIDParam}` },\n \n { id: \"listPendingBM\", url: `/app/my-audits/view/list?bm_user_status=Pending&query_generated_by_empid=${empIDParam}` },\n { id: \"listPendingDH\", url: `/app/my-audits/view/list?dh_user_status=Pending&query_generated_by_empid=${empIDParam}` },\n { id: \"listPendingCOM\", url: `/app/my-audits/view/list?com_user_status=Pending&query_generated_by_empid=${empIDParam}` },\n { id: \"listPendingRM\", url: `/app/my-audits/view/list?rm_user_status=Pending&query_generated_by_empid=${empIDParam}` },\n { id: \"listPendingROM\", url: `/app/my-audits/view/list?rom_user_status=Pending&query_generated_by_empid=${empIDParam}` },\n { id: \"listPendingZM\", url: `/app/my-audits/view/list?zm_user_status=Pending&query_generated_by_empid=${empIDParam}` },\n { id: \"listPendingZOM\", url: `/app/my-audits/view/list?zom_user_status=Pending&query_generated_by_empid=${empIDParam}` },\n { id: \"listPendingGM\", url: `/app/my-audits/view/list?gm_user_status=Pending&query_generated_by_empid=${empIDParam}` },\n { id: \"listPendingHR\", url: `/app/my-audits/view/list?hr_user_status=Pending&query_generated_by_empid=${empIDParam}` },\n { id: \"listPendingCOO\", url: `/app/my-audits/view/list?coo_user_status=Pending&query_generated_by_empid=${empIDParam}` },\n { id: \"listPendingCEO\", url: `/app/my-audits/view/list?ceo_user_status=Pending&query_generated_by_empid=${empIDParam}` },\n \n { id: \"listResponseBM\", url: `/app/my-audits/view/list?bm_user_status=Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listResponseDH\", url: `/app/my-audits/view/list?dh_user_status=Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listResponseCOM\", url: `/app/my-audits/view/list?com_user_status=Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listResponseRM\", url: `/app/my-audits/view/list?rm_user_status=Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listResponseROM\", url: `/app/my-audits/view/list?rom_user_status=Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listResponseZM\", url: `/app/my-audits/view/list?zm_user_status=Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listResponseZOM\", url: `/app/my-audits/view/list?zom_user_status=Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listResponseGM\", url: `/app/my-audits/view/list?gm_user_status=Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listResponseHR\", url: `/app/my-audits/view/list?hr_user_status=Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listResponseCOO\", url: `/app/my-audits/view/list?coo_user_status=Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listResponseCEO\", url: `/app/my-audits/view/list?ceo_user_status=Response&query_generated_by_empid=${empIDParam}` },\n\n { id: \"listNoResponseBM\", url: `/app/my-audits/view/list?bm_user_status=No Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listNoResponseDH\", url: `/app/my-audits/view/list?dh_user_status=No Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listNoResponseCOM\", url: `/app/my-audits/view/list?com_user_status=No Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listNoResponseRM\", url: `/app/my-audits/view/list?rm_user_status=No Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listNoResponseROM\", url: `/app/my-audits/view/list?rom_user_status=No Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listNoResponseZM\", url: `/app/my-audits/view/list?zm_user_status=No Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listNoResponseZOM\", url: `/app/my-audits/view/list?zom_user_status=No Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listNoResponseGM\", url: `/app/my-audits/view/list?gm_user_status=No Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listNoResponseHR\", url: `/app/my-audits/view/list?hr_user_status=No Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listNoResponseCOO\", url: `/app/my-audits/view/list?coo_user_status=No Response&query_generated_by_empid=${empIDParam}` },\n { id: \"listNoResponseCEO\", url: `/app/my-audits/view/list?ceo_user_status=No Response&query_generated_by_empid=${empIDParam}` },\n \n \n ];\n \n \n // Update href attributes dynamically\n statuses.forEach(({ id, url }) => {\n const element = root_element.querySelector(`#${id}`);\n if (element) {\n element.href = url;\n } else {\n console.error(`Element with ID '${id}' not found.`);\n }\n });\n \n console.log(\"Updated href attributes for Audit Member.\");\n}\n\nelse if (!frappe.user.has_role(\"Audit Member\") && !frappe.user.has_role(\"Audit Manager\") && !frappe.user.has_role(\"Administrator\") && frappe.user.has_role(\"Employee\"))\n{\n get_name();\n}\n\n// Function to fetch and display the user's full name\nfunction get_name() {\n if (frappe.session.user === \"Administrator\") {\n // Directly set the name for the Administrator\n const fullName = \"Administrator\";\n console.log(\"Full name is:\", fullName);\n const nameElement = root_element.querySelector(\"#emp-name\");\n if (nameElement) {\n nameElement.textContent = \"Hello, \" + fullName;\n } else {\n console.warn(\"#emp-name element not found.\");\n }\n } else {\n // For non-Administrator users, fetch the user details from the Employee doctype\n frappe.call({\n method: \"frappe.client.get\",\n args: {\n doctype: \"Employee\",\n filters: { user_id: frappe.session.user }, // Fetch based on user_id\n },\n callback: function (response) {\n if (response.message) {\n const { first_name, last_name } = response.message;\n const fullName = `${first_name} ${last_name}`;\n console.log(\"Full name is:\", fullName);\n const nameElement = root_element.querySelector(\"#emp-name\");\n if (nameElement) {\n nameElement.textContent = \"Hello, \" + fullName;\n } else {\n console.warn(\"#emp-name element not found.\");\n }\n } else {\n console.error(\"Failed to fetch user name.\");\n }\n },\n });\n }\n}\n\nfunction get_records_count() {\n var is_admin = \"\";\n if(frappe.user.has_role(\"System Manager\") ||\n frappe.user.has_role(\"Administrator\") ||\n frappe.user.has_role(\"Audit Manager\")) {\n is_admin = \"yes\";\n } else if(frappe.user.has_role(\"Audit Member\")) {\n is_admin = \"no\";\n }\n frappe.call({\n method:\n \"audit_management.audit_management.doctype.my_audits.my_audits.get_audit_counts\", \n args: {\n is_admin: is_admin // Send the is_admin flag as an argument\n },// Adjust the path to your app's method\n callback: function (response) {\n // Retrieve counts from the response\n const counts = response.message;\n\n // Define the elements and corresponding count keys\n const countKeys = [\n { key: \"total_count\", elementId: \"#totalCount\" },\n { key: \"draft_count\", elementId: \"#draftCount\" },\n { key: \"pending_count\", elementId: \"#pendingAllCount\" },\n { key: \"close_count\", elementId: \"#closeCount\" },\n { key: \"bm_pending_count\", elementId: \"#pendingBMCount\" },\n { key: \"dh_pending_count\", elementId: \"#pendingDHCount\" },\n { key: \"com_pending_count\", elementId: \"#pendingCOMCount\" },\n { key: \"rm_pending_count\", elementId: \"#pendingRMCount\" },\n { key: \"rom_pending_count\", elementId: \"#pendingROMCount\" },\n { key: \"zm_pending_count\", elementId: \"#pendingZMCount\" },\n { key: \"zom_pending_count\", elementId: \"#pendingZOMCount\" },\n { key: \"gm_pending_count\", elementId: \"#pendingGMCount\" },\n { key: \"hr_pending_count\", elementId: \"#pendingHRCount\" },\n { key: \"coo_pending_count\", elementId: \"#pendingCOOCount\" },\n { key: \"ceo_pending_count\", elementId: \"#pendingCEOCount\" },\n { key: \"bm_response_count\", elementId: \"#responseBMCount\" },\n { key: \"dh_response_count\", elementId: \"#responseDHCount\" },\n { key: \"com_response_count\", elementId: \"#responseCOMCount\" },\n { key: \"rm_response_count\", elementId: \"#responseRMCount\" },\n { key: \"rom_response_count\", elementId: \"#responseROMCount\" },\n { key: \"zm_response_count\", elementId: \"#responseZMCount\" },\n { key: \"zom_response_count\", elementId: \"#responseZOMCount\" },\n { key: \"gm_response_count\", elementId: \"#responseGMCount\" },\n { key: \"hr_response_count\", elementId: \"#responseHRCount\" },\n { key: \"coo_response_count\", elementId: \"#responseCOOCount\" },\n { key: \"ceo_response_count\", elementId: \"#responseCEOCount\" },\n \n { key: \"bm_no_response_count\", elementId: \"#NoresponseBMCount\" },\n { key: \"dh_no_response_count\", elementId: \"#NoresponseDHCount\" },\n { key: \"com_no_response_count\", elementId: \"#NoresponseCOMCount\" },\n { key: \"rm_no_response_count\", elementId: \"#NoresponseRMCount\" },\n { key: \"rom_no_response_count\", elementId: \"#NoresponseROMCount\" },\n { key: \"zm_no_response_count\", elementId: \"#NoresponseZMCount\" },\n { key: \"zom_no_response_count\", elementId: \"#NoresponseZOMCount\" },\n { key: \"gm_no_response_count\", elementId: \"#NoresponseGMCount\" },\n { key: \"hr_no_response_count\", elementId: \"#NoresponseHRCount\" },\n { key: \"coo_no_response_count\", elementId: \"#NoresponseCOOCount\" },\n { key: \"ceo_no_response_count\", elementId: \"#NoresponseCEOCount\" }\n ];\n\n // Loop through the keys and set the corresponding text content\n countKeys.forEach(({ key, elementId }) => {\n const element = root_element.querySelector(elementId);\n if (element && counts[key] !== undefined) {\n element.textContent = counts[key];\n }\n });\n },\n });\n}\n\nfrappe.call({\n method: 'audit_management.audit_management.doctype.my_audits.my_audits.get_audit_level_for_user', // Replace with your correct method path\n callback: function(response) {\n // Ensure matches is always an array to prevent errors\n const matches = response.message.matches || [];\n let userFlag = response.message.flag || \"\";\n\n // Extract branch and user stages\n const names = matches.map(match => match.name || \"\");\n let branch = names.map(b => `\"${b}\"`).join(\",\");\n \n const userStages = matches.map(match => match.user_stage || \"\");\n let userStatusQuery = userStages.map(stage => `${stage}=Pending`).join(\"&\");\n let userStatusQueryResponse = userStages.map(stage => `${stage}=Responded`).join(\"&\");\n let userStatusQueryNoResponse = userStages.map(stage => `${stage}=No Response`).join(\"&\");\n\n console.log(\"flag : \", userFlag);\n console.log(\"Branch Array:\", branch);\n console.log(\"User status query for pending:\", userStatusQuery);\n console.log(\"User status query for responded:\", userStatusQueryResponse);\n console.log(\"User status query for No responded:\", userStatusQueryNoResponse);\n\n // Show/Hide elements based on the flag\n if (userFlag === \"LevelUser\") {\n // User is assigned to one of the audit level stages\n root_element.querySelector('#ForAuditLevel1').style.display = 1;\n if (frappe.session.user === \"2800@sahayog.com\") \n {\n root_element.querySelector('#allListBranch').href = `/app/my-audits?gm_user_status=%5B\"is\"%2C\"set\"%5D`;\n root_element.querySelector('#pendingListBranch').href = `/app/my-audits?gm_user_status=Pending`;\n root_element.querySelector('#ResponseListBranch').href = `/app/my-audits?gm_user_status=Responded`;\n root_element.querySelector('#NoResponseListBranch').href = `/app/my-audits?gm_user_status=No Response`;\n root_element.querySelector('#closeListBranch').href = `/app/my-audits?status=Close`;\n }\n else if (frappe.session.user === \"1394@sahayog.com\") \n {\n root_element.querySelector('#allListBranch').href = `/app/my-audits?hr_user_status=%5B\"is\"%2C\"set\"%5D`;\n root_element.querySelector('#pendingListBranch').href = `/app/my-audits?hr_user_status=Pending`;\n root_element.querySelector('#ResponseListBranch').href = `/app/my-audits?hr_user_status=Responded`;\n root_element.querySelector('#NoResponseListBranch').href = `/app/my-audits?hr_user_status=No Response`;\n root_element.querySelector('#closeListBranch').href = `/app/my-audits?status=Close`;\n }\n else if (frappe.session.user === \"914@sahayog.com\") \n {\n root_element.querySelector('#allListBranch').href = `/app/my-audits?coo_user_status=%5B\"is\"%2C\"set\"%5D`;\n root_element.querySelector('#pendingListBranch').href = `/app/my-audits?coo_user_status=Pending`;\n root_element.querySelector('#ResponseListBranch').href = `/app/my-audits?coo_user_status=Responded`;\n root_element.querySelector('#NoResponseListBranch').href = `/app/my-audits?coo_user_status=No Response`;\n root_element.querySelector('#closeListBranch').href = `/app/my-audits?status=Close`;\n }\n else if (frappe.session.user === \"1@sahayog.com\") \n {\n root_element.querySelector('#allListBranch').href = `/app/my-audits?ceo_user_status=%5B\"is\"%2C\"set\"%5D`;\n root_element.querySelector('#pendingListBranch').href = `/app/my-audits?ceo_user_status=Pending`;\n root_element.querySelector('#ResponseListBranch').href = `/app/my-audits?ceo_user_status=Responded`;\n root_element.querySelector('#NoResponseListBranch').href = `/app/my-audits?ceo_user_status=No Response`;\n root_element.querySelector('#closeListBranch').href = `/app/my-audits?status=Close`;\n }\n else{\n root_element.querySelector('#allListBranch').href = `/app/my-audits?emp_branch=[\"in\",[${branch}]]`;\n root_element.querySelector('#pendingListBranch').href = `/app/my-audits?${userStatusQuery}&emp_branch=[\"in\",[${branch}]]`;\n root_element.querySelector('#ResponseListBranch').href = `/app/my-audits?${userStatusQueryResponse}&emp_branch=[\"in\",[${branch}]]`;\n root_element.querySelector('#NoResponseListBranch').href = `/app/my-audits?${userStatusQueryNoResponse}&emp_branch=[\"in\",[${branch}]]`;\n root_element.querySelector('#closeListBranch').href = `/app/my-audits?status=Close&emp_branch=[\"in\",[${branch}]]`;\n }\n \n root_element.querySelector('#saperator').style.display = 'none';\n root_element.querySelector('#NewRequest').style.display = 'none';\n root_element.querySelector('#allList').style.display = 'none';\n root_element.querySelector('.tabs-nav').style.display = 'none';\n \n root_element.querySelector('#pending-container-1').style.display = 'none';\n root_element.querySelector('#pending-container-2').style.display = 'none';\n \n root_element.querySelector('#response-container-1').style.display = 'none';\n root_element.querySelector('#response-container-2').style.display = 'none';\n \n root_element.querySelector('#noresponse-container-1').style.display = 'none';\n root_element.querySelector('#noresponse-container-2').style.display = 'none';\n \n } \n else if (userFlag === \"AuditUser\") {\n // User has an audit-related role but is not assigned to any stage\n root_element.querySelector('#ForAuditLevel1').style.display = 'none';\n }\n else if (userFlag === \"OtherUser\") {\n // User is neither assigned to any stage nor has an audit-related role\n root_element.querySelector('#message').innerHTML = \"You do not have audit access.\";\n root_element.querySelector('#saperator').style.display = 'none';\n root_element.querySelector('#ForAuditLevel1').style.display = 'none';\n root_element.querySelector('#NewRequest').style.display = 'none';\n root_element.querySelector('#allList').style.display = 'none';\n root_element.querySelector('.tabs-nav').style.display = 'none';\n \n root_element.querySelector('#pending-container-1').style.display = 'none';\n root_element.querySelector('#pending-container-2').style.display = 'none';\n \n root_element.querySelector('#response-container-1').style.display = 'none';\n root_element.querySelector('#response-container-2').style.display = 'none';\n \n root_element.querySelector('#noresponse-container-1').style.display = 'none';\n root_element.querySelector('#noresponse-container-2').style.display = 'none';\n \n }\n }\n});\n\n// Attach tab switch logic\nconst buttons = root_element.querySelectorAll('.tab-button');\nconst contents = root_element.querySelectorAll('.tab-content');\n\nbuttons.forEach(button => {\n button.addEventListener('click', function () {\n const tabName = this.getAttribute('data-tab');\n\n // Hide all tab contents\n contents.forEach(c => c.style.display = 'none');\n\n // Remove active class from all buttons\n buttons.forEach(b => b.classList.remove('active'));\n\n // Show selected tab and activate button\n this.classList.add('active');\n const selectedTab = root_element.querySelector(`#tab-${tabName}`);\n if (selectedTab) selectedTab.style.display = 'block';\n });\n});\n\nlet reportTab = root_element.querySelector('#tab-report');\nlet overlay = root_element.querySelector('.report-overlay'); // global full-screen overlay\nlet message = root_element.querySelector('.report-message'); // global message text\n\n// Show tab if user has the required role\nif (\n frappe.user.has_role(\"Audit Manager\") ||\n frappe.user.has_role(\"Administrator\")\n) {\n reportTab.style.display = \"inline-block\";\n} else {\n reportTab.style.display = \"none\";\n}\n\nreportTab.addEventListener(\"click\", function () {\n overlay.style.display = \"flex\";\n\n // No need for interval or message animation anymore\n setTimeout(() => {\n window.location.href = \"/app/query-report/My%20Audits%20Report\";\n }, 3000);\n});\n",
+ "style": ".asset-request-container * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n.report-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(255, 255, 255, 0.75);\n backdrop-filter: blur(6px);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 9999;\n}\n\n.report-content {\n text-align: center;\n}\n\n.report-gif {\n width: 100px; /* Adjust as needed */\n}\n\n/* Base Container */\n.asset-request-container {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n line-height: 1.5;\n color: #333;\n padding: 10px;\n background: transparent;\n}\n\n/* Header Section */\n.Asset-Container {\n display: flex;\n align-items: center;\n margin-bottom: 20px;\n}\n\n.logo {\n width: 48px;\n height: 48px;\n object-fit: contain;\n}\n\n.intro {\n margin-left: 16px;\n}\n\n.emp-name {\n font-size: 14px;\n color: #666;\n}\n\n.welcome-text {\n font-size: 20px;\n font-weight: 600;\n color: #222;\n margin-top: 4px;\n}\n\n#NewRequest {\n padding: 12px 0;\n margin: 16px 0;\n}\n\n.new-request-actions {\n display: flex;\n gap: 20px;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.new-request-card {\n display: flex;\n align-items: flex-start;\n padding: 12px 16px;\n background: rgba(255, 255, 255, 0.9);\n border: 1px solid #dee2e6;\n border-left: 4px solid #6f42c1;\n border-radius: 8px;\n text-decoration: none;\n transition: all 0.2s ease;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n min-width: 240px;\n max-width: 320px;\n}\n\n.new-request-card:hover {\n background: #f8f9fa;\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.08);\n}\n\n.text-group {\n display: flex;\n flex-direction: column;\n}\n\n.text-group .label {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n}\n\n.text-group .sublabel {\n font-size: 12px;\n font-style: italic;\n color: #6c757d;\n}\n\n\n/* Widget Grid */\n.widgets-container,\n.widgets-container-ad {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n}\n\n.widget {\n padding: 16px;\n border-radius: 8px;\n background: white;\n box-shadow: 0 1px 2px rgba(0,0,0,0.1);\n transition: transform 0.2s, box-shadow 0.2s;\n text-decoration: none;\n border: 1px solid #e9ecef;\n}\n\n.widget:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 6px rgba(0,0,0,0.1);\n}\n\n.wid-title {\n font-size: 14px;\n font-weight: 500;\n color: #495057;\n margin-bottom: 12px;\n}\n\n.wid-content {\n display: flex;\n align-items: center;\n font-size: 13px;\n color: #212529;\n}\n\n.wid-content.red {\n color: #dc3545;\n}\n\n.wid-content.green {\n color: #28a745;\n}\n\n/* Status Dots */\n.red-dot,\n.green-dot,\n.grey-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n margin-right: 8px;\n}\n\n.red-dot {\n background: #dc3545;\n}\n\n.green-dot {\n background: #28a745;\n}\n\n.grey-dot {\n background: #6c757d;\n}\n\n.value {\n font-weight: 600;\n margin-right: 4px;\n}\n\n/* Divider */\nhr {\n border: 0;\n height: 1px;\n background: #e9ecef;\n margin: 16px 0;\n}\n\n/* Section Headers */\n.widgets-container h2 {\n font-size: 18px;\n font-weight: 600;\n color: #343a40;\n margin: 8px 0;\n grid-column: 1 / -1;\n}\n\n/* Color Coding for Widgets */\n#listLink, #allListBranch { border-left: 4px solid #6f42c1; }\n#listDraft, #pendingListBranch { border-left: 4px solid #6610f2; }\n#listClose, #ResponseListBranch { border-left: 4px solid #28a745; }\n#listPendingAll, #closeListBranch { border-left: 4px solid #fd7e14; }\n\n/* Pending Widgets (Red palette - 10 shades) */\n#listPendingBM { border-left: 4px solid #ff0000; } /* Bright red */\n#listPendingDH { border-left: 4px solid #ff5252; } /* Light red */\n#listPendingCOM { border-left: 4px solid #ff1744; } /* Pinkish red */\n#listPendingRM { border-left: 4px solid #d50000; } /* Dark red */\n#listPendingROM { border-left: 4px solid #ff8a80; } /* Pale red */\n#listPendingZM { border-left: 4px solid #c62828; } /* Brick red */\n#listPendingZOM { border-left: 4px solid #ff3d00; } /* Orange-red */\n#listPendingGM { border-left: 4px solid #b71c1c; } /* Deep red */\n#listPendingHR { border-left: 4px solid #ff6e40; } /* Coral */\n#listPendingCOO { border-left: 4px solid #dd2c00; } /* Rust */\n#listPendingCEO { border-left: 4px solid #9e0000; } /* Maroon */\n\n/* Response Widgets (Green palette - 10 shades) */\n#listResponseBM { border-left: 4px solid #00c853; } /* Vibrant green */\n#listResponseDH { border-left: 4px solid #64dd17; } /* Lime green */\n#listResponseCOM { border-left: 4px solid #aeea00; } /* Chartreuse */\n#listResponseRM { border-left: 4px solid #00e676; } /* Emerald */\n#listResponseROM { border-left: 4px solid #76ff03; } /* Bright green */\n#listResponseZM { border-left: 4px solid #1de9b6; } /* Teal green */\n#listResponseZOM { border-left: 4px solid #00bfa5; } /* Sea green */\n#listResponseGM { border-left: 4px solid #00b248; } /* Forest green */\n#listResponseHR { border-left: 4px solid #b2ff59; } /* Light lime */\n#listResponseCOO { border-left: 4px solid #4caf50; } /* Classic green */\n#listResponseCEO { border-left: 4px solid #087f23; } /* Dark green */\n\n/* No-Response Widgets (Blue palette - 11 shades) */\n#listNoResponseBM { border-left: 4px solid #e3f2fd; } /* Lightest Blue */\n#listNoResponseDH { border-left: 4px solid #bbdefb; } /* Sky Blue */\n#listNoResponseCOM { border-left: 4px solid #90caf9; } /* Pale Blue */\n#listNoResponseRM { border-left: 4px solid #64b5f6; } /* Cool Blue */\n#listNoResponseROM { border-left: 4px solid #42a5f5; } /* Moderate Blue */\n#listNoResponseZM { border-left: 4px solid #2196f3; } /* Standard Blue */\n#listNoResponseZOM { border-left: 4px solid #1e88e5; } /* Slightly Darker */\n#listNoResponseGM { border-left: 4px solid #1976d2; } /* Dark Blue */\n#listNoResponseHR { border-left: 4px solid #1565c0; } /* Navy Blue */\n#listNoResponseCOO { border-left: 4px solid #0d47a1; } /* Deep Blue */\n#listNoResponseCEO { border-left: 4px solid #82b1ff; } /* Light Indigo */\n\n\n/* Responsive Adjustments */\n@media (max-width: 768px) {\n .widgets-container,\n .widgets-container-ad {\n grid-template-columns: 1fr 1fr;\n }\n \n .Asset-Container {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .intro {\n margin-left: 0;\n margin-top: 12px;\n }\n}\n\n@media (max-width: 480px) {\n .widgets-container,\n .widgets-container-ad {\n grid-template-columns: 1fr;\n }\n \n .welcome-text {\n font-size: 18px;\n }\n \n .label {\n font-size: 14px;\n }\n}\n\n/* Tab Navigation */\n.tabs-nav {\n display: flex;\n gap: 8px;\n margin: 20px 0 16px 0;\n border-bottom: 1px solid #e9ecef;\n padding-bottom: 8px;\n}\n\n.tab-button {\n padding: 8px 16px;\n border: none;\n background: none;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: #6c757d;\n border-radius: 4px;\n transition: all 0.2s ease;\n position: relative;\n}\n\n/* Hover for all tabs except active */\n.tab-button:hover {\n color: #495057;\n background: #f8f9fa;\n}\n\n/* Active tab base styling */\n.tab-button.active {\n background-color: #6f42c1; /* Primary accent background */\n color: #ffffff; /* White text for contrast */\n font-weight: 600;\n}\n\n/* Darker background on hover for active tab */\n.tab-button.active:hover {\n background-color: #59359e; /* Darker shade of #6f42c1 */\n color: #ffffff;\n}\n\n/* Remove underline effect if still present */\n.tab-button.active::after {\n content: none;\n}\n\n/* Tab Content Areas (you'll need to add these classes to your content divs) */\n.tab-content {\n display: none;\n}\n\n.tab-content.active {\n display: block;\n}\n"
+ }
+]
\ No newline at end of file
diff --git a/audit_management/hooks.py b/audit_management/hooks.py
index e498468..38a8909 100755
--- a/audit_management/hooks.py
+++ b/audit_management/hooks.py
@@ -64,7 +64,7 @@
# before_install = "audit_management.install.before_install"
# after_install = "audit_management.install.after_install"
after_migrate = [
- "audit_management.patches.fixtures.create_audit_dashboard.execute",
+ #"audit_management.patches.fixtures.create_audit_dashboard.execute",
]
# Uninstallation
@@ -206,3 +206,15 @@
# auth_hooks = [
# "audit_management.auth.validate"
# ]
+fixtures = [
+ {"dt": "Custom HTML Block", "filters": [
+ [
+ "name",
+ "in",
+ {
+ "Audit Management"
+ }
+ ]
+ ]},
+
+]
\ No newline at end of file
diff --git a/audit_management/public/images/soon.gif b/audit_management/public/images/soon.gif
new file mode 100755
index 0000000..76e00e7
Binary files /dev/null and b/audit_management/public/images/soon.gif differ