organization.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <template>
  2. <div class="d-flex flex-column align-center">
  3. <h2 class="ma-4">{{ $t('cmf_structure_licence')}}</h2>
  4. <a
  5. href="https://www.cmf-musique.org/services/tarifs-preferentiels/"
  6. target="_blank"
  7. >
  8. {{ $t('cmf_licence_details_url')}}
  9. </a>
  10. <v-form
  11. ref="form"
  12. lazy-validation
  13. >
  14. <div class="ma-12">
  15. <v-btn
  16. v-if="!pending && file === null"
  17. @click="submit"
  18. >
  19. {{ $t('generate') }}
  20. </v-btn>
  21. <v-btn
  22. v-else
  23. color="primary"
  24. :loading="pending"
  25. :disabled="pending"
  26. :href="file ? file.url : ''">
  27. {{ $t('download') }}
  28. </v-btn>
  29. </div>
  30. </v-form>
  31. </div>
  32. </template>
  33. <script lang="ts">
  34. import {computed, ComputedRef, defineComponent, Ref, ref, useContext} from "@nuxtjs/composition-api";
  35. import {QUERY_TYPE} from "~/types/enums";
  36. import DataPersister from "~/services/data/dataPersister";
  37. import {DataPersisterArgs} from "~/types/interfaces";
  38. import { Context } from "@nuxt/types";
  39. import {Repository as VuexRepository} from "@vuex-orm/core/dist/src/repository/Repository";
  40. import {Model, Query} from "@vuex-orm/core";
  41. import {repositoryHelper} from "~/services/store/repository";
  42. import {File} from "~/models/Core/File";
  43. import {queryHelper} from "~/services/store/query";
  44. export default defineComponent({
  45. name: 'OrganizationCmfLicence',
  46. setup() {
  47. const context = useContext()
  48. let fileId: Ref<number | null> = ref(null)
  49. let file: ComputedRef<File | null> = computed(() => {
  50. return fileId.value !== null ? queryHelper.getItem(query, fileId.value) as File : null
  51. })
  52. let pending: ComputedRef<boolean> = computed(() => {
  53. return file.value !== null && file.value.status === 'PENDING'
  54. })
  55. const async = () => { return context.store.state.sse.connected }
  56. const repository: VuexRepository<Model> = repositoryHelper.getRepository(File)
  57. const query: Query = repository.query()
  58. const submit = async () => {
  59. const dataPersister = new DataPersister()
  60. dataPersister.initCtx(context as unknown as Context)
  61. const response = await dataPersister.invoke(
  62. {
  63. url: '/api/export/cmf-licence/organization',
  64. type: QUERY_TYPE.DEFAULT,
  65. data: { format: 'pdf', async: async() },
  66. withCredentials: true
  67. } as DataPersisterArgs
  68. )
  69. if (!async()) {
  70. console.error('SSE unavailable - File downloaded synchronously')
  71. }
  72. fileId.value = response.data.id
  73. repositoryHelper.persist(File, response.data)
  74. }
  75. return {
  76. submit,
  77. pending,
  78. file
  79. }
  80. },
  81. beforeDestroy() {
  82. repositoryHelper.cleanRepository(File)
  83. }
  84. })
  85. function useSse(): { sseConnected: any; } {
  86. throw new Error("Function not implemented.");
  87. }
  88. </script>