Make IPD discharge complaint names and remarks editable like OPD form
FEATURE: Inline editing for discharge complaint table PROBLEM: In IPD discharge form, complaint names and remarks were read-only after adding. Unlike OPD consult form where you can edit complaint names directly in the table. SOLUTION: 1. VIEW Changes (discharge_create.php): - Changed complaint name and remark columns from static <td> to editable <input> - Added data attributes for complaint ID and original values - Added CSS classes: discharge-complaint-name-input, discharge-complaint-remark-input 2. JAVASCRIPT Changes: - Added saveComplaintField() function for AJAX updates - Event handlers on blur to save changes - Enter key support to blur and save - Visual feedback: green border on success, red on error - Auto-updates original value after successful save 3. CONTROLLER Changes (Ipd_discharge.php): - Added update_complaint_field() method for AJAX endpoint - Updates ipd_discharge_comp table (comp_report or comp_remark) - Returns JSON success/error response BENEFITS: - Same user experience as OPD consult form - Edit complaints/remarks without page reload - Immediate feedback on save success/failure - Type correction and updates without removing and re-adding rows
This commit is contained in:
parent
5847f642d8
commit
2e6bff35a0
|
|
@ -2814,6 +2814,46 @@ class Ipd_discharge extends BaseController
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function update_complaint_field()
|
||||||
|
{
|
||||||
|
if (! $this->request->isAJAX()) {
|
||||||
|
return $this->response->setStatusCode(400)->setJSON(['success' => false, 'error' => 'Invalid request']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$complaintId = (int) $this->request->getPost('complaint_id');
|
||||||
|
$fieldType = trim((string) $this->request->getPost('field_type'));
|
||||||
|
$fieldValue = trim((string) $this->request->getPost('field_value'));
|
||||||
|
|
||||||
|
if ($complaintId <= 0 || !in_array($fieldType, ['name', 'remark'], true)) {
|
||||||
|
return $this->response->setJSON(['success' => false, 'error' => 'Invalid parameters']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$table = 'ipd_discharge_comp';
|
||||||
|
if (! $this->db->tableExists($table)) {
|
||||||
|
return $this->response->setJSON(['success' => false, 'error' => 'Complaint table not found']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$columnName = $fieldType === 'name' ? 'comp_report' : 'comp_remark';
|
||||||
|
|
||||||
|
try {
|
||||||
|
$updated = $this->db->table($table)
|
||||||
|
->where('id', $complaintId)
|
||||||
|
->update([
|
||||||
|
$columnName => $fieldValue,
|
||||||
|
'updated_at' => date('Y-m-d H:i:s')
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($updated) {
|
||||||
|
return $this->response->setJSON(['success' => true]);
|
||||||
|
} else {
|
||||||
|
return $this->response->setJSON(['success' => false, 'error' => 'No rows updated']);
|
||||||
|
}
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
log_message('error', 'Failed to update discharge complaint field: {msg}', ['msg' => $e->getMessage()]);
|
||||||
|
return $this->response->setJSON(['success' => false, 'error' => 'Database error']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private function upsertByComposite(
|
private function upsertByComposite(
|
||||||
string $table,
|
string $table,
|
||||||
string $ipdField,
|
string $ipdField,
|
||||||
|
|
|
||||||
|
|
@ -738,9 +738,27 @@ $allergyStatusNoKnown = in_array($allergyStatusNormalized, ['no known drug aller
|
||||||
<?php if (empty($complaintRows)): ?>
|
<?php if (empty($complaintRows)): ?>
|
||||||
<tr><td colspan="3" class="text-muted text-center">No complaint rows yet.</td></tr>
|
<tr><td colspan="3" class="text-muted text-center">No complaint rows yet.</td></tr>
|
||||||
<?php else: foreach ($complaintRows as $row): ?>
|
<?php else: foreach ($complaintRows as $row): ?>
|
||||||
<tr>
|
<tr data-complaint-id="<?= (int) ($row['id'] ?? 0) ?>">
|
||||||
<td><?= esc((string) ($row['comp_report'] ?? '')) ?></td>
|
<td>
|
||||||
<td><?= esc((string) ($row['comp_remark'] ?? '')) ?></td>
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control form-control-sm discharge-complaint-name-input"
|
||||||
|
data-complaint-id="<?= (int) ($row['id'] ?? 0) ?>"
|
||||||
|
data-original-value="<?= esc((string) ($row['comp_report'] ?? '')) ?>"
|
||||||
|
value="<?= esc((string) ($row['comp_report'] ?? '')) ?>"
|
||||||
|
placeholder="Enter complaint name"
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control form-control-sm discharge-complaint-remark-input"
|
||||||
|
data-complaint-id="<?= (int) ($row['id'] ?? 0) ?>"
|
||||||
|
data-original-value="<?= esc((string) ($row['comp_remark'] ?? '')) ?>"
|
||||||
|
value="<?= esc((string) ($row['comp_remark'] ?? '')) ?>"
|
||||||
|
placeholder="Enter remark"
|
||||||
|
>
|
||||||
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<button type="submit" class="btn btn-outline-danger btn-sm" name="action" value="remove_complaint" data-reload-section="section-complaints" onclick="document.getElementById('complaint_remove_id').value='<?= (int) ($row['id'] ?? 0) ?>';">Remove</button>
|
<button type="submit" class="btn btn-outline-danger btn-sm" name="action" value="remove_complaint" data-reload-section="section-complaints" onclick="document.getElementById('complaint_remove_id').value='<?= (int) ($row['id'] ?? 0) ?>';">Remove</button>
|
||||||
</td>
|
</td>
|
||||||
|
|
@ -3877,6 +3895,86 @@ $allergyStatusNoKnown = in_array($allergyStatusNormalized, ['no known drug aller
|
||||||
}, { passive: true, capture: true });
|
}, { passive: true, capture: true });
|
||||||
syncNavOnScroll();
|
syncNavOnScroll();
|
||||||
|
|
||||||
|
// ═══════════════════════════════════════════════════════════════════
|
||||||
|
// Editable Complaint Name and Remark Fields
|
||||||
|
// ═══════════════════════════════════════════════════════════════════
|
||||||
|
function saveComplaintField(input, fieldType) {
|
||||||
|
var complaintId = input.getAttribute('data-complaint-id');
|
||||||
|
var newValue = input.value.trim();
|
||||||
|
var originalValue = input.getAttribute('data-original-value');
|
||||||
|
|
||||||
|
if (newValue === originalValue) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var form = document.getElementById('discharge_main_form');
|
||||||
|
if (!form) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var csrfPair = getCsrfPair(form);
|
||||||
|
var formData = new FormData();
|
||||||
|
formData.append(csrfPair.name, csrfPair.value);
|
||||||
|
formData.append('complaint_id', complaintId);
|
||||||
|
formData.append('field_type', fieldType);
|
||||||
|
formData.append('field_value', newValue);
|
||||||
|
|
||||||
|
fetch('<?= site_url('Ipd_discharge/update_complaint_field') ?>', {
|
||||||
|
method: 'POST',
|
||||||
|
body: formData
|
||||||
|
}).then(function(response) {
|
||||||
|
return response.json();
|
||||||
|
}).then(function(data) {
|
||||||
|
if (data.success) {
|
||||||
|
input.setAttribute('data-original-value', newValue);
|
||||||
|
input.style.borderColor = '#28a745';
|
||||||
|
setTimeout(function() {
|
||||||
|
input.style.borderColor = '';
|
||||||
|
}, 1000);
|
||||||
|
} else {
|
||||||
|
console.error('Failed to save complaint field:', data.error || 'Unknown error');
|
||||||
|
input.style.borderColor = '#dc3545';
|
||||||
|
setTimeout(function() {
|
||||||
|
input.style.borderColor = '';
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
}).catch(function(err) {
|
||||||
|
console.error('Error saving complaint field:', err);
|
||||||
|
input.style.borderColor = '#dc3545';
|
||||||
|
setTimeout(function() {
|
||||||
|
input.style.borderColor = '';
|
||||||
|
}, 2000);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Complaint Name input handlers
|
||||||
|
document.querySelectorAll('.discharge-complaint-name-input').forEach(function(input) {
|
||||||
|
input.addEventListener('blur', function() {
|
||||||
|
saveComplaintField(this, 'name');
|
||||||
|
});
|
||||||
|
|
||||||
|
input.addEventListener('keydown', function(e) {
|
||||||
|
if (e.key === 'Enter') {
|
||||||
|
e.preventDefault();
|
||||||
|
this.blur();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Complaint Remark input handlers
|
||||||
|
document.querySelectorAll('.discharge-complaint-remark-input').forEach(function(input) {
|
||||||
|
input.addEventListener('blur', function() {
|
||||||
|
saveComplaintField(this, 'remark');
|
||||||
|
});
|
||||||
|
|
||||||
|
input.addEventListener('keydown', function(e) {
|
||||||
|
if (e.key === 'Enter') {
|
||||||
|
e.preventDefault();
|
||||||
|
this.blur();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user