Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
0f24253
chore: use Number.isNaN() and .replaceAll() [sonarqube]
BRaimbault Apr 24, 2026
5cc914b
fix: thematic legend maxValue identification error
BRaimbault Apr 24, 2026
41e92b8
fix: more robust legend items sorting
BRaimbault Apr 24, 2026
8c3ed44
fix: unify value-to-legend-item matching between thematic and event l…
BRaimbault Apr 24, 2026
a848925
chore: add tests
BRaimbault Apr 24, 2026
55f6c19
fix: dedupe bins and match single-value classes [DHIS2-12860]
BRaimbault Apr 24, 2026
a5ba0bd
feat: add new classification method (natural breaks, pretty breaks, l…
BRaimbault Apr 24, 2026
cfed941
fix: cap class count by distinct values and handle all-equal data [DH…
BRaimbault Apr 24, 2026
3bb8c43
fix: handle minValue === maxValue in bubble legend [DHIS2-20818]
BRaimbault Apr 24, 2026
ada9dfa
chore: add tests
BRaimbault Apr 24, 2026
f236c9b
chore: fix sonarqube issue
BRaimbault Apr 24, 2026
33093a0
fix: auto-select legend set when switching to predefined type [DHIS2-…
BRaimbault Apr 26, 2026
13b4a1a
feat: format numeric values with digit group separator [DHIS2-18963]
BRaimbault Apr 26, 2026
90364ee
chore: add tests
BRaimbault Apr 26, 2026
2273c05
fix: apply digit group separator formatting before bubble legend layo…
BRaimbault Apr 26, 2026
ec96244
fix: apply digit group separator to org unit profile data items
BRaimbault Apr 26, 2026
78342d0
fix: apply digit group separator to Earth Engine popup values
BRaimbault Apr 26, 2026
f93d7a5
fix: use "Classes" instead of "Steps" label in Earth Engine style sel…
BRaimbault Apr 26, 2026
78acf3b
fix: widen color picker button in option set and boolean styles [DHIS…
BRaimbault Apr 26, 2026
bbcda63
fix: show values for NUMBER data items with option sets in data table…
BRaimbault Apr 26, 2026
0766788
fix: sort range column numerically in data table [DHIS2-19983]
BRaimbault Apr 26, 2026
541661a
feat: add legendDecimalPlaces option for automatic legend precision […
BRaimbault Apr 26, 2026
c520c9b
chore: add tests
BRaimbault Apr 26, 2026
1e3ac48
fix: apply digit group separator formatting before bubble legend layo…
BRaimbault Apr 26, 2026
2853a01
fix: apply digit group separator to org unit profile data items [DHIS…
BRaimbault Apr 26, 2026
070dd74
fix: apply digit group separator to Earth Engine popup values [DHIS2-…
BRaimbault Apr 26, 2026
c60b633
Merge branch 'feat/DHIS2-18242-PR3' into feat/DHIS2-18242-PR4
BRaimbault Apr 26, 2026
666a8b7
fix: use getClassificationTypes to validate classification method in …
BRaimbault Apr 27, 2026
39d64bf
Merge branch 'feat/DHIS2-18242-PR2' into feat/DHIS2-18242-PR3
BRaimbault Apr 27, 2026
1261149
chore: move decimalPlaces from legend items to legend object [DHIS2-3…
BRaimbault Apr 27, 2026
2e6251b
Merge branch 'feat/DHIS2-18242-PR3' into feat/DHIS2-18242-PR4
BRaimbault Apr 27, 2026
60caa87
fix: guard Bubbles against undefined minValue/maxValue [DHIS2-20818]
BRaimbault Apr 27, 2026
963951f
Merge branch 'feat/DHIS2-18242-PR2' into feat/DHIS2-18242-PR3
BRaimbault Apr 27, 2026
bf3819e
Merge branch 'feat/DHIS2-18242-PR3' into feat/DHIS2-18242-PR4
BRaimbault Apr 27, 2026
9269581
chore: move decimalPlaces from legend items to legend object [DHIS2-3…
BRaimbault Apr 27, 2026
1062864
feat: improve predefined legend display by detecting range-encoded na…
BRaimbault Apr 26, 2026
d103bd0
feat: add isolated class to layer classification [DHIS2-15514]
BRaimbault Apr 28, 2026
471d227
feat: add no data and unclassified legend controls [DHIS2-19812]
BRaimbault Apr 30, 2026
d6ca268
feat: route non-classifiable log/SD values to unclassified [DHIS2-19812]
BRaimbault Apr 30, 2026
68a7d2d
chore: add tests
BRaimbault Apr 30, 2026
dcf0817
chore: fix sonarqube issue
BRaimbault Apr 30, 2026
4c828a2
chore: fix cypress test
BRaimbault Apr 30, 2026
eefbdfd
fix: isolated class was skipped in event layer [DHIS2-15514]
BRaimbault May 1, 2026
dcf21cc
feat: add per-layer visibility toggle in plugin legend panel [DHIS2-2…
BRaimbault May 1, 2026
c51f68d
feat: persist layer visibility and basemap opacity on map save [DHIS2…
BRaimbault May 1, 2026
92a3e8f
chore: add tests
BRaimbault May 1, 2026
79fc2d1
feat: count features without coordinates across all layer types [DHIS…
BRaimbault May 4, 2026
99a645c
fix: guard against null layerEdit in connected component selectors
BRaimbault May 4, 2026
9f6f899
chore: add tests
BRaimbault May 4, 2026
740baf4
chore: fix sonarqube issue
BRaimbault May 4, 2026
b197607
fix: clarify missing org unit label for facility layers [DHIS2-19850]
BRaimbault May 14, 2026
5a559a3
Merge branch 'feat/DHIS2-18242' into feat/DHIS2-18242-PR1
BRaimbault May 14, 2026
c9f49ae
Merge branch 'feat/DHIS2-18242-PR1' into feat/DHIS2-18242-PR2
BRaimbault May 14, 2026
77bfa08
Merge branch 'feat/DHIS2-18242-PR2' into feat/DHIS2-18242-PR3
BRaimbault May 14, 2026
960803b
chore: use VERSION-TOGGLE convention for DHIS2-16088 comment
BRaimbault May 14, 2026
fca2fbb
Merge branch 'feat/DHIS2-18242-PR3' into feat/DHIS2-18242-PR4
BRaimbault May 14, 2026
2f01b86
feat: add unclassified class for facility and org unit group set styl…
BRaimbault May 14, 2026
bd277ac
Merge branch 'feat/DHIS2-18242-PR4' into feat/DHIS2-18242-PR5
BRaimbault May 14, 2026
aac627e
Merge branch 'feat/DHIS2-18242-PR5' into feat/DHIS2-18242-PR6
BRaimbault May 14, 2026
9d9607a
Merge remote-tracking branch 'origin/feat/DHIS2-18242-PR6' into feat/…
BRaimbault May 14, 2026
1c0ce33
Merge remote-tracking branch 'origin/feat/DHIS2-18242-PR6' into feat/…
BRaimbault May 14, 2026
0468574
chore: lint errors
BRaimbault May 14, 2026
97880d0
docs: split maps.md into per-section source files
BRaimbault May 15, 2026
94ac874
docs: update and improve all documentation sections
BRaimbault May 15, 2026
68ea5f5
fix: apply suggestions from code review
BRaimbault May 18, 2026
8ec7a01
docs: explain legend classification rules [DHIS2-15695]
BRaimbault May 19, 2026
011db02
chore: fix sonarqube issue
BRaimbault May 19, 2026
d27b216
Merge branch 'feat/DHIS2-18242-PR7' into feat/DHIS2-18242-PR8
BRaimbault May 19, 2026
888f2f9
docs: improve classification method descriptions
BRaimbault May 19, 2026
9aaa3c4
docs: clarify that legend items and counts exclude org units without …
BRaimbault May 20, 2026
cdcbb06
feat: multi-column legend with tooltips
BRaimbault May 30, 2026
12082fb
fix: empty value display and donut double-count in event layer
BRaimbault May 30, 2026
0824e69
chore: fix sonarqube issues and cypress tests
BRaimbault Jun 1, 2026
22ab37c
fix: improve layer error display in legend and layer card
BRaimbault Jun 1, 2026
ba0efd7
fix: legend tooltips and count formatting improvements
BRaimbault Jun 1, 2026
db1d9a8
chore: fix sonarqube issues
BRaimbault Jun 1, 2026
6745973
fix: replace dynamic nameMaxWidth formula with fixed 8.5em cap
BRaimbault Jun 1, 2026
8d6129d
Merge branch 'feat/DHIS2-18242' into feat/DHIS2-18242-PR1
BRaimbault Jun 2, 2026
7415723
Merge branch 'feat/DHIS2-18242-PR1' into feat/DHIS2-18242-PR2
BRaimbault Jun 2, 2026
812bd0b
Merge branch 'feat/DHIS2-18242-PR2' into feat/DHIS2-18242-PR3
BRaimbault Jun 2, 2026
7dbbb5f
Merge branch 'feat/DHIS2-18242-PR3' into feat/DHIS2-18242-PR4
BRaimbault Jun 2, 2026
ca0d918
Merge branch 'feat/DHIS2-18242-PR4' into feat/DHIS2-18242-PR5
BRaimbault Jun 2, 2026
871a562
Merge branch 'feat/DHIS2-18242-PR5' into feat/DHIS2-18242-PR6
BRaimbault Jun 2, 2026
c15df36
Merge branch 'feat/DHIS2-18242-PR6' into feat/DHIS2-18242-PR7
BRaimbault Jun 2, 2026
362c7dd
Merge branch 'feat/DHIS2-18242-PR7' into feat/DHIS2-18242-PR8
BRaimbault Jun 2, 2026
732281f
Merge pull request #3660 from dhis2/feat/DHIS2-18242-PR1
BRaimbault Jun 2, 2026
09982ac
Merge branch 'feat/DHIS2-18242' into feat/DHIS2-18242-PR2
BRaimbault Jun 2, 2026
0c75c89
Merge branch 'feat/DHIS2-18242-PR2' into feat/DHIS2-18242-PR3
BRaimbault Jun 2, 2026
e0a37c4
fix: apply compact formatting to Earth Engine open-bound legend items
BRaimbault Jun 2, 2026
6454232
fix: defer NumberField commit to blur to allow negative number entry
BRaimbault Jun 2, 2026
4ed54c2
Merge pull request #3646 from dhis2/feat/DHIS2-18242-PR2
BRaimbault Jun 2, 2026
268ee52
Merge branch 'feat/DHIS2-18242' into feat/DHIS2-18242-PR3
BRaimbault Jun 2, 2026
7e0b560
chore: fix sonarqube issues
BRaimbault Jun 2, 2026
3c248e1
Merge pull request #3647 from dhis2/feat/DHIS2-18242-PR3
BRaimbault Jun 2, 2026
2c93579
Merge branch 'feat/DHIS2-18242' into feat/DHIS2-18242-PR4
BRaimbault Jun 2, 2026
21c0cbe
Merge pull request #3648 from dhis2/feat/DHIS2-18242-PR4
BRaimbault Jun 2, 2026
9152fce
Merge branch 'feat/DHIS2-18242' into feat/DHIS2-18242-PR5
BRaimbault Jun 2, 2026
97e1634
Merge pull request #3649 from dhis2/feat/DHIS2-18242-PR5
BRaimbault Jun 2, 2026
ce64858
Merge branch 'feat/DHIS2-18242' into feat/DHIS2-18242-PR6
BRaimbault Jun 2, 2026
9945514
docs: clarify org unit selection and fix misleading drill-down reference
BRaimbault Jun 2, 2026
004d2ef
Merge pull request #3650 from dhis2/feat/DHIS2-18242-PR6
BRaimbault Jun 2, 2026
ad58866
Merge branch 'feat/DHIS2-18242' into feat/DHIS2-18242-PR7
BRaimbault Jun 2, 2026
95fdd0c
Merge pull request #3651 from dhis2/feat/DHIS2-18242-PR7
BRaimbault Jun 2, 2026
4f14575
Merge branch 'feat/DHIS2-18242' into feat/DHIS2-18242-PR8
BRaimbault Jun 2, 2026
9f9286c
Merge pull request #3652 from dhis2/feat/DHIS2-18242-PR8
BRaimbault Jun 2, 2026
0a2b94a
Merge branch 'feat/DHIS2-18242' into feat/DHIS2-18242-KFMT
BRaimbault Jun 2, 2026
7f7c175
feat: prevent range names truncation in legend
BRaimbault Jun 2, 2026
3dc77bb
chore: fix sonarqube issues
BRaimbault Jun 3, 2026
880418a
chore: fix cypress test
BRaimbault Jun 3, 2026
143f7b5
feat: add scientific notation and billion scale to legend values
BRaimbault Jun 9, 2026
9add2b2
chore: fix cypress test
BRaimbault Jun 9, 2026
2384e21
Merge pull request #3657 from dhis2/feat/DHIS2-18242-KFMT
BRaimbault Jun 9, 2026
52734de
Merge branch 'master' into feat/DHIS2-18242
BRaimbault Jun 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ src/locales
build
cypress/fixtures/*
cypress.env.json
docs
docs/maps.md
docs/resources/
colorbrewer.js


Expand Down
12 changes: 12 additions & 0 deletions cypress/elements/event_layer.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,16 @@ export class EventLayer extends Layer {

return this
}

selectIncludeUnclassifiedEvents() {
cy.contains('Include unclassified events').click()

return this
}

selectIncludeNoDataEvents() {
cy.contains('Include events with no data').click()

return this
}
}
6 changes: 6 additions & 0 deletions cypress/elements/thematic_layer.js
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,12 @@ export class ThematicLayer extends Layer {
return this
}

selectIncludeUnclassifiedOU() {
cy.contains('Include unclassified org units').click()

return this
}

selectIncludeNoDataOU() {
cy.contains('Include org units with no data').click()

Expand Down
4 changes: 2 additions & 2 deletions cypress/integration/dataTable.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -327,10 +327,10 @@ describe('data table', () => {
cy.get('button[title="Sort by Range"]').click()

// Check that row 0 range value has value '0-40'
checkTableCell({ row: 0, column: 5, expectedContent: '0 - 40' })
checkTableCell({ row: 0, column: 5, expectedContent: '0 40' })

// Check that row 5 range value has value '90 - 120'
checkTableCell({ row: 5, column: 5, expectedContent: '90 - 120' })
checkTableCell({ row: 5, column: 5, expectedContent: '90 120' })

// Check that row 6 range value is empty
checkTableCell({ row: 6, column: 5, expectedContent: '' })
Expand Down
5 changes: 4 additions & 1 deletion cypress/integration/layers/eventlayer.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const programE2E = {
name: 'E2E program',
stage: 'Stage 1 - Repeatable',
de: 'E2E - Yes/no',
options: ['Yes', 'No', 'Other'],
options: ['Yes', 'No', 'Unclassified', 'No data'],
}

const programIP = {
Expand Down Expand Up @@ -141,6 +141,9 @@ context('Event Layers', () => {
.contains(programE2E.de)
.click()

Layer.selectIncludeUnclassifiedEvents()
Layer.selectIncludeNoDataEvents()

Layer.addToMap()

Layer.validateDialogClosed(true)
Expand Down
6 changes: 2 additions & 4 deletions cypress/integration/layers/geojsonlayer.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,9 @@ describe('GeoJSON URL Layer', () => {
// check that an error is displayed in the layer card
cy.getByDataTest('load-error-noticebox').should('be.visible')
cy.getByDataTest('load-error-noticebox')
.find('h6')
.contains('Failed to load layer')
.should('be.visible')
cy.getByDataTest('dhis2-uicore-noticebox-content-message')
cy.getByDataTest('load-error-noticebox')
.contains(
'There was a problem with this layer. Contact a system administrator.'
)
Expand Down Expand Up @@ -194,10 +193,9 @@ describe('GeoJSON URL Layer', () => {
// check that an error is displayed in the layer card
cy.getByDataTest('load-error-noticebox').should('be.visible')
cy.getByDataTest('load-error-noticebox')
.find('h6')
.contains('Failed to load layer')
.should('be.visible')
cy.getByDataTest('dhis2-uicore-noticebox-content-message')
cy.getByDataTest('load-error-noticebox')
.contains(
'There was a problem with this layer. Contact a system administrator.'
)
Expand Down
16 changes: 10 additions & 6 deletions cypress/integration/layers/thematiclayer.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,12 +82,14 @@ context('Thematic Layers', () => {
// "3.2 - 7.5 (100)"
// "No data (0)"
const choroplethLegendTextPattern =
/^\s*(\d+(\.\d+)?\s*-\s*\d+(\.\d+)?|No data)\s*\(\d+\)\s*$/
/^\s*(\d+(\.\d+)?[-–]\d+(\.\d+)?|No data)\s*\(\d+\)\s*$/

// Examples of bubble labels:
// "10.5"
// "No data"
const bubbleLabelTextPattern = /^(\d+(\.\d+)?|No data)$/
// "(2)"
const bubbleLabelTextPattern =
/^(\d+(\.\d+)?|No data|\(\d+\))(\s*\(\d+\))?$/

// Choropleth
Layer.openDialog('Thematic')
Expand Down Expand Up @@ -177,7 +179,9 @@ context('Thematic Layers', () => {

cy.getByDataTest('dhis2-uicore-checkbox').eq(1).click()

Layer.openOu('Tonkolili').selectOu('Gbonkonlenken').addToMap()
Layer.openOu('Tonkolili').selectOu('Gbonkonlenken')

Layer.selectTab('Style').selectIncludeUnclassifiedOU().addToMap()

getMaps().click('center')

Expand Down Expand Up @@ -282,7 +286,8 @@ context('Thematic Layers', () => {
n: 7,
removeAll: false,
})
.addToMap()

Layer.selectTab('Style').selectIncludeUnclassifiedOU().addToMap()

Layer.validateDialogClosed(true)

Expand Down Expand Up @@ -710,10 +715,9 @@ context('Thematic Layers', () => {
// check that an error is displayed in the layer card
cy.getByDataTest('load-error-noticebox').should('be.visible')
cy.getByDataTest('load-error-noticebox')
.find('h6')
.contains('Failed to load layer')
.should('be.visible')
cy.getByDataTest('dhis2-uicore-noticebox-content-message')
cy.getByDataTest('load-error-noticebox')
.contains(
'Organisation unit or organisation unit level is not valid'
)
Expand Down
2 changes: 1 addition & 1 deletion cypress/integration/requestsErrors.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ describe('Error handling check for all layer types', () => {
409: 'Simulated error with status code 409',
}

cy.getByDataTest('dhis2-uicore-noticebox', EXTENDED_TIMEOUT).within(
cy.getByDataTest('load-error-noticebox', EXTENDED_TIMEOUT).within(
() => {
cy.contains('Failed to load layer').should('be.visible')
cy.contains(errorMessage[error]).should('be.visible')
Expand Down
6 changes: 4 additions & 2 deletions cypress/integration/routes.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,9 @@ describe('Routes', () => {
cy.getByDataTest(`card-ANC1Coverage`)
.findByDataTest('layerlegend-item')
.last()
.contains('Low 0 - 30')
.find('td')
.invoke('text')
.should('match', /Low0[-–]30/)
})

it('loads currentAnalyticalObject (hash) - Earth Engine Layer', () => {
Expand All @@ -107,7 +109,7 @@ describe('Routes', () => {
cy.getByDataTest(`card-Heatstressdaily`)
.findByDataTest('layerlegend-item')
.first()
.contains('Extreme heat stress 46 - 60')
.contains('Extreme heat stress')
})

it('loads with map id (legacy) and interpretationid lowercase', () => {
Expand Down
Loading
Loading