5757 <strong >{{ $t('public') }}</strong >
5858 </template >
5959 </TranslationT >
60+ <div
61+ v-if =" dataset.doi"
62+ class =" mt-1"
63+ >
64+ {{ $t("Un jeu de données porteur d'un DOI ne peut plus repasser en brouillon.") }}
65+ </div >
6066
6167 <template #button >
6268 <BrandedButton
6369 :loading =" isLoading "
70+ :disabled =" !! dataset .doi "
6471 @click =" switchDatasetPrivate "
6572 >
6673 {{ dataset.private ? $t('Publier le jeu de données') : $t('Passer en brouillon') }}
93100 :subject =" dataset "
94101 :label =" $t (' Transférer le jeu de données' )"
95102 />
103+ <BannerAction
104+ v-if =" getDatasetDoi (dataset )"
105+ type="primary"
106+ >
107+ <template #title >
108+ {{ $t('DOI du jeu de données :') }}
109+ <a
110+ :href =" `https://doi.org/${getDatasetDoi(dataset)}`"
111+ target =" _blank"
112+ rel =" noopener noreferrer"
113+ class =" link"
114+ >
115+ {{ getDatasetDoi(dataset) }}
116+ </a >
117+ <AdminBadge
118+ v-if =" ! dataset .doi "
119+ size="xs"
120+ type="secondary"
121+ class="ml-1"
122+ >
123+ {{ $t('Moissonné') }}
124+ </AdminBadge >
125+ </template >
126+ <template v-if =" dataset .doi " >
127+ {{ $t("Un jeu de données porteur d'un DOI ne peut plus être supprimé ni repassé en brouillon, seulement archivé.") }}
128+ </template >
129+ <template v-else >
130+ {{ $t("Ce DOI est déclaré par la source du moissonnage, qui en reste gestionnaire.") }}
131+ </template >
132+
133+ <template #button >
134+ <BrandedButton
135+ :icon =" doiCopied ? RiCheckLine : RiFileCopyLine "
136+ @click =" copyDoi (getDatasetDoi (dataset )! )"
137+ >
138+ {{ doiCopied ? $t('DOI copié !') : $t('Copier le DOI') }}
139+ </BrandedButton >
140+ </template >
141+ </BannerAction >
142+ <BannerAction
143+ v-if =" ! getDatasetDoi (dataset ) && isMeAdmin ()"
144+ type="primary"
145+ :title =" $t (' Créer un DOI' )"
146+ >
147+ {{ doiBlockedReason(dataset) ?? $t("Un DOI est définitif : une fois créé, le jeu de données ne pourra plus être supprimé, seulement archivé.") }}
148+
149+ <template #button >
150+ <ModalWithButton :title =" $t (' Êtes-vous sûr de vouloir créer un DOI pour ce jeu de données ?' )" >
151+ <template #button =" { attrs , listeners } " >
152+ <BrandedButton
153+ :icon =" RiFingerprintLine "
154+ :disabled =" !! doiBlockedReason (dataset )"
155+ v-bind =" attrs "
156+ v-on =" listeners "
157+ >
158+ {{ $t('Créer un DOI') }}
159+ </BrandedButton >
160+ </template >
161+ <p class =" m-0" >
162+ {{ $t("Un DOI est définitif : une fois créé, le jeu de données ne pourra plus être supprimé, seulement archivé.") }}
163+ </p >
164+ <template #footer =" { close } " >
165+ <div class =" flex-1 flex justify-end space-x-4" >
166+ <BrandedButton
167+ color="secondary"
168+ :loading =" isLoading "
169+ @click =" close "
170+ >
171+ {{ $t('Annuler') }}
172+ </BrandedButton >
173+ <BrandedButton
174+ color="primary"
175+ :loading =" isLoading "
176+ @click =" mintDoi (close )"
177+ >
178+ {{ $t('Créer le DOI') }}
179+ </BrandedButton >
180+ </div >
181+ </template >
182+ </ModalWithButton >
183+ </template >
184+ </BannerAction >
96185 <BannerAction
97186 type="warning"
98187 :title =" dataset .archived ? $t (' Désarchiver le jeu de données' ) : $t (' Archiver le jeu de données' )"
110199 </template >
111200 </BannerAction >
112201 <BannerAction
113- v-if =" ! dataset .deleted "
202+ v-if =" ! dataset .deleted && ! dataset . doi "
114203 type="danger"
115204 :title =" $t (' Supprimer le jeu de données' )"
116205 >
151240<script setup lang="ts">
152241import { BannerAction , BrandedButton , LoadingBlock , SimpleBanner , TranslationT , toast } from ' @datagouv/components-next'
153242import type { Badge , DatasetV2WithFullObject } from ' @datagouv/components-next'
154- import { RiArchiveLine , RiArrowGoBackLine , RiDeleteBin6Line } from ' @remixicon/vue'
243+ import { RiArchiveLine , RiArrowGoBackLine , RiCheckLine , RiDeleteBin6Line , RiFileCopyLine , RiFingerprintLine } from ' @remixicon/vue'
155244import DescribeDataset from ' ~/components/Datasets/DescribeDataset.vue'
156245import AdminDeleteModal from ' ~/components/Admin/AdminDeleteModal.vue'
246+ import ModalWithButton from ' ~/components/Modal/ModalWithButton.vue'
157247import { updateBadges } from ' ~/api/badges'
158248import type { DatasetForm } from ' ~/types/types'
159249
@@ -179,6 +269,33 @@ watchEffect(() => {
179269 }
180270})
181271
272+ const doiBlockedReason = useDoiBlockedReason ()
273+
274+ const doiCopied = ref (false )
275+ async function copyDoi(doi : string ) {
276+ try {
277+ await navigator .clipboard .writeText (doi )
278+ doiCopied .value = true
279+ setTimeout (() => doiCopied .value = false , 2000 )
280+ }
281+ catch {
282+ toast .error (t (' Impossible de copier dans le presse-papier' ))
283+ }
284+ }
285+
286+ async function mintDoi(close : () => void ) {
287+ isLoading .value = true
288+ try {
289+ await $api (` /api/1/datasets/${route .params .id }/doi ` , { method: ' POST' })
290+ close ()
291+ await refresh ()
292+ toast .success (t (' DOI créé !' ))
293+ }
294+ finally {
295+ isLoading .value = false
296+ }
297+ }
298+
182299async function save() {
183300 if (! datasetForm .value ) throw new Error (' No dataset form' )
184301
0 commit comments