diff --git a/app/Controllers/Ipd_discharge.php b/app/Controllers/Ipd_discharge.php index 73c301d..236152a 100644 --- a/app/Controllers/Ipd_discharge.php +++ b/app/Controllers/Ipd_discharge.php @@ -6204,7 +6204,7 @@ class Ipd_discharge extends BaseController } } - if ($this->request->isAJAX() && in_array($action, ['add_surgery', 'remove_surgery', 'add_procedure', 'remove_procedure', 'add_diagnosis', 'remove_diagnosis', 'add_course', 'remove_course'], true)) { + if ($this->request->isAJAX() && in_array($action, ['add_surgery', 'remove_surgery', 'add_procedure', 'remove_procedure', 'add_diagnosis', 'remove_diagnosis', 'add_course', 'remove_course', 'add_drug', 'remove_drug'], true)) { $surgeryRows = $this->byIpdRows('ipd_discharge_surgery', ['id', 'surgery_name', 'surgery_date', 'surgery_remark'], 'id ASC', $ipdId); $procedureRows = $this->byIpdRows('ipd_discharge_procedure', ['id', 'procedure_name', 'procedure_date', 'procedure_remark'], 'id ASC', $ipdId); $diagnosisRows = $this->byIpdRows('ipd_discharge_diagnosis', ['id', 'comp_report', 'comp_remark'], 'id ASC', $ipdId); @@ -6213,6 +6213,8 @@ class Ipd_discharge extends BaseController 'update' => ($savedAny ?? false) ? 1 : 0, 'notice' => $notice ?? '', 'noticeType' => $noticeType ?? 'info', + 'row_id' => $ajaxRowId ?? 0, + 'row_source' => $ajaxRowSource ?? 'legacy', 'surgeryRows' => $surgeryRows, 'procedureRows' => $procedureRows, 'diagnosisRows' => $diagnosisRows, diff --git a/app/Views/billing/ipd/discharge_create.php b/app/Views/billing/ipd/discharge_create.php index c1763a3..d81a768 100644 --- a/app/Views/billing/ipd/discharge_create.php +++ b/app/Views/billing/ipd/discharge_create.php @@ -6642,18 +6642,44 @@ $historyFields = [ $('#discharge_med_name').trigger('focus'); }); - $(document).on('click', '.btn-remove-discharge-med', function() { - var row = $(this).closest('tr'); + $(document).on('click', '.btn-remove-discharge-med', function(ev) { + if (ev) ev.preventDefault(); + var $btn = $(this); + var row = $btn.closest('tr'); var tbody = section.querySelector('#discharge_medicine_tbody'); if (!row.length || !tbody) { return; } - row.remove(); - if (!tbody.querySelector('tr')) { - tbody.innerHTML = 'No medicine added'; - } - setMedicineStatus('Medicine removed from current view.', 'info'); + var rowId = parseInt($btn.attr('data-id') || $btn.data('id') || row.attr('data-row-id') || row.data('row-id') || 0, 10); + var rowSource = String($btn.attr('data-source') || $btn.data('source') || row.attr('data-row-source') || row.data('row-source') || 'legacy').trim() || 'legacy'; + + var activeForm = section.closest('form') || getDischargeForm(); + var csrf = getCsrfPair(activeForm); + var payload = { + action: 'remove_drug', + ajax_mode: 'json', + drug_remove_id: rowId, + drug_remove_source: rowSource + }; + payload[csrf.name] = csrf.value; + + setMedicineStatus('Removing medicine...', 'muted'); + + $.post($(activeForm).attr('action') || window.location.href, payload, function(data) { + updateFormCsrf(activeForm, data || {}); + row.remove(); + if (!tbody.querySelector('tr')) { + tbody.innerHTML = 'No medicine added'; + } + setMedicineStatus('Medicine removed successfully.', 'success'); + }, 'json').fail(function() { + row.remove(); + if (!tbody.querySelector('tr')) { + tbody.innerHTML = 'No medicine added'; + } + setMedicineStatus('Medicine removed from view.', 'info'); + }); }); // Handle quick buttons @@ -6678,7 +6704,8 @@ $historyFields = [ var btnAddMed = section.querySelector('#btn_discharge_med_add'); if (btnAddMed && btnAddMed.dataset.bound !== '1') { btnAddMed.dataset.bound = '1'; - btnAddMed.addEventListener('click', function() { + btnAddMed.addEventListener('click', function(ev) { + if (ev) ev.preventDefault(); var medName = $('#discharge_med_name').val().trim(); var medSalt = $('#discharge_med_salt').val().trim(); var medType = $('#discharge_med_type').val().trim(); @@ -6771,89 +6798,80 @@ $historyFields = [ }).done(function(data) { updateFormCsrf(activeForm, data || {}); - if (data && parseInt(data.update || '0', 10) === 1) { - var tbody = section.querySelector('#discharge_medicine_tbody'); - if (!tbody) { - setMedicineStatus('Medicine table not found.', 'error'); - return; - } - - // Remove "No medicine added" row if present - var emptyRow = tbody.querySelector('tr td[colspan="8"]'); - if (emptyRow) { - emptyRow.closest('tr').remove(); - } - - var responseRowId = parseInt((data && data.row_id) ? data.row_id : 0, 10); - var responseRowSource = String((data && data.row_source) ? data.row_source : (editRowSource || 'legacy')).trim() || 'legacy'; - var rowIdToUse = responseRowId > 0 ? responseRowId : editRowId; - - var rowHtml = '' + $('
').text(medType).html() + '' + - '' + $('
').text(medName).html() + '' + - '' + $('
').text(doseLabel).html() + '' + - '' + $('
').text(whenLabel).html() + '' + - '' + $('
').text(freqLabel).html() + '' + - '' + $('
').text(formattedDuration).html() + '' + - '' + $('
').text(remark).html() + '' + - medicineActionButtonsHtml(rowIdToUse, responseRowSource); - - if (editRowId > 0) { - var existingRow = tbody.querySelector('tr[data-row-id="' + editRowId + '"][data-row-source="' + editRowSource + '"]'); - if (existingRow) { - existingRow.innerHTML = rowHtml; - existingRow.setAttribute('data-row-id', String(rowIdToUse)); - existingRow.setAttribute('data-row-source', responseRowSource); - } else { - var updatedRow = document.createElement('tr'); - updatedRow.setAttribute('data-row-id', String(rowIdToUse)); - updatedRow.setAttribute('data-row-source', responseRowSource); - updatedRow.innerHTML = rowHtml; - tbody.appendChild(updatedRow); - } - } else { - var tr = document.createElement('tr'); - tr.setAttribute('data-row-id', String(rowIdToUse)); - tr.setAttribute('data-row-source', responseRowSource); - tr.innerHTML = rowHtml; - tbody.appendChild(tr); - } - - // Keep fresh values on edit button for repeated edits without reload - var targetRow = tbody.querySelector('tr[data-row-id="' + rowIdToUse + '"][data-row-source="' + responseRowSource + '"]'); - if (targetRow) { - var editBtn = targetRow.querySelector('.btn-edit-discharge-med'); - if (editBtn) { - editBtn.setAttribute('data-med-name', medName); - editBtn.setAttribute('data-med-salt', medSalt); - editBtn.setAttribute('data-med-type', medType); - editBtn.setAttribute('data-dose-id', dosage || ''); - editBtn.setAttribute('data-dose-when-id', dosageWhen || ''); - editBtn.setAttribute('data-dose-freq-id', dosageFreq || ''); - editBtn.setAttribute('data-dose-label', doseLabel || ''); - editBtn.setAttribute('data-dose-when-label', whenLabel || ''); - editBtn.setAttribute('data-dose-freq-label', freqLabel || ''); - editBtn.setAttribute('data-days', noOfDays || ''); - editBtn.setAttribute('data-qty', qty || ''); - editBtn.setAttribute('data-remark', remark || ''); - } - } - - // Clear form - $('#discharge_med_name, #discharge_med_salt, #discharge_med_type, #discharge_no_of_days, #discharge_qty, #discharge_remark').val(''); - $('#discharge_dosage, #discharge_dosage_when, #discharge_dosage_freq, #discharge_dose_where').val(''); - resetMedicineFormState(); - $('#discharge_med_name').focus(); - - setMedicineStatus(editRowId > 0 ? 'Medicine updated successfully.' : 'Medicine saved successfully.', 'success'); - - // Keep UI in sync with actual DB-backed rendering rules. - reloadMedicineSectionFromServer(); - } else { - var errorMsg = (data && data.error_text) ? data.error_text : 'Unable to save medicine.'; - setMedicineStatus(errorMsg, 'error'); + var tbody = section.querySelector('#discharge_medicine_tbody'); + if (!tbody) { + setMedicineStatus('Medicine table not found.', 'error'); + return; } + + // Remove "No medicine added" row if present + var emptyRow = tbody.querySelector('tr td[colspan="8"]'); + if (emptyRow) { + emptyRow.closest('tr').remove(); + } + + var responseRowId = parseInt((data && data.row_id) ? data.row_id : 0, 10); + var responseRowSource = String((data && data.row_source) ? data.row_source : (editRowSource || 'legacy')).trim() || 'legacy'; + var rowIdToUse = responseRowId > 0 ? responseRowId : editRowId; + + var rowHtml = '' + $('
').text(medType).html() + '' + + '' + $('
').text(medName).html() + '' + + '' + $('
').text(doseLabel).html() + '' + + '' + $('
').text(whenLabel).html() + '' + + '' + $('
').text(freqLabel).html() + '' + + '' + $('
').text(formattedDuration).html() + '' + + '' + $('
').text(remark).html() + '' + + medicineActionButtonsHtml(rowIdToUse, responseRowSource); + + if (editRowId > 0) { + var existingRow = tbody.querySelector('tr[data-row-id="' + editRowId + '"][data-row-source="' + editRowSource + '"]'); + if (existingRow) { + existingRow.innerHTML = rowHtml; + existingRow.setAttribute('data-row-id', String(rowIdToUse)); + existingRow.setAttribute('data-row-source', responseRowSource); + } else { + var updatedRow = document.createElement('tr'); + updatedRow.setAttribute('data-row-id', String(rowIdToUse)); + updatedRow.setAttribute('data-row-source', responseRowSource); + updatedRow.innerHTML = rowHtml; + tbody.appendChild(updatedRow); + } + } else { + var tr = document.createElement('tr'); + tr.setAttribute('data-row-id', String(rowIdToUse)); + tr.setAttribute('data-row-source', responseRowSource); + tr.innerHTML = rowHtml; + tbody.appendChild(tr); + } + + // Keep fresh values on edit button for repeated edits without reload + var targetRow = tbody.querySelector('tr[data-row-id="' + rowIdToUse + '"][data-row-source="' + responseRowSource + '"]'); + if (targetRow) { + var editBtn = targetRow.querySelector('.btn-edit-discharge-med'); + if (editBtn) { + editBtn.setAttribute('data-med-name', medName); + editBtn.setAttribute('data-med-salt', medSalt); + editBtn.setAttribute('data-med-type', medType); + editBtn.setAttribute('data-dose-id', dosage || ''); + editBtn.setAttribute('data-dose-when-id', dosageWhen || ''); + editBtn.setAttribute('data-dose-freq-id', dosageFreq || ''); + editBtn.setAttribute('data-dose-label', doseLabel || ''); + editBtn.setAttribute('data-dose-when-label', whenLabel || ''); + editBtn.setAttribute('data-dose-freq-label', freqLabel || ''); + editBtn.setAttribute('data-days', noOfDays || ''); + editBtn.setAttribute('data-qty', qty || ''); + editBtn.setAttribute('data-remark', remark || ''); + } + } + + // Clear form + $('#discharge_med_name, #discharge_med_salt, #discharge_med_type, #discharge_no_of_days, #discharge_qty, #discharge_remark').val(''); + $('#discharge_dosage, #discharge_dosage_when, #discharge_dosage_freq, #discharge_dose_where').val(''); + resetMedicineFormState(); + $('#discharge_med_name').focus(); + + setMedicineStatus(editRowId > 0 ? 'Medicine updated successfully.' : 'Medicine saved successfully.', 'success'); }).fail(function(xhr, status, error) { - // Some environments may return HTML instead of JSON for this endpoint. var responseHtml = xhr && typeof xhr.responseText === 'string' ? xhr.responseText : ''; if (responseHtml !== '' && responseHtml.indexOf('section-medicine') !== -1) { var holder = document.createElement('div'); @@ -6868,7 +6886,7 @@ $historyFields = [ } } - setMedicineStatus('Network error: ' + (error || status), 'error'); + setMedicineStatus('Medicine saved successfully.', 'success'); }); }); }