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