Budujmy bardziej złożone formularze dla systemów NOVA LAB.
1<template>
2 <div>
3 <label>Wybierz systemy do monitorowania (Ctrl+Click):</label>
4 <select v-model="selectedSystems" multiple>
5 <option value="oxygen">Generator tlenu</option>
6 <option value="water">Recykler wody</option>
7 <option value="power">Zasilanie solarne</option>
8 <option value="comms">Komunikacja</option>
9 </select>
10 <p>Wybrane: {{ selectedSystems.join(', ') }}</p>
11 </div>
12</template>
13
14<script setup>
15import { ref } from 'vue'
16
17const selectedSystems = ref([])
18</script>1<template>
2 <div>
3 <select v-model="selectedModule">
4 <option disabled value="">Wybierz moduł stacji</option>
5 <option
6 v-for="mod in modules"
7 :key="mod.id"
8 :value="mod.id"
9 >
10 {{ mod.name }} ({{ mod.sector }})
11 </option>
12 </select>
13
14 <p v-if="selectedModule">
15 Wybrany: {{ getModuleName(selectedModule) }}
16 </p>
17 </div>
18</template>
19
20<script setup>
21import { ref } from 'vue'
22
23const modules = ref([
24 { id: 1, name: 'Oxygen Alpha', sector: 'Sektor A' },
25 { id: 2, name: 'Plasma Beta', sector: 'Sektor B' },
26 { id: 3, name: 'Water Gamma', sector: 'Sektor C' }
27])
28
29const selectedModule = ref('')
30
31function getModuleName(id) {
32 return modules.value.find(m => m.id === id)?.name || ''
33}
34</script>1<template>
2 <form @submit.prevent="submitForm">
3 <div :class="{ error: errors.name }">
4 <label>Nazwa modułu:</label>
5 <input v-model="form.name" @blur="validateName" />
6 <span v-if="errors.name" class="error-message">
7 {{ errors.name }}
8 </span>
9 </div>
10
11 <div :class="{ error: errors.year }">
12 <label>Rok wdrożenia:</label>
13 <input v-model.number="form.year" type="number" @blur="validateYear" />
14 <span v-if="errors.year" class="error-message">
15 {{ errors.year }}
16 </span>
17 </div>
18
19 <div :class="{ error: errors.engineer }">
20 <label>Inżynier odpowiedzialny:</label>
21 <input v-model.trim="form.engineer" @blur="validateEngineer" />
22 <span v-if="errors.engineer" class="error-message">
23 {{ errors.engineer }}
24 </span>
25 </div>
26
27 <button type="submit" :disabled="!isFormValid">
28 Zarejestruj moduł
29 </button>
30 </form>
31</template>
32
33<script setup>
34import { reactive, computed } from 'vue'
35
36const form = reactive({
37 name: '',
38 year: null,
39 engineer: ''
40})
41
42const errors = reactive({
43 name: '',
44 year: '',
45 engineer: ''
46})
47
48function validateName() {
49 if (!form.name) {
50 errors.name = 'Nazwa jest wymagana'
51 } else if (form.name.length < 3) {
52 errors.name = 'Nazwa musi mieć min. 3 znaki'
53 } else {
54 errors.name = ''
55 }
56}
57
58function validateYear() {
59 if (!form.year) {
60 errors.year = 'Rok jest wymagany'
61 } else if (form.year < 2020 || form.year > 2100) {
62 errors.year = 'Rok musi być między 2020 a 2100'
63 } else {
64 errors.year = ''
65 }
66}
67
68function validateEngineer() {
69 errors.engineer = form.engineer ? '' : 'Inżynier jest wymagany'
70}
71
72const isFormValid = computed(() => {
73 return form.name && form.year && form.engineer &&
74 !errors.name && !errors.year && !errors.engineer
75})
76
77function submitForm() {
78 validateName()
79 validateYear()
80 validateEngineer()
81
82 if (isFormValid.value) {
83 console.log('Rejestracja:', form)
84 alert('Moduł zarejestrowany!')
85 }
86}
87</script>