Ensure strict sequential keyboard focus navigation across OPD Consult and IPD Discharge prescription controls

This commit is contained in:
DevSoftTech Server 2026-09-23 08:15:09 +05:30
parent c0842d1502
commit c0cbf1c0bd
2 changed files with 193 additions and 113 deletions

View File

@ -6426,16 +6426,18 @@ $historyFields = [
highlightIdx = (highlightIdx - 1 + items.length) % items.length; highlightIdx = (highlightIdx - 1 + items.length) % items.length;
updateHighlight(items, true); updateHighlight(items, true);
} else if (e.key === 'Enter' || e.key === 'Tab') { } else if (e.key === 'Enter' || e.key === 'Tab') {
if (e.key === 'Tab' && e.shiftKey) return;
e.preventDefault();
if (isVisible) { if (isVisible) {
if (e.key === 'Enter') e.preventDefault(); var targetIdx = highlightIdx >= 0 ? highlightIdx : 0;
if (highlightIdx >= 0 && items[highlightIdx]) { if (items[targetIdx]) {
dosageInput.value = items[highlightIdx].getAttribute('data-val'); dosageInput.value = items[targetIdx].getAttribute('data-val') || items[targetIdx].innerText.trim();
} }
dosageDropdown.style.display = 'none'; dosageDropdown.style.display = 'none';
highlightIdx = -1; highlightIdx = -1;
var freq = document.getElementById('discharge_dosage_freq');
if (freq) freq.focus();
} }
var freq = document.getElementById('discharge_dosage_freq');
if (freq) freq.focus();
} else if (e.key === 'Escape') { } else if (e.key === 'Escape') {
dosageDropdown.style.display = 'none'; dosageDropdown.style.display = 'none';
highlightIdx = -1; highlightIdx = -1;
@ -6521,10 +6523,10 @@ $historyFields = [
var html = ''; var html = '';
items.forEach(function(s, i) { items.forEach(function(s, i) {
var bgStyle = (i === highlightIdx) ? 'background:#e2ebff;' : ''; var bgStyle = (i === highlightIdx) ? 'background:#0d6efd;color:#ffffff;font-weight:600;' : '';
var labelHtml = '<strong>' + $('<div>').text(s.code).html() + '</strong>'; var labelHtml = '<strong>' + $('<div>').text(s.code).html() + '</strong>';
if (s.desc) { if (s.desc) {
labelHtml += ' <span class="text-muted ms-2" style="font-size:12px;">(' + $('<div>').text(s.desc).html() + ')</span>'; labelHtml += ' <span class="' + (i === highlightIdx ? 'text-white-50' : 'text-muted') + ' ms-2" style="font-size:12px;">(' + $('<div>').text(s.desc).html() + ')</span>';
} }
html += '<div class="px-3 py-2 border-bottom d-flex justify-content-between align-items-center discharge-freq-opt" data-code="' + $('<div>').text(s.code).html() + '" style="cursor:pointer;font-size:13px;' + bgStyle + '">' + labelHtml + '</div>'; html += '<div class="px-3 py-2 border-bottom d-flex justify-content-between align-items-center discharge-freq-opt" data-code="' + $('<div>').text(s.code).html() + '" style="cursor:pointer;font-size:13px;' + bgStyle + '">' + labelHtml + '</div>';
}); });
@ -6546,15 +6548,8 @@ $historyFields = [
}); });
freqInput.addEventListener('keydown', function(e) { freqInput.addEventListener('keydown', function(e) {
if (e.key === 'Tab' && e.shiftKey) return;
var sugs = getSuggestions(freqInput.value); var sugs = getSuggestions(freqInput.value);
if (!sugs.length || freqDropdown.style.display === 'none') {
if (e.key === 'Enter') {
e.preventDefault();
var whenSelect = document.getElementById('discharge_dosage_when');
if (whenSelect) whenSelect.focus();
}
return;
}
if (e.key === 'ArrowDown') { if (e.key === 'ArrowDown') {
e.preventDefault(); e.preventDefault();
@ -6577,20 +6572,29 @@ $historyFields = [
freqInput.value = sugs[highlightIdx].code; freqInput.value = sugs[highlightIdx].code;
} }
} else if (e.key === 'Enter' || e.key === 'Tab') { } else if (e.key === 'Enter' || e.key === 'Tab') {
e.preventDefault();
if (freqDropdown.style.display === 'block') { if (freqDropdown.style.display === 'block') {
if (e.key === 'Enter') e.preventDefault(); var targetIdx = highlightIdx >= 0 ? highlightIdx : 0;
if (highlightIdx >= 0 && sugs[highlightIdx]) { if (sugs[targetIdx]) {
freqInput.value = sugs[highlightIdx].code; freqInput.value = sugs[targetIdx].code;
} }
freqDropdown.style.display = 'none'; freqDropdown.style.display = 'none';
var whenSelect = document.getElementById('discharge_dosage_when'); highlightIdx = -1;
if (whenSelect) whenSelect.focus();
} }
var whenSelect = document.getElementById('discharge_dosage_when');
if (whenSelect) whenSelect.focus();
} else if (e.key === 'Escape') { } else if (e.key === 'Escape') {
freqDropdown.style.display = 'none'; freqDropdown.style.display = 'none';
} }
}); });
$(document).on('click', '.discharge-freq-opt', function() {
freqInput.value = $(this).data('code');
freqDropdown.style.display = 'none';
var whenSelect = document.getElementById('discharge_dosage_when');
if (whenSelect) whenSelect.focus();
});
document.addEventListener('click', function(e) { document.addEventListener('click', function(e) {
if (!freqInput.contains(e.target) && !freqDropdown.contains(e.target)) { if (!freqInput.contains(e.target) && !freqDropdown.contains(e.target)) {
freqDropdown.style.display = 'none'; freqDropdown.style.display = 'none';
@ -6598,6 +6602,28 @@ $historyFields = [
}); });
})(); })();
// ─── Sequential Enter-key Navigation between Formulation, Timing & Route ───
$('#discharge_med_type').on('keydown', function(e) {
if (e.key === 'Enter') {
e.preventDefault();
$('#discharge_dosage').focus();
}
});
$('#discharge_dosage_when').on('keydown', function(e) {
if (e.key === 'Enter') {
e.preventDefault();
$('#discharge_dose_where').focus();
}
});
$('#discharge_dose_where').on('keydown', function(e) {
if (e.key === 'Enter') {
e.preventDefault();
$('#discharge_no_of_days').focus();
}
});
// ── Smart Duration Autotext for #discharge_no_of_days ───────────────────────── // ── Smart Duration Autotext for #discharge_no_of_days ─────────────────────────
(function() { (function() {
var daysInput = document.getElementById('discharge_no_of_days'); var daysInput = document.getElementById('discharge_no_of_days');
@ -6739,21 +6765,18 @@ $historyFields = [
} }
updateHighlight(items, true); updateHighlight(items, true);
} else if (e.key === 'Enter' || e.key === 'Tab') { } else if (e.key === 'Enter' || e.key === 'Tab') {
if (e.key === 'Tab' && e.shiftKey) return;
e.preventDefault();
if (isVisible) { if (isVisible) {
if (e.key === 'Enter') e.preventDefault();
var targetIdx = selectedIdx >= 0 ? selectedIdx : 0; var targetIdx = selectedIdx >= 0 ? selectedIdx : 0;
if (items[targetIdx]) { if (items[targetIdx]) {
daysInput.value = items[targetIdx].getAttribute('data-val') || items[targetIdx].innerText.trim(); daysInput.value = items[targetIdx].getAttribute('data-val') || items[targetIdx].innerText.trim();
} }
daysDropdown.style.display = 'none'; daysDropdown.style.display = 'none';
selectedIdx = -1; selectedIdx = -1;
var remark = document.getElementById('discharge_remark');
if (remark) remark.focus();
} else if (e.key === 'Enter') {
e.preventDefault();
var remark = document.getElementById('discharge_remark');
if (remark) remark.focus();
} }
var remark = document.getElementById('discharge_remark');
if (remark) remark.focus();
} else if (e.key === 'Escape') { } else if (e.key === 'Escape') {
daysDropdown.style.display = 'none'; daysDropdown.style.display = 'none';
selectedIdx = -1; selectedIdx = -1;
@ -6786,16 +6809,23 @@ $historyFields = [
var medRemarkHighlightIdx = -1; var medRemarkHighlightIdx = -1;
function highlightMedRemarkItem(idx) { function highlightMedRemarkItem(idx, updateInput) {
var $items = $('#discharge_remark_dd .discharge-remark-dd-item'); var $items = $('#discharge_remark_dd .discharge-remark-dd-item');
if (!$items.length) return; if (!$items.length) return;
if (idx < 0) idx = 0; if (idx < 0) idx = 0;
if (idx >= $items.length) idx = $items.length - 1; if (idx >= $items.length) idx = $items.length - 1;
medRemarkHighlightIdx = idx; medRemarkHighlightIdx = idx;
$items.css('background', '').removeClass('active-dd-item'); $items.css({ 'background': '', 'color': '', 'font-weight': '' }).removeClass('active-dd-item');
var $target = $items.eq(medRemarkHighlightIdx); var $target = $items.eq(medRemarkHighlightIdx);
$target.css('background', '#e2ebff').addClass('active-dd-item'); $target.css({ 'background': '#0d6efd', 'color': '#ffffff', 'font-weight': '600' }).addClass('active-dd-item');
if (updateInput) {
var val = $target.text().trim();
if (val) {
$('#discharge_remark').val(val);
}
}
var container = document.getElementById('discharge_remark_dd'); var container = document.getElementById('discharge_remark_dd');
var elem = $target[0]; var elem = $target[0];
@ -6832,8 +6862,8 @@ $historyFields = [
var $row = $('<div class="px-3 py-2 border-bottom discharge-remark-dd-item" data-idx="' + idx + '" style="cursor:pointer;font-size:.875rem"></div>') var $row = $('<div class="px-3 py-2 border-bottom discharge-remark-dd-item" data-idx="' + idx + '" style="cursor:pointer;font-size:.875rem"></div>')
.text(s); .text(s);
$row.on('mouseenter', function() { highlightMedRemarkItem(idx); }) $row.on('mouseenter', function() { highlightMedRemarkItem(idx, false); })
.on('mouseleave', function() { $(this).css('background',''); }) .on('mouseleave', function() { $(this).css({ 'background': '', 'color': '', 'font-weight': '' }); })
.on('mousedown', function(e) { e.preventDefault(); }) .on('mousedown', function(e) { e.preventDefault(); })
.on('click', function() { .on('click', function() {
$('#discharge_remark').val(s); $('#discharge_remark').val(s);
@ -6864,31 +6894,31 @@ $historyFields = [
if (!isVisible) { if (!isVisible) {
var sugs = getMedRemarkSuggestions(($(this).val() || '').trim()); var sugs = getMedRemarkSuggestions(($(this).val() || '').trim());
renderMedRemarkDropdown(sugs); renderMedRemarkDropdown(sugs);
highlightMedRemarkItem(0); highlightMedRemarkItem(0, true);
return; return;
} }
e.preventDefault(); e.preventDefault();
var nextIdx = medRemarkHighlightIdx + 1; var nextIdx = medRemarkHighlightIdx < 0 ? 0 : (medRemarkHighlightIdx + 1) % $items.length;
if (nextIdx >= $items.length) nextIdx = 0; highlightMedRemarkItem(nextIdx, true);
highlightMedRemarkItem(nextIdx);
} else if (e.key === 'ArrowUp') { } else if (e.key === 'ArrowUp') {
if (!isVisible) return; if (!isVisible) return;
e.preventDefault(); e.preventDefault();
var prevIdx = medRemarkHighlightIdx - 1; var prevIdx = medRemarkHighlightIdx < 0 ? ($items.length - 1) : (medRemarkHighlightIdx - 1 + $items.length) % $items.length;
if (prevIdx < 0) prevIdx = $items.length - 1; highlightMedRemarkItem(prevIdx, true);
highlightMedRemarkItem(prevIdx); } else if (e.key === 'Enter' || e.key === 'Tab') {
} else if (e.key === 'Enter') { if (e.key === 'Tab' && e.shiftKey) return;
if (isVisible && medRemarkHighlightIdx >= 0) { e.preventDefault();
e.preventDefault(); if (isVisible) {
var $target = $items.eq(medRemarkHighlightIdx); var targetIdx = medRemarkHighlightIdx >= 0 ? medRemarkHighlightIdx : 0;
var $target = $items.eq(targetIdx);
if ($target.length) { if ($target.length) {
$target.trigger('click'); $('#discharge_remark').val($target.text().trim());
} }
} else if (!isVisible && e.key === 'Enter') { $dd.hide().empty();
e.preventDefault(); medRemarkHighlightIdx = -1;
var btnAdd = document.getElementById('btn_discharge_med_add');
if (btnAdd) btnAdd.focus();
} }
var btnAdd = document.getElementById('btn_discharge_med_add');
if (btnAdd) btnAdd.focus();
} else if (e.key === 'Escape') { } else if (e.key === 'Escape') {
$dd.hide().empty(); $dd.hide().empty();
medRemarkHighlightIdx = -1; medRemarkHighlightIdx = -1;
@ -7119,6 +7149,7 @@ $historyFields = [
applyDischargeMedicineMatch(row); applyDischargeMedicineMatch(row);
$dd.hide().empty(); $dd.hide().empty();
dischargeMedHighlightIdx = -1; dischargeMedHighlightIdx = -1;
setTimeout(function() { $('#discharge_med_type').focus(); }, 30);
}); });
$dd.append($item); $dd.append($item);
@ -7185,17 +7216,24 @@ $historyFields = [
var prevIdx = dischargeMedHighlightIdx - 1; var prevIdx = dischargeMedHighlightIdx - 1;
if (prevIdx < 0) prevIdx = $items.length - 1; if (prevIdx < 0) prevIdx = $items.length - 1;
highlightDischargeMedNameItem(prevIdx); highlightDischargeMedNameItem(prevIdx);
} else if (e.key === 'Enter') { } else if (e.key === 'Enter' || e.key === 'Tab') {
if (isVisible && dischargeMedHighlightIdx >= 0 && dischargeMedSuggestRows[dischargeMedHighlightIdx]) { if (e.key === 'Tab' && e.shiftKey) return;
if (isVisible) {
e.preventDefault(); e.preventDefault();
applyDischargeMedicineMatch(dischargeMedSuggestRows[dischargeMedHighlightIdx]); var targetIdx = dischargeMedHighlightIdx >= 0 ? dischargeMedHighlightIdx : 0;
if (dischargeMedSuggestRows[targetIdx]) {
applyDischargeMedicineMatch(dischargeMedSuggestRows[targetIdx]);
}
$dd.hide().empty(); $dd.hide().empty();
dischargeMedHighlightIdx = -1; dischargeMedHighlightIdx = -1;
var nextTarget = section.querySelector('#discharge_med_type') || section.querySelector('#discharge_dosage'); setTimeout(function() { $('#discharge_med_type').focus(); }, 30);
if (nextTarget) nextTarget.focus(); } else if (e.key === 'Enter') {
e.preventDefault();
setTimeout(function() { $('#discharge_med_type').focus(); }, 30);
} }
} else if (e.key === 'Escape') { } else if (e.key === 'Escape') {
$dd.hide(); $dd.hide().empty();
dischargeMedHighlightIdx = -1;
} }
}); });
} }

View File

@ -6840,20 +6840,18 @@
if (prevIdx < 0) prevIdx = $items.length - 1; if (prevIdx < 0) prevIdx = $items.length - 1;
highlightMedDosageItem(prevIdx, true); highlightMedDosageItem(prevIdx, true);
} else if (e.key === 'Enter' || e.key === 'Tab') { } else if (e.key === 'Enter' || e.key === 'Tab') {
if (e.key === 'Tab' && e.shiftKey) return;
e.preventDefault();
if (isVisible) { if (isVisible) {
var targetIdx = medDosageHighlightIdx >= 0 ? medDosageHighlightIdx : 0; var targetIdx = medDosageHighlightIdx >= 0 ? medDosageHighlightIdx : 0;
var $target = $items.eq(targetIdx); var $target = $items.eq(targetIdx);
if ($target.length) { if ($target.length) {
if (e.key === 'Enter') e.preventDefault();
$('#med_dosage').val($target.text().trim()).trigger('change'); $('#med_dosage').val($target.text().trim()).trigger('change');
$dd.hide().empty();
medDosageHighlightIdx = -1;
setTimeout(function() { $('#med_freq').focus(); }, 30);
} }
} else if (e.key === 'Enter') { $dd.hide().empty();
e.preventDefault(); medDosageHighlightIdx = -1;
setTimeout(function() { $('#med_freq').focus(); }, 30);
} }
setTimeout(function() { $('#med_freq').focus(); }, 30);
} else if (e.key === 'Escape') { } else if (e.key === 'Escape') {
$dd.hide().empty(); $dd.hide().empty();
medDosageHighlightIdx = -1; medDosageHighlightIdx = -1;
@ -6866,30 +6864,36 @@
{ code: 'BD', desc: 'Twice Daily (2 doses/day)' }, { code: 'BD', desc: 'Twice Daily (2 doses/day)' },
{ code: 'TDS', desc: 'Thrice Daily (3 doses/day)' }, { code: 'TDS', desc: 'Thrice Daily (3 doses/day)' },
{ code: 'QID', desc: 'Four Times Daily (4 doses/day)' }, { code: 'QID', desc: 'Four Times Daily (4 doses/day)' },
{ code: 'HS', desc: 'At Bedtime (Once at night)' }, { code: 'HS', desc: 'At Bedtime / Night' },
{ code: 'SOS', desc: 'As Needed (Only when required)' }, { code: 'SOS', desc: 'As Needed (If Required)' },
{ code: 'STAT', desc: 'Immediately (Single Dose)' },
{ code: 'Q4H', desc: 'Every 4 Hours' }, { code: 'Q4H', desc: 'Every 4 Hours' },
{ code: 'Q6H', desc: 'Every 6 Hours' }, { code: 'Q6H', desc: 'Every 6 Hours' },
{ code: 'Q8H', desc: 'Every 8 Hours' }, { code: 'Q8H', desc: 'Every 8 Hours' },
{ code: 'Alternate Day', desc: 'Once every 2 days' }, { code: 'Q12H', desc: 'Every 12 Hours' },
{ code: 'Weekly', desc: 'Long-interval (Once a week)' }, { code: 'Weekly', desc: 'Once a Week' },
{ code: 'Monthly', desc: 'Long-interval (Once a month)' }, { code: 'Alt Day', desc: 'Alternate Days (Every 48 Hours)' }
{ code: 'Continuous Infusion', desc: 'IV drip maintained continuously' },
{ code: 'Stat', desc: 'Immediate single dose' }
]; ];
var medFreqHighlightIdx = -1; var medFreqHighlightIdx = -1;
function highlightMedFreqItem(idx) { function highlightMedFreqItem(idx, updateInput) {
var $items = $('#med_freq_dd .med-freq-dd-item'); var $items = $('#med_freq_dd .med-freq-dd-item');
if (!$items.length) return; if (!$items.length) return;
if (idx < 0) idx = 0; if (idx < 0) idx = 0;
if (idx >= $items.length) idx = $items.length - 1; if (idx >= $items.length) idx = $items.length - 1;
medFreqHighlightIdx = idx; medFreqHighlightIdx = idx;
$items.css('background', '').removeClass('active-dd-item'); $items.css({ 'background': '', 'color': '', 'font-weight': '' }).removeClass('active-dd-item');
var $target = $items.eq(medFreqHighlightIdx); var $target = $items.eq(medFreqHighlightIdx);
$target.css('background', '#e2ebff').addClass('active-dd-item'); $target.css({ 'background': '#0d6efd', 'color': '#ffffff', 'font-weight': '600' }).addClass('active-dd-item');
if (updateInput) {
var val = $target.find('strong').text().trim() || $target.text().trim();
if (val) {
$('#med_freq').val(val).trigger('change');
}
}
var container = document.getElementById('med_freq_dd'); var container = document.getElementById('med_freq_dd');
var elem = $target[0]; var elem = $target[0];
@ -6960,13 +6964,14 @@
} }
$row.html(labelHtml); $row.html(labelHtml);
$row.on('mouseenter', function() { highlightMedFreqItem(idx); }) $row.on('mouseenter', function() { highlightMedFreqItem(idx, false); })
.on('mouseleave', function() { $(this).css('background',''); }) .on('mouseleave', function() { $(this).css({ 'background': '', 'color': '', 'font-weight': '' }); })
.on('mousedown', function(e) { e.preventDefault(); }) .on('mousedown', function(e) { e.preventDefault(); })
.on('click', function() { .on('click', function() {
$('#med_freq').val(code).trigger('change'); $('#med_freq').val(code).trigger('change');
$dd.hide().empty(); $dd.hide().empty();
medFreqHighlightIdx = -1; medFreqHighlightIdx = -1;
setTimeout(function() { $('#med_when').focus(); }, 30);
}); });
$dd.append($row); $dd.append($row);
@ -6990,35 +6995,59 @@
if (!isVisible) { if (!isVisible) {
var sugs = getMedFreqSuggestions(($(this).val() || '').trim()); var sugs = getMedFreqSuggestions(($(this).val() || '').trim());
renderMedFreqDropdown(sugs); renderMedFreqDropdown(sugs);
highlightMedFreqItem(0); highlightMedFreqItem(0, true);
return; return;
} }
e.preventDefault(); e.preventDefault();
var nextIdx = medFreqHighlightIdx + 1; var nextIdx = medFreqHighlightIdx < 0 ? 0 : (medFreqHighlightIdx + 1) % $items.length;
if (nextIdx >= $items.length) nextIdx = 0; highlightMedFreqItem(nextIdx, true);
highlightMedFreqItem(nextIdx);
} else if (e.key === 'ArrowUp') { } else if (e.key === 'ArrowUp') {
if (!isVisible) return; if (!isVisible) return;
e.preventDefault(); e.preventDefault();
var prevIdx = medFreqHighlightIdx - 1; var prevIdx = medFreqHighlightIdx < 0 ? ($items.length - 1) : (medFreqHighlightIdx - 1 + $items.length) % $items.length;
if (prevIdx < 0) prevIdx = $items.length - 1; highlightMedFreqItem(prevIdx, true);
highlightMedFreqItem(prevIdx); } else if (e.key === 'Enter' || e.key === 'Tab') {
} else if (e.key === 'Enter') { if (e.key === 'Tab' && e.shiftKey) return;
e.preventDefault();
if (isVisible) { if (isVisible) {
e.preventDefault();
var targetIdx = medFreqHighlightIdx >= 0 ? medFreqHighlightIdx : 0; var targetIdx = medFreqHighlightIdx >= 0 ? medFreqHighlightIdx : 0;
var $target = $items.eq(targetIdx); var $target = $items.eq(targetIdx);
if ($target.length) { if ($target.length) {
$target.trigger('click'); var code = $target.find('strong').text().trim() || $target.text().trim();
setTimeout(function() { $('#med_when').focus(); }, 30); $('#med_freq').val(code).trigger('change');
} }
$dd.hide().empty();
medFreqHighlightIdx = -1;
} }
setTimeout(function() { $('#med_when').focus(); }, 30);
} else if (e.key === 'Escape') { } else if (e.key === 'Escape') {
$dd.hide().empty(); $dd.hide().empty();
medFreqHighlightIdx = -1; medFreqHighlightIdx = -1;
} }
}); });
// ─── Sequential Enter-key Navigation between Formulation, Timing & Route ───
$('#med_type').on('keydown', function(e) {
if (e.key === 'Enter') {
e.preventDefault();
$('#med_dosage').focus();
}
});
$('#med_when').on('keydown', function(e) {
if (e.key === 'Enter') {
e.preventDefault();
$('#med_where').focus();
}
});
$('#med_where').on('keydown', function(e) {
if (e.key === 'Enter') {
e.preventDefault();
$('#med_days').focus();
}
});
// ─── Duration Smart Autocomplete ────────────────────────────── // ─── Duration Smart Autocomplete ──────────────────────────────
var _DURATION_PRESETS = [ var _DURATION_PRESETS = [
'1 Day', '2 Days', '3 Days', '4 Days', '5 Days', '6 Days', '7 Days', '1 Day', '2 Days', '3 Days', '4 Days', '5 Days', '6 Days', '7 Days',
@ -7137,20 +7166,18 @@
if (prevIdx < 0) prevIdx = $items.length - 1; if (prevIdx < 0) prevIdx = $items.length - 1;
highlightMedDaysItem(prevIdx, true); highlightMedDaysItem(prevIdx, true);
} else if (e.key === 'Enter' || e.key === 'Tab') { } else if (e.key === 'Enter' || e.key === 'Tab') {
if (e.key === 'Tab' && e.shiftKey) return;
e.preventDefault();
if (isVisible) { if (isVisible) {
var targetIdx = medDaysHighlightIdx >= 0 ? medDaysHighlightIdx : 0; var targetIdx = medDaysHighlightIdx >= 0 ? medDaysHighlightIdx : 0;
var $target = $items.eq(targetIdx); var $target = $items.eq(targetIdx);
if ($target.length) { if ($target.length) {
if (e.key === 'Enter') e.preventDefault();
$('#med_days').val($target.text().trim()).trigger('change'); $('#med_days').val($target.text().trim()).trigger('change');
$dd.hide().empty();
medDaysHighlightIdx = -1;
setTimeout(function() { $('#med_remark').focus(); }, 30);
} }
} else if (e.key === 'Enter') { $dd.hide().empty();
e.preventDefault(); medDaysHighlightIdx = -1;
setTimeout(function() { $('#med_remark').focus(); }, 30);
} }
setTimeout(function() { $('#med_remark').focus(); }, 30);
} else if (e.key === 'Escape') { } else if (e.key === 'Escape') {
$dd.hide().empty(); $dd.hide().empty();
medDaysHighlightIdx = -1; medDaysHighlightIdx = -1;
@ -7180,16 +7207,23 @@
]; ];
var medRemarkHighlightIdx = -1; var medRemarkHighlightIdx = -1;
function highlightMedRemarkItem(idx) { function highlightMedRemarkItem(idx, updateInput) {
var $items = $('#med_remark_dd .med-remark-dd-item'); var $items = $('#med_remark_dd .med-remark-dd-item');
if (!$items.length) return; if (!$items.length) return;
if (idx < 0) idx = 0; if (idx < 0) idx = 0;
if (idx >= $items.length) idx = $items.length - 1; if (idx >= $items.length) idx = $items.length - 1;
medRemarkHighlightIdx = idx; medRemarkHighlightIdx = idx;
$items.css('background', '').removeClass('active-dd-item'); $items.css({ 'background': '', 'color': '', 'font-weight': '' }).removeClass('active-dd-item');
var $target = $items.eq(medRemarkHighlightIdx); var $target = $items.eq(medRemarkHighlightIdx);
$target.css('background', '#e2ebff').addClass('active-dd-item'); $target.css({ 'background': '#0d6efd', 'color': '#ffffff', 'font-weight': '600' }).addClass('active-dd-item');
if (updateInput) {
var val = $target.text().trim();
if (val) {
$('#med_remark').val(val);
}
}
var container = document.getElementById('med_remark_dd'); var container = document.getElementById('med_remark_dd');
var elem = $target[0]; var elem = $target[0];
@ -7228,13 +7262,14 @@
var $row = $('<div class="px-3 py-2 border-bottom med-remark-dd-item" data-idx="' + idx + '" style="cursor:pointer;font-size:.875rem"></div>') var $row = $('<div class="px-3 py-2 border-bottom med-remark-dd-item" data-idx="' + idx + '" style="cursor:pointer;font-size:.875rem"></div>')
.text(s); .text(s);
$row.on('mouseenter', function() { highlightMedRemarkItem(idx); }) $row.on('mouseenter', function() { highlightMedRemarkItem(idx, false); })
.on('mouseleave', function() { $(this).css('background',''); }) .on('mouseleave', function() { $(this).css({ 'background': '', 'color': '', 'font-weight': '' }); })
.on('mousedown', function(e) { e.preventDefault(); }) .on('mousedown', function(e) { e.preventDefault(); })
.on('click', function() { .on('click', function() {
$('#med_remark').val(s).trigger('change'); $('#med_remark').val(s).trigger('change');
$dd.hide().empty(); $dd.hide().empty();
medRemarkHighlightIdx = -1; medRemarkHighlightIdx = -1;
setTimeout(function() { $('#btn_add_medicine').focus(); }, 30);
}); });
$dd.append($row); $dd.append($row);
@ -7258,28 +7293,30 @@
if (!isVisible) { if (!isVisible) {
var sugs = getMedRemarkSuggestions(($(this).val() || '').trim()); var sugs = getMedRemarkSuggestions(($(this).val() || '').trim());
renderMedRemarkDropdown(sugs); renderMedRemarkDropdown(sugs);
highlightMedRemarkItem(0); highlightMedRemarkItem(0, true);
return; return;
} }
e.preventDefault(); e.preventDefault();
var nextIdx = medRemarkHighlightIdx + 1; var nextIdx = medRemarkHighlightIdx < 0 ? 0 : (medRemarkHighlightIdx + 1) % $items.length;
if (nextIdx >= $items.length) nextIdx = 0; highlightMedRemarkItem(nextIdx, true);
highlightMedRemarkItem(nextIdx);
} else if (e.key === 'ArrowUp') { } else if (e.key === 'ArrowUp') {
if (!isVisible) return; if (!isVisible) return;
e.preventDefault(); e.preventDefault();
var prevIdx = medRemarkHighlightIdx - 1; var prevIdx = medRemarkHighlightIdx < 0 ? ($items.length - 1) : (medRemarkHighlightIdx - 1 + $items.length) % $items.length;
if (prevIdx < 0) prevIdx = $items.length - 1; highlightMedRemarkItem(prevIdx, true);
highlightMedRemarkItem(prevIdx); } else if (e.key === 'Enter' || e.key === 'Tab') {
} else if (e.key === 'Enter') { if (e.key === 'Tab' && e.shiftKey) return;
if (isVisible && medRemarkHighlightIdx >= 0) { e.preventDefault();
e.preventDefault(); if (isVisible) {
var $target = $items.eq(medRemarkHighlightIdx); var targetIdx = medRemarkHighlightIdx >= 0 ? medRemarkHighlightIdx : 0;
var $target = $items.eq(targetIdx);
if ($target.length) { if ($target.length) {
$target.trigger('click'); $('#med_remark').val($target.text().trim()).trigger('change');
setTimeout(function() { $('#btn_add_medicine').focus(); }, 30);
} }
$dd.hide().empty();
medRemarkHighlightIdx = -1;
} }
setTimeout(function() { $('#btn_add_medicine').focus(); }, 30);
} else if (e.key === 'Escape') { } else if (e.key === 'Escape') {
$dd.hide().empty(); $dd.hide().empty();
medRemarkHighlightIdx = -1; medRemarkHighlightIdx = -1;
@ -9799,6 +9836,7 @@
applyMedicineSelection(row); applyMedicineSelection(row);
$dd.hide().empty(); $dd.hide().empty();
medNameHighlightIdx = -1; medNameHighlightIdx = -1;
setTimeout(function() { $('#med_type').focus(); }, 30);
}); });
$dd.append($item); $dd.append($item);
@ -9851,16 +9889,20 @@
var prevIdx = medNameHighlightIdx - 1; var prevIdx = medNameHighlightIdx - 1;
if (prevIdx < 0) prevIdx = medicineSuggestRows.length - 1; if (prevIdx < 0) prevIdx = medicineSuggestRows.length - 1;
highlightMedNameItem(prevIdx); highlightMedNameItem(prevIdx);
} else if (e.key === 'Enter') { } else if (e.key === 'Enter' || e.key === 'Tab') {
if (e.key === 'Tab' && e.shiftKey) return;
if (isVisible) { if (isVisible) {
e.preventDefault(); e.preventDefault();
var targetIdx = medNameHighlightIdx >= 0 ? medNameHighlightIdx : 0; var targetIdx = medNameHighlightIdx >= 0 ? medNameHighlightIdx : 0;
if (medicineSuggestRows[targetIdx]) { if (medicineSuggestRows[targetIdx]) {
applyMedicineSelection(medicineSuggestRows[targetIdx]); applyMedicineSelection(medicineSuggestRows[targetIdx]);
$dd.hide().empty();
medNameHighlightIdx = -1;
setTimeout(function() { $('#med_freq').focus(); }, 30);
} }
$dd.hide().empty();
medNameHighlightIdx = -1;
setTimeout(function() { $('#med_type').focus(); }, 30);
} else if (e.key === 'Enter') {
e.preventDefault();
setTimeout(function() { $('#med_type').focus(); }, 30);
} }
} else if (e.key === 'Escape') { } else if (e.key === 'Escape') {
$dd.hide().empty(); $dd.hide().empty();