diff --git a/src/renderer/components/TemplateCard.vue b/src/renderer/components/TemplateCard.vue
new file mode 100644
index 0000000..4955aca
--- /dev/null
+++ b/src/renderer/components/TemplateCard.vue
@@ -0,0 +1,100 @@
+
+
+
+ {{ template.name }}
+ {{ template.description }}
+
+
+
+
+
+ 节点: {{ nodeCount.files }}
+
+
+ 目录: {{ nodeCount.directories }}
+
+
+
+
+
+
+
+
+
+ 查看
+
+
+ 执行
+
+
+
+
+
+
+ mdi-dots-vertical
+
+
+
+
+
+
+ mdi-pencil
+
+ 修改
+
+
+
+
+
+
+ mdi-delete
+
+ 删除
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/renderer/screens/CreateTemplateScreen.vue b/src/renderer/screens/CreateTemplateScreen.vue
index e2569b3..e45f793 100644
--- a/src/renderer/screens/CreateTemplateScreen.vue
+++ b/src/renderer/screens/CreateTemplateScreen.vue
@@ -62,7 +62,7 @@
@@ -166,7 +166,6 @@ const { getTemplateById } = templateStore
const formValid = ref(false)
const templateName = ref('')
const templateDescription = ref('')
-const hasChanges = ref(false)
// Dialogs
const showFileDialog = ref(false)
@@ -195,14 +194,6 @@ const isEditMode = computed(() => !!route.params.id)
const requiredRule = (fieldName: string) => (v: string | null | undefined) =>
!!v || `${fieldName}为必填项`
-// Watch for changes to detect unsaved changes
-watch(
- [templateName, templateDescription, treeStructure],
- () => {
- hasChanges.value = true
- },
- { deep: true }
-)
// Lifecycle
onMounted(async () => {
@@ -223,7 +214,6 @@ onMounted(async () => {
templateName.value = template.name
templateDescription.value = template.description
treeStructure.value = [...template.treeStructure]
- hasChanges.value = false
} else {
router.push('/templates')
}
@@ -431,21 +421,7 @@ const handleFileDialogConfirm = (data: { path: string; sourcePath?: string; sour
}
const goBack = async () => {
- if (hasChanges.value) {
- const confirmed = await ConfirmDialogService.confirm({
- title: '确认离开',
- message: '您有未保存的更改,确定要离开吗?',
- confirmText: '离开',
- cancelText: '取消',
- confirmColor: 'warning'
- })
-
- if (confirmed) {
- router.push('/templates')
- }
- } else {
router.push('/templates')
- }
}
@@ -540,7 +516,6 @@ const saveTemplate = () => {
templateStore.addTemplate(templateData)
}
- hasChanges.value = false
router.push('/templates')
}
diff --git a/src/renderer/screens/TemplateListScreen.vue b/src/renderer/screens/TemplateListScreen.vue
index 1cb4af0..07e5471 100644
--- a/src/renderer/screens/TemplateListScreen.vue
+++ b/src/renderer/screens/TemplateListScreen.vue
@@ -28,62 +28,13 @@
-
-
- {{ template.name }}
- {{ template.description }}
-
-
-
-
-
- 节点: {{ countTreeNodes(template.treeStructure).files }}
-
-
- 目录: {{ countTreeNodes(template.treeStructure).directories }}
-
-
-
-
-
-
-
-
-
- 查看
-
-
- 执行
-
-
-
-
-
-
- mdi-dots-vertical
-
-
-
-
-
-
- mdi-pencil
-
- 修改
-
-
-
-
-
-
- mdi-delete
-
- 删除
-
-
-
-
-
+
@@ -141,6 +92,7 @@ import { useRouter } from 'vue-router'
import { useTemplateStore, TreeNode } from '@/renderer/store/template'
import { Template } from '@/renderer/store/template'
import TemplateTree from '@/renderer/components/TemplateTree.vue'
+import TemplateCard from '@/renderer/components/TemplateCard.vue'
import { ConfirmDialogService } from '@/renderer/utils/confirm-dialog-service'
const router = useRouter()
@@ -166,28 +118,7 @@ const executePath = ref('')
const baseDirNames = ref('')
const executeFormValid = ref(false)
-// Count files and directories in tree structure
-const countTreeNodes = (nodes: TreeNode[]) => {
- let files = 0;
- let directories = 0;
- const count = (nodeList: TreeNode[]) => {
- nodeList.forEach(node => {
- if (node.type === 'file') {
- files++;
- } else if (node.type === 'directory') {
- directories++;
- if (node.children) {
- count(node.children);
- }
- }
- });
- };
-
- count(nodes || []);
-
- return { files, directories };
-}
const templateTree = computed(() => {
if (!selectedTemplate.value) return []