fix(map): sort scheme queries by time
This commit is contained in:
@@ -124,6 +124,9 @@ const AnalysisParameters: React.FC<Props> = ({
|
|||||||
});
|
});
|
||||||
const burstSchemes = (response.data as SchemeItem[]).filter(
|
const burstSchemes = (response.data as SchemeItem[]).filter(
|
||||||
(scheme) => scheme.scheme_type === "burst_analysis",
|
(scheme) => scheme.scheme_type === "burst_analysis",
|
||||||
|
).sort(
|
||||||
|
(a, b) =>
|
||||||
|
dayjs(b.create_time).valueOf() - dayjs(a.create_time).valueOf(),
|
||||||
);
|
);
|
||||||
|
|
||||||
setFormField("schemes", burstSchemes);
|
setFormField("schemes", burstSchemes);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import React, { useState } from "react";
|
import React, { useMemo, useState } from "react";
|
||||||
import {
|
import {
|
||||||
Box,
|
Box,
|
||||||
Button,
|
Button,
|
||||||
@@ -69,6 +69,16 @@ const SchemeQuery: React.FC<Props> = ({
|
|||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const schemes = externalSchemes !== undefined ? externalSchemes : internalSchemes;
|
const schemes = externalSchemes !== undefined ? externalSchemes : internalSchemes;
|
||||||
const setSchemes = onSchemesChange || setInternalSchemes;
|
const setSchemes = onSchemesChange || setInternalSchemes;
|
||||||
|
const sortedSchemes = useMemo(
|
||||||
|
() =>
|
||||||
|
schemes
|
||||||
|
.slice()
|
||||||
|
.sort(
|
||||||
|
(a, b) =>
|
||||||
|
dayjs(b.create_time).valueOf() - dayjs(a.create_time).valueOf(),
|
||||||
|
),
|
||||||
|
[schemes],
|
||||||
|
);
|
||||||
|
|
||||||
const buildDisplayResult = (
|
const buildDisplayResult = (
|
||||||
scheme: Pick<BurstDetectionSchemeRecord, "scheme_name" | "username" | "create_time">,
|
scheme: Pick<BurstDetectionSchemeRecord, "scheme_name" | "username" | "create_time">,
|
||||||
@@ -214,7 +224,7 @@ const SchemeQuery: React.FC<Props> = ({
|
|||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<Box className="flex-1 overflow-auto">
|
<Box className="flex-1 overflow-auto">
|
||||||
{schemes.length === 0 ? (
|
{sortedSchemes.length === 0 ? (
|
||||||
<Box className="flex h-full flex-col items-center justify-center text-center text-gray-400">
|
<Box className="flex h-full flex-col items-center justify-center text-center text-gray-400">
|
||||||
<Typography variant="body2">暂无侦测方案</Typography>
|
<Typography variant="body2">暂无侦测方案</Typography>
|
||||||
<Typography variant="caption" className="mt-1">
|
<Typography variant="caption" className="mt-1">
|
||||||
@@ -224,9 +234,9 @@ const SchemeQuery: React.FC<Props> = ({
|
|||||||
) : (
|
) : (
|
||||||
<Box className="space-y-2 p-2">
|
<Box className="space-y-2 p-2">
|
||||||
<Typography variant="caption" className="px-2 text-gray-500">
|
<Typography variant="caption" className="px-2 text-gray-500">
|
||||||
共 {schemes.length} 条记录
|
共 {sortedSchemes.length} 条记录
|
||||||
</Typography>
|
</Typography>
|
||||||
{schemes.map((scheme) => {
|
{sortedSchemes.map((scheme) => {
|
||||||
const summary = scheme.scheme_detail?.result_summary;
|
const summary = scheme.scheme_detail?.result_summary;
|
||||||
const payload = scheme.scheme_detail?.result_payload;
|
const payload = scheme.scheme_detail?.result_payload;
|
||||||
const isBurst = payload?.summary?.burst_detected ?? summary?.burst_detected ?? false;
|
const isBurst = payload?.summary?.burst_detected ?? summary?.burst_detected ?? false;
|
||||||
|
|||||||
@@ -128,6 +128,9 @@ const AnalysisParameters: React.FC<Props> = ({
|
|||||||
});
|
});
|
||||||
const burstSchemes = (response.data as SchemeItem[]).filter(
|
const burstSchemes = (response.data as SchemeItem[]).filter(
|
||||||
(scheme) => scheme.scheme_type === "burst_analysis",
|
(scheme) => scheme.scheme_type === "burst_analysis",
|
||||||
|
).sort(
|
||||||
|
(a, b) =>
|
||||||
|
dayjs(b.create_time).valueOf() - dayjs(a.create_time).valueOf(),
|
||||||
);
|
);
|
||||||
|
|
||||||
setFormField("schemes", burstSchemes);
|
setFormField("schemes", burstSchemes);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import React, { useState } from "react";
|
import React, { useMemo, useState } from "react";
|
||||||
import {
|
import {
|
||||||
Box,
|
Box,
|
||||||
Button,
|
Button,
|
||||||
@@ -70,6 +70,16 @@ const SchemeQuery: React.FC<Props> = ({
|
|||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const schemes = externalSchemes !== undefined ? externalSchemes : internalSchemes;
|
const schemes = externalSchemes !== undefined ? externalSchemes : internalSchemes;
|
||||||
const setSchemes = onSchemesChange || setInternalSchemes;
|
const setSchemes = onSchemesChange || setInternalSchemes;
|
||||||
|
const sortedSchemes = useMemo(
|
||||||
|
() =>
|
||||||
|
schemes
|
||||||
|
.slice()
|
||||||
|
.sort(
|
||||||
|
(a, b) =>
|
||||||
|
dayjs(b.create_time).valueOf() - dayjs(a.create_time).valueOf(),
|
||||||
|
),
|
||||||
|
[schemes],
|
||||||
|
);
|
||||||
|
|
||||||
const buildDisplayResult = (
|
const buildDisplayResult = (
|
||||||
scheme: Pick<BurstSchemeRecord, "scheme_name" | "username" | "create_time">,
|
scheme: Pick<BurstSchemeRecord, "scheme_name" | "username" | "create_time">,
|
||||||
@@ -211,7 +221,7 @@ const SchemeQuery: React.FC<Props> = ({
|
|||||||
</Box>
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
<Box className="flex-1 overflow-auto">
|
<Box className="flex-1 overflow-auto">
|
||||||
{schemes.length === 0 ? (
|
{sortedSchemes.length === 0 ? (
|
||||||
<Box className="flex flex-col items-center justify-center h-full text-gray-400">
|
<Box className="flex flex-col items-center justify-center h-full text-gray-400">
|
||||||
<Box className="mb-4">
|
<Box className="mb-4">
|
||||||
<svg
|
<svg
|
||||||
@@ -248,9 +258,9 @@ const SchemeQuery: React.FC<Props> = ({
|
|||||||
) : (
|
) : (
|
||||||
<Box className="space-y-2 p-2">
|
<Box className="space-y-2 p-2">
|
||||||
<Typography variant="caption" className="text-gray-500 px-2">
|
<Typography variant="caption" className="text-gray-500 px-2">
|
||||||
共 {schemes.length} 条记录
|
共 {sortedSchemes.length} 条记录
|
||||||
</Typography>
|
</Typography>
|
||||||
{schemes.map((scheme) => {
|
{sortedSchemes.map((scheme) => {
|
||||||
const summary = scheme.scheme_detail?.result_summary;
|
const summary = scheme.scheme_detail?.result_summary;
|
||||||
const payload = scheme.scheme_detail?.result_payload;
|
const payload = scheme.scheme_detail?.result_payload;
|
||||||
const locatedPipe = payload?.located_pipe ?? summary?.located_pipe ?? "-";
|
const locatedPipe = payload?.located_pipe ?? summary?.located_pipe ?? "-";
|
||||||
|
|||||||
@@ -128,7 +128,13 @@ const SchemeQuery: React.FC<SchemeQueryProps> = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const filteredSchemes = useMemo(() => {
|
const filteredSchemes = useMemo(() => {
|
||||||
return schemes.filter((scheme) => scheme.type === SCHEME_TYPE);
|
return schemes
|
||||||
|
.filter((scheme) => scheme.type === SCHEME_TYPE)
|
||||||
|
.slice()
|
||||||
|
.sort(
|
||||||
|
(a, b) =>
|
||||||
|
moment(b.create_time).valueOf() - moment(a.create_time).valueOf(),
|
||||||
|
);
|
||||||
}, [schemes]);
|
}, [schemes]);
|
||||||
|
|
||||||
const handleQuery = async () => {
|
const handleQuery = async () => {
|
||||||
|
|||||||
@@ -202,7 +202,13 @@ const SchemeQuery: React.FC<SchemeQueryProps> = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const filteredSchemes = useMemo(() => {
|
const filteredSchemes = useMemo(() => {
|
||||||
return schemes.filter((scheme) => scheme.type === SCHEME_TYPE);
|
return schemes
|
||||||
|
.filter((scheme) => scheme.type === SCHEME_TYPE)
|
||||||
|
.slice()
|
||||||
|
.sort(
|
||||||
|
(a, b) =>
|
||||||
|
moment(b.create_time).valueOf() - moment(a.create_time).valueOf(),
|
||||||
|
);
|
||||||
}, [schemes]);
|
}, [schemes]);
|
||||||
|
|
||||||
const handleQuery = async () => {
|
const handleQuery = async () => {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import React, { useState } from "react";
|
import React, { useMemo, useState } from "react";
|
||||||
import {
|
import {
|
||||||
Box,
|
Box,
|
||||||
Button,
|
Button,
|
||||||
@@ -65,6 +65,16 @@ const SchemeQuery: React.FC<Props> = ({
|
|||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const schemes = externalSchemes !== undefined ? externalSchemes : internalSchemes;
|
const schemes = externalSchemes !== undefined ? externalSchemes : internalSchemes;
|
||||||
const setSchemes = onSchemesChange || setInternalSchemes;
|
const setSchemes = onSchemesChange || setInternalSchemes;
|
||||||
|
const sortedSchemes = useMemo(
|
||||||
|
() =>
|
||||||
|
schemes
|
||||||
|
.slice()
|
||||||
|
.sort(
|
||||||
|
(a, b) =>
|
||||||
|
dayjs(b.create_time).valueOf() - dayjs(a.create_time).valueOf(),
|
||||||
|
),
|
||||||
|
[schemes],
|
||||||
|
);
|
||||||
|
|
||||||
const handleQuery = async () => {
|
const handleQuery = async () => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
@@ -144,7 +154,7 @@ const SchemeQuery: React.FC<Props> = ({
|
|||||||
</Box>
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
<Box className="flex-1 overflow-auto">
|
<Box className="flex-1 overflow-auto">
|
||||||
{schemes.length === 0 ? (
|
{sortedSchemes.length === 0 ? (
|
||||||
<Box className="flex flex-col items-center justify-center h-full text-gray-400">
|
<Box className="flex flex-col items-center justify-center h-full text-gray-400">
|
||||||
<Box className="mb-4">
|
<Box className="mb-4">
|
||||||
<svg
|
<svg
|
||||||
@@ -181,9 +191,9 @@ const SchemeQuery: React.FC<Props> = ({
|
|||||||
) : (
|
) : (
|
||||||
<Box className="space-y-2 p-2">
|
<Box className="space-y-2 p-2">
|
||||||
<Typography variant="caption" className="text-gray-500 px-2">
|
<Typography variant="caption" className="text-gray-500 px-2">
|
||||||
共 {schemes.length} 条记录
|
共 {sortedSchemes.length} 条记录
|
||||||
</Typography>
|
</Typography>
|
||||||
{schemes.map((scheme) => (
|
{sortedSchemes.map((scheme) => (
|
||||||
<Card key={scheme.scheme_id} variant="outlined" className="hover:shadow-md transition-shadow">
|
<Card key={scheme.scheme_id} variant="outlined" className="hover:shadow-md transition-shadow">
|
||||||
<CardContent className="p-3 pb-2 last:pb-3">
|
<CardContent className="p-3 pb-2 last:pb-3">
|
||||||
<Box className="flex items-start justify-between gap-2 mb-2">
|
<Box className="flex items-start justify-between gap-2 mb-2">
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useMemo, useState } from "react";
|
||||||
import ReactDOM from "react-dom";
|
import ReactDOM from "react-dom";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -108,6 +108,16 @@ const SchemeQuery: React.FC<SchemeQueryProps> = ({
|
|||||||
|
|
||||||
const schemes = externalSchemes !== undefined ? externalSchemes : internalSchemes;
|
const schemes = externalSchemes !== undefined ? externalSchemes : internalSchemes;
|
||||||
const setSchemes = onSchemesChange || setInternalSchemes;
|
const setSchemes = onSchemesChange || setInternalSchemes;
|
||||||
|
const sortedSchemes = useMemo(
|
||||||
|
() =>
|
||||||
|
schemes
|
||||||
|
.slice()
|
||||||
|
.sort(
|
||||||
|
(a, b) =>
|
||||||
|
moment(b.create_time).valueOf() - moment(a.create_time).valueOf(),
|
||||||
|
),
|
||||||
|
[schemes],
|
||||||
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!map) return;
|
if (!map) return;
|
||||||
@@ -387,7 +397,7 @@ const SchemeQuery: React.FC<SchemeQueryProps> = ({
|
|||||||
|
|
||||||
{/* Results List */}
|
{/* Results List */}
|
||||||
<Box className="flex-1 overflow-auto">
|
<Box className="flex-1 overflow-auto">
|
||||||
{schemes.length === 0 ? (
|
{sortedSchemes.length === 0 ? (
|
||||||
<Box className="flex flex-col items-center justify-center h-full text-gray-400">
|
<Box className="flex flex-col items-center justify-center h-full text-gray-400">
|
||||||
<Box className="mb-4">
|
<Box className="mb-4">
|
||||||
<svg
|
<svg
|
||||||
@@ -424,9 +434,9 @@ const SchemeQuery: React.FC<SchemeQueryProps> = ({
|
|||||||
) : (
|
) : (
|
||||||
<Box className="space-y-2 p-2">
|
<Box className="space-y-2 p-2">
|
||||||
<Typography variant="caption" className="text-gray-500 px-2">
|
<Typography variant="caption" className="text-gray-500 px-2">
|
||||||
共 {schemes.length} 条记录
|
共 {sortedSchemes.length} 条记录
|
||||||
</Typography>
|
</Typography>
|
||||||
{schemes.map((scheme) => (
|
{sortedSchemes.map((scheme) => (
|
||||||
<Card
|
<Card
|
||||||
key={scheme.id}
|
key={scheme.id}
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useMemo, useState } from "react";
|
||||||
import {
|
import {
|
||||||
Box,
|
Box,
|
||||||
Button,
|
Button,
|
||||||
@@ -107,6 +107,16 @@ const SchemeQuery: React.FC<SchemeQueryProps> = ({
|
|||||||
const schemes =
|
const schemes =
|
||||||
externalSchemes !== undefined ? externalSchemes : internalSchemes;
|
externalSchemes !== undefined ? externalSchemes : internalSchemes;
|
||||||
const setSchemes = onSchemesChange || setInternalSchemes;
|
const setSchemes = onSchemesChange || setInternalSchemes;
|
||||||
|
const sortedSchemes = useMemo(
|
||||||
|
() =>
|
||||||
|
schemes
|
||||||
|
.slice()
|
||||||
|
.sort(
|
||||||
|
(a, b) =>
|
||||||
|
moment(b.create_time).valueOf() - moment(a.create_time).valueOf(),
|
||||||
|
),
|
||||||
|
[schemes],
|
||||||
|
);
|
||||||
|
|
||||||
// 格式化简短日期
|
// 格式化简短日期
|
||||||
const formatShortDate = (timeStr: string) => {
|
const formatShortDate = (timeStr: string) => {
|
||||||
@@ -313,7 +323,7 @@ const SchemeQuery: React.FC<SchemeQueryProps> = ({
|
|||||||
|
|
||||||
{/* 结果列表 */}
|
{/* 结果列表 */}
|
||||||
<Box className="flex-1 overflow-auto">
|
<Box className="flex-1 overflow-auto">
|
||||||
{schemes.length === 0 ? (
|
{sortedSchemes.length === 0 ? (
|
||||||
<Box className="flex flex-col items-center justify-center h-full text-gray-400">
|
<Box className="flex flex-col items-center justify-center h-full text-gray-400">
|
||||||
<Box className="mb-4">
|
<Box className="mb-4">
|
||||||
<svg
|
<svg
|
||||||
@@ -350,9 +360,9 @@ const SchemeQuery: React.FC<SchemeQueryProps> = ({
|
|||||||
) : (
|
) : (
|
||||||
<Box className="space-y-2 p-2">
|
<Box className="space-y-2 p-2">
|
||||||
<Typography variant="caption" className="text-gray-500 px-2">
|
<Typography variant="caption" className="text-gray-500 px-2">
|
||||||
共 {schemes.length} 条记录
|
共 {sortedSchemes.length} 条记录
|
||||||
</Typography>
|
</Typography>
|
||||||
{schemes.map((scheme) => (
|
{sortedSchemes.map((scheme) => (
|
||||||
<Card
|
<Card
|
||||||
key={scheme.id}
|
key={scheme.id}
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
|
|||||||
Reference in New Issue
Block a user