From 3ad073fb5b0fd6b8c9bad9a2fdcb904d6129923c Mon Sep 17 00:00:00 2001 From: Cy Rossignol Date: Mon, 13 Oct 2025 10:30:21 -0700 Subject: [PATCH] Add ability to import OSM XML directly Signed-off-by: Cy Rossignol --- pages/workspace/create/file.vue | 3 ++- services/import/file.ts | 3 ++- util/xml.ts | 6 ++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pages/workspace/create/file.vue b/pages/workspace/create/file.vue index 8b7d3a5..318b842 100644 --- a/pages/workspace/create/file.vue +++ b/pages/workspace/create/file.vue @@ -90,7 +90,8 @@ const complete = computed(() => && projectGroupId.value !== null && datasetType.value !== null && datasetFile.value instanceof File - && datasetFile.value.name.endsWith('.zip') + && (datasetFile.value.name.endsWith('.zip') + || datasetFile.value.name.endsWith('.xml')) ); function onFileChange(e) { diff --git a/services/import/file.ts b/services/import/file.ts index 4359774..1f2189c 100644 --- a/services/import/file.ts +++ b/services/import/file.ts @@ -4,6 +4,7 @@ import { OsmApiClient, OsmApiClientError, osm2osc } from '~/services/osm'; import { openTdeiPathwaysArchive, pathways2osc } from '~/services/pathways'; import { TdeiClient, TdeiClientError, TdeiConversionError } from '~/services/tdei'; import { WorkspacesClient, WorkspacesClientError } from '~/services/workspaces'; +import { isMimeXml } from '~/util/xml'; const status = { idle: 'Idle', @@ -62,7 +63,7 @@ export class FileImporter { } async _run(data: Blob, workspace): Promise { - if (workspace.type === 'osw') { + if (workspace.type === 'osw' && !isMimeXml(data.type)) { this._context.status = status.convertOsm; data = await this._tdeiClient.convertDataset(data, 'osw', 'osm', workspace.tdeiProjectGroupId); } diff --git a/util/xml.ts b/util/xml.ts index 2c13b61..fadbb19 100644 --- a/util/xml.ts +++ b/util/xml.ts @@ -2,6 +2,12 @@ const xmlParser = new DOMParser(); const xmlSerializer = new XMLSerializer(); +export function isMimeXml(mimeType: string): boolean { + return mimeType === 'text/xml' + || mimeType === 'application/xml' + || mimeType.startsWith('application/') && mimeType.endsWith('+xml'); +} + export function parse(input: string): XMLDocument { return xmlParser.parseFromString(input, 'application/xml'); }