SetupForm.vue 4.96 KB
Newer Older
abergavenny's avatar
abergavenny committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<script setup>
import { computed, onMounted, onUnmounted, reactive, ref } from 'vue'
import useVuelidate from '@vuelidate/core'
import { required } from '@vuelidate/validators'

import InputGroup from '@/components/InputGroup.vue'
import InputWrapper from '@/components/InputWrapper.vue'
import MessageBox from '@/components/MessageBox.vue'
import SectionTitle from '@/components/SectionTitle.vue'
import { MESSAGES } from '@/data/messages'
import { randomPrefix, resetAlert } from '@/helpers'
import { useBuildingStore } from '@/stores/buildings'

let timeout = null

const emit = defineEmits(['closeModal', 'setupCompleted'])

const message = ref(null)
const messageType = ref(null)

const buildings = useBuildingStore()

const state = reactive({
  buildingCity: '',
  buildingGmlId: null,
  buildingName: '',
  buildingPrefix: null,
  buildingStreetName: '',
  buildingStreetNumber: '',
  buildingZipcode: ''
})

const rules = computed(() => {
  return {
    buildingCity: {},
    buildingGmlId: {},
    buildingName: { required },
    buildingPrefix: { required },
    buildingStreetName: {},
    buildingStreetNumber: {},
    buildingZipcode: {}
  }
})

const v$ = useVuelidate(rules, state)

async function onSubmit() {
  try {
    clearTimeout(timeout)
    message.value = null

    const isValid = await v$.value.$validate()

    if (!isValid) {
      message.value = MESSAGES['INVALID_INPUT']
      messageType.value = 'warning'

      timeout = resetAlert(message)

      return
    }

    const { buildingCity, buildingGmlId, buildingName, buildingPrefix, buildingStreetName, buildingStreetNumber, buildingZipcode } = state
    const response = await buildings.updateBuilding(buildings.firstBuilding._id, {
      buildingPrefix,
      buildingName,
      buildingAddress: [buildingStreetName, buildingStreetNumber, buildingZipcode, buildingCity].join('::'),
      buildingGmlId
    })

    if (response.success) {
      await buildings.fetchBuildings()

      buildings.setActiveBuilding(buildings.firstBuilding._id)

      emit('closeModal')
      emit('setupCompleted')
    } else {
      message.value = MESSAGES[response.message]
      messageType.value = 'danger'
    }

    timeout = resetAlert(message)
  } catch (error) {
    console.error('ERROR:', error.name)
  }
}

onMounted(() => {
  state.buildingPrefix = randomPrefix()
})

onUnmounted(() => {
  clearTimeout(timeout)
})
</script>

<template>
  <div class="initial-setup">
    <form @submit.prevent="onSubmit" class="initial-setup__form">
      <div class="form-content">
        <SectionTitle value="Stammdaten" />
        <InputGroup :row="true">
          <InputGroup>
            <label for="setup-user">Kennung</label>
            <input id="setup-user" type="text" v-model="state.buildingPrefix" />
          </InputGroup>
          <InputGroup :stretch="true">
            <label for="setup-user">Gebäudebezeichnung</label>
            <input id="setup-user" type="text" v-model="state.buildingName" />
          </InputGroup>
        </InputGroup>
        <MessageBox
          msg="Sie müssen eine Kennung wählen. Nehmen Sie zum Beispiel die ersten Buchstaben der Adresse oder wählen Sie eine beliebige Kombination. 4 bis 5 Zeichen sind empfohlen. Bitte beachten Sie, dass diese Kennung nicht mehr geändert werden kann."
          type="basic" />
        <InputGroup :row="true">
          <InputGroup :stretch="true">
            <label for="setup-user">Straße</label>
            <input id="setup-user" type="text" v-model="state.buildingStreetName" />
          </InputGroup>
          <InputGroup>
            <label for="setup-user">Hausnummer</label>
            <input id="setup-user" type="text" v-model="state.buildingStreetNumber" />
          </InputGroup>
        </InputGroup>
        <InputGroup :row="true">
          <InputGroup>
            <label for="setup-user">Postleitzahl</label>
            <input id="setup-user" type="text" v-model="state.buildingZipcode" />
          </InputGroup>
          <InputGroup :stretch="true">
            <label for="setup-user">Stadt</label>
            <input id="setup-user" type="text" v-model="state.buildingCity" />
          </InputGroup>
        </InputGroup>
        <SectionTitle value="Optional" />
        <InputGroup>
          <label for="setup-user">GML Id</label>
          <InputWrapper>
            <input id="setup-user" type="text" v-model="state.buildingGmlId" />
            <MessageBox msg="Sie können die GML Id aus dem Crowdsourcing Tool (CS-T) beziehen." type="basic" />
          </InputWrapper>
        </InputGroup>
      </div>
      <div class="form-section">
        <MessageBox v-if="message" :msg="message" :type="messageType" />
        <button class="button primary" type="submit" :disabled="message">
          <span>Speichern</span>
        </button>
      </div>
    </form>
  </div>
</template>

<style scoped>
.initial-setup {
  overflow-y: auto;
  flex: 1;
  display: flex;
  flex-direction: column;
}

.initial-setup__form {
  flex: 1;
  display: flex;
  flex-direction: column;
}
</style>