diff --git a/src/utils/helper.js b/src/utils/helper.js index 853274c2..1bcb1b60 100644 --- a/src/utils/helper.js +++ b/src/utils/helper.js @@ -188,22 +188,30 @@ const uploadFile = ({ }) } -const downloadWindowTitle = i18n.t('Loading exported data') -const downloadWindowHtml = ` -
-

${downloadWindowTitle}

-
-` - // call stub function if available const locationAssign = (url) => { if (window.locationAssign) { window.locationAssign(url) } else { - const downloadWindow = window.open(url, '_blank') - - downloadWindow.document.title = downloadWindowTitle - downloadWindow.document.body.innerHTML = downloadWindowHtml // does not work in Chrome + try { + const downloadUrl = url.startsWith('..') + ? new URL(url, document.baseURI).href + : url + + const urlFilePart = new URL(downloadUrl).pathname.split('/').pop() + const [, filename] = urlFilePart.match(/(^[^.]+)(\..+$)/) + + const link = document.createElement('a') + link.href = downloadUrl + link.download = filename + link.target = '_blank' + link.click() + + return link + } catch (err) { + console.error(err) + window.open(url, '_blank') + } } } diff --git a/src/utils/helper.test.js b/src/utils/helper.test.js new file mode 100644 index 00000000..effdbc67 --- /dev/null +++ b/src/utils/helper.test.js @@ -0,0 +1,60 @@ +import { locationAssign } from './helper.js' + +describe('locationAssign', () => { + it('should create a file name based on the params', () => { + const url = + 'https://debug.dhis2.org/dev/api/tracker/trackedEntities.json?ouMode=CAPTURE&format=json&includeDeleted=false&dataElementIdScheme=UID&eventIdScheme=UID&orgUnitIdScheme=UID&idScheme=UID&attachment=trackedEntities.json&paging=false&totalPages=false&program=lxAQ7Zs9VYR' + const link = locationAssign(url) + expect(link.download).toEqual('trackedEntities') + }) + it('should create url with orgUnits', () => { + const url = + 'https://debug.dhis2.org/dev/api/tracker/trackedEntities.json?ouMode=SELECTED&includeDeleted=false&dataElementIdScheme=UID&eventIdScheme=UID&orgUnitIdScheme=UID&idScheme=UID&attachment=trackedEntities.json&paging=false&totalPages=false&orgUnits=O6uvpzGd5pu,fdc6uOvgoji&program=kla3mAPgvCH' + const link = locationAssign(url) + expect(link.download).toEqual('trackedEntities') + }) + it('should create url with tracked entities', () => { + const url = + 'https://debug.dhis2.org/dev/api/tracker/trackedEntities.json?ouMode=SELECTED&includeDeleted=false&dataElementIdScheme=UID&eventIdScheme=UID&orgUnitIdScheme=UID&idScheme=UID&attachment=trackedEntities.json&paging=false&totalPages=false&orgUnits=ImspTQPwCqd&trackedEntityType=bVkFYAvoUCP' + const link = locationAssign(url) + expect(link.download).toEqual('trackedEntities') + }) + it('should create url with CSV', () => { + const url = + 'https://debug.dhis2.org/dev/api/tracker/trackedEntities.csv?ouMode=SELECTED&includeDeleted=false&dataElementIdScheme=UID&eventIdScheme=UID&orgUnitIdScheme=UID&idScheme=UID&attachment=trackedEntities.csv&paging=false&totalPages=false&orgUnits=ImspTQPwCqd&program=lxAQ7Zs9VYR' + const link = locationAssign(url) + expect(link.download).toEqual('trackedEntities') + }) + + it('should create url with events zip', () => { + const url = + 'https://debug.dhis2.org/dev/api/tracker/events.json.zip?links=false&paging=false&totalPages=false&orgUnit=fwH9ipvXde9&program=VBqh0ynB2wv&includeDeleted=false&dataElementIdScheme=UID&orgUnitIdScheme=UID&idScheme=UID&attachment=events.json.zip&occurredAfter=2023-12-12&occurredBefore=2024-03-12&ouMode=CHILDREN&format=json' + const link = locationAssign(url) + expect(link.download).toEqual('events') + }) + + it('should create url with events gzip', () => { + const url = + 'https://debug.dhis2.org/dev/api/tracker/events.json.gz?links=false&paging=false&totalPages=false&orgUnit=ImspTQPwCqd&program=lxAQ7Zs9VYR&includeDeleted=false&dataElementIdScheme=UID&orgUnitIdScheme=UID&idScheme=UID&attachment=events.json.gz&occurredAfter=2023-12-12&occurredBefore=2024-03-12&ouMode=SELECTED&format=json' + const link = locationAssign(url) + expect(link.download).toEqual('events') + }) + it('should work with relative URLs when bundled in DHIS2', () => { + Object.defineProperty(global.document, 'baseURI', { + value: 'http://localhost:8080/dhis-web-import-export/index.html#/export/tei', + }) + const url = + '../api/tracker/trackedEntities.json?ouMode=SELECTED&includeDeleted=false&dataElementIdScheme=UID&eventIdScheme=UID&orgUnitIdScheme=UID&idScheme=UID&attachment=trackedEntities.json&paging=false&totalPages=false&orgUnits=ImspTQPwCqd&program=lxAQ7Zs9VYR' + const link = locationAssign(url) + expect(link.download).toEqual('trackedEntities') + }) + it('should work with relative URLs when bundled in DHIS2 for zip', () => { + Object.defineProperty(global.document, 'baseURI', { + value: 'http://localhost:8080/dhis-web-import-export/index.html#/export/tei', + }) + const url = + '../api/tracker/events.json.zip?links=false&paging=false&totalPages=false&orgUnit=ImspTQPwCqd&program=lxAQ7Zs9VYR&includeDeleted=false&dataElementIdScheme=UID&orgUnitIdScheme=UID&idScheme=UID&attachment=events.json.zip&occurredAfter=2023-12-12&occurredBefore=2024-03-12&ouMode=SELECTED&format=json' + const link = locationAssign(url) + expect(link.download).toEqual('events') + }) +})