diff --git a/gui_app.py b/gui_app.py index e20433f..672925b 100644 --- a/gui_app.py +++ b/gui_app.py @@ -973,7 +973,28 @@ def vms(): force=force, ) cache_age = int(time.time() - cache_ts) if cache_ts else None - return render_template('vms.html', vms=vm_list, error=error, cache_age=cache_age) + + # Calculate set of scheduled VMs + active_scheduled_vms = set() + with jobs_db_lock: + for job in jobs.values(): + if job.get('schedule_type') and job.get('schedule_type') != 'now' and job.get('schedule_id'): + vm_names = job.get('vm_names') + if vm_names: + for vm in vm_names: + active_scheduled_vms.add(vm) + else: + vm_name = job.get('vm_name') + if vm_name: + active_scheduled_vms.add(vm_name) + + return render_template( + 'vms.html', + vms=vm_list, + error=error, + cache_age=cache_age, + scheduled_vms=list(active_scheduled_vms) + ) @app.route('/api/vms') diff --git a/templates/vms.html b/templates/vms.html index 58ab5fd..ec16768 100644 --- a/templates/vms.html +++ b/templates/vms.html @@ -313,15 +313,20 @@ +
{% for vm in vms %} + {% set is_scheduled = vm.name in scheduled_vms %}
@@ -353,7 +358,12 @@
-
{{ vm.name }}
+
+ {{ vm.name }} + {% if is_scheduled %} + 📅︎ + {% endif %} +
{{ vm.guest_os or 'Unknown OS' }}
{% if vm.power_state == 'poweredOn' %} @@ -455,7 +465,14 @@ function filterVMs() { const q = document.getElementById('vmSearch').value.toLowerCase(); document.querySelectorAll('.vm-card').forEach(card => { - const matchFilter = activeFilter === 'all' || card.dataset.power === activeFilter; + let matchFilter = false; + if (activeFilter === 'all') { + matchFilter = true; + } else if (activeFilter === 'unscheduled') { + matchFilter = card.dataset.scheduled === '0'; + } else { + matchFilter = card.dataset.power === activeFilter; + } const matchSearch = card.dataset.name.includes(q); card.style.display = (matchFilter && matchSearch) ? '' : 'none'; });