Skip to content

Commit 998ec2e

Browse files
Merge branch 'development' into feature/request-gliederung-access
2 parents 2d7c94e + 4489faa commit 998ec2e

7 files changed

Lines changed: 37 additions & 18 deletions

File tree

apps/frontend/src/components/BasicInputs/BasicSelect.vue

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import useValidationModel from '../../composables/useValidationModel'
66
77
import BasicValidationFeedback from './components/BasicValidationFeedback.vue'
88
import { type BasicInputDefaultProps } from './defaultProps'
9+
import cn from '@/helpers/cn'
910
1011
export interface Option {
1112
label: string
@@ -47,10 +48,17 @@ const { model, errorMessage } = useValidationModel(props, emit)
4748
as="div"
4849
:name="id || name || label"
4950
:multiple="props.multiple"
51+
:disabled="disabled"
5052
>
5153
<ListboxButton class="input-style !flex flex-row items-center gap-x-2 justify-between">
52-
<span class="text-start">
53-
{{ options.find((option) => option.value === modelValue)?.label || placeholder || 'Bitte wählen...' }}
54+
<span :class="cn('text-start', { 'text-gray-500': disabled })">
55+
{{
56+
(multiple && Array.isArray(model)
57+
? model.map((value) => options.find((option) => option.value === value)?.label).join(', ')
58+
: options.find((option) => option.value === model)?.label) ||
59+
placeholder ||
60+
'Bitte wählen...'
61+
}}
5462
</span>
5563
<ChevronDownIcon class="h-5 text-gray-500 self-end" />
5664
</ListboxButton>
@@ -74,13 +82,13 @@ const { model, errorMessage } = useValidationModel(props, emit)
7482
:class="[
7583
active ? 'bg-primary-600 text-white' : 'text-gray-900',
7684
selected ? 'bg-primary-200' : '',
77-
'relative cursor-default select-none px-3 py-2',
85+
'relative cursor-default select-none px-3 py-2 group',
7886
'flex flex-row gap-x-4 items-center',
7987
]"
8088
>
8189
<CheckIcon
8290
class="h-4"
83-
:class="selected ? 'text-primary-600' : 'invisible'"
91+
:class="selected ? 'text-primary-600 group-hover:text-white' : 'invisible'"
8492
/>
8593
<div class="flex flex-col">
8694
<span>{{ option.label }}</span>

apps/frontend/src/components/BasicInputs/BasicTypeahead.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const props = withDefaults(
1616
/** Flag, die gesetzt werden kann, wenn die query nicht async ist. Debounce wird geskipped */
1717
sync?: InstanceType<typeof Typeahead>['sync']
1818
/** Ob ein Ergebnis von der Query ausgewählt werden muss oder ob auch ein Freitext erlaubt ist */
19+
disabled?: InstanceType<typeof Typeahead>['disabled']
1920
strict?: InstanceType<typeof Typeahead>['strict']
2021
immediate?: InstanceType<typeof Typeahead>['immediate']
2122
debounceTime?: InstanceType<typeof Typeahead>['debounceTime']
@@ -55,6 +56,7 @@ const { model, errorMessage } = useValidationModel(props, emit)
5556
:name="name"
5657
:debounce-time="debounceTime"
5758
:strict="strict"
59+
:disabled="disabled"
5860
>
5961
<template #default="slotData">
6062
<slot v-bind="slotData" />

apps/frontend/src/components/forms/unterveranstaltung/FormUnterveranstaltungGeneral.vue

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script setup lang="ts">
22
import { useAsyncState } from '@vueuse/core'
3-
import { computed, ref } from 'vue'
3+
import { computed, onMounted, ref } from 'vue'
44
55
import { apiClient } from '@/api'
66
import BasicDatepicker from '@/components/BasicInputs/BasicDatepicker.vue'
@@ -11,18 +11,21 @@ import BasicSelect from '@/components/BasicInputs/BasicSelect.vue'
1111
import BasicTypeahead from '@/components/BasicInputs/BasicTypeahead.vue'
1212
import Button from '@/components/UIComponents/Button.vue'
1313
import { loggedInAccount } from '@/composables/useAuthentication'
14-
import router from '@/router'
1514
import type { RouterInput } from '@codeanker/api'
1615
import { UnterveranstaltungTypeMapping, getEnumOptions } from '@codeanker/api'
1716
import { ValidateForm } from '@codeanker/validation'
17+
import { useRoute, useRouter } from 'vue-router'
1818
1919
const props = defineProps<{
2020
unterveranstaltung?: any
21-
veranstaltungId?: any
21+
veranstaltungId?: string
2222
mode: 'create' | 'update'
2323
onUpdate?: () => void
2424
}>()
2525
26+
const router = useRouter()
27+
const route = useRoute()
28+
2629
const unterveranstaltungId = props.unterveranstaltung?.id
2730
const gliederung = ref(props.unterveranstaltung?.gliederung)
2831
@@ -51,7 +54,7 @@ const {
5154
} = useAsyncState(
5255
async () => {
5356
if (loggedInAccount.value?.role === 'ADMIN') {
54-
unterveranstaltungCopy.value.gliederungId = gliederung.value.id
57+
unterveranstaltungCopy.value.gliederungId = gliederung.value?.id
5558
await apiClient.unterveranstaltung.verwaltungCreate.mutate({
5659
data: unterveranstaltungCopy.value as unknown as RouterInput['unterveranstaltung']['verwaltungCreate']['data'],
5760
})
@@ -152,6 +155,12 @@ const disableddates = computed(() => {
152155
}
153156
return obj
154157
})
158+
159+
onMounted(() => {
160+
if (props.mode === 'create') {
161+
unterveranstaltungCopy.value.veranstaltungId = route.params.veranstaltungId as string
162+
}
163+
})
155164
</script>
156165

157166
<template>
@@ -171,6 +180,7 @@ const disableddates = computed(() => {
171180
label="Veranstaltung"
172181
placeholder="Veranstaltungsort"
173182
:options="veranstaltungen.map((veranstaltung) => ({ label: veranstaltung.name, value: veranstaltung.id }))"
183+
:disabled="route.params.veranstaltungId !== undefined"
174184
/>
175185
</div>
176186
<template v-if="mode === 'create' && loggedInAccount?.role === 'ADMIN'">

apps/frontend/src/views/Anmeldung/components/PublicAusschreibungDaten.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script lang="ts" setup>
22
import InfoList from '@/components/UIComponents/InfoList.vue'
33
import { injectUnterveranstaltung } from '@/layouts/AnmeldungLayout.vue'
4+
import { formatCurrency } from '@codeanker/helpers'
45
import { formatDate } from '@vueuse/core'
56
import { computed } from 'vue'
67
@@ -28,7 +29,7 @@ const keyInfos = computed<KeyInfo[]>(() => {
2829
},
2930
{ title: 'Meldeschluss', value: formatDate(unterveranstaltung.value.meldeschluss, 'DD.MM.YYYY') },
3031
{ title: 'Veranstaltungsort', value: unterveranstaltung.value.veranstaltung.ort?.name ?? '' },
31-
{ title: 'Teilnahmebeitrag', value: unterveranstaltung.value.teilnahmegebuehr + '' },
32+
{ title: 'Teilnahmebeitrag', value: formatCurrency(unterveranstaltung.value.teilnahmegebuehr) },
3233
{ title: 'Zielgruppe', value: unterveranstaltung.value.veranstaltung.zielgruppe ?? '' },
3334
]
3435
})

apps/frontend/src/views/Unterveranstaltung/UnterveranstaltungDetail.vue

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,13 @@ import InfoList from '@/components/UIComponents/InfoList.vue'
3333
import Tabs from '@/components/UIComponents/Tabs.vue'
3434
import { loggedInAccount } from '@/composables/useAuthentication'
3535
import { useRouteTitle } from '@/composables/useRouteTitle'
36-
import { formatDateWith } from '@codeanker/helpers'
36+
import { formatCurrency, formatDateWith } from '@codeanker/helpers'
3737
import FAQList from '../FAQs/FAQList.vue'
3838
3939
const route = useRoute()
4040
const { setTitle } = useRouteTitle()
4141
42-
const {
43-
state: unterveranstaltung,
44-
execute: refreshUnterveranstaltung,
45-
} = useAsyncState(async () => {
42+
const { state: unterveranstaltung, execute: refreshUnterveranstaltung } = useAsyncState(async () => {
4643
let result
4744
if (loggedInAccount.value?.role === 'ADMIN') {
4845
result = await apiClient.unterveranstaltung.verwaltungGet.query({
@@ -94,7 +91,7 @@ const keyInfos = computed<KeyInfo[]>(() => {
9491
value: `${formatDateWith(unterveranstaltung.value.meldebeginn, keyInfoDateFormat)} - ${formatDateWith(unterveranstaltung.value.meldeschluss, keyInfoDateFormat)}`,
9592
},
9693
{ title: 'Veranstaltungsort', value: unterveranstaltung.value.veranstaltung.ort?.name ?? '' },
97-
{ title: 'Teilnahmebeitrag', value: unterveranstaltung.value.teilnahmegebuehr + '' },
94+
{ title: 'Teilnahmebeitrag', value: formatCurrency(unterveranstaltung.value.teilnahmegebuehr) },
9895
{ title: 'max. Teilnahmezahl', value: unterveranstaltung.value.maxTeilnehmende + '' },
9996
{ title: 'Zielgruppe', value: unterveranstaltung.value.veranstaltung.zielgruppe ?? '' },
10097
]

apps/frontend/src/views/Unterveranstaltung/UnterveranstaltungEdit.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import FormUnterveranstaltungGeneral from '@/components/forms/unterveranstaltung
77
import { loggedInAccount } from '@/composables/useAuthentication'
88
99
const route = useRoute()
10+
1011
const { state: unterveranstaltung, execute: fetchUnterveranstaltung } = useAsyncState(async () => {
1112
const unterveranstaltungId = route.params.unterveranstaltungId as string
1213
if (loggedInAccount.value?.role === 'ADMIN') {

apps/frontend/src/views/Verwaltung/Veranstaltungen/VeranstaltungDetail.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import Tabs from '@/components/UIComponents/Tabs.vue'
2525
import VeranstaltungCard from '@/components/UIComponents/VeranstaltungCard.vue'
2626
import UnterveranstaltungenTable from '@/components/data/UnterveranstaltungenTable.vue'
2727
import { useRouteTitle } from '@/composables/useRouteTitle'
28-
import { formatDateWith } from '@codeanker/helpers'
28+
import { formatCurrency, formatDateWith } from '@codeanker/helpers'
2929
import { PlusIcon } from '@heroicons/vue/24/solid'
3030
import ProgramList from '../Program/ProgramList.vue'
3131
import AnmeldeLinkTable from '@/components/data/AnmeldeLinkTable.vue'
@@ -66,7 +66,7 @@ const keyInfos = computed<KeyInfo[]>(() => {
6666
value: `${formatDateWith(veranstaltung.value.meldebeginn, keyInfoDateFormat)} - ${formatDateWith(veranstaltung.value.meldeschluss, keyInfoDateFormat)}`,
6767
},
6868
{ title: 'Veranstaltungsort', value: veranstaltung.value.ort?.name ?? '' },
69-
{ title: 'Teilnahmebeitrag', value: veranstaltung.value.teilnahmegebuehr + '' },
69+
{ title: 'Teilnahmebeitrag', value: formatCurrency(veranstaltung.value.teilnahmegebuehr) },
7070
{ title: 'Zielgruppe', value: veranstaltung.value.zielgruppe ?? '' },
7171
]
7272
} else {
@@ -301,7 +301,7 @@ function copyProgramLink() {
301301
</div>
302302
<RouterLink
303303
class="text-primary-500 flex items-center"
304-
:to="{ name: 'UnterveranstaltungCreate' }"
304+
:to="{ name: 'UnterveranstaltungCreate', params: { veranstaltungId: veranstaltung?.id?.toString() } }"
305305
>
306306
<PlusIcon class="h-5 w-5 mr-1" />
307307
<span>Ausschreibung erstellen</span>

0 commit comments

Comments
 (0)