{ "version": 3, "sources": ["libs/crm/dynamic/src/lib/bulk-import/bulk-import-stepper.service.ts", "libs/crm/dynamic/src/lib/bulk-import/field-mapping-step/field-mapping.service.ts", "libs/crm/dynamic/src/lib/bulk-import/file-upload-step/csv-parser.service.ts"], "sourcesContent": ["import { Injectable } from '@angular/core';\nimport { RxState } from '@rx-angular/state';\nimport { CSVHeaderMappingInterface } from '@vendasta/crm';\nimport { Observable } from 'rxjs';\n\nexport type Step = 'fileUploadCompleted' | 'fieldMappingCompleted';\ntype CsvRow = { [key: string]: string };\n\n@Injectable()\nexport class BulkImportStepperService {\n csvFilename$: Observable = this.state.select('csvFilename');\n csvRows$: Observable = this.state.select('csvRows');\n csvIsRowEstimate$: Observable = this.state.select('csvIsRowEstimate');\n csvFirstRow$: Observable = this.state.select('csvFirstRow');\n csvMappings$: Observable = this.state.select('csvHeaderMappings');\n fileUploadCompleted$: Observable = this.state.select('fileUploadCompleted');\n fieldMappingCompleted$: Observable = this.state.select('fieldMappingCompleted');\n\n constructor(private readonly state: RxState) {\n this.reset();\n }\n\n reset(): void {\n const initial: ComponentState = {\n csvFilename: '',\n csvRows: '0',\n csvIsRowEstimate: false,\n csvFirstRow: {},\n csvHeaderMappings: [],\n fileUploadCompleted: false,\n fieldMappingCompleted: false,\n };\n this.state.set(initial);\n }\n\n isStepComplete(stepKey: Step): boolean {\n return this.state.get(stepKey);\n }\n\n completeStep(stepKey: Step, complete: boolean) {\n this.state.set({ [stepKey]: complete });\n }\n\n setCSVFilename(csvFilename: string) {\n this.state.set({ csvFilename: csvFilename });\n }\n\n setCSVRows(csvRows: string, isEstimated: boolean): void {\n this.state.set({ csvRows: csvRows, csvIsRowEstimate: isEstimated });\n }\n\n setCSVFirstRow(csvFirstRow: CsvRow): void {\n this.state.set({ csvFirstRow });\n }\n\n setCSVHeaderMappings(csvHeaderMappings: CSVHeaderMappingInterface[]): void {\n this.state.set({ csvHeaderMappings });\n }\n}\n\ninterface ComponentState {\n csvFilename: string;\n csvRows: string;\n csvIsRowEstimate: boolean;\n csvFirstRow: CsvRow;\n csvHeaderMappings: CSVHeaderMappingInterface[];\n fileUploadCompleted: boolean;\n fieldMappingCompleted: boolean;\n}\n", "import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { combineLatest, map, Observable } from 'rxjs';\nimport { shareReplay, take, tap } from 'rxjs/operators';\nimport { BulkImportStepperService } from '../bulk-import-stepper.service';\nimport { CSVHeaderMappingInterface, FieldType } from '@vendasta/crm';\nimport { FieldSchemaInterface, ObjectType, CrmFormService } from '@galaxy/crm/static';\n\nexport interface FieldSchemaGroup {\n label: string;\n schemaOptions: FieldSchemaInterface[];\n}\n\n@Injectable()\nexport class FieldMappingService {\n fieldMappings$: Observable;\n\n constructor(\n private readonly translate: TranslateService,\n private readonly formService: CrmFormService,\n private readonly stepperService: BulkImportStepperService,\n ) {\n this.fieldMappings$ = this.stepperService.csvMappings$;\n }\n\n getFieldSchemaMap$(objectType: ObjectType): Observable> {\n return this.formService.listAllFormFields$(objectType).pipe(\n map((schemas) => {\n const schemaMap: Map = new Map();\n for (const schema of schemas) {\n schemaMap.set(schema.fieldId, schema);\n }\n return schemaMap;\n }),\n );\n }\n\n listFieldGroups$(objectType: ObjectType): Observable {\n const fieldSchemaMap$ = this.getFieldSchemaMap$(objectType);\n const fieldGroups$ = this.formService.listAllObjectFormFieldGroups$(objectType);\n return combineLatest([fieldSchemaMap$, fieldGroups$]).pipe(\n map(([schemaMap, groups]) => {\n return groups.map((g) => ({\n label: this.translate.instant(g.description || 'BULK_IMPORT.MAP_FIELDS_STEP.OTHER_FIELDS'),\n schemaOptions: g.fieldIds.map((id) => schemaMap.get(id)).filter((s) => !!s) as FieldSchemaInterface[],\n }));\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n }\n\n private fieldAllowsMultipleMappings(fieldType: FieldType): boolean {\n const typesWithMultipleMappings = [FieldType.FIELD_TYPE_TAG];\n return typesWithMultipleMappings.includes(fieldType || FieldType.FIELD_TYPE_INVALID);\n }\n\n availableFieldGroups$(objectType: ObjectType): Observable {\n return combineLatest([this.listFieldGroups$(objectType), this.fieldMappings$]).pipe(\n map(([groups, mappings]) => {\n const fieldIDs = mappings.map((m) => m.fieldId);\n return groups\n .map((g) => {\n const fg = {\n label: g.label,\n } as FieldSchemaGroup;\n fg.schemaOptions = g.schemaOptions.filter((option) => {\n return !fieldIDs.includes(option.fieldId) || this.fieldAllowsMultipleMappings(option.fieldType);\n });\n return fg;\n })\n .filter((g) => g.schemaOptions.length > 0);\n }),\n );\n }\n\n resetMappings(): void {\n this.stepperService.setCSVHeaderMappings([]);\n }\n\n addMapping(header: string, fieldId: string): void {\n this.stepperService.csvMappings$\n .pipe(\n take(1),\n map((mappings) => {\n const newMappings = Object.assign([], mappings); // If we don't do this, the stepper service won't detect the change\n newMappings.push({\n headerName: header,\n fieldId: fieldId,\n } as CSVHeaderMappingInterface);\n return newMappings;\n }),\n tap((mappings) => this.stepperService.setCSVHeaderMappings(mappings)),\n )\n .subscribe();\n }\n\n removeMapping(header: string): void {\n this.stepperService.csvMappings$\n .pipe(\n map((mappings) => {\n return mappings.filter((mapping) => mapping.headerName !== header);\n }),\n tap((mappings) => this.stepperService.setCSVHeaderMappings(mappings)),\n take(1),\n )\n .subscribe();\n }\n}\n", "import { Inject, Injectable } from '@angular/core';\nimport { Papa } from 'ngx-papaparse';\nimport { Observable, switchMap, map } from 'rxjs';\nimport { CRMImporterApiService, CSVHeaderMapping } from '@vendasta/crm';\nimport { CrmDependencies, CrmInjectionToken, ObjectType } from '@galaxy/crm/static';\n\ninterface CSVInfo {\n rows: string;\n isEstimate: boolean;\n firstRow: { [key: string]: string };\n rowMapping: CSVHeaderMapping[];\n}\n\n@Injectable()\nexport class CsvParserService {\n private namespace$ = this.config.namespace$;\n\n constructor(\n @Inject(CrmInjectionToken) private readonly config: CrmDependencies,\n private csvParser: Papa,\n private importer: CRMImporterApiService,\n ) {}\n\n parseCSV(crmObjectType: ObjectType, filename: string): Observable {\n return this.namespace$.pipe(\n switchMap((namespace) =>\n this.importer.getMultiFileUploadData({\n namespace,\n crmObjectType,\n filename: [filename],\n }),\n ),\n map((response) => response.files && response.files[0]),\n map((file) => {\n const headers = file?.headers || [];\n const firstRowEntries = headers.map(({ name, sampleData }) => [name, (sampleData && sampleData[0]) || '']);\n const firstRow = Object.fromEntries(firstRowEntries);\n return {\n rows: file.size.totalRows || '0',\n isEstimate: !!file?.size?.isEstimate,\n firstRow: firstRow,\n rowMapping: file?.mappingSuggestions,\n };\n }),\n );\n }\n}\n"], "mappings": "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", "names": ["BulkImportStepperService", "constructor", "state", "csvFilename$", "select", "csvRows$", "csvIsRowEstimate$", "csvFirstRow$", "csvMappings$", "fileUploadCompleted$", "fieldMappingCompleted$", "reset", "initial", "csvFilename", "csvRows", "csvIsRowEstimate", "csvFirstRow", "csvHeaderMappings", "fileUploadCompleted", "fieldMappingCompleted", "set", "isStepComplete", "stepKey", "get", "completeStep", "complete", "setCSVFilename", "setCSVRows", "isEstimated", "setCSVFirstRow", "setCSVHeaderMappings", "\u0275\u0275inject", "RxState", "factory", "\u0275fac", "_BulkImportStepperService", "FieldMappingService", "constructor", "translate", "formService", "stepperService", "fieldMappings$", "csvMappings$", "getFieldSchemaMap$", "objectType", "listAllFormFields$", "pipe", "map", "schemas", "schemaMap", "Map", "schema", "set", "fieldId", "listFieldGroups$", "fieldSchemaMap$", "fieldGroups$", "listAllObjectFormFieldGroups$", "combineLatest", "groups", "g", "label", "instant", "description", "schemaOptions", "fieldIds", "id", "get", "filter", "s", "shareReplay", "refCount", "bufferSize", "fieldAllowsMultipleMappings", "fieldType", "FieldType", "FIELD_TYPE_TAG", "includes", "FIELD_TYPE_INVALID", "availableFieldGroups$", "mappings", "fieldIDs", "m", "fg", "option", "length", "resetMappings", "setCSVHeaderMappings", "addMapping", "header", "take", "newMappings", "Object", "assign", "push", "headerName", "tap", "subscribe", "removeMapping", "mapping", "\u0275\u0275inject", "TranslateService", "CrmFormService", "BulkImportStepperService", "factory", "\u0275fac", "_FieldMappingService", "CsvParserService", "constructor", "config", "csvParser", "importer", "namespace$", "parseCSV", "crmObjectType", "filename", "pipe", "switchMap", "namespace", "getMultiFileUploadData", "map", "response", "files", "file", "firstRowEntries", "headers", "name", "sampleData", "firstRow", "Object", "fromEntries", "rows", "size", "totalRows", "isEstimate", "rowMapping", "mappingSuggestions", "\u0275\u0275inject", "CrmInjectionToken", "Papa", "CRMImporterApiService", "factory", "\u0275fac", "_CsvParserService"] }