@@ -13,7 +13,7 @@ import {
1313 triggerNotification
1414} from '../../reducers/statusReducer'
1515import Tooltip from '../../components/Tooltip'
16- import { openModal } from '../../reducers/modalReducer'
16+ import { openModal , closeModal } from '../../reducers/modalReducer'
1717import { fetchCsvData } from '../../service/useApi'
1818import { generatePeriods } from '../../utils/dateUtils'
1919import {
@@ -50,10 +50,13 @@ const MainPage = ({ queryDb }) => {
5050 return saveFilePath
5151 }
5252
53- const getDownloadParameters = ( layout ) => {
54- const ou = getOrganizationUnits ( )
55- const elementIds = addedElements . map ( ( element ) => element . id )
56- const elementNames = addedElements . map ( ( element ) => element . displayName )
53+ const getDownloadParameters = ( layout , opts = { } ) => {
54+ // opts.ouOverride is only used for saving query in per OU mode
55+ // in that case we want to save all OUs and levels in one query
56+ // instead of just the current OU or levels
57+ const ou = opts . ouOverride ?? getOrganizationUnits ( )
58+ const elementIds = addedElements . map ( ( e ) => e . id )
59+ const elementNames = addedElements . map ( ( e ) => e . displayName )
5760 const periods = generatePeriods ( frequency , startDate , endDate )
5861
5962 return {
@@ -64,15 +67,15 @@ const MainPage = ({ queryDb }) => {
6467 pe : periods . join ( ';' ) ,
6568 periods,
6669 elementIds,
67- layout : layout , // ensure layout object is stored
70+ layout,
6871 downloadingUrl : generateDownloadingUrl (
6972 dhis2Url ,
7073 ou ,
7174 elementIds . join ( ';' ) ,
7275 periods . join ( ';' ) ,
7376 selectedCategory ,
7477 'csv' ,
75- layout // pass correct object
78+ layout
7679 )
7780 }
7881 }
@@ -182,6 +185,18 @@ const MainPage = ({ queryDb }) => {
182185 const handleStreamDownload = async ( { layout, perOuMode } ) => {
183186 let fileStream = null
184187 try {
188+ // Validation for per OU mode
189+ const hasOUs = selectedOrgUnits . length > 0
190+ if ( perOuMode && ! hasOUs ) {
191+ dispatch ( closeModal ( ) )
192+ dispatch (
193+ triggerNotification ( {
194+ message : t ( 'mainPage.errorNeedAtLeastOneOU' ) ,
195+ type : 'error'
196+ } )
197+ )
198+ return
199+ }
185200 const currentChunkingStrategy = store . getState ( ) . download . chunkingStrategy
186201 const saveFilePath = await getSaveFilePath ( )
187202 if ( ! saveFilePath ) return
@@ -237,6 +252,13 @@ const MainPage = ({ queryDb }) => {
237252 )
238253 await new Promise ( ( r ) => setTimeout ( r , 200 ) )
239254 }
255+
256+ // Save query with all OUs and levels into one database entry
257+ const levelsToken = selectedOrgUnitLevels . map ( ( l ) => `LEVEL-${ l } ` ) . join ( ';' )
258+ const ouCombined = `${ levelsToken } ;${ selectedOrgUnits . join ( ';' ) } `
259+
260+ const historyParams = getDownloadParameters ( layout , { ouOverride : ouCombined } )
261+ await saveQueryToDatabase ( historyParams )
240262 } else {
241263 const downloadParams = getDownloadParameters ( layout )
242264 const chunks = createDataChunks (
@@ -247,6 +269,8 @@ const MainPage = ({ queryDb }) => {
247269 layout
248270 )
249271 await processChunks ( chunks , fileStream , downloadParams , headerState )
272+ // Save query into database
273+ await saveQueryToDatabase ( downloadParams )
250274 }
251275
252276 fileStream . end ( )
0 commit comments