fix: SLM modal field now only contains correct fields. IP address is passed via modem pairing.
Add: Fuzzy-search modem pairing for slms
This commit is contained in:
@@ -60,7 +60,9 @@
|
|||||||
data-note="{{ unit.note if unit.note else '' }}">
|
data-note="{{ unit.note if unit.note else '' }}">
|
||||||
<td class="px-6 py-4 whitespace-nowrap">
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
<div class="flex items-center space-x-2">
|
<div class="flex items-center space-x-2">
|
||||||
{% if unit.status == 'OK' %}
|
{% if not unit.deployed %}
|
||||||
|
<span class="w-3 h-3 rounded-full bg-gray-400 dark:bg-gray-500" title="Benched"></span>
|
||||||
|
{% elif unit.status == 'OK' %}
|
||||||
<span class="w-3 h-3 rounded-full bg-green-500" title="OK"></span>
|
<span class="w-3 h-3 rounded-full bg-green-500" title="OK"></span>
|
||||||
{% elif unit.status == 'Pending' %}
|
{% elif unit.status == 'Pending' %}
|
||||||
<span class="w-3 h-3 rounded-full bg-yellow-500" title="Pending"></span>
|
<span class="w-3 h-3 rounded-full bg-yellow-500" title="Pending"></span>
|
||||||
@@ -208,7 +210,9 @@
|
|||||||
<!-- Header: Status Dot + Unit ID + Status Badge -->
|
<!-- Header: Status Dot + Unit ID + Status Badge -->
|
||||||
<div class="flex items-center justify-between mb-2">
|
<div class="flex items-center justify-between mb-2">
|
||||||
<div class="flex items-center gap-2">
|
<div class="flex items-center gap-2">
|
||||||
{% if unit.status == 'OK' %}
|
{% if not unit.deployed %}
|
||||||
|
<span class="w-4 h-4 rounded-full bg-gray-400 dark:bg-gray-500" title="Benched"></span>
|
||||||
|
{% elif unit.status == 'OK' %}
|
||||||
<span class="w-4 h-4 rounded-full bg-green-500" title="OK"></span>
|
<span class="w-4 h-4 rounded-full bg-green-500" title="OK"></span>
|
||||||
{% elif unit.status == 'Pending' %}
|
{% elif unit.status == 'Pending' %}
|
||||||
<span class="w-4 h-4 rounded-full bg-yellow-500" title="Pending"></span>
|
<span class="w-4 h-4 rounded-full bg-yellow-500" title="Pending"></span>
|
||||||
|
|||||||
@@ -58,7 +58,9 @@
|
|||||||
data-note="{{ unit.note if unit.note else '' }}">
|
data-note="{{ unit.note if unit.note else '' }}">
|
||||||
<td class="px-6 py-4 whitespace-nowrap">
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
<div class="flex items-center space-x-2">
|
<div class="flex items-center space-x-2">
|
||||||
{% if unit.status == 'OK' %}
|
{% if not unit.deployed %}
|
||||||
|
<span class="w-3 h-3 rounded-full bg-gray-400 dark:bg-gray-500" title="Benched"></span>
|
||||||
|
{% elif unit.status == 'OK' %}
|
||||||
<span class="w-3 h-3 rounded-full bg-green-500" title="OK"></span>
|
<span class="w-3 h-3 rounded-full bg-green-500" title="OK"></span>
|
||||||
{% elif unit.status == 'Pending' %}
|
{% elif unit.status == 'Pending' %}
|
||||||
<span class="w-3 h-3 rounded-full bg-yellow-500" title="Pending"></span>
|
<span class="w-3 h-3 rounded-full bg-yellow-500" title="Pending"></span>
|
||||||
@@ -199,7 +201,9 @@
|
|||||||
<!-- Header: Status Dot + Unit ID + Status Badge -->
|
<!-- Header: Status Dot + Unit ID + Status Badge -->
|
||||||
<div class="flex items-center justify-between mb-2">
|
<div class="flex items-center justify-between mb-2">
|
||||||
<div class="flex items-center gap-2">
|
<div class="flex items-center gap-2">
|
||||||
{% if unit.status == 'OK' %}
|
{% if not unit.deployed %}
|
||||||
|
<span class="w-4 h-4 rounded-full bg-gray-400 dark:bg-gray-500" title="Benched"></span>
|
||||||
|
{% elif unit.status == 'OK' %}
|
||||||
<span class="w-4 h-4 rounded-full bg-green-500" title="OK"></span>
|
<span class="w-4 h-4 rounded-full bg-green-500" title="OK"></span>
|
||||||
{% elif unit.status == 'Pending' %}
|
{% elif unit.status == 'Pending' %}
|
||||||
<span class="w-4 h-4 rounded-full bg-yellow-500" title="Pending"></span>
|
<span class="w-4 h-4 rounded-full bg-yellow-500" title="Pending"></span>
|
||||||
|
|||||||
@@ -206,21 +206,6 @@
|
|||||||
<input type="text" name="slm_model" placeholder="NL-43"
|
<input type="text" name="slm_model" placeholder="NL-43"
|
||||||
class="w-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-seismo-orange">
|
class="w-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-seismo-orange">
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Host/IP Address</label>
|
|
||||||
<input type="text" name="slm_host" placeholder="192.168.1.100"
|
|
||||||
class="w-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-seismo-orange">
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">TCP Port</label>
|
|
||||||
<input type="number" name="slm_tcp_port" placeholder="2255"
|
|
||||||
class="w-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-seismo-orange">
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">FTP Port</label>
|
|
||||||
<input type="number" name="slm_ftp_port" placeholder="21"
|
|
||||||
class="w-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-seismo-orange">
|
|
||||||
</div>
|
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Serial Number</label>
|
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Serial Number</label>
|
||||||
<input type="text" name="slm_serial_number" placeholder="SN123456"
|
<input type="text" name="slm_serial_number" placeholder="SN123456"
|
||||||
@@ -244,6 +229,12 @@
|
|||||||
<option value="I">I (Impulse)</option>
|
<option value="I">I (Impulse)</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="slmModemPairingField" class="hidden">
|
||||||
|
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Deployed With Modem</label>
|
||||||
|
{% set picker_id = "-add-slm" %}
|
||||||
|
{% include "partials/modem_picker.html" with context %}
|
||||||
|
<p class="text-xs text-gray-500 dark:text-gray-400 mt-1">SLM connects via modem's IP address</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex items-center gap-4">
|
<div class="flex items-center gap-4">
|
||||||
@@ -388,21 +379,6 @@
|
|||||||
<input type="text" name="slm_model" id="editSlmModel" placeholder="NL-43"
|
<input type="text" name="slm_model" id="editSlmModel" placeholder="NL-43"
|
||||||
class="w-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-seismo-orange">
|
class="w-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-seismo-orange">
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Host/IP Address</label>
|
|
||||||
<input type="text" name="slm_host" id="editSlmHost" placeholder="192.168.1.100"
|
|
||||||
class="w-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-seismo-orange">
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">TCP Port</label>
|
|
||||||
<input type="number" name="slm_tcp_port" id="editSlmTcpPort" placeholder="2255"
|
|
||||||
class="w-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-seismo-orange">
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">FTP Port</label>
|
|
||||||
<input type="number" name="slm_ftp_port" id="editSlmFtpPort" placeholder="21"
|
|
||||||
class="w-full px-4 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-seismo-orange">
|
|
||||||
</div>
|
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Serial Number</label>
|
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Serial Number</label>
|
||||||
<input type="text" name="slm_serial_number" id="editSlmSerialNumber" placeholder="SN123456"
|
<input type="text" name="slm_serial_number" id="editSlmSerialNumber" placeholder="SN123456"
|
||||||
@@ -428,6 +404,12 @@
|
|||||||
<option value="I">I (Impulse)</option>
|
<option value="I">I (Impulse)</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="editSlmModemPairingField" class="hidden">
|
||||||
|
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Deployed With Modem</label>
|
||||||
|
{% set picker_id = "-edit-slm" %}
|
||||||
|
{% include "partials/modem_picker.html" with context %}
|
||||||
|
<p class="text-xs text-gray-500 dark:text-gray-400 mt-1">SLM connects via modem's IP address</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex items-center gap-4">
|
<div class="flex items-center gap-4">
|
||||||
@@ -649,6 +631,7 @@
|
|||||||
setFieldsDisabled(seismoFields, true);
|
setFieldsDisabled(seismoFields, true);
|
||||||
setFieldsDisabled(modemFields, true);
|
setFieldsDisabled(modemFields, true);
|
||||||
setFieldsDisabled(slmFields, false);
|
setFieldsDisabled(slmFields, false);
|
||||||
|
toggleModemPairing(); // Check if modem pairing should be shown
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -661,17 +644,26 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Toggle modem pairing field visibility (only for deployed seismographs)
|
// Toggle modem pairing field visibility (only for deployed seismographs and SLMs)
|
||||||
function toggleModemPairing() {
|
function toggleModemPairing() {
|
||||||
const deviceType = document.getElementById('deviceTypeSelect').value;
|
const deviceType = document.getElementById('deviceTypeSelect').value;
|
||||||
const deployedCheckbox = document.getElementById('deployedCheckbox');
|
const deployedCheckbox = document.getElementById('deployedCheckbox');
|
||||||
const modemPairingField = document.getElementById('modemPairingField');
|
const modemPairingField = document.getElementById('modemPairingField');
|
||||||
|
const slmModemPairingField = document.getElementById('slmModemPairingField');
|
||||||
|
|
||||||
|
// Seismograph modem pairing
|
||||||
if (deviceType === 'seismograph' && deployedCheckbox.checked) {
|
if (deviceType === 'seismograph' && deployedCheckbox.checked) {
|
||||||
modemPairingField.classList.remove('hidden');
|
modemPairingField.classList.remove('hidden');
|
||||||
} else {
|
} else {
|
||||||
modemPairingField.classList.add('hidden');
|
modemPairingField.classList.add('hidden');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SLM modem pairing
|
||||||
|
if (deviceType === 'slm' && deployedCheckbox.checked) {
|
||||||
|
slmModemPairingField.classList.remove('hidden');
|
||||||
|
} else {
|
||||||
|
slmModemPairingField.classList.add('hidden');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add unknown unit to roster
|
// Add unknown unit to roster
|
||||||
@@ -823,6 +815,7 @@
|
|||||||
setFieldsDisabled(seismoFields, true);
|
setFieldsDisabled(seismoFields, true);
|
||||||
setFieldsDisabled(modemFields, true);
|
setFieldsDisabled(modemFields, true);
|
||||||
setFieldsDisabled(slmFields, false);
|
setFieldsDisabled(slmFields, false);
|
||||||
|
toggleEditModemPairing(); // Check if modem pairing should be shown
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -831,12 +824,21 @@
|
|||||||
const deviceType = document.getElementById('editDeviceTypeSelect').value;
|
const deviceType = document.getElementById('editDeviceTypeSelect').value;
|
||||||
const deployedCheckbox = document.getElementById('editDeployedCheckbox');
|
const deployedCheckbox = document.getElementById('editDeployedCheckbox');
|
||||||
const modemPairingField = document.getElementById('editModemPairingField');
|
const modemPairingField = document.getElementById('editModemPairingField');
|
||||||
|
const slmModemPairingField = document.getElementById('editSlmModemPairingField');
|
||||||
|
|
||||||
|
// Seismograph modem pairing
|
||||||
if (deviceType === 'seismograph' && deployedCheckbox.checked) {
|
if (deviceType === 'seismograph' && deployedCheckbox.checked) {
|
||||||
modemPairingField.classList.remove('hidden');
|
modemPairingField.classList.remove('hidden');
|
||||||
} else {
|
} else {
|
||||||
modemPairingField.classList.add('hidden');
|
modemPairingField.classList.add('hidden');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SLM modem pairing
|
||||||
|
if (deviceType === 'slm' && deployedCheckbox.checked) {
|
||||||
|
slmModemPairingField.classList.remove('hidden');
|
||||||
|
} else {
|
||||||
|
slmModemPairingField.classList.add('hidden');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Edit Unit - Fetch data and populate form
|
// Edit Unit - Fetch data and populate form
|
||||||
@@ -940,13 +942,36 @@
|
|||||||
|
|
||||||
// SLM fields
|
// SLM fields
|
||||||
document.getElementById('editSlmModel').value = unit.slm_model || '';
|
document.getElementById('editSlmModel').value = unit.slm_model || '';
|
||||||
document.getElementById('editSlmHost').value = unit.slm_host || '';
|
|
||||||
document.getElementById('editSlmTcpPort').value = unit.slm_tcp_port || '';
|
|
||||||
document.getElementById('editSlmFtpPort').value = unit.slm_ftp_port || '';
|
|
||||||
document.getElementById('editSlmSerialNumber').value = unit.slm_serial_number || '';
|
document.getElementById('editSlmSerialNumber').value = unit.slm_serial_number || '';
|
||||||
document.getElementById('editSlmFrequencyWeighting').value = unit.slm_frequency_weighting || '';
|
document.getElementById('editSlmFrequencyWeighting').value = unit.slm_frequency_weighting || '';
|
||||||
document.getElementById('editSlmTimeWeighting').value = unit.slm_time_weighting || '';
|
document.getElementById('editSlmTimeWeighting').value = unit.slm_time_weighting || '';
|
||||||
|
|
||||||
|
// Populate SLM modem picker (uses -edit-slm suffix)
|
||||||
|
const slmModemPickerValue = document.getElementById('modem-picker-value-edit-slm');
|
||||||
|
const slmModemPickerSearch = document.getElementById('modem-picker-search-edit-slm');
|
||||||
|
const slmModemPickerClear = document.getElementById('modem-picker-clear-edit-slm');
|
||||||
|
if (slmModemPickerValue) slmModemPickerValue.value = unit.deployed_with_modem_id || '';
|
||||||
|
if (unit.deployed_with_modem_id && unit.device_type === 'slm') {
|
||||||
|
// Fetch modem display (ID + IP + note)
|
||||||
|
fetch(`/api/roster/${unit.deployed_with_modem_id}`)
|
||||||
|
.then(r => r.ok ? r.json() : null)
|
||||||
|
.then(modem => {
|
||||||
|
if (modem && slmModemPickerSearch) {
|
||||||
|
let display = modem.id;
|
||||||
|
if (modem.ip_address) display += ` - ${modem.ip_address}`;
|
||||||
|
if (modem.note) display += ` - ${modem.note}`;
|
||||||
|
slmModemPickerSearch.value = display;
|
||||||
|
if (slmModemPickerClear) slmModemPickerClear.classList.remove('hidden');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
if (slmModemPickerSearch) slmModemPickerSearch.value = unit.deployed_with_modem_id;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
if (slmModemPickerSearch) slmModemPickerSearch.value = '';
|
||||||
|
if (slmModemPickerClear) slmModemPickerClear.classList.add('hidden');
|
||||||
|
}
|
||||||
|
|
||||||
// Cascade section - show if there's a paired device
|
// Cascade section - show if there's a paired device
|
||||||
const cascadeSection = document.getElementById('editCascadeSection');
|
const cascadeSection = document.getElementById('editCascadeSection');
|
||||||
const cascadeToUnitId = document.getElementById('editCascadeToUnitId');
|
const cascadeToUnitId = document.getElementById('editCascadeToUnitId');
|
||||||
|
|||||||
@@ -689,9 +689,16 @@ function populateViewMode() {
|
|||||||
'Missing': 'text-red-600 dark:text-red-400'
|
'Missing': 'text-red-600 dark:text-red-400'
|
||||||
};
|
};
|
||||||
|
|
||||||
document.getElementById('statusIndicator').className = `w-3 h-3 rounded-full ${statusColors[unitStatus.status] || 'bg-gray-400'}`;
|
// If unit is not deployed (benched), show gray "Benched" status instead of health status
|
||||||
document.getElementById('statusText').className = `font-semibold ${statusTextColors[unitStatus.status] || 'text-gray-600'}`;
|
if (!currentUnit.deployed) {
|
||||||
document.getElementById('statusText').textContent = unitStatus.status || 'Unknown';
|
document.getElementById('statusIndicator').className = 'w-3 h-3 rounded-full bg-gray-400 dark:bg-gray-500';
|
||||||
|
document.getElementById('statusText').className = 'font-semibold text-gray-600 dark:text-gray-400';
|
||||||
|
document.getElementById('statusText').textContent = 'Benched';
|
||||||
|
} else {
|
||||||
|
document.getElementById('statusIndicator').className = `w-3 h-3 rounded-full ${statusColors[unitStatus.status] || 'bg-gray-400'}`;
|
||||||
|
document.getElementById('statusText').className = `font-semibold ${statusTextColors[unitStatus.status] || 'text-gray-600'}`;
|
||||||
|
document.getElementById('statusText').textContent = unitStatus.status || 'Unknown';
|
||||||
|
}
|
||||||
|
|
||||||
// Format "Last Seen" with timezone-aware formatting
|
// Format "Last Seen" with timezone-aware formatting
|
||||||
if (unitStatus.last && typeof formatFullTimestamp === 'function') {
|
if (unitStatus.last && typeof formatFullTimestamp === 'function') {
|
||||||
@@ -704,7 +711,8 @@ function populateViewMode() {
|
|||||||
} else {
|
} else {
|
||||||
document.getElementById('statusIndicator').className = 'w-3 h-3 rounded-full bg-gray-400';
|
document.getElementById('statusIndicator').className = 'w-3 h-3 rounded-full bg-gray-400';
|
||||||
document.getElementById('statusText').className = 'font-semibold text-gray-600 dark:text-gray-400';
|
document.getElementById('statusText').className = 'font-semibold text-gray-600 dark:text-gray-400';
|
||||||
document.getElementById('statusText').textContent = 'No status data';
|
// Show "Benched" if not deployed, otherwise "No status data"
|
||||||
|
document.getElementById('statusText').textContent = !currentUnit.deployed ? 'Benched' : 'No status data';
|
||||||
document.getElementById('lastSeen').textContent = '--';
|
document.getElementById('lastSeen').textContent = '--';
|
||||||
document.getElementById('age').textContent = '--';
|
document.getElementById('age').textContent = '--';
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user