main
vue 105 lines 3.24 KB
Raw
1 <template>
2 <n-card size="small" title="Review" segmented>
3 <div class="@container flex flex-col gap-6">
4 <n-form-item label="Overall verdict" :show-feedback="false">
5 <n-radio-group v-model:value="form.overall_verdict">
6 <n-radio-button value="up">
7 <Icon :name="ThumbUpIcon" :size="14" class="mr-1" />
8 Good
9 </n-radio-button>
10 <n-radio-button value="down">
11 <Icon :name="ThumbDownIcon" :size="14" class="mr-1" />
12 Bad
13 </n-radio-button>
14 </n-radio-group>
15 </n-form-item>
16
17 <!-- Template choice -->
18 <n-form-item label="Template used" :show-feedback="false">
19 <div v-if="report.report_markdown === null" class="text-secondary mb-1 text-sm">
20 No template recorded on this report.
21 </div>
22 <n-radio-group v-model:value="form.template_choice">
23 <n-radio value="correct">Correct template</n-radio>
24 <n-radio value="partial">Partially correct</n-radio>
25 <n-radio value="wrong">Wrong template</n-radio>
26 </n-radio-group>
27 </n-form-item>
28
29 <!-- Ratings -->
30 <div class="grid grid-cols-1 gap-6 @xl:grid-cols-3">
31 <n-form-item label="Instructions quality" :show-feedback="false">
32 <n-slider v-model:value="form.rating_instructions" :min="1" :max="5" :step="1" :marks="rateMarks" />
33 </n-form-item>
34
35 <n-form-item label="Artifact collection" :show-feedback="false">
36 <n-slider v-model:value="form.rating_artifacts" :min="1" :max="5" :step="1" :marks="rateMarks" />
37 </n-form-item>
38
39 <n-form-item label="Severity assessment" :show-feedback="false">
40 <n-slider v-model:value="form.rating_severity" :min="1" :max="5" :step="1" :marks="rateMarks" />
41 </n-form-item>
42 </div>
43
44 <!-- Missing steps -->
45 <n-form-item label="Missing steps" :show-feedback="false">
46 <n-input
47 v-model:value="form.missing_steps"
48 type="textarea"
49 placeholder="What investigation steps were missed?"
50 :autosize="{ minRows: 2, maxRows: 6 }"
51 />
52 </n-form-item>
53
54 <!-- Suggested edits -->
55 <n-form-item label="Suggested prompt / template edits" :show-feedback="false">
56 <n-input
57 v-model:value="form.suggested_edits"
58 type="textarea"
59 placeholder="How should the template or prompt be improved?"
60 :autosize="{ minRows: 2, maxRows: 6 }"
61 />
62 </n-form-item>
63 </div>
64 </n-card>
65 </template>
66
67 <script setup lang="ts">
68 import type { AiAnalystReport } from "@/types/aiAnalyst.d"
69 import { NCard, NFormItem, NInput, NRadio, NRadioButton, NRadioGroup, NSlider } from "naive-ui"
70 import { toRefs } from "vue"
71 import Icon from "@/components/common/Icon.vue"
72
73 export interface FormState {
74 overall_verdict: "up" | "down" | null
75 template_choice: "correct" | "wrong" | "partial" | null
76 rating_instructions: number
77 rating_artifacts: number
78 rating_severity: number
79 missing_steps: string
80 suggested_edits: string
81 }
82
83 const props = defineProps<{
84 report: AiAnalystReport
85 }>()
86
87 const { report } = toRefs(props)
88
89 const form = defineModel<FormState>("form", {
90 default: {
91 overall_verdict: null,
92 template_choice: null,
93 rating_instructions: 3,
94 rating_artifacts: 3,
95 rating_severity: 3,
96 missing_steps: "",
97 suggested_edits: ""
98 }
99 })
100
101 const ThumbUpIcon = "mdi:thumb-up-outline"
102 const ThumbDownIcon = "mdi:thumb-down-outline"
103
104 const rateMarks = { 1: "1", 2: "2", 3: "3", 4: "4", 5: "5" }
105 </script>