Skip to content
Snippets Groups Projects
AddShowModal.vue 3.93 KiB
Newer Older
  • Learn to ignore specific revisions
  •   <AEditDialog
        ref="dialog"
        :save="save"
        :title="t('showCreator.title')"
        :save-label="t('showCreator.title')"
        @close="reset"
      >
        <FormTable>
          <FormGroup v-slot="attrs" :errors="nameErrors" :label="t('show.fields.name')">
            <input
              v-bind="attrs"
              v-model="showData.name"
              type="text"
              required
              data-testid="add-show-modal:show-name"
            />
            <span v-if="showData.slug" class="tw-text-sm tw-mt-1 tw-text-gray-500">
              {{ t('show.fields.slug') }}: {{ showData.slug }}
            </span>
          </FormGroup>
          <FormGroup
            v-if="slugErrors.length > 0"
            v-slot="attrs"
            :errors="slugErrors"
            :label="t('show.fields.slug')"
          >
            <input
              v-bind="attrs"
              v-model="showData.slug"
              type="text"
              required
              data-testid="add-show-modal:slug"
              @blur="updateSlug(showData.slug)"
            />
          </FormGroup>
          <FormGroup
            v-slot="attrs"
            :errors="shortDescriptionErrors"
            :label="t('show.fields.shortDescription')"
          >
            <textarea
              v-bind="attrs"
              v-model="showData.shortDescription"
              required
              data-testid="add-show-modal:show-description"
            />
          </FormGroup>
          <FormGroup v-slot="attrs" :errors="typeErrors" :label="t('show.fields.typeId')">
            <select
              v-bind="attrs"
              v-model="showData.typeId"
              required
              data-testid="add-show-modal:show-type"
            >
              <option v-for="type in typeStore.items" :key="type.id" :value="type.id">
                {{ type.name }}
              </option>
            </select>
          </FormGroup>
          <FormGroup
            v-slot="attrs"
            :errors="fundingCategoryErrors"
            :label="t('show.fields.fundingCategoryId')"
          >
            <select
              v-bind="attrs"
              v-model="showData.fundingCategoryId"
              required
              data-testid="add-show-modal:show-funding-category"
            >
              <option v-for="cat in fundingCategoryStore.items" :key="cat.id" :value="cat.id">
                {{ cat.name }}
              </option>
            </select>
          </FormGroup>
        </FormTable>
      </AEditDialog>
    
    <script setup lang="ts">
    import { useServerErrorFields } from '@rokoli/bnb/drf'
    import { Ref, ref, watch } from 'vue'
    import { useRouter } from 'vue-router'
    
    import { useCreateBehaviour } from '@/form'
    import { useI18n } from '@/i18n'
    import { slugify } from '@/mixins/slugify'
    import { useAuthStore, useFundingCategoryStore, useShowStore, useTypeStore } from '@/stores'
    import { NewShow, newShow } from '@/stores/shows'
    import AEditDialog from '@/components/generic/AEditDialog.vue'
    import FormGroup from '@/components/generic/FormGroup.vue'
    import FormTable from '@/components/generic/FormTable.vue'
    
    const { t } = useI18n()
    const dialog = ref()
    
    const router = useRouter()
    const authStore = useAuthStore()
    const showStore = useShowStore()
    const typeStore = useTypeStore()
    const fundingCategoryStore = useFundingCategoryStore()
    const showData = ref() as Ref<NewShow>
    const { create, errorMap } = useCreateBehaviour(showStore.create)
    const [nameErrors, slugErrors, shortDescriptionErrors, typeErrors, fundingCategoryErrors] =
      useServerErrorFields(errorMap, 'name', 'slug', 'shortDescription', 'typeId', 'fundingCategoryId')
    reset()
    
    async function save() {
      const newShow = await create(showData.value)
      close()
      await router.push({ name: 'show-basic-data', params: { showId: newShow.id } })
    }
    
    function reset() {
      showData.value = { ...newShow(), ownerIds: [authStore.steeringUser?.id as number] }
    }
    
    function updateSlug(newSlug?: string) {
      const newSlugValue = slugify(newSlug ?? showData.value.slug)
      if (showData.value.slug !== newSlugValue) {
        showData.value.slug = newSlugValue
      }
    }
    
    watch(() => showData.value.name, updateSlug)
    
    defineExpose({
      open: () => dialog.value.open(),
      close: () => dialog.value.close(),
    })