diff --git a/coretabs.user.js b/coretabs.user.js
index 299740c..c3fd05b 100644
--- a/coretabs.user.js
+++ b/coretabs.user.js
@@ -35,6 +35,7 @@
#ct-header-text { flex-grow: 1; min-width: 0; }
#ct-header-title { font-size: 16px; font-weight: bold; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
#ct-header-subtitle { font-size: 12px; color: #adb5bd; }
+ #ct-header-actions { margin-left: auto; flex-shrink: 0; display: flex; gap: 5px; }
#ct-tab-bar{display:flex;background-color:#e9ecef;border-bottom:1px solid #ccc;flex-shrink:0}.ct-tab-button{padding:10px 15px;border:none;background-color:transparent;cursor:pointer;font-size:14px;border-bottom:3px solid transparent;transition:background-color .2s,border-color .2s}.ct-tab-button:hover{background-color:#dcdcdc}.ct-tab-button.active{border-bottom:3px solid #0056b3;font-weight:700;background-color:#fff}#ct-tab-content-area{padding:15px;flex-grow:1;overflow:hidden;display:flex;flex-direction:column}.ct-tab-panel{display:none;flex-grow:1;overflow:hidden;flex-direction:column}.ct-tab-panel.active{display:flex}
.filter-container{margin-bottom:10px;flex-shrink:0;display:flex;gap:15px;align-items:center;}
.filter-container label{font-weight:700;margin-right:5px}.filter-container select{padding:5px;border-radius:4px;border:1px solid #ccc}
@@ -70,6 +71,7 @@
+
My Cases
@@ -79,15 +81,15 @@
Filter by Status:
Collapse All
-
Filter by Status:
Collapse All Please select a case or use 'View Docs'.
-
Please select a case or use 'View Users'.
+
Filter by Status:
Collapse All Please select a case to view its documents.
+
Please select a case to view its users.
Filter by Reported:
Collapse All
Download Excel
-
Please use the 'Review Refund' action on a relevant case.
+
Select a refund case and click "Refund Review" in the header or row.
@@ -96,7 +98,7 @@
}
// --- RENDER FUNCTIONS ---
- function renderMyCasesTable() {const responseArea=document.querySelector("#tab-my-cases .results-container"),filterValue=document.getElementById("cases-status-filter").value,filteredCases="all"===filterValue?allMyCases:allMyCases.filter(e=>e.CaseStatus===filterValue);if(document.getElementById("toggle-cases-btn").textContent="Collapse All",0===filteredCases.length)return void(responseArea.innerHTML='No cases match the selected filter.
');filteredCases.sort((e,t)=>{const o=(e.CaseTypeName||"").localeCompare(t.CaseTypeName||"");return 0!==o?o:(t.CaseNumber||"").localeCompare(e.CaseNumber||"",void 0,{numeric:!0})});const table=createTable(["Case Number","Taxpayer Name","Case Type","Status","Created Date","Actions"]),tbody=document.createElement("tbody");let currentGroup="";let groupIndex=0;filteredCases.forEach(e=>{if(e.CaseTypeName!==currentGroup){currentGroup=e.CaseTypeName;groupIndex++;tbody.innerHTML+=` ${currentGroup||"Uncategorized"} `}const t=document.createElement("tr");t.className=`group-member my-cases-group-${groupIndex}`;const o=e.AggregateIdentifier;t.dataset.id=o,o===selectedCaseId&&t.classList.add("selected");const a=new Date(e.CreatedDate).toLocaleDateString("id-ID"),s=o&&"string"==typeof o&&""!==o.trim(),r=s?"":'disabled title="Action unavailable: Case ID is missing"';let d="";e.CaseTypeName===REFUND_CASE_TYPE_NAME&&(d=`Review Refund `),t.innerHTML=`
+ function renderMyCasesTable() {const responseArea=document.querySelector("#tab-my-cases .results-container"),filterValue=document.getElementById("cases-status-filter").value,filteredCases="all"===filterValue?allMyCases:allMyCases.filter(e=>e.CaseStatus===filterValue);if(document.getElementById("toggle-cases-btn").textContent="Collapse All",0===filteredCases.length)return void(responseArea.innerHTML='No cases match the selected filter.
');filteredCases.sort((e,t)=>{const o=(e.CaseTypeName||"").localeCompare(t.CaseTypeName||"");return 0!==o?o:(t.CaseNumber||"").localeCompare(e.CaseNumber||"",void 0,{numeric:!0})});const table=createTable(["Case Number","Taxpayer Name","Case Type","Status","Created Date","Actions"]),tbody=document.createElement("tbody");let currentGroup="";let groupIndex=0;filteredCases.forEach(e=>{if(e.CaseTypeName!==currentGroup){currentGroup=e.CaseTypeName;groupIndex++;tbody.innerHTML+=` ${currentGroup||"Uncategorized"} `}const t=document.createElement("tr");t.className=`group-member my-cases-group-${groupIndex}`;const o=e.AggregateIdentifier;t.dataset.id=o,o===selectedCaseId&&t.classList.add("selected");const a=new Date(e.CreatedDate).toLocaleDateString("id-ID"),s=o&&"string"==typeof o&&""!==o.trim(),r=s?"":'disabled title="Action unavailable: Case ID is missing"';let d="";e.CaseTypeName===REFUND_CASE_TYPE_NAME&&(d=`Refund Review `),t.innerHTML=`
${e.CaseNumber||"N/A"}
${e.MainTaxpayerName||"N/A"}
${e.CaseTypeName||"N/A"}
@@ -107,7 +109,7 @@
View Docs
View Users
${d}
- `,tbody.appendChild(t)}),table.appendChild(tbody),responseArea.innerHTML="",responseArea.appendChild(table),tbody.addEventListener("click",handleGroupToggle),tbody.addEventListener("click",handleCaseAction)}
+ `,tbody.appendChild(t)}),table.appendChild(tbody),responseArea.innerHTML="",responseArea.appendChild(table),tbody.addEventListener("click",handleGroupToggle),tbody.addEventListener("click",handleCaseSelection)}
function renderCaseDocumentsTable() {const responseArea=document.querySelector("#tab-docs .results-container"),filterValue=document.getElementById("docs-status-filter").value,filteredDocs="all"===filterValue?allCaseDocuments:allCaseDocuments.filter(e=>e.DocumentStatus===filterValue);if(document.getElementById("toggle-docs-btn").textContent="Collapse All",0===filteredDocs.length)return void(responseArea.innerHTML='No documents found or match the selected filter.
');filteredDocs.sort((e,t)=>(e.DocumentTypeCode||"").localeCompare(t.DocumentTypeCode||""));const table=createTable(["Letter Number","File Name","Status","Date","Actions"]),tbody=document.createElement("tbody");let currentGroup="";let groupIndex=0;filteredDocs.forEach(e=>{if(e.DocumentTypeCode!==currentGroup){currentGroup=e.DocumentTypeCode;groupIndex++;tbody.innerHTML+=` ${currentGroup||"Uncategorized"} `}const t=e.DocumentDate?new Date(e.DocumentDate).toLocaleDateString("id-ID"):"N/A";tbody.innerHTML+=`
${e.LetterNumber||"N/A"}
@@ -154,7 +156,52 @@
Please refresh the page to log in again.
Refresh Page
`:errorHtml=`An error occurred: ${error.message}
`,area.innerHTML=errorHtml;const refreshBtn=area.querySelector("#auth-refresh-btn");refreshBtn&&refreshBtn.addEventListener("click",()=>window.location.reload())}
- function updateHeader(caseObject) {const titleEl=document.getElementById("ct-header-title"),subtitleEl=document.getElementById("ct-header-subtitle");caseObject?(titleEl.textContent=caseObject.MainTaxpayerName||"N/A",subtitleEl.textContent=caseObject.CaseNumber||"N/A"):(titleEl.textContent="No Case Selected",subtitleEl.textContent='Please select a case from the "My Cases" tab')}
+ function updateHeader(caseObject) {
+ const titleEl = document.getElementById('ct-header-title');
+ const subtitleEl = document.getElementById('ct-header-subtitle');
+ const actionsContainer = document.getElementById('ct-header-actions');
+ actionsContainer.innerHTML = ''; // Clear previous buttons
+
+ if (caseObject) {
+ titleEl.textContent = caseObject.MainTaxpayerName || 'N/A';
+ subtitleEl.textContent = caseObject.CaseNumber || 'N/A';
+ const caseId = caseObject.AggregateIdentifier;
+ const hasValidId = caseId && typeof caseId === 'string' && caseId.trim() !== '';
+ const disabledAttribute = hasValidId ? '' : 'disabled';
+
+ // Create buttons programmatically to attach listeners safely
+ const openBtn = document.createElement('a');
+ openBtn.href = `https://coretax.intranet.pajak.go.id/case-management/id-ID/case-overview/${caseId}`;
+ openBtn.className = 'action-btn open-case';
+ openBtn.textContent = 'Open';
+ if (!hasValidId) openBtn.disabled = true;
+
+ const docsBtn = document.createElement('button');
+ docsBtn.className = 'action-btn view-docs';
+ docsBtn.textContent = 'View Docs';
+ if (!hasValidId) docsBtn.disabled = true;
+ docsBtn.addEventListener('click', () => switchTab('tab-docs'));
+
+ const usersBtn = document.createElement('button');
+ usersBtn.className = 'action-btn view-users';
+ usersBtn.textContent = 'View Users';
+ if (!hasValidId) usersBtn.disabled = true;
+ usersBtn.addEventListener('click', () => switchTab('tab-users'));
+
+ actionsContainer.append(openBtn, docsBtn, usersBtn);
+
+ if (caseObject.CaseTypeName === REFUND_CASE_TYPE_NAME) {
+ const refundBtn = document.createElement('button');
+ refundBtn.className = 'action-btn review-refund-case';
+ refundBtn.textContent = 'Refund Review';
+ actionsContainer.appendChild(refundBtn);
+ refundBtn.addEventListener('click', () => startRefundReviewProcess(caseId, refundBtn));
+ }
+ } else {
+ titleEl.textContent = 'No Case Selected';
+ subtitleEl.textContent = 'Please select a case from the "My Cases" tab';
+ }
+ }
async function startRefundReviewProcess(caseId, button) {
const originalText = button.textContent;
button.textContent = '...';
@@ -177,29 +224,32 @@
}
}
- function handleCaseAction(event){
- const selectedRow=event.target.closest("tr");
- if(!selectedRow||selectedRow.classList.contains("group-header"))return;
- const caseId=selectedRow.dataset.id;
- if(!caseId)return;
- const selectedCase=allMyCases.find(e=>e.AggregateIdentifier===caseId);
+ function handleCaseSelection(event) {
+ const selectedRow = event.target.closest("tr");
+ if (!selectedRow || selectedRow.classList.contains("group-header")) return;
+ const caseId = selectedRow.dataset.id;
+ if (!caseId || caseId === selectedCaseId) return; // Don't re-process if the same row is clicked
+
+ const selectedCase = allMyCases.find(e => e.AggregateIdentifier === caseId);
updateHeader(selectedCase);
- // Only reset dependent data if the selection actually changes
- if (selectedCaseId !== caseId) {
- selectedCaseId=caseId;
- loadedDocsForCaseId=null;
- loadedUsersForCaseId=null;
- // --- FIX IS HERE ---
- refundReviewData = [];
- filteredRefundData = [];
- document.querySelector('#tab-refund .results-container').innerHTML = `Please use the 'Review Refund' action on a relevant case.
`;
- document.getElementById('refund-download-btn').disabled = true;
- }
- const allRows=selectedRow.closest("tbody").querySelectorAll("tr");
- allRows.forEach(e=>e.classList.remove("selected"));
+ selectedCaseId = caseId;
+ loadedDocsForCaseId = null;
+ loadedUsersForCaseId = null;
+ refundReviewData = [];
+ filteredRefundData = [];
+ document.querySelector('#tab-refund .results-container').innerHTML = `Please use the 'Review Refund' action on a relevant case.
`;
+ document.getElementById('refund-download-btn').disabled = true;
+
+ const allRows = selectedRow.closest("tbody").querySelectorAll("tr");
+ allRows.forEach(e => e.classList.remove("selected"));
selectedRow.classList.add("selected");
- const actionButton=event.target.closest(".action-btn");
- actionButton&&(actionButton.matches(".view-docs")?switchTab("tab-docs"):actionButton.matches(".view-users")?switchTab("tab-users"):actionButton.matches(".review-refund-case")&&startRefundReviewProcess(caseId,actionButton));
+
+ const actionButton = event.target.closest(".action-btn");
+ if (actionButton) {
+ if (actionButton.matches(".view-docs")) { switchTab("tab-docs"); }
+ else if (actionButton.matches(".view-users")) { switchTab("tab-users"); }
+ else if (actionButton.matches(".review-refund-case")) { startRefundReviewProcess(caseId, actionButton); }
+ }
}
function handleDocumentAction(event) {
const target = event.target.closest('.action-btn');