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..5e2ca63 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('');
@@ -74,9 +75,10 @@ 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
+ 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;
}