{"version":3,"file":"verben-ng-ui-src-lib-components-data-import.mjs","sources":["../../../projects/verben-ng-ui/src/lib/components/data-import/data-import.service.ts","../../../projects/verben-ng-ui/src/lib/components/data-import/data-import.component.ts","../../../projects/verben-ng-ui/src/lib/components/data-import/data-import.component.html","../../../projects/verben-ng-ui/src/lib/components/data-import/data-import.module.ts","../../../projects/verben-ng-ui/src/lib/components/data-import/verben-ng-ui-src-lib-components-data-import.ts"],"sourcesContent":["import { Injectable, signal, WritableSignal } from '@angular/core';\nimport { ColumnDefinition } from 'verben-ng-ui/src/lib/components/data-table';\nimport { read, utils, writeFile } from 'xlsx';\n\n@Injectable()\nexport class DataImportService<T> {\n  importedData: WritableSignal<T[]> = signal([]);\n\n  constructor() { }\n\n  // Function to transform imported data to match your model structure\n  transformImportData<T>(\n    importedData: Record<string, any>[],\n    columnDefinitions: ColumnDefinition<T>[]\n  ): Partial<T>[] {\n    // Create mappings from header to importKey and importBy\n    const headerToImportKeyMap = new Map<string, keyof T>();\n    const headerToImportByMap = new Map<\n      string,\n      keyof T | ((importedRow: any) => T[keyof T])\n    >();\n\n    // Filter column definitions to only those with importKey or importBy and populate the maps\n    columnDefinitions\n      .filter((col) => col.importKey || col.importBy)\n      .forEach((col) => {\n        const header =\n          typeof col.header === 'string'\n            ? col.header\n            : col.header({}).toString();\n\n        if (col.importKey) {\n          headerToImportKeyMap.set(header, col.importKey as keyof T);\n        }\n\n        if (col.importBy) {\n          headerToImportByMap.set(header, col.importBy);\n        }\n      });\n\n    // Transform each row in the imported data\n    return importedData.map((row) => {\n      const transformedRow: Partial<T> = {};\n\n      // Process each key in the row\n      Object.entries(row).forEach(([key, value]) => {\n        // Check if there's an importBy transformation first (takes priority)\n        const importBy = headerToImportByMap.get(key);\n\n        if (importBy) {\n          if (typeof importBy === 'function') {\n            // Use the importBy function to transform the entire imported row\n            const importKey = headerToImportKeyMap.get(key);\n            if (importKey) {\n              transformedRow[importKey] = importBy(row);\n            }\n          } else {\n            // importBy is a direct key reference\n            transformedRow[importBy] = value;\n          }\n        } else {\n          // Fall back to importKey if no importBy is defined\n          const importKey = headerToImportKeyMap.get(key);\n          if (importKey) {\n            transformedRow[importKey] = value;\n          }\n        }\n      });\n\n      return transformedRow;\n    });\n  }\n\n  handleImport(\n    file: File,\n    // previewer?: (data: any[]) => void,\n    columnDefinitions: ColumnDefinition<T>[],\n    parseImport?: (data: any) => Partial<T>[]\n  ) {\n    const reader = new FileReader();\n    reader.onload = (event: any) => {\n      // const wb = read(event.target.result, {\n      //   type: 'string',\n      //   raw: true,\n      //   cellText: true,\n      //   cellFormula: false,\n      //   cellNF: false,\n      // });\n      // console.time('Begin');\n      let imported: any[] = [];\n      const wb = read(event.target.result, { raw: true });\n      const sheets = wb.SheetNames;\n      if (sheets.length) {\n        const rows = utils.sheet_to_json(wb.Sheets[sheets[0]], {\n          raw: false,\n          // defval: '',\n          // rawNumbers: true,\n          // dateNF: 'dd/mm/yyyy',\n        }) as Record<string, any>[];\n\n        imported = this.transformImportData(rows, columnDefinitions) as T[];\n        // console.log('TRANSFORMED', imported);\n\n        if (parseImport) {\n          imported = parseImport(imported);\n          // console.log('PARSED', imported);\n        }\n        // previewer(imported);\n      }\n      // console.log('Imported data:', JSON.stringify(imported, null, 2));\n      // console.time('Start Process');\n      this.importedData.set(imported);\n      // console.timeEnd('Begin');\n      return imported;\n    };\n    return reader.readAsArrayBuffer(file);\n  }\n\n  handleTemplateExport(fields: string[], title: string) {\n    console.log(fields);\n    const wb = utils.book_new();\n    const ws: any = utils.json_to_sheet([]);\n    utils.sheet_add_aoa(ws, [fields]);\n    // utils.sheet_add_json(ws, this._data, { origin: 'A2', skipHeader: true });\n    utils.book_append_sheet(wb, ws, title);\n    writeFile(wb, title + '-template.' + 'xlsx');\n  }\n\n  addRow(event: { index: number; key: string | number; data: Partial<T> }) {\n    // console.log(event);\n    this.importedData.update((dat) => {\n      // dat[event.index] = { ...dat[event.index], ...event.data };\n      return dat.map((d, i) => {\n        if (i === event.index) {\n          return { ...d, ...event.data };\n        }\n        return d;\n      });\n    });\n    // console.log(this.importedData());\n  }\n\n  isDuplicate(datum: Partial<T>, array: Partial<T>[], identifiers: string[]) {\n    return (\n      array.filter(\n        (dat) =>\n          identifiers.length > 0 &&\n          identifiers.every(\n            (identifier) =>\n              datum[identifier as keyof T] &&\n              datum[identifier as keyof T] === dat[identifier as keyof T]\n          )\n      ).length > 1\n    );\n  }\n\n  clearData() {\n    this.importedData.set([]);\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  effect,\n  input,\n  output,\n  Signal,\n  signal,\n  WritableSignal,\n} from '@angular/core';\nimport {\n  AbstractControl,\n  FormArray,\n  FormGroup\n} from '@angular/forms';\nimport {\n  ColumnDefinition,\n  ColumnDirective,\n  FormGroupConfig,\n} from 'verben-ng-ui/src/lib/components/data-table';\nimport { DataImportService } from './data-import.service';\n\n@Component({\n  selector: 'lib-data-import',\n  templateUrl: './data-import.component.html',\n  styleUrl: './data-import.component.css',\n  providers: [DataImportService],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DataImportComponent<T extends {}> {\n  previewColumns = input.required<ColumnDefinition<T>[]>();\n  formGroupConfig = input<\n    FormGroupConfig<{\n      [K in keyof T]: AbstractControl;\n    }>\n  >();\n  /**\n   * @deprecated Use importKey of previewColumns instead\n   */\n  fields = input<string[]>();\n  title = input<string>('export-template');\n  columnTemplates = input<readonly ColumnDirective[]>([]);\n  parser = input<(data: any) => Partial<T>[]>();\n  /**\n   * @deprecated Please remove, now handled internally\n   */\n  previewData = input<T[]>();\n  /**\n   * Pass the method to use the imported data,\n   * and eventually returns true if successfully used\n   */\n  onImportComplete = input<(data: Partial<T>[]) => Promise<boolean>>();\n  /**\n   * @deprecated Please remove, now handled internally\n   */\n  exportTemplateEvent = output<string[]>();\n  /**\n   * @deprecated Please remove, now handled internally\n   */\n  importEvent = output<File>();\n  /**\n   * @deprecated Use the onImportComplete input instead\n   */\n  importEventData = output<Partial<T>[]>();\n  /**\n   * @deprecated Please remove, now handled internally\n   */\n  rowSave = output<{\n    index: number;\n    key: number | string;\n    data: Partial<T>;\n  }>();\n\n  // data: Signal<(T & { isDuplicate: boolean })[]>;\n  previewColumnsList: Signal<ColumnDefinition<T>[]>;\n  forms = new FormArray<FormGroup>([]);\n  uniqueIdentifiers: WritableSignal<string[]> = signal([]);\n  // duplicateDataMap: Map<string, number> = new Map();\n  duplicateIndexSet = new Set<number>();\n  invalidIndexSet = new Map<number, ColumnDirective['columnId'][]>();\n\n  headers: Signal<string[]>;\n\n  private _ext: 'xlsx' | 'xls' | 'csv' = 'xlsx';\n\n  files: File[] = [];\n  isDragging = false;\n  showPreview = false;\n\n  constructor(public service: DataImportService<T>) {\n    effect(() => {\n      // const columns = this.previewColumnsList();\n\n      const identifiers = this.uniqueIdentifiers();\n\n      this.service.importedData()?.forEach((d, i, arr) => {\n        if (service.isDuplicate(d, arr, identifiers)) {\n          this.duplicateIndexSet.add(i);\n        }\n\n        // columns\n        //   .filter(({ validatorFn }) => validatorFn !== undefined)\n        //   .forEach((column) => {\n        //     const invalidFields = Object.entries(d).reduce<string[]>(\n        //       (f, [k, v], i) => {\n        //         if (\n        //           column.validatorFn &&\n        //           !column.validatorFn(v as T[keyof T])\n        //         ) {\n        //           f.push(column.id);\n        //         }\n        //         return f;\n        //       },\n        //       []\n        //     );\n\n        //     if (invalidFields.length > 0) {\n        //       this.invalidIndexSet.set(i, invalidFields);\n        //     }\n        //   });\n      });\n    });\n\n    this.previewColumnsList = computed(() => {\n      return this.previewColumns()\n        .filter((col) => col.importKey || col.importBy || col.formControlName)\n        .map((column) => {\n          const matchingTemplate = this.columnTemplates().find(\n            (t) => t.columnId === column.id\n          );\n          if (matchingTemplate) {\n            return {\n              ...column,\n              // accessorKey: column.importKey,\n              cellTemplate: matchingTemplate.cellTemplate,\n              cellEditTemplate: matchingTemplate.cellEditTemplate,\n              headerTemplate: matchingTemplate.headerTemplate,\n              footerTemplate: matchingTemplate.footerTemplate,\n            };\n          }\n          return column;\n        })\n        .concat([\n          {\n            id: 'actions',\n            header: 'Actions',\n          },\n        ]);\n    });\n\n    this.headers = computed(() => {\n      return (\n        this.fields() ??\n        this.previewColumnsList()\n          .filter((col) => col.importKey || col.importBy)\n          .map((col) => col.header.toString())\n      );\n    });\n  }\n\n  onDragOver(event: DragEvent) {\n    event.preventDefault();\n    this.isDragging = true;\n  }\n\n  onDragLeave(event: DragEvent) {\n    event.preventDefault();\n    this.isDragging = false;\n  }\n\n  onDrop(event: DragEvent) {\n    event.preventDefault();\n    this.isDragging = false;\n    this.files = Array.from(event.dataTransfer!.files);\n\n    this.service.handleImport(\n      this.files[0],\n      this.previewColumnsList(),\n      this.parser()\n    );\n    // this.importEvent.emit(this.files[0]);\n    this.showPreview = true;\n  }\n\n  onFileSelected(event: any) {\n    this.files = Array.from(event.target.files);\n    this.service.handleImport(\n      this.files[0],\n      this.previewColumnsList(),\n      this.parser()\n    );\n\n    event.target.value = '';\n\n    // this.importEvent.emit(this.files[0]);\n    this.showPreview = true;\n  }\n\n  reset() {\n    this.files = [];\n    this.showPreview = false;\n    this.service.clearData();\n  }\n\n  save() {\n    // console.log('PREVDATA', this.service.importedData());\n    const onComplete = this.onImportComplete();\n    if (onComplete) {\n      onComplete(this.service.importedData()).then((success) => {\n        if (success) {\n          this.showPreview = false;\n        }\n      });\n    } else {\n      this.importEventData.emit(this.service.importedData() || []);\n      this.showPreview = false;\n    }\n  }\n\n  getControlNames() {\n    const controls = this.formGroupConfig()?.controls;\n    if (controls) {\n      return Object.keys(controls);\n    }\n    return [];\n  }\n\n  handleTemplateExport() {\n    this.service.handleTemplateExport(this.headers(), this.title());\n    // this.exportTemplateEvent.emit(this.headers());\n  }\n\n  // getFormControl(index: number, field: string) {\n  //   const control = this..get(index)?.get(field) as FormControl<any>;\n  //   console.log(control);\n  //   return control;\n  // }\n}\n","<verben-card\n  width=\"24rem\"\n  borderRadius=\"1rem\"\n  [border]=\"'1px solid #D4A007'\"\n  bgColor=\"#FFFFFF\"\n  class=\"export-card\"\n>\n  <div card-header class=\"card-header\">\n    <h4 class=\"header-title\">Import</h4>\n    <button\n      class=\"reset-button\"\n      [style.color]=\"'#3479E9'\"\n      [style.background-color]=\"'transparent'\"\n      [style.border]=\"'none'\"\n      [style.cursor]=\"'pointer'\"\n      [style.font-size]=\"'12px'\"\n      (click)=\"reset()\"\n    >\n      Reset\n    </button>\n  </div>\n  <div card-body class=\"card-body\">\n    <div class=\"flex gap-4 justify-between\">\n      <button class=\"export-button\" (click)=\"handleTemplateExport()\">\n        Download Template\n      </button>\n      <label for=\"fileInput\" class=\"export-button\">Upload File</label>\n    </div>\n    <hr class=\"divider\" />\n    <section class=\"section\">\n      <div\n        class=\"drop-area\"\n        (dragover)=\"onDragOver($event)\"\n        (dragleave)=\"onDragLeave($event)\"\n        (drop)=\"onDrop($event)\"\n      >\n        <p>\n          Drag and drop files here or\n          <label for=\"fileInput\" [style.color]=\"'#3479E9'\"\n            >click to browse</label\n          >\n        </p>\n        <input\n          type=\"file\"\n          id=\"fileInput\"\n          (change)=\"onFileSelected($event)\"\n          style=\"display: none\"\n          accept=\".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\n          multiple\n        />\n      </div>\n      <div *ngIf=\"files.length > 0\">\n        <h3>Uploaded Files:</h3>\n        <ul>\n          <li *ngFor=\"let file of files\">{{ file.name }}</li>\n        </ul>\n      </div>\n    </section>\n  </div>\n  <div card-footer class=\"card-footer\">\n    <button\n      [disabled]=\"service.importedData().length < 1\"\n      class=\"export-button\"\n      (click)=\"save()\"\n    >\n      Import\n    </button>\n  </div>\n</verben-card>\n\n<!-- Modal Component -->\n<verben-dialogue\n  [showCloseIcon]=\"true\"\n  [dismissOutsideClick]=\"true\"\n  [closeOnEscape]=\"true\"\n  [size]=\"'large'\"\n  [mode]=\"'dialogue'\"\n  [customClass]=\"'my-modal-custom-class'\"\n  [disableFooter]=\"false\"\n  [modalData]=\"[{ data: {} }]\"\n  [isVisible]=\"showPreview\"\n  [headerTemplate]=\"headerTemplate\"\n  [bodyTemplate]=\"bodyTemplate\"\n  [footerTemplate]=\"footerTemplate\"\n  dialogueWidth=\"85%\"\n>\n  <a download=\"\"></a>\n</verben-dialogue>\n\n<!-- Define templates -->\n<ng-template #headerTemplate>\n  <h2>Upload Preview</h2>\n</ng-template>\n\n<ng-template #bodyTemplate>\n  <div class=\"flex gap-4 items-center justify-between my-4\">\n    <p class=\"\">Total Items: {{ service.importedData().length }}</p>\n\n    <p class=\"\">Duplicates: {{ duplicateIndexSet.size }}</p>\n\n    <p class=\"\">Invalid Items: {{ invalidIndexSet.size }}</p>\n\n    <verben-drop-down\n      [multiselect]=\"true\"\n      placeholder=\"Find duplicates by\"\n      [options]=\"headers()\"\n      [ngModel]=\"uniqueIdentifiers()\"\n      (ngModelChange)=\"uniqueIdentifiers.set($event)\"\n    ></verben-drop-down>\n  </div>\n  <div style=\"max-height: min(75vh, 780px); overflow: auto\">\n    <lib-data-table\n      [data]=\"service.importedData()\"\n      [columns]=\"previewColumnsList()\"\n      [formGroupConfig]=\"formGroupConfig()\"\n      [useVirtualScroll]=\"true\"\n      (rowSave)=\"service.addRow($event)\"\n    >\n      <ng-container libColumn=\"actions\">\n        <ng-template\n          #cell\n          let-value\n          let-deleteRow=\"deleteRow\"\n          let-isEditing=\"isEditing\"\n          let-toggleRowEdit=\"toggleRowEdit\"\n          let-row=\"row\"\n          let-rowIndex=\"rowIndex\"\n        >\n          <div class=\"flex action-buttons\">\n            <verben-svg\n              (click)=\"toggleRowEdit()\"\n              icon=\"edit\"\n              [width]=\"15\"\n              [height]=\"15\"\n              class=\"cursor-pointer\"\n            ></verben-svg>\n\n            <verben-svg\n              icon=\"delete\"\n              [width]=\"15\"\n              [height]=\"15\"\n              (click)=\"deleteRow()\"\n              class=\"cursor-pointer\"\n            ></verben-svg>\n          </div>\n        </ng-template>\n\n        <ng-template\n          #cellEdit\n          let-value\n          let-deleteRow=\"deleteRow\"\n          let-isEditing=\"isEditing\"\n          let-toggleRowEdit=\"toggleRowEdit\"\n          let-row=\"row\"\n          let-rowIndex=\"rowIndex\"\n        >\n          <div class=\"flex action-buttons\">\n            <verben-svg\n              (click)=\"toggleRowEdit()\"\n              icon=\"tick\"\n              [width]=\"15\"\n              [height]=\"15\"\n              class=\"cursor-pointer\"\n            ></verben-svg>\n\n            <verben-svg\n              icon=\"delete\"\n              [width]=\"15\"\n              [height]=\"15\"\n              (click)=\"deleteRow()\"\n              class=\"cursor-pointer\"\n            ></verben-svg>\n          </div>\n        </ng-template>\n      </ng-container>\n    </lib-data-table>\n  </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n  <div class=\"footer-buttons flex gap-4 items-center justify-between my-4\">\n    <button\n      class=\"btn btn-secondary cancel-button\"\n      (click)=\"showPreview = false\"\n    >\n      Cancel\n    </button>\n    <button class=\"btn btn-primary export-button\" (click)=\"save()\">\n      Complete\n    </button>\n  </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DataImportComponent } from './data-import.component';\nimport { CardModule } from 'verben-ng-ui/src/lib/components/card';\nimport { VerbenDialogueModule } from 'verben-ng-ui/src/lib/components/verben-dialogue';\nimport { DataTableModule } from 'verben-ng-ui/src/lib/components/data-table';\nimport { VerbenaInputModule } from 'verben-ng-ui/src/lib/verbena-input';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { SvgModule } from 'verben-ng-ui/src/lib/components/svg';\nimport { DropDownModule } from 'verben-ng-ui/src/lib/components/drop-down';\n\n@NgModule({\n  declarations: [DataImportComponent],\n  imports: [\n    CommonModule,\n    CardModule,\n    VerbenDialogueModule,\n    DataTableModule,\n    VerbenaInputModule,\n    DropDownModule,\n    ReactiveFormsModule,\n    FormsModule,\n    SvgModule,\n  ],\n  exports: [DataImportComponent],\n})\nexport class DataImportModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.DataImportService"],"mappings":"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"}