@@ -22,9 +22,12 @@ import { useTranslation } from '@ifrc-go/ui/hooks';
2222import {
2323 hasSomeDefinedValue ,
2424 numericIdSelector ,
25+ numericKeySelector ,
2526 resolveToComponent ,
2627 resolveToString ,
28+ stringLabelSelector ,
2729 stringNameSelector ,
30+ stringTitleSelector ,
2831 stringValueSelector ,
2932} from '@ifrc-go/ui/utils' ;
3033import {
@@ -41,11 +44,11 @@ import { type RegionOption } from '#components/domain/RegionSelectInput';
4144import Link from '#components/Link' ;
4245import Page from '#components/Page' ;
4346import { type components } from '#generated/types' ;
44- import useCountry , { Country } from '#hooks/domain/useCountry' ;
47+ import useCountry from '#hooks/domain/useCountry' ;
4548import useDisasterTypes , { DisasterType } from '#hooks/domain/useDisasterType' ;
4649import useGlobalEnums from '#hooks/domain/useGlobalEnums' ;
47- import usePerComponent , { type PerComponent } from '#hooks/domain/usePerComponent' ;
48- import useSecondarySector , { type SecondarySector } from '#hooks/domain/useSecondarySector' ;
50+ import usePerComponent from '#hooks/domain/usePerComponent' ;
51+ import useSecondarySector from '#hooks/domain/useSecondarySector' ;
4952import useAlert from '#hooks/useAlert' ;
5053import useFilterState from '#hooks/useFilterState' ;
5154import useRecursiveCsvExport from '#hooks/useRecursiveCsvRequest' ;
@@ -56,7 +59,10 @@ import {
5659 useRequest ,
5760} from '#utils/restRequest' ;
5861
59- import Filters , { type FilterValue } from './Filters' ;
62+ import Filters , {
63+ type FilterValue ,
64+ type PerLearningType ,
65+ } from './Filters' ;
6066import KeyInsights from './KeyInsights' ;
6167import Summary , { type Props as SummaryProps } from './Summary' ;
6268
@@ -89,12 +95,8 @@ type QueryType = Pick<
8995> ;
9096
9197const regionKeySelector = ( region : RegionOption ) => region . key ;
92- const countryKeySelector = ( country : Country ) => country . id ;
93- const sectorKeySelector = ( d : SecondarySector ) => d . key ;
94- const sectorLabelSelector = ( d : SecondarySector ) => d . label ;
95- const perComponentKeySelector = ( option : PerComponent ) => option . id ;
96- const disasterTypeKeySelector = ( type : DisasterType ) => type . id ;
9798const disasterTypeLabelSelector = ( type : DisasterType ) => type . name ?? '?' ;
99+ const perLearningTypeKeySelector = ( perLearningType : PerLearningType ) => perLearningType . key ;
98100
99101/** @knipignore */
100102// eslint-disable-next-line import/prefer-default-export
@@ -123,7 +125,10 @@ export function Component() {
123125
124126 const alert = useAlert ( ) ;
125127
126- const { api_region_name : regionList } = useGlobalEnums ( ) ;
128+ const {
129+ api_region_name : regionList ,
130+ per_learning_type : perLearningTypeOptions ,
131+ } = useGlobalEnums ( ) ;
127132 const countryList = useCountry ( { region : rawFilter . region } ) ;
128133 const disasterTypeOptions = useDisasterTypes ( ) ;
129134 const secondarySectorOptions = useSecondarySector ( ) ;
@@ -213,8 +218,16 @@ export function Component() {
213218 preserveResponse : true ,
214219 } ) ;
215220
221+ const {
222+ pending : opsLearningOrganizationTypePending ,
223+ response : opsLearningOrganizationTypes ,
224+ } = useRequest ( {
225+ url : '/api/v2/ops-learning/organization-type/' ,
226+ preserveResponse : true ,
227+ } ) ;
228+
216229 const [
217- pendingExport , ,
230+ pendingExport , ,
218231 triggerExportStart ,
219232 ] = useRecursiveCsvExport ( {
220233 disableProgress : true ,
@@ -270,6 +283,10 @@ export function Component() {
270283 ? filter . perComponents : undefined ,
271284 search_extracts : isTruthyString ( filter . appealSearchText )
272285 ? ( filter . appealSearchText ) : undefined ,
286+ type_validated__in : hasSomeDefinedValue ( filter . perLearningTypes )
287+ ? filter . perLearningTypes : undefined ,
288+ organization_validated__in : hasSomeDefinedValue ( filter . organizationTypes )
289+ ? filter . organizationTypes : undefined ,
273290 } ;
274291 setFilterPristine ( true ) ;
275292 setQuery ( newQuery ) ;
@@ -333,6 +350,9 @@ export function Component() {
333350 disasterTypeOptions = { disasterTypeOptions }
334351 secondarySectorOptions = { secondarySectorOptions }
335352 perComponentOptions = { perComponentOptions }
353+ organizationTypeOptions = { opsLearningOrganizationTypes ?. results }
354+ perLearningTypeOptions = { perLearningTypeOptions }
355+ organizationTypePending = { opsLearningOrganizationTypePending }
336356 />
337357 ) }
338358 footerContent = { (
@@ -361,31 +381,47 @@ export function Component() {
361381 value = { rawFilter . countries }
362382 options = { countryList }
363383 labelSelector = { stringNameSelector }
364- keySelector = { countryKeySelector }
384+ keySelector = { numericIdSelector }
365385 />
366386 < DismissableMultiListOutput
367387 name = "disasterTypes"
368388 onDismiss = { onFilterChange }
369389 value = { rawFilter . disasterTypes }
370390 options = { disasterTypeOptions }
371391 labelSelector = { disasterTypeLabelSelector }
372- keySelector = { disasterTypeKeySelector }
392+ keySelector = { numericIdSelector }
373393 />
374394 < DismissableMultiListOutput
375395 name = "secondarySectors"
376396 onDismiss = { onFilterChange }
377397 value = { rawFilter . secondarySectors }
378398 options = { secondarySectorOptions }
379- labelSelector = { sectorLabelSelector }
380- keySelector = { sectorKeySelector }
399+ labelSelector = { stringLabelSelector }
400+ keySelector = { numericKeySelector }
381401 />
382402 < DismissableMultiListOutput
383403 name = "perComponents"
384404 onDismiss = { onFilterChange }
385405 value = { rawFilter . perComponents }
386406 options = { perComponentOptions }
387407 labelSelector = { getFormattedComponentName }
388- keySelector = { perComponentKeySelector }
408+ keySelector = { numericIdSelector }
409+ />
410+ < DismissableMultiListOutput
411+ name = "organizationTypes"
412+ onDismiss = { onFilterChange }
413+ value = { rawFilter . organizationTypes }
414+ options = { opsLearningOrganizationTypes ?. results }
415+ labelSelector = { stringTitleSelector }
416+ keySelector = { numericIdSelector }
417+ />
418+ < DismissableMultiListOutput
419+ name = "perLearningTypes"
420+ onDismiss = { onFilterChange }
421+ value = { rawFilter . perLearningTypes }
422+ options = { perLearningTypeOptions }
423+ labelSelector = { stringValueSelector }
424+ keySelector = { perLearningTypeKeySelector }
389425 />
390426 < DismissableTextOutput
391427 name = "appealStartDateAfter"
0 commit comments