From 2aebc1471d851f4e7e0510ce4af0b5cf15b07994 Mon Sep 17 00:00:00 2001 From: openclaw Date: Sat, 7 Mar 2026 17:48:39 +0800 Subject: [PATCH 1/2] feat(category): add manual category lock to prevent sync overwrite --- src/components/Header.tsx | 6 ++++ src/components/RepositoryEditModal.tsx | 46 +++++++++++++++++++++++--- src/types/index.ts | 1 + 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 8483cd7..a779348 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -48,6 +48,12 @@ export const Header: React.FC = () => { ai_tags: existing.ai_tags, ai_platforms: existing.ai_platforms, analyzed_at: existing.analyzed_at, + analysis_failed: existing.analysis_failed, + custom_description: existing.custom_description, + custom_tags: existing.custom_tags, + custom_category: existing.custom_category, + category_locked: existing.category_locked, + last_edited: existing.last_edited, }; } return newRepo; diff --git a/src/components/RepositoryEditModal.tsx b/src/components/RepositoryEditModal.tsx index 5a78769..eeda4aa 100644 --- a/src/components/RepositoryEditModal.tsx +++ b/src/components/RepositoryEditModal.tsx @@ -1,5 +1,5 @@ import React, { useState, useEffect } from 'react'; -import { Save, X, Plus } from 'lucide-react'; +import { Save, X, Plus, Lock, Unlock } from 'lucide-react'; import { Modal } from './Modal'; import { Repository } from '../types'; import { useAppStore, getAllCategories } from '../store/useAppStore'; @@ -20,7 +20,8 @@ export const RepositoryEditModal: React.FC = ({ const [formData, setFormData] = useState({ description: '', tags: [] as string[], - category: '' + category: '', + categoryLocked: false }); const [newTag, setNewTag] = useState(''); @@ -76,7 +77,8 @@ export const RepositoryEditModal: React.FC = ({ setFormData({ description: repository.custom_description || repository.description || '', tags: repository.custom_tags || repository.ai_tags || repository.topics || [], - category: currentCategory + category: currentCategory, + categoryLocked: !!repository.category_locked }); } }, [repository, isOpen]); @@ -84,11 +86,16 @@ export const RepositoryEditModal: React.FC = ({ const handleSave = () => { if (!repository) return; + const originalCategory = getCurrentCategory(repository); + const categoryChanged = formData.category !== originalCategory; + const updatedRepo = { ...repository, custom_description: formData.description !== repository.description ? formData.description : undefined, custom_tags: formData.tags.length > 0 ? formData.tags : undefined, custom_category: formData.category ? formData.category : undefined, + // 手动修改分类时,默认自动锁定;用户仍可手动取消 + category_locked: categoryChanged ? true : formData.categoryLocked, last_edited: new Date().toISOString() }; @@ -100,7 +107,8 @@ export const RepositoryEditModal: React.FC = ({ setFormData({ description: '', tags: [], - category: '' + category: '', + categoryLocked: false }); setNewTag(''); onClose(); @@ -202,6 +210,36 @@ export const RepositoryEditModal: React.FC = ({ {t('当前分类:', 'Current category:')} {formData.category}

)} + +
+
+ {formData.categoryLocked ? ( + + ) : ( + + )} + + {t('分类锁定', 'Category Lock')} + +
+ +
{/* Tags */} diff --git a/src/types/index.ts b/src/types/index.ts index ac6e28d..38fb887 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -27,6 +27,7 @@ export interface Repository { custom_description?: string; custom_tags?: string[]; custom_category?: string; + category_locked?: boolean; // 是否锁定分类(锁定后同步不自动改分类) last_edited?: string; } From f297097685e8a107339620ac383f8a9eeb413888 Mon Sep 17 00:00:00 2001 From: openclaw Date: Sat, 7 Mar 2026 17:58:24 +0800 Subject: [PATCH 2/2] fix(edit-modal): default custom description to ai summary --- src/components/RepositoryEditModal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/RepositoryEditModal.tsx b/src/components/RepositoryEditModal.tsx index eeda4aa..5e2ca63 100644 --- a/src/components/RepositoryEditModal.tsx +++ b/src/components/RepositoryEditModal.tsx @@ -75,7 +75,7 @@ export const RepositoryEditModal: React.FC = ({ if (repository && isOpen) { const currentCategory = getCurrentCategory(repository); setFormData({ - description: repository.custom_description || repository.description || '', + description: repository.custom_description || repository.ai_summary || repository.description || '', tags: repository.custom_tags || repository.ai_tags || repository.topics || [], category: currentCategory, categoryLocked: !!repository.category_locked