Skip to content

Commit 444af63

Browse files
author
antoine
committed
improve upload
1 parent 909fbe5 commit 444af63

File tree

4 files changed

+47
-19
lines changed

4 files changed

+47
-19
lines changed

demo/database/factories/MediaFactory.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use App\Models\Media;
66
use Illuminate\Database\Eloquent\Factories\Factory;
7+
use Illuminate\Support\Facades\File;
78

89
class MediaFactory extends Factory
910
{
@@ -26,6 +27,7 @@ public function withFile(string $srcFullPath, string $destRelativePath)
2627
return [
2728
'file_name' => sprintf("data/$destRelativePath/%s", basename($srcFullPath)),
2829
'size' => filesize($srcFullPath),
30+
'mime_type' => File::mimeType($srcFullPath),
2931
];
3032
});
3133
}

resources/js/form/components/fields/upload/Upload.vue

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
DropdownMenuTrigger
3535
} from "@/components/ui/dropdown-menu";
3636
import { MoreHorizontal } from "lucide-vue-next";
37+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
3738
3839
const props = defineProps<FormFieldProps<FormUploadFieldData> & { asEditorEmbed?: boolean }>();
3940
@@ -60,8 +61,15 @@
6061
&& (!props.field.imageTransformableFileTypes || props.field.imageTransformableFileTypes?.includes(extension.value))
6162
&& props.value?.mime_type?.startsWith('image/');
6263
});
64+
6365
const transformedImg = ref<string>();
6466
const uppyFile = ref<UppyFile>();
67+
const isEditable = computed(() => {
68+
return props.value
69+
&& (!uppyFile.value || !uppyFile.value.progress.uploadStarted || uppyFile.value.progress.uploadComplete)
70+
&& isTransformable.value
71+
&& !props.hasError;
72+
});
6573
const uppy = new Uppy({
6674
id: props.fieldErrorKey,
6775
restrictions: {
@@ -257,8 +265,6 @@
257265
uppy.emit('cancel-all', { reason: 'user' });
258266
emit('uploading', false);
259267
});
260-
261-
const menuOpened = ref(false);
262268
</script>
263269

264270
<template>
@@ -267,26 +273,44 @@
267273
<template v-if="value?.path || value?.uploaded || uppyFile">
268274
<div :class="{ 'bg-background border border-input rounded-md p-4': !asEditorEmbed }">
269275
<div class="flex">
270-
<template v-if="transformedImg ?? value?.thumbnail ?? uppyFile?.preview">
271-
<img class="mr-4 object-contain"
272-
width="150"
273-
:src="transformedImg ?? value?.thumbnail ?? uppyFile.preview"
274-
alt=""
275-
>
276+
<template v-if="transformedImg ?? value?.thumbnail ?? uppyFile?.preview">
277+
<div class="mr-4 group/img relative rounded-md overflow-hidden">
278+
<img class="object-contain"
279+
width="150"
280+
:src="transformedImg ?? value?.thumbnail ?? uppyFile.preview"
281+
alt=""
282+
>
283+
<template v-if="isEditable">
284+
<button class="absolute grid place-content-center inset-0 bg-black/50 transition text-white text-xs font-medium opacity-0 group-hover/img:opacity-100" tabindex="-1" @click="onEdit">
285+
{{ __('sharp::form.upload.edit_button') }}
286+
</button>
287+
</template>
288+
</div>
276289
</template>
277290
<div class="flex-1 min-w-0">
278291
<div class="text-sm font-medium truncate">
279292
<template v-if="value?.path">
280-
<a class="hover:underline underline-offset-4"
281-
:href="route('code16.sharp.download.show', {
282-
entityKey: form.entityKey,
283-
instanceId: form.instanceId,
284-
disk: value.disk,
285-
path: value.path,
286-
})"
287-
:download="value?.name?.split('/').at(-1)">
288-
{{ value?.name?.split('/').at(-1) }}
289-
</a>
293+
<TooltipProvider>
294+
<Tooltip :delay-duration="0" disable-hoverable-content>
295+
<TooltipTrigger as-child>
296+
<a class="hover:underline underline-offset-4"
297+
:href="route('code16.sharp.download.show', {
298+
entityKey: form.entityKey,
299+
instanceId: form.instanceId,
300+
disk: value.disk,
301+
path: value.path,
302+
})"
303+
:download="value?.name?.split('/').at(-1)"
304+
>
305+
{{ value?.name?.split('/').at(-1) }}
306+
</a>
307+
</TooltipTrigger>
308+
309+
<TooltipContent class="pointer-events-none" :side-offset="10">
310+
{{ __('sharp::form.upload.download_tooltip') }}
311+
</TooltipContent>
312+
</Tooltip>
313+
</TooltipProvider>
290314
</template>
291315
<template v-else>
292316
{{ value?.name?.split('/').at(-1) ?? uppyFile?.name }}
@@ -358,7 +382,7 @@
358382
{{ __('sharp::form.upload.download_link') }}
359383
</DropdownMenuItem>
360384
</template>
361-
<template v-if="value && (!uppyFile || !uppyFile.progress.uploadStarted || uppyFile.progress.uploadComplete) && isTransformable && !hasError">
385+
<template v-if="isEditable">
362386
<DropdownMenuItem @click="onEdit">
363387
{{ __('sharp::form.upload.edit_button') }}
364388
</DropdownMenuItem>

resources/lang/en/form.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
'upload.remove_button' => 'Remove',
3131
'upload.edit_button' => 'Edit...',
3232
'upload.download_link' => 'Download',
33+
'upload.download_tooltip' => 'Download the file',
3334
'upload.message.file_too_big' => 'The selected file is too big (max. :size)',
3435
'upload.message.bad_extension' => 'File extension is incorrect',
3536
'upload.edit_modal.description' => 'Use the mouse wheel to zoom. Drag to move the image or the crop area',

resources/lang/fr/form.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
'upload.remove_button' => 'Supprimer',
3131
'upload.edit_button' => 'Modifier...',
3232
'upload.download_link' => 'Télécharger',
33+
'upload.download_tooltip' => 'Télécharger le fichier',
3334
'upload.message.file_too_big' => 'Le fichier sélectionné est trop grand (max. :size)',
3435
'upload.message.bad_extension' => 'L\'extension du fichier est invalide',
3536
'upload.edit_modal.description' => 'Utilisez la molette de la souris pour zoomer. Maintenir la souris pour déplacer l’image ou la zone de recadrage.',

0 commit comments

Comments
 (0)