{"version":3,"file":"verben-workflow-ui-src-lib-components-file-upload.mjs","sources":["../../../projects/verben-workflow-ui/src/lib/components/file-upload/file-upload.component.ts","../../../projects/verben-workflow-ui/src/lib/components/file-upload/file-upload.component.html","../../../projects/verben-workflow-ui/src/lib/components/file-upload/file-upload.module.ts","../../../projects/verben-workflow-ui/src/lib/components/file-upload/verben-workflow-ui-src-lib-components-file-upload.ts"],"sourcesContent":["import {\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  Output,\n  ViewChild,\n  NgZone,\n} from '@angular/core';\n\n@Component({\n  selector: 'file-upload',\n  templateUrl: './file-upload.component.html',\n  styleUrls: ['./file-upload.component.css'],\n})\nexport class FileUploadComponent {\n  @Input() multiple = false;\n  @Input() label = '';\n  @Input() accept = '';\n  @Input() selectedFiles: File[] = [];\n  @Input() disabled = false;\n  @Output() selectedFilesChange = new EventEmitter<File[]>();\n  @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n\n  readonly MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB\n\n  constructor(private zone: NgZone) {}\n\n  onFileSelected(event: any): void {\n    if (this.disabled) return;\n    const files = Array.from(event.target.files) as File[];\n    this.processFiles(files);\n  }\n\n  onDrop(event: DragEvent): void {\n    if (this.disabled) return;\n    event.preventDefault();\n    if (event.dataTransfer?.files) {\n      const files = Array.from(event.dataTransfer.files);\n      this.processFiles(files);\n    }\n  }\n\n  onDragOver(event: DragEvent): void {\n    if (this.disabled) return;\n    event.preventDefault();\n  }\n\n  processFiles(files: File[]): void {\n    for (const file of files) {\n      if (file.size > this.MAX_FILE_SIZE) {\n        alert(\n          `The file \"${file.name}\" is too large. Maximum size allowed is 5MB.`,\n        );\n        return;\n      }\n    }\n\n    if (this.multiple) {\n      this.selectedFiles = [...this.selectedFiles, ...files];\n    } else {\n      this.selectedFiles = [files[0]];\n    }\n\n    // ✅ ensure Angular detects the update\n    this.zone.run(() => {\n      this.selectedFilesChange.emit(this.selectedFiles);\n    });\n  }\n\n  removeFile(index: number): void {\n    if (this.disabled) return;\n    this.selectedFiles = this.selectedFiles.filter((_, i) => i !== index);\n\n    this.zone.run(() => {\n      this.selectedFilesChange.emit(this.selectedFiles);\n    });\n\n    if (this.fileInput) {\n      this.fileInput.nativeElement.value = '';\n    }\n  }\n\n  trackByFile(index: number, file: File) {\n    return file.name; // or file.id if available\n  }\n}\n","<div\n  class=\"file-upload-container\"\n  (dragover)=\"onDragOver($event)\"\n  (drop)=\"onDrop($event)\"\n>\n  <label>{{ label }}</label>\n\n  <!-- Selected files -->\n  <div\n    class=\"py-6 px-3 border rounded-lg flex gap-2 flex-wrap border-[#9A9FBF66] mt-2 mb-3\"\n  >\n    <ng-container\n      *ngFor=\"let file of selectedFiles; let i = index; trackBy: trackByFile\"\n    >\n      <verben-file-render\n        [fileUrl]=\"file.name\"\n        [multiple]=\"multiple\"\n        [disabled]=\"disabled\"\n        [showCancel]=\"true\"\n        (onCancelClicked)=\"removeFile(i)\"\n      ></verben-file-render>\n    </ng-container>\n    <!-- <span \n      class=\"flex items-center gap-1 bg-[#1A237E33] px-1 py-1 rounded-lg w-fit\" \n      *ngFor=\"let file of selectedFiles; let i = index\">\n      {{ file.name | slice:0:10 }}{{ file.name.length > 10 ? '...' : '' }}\n      <verben-svg \n        [stroke]=\"disabled ? '#9A9FBF' : (multiple ? '#D4A007' : '#0000FF')\" \n        [icon]=\"'close'\" \n        [width]=\"10\" \n        [height]=\"10\" \n        (click)=\"!disabled && removeFile(i)\">\n      </verben-svg>\n    </span> -->\n\n    <!-- Add File Button (only if multiple or empty for single) -->\n    <button\n      *ngIf=\"multiple || selectedFiles.length === 0\"\n      [disabled]=\"disabled\"\n      (click)=\"!disabled && fileInput.click()\"\n      [class.opacity-50]=\"disabled\"\n      [class.cursor-not-allowed]=\"disabled\"\n      class=\"flex items-center gap-1 bg-[#1A237E33] px-1 py-1 rounded-lg\"\n    >\n      <verben-svg [icon]=\"'plus'\" [width]=\"12\" [height]=\"12\"></verben-svg>\n      {{ multiple ? \"Add File\" : \"Browse File\" }}\n    </button>\n  </div>\n\n  <!-- Hidden input -->\n  <input\n    #fileInput\n    type=\"file\"\n    [accept]=\"accept\"\n    [multiple]=\"multiple\"\n    [disabled]=\"disabled\"\n    (change)=\"onFileSelected($event)\"\n    hidden\n  />\n\n  <!-- Drop Area -->\n  <div\n    class=\"drop-area border border-dashed w-full flex flex-col justify-center items-center border-[#9A9FBF66] p-4 rounded-lg bg-[#9a9fbf27] min-h-[200px]\"\n    (click)=\"!disabled && fileInput.click()\"\n  >\n    <verben-svg [icon]=\"'upload-icon'\" [width]=\"90\" [height]=\"90\"></verben-svg>\n    <p class=\"text-[#000000B2]\">Drag and drop files here</p>\n  </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport {\n  CardDataViewModule,\n  DataExportModule,\n  DataTableModule,\n  DataViewModule,\n  DropDownModule,\n  SortTableModule,\n  SvgModule,\n  TableFilterModule,\n  VerbenaButtonModule,\n  VerbenaInputModule,\n} from 'verben-ng-ui';\nimport { FileUploadComponent } from './file-upload.component';\nimport { FileRenderModule } from 'verben-workflow-ui/src/lib/components/file-render';\n\n@NgModule({\n  declarations: [FileUploadComponent],\n  imports: [\n    CommonModule,\n    FormsModule,\n    ReactiveFormsModule,\n    DataTableModule,\n    SvgModule,\n    FileRenderModule,\n    DataViewModule,\n    VerbenaButtonModule,\n    CardDataViewModule,\n    DropDownModule,\n    TableFilterModule,\n    SortTableModule,\n    DataExportModule,\n    VerbenaInputModule,\n  ],\n  exports: [FileUploadComponent],\n})\nexport class FileUploadModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;MAea,mBAAmB,CAAA;AAWV,IAAA,IAAA,CAAA;IAVX,QAAQ,GAAG,KAAK,CAAC;IACjB,KAAK,GAAG,EAAE,CAAC;IACX,MAAM,GAAG,EAAE,CAAC;IACZ,aAAa,GAAW,EAAE,CAAC;IAC3B,QAAQ,GAAG,KAAK,CAAC;AAChB,IAAA,mBAAmB,GAAG,IAAI,YAAY,EAAU,CAAC;AACnC,IAAA,SAAS,CAAgC;IAExD,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzC,IAAA,WAAA,CAAoB,IAAY,EAAA;QAAZ,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;KAAI;AAEpC,IAAA,cAAc,CAAC,KAAU,EAAA;QACvB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;AAC1B,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAW,CAAC;AACvD,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,MAAM,CAAC,KAAgB,EAAA;QACrB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,KAAK,CAAC,cAAc,EAAE,CAAC;AACvB,QAAA,IAAI,KAAK,CAAC,YAAY,EAAE,KAAK,EAAE;AAC7B,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AACnD,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;SAC1B;KACF;AAED,IAAA,UAAU,CAAC,KAAgB,EAAA;QACzB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,KAAK,CAAC,cAAc,EAAE,CAAC;KACxB;AAED,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;AAClC,gBAAA,KAAK,CACH,CAAa,UAAA,EAAA,IAAI,CAAC,IAAI,CAAA,4CAAA,CAA8C,CACrE,CAAC;gBACF,OAAO;aACR;SACF;AAED,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,KAAK,CAAC,CAAC;SACxD;aAAM;YACL,IAAI,CAAC,aAAa,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACjC;;AAGD,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;YACjB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACpD,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;AAEtE,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;YACjB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACpD,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE,CAAC;SACzC;KACF;IAED,WAAW,CAAC,KAAa,EAAE,IAAU,EAAA;AACnC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC;KAClB;wGAtEU,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,8UCfhC,ixEAqEA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDtDa,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAL/B,SAAS;+BACE,aAAa,EAAA,QAAA,EAAA,ixEAAA,EAAA,CAAA;2EAKd,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBACG,MAAM,EAAA,CAAA;sBAAd,KAAK;gBACG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACI,mBAAmB,EAAA,CAAA;sBAA5B,MAAM;gBACiB,SAAS,EAAA,CAAA;sBAAhC,SAAS;uBAAC,WAAW,CAAA;;;MEiBX,gBAAgB,CAAA;wGAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;yGAAhB,gBAAgB,EAAA,YAAA,EAAA,CAnBZ,mBAAmB,CAAA,EAAA,OAAA,EAAA,CAEhC,YAAY;YACZ,WAAW;YACX,mBAAmB;YACnB,eAAe;YACf,SAAS;YACT,gBAAgB;YAChB,cAAc;YACd,mBAAmB;YACnB,kBAAkB;YAClB,cAAc;YACd,iBAAiB;YACjB,eAAe;YACf,gBAAgB;AAChB,YAAA,kBAAkB,aAEV,mBAAmB,CAAA,EAAA,CAAA,CAAA;AAElB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,YAjBzB,YAAY;YACZ,WAAW;YACX,mBAAmB;YACnB,eAAe;YACf,SAAS;YACT,gBAAgB;YAChB,cAAc;YACd,mBAAmB;YACnB,kBAAkB;YAClB,cAAc;YACd,iBAAiB;YACjB,eAAe;YACf,gBAAgB;YAChB,kBAAkB,CAAA,EAAA,CAAA,CAAA;;4FAIT,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBApB5B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,YAAY,EAAE,CAAC,mBAAmB,CAAC;AACnC,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,WAAW;wBACX,mBAAmB;wBACnB,eAAe;wBACf,SAAS;wBACT,gBAAgB;wBAChB,cAAc;wBACd,mBAAmB;wBACnB,kBAAkB;wBAClB,cAAc;wBACd,iBAAiB;wBACjB,eAAe;wBACf,gBAAgB;wBAChB,kBAAkB;AACnB,qBAAA;oBACD,OAAO,EAAE,CAAC,mBAAmB,CAAC;AAC/B,iBAAA,CAAA;;;ACtCD;;AAEG;;;;"}