round21: Startseiten-Bereiche in eine Karte zusammengefasst, Favicon-Auswahl filtert tote Icons und zeigt groessere Vorschau, Icon fuer manuelle Anpassung getauscht, Zeitstempel-Inkonsistenz Scan/Ping behoben

This commit is contained in:
2026-07-23 20:03:34 +02:00
parent 68ca9ec5e1
commit 6a66128172
4 changed files with 147 additions and 47 deletions

View File

@@ -328,9 +328,13 @@ export function HomePage() {
</div>
{showShelf ? (
<div className="flex w-full max-w-xl flex-col gap-6">
<div
className="w-full max-w-xl divide-y divide-black/[0.06] rounded-2xl border
border-black/[0.06] bg-black/[0.015] dark:divide-white/[0.06] dark:border-white/[0.06]
dark:bg-white/[0.02]"
>
{hasFavorites ? (
<div className="flex flex-col gap-4">
<div className="flex flex-col gap-4 p-4">
{favoriteServices.length > 0 ? (
<FavoritesBar
items={favoriteServices}
@@ -359,18 +363,20 @@ export function HomePage() {
) : null}
{recentVisits && recentVisits.length > 0 ? (
<FavoritesBar
items={recentVisits}
label="Zuletzt besucht"
categoryColors={categoryColors}
onOpen={(item) => {
const original = recentVisits.find((r) => r.id === item.id);
if (original) openItem(original);
}}
/>
<div className="p-4">
<FavoritesBar
items={recentVisits}
label="Zuletzt besucht"
categoryColors={categoryColors}
onOpen={(item) => {
const original = recentVisits.find((r) => r.id === item.id);
if (original) openItem(original);
}}
/>
</div>
) : null}
<div>
<div className="p-4">
<div className="mb-2.5 flex items-center justify-between gap-2">
<span className="text-xs font-medium uppercase tracking-wide text-black/35 dark:text-white/35">
Später lesen

View File

@@ -382,9 +382,20 @@ function DeviceRow({ device }: { device: DeviceWithServices }) {
{device.online ? "Online" : "Offline"}
</span>
<div className="text-[10px] text-black/30 dark:text-white/30">
{device.lastScan
? `zuletzt gesehen: ${new Date(device.lastScan).toLocaleString("de-DE")}`
: "nie gescannt"}
{(() => {
// "Zuletzt gesehen" soll den neueren der beiden Zeitpunkte
// zeigen - ein echter Scan (lastScan) oder ein reiner
// Ping-Live-Status-Check (lastPing, siehe Einstellungen) -
// sonst wirkt es inkonsistent, wenn der Online-Punkt frisch
// vom Ping aktualisiert wurde, der Zeitstempel aber noch den
// alten Scan zeigt.
const scanTime = device.lastScan ? new Date(device.lastScan).getTime() : 0;
const pingTime = device.lastPing ? new Date(device.lastPing).getTime() : 0;
const latest = Math.max(scanTime, pingTime);
if (latest === 0) return "nie gescannt";
const label = pingTime > scanTime ? "zuletzt gesehen (Ping)" : "zuletzt gesehen";
return `${label}: ${new Date(latest).toLocaleString("de-DE")}`;
})()}
</div>
</td>
<td className="px-4 py-3 text-black/60 dark:text-white/60">{device.services.length}</td>

View File

@@ -1,6 +1,6 @@
import { useMemo, useState, type DragEvent } from "react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faFloppyDisk, faPen, faTrash, faXmark, faSort, faSortUp, faSortDown, faStar as faStarSolid, faEye, faEyeSlash, faArrowLeft, faSignature } from "@fortawesome/free-solid-svg-icons";
import { faFloppyDisk, faPen, faTrash, faXmark, faSort, faSortUp, faSortDown, faStar as faStarSolid, faEye, faEyeSlash, faArrowLeft, faUserPen } from "@fortawesome/free-solid-svg-icons";
import { faStar } from "@fortawesome/free-regular-svg-icons";
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { Button, Favicon, FaviconPicker } from "@launchpad/ui";
@@ -398,7 +398,7 @@ function ServiceRow({
<span className="font-medium text-black dark:text-white">{service.displayName}</span>
{service.displayNameEditedManually ? (
<span title="Name wurde manuell angepasst Scan-Vorschläge dafür werden nicht mehr angezeigt">
<FontAwesomeIcon icon={faSignature} className="text-black/40 dark:text-white/40" />
<FontAwesomeIcon icon={faUserPen} className="text-black/40 dark:text-white/40" />
</span>
) : null}
{!service.visible ? (
@@ -429,7 +429,7 @@ function ServiceRow({
{service.category ?? ""}
{service.categoryEditedManually ? (
<span title="Kategorie wurde manuell angepasst Scan-Vorschläge dafür werden nicht mehr angezeigt">
<FontAwesomeIcon icon={faSignature} className="text-black/40 dark:text-white/40" />
<FontAwesomeIcon icon={faUserPen} className="text-black/40 dark:text-white/40" />
</span>
) : null}
</span>