diff --git a/.changeset/late-hornets-strive.md b/.changeset/late-hornets-strive.md new file mode 100644 index 0000000000..3709903008 --- /dev/null +++ b/.changeset/late-hornets-strive.md @@ -0,0 +1,5 @@ +--- +"go-web-app": patch +--- + +Position and Keywords filter for all Surge Alerts (/alerts/all) diff --git a/app/src/views/AllSurgeAlerts/i18n.json b/app/src/views/AllSurgeAlerts/i18n.json index 467aab5da1..4367d418c6 100644 --- a/app/src/views/AllSurgeAlerts/i18n.json +++ b/app/src/views/AllSurgeAlerts/i18n.json @@ -5,6 +5,8 @@ "allSurgeAlertsHeading": "All Surge Alerts ({numSurgeAlerts})", "eventFilterLabel": "Emergency", "countryFilterLabel": "Country", + "positionFilterLabel": "Position", + "keywordsFilterLabel": "Keywords", "defaultPlaceholder": "All", "failedToCreateExport": "Failed to generate export.", "surgeAlertDate": "Alert Date", diff --git a/app/src/views/AllSurgeAlerts/index.tsx b/app/src/views/AllSurgeAlerts/index.tsx index de8cb0ee40..9d86daa524 100644 --- a/app/src/views/AllSurgeAlerts/index.tsx +++ b/app/src/views/AllSurgeAlerts/index.tsx @@ -8,6 +8,7 @@ import { NumberOutput, Pager, Table, + TextInput, } from '@ifrc-go/ui'; import { useTranslation } from '@ifrc-go/ui/hooks'; import { @@ -111,6 +112,32 @@ export function Component() { EventItem[] | undefined | null >([]); + const [positionFilter, setPositionFilter] = useUrlSearchState( + 'position', + (value) => { + const v = value == null ? undefined : String(value); + const normalized = v && v.trim() ? v.trim() : undefined; + if (isDefined(normalized)) { + setPage(0); + } + return normalized; + }, + (position) => position ?? undefined, + ); + + const [keywordsFilter, setKeywordsFilter] = useUrlSearchState( + 'keywords', + (value) => { + const v = value == null ? undefined : String(value); + const normalized = v && v.trim() ? v.trim() : undefined; + if (isDefined(normalized)) { + setPage(0); + } + return normalized; + }, + (keywords) => keywords ?? undefined, + ); + useRequest({ skip: isNotDefined(eventFilter) || (!!eventOptions?.find((event) => event.id === eventFilter)), @@ -162,8 +189,9 @@ export function Component() { offset, event: eventFilter, country: countryFilter, - - // FIXME: this should come from the useFilterState + message__icontains: positionFilter, + molnix_tag_name: keywordsFilter, + // FIXME: this should come from useFilterState ordering: 'molnix_status,-opens', }, }); @@ -290,11 +318,21 @@ export function Component() { triggerExportStart( '/api/v2/surge_alert/', surgeResponse?.count, - {}, + { + event: eventFilter, + country: countryFilter, + message__icontains: positionFilter, + molnix_tag_name: keywordsFilter, + ordering: 'molnix_status,-opens', + }, ); }, [ triggerExportStart, surgeResponse?.count, + eventFilter, + countryFilter, + positionFilter, + keywordsFilter, ]); const heading = resolveToComponent( @@ -328,6 +366,20 @@ export function Component() { onOptionsChange={setEventOptions} countryId={countryFilter} /> + + )} footerActions={( diff --git a/translationMigrations/000053-1760549647996.json b/translationMigrations/000053-1760549647996.json new file mode 100644 index 0000000000..60eea66e3c --- /dev/null +++ b/translationMigrations/000053-1760549647996.json @@ -0,0 +1,17 @@ +{ + "parent": "000052-1758547474974.json", + "actions": [ + { + "action": "add", + "key": "keywordsFilterLabel", + "namespace": "allSurgeAlerts", + "value": "Keywords" + }, + { + "action": "add", + "key": "positionFilterLabel", + "namespace": "allSurgeAlerts", + "value": "Position" + } + ] +} \ No newline at end of file