TKK_E32232188/smartcollar-fe/assets/js/assignment.js

131 lines
5.1 KiB
JavaScript

document.addEventListener('DOMContentLoaded', () => {
const assignForm = document.getElementById('assignForm');
const assignTableBody = document.getElementById('assignmentTableBody');
const cowSelect = document.querySelector('select[name="cowId"]');
const collarSelect = document.querySelector('select[name="collarId"]');
const initialCowOptions = cowSelect
? Array.from(cowSelect.options)
.filter(option => option.value)
.map(option => ({ value: option.value, text: option.text }))
: [];
const initialCollarOptions = collarSelect
? Array.from(collarSelect.options)
.filter(option => option.value)
.map(option => ({ value: option.value, text: option.text }))
: [];
function refreshDropdowns(assignedCowIds, assignedCollarIds) {
if (cowSelect) {
cowSelect.innerHTML = '';
cowSelect.appendChild(new Option('-- Select Cow --', ''));
for (const option of initialCowOptions) {
if (assignedCowIds.has(option.value)) continue;
cowSelect.appendChild(new Option(option.text, option.value));
}
}
if (collarSelect) {
collarSelect.innerHTML = '';
collarSelect.appendChild(new Option('-- Select Collar --', ''));
for (const option of initialCollarOptions) {
if (assignedCollarIds.has(option.value)) continue;
collarSelect.appendChild(new Option(option.text, option.value));
}
}
}
async function loadAssignments() {
if (!assignTableBody) {
console.error('Assignment table body element not found');
return;
}
const form = new FormData();
form.append('action', 'list');
const res = await fetch('../ajax/assignment.php', { method: 'POST', body: form });
const json = await res.json();
if (!json.success) {
alert(json.message);
return;
}
const activeAssignments = Array.isArray(json.data)
? json.data.filter(a => a.active)
: [];
const assignedCowIds = new Set(activeAssignments.map(a => a.cowId).filter(Boolean));
const assignedCollarIds = new Set(activeAssignments.map(a => a.collarId).filter(Boolean));
refreshDropdowns(assignedCowIds, assignedCollarIds);
assignTableBody.innerHTML = '';
if (activeAssignments.length === 0) {
const emptyRow = document.createElement('tr');
emptyRow.innerHTML = '<td colspan="6" class="text-center">No active assignments</td>';
assignTableBody.appendChild(emptyRow);
} else {
for (const a of activeAssignments) {
const status = a.active ? 'Assigned' : 'Inactive';
const cowLabel = a.cowName ? a.cowName : a.cowId ?? '';
const deviceLabel = a.deviceName ? a.deviceName : a.collarId ?? '';
const tr = document.createElement('tr');
tr.innerHTML = `
<td>${a.id}</td>
<td>${cowLabel}</td>
<td>${deviceLabel}</td>
<td>${status}</td>
<td>${a.assignedAt ?? ''}</td>
<td><button class="btn btn-sm btn-danger detachBtn" data-cowid="${a.cowId}">Detach</button></td>
`;
assignTableBody.appendChild(tr);
}
}
document.querySelectorAll('.detachBtn').forEach(btn => {
btn.addEventListener('click', async function () {
const cowId = this.dataset.cowid;
if (!confirm('Detach this assignment?')) return;
const form = new FormData();
form.append('action', 'detach');
form.append('cowId', cowId);
const res = await fetch('../ajax/assignment.php', { method: 'POST', body: form });
const j = await res.json();
if (j.success) {
alert('Detached');
loadAssignments();
} else {
alert(j.message);
}
});
});
}
if (assignForm) {
assignForm.addEventListener('submit', async function (e) {
e.preventDefault();
const formData = new FormData(this);
const cowId = formData.get('cowId');
const collarId = formData.get('collarId');
if (!cowId || !collarId) {
alert('Select cow and collar');
return;
}
const form = new FormData();
form.append('action', 'attach');
form.append('cowId', cowId);
form.append('collarId', collarId);
const res = await fetch('../ajax/assignment.php', { method: 'POST', body: form });
const j = await res.json();
if (j.success) {
alert('Assigned');
loadAssignments();
} else {
alert(j.message);
}
});
}
loadAssignments();
});