diff --git a/i18n/en.pot b/i18n/en.pot
index 51c6dd77d6..c467bfe818 100644
--- a/i18n/en.pot
+++ b/i18n/en.pot
@@ -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: 2025-05-02T13:23:06.732Z\n"
-"PO-Revision-Date: 2025-05-02T13:23:06.732Z\n"
+"POT-Creation-Date: 2025-05-22T12:31:36.902Z\n"
+"PO-Revision-Date: 2025-05-22T12:31:36.902Z\n"
msgid "Choose one or more dates..."
msgstr "Choose one or more dates..."
@@ -1729,24 +1729,6 @@ msgstr "Delete events"
msgid "This cannot be undone. Are you sure you want to delete the selected events?"
msgstr "This cannot be undone. Are you sure you want to delete the selected events?"
-msgid "Owner organisation unit"
-msgstr "Owner organisation unit"
-
-msgid "Registration Date"
-msgstr "Registration Date"
-
-msgid "Inactive"
-msgstr "Inactive"
-
-msgid "Enrollment status"
-msgstr "Enrollment status"
-
-msgid "Follow up"
-msgstr "Follow up"
-
-msgid "Choose a program stage to filter by {{label}}"
-msgstr "Choose a program stage to filter by {{label}}"
-
msgid ""
"Some enrollments were completed successfully, but there was an error while "
"completing the rest. Please see the details below."
@@ -1871,6 +1853,24 @@ msgstr ""
msgid "An error occurred while deleting the records"
msgstr "An error occurred while deleting the records"
+msgid "Owner organisation unit"
+msgstr "Owner organisation unit"
+
+msgid "Registration Date"
+msgstr "Registration Date"
+
+msgid "Inactive"
+msgstr "Inactive"
+
+msgid "Enrollment status"
+msgstr "Enrollment status"
+
+msgid "Follow up"
+msgstr "Follow up"
+
+msgid "Choose a program stage to filter by {{label}}"
+msgstr "Choose a program stage to filter by {{label}}"
+
msgid "Working list could not be updated"
msgstr "Working list could not be updated"
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/CompleteAction/CompleteAction.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/CompleteAction/CompleteAction.js
similarity index 97%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/CompleteAction/CompleteAction.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/CompleteAction/CompleteAction.js
index 73543ad15a..5e814e3b9d 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/CompleteAction/CompleteAction.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/CompleteAction/CompleteAction.js
@@ -14,10 +14,10 @@ import {
ModalContent,
ModalTitle,
} from '@dhis2/ui';
-import { ConditionalTooltip } from '../../../../../Tooltips/ConditionalTooltip';
+import { ConditionalTooltip } from '../../../../../../Tooltips/ConditionalTooltip';
import { useCompleteBulkEnrollments } from './hooks/useCompleteBulkEnrollments';
-import { Widget } from '../../../../../Widget';
-import type { ProgramStage } from '../../../../../../metaData';
+import { Widget } from '../../../../../../Widget';
+import type { ProgramStage } from '../../../../../../../metaData';
type Props = {
selectedRows: { [id: string]: any },
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/CompleteAction/hooks/useCompleteBulkEnrollments.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/CompleteAction/hooks/useCompleteBulkEnrollments.js
similarity index 97%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/CompleteAction/hooks/useCompleteBulkEnrollments.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/CompleteAction/hooks/useCompleteBulkEnrollments.js
index 90587a0c03..7369eb80a5 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/CompleteAction/hooks/useCompleteBulkEnrollments.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/CompleteAction/hooks/useCompleteBulkEnrollments.js
@@ -5,10 +5,10 @@ import { useAlert, useDataEngine } from '@dhis2/app-runtime';
import { useMutation, useQueryClient } from 'react-query';
import i18n from '@dhis2/d2-i18n';
import log from 'loglevel';
-import { ReactQueryAppNamespace, useApiDataQuery } from '../../../../../../../utils/reactQueryHelpers';
-import { handleAPIResponse, REQUESTED_ENTITIES } from '../../../../../../../utils/api';
-import { errorCreator, FEATURES, featureAvailable } from '../../../../../../../../capture-core-utils';
-import type { ProgramStage } from '../../../../../../../metaData';
+import { errorCreator, FEATURES, featureAvailable } from 'capture-core-utils';
+import { ReactQueryAppNamespace, useApiDataQuery } from '../../../../../../../../utils/reactQueryHelpers';
+import { handleAPIResponse, REQUESTED_ENTITIES } from '../../../../../../../../utils/api';
+import type { ProgramStage } from '../../../../../../../../metaData';
type Props = {
selectedRows: { [id: string]: any },
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/CompleteAction/index.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/CompleteAction/index.js
similarity index 100%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/CompleteAction/index.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/CompleteAction/index.js
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/DeleteEnrollmentsAction.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/DeleteEnrollmentsAction.js
similarity index 90%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/DeleteEnrollmentsAction.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/DeleteEnrollmentsAction.js
index 7e0a4bcb68..eb54f77d0e 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/DeleteEnrollmentsAction.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/DeleteEnrollmentsAction.js
@@ -2,9 +2,9 @@
import React, { useState } from 'react';
import i18n from '@dhis2/d2-i18n';
import { Button } from '@dhis2/ui';
-import { useAuthority } from '../../../../../../utils/userInfo/useAuthority';
+import { useAuthority } from '../../../../../../../utils/userInfo/useAuthority';
import { EnrollmentDeleteModal } from './EnrollmentDeleteModal';
-import { ConditionalTooltip } from '../../../../../Tooltips/ConditionalTooltip';
+import { ConditionalTooltip } from '../../../../../../Tooltips/ConditionalTooltip';
type Props = {
selectedRows: { [id: string]: boolean },
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/CustomCheckbox/CustomCheckbox.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/CustomCheckbox/CustomCheckbox.js
similarity index 100%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/CustomCheckbox/CustomCheckbox.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/CustomCheckbox/CustomCheckbox.js
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/CustomCheckbox/index.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/CustomCheckbox/index.js
similarity index 100%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/CustomCheckbox/index.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/CustomCheckbox/index.js
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/EnrollmentDeleteModal.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/EnrollmentDeleteModal.js
similarity index 100%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/EnrollmentDeleteModal.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/EnrollmentDeleteModal.js
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/index.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/index.js
similarity index 100%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/index.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/EnrollmentDeleteModal/index.js
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/hooks/useDeleteEnrollments.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/hooks/useDeleteEnrollments.js
similarity index 96%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/hooks/useDeleteEnrollments.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/hooks/useDeleteEnrollments.js
index 5475744ac6..7c9035c120 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/hooks/useDeleteEnrollments.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/hooks/useDeleteEnrollments.js
@@ -4,9 +4,9 @@ import log from 'loglevel';
import i18n from '@dhis2/d2-i18n';
import { useMutation, useQueryClient } from 'react-query';
import { useAlert, useDataEngine } from '@dhis2/app-runtime';
-import { handleAPIResponse, REQUESTED_ENTITIES } from '../../../../../../../utils/api';
-import { ReactQueryAppNamespace, useApiDataQuery } from '../../../../../../../utils/reactQueryHelpers';
-import { errorCreator, FEATURES, featureAvailable } from '../../../../../../../../capture-core-utils';
+import { errorCreator, FEATURES, featureAvailable } from 'capture-core-utils';
+import { handleAPIResponse, REQUESTED_ENTITIES } from '../../../../../../../../utils/api';
+import { ReactQueryAppNamespace, useApiDataQuery } from '../../../../../../../../utils/reactQueryHelpers';
type Props = {
selectedRows: { [id: string]: boolean },
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/index.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/index.js
similarity index 100%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteEnrollmentsAction/index.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteEnrollmentsAction/index.js
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteTeiAction/DeleteTeiAction.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteTeiAction/DeleteTeiAction.js
similarity index 97%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteTeiAction/DeleteTeiAction.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteTeiAction/DeleteTeiAction.js
index 12ffed180b..99a857d5a6 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteTeiAction/DeleteTeiAction.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteTeiAction/DeleteTeiAction.js
@@ -2,7 +2,7 @@
import React, { useState } from 'react';
import i18n from '@dhis2/d2-i18n';
import { Button, ButtonStrip, Modal, ModalActions, ModalContent, ModalTitle } from '@dhis2/ui';
-import { useAuthority } from '../../../../../../utils/userInfo/useAuthority';
+import { useAuthority } from '../../../../../../../utils/userInfo/useAuthority';
import { useCascadeDeleteTei } from './hooks/useCascadeDeleteTei';
type Props = {
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteTeiAction/hooks/useCascadeDeleteTei.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteTeiAction/hooks/useCascadeDeleteTei.js
similarity index 95%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteTeiAction/hooks/useCascadeDeleteTei.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteTeiAction/hooks/useCascadeDeleteTei.js
index 1ae0862e9d..6246bc2369 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteTeiAction/hooks/useCascadeDeleteTei.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteTeiAction/hooks/useCascadeDeleteTei.js
@@ -3,7 +3,7 @@ import log from 'loglevel';
import i18n from '@dhis2/d2-i18n';
import { useAlert, useDataEngine } from '@dhis2/app-runtime';
import { useMutation } from 'react-query';
-import { errorCreator } from '../../../../../../../../capture-core-utils';
+import { errorCreator } from 'capture-core-utils';
type Props = {
selectedRows: { [id: string]: boolean },
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteTeiAction/index.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteTeiAction/index.js
similarity index 100%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/DeleteTeiAction/index.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/DeleteTeiAction/index.js
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/index.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/index.js
similarity index 100%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/Actions/index.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/Actions/index.js
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/TrackedEntityBulkActions.component.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/TrackedEntityBulkActions.component.js
similarity index 95%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/TrackedEntityBulkActions.component.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/TrackedEntityBulkActions.component.js
index 2b2002ce53..de67f196c9 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/TrackedEntityBulkActions.component.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/TrackedEntityBulkActions.component.js
@@ -1,6 +1,6 @@
// @flow
import React from 'react';
-import { BulkActionBar } from '../../WorkingListsBase/BulkActionBar';
+import { BulkActionBar } from '../../../WorkingListsBase/BulkActionBar';
import { CompleteAction } from './Actions';
import type { Props } from './TrackedEntityBulkActions.types';
import { DeleteEnrollmentsAction } from './Actions/DeleteEnrollmentsAction';
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/TrackedEntityBulkActions.container.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/TrackedEntityBulkActions.container.js
similarity index 87%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/TrackedEntityBulkActions.container.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/TrackedEntityBulkActions.container.js
index 3cd769eb56..d6488baf32 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/TrackedEntityBulkActions.container.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/TrackedEntityBulkActions.container.js
@@ -1,10 +1,10 @@
// @flow
import React from 'react';
import log from 'loglevel';
-import { EventBulkActions } from '../../EventWorkingListsCommon/EventBulkActions';
+import { errorCreator } from 'capture-core-utils';
+import { EventBulkActions } from '../../../EventWorkingListsCommon/EventBulkActions';
import { TrackedEntityBulkActionsComponent } from './TrackedEntityBulkActions.component';
import type { ContainerProps } from './TrackedEntityBulkActions.types';
-import { errorCreator } from '../../../../../capture-core-utils';
export const TrackedEntityBulkActions = ({
programStageId,
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/TrackedEntityBulkActions.types.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/TrackedEntityBulkActions.types.js
similarity index 86%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/TrackedEntityBulkActions.types.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/TrackedEntityBulkActions.types.js
index 37f18324fa..fc4c24c611 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/TrackedEntityBulkActions.types.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/TrackedEntityBulkActions.types.js
@@ -1,5 +1,5 @@
// @flow
-import type { ProgramStage } from '../../../../metaData';
+import type { ProgramStage } from '../../../../../metaData';
export type Props = {|
selectedRows: { [key: string]: boolean },
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/index.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/index.js
similarity index 100%
rename from src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/TrackedEntityBulkActions/index.js
rename to src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/BulkActions/index.js
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/TrackerWorkingListsBulkActionsController.component.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/TrackerWorkingListsBulkActionsController.component.js
new file mode 100644
index 0000000000..5aaca01736
--- /dev/null
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/TrackerWorkingListsBulkActionsController.component.js
@@ -0,0 +1,61 @@
+// @flow
+import React, { useMemo, useState, useCallback } from 'react';
+import { v4 as uuid } from 'uuid';
+import { TrackedEntityBulkActions } from './BulkActions';
+import { useSelectedRowsController } from '../../WorkingListsBase/BulkActionBar';
+import { TeiWorkingListsSetup } from '../Setup';
+import type { Props } from './trackerWorkingListsBulkActionsController.types';
+
+export const TrackerWorkingListsBulkActionsController = ({
+ program,
+ programStageId,
+ recordsOrder,
+ ...passOnProps
+}: Props) => {
+ const [customUpdateTrigger, setCustomUpdateTrigger] = useState();
+ const {
+ selectedRows,
+ clearSelection,
+ selectAllRows,
+ selectionInProgress,
+ toggleRowSelected,
+ allRowsAreSelected,
+ removeRowsFromSelection,
+ } = useSelectedRowsController({ recordIds: recordsOrder });
+
+ const handleCustomUpdateTrigger = useCallback((disableClearSelection?: boolean) => {
+ const id = uuid();
+ setCustomUpdateTrigger(id);
+ !disableClearSelection && clearSelection();
+ }, [clearSelection]);
+
+ const trackedEntityBulkActionsElement = useMemo(() => (
+
+ ), [program, programStageId, selectedRows, clearSelection, handleCustomUpdateTrigger, removeRowsFromSelection]);
+
+
+ return (
+
+ );
+};
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/index.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/index.js
new file mode 100644
index 0000000000..cf9ba0504e
--- /dev/null
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/index.js
@@ -0,0 +1,4 @@
+// @flow
+
+export { TrackerWorkingListsBulkActionsController } from './TrackerWorkingListsBulkActionsController.component';
+export type { TrackerWorkingListsBulkActionsSetupOutputProps } from './trackerWorkingListsBulkActionsController.types';
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/trackerWorkingListsBulkActionsController.types.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/trackerWorkingListsBulkActionsController.types.js
new file mode 100644
index 0000000000..f8af5d05b0
--- /dev/null
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/BulkActionsController/trackerWorkingListsBulkActionsController.types.js
@@ -0,0 +1,23 @@
+// @flow
+import type { TrackerWorkingListsViewMenuSetupOutputProps } from '../ViewMenuSetup';
+
+type ExtractedProps = $ReadOnly<{|
+|}>;
+
+type RestProps = $Rest;
+
+export type Props = {|
+ ...ExtractedProps,
+ ...RestProps,
+|};
+
+export type TrackerWorkingListsBulkActionsSetupOutputProps = {|
+ ...RestProps,
+ customUpdateTrigger: ?string,
+ allRowsAreSelected: ?boolean,
+ selectedRows: { [key: string]: boolean },
+ onRowSelect: (id: string) => void,
+ onSelectAll: (rows: Array) => void,
+ selectionInProgress: ?boolean,
+ bulkActionBarComponent: React$Element,
+|};
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ReduxProvider/TeiWorkingListsReduxProvider.container.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ReduxProvider/TeiWorkingListsReduxProvider.container.js
index fccf41206d..5334c403c3 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ReduxProvider/TeiWorkingListsReduxProvider.container.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ReduxProvider/TeiWorkingListsReduxProvider.container.js
@@ -40,6 +40,7 @@ export const TeiWorkingListsReduxProvider = ({
programStage,
currentTemplateId,
viewPreloaded,
+ onClearFilters,
...commonStateManagementProps
} = useWorkingListsCommonStateManagement(storeId, TEI_WORKING_LISTS_TYPE, program);
const dispatch = useDispatch();
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ReduxProvider/teiWorkingListsReduxProvider.types.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ReduxProvider/teiWorkingListsReduxProvider.types.js
index 0b9a66d3b4..812f91c41a 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ReduxProvider/teiWorkingListsReduxProvider.types.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ReduxProvider/teiWorkingListsReduxProvider.types.js
@@ -8,14 +8,12 @@ import type {
ChangePage,
ChangeRowsPerPage,
ClearFilter,
- ClearFilters,
RemoveFilter,
CustomMenuContents,
CustomRowMenuContents,
FiltersData,
LoadedContext,
LoadTemplates,
- LoadView,
SelectRestMenuItem,
SelectRow,
SelectTemplate,
@@ -25,12 +23,18 @@ import type {
StickyFilters,
UnloadingContext,
UpdateFilter,
+ WorkingListTemplates,
+ SetTemplateSharingSettings,
} from '../../WorkingListsBase';
import type {
CustomColumnOrder,
RecordsOrder,
UpdateList,
InitialViewConfig,
+ AddTemplate,
+ DeleteTemplate,
+ UpdateTemplate,
+ LoadView,
} from '../../WorkingListsCommon';
import type { TeiWorkingListsTemplates, TeiRecords, ApiTrackerQueryCriteria } from '../types';
@@ -63,7 +67,6 @@ export type TeiWorkingListsReduxOutputProps = {|
onChangeRowsPerPage: ChangeRowsPerPage,
onClearFilter: ClearFilter,
onRemoveFilter: RemoveFilter,
- onClearFilters: ClearFilters,
onLoadView: LoadView,
onLoadTemplates: LoadTemplates,
onClickListRow: SelectRow,
@@ -89,5 +92,13 @@ export type TeiWorkingListsReduxOutputProps = {|
updating: boolean,
updatingWithDialog: boolean,
viewPreloaded?: boolean,
- onPreserveCurrentViewState: (templateId: string, critera: ApiTrackerQueryCriteria) => void
+ onPreserveCurrentViewState: (templateId: string, critera: ApiTrackerQueryCriteria) => void,
+ apiTemplates: WorkingListTemplates,
+ forceUpdateOnMount: boolean,
+ onAddTemplate: AddTemplate,
+ onDeleteTemplate: DeleteTemplate,
+ onUpdateTemplate: UpdateTemplate,
+ onSetTemplateSharingSettings: SetTemplateSharingSettings,
+ templateSharingType: string,
+ storeId: string,
|};
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/Setup/TeiWorkingListsSetup.component.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/Setup/TeiWorkingListsSetup.component.js
index 24f6b4d333..d422f39e77 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/Setup/TeiWorkingListsSetup.component.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/Setup/TeiWorkingListsSetup.component.js
@@ -37,7 +37,6 @@ export const TeiWorkingListsSetup = ({
programStageId,
onUpdateList,
onLoadView,
- onClearFilters,
onResetListColumnOrder,
onPreserveCurrentViewState,
customColumnOrder,
@@ -100,7 +99,9 @@ export const TeiWorkingListsSetup = ({
filtersOnly,
programStageFiltersOnly,
columns,
+ // $FlowFixMe The logic ensures that sortById is defined when this function is called
sortById,
+ // $FlowFixMe The logic ensures that sortByDirection is defined when this function is called
sortByDirection,
programId: program.id,
programStageId,
@@ -134,7 +135,9 @@ export const TeiWorkingListsSetup = ({
filtersOnly,
programStageFiltersOnly,
columns,
+ // $FlowFixMe The logic ensures that sortById is defined when this callback is called
sortById,
+ // $FlowFixMe The logic ensures that sortByDirection is defined when this callback is called
sortByDirection,
programId: program.id,
programStageId,
@@ -161,7 +164,9 @@ export const TeiWorkingListsSetup = ({
filtersOnly,
programStageFiltersOnly,
columns,
+ // $FlowFixMe The logic ensures that sortById is defined when this callback is called
sortById,
+ // $FlowFixMe The logic ensures that sortByDirection is defined when this callback is called
sortByDirection,
programId: program.id,
programStageId,
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/Setup/index.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/Setup/index.js
index 7f1589e1ae..3d6d00e199 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/Setup/index.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/Setup/index.js
@@ -1,3 +1,2 @@
// @flow
export { TeiWorkingListsSetup } from './TeiWorkingListsSetup.component';
-export { TrackerWorkingListsSetupOutputProps } from './teiWorkingListsSetup.types';
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/Setup/teiWorkingListsSetup.types.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/Setup/teiWorkingListsSetup.types.js
index 426ab63241..836b448dc7 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/Setup/teiWorkingListsSetup.types.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/Setup/teiWorkingListsSetup.types.js
@@ -1,6 +1,6 @@
// @flow
import type { TrackerProgram } from '../../../../metaData';
-import type { TeiWorkingListsReduxOutputProps } from '../ReduxProvider';
+import type { TrackerWorkingListsBulkActionsSetupOutputProps } from '../BulkActionsController';
import type {
CustomColumnOrder,
RecordsOrder,
@@ -10,9 +10,8 @@ import type {
DeleteTemplate,
UpdateTemplate,
} from '../../WorkingListsCommon';
-import type { FiltersData, WorkingListTemplates, SetTemplateSharingSettings } from '../../WorkingListsBase';
-import type { LoadTeiView, TeiRecords } from '../types';
-import type { TrackerWorkingListsViewMenuSetupOutputProps } from '../ViewMenuSetup/TrackerWorkingListsViewMenuSetup.types';
+import type { WorkingListTemplates, ResetColumnOrder } from '../../WorkingListsBase';
+import type { LoadTeiView, TeiRecords, ApiTrackerQueryCriteria, TeiWorkingListsTemplates } from '../types';
type ExtractedProps = $ReadOnly<{|
customColumnOrder?: CustomColumnOrder,
@@ -20,27 +19,21 @@ type ExtractedProps = $ReadOnly<{|
onAddTemplate: AddTemplate,
onDeleteTemplate: DeleteTemplate,
onUpdateTemplate: UpdateTemplate,
- onSetTemplateSharingSettings: SetTemplateSharingSettings,
onUpdateList: UpdateList,
program: TrackerProgram,
records?: TeiRecords,
recordsOrder?: RecordsOrder,
currentTemplateId?: string,
- initialViewConfig: InitialViewConfig,
- filters?: FiltersData,
- sortById: string,
- sortByDirection: string,
- templateSharingType: string,
+ initialViewConfig?: InitialViewConfig,
apiTemplates: WorkingListTemplates,
- forceUpdateOnMount?: boolean,
+ onResetListColumnOrder: ResetColumnOrder,
+ onPreserveCurrentViewState: (templateId: string, critera: ApiTrackerQueryCriteria) => void,
+ templates?: TeiWorkingListsTemplates
|}>;
-export type Props = $ReadOnly<{|
- ...TrackerWorkingListsViewMenuSetupOutputProps,
- ...ExtractedProps,
-|}>;
+type RestProps = $Rest;
-export type TrackerWorkingListsSetupOutputProps = $ReadOnly<{|
- ...TeiWorkingListsReduxOutputProps,
+export type Props = $ReadOnly<{|
+ ...RestProps,
...ExtractedProps,
|}>;
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ViewMenuSetup/TrackerWorkingListsViewMenuSetup.component.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ViewMenuSetup/TrackerWorkingListsViewMenuSetup.component.js
index ca74b7a97c..70d687c8c3 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ViewMenuSetup/TrackerWorkingListsViewMenuSetup.component.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ViewMenuSetup/TrackerWorkingListsViewMenuSetup.component.js
@@ -1,40 +1,26 @@
// @flow
import React, { useCallback, useMemo, useState } from 'react';
-import { v4 as uuid } from 'uuid';
import { useSelector } from 'react-redux';
import { useDataEngine } from '@dhis2/app-runtime';
import { makeQuerySingleResource } from 'capture-core/utils/api';
import i18n from '@dhis2/d2-i18n';
-import { TeiWorkingListsSetup } from '../Setup';
+import { TrackerWorkingListsBulkActionsController } from '../BulkActionsController';
import type { CustomMenuContents } from '../../WorkingListsBase';
import type { Props } from './TrackerWorkingListsViewMenuSetup.types';
import { DownloadDialog } from '../../WorkingListsCommon';
import { computeDownloadRequest } from './downloadRequest';
import { convertToClientConfig } from '../helpers/TEIFilters';
import { FEATURES, useFeature } from '../../../../../capture-core-utils';
-import { useSelectedRowsController } from '../../WorkingListsBase/BulkActionBar';
-import { TrackedEntityBulkActions } from '../TrackedEntityBulkActions';
export const TrackerWorkingListsViewMenuSetup = ({
onLoadView,
onUpdateList,
storeId,
- program,
programStageId,
orgUnitId,
recordsOrder,
...passOnProps
}: Props) => {
- const [customUpdateTrigger, setCustomUpdateTrigger] = useState();
- const {
- selectedRows,
- clearSelection,
- selectAllRows,
- selectionInProgress,
- toggleRowSelected,
- allRowsAreSelected,
- removeRowsFromSelection,
- } = useSelectedRowsController({ recordIds: recordsOrder });
const hasCSVSupport = useFeature(FEATURES.trackedEntitiesCSV);
const downloadRequest = useSelector(
({ workingLists }) => workingLists[storeId] && workingLists[storeId].currentRequest,
@@ -102,43 +88,16 @@ export const TrackerWorkingListsViewMenuSetup = ({
[onUpdateList, storeId],
);
- const handleCustomUpdateTrigger = useCallback((disableClearSelection?: boolean) => {
- const id = uuid();
- setCustomUpdateTrigger(id);
- !disableClearSelection && clearSelection();
- }, [clearSelection]);
-
- const TrackedEntityBulkActionsComponent = useMemo(() => (
-
- ), [program, programStageId, selectedRows, clearSelection, handleCustomUpdateTrigger, removeRowsFromSelection]);
-
return (
<>
-
;
+type RestProps = $Rest;
+
export type Props = {|
- ...TrackerWorkingListsSetupOutputProps,
...ExtractedProps,
+ ...RestProps,
|};
export type TrackerWorkingListsViewMenuSetupOutputProps = {|
- ...TrackerWorkingListsSetupOutputProps,
+ ...RestProps,
onLoadView: LoadTeiView,
- onUpdateList: UpdateList,
- customUpdateTrigger: ?string,
- allRowsAreSelected: ?boolean,
- selectedRows: { [key: string]: boolean },
- onRowSelect: (id: string) => void,
- onSelectAll: (rows: Array) => void,
- selectionInProgress: ?boolean,
- bulkActionBarComponent: React$Element,
+ onUpdateList: UpdateTrackerList,
|};
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ViewMenuSetup/index.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ViewMenuSetup/index.js
index caf1a12545..05a1b5f526 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ViewMenuSetup/index.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/ViewMenuSetup/index.js
@@ -1,4 +1,4 @@
// @flow
export { TrackerWorkingListsViewMenuSetup } from './TrackerWorkingListsViewMenuSetup.component';
export { computeDownloadRequest } from './downloadRequest';
-
+export type { TrackerWorkingListsViewMenuSetupOutputProps } from './TrackerWorkingListsViewMenuSetup.types';
diff --git a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/types/concept.types.js b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/types/concept.types.js
index 2a859f811b..7d4cdedbc6 100644
--- a/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/types/concept.types.js
+++ b/src/core_modules/capture-core/components/WorkingLists/TeiWorkingLists/types/concept.types.js
@@ -76,11 +76,11 @@ export type LoadTeiView = (
orgUnitId: string,
categories?: Categories,
programStageId?: string,
- currentRequest?: string,
|},
meta: {|
columnsMetaForDataFetching: TeiColumnsMetaForDataFetching,
filtersOnlyMetaForDataFetching: TeiFiltersOnlyMetaForDataFetching,
|},
-) => Promise | void;
+) => Promise;
+export type UpdateTrackerList = (queryArgs: Object, meta: Object) => void;
diff --git a/src/core_modules/capture-core/components/WorkingLists/WorkingListsCommon/types/workingListCommon.types.js b/src/core_modules/capture-core/components/WorkingLists/WorkingListsCommon/types/workingListCommon.types.js
index 06cf0af9eb..cbc33065e7 100644
--- a/src/core_modules/capture-core/components/WorkingLists/WorkingListsCommon/types/workingListCommon.types.js
+++ b/src/core_modules/capture-core/components/WorkingLists/WorkingListsCommon/types/workingListCommon.types.js
@@ -22,6 +22,7 @@ export type DeleteTemplate = (
export type UpdateList = (queryArgs: Object, columnsMetaForDataFetching: Object, lastTransaction: number) => void;
+/*
export type LoadView = (
template: Object,
context: {
@@ -36,6 +37,22 @@ export type LoadView = (
filtersOnlyMetaForDataFetching: any,
},
) => Promise | void;
+*/
+export type LoadView = (
+ template: Object,
+ context: {
+ programId: string,
+ orgUnitId: string,
+ categories?: Categories,
+ programStageId?: string,
+ currentRequest?: string,
+ },
+ meta: {
+ columnsMetaForDataFetching: any,
+ filtersOnlyMetaForDataFetching: any,
+ },
+) => void;
+
export type InitialViewConfig = {|
filters?: FiltersData,