Add fleet alert notifications for shop floor PCs
Fleet alerts push server notifications to endpoint PCs via the command pipe. Operators acknowledge alerts via toast UI in the tray. Backend tracks acknowledgements per asset to prevent re-showing dismissed alerts. Backend: alertfleet/alertscope/alerttimeout columns, GET/POST /api/endpoints/alerts, NotificationAcknowledgement model with unique constraint, hostname validation. Frontend: Alert Fleet checkbox in notification form. Agent: FleetAlertClient polls alerts, FleetAlertStore tracks acknowledged IDs, FleetAlertForm displays toast (no auto-dismiss), FleetAlertWorker 60s polling. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -217,6 +217,18 @@
|
||||
</label>
|
||||
<small class="form-hint">Display on TV dashboard</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>
|
||||
<input
|
||||
type="checkbox"
|
||||
v-model="form.alertfleet"
|
||||
:disabled="isDetail || !form.isactive"
|
||||
/>
|
||||
Alert Fleet
|
||||
</label>
|
||||
<small class="form-hint">Push this notification to shop floor PCs</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="error" class="error-message">{{ error }}</div>
|
||||
@@ -282,7 +294,10 @@ const form = ref({
|
||||
// loads its own stored value (see loadNotification), so this never flips a
|
||||
// setting somebody deliberately turned off.
|
||||
isshopfloor: true,
|
||||
employeesso: ''
|
||||
employeesso: '',
|
||||
alertfleet: false,
|
||||
alertscope: null,
|
||||
alerttimeout: 0
|
||||
})
|
||||
|
||||
// Site timezone (settings key site_timezone) so form times show/enter in the
|
||||
@@ -349,7 +364,10 @@ onMounted(async () => {
|
||||
endtime: formatDateForInput(n.endtime),
|
||||
isactive: n.isactive !== false,
|
||||
isshopfloor: n.isshopfloor || false,
|
||||
employeesso: n.employeesso || ''
|
||||
employeesso: n.employeesso || '',
|
||||
alertfleet: n.alertfleet || false,
|
||||
alertscope: n.alertscope || null,
|
||||
alerttimeout: n.alerttimeout !== undefined ? n.alerttimeout : 0
|
||||
}
|
||||
|
||||
// Parse existing employee data: SSOs are comma-joined and names are
|
||||
@@ -527,7 +545,10 @@ async function saveNotification() {
|
||||
endtime: utcFromZonedInput(form.value.endtime, siteTimezone.value),
|
||||
isactive: form.value.isactive,
|
||||
isshopfloor: form.value.isshopfloor,
|
||||
employeesso: form.value.employeesso || null
|
||||
employeesso: form.value.employeesso || null,
|
||||
alertfleet: form.value.alertfleet || false,
|
||||
alertscope: form.value.alertscope || null,
|
||||
alerttimeout: form.value.alerttimeout !== undefined ? form.value.alerttimeout : 0
|
||||
}
|
||||
|
||||
// For employee-photo types, also send employeename
|
||||
|
||||
Reference in New Issue
Block a user