From ee37eb3f12490f706771cf823ae98788a7601b5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles-=C3=89ric?= Date: Wed, 25 Sep 2019 11:13:54 -0400 Subject: [PATCH] feat(import-export): EPSG not mandatory and fix encoding issue (#428) --- .../import-export/import-export.component.ts | 9 ++- .../import-export/shared/export.service.ts | 4 +- .../lib/import-export/shared/export.utils.ts | 76 +++++++------------ .../import-export/shared/import.service.ts | 2 +- packages/utils/src/lib/file.ts | 30 ++++++++ packages/utils/src/lib/index.ts | 1 + 6 files changed, 70 insertions(+), 52 deletions(-) create mode 100644 packages/utils/src/lib/file.ts diff --git a/packages/geo/src/lib/import-export/import-export/import-export.component.ts b/packages/geo/src/lib/import-export/import-export/import-export.component.ts index 099b5a9c2..33d74af90 100644 --- a/packages/geo/src/lib/import-export/import-export/import-export.component.ts +++ b/packages/geo/src/lib/import-export/import-export/import-export.component.ts @@ -33,6 +33,8 @@ export class ImportExportComponent implements OnDestroy, OnInit { private layers$$: Subscription; + private espgCodeRegex = new RegExp('^\\d{4,6}'); + @Input() map: IgoMap; constructor( @@ -58,9 +60,14 @@ export class ImportExportComponent implements OnDestroy, OnInit { } importFiles(files: File[]) { + let inputProj = this.inputProj; + if (this.espgCodeRegex.test(inputProj)) { + inputProj =`EPSG:${inputProj}`; + } + this.loading$.next(true); for (const file of files) { - this.importService.import(file, this.inputProj).subscribe( + this.importService.import(file, inputProj).subscribe( (features: Feature[]) => this.onFileImportSuccess(file, features), (error: Error) => this.onFileImportError(file, error), () => { diff --git a/packages/geo/src/lib/import-export/shared/export.service.ts b/packages/geo/src/lib/import-export/shared/export.service.ts index 0d704220b..4006205c8 100644 --- a/packages/geo/src/lib/import-export/shared/export.service.ts +++ b/packages/geo/src/lib/import-export/shared/export.service.ts @@ -1,13 +1,13 @@ import { Injectable } from '@angular/core'; import { ConfigService } from '@igo2/core'; +import { downloadContent } from '@igo2/utils'; import { Observable, Observer } from 'rxjs'; import * as olformat from 'ol/format'; import OlFeature from 'ol/Feature'; -import { downloadContent } from './export.utils'; import { ExportFormat } from './export.type'; import { ExportInvalidFileError, @@ -159,6 +159,8 @@ export class ExportService { form.setAttribute('method', 'post'); form.setAttribute('target', '_blank'); form.setAttribute('action', url); + form.acceptCharset = 'UTF-8'; + form.enctype = 'application/x-www-form-urlencoded; charset=utf-8;'; const geojsonField = document.createElement('input'); geojsonField.setAttribute('type', 'hidden'); diff --git a/packages/geo/src/lib/import-export/shared/export.utils.ts b/packages/geo/src/lib/import-export/shared/export.utils.ts index 14560dc57..c26917b3f 100644 --- a/packages/geo/src/lib/import-export/shared/export.utils.ts +++ b/packages/geo/src/lib/import-export/shared/export.utils.ts @@ -1,13 +1,38 @@ -import { MessageService, LanguageService } from '@igo2/core'; - import { getEntityProperty, EntityTableColumn, EntityTableColumnRenderer } from '@igo2/common'; +import { MessageService, LanguageService } from '@igo2/core'; +import { downloadContent } from '@igo2/utils'; import { ExportNothingToExportError } from './export.errors'; +export function handleFileExportError( + error: Error, + messageService: MessageService, + languageService: LanguageService +) { + if (error instanceof ExportNothingToExportError) { + handleNothingToExportError(messageService, languageService); + return; + } + const translate = languageService.translate; + const title = translate.instant('igo.geo.export.failed.title'); + const message = translate.instant('igo.geo.export.failed.text'); + messageService.error(message, title); +} + +export function handleNothingToExportError( + messageService: MessageService, + languageService: LanguageService +) { + const translate = languageService.translate; + const title = translate.instant('igo.geo.export.nothing.title'); + const message = translate.instant('igo.geo.export.nothing.text'); + messageService.error(message, title); +} + /** * Export array to CSV * @@ -38,50 +63,3 @@ export function entitiesToRowData(entities: object[], columns: EntityTableColumn }); }); } - -/** - * Trigger download of a file - * - * @param content File content - * @param mimeType File mime type - * @param fileName File name - */ -export function downloadContent(content: string, mimeType: string, fileName: string) { - const element = document.createElement('a'); - element.setAttribute( - 'href', - `data:${mimeType},${encodeURIComponent(content)}` - ); - element.setAttribute('download', fileName); - element.style.display = 'none'; - document.body.appendChild(element); - - element.click(); - - document.body.removeChild(element); -} - -export function handleFileExportError( - error: Error, - messageService: MessageService, - languageService: LanguageService -) { - if (error instanceof ExportNothingToExportError) { - handleNothingToExportError(messageService, languageService); - return; - } - const translate = languageService.translate; - const title = translate.instant('igo.geo.export.failed.title'); - const message = translate.instant('igo.geo.export.failed.text'); - messageService.error(message, title); -} - -export function handleNothingToExportError( - messageService: MessageService, - languageService: LanguageService -) { - const translate = languageService.translate; - const title = translate.instant('igo.geo.export.nothing.title'); - const message = translate.instant('igo.geo.export.nothing.text'); - messageService.error(message, title); -} diff --git a/packages/geo/src/lib/import-export/shared/import.service.ts b/packages/geo/src/lib/import-export/shared/import.service.ts index d094088f3..8e3f75d48 100644 --- a/packages/geo/src/lib/import-export/shared/import.service.ts +++ b/packages/geo/src/lib/import-export/shared/import.service.ts @@ -74,7 +74,7 @@ export class ImportService { return undefined; } else if ( mimeType === 'application/json' || - ['json', 'geojson', 'kml'].indexOf(extension) >= 0 + ['json', 'geojson', 'kml', 'gpx'].indexOf(extension) >= 0 ) { return this.importFile; } else if (this.ogreUrl !== undefined) { diff --git a/packages/utils/src/lib/file.ts b/packages/utils/src/lib/file.ts new file mode 100644 index 000000000..192c0539f --- /dev/null +++ b/packages/utils/src/lib/file.ts @@ -0,0 +1,30 @@ +/** + * Trigger download of a file + * + * @param content File content + * @param mimeType File mime type + * @param fileName File name + */ +export function downloadContent(content: string, mimeType: string, fileName: string) { + const uri = `data:${mimeType},${encodeURIComponent(content)}`; + downloadFromUri(uri, fileName); +} + +/** + * Trigger download of a file + * + * @param content File content + * @param mimeType File mime type + * @param fileName File name + */ +export function downloadFromUri(uri: string, fileName: string) { + const element = document.createElement('a'); + element.setAttribute('href', uri); + element.setAttribute('download', fileName); + element.style.display = 'none'; + document.body.appendChild(element); + + element.click(); + + document.body.removeChild(element); +} diff --git a/packages/utils/src/lib/index.ts b/packages/utils/src/lib/index.ts index 3bb90f488..b8b148e22 100644 --- a/packages/utils/src/lib/index.ts +++ b/packages/utils/src/lib/index.ts @@ -2,6 +2,7 @@ export * from './base64'; export * from './clipboard'; export * from './change'; export * from './change.interface'; +export * from './file'; export * from './object-utils'; export * from './strenum'; export * from './string-utils';