Fix discharge medicine autocomplete and auto-fill - use OPD medicine_search endpoint

- Change from rx_group_medicine_suggest to Opd_prescription/medicine_search endpoint
- Match OPD Consult Form data source and behavior
- Auto-fill Type, Dose, When, Frequency, Route, Days, Qty, and Remark from medicine master
- Add ensureDoseOption helper to handle current values not in dropdown list
- Store medicine rows for auto-fill on selection
- Improved user experience with comprehensive auto-complete
This commit is contained in:
DevSoftTech Server 2026-06-06 20:18:30 +05:30
parent ee5b29f688
commit 66b5e1b6a5

View File

@ -4107,6 +4107,7 @@ $allergyStatusNoKnown = in_array($allergyStatusNormalized, ['no known drug aller
var dischargeMedInput = section.querySelector('#discharge_med_name');
var dischargeMedSuggest = section.querySelector('#discharge_med_suggest');
var dischargeMedType = section.querySelector('#discharge_med_type');
var dischargeMedSuggestRows = [];
if (dischargeMedInput) {
dischargeMedInput.addEventListener('input', function() {
@ -4115,15 +4116,16 @@ $allergyStatusNoKnown = in_array($allergyStatusNormalized, ['no known drug aller
return;
}
$.get('<?= base_url('Opd_prescription/rx_group_medicine_suggest') ?>?q=' + encodeURIComponent(q), function(data) {
$.get('<?= base_url('Opd_prescription/medicine_search') ?>?q=' + encodeURIComponent(q) + '&scope=active&limit=10', function(data) {
var rows = (data && data.rows) ? data.rows : [];
dischargeMedSuggestRows = rows;
var html = '';
rows.forEach(function(row) {
var name = String(row.med_name || '').trim();
if (name === '') {
return;
}
html += '<option value="' + $('<div>').text(name).html() + '" data-type="' + $('<div>').text(row.med_type || '').html() + '" data-id="' + (row.med_id || 0) + '"></option>';
html += '<option value="' + $('<div>').text(name).html() + '" data-type="' + $('<div>').text(row.med_type || '').html() + '" data-id="' + (row.id || 0) + '"></option>';
});
if (dischargeMedSuggest) {
dischargeMedSuggest.innerHTML = html;
@ -4132,24 +4134,82 @@ $allergyStatusNoKnown = in_array($allergyStatusNormalized, ['no known drug aller
});
dischargeMedInput.addEventListener('change', function() {
var value = String(dischargeMedInput.value || '').trim();
if (value === '' || !dischargeMedSuggest) {
var value = String(dischargeMedInput.value || '').trim().toUpperCase();
if (value === '') {
return;
}
// Find matching option and fill type if empty
var options = dischargeMedSuggest.querySelectorAll('option');
options.forEach(function(opt) {
if (opt.value === value && dischargeMedType && dischargeMedType.value.trim() === '') {
var type = opt.getAttribute('data-type') || '';
if (type) {
dischargeMedType.value = type;
}
// Find matching medicine and auto-fill all fields
var matched = null;
dischargeMedSuggestRows.forEach(function(row) {
if (String(row.med_name || '').trim().toUpperCase() === value) {
matched = row;
}
});
if (matched) {
// Auto-fill Type
if (dischargeMedType && dischargeMedType.value.trim() === '') {
dischargeMedType.value = String(matched.med_type || '').trim();
}
// Auto-fill dose fields if they have values
var dosageSelect = section.querySelector('#discharge_dosage');
var whenSelect = section.querySelector('#discharge_dosage_when');
var freqSelect = section.querySelector('#discharge_dosage_freq');
var whereSelect = section.querySelector('#discharge_dose_where');
var daysInput = section.querySelector('#discharge_no_of_days');
var qtyInput = section.querySelector('#discharge_qty');
var remarkInput = section.querySelector('#discharge_remark');
if (matched.dosage && dosageSelect && dosageSelect.value === '') {
ensureDoseOption(dosageSelect, matched.dosage);
dosageSelect.value = matched.dosage;
}
if (matched.dosage_when && whenSelect && whenSelect.value === '') {
ensureDoseOption(whenSelect, matched.dosage_when);
whenSelect.value = matched.dosage_when;
}
if (matched.dosage_freq && freqSelect && freqSelect.value === '') {
ensureDoseOption(freqSelect, matched.dosage_freq);
freqSelect.value = matched.dosage_freq;
}
if (matched.dosage_where && whereSelect && whereSelect.value === '') {
ensureDoseOption(whereSelect, matched.dosage_where);
whereSelect.value = matched.dosage_where;
}
if (matched.no_of_days && daysInput && daysInput.value === '') {
daysInput.value = String(matched.no_of_days || '').trim();
}
if (matched.qty && qtyInput && qtyInput.value === '') {
qtyInput.value = String(matched.qty || '').trim();
}
if (matched.remark && remarkInput && remarkInput.value === '') {
remarkInput.value = String(matched.remark || '').trim();
}
}
});
}
function ensureDoseOption(select, value) {
value = (value || '').toString().trim();
if (!value) {
return;
}
var exists = false;
$(select).find('option').each(function() {
if ($(this).val() === value) {
exists = true;
return false;
}
});
if (!exists) {
$(select).append('<option value="' + $('<div>').text(value).html() + '">' + $('<div>').text(value + ' (Current)').html() + '</option>');
}
}
// Handle quick buttons
section.querySelectorAll('.discharge-quick-btn').forEach(function(btn) {
btn.addEventListener('click', function() {