organization.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. target="_blank"
  27. @click="download"
  28. >
  29. {{ $t('download') }}
  30. </v-btn>
  31. </div>
  32. </v-form>
  33. </div>
  34. </template>
  35. <script lang="ts">
  36. import {computed, ComputedRef, defineComponent, Ref, ref, useContext} from "@nuxtjs/composition-api";
  37. import {QUERY_TYPE} from "~/types/enums";
  38. import DataPersister from "~/services/data/dataPersister";
  39. import {DataPersisterArgs, DataProviderArgs} from "~/types/interfaces";
  40. import { Context } from "@nuxt/types";
  41. import {Repository as VuexRepository} from "@vuex-orm/core/dist/src/repository/Repository";
  42. import {Model, Query} from "@vuex-orm/core";
  43. import {repositoryHelper} from "~/services/store/repository";
  44. import {File} from "~/models/Core/File";
  45. import {queryHelper} from "~/services/store/query";
  46. import DataProvider from "~/services/data/dataProvider";
  47. export default defineComponent({
  48. name: 'OrganizationCmfLicence',
  49. setup() {
  50. const context = useContext()
  51. let fileId: Ref<number | null> = ref(null)
  52. let file: ComputedRef<File | null> = computed(() => {
  53. return fileId.value !== null ? queryHelper.getItem(query, fileId.value) as File : null
  54. })
  55. let pending: ComputedRef<boolean> = computed(() => {
  56. return file.value !== null && file.value.status === 'PENDING'
  57. })
  58. const async = () => { return context.store.state.sse.connected }
  59. const repository: VuexRepository<Model> = repositoryHelper.getRepository(File)
  60. const query: Query = repository.query()
  61. const submit = async () => {
  62. const dataPersister = new DataPersister()
  63. dataPersister.initCtx(context as unknown as Context)
  64. const response = await dataPersister.invoke(
  65. {
  66. url: '/api/export/cmf-licence/organization',
  67. type: QUERY_TYPE.DEFAULT,
  68. data: { format: 'pdf', async: async() },
  69. withCredentials: true
  70. } as DataPersisterArgs
  71. )
  72. if (!async()) {
  73. console.error('SSE unavailable - File downloaded synchronously')
  74. }
  75. fileId.value = response.data.id
  76. repositoryHelper.persist(File, response.data)
  77. }
  78. const download = async () => {
  79. if (file.value === null) {
  80. return
  81. }
  82. const dataProvider = new DataProvider()
  83. dataProvider.initCtx(context as unknown as Context)
  84. const response = await dataProvider.invoke(
  85. {
  86. type: QUERY_TYPE.FILE,
  87. fileArgs: { fileId: file.value.id }
  88. } as DataProviderArgs
  89. )
  90. const blob = new Blob([response.data], { type: response.data.type })
  91. const url = window.URL.createObjectURL(blob)
  92. const link = document.createElement('a')
  93. link.href = url
  94. link.download = file.value.name ?? 'unknown'
  95. link.target = '_blank'
  96. link.click()
  97. link.remove()
  98. window.URL.revokeObjectURL(url)
  99. }
  100. return {
  101. submit,
  102. pending,
  103. file,
  104. download: () => download()
  105. }
  106. },
  107. beforeDestroy() {
  108. repositoryHelper.cleanRepository(File)
  109. }
  110. })
  111. function useSse(): { sseConnected: any; } {
  112. throw new Error("Function not implemented.");
  113. }
  114. </script>