Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
6f142ee
feat: unify overflow menus for event
henrikmv Jul 22, 2026
9c22533
feat: refactor EventOverflowMenu to compute visibility for menu items
henrikmv Jul 22, 2026
d3aacb1
fix: pass undefined to deleteEvent for improved error handling
henrikmv Jul 22, 2026
9afd2b9
fix: delete event functionality
henrikmv Jul 22, 2026
2a7b8ee
feat: update menu items icon
henrikmv Jul 22, 2026
6403107
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21655_uncomplete-e…
henrikmv Jul 24, 2026
5f5a4e8
feat: unify event status update methods and read only badge functiona…
henrikmv Jul 24, 2026
72fbb17
feat: update translation strings and improve delete menu item label
henrikmv Jul 25, 2026
fe45f9e
feat: refactor event edit permissions and unify overflow menu item props
henrikmv Jul 27, 2026
14ed6a3
feat: add handling for SKIPPED event status in enrollment edit page mode
henrikmv Jul 27, 2026
a7f2d5f
feat: unify overflow menu item properties and remove unused features
henrikmv Jul 27, 2026
410438f
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21655_uncomplete-e…
henrikmv Jul 28, 2026
d53faf6
Merge branch 'hv/feat/DHIS2-21655_uncomplete-event-view-mode' into hv…
henrikmv Jul 28, 2026
5515457
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21655_uncomplete-e…
henrikmv Jul 28, 2026
0319de3
Merge branch 'hv/feat/DHIS2-21655_uncomplete-event-view-mode' into hv…
henrikmv Jul 28, 2026
b3cbbca
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21655_uncomplete-e…
henrikmv Jul 28, 2026
c6f8d86
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21655_uncomplete-e…
henrikmv Jul 28, 2026
b6bde1e
Merge branch 'hv/feat/DHIS2-21655_uncomplete-event-view-mode' into hv…
henrikmv Jul 31, 2026
9182f5a
feat: temp
henrikmv Jul 31, 2026
439be80
Merge branch 'hv/feat/DHIS2-21655_uncomplete-event-view-mode' into hv…
henrikmv Jul 31, 2026
b886dc0
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21655_uncomplete-e…
henrikmv Jul 31, 2026
fe28ff0
feat: temp clean up
henrikmv Jul 31, 2026
51eedc4
feat: unify overflow menu actions in WidgetHeader component
henrikmv Jul 31, 2026
b4064f9
feat: include completedBy in enrollment event mutation
henrikmv Jul 31, 2026
34e94aa
feat: align with parent branch
henrikmv Jul 31, 2026
511f1bb
feat: implement useOptimisticEventStatus hook for event status manage…
henrikmv Jul 31, 2026
9268bb4
feat: add folder for menu items
henrikmv Aug 4, 2026
10a70bf
Merge remote-tracking branch 'origin/master' into hv/feat/DHIS2-21875…
henrikmv Aug 4, 2026
960ec6e
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21655_uncomplete-e…
henrikmv Aug 4, 2026
b39ae0f
Merge remote-tracking branch 'origin/master' into hv/feat/DHIS2-21875…
henrikmv Aug 4, 2026
48d10ca
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21655_uncomplete-e…
henrikmv Aug 4, 2026
457fc0b
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21655_uncomplete-e…
henrikmv Aug 4, 2026
b358136
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21655_uncomplete-e…
henrikmv Aug 4, 2026
0c08857
Merge branch 'hv/feat/DHIS2-21655_uncomplete-event-view-mode' into hv…
henrikmv Aug 4, 2026
fbec05e
feat: unify event permissions handling
henrikmv Aug 4, 2026
edcb8cc
feat: temp
henrikmv Aug 4, 2026
71d81aa
feat: temp
henrikmv Aug 5, 2026
fb3891e
feat: one menu item per action
henrikmv Aug 5, 2026
68e1b91
feat: update event overflow menu
henrikmv Aug 5, 2026
fd2c74e
Merge remote-tracking branch 'origin/hv/chore/DHIS2-21941_SingleSourc…
henrikmv Aug 5, 2026
7909a3b
Merge remote-tracking branch 'origin/hv/chore/DHIS2-21941_SingleSourc…
henrikmv Aug 6, 2026
a0e8f3b
feat: add event skipped handling read only
henrikmv Aug 6, 2026
e1583ab
feat: stay on view mode when unskip from view mode
henrikmv Aug 6, 2026
994648f
feat: unify event page mode handling by including eventId in useEnrol…
henrikmv Aug 6, 2026
7c9bef0
feat: replace direct query removal with utility function for event ch…
henrikmv Aug 6, 2026
e76df13
feat: read only badge upper right corner for skipped events
henrikmv Aug 6, 2026
2865cfe
Merge remote-tracking branch 'origin/hv/chore/DHIS2-21941_SingleSourc…
henrikmv Aug 12, 2026
432c107
Merge branch 'hv/chore/DHIS2-21941_SingleSourceChangelogValues' into …
henrikmv Aug 12, 2026
c37fc0e
Merge branch 'hv/feat/DHIS2-21655_uncomplete-event-view-mode' into hv…
henrikmv Aug 15, 2026
ef425e3
Merge remote-tracking branch 'origin/hv/feat/DHIS2-21655_uncomplete-e…
henrikmv Aug 15, 2026
392cbee
Merge branch 'hv/chore/DHIS2-21941_SingleSourceChangelogValues' into …
henrikmv Aug 17, 2026
62b1238
Merge branch 'hv/chore/DHIS2-21941_SingleSourceChangelogValues' into …
henrikmv Aug 17, 2026
1f17d1a
feat: unify event status updates and clean up type annotations in eve…
henrikmv Aug 17, 2026
5dae898
feat: add ChangelogMenuItem to event overflow menus
henrikmv Aug 17, 2026
bd1d38e
feat: temp
henrikmv Aug 17, 2026
a88c266
feat: seperate modal and delete menu item
henrikmv Aug 17, 2026
47a789b
feat: temp
henrikmv Aug 18, 2026
ae8732c
Merge branch 'hv/chore/DHIS2-21941_SingleSourceChangelogValues' into …
henrikmv Aug 18, 2026
734ddf0
Merge branch 'hv/chore/DHIS2-21941_SingleSourceChangelogValues' into …
henrikmv Aug 21, 2026
e8782aa
fix: unify event completion handling by replacing canUncompleteEvent …
henrikmv Aug 21, 2026
ff690ec
Merge branch 'hv/chore/DHIS2-21941_SingleSourceChangelogValues' into …
henrikmv Aug 21, 2026
30ecc62
feat: enhance event edit permissions to include deletion capability a…
henrikmv Aug 21, 2026
9b57345
feat: temp
henrikmv Aug 22, 2026
943d9d8
Merge branch 'hv/chore/DHIS2-21941_SingleSourceChangelogValues' into …
henrikmv Aug 22, 2026
64eaa97
feat: unify overflow menu components and enhance read-only message ha…
henrikmv Aug 22, 2026
0dfc6a0
feat: add event status notice box and enhance event editing permissions
henrikmv Aug 22, 2026
76fd90c
fix: clean up
henrikmv Aug 22, 2026
d9f31f6
fix: clean up link read only
henrikmv Aug 22, 2026
cb814af
fix: rename uncomplete toggle
henrikmv Aug 23, 2026
5444f5e
fix: revert info box
henrikmv Aug 23, 2026
9cdb315
feat: temp
henrikmv Aug 25, 2026
b60e557
feat: unify event completion toggle naming and clean up components
henrikmv Aug 26, 2026
4487ae8
feat: temp
henrikmv Aug 26, 2026
fa50b4a
feat: unify event mutation access naming across components
henrikmv Aug 26, 2026
249f226
feat: unify event permission checks and refactor related components
henrikmv Aug 28, 2026
844ded8
Merge branch 'hv/chore/DHIS2-21941_SingleSourceChangelogValues' into …
henrikmv Aug 28, 2026
2439b92
fix: (review) devin comments
henrikmv Aug 28, 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
44 changes: 22 additions & 22 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-08-28T11:16:56.550Z\n"
"PO-Revision-Date: 2026-08-28T11:16:56.550Z\n"
"POT-Creation-Date: 2026-08-28T12:16:22.694Z\n"
"PO-Revision-Date: 2026-08-28T12:16:22.694Z\n"

msgid "The application could not be loaded."
msgstr "The application could not be loaded."
Expand Down Expand Up @@ -437,6 +437,9 @@ msgstr ""
"This event has unsaved changes. Leaving this page without saving will lose "
"these changes. Are you sure you want to discard unsaved changes?"

msgid "View changelog"
msgstr "View changelog"

msgid "An error occurred when updating event status"
msgstr "An error occurred when updating event status"

Expand All @@ -446,6 +449,9 @@ msgstr "Mark incomplete"
msgid "Mark complete"
msgstr "Mark complete"

msgid "Delete"
msgstr "Delete"

msgid "An error occurred while deleting the event"
msgstr "An error occurred while deleting the event"

Expand All @@ -461,8 +467,11 @@ msgstr "Are you sure you want to delete this event?"
msgid "Yes, delete event"
msgstr "Yes, delete event"

msgid "Delete"
msgstr "Delete"
msgid "Unskip"
msgstr "Unskip"

msgid "Skip"
msgstr "Skip"

msgid "No events to display"
msgstr "No events to display"
Expand Down Expand Up @@ -993,9 +1002,6 @@ msgstr "events"
msgid "event"
msgstr "event"

msgid "View changelog"
msgstr "View changelog"

msgid "Event details"
msgstr "Event details"

Expand Down Expand Up @@ -1098,6 +1104,12 @@ msgstr "Possible duplicates found"
msgid "An error occurred loading possible duplicates"
msgstr "An error occurred loading possible duplicates"

msgid "View only - {{message}}"
msgstr "View only - {{message}}"

msgid "View only"
msgstr "View only"

msgid "You only have view access to this enrollment"
msgstr "You only have view access to this enrollment"

Expand All @@ -1122,18 +1134,15 @@ msgstr "This event is outside the editing period"
msgid "This event has been completed"
msgstr "This event has been completed"

msgid "You do not have access to uncomplete this event"
msgstr "You do not have access to uncomplete this event"

msgid "This {{trackedEntityName}} is deactivated"
msgstr "This {{trackedEntityName}} is deactivated"

msgid "This tracked entity is deactivated"
msgstr "This tracked entity is deactivated"

msgid "View only - {{message}}"
msgstr "View only - {{message}}"

msgid "View only"
msgstr "View only"

msgid "Add relationship"
msgstr "Add relationship"

Expand Down Expand Up @@ -1530,9 +1539,6 @@ msgstr "Go to “Schedule” tab to reschedule this event"
msgid "Scheduled date cannot be changed for {{ eventStatus }} events"
msgstr "Scheduled date cannot be changed for {{ eventStatus }} events"

msgid "You do not have access to uncomplete this event"
msgstr "You do not have access to uncomplete this event"

msgid "Geometry (Area)"
msgstr "Geometry (Area)"

Expand Down Expand Up @@ -1772,12 +1778,6 @@ msgstr "This stage can only have one event"
msgid "New {{ eventName }} event"
msgstr "New {{ eventName }} event"

msgid "Unskip"
msgstr "Unskip"

msgid "Skip"
msgstr "Skip"

msgid "Show {{ rest }} more"
msgstr "Show {{ rest }} more"

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import React from 'react';
import { FlyoutMenu, MenuDivider } from '@dhis2/ui';
import { statusTypes as eventStatuses } from 'capture-core/events/statusTypes';
import { ChangelogMenuItem, SkipMenuItem, CompletionMenuItem, DeleteMenuItem } from './MenuItems';

const isSkippableStatus = (status?: string) =>
status === eventStatuses.SCHEDULE
|| status === eventStatuses.SKIPPED
|| status === eventStatuses.OVERDUE;

const isCompletableStatus = (status?: string) =>
status === eventStatuses.ACTIVE || status === eventStatuses.COMPLETED;

type Props = {
eventId: string;
eventStatus?: string;
maxWidth?: string;
dataTest?: string;

onOpenChangelog: () => void;
onClose: () => void;

hideMutationActions?: boolean;
isEventBlockedByExpiry: boolean;
canToggleCompletion: boolean;
readOnlyMessage: string;

onSkipMutate: (newStatus: string) => void;
onSkipSuccess: (newStatus: string) => void;
onSkipError: () => void;

onCompletionMutate: (newStatus: string) => void;
onCompletionSuccess: (newStatus: string) => void;
onCompletionError: () => void;

onDeleteRequest: () => void;
};

export const EventOverflowMenu = ({
eventId,
eventStatus,
maxWidth,
dataTest = 'overflow-menu',
onOpenChangelog,
onClose,
hideMutationActions = false,
isEventBlockedByExpiry,
canToggleCompletion,
readOnlyMessage,
onSkipMutate,
onSkipSuccess,
onSkipError,
onCompletionMutate,
onCompletionSuccess,
onCompletionError,
onDeleteRequest,
}: Props) => (
<FlyoutMenu dense maxWidth={maxWidth} dataTest={dataTest}>
<ChangelogMenuItem onOpenChangelog={onOpenChangelog} onClose={onClose} />

{!hideMutationActions && (
<>
<MenuDivider />

{isSkippableStatus(eventStatus) && (
<SkipMenuItem
eventId={eventId}
eventStatus={eventStatus}
onMutate={onSkipMutate}
onSuccess={onSkipSuccess}
onError={onSkipError}
onClose={onClose}
isEventBlockedByExpiry={isEventBlockedByExpiry}
readOnlyMessage={readOnlyMessage}
/>
)}

{isCompletableStatus(eventStatus) && (
<CompletionMenuItem
eventId={eventId}
eventStatus={eventStatus}
onMutate={onCompletionMutate}
onSuccess={onCompletionSuccess}
onError={onCompletionError}
onClose={onClose}
canToggleCompletion={canToggleCompletion}
readOnlyMessage={readOnlyMessage}
/>
)}

<DeleteMenuItem
onDeleteRequest={onDeleteRequest}
onClose={onClose}
isEventBlockedByExpiry={isEventBlockedByExpiry}
readOnlyMessage={readOnlyMessage}
/>
</>
)}
</FlyoutMenu>
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import React from 'react';
import i18n from '@dhis2/d2-i18n';
import { MenuItem, IconClockHistory16 } from '@dhis2/ui';

type Props = {
onOpenChangelog: () => void;
onClose: () => void;
};

export const ChangelogMenuItem = ({ onOpenChangelog, onClose }: Props) => (
<MenuItem
dense
icon={<IconClockHistory16 />}
label={i18n.t('View changelog')}
suffix={null}
dataTest="event-overflow-changelog"
onClick={() => {
onOpenChangelog();
onClose();
}}
/>
);
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { useAlert, useDataEngine } from '@dhis2/app-runtime';
import { errorCreator } from 'capture-core-utils';
import { statusTypes as eventStatuses } from 'capture-core/events/statusTypes';
import { removeEventChangelogQueries } from '../../WidgetsChangelog';
import { ConditionalTooltip } from '../../Tooltips/ConditionalTooltip';

type Props = {
eventId: string;
Expand All @@ -15,6 +16,8 @@ type Props = {
onSuccess?: (newStatus: string) => void;
onError?: () => void;
onClose: () => void;
canToggleCompletion: boolean;
readOnlyMessage: string;
};

export const CompletionMenuItem = ({
Expand All @@ -24,6 +27,8 @@ export const CompletionMenuItem = ({
onSuccess,
onError,
onClose,
canToggleCompletion,
readOnlyMessage,
}: Props) => {
const dataEngine = useDataEngine();
const queryClient = useQueryClient();
Expand Down Expand Up @@ -75,16 +80,19 @@ export const CompletionMenuItem = ({
);

return (
<MenuItem
dense
dataTest={isCompleted ? 'uncomplete-event-menu-item' : 'complete-event-menu-item'}
icon={isCompleted ? <IconUndo16 /> : <IconCheckmark16 />}
label={isCompleted ? i18n.t('Mark incomplete') : i18n.t('Mark complete')}
suffix={null}
onClick={() => {
onClose();
updateCompletionStatus();
}}
/>
<ConditionalTooltip content={readOnlyMessage} enabled={!canToggleCompletion}>
<MenuItem
dense
disabled={!canToggleCompletion}
dataTest={isCompleted ? 'uncomplete-event-menu-item' : 'complete-event-menu-item'}
icon={isCompleted ? <IconUndo16 /> : <IconCheckmark16 />}
label={isCompleted ? i18n.t('Mark incomplete') : i18n.t('Mark complete')}
suffix={null}
onClick={() => {
onClose();
updateCompletionStatus();
}}
/>
</ConditionalTooltip>
);
};

This file was deleted.

Loading
Loading