diff --git a/ui/actions/invitations/invitation.ts b/ui/actions/invitations/invitation.ts index d56c928c6b..f2ed3c70ad 100644 --- a/ui/actions/invitations/invitation.ts +++ b/ui/actions/invitations/invitation.ts @@ -98,15 +98,19 @@ export const sendInvite = async (formData: FormData) => { }; export const updateInvite = async (formData: FormData) => { + console.log(formData, "formData from updateInvite"); const session = await auth(); const keyServer = process.env.API_BASE_URL; const invitationId = formData.get("invitationId"); const invitationEmail = formData.get("invitationEmail"); - const expiresAt = formData.get("expires_at"); - const role = formData.get("role"); + const roleId = formData.get("role"); + const expiresAt = + formData.get("expires_at") || + new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(); const url = new URL(`${keyServer}/tenants/invitations/${invitationId}`); + console.log(url, "url"); const body = JSON.stringify({ data: { @@ -114,23 +118,23 @@ export const updateInvite = async (formData: FormData) => { id: invitationId, attributes: { email: invitationEmail, - ...(expiresAt && { expires_at: expiresAt }), + expires_at: expiresAt, }, relationships: { roles: { - data: role - ? [ - { - id: role, - type: "role", - }, - ] - : [], + data: [ + { + id: roleId, + type: "role", + }, + ], }, }, }, }); + console.log("Payload send to server", JSON.stringify(body, null, 2)); + try { const response = await fetch(url.toString(), { method: "PATCH", @@ -141,6 +145,13 @@ export const updateInvite = async (formData: FormData) => { }, body, }); + + if (!response.ok) { + const error = await response.json(); + console.error("API Error:", error); + return { error }; + } + const data = await response.json(); revalidatePath("/invitations"); return parseStringify(data); diff --git a/ui/app/(prowler)/invitations/page.tsx b/ui/app/(prowler)/invitations/page.tsx index 5dd4753916..e0762ffb05 100644 --- a/ui/app/(prowler)/invitations/page.tsx +++ b/ui/app/(prowler)/invitations/page.tsx @@ -70,16 +70,28 @@ const SSRDataTable = async ({ {}, ); - // Expand invitations with role information + // Generate the array of roles with all the roles available + const roles = Array.from( + new Map( + rolesData.data.map((role: any) => [ + role.id, + { id: role.id, name: role.attributes?.name || "Unnamed Role" }, + ]), + ).values(), + ); + + // Expand the invitations const expandedInvitations = invitationsData?.data?.map( (invitation: InvitationProps) => { const role = roleDict[invitation.id]; + return { ...invitation, relationships: { ...invitation.relationships, role, }, + roles, // Include all roles here for each invitation }; }, ); @@ -88,6 +100,7 @@ const SSRDataTable = async ({ const expandedResponse = { ...invitationsData, data: expandedInvitations, + roles, }; return ( diff --git a/ui/components/invitations/forms/edit-form.tsx b/ui/components/invitations/forms/edit-form.tsx index 810a358463..4782222dd0 100644 --- a/ui/components/invitations/forms/edit-form.tsx +++ b/ui/components/invitations/forms/edit-form.tsx @@ -15,13 +15,13 @@ export const EditForm = ({ invitationId, invitationEmail, roles = [], - defaultRole = "", + currentRole = "", setIsOpen, }: { invitationId: string; invitationEmail?: string; roles: Array<{ id: string; name: string }>; - defaultRole?: string; + currentRole?: string; setIsOpen: Dispatch>; }) => { const formSchema = editInviteFormSchema; @@ -31,7 +31,7 @@ export const EditForm = ({ defaultValues: { invitationId, invitationEmail: invitationEmail || "", - role: defaultRole, + role: roles.find((role) => role.name === currentRole)?.id || "", }, }); @@ -40,6 +40,7 @@ export const EditForm = ({ const isLoading = form.formState.isSubmitting; const onSubmitClient = async (values: z.infer) => { + console.log(values, " from edit form"); const formData = new FormData(); Object.entries(values).forEach( @@ -49,11 +50,10 @@ export const EditForm = ({ const data = await updateInvite(formData); if (data?.error) { - const errorMessage = `${data.error}`; toast({ variant: "destructive", title: "Oops! Something went wrong", - description: errorMessage, + description: `${data.error}`, }); } else { toast({ @@ -70,9 +70,12 @@ export const EditForm = ({ onSubmit={form.handleSubmit(onSubmitClient)} className="flex flex-col space-y-4" > -
+
Current email: {invitationEmail}
+
+ Current role: {currentRole} +
field.onChange(selected?.currentKey || "") } @@ -107,6 +110,7 @@ export const EditForm = ({ )} /> + {form.formState.errors.role && (

{form.formState.errors.role.message} diff --git a/ui/components/invitations/table/column-invitations.tsx b/ui/components/invitations/table/column-invitations.tsx index 0fb823cffa..8e3c7dfd32 100644 --- a/ui/components/invitations/table/column-invitations.tsx +++ b/ui/components/invitations/table/column-invitations.tsx @@ -74,7 +74,8 @@ export const ColumnsInvitation: ColumnDef[] = [ header: () =>

Actions
, id: "actions", cell: ({ row }) => { - return ; + const roles = row.original.roles; + return ; }, }, ]; diff --git a/ui/components/invitations/table/data-table-row-actions.tsx b/ui/components/invitations/table/data-table-row-actions.tsx index 6878fae08e..93b2fa896c 100644 --- a/ui/components/invitations/table/data-table-row-actions.tsx +++ b/ui/components/invitations/table/data-table-row-actions.tsx @@ -24,28 +24,34 @@ import { DeleteForm, EditForm } from "../forms"; interface DataTableRowActionsProps { row: Row; + roles?: { id: string; name: string }[]; } const iconClasses = "text-2xl text-default-500 pointer-events-none flex-shrink-0"; export function DataTableRowActions({ row, + roles, }: DataTableRowActionsProps) { const [isEditOpen, setIsEditOpen] = useState(false); const [isDeleteOpen, setIsDeleteOpen] = useState(false); const invitationId = (row.original as { id: string }).id; const invitationEmail = (row.original as any).attributes?.email; + const invitationRole = (row.original as any).relationships?.role?.attributes + ?.name; + return ( <> diff --git a/ui/types/components.ts b/ui/types/components.ts index 3fc727dd64..1b237d55b6 100644 --- a/ui/types/components.ts +++ b/ui/types/components.ts @@ -242,6 +242,10 @@ export interface InvitationProps { links: { self: string; }; + roles?: { + id: string; + name: string; + }[]; } export interface Role {