Add 'Save in Master' quick-add buttons for Surgery/Procedure
FEATURE: Quick-add functionality for Surgery and Procedure master terms NEW COMPONENTS: 1. 'Save in Master' buttons next to Surgery/Procedure inputs 2. Quick-add modal with SNOMED CT and ICD code fields 3. Instant save without opening full Master CRUD modal 4. Auto-populate input and master_id after save UI CHANGES: - Surgery/Procedure inputs now use input-group layout - Green 'Save in Master' button with plus-circle icon - Quick-add modal opens when clicking button - Name field auto-filled from input (read-only in modal) - Optional SNOMED CT code and ICD code fields - Success message shown before auto-close WORKFLOW: 1. User types new surgery/procedure name in input 2. Click 'Save in Master' button 3. Modal opens with name pre-filled 4. Enter SNOMED/ICD codes (optional) 5. Click 'Save in Master' in modal 6. Record saves to ipd_discharge_surgery_master table 7. Input filled with saved name 8. master_id hidden field populated 9. Modal closes automatically 10. User can now click '+ADD Row' to add to discharge BENEFITS: - No need to open full Master CRUD modal for quick adds - SNOMED/ICD codes can be added during workflow - Faster data entry for new terms - Master table stays organized and updated - ABDM compliance maintained with code support
This commit is contained in:
parent
5dccbc8d12
commit
b0b09bc2bf
|
|
@ -1040,12 +1040,17 @@ $allergyStatusNoKnown = in_array($allergyStatusNormalized, ['no known drug aller
|
||||||
<input type="hidden" name="new_surgery_master_id" id="new_surgery_master_id" value="0">
|
<input type="hidden" name="new_surgery_master_id" id="new_surgery_master_id" value="0">
|
||||||
<div class="row g-2 mb-3">
|
<div class="row g-2 mb-3">
|
||||||
<div class="col-md-5 position-relative">
|
<div class="col-md-5 position-relative">
|
||||||
<input type="text" class="form-control" name="new_surgery_name" id="new_surgery_name" autocomplete="off" placeholder="Surgery name (type to search master)">
|
<div class="input-group">
|
||||||
|
<input type="text" class="form-control" name="new_surgery_name" id="new_surgery_name" autocomplete="off" placeholder="Surgery name (type to search master)">
|
||||||
|
<button type="button" class="btn btn-outline-success btn-sm" id="btn_quick_add_surgery" title="Save new term in master">
|
||||||
|
<i class="bi bi-plus-circle"></i> Save in Master
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
<div id="discharge_surgery_dropdown" class="dropdown-menu" style="display:none;position:absolute;z-index:1050;max-height:250px;overflow-y:auto;width:100%;"></div>
|
<div id="discharge_surgery_dropdown" class="dropdown-menu" style="display:none;position:absolute;z-index:1050;max-height:250px;overflow-y:auto;width:100%;"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3"><input type="date" class="form-control" name="new_surgery_date"></div>
|
<div class="col-md-3"><input type="date" class="form-control" name="new_surgery_date"></div>
|
||||||
<div class="col-md-3"><input type="text" class="form-control" name="new_surgery_remark" placeholder="Remark"></div>
|
<div class="col-md-2"><input type="text" class="form-control" name="new_surgery_remark" placeholder="Remark"></div>
|
||||||
<div class="col-md-1"><button type="submit" class="btn btn-primary btn-sm" name="action" value="add_surgery">+ADD</button></div>
|
<div class="col-md-2"><button type="submit" class="btn btn-primary btn-sm w-100" name="action" value="add_surgery">+ADD Row</button></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h6>Procedure</h6>
|
<h6>Procedure</h6>
|
||||||
|
|
@ -1068,12 +1073,17 @@ $allergyStatusNoKnown = in_array($allergyStatusNormalized, ['no known drug aller
|
||||||
<input type="hidden" name="new_procedure_master_id" id="new_procedure_master_id" value="0">
|
<input type="hidden" name="new_procedure_master_id" id="new_procedure_master_id" value="0">
|
||||||
<div class="row g-2">
|
<div class="row g-2">
|
||||||
<div class="col-md-5 position-relative">
|
<div class="col-md-5 position-relative">
|
||||||
<input type="text" class="form-control" name="new_procedure_name" id="new_procedure_name" autocomplete="off" placeholder="Procedure name (type to search master)">
|
<div class="input-group">
|
||||||
|
<input type="text" class="form-control" name="new_procedure_name" id="new_procedure_name" autocomplete="off" placeholder="Procedure name (type to search master)">
|
||||||
|
<button type="button" class="btn btn-outline-success btn-sm" id="btn_quick_add_procedure" title="Save new term in master">
|
||||||
|
<i class="bi bi-plus-circle"></i> Save in Master
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
<div id="discharge_procedure_dropdown" class="dropdown-menu" style="display:none;position:absolute;z-index:1050;max-height:250px;overflow-y:auto;width:100%;"></div>
|
<div id="discharge_procedure_dropdown" class="dropdown-menu" style="display:none;position:absolute;z-index:1050;max-height:250px;overflow-y:auto;width:100%;"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3"><input type="date" class="form-control" name="new_procedure_date"></div>
|
<div class="col-md-3"><input type="date" class="form-control" name="new_procedure_date"></div>
|
||||||
<div class="col-md-3"><input type="text" class="form-control" name="new_procedure_remark" placeholder="Remark"></div>
|
<div class="col-md-2"><input type="text" class="form-control" name="new_procedure_remark" placeholder="Remark"></div>
|
||||||
<div class="col-md-1"><button type="submit" class="btn btn-primary btn-sm" name="action" value="add_procedure">+ADD</button></div>
|
<div class="col-md-2"><button type="submit" class="btn btn-primary btn-sm w-100" name="action" value="add_procedure">+ADD Row</button></div>
|
||||||
</div>
|
</div>
|
||||||
<datalist id="discharge_procedure_suggest"></datalist>
|
<datalist id="discharge_procedure_suggest"></datalist>
|
||||||
<div id="discharge_surgery_status" class="complaint-status text-muted"></div>
|
<div id="discharge_surgery_status" class="complaint-status text-muted"></div>
|
||||||
|
|
@ -1559,6 +1569,43 @@ $allergyStatusNoKnown = in_array($allergyStatusNormalized, ['no known drug aller
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Quick Add Surgery/Procedure Modal -->
|
||||||
|
<div class="modal fade" id="quickAddTermModal" tabindex="-1" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-dialog-centered">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title">Save New <span id="quick_term_type_label">Surgery</span> in Master</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<input type="hidden" id="quick_term_type" value="surgery">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-label fw-semibold">Name <span class="text-danger">*</span></label>
|
||||||
|
<input type="text" class="form-control" id="quick_term_name" placeholder="Enter surgery/procedure name" readonly>
|
||||||
|
<div class="form-text">This will be saved to the master table</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-label">SNOMED CT Code</label>
|
||||||
|
<input type="text" class="form-control" id="quick_term_code" placeholder="e.g., 80146002">
|
||||||
|
<div class="form-text">Optional - SNOMED CT terminology code</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-label">ICD Code</label>
|
||||||
|
<input type="text" class="form-control" id="quick_term_icd" placeholder="e.g., K35.80">
|
||||||
|
<div class="form-text">Optional - ICD-10 code</div>
|
||||||
|
</div>
|
||||||
|
<div id="quick_term_status" class="text-muted"></div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
|
||||||
|
<button type="button" class="btn btn-success" id="btn_quick_term_save">
|
||||||
|
<i class="bi bi-check-circle"></i> Save in Master
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
(function() {
|
(function() {
|
||||||
var narrativeTemplateLoadState = { section: '', target: '', rows: [] };
|
var narrativeTemplateLoadState = { section: '', target: '', rows: [] };
|
||||||
|
|
@ -2108,6 +2155,158 @@ $allergyStatusNoKnown = in_array($allergyStatusNormalized, ['no known drug aller
|
||||||
function initSurgeryProcedureAutocomplete() {
|
function initSurgeryProcedureAutocomplete() {
|
||||||
initTermAutocomplete('surgery', 'new_surgery_name', 'discharge_surgery_dropdown', 'new_surgery_master_id');
|
initTermAutocomplete('surgery', 'new_surgery_name', 'discharge_surgery_dropdown', 'new_surgery_master_id');
|
||||||
initTermAutocomplete('procedure', 'new_procedure_name', 'discharge_procedure_dropdown', 'new_procedure_master_id');
|
initTermAutocomplete('procedure', 'new_procedure_name', 'discharge_procedure_dropdown', 'new_procedure_master_id');
|
||||||
|
|
||||||
|
// Quick-add button handlers
|
||||||
|
initQuickAddTermHandlers();
|
||||||
|
}
|
||||||
|
|
||||||
|
function initQuickAddTermHandlers() {
|
||||||
|
var quickModal = document.getElementById('quickAddTermModal');
|
||||||
|
var quickType = document.getElementById('quick_term_type');
|
||||||
|
var quickTypeLabel = document.getElementById('quick_term_type_label');
|
||||||
|
var quickName = document.getElementById('quick_term_name');
|
||||||
|
var quickCode = document.getElementById('quick_term_code');
|
||||||
|
var quickIcd = document.getElementById('quick_term_icd');
|
||||||
|
var quickStatus = document.getElementById('quick_term_status');
|
||||||
|
var btnSave = document.getElementById('btn_quick_term_save');
|
||||||
|
|
||||||
|
if (!quickModal || !quickName) return;
|
||||||
|
|
||||||
|
// Surgery quick-add button
|
||||||
|
var btnQuickSurgery = document.getElementById('btn_quick_add_surgery');
|
||||||
|
if (btnQuickSurgery) {
|
||||||
|
btnQuickSurgery.addEventListener('click', function() {
|
||||||
|
var surgeryInput = document.getElementById('new_surgery_name');
|
||||||
|
var surgeryName = surgeryInput ? surgeryInput.value.trim() : '';
|
||||||
|
|
||||||
|
if (!surgeryName) {
|
||||||
|
alert('Please enter a surgery name first');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
quickType.value = 'surgery';
|
||||||
|
quickTypeLabel.textContent = 'Surgery';
|
||||||
|
quickName.value = surgeryName;
|
||||||
|
quickCode.value = '';
|
||||||
|
quickIcd.value = '';
|
||||||
|
quickStatus.textContent = '';
|
||||||
|
quickStatus.className = 'text-muted';
|
||||||
|
|
||||||
|
showModalById('quickAddTermModal');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Procedure quick-add button
|
||||||
|
var btnQuickProcedure = document.getElementById('btn_quick_add_procedure');
|
||||||
|
if (btnQuickProcedure) {
|
||||||
|
btnQuickProcedure.addEventListener('click', function() {
|
||||||
|
var procedureInput = document.getElementById('new_procedure_name');
|
||||||
|
var procedureName = procedureInput ? procedureInput.value.trim() : '';
|
||||||
|
|
||||||
|
if (!procedureName) {
|
||||||
|
alert('Please enter a procedure name first');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
quickType.value = 'procedure';
|
||||||
|
quickTypeLabel.textContent = 'Procedure';
|
||||||
|
quickName.value = procedureName;
|
||||||
|
quickCode.value = '';
|
||||||
|
quickIcd.value = '';
|
||||||
|
quickStatus.textContent = '';
|
||||||
|
quickStatus.className = 'text-muted';
|
||||||
|
|
||||||
|
showModalById('quickAddTermModal');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save button in modal
|
||||||
|
if (btnSave) {
|
||||||
|
btnSave.addEventListener('click', function() {
|
||||||
|
var name = quickName.value.trim();
|
||||||
|
var type = quickType.value;
|
||||||
|
var code = quickCode.value.trim();
|
||||||
|
var icd = quickIcd.value.trim();
|
||||||
|
|
||||||
|
if (!name) {
|
||||||
|
setQuickStatus('Name is required', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!window.jQuery) {
|
||||||
|
setQuickStatus('jQuery not loaded', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var form = getDischargeForm();
|
||||||
|
if (!form) {
|
||||||
|
setQuickStatus('Form not found', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var csrf = getCsrfPair(form);
|
||||||
|
var payload = {
|
||||||
|
id: 0,
|
||||||
|
type: type,
|
||||||
|
name: name,
|
||||||
|
code: code,
|
||||||
|
icd_code: icd,
|
||||||
|
is_active: 1
|
||||||
|
};
|
||||||
|
payload[csrf.name] = csrf.value;
|
||||||
|
|
||||||
|
setQuickStatus('Saving...', 'muted');
|
||||||
|
btnSave.disabled = true;
|
||||||
|
|
||||||
|
$.post('<?= base_url('Ipd_discharge/surgery_master_save') ?>', payload, function(data) {
|
||||||
|
updateFormCsrf(form, data);
|
||||||
|
btnSave.disabled = false;
|
||||||
|
|
||||||
|
if (!data || parseInt(data.update || '0', 10) !== 1) {
|
||||||
|
setQuickStatus((data && data.error_text) ? data.error_text : 'Save failed', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setQuickStatus('✓ Saved successfully!', 'success');
|
||||||
|
|
||||||
|
// Update the input with saved name and set master_id
|
||||||
|
var savedId = parseInt(data.id || '0', 10);
|
||||||
|
if (type === 'surgery') {
|
||||||
|
var surgeryInput = document.getElementById('new_surgery_name');
|
||||||
|
var surgeryMasterId = document.getElementById('new_surgery_master_id');
|
||||||
|
if (surgeryInput) surgeryInput.value = name;
|
||||||
|
if (surgeryMasterId) surgeryMasterId.value = savedId;
|
||||||
|
} else if (type === 'procedure') {
|
||||||
|
var procedureInput = document.getElementById('new_procedure_name');
|
||||||
|
var procedureMasterId = document.getElementById('new_procedure_master_id');
|
||||||
|
if (procedureInput) procedureInput.value = name;
|
||||||
|
if (procedureMasterId) procedureMasterId.value = savedId;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close modal after short delay
|
||||||
|
setTimeout(function() {
|
||||||
|
hideModalById('quickAddTermModal');
|
||||||
|
}, 1000);
|
||||||
|
}, 'json').fail(function() {
|
||||||
|
btnSave.disabled = false;
|
||||||
|
setQuickStatus('Network error', 'error');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function setQuickStatus(text, level) {
|
||||||
|
if (!quickStatus) return;
|
||||||
|
|
||||||
|
quickStatus.classList.remove('text-success', 'text-danger', 'text-muted');
|
||||||
|
if (level === 'success') {
|
||||||
|
quickStatus.classList.add('text-success');
|
||||||
|
} else if (level === 'error') {
|
||||||
|
quickStatus.classList.add('text-danger');
|
||||||
|
} else {
|
||||||
|
quickStatus.classList.add('text-muted');
|
||||||
|
}
|
||||||
|
quickStatus.textContent = text;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function initTermAutocomplete(type, inputId, dropdownId, hiddenId) {
|
function initTermAutocomplete(type, inputId, dropdownId, hiddenId) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user