diff --git a/server/router/api/v1/memo_service.go b/server/router/api/v1/memo_service.go index 0a4f7531..92afcd3b 100644 --- a/server/router/api/v1/memo_service.go +++ b/server/router/api/v1/memo_service.go @@ -243,10 +243,8 @@ func (s *APIV1Service) UpdateMemo(ctx context.Context, request *v1pb.UpdateMemoR return nil, status.Errorf(codes.PermissionDenied, "permission denied") } - currentTs := time.Now().Unix() update := &store.UpdateMemo{ - ID: id, - UpdatedTs: ¤tTs, + ID: id, } for _, path := range request.UpdateMask.Paths { if path == "content" { @@ -279,6 +277,12 @@ func (s *APIV1Service) UpdateMemo(ctx context.Context, request *v1pb.UpdateMemoR } else if path == "create_time" { createdTs := request.Memo.CreateTime.AsTime().Unix() update.CreatedTs = &createdTs + } else if path == "update_time" { + updatedTs := time.Now().Unix() + if request.Memo.UpdateTime != nil { + updatedTs = request.Memo.UpdateTime.AsTime().Unix() + } + update.UpdatedTs = &updatedTs } else if path == "display_time" { displayTs := request.Memo.DisplayTime.AsTime().Unix() memoRelatedSetting, err := s.Store.GetWorkspaceMemoRelatedSetting(ctx) diff --git a/web/src/components/MemoContent/TaskListItem.tsx b/web/src/components/MemoContent/TaskListItem.tsx index 67e18590..e96c7d68 100644 --- a/web/src/components/MemoContent/TaskListItem.tsx +++ b/web/src/components/MemoContent/TaskListItem.tsx @@ -19,7 +19,7 @@ interface Props { const TaskListItem: React.FC = ({ node, complete, children }: Props) => { const context = useContext(RendererContext); const memoStore = useMemoStore(); - const [checked] = useState(complete); + const [checked, setChecked] = useState(complete); const handleCheckboxChange = async (on: boolean) => { if (context.readonly || !context.memoName) { @@ -35,6 +35,7 @@ const TaskListItem: React.FC = ({ node, complete, children }: Props) => { }, ["content"], ); + setChecked(on); }; return ( diff --git a/web/src/components/MemoContent/index.tsx b/web/src/components/MemoContent/index.tsx index e735f561..36c625c4 100644 --- a/web/src/components/MemoContent/index.tsx +++ b/web/src/components/MemoContent/index.tsx @@ -53,13 +53,13 @@ const MemoContent: React.FC = (props: Props) => { } }, []); - const handleMemoContentClick = async (e: React.MouseEvent) => { + const onMemoContentClick = async (e: React.MouseEvent) => { if (onClick) { onClick(e); } }; - const handleMemoContentDoubleClick = async (e: React.MouseEvent) => { + const onMemoContentDoubleClick = async (e: React.MouseEvent) => { if (onDoubleClick) { onDoubleClick(e); } @@ -72,10 +72,6 @@ const MemoContent: React.FC = (props: Props) => { SNIPPET: { text: t("memo.show-less"), nextState: "ALL" }, }; - useEffect(() => { - sessionStorage.getItem(`${memoName}`) && setShowCompactMode(sessionStorage.getItem(`${memoName}`) as ContentCompactView); - }, []); - return ( = (props: Props) => { showCompactMode == "ALL" && "line-clamp-6 max-h-60", contentClassName, )} - onClick={handleMemoContentClick} - onDoubleClick={handleMemoContentDoubleClick} + onClick={onMemoContentClick} + onDoubleClick={onMemoContentDoubleClick} > {nodes.map((node, index) => { if (prevNode?.type !== NodeType.LINE_BREAK && node.type === NodeType.LINE_BREAK && skipNextLineBreakFlag) { @@ -117,7 +113,6 @@ const MemoContent: React.FC = (props: Props) => { className="w-auto flex flex-row justify-start items-center cursor-pointer text-sm text-blue-600 dark:text-blue-400 hover:opacity-80" onClick={() => { setShowCompactMode(compactStates[showCompactMode].nextState as ContentCompactView); - sessionStorage.setItem(`${memoName}`, compactStates[showCompactMode].nextState); }} > {compactStates[showCompactMode].text} diff --git a/web/src/components/MemoEditor/index.tsx b/web/src/components/MemoEditor/index.tsx index 6caeb2a6..49a2d94b 100644 --- a/web/src/components/MemoEditor/index.tsx +++ b/web/src/components/MemoEditor/index.tsx @@ -302,29 +302,39 @@ const MemoEditor = (props: Props) => { if (memoName) { const prevMemo = await memoStore.getOrFetchMemoByName(memoName); if (prevMemo) { - const updateMask = ["content", "visibility"]; + const updateMask = new Set(); const memoPatch: Partial = { name: prevMemo.name, content, - visibility: state.memoVisibility, }; - if (!isEqual(displayTime, prevMemo.displayTime)) { - updateMask.push("display_time"); - memoPatch.displayTime = displayTime; + if (!isEqual(content, prevMemo.content)) { + updateMask.add("content"); + memoPatch.content = content; + } + if (!isEqual(state.memoVisibility, prevMemo.visibility)) { + updateMask.add("visibility"); + memoPatch.visibility = state.memoVisibility; } if (!isEqual(state.resourceList, prevMemo.resources)) { - updateMask.push("resources"); + updateMask.add("resources"); memoPatch.resources = state.resourceList; } if (!isEqual(state.relationList, prevMemo.relations)) { - updateMask.push("relations"); + updateMask.add("relations"); memoPatch.relations = state.relationList; } if (!isEqual(state.location, prevMemo.location)) { - updateMask.push("location"); + updateMask.add("location"); memoPatch.location = state.location; } - const memo = await memoStore.updateMemo(memoPatch, updateMask); + if (["content", "resources", "relations", "location"].some((key) => updateMask.has(key))) { + updateMask.add("update_time"); + } + if (!isEqual(displayTime, prevMemo.displayTime)) { + updateMask.add("display_time"); + memoPatch.displayTime = displayTime; + } + const memo = await memoStore.updateMemo(memoPatch, Array.from(updateMask)); if (onConfirm) { onConfirm(memo.name); }