Trois demandes utilisateur, plus une adaptation rendue nécessaire par la première. - Ordre inversé : descendant avant montant. - Rafraîchissement porté de 60 s à 5 s. Il fallait le faire sur les DEUX couches locales : l'intervalle client seul aurait relu la même entrée de cache serveur douze fois. Le cache cloud reste à 5 min, ses métriques n'évoluant que par tranches de 5 min. - Le graphe est rendu dès la première mesure : vide plutôt qu'absent, ce qui évite un saut de mise en page et n'affirme rien de faux. Adaptation : la console ne rafraîchit ses statistiques que toutes les 30 s (mesuré — `lastHeartbeatAt` avance par pas de 30 s exacts, valeurs identiques entre deux battements). Interroger toutes les 5 s renvoie donc six fois la même mesure. Sans filtrage, le graphe deviendrait un escalier et 60 points ne couvriraient plus que 5 minutes. Une lecture identique à la précédente n'est donc pas enregistrée. Seuil de péremption locale recalibré de 150 s à 30 s : l'ancien était dimensionné pour 60 s + 60 s et ne signalait plus rien d'utile. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
25 lines
892 B
TypeScript
25 lines
892 B
TypeScript
import { IconRouter, IconServerOff } from "@tabler/icons-react";
|
|
|
|
import { createWidgetDefinition } from "../definition";
|
|
import { optionsBuilder } from "../options";
|
|
|
|
export const { definition, componentLoader } = createWidgetDefinition("unifiOs", {
|
|
icon: IconRouter,
|
|
refetchInterval: 5,
|
|
supportedIntegrations: ["unifiOs"],
|
|
integrationsRequired: true,
|
|
createOptions() {
|
|
return optionsBuilder.from((factory) => ({
|
|
showIsp: factory.switch({ defaultValue: true, withDescription: true }),
|
|
showDevices: factory.switch({ defaultValue: true, withDescription: true }),
|
|
showFirmwareUpdates: factory.switch({ defaultValue: true, withDescription: true }),
|
|
}));
|
|
},
|
|
errors: {
|
|
INTERNAL_SERVER_ERROR: {
|
|
icon: IconServerOff,
|
|
message: (t) => t("widget.unifiOs.error.internalServerError"),
|
|
},
|
|
},
|
|
}).withDynamicImport(() => import("./component"));
|