in web/frontend/src/app/pages/streams/components/modals/modal-import-csv-file/modal-import-csv-file.component.ts [115:327]
nextStep() {
if (this.importStepIs('uploading')) {
this.nextButtonDisabled = true;
if (!this.importFromTextFileService.previewReceived) {
this.importFromTextFileService.getPreviews()
.pipe(
switchMap(() => this.globalFiltersService.getFilters()),
switchMap(filters => {
this.importFromTextFileService.updateSettings('timeZone', filters.timezone[0].name);
return combineLatest([
this.importFromTextFileService.getSettings(),
this.importFromTextFileService.getAllFileHeaders()
])
}),
first(),
takeUntil(this.destroy$),
catchError(err => throwError(err))
)
.subscribe({
next: ([res, allHeaders]: any) => {
this.importFromTextFileService.originalMapping = [...res.mappings];
if (this.importFromTextFileService.changedMappingFields.size) {
const changedMappingItems = this.importFromTextFileService.currentMappings
.filter(item => {
return this.importFromTextFileService.changedMappingFields.has(item.field.name) &&
(!item.column || allHeaders.includes(item.column))
});
this.importFromTextFileService.currentMappings = res.mappings.map(item => {
const changed = changedMappingItems.find(mapping => mapping.field.name === item.field.name);
return changed ?? item;
})
} else {
this.importFromTextFileService.currentMappings = res.mappings;
}
const savedMapping = localStorage.getItem(`mapping-${this.importFromTextFileService.streamId}`);
if (savedMapping) {
const filteredSavedMapping = JSON.parse(savedMapping)
.filter(item => {
return (allHeaders.includes(item.column) || !item.column) && (!item.field.messageType ||
this.importFromTextFileService.streamSchema.map(field => field.name).includes(item.field.name))
})
filteredSavedMapping.forEach(item => {
const fieldIndex = this.importFromTextFileService.currentMappings
.findIndex(mappingItem => mappingItem.field.name === item.field.name);
this.importFromTextFileService.currentMappings[fieldIndex] = {
...this.importFromTextFileService.currentMappings[fieldIndex],
column: item.column
}
this.importFromTextFileService.changedMappingFields.add(item.field.name);
})
}
if (!this.importFromTextFileService.settingsReceived) {
this.importFromTextFileService.instrumentTypes = res.generalSettings.instrumentType;
this.importFromTextFileService.defaultSettings = {
...res.generalSettings,
timeZone: this.importFromTextFileService.settings.timeZone,
strategy: res.generalSettings.strategy ?? 'SKIP',
symbols: null,
instrumentType: [ this.importFromTextFileService.instrumentTypes[0] ]
}
const savedSettings = localStorage.getItem(`settings-${this.importFromTextFileService.streamId}`);
this.importFromTextFileService.editedSettings = JSON.parse(savedSettings);
this.importFromTextFileService.settings = {
...this.importFromTextFileService.defaultSettings,
...this.importFromTextFileService.editedSettings,
}
this.importFromTextFileService.defaultTypeToKeywordMapping = res.generalSettings.typeToKeywordMapping;
this.importFromTextFileService.allSymbols = res.generalSettings.symbols;
const keywordField = this.importFromTextFileService.currentMappings.find(item => item.column && item.field.name === 'keyword');
if (!keywordField?.column) {
this.importFromTextFileService.updateSettings('strategy', 'SKIP');
}
this.importFromTextFileService.updateSettings('defaultMessageType',
Object.keys(res.generalSettings.typeToKeywordMapping)[0]);
const defaultType = Object.entries(this.importFromTextFileService.settings.typeToKeywordMapping)[0];
this.settingsForMapping = {
separator: this.importFromTextFileService.settings.separator,
charset: this.importFromTextFileService.settings.charset,
typeToKeyWord: this.importFromTextFileService.keywordColumnMapped ?
this.importFromTextFileService.settings.typeToKeywordMapping :
{ [defaultType[0]]: defaultType[1] }
}
}
this.importFromTextFileService.previewReceived = true;
this.importFromTextFileService.settingsReceived = true;
this.nextButtonDisabled = false;
this.currentStepIndex += 1;
},
error: () => this.nextButtonDisabled = false
})
} else {
this.nextButtonDisabled = false;
this.currentStepIndex += 1;
}
} else if (this.importStepIs('parameters-setting')) {
this.nextButtonDisabled = true;
let mappingValidation$;
const mappingSettingsChanged = this.importFromTextFileService.settings.charset !== this.settingsForMapping.charset ||
this.importFromTextFileService.settings.separator !== this.settingsForMapping.separator ||
this.importFromTextFileService.typeToKeyWordMappingsChanged(
this.settingsForMapping.typeToKeyWord,
this.importFromTextFileService.settings.typeToKeywordMapping, true);
if (mappingSettingsChanged) {
mappingValidation$ = this.importFromTextFileService.getNewMapping()
.pipe(
tap((mappings: any[]) => {
this.importFromTextFileService.currentMappings = mappings;
this.settingsForMapping = {
separator: this.importFromTextFileService.settings.separator,
charset: this.importFromTextFileService.settings.charset,
typeToKeyWord: this.importFromTextFileService.settings.typeToKeywordMapping
}
}),
switchMap(() => this.importFromTextFileService.validateMappingGeneral())
)
} else {
mappingValidation$ = this.importFromTextFileService.validateMappingGeneral();
}
mappingValidation$
.pipe(first(), takeUntil(this.destroy$))
.subscribe({
next: () => {
this.currentStepIndex += 1;
setTimeout(() => this.nextButtonDisabled = false, 1000);
},
error: () => this.nextButtonDisabled = false
});
} else if (this.importStepIs('time-range')) {
this.minHeight = 200;
if (this.timeRange.inputsAreDisabled.startTime) {
this.importFromTextFileService.updateSettings('startTime', null);
}
if (this.timeRange.inputsAreDisabled.endTime) {
this.importFromTextFileService.updateSettings('endTime', null);
}
this.importFromTextFileService.sendFileSize().pipe(
switchMap((uploadId: string) => {
this.importFromTextFileService.uploadingId = uploadId;
return this.importFromTextFileService.uploadAllFiles();
}),
switchMap(() => {
return merge(
this.importFromTextFileService.onUploadProgress(), this.importFromTextFileService.onSocketClosed()
);
}),
takeUntil(this.cancel$),
takeUntil(this.destroy$),
).subscribe((importProgress: ImportProgress | RxStompState) => {
if (typeof importProgress === 'object') {
if (importProgress.type === ImportProgressType.progress) {
this.importProgress = +(parseFloat(importProgress.message)).toFixed(2);
const progress = +(((this.importProgress + this.fileUploadingProgress) / 2) * 100).toFixed();
this.progress$.next(progress);
}
if (
importProgress.type === ImportProgressType.state &&
importProgress.message === ImportStateMessage.finished
) {
this.progress$.next(100);
this.importFinished = true;
this.saveChangedSettingsAndMapping();
}
if (
[
ImportProgressType.info,
ImportProgressType.error,
ImportProgressType.warning,
].includes(importProgress.type)
) {
this.messages.push(importProgress);
this.scrollToTheLatestMessage();
}
if (importProgress.type === ImportProgressType.error) {
this.importError = true;
this.messages.push(importProgress);
this.scrollToTheLatestMessage();
}
if (this.messages.length) {
this.minHeight = 650;
}
} else {
this.socketDisconnected = true;
}
})
this.currentStepIndex += 1;
} else {
this.currentStepIndex += 1;
this.nextButtonDisabled = true;
setTimeout(() => this.nextButtonDisabled = false, 1000);
}
}