MaMonza

file-upload.component.html

May 15th, 2025
511
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 4.11 KB | Source Code | 0 0
  1. <div class="m-auto p-4 max-w-sm">
  2.     <div class="flex flex-col border-2 border-dashed rounded-2xl p-6 text-center transition-all duration-200"
  3.         [class.bg-blue-50]="isDragging()" [class.border-blue-400]="isDragging()" [class.text-blue-600]="isDragging()"
  4.         (dragover)="onDragOver($event)" (dragleave)="onDragLeave($event)" (drop)="onDrop($event)">
  5.  
  6.         <fa-icon [icon]="cloudUpload" class="text-4xl text-blue-400"></fa-icon>
  7.  
  8.         <p class="text-xs mb-2">( {{ allowedExtensionsStr() }} )</p>
  9.  
  10.         <p class="text-gray-700">Trascina qui i file o</p>
  11.         <label class="text-blue-600 font-semibold underline cursor-pointer">
  12.             selezionali
  13.             <input type="file" class="hidden" multiple (change)="onFilesSelected($event)"
  14.                 [accept]="allowedExtensionsInputList()" />
  15.         </label>
  16.  
  17.         <button (click)="!isUploaded() ? uploadAll() : clearFiles()"
  18.             class="w-28 self-center mt-2 inline-flex items-center gap-2 text-white font-semibold py-2 px-4 rounded-lg shadow-md transition duration-300 disabled:opacity-50 disabled:cursor-not-allowed"
  19.             [ngClass]="{
  20.                  'bg-green-500 hover:bg-green-700': isUploaded(),
  21.                  'bg-blue-600 hover:bg-blue-700': !isUploaded()
  22.                }" [disabled]="!files().length">
  23.             @if(!isUploaded()){ <fa-icon [icon]="uploadIcon" />Carica }
  24.             @else { <fa-icon [icon]="clear" />Pulisci }
  25.         </button>
  26.  
  27.     </div>
  28. </div>
  29. <div class="px-4 mt-6 grid gap-4 grid-cols-1 sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4">
  30.  
  31.     @for(upload of files(); track upload.uuid) {
  32.  
  33.     <div class="bg-white border border-gray-200 rounded-xl shadow p-4 flex flex-col justify-between">
  34.         <div class="flex items-center gap-2 mb-3">
  35.  
  36.             @if(upload.status === 'done'){
  37.             <fa-icon [icon]="checkCircle" class="text-green-500 text-lg"></fa-icon>
  38.             }
  39.             @else if(upload.status === 'uploading'){
  40.             <fa-icon [icon]="spinner" class="text-blue-500 text-lg"></fa-icon>
  41.             }@else{
  42.             <fa-icon [icon]="fileAlt" class="text-gray-500 text-xl"></fa-icon>
  43.             }
  44.  
  45.             <div class="flex-1">
  46.                 <input [(ngModel)]="upload.baseName" (ngModelChange)="updateCustomName(upload)"
  47.                     (blur)="sanitizeBaseName(upload)"
  48.                     class="border-b border-gray-300 focus:border-blue-500 focus:outline-none w-full font-medium" />
  49.                 <div class="flex justify-between items-center">
  50.                     <span class="text-sm text-gray-500">{{ upload.extension }}</span>
  51.  
  52.                 </div>
  53.             </div>
  54.         </div>
  55.  
  56.         <div class="w-full h-2 bg-gray-200 rounded overflow-hidden mb-2">
  57.             <div class="h-full rounded bg-blue-500 transition-all duration-300" [style.width.%]="upload.progress"
  58.                 [ngClass]="{
  59.                  'bg-green-500': upload.status === 'done',
  60.                  'bg-red-500': upload.status === 'error'
  61.                }"></div>
  62.         </div>
  63.  
  64.         <div class="mb-2 flex items-center" [ngClass]="{
  65.                'justify-between' : upload.status === 'invalid'|| upload.status === 'error',
  66.                'justify-end' : upload.status !== 'invalid' && upload.status !== 'error'
  67.                }">
  68.  
  69.             @if(upload.status === 'invalid'|| upload.status === 'error'){
  70.             <div class="text-xs text-red-500">
  71.                 <fa-icon [icon]="exclTriangle"></fa-icon>
  72.                 {{ upload.errorMessage }}
  73.             </div>
  74.             }
  75.  
  76.             <button (click)="removeFile(upload)" class="cursor-pointer">
  77.                 <fa-icon [icon]="trash" class="mr-1" />
  78.             </button>
  79.         </div>
  80.  
  81.         <div class="flex items-center justify-center text-sm mt-auto pt-2 border-t border-gray-100">
  82.             @if(upload.status === 'error'){
  83.             <button (click)="uploadFile(upload)" class="text-blue-500 hover:underline">
  84.                 <fa-icon [icon]="uploadIcon" class="mr-1"></fa-icon>Riprova
  85.             </button>
  86.             }
  87.         </div>
  88.  
  89.     </div>
  90.  
  91.     }
  92. </div>
Advertisement
Add Comment
Please, Sign In to add comment