{"version":3,"file":"sowatech-shared-csv.mjs","sources":["../../../projects/shared/csv/csv.service.types.ts","../../../projects/shared/csv/csv.service.ts","../../../projects/shared/csv/sowatech-shared-csv.ts"],"sourcesContent":["\r\n\r\nexport class CsvCreateObjectConfig {\r\n    constructor() {\r\n        this.nullValue = 'NULL';\r\n    }\r\n    configFields: CsvCreateObjectField[];\r\n    nullValue: string;\r\n    copy(config: CsvCreateObjectConfig) {\r\n        this.configFields = new Array<CsvCreateObjectField>();\r\n        this.nullValue = config.nullValue;\r\n        for (const field of config.configFields) {\r\n            const configField = new CsvCreateObjectField();\r\n            for (const prop in field)\r\n                configField[prop] = field[prop];\r\n\r\n            this.configFields.push(configField);\r\n        }\r\n    }\r\n}\r\n\r\nexport class CsvCreateObjectField {\r\n    fieldname: string;\r\n    type: 'string' | 'boolean' | 'number' | 'Date' | 'DateTime' | 'string[]';\r\n    stringArraySeparator?: string;\r\n    dateFormat?: string = 'DD-MM-YYYY';\r\n\r\n}\r\n\r\nexport interface ParseMeta {\r\n    delimiter: string; // Delimiter used\r\n    linebreak: string; // Line break sequence used\r\n    aborted: boolean; // Whether process was aborted\r\n    fields: Array<string>; // Array of field names\r\n    truncated: boolean; // Whether preview consumed all input\r\n}\r\n\r\nexport interface ParseError {\r\n    type: string; // A generalization of the error\r\n    code: string; // Standardized error code\r\n    message: string; // Human-readable details\r\n    row: number; // Row index of parsed data where error is\r\n}\r\n\r\nexport interface ParseResult {\r\n    data: Array<any>;\r\n    errors: Array<ParseError>;\r\n    meta: ParseMeta;\r\n}\r\n\r\n//-------------------------------------\r\nexport interface CsvConfig {\r\n    //paparse\r\n    delimiter?: string; // default: \"\"\r\n    newline?: string; // default: \"\"\r\n    header?: boolean; // default: false\r\n    dynamicTyping?: boolean; // default: false\r\n    preview?: number; // default: 0\r\n    encoding?: string; // default: \"\"\r\n    worker?: boolean; // default: false\r\n    comments?: boolean; // default: false\r\n    download?: boolean; // default: false\r\n    skipEmptyLines?: boolean; // default: false\r\n    fastMode?: boolean; // default: undefined\r\n}\r\n\r\nexport interface CsvResult {\r\n    data: Array<any>;\r\n    errors: Array<ParseError>;\r\n    meta: ParseMeta;\r\n}\r\n\r\nexport type csvString = string;\r\n","import { Injectable, Inject, LOCALE_ID } from '@angular/core';\r\nimport moment from 'moment';\r\nimport * as Papa from 'papaparse';\r\nimport { Observable, Observer } from 'rxjs';\r\n\r\nimport { CsvCreateObjectConfig, ParseResult, ParseError, CsvConfig, csvString, CsvResult } from './csv.service.types';\r\n\r\n@Injectable({\r\n    providedIn: 'root',\r\n})\r\nexport class CsvService {\r\n    constructor(\r\n        @Inject(LOCALE_ID) private _locale: string,\r\n    ) {\r\n    }\r\n\r\n    unparse(data: Array<object>, config?: UnparseConfig): csvString;\r\n    unparse(data: Array<Array<any>>, config?: UnparseConfig): csvString;\r\n    unparse(data: UnparseObject, config?: UnparseConfig): csvString;\r\n    public unparse(arg: any, config?: UnparseConfig): csvString {\r\n        if (!config)\r\n            {config = {\r\n                quotes: true,\r\n                delimiter: ';',\r\n                newline: '\\r'\r\n            };}\r\n\r\n        let result: csvString = '';\r\n        if (arg instanceof Array && arg.every(elem => elem instanceof Object)) {\r\n            const unparsedObjects = this.cleanseObjectsForUnparse(arg);\r\n            result = Papa.unparse(unparsedObjects, config);\r\n        } else result = Papa.unparse(arg, config);\r\n        return result;\r\n    }\r\n\r\n    private cleanseObjectsForUnparse(inputObject: object[]): object[] {\r\n        const resultObjects: object[] = [];\r\n        for (const item of inputObject) {\r\n            const obj: object = new Object();\r\n            for (const prop in item) {\r\n                if (typeof item[prop] !== 'function' && !(item[prop] instanceof Array))\r\n                    obj[prop] = item[prop];\r\n\r\n                if (typeof item[prop] === 'number') {\r\n                    if (this._locale != 'en-US')\r\n                        obj[prop] = item[prop].toString().replace('.', ',');\r\n                }\r\n            }\r\n            resultObjects.push(obj);\r\n        }\r\n        return resultObjects;\r\n    }\r\n\r\n    public downloadCsv(data: csvString, fileName: string) {\r\n        const blob: Blob = new Blob(['\\ufeff', data]);\r\n        const tempLink = document.createElement('a');\r\n        tempLink.href = window.URL.createObjectURL(blob);\r\n        tempLink.setAttribute('download', fileName + '.csv');\r\n        document.body.appendChild(tempLink);\r\n        tempLink.click();\r\n        document.body.removeChild(tempLink);\r\n    }\r\n\r\n    /**\r\n     * @deprecated parseCsv ist veraltet. Verwende stattdessen CsvMappingService aus shared package\r\n     */\r\n    parseCsv(csvString: string, config?: CsvConfig): Observable<CsvResult>;\r\n    parseCsv(file: File, config?: CsvConfig): Observable<CsvResult>;\r\n    public parseCsv(arg1: any, config?: CsvConfig): Observable<CsvResult> {\r\n        const observable = Observable.create(anyObserver => {\r\n            const observer = anyObserver as Observer<CsvResult>;\r\n            const file: File = typeof arg1 === 'string' ? null : arg1;\r\n            if (file && file.name.indexOf('.csv') < 0)\r\n                observer.error({ error: { message: 'file is no csv-file' }, file });\r\n             else {\r\n                const parseConfig: ParseConfig = config ? { ...config } : {};\r\n                if (!parseConfig.encoding) parseConfig.encoding = 'iso-8859-1';\r\n                parseConfig.error = (error: ParseError, file?: File) => {\r\n                    observer.error({ error, file });\r\n                    observer.complete();\r\n                };\r\n                parseConfig.complete = (results: ParseResult, file?: File) => {\r\n                    observer.next(results);\r\n                    observer.complete();\r\n                };\r\n                Papa.parse(arg1, parseConfig);\r\n            }\r\n        });\r\n        return observable;\r\n    }\r\n\r\n    getCsvAsObjects<T>(conf: CsvCreateObjectConfig, csvResult: CsvResult): Array<T> {\r\n        console.log('getCsvAsObjects');\r\n        const result: Array<T> = [];\r\n        if (csvResult && csvResult.data && csvResult.data.length > 1) {\r\n            const config = new CsvCreateObjectConfig();\r\n            config.copy(conf);\r\n            const header: Array<any> = csvResult.data[0];\r\n            for (let rowIndex = 0; rowIndex < csvResult.data.length; rowIndex++) {\r\n                const row = csvResult.data[rowIndex];\r\n                const obj = {} as T;\r\n                for (const field of config.configFields) {\r\n                    const index = header.findIndex(h => h.toLowerCase() == field.fieldname.toLowerCase());\r\n                    switch (field.type) {\r\n                        case 'string':\r\n                            obj[field.fieldname] = row[index] === conf.nullValue ? null : row[index] as string;\r\n                            break;\r\n                        case 'boolean':\r\n                            obj[field.fieldname] = row[index] === conf.nullValue ? null : row[index] as boolean;\r\n                            break;\r\n                        case 'number':\r\n                            if (row[index]) obj[field.fieldname] = row[index] === conf.nullValue ? null : row[index].replace(',', '.');\r\n                            break;\r\n                        case 'Date':\r\n                            obj[field.fieldname] = row[index] === conf.nullValue ? null : moment(row[index], field.dateFormat).format('YYYY-MM-DD');\r\n                            break;\r\n                        case 'DateTime':\r\n                            obj[field.fieldname] = row[index] === conf.nullValue ? null : moment(row[index], field.dateFormat).toDate();\r\n                            break;\r\n                        case 'string[]':\r\n                            if (row.length >= index) obj[field.fieldname] = row[index] === conf.nullValue ? null : (row[index] as string).split(field.stringArraySeparator);\r\n                            break;\r\n                    }\r\n                }\r\n                result.push(obj);\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n}\r\n\r\ninterface ParseConfig {\r\n    delimiter?: string; // default: \"\"\r\n    newline?: string; // default: \"\"\r\n    header?: boolean; // default: false\r\n    dynamicTyping?: boolean; // default: false\r\n    preview?: number; // default: 0\r\n    encoding?: string; // default: \"\"\r\n    worker?: boolean; // default: false\r\n    comments?: boolean; // default: false\r\n    download?: boolean; // default: false\r\n    skipEmptyLines?: boolean; // default: false\r\n    fastMode?: boolean; // default: undefined\r\n\r\n    // Callbacks\r\n    step?(results: ParseResult, parser: Parser): void; // default: undefined\r\n    complete?(results: ParseResult, file?: File): void; // default: undefined\r\n    error?(error: ParseError, file?: File): void; // default: undefined\r\n    chunk?(results: ParseResult, parser: Parser): void; // default: undefined\r\n    beforeFirstChunk?(chunk: string): string | void; // default: undefined\r\n}\r\n\r\ninterface UnparseConfig {\r\n    quotes: boolean; // default: false\r\n    delimiter: string; // default: \",\"\r\n    newline: string; // default: \"\\r\\n\"\r\n}\r\n\r\ninterface UnparseObject {\r\n    fields: Array<any>;\r\n    data: string | Array<any>;\r\n}\r\n\r\n\r\ntype ParserConstructor = new(config: ParseConfig) => Parser;\r\ninterface Parser {\r\n    // Parses the input\r\n    parse(input: string, baseIndex: number, ignoreLastRow: boolean): any;\r\n\r\n    // Sets the abort flag\r\n    abort(): void;\r\n\r\n    // Gets the cursor position\r\n    getCharIndex(): number;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;MAEa,qBAAqB,CAAA;AAC9B,IAAA,WAAA,GAAA;AACI,QAAA,IAAI,CAAC,SAAS,GAAG,MAAM;IAC3B;AAGA,IAAA,IAAI,CAAC,MAA6B,EAAA;AAC9B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,KAAK,EAAwB;AACrD,QAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;AACjC,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,YAAY,EAAE;AACrC,YAAA,MAAM,WAAW,GAAG,IAAI,oBAAoB,EAAE;YAC9C,KAAK,MAAM,IAAI,IAAI,KAAK;gBACpB,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;AAEnC,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;QACvC;IACJ;AACH;MAEY,oBAAoB,CAAA;AAAjC,IAAA,WAAA,GAAA;QAII,IAAA,CAAA,UAAU,GAAY,YAAY;IAEtC;AAAC;;MCjBY,UAAU,CAAA;AACnB,IAAA,WAAA,CAC+B,OAAe,EAAA;QAAf,IAAA,CAAA,OAAO,GAAP,OAAO;IAEtC;IAKO,OAAO,CAAC,GAAQ,EAAE,MAAsB,EAAA;QAC3C,IAAI,CAAC,MAAM,EACP;AAAC,YAAA,MAAM,GAAG;AACN,gBAAA,MAAM,EAAE,IAAI;AACZ,gBAAA,SAAS,EAAE,GAAG;AACd,gBAAA,OAAO,EAAE;aACZ;QAAC;QAEN,IAAI,MAAM,GAAc,EAAE;AAC1B,QAAA,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,YAAY,MAAM,CAAC,EAAE;YACnE,MAAM,eAAe,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC;YAC1D,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC;QAClD;;YAAO,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC;AACzC,QAAA,OAAO,MAAM;IACjB;AAEQ,IAAA,wBAAwB,CAAC,WAAqB,EAAA;QAClD,MAAM,aAAa,GAAa,EAAE;AAClC,QAAA,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE;AAC5B,YAAA,MAAM,GAAG,GAAW,IAAI,MAAM,EAAE;AAChC,YAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;AACrB,gBAAA,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,UAAU,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC;oBAClE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;gBAE1B,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE;AAChC,oBAAA,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO;AACvB,wBAAA,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;gBAC3D;YACJ;AACA,YAAA,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3B;AACA,QAAA,OAAO,aAAa;IACxB;IAEO,WAAW,CAAC,IAAe,EAAE,QAAgB,EAAA;QAChD,MAAM,IAAI,GAAS,IAAI,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;QAC5C,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;QAChD,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAC;AACpD,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QACnC,QAAQ,CAAC,KAAK,EAAE;AAChB,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IACvC;IAOO,QAAQ,CAAC,IAAS,EAAE,MAAkB,EAAA;QACzC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,WAAW,IAAG;YAC/C,MAAM,QAAQ,GAAG,WAAkC;AACnD,YAAA,MAAM,IAAI,GAAS,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI;YACzD,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;AACrC,gBAAA,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,IAAI,EAAE,CAAC;iBACjE;AACF,gBAAA,MAAM,WAAW,GAAgB,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE;gBAC5D,IAAI,CAAC,WAAW,CAAC,QAAQ;AAAE,oBAAA,WAAW,CAAC,QAAQ,GAAG,YAAY;gBAC9D,WAAW,CAAC,KAAK,GAAG,CAAC,KAAiB,EAAE,IAAW,KAAI;oBACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;oBAC/B,QAAQ,CAAC,QAAQ,EAAE;AACvB,gBAAA,CAAC;gBACD,WAAW,CAAC,QAAQ,GAAG,CAAC,OAAoB,EAAE,IAAW,KAAI;AACzD,oBAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;oBACtB,QAAQ,CAAC,QAAQ,EAAE;AACvB,gBAAA,CAAC;AACD,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC;YACjC;AACJ,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,UAAU;IACrB;IAEA,eAAe,CAAI,IAA2B,EAAE,SAAoB,EAAA;AAChE,QAAA,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC9B,MAAM,MAAM,GAAa,EAAE;AAC3B,QAAA,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1D,YAAA,MAAM,MAAM,GAAG,IAAI,qBAAqB,EAAE;AAC1C,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YACjB,MAAM,MAAM,GAAe,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,YAAA,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;gBACjE,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACpC,MAAM,GAAG,GAAG,EAAO;AACnB,gBAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,YAAY,EAAE;oBACrC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;AACrF,oBAAA,QAAQ,KAAK,CAAC,IAAI;AACd,wBAAA,KAAK,QAAQ;4BACT,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,GAAG,CAAC,KAAK,CAAW;4BAClF;AACJ,wBAAA,KAAK,SAAS;4BACV,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,GAAG,CAAC,KAAK,CAAY;4BACnF;AACJ,wBAAA,KAAK,QAAQ;4BACT,IAAI,GAAG,CAAC,KAAK,CAAC;AAAE,gCAAA,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;4BAC1G;AACJ,wBAAA,KAAK,MAAM;AACP,4BAAA,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;4BACvH;AACJ,wBAAA,KAAK,UAAU;AACX,4BAAA,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE;4BAC3G;AACJ,wBAAA,KAAK,UAAU;AACX,4BAAA,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK;AAAE,gCAAA,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,GAAG,IAAI,GAAI,GAAG,CAAC,KAAK,CAAY,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC;4BAC/I;;gBAEZ;AACA,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YACpB;QACJ;AACA,QAAA,OAAO,MAAM;IACjB;AAtHS,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,kBAEP,SAAS,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAFZ,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFP,MAAM,EAAA,CAAA,CAAA;;2FAET,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA;;0BAGQ,MAAM;2BAAC,SAAS;;;ACZzB;;AAEG;;;;"}