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) {