mirror of
https://github.com/usememos/memos.git
synced 2025-06-05 22:09:59 +02:00
fix: memo filter
This commit is contained in:
@@ -17,7 +17,7 @@ const HomeSidebar = (props: Props) => {
|
|||||||
|
|
||||||
useDebounce(
|
useDebounce(
|
||||||
async () => {
|
async () => {
|
||||||
const filters = [`state == "NORMAL"`];
|
const filters = [`state == "NORMAL"`, `creator == "${currentUser.name}"`];
|
||||||
await userStatsStore.listUserStats(currentUser.name, filters.join(" && "));
|
await userStatsStore.listUserStats(currentUser.name, filters.join(" && "));
|
||||||
},
|
},
|
||||||
300,
|
300,
|
||||||
|
@@ -1,11 +1,10 @@
|
|||||||
import { Divider, Tooltip } from "@mui/joy";
|
import { Tooltip } from "@mui/joy";
|
||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import { countBy } from "lodash-es";
|
import { countBy } from "lodash-es";
|
||||||
import { CalendarDaysIcon, CheckCircleIcon, ChevronLeftIcon, ChevronRightIcon, Code2Icon, LinkIcon, ListTodoIcon } from "lucide-react";
|
import { CalendarDaysIcon, CheckCircleIcon, ChevronLeftIcon, ChevronRightIcon, Code2Icon, LinkIcon, ListTodoIcon } from "lucide-react";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import useAsyncEffect from "@/hooks/useAsyncEffect";
|
import useAsyncEffect from "@/hooks/useAsyncEffect";
|
||||||
import useCurrentUser from "@/hooks/useCurrentUser";
|
|
||||||
import i18n from "@/i18n";
|
import i18n from "@/i18n";
|
||||||
import { useMemoFilterStore, useUserStatsStore } from "@/store/v1";
|
import { useMemoFilterStore, useUserStatsStore } from "@/store/v1";
|
||||||
import { UserStats_MemoTypeStats } from "@/types/proto/api/v1/user_service";
|
import { UserStats_MemoTypeStats } from "@/types/proto/api/v1/user_service";
|
||||||
@@ -14,18 +13,12 @@ import ActivityCalendar from "./ActivityCalendar";
|
|||||||
|
|
||||||
const StatisticsView = () => {
|
const StatisticsView = () => {
|
||||||
const t = useTranslate();
|
const t = useTranslate();
|
||||||
const currentUser = useCurrentUser();
|
|
||||||
const memoFilterStore = useMemoFilterStore();
|
const memoFilterStore = useMemoFilterStore();
|
||||||
const userStatsStore = useUserStatsStore();
|
const userStatsStore = useUserStatsStore();
|
||||||
const [memoAmount, setMemoAmount] = useState(0);
|
|
||||||
const [memoTypeStats, setMemoTypeStats] = useState<UserStats_MemoTypeStats>(UserStats_MemoTypeStats.fromPartial({}));
|
const [memoTypeStats, setMemoTypeStats] = useState<UserStats_MemoTypeStats>(UserStats_MemoTypeStats.fromPartial({}));
|
||||||
const [activityStats, setActivityStats] = useState<Record<string, number>>({});
|
const [activityStats, setActivityStats] = useState<Record<string, number>>({});
|
||||||
const [selectedDate] = useState(new Date());
|
const [selectedDate] = useState(new Date());
|
||||||
const [visibleMonthString, setVisibleMonthString] = useState(dayjs(selectedDate.toDateString()).format("YYYY-MM"));
|
const [visibleMonthString, setVisibleMonthString] = useState(dayjs(selectedDate.toDateString()).format("YYYY-MM"));
|
||||||
const days = Math.ceil((Date.now() - currentUser.createTime!.getTime()) / 86400000);
|
|
||||||
|
|
||||||
const singularOrPluralMemo = (memoAmount > 0 ? t("common.memos") : t("common.memo")).toLowerCase();
|
|
||||||
const singularOrPluralDay = (days > 0 ? t("common.days") : t("common.day")).toLowerCase();
|
|
||||||
|
|
||||||
useAsyncEffect(async () => {
|
useAsyncEffect(async () => {
|
||||||
const memoTypeStats = UserStats_MemoTypeStats.fromPartial({});
|
const memoTypeStats = UserStats_MemoTypeStats.fromPartial({});
|
||||||
@@ -40,7 +33,6 @@ const StatisticsView = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
setMemoTypeStats(memoTypeStats);
|
setMemoTypeStats(memoTypeStats);
|
||||||
setMemoAmount(displayTimeList.length);
|
|
||||||
setActivityStats(countBy(displayTimeList.map((date) => dayjs(date).format("YYYY-MM-DD"))));
|
setActivityStats(countBy(displayTimeList.map((date) => dayjs(date).format("YYYY-MM-DD"))));
|
||||||
}, [userStatsStore.stateId]);
|
}, [userStatsStore.stateId]);
|
||||||
|
|
||||||
@@ -80,16 +72,8 @@ const StatisticsView = () => {
|
|||||||
data={activityStats}
|
data={activityStats}
|
||||||
onClick={onCalendarClick}
|
onClick={onCalendarClick}
|
||||||
/>
|
/>
|
||||||
{memoAmount === 0 ? (
|
|
||||||
<p className="mt-1 w-full text-xs italic opacity-80">{t("memo.no-memos")}</p>
|
|
||||||
) : (
|
|
||||||
<p className="mt-1 w-full text-xs italic opacity-80">
|
|
||||||
<span>{memoAmount}</span> {singularOrPluralMemo} {t("common.in").toLowerCase()} <span>{days}</span> {singularOrPluralDay}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
<Divider className="!my-2 opacity-50" />
|
<div className="pt-1 w-full flex flex-row justify-start items-center gap-x-2 gap-y-1 flex-wrap">
|
||||||
<div className="w-full flex flex-row justify-start items-center gap-x-2 gap-y-1 flex-wrap">
|
|
||||||
<div
|
<div
|
||||||
className={clsx("w-auto border dark:border-zinc-800 pl-1 pr-1.5 rounded-md flex justify-between items-center")}
|
className={clsx("w-auto border dark:border-zinc-800 pl-1 pr-1.5 rounded-md flex justify-between items-center")}
|
||||||
onClick={() => memoFilterStore.addFilter({ factor: "property.hasLink", value: "" })}
|
onClick={() => memoFilterStore.addFilter({ factor: "property.hasLink", value: "" })}
|
||||||
|
@@ -26,6 +26,18 @@ const Explore = () => {
|
|||||||
contentSearch.push(`"${filter.value}"`);
|
contentSearch.push(`"${filter.value}"`);
|
||||||
} else if (filter.factor === "tagSearch") {
|
} else if (filter.factor === "tagSearch") {
|
||||||
tagSearch.push(`"${filter.value}"`);
|
tagSearch.push(`"${filter.value}"`);
|
||||||
|
} else if (filter.factor === "property.hasLink") {
|
||||||
|
filters.push(`has_link == true`);
|
||||||
|
} else if (filter.factor === "property.hasTaskList") {
|
||||||
|
filters.push(`has_task_list == true`);
|
||||||
|
} else if (filter.factor === "property.hasCode") {
|
||||||
|
filters.push(`has_code == true`);
|
||||||
|
} else if (filter.factor === "displayTime") {
|
||||||
|
const filterDate = new Date(filter.value);
|
||||||
|
const filterUtcTimestamp = filterDate.getTime() + filterDate.getTimezoneOffset() * 60 * 1000;
|
||||||
|
const timestampAfter = filterUtcTimestamp / 1000;
|
||||||
|
filters.push(`display_time_after == ${timestampAfter}`);
|
||||||
|
filters.push(`display_time_before == ${timestampAfter + 60 * 60 * 24}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (memoFilterStore.orderByTimeAsc) {
|
if (memoFilterStore.orderByTimeAsc) {
|
||||||
|
Reference in New Issue
Block a user