Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
4462273
feat: add bidirectional map/table selection sync and collapsible data…
BRaimbault Jul 13, 2026
9d8097c
feat: add global search box to data table toolbar
BRaimbault Jul 13, 2026
b1fded3
fix: toolbar polish - clear filters button, search sizing, collapse i…
BRaimbault Jul 14, 2026
3c23163
feat: round out data table filtering with reverse-selection, zoom-to-…
BRaimbault Jul 14, 2026
7f0c55c
chore: PR clean-up
BRaimbault Jul 16, 2026
b2d35c9
fix: ColumnPicker permanently disabled for layer types with synchrono…
BRaimbault Jul 16, 2026
6114778
feat: support tracked entity layers in the data table
BRaimbault Jul 17, 2026
7a257d2
feat: support timeline/split-by-period thematic layers in the data table
BRaimbault Jul 17, 2026
5083c80
feat: add Legend/Range columns for data-item-styled event layers
BRaimbault Jul 18, 2026
8162d50
feat: add Color/Icon/Group columns for group-set-styled org unit and …
BRaimbault Jul 18, 2026
5f23bef
feat: add Color column for GeoJSON URL and tracked entity layers
BRaimbault Jul 18, 2026
8eb2174
chore: pr cleanup
BRaimbault Jul 19, 2026
30e0fb0
chore: sonarqube issues
BRaimbault Jul 19, 2026
26e2122
chore: fix cypress test
BRaimbault Jul 20, 2026
a3ac54f
fix: datatable performance optimisation
BRaimbault Jul 21, 2026
74207db
chore: PR clean-up
BRaimbault Jul 23, 2026
de31b9f
chore: sonarqube issue
BRaimbault Jul 23, 2026
25dbb59
chore: PR clean-up
BRaimbault Jul 23, 2026
631af94
fix datatable support geometry+multigeometry mix
BRaimbault Jul 23, 2026
a84e847
fix: coherce numeric valueTypes in TE layer for datatable
BRaimbault Jul 23, 2026
699af74
fix: no drilling and profile for TE layer
BRaimbault Jul 23, 2026
afb4b10
fix: cancel on resize issues
BRaimbault Jul 23, 2026
ed39fd9
fix: raceediting filters/columns while an event layer's data is still…
BRaimbault Jul 23, 2026
e4b4259
fix: crash + dead-code bug in parseLayerConfig
BRaimbault Jul 23, 2026
e481084
fix: header titles alignement
BRaimbault Jul 23, 2026
1ba5242
feat: expose spatialSupport from system info for event clustering
BRaimbault Jul 23, 2026
f4f9c97
feat: expose spatialSupport from system info in dashboard plugin
BRaimbault Jul 23, 2026
3c37ec1
feat: thread spatialSupport into event layer loader call sites
BRaimbault Jul 23, 2026
93de9c5
feat: gate server-side event clustering on backend spatial support
BRaimbault Jul 23, 2026
12aea13
feat: add Redux action for forcing client-side event clustering
BRaimbault Jul 23, 2026
a7ecc98
test: confirm forceClientCluster is never saved to favorites
BRaimbault Jul 23, 2026
9ec6e84
feat: reload server-clustered event layers when forceClientCluster is…
BRaimbault Jul 23, 2026
596b886
feat: bypass server-cluster decision when forceClientCluster is set
BRaimbault Jul 23, 2026
54bd08c
fix: allow opening the data table on a server-clustered event layer
BRaimbault Jul 23, 2026
cc70f75
fix: stop hard-erroring the data table for server-clustered event layers
BRaimbault Jul 23, 2026
074dab7
feat: add in-table action to show event details for a clustered layer
BRaimbault Jul 23, 2026
5c422c2
feat: wire the show-event-details action into the data table
BRaimbault Jul 23, 2026
ee83210
fix: don't mark a server-clustered event layer's table data as ready
BRaimbault Jul 23, 2026
7e6e1da
fix: show the loaded (capped) event count in the legend, not the raw …
BRaimbault Jul 23, 2026
3069a08
chore: PR clean-up
BRaimbault Jul 23, 2026
3c53be4
refactor: extract nested ternaries flagged by SonarQube
BRaimbault Jul 23, 2026
02e9187
fix: PR clean-up
BRaimbault Jul 23, 2026
193a120
fix: PR clean-up
BRaimbault Jul 24, 2026
10304a3
chore: sonarqube fix
BRaimbault Jul 24, 2026
41f87de
chore: regenerate i18n/en.pot after PR5 rebase
BRaimbault Sep 7, 2026
47ff7f3
refactor: extract usePanelHeights hook from BottomPanel
BRaimbault Sep 7, 2026
078d271
refactor: extract per-column cell rendering into RowCells component
BRaimbault Sep 7, 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
8 changes: 4 additions & 4 deletions cypress/integration/dataTable.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ describe('data table', () => {
cy.get('[data-testid="virtuoso-scroller"]').scrollTo('top')

// Check that row 0 range value is empty
checkTableCell({ row: 0, column: 5, expectedContent: '' })
checkTableCell({ row: 0, column: 8, expectedContent: '' })

// Sort by range, which is a string
cy.getByDataTest('data-table-column-sort-button-Range').click()
Expand All @@ -367,12 +367,12 @@ describe('data table', () => {
cy.get('[data-testid="virtuoso-scroller"]').scrollTo('top')

// Check that row 0 range value has value '0-40'
checkTableCell({ row: 0, column: 5, expectedContent: '0 – 40' })
checkTableCell({ row: 0, column: 8, 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: 8, expectedContent: '90 – 120' })

// Check that row 6 range value is empty
checkTableCell({ row: 6, column: 5, expectedContent: '' })
checkTableCell({ row: 6, column: 8, expectedContent: '' })
})
})
2 changes: 1 addition & 1 deletion cypress/integration/layers/eventlayer.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ context('Event Layers', () => {
'Event location',
'-13.188339, 8.405215',
'Organisation unit',
'Event time',
'Event date',
'Age in years',
'Mode of Discharge',
])
Expand Down
88 changes: 53 additions & 35 deletions i18n/en.pot
Original file line number Diff line number Diff line change
Expand Up @@ -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: 2026-09-04T12:03:11.272Z\n"
"PO-Revision-Date: 2026-09-04T12:03:11.272Z\n"
"POT-Creation-Date: 2026-09-07T08:34:02.249Z\n"
"PO-Revision-Date: 2026-09-07T08:34:02.249Z\n"

msgid "2020"
msgstr "2020"
Expand Down Expand Up @@ -167,6 +167,9 @@ msgstr "Sort by Selected"
msgid "Sort by {{column}}"
msgstr "Sort by {{column}}"

msgid "Edit layer"
msgstr "Edit layer"

msgid "Something went wrong"
msgstr "Something went wrong"

Expand Down Expand Up @@ -248,6 +251,12 @@ msgstr "Zoom to selected features"
msgid "Zoom to filtered features"
msgstr "Zoom to filtered features"

msgid "Event details aren't available while this layer is clustered on the server"
msgstr "Event details aren't available while this layer is clustered on the server"

msgid "Show event details"
msgstr "Show event details"

msgid "No features match your filters"
msgstr "No features match your filters"

Expand Down Expand Up @@ -302,9 +311,6 @@ msgstr "{{total}} rows"
msgid "Show only features in current map view"
msgstr "Show only features in current map view"

msgid "Data table is not supported when events are grouped on the server."
msgstr "Data table is not supported when events are grouped on the server."

msgid "No valid data was found for the current layer configuration."
msgstr "No valid data was found for the current layer configuration."

Expand All @@ -318,33 +324,6 @@ msgstr ""
msgid "No valid data fields were found for this layer."
msgstr "No valid data fields were found for this layer."

msgid "Id"
msgstr "Id"

msgid "Level"
msgstr "Level"

msgid "Parent"
msgstr "Parent"

msgid "Type"
msgstr "Type"

msgid "Legend"
msgstr "Legend"

msgid "Range"
msgstr "Range"

msgid "Org unit"
msgstr "Org unit"

msgid "Org unit boundary"
msgstr "Org unit boundary"

msgid "Event time"
msgstr "Event time"

msgid "Loading Earth Engine data…"
msgstr "Loading Earth Engine data…"

Expand Down Expand Up @@ -833,9 +812,6 @@ msgstr "Open in Data Visualizer app"
msgid "Download data"
msgstr "Download data"

msgid "Edit layer"
msgstr "Edit layer"

msgid "Duplicate layer"
msgstr "Duplicate layer"

Expand Down Expand Up @@ -909,6 +885,9 @@ msgstr[1] "{{n}} org units without coordinates"
msgid "Selected org units: No coordinates found"
msgstr "Selected org units: No coordinates found"

msgid "External layer definition not found, showing last known settings"
msgstr "External layer definition not found, showing last known settings"

msgid "Error"
msgstr "Error"

Expand Down Expand Up @@ -940,12 +919,18 @@ msgstr "Could not retrieve event data"
msgid "Organisation unit"
msgstr "Organisation unit"

msgid "Event date"
msgstr "Event date"

msgid "Groups"
msgstr "Groups"

msgid "Parent unit"
msgstr "Parent unit"

msgid "Level"
msgstr "Level"

msgid "Not set"
msgstr "Not set"

Expand Down Expand Up @@ -1071,6 +1056,9 @@ msgstr "No data found for this period."
msgid "Image of the organisation unit"
msgstr "Image of the organisation unit"

msgid "Parent"
msgstr "Parent"

msgid "Code"
msgstr "Code"

Expand Down Expand Up @@ -1190,6 +1178,9 @@ msgstr "Click to unpin legend"
msgid "Click to pin legend"
msgstr "Click to pin legend"

msgid "Legend"
msgstr "Legend"

msgid "Hide layer"
msgstr "Hide layer"

Expand Down Expand Up @@ -2065,6 +2056,33 @@ msgstr "Facility"
msgid "GroupSet used for styling was not found"
msgstr "GroupSet used for styling was not found"

msgid "Id"
msgstr "Id"

msgid "Type"
msgstr "Type"

msgid "Range"
msgstr "Range"

msgid "Org unit"
msgstr "Org unit"

msgid "Org unit boundary"
msgstr "Org unit boundary"

msgid "Group"
msgstr "Group"

msgid "Icon"
msgstr "Icon"

msgid "Current period"
msgstr "Current period"

msgid "Value ({{period}})"
msgstr "Value ({{period}})"

msgid "Start date is invalid"
msgstr "Start date is invalid"

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
"@dhis2/analytics": "^29.5.5",
"@dhis2/app-runtime": "^3.17.3",
"@dhis2/app-service-datastore": "^1.0.0-beta.3",
"@dhis2/maps-gl": "git+https://github.com/d2-ci/maps-gl.git#e89c7e9bf5634da8b13684c314eb22838f629ed6",
"@dhis2/maps-gl": "git+https://github.com/d2-ci/maps-gl.git#6758ac621ff7ed582ad458bb4c9f90900358cedc",
"@dhis2/ui": "^10.17.0",
"@dnd-kit/core": "^6.0.8",
"@dnd-kit/modifiers": "^9.0.0",
Expand Down
11 changes: 11 additions & 0 deletions src/actions/__tests__/dataTable.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
closeDataTable,
toggleDataTable,
resizeDataTable,
setActiveTimelinePeriod,
} from '../dataTable.js'

describe('closeDataTable', () => {
Expand Down Expand Up @@ -30,3 +31,13 @@ describe('resizeDataTable', () => {
})
})
})

describe('setActiveTimelinePeriod', () => {
it('creates an ACTIVE_TIMELINE_PERIOD_SET action', () => {
const period = { id: '202301', name: 'January 2023' }
expect(setActiveTimelinePeriod(period)).toEqual({
type: types.ACTIVE_TIMELINE_PERIOD_SET,
period,
})
})
})
5 changes: 5 additions & 0 deletions src/actions/dataTable.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,8 @@ export const setDataTableColumnConfig = (layerId, config) => ({
layerId,
config,
})

export const setActiveTimelinePeriod = (period) => ({
type: types.ACTIVE_TIMELINE_PERIOD_SET,
period,
})
6 changes: 6 additions & 0 deletions src/actions/layers.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,9 @@ export const setLayerLoading = (id) => ({
type: types.LAYER_LOADING_SET,
id,
})

// Force client-side clustering for a server-clustered event layer (session-only)
export const setForceClientCluster = (id) => ({
type: types.LAYER_FORCE_CLIENT_CLUSTER_SET,
id,
})
5 changes: 4 additions & 1 deletion src/components/core/Checkbox.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import styles from './styles/Checkbox.module.css'
const Checkbox = ({
label,
checked = false,
indeterminate = false,
disabled,
dense = true,
tooltip,
Expand All @@ -23,7 +24,8 @@ const Checkbox = ({
>
<UiCheckbox
label={label}
checked={checked}
checked={!indeterminate && checked}
indeterminate={indeterminate}
dense={dense}
disabled={disabled}
onChange={({ checked }) => onChange(checked)}
Expand All @@ -43,6 +45,7 @@ Checkbox.propTypes = {
dataTest: PropTypes.string,
dense: PropTypes.bool,
disabled: PropTypes.bool,
indeterminate: PropTypes.bool,
label: PropTypes.node,
style: PropTypes.object,
tooltip: PropTypes.string,
Expand Down
2 changes: 1 addition & 1 deletion src/components/core/styles/Checkbox.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
}

/* This styles the tooltip span containing the svg */
.checkbox span {
.checkbox > span {
margin-left: var(--spacers-dp4);
display: flex;
flex-direction: column;
Expand Down
Loading
Loading