diff --git a/CHANGELOG.md b/CHANGELOG.md index a31e2f4eb..bedba5d58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ +# [100.3.0](https://github.com/dhis2/maps-app/compare/v100.2.3...v100.3.0) (2024-01-12) + + +### Features + +* add support for hash routing in line with other analytics apps [DHIS2-15762] ([#3009](https://github.com/dhis2/maps-app/issues/3009)) ([b25267d](https://github.com/dhis2/maps-app/commit/b25267d33a8ab5a136f34516ba1bc802ae9e51b3)) + +## [100.2.3](https://github.com/dhis2/maps-app/compare/v100.2.2...v100.2.3) (2023-12-21) + + +### Bug Fixes + +* conditionally set PR title in dhis2-verify-app workflow ([#3089](https://github.com/dhis2/maps-app/issues/3089)) ([03eed2d](https://github.com/dhis2/maps-app/commit/03eed2d6fd3f697686183743ba30b079eb175f62)) +* report as MAP_VIEW not VISUALIZATION_VIEW ([#3086](https://github.com/dhis2/maps-app/issues/3086)) ([008e7fe](https://github.com/dhis2/maps-app/commit/008e7fe32508b403d251cb1b617c23c5feaf8063)) +* **translations:** sync translations from transifex (dev) ([dcf7743](https://github.com/dhis2/maps-app/commit/dcf7743af6ddbb4c12cef377e982c1ea0f45d3c6)) +* **translations:** sync translations from transifex (dev) ([7d98a8a](https://github.com/dhis2/maps-app/commit/7d98a8abab9d71d90c2f51b1cb4eb01598661c3f)) +* **translations:** sync translations from transifex (dev) ([6e8b82b](https://github.com/dhis2/maps-app/commit/6e8b82bbbb338883358e9c69311f0b3bbbe94224)) + ## [100.2.2](https://github.com/dhis2/maps-app/compare/v100.2.1...v100.2.2) (2023-11-03) diff --git a/cypress/integration/dataTable.cy.js b/cypress/integration/dataTable.cy.js new file mode 100644 index 000000000..ecfff1d48 --- /dev/null +++ b/cypress/integration/dataTable.cy.js @@ -0,0 +1,47 @@ +import { EXTENDED_TIMEOUT } from '../support/util.js' + +const map = { + id: 'eDlFx0jTtV9', + name: 'ANC: LLITN Cov Chiefdom this year', + downloadFileNamePrefix: 'ANC LLITN Cov Chiefdom this year', + cardTitle: 'ANC LLITN coverage', +} + +describe('data table', () => { + it('opens data table', () => { + cy.visit(`/#/${map.id}`, EXTENDED_TIMEOUT) + cy.get('canvas', EXTENDED_TIMEOUT).should('be.visible') + + cy.getByDataTest('moremenubutton').first().click() + + cy.getByDataTest('more-menu') + .find('li') + .not('.disabled') + .should('have.length', 6) + + cy.getByDataTest('more-menu') + .find('li') + .contains('Show data table') + .click() + + //check that the bottom panel is present + cy.getByDataTest('bottom-panel').should('be.visible') + + // check number of columns + cy.getByDataTest('bottom-panel') + .find('[role="columnheader"]') + .should('have.length', 10) + + // try the filtering + cy.getByDataTest('bottom-panel') + .find('[role="columnheader"]') + .containsExact('Name') + .siblings('input') + .type('Kakua') + + // check that the filter worked + cy.getByDataTest('bottom-panel') + .find('.ReactVirtualized__Table__row') + .should('have.length', 1) + }) +}) diff --git a/cypress/integration/interpretations.cy.js b/cypress/integration/interpretations.cy.js index eb6d3352a..0e7e37d20 100644 --- a/cypress/integration/interpretations.cy.js +++ b/cypress/integration/interpretations.cy.js @@ -5,7 +5,7 @@ import { EXTENDED_TIMEOUT } from '../support/util.js' const MAP_TITLE = 'test ' + new Date().toUTCString().slice(-24, -4) context('Interpretations', () => { it('opens the interpretations panel for a map', () => { - cy.visit('/?id=ZBjCfSaLSqD', EXTENDED_TIMEOUT) + cy.visit('/#/ZBjCfSaLSqD', EXTENDED_TIMEOUT) const Layer = new ThematicLayer() Layer.validateCardTitle('ANC LLITN coverage') cy.get('canvas.maplibregl-canvas').should('be.visible') @@ -65,8 +65,12 @@ context('Interpretations', () => { .find('canvas.maplibregl-canvas') .should('be.visible') + cy.url().should('include', 'interpretationId=') + cy.get('button').contains('Hide interpretation').click() + cy.url().should('not.include', 'interpretationId=') + deleteMap() }) @@ -75,7 +79,7 @@ context('Interpretations', () => { 'postDataStatistics' ) cy.visit( - '/?id=ZBjCfSaLSqD&interpretationId=yKqhXZdeJ6a', + '/#/ZBjCfSaLSqD?interpretationId=yKqhXZdeJ6a', EXTENDED_TIMEOUT ) //ANC: LLITN coverage district and facility @@ -90,12 +94,16 @@ context('Interpretations', () => { ) .should('be.visible') + cy.url().should('include', 'interpretationId=') + cy.getByDataTest('interpretation-modal') .findByDataTest('dhis2-modal-close-button') .click() cy.getByDataTest('interpretation-modal').should('not.exist') + cy.url().should('not.include', 'interpretationId=') + cy.getByDataTest('interpretations-list').should('be.visible') }) }) diff --git a/cypress/integration/mapDownload.cy.js b/cypress/integration/mapDownload.cy.js new file mode 100644 index 000000000..93b23ed4a --- /dev/null +++ b/cypress/integration/mapDownload.cy.js @@ -0,0 +1,112 @@ +import { EXTENDED_TIMEOUT } from '../support/util.js' + +const mapWithThematicLayer = { + id: 'eDlFx0jTtV9', + name: 'ANC: LLITN Cov Chiefdom this year', + downloadFileName: 'ANC LLITN Cov Chiefdom this year.png', + cardTitle: 'ANC LLITN coverage', +} + +const assertDownloadSettingChecked = (label, isChecked) => { + cy.getByDataTest('download-settings') + .find('label') + .contains(label) + .find('input') + .should(`${isChecked ? '' : 'not.'}be.checked`) +} + +const clickDownloadSetting = (label) => { + cy.getByDataTest('download-settings') + .find('label') + .contains(label) + .find('input') + .click() +} + +describe('Map Download', () => { + beforeEach(() => { + cy.task('emptyDownloadsFolder') + }) + + it('downloads a map', () => { + cy.visit(`/#/${mapWithThematicLayer.id}`, EXTENDED_TIMEOUT) + cy.get('canvas', EXTENDED_TIMEOUT).should('be.visible') + + cy.get('[data-test="layercard"]') + .find('h2') + .contains(mapWithThematicLayer.cardTitle, EXTENDED_TIMEOUT) + + cy.getByDataTest('dhis2-analytics-hovermenubar') + .find('button') + .contains('Download') + .click() + + cy.log('confirm that download page is open') + cy.getByDataTest('download-settings').should('be.visible') + cy.get('canvas.maplibregl-canvas').should('be.visible') + cy.get('button').contains('Exit download mode').should('be.visible') + cy.url().should('contain', `/#/${mapWithThematicLayer.id}/download`) + + // check the current settings + assertDownloadSettingChecked('Show map name', true) + + cy.getByDataTest('download-map-info') + .find('h1') + .contains(mapWithThematicLayer.name) + .should('be.visible') + + assertDownloadSettingChecked('Show map description', false) + assertDownloadSettingChecked('Show legend', true) + cy.getByDataTest('download-map-info') + .findByDataTest('download-legend-title') + .should('have.length', 1) + + assertDownloadSettingChecked('Show overview map', true) + cy.getByDataTest('download-map-info') + .findByDataTest('overview-map') + .should('be.visible') + + // make some changes + clickDownloadSetting('Show map name') + cy.getByDataTest('download-map-info').find('h1').should('not.exist') + + clickDownloadSetting('Show north arrow') + cy.getByDataTest('north-arrow').should('not.exist') + + clickDownloadSetting('Show overview map') + cy.getByDataTest('download-map-info') + .findByDataTest('overview-map') + .should('not.exist') + + clickDownloadSetting('Show legend') + cy.getByDataTest('download-map-info').should('not.exist') + + // and download the map + cy.getByDataTest('download-settings') + .find('button') + .contains('Download') + .click() + + // check for downloaded file + cy.wait(3000) // eslint-disable-line cypress/no-unnecessary-waiting + cy.waitUntil( + () => cy.task('getLastDownloadFilePath').then((result) => result), + { timeout: 3000, interval: 100 } + ).then((filePath) => { + expect(filePath).to.include(mapWithThematicLayer.downloadFileName) + + cy.readFile(filePath, EXTENDED_TIMEOUT).should((buffer) => + expect(buffer.length).to.be.gt(10000) + ) + }) + + // leave download mode + cy.get('button').contains('Exit download mode').click() + cy.url().should('contain', `/#/${mapWithThematicLayer.id}`) + cy.url().should('not.contain', '/download') + cy.getByDataTest('download-settings').should('not.exist') + cy.get('[data-test="layercard"]') + .find('h2') + .contains(mapWithThematicLayer.cardTitle, EXTENDED_TIMEOUT) + }) +}) diff --git a/cypress/integration/orgUnitInfo.cy.js b/cypress/integration/orgUnitInfo.cy.js index 2c69f29e1..cc7439f09 100644 --- a/cypress/integration/orgUnitInfo.cy.js +++ b/cypress/integration/orgUnitInfo.cy.js @@ -1,23 +1,25 @@ -// import { ThematicLayer } from '../elements/thematic_layer.js' -import { EXTENDED_TIMEOUT } from '../support/util.js' +import { CURRENT_YEAR, EXTENDED_TIMEOUT } from '../support/util.js' -context('OrgUnitInfo', () => { - it.skip('opens the panel for an OrgUnit', () => { - cy.visit('/?id=ZBjCfSaLSqD', EXTENDED_TIMEOUT) - cy.wait(5000) // eslint-disable-line cypress/no-unnecessary-waiting +describe('OrgUnitInfo', () => { + it('opens the panel for an OrgUnit', () => { + cy.visit('/#/ZBjCfSaLSqD', EXTENDED_TIMEOUT) cy.get('canvas').should('be.visible') + cy.wait(5000) // eslint-disable-line cypress/no-unnecessary-waiting - cy.getByDataTest('dhis2-map-container') + cy.get('#dhis2-map-container') .findByDataTest('dhis2-uicore-componentcover', EXTENDED_TIMEOUT) .should('not.exist') - cy.get('.dhis2-map').click(300, 100) //Bombali - cy.contains('View profile').click() + cy.get('.dhis2-map').click(350, 350) //Click somewhere on the map + + cy.get('.maplibregl-popup').contains('View profile').click() // check the Org Unit Profile panel cy.getByDataTest('org-unit-profile').contains( 'Organisation unit profile' ) - cy.getByDataTest('org-unit-info').find('h3').contains('Bombali') + + // // TODO - find a way to ensure that "Bombali" is the orgunit that was clicked on + // // cy.getByDataTest('org-unit-info').find('h3').contains('Bombali') cy.getByDataTest('org-unit-data') .findByDataTest('button-previous-year') @@ -27,7 +29,7 @@ context('OrgUnitInfo', () => { .findByDataTest('dhis2-uicore-circularloader') .should('not.exist') - cy.getByDataTest('year-select').contains('2022') + cy.getByDataTest('year-select').contains(CURRENT_YEAR - 1) cy.getByDataTest('org-unit-data-table').contains('Expected pregnancies') }) diff --git a/cypress/integration/routes.cy.js b/cypress/integration/routes.cy.js new file mode 100644 index 000000000..0153b3054 --- /dev/null +++ b/cypress/integration/routes.cy.js @@ -0,0 +1,185 @@ +import { ThematicLayer } from '../elements/thematic_layer.js' +import { EXTENDED_TIMEOUT } from '../support/util.js' + +context('Routes', () => { + it('loads root route', () => { + cy.visit('/', { timeout: 50000 }) + cy.get('canvas', EXTENDED_TIMEOUT).should('be.visible') + cy.title().should('equal', 'Maps | DHIS2') + }) + + it('loads with map id (legacy)', () => { + cy.intercept({ method: 'POST', url: /dataStatistics/ }).as( + 'postDataStatistics' + ) + cy.visit('/?id=ytkZY3ChM6J', EXTENDED_TIMEOUT) //ANC: 3rd visit coverage last year by district + + cy.wait('@postDataStatistics') + .its('response.statusCode') + .should('eq', 201) + + cy.get('canvas', EXTENDED_TIMEOUT).should('be.visible') + + const Layer = new ThematicLayer() + Layer.validateCardTitle('ANC 3 Coverage') + }) + + it('loads with map id (hash)', () => { + cy.visit('/#/zDP78aJU8nX', EXTENDED_TIMEOUT) //ANC: 1st visit coverage (%) by district last year + + cy.get('canvas', EXTENDED_TIMEOUT).should('be.visible') + + const Layer = new ThematicLayer() + Layer.validateCardTitle('ANC 1 Coverage') + }) + + it('loads currentAnalyticalObject (legacy)', () => { + cy.intercept('**/userDataStore/analytics/settings', { + fixture: 'analyticalObject.json', + }) + + cy.visit('/?currentAnalyticalObject=true', EXTENDED_TIMEOUT) + cy.get('canvas', EXTENDED_TIMEOUT).should('be.visible') + + cy.contains('button', 'Proceed').click() + + const Layer = new ThematicLayer() + Layer.validateCardTitle('ANC 1 Coverage') + cy.get('canvas.maplibregl-canvas').should('be.visible') + }) + + it('loads currentAnalyticalObject (hash)', () => { + cy.intercept('**/userDataStore/analytics/settings', { + fixture: 'analyticalObject.json', + }) + + cy.visit('/#/currentAnalyticalObject', EXTENDED_TIMEOUT) + cy.get('canvas', EXTENDED_TIMEOUT).should('be.visible') + + cy.contains('button', 'Proceed').click() + + const Layer = new ThematicLayer() + Layer.validateCardTitle('ANC 1 Coverage') + cy.get('canvas.maplibregl-canvas').should('be.visible') + }) + + it('loads with map id (legacy) and interpretationid lowercase', () => { + cy.intercept({ method: 'POST', url: /dataStatistics/ }).as( + 'postDataStatistics' + ) + cy.visit( + '/?id=ZBjCfSaLSqD&interpretationid=yKqhXZdeJ6a', + EXTENDED_TIMEOUT + ) //ANC: LLITN coverage district and facility + + cy.wait('@postDataStatistics') + .its('response.statusCode') + .should('eq', 201) + + cy.getByDataTest('interpretation-modal') + .find('h1') + .contains( + 'Viewing interpretation: ANC: LLITN coverage district and facility' + ) + .should('be.visible') + + cy.getByDataTest('interpretation-modal') + .find('canvas') + .should('be.visible') + + cy.getByDataTest('interpretation-modal') + .contains( + 'Koinadugu has a very high LLITN coverage despite low density of facilities providing nets.' + ) + .should('be.visible') + }) + + it('loads with map id (legacy) and interpretationId uppercase', () => { + cy.intercept({ method: 'POST', url: /dataStatistics/ }).as( + 'postDataStatistics' + ) + cy.visit( + '/?id=ZBjCfSaLSqD&interpretationId=yKqhXZdeJ6a', + EXTENDED_TIMEOUT + ) //ANC: LLITN coverage district and facility + + cy.wait('@postDataStatistics') + .its('response.statusCode') + .should('eq', 201) + + cy.getByDataTest('interpretation-modal') + .find('h1') + .contains( + 'Viewing interpretation: ANC: LLITN coverage district and facility' + ) + .should('be.visible') + }) + + it('loads with map id (hash) and interpretationId', () => { + cy.intercept({ method: 'POST', url: /dataStatistics/ }).as( + 'postDataStatistics' + ) + cy.visit( + '/#/ZBjCfSaLSqD?interpretationId=yKqhXZdeJ6a', + EXTENDED_TIMEOUT + ) //ANC: LLITN coverage district and facility + + cy.wait('@postDataStatistics') + .its('response.statusCode') + .should('eq', 201) + + cy.getByDataTest('interpretation-modal') + .find('h1') + .contains( + 'Viewing interpretation: ANC: LLITN coverage district and facility' + ) + .should('be.visible') + }) + + it('loads download page for map id (hash)', () => { + cy.intercept({ method: 'POST', url: /dataStatistics/ }).as( + 'postDataStatistics' + ) + cy.visit('/#/ZBjCfSaLSqD/download', EXTENDED_TIMEOUT) //ANC: LLITN coverage district and facility + + cy.wait('@postDataStatistics') + .its('response.statusCode') + .should('eq', 201) + + cy.getByDataTest('download-settings').should('be.visible') + cy.get('canvas.maplibregl-canvas').should('be.visible') + cy.get('button').contains('Exit download mode').should('be.visible') + }) + + it('loads download page currentAnalyticalObject (hash)', () => { + cy.intercept('**/userDataStore/analytics/settings', { + fixture: 'analyticalObject.json', + }) + + cy.visit('/#/currentAnalyticalObject/download', EXTENDED_TIMEOUT) + + cy.contains('button', 'Proceed').click() + + cy.getByDataTest('download-settings').should('be.visible') + cy.get('canvas.maplibregl-canvas').should('be.visible') + cy.get('button').contains('Exit download mode').should('be.visible') + }) + + it('loads download page for new map', () => { + cy.visit('/', EXTENDED_TIMEOUT) + + cy.get('canvas.maplibregl-canvas').should('be.visible') + cy.get('button').contains('Download').click() + + cy.getByDataTest('download-settings').should('be.visible') + cy.get('canvas.maplibregl-canvas').should('be.visible') + cy.get('button').contains('Exit download mode').should('be.visible') + cy.url().should('include', '#/download') + + cy.get('button').contains('Exit download mode').click() + + cy.url().should('not.include', 'download') + + cy.get('button').contains('Add layer').should('be.visible') + }) +}) diff --git a/cypress/integration/smoke.cy.js b/cypress/integration/smoke.cy.js deleted file mode 100644 index be0d0f82d..000000000 --- a/cypress/integration/smoke.cy.js +++ /dev/null @@ -1,83 +0,0 @@ -import { ThematicLayer } from '../elements/thematic_layer.js' -import { EXTENDED_TIMEOUT } from '../support/util.js' - -context('Smoke Test', () => { - it('loads', () => { - cy.visit('/', EXTENDED_TIMEOUT) - cy.get('canvas', EXTENDED_TIMEOUT).should('be.visible') - cy.title().should('equal', 'Maps | DHIS2') - }) - - it('loads with map id', () => { - cy.intercept({ method: 'POST', url: /dataStatistics/ }).as( - 'postDataStatistics' - ) - cy.visit('/?id=ytkZY3ChM6J', EXTENDED_TIMEOUT) //ANC: 3rd visit coverage last year by district - - cy.wait('@postDataStatistics') - .its('response.statusCode') - .should('eq', 201) - - cy.get('canvas', EXTENDED_TIMEOUT).should('be.visible') - - const Layer = new ThematicLayer() - Layer.validateCardTitle('ANC 3 Coverage') - }) - - it('loads currentAnalyticalObject', () => { - cy.intercept('**/userDataStore/analytics/settings', { - fixture: 'analyticalObject.json', - }) - - cy.visit('/?currentAnalyticalObject=true', EXTENDED_TIMEOUT) - cy.get('canvas', EXTENDED_TIMEOUT).should('be.visible') - - cy.contains('button', 'Proceed').click() - - const Layer = new ThematicLayer() - Layer.validateCardTitle('ANC 1 Coverage') - cy.get('canvas.maplibregl-canvas').should('be.visible') - }) - - it('loads with map id and interpretationid lowercase', () => { - cy.intercept({ method: 'POST', url: /dataStatistics/ }).as( - 'postDataStatistics' - ) - cy.visit( - '/?id=ZBjCfSaLSqD&interpretationid=yKqhXZdeJ6a', - EXTENDED_TIMEOUT - ) //ANC: LLITN coverage district and facility - - cy.wait('@postDataStatistics') - .its('response.statusCode') - .should('eq', 201) - - cy.getByDataTest('interpretation-modal') - .find('h1') - .contains( - 'Viewing interpretation: ANC: LLITN coverage district and facility' - ) - .should('be.visible') - }) - - it('loads with map id and interpretationId uppercase', () => { - cy.intercept({ method: 'POST', url: /dataStatistics/ }).as( - 'postDataStatistics' - ) - cy.visit( - '/?id=ZBjCfSaLSqD&interpretationId=yKqhXZdeJ6a', - EXTENDED_TIMEOUT - ) //ANC: LLITN coverage district and facility - - cy.wait('@postDataStatistics') - .its('response.statusCode') - .should('eq', 201) - - cy.getByDataTest('interpretation-modal') - .find('h1') - .contains( - 'Viewing interpretation: ANC: LLITN coverage district and facility' - ) - .should('be.visible') - }) -}) diff --git a/i18n/en.pot b/i18n/en.pot index fa68b662c..334a8b396 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2023-10-23T12:55:26.288Z\n" -"PO-Revision-Date: 2023-10-23T12:55:26.288Z\n" +"POT-Creation-Date: 2024-01-11T09:20:59.829Z\n" +"PO-Revision-Date: 2024-01-11T09:20:59.829Z\n" msgid "Untitled map, {{date}}" msgstr "Untitled map, {{date}}" diff --git a/package.json b/package.json index 434ddf0e5..0678986a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "maps-app", - "version": "100.2.2", + "version": "100.3.0", "description": "DHIS2 Maps", "license": "BSD-3-Clause", "author": "Bjørn Sandvik", @@ -20,7 +20,7 @@ "postinstall": "patch-package" }, "devDependencies": { - "@dhis2/cli-app-scripts": "^10.3.11", + "@dhis2/cli-app-scripts": "^10.4.0", "@dhis2/cli-style": "^10.5.1", "@dhis2/cypress-commands": "^10.0.3", "@dhis2/cypress-plugins": "^10.0.3", @@ -32,24 +32,24 @@ "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.7", "enzyme-to-json": "^3.6.2", - "eslint-plugin-cypress": "^2.13.3", + "eslint-plugin-cypress": "^2.15.1", "patch-package": "^6.5.1", "redux-devtools": "^3.7.0", "redux-mock-store": "^1.5.4", - "start-server-and-test": "^2.0.1" + "start-server-and-test": "^2.0.3" }, "dependencies": { "@dhis2/analytics": "^26.2.0", - "@dhis2/app-runtime": "^3.9.4", + "@dhis2/app-runtime": "^3.10.2", "@dhis2/app-runtime-adapter-d2": "^1.1.0", "@dhis2/app-service-alerts": "^3.9.4", "@dhis2/app-service-datastore": "^1.0.0-beta.3", "@dhis2/d2-i18n": "^1.1.3", "@dhis2/maps-gl": "^3.8.6", - "@dhis2/ui": "^8.16.0", + "@dhis2/ui": "^9.2.0", "@krakenjs/post-robot": "^11.0.0", "@reportportal/agent-js-cypress": "git+https://github.com/dhis2/agent-js-cypress.git#develop", - "@reportportal/agent-js-jest": "^5.0.6", + "@reportportal/agent-js-jest": "^5.0.7", "abortcontroller-polyfill": "^1.7.5", "array-move": "^4.0.0", "classnames": "^2.3.2", @@ -64,10 +64,12 @@ "d3-time": "^3.1.0", "d3-time-format": "^4.1.0", "file-saver": "^2.0.5", + "history": "^5.3.0", "html-to-image": "^1.11.1", "lodash": "^4.17.21", "loglevel": "^1.8.1", "prop-types": "^15.8.1", + "query-string": "^8.1.0", "react": "^16.14.0", "react-dom": "^16.14.0", "react-redux": "^8.1.2", @@ -78,5 +80,8 @@ "redux-thunk": "^2.4.2", "styled-jsx": "^4.0.1", "url-polyfill": "^1.1.12" + }, + "resolutions": { + "@dhis2/ui": "^9.2.0" } } diff --git a/src/AppWrapper.js b/src/AppWrapper.js index 88f05c397..282a0fa8b 100644 --- a/src/AppWrapper.js +++ b/src/AppWrapper.js @@ -1,8 +1,9 @@ import { CachedDataQueryProvider } from '@dhis2/analytics' import { D2Shim } from '@dhis2/app-runtime-adapter-d2' import { DataStoreProvider } from '@dhis2/app-service-datastore' -import { CenteredContent, CircularLoader } from '@dhis2/ui' +import { CssVariables, CenteredContent, CircularLoader } from '@dhis2/ui' import log from 'loglevel' +import queryString from 'query-string' import React from 'react' import { Provider as ReduxProvider } from 'react-redux' import App from './components/app/App.js' @@ -12,6 +13,7 @@ import store from './store/index.js' import { USER_DATASTORE_NAMESPACE } from './util/analyticalObject.js' import { appQueries, providerDataTransformation } from './util/app.js' import './locales/index.js' +import history from './util/history.js' log.setLevel( process.env.NODE_ENV === 'production' ? log.levels.INFO : log.levels.TRACE @@ -38,7 +40,44 @@ const d2Config = { ], } +const replaceLegacyUrl = () => { + // support legacy urls + const queryParams = queryString.parse(window.location.search, { + parseBooleans: true, + }) + const [base] = window.location.href.split('?') + + if (queryParams.id) { + // /?id=ytkZY3ChM6J + // /?id=ZBjCfSaLSqD&interpretationid=yKqhXZdeJ6a + // /?id=ZBjCfSaLSqD&interpretationId=yKqhXZdeJ6a + + const interpretationId = + queryParams.interpretationId || queryParams.interpretationid + + const interpretationQueryParams = interpretationId + ? `?interpretationId=${interpretationId}` + : '' + + // replace history && hash history + window.history.replaceState( + {}, + '', + `${base}#/${queryParams.id}${interpretationQueryParams}` + ) + history.replace(`/${queryParams.id}${interpretationQueryParams}`) + } else if (queryParams.currentAnalyticalObject === true) { + // /?currentAnalyticalObject=true + + // replace history && hash history + window.history.replaceState({}, '', `${base}#/currentAnalyticalObject`) + history.replace('/currentAnalyticalObject') + } +} + const AppWrapper = () => { + replaceLegacyUrl() + return ( @@ -67,6 +106,7 @@ const AppWrapper = () => { > + diff --git a/src/actions/analyticalObject.js b/src/actions/analyticalObject.js index a85a73b37..583eda8f3 100644 --- a/src/actions/analyticalObject.js +++ b/src/actions/analyticalObject.js @@ -1,11 +1,4 @@ -import log from 'loglevel' import * as types from '../constants/actionTypes.js' -import { - clearAnalyticalObjectFromUrl, - hasSingleDataDimension, - getThematicLayerFromAnalyticalObject, -} from '../util/analyticalObject.js' -import { addLayer } from './layers.js' export const setAnalyticalObject = (ao) => ({ type: types.ANALYTICAL_OBJECT_SET, @@ -15,17 +8,3 @@ export const setAnalyticalObject = (ao) => ({ export const clearAnalyticalObject = () => ({ type: types.ANALYTICAL_OBJECT_CLEAR, }) - -export const tSetAnalyticalObject = (ao) => async (dispatch) => { - try { - clearAnalyticalObjectFromUrl() - return hasSingleDataDimension(ao) - ? getThematicLayerFromAnalyticalObject(ao).then((layer) => - dispatch(addLayer(layer)) - ) - : dispatch(setAnalyticalObject(ao)) - } catch (e) { - log.error('Could not load current analytical object') - return e - } -} diff --git a/src/actions/map.js b/src/actions/map.js index 2a8596c87..7287efce4 100644 --- a/src/actions/map.js +++ b/src/actions/map.js @@ -1,9 +1,4 @@ -import log from 'loglevel' import * as types from '../constants/actionTypes.js' -import { getFallbackBasemap } from '../constants/basemaps.js' -import { dataStatisticsMutation } from '../util/apiDataStatistics.js' -import { addOrgUnitPaths } from '../util/helpers.js' -import { fetchMap } from '../util/requests.js' export const newMap = () => ({ type: types.MAP_NEW, @@ -46,34 +41,3 @@ export const showEarthEngineValue = (layerId, coordinate) => ({ export const clearAlerts = () => ({ type: types.MAP_ALERTS_CLEAR, }) - -export const tOpenMap = - ({ mapId, defaultBasemap, engine, basemaps }) => - async (dispatch) => { - try { - const map = await fetchMap(mapId, engine, defaultBasemap) - - // record visualization view - engine.mutate(dataStatisticsMutation, { - variables: { id: mapId }, - onError: (error) => console.error('Error: ', error), - }) - - const basemapConfig = - basemaps.find((bm) => bm.id === map.basemap.id) || - getFallbackBasemap() - - const basemap = { ...map.basemap, ...basemapConfig } - - dispatch( - setMap({ - ...map, - mapViews: addOrgUnitPaths(map.mapViews), - basemap, - }) - ) - } catch (e) { - log.error(e) - return e - } - } diff --git a/src/components/app/App.js b/src/components/app/App.js index cb359998c..30fb6c030 100644 --- a/src/components/app/App.js +++ b/src/components/app/App.js @@ -1,58 +1,62 @@ -import { useCachedDataQuery } from '@dhis2/analytics' -import { useDataEngine } from '@dhis2/app-runtime' -import { useSetting } from '@dhis2/app-service-datastore' -import { CssVariables } from '@dhis2/ui' -import React, { useEffect } from 'react' -import { useDispatch } from 'react-redux' -import { tSetAnalyticalObject } from '../../actions/analyticalObject.js' -import { setInterpretation } from '../../actions/interpretations.js' -import { tOpenMap } from '../../actions/map.js' -import { CURRENT_AO_KEY } from '../../util/analyticalObject.js' -import { getUrlParameter } from '../../util/requests.js' -import AppLayout from './AppLayout.js' +import cx from 'classnames' +import React, { useState } from 'react' +import { useSelector } from 'react-redux' +import BottomPanel from '../datatable/BottomPanel.js' +import DownloadModeMenu from '../download/DownloadMenubar.js' +import DownloadSettings from '../download/DownloadSettings.js' +import LayersPanel from '../layers/LayersPanel.js' +import LayersLoader from '../loaders/LayersLoader.js' +import MapPosition from '../map/MapPosition.js' +import AppMenu from './AppMenu.js' +import DetailsPanel from './DetailsPanel.js' +import ModalContainer from './ModalContainer.js' import './App.css' -import './styles/App.module.css' +import styles from './styles/App.module.css' +import { useLoadMap } from './useLoadMap.js' const App = () => { - const { systemSettings, basemaps } = useCachedDataQuery() - const defaultBasemap = systemSettings.keyDefaultBaseMap - const engine = useDataEngine() - const [currentAO] = useSetting(CURRENT_AO_KEY) - const dispatch = useDispatch() + useLoadMap() - useEffect(() => { - async function fetchData() { - const mapId = getUrlParameter('id') - if (mapId) { - await dispatch( - tOpenMap({ - mapId, - defaultBasemap, - engine, - basemaps, - }) - ) - } else if (getUrlParameter('currentAnalyticalObject') === 'true') { - await dispatch(tSetAnalyticalObject(currentAO)) - } + const [interpretationsRenderCount, setInterpretationsRenderCount] = + useState(1) - // analytics interpretation component uses camelcase - const interpretationId = - getUrlParameter('interpretationid') || - getUrlParameter('interpretationId') - - if (interpretationId) { - dispatch(setInterpretation(interpretationId)) - } - } + const dataTableOpen = useSelector((state) => !!state.dataTable) + const downloadModeOpen = useSelector( + (state) => !!state.download.downloadMode + ) + const detailsPanelOpen = useSelector( + (state) => state.ui.rightPanelOpen && !state.orgUnitProfile + ) - fetchData() - }, [engine, currentAO, defaultBasemap, basemaps, dispatch]) + const onFileMenuAction = () => + detailsPanelOpen && + setInterpretationsRenderCount(interpretationsRenderCount + 1) return ( <> - - + {downloadModeOpen ? ( + + ) : ( + + )} +
+ {downloadModeOpen ? : } +
+ + {dataTableOpen && } +
+ {!downloadModeOpen && ( + + )} +
+ + ) } diff --git a/src/components/app/AppLayout.js b/src/components/app/AppLayout.js deleted file mode 100644 index 21b42a987..000000000 --- a/src/components/app/AppLayout.js +++ /dev/null @@ -1,66 +0,0 @@ -import cx from 'classnames' -import React, { useState } from 'react' -import { useSelector } from 'react-redux' -import AlertStack from '../alerts/AlertStack.js' -import BottomPanel from '../datatable/BottomPanel.js' -import DownloadModeMenu from '../download/DownloadMenubar.js' -import DownloadSettings from '../download/DownloadSettings.js' -import LayerEdit from '../edit/LayerEdit.js' -import LayersPanel from '../layers/LayersPanel.js' -import LayersLoader from '../loaders/LayersLoader.js' -import ContextMenu from '../map/ContextMenu.js' -import MapPosition from '../map/MapPosition.js' -import OpenAsMapDialog from '../openAs/OpenAsMapDialog.js' -import AppMenu from './AppMenu.js' -import DetailsPanel from './DetailsPanel.js' -import styles from './styles/AppLayout.module.css' - -const AppLayout = () => { - const [interpretationsRenderCount, setInterpretationsRenderCount] = - useState(1) - - const dataTableOpen = useSelector((state) => !!state.dataTable) - const downloadModeOpen = useSelector( - (state) => !!state.download.downloadMode - ) - const detailsPanelOpen = useSelector( - (state) => state.ui.rightPanelOpen && !state.orgUnitProfile - ) - - const onFileMenuAction = () => - detailsPanelOpen && - setInterpretationsRenderCount(interpretationsRenderCount + 1) - - return ( - <> - {downloadModeOpen ? ( - - ) : ( - - )} -
- {downloadModeOpen ? : } -
- - {dataTableOpen && } -
- {!downloadModeOpen && ( - - )} -
- - - - - - - ) -} - -export default AppLayout diff --git a/src/components/app/FileMenu.js b/src/components/app/FileMenu.js index 65dca2f30..77f79eb80 100644 --- a/src/components/app/FileMenu.js +++ b/src/components/app/FileMenu.js @@ -1,22 +1,21 @@ import { FileMenu as UiFileMenu, useCachedDataQuery } from '@dhis2/analytics' -import { useDataMutation, useDataEngine } from '@dhis2/app-runtime' +import { useDataMutation } from '@dhis2/app-runtime' import { useAlert } from '@dhis2/app-service-alerts' import i18n from '@dhis2/d2-i18n' import PropTypes from 'prop-types' import React from 'react' import { useSelector, useDispatch } from 'react-redux' -import { newMap, tOpenMap, setMapProps } from '../../actions/map.js' +import { setMapProps } from '../../actions/map.js' import { ALERT_CRITICAL, ALERT_MESSAGE_DYNAMIC, ALERT_OPTIONS_DYNAMIC, ALERT_SUCCESS_DELAY, } from '../../constants/alerts.js' -import { dataStatisticsMutation } from '../../util/apiDataStatistics.js' import { cleanMapConfig } from '../../util/favorites.js' -import { fetchMap } from '../../util/requests.js' +import history from '../../util/history.js' -const saveMapMutation = { +const updateMapMutation = { resource: 'maps', type: 'update', id: ({ id }) => id, @@ -27,7 +26,7 @@ const saveMapMutation = { data: ({ data }) => data, } -const saveAsNewMapMutation = { +const createMapMutation = { resource: 'maps', type: 'create', data: ({ data }) => data, @@ -52,10 +51,9 @@ const getSaveFailureMessage = (message) => }) const FileMenu = ({ onFileMenuAction }) => { - const engine = useDataEngine() const map = useSelector((state) => state.map) const dispatch = useDispatch() - const { systemSettings, currentUser, basemaps } = useCachedDataQuery() + const { systemSettings, currentUser } = useCachedDataQuery() const defaultBasemap = systemSettings.keyDefaultBaseMap //alerts const saveAlert = useAlert(ALERT_MESSAGE_DYNAMIC, ALERT_OPTIONS_DYNAMIC) @@ -65,33 +63,26 @@ const FileMenu = ({ onFileMenuAction }) => { ALERT_SUCCESS_DELAY ) const fileMenuErrorAlert = useAlert(ALERT_MESSAGE_DYNAMIC, ALERT_CRITICAL) - const openMapErrorAlert = useAlert(ALERT_MESSAGE_DYNAMIC, ALERT_CRITICAL) - const [saveMapMutate] = useDataMutation(saveMapMutation, { - onError: (e) => + const [putMap] = useDataMutation(updateMapMutation, { + onError: (e) => { saveAlert.show({ msg: getSaveFailureMessage(e.message), isError: true, - }), + }) + }, }) - const [saveAsNewMapMutate] = useDataMutation(saveAsNewMapMutation, { - onError: (e) => + + const [postMap] = useDataMutation(createMapMutation, { + onError: (e) => { saveAsAlert.show({ msg: getSaveFailureMessage(e.message), isError: true, - }), - }) - - const [postDataStatistics] = useDataMutation(dataStatisticsMutation, { - onError: (e) => console.error('Error:', e.message), + }) + }, }) - const onFileMenuError = (e) => - fileMenuErrorAlert.show({ - msg: e.message, - }) - - const saveMap = async () => { + const onSave = async () => { const config = cleanMapConfig({ config: map, defaultBasemapId: defaultBasemap, @@ -101,74 +92,41 @@ const FileMenu = ({ onFileMenuAction }) => { config.mapViews.forEach((view) => delete view.id) } - await saveMapMutate({ + await putMap({ id: map.id, data: config, }) - postDataStatistics({ id: map.id }) - - saveAlert.show({ msg: getSavedMessage(config.name) }) - } - - const openMap = async (id) => { - const error = await dispatch( - tOpenMap({ - mapId: id, - defaultBasemap, - engine, - basemaps, - }) - ) - if (error) { - openMapErrorAlert.show({ - msg: i18n.t(`Error while opening map: ${error.message}`, { - nsSeparator: ';', - }), - }) + saveAlert.show({ msg: getSavedMessage(map.name) }) + if (map.id) { + history.replace(`/${map.id}`) } } - const saveAsNewMap = async ({ name, description }) => { - const config = { + const onSaveAs = async ({ name, description }) => { + const data = { ...cleanMapConfig({ config: map, defaultBasemapId: defaultBasemap, }), name: getMapName(name), - description: description, + description, } - delete config.id + delete data.id - if (config.mapViews) { - config.mapViews.forEach((view) => delete view.id) + if (data.mapViews) { + data.mapViews.forEach((view) => delete view.id) } - const response = await saveAsNewMapMutate({ - data: config, - }) - - if (response.status === 'OK') { - const newMapId = response.response.uid - postDataStatistics({ id: newMapId }) - const newMapConfig = await fetchMap( - newMapId, - engine, - defaultBasemap - ) - - delete newMapConfig.basemap - delete newMapConfig.mapViews + const res = await postMap({ data }) - dispatch(setMapProps(newMapConfig)) + if (res.status === 'OK') { + saveAsAlert.show({ msg: getSavedMessage(getMapName(name)) }) - saveAsAlert.show({ msg: getSavedMessage(config.name) }) - } else { - saveAsAlert.show({ - msg: getSaveFailureMessage(response.message), - isError: true, - }) + if (res.response.uid) { + history.push(`/${res.response.uid}`) + } } } @@ -182,7 +140,27 @@ const FileMenu = ({ onFileMenuAction }) => { deleteAlert.show() } - const onNew = () => dispatch(newMap()) + const onNew = () => { + if (history.location.pathname === '/') { + history.replace('/') + } else { + history.push('/') + } + } + + const onOpen = async (id) => { + const path = `/${id}` + if (history.location.pathname === path) { + history.replace(path) + } else { + history.push(path) + } + } + + const onFileMenuError = (e) => + fileMenuErrorAlert.show({ + msg: e.message, + }) return ( { fileType="map" fileObject={map} onNew={onNew} - onOpen={openMap} - onSave={saveMap} - onSaveAs={saveAsNewMap} + onOpen={onOpen} + onSave={onSave} + onSaveAs={onSaveAs} onRename={onRename} onDelete={onDelete} onError={onFileMenuError} diff --git a/src/components/app/ModalContainer.js b/src/components/app/ModalContainer.js new file mode 100644 index 000000000..3b6766997 --- /dev/null +++ b/src/components/app/ModalContainer.js @@ -0,0 +1,21 @@ +import React from 'react' +import { useSelector } from 'react-redux' +import AlertStack from '../alerts/AlertStack.js' +import LayerEdit from '../edit/LayerEdit.js' +import ContextMenu from '../map/ContextMenu.js' +import OpenAsMapDialog from '../openAs/OpenAsMapDialog.js' + +const ModalContainer = () => { + const analyticalObject = useSelector((state) => state.analyticalObject) + + return ( + <> + + + + {analyticalObject && } + + ) +} + +export default ModalContainer diff --git a/src/components/app/styles/App.module.css b/src/components/app/styles/App.module.css index c8ccb4856..53f48d602 100644 --- a/src/components/app/styles/App.module.css +++ b/src/components/app/styles/App.module.css @@ -30,3 +30,19 @@ background: #cbcdcf; border-radius: 3px; } + +.content { + display: flex; + flex-direction: row; + height: calc(100vh - var(--header-height) - var(--toolbar-height)); +} + +.downloadContent { + margin-top: var(--header-height); + height: calc(100vh - var(--header-height)); +} + +.appMapAndTable { + flex: auto; + position: relative; +} diff --git a/src/components/app/styles/AppLayout.module.css b/src/components/app/styles/AppLayout.module.css deleted file mode 100644 index be2ac384e..000000000 --- a/src/components/app/styles/AppLayout.module.css +++ /dev/null @@ -1,15 +0,0 @@ -.content { - display: flex; - flex-direction: row; - height: calc(100vh - var(--header-height) - var(--toolbar-height)); -} - -.downloadContent { - margin-top: var(--header-height); - height: calc(100vh - var(--header-height)); -} - -.appMapAndTable { - flex: auto; - position: relative; -} diff --git a/src/components/app/useLoadMap.js b/src/components/app/useLoadMap.js new file mode 100644 index 000000000..7660df3c0 --- /dev/null +++ b/src/components/app/useLoadMap.js @@ -0,0 +1,113 @@ +import { useCachedDataQuery } from '@dhis2/analytics' +import { useDataEngine } from '@dhis2/app-runtime' +import log from 'loglevel' +import { useRef, useEffect, useCallback } from 'react' +import { useDispatch } from 'react-redux' +import { setAnalyticalObject } from '../../actions/analyticalObject.js' +import { setDownloadMode } from '../../actions/download.js' +import { setInterpretation } from '../../actions/interpretations.js' +import { newMap, setMap } from '../../actions/map.js' +import { getFallbackBasemap } from '../../constants/basemaps.js' +import { CURRENT_AO_KEY } from '../../util/analyticalObject.js' +import { dataStatisticsMutation } from '../../util/apiDataStatistics.js' +import { addOrgUnitPaths } from '../../util/helpers.js' +import history, { + getHashUrlParams, + defaultHashUrlParams, +} from '../../util/history.js' +import { fetchMap } from '../../util/requests.js' + +export const useLoadMap = () => { + const previousParamsRef = useRef(defaultHashUrlParams) + const { systemSettings, basemaps } = useCachedDataQuery() + const defaultBasemap = systemSettings.keyDefaultBaseMap + const engine = useDataEngine() + const dispatch = useDispatch() + + const loadMap = useCallback( + async (hashLocation) => { + previousParamsRef.current = getHashUrlParams(hashLocation) + + if (hashLocation.pathname === '/') { + dispatch(newMap()) + return + } + + const { mapId, isDownload, interpretationId } = + previousParamsRef.current + + if (mapId === CURRENT_AO_KEY) { + dispatch(newMap()) + dispatch(setAnalyticalObject(true)) + if (isDownload) { + dispatch(setDownloadMode(true)) + } + return + } + + try { + const map = await fetchMap(mapId, engine, defaultBasemap) + + engine.mutate(dataStatisticsMutation, { + variables: { id: mapId }, + onError: (error) => log.error('Error: ', error), + }) + + const basemapConfig = + basemaps.find(({ id }) => id === map.basemap.id) || + basemaps.find(({ id }) => id === defaultBasemap) || + getFallbackBasemap() + + dispatch( + setMap({ + ...map, + mapViews: addOrgUnitPaths(map.mapViews), + basemap: { ...map.basemap, ...basemapConfig }, + }) + ) + + if (interpretationId) { + dispatch(setInterpretation(interpretationId)) + } else if (isDownload) { + dispatch(setDownloadMode(true)) + } + } catch (e) { + log.error(e) + dispatch(newMap()) + } + }, + [basemaps, defaultBasemap, dispatch, engine] + ) + + useEffect(() => { + loadMap(history.location) + }, [loadMap]) + + useEffect(() => { + const unlisten = history.listen(({ action, location }) => { + const { + mapId: prevMapId, + interpretationId: prevInterpretationId, + isDownload: prevIsDownload, + } = previousParamsRef.current + + const { mapId, interpretationId, isDownload } = + getHashUrlParams(location) + + if (action === 'REPLACE' || prevMapId !== mapId) { + loadMap(location) + return + } + + if (isDownload !== prevIsDownload) { + dispatch(setDownloadMode(isDownload)) + previousParamsRef.current.isDownload = isDownload + } else if (interpretationId !== prevInterpretationId) { + dispatch(setInterpretation(interpretationId)) + previousParamsRef.current.interpretationId = interpretationId + } + }) + + return () => unlisten && unlisten() + }, [loadMap, dispatch]) +} diff --git a/src/components/core/Checkbox.js b/src/components/core/Checkbox.js index e32ea0bfe..71cdeebad 100644 --- a/src/components/core/Checkbox.js +++ b/src/components/core/Checkbox.js @@ -13,8 +13,9 @@ const Checkbox = ({ tooltip, onChange, className, + dataTest, }) => ( -
+
{ ref={panelRef} className={styles.bottomPanel} style={{ height: tableHeight }} + data-test="bottom-panel" > { - const dispatch = useDispatch() - return ( - ) diff --git a/src/components/download/DownloadLegend.js b/src/components/download/DownloadLegend.js index c1b775b20..c89439ff8 100644 --- a/src/components/download/DownloadLegend.js +++ b/src/components/download/DownloadLegend.js @@ -10,7 +10,7 @@ const DownloadLegend = ({ layers }) => .reverse() .map((legend, index) => (
-

+

{legend.title} {legend.period}

diff --git a/src/components/download/DownloadMapInfo.js b/src/components/download/DownloadMapInfo.js index aa68f223e..10d4d9662 100644 --- a/src/components/download/DownloadMapInfo.js +++ b/src/components/download/DownloadMapInfo.js @@ -26,7 +26,10 @@ const DownloadMapInfo = ({ map, isSplitView }) => { }, [showName, showDescription, showInLegend, height]) return ( -
+
{showName && name &&

{name}

} {showDescription && description &&

{description}

} diff --git a/src/components/download/DownloadMenubar.js b/src/components/download/DownloadMenubar.js index a6b7c476a..5486ea4cb 100644 --- a/src/components/download/DownloadMenubar.js +++ b/src/components/download/DownloadMenubar.js @@ -1,13 +1,10 @@ import i18n from '@dhis2/d2-i18n' import { Button, IconChevronLeft24, colors } from '@dhis2/ui' import React, { useEffect } from 'react' -import { useDispatch } from 'react-redux' -import { setDownloadMode } from '../../actions/download.js' +import { closeDownloadMode } from '../../util/history.js' import styles from './styles/DownloadMenubar.module.css' const DownloadMenubar = () => { - const dispatch = useDispatch() - useEffect(() => { const header = document.getElementsByTagName('header')[0] header.style.display = 'none' @@ -18,7 +15,7 @@ const DownloadMenubar = () => { return (
- diff --git a/src/components/download/DownloadSettings.js b/src/components/download/DownloadSettings.js index 533752a47..b6efedb22 100644 --- a/src/components/download/DownloadSettings.js +++ b/src/components/download/DownloadSettings.js @@ -2,10 +2,11 @@ import i18n from '@dhis2/d2-i18n' import { Button, ButtonStrip } from '@dhis2/ui' import React, { useState, useMemo, useCallback, useEffect } from 'react' import { useSelector, useDispatch } from 'react-redux' -import { setDownloadMode, setDownloadConfig } from '../../actions/download.js' +import { setDownloadConfig } from '../../actions/download.js' import { standardizeFilename } from '../../util/dataDownload.js' import { downloadMapImage, downloadSupport } from '../../util/export-image.js' import { getSplitViewLayer } from '../../util/helpers.js' +import { closeDownloadMode } from '../../util/history.js' import { getMapName } from '../app/FileMenu.js' import Drawer from '../core/Drawer.js' import { Checkbox, Help } from '../core/index.js' @@ -35,11 +36,6 @@ const DownloadSettings = () => { [mapViews] ) - const onClose = useCallback( - () => dispatch(setDownloadMode(false)), - [dispatch] - ) - const onDownload = useCallback(() => { const filename = standardizeFilename(getMapName(name), 'png') let mapEl = document.getElementById('dhis2-map-container') @@ -76,7 +72,10 @@ const DownloadSettings = () => { const showMarginsCheckbox = false // Not in use return ( -
+

{i18n.t('Download map')}

@@ -85,6 +84,7 @@ const DownloadSettings = () => { <> @@ -199,7 +199,7 @@ const DownloadSettings = () => {
- - - - - - ) - } - - onSelectDataDim = (selectedDataDims) => { - this.setState({ selectedDataDims }) - } + const [selectedDataDims, setSelectedDataDims] = useState([firstDimensionId]) - onProceedClick = async () => { - const { ao, addLayer, clearAnalyticalObject } = this.props - const dataDims = [...this.state.selectedDataDims].reverse() - const lastDataId = dataDims[dataDims.length - 1] + const addLayersToMap = async () => { + const selectedDimensions = [...selectedDataDims].reverse() + const lastDataId = allDataDimensions[selectedDimensions.length - 1] // Call in sequence - for (const dataId of dataDims) { + for (const dataId of selectedDimensions) { const layer = await getThematicLayerFromAnalyticalObject( - ao, + currentAO, dataId, dataId === lastDataId ) if (layer) { - addLayer(layer) + dispatch(addLayer(layer)) } } - clearAnalyticalObject() + dispatch(clearAnalyticalObject()) + } + + if (!allDataDimensions.length) { + log.info('No data items found in analytical object') + return null // TODO show error } -} -export default connect( - (state) => ({ - showDialog: !!state.analyticalObject, - ao: state.analyticalObject, - }), - { - addLayer, - clearAnalyticalObject, + if (allDataDimensions.length === 1) { + addLayersToMap() + return null } -)(OpenAsMapDialog) + + return ( + + {i18n.t('Open as map')} + +
+
+ {i18n.t( + 'This chart/table contains {{numItems}} data items. Choose which items you want to import from the list below. Each data item will be created as a map layer.', + { + numItems: allDataDimensions.length, + } + )} +
+ +
+
+ + + + + + +
+ ) +} + +export default OpenAsMapDialog diff --git a/src/util/__tests__/analyticalObject.spec.js b/src/util/__tests__/analyticalObject.spec.js index 958db1887..69b7378a6 100644 --- a/src/util/__tests__/analyticalObject.spec.js +++ b/src/util/__tests__/analyticalObject.spec.js @@ -1,5 +1,4 @@ import { - hasSingleDataDimension, getDataDimensionsFromAnalyticalObject, getThematicLayerFromAnalyticalObject, getAnalyticalObjectFromThematicLayer, @@ -30,18 +29,6 @@ jest.mock('../legend') describe('analytical object utils', () => { describe('analytical object handling', () => { - it('returns true if analytic object contains one data item', () => { - const result = hasSingleDataDimension({ - columns, - }) - expect(result).toBeTruthy() - }) - - it('returns false if analytic object is without data item', () => { - const result = hasSingleDataDimension({}) - expect(result).toBeFalsy() - }) - it('returns data items from columns in analytical object', () => { const result = getDataDimensionsFromAnalyticalObject({ columns, diff --git a/src/util/__tests__/history.spec.js b/src/util/__tests__/history.spec.js new file mode 100644 index 000000000..9ddc28aba --- /dev/null +++ b/src/util/__tests__/history.spec.js @@ -0,0 +1,80 @@ +import queryString from 'query-string' +import { getHashUrlParams } from '../history.js' + +// jest.mock('query-string') +jest.mock('query-string', () => ({ + parse: jest.fn(() => {}), +})) + +describe('getHashUrlParams', () => { + it('should return isDownload=true when pathname is /download', () => { + queryString.parse.mockImplementationOnce(() => ({})) + const loc = { search: '', pathname: '/download' } + expect(getHashUrlParams(loc)).toEqual({ isDownload: true, mapId: '' }) + }) + + it('should return mapId="currentAnalyticalObject" when pathname is /currentAnalyticalObject', () => { + queryString.parse.mockImplementationOnce(() => ({})) + const loc = { search: '', pathname: '/currentAnalyticalObject' } + expect(getHashUrlParams(loc)).toEqual({ + mapId: 'currentAnalyticalObject', + }) + }) + + it('should return param and mapId when search is ?param=true and pathname is /xyzpdq', () => { + queryString.parse.mockImplementationOnce(() => ({ param: true })) + const loc = { search: '?param=true', pathname: '/xyzpdq' } + expect(getHashUrlParams(loc)).toEqual({ param: true, mapId: 'xyzpdq' }) + }) + + it('should return param, mapId, and isDownload when search is ?param=false and pathname is /xyzpdq/download', () => { + queryString.parse.mockImplementationOnce(() => ({ param: false })) + const loc = { search: '?param=false', pathname: '/xyzpdq/download' } + expect(getHashUrlParams(loc)).toEqual({ + param: false, + mapId: 'xyzpdq', + isDownload: true, + }) + }) + + it('should return interpretationId and isDownload when search is ?interpretationId=xyzpdq and pathname is /download', () => { + queryString.parse.mockImplementationOnce(() => ({ + interpretationId: 'xyzpdq', + })) + const loc = { + search: '?interpretationId=xyzpdq', + pathname: '/download', + } + expect(getHashUrlParams(loc)).toEqual({ + interpretationId: 'xyzpdq', + isDownload: true, + mapId: '', + }) + }) + + it('should return interpretationId and mapId when search is ?interpretationId=xyzpdq and pathname is /xyzpdq', () => { + queryString.parse.mockImplementationOnce(() => ({ + interpretationId: 'xyzpdq', + })) + const loc = { search: '?interpretationId=xyzpdq', pathname: '/xyzpdq' } + expect(getHashUrlParams(loc)).toEqual({ + interpretationId: 'xyzpdq', + mapId: 'xyzpdq', + }) + }) + + it('should return interpretationId, mapId, and isDownload when search is ?interpretationId=xyzpdq and pathname is /xyzpdq/download', () => { + queryString.parse.mockImplementationOnce(() => ({ + interpretationId: 'xyzpdq', + })) + const loc = { + search: '?interpretationId=xyzpdq', + pathname: '/xyzpdq/download', + } + expect(getHashUrlParams(loc)).toEqual({ + interpretationId: 'xyzpdq', + mapId: 'xyzpdq', + isDownload: true, + }) + }) +}) diff --git a/src/util/analyticalObject.js b/src/util/analyticalObject.js index 5a94487b6..f04097949 100644 --- a/src/util/analyticalObject.js +++ b/src/util/analyticalObject.js @@ -12,7 +12,7 @@ export const APP_URLS = { } // Combines all dimensions in columns, rows and filters -const getDimensionsFromAnalyticalObject = (ao) => { +const getDimensionsFromAnalyticalObject = (ao = {}) => { const { columns = [], rows = [], filters = [] } = ao return [...columns, ...rows, ...filters] } @@ -26,12 +26,6 @@ export const getDataDimensionsFromAnalyticalObject = (ao) => { return dataDim ? dataDim.items : [] } -// Returns true if analytical object contains a single data dimension item -export const hasSingleDataDimension = (ao) => { - const dataItems = getDataDimensionsFromAnalyticalObject(ao) - return dataItems.length === 1 -} - // Returns a thematic layer config from an analytical object export const getThematicLayerFromAnalyticalObject = async ( ao = {}, @@ -98,18 +92,3 @@ export const getAnalyticalObjectFromThematicLayer = (layer = {}) => { aggregationType, } } - -// Temporary fix until we switch to hash and react router -export const clearAnalyticalObjectFromUrl = () => { - const [base, params] = window.location.href.split('?') - - if (params && history && history.pushState) { - const leftParams = params - .split('&') - .filter((p) => !p.includes('currentAnalyticalObject')) - - const url = base + (leftParams.length ? `?${leftParams.join('&')}` : '') - - history.pushState({}, null, url) - } -} diff --git a/src/util/apiDataStatistics.js b/src/util/apiDataStatistics.js index 0fb1c3813..aee50617c 100644 --- a/src/util/apiDataStatistics.js +++ b/src/util/apiDataStatistics.js @@ -2,7 +2,7 @@ export const dataStatisticsMutation = { resource: 'dataStatistics', params: ({ id }) => ({ favorite: id, - eventType: 'VISUALIZATION_VIEW', + eventType: 'MAP_VIEW', }), type: 'create', } diff --git a/src/util/history.js b/src/util/history.js new file mode 100644 index 000000000..52a26f358 --- /dev/null +++ b/src/util/history.js @@ -0,0 +1,59 @@ +import { createHashHistory } from 'history' +import queryString from 'query-string' + +const history = createHashHistory() +export default history + +const defaultHashUrlParams = { + mapId: '', + isDownload: false, + interpretationId: null, +} + +const DOWNLOAD = 'download' + +const getHashUrlParams = (loc) => { + const params = queryString.parse(loc.search || '', { + parseBooleans: true, + }) + + const pathParts = loc.pathname.slice(1).split('/') + if (pathParts.length > 0) { + if (pathParts[0] === DOWNLOAD) { + params.mapId = '' + params.isDownload = true + } else { + params.mapId = pathParts[0] + + if (pathParts[1] === DOWNLOAD) { + params.isDownload = true + } + } + } + + return params +} + +const openDownloadMode = () => { + if (history.location.pathname === '/') { + history.push(`/${DOWNLOAD}`) + } else { + history.push(`${history.location.pathname}/${DOWNLOAD}`) + } +} + +const closeDownloadMode = () => { + if (history.location.pathname === `/${DOWNLOAD}`) { + history.push('/') + } else { + const rootPath = history.location.pathname.split(`/${DOWNLOAD}`)[0] + history.push(rootPath) + } +} + +export { + getHashUrlParams, + defaultHashUrlParams, + openDownloadMode, + closeDownloadMode, +} diff --git a/src/util/requests.js b/src/util/requests.js index f51b2fbd1..7e5a2cbd5 100644 --- a/src/util/requests.js +++ b/src/util/requests.js @@ -39,13 +39,3 @@ export const getExternalLayer = async (id) => { const d2 = await getD2() return d2.models.externalMapLayers.get(id) } - -// https://davidwalsh.name/query-string-javascript -export const getUrlParameter = (name) => { - name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]') - const regex = new RegExp('[\\?&]' + name + '=([^&#]*)') - const results = regex.exec(location.search) - return results === null - ? '' - : decodeURIComponent(results[1].replace(/\+/g, ' ')) -} diff --git a/yarn.lock b/yarn.lock index 3192699f1..7add303b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,6 +33,14 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" @@ -68,7 +76,7 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.21.0", "@babel/generator@^7.21.1", "@babel/generator@^7.7.2": +"@babel/generator@^7.21.0", "@babel/generator@^7.7.2": version "7.21.1" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== @@ -78,6 +86,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -143,6 +161,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" @@ -158,6 +181,14 @@ "@babel/template" "^7.20.7" "@babel/types" "^7.21.0" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -165,6 +196,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" @@ -248,16 +286,33 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-string-parser@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" @@ -291,11 +346,25 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2", "@babel/parser@^7.7.0": +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.7.0": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== +"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -1079,6 +1148,13 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.7.6": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" + integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" @@ -1088,19 +1164,28 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" - integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.1" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.2" - "@babel/types" "^7.21.2" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" @@ -1121,6 +1206,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1435,583 +1529,583 @@ debug "^3.1.0" lodash.once "^4.1.1" -"@dhis2-ui/alert@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/alert/-/alert-8.16.0.tgz#589b8243b3d6133d1f2b226ac9dc9df0803f5872" - integrity sha512-PfuSxm5K+xxbPVZU82L0U26KMbOdNx+sFFLMEWHukDhCSuja7zp64EzkX0iT/KfDBHBdbxF9G9fwyATA84Dnlg== +"@dhis2-ui/alert@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/alert/-/alert-9.2.0.tgz#3b30e90a88a96c617219c60ad8bc16a5969e85d1" + integrity sha512-9uh6vIKlj9vm9wOr/7UvSvxrEgl0p99+FdfFtvCeiOywR2+CCPvd9fRsL/vWKcCraopOriCmTm5PzBUWPuatvg== dependencies: - "@dhis2-ui/portal" "8.16.0" + "@dhis2-ui/portal" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/box@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/box/-/box-8.16.0.tgz#23741e67254e1b48dd9bebfe726e8a2f1b407e3e" - integrity sha512-vrKNXC03ZUAUL0YaAa43XhHpCSMNTn4Fu4GUmzQg0Jb+3ALp4+D+WBQzVWaZYMSqesDiOPS1ZB4z65QUMAAawQ== +"@dhis2-ui/box@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/box/-/box-9.2.0.tgz#0f8fd79059d724c075180ea442c860ebff88c802" + integrity sha512-ERNEd8lDAQIGDmTYknWClPGbmWuOpFAnE8XurB6wrkydn0M2+wsIa00q2on6RgY2YaAjVtYZEXr9CfjBtwh04w== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/button@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/button/-/button-8.16.0.tgz#f78b7dffcb3414fa8210db1b9d62c9414d6544ba" - integrity sha512-YCsNgRzCoazZ1RjmJUckACqy4iL76wOJoFMRnP+7AzOFU8myEFZakPnihR6dxsjxSCTsQTBebRMmmGRNp259wg== +"@dhis2-ui/button@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/button/-/button-9.2.0.tgz#8d465f471ca629e1cb0ded01fc68143eb4960c1c" + integrity sha512-YBdIpaOqEgpI0JhHm8XBlpFGDF7O6eiFQ4Noxu131KEyDOf7a+AkIyECVZw6Jsj3n2zrbyzBDw6IndSFSlBqRQ== dependencies: - "@dhis2-ui/layer" "8.16.0" - "@dhis2-ui/loader" "8.16.0" - "@dhis2-ui/popper" "8.16.0" + "@dhis2-ui/layer" "9.2.0" + "@dhis2-ui/loader" "9.2.0" + "@dhis2-ui/popper" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/calendar@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/calendar/-/calendar-8.16.0.tgz#3c64736ddb87195699c9db3219b2b2e56345b3fc" - integrity sha512-B+EI/t9r1Ed8XQ3dNmnZl/NSXiee4IV9DpNcCIwOV6K9OZ23/zt1L4QaRjI7u3/F5JeguxRg5EtUX4oZBdUFDw== +"@dhis2-ui/calendar@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/calendar/-/calendar-9.2.0.tgz#c3fbcdc622a13dd112de163719cfdcd0f960cfe2" + integrity sha512-6xxkCx66tjfGffGoPnDB6pe9Pvx+UybAGCqof7/0xfHP2vnfdss716imM02HfJRZwp5dNUrXqBO9uuQ1qkp/HA== dependencies: - "@dhis2-ui/button" "8.16.0" - "@dhis2-ui/card" "8.16.0" - "@dhis2-ui/input" "8.16.0" - "@dhis2-ui/layer" "8.16.0" - "@dhis2-ui/popper" "8.16.0" + "@dhis2-ui/button" "9.2.0" + "@dhis2-ui/card" "9.2.0" + "@dhis2-ui/input" "9.2.0" + "@dhis2-ui/layer" "9.2.0" + "@dhis2-ui/popper" "9.2.0" "@dhis2/multi-calendar-dates" "1.0.2" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/card@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/card/-/card-8.16.0.tgz#86dbd4d1e219de1d08a15d132fb7b402609006ad" - integrity sha512-7Y2xmyUL6omqwhsj3j9OzMfw7c/jWOXb2mWO0YYHroxreViHDadi6jbROp2iJbS38FfA6Svn5R+rWaVs6IJ9xQ== +"@dhis2-ui/card@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/card/-/card-9.2.0.tgz#1a2d8f2f9becfd9fd43e7e315fda511418698fd1" + integrity sha512-++eLieBc4WsNXD1iQEQaqijnQ7hpKu0HH9cjkwTa46jjI9SoJGdYInvCzZPafB1XuCZ42f08kTcdND2qZWbssQ== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/center@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/center/-/center-8.16.0.tgz#eff8d9a5e663d1a541a23d6d0b715351738f116b" - integrity sha512-ELfUaNaayaX6CFFijGJV3phNIj6pNFv32yS14Pmu7K9SbpnhIFqIB/Zepg6KkCxClqKXX1ALqwBXhaEWROVAXQ== +"@dhis2-ui/center@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/center/-/center-9.2.0.tgz#f7fbcbd00696d718286f269a64a5bad327160449" + integrity sha512-IBwLld/SQEtT5acjBr3nJnpkXNzypxm9f+QfdGYRq2ZSQmkIv9IUjIvlC25CU72Ksq+N0nWvA8AYp2Qx/l04fg== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/checkbox@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/checkbox/-/checkbox-8.16.0.tgz#55c7d95bfab6d70c3dd30f85e9b60debce00edad" - integrity sha512-yAP//QBULxaq7c2KjwY6YwIEkqP77AoMh6sSmh1yfQaYtiGO79c+T4Na8Acqt847ERhylKWtkoFyOu6S4ol6QA== +"@dhis2-ui/checkbox@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/checkbox/-/checkbox-9.2.0.tgz#7f27c645bb9d31df4898c9c96cfdabf9ddd01ab3" + integrity sha512-EIGbkdnCLOyW3s7Mh31LdPgghHPaTAt0MJe5ieF/1NycUCfx99NGoR7wXlAlI6wNvjkuTYnYBknERGHUEzY9rA== dependencies: - "@dhis2-ui/field" "8.16.0" - "@dhis2-ui/required" "8.16.0" + "@dhis2-ui/field" "9.2.0" + "@dhis2-ui/required" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/chip@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/chip/-/chip-8.16.0.tgz#976c1c4b0ab067ce24df37b1293126b12753a455" - integrity sha512-AglEijghZT6LTAIMy0aID1vp22hjxBN5GYF1chLFEujBm1Pt10ld35URU6CpHlEgreWUCjKMllNa4IpCJO1IUw== +"@dhis2-ui/chip@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/chip/-/chip-9.2.0.tgz#45b5e55e6d11318bb6917f1bcdee9bf9b67bd620" + integrity sha512-PesbKz0MrXegDAFcGHq34Ast0kM/mJrmExiLua262egYYaRiQXDYeaNuS2TT+qPsPsDva2Pp7kqjdrFRDL2Few== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/cover@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/cover/-/cover-8.16.0.tgz#88b63ffb99c209b3327a3e7d50d519074ce06bab" - integrity sha512-4xKMzt4cOb3MFQMoK42gmhJXJKW5BiRloToC7PnLCZnnXNzuLIXrQ5rxz0C8vJ/+rh7g8XLjOhLCXCEJjMAp4w== +"@dhis2-ui/cover@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/cover/-/cover-9.2.0.tgz#0288dad0ba9caf8c0b77c86868fc4bae3388f6c7" + integrity sha512-ZxcOOuyy/dB4pgjdVzBlgwtVue0HEct2XOiuIKM66F5G0DPBqz6UtLDD+8VRofQwTKcTYQh9kPZPmx/9q65Zcg== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/css@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/css/-/css-8.16.0.tgz#fee49707a209c62da05e9cb221372874f12401e9" - integrity sha512-O5YVBv8EFnw30xMgPopcAmkpcsVc99XuARv+3rxpMxfOuVtH0Y6BjWh/RJhvZLYc4OrfsrQDRoIlhvZUKGRv/A== +"@dhis2-ui/css@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/css/-/css-9.2.0.tgz#ad881b90371c7506690ee2a2b2151c09f793e368" + integrity sha512-dBe9S75+Nj1c9SNRkxU0VWTVwFZJ+vLFKxD1UYaPdbJ2DHD6AD4UJ1YtXgvBvgiJ0wbT1vesh3tKfEUXbnTmkw== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/divider@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/divider/-/divider-8.16.0.tgz#afc0d8104e433372bbdee63ff508ffef88d12800" - integrity sha512-Zomxz5Z87G4UP1VmTlLrpc19gQmlCtABDxVyirIMv7ZnUXUozj0KFzhO6VJAF7qPo5Q4cKV/6ZkprPwYAN4I9A== +"@dhis2-ui/divider@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/divider/-/divider-9.2.0.tgz#2f9ea2f3a1f89853963bcffdeef27e5ebc390021" + integrity sha512-z87v4XKIO1IXhWmHYhCQgR7MTiuU+zLMg9Py2OIDxMchVXrdyGSeKCpL9UgOzl/jtHxwoMdnVDzy8sLLzITgsw== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/field@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/field/-/field-8.16.0.tgz#d985198ada6f857f88a9b7023b095dfcc1f7c649" - integrity sha512-aaEwfxenl1MU7Kv2r5r7nwjVtIUH4zSZFSSBXBYQQlirsTTjsJWlbo4urnY5y649OpqJnSoiaZTndhKMGk/MHg== +"@dhis2-ui/field@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/field/-/field-9.2.0.tgz#d16b443ff168e352b6f5168d2179975377902dd1" + integrity sha512-pZr1LkzOm4TOPdPAen9e3RHQE8Y1uCbdFhP1oc5vg44etmudX7stJuEXP6/DrPm6sHCJRojf90laqPai1vfrHg== dependencies: - "@dhis2-ui/box" "8.16.0" - "@dhis2-ui/help" "8.16.0" - "@dhis2-ui/label" "8.16.0" + "@dhis2-ui/box" "9.2.0" + "@dhis2-ui/help" "9.2.0" + "@dhis2-ui/label" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/file-input@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/file-input/-/file-input-8.16.0.tgz#2bae2a4312aa8848c91413d21bb081058705898c" - integrity sha512-C6DnqUidG8+GIan0+b7dvQQnJilBvd98DlKC2FrrnSq0gtkf5TI0nY7U8GMjaupRVy3kJ0M4dIYIGvWatJgXAg== +"@dhis2-ui/file-input@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/file-input/-/file-input-9.2.0.tgz#d48e9d290aea798640b251d915b9a8f51abcf363" + integrity sha512-x+lKilo6aQN320fIAPZMAq13PxKuTb/jhZb7m7pMS0HKsPqfT5rWm1VfmBlN/02BkKsmhsvo/tTe9vxpAic71A== dependencies: - "@dhis2-ui/button" "8.16.0" - "@dhis2-ui/field" "8.16.0" - "@dhis2-ui/label" "8.16.0" - "@dhis2-ui/loader" "8.16.0" - "@dhis2-ui/status-icon" "8.16.0" + "@dhis2-ui/button" "9.2.0" + "@dhis2-ui/field" "9.2.0" + "@dhis2-ui/label" "9.2.0" + "@dhis2-ui/loader" "9.2.0" + "@dhis2-ui/status-icon" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/header-bar@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/header-bar/-/header-bar-8.16.0.tgz#43b94c1e3ce337d2e3d39026ba43fc2e637d9408" - integrity sha512-UwyhAU3MUYfmfKVp7IE0A0CSwxwGQveuxNFRpZh+LpWO2pC7/gkb7Tv2ISfrIdf8R+a/FU6SUkmKp7iWFyz3Eg== - dependencies: - "@dhis2-ui/box" "8.16.0" - "@dhis2-ui/button" "8.16.0" - "@dhis2-ui/card" "8.16.0" - "@dhis2-ui/center" "8.16.0" - "@dhis2-ui/divider" "8.16.0" - "@dhis2-ui/input" "8.16.0" - "@dhis2-ui/layer" "8.16.0" - "@dhis2-ui/loader" "8.16.0" - "@dhis2-ui/logo" "8.16.0" - "@dhis2-ui/menu" "8.16.0" - "@dhis2-ui/modal" "8.16.0" - "@dhis2-ui/user-avatar" "8.16.0" +"@dhis2-ui/header-bar@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/header-bar/-/header-bar-9.2.0.tgz#83efe93821318decca3bd1a28d30fd3089435b6d" + integrity sha512-7iNKOllQNeYfa9nJjXVqiohcuKEk+RMhuu/7BY8g2oPmwbvS0uc49KiL53cFfAWBST/v5fU1XOpWS/N7PmJr2g== + dependencies: + "@dhis2-ui/box" "9.2.0" + "@dhis2-ui/button" "9.2.0" + "@dhis2-ui/card" "9.2.0" + "@dhis2-ui/center" "9.2.0" + "@dhis2-ui/divider" "9.2.0" + "@dhis2-ui/input" "9.2.0" + "@dhis2-ui/layer" "9.2.0" + "@dhis2-ui/loader" "9.2.0" + "@dhis2-ui/logo" "9.2.0" + "@dhis2-ui/menu" "9.2.0" + "@dhis2-ui/modal" "9.2.0" + "@dhis2-ui/user-avatar" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" moment "^2.29.1" prop-types "^15.7.2" -"@dhis2-ui/help@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/help/-/help-8.16.0.tgz#d1d3abc06aace2f753d0e89300bbd15ca03be343" - integrity sha512-5Ag6d92iFpB2gJfIXx0bodHnuv0J9FWMnMkVscfOS2LiIFHzJNrR/iEnXmbFSzLBaPvE4gFjmAZ0WskDXdPt+g== +"@dhis2-ui/help@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/help/-/help-9.2.0.tgz#76556c0d581fb0f7611fe5c5bb0d9adf35ad0c8e" + integrity sha512-qD3oNEwEb+pT7jsD4ciHtu16KrxMySPWoqco5nJwoGbcZFLw/caEfkBo2IroImD0MxtI0mKt5emD7V2yXRWm7A== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/input@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/input/-/input-8.16.0.tgz#ac14629d11a492f658b992937f8ee3edc4f14857" - integrity sha512-Zn+Jo+NkVJSHdKwWz9WMPYmnKRDM/metSjnDdAZ2guIS820dNCPgsbC1+DOgMKVxtl+DSb0e+05niIVwsAIELA== +"@dhis2-ui/input@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/input/-/input-9.2.0.tgz#bdf7c72e11b818ed86e1e6335cd373ae037f4ef3" + integrity sha512-0bzF/8pZSMqe5ZN2v0t0/rMTvKWd9kl5MDOy9fRXpX6yoFgfH+j+iIU06eVyqJl3DMqCdInfapJvpJR7MHvd+g== dependencies: - "@dhis2-ui/box" "8.16.0" - "@dhis2-ui/field" "8.16.0" - "@dhis2-ui/input" "8.16.0" - "@dhis2-ui/loader" "8.16.0" - "@dhis2-ui/status-icon" "8.16.0" + "@dhis2-ui/box" "9.2.0" + "@dhis2-ui/field" "9.2.0" + "@dhis2-ui/input" "9.2.0" + "@dhis2-ui/loader" "9.2.0" + "@dhis2-ui/status-icon" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/intersection-detector@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/intersection-detector/-/intersection-detector-8.16.0.tgz#c525b9a7bc2268e0cc063e4a1f30c37c79be6262" - integrity sha512-z8b9RjRBG5PgRgB85ltUC+toN2IgXCHmMXpxyAfEL3tE4asej4y75cWLafY1sO8QkwwHJBAlEq0IrPUS8ggKzw== +"@dhis2-ui/intersection-detector@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/intersection-detector/-/intersection-detector-9.2.0.tgz#31f19bfb8645ebda7d7af6f6e641b40fa1e57888" + integrity sha512-erBoDMhOPmua8eP8bKJNl4WIUUm+Fw3Jj9M0OxC+xia3/Fi8scLUyk0Yek1Y0lGdb4YHJEXqx475dLNjpmiLRQ== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/label@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/label/-/label-8.16.0.tgz#c6558ed1076c6d0955898135917cc3bf64d3a5e8" - integrity sha512-OrtE4ZfDH3lBApL1mR/eZ1Ndr14V/FwgUoER9Xw9Zmt8vNGhtYHkWzLzwnzsSiV0gkJ0rHF/SU7nctVOWdQQjQ== +"@dhis2-ui/label@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/label/-/label-9.2.0.tgz#81ec2de2ea1b9bc7cf25eb8bb036d451d5b61748" + integrity sha512-k9Q4XyIbaNRvCn1+rLcEb/iDi479S3fOEJ2MCT6wsGxr1+Hys7yVw7Ggq0OQ9SLCEwElNQcvj+vWB4dZltXl5Q== dependencies: - "@dhis2-ui/required" "8.16.0" + "@dhis2-ui/required" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/layer@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/layer/-/layer-8.16.0.tgz#f2b9b1de1770c8584e5b3cdc217b1ba11039a8b1" - integrity sha512-GHIud7bFoXPSBGkkiJXCQqnYuEh0eXllF62eJTnFu3iMzoroepylxiDLDXzQMhxc1bCmkQBEgX5aNzT3riHH5A== +"@dhis2-ui/layer@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/layer/-/layer-9.2.0.tgz#7afcb2ef8571eb9c839fc522eb76ead70e395dbc" + integrity sha512-95aFgQYxgJ7GmWY6AOSoAH4BH7wkIyUAioAIRUDwp0mmSJhJxG6P9b1PFqw4koX1zV4/RLoz+NiQ7Twv+03CLQ== dependencies: - "@dhis2-ui/portal" "8.16.0" + "@dhis2-ui/portal" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/legend@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/legend/-/legend-8.16.0.tgz#0c89f557b1feb3b229d9f63772f1d3c54af559a9" - integrity sha512-0RNCMh6KAo/wIsbvi0cAvTNCbDd517iF/IJ7pugSCHflACrN0i+p/ZqL/bXcXlI7pM6dssn1tjto4qvcyncuUQ== +"@dhis2-ui/legend@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/legend/-/legend-9.2.0.tgz#a051822fd67c1442b6986a86097aca94f3960dd2" + integrity sha512-IfJhu48eu//O9AlHt7IUdsv5E92XG7v/95laFfyQOaGhf1C4BQf11s6yXc3nTFoil/p55oAsZnWp5e7UXcgrhg== dependencies: - "@dhis2-ui/required" "8.16.0" + "@dhis2-ui/required" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/loader@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/loader/-/loader-8.16.0.tgz#cd3a7736e65c7096175ccfca68ede041ce441129" - integrity sha512-AyHID3Wftk6j4n6hoHpjx4OZF3ENtDBcOIrSVCbLpv+y14m06RZk0T6wekSnplW/1zCFruS5vLZNR7aYJEKIyA== +"@dhis2-ui/loader@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/loader/-/loader-9.2.0.tgz#f45fdb19a37182351932cd3e11980d43b4895d40" + integrity sha512-M8tuLE5kgm7oHmIN6par8GfRDpmt+DXFU3cCSZdiYIUM6SQSD8G5LmA8AaIHR5h7l430d93vcw7RQL3eeE/svw== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/logo@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/logo/-/logo-8.16.0.tgz#b600ad9db431a7e478cc53b9b0ba09a0cc9a51af" - integrity sha512-5NXPKRKEZN99DXP2TOHTximelZZh43qYUWgcVmB7RkiM7EBKaNQkz1LtP6cV5yv2Jr4RQtW3Myg690Wtgg+VNg== +"@dhis2-ui/logo@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/logo/-/logo-9.2.0.tgz#0452aadd8e92afc1c558869a08c8e5d1f14ff55f" + integrity sha512-OEFrSpDijeCIhLjJ8vipDGRdihTgj8+iLcPLDrOeRAurlgJZJZiicxBKSuY6uc6p1/9QPccqX2huJjM1uNqo2g== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/menu@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/menu/-/menu-8.16.0.tgz#31fa42d534cf34cfa07c1ecfe16877226e3f7d5e" - integrity sha512-oT7UVlMAM3xl5WDpdVjAgcHG5d9ACza+bUsMAXNURT0ceW1kD6OKLfmNNJOixpudwmZ45G6b1gBUqVQ3REXNTg== +"@dhis2-ui/menu@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/menu/-/menu-9.2.0.tgz#996729545b29def9366a099005a17c781bdca8f6" + integrity sha512-8k15qmoqBWKo1Afj+QXFnDAIoDyAqosvq3j8M/+xM+cSn0H+6e3Q7UOp0ByVQlumoY5DyrT9Z7NojULIjFUifQ== dependencies: - "@dhis2-ui/card" "8.16.0" - "@dhis2-ui/divider" "8.16.0" - "@dhis2-ui/layer" "8.16.0" - "@dhis2-ui/popper" "8.16.0" - "@dhis2-ui/portal" "8.16.0" + "@dhis2-ui/card" "9.2.0" + "@dhis2-ui/divider" "9.2.0" + "@dhis2-ui/layer" "9.2.0" + "@dhis2-ui/popper" "9.2.0" + "@dhis2-ui/portal" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/modal@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/modal/-/modal-8.16.0.tgz#7c5b193533e00070fbb9e0699180853463dbc6fd" - integrity sha512-RJb6UTMoU1juuc4V5hIJj59YokZ4WoqbQoyjGfWMSf5zFfXAWT36HlOTnew322dekZA5CGt0hcxlcuqpbRaJjQ== +"@dhis2-ui/modal@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/modal/-/modal-9.2.0.tgz#7815efe62be4f482b2e2224ffe92981068b1bae9" + integrity sha512-gp+gCTmtoiLVAhigo1i6msE598qIGnkW6To+dTkUecvxyvni+DZTAulTmL62UtTzzjPjYO0yOqNTWQztbpj1KQ== dependencies: - "@dhis2-ui/card" "8.16.0" - "@dhis2-ui/center" "8.16.0" - "@dhis2-ui/layer" "8.16.0" - "@dhis2-ui/portal" "8.16.0" + "@dhis2-ui/card" "9.2.0" + "@dhis2-ui/center" "9.2.0" + "@dhis2-ui/layer" "9.2.0" + "@dhis2-ui/portal" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/node@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/node/-/node-8.16.0.tgz#9dd9e8c99d036297eb6f2da38c07e50739ce6585" - integrity sha512-QpwwKuIK8Z+DlYB9LhXe8NWQNJdZBotjl0qU8faltVIsRGC76YzT1jbcIMvxKcVRaQOdNQtMt1uOYd4KCnA04Q== +"@dhis2-ui/node@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/node/-/node-9.2.0.tgz#3560b3e7394d275c1bce3e800b2654cddcd2adb2" + integrity sha512-xx7P/6V7vq3JLXUUATKGGUCORHqQL74fsGYUd9a0izyUyq4h3pEHL9ZT6Cel+A0d5ODYn/j/Q6fHICZzg55FBQ== dependencies: - "@dhis2-ui/loader" "8.16.0" + "@dhis2-ui/loader" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/notice-box@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/notice-box/-/notice-box-8.16.0.tgz#a1878418e0591cfa0382b6f947559a25d5ca351c" - integrity sha512-TulrAmzU3MXs1l1xqwikOtSRivkQKC2RLBta+ZRAXGEqH0VFUoDkk9OtTZ0QsNJRAXs/NHQZ2REhZfRCaiWI7w== +"@dhis2-ui/notice-box@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/notice-box/-/notice-box-9.2.0.tgz#8c1fb4a2a780fea0fde4b8f9eaf8f73957187c99" + integrity sha512-DY3WYXj1hsOsiBHGaNrOeZ8h7SPaXox6iMCTzL/jLvnfmTrH7wy6SHRLQYWg0BMrDflhMJu9qhn0jtzhEXZNMQ== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/organisation-unit-tree@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/organisation-unit-tree/-/organisation-unit-tree-8.16.0.tgz#b491f6f7f76f5d68b0be597e241553d1f150c4ed" - integrity sha512-VkqwNz2bqiOuP3bsnKeuReraQzhKe+R4dtPIjPUZpe+vA78uQfcsOB1OUK3JqI/9qL8eL0RYepoACHQwb+1MNw== +"@dhis2-ui/organisation-unit-tree@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/organisation-unit-tree/-/organisation-unit-tree-9.2.0.tgz#ce33d91361145d6574ddbef3866b56be06cee6cb" + integrity sha512-PHm908gNGPhq5D655BI4lrB+hMqfISKASjoFCWxG2f9FU64/pvQ+snZQQwQFMAJYMd6FKw4GOP1isKz0jTGNuA== dependencies: - "@dhis2-ui/checkbox" "8.16.0" - "@dhis2-ui/loader" "8.16.0" - "@dhis2-ui/node" "8.16.0" + "@dhis2-ui/checkbox" "9.2.0" + "@dhis2-ui/loader" "9.2.0" + "@dhis2-ui/node" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/pagination@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/pagination/-/pagination-8.16.0.tgz#f50b7408f48e77134c9c1457a77fde07cb166aa8" - integrity sha512-oytevq4Bb0fGXeL3hVBz7P5dGBxSpenV0AOhNA3W7m7/UNSmFJXJjWRB+nvHS6jcq0/gxNJvEZctGF/zlViyVQ== +"@dhis2-ui/pagination@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/pagination/-/pagination-9.2.0.tgz#f38d1ada2bc9f9795dae8f86c52d54f29889dd17" + integrity sha512-jXJNQ8JOPweeMFCsPXgAb8dAx8J/rNTnExL8WA6rfRDWujOojLp8Gu2MrH5jlHRpCBWIl+aJO1I/ZKHekQOeDg== dependencies: - "@dhis2-ui/button" "8.16.0" - "@dhis2-ui/select" "8.16.0" + "@dhis2-ui/button" "9.2.0" + "@dhis2-ui/select" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/popover@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/popover/-/popover-8.16.0.tgz#e01dfa4d9ceb50b94d4a28f824427d1fe14cd892" - integrity sha512-UPZ+9JTD4j4kVUge97zzXVknnlWIabO3YZFL/2O2tjHo23OUR4bl3AnUYiWYXVVIB7B28cadKHBa8ybnNn+gSA== +"@dhis2-ui/popover@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/popover/-/popover-9.2.0.tgz#3eccd6abde1da72089aa5feda5669ce4d1aa6f7e" + integrity sha512-7g8AHPrzUuMuv2MXpX5HdwiyO+peSGoq7hg6rHN/VDasIUvGS7vbaV4Xbxfd32fNmpHceBV7gMga31hRNaKtgw== dependencies: - "@dhis2-ui/layer" "8.16.0" - "@dhis2-ui/popper" "8.16.0" + "@dhis2-ui/layer" "9.2.0" + "@dhis2-ui/popper" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/popper@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/popper/-/popper-8.16.0.tgz#0f574233b55d259c416c7841a4bcbd618a06f06f" - integrity sha512-O0zztHX63rHYVV2YoexQjmzKwSjAJxZBFqN6f5glaZHstfgFr43/XDTJo91JT5yZKX5gkhFRC7TlhzC5UUzpQw== +"@dhis2-ui/popper@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/popper/-/popper-9.2.0.tgz#6d17ca49d7f0496289e11315d414095d93d179b5" + integrity sha512-6xWNvUQaDu8VE4rCa+uYOheb/4BD/52Cs23w2yt4lLAVrym4kV+0cnpHtlEG1ZuuVrK/yHelMjrmYxn6yJE41Q== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" "@popperjs/core" "^2.10.1" classnames "^2.3.1" prop-types "^15.7.2" react-popper "^2.2.5" resize-observer-polyfill "^1.5.1" -"@dhis2-ui/portal@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/portal/-/portal-8.16.0.tgz#57fb8f3bd91e5ec3e9116fd9208f3aa3034c4dfc" - integrity sha512-I5+lc2QLEu7foKOJJnv4I4XcKlgwGzvmFF0AhJsyY5rmsFpZ+xZRSReOpdZdCWeL8tHboVddRJ9laLHfHx5BkQ== +"@dhis2-ui/portal@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/portal/-/portal-9.2.0.tgz#12435f3a8886de685fc9ee4540639810eabf0191" + integrity sha512-a5DqmTG+pn4y1aXZWr8wEGlK4xRqdvnOWJVqO/6aebEn4ZtcPJT6yyXouviAM2yoW7+fDj6TZhKrZo3vgMLHlA== dependencies: classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/radio@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/radio/-/radio-8.16.0.tgz#35c87c4a047509b455f0deef72f13d1525f6ae90" - integrity sha512-dNPIJa2PdZR9pHLbLPxcT7ppaV3GQPUjwXPYB2QA2KLilNmb2aQWFKKnuNaOZTA4qwS/H5SGHuM0k3NvY4tRtA== +"@dhis2-ui/radio@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/radio/-/radio-9.2.0.tgz#9223ada90fe2d0eae375e85e0d99e6eb81d5269a" + integrity sha512-rjcz05spFlvRL8fnkO/7/ckznY4agQLl5P7UKSFL3Kz0KxvnocmounTX1BDsm6iQhKKt2HqJCYShpzPhTXavSA== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/required@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/required/-/required-8.16.0.tgz#3c7c65d1f462910620056b64873ccfd491752a2c" - integrity sha512-LjyvfCQZ+muxl1L1HW3KvhN1xfvpBisHcP0lA4MpEDC2ca/wnGqILxnPWC6RzMnnXA7OovMnmm+a80V/JCuEmw== +"@dhis2-ui/required@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/required/-/required-9.2.0.tgz#8d76c914c3eb483958284c8ddf52ef7095cc2f42" + integrity sha512-cNoQct7gVbrAdzGDDFLnfBktmwmxAhD48oEZ6z4TE7IrPi2N+idqOiQCTEVKEWmuY7VGv9TV0I/1OLX6oiuSvA== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/segmented-control@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/segmented-control/-/segmented-control-8.16.0.tgz#7120f68be62f6718ea9ca9cc1527dc856c4f8be3" - integrity sha512-JAmHEkiXF/qBVTOykjkE8s36E4ZTq48NJE9ON4Z2Umrh9EHqm8vZEbBZ9EJaSIzT7NROIDG6mbgb9ZWNQHevfA== +"@dhis2-ui/segmented-control@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/segmented-control/-/segmented-control-9.2.0.tgz#2b230eea17e35194072544ebbfc68e2c896fb951" + integrity sha512-x4eDqGu4JFfFPQk06mg8YdUCjYeYyXCLmZ0gbGj1Zx03gxpMwb4/nVyGoAxZg31/IVkhBOeAwXlvt+ckNXovgw== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/select@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/select/-/select-8.16.0.tgz#6446be9c0fe853e7071dabb2d0b48905cfc2ee1e" - integrity sha512-J0AQA3Sgu4T0/0rbiC0gkcD+HA2C7PmOyW4PTvDk7PWLLROh40leWqfLVAJT1JmTic0sBE6pMDk/B8ilODlfhw== - dependencies: - "@dhis2-ui/box" "8.16.0" - "@dhis2-ui/button" "8.16.0" - "@dhis2-ui/card" "8.16.0" - "@dhis2-ui/checkbox" "8.16.0" - "@dhis2-ui/chip" "8.16.0" - "@dhis2-ui/field" "8.16.0" - "@dhis2-ui/input" "8.16.0" - "@dhis2-ui/layer" "8.16.0" - "@dhis2-ui/loader" "8.16.0" - "@dhis2-ui/popper" "8.16.0" - "@dhis2-ui/status-icon" "8.16.0" +"@dhis2-ui/select@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/select/-/select-9.2.0.tgz#e854ecf6fd2580f9fb904301d1985923c1ade9cf" + integrity sha512-Hv0mRbpJNHJUa2lVivrWBt67iJ+4xTb7KxZkThISkmpQpzbWmhmJWlDbe0L+PdqOsaB2A70/N9HH4dhQyVP8vA== + dependencies: + "@dhis2-ui/box" "9.2.0" + "@dhis2-ui/button" "9.2.0" + "@dhis2-ui/card" "9.2.0" + "@dhis2-ui/checkbox" "9.2.0" + "@dhis2-ui/chip" "9.2.0" + "@dhis2-ui/field" "9.2.0" + "@dhis2-ui/input" "9.2.0" + "@dhis2-ui/layer" "9.2.0" + "@dhis2-ui/loader" "9.2.0" + "@dhis2-ui/popper" "9.2.0" + "@dhis2-ui/status-icon" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/selector-bar@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/selector-bar/-/selector-bar-8.16.0.tgz#2622d4fa3a2e08d29f09fbc508862636a3a3060b" - integrity sha512-f6iEHXIglHZTmc1ljmosrUSZjbBcdY7pWZYDQp/ybpuVyi5T4rV1/bPliZXZRydnp0WkBM+nDuKD/tJRtUAKlg== - dependencies: - "@dhis2-ui/button" "8.16.0" - "@dhis2-ui/card" "8.16.0" - "@dhis2-ui/layer" "8.16.0" - "@dhis2-ui/popper" "8.16.0" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" +"@dhis2-ui/selector-bar@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/selector-bar/-/selector-bar-9.2.0.tgz#23790f850bee1142e7bdffd711a2dea27dc78112" + integrity sha512-HDb/XKuUdD82vDh5mgz+OWIwpKjyiZEqek74y8g2r/AsMIl5Fe2rOyncOUPpGctxYeVp9u3gAlkFbIHd/qpv/w== + dependencies: + "@dhis2-ui/button" "9.2.0" + "@dhis2-ui/card" "9.2.0" + "@dhis2-ui/layer" "9.2.0" + "@dhis2-ui/popper" "9.2.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" "@testing-library/react" "^12.1.2" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/sharing-dialog@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/sharing-dialog/-/sharing-dialog-8.16.0.tgz#49f45b9b0d488c4bc4e51c46f6bd0cce7ee39204" - integrity sha512-1YuiKlghl7PbZxK7vbLFgknrMoX7ld2AnYMWwiJmJPPwAvyHjq+MeWTYCaNjZJV2bBslO41CONyhN8eE/4cF2w== - dependencies: - "@dhis2-ui/box" "8.16.0" - "@dhis2-ui/button" "8.16.0" - "@dhis2-ui/card" "8.16.0" - "@dhis2-ui/divider" "8.16.0" - "@dhis2-ui/input" "8.16.0" - "@dhis2-ui/layer" "8.16.0" - "@dhis2-ui/menu" "8.16.0" - "@dhis2-ui/modal" "8.16.0" - "@dhis2-ui/notice-box" "8.16.0" - "@dhis2-ui/popper" "8.16.0" - "@dhis2-ui/select" "8.16.0" - "@dhis2-ui/tab" "8.16.0" - "@dhis2-ui/tooltip" "8.16.0" - "@dhis2-ui/user-avatar" "8.16.0" +"@dhis2-ui/sharing-dialog@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/sharing-dialog/-/sharing-dialog-9.2.0.tgz#8818e5119c2113b3a54add3bd56dfe55ad2fc52a" + integrity sha512-h7chsY8XM2kw06r52pGRjS8ZknuwiEkRxuBTXD77G1Loni5TMm6xr0OFr9nSQHSsbcbxydbo2WPRPAu6WjVyfg== + dependencies: + "@dhis2-ui/box" "9.2.0" + "@dhis2-ui/button" "9.2.0" + "@dhis2-ui/card" "9.2.0" + "@dhis2-ui/divider" "9.2.0" + "@dhis2-ui/input" "9.2.0" + "@dhis2-ui/layer" "9.2.0" + "@dhis2-ui/menu" "9.2.0" + "@dhis2-ui/modal" "9.2.0" + "@dhis2-ui/notice-box" "9.2.0" + "@dhis2-ui/popper" "9.2.0" + "@dhis2-ui/select" "9.2.0" + "@dhis2-ui/tab" "9.2.0" + "@dhis2-ui/tooltip" "9.2.0" + "@dhis2-ui/user-avatar" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" "@react-hook/size" "^2.1.2" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/status-icon@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/status-icon/-/status-icon-8.16.0.tgz#0f2e041d1e971768c7be99a663ad571f165c307a" - integrity sha512-SsCUdi1U0a7dm3ZCxVpjGi6zyK0+lh/wSDLn+tlzdIlDYTlyjgBdUiqJiBoqv53Ob9PSyyCcxxEqt0nQlMQLbQ== +"@dhis2-ui/status-icon@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/status-icon/-/status-icon-9.2.0.tgz#5686721ef7dc1b1cd1cca315b11136e0809e568f" + integrity sha512-oILHs38xICDU27C7CXgFAEttU4QJzg0wImKlX4XVJ5z1aGeq6qOW0RUVibF6JtyAppEi9XsYZ+AB1KLEGnDFJw== dependencies: - "@dhis2-ui/loader" "8.16.0" + "@dhis2-ui/loader" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/switch@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/switch/-/switch-8.16.0.tgz#37dffc57dd76899014e43167d0076e8017253d2a" - integrity sha512-Gi3UcoIkarTEZW54c5LY2+JSQ2413HytTzc5iA5eeNKwX1Y7PV7xrbeIsC0hLOgK9pZaVe4pHJlpKpO26v/2vg== +"@dhis2-ui/switch@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/switch/-/switch-9.2.0.tgz#1fc9ed88546906da11aa19348b8ba8ff2e7c8414" + integrity sha512-IwVUiqxMKZmx7VtEJkyHqGzy4tvRNh4qbhmrFodaH6d9YrbycaFNECbphrT1OywrUBuci0Q2LovZhYKInkeIFg== dependencies: - "@dhis2-ui/field" "8.16.0" - "@dhis2-ui/required" "8.16.0" + "@dhis2-ui/field" "9.2.0" + "@dhis2-ui/required" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/tab@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/tab/-/tab-8.16.0.tgz#218864494102c52f44df221c231f9f1b9e052082" - integrity sha512-03B6o7gFmc9LK25/npLmZ8pT5+ax+ELLd3c0wYwdNYLYRk0c0MQEag7LChCRfz8M8P0LCd4kPceVFeTXOUZc6g== +"@dhis2-ui/tab@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/tab/-/tab-9.2.0.tgz#910223a907f8c007921924138306b53c2014f0fd" + integrity sha512-zVxwQ7WgjcrCGd+qWzLx+OtTWlGOIuC+AuSknHz0wpGgW3vawr1rMDA6j129l4O+ezzPs5bw8vN3xUQORbj0Bg== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/table@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/table/-/table-8.16.0.tgz#869c04df7fd72e3ae590d252f7417d2a809cd1f9" - integrity sha512-a7r8WfAP2MmrtvaqhmozTiOXu14wIUhu9zQkNIKlepQEQafTfDRqM5+oaapAfAOWvR5tlxlaZaF/IdOmS4vZew== +"@dhis2-ui/table@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/table/-/table-9.2.0.tgz#83d535e6c60ff9c9c3f436e592489a131caef772" + integrity sha512-wep8wPQKRg5vYPGg3HLAvsAEo+lUk3L7wO7axHyzx/XuHR40QXRirpv4tsFVn8VPpSFVq0w/BFGp8ijp3Y6RtA== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/tag@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/tag/-/tag-8.16.0.tgz#1cf5d89303c5d8342bfa1987cd9801980c7e1283" - integrity sha512-k9y6ZAbV5uh7swHB/s4lLbMkbQ26SxJBCFTQ64YbqYmuUGi7GTZM6gGLJznQND/xNJvydkVX51yI44/GPx9vBg== +"@dhis2-ui/tag@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/tag/-/tag-9.2.0.tgz#c6a11fbdfc20151cc75c323e6a6b1470ef064e58" + integrity sha512-qt/FUIFPZkghfF/fhhLHr4oOl54d1Zwy4CKf4cZmO2DSd09h7E7cfIUxXaX/shRHsSmeUhrFP2Nv5LAvu8XVUg== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/text-area@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/text-area/-/text-area-8.16.0.tgz#13e7e351b982d21a693db2e405aa9671e493c187" - integrity sha512-UMhOaNigxYp4K8VQtlaSdFuC6FErSbB7RCN22ii7Ic12XBsVoWKjGCkhdol3w7+rHefPbp+9SmJExyj+9E2y5g== +"@dhis2-ui/text-area@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/text-area/-/text-area-9.2.0.tgz#75f279281f1513801148f11c2693537a5e9beed7" + integrity sha512-KLBlerlO3OvBvzTVKKolfghaAMjDPUZkxFsyRvWEIPh1RRxS9ZprunXpBWRkNO2I6U6uwqN0DiBLTNbh/zrafg== dependencies: - "@dhis2-ui/box" "8.16.0" - "@dhis2-ui/field" "8.16.0" - "@dhis2-ui/loader" "8.16.0" - "@dhis2-ui/status-icon" "8.16.0" + "@dhis2-ui/box" "9.2.0" + "@dhis2-ui/field" "9.2.0" + "@dhis2-ui/loader" "9.2.0" + "@dhis2-ui/status-icon" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-icons" "8.16.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-icons" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/tooltip@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/tooltip/-/tooltip-8.16.0.tgz#6b52906b45ce9d048a1c39f960750c1aa906c527" - integrity sha512-h4BveS+DKwq8Tb9ThqvGynhPwRe0eerU73jdii3orh9tnf/skNYYQrc388t1t1Ti7PHw40eWVOWXs1xfBLtLoA== +"@dhis2-ui/tooltip@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/tooltip/-/tooltip-9.2.0.tgz#e7a0827d9ca6b30b69073916f7801d01fb7c9793" + integrity sha512-7Gb/Occ5/Bju95dnxUGzt/Q4129zqGWrxu1+S2uhc0YPRSx83JcG0MivPsVsr0BeU+p+8xwTVdGBOhMmqLpL9Q== dependencies: - "@dhis2-ui/popper" "8.16.0" - "@dhis2-ui/portal" "8.16.0" + "@dhis2-ui/popper" "9.2.0" + "@dhis2-ui/portal" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/transfer@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/transfer/-/transfer-8.16.0.tgz#4de6686b83dcc8cb41e186a04b7ec22cc1f2b15e" - integrity sha512-uds51dhlqRFsnaNL1cKedWy9/R4abmx5H/BAWzvNRhnTJaY33KplXlxcfTta/9TaN530uZt1fCE5NwC+dPBZqQ== +"@dhis2-ui/transfer@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/transfer/-/transfer-9.2.0.tgz#3624d08100b72143da5639ce231b53d57706ffdc" + integrity sha512-1+SdfeCBr+iOLaXf4gkpNLlysaBsWLOmlVzBdGVqFt4I4SMJrhFrCMUTz4A1Nsw7GpKGds35vGClQUe5LcuVSw== dependencies: - "@dhis2-ui/button" "8.16.0" - "@dhis2-ui/field" "8.16.0" - "@dhis2-ui/input" "8.16.0" - "@dhis2-ui/intersection-detector" "8.16.0" - "@dhis2-ui/loader" "8.16.0" + "@dhis2-ui/button" "9.2.0" + "@dhis2-ui/field" "9.2.0" + "@dhis2-ui/input" "9.2.0" + "@dhis2-ui/intersection-detector" "9.2.0" + "@dhis2-ui/loader" "9.2.0" "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" -"@dhis2-ui/user-avatar@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2-ui/user-avatar/-/user-avatar-8.16.0.tgz#c5b8ebbf5c486c8bb79b2ce20360d8f07eb2d3d2" - integrity sha512-4dhKcVoQ07UBGIjWmyk6UbzLhXnmpmSg0zbkorvwdYi34NrhQeskRrGbJCEr/SWUbhxeA085LajmJL/2YH8GVg== +"@dhis2-ui/user-avatar@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2-ui/user-avatar/-/user-avatar-9.2.0.tgz#722b4bad239aff8eb2b639ca51bd6528a08da1e4" + integrity sha512-XRop5Mmc5q1GnrM3YgIEdjw0OX7/KA9ZdxRNS4AU7ifYMEjUNutYmq8a2bJ1M6eZfq2DrhRQui9/1E7MvK+Evw== dependencies: "@dhis2/prop-types" "^3.1.2" - "@dhis2/ui-constants" "8.16.0" + "@dhis2/ui-constants" "9.2.0" classnames "^2.3.1" prop-types "^15.7.2" @@ -2036,12 +2130,12 @@ react-beautiful-dnd "^10.1.1" resize-observer-polyfill "^1.5.1" -"@dhis2/app-adapter@10.3.11": - version "10.3.11" - resolved "https://registry.yarnpkg.com/@dhis2/app-adapter/-/app-adapter-10.3.11.tgz#a5322deba404fb405f80925684d7a5d9cdc48c81" - integrity sha512-H36P1tqSuzMyu4/uxSVFsEIXrWXzqVG1NPtANY+xEJcmrOoXH7YuiKvJu/Dl4rINDkERuUM+GwWMMgfBuMmrUw== +"@dhis2/app-adapter@10.4.0": + version "10.4.0" + resolved "https://registry.yarnpkg.com/@dhis2/app-adapter/-/app-adapter-10.4.0.tgz#befb3e9ee09a4f2d064a6dc0c590bffaf5a7ca7c" + integrity sha512-dqjrK8FtshofMp4LzMV6J1Oj3c2/pyl6m+gOYx65Ynr7FPk20QybMNPEWnpmeWQbhI1iMf/OV/O6MzTiezfUfQ== dependencies: - "@dhis2/pwa" "10.3.11" + "@dhis2/pwa" "10.4.0" moment "^2.24.0" "@dhis2/app-runtime-adapter-d2@^1.1.0": @@ -2051,30 +2145,31 @@ dependencies: prop-types "^15.7.2" -"@dhis2/app-runtime@^3.9.0", "@dhis2/app-runtime@^3.9.4": - version "3.9.4" - resolved "https://registry.yarnpkg.com/@dhis2/app-runtime/-/app-runtime-3.9.4.tgz#88243dbb9a4a805be744a61cffd13a4c3d2d031d" - integrity sha512-CBwMXer5/Kcxf6MgfwPgpEaUSXbDXzwItCkH3i0nsjmkD0KIaEOZ6Y1pQL+/5RYnziZ5glYCFWsCKn0eCJrdJg== +"@dhis2/app-runtime@^3.10.0-alpha.2", "@dhis2/app-runtime@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@dhis2/app-runtime/-/app-runtime-3.10.2.tgz#e82639bd68234bdeaf2f6d3c256dcdfcdd267da2" + integrity sha512-GiftKk8ZTXlPElXAgVJn41Vj6E1vEGTPGrjrqU7j41ZTYsg+tUcCkISNt1woe5l7E+8+y+9Fy4bgqSsBOAEUvg== dependencies: - "@dhis2/app-service-alerts" "3.9.4" - "@dhis2/app-service-config" "3.9.4" - "@dhis2/app-service-data" "3.9.4" - "@dhis2/app-service-offline" "3.9.4" + "@dhis2/app-service-alerts" "3.10.2" + "@dhis2/app-service-config" "3.10.2" + "@dhis2/app-service-data" "3.10.2" + "@dhis2/app-service-offline" "3.10.2" + "@dhis2/app-service-plugin" "3.10.2" -"@dhis2/app-service-alerts@3.9.4", "@dhis2/app-service-alerts@^3.9.4": - version "3.9.4" - resolved "https://registry.yarnpkg.com/@dhis2/app-service-alerts/-/app-service-alerts-3.9.4.tgz#5aed2b191bb98bbf5eb14babb495b70f28b69aff" - integrity sha512-Oq2PZMcYyB+uXNwmifclv8oVobuKLTfN9ia7Gwa5G63c7Zjl4HldOxrM3TGDnsGYWfuGxtm8LNuzKfFX91HWmg== +"@dhis2/app-service-alerts@3.10.2", "@dhis2/app-service-alerts@^3.9.4": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@dhis2/app-service-alerts/-/app-service-alerts-3.10.2.tgz#0e07c3530606f81ab998a20f2c478600b6027a77" + integrity sha512-2IqaawnlOzYVJLBF2AKVQJ4cuxJNZD7FK0XE0XOv1WwFs70h6bp23MQueIJ/QHxLo7lamE0FC22m4diM4P0CuA== -"@dhis2/app-service-config@3.9.4": - version "3.9.4" - resolved "https://registry.yarnpkg.com/@dhis2/app-service-config/-/app-service-config-3.9.4.tgz#4cab3a4ba090e53235f01c6a6913467171052d89" - integrity sha512-hiJr33zNWjUWJDx8l7tFMDfzX11euE+t6+ph2x9LnQ9KHDXFhh3GZhyQnX+8IATtlS4Fx9fjz2scQhGsg2dt0g== +"@dhis2/app-service-config@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@dhis2/app-service-config/-/app-service-config-3.10.2.tgz#be52676068e31cdb1fe3f8ddabb8153e1cd6e3e6" + integrity sha512-Crw7Tx4yg4qWw3qYxNCIye77IaY2HUYyDmDKPVVWzgmrcSGxpunv/NtsUg12pxrVfVLnqlH9L6AF9A6hO0afmw== -"@dhis2/app-service-data@3.9.4": - version "3.9.4" - resolved "https://registry.yarnpkg.com/@dhis2/app-service-data/-/app-service-data-3.9.4.tgz#03cd4cc40a316670d5ae328488cc8ef2a8a9b377" - integrity sha512-3AFwBkR1H8M6b+T5N3vcRsx9iiJm5LjltXYkbA9fmxcjJ02VoHa2B3a529pp8w9qSp7mpAF4Kmr3gZPvFpBRDA== +"@dhis2/app-service-data@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@dhis2/app-service-data/-/app-service-data-3.10.2.tgz#e94d45d87cab5e156decfe9e92e3153e5df68ba0" + integrity sha512-+ESLrVEDQKXBaQmpaCq78RonkqJM2BliykaO4QBeOc4ilWohaqYajue1Ntg4uV2KrdkCylBdMDwGYjsak0G7hg== dependencies: react-query "^3.13.11" @@ -2091,25 +2186,33 @@ "@dhis2/app-service-data" "^2.1.1" uuid "^8.1.0" -"@dhis2/app-service-offline@3.9.4": - version "3.9.4" - resolved "https://registry.yarnpkg.com/@dhis2/app-service-offline/-/app-service-offline-3.9.4.tgz#ba4f3a916ca9a4c714fdedac51c66daa4f2c6bd7" - integrity sha512-vtv9V3Za/ukujPpqBRGkKZTloM2Cu29J+zHziyrTKC+hVsw8p3d4dHgXvpOGLcjq3ePAvEX4aEZK9+VCHnNFRQ== +"@dhis2/app-service-offline@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@dhis2/app-service-offline/-/app-service-offline-3.10.2.tgz#082279b7045e702c2eecda751d762225313156b0" + integrity sha512-bTp+CCRbyKt/0QADj0O6wLNWhi+6QDkjt2+sfpv3M8oKcftjaQDqedVoypZRA0nqvSdVL2ehtTzqMrrxu6jtZQ== dependencies: lodash "^4.17.21" -"@dhis2/app-shell@10.3.11": - version "10.3.11" - resolved "https://registry.yarnpkg.com/@dhis2/app-shell/-/app-shell-10.3.11.tgz#461a19159ae6938e705ab793005403327b1ad95b" - integrity sha512-DCEOFK5i2/oNOOz33SqQ/7J3LJN0zUYMukdS/arEQCR9zP4bs+1yHGNRXtv8XoQRiYzdlIXsimlZzOm1ZDsxTw== +"@dhis2/app-service-plugin@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@dhis2/app-service-plugin/-/app-service-plugin-3.10.2.tgz#09de64ee59017c86c8dab96a0d2ca0d915ae9d31" + integrity sha512-FqR6ILmvAXT2n1SzCZknT+5jJRdajg1dBegWAu3xqZXAntsM4wvFLCx6EtjS5LO2Kga9VZ+TJmVr2UFX1330CQ== dependencies: - "@dhis2/app-adapter" "10.3.11" - "@dhis2/app-runtime" "^3.9.0" + post-robot "^10.0.46" + +"@dhis2/app-shell@10.4.0": + version "10.4.0" + resolved "https://registry.yarnpkg.com/@dhis2/app-shell/-/app-shell-10.4.0.tgz#66cf2148bc2e92f741f7ef0dd08ef955f2c40707" + integrity sha512-XROGP/co8IZJF//xHUY/m6EZhIh+6g4Wk/ItTgrkYnBbz69JWXB2Zo/M/b2nx3TKOKbz9FeVXVeH7liWHKkaug== + dependencies: + "@dhis2/app-adapter" "10.4.0" + "@dhis2/app-runtime" "^3.10.0-alpha.2" "@dhis2/d2-i18n" "^1.1.1" - "@dhis2/pwa" "10.3.11" + "@dhis2/pwa" "10.4.0" "@dhis2/ui" "^8.12.3" classnames "^2.2.6" moment "^2.29.1" + post-robot "^10.0.46" prop-types "^15.7.2" react "^16.8.6" react-dom "^16.8.6" @@ -2119,10 +2222,10 @@ typeface-roboto "^0.0.75" typescript "^3.6.3" -"@dhis2/cli-app-scripts@^10.3.11": - version "10.3.11" - resolved "https://registry.yarnpkg.com/@dhis2/cli-app-scripts/-/cli-app-scripts-10.3.11.tgz#024920726eb9a9057fa1f73d745b9a75b5d55b7e" - integrity sha512-j7fetbmlSSHdGz9YlGJMaKyLzfEGWnOoaKvi53UfI0e3k7EIBbc9YTLH6qoYJX4KvvXNjB9ICNjvTFEjWHeIZw== +"@dhis2/cli-app-scripts@^10.4.0": + version "10.4.0" + resolved "https://registry.yarnpkg.com/@dhis2/cli-app-scripts/-/cli-app-scripts-10.4.0.tgz#3a80ccc7c10b0804e8d76f7df40ece48d30d5f17" + integrity sha512-QMx+5UEEEb0AELzeZ5oZcxb8dv0hpzHS3/ily67oRchVdGB1K1stl0MwQF7CdbCS4ejGtU+2c5ODWFoBD0cWFA== dependencies: "@babel/core" "^7.6.2" "@babel/plugin-proposal-class-properties" "^7.8.3" @@ -2131,7 +2234,7 @@ "@babel/preset-env" "^7.14.7" "@babel/preset-react" "^7.0.0" "@babel/preset-typescript" "^7.6.0" - "@dhis2/app-shell" "10.3.11" + "@dhis2/app-shell" "10.4.0" "@dhis2/cli-helpers-engine" "^3.2.0" "@jest/core" "^27.0.6" "@pmmmwh/react-refresh-webpack-plugin" "^0.5.4" @@ -2283,10 +2386,10 @@ resolved "https://registry.yarnpkg.com/@dhis2/prop-types/-/prop-types-3.1.2.tgz#65b8ad2da8cd2f72bc8b951049a6c9d1b97af3e9" integrity sha512-eM0jjLOWvtXWqSFp5YC4DHFpkP8Y1D2eUwGV7MBWjni+o27oesVan+oT7WHeOeLdlAd4acRJrnaaAyB4Ck1wGQ== -"@dhis2/pwa@10.3.11": - version "10.3.11" - resolved "https://registry.yarnpkg.com/@dhis2/pwa/-/pwa-10.3.11.tgz#6eb5a692fe92a56bd6ffa56f06322617c15968dc" - integrity sha512-nHQhNDe0MTEG3/YcdBDcGD6NwcDoDKUyJWbtC8xErEKbHIns0HWjhIC+NPMrVu3NxEv1HZiHupK9lnfzPVJC4Q== +"@dhis2/pwa@10.4.0": + version "10.4.0" + resolved "https://registry.yarnpkg.com/@dhis2/pwa/-/pwa-10.4.0.tgz#1b21b79b1a8c85aed9c73e4655e1bb1f4d3d3d95" + integrity sha512-iNq4imbSBnIv2YBkrtljsAHV/Q934ZxZVfUiffGWAAiS9gqhrD1iQ9dhCRl4nq/X71sIRR28aK7CDlwql31OrQ== dependencies: idb "^6.0.0" workbox-core "^6.1.5" @@ -2294,91 +2397,91 @@ workbox-routing "^6.1.5" workbox-strategies "^6.1.5" -"@dhis2/ui-constants@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2/ui-constants/-/ui-constants-8.16.0.tgz#ab37fbe34ba074fd303ea405b13ea8ba93bfcafe" - integrity sha512-IXYyLmVRCfY7JBZUrRdOCqhYP5B5uvH/6SZL54apHgnl5JpblTdK9YxSYjr38m0MgiRmL07NLjK0nW7xVTzV0g== +"@dhis2/ui-constants@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2/ui-constants/-/ui-constants-9.2.0.tgz#47506acaec5e4ce28630519a630a05657d2d29f6" + integrity sha512-gMbnVJQJmCPoGJHnY09BoDe6Z1vukzFdUcm0HPYyijs8ZWnclLs+69iVamxhskOnNWgj8hEt/FVs4mfhMcW3Cg== dependencies: prop-types "^15.7.2" -"@dhis2/ui-forms@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2/ui-forms/-/ui-forms-8.16.0.tgz#6d896ebd6a0de89c4e9fd63f919c084464db3036" - integrity sha512-tOS+0sQxh36H4IeoAnlXr0C1nKx+Ckq/9W9r3I0+8OidMzlZD7u+43IcpWI02r9AEZC6LlNRwdM2wOjXnJXN9w== - dependencies: - "@dhis2-ui/button" "8.16.0" - "@dhis2-ui/checkbox" "8.16.0" - "@dhis2-ui/field" "8.16.0" - "@dhis2-ui/file-input" "8.16.0" - "@dhis2-ui/input" "8.16.0" - "@dhis2-ui/radio" "8.16.0" - "@dhis2-ui/select" "8.16.0" - "@dhis2-ui/switch" "8.16.0" - "@dhis2-ui/text-area" "8.16.0" +"@dhis2/ui-forms@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2/ui-forms/-/ui-forms-9.2.0.tgz#a5651dc5010a495c8a52ef5484e7d44b2583b715" + integrity sha512-eodiPW+ahR5wVsgrl/bFvj2zyeJD+DR9woqys4ZyoaHlKjOdeLqDNbJDnrS+AmHfte5uorF/aWzmEZr825LBVg== + dependencies: + "@dhis2-ui/button" "9.2.0" + "@dhis2-ui/checkbox" "9.2.0" + "@dhis2-ui/field" "9.2.0" + "@dhis2-ui/file-input" "9.2.0" + "@dhis2-ui/input" "9.2.0" + "@dhis2-ui/radio" "9.2.0" + "@dhis2-ui/select" "9.2.0" + "@dhis2-ui/switch" "9.2.0" + "@dhis2-ui/text-area" "9.2.0" "@dhis2/prop-types" "^3.1.2" classnames "^2.3.1" final-form "^4.20.2" prop-types "^15.7.2" react-final-form "^6.5.3" -"@dhis2/ui-icons@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2/ui-icons/-/ui-icons-8.16.0.tgz#eda8efc060740b17c1821c89a14435b938ef8c27" - integrity sha512-RaYCrFuqN6/l0mF+71CyxvRKwXCfaUfMQudTgdCpZw0OwwoRmfg4wJdB75u+jl4RUj/E447zl439YGyHEbStHw== - -"@dhis2/ui@^8.12.3", "@dhis2/ui@^8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@dhis2/ui/-/ui-8.16.0.tgz#b427cb3d35b0e8c8d2e8c3abfeec333dd54ef7b2" - integrity sha512-qWUd0dBRXT+dkuCbs7XlPl3YpXRJuouTM2Uf5Wa7z5VHsFVPBrHRBGmgYqmJpTrrQBFTnRmrKHVjSqfnm14D5g== - dependencies: - "@dhis2-ui/alert" "8.16.0" - "@dhis2-ui/box" "8.16.0" - "@dhis2-ui/button" "8.16.0" - "@dhis2-ui/calendar" "8.16.0" - "@dhis2-ui/card" "8.16.0" - "@dhis2-ui/center" "8.16.0" - "@dhis2-ui/checkbox" "8.16.0" - "@dhis2-ui/chip" "8.16.0" - "@dhis2-ui/cover" "8.16.0" - "@dhis2-ui/css" "8.16.0" - "@dhis2-ui/divider" "8.16.0" - "@dhis2-ui/field" "8.16.0" - "@dhis2-ui/file-input" "8.16.0" - "@dhis2-ui/header-bar" "8.16.0" - "@dhis2-ui/help" "8.16.0" - "@dhis2-ui/input" "8.16.0" - "@dhis2-ui/intersection-detector" "8.16.0" - "@dhis2-ui/label" "8.16.0" - "@dhis2-ui/layer" "8.16.0" - "@dhis2-ui/legend" "8.16.0" - "@dhis2-ui/loader" "8.16.0" - "@dhis2-ui/logo" "8.16.0" - "@dhis2-ui/menu" "8.16.0" - "@dhis2-ui/modal" "8.16.0" - "@dhis2-ui/node" "8.16.0" - "@dhis2-ui/notice-box" "8.16.0" - "@dhis2-ui/organisation-unit-tree" "8.16.0" - "@dhis2-ui/pagination" "8.16.0" - "@dhis2-ui/popover" "8.16.0" - "@dhis2-ui/popper" "8.16.0" - "@dhis2-ui/portal" "8.16.0" - "@dhis2-ui/radio" "8.16.0" - "@dhis2-ui/required" "8.16.0" - "@dhis2-ui/segmented-control" "8.16.0" - "@dhis2-ui/select" "8.16.0" - "@dhis2-ui/selector-bar" "8.16.0" - "@dhis2-ui/sharing-dialog" "8.16.0" - "@dhis2-ui/switch" "8.16.0" - "@dhis2-ui/tab" "8.16.0" - "@dhis2-ui/table" "8.16.0" - "@dhis2-ui/tag" "8.16.0" - "@dhis2-ui/text-area" "8.16.0" - "@dhis2-ui/tooltip" "8.16.0" - "@dhis2-ui/transfer" "8.16.0" - "@dhis2-ui/user-avatar" "8.16.0" - "@dhis2/ui-constants" "8.16.0" - "@dhis2/ui-forms" "8.16.0" - "@dhis2/ui-icons" "8.16.0" +"@dhis2/ui-icons@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2/ui-icons/-/ui-icons-9.2.0.tgz#bddf5223cabec93c9499281b2181eb165346b639" + integrity sha512-g9993UGWVLwDcbV+wp3HqrK8AXFu49aped0GpZsQUlGbHIzEl1EgmjiII44N40VbXwVUnqIDmu99wBxpH5Gd+g== + +"@dhis2/ui@^8.12.3", "@dhis2/ui@^9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@dhis2/ui/-/ui-9.2.0.tgz#33d474cbc7cd95f8a714e019d6c69e144f77f86b" + integrity sha512-nhKwW5bmIfQvt3L16PffFO2NsDk9BgYb91vHx06fPgM56UdwGYSejpax8eU29vE9urmHSkijSpnBqY4buZy6Ow== + dependencies: + "@dhis2-ui/alert" "9.2.0" + "@dhis2-ui/box" "9.2.0" + "@dhis2-ui/button" "9.2.0" + "@dhis2-ui/calendar" "9.2.0" + "@dhis2-ui/card" "9.2.0" + "@dhis2-ui/center" "9.2.0" + "@dhis2-ui/checkbox" "9.2.0" + "@dhis2-ui/chip" "9.2.0" + "@dhis2-ui/cover" "9.2.0" + "@dhis2-ui/css" "9.2.0" + "@dhis2-ui/divider" "9.2.0" + "@dhis2-ui/field" "9.2.0" + "@dhis2-ui/file-input" "9.2.0" + "@dhis2-ui/header-bar" "9.2.0" + "@dhis2-ui/help" "9.2.0" + "@dhis2-ui/input" "9.2.0" + "@dhis2-ui/intersection-detector" "9.2.0" + "@dhis2-ui/label" "9.2.0" + "@dhis2-ui/layer" "9.2.0" + "@dhis2-ui/legend" "9.2.0" + "@dhis2-ui/loader" "9.2.0" + "@dhis2-ui/logo" "9.2.0" + "@dhis2-ui/menu" "9.2.0" + "@dhis2-ui/modal" "9.2.0" + "@dhis2-ui/node" "9.2.0" + "@dhis2-ui/notice-box" "9.2.0" + "@dhis2-ui/organisation-unit-tree" "9.2.0" + "@dhis2-ui/pagination" "9.2.0" + "@dhis2-ui/popover" "9.2.0" + "@dhis2-ui/popper" "9.2.0" + "@dhis2-ui/portal" "9.2.0" + "@dhis2-ui/radio" "9.2.0" + "@dhis2-ui/required" "9.2.0" + "@dhis2-ui/segmented-control" "9.2.0" + "@dhis2-ui/select" "9.2.0" + "@dhis2-ui/selector-bar" "9.2.0" + "@dhis2-ui/sharing-dialog" "9.2.0" + "@dhis2-ui/switch" "9.2.0" + "@dhis2-ui/tab" "9.2.0" + "@dhis2-ui/table" "9.2.0" + "@dhis2-ui/tag" "9.2.0" + "@dhis2-ui/text-area" "9.2.0" + "@dhis2-ui/tooltip" "9.2.0" + "@dhis2-ui/transfer" "9.2.0" + "@dhis2-ui/user-avatar" "9.2.0" + "@dhis2/ui-constants" "9.2.0" + "@dhis2/ui-forms" "9.2.0" + "@dhis2/ui-icons" "9.2.0" prop-types "^15.7.2" "@dnd-kit/accessibility@^3.0.0": @@ -2968,18 +3071,18 @@ mocha "^10.2.0" node-ipc "9.1.1" -"@reportportal/agent-js-jest@^5.0.6": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@reportportal/agent-js-jest/-/agent-js-jest-5.0.6.tgz#336ed06c3c80d70bd8e50824bc3c883cb5d2548e" - integrity sha512-Gt2oOZ/k5HxZ2J3Hb6X43y6XZmvpldt3yM2wPdrU5CPhXb9hxdiZUl+e2MfI3y0aB+d6T/AkKcUyT7f91sZaYw== +"@reportportal/agent-js-jest@^5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@reportportal/agent-js-jest/-/agent-js-jest-5.0.7.tgz#e87382b4dffc5b01d54cfdca64bfdc70ece2bfeb" + integrity sha512-yqWcKi0UJSKUImfFClRTGGL14DE9RZW94YWnekfZXry4Rlh8y+zOgncV3qeE/2X2c5FHlvVUhZnkH/++RLvamw== dependencies: - "@reportportal/client-javascript" "^5.0.12" + "@reportportal/client-javascript" "^5.0.15" strip-ansi "^6.0.1" -"@reportportal/client-javascript@^5.0.12", "@reportportal/client-javascript@^5.0.14": - version "5.0.14" - resolved "https://registry.yarnpkg.com/@reportportal/client-javascript/-/client-javascript-5.0.14.tgz#48a40f2f33129d74bb7e451aaf25d44742e26fcc" - integrity sha512-4ge9ddOB1rFlzqI6j43qCw0cyjQOloiPChA1EFyF3dcV2BXHzGbh8S3SNhwxibvlQtV6piU8e0W9CLN4UWXvSA== +"@reportportal/client-javascript@^5.0.14", "@reportportal/client-javascript@^5.0.15": + version "5.0.15" + resolved "https://registry.yarnpkg.com/@reportportal/client-javascript/-/client-javascript-5.0.15.tgz#57080be5bdb347ab0019aeb385f9f282349f7ac4" + integrity sha512-ry6euqCOoJLXCUuBhlRMjCYKhbgU+9EYdZ8jpTuagoBVxS8V8nJed9ODnS4bXX61g+pJm+NP/0DrN2Ptq+DgQQ== dependencies: axios "^0.27.2" axios-retry "^3.4.0" @@ -4616,6 +4719,15 @@ axios@^0.27.2: follow-redirects "^1.14.9" form-data "^4.0.0" +axios@^1.6.1: + version "1.6.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" + integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + axobject-query@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" @@ -4834,6 +4946,15 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +belter@^1.0.41: + version "1.0.190" + resolved "https://registry.yarnpkg.com/belter/-/belter-1.0.190.tgz#491857550ef240d9c66b56fc637991f5c3089966" + integrity sha512-jz05FHrO+bwitdI6JxV5ESyRdVhTcwMWQ7L4o+q/R4LNJFQrG58sp9EiwsSjhbihhiyYFcmmCMRRagxte6igtw== + dependencies: + cross-domain-safe-weakmap "^1" + cross-domain-utils "^2" + zalgo-promise "^1" + bfj@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" @@ -6052,6 +6173,20 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +cross-domain-safe-weakmap@^1, cross-domain-safe-weakmap@^1.0.1: + version "1.0.29" + resolved "https://registry.yarnpkg.com/cross-domain-safe-weakmap/-/cross-domain-safe-weakmap-1.0.29.tgz#0847975c27d9e1cc840f24c1745311958df98022" + integrity sha512-VLoUgf2SXnf3+na8NfeUFV59TRZkIJqCIATaMdbhccgtnTlSnHXkyTRwokngEGYdQXx8JbHT9GDYitgR2sdjuA== + dependencies: + cross-domain-utils "^2.0.0" + +cross-domain-utils@^2, cross-domain-utils@^2.0.0: + version "2.0.38" + resolved "https://registry.yarnpkg.com/cross-domain-utils/-/cross-domain-utils-2.0.38.tgz#2eaf321c4dfdb61596805ca4233fde4400cb6377" + integrity sha512-zZfi3+2EIR9l4chrEiXI2xFleyacsJf8YMLR1eJ0Veb5FTMXeJ3DpxDjZkto2FhL/g717WSELqbptNSo85UJDw== + dependencies: + zalgo-promise "^1.0.11" + cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -6578,6 +6713,11 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== +decode-uri-component@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.4.1.tgz#2ac4859663c704be22bf7db760a1494a49ab2cc5" + integrity sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ== + decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -7411,12 +7551,12 @@ eslint-module-utils@^2.7.4: dependencies: debug "^3.2.7" -eslint-plugin-cypress@^2.13.3: - version "2.13.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.13.3.tgz#5fc1afdc939aaa7daa9181f651f2f35429733ff2" - integrity sha512-nAPjZE5WopCsgJwl3vHm5iafpV+ZRO76Z9hMyRygWhmg5ODXDPd+9MaPl7kdJ2azj+sO87H3P1PRnggIrz848g== +eslint-plugin-cypress@^2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.15.1.tgz#336afa7e8e27451afaf65aa359c9509e0a4f3a7b" + integrity sha512-eLHLWP5Q+I4j2AWepYq0PgFEei9/s5LvjuSqWrxurkg1YZ8ltxdvMNmdSf0drnsNo57CTgYY/NIHHLRSWejR7w== dependencies: - globals "^11.12.0" + globals "^13.20.0" eslint-plugin-flowtype@^8.0.3: version "8.0.3" @@ -8064,6 +8204,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +filter-obj@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-5.1.0.tgz#5bd89676000a713d7db2e197f660274428e524ed" + integrity sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng== + final-form@^4.20.2: version "4.20.9" resolved "https://registry.yarnpkg.com/final-form/-/final-form-4.20.9.tgz#647b459f8c504d77ec8f6e280015ab172982af2f" @@ -8168,6 +8313,11 @@ follow-redirects@^1.0.0, follow-redirects@^1.14.7, follow-redirects@^1.14.9: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +follow-redirects@^1.15.0: + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -8590,15 +8740,15 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -globals@^11.1.0, globals@^11.12.0: +globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.19.0, globals@^13.6.0, globals@^13.9.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== +globals@^13.19.0, globals@^13.20.0, globals@^13.6.0, globals@^13.9.0: + version "13.21.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" + integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== dependencies: type-fest "^0.20.2" @@ -8827,6 +8977,13 @@ highcharts@^10.3.3: resolved "https://registry.yarnpkg.com/highcharts/-/highcharts-10.3.3.tgz#b8acca24f2d4b1f2f726540734166e59e07b35c4" integrity sha512-r7wgUPQI9tr3jFDn3XT36qsNwEIZYcfgz4mkKEA6E4nn5p86y+u1EZjazIG4TRkl5/gmGRtkBUiZW81g029RIw== +history@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" + integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== + dependencies: + "@babel/runtime" "^7.7.6" + hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -10350,10 +10507,10 @@ jest@^27.4.3: import-local "^3.0.2" jest-cli "^27.5.1" -joi@^17.7.0: - version "17.8.3" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.8.3.tgz#d772fe27a87a5cda21aace5cf11eee8671ca7e6f" - integrity sha512-q5Fn6Tj/jR8PfrLrx4fpGH4v9qM6o+vDUfD4/3vxxyg34OmKcNqYZ1qn2mpLza96S8tL0p0rIw2gOZX+/cTg9w== +joi@^17.11.0: + version "17.11.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a" + integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== dependencies: "@hapi/hoek" "^9.0.0" "@hapi/topo" "^5.0.0" @@ -11335,7 +11492,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7, minimist@^1.2.8: +minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -12278,6 +12435,17 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== +post-robot@^10.0.46: + version "10.0.46" + resolved "https://registry.yarnpkg.com/post-robot/-/post-robot-10.0.46.tgz#39cea5b51033729390fc7c90be3285cd285f0377" + integrity sha512-EgVJiuvI4iRWDZvzObWes0X/n8olWBEJWxlSw79zmhpgkigX8UsVL4VOBhVtoJKwf0Y9qP9g2zOONw1rv80QbA== + dependencies: + belter "^1.0.41" + cross-domain-safe-weakmap "^1.0.1" + cross-domain-utils "^2.0.0" + universal-serialize "^1.0.4" + zalgo-promise "^1.0.3" + postcss-attribute-case-insensitive@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" @@ -12962,6 +13130,11 @@ proxy-from-env@1.0.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + ps-tree@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" @@ -13055,6 +13228,15 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== +query-string@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-8.1.0.tgz#e7f95367737219544cd360a11a4f4ca03836e115" + integrity sha512-BFQeWxJOZxZGix7y+SByG3F36dA0AbTy9o6pSmKFcFz7DAj0re9Frkty3saBn3nHo3D0oZJ/+rx3r8H8r8Jbpw== + dependencies: + decode-uri-component "^0.4.1" + filter-obj "^5.1.0" + split-on-first "^3.0.0" + querystring-es3@~0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -13565,6 +13747,11 @@ regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.9: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" @@ -13938,13 +14125,20 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.0" -rxjs@^7.5.1, rxjs@^7.8.0: +rxjs@^7.5.1: version "7.8.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== dependencies: tslib "^2.1.0" +rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -14486,6 +14680,11 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" +split-on-first@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-3.0.0.tgz#f04959c9ea8101b9b0bbf35a61b9ebea784a23e7" + integrity sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -14544,10 +14743,10 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== -start-server-and-test@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/start-server-and-test/-/start-server-and-test-2.0.1.tgz#e110e0b5a54c80963f65b9689c2c320ab8ac9025" - integrity sha512-8PFo4DLLLCDMuS51/BEEtE1m9CAXw1LNVtZSS1PzkYQh6Qf9JUwM4huYeSoUumaaoAyuwYBwCa9OsrcpMqcOdQ== +start-server-and-test@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/start-server-and-test/-/start-server-and-test-2.0.3.tgz#15c53c85e23cba7698b498b8a2598cab95f3f802" + integrity sha512-QsVObjfjFZKJE6CS6bSKNwWZCKBG6975/jKRPPGFfFh+yOQglSeGXiNWjzgQNXdphcBI9nXbyso9tPfX4YAUhg== dependencies: arg "^5.0.2" bluebird "3.7.2" @@ -14556,7 +14755,7 @@ start-server-and-test@^2.0.1: execa "5.1.1" lazy-ass "1.6.0" ps-tree "1.2.0" - wait-on "7.0.1" + wait-on "7.2.0" static-extend@^0.1.1: version "0.1.2" @@ -15578,6 +15777,11 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +universal-serialize@^1.0.4: + version "1.0.10" + resolved "https://registry.yarnpkg.com/universal-serialize/-/universal-serialize-1.0.10.tgz#3279bb30f47290ea479f45135620f98fa9d3f3a6" + integrity sha512-FdouA4xSFa0fudk1+z5vLWtxZCoC0Q9lKYV3uUdFl7DttNfolmiw2ASr5ddY+/Yz6Isr68u3IqC9XMSwMP+Pow== + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -15887,16 +16091,16 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -wait-on@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-7.0.1.tgz#5cff9f8427e94f4deacbc2762e6b0a489b19eae9" - integrity sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog== +wait-on@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-7.2.0.tgz#d76b20ed3fc1e2bebc051fae5c1ff93be7892928" + integrity sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ== dependencies: - axios "^0.27.2" - joi "^17.7.0" + axios "^1.6.1" + joi "^17.11.0" lodash "^4.17.21" - minimist "^1.2.7" - rxjs "^7.8.0" + minimist "^1.2.8" + rxjs "^7.8.1" walker@^1.0.7: version "1.0.8" @@ -16533,6 +16737,11 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +zalgo-promise@^1, zalgo-promise@^1.0.11, zalgo-promise@^1.0.3: + version "1.0.48" + resolved "https://registry.yarnpkg.com/zalgo-promise/-/zalgo-promise-1.0.48.tgz#9e33eef502d5ed9f5a09fc5728c833c3e87afa2e" + integrity sha512-LLHANmdm53+MucY9aOFIggzYtUdkSBFxUsy4glTTQYNyK6B3uCPWTbfiGvSrEvLojw0mSzyFJ1/RRLv+QMNdzQ== + zip-stream@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-2.1.3.tgz#26cc4bdb93641a8590dd07112e1f77af1758865b"