Level 2
@ghabe so I modified ma code, here is my view :
<div>
<div class="space-y-4">
<form wire:submit="save">
<div class="relative" x-data="fileUpload()">
<div x-show="isUploading">
<div class="h-full w-full absolute top-0 left-0 bg-white opacity-80 z-50">
<flux:text variant="strong" class="relative top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 flex items-center justify-center gap-2 bold">
<flux:icon.loading />
Ajout des fichiers en cours ...
</flux:text>
</div>
</div>
<div class="bg-gray-100 p-8 text-center rounded-lg border-dashed border-2 border-gray-300 hover:border-blue-500 transition duration-300 ease-in-out transform hover:shadow-md" id="dropzone">
<label for="files" class="cursor-pointer flex flex-col items-center space-y-2">
<svg class="w-16 h-16 text-gray-400" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m3.75 9v6m3-3H9m1.5-12H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z" />
</svg>
<span class="text-gray-600">Cliquez ici pour ajouter des fichiers</span>
</label>
<input type="file" id="files" wire:model="files" @change="handleFileSelect" class="hidden" multiple>
</div>
</div>
</form>
@foreach ($this->uploadedFiles as $file)
{{ $file->name }}
@endforeach
</div>
<script>
function fileUpload() {
return {
isUploading: false,
progress: 0,
handleFileSelect(event) {
if (event.target.files.length) {
this.isUploading = true
this.uploadFiles(event.target.files)
}
},
uploadFiles(files) {
const $this = this
this.isUploading = true
@this.uploadMultiple('files', files,
function (success) {
$this.isUploading = false
$this.progress = 0
},
function(error) {
console.log('error', error)
},
function (event) {
$this.progress = event.detail.progress
}
)
}
}
}
</script>
</div>
Here is my component :
<?php
namespace App\Livewire\Wineo\Dossier;
use App\Models\DossierDocumentModel;
use App\Models\DossierModel;
use Livewire\Component;
use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
use Livewire\WithFileUploads;
use Livewire\Attributes\Rule;
use Illuminate\Support\Str;
use Livewire\Attributes\Computed;
class DocumentsAdd extends Component
{
use WithFileUploads;
public DossierModel $dossier;
#[Rule(['files.*'=>'file|required|max:30000'])]
public $files = [];
#[Computed]
public function uploadedFiles()
{
return (new DossierDocumentModel())->files($this->dossier);
}
public function updatedFiles()
{
$insert = [];
foreach ($this->files as $file) {
$uuid = Str::uuid();
$file->storeAs(path: $this->dossier->reference(), options: 'dossier', name: Str::lower(sprintf('%s.%s', $uuid, pathinfo($file->getClientOriginalName(), PATHINFO_EXTENSION))));
$item = [
'id' => $uuid,
'dossier_id' => $this->dossier->id,
'name' => basename($file->getClientOriginalName()),
'reference' => Str::slug(basename($file->getClientOriginalName()), '-'),
'fileSize' => $file->getSize(),
'mimeType' => $file->getMimeType() ?? null,
'extension' => $file->getClientOriginalExtension() ?? null,
];
$insert[] = $item;
$file->delete();
}
DossierDocumentModel::insert($insert);
}
public function render()
{
return view('livewire.wineo.dossier.documents-add');
}
}
It works, but files are saved twice and I don't know why.