main
vue 134 lines 3.73 KB
Raw
1 <template>
2 <n-form ref="formRef" :model="formData" :rules label-placement="top">
3 <n-form-item label="Report Name" path="report_name">
4 <n-input v-model:value="formData.report_name" placeholder="Leave empty for auto-generated name" clearable />
5 </n-form-item>
6
7 <n-form-item label="Customer" path="customer_code" required>
8 <n-select
9 v-model:value="formData.customer_code"
10 :options="customers"
11 placeholder="Select customer"
12 filterable
13 />
14 </n-form-item>
15
16 <n-divider>Optional Filters</n-divider>
17
18 <n-form-item label="Agent Name" path="agent_name">
19 <n-input v-model:value="formData.agent_name" placeholder="Filter by agent hostname" clearable />
20 </n-form-item>
21
22 <n-form-item label="Severity" path="severity">
23 <n-select
24 v-model:value="formData.severity"
25 :options="severityOptions"
26 placeholder="Filter by severity"
27 clearable
28 />
29 </n-form-item>
30
31 <n-form-item label="CVE ID" path="cve_id">
32 <n-input v-model:value="formData.cve_id" placeholder="Filter by CVE ID" clearable />
33 </n-form-item>
34
35 <n-form-item label="Package Name" path="package_name">
36 <n-input v-model:value="formData.package_name" placeholder="Filter by package name" clearable />
37 </n-form-item>
38
39 <n-form-item label="Include EPSS Scores" path="include_epss">
40 <n-switch v-model:value="formData.include_epss">
41 <template #checked>Enabled</template>
42 <template #unchecked>Disabled</template>
43 </n-switch>
44 </n-form-item>
45
46 <div class="mt-6 flex justify-end gap-3">
47 <n-button @click="$emit('cancel')">Cancel</n-button>
48 <n-button type="primary" :loading @click="handleSubmit">Generate Report</n-button>
49 </div>
50 </n-form>
51 </template>
52
53 <script setup lang="ts">
54 // TODO-FE: refactor
55 import type { FormInst, FormRules } from "naive-ui"
56 import type { VulnerabilityReportGenerateRequest } from "@/types/vulnerabilities.d"
57 import { NButton, NDivider, NForm, NFormItem, NInput, NSelect, NSwitch } from "naive-ui"
58 import { ref } from "vue"
59 import { VulnerabilitySeverity } from "@/types/vulnerabilities.d"
60
61 interface Props {
62 customers: Array<{ label: string; value: string }>
63 loading?: boolean
64 }
65
66 defineProps<Props>()
67
68 const emit = defineEmits<{
69 (e: "generate", value: VulnerabilityReportGenerateRequest): void
70 (e: "cancel"): void
71 }>()
72
73 const formRef = ref<FormInst | null>(null)
74 const formData = ref<VulnerabilityReportGenerateRequest>({
75 customer_code: "",
76 report_name: "",
77 agent_name: "",
78 severity: undefined,
79 cve_id: "",
80 package_name: "",
81 include_epss: false
82 })
83
84 const severityOptions = [
85 { label: "Critical", value: VulnerabilitySeverity.Critical },
86 { label: "High", value: VulnerabilitySeverity.High },
87 { label: "Medium", value: VulnerabilitySeverity.Medium },
88 { label: "Low", value: VulnerabilitySeverity.Low }
89 ]
90
91 const rules: FormRules = {
92 customer_code: [
93 {
94 required: true,
95 message: "Please select a customer",
96 trigger: ["blur", "change"]
97 }
98 ]
99 }
100
101 async function handleSubmit() {
102 if (!formRef.value) return
103
104 try {
105 await formRef.value.validate()
106
107 // Clean up empty strings
108 const request: VulnerabilityReportGenerateRequest = {
109 customer_code: formData.value.customer_code,
110 include_epss: formData.value.include_epss
111 }
112
113 if (formData.value.report_name?.trim()) {
114 request.report_name = formData.value.report_name.trim()
115 }
116 if (formData.value.agent_name?.trim()) {
117 request.agent_name = formData.value.agent_name.trim()
118 }
119 if (formData.value.severity) {
120 request.severity = formData.value.severity
121 }
122 if (formData.value.cve_id?.trim()) {
123 request.cve_id = formData.value.cve_id.trim()
124 }
125 if (formData.value.package_name?.trim()) {
126 request.package_name = formData.value.package_name.trim()
127 }
128
129 emit("generate", request)
130 } catch (error) {
131 console.error("Form validation failed:", error)
132 }
133 }
134 </script>