2023-08-01 03:54:19 +03:00
|
|
|
import { useTranslation } from "next-i18next";
|
|
|
|
|
2023-08-01 13:05:17 +03:00
|
|
|
import Error from "../components/error";
|
|
|
|
import Container from "../components/container";
|
|
|
|
import Block from "../components/block";
|
|
|
|
|
2023-08-01 03:54:19 +03:00
|
|
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
|
|
|
import ResolvedIcon from "components/resolvedicon";
|
|
|
|
|
|
|
|
const statusMap = {
|
|
|
|
"R": <ResolvedIcon icon="mdi-circle" width={32} height={32} />, // running
|
|
|
|
"S": <ResolvedIcon icon="mdi-circle-outline" width={32} height={32} />, // sleeping
|
|
|
|
"D": <ResolvedIcon icon="mdi-circle-double" width={32} height={32} />, // disk sleep
|
|
|
|
"Z": <ResolvedIcon icon="mdi-circle-opacity" width={32} height={32} />, // zombie
|
|
|
|
"T": <ResolvedIcon icon="mdi-decagram-outline" width={32} height={32} />, // traced
|
|
|
|
"t": <ResolvedIcon icon="mdi-hexagon-outline" width={32} height={32} />, // traced
|
|
|
|
"X": <ResolvedIcon icon="mdi-rhombus-outline" width={32} height={32} />, // dead
|
|
|
|
};
|
|
|
|
|
|
|
|
export default function Component({ service }) {
|
|
|
|
const { t } = useTranslation();
|
2023-09-06 13:53:39 +03:00
|
|
|
const { widget } = service;
|
|
|
|
const { chart } = widget;
|
2023-08-01 03:54:19 +03:00
|
|
|
|
|
|
|
const { data, error } = useWidgetAPI(service.widget, 'processlist', {
|
|
|
|
refreshInterval: 1000,
|
|
|
|
});
|
|
|
|
|
|
|
|
if (error) {
|
2023-09-06 15:28:37 +03:00
|
|
|
return <Container chart={chart}><Error error={error} /></Container>;
|
2023-08-01 03:54:19 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!data) {
|
2023-09-06 15:28:37 +03:00
|
|
|
return <Container chart={chart}><Block position="bottom-3 left-3">-</Block></Container>;
|
2023-08-01 03:54:19 +03:00
|
|
|
}
|
|
|
|
|
2023-09-06 13:53:39 +03:00
|
|
|
data.splice(chart ? 5 : 1);
|
2023-08-01 03:54:19 +03:00
|
|
|
|
|
|
|
return (
|
2023-09-06 13:53:39 +03:00
|
|
|
<Container chart={chart}>
|
2023-08-01 16:39:46 +03:00
|
|
|
<Block position="top-4 right-3 left-3">
|
2023-08-01 03:54:19 +03:00
|
|
|
<div className="flex items-center text-xs">
|
|
|
|
<div className="grow" />
|
|
|
|
<div className="w-14 text-right italic">{t("resources.cpu")}</div>
|
|
|
|
<div className="w-14 text-right">{t("resources.mem")}</div>
|
|
|
|
</div>
|
2023-08-01 13:05:17 +03:00
|
|
|
</Block>
|
|
|
|
|
2023-08-01 16:39:46 +03:00
|
|
|
<Block position="bottom-4 right-3 left-3">
|
2023-08-01 13:05:17 +03:00
|
|
|
<div className="pointer-events-none text-theme-900 dark:text-theme-200">
|
|
|
|
{ data.map((item) => <div key={item.pid} className="text-[0.75rem] h-[0.8rem]">
|
2023-08-01 03:54:19 +03:00
|
|
|
<div className="flex items-center">
|
2023-08-01 13:05:17 +03:00
|
|
|
<div className="w-3 h-3 mr-1.5 opacity-50">
|
2023-08-01 03:54:19 +03:00
|
|
|
{statusMap[item.status]}
|
|
|
|
</div>
|
2023-08-01 13:05:17 +03:00
|
|
|
<div className="opacity-75 grow">{item.name}</div>
|
|
|
|
<div className="opacity-25 w-14 text-right">{item.cpu_percent.toFixed(1)}%</div>
|
|
|
|
<div className="opacity-25 w-14 text-right">{t("common.bytes", {
|
2023-08-01 03:54:19 +03:00
|
|
|
value: item.memory_info[0],
|
|
|
|
maximumFractionDigits: 0,
|
|
|
|
})}</div>
|
|
|
|
</div>
|
|
|
|
</div>) }
|
2023-08-01 13:05:17 +03:00
|
|
|
</div>
|
|
|
|
</Block>
|
|
|
|
</Container>
|
2023-08-01 03:54:19 +03:00
|
|
|
);
|
|
|
|
}
|