{"version":3,"file":"sowatech-shared-csv-mapping.mjs","sources":["../../../projects/shared/csv-mapping/csv-mapping.dialog.ts","../../../projects/shared/csv-mapping/csv-mapping.service.ts","../../../projects/shared/csv-mapping/csv-mapping.module.ts","../../../projects/shared/csv-mapping/sowatech-shared-csv-mapping.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { SelectItem } from '@sowatech/shared/@types';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\nimport { DialogField, IDialogConfiguration, DialogDynamicList, GenericEditDialogResult, GenericEditDialogService } from '@sowatech/shared/swt-generic';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { TargetField, IMappingConfig } from './csv-mapping.service';\r\n\r\nconst CLASS = 'CsvMappingDialog';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class CsvMappingDialog {\r\n    constructor(\r\n        private genericEditDialog: GenericEditDialogService,\r\n        private logger: LoggerService,\r\n    ) { }\r\n\r\n    public showMappingDialog(configFields: TargetField[], header: Array<any>, mappingConfig?: IMappingConfig, showDateFormatInput = true): Observable<GenericEditDialogResult<IMappingConfig, any>> {\r\n        this.logger.log(CLASS + '.showMappingDialog');\r\n        if (!header) throw new Error($localize`:@@CsvMapping.MissingDataRow.msg.Text:firstDataRow fehlt oder ist leer`);\r\n\r\n        const lookupColNames: Array<SelectItem> = header.map((columnName, index) => ({ text: columnName.toString(), value: index }));\r\n        // LEER Option für optionale Felder\r\n        lookupColNames.unshift({ text: $localize`:@@CsvMapping.Empty.dsp.Label:(Leer)`, value: -1 });\r\n\r\n        const lookupColNumbers: Array<SelectItem> = header.map((columnName, index) => ({ text: index.toString(), value: index }));\r\n        // LEER Option für optionale Felder\r\n        lookupColNumbers.unshift({ text: $localize`:@@CsvMapping.Empty.dsp.Label:(Leer)`, value: -1 });\r\n\r\n        const lookups: DialogDynamicList[] = [\r\n            { key: 'COLUMNNUMMBERS', lookupItems: lookupColNumbers },\r\n            { key: 'COLUMNNAMES', lookupItems: lookupColNames }\r\n        ];\r\n\r\n        const configDialog = this.getDialogConfiguration(configFields, showDateFormatInput);\r\n        return this.genericEditDialog.show<IMappingConfig>(configDialog, mappingConfig, null, lookups);\r\n    }\r\n\r\n    private getDialogConfiguration(configFields: TargetField[], showDateFormatInput = true): IDialogConfiguration {\r\n        this.logger.log(CLASS + '.getDialogConfiguration');\r\n        const config: IDialogConfiguration = {\r\n            title: $localize`:@@CsvMapping.AssignColumns.act.Title:Spalten zuordnen`,\r\n            inputSize: 'small',\r\n            fieldsOrCategoriesOfFields: this.getDialogFields(configFields, showDateFormatInput)\r\n        };\r\n        return config;\r\n    }\r\n\r\n    private getDialogFields(configFields: TargetField[], showDateFormatInput): Array<DialogField> {\r\n        this.logger.log(CLASS + '.getDialogFields');\r\n\r\n        const defaultDateFormat = 'DD.MM.YYYY';\r\n        const dateformatChanged = (editItem) => {\r\n            editItem.dateFormat = editItem.dateFormat != '' ? editItem.dateFormat : defaultDateFormat;\r\n        };\r\n\r\n        const dialogFields: Array<DialogField> = [\r\n            {\r\n                fieldname: 'dataContainsHeaders',\r\n                default: false,\r\n                text: $localize`:@@CsvMapping.Header.dsp.Label:Kopfzeile mit Spaltennamen`,\r\n                controlType: 'checkbox',\r\n                type: 'boolean'\r\n            }\r\n        ];\r\n\r\n        if (showDateFormatInput) {\r\n            dialogFields.push(\r\n                {\r\n                    fieldname: 'dateFormat',\r\n                    text: $localize`:@@CsvMapping.Dateformat.dsp.Label:Datumsformat`,\r\n                    default: 'DD.MM.YYYY',\r\n                    type: 'text',\r\n                    placeholder: 'DD.MM.YYYY',\r\n                    onChange: dateformatChanged\r\n                }\r\n            );\r\n        }\r\n\r\n        for (const val of configFields) {\r\n            if (val.type == 'dictionary') {\r\n                for (let field = 0; field < 2; field++) {\r\n                    const dialogFieldsDictionaryWithNumbers = this.bulidDialogDictionaryFields(field, val, 'COLUMNNUMMBERS');\r\n                    dialogFields.push(dialogFieldsDictionaryWithNumbers);\r\n\r\n                    const dialogFieldsDictionaryWithNames = this.bulidDialogDictionaryFields(field, val, 'COLUMNNAMES');\r\n                    dialogFields.push(dialogFieldsDictionaryWithNames);\r\n                }\r\n            }\r\n            else {\r\n                const dialogFieldWithNumbers = this.buildDialogField(val, 'COLUMNNUMMBERS');\r\n                dialogFields.push(dialogFieldWithNumbers);\r\n\r\n                const dialogFieldWithNames = this.buildDialogField(val, 'COLUMNNAMES');\r\n                dialogFields.push(dialogFieldWithNames);\r\n            }\r\n        }\r\n        return dialogFields;\r\n    }\r\n\r\n    private bulidDialogDictionaryFields(fieldIndex: number, targetField: TargetField, lookUpsKey: string): DialogField {\r\n        return {\r\n            fieldname: fieldIndex == 0 ? 'fields.' + targetField.fieldname : 'fields.' + targetField.fieldname + '_lastColumn',\r\n            text: targetField.displayname ? targetField.displayname : targetField.fieldname,\r\n            help: fieldIndex == 0 ? targetField.fieldname + ' Erste Spalte' : targetField.fieldname + ' Letzte Spalte',\r\n            type: 'number',\r\n            default: -1,\r\n            lookUps: lookUpsKey,\r\n            hideIf: lookUpsKey === 'COLUMNNUMMBERS' ?\r\n                (editItem: any) => editItem.dataContainsHeaders :\r\n                (editItem: any) => !editItem.dataContainsHeaders\r\n        } as DialogField;\r\n    }\r\n\r\n    private buildDialogField(targetField: TargetField, lookUpsKey: string): DialogField {\r\n        return {\r\n            fieldname: 'fields.' + targetField.fieldname,\r\n            text: targetField.displayname ? targetField.displayname : targetField.fieldname,\r\n            type: 'number',\r\n            default: -1,\r\n            lookUps: lookUpsKey,\r\n            hideIf: lookUpsKey === 'COLUMNNUMMBERS' ?\r\n                (editItem: any) => editItem.dataContainsHeaders :\r\n                (editItem: any) => !editItem.dataContainsHeaders\r\n        } as DialogField;\r\n    }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\nimport { UserPropertiesStorageService } from '@sowatech/shared/user-properties-storage';\r\nimport moment from 'moment';\r\nimport * as Papa from 'papaparse';\r\nimport { firstValueFrom } from 'rxjs';\r\n\r\nimport { CsvMappingDialog } from './csv-mapping.dialog';\r\n\r\n\r\nconst CLASS = 'CsvMappingService';\r\n\r\nconst STORAGE_KEY_MAPPING_CONFIG = 'CsvMappingService.MappingConfig';\r\n\r\n/**\r\n * Service zum manuellen Konfigurieren eines CSV Mappings.\r\n * ```ts\r\n * const data = await this.csvService.parseCsv(file);\r\n * const targetFields\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class CsvMappingService {\r\n    constructor(\r\n        private csvMappingDialog: CsvMappingDialog,\r\n        private logger: LoggerService,\r\n        private storage: UserPropertiesStorageService\r\n    ) { }\r\n\r\n    /**\r\n     * Zeigt einen Konfigurationsdialog an, in dem man ein Mapping von den gegebenen CSV Daten zum Zielformat einstellen kann\r\n     * @param data Die aus dem CSV ausgelesenen Daten. Können über `csvMappingService.paseCsv(file)` besorgt werden.\r\n     * @param configFields Konfiguration, welche Felder im Zielformat vorhanden sein sollen.\r\n     */\r\n    public async showDialog(data: Array<object>, configFields: TargetField[], storageKeyBase?: string, showDateFormatInput = true): Promise<IMappingConfig> {\r\n        this.logger.log(CLASS + '.showDialog');\r\n\r\n        const headerValues = Object.values(data[0]);\r\n        const storageHelper = new MappingConfigStorageHelper(storageKeyBase, this.storage);\r\n        const oldMappingConfig = storageHelper.load();\r\n        const newMappingConfig = await firstValueFrom(this.csvMappingDialog.showMappingDialog(configFields, headerValues, oldMappingConfig, showDateFormatInput));\r\n        storageHelper.save(newMappingConfig.dto);\r\n        return newMappingConfig.dto;\r\n    }\r\n\r\n    /**\r\n     * Liest eine CSV-Datei ein und gibt die Zeilen als Array zurück\r\n     * @returns Liste aller Zeilen (`string[][]`)\r\n     */\r\n    public parseCsv(file: File, config?: ParseConfig): Promise<object[]> {\r\n        this.logger.log(CLASS + '.parseCsv');\r\n        const promise: Promise<object[]> = new Promise((resolve, reject) => {\r\n            if (file && file.name.indexOf('.csv') < 0)\r\n                reject(new Error($localize`:@@CsvMapping.NotCsvFileError.msg.Text:Die Datei ist nicht im csv-Format: ` + file));\r\n\r\n            else {\r\n                const papaParseConfig = this.buildPapaParseConfig(config, resolve, reject);\r\n                Papa.parse(file, papaParseConfig);\r\n            }\r\n        });\r\n\r\n        return promise;\r\n    }\r\n\r\n    //Erweitert das ParseConfig auf ein Papa.ParseConfig\r\n    private buildPapaParseConfig<T>(config: ParseConfig, resolve: (values: T[]) => void, reject: (reason: any) => void): Papa.ParseConfig {\r\n        this.logger.log(CLASS + '.buildPapaParseConfig');\r\n        const papaParseConfig: Papa.ParseConfig = config ? { ...config } : {};\r\n        if (!papaParseConfig.encoding) papaParseConfig.encoding = 'iso-8859-1';\r\n        if (!papaParseConfig.skipEmptyLines) papaParseConfig.skipEmptyLines = true;\r\n\r\n        const doReject = (errors: Papa.ParseError[], file?: File) => {\r\n            const errorMessages = errors && errors.length > 0 ? errors.map(err => $localize`:@@CsvMapping.ParseError.msg.Text:Parse Error in Reihe: ` + err.row + ': ' + err.message) : [$localize`:@@CsvMapping.PapaparseError.msg.Text:Unbekannter error in Papaparse`]; //['unknown Error in papaparse'];\r\n            reject(new Error(errorMessages.join(', ')));\r\n        };\r\n\r\n        papaParseConfig.error = (error: Papa.ParseError, file?: File) => {\r\n            doReject([error], file);\r\n        };\r\n\r\n        papaParseConfig.complete = (csvResult: Papa.ParseResult) => {\r\n            if (csvResult.errors && csvResult.errors.length > 0)\r\n                doReject(csvResult.errors);\r\n\r\n            else\r\n                resolve(csvResult.data);\r\n\r\n        };\r\n        return papaParseConfig;\r\n    }\r\n\r\n    /**\r\n     * Nimmt die ausgelesenen Daten und das Mapping und baut daraus die Zielstruktur als JavaScript Objekte\r\n     * @param data Die aus dem CSV ausgelesenen Daten. Können über `csvMappingService.paseCsv(file)` besorgt werden.\r\n     * @param targetObjectDefinition Konfiguration, welche Felder im Zielformat vorhanden sein sollen.\r\n     * Hier kann die gleiche Konfiguration wie in `csvMappingService.showDialog` verwendet werden: `{ fields: targetFields }`\r\n     * @param mappingConfig Die Konfiguration fürs Mapping der Daten zum Zielformat. Hier kann das Ergebnis von `csvMappingService.showDialog` verwendet werden.\r\n     */\r\n    public createTargetObjects<T>(data: Array<object>, targetObjectDefinition: TargetObjectDefinition, mappingConfig: IMappingConfig): T[] {\r\n        this.logger.log(CLASS + '.createTargetObjects');\r\n        const targetObjects = Array<T>();\r\n        const srcHeaderRow = mappingConfig.dataContainsHeaders ? data[0] : null;\r\n        data.forEach((srcRow, index) => {\r\n            const isDataRow = !mappingConfig.dataContainsHeaders || index > 0;\r\n            if (isDataRow) {\r\n                const targetObject: T = this.createTargetObject<T>(srcRow, srcHeaderRow, targetObjectDefinition, mappingConfig);\r\n                targetObjects.push(targetObject);\r\n            }\r\n        });\r\n        return targetObjects;\r\n    }\r\n\r\n    private createTargetObject<T>(srcRow: object, srcHeaderRow: object, targetObjectDefiniton: TargetObjectDefinition, mappingConfig: IMappingConfig): T {\r\n        this.logger.log(CLASS + '.createTargetObject');\r\n        const targetObject = {} as T;\r\n        for (const targetField of targetObjectDefiniton.fields) {\r\n            if (!targetField) continue;\r\n            const srcFieldIndex = mappingConfig.fields[targetField.fieldname];\r\n            if (srcFieldIndex != null && srcFieldIndex != -1)\r\n                targetObject[targetField.fieldname] = this.createTargetObjectProperty(srcRow, srcHeaderRow, srcFieldIndex, targetField, mappingConfig);\r\n        }\r\n        return targetObject;\r\n    }\r\n\r\n    private createTargetObjectProperty(srcRow: object, srcHeaderRow: object, srcFieldIndex: number, targetField: TargetField, mappingConfig: IMappingConfig): string | boolean | number | Date | Array<string> | Array<KeyValueObject> {\r\n        let resultProperty: string | boolean | number | Date | Array<string> | Array<KeyValueObject>;\r\n        switch (targetField.type) {\r\n            case 'dictionary':\r\n                let srcFieldLastIndex = mappingConfig.fields[targetField.fieldname + '_lastColumn'];\r\n                if (srcFieldLastIndex == null) srcFieldLastIndex = Object.values(srcRow).length - 1;\r\n                resultProperty = this.createTargetObjectDictionary(\r\n                    srcRow, srcHeaderRow, srcFieldIndex, srcFieldLastIndex,\r\n                    targetField.dictionaryValueType, mappingConfig.dateFormat\r\n                );\r\n                break;\r\n            default:\r\n                resultProperty = this.convertToType(srcRow[srcFieldIndex], targetField.type, mappingConfig.dateFormat);\r\n        }\r\n        return resultProperty;\r\n    }\r\n\r\n    private createTargetObjectDictionary(\r\n        srcRow: object, srcHeaderRow: object, srcStartIndex: number, srcEndIndex: number,\r\n        targetDictionaryValueType: FieldType, targetDateFormat?: string\r\n    ): Array<KeyValueObject> {\r\n        const result = [];\r\n        for (let srcFieldIndex = srcStartIndex; srcFieldIndex <= srcEndIndex; srcFieldIndex++) {\r\n            const item = new KeyValueObject();\r\n            item.key = srcHeaderRow ? srcHeaderRow[srcFieldIndex] : (srcFieldIndex - srcStartIndex).toString();\r\n            item.value = this.convertToType(srcRow[srcFieldIndex], targetDictionaryValueType, targetDateFormat);\r\n            result.push(item);\r\n        }\r\n        return result;\r\n    }\r\n\r\n    private convertToType(srcValue: string, valueType: FieldType, srcDateFormat?: string): number | boolean | string | string[] | Date {\r\n        this.logger.log(CLASS + '.convertToTargetType');\r\n        if (srcValue == null) return null;\r\n        srcValue = this.convertJaDateStringToDate(srcValue, valueType);\r\n        switch (valueType) {\r\n            case 'number':\r\n                return Number(srcValue.replace(',', '.'));\r\n            case 'boolean':\r\n                return srcValue != 'null' && srcValue != '0' && srcValue != '' && srcValue != 'false';\r\n            case 'dateIso':\r\n                return moment(srcValue, srcDateFormat).format('YYYY-MM-DD');\r\n            case 'date':\r\n                return moment(srcValue, srcDateFormat).toDate();\r\n            case 'string[]':\r\n                return srcValue.split(',');\r\n            default:\r\n                return srcValue;\r\n        }\r\n    }\r\n\r\n    /**im Mitgliederimport L2 kann man das Datum eines Zertifikats mit Ja beantworten, wenn kein Datum bekannt ist*/\r\n    private convertJaDateStringToDate(srcValue: string, valueType: FieldType): string {\r\n        if (srcValue === 'Ja' && (valueType === 'date' || valueType === 'dateIso'))\r\n            srcValue = new Date().toLocaleDateString();\r\n        return srcValue;\r\n    }\r\n}\r\n\r\nexport class MappingConfigStorageHelper {\r\n    private storageKey: string = null;\r\n\r\n    constructor(storageKeyBase: string, private storage: UserPropertiesStorageService) {\r\n        if (storageKeyBase && storageKeyBase.length > 0)\r\n            this.storageKey = storageKeyBase + '.' + STORAGE_KEY_MAPPING_CONFIG;\r\n    }\r\n\r\n    private storageIsActive(): boolean {\r\n        return this.storageKey && this.storageKey.length > 0;\r\n    }\r\n\r\n    public load() {\r\n        if (!this.storageIsActive()) return null;\r\n        return this.storage.load<IMappingConfig>(this.storageKey);\r\n    }\r\n\r\n    public save(mappingObject: IMappingConfig) {\r\n        if (!this.storageIsActive()) return;\r\n        this.storage.save(this.storageKey, mappingObject);\r\n    }\r\n}\r\n\r\nexport interface ParseConfig {\r\n    delimiter?: string;            // default: \",\"\r\n    newline?: string;              // default: \"\\r\\n\"\r\n    quoteChar?: 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 | string;   // default: false\r\n    download?: boolean;            // default: false\r\n    skipEmptyLines?: boolean;      // default: false\r\n    fastMode?: boolean;            // default: undefined\r\n    withCredentials?: boolean;     // default: undefined\r\n}\r\n\r\nexport class TargetObjectDefinition {\r\n    fields: TargetField[];\r\n}\r\n\r\nexport class TargetField {\r\n    type?: FieldType | 'dictionary' = 'string';\r\n    fieldname: string;\r\n    displayname?: string;\r\n    dictionaryValueType?: FieldType;\r\n}\r\n\r\nexport class KeyValueObject {\r\n    key: string;\r\n    value: string | boolean | number | Date | Array<string>;\r\n}\r\n\r\nexport declare type FieldType = 'string' | 'boolean' | 'number' | 'dateIso' | 'date' | 'string[]';\r\n\r\nexport interface IMappingConfig {\r\n    fields: IMappingField;\r\n    dateFormat: string;\r\n    dataContainsHeaders: boolean;\r\n}\r\nexport interface IMappingField {\r\n    [fieldname: string]: number | null;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { SwtGenericModule } from '@sowatech/shared/swt-generic';\r\n\r\n@NgModule({\r\n    imports: [\r\n        CommonModule,\r\n        SwtGenericModule,\r\n    ],\r\n    providers: [ ],\r\n    declarations: [ ]\r\n})\r\n\r\nexport class CsvMapping { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["CLASS","i1.CsvMappingDialog"],"mappings":"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"}