{"version":3,"file":"obliczeniowo-elementary-files.mjs","sources":["../../../../projects/components/files/directives/drag-and-drop.directive.ts","../../../../projects/components/files/files.module.ts","../../../../projects/components/files/services/obl-file.service.ts","../../../../projects/components/files/services/json-file-system.service.ts","../../../../projects/components/files/classes/csv.ts","../../../../projects/components/files/obliczeniowo-elementary-files.ts"],"sourcesContent":["import {\r\n  Directive,\r\n  HostBinding,\r\n  HostListener,\r\n  Output,\r\n  EventEmitter,\r\n  ElementRef,\r\n  Input,\r\n  input\r\n} from '@angular/core';\r\n\r\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\r\n\r\nexport interface FileHandle {\r\n  file: File;\r\n  url: SafeUrl;\r\n}\r\n\r\nexport interface DragHandle {\r\n  files: FileHandle[];\r\n  evt: DragEvent;\r\n}\r\n\r\n@Directive({\r\n    selector: '[oblDragAndDrop]',\r\n    standalone: false\r\n})\r\nexport class DragAndDropDirective {\r\n  /**\r\n   * Change background color\r\n   */\r\n  @Input()\r\n  @HostBinding('style.background') background: string = '#eee';\r\n\r\n  /**\r\n   * highlight when drag over\r\n   */\r\n  highlightColor = input<string>();\r\n\r\n  /**\r\n   * leave color\r\n   */\r\n  leaveColor = input<string>('#ffffff');\r\n\r\n  /**\r\n   * Emit DragHandle class object\r\n   */\r\n  @Output() files: EventEmitter<DragHandle> = new EventEmitter<DragHandle>();\r\n\r\n  constructor(private readonly sanitizer: DomSanitizer, private readonly elementRef: ElementRef) { }\r\n\r\n  @HostListener('mouseenter') onMouseEnter(): void {\r\n    this.highlight(this.highlightColor());\r\n  }\r\n\r\n  @HostListener('mouseleave') onMouseLeave(): void {\r\n    this.highlight(undefined);\r\n  }\r\n\r\n  private highlight(color?: string): void {\r\n    this.elementRef.nativeElement.style.backgroundColor = color || this.leaveColor();\r\n  }\r\n\r\n  @HostListener('dragover', ['$event']) public onDragOver(evt: DragEvent): void {\r\n    evt.preventDefault();\r\n    evt.stopPropagation();\r\n    this.background = '#999';\r\n  }\r\n\r\n  @HostListener('dragleave', ['$event']) public onDragLeave(evt: DragEvent): void {\r\n    evt.preventDefault();\r\n    evt.stopPropagation();\r\n    this.background = '#eee';\r\n  }\r\n\r\n  @HostListener('drop', ['$event']) public onDrop(evt: DragEvent): void {\r\n    evt.preventDefault();\r\n    evt.stopPropagation();\r\n    this.background = '#eee';\r\n\r\n    const files: FileHandle[] = [];\r\n    if (evt.dataTransfer) {\r\n      for (let i = 0; i < evt.dataTransfer.files.length; i++) {\r\n        const file = evt.dataTransfer.files[i];\r\n        const url = this.sanitizer.bypassSecurityTrustUrl(window.URL.createObjectURL(file));\r\n        files.push({ file, url });\r\n      }\r\n    }\r\n    if (files.length > 0) {\r\n      this.files.emit({ files, evt });\r\n    }\r\n  }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DragAndDropDirective } from './directives/drag-and-drop.directive';\r\n\r\n@NgModule({\r\n  declarations: [\r\n    DragAndDropDirective\r\n  ],\r\n  imports: [\r\n    CommonModule\r\n  ],\r\n  exports: [\r\n    DragAndDropDirective\r\n  ]\r\n})\r\nexport class FilesModule { }\r\n","/* eslint-disable @typescript-eslint/no-unsafe-argument */\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { Inject, Injectable } from '@angular/core';\r\n\r\nexport type TextType = 'text/css' | 'text/csv' | 'text/json' | 'text/html' | 'text/javascript' | 'application/javascript' | 'application/json'\r\n  | 'text/plain' | 'text/html' | 'image/svg+xml' | 'text/*';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class OblFileService {\r\n  constructor(\r\n    @Inject(DOCUMENT) private readonly document: Document,\r\n  ) { }\r\n\r\n  readTextFile(): Promise<string> {\r\n    return this.readFile('text');\r\n  }\r\n\r\n  readFileAsDataUrl(): Promise<string> {\r\n    return this.readFile('DataURL');\r\n  }\r\n\r\n  readFileAsArrayBuffer(): Promise<ArrayBuffer> {\r\n    return this.readFile('ArrayBuffer');\r\n  }\r\n\r\n  loadJsonFile(url: string) {\r\n    return fetch(url).then(resp => resp.json());\r\n  }\r\n\r\n  /**\r\n   * Let you save text file on user device\r\n   * @param text - text to save\r\n   * @param textType - default text/plain\r\n   */\r\n  saveTextFile(\r\n    text: string,\r\n    fileName: string,\r\n    textType: TextType = 'text/plain'\r\n  ): void {\r\n    const file = new window.Blob([text], { type: textType });\r\n\r\n    this.saveBlobFile(file, fileName);\r\n  }\r\n\r\n  /**\r\n   * Svg save file\r\n   * @param svgContent\r\n   * @param fileName\r\n   */\r\n  saveSvgFile(\r\n    svgContent: string,\r\n    fileName: string\r\n  ): void {\r\n    this.saveTextFile(svgContent, fileName, 'image/svg+xml')\r\n  }\r\n\r\n  /**\r\n   * saving blob file\r\n   */\r\n  saveBlobFile(blob: Blob, fileName: string): void {\r\n    const downloadAnchor = document.createElement('a');\r\n    const fileURL = URL.createObjectURL(blob);\r\n\r\n    downloadAnchor.href = fileURL;\r\n    downloadAnchor.download = fileName;\r\n    downloadAnchor.click();\r\n  }\r\n\r\n  /**\r\n   * Create HTMLImageElement with loaded image as Promise\r\n   */\r\n  getImageFromUrl(url: string): Promise<HTMLImageElement> {\r\n    return new Promise((resolve, _reject) => {\r\n      const image: HTMLImageElement = document.createElement('img') as HTMLImageElement;\r\n\r\n      image.onload = () => {\r\n        resolve(image);\r\n      };\r\n\r\n      image.src = url;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Reading file from user device\r\n   * @param type - file type\r\n   * @returns file\r\n   */\r\n  protected async readFile(type: 'text' | 'DataURL' | 'ArrayBuffer'): Promise<any> {\r\n    return await new Promise((resolve, reject) => {\r\n      const input = this.document.createElement('input');\r\n      input.type = 'file';\r\n      input.addEventListener('change', (event: any) => {\r\n        const reader = new FileReader();\r\n        reader.onload = (e: any) => {\r\n          resolve(e.target.result);\r\n        };\r\n        switch (type) {\r\n          case 'text':\r\n            reader.readAsText(event.target.files[0]);\r\n            break;\r\n          case 'DataURL':\r\n            reader.readAsDataURL(event.target.files[0]);\r\n            break;\r\n          case 'ArrayBuffer':\r\n            reader.readAsArrayBuffer(event.target.files[0]);\r\n            break;\r\n          default:\r\n            reject(new Error('Undefined type'));\r\n        }\r\n      });\r\n      input.click();\r\n    });\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { SystemResource } from '../models/system-resources.model';\r\nimport { SystemResourceType } from '../types/system-resource.type';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class JsonFileSystemService {\r\n  /**\r\n   * Maximum size of file as json string\r\n   */\r\n  protected maxSize = 300000;\r\n\r\n  /**\r\n   * field name\r\n   */\r\n  protected readonly resourcesField = 'systemResources';\r\n\r\n  /**\r\n   * Table of folders/files recovered from localeStorage\r\n   */\r\n  systemResources: SystemResource[] = [];\r\n\r\n  constructor() {\r\n    const localStorageResource = localStorage.getItem(this.resourcesField);\r\n\r\n    if (localStorageResource) {\r\n      this.systemResources = JSON.parse(localStorageResource);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Saving to localStorage\r\n   */\r\n  protected save(): void {\r\n    localStorage.setItem(this.resourcesField, JSON.stringify(this.systemResources));\r\n  }\r\n\r\n  /**\r\n   * Check if resource can be added\r\n   * @param name name of resource file or folder\r\n   * @param path path to resource\r\n   * @param type type of resource: {@link SystemResourceType}\r\n   * @param data data storage in resource required for files\r\n   * @returns true if can be added, false if can't\r\n   */\r\n  checkResource(\r\n    name: string,\r\n    path = 'desktop',\r\n    type: SystemResourceType = 'folder',\r\n    // tslint:disable-next-line: ban-types\r\n    data?: Object\r\n  ): boolean {\r\n    const find = this.systemResources.find(resource => resource.path === path &&\r\n      resource.name === name &&\r\n      resource.type === type\r\n    );\r\n\r\n    const findParent = path !== 'desktop' && this.systemResources.find(resource => resource.path) || true;\r\n\r\n    if (find || !findParent || !data && type === 'file') {\r\n      return false;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Adding folder resource and update localStorage\r\n   * @param name name of folder\r\n   * @param path path to folder that contains resource\r\n   * @param params external params\r\n   * @returns true if added, or false fail\r\n   */\r\n  addFolder(\r\n    name: string,\r\n    path = 'desktop',\r\n    params?: {\r\n      x?: number,\r\n      y?: number\r\n    }\r\n  ): boolean {\r\n    if (!this.checkResource(name, path)) {\r\n      return false;\r\n    }\r\n\r\n    this.systemResources.push({\r\n      type: 'folder',\r\n      name,\r\n      path,\r\n      x: params?.x || 0,\r\n      y: params?.y || 0\r\n    });\r\n\r\n    this.save();\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Adding the file to system and update localStorage\r\n   * @param name name of file\r\n   * @param data required data of file\r\n   * @param appName name of app that will open this file\r\n   * @param path path to folder\r\n   * @param params optional parameters\r\n   * @returns true if added, false other way\r\n   */\r\n  addFile(\r\n    name: string,\r\n    // tslint:disable-next-line: ban-types\r\n    data: Object,\r\n    appName: string,\r\n    path: string = 'desktop',\r\n    params?: {\r\n      x?: number,\r\n      y?: number\r\n    }\r\n  ): boolean {\r\n    if (!this.checkResource(name, path, 'file', data)) {\r\n      return false;\r\n    }\r\n\r\n    const strData = JSON.stringify(data);\r\n\r\n    if (strData.length > this.maxSize) {\r\n      return false;\r\n    }\r\n\r\n    this.systemResources.push(\r\n      {\r\n        name,\r\n        data,\r\n        path,\r\n        appName,\r\n        type: 'file',\r\n        x: params?.x || 0,\r\n        y: params?.y || 0\r\n      }\r\n    );\r\n\r\n    this.save();\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Return all resources in chosen path\r\n   * @param path path to resources folder\r\n   * @returns return resources storage in folder\r\n   */\r\n  getResources(path: string = 'desktop'): SystemResource[] {\r\n    return this.systemResources.filter(resource => resource.path === path);\r\n  }\r\n\r\n  /**\r\n   * Return folder from specific path\r\n   */\r\n  getFolder(path: string): false | SystemResource {\r\n    const found = this.systemResources.find(resource => resource.name === path);\r\n\r\n    return found || false;\r\n  }\r\n\r\n  /**\r\n   * Check if resource can be updated and if so update it\r\n   * @param resource resource to update\r\n   */\r\n  update(resource: SystemResource, newName?: string): void {\r\n    const index = this.systemResources.findIndex(\r\n      res => res.path === resource.path && res.name === resource.name && res.type === resource.type);\r\n\r\n    if (\r\n      index !== -1 &&\r\n      !this.systemResources.find(\r\n        (item, i) => item.path === resource.path &&\r\n          item.type === resource.type &&\r\n          item.name === newName &&\r\n          i !== index\r\n      )\r\n    ) {\r\n      if (newName) {\r\n        resource.name = newName;\r\n      }\r\n      this.systemResources[index] = resource;\r\n      this.save();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check if folder path exist\r\n   */\r\n  pathFolderExist(path: string): boolean {\r\n    if (path === 'desktop') {\r\n      return true;\r\n    }\r\n    const folders = path.split('/');\r\n    if (folders.length === 1) {\r\n      return false;\r\n    }\r\n    const name = folders.pop();\r\n    path = folders.join('/');\r\n\r\n    return !!this.systemResources.find(item => item.path === path && name === item.name);\r\n  }\r\n\r\n  /**\r\n   * Delete\r\n   */\r\n  delete(resource: SystemResource, saving = true): void {\r\n    if (resource.type === 'folder') {\r\n      this.getResources(resource.path + '/' + resource.name).forEach(\r\n        res => this.delete(res, false)\r\n      );\r\n    }\r\n    this.systemResources = this.systemResources.filter(res => !(res.name === resource.name &&\r\n      res.type === resource.type &&\r\n      res.path === resource.path)\r\n    );\r\n\r\n    if (saving) {\r\n      this.save();\r\n    }\r\n  }\r\n}\r\n","import { ElementaryMath } from '@obliczeniowo/elementary/math';\r\n\r\nexport class Csv {\r\n  /**\r\n   * Static constructor that create Csv object from array\r\n   * @param array array to convert to Csv object\r\n   * @returns Csv object\r\n   */\r\n  static fromArray(\r\n    array: (number | string | { [key: string]: any })[][],\r\n    headers?: (number | string)[]\r\n  ): Csv {\r\n    const csv = new Csv(!!headers?.length);\r\n\r\n    array.forEach((row) => {\r\n      row.forEach((ceil, pos) => {\r\n        const name = headers?.length && headers[pos] || pos\r\n        csv.table.set(name, [...(csv.table.get(name) || []), ceil])\r\n      })\r\n    })\r\n\r\n    return csv;\r\n  }\r\n\r\n  /**\r\n   * Map object of columns containing array of values.\r\n   *\r\n   * By default system is parsing values to number or live as string. You can use columnParse field\r\n   * to parse to any type you wanted (data, pare by JSON, or any other object)\r\n   */\r\n  table = new Map<string | number, (string | number | any)[]>();\r\n\r\n  /**\r\n   * errors to throw:\r\n   * columns - if true throw error if number of columns is not equal in every row\r\n   * headerNotAString - throw error when one of headers fields is not a string\r\n   * empty - throw error when file contain empty string\r\n   * columnParse - error when column contain improper format\r\n   *\r\n   * @example\r\n   *\r\n   * const file = await this.file.readTextFile();\r\n   *\r\n   * const csv = new Csv();\r\n   *\r\n   * csv.throwing.columnsParse['age'] = (value: string) => {\r\n   *   if (!ElementaryMath.isNumeric(value, true)) {\r\n   *     throw new Error(`Some value in \"col 2\" is not a number: \"${value}\"`);\r\n   *   }\r\n   * };\r\n   *\r\n   * csv.throwing.columnsParse['zip'] = (value: string) => {\r\n   *   if (!ElementaryMath.isNumeric(value, true)) {\r\n   *     throw new Error(`Some value in \"zip\" is not a number: \"${value}\"`);\r\n   *   }\r\n   *\r\n   *   if (!/^[0-9]{5,5}$/.test(value)) {\r\n   *     throw new Error(`Some value in \"zip\" have not 5 digits: \"${value}\"`);\r\n   *   }\r\n   * }\r\n   *\r\n   * csv.parse(file, true);\r\n   *\r\n   * console.log(csv.table);\r\n   */\r\n  throwing: {\r\n    columns?: boolean,\r\n    headerNotAString?: boolean,\r\n    empty?: boolean,\r\n    columnsParse: { [key: string]: ((value: string) => void) },\r\n  } = {\r\n      columns: true,\r\n      headerNotAString: false,\r\n      empty: true,\r\n      columnsParse: {}\r\n    }\r\n\r\n  /**\r\n   * let you parse column however you want by adding key name corresponding to column name and parsing function\r\n   *\r\n   * @example\r\n   *\r\n   * const file = await this.file.readTextFile();\r\n   *\r\n   * const csv = new Csv();\r\n   *\r\n   * csv.columnsParse['zip'] = (value: string) => value.substring(0, 2) + '-' + value.substring(2);\r\n   * csv.columnsParse['date'] = (value: string) => new Date(value);\r\n   *\r\n   * csv.parse(file, true);\r\n   *\r\n   * console.log(csv.table);\r\n   */\r\n  columnsParse: { [key: string | number]: ((value: string) => any) } = {};\r\n\r\n  /**\r\n   * let you prepare column to export to CSV clear format by using key name of column with method\r\n   * that revers parsing method\r\n   *\r\n   * WARNING! If you use columnsParse you probably want to use this one as reverse process to CSV\r\n   */\r\n  columnsPrepare: { [key: string | number]: ((value: any) => string) } = {};\r\n\r\n  /**\r\n   * Default so call do nothing parsing string global method to override\r\n   *\r\n   * You can use parsing string static method from @obliczeniowo/elementary/parse call ParseString\r\n   * or use totally own one\r\n   *\r\n   * @value - parsed string value\r\n   */\r\n  parseString: (value: string) => string = (value: string) => value;\r\n\r\n  /**\r\n   * Reverse method of parseString used to export back to CSV\r\n   */\r\n  prepareString: (value: any) => string = (value: any) => value.toString();\r\n\r\n  constructor(\r\n    public hasHeaders: boolean = false,\r\n    public separator: string = ';'\r\n  ) {\r\n  }\r\n\r\n  headers(): (string | number)[] {\r\n    return Array.from(this.table.keys());\r\n  }\r\n\r\n  getRawRow(index: number): (string | number | any)[] {\r\n    const line: any[] = [];\r\n    this.table.forEach(column => {\r\n      line.push(column[index]);\r\n    })\r\n    return line;\r\n  }\r\n\r\n  getJsonRow(index: number): { [key: string]: (string | number | any) } {\r\n    const line: { [key: string]: (string | number | any) } = {};\r\n    this.table.forEach((column, key) => {\r\n      line[key] = column[index];\r\n    })\r\n    return line;\r\n  }\r\n\r\n  getColumn<T = (string | number | any)[]>(name: string): T {\r\n    const value = this.table.get(name);\r\n\r\n    if (!value) {\r\n      throw new Error(`Column \"${name}\" not exist`);\r\n    }\r\n\r\n    return value as any;\r\n  }\r\n\r\n  parse(\r\n    csvText: string,\r\n    hasColumns: boolean = this.hasHeaders,\r\n    separator: string = this.separator\r\n  ) {\r\n    // eslint-disable-next-line @typescript-eslint/prefer-optional-chain\r\n    if (this.throwing.empty && (!csvText || !csvText.length)) {\r\n      throw new Error('CSV file is empty');\r\n    }\r\n\r\n    let rows = csvText.search('\\r\\n') !== -1 && csvText.split('\\r\\n') || csvText.split('\\n');\r\n\r\n    rows = rows.filter(row => row !== '');\r\n\r\n    let headers: string[] = [];\r\n    if (hasColumns) {\r\n      headers = rows.shift()?.split(separator) || [];\r\n\r\n      if (headers.length && this.throwing.headerNotAString) {\r\n        const notNumber = headers.find(header => ElementaryMath.isNumeric(header, true));\r\n\r\n        if (notNumber) {\r\n          throw new Error(`Column name: ${notNumber} is a number`);\r\n        }\r\n      }\r\n    }\r\n\r\n    let length = headers.length;\r\n\r\n    rows.forEach((row, rowIndex) => {\r\n      const values = row.split(separator);\r\n\r\n      if (!length) {\r\n        length = values.length;\r\n      }\r\n      if (this.throwing.columns && length !== values.length) {\r\n        throw new Error(`Error in line ${headers.length ? rowIndex + 2 : rowIndex + 1} of CSV file. Number of fields not equal to previous one`)\r\n      }\r\n\r\n      values.forEach((value, index) => {\r\n        const id: any = headers[index] || index;\r\n        const column = this.table.get(id) || [];\r\n        if (this.throwing.columnsParse[id]) {\r\n          this.throwing.columnsParse[id](value);\r\n        }\r\n        value = this.parseString(value);\r\n        column.push(\r\n          // eslint-disable-next-line @typescript-eslint/prefer-optional-chain\r\n          this.columnsParse[id] && this.columnsParse[id](value) ||\r\n          ElementaryMath.isNumeric(value, true) && parseFloat(value) ||\r\n          value);\r\n        this.table.set(id, column);\r\n      })\r\n    })\r\n  }\r\n\r\n  prepare(): string {\r\n    let csv = '';\r\n    const headers = this.headers();\r\n\r\n    if (!headers.length) {\r\n      throw new Error('Nothing to save');\r\n    }\r\n\r\n    if (this.hasHeaders) {\r\n      csv += headers.join(this.separator) + '\\n';\r\n    }\r\n\r\n    const length = this.table.get(headers[0])?.length || 0;\r\n\r\n    for (let row = 0; row < length; row++) {\r\n      const record: string[] = [];\r\n      this.table.forEach((column, key) => record.push(\r\n        // eslint-disable-next-line @typescript-eslint/prefer-optional-chain\r\n        this.columnsPrepare[key] && this.columnsPrepare[key](column[row]) ||\r\n        this.prepareString(column[row]))\r\n      );\r\n      csv += record.join(this.separator) + '\\n';\r\n    }\r\n\r\n    return csv;\r\n  }\r\n\r\n  toJson(): { [key: string]: string }[] {\r\n    const jsonObj: { [key: string]: string }[] = [];\r\n\r\n    const headers = this.headers();\r\n\r\n    if (!headers.length) {\r\n      throw new Error('Nothing to save');\r\n    }\r\n\r\n    const length = this.table.get(headers[0])?.length || 0;\r\n\r\n    for (let row = 0; row < length; row++) {\r\n      const obj: { [key: string]: string } = {};\r\n      this.table.forEach((column, key) => obj[key] =\r\n        // eslint-disable-next-line @typescript-eslint/prefer-optional-chain\r\n        this.columnsPrepare[key] && this.columnsPrepare[key](column[row]) ||\r\n        this.prepareString(column[row]));\r\n      jsonObj.push(obj);\r\n    }\r\n    return jsonObj;\r\n  }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}