diff --git a/src/server.rs b/src/server.rs index ba13810..6d648e6 100644 --- a/src/server.rs +++ b/src/server.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use chrono::Local; use liquid::{object, Object, ValueView}; +use rustc_hash::FxHashMap; use serde_json::Value; use tokio::sync::Mutex; use tokio_cron_scheduler::{Job, JobScheduler}; @@ -184,11 +185,6 @@ impl ServerData { .unwrap() .parse(HTML) .unwrap(); - let images = self - .raw_updates - .iter() - .map(|image| object!({"name": image.reference, "status": image.get_status().to_string()}),) - .collect::>(); self.simple_json = to_simple_json(&self.raw_updates); self.full_json = to_full_json(&self.raw_updates); let last_updated = Local::now(); @@ -219,9 +215,22 @@ impl ServerData { .unwrap(), ) }); + let mut servers: FxHashMap<&str, Vec> = FxHashMap::default(); + self.raw_updates.iter().for_each(|update| { + let key = update.server.as_deref().unwrap_or(""); + match servers.get_mut(&key) { + Some(server) => server.push( + object!({"name": update.reference, "status": update.get_status().to_string()}), + ), + None => { + let _ = servers.insert(key, vec![object!({"name": update.reference, "status": update.get_status().to_string()})]); + } + } + }); let globals = object!({ "metrics": metrics, - "images": images, + "servers": servers, + "server_ids": servers.into_keys().collect::>(), "last_updated": last_updated.format("%Y-%m-%d %H:%M:%S").to_string(), "theme": &self.theme }); diff --git a/web/bun.lockb b/web/bun.lockb index 658fb67..84d2b9b 100755 Binary files a/web/bun.lockb and b/web/bun.lockb differ diff --git a/web/index.html b/web/index.html index 8cbf5b9..546d100 100644 --- a/web/index.html +++ b/web/index.html @@ -1,34 +1,34 @@ - + + {% if theme == 'neutral' %} - - + + {% else %} - - + + {% endif %} - - - - + + + Cup @@ -39,9 +39,7 @@
-

- Cup -

+

Cup

- {% assign metrics_to_show = - 'monitored_images,up_to_date,updates_available,unknown' | split: - ',' %} {% for metric in metrics %} {% if metrics_to_show - contains metric.name %} -
-
-
- {{ metric.name | replace: '_', ' ' | capitalize }} -
-
-
- {{ metric.value }} -
- {% case metric.name %} {% when 'monitored_images' %} - - - - - {% when 'up_to_date' %} - - - - - {% when 'updates_available' %} {% assign max_metric = '' - %} {% assign max_value = 0 %} {% for m in metrics %} {% - unless metrics_to_show contains m.name %} {% if m.value > - max_value %} {% assign max_metric = m.name %} {% assign - max_value = m.value %} {% endif %} {% endunless %} {% - endfor %} {% case max_metric %} {% when 'major_updates' %} - {% assign color = 'text-red-500' %} {% when - 'minor_updates' %} {% assign color = 'text-yellow-500' %} - {% else %} {% assign color = 'text-blue-500' %} {% endcase - %} - - - - - {% when 'unknown' %} - - - - - {% endcase %} +
+ {{ metric.name | replace: '_', ' ' | capitalize }} +
+
+
+ {{ metric.value }} +
+ {% case metric.name %} + {% when 'monitored_images' %} + + + + + {% when 'up_to_date' %} + + + + + {% when 'updates_available' %} + {% assign max_metric = '' %} + {% assign max_value = 0 %} + {% for m in metrics %} + {% unless metrics_to_show contains m.name %} + {% if m.value > max_value %} + {% assign max_metric = m.name %} + {% assign max_value = m.value %} + {% endif %} + {% endunless %} + {% endfor %} + {% case max_metric %} + {% when 'major_updates' %} + {% assign color = 'text-red-500' %} + {% when 'minor_updates' %} + {% assign color = 'text-yellow-500' %} + {% else %} + {% assign color = 'text-blue-500' %} + {% endcase %} + + + + + {% when 'unknown' %} + + + + + {% endcase %} +
+
-
-
- {% endif %} {% endfor %} + {% endif %} + {% endfor %}

Last checked: {{ last_updated }}

-
-
    - {% for image in images %} -
  • - - - - - - - - {{ image.name }} {% case image.status %} {% when 'Up to date' - %} - - - - - {% when 'Unknown' %} - - - - - {% else %} {% case image.status %} {% when 'Major update' %} - {% assign color = 'text-red-500' %} {% when 'Minor update' %} - {% assign color = 'text-yellow-500' %} {% else %} {% assign - color = 'text-blue-500' %} {% endcase %} - - - - - {% endcase %} -
  • +
      + {% for server in server_ids %} + {% if server == '' %} +
    • +
        + {% for image in servers[server] %} +
      • + + + + + + + + {{ image.name }} + {% case image.status %} + {% when 'Up to date' %} + + + + + {% when 'Unknown' %} + + + + + {% else %} + {% case image.status %} + {% when 'Major update' %} + {% assign color = 'text-red-500' %} + {% when 'Minor update' %} + {% assign color = 'text-yellow-500' %} + {% else %} + {% assign color = 'text-blue-500' %} + {% endcase %} + + + + + {% endcase %} +
      • + {% endfor %} +
      +
    • + {% else %} +
    • +

      + {{ server }} +

      +
        + {% for image in servers[server] %} +
      • + + + + + + + + {{ image.name }} + {% case image.status %} + {% when 'Up to date' %} + + + + + {% when 'Unknown' %} + + + + + {% else %} + {% case image.status %} + {% when 'Major update' %} + {% assign color = 'text-red-500' %} + {% when 'Minor update' %} + {% assign color = 'text-yellow-500' %} + {% else %} + {% assign color = 'text-blue-500' %} + {% endcase %} + + + + + {% endcase %} +
      • + {% endfor %} +
      +
    • + {% endif %} {% endfor %}
diff --git a/web/package.json b/web/package.json index 44c7c09..c82976a 100644 --- a/web/package.json +++ b/web/package.json @@ -14,6 +14,7 @@ "@headlessui/react": "^2.1.10", "@radix-ui/react-tooltip": "^1.1.2", "@tabler/icons-react": "^3.14.0", + "caniuse-lite": "^1.0.30001698", "clsx": "^2.1.1", "date-fns": "^3.6.0", "react": "^18.3.1", diff --git a/web/src/components/Server.tsx b/web/src/components/Server.tsx index 6c33296..c7ccb72 100644 --- a/web/src/components/Server.tsx +++ b/web/src/components/Server.tsx @@ -30,7 +30,7 @@ export function Server({ {name}