diff --git a/web/src/components/DateTimeInput.tsx b/web/src/components/DateTimeInput.tsx index 33b45f2c0..0461fe2f1 100644 --- a/web/src/components/DateTimeInput.tsx +++ b/web/src/components/DateTimeInput.tsx @@ -1,3 +1,4 @@ +import dayjs from "dayjs"; import { isEqual } from "lodash-es"; import toast from "react-hot-toast"; import { cn } from "@/utils"; @@ -5,44 +6,40 @@ import { cn } from "@/utils"; // Helper function to convert Date to local datetime string. const toLocalDateTimeString = (date: Date | undefined): string => { if (!date) return ""; - return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().slice(0, -1); + return dayjs(date).format("YYYY-MM-DDTHH:mm:ss"); }; interface Props { - label: string; value: Date | undefined; originalValue: Date | undefined; onChange: (date: Date) => void; } -const DateTimeInput: React.FC = ({ label, value, originalValue, onChange }) => { +const DateTimeInput: React.FC = ({ value, originalValue, onChange }) => { return ( -
- {label} - { - const inputValue = e.target.value; - if (inputValue) { - const date = new Date(inputValue); - if (!isNaN(date.getTime())) { - onChange(date); - } else { - toast.error("Invalid datetime format. Use format: 2023-12-31T23:59:59"); - e.target.value = toLocalDateTimeString(value); - } + { + const inputValue = e.target.value; + if (inputValue) { + const date = new Date(inputValue); + if (!isNaN(date.getTime())) { + onChange(date); + } else { + toast.error("Invalid datetime format. Use format: 2023-12-31T23:59:59"); + e.target.value = toLocalDateTimeString(value); } - }} - placeholder="YYYY-MM-DDTHH:mm:ss" - /> -
+ } + }} + placeholder="YYYY-MM-DDTHH:mm:ss" + /> ); }; diff --git a/web/src/components/HomeSidebar/HomeSidebar.tsx b/web/src/components/HomeSidebar/HomeSidebar.tsx index 4be07aff2..e8d31164f 100644 --- a/web/src/components/HomeSidebar/HomeSidebar.tsx +++ b/web/src/components/HomeSidebar/HomeSidebar.tsx @@ -88,9 +88,9 @@ const HomeSidebar = observer((props: Props) => { ))} -
+ {currentUser && }
diff --git a/web/src/components/MemoEditor/index.tsx b/web/src/components/MemoEditor/index.tsx index bafa7e410..a1373929d 100644 --- a/web/src/components/MemoEditor/index.tsx +++ b/web/src/components/MemoEditor/index.tsx @@ -1,4 +1,5 @@ import { Button } from "@usememos/mui"; +import copy from "copy-to-clipboard"; import { isEqual } from "lodash-es"; import { LoaderIcon, SendIcon } from "lucide-react"; import { observer } from "mobx-react-lite"; @@ -11,6 +12,7 @@ import { TAB_SPACE_WIDTH } from "@/helpers/consts"; import { isValidUrl } from "@/helpers/utils"; import useAsyncEffect from "@/hooks/useAsyncEffect"; import useCurrentUser from "@/hooks/useCurrentUser"; +import { extractMemoIdFromName } from "@/store/common"; import { memoStore, resourceStore, userStore, workspaceStore } from "@/store/v2"; import { Location, Memo, MemoRelation, MemoRelation_Type, Visibility } from "@/types/proto/api/v1/memo_service"; import { Resource } from "@/types/proto/api/v1/resource_service"; @@ -547,13 +549,25 @@ const MemoEditor = observer((props: Props) => { {/* Show memo metadata if memoName is provided */} {memoName && (
- {!isEqual(createTime, updateTime) && ( - - )} - -
- ID: - {memoName} +
+ {!isEqual(createTime, updateTime) && ( + <> + Updated + + + )} + Created + + ID + { + copy(extractMemoIdFromName(memoName)); + toast.success(t("message.copied")); + }} + > + {extractMemoIdFromName(memoName)} +
)} diff --git a/web/src/components/StatisticsView/MonthNavigator.tsx b/web/src/components/StatisticsView/MonthNavigator.tsx index e8ba64260..005a389ee 100644 --- a/web/src/components/StatisticsView/MonthNavigator.tsx +++ b/web/src/components/StatisticsView/MonthNavigator.tsx @@ -17,7 +17,7 @@ export const MonthNavigator = ({ visibleMonth, onMonthChange }: MonthNavigatorPr return (
- + {currentMonth.toLocaleString(i18n.language, { year: "numeric", month: "long" })}
diff --git a/web/src/components/StatisticsView/StatisticsView.tsx b/web/src/components/StatisticsView/StatisticsView.tsx index 1106722c1..72d2fd18b 100644 --- a/web/src/components/StatisticsView/StatisticsView.tsx +++ b/web/src/components/StatisticsView/StatisticsView.tsx @@ -34,7 +34,7 @@ const StatisticsView = observer(() => { const hasPinnedMemos = currentUser && (userStore.state.currentUserStats?.pinnedMemos || []).length > 0; return ( -
+