diff --git a/modules/customer-invoices/src/common/locales/en.json b/modules/customer-invoices/src/common/locales/en.json
index 3a2f1230..06f9dc11 100644
--- a/modules/customer-invoices/src/common/locales/en.json
+++ b/modules/customer-invoices/src/common/locales/en.json
@@ -68,7 +68,8 @@
"complete": "Complete",
"archive": "Archive",
"duplicate": "Duplicate",
- "delete": "Delete"
+ "delete": "Delete",
+ "operation_in_progress": "Operation in progress"
},
"status": {
"all": "All",
diff --git a/modules/customer-invoices/src/common/locales/es.json b/modules/customer-invoices/src/common/locales/es.json
index 94dbf7aa..f4882a0c 100644
--- a/modules/customer-invoices/src/common/locales/es.json
+++ b/modules/customer-invoices/src/common/locales/es.json
@@ -68,7 +68,8 @@
"complete": "Completar",
"archive": "Archivar",
"duplicate": "Duplicar",
- "delete": "Eliminar"
+ "delete": "Eliminar",
+ "operation_in_progress": "Operación en curso"
},
"status": {
"all": "Todos",
diff --git a/modules/customer-invoices/src/web/recurring-proformas/list/list-recurring-proformas-page.tsx b/modules/customer-invoices/src/web/recurring-proformas/list/list-recurring-proformas-page.tsx
index 17eea487..6ee56a79 100644
--- a/modules/customer-invoices/src/web/recurring-proformas/list/list-recurring-proformas-page.tsx
+++ b/modules/customer-invoices/src/web/recurring-proformas/list/list-recurring-proformas-page.tsx
@@ -1,15 +1,22 @@
import { PageErrorState, SimpleSearchInput } from "@erp/core/components";
-import { DataTable, DataTableColumnHeader, RdxPageContainer } from "@repo/rdx-ui/components";
import {
- Badge,
- Button,
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuTrigger,
-} from "@repo/shadcn-ui/components";
+ DataTable,
+ DataTableColumnHeader,
+ RdxPageContainer,
+ RdxRowActions,
+ type RdxRowAction,
+} from "@repo/rdx-ui/components";
+import { Badge, Button } from "@repo/shadcn-ui/components";
import type { ColumnDef } from "@tanstack/react-table";
-import { CircleIcon, MoreHorizontalIcon } from "lucide-react";
+import {
+ ArchiveIcon,
+ CheckCircle2Icon,
+ CircleIcon,
+ CirclePauseIcon,
+ CopyIcon,
+ PlayCircleIcon,
+ Trash2Icon,
+} from "lucide-react";
import { useMemo, useState } from "react";
import { Link } from "react-router-dom";
@@ -46,6 +53,37 @@ const getActions = (status: RecurringProformaListRow["status"]): RecurringProfor
}
};
+const actionIcons = {
+ activate: PlayCircleIcon,
+ pause: CirclePauseIcon,
+ resume: PlayCircleIcon,
+ complete: CheckCircle2Icon,
+ archive: ArchiveIcon,
+ duplicate: CopyIcon,
+ delete: Trash2Icon,
+} as const;
+
+const buildRowActions = (params: {
+ recurringProforma: RecurringProformaListRow;
+ execute: (id: string, action: RecurringProformaAction) => void;
+ isPending: boolean;
+ t: (key: string) => string;
+}): RdxRowAction[] =>
+ getActions(params.recurringProforma.status).map((action) => {
+ const Icon = actionIcons[action];
+ return {
+ id: action,
+ label: params.t(`recurring_proformas.actions.${action}`),
+ icon: ,
+ destructive: action === "archive" || action === "delete",
+ disabled: params.isPending,
+ disabledReason: params.isPending
+ ? params.t("recurring_proformas.actions.operation_in_progress")
+ : undefined,
+ onSelect: () => params.execute(params.recurringProforma.id, action),
+ };
+ });
+
export const ListRecurringProformasPage = () => {
const { t, i18n } = useTranslation();
const [isSearchPending, setIsSearchPending] = useState(false);
@@ -61,6 +99,9 @@ export const ListRecurringProformasPage = () => {
} = useListRecurringProformasPageController();
const actionMutation = useRecurringProformaActionMutation();
const dateLocale = i18n.language === "en" ? "en-US" : "es-ES";
+ const executeAction = (id: string, action: RecurringProformaAction) => {
+ actionMutation.mutate({ id, action });
+ };
const columns = useMemo[]>(
() => [
@@ -188,45 +229,27 @@ export const ListRecurringProformasPage = () => {
},
{
id: "actions",
- header: ({ column }) => (
-
- ),
+ meta: {
+ isActionsColumn: true,
+ headerClassName: "text-right",
+ cellClassName: "flex justify-end",
+ },
+ header: "",
+ enableSorting: false,
cell: ({ row }) => (
-
-
-
-
- }
- />
-
- {getActions(row.original.status).map((action) => (
- {
- event.stopPropagation();
- actionMutation.mutate({ id: row.original.id, action });
- }}
- >
- {t(`recurring_proformas.actions.${action}`)}
-
- ))}
-
-
+
),
},
],
- [actionMutation, dateLocale, t]
+ [actionMutation.isPending, dateLocale, t]
);
if (hasBlockingError && pageError) {