{
- if (nextOpen) openConfirm(key);
- else closeConfirm();
- }}
- onConfirm={(e) => {
- e?.stopPropagation?.();
- closeConfirm();
+ onOk,
+ onCancel
+ }) => {
+ // close the dropdown immediately; confirm dialog is separate
+ setDropdownOpen(false);
- // Critical: for informational popconfirms, keep the dropdown open so the Popconfirm can cleanly close.
- if (closeDropdownOnConfirm) {
- setDropdownOpen(false);
+ const id = makeConfirmId();
+
+ const openFn = variant === "info" ? modal.info : variant === "warning" ? modal.warning : modal.confirm;
+
+ const inst = openFn({
+ title,
+ content,
+ okText,
+ cancelText,
+ centered: true,
+ maskClosable: false,
+ onCancel: () => {
+ closeConfirmById(id);
+ onCancel?.();
+ },
+ onOk: async () => {
+ try {
+ await onOk?.();
+ } finally {
+ closeConfirmById(id);
}
+ },
+ ...(showCancel ? {} : { okCancel: false })
+ });
- onConfirm?.(e);
- }}
- onCancel={(e) => {
- e?.stopPropagation?.();
- closeConfirm();
- // Keep dropdown open on cancel so the user can continue using the menu.
- }}
- getPopupContainer={() => document.body}
- >
- {
- e.preventDefault();
- e.stopPropagation();
- openConfirm(key);
- }}
- >
- {text}
-
-
- );
+ confirmInstancesRef.current.set(id, inst);
+ return id;
+ };
+
+ const handleDropdownOpenChange = useCallback((nextOpen) => {
+ setDropdownOpen(nextOpen);
+ }, []);
- // Function to show modal
const showCancelScheduleModal = () => {
setIsCancelScheduleModalVisible(true);
};
- // Function to handle Cancel
const handleCancelScheduleModalCancel = () => {
setIsCancelScheduleModalVisible(false);
};
@@ -476,6 +462,11 @@ export function JobsDetailHeaderActions({
};
const handleVoidJob = async () => {
+ if (!canVoidJob) {
+ notification.error({ title: t("general.messages.rbacunauth") });
+ return;
+ }
+
//delete the job.
const result = await voidJob({
variables: {
@@ -964,26 +955,26 @@ export function JobsDetailHeaderActions({
{
key: "duplicate",
id: "job-actions-duplicate",
- label: renderPopconfirmMenuLabel({
- key: "confirm-duplicate",
- text: t("menus.jobsactions.duplicate"),
- title: t("jobs.labels.duplicateconfirm"),
- okText: t("general.labels.yes"),
- cancelText: t("general.labels.no"),
- onConfirm: handleDuplicate
- })
+ label: t("menus.jobsactions.duplicate"),
+ onClick: () =>
+ openConfirmFromMenu({
+ title: t("jobs.labels.duplicateconfirm"),
+ okText: t("general.labels.yes"),
+ cancelText: t("general.labels.no"),
+ onOk: handleDuplicate
+ })
},
{
key: "duplicatenolines",
id: "job-actions-duplicatenolines",
- label: renderPopconfirmMenuLabel({
- key: "confirm-duplicate-nolines",
- text: t("menus.jobsactions.duplicatenolines"),
- title: t("jobs.labels.duplicateconfirm"),
- okText: t("general.labels.yes"),
- cancelText: t("general.labels.no"),
- onConfirm: handleDuplicateConfirm
- })
+ label: t("menus.jobsactions.duplicatenolines"),
+ onClick: () =>
+ openConfirmFromMenu({
+ title: t("jobs.labels.duplicateconfirm"),
+ okText: t("general.labels.yes"),
+ cancelText: t("general.labels.no"),
+ onOk: handleDuplicateConfirm
+ })
}
]
},
@@ -1156,26 +1147,25 @@ export function JobsDetailHeaderActions({
menuItems.push({
key: "deletejob",
id: "job-actions-deletejob",
- label:
- jobWatchersCount === 0
- ? renderPopconfirmMenuLabel({
- key: "confirm-deletejob",
- text: t("menus.jobsactions.deletejob"),
- title: t("jobs.labels.deleteconfirm"),
- okText: t("general.labels.yes"),
- cancelText: t("general.labels.no"),
- onConfirm: handleDeleteJob
- })
- : renderPopconfirmMenuLabel({
- key: "confirm-deletejob-watchers",
- text: t("menus.jobsactions.deletejob"),
- title: t("jobs.labels.deletewatchers"),
- showCancel: false,
- closeDropdownOnConfirm: false, // <-- FIX: keep dropdown mounted so Popconfirm can close cleanly
- onConfirm: () => {
- // informational confirm only
- }
- })
+ label: t("menus.jobsactions.deletejob"),
+ onClick: () => {
+ if (jobWatchersCount === 0) {
+ openConfirmFromMenu({
+ title: t("jobs.labels.deleteconfirm"),
+ okText: t("general.labels.yes"),
+ cancelText: t("general.labels.no"),
+ onOk: handleDeleteJob
+ });
+ } else {
+ // informational "OK only"
+ openConfirmFromMenu({
+ variant: "info",
+ title: t("jobs.labels.deletewatchers"),
+ okText: t("general.actions.ok") ?? "OK",
+ showCancel: false
+ });
+ }
+ }
});
}
@@ -1188,22 +1178,18 @@ export function JobsDetailHeaderActions({
label: t("appointments.labels.manualevent")
});
- if (!jobRO && job.converted) {
+ if (!jobRO && job.converted && canVoidJob) {
menuItems.push({
key: "voidjob",
id: "job-actions-voidjob",
- label: (
-