/* * Copyright © 2024 Hexastack. All rights reserved. * * Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms: * 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission. * 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file). * 3. SaaS Restriction: This software, or any derivative of it, may not be used to offer a competing product or service (SaaS) without prior written consent from Hexastack. Offering the software as a service or using it in a commercial cloud environment without express permission is strictly prohibited. */ import { faUniversalAccess } from "@fortawesome/free-solid-svg-icons"; import AddIcon from "@mui/icons-material/Add"; import { Button, Grid, Paper } from "@mui/material"; import { GridColDef } from "@mui/x-data-grid"; import React from "react"; import { useTranslation } from "react-i18next"; import { DeleteDialog } from "@/app-components/dialogs/DeleteDialog"; import { FilterTextfield } from "@/app-components/inputs/FilterTextfield"; import { ActionColumnLabel, useActionColumns, } from "@/app-components/tables/columns/getColumns"; import { renderHeader } from "@/app-components/tables/columns/renderHeader"; import { DataGrid } from "@/app-components/tables/DataGrid"; import { useDelete } from "@/hooks/crud/useDelete"; import { useFind } from "@/hooks/crud/useFind"; import { getDisplayDialogs, useDialog } from "@/hooks/useDialog"; import { useHasPermission } from "@/hooks/useHasPermission"; import { useSearch } from "@/hooks/useSearch"; import { useToast } from "@/hooks/useToast"; import { PageHeader } from "@/layout/content/PageHeader"; import { EntityType } from "@/services/types"; import { PermissionAction } from "@/types/permission.types"; import { IRole } from "@/types/role.types"; import { getDateTimeFormatter } from "@/utils/date"; import { PermissionsDialog } from "./PermissionsDialog"; import { RoleDialog } from "./RoleDialog"; export const Roles = () => { const { t } = useTranslation(); const { toast } = useToast(); const addDialogCtl = useDialog(false); const editDialogCtl = useDialog(false); const deleteDialogCtl = useDialog(false); const permissionDialogCtl = useDialog<{ role: IRole; }>(false); const hasPermission = useHasPermission(); const { onSearch, searchPayload } = useSearch({ $iLike: ["name"], }); const { dataGridProps } = useFind( { entity: EntityType.ROLE }, { params: searchPayload, }, ); const { mutateAsync: deleteRole } = useDelete(EntityType.ROLE, { onError: (error) => { toast.error(t(error.message || "message.internal_server_error")); }, onSuccess() { deleteDialogCtl.closeDialog(); toast.success(t("message.item_delete_success")); }, }); const actionColumns = useActionColumns( EntityType.ROLE, [ { label: ActionColumnLabel.Permissions, action: (row) => permissionDialogCtl.openDialog({ role: row, }), }, { label: ActionColumnLabel.Edit, action: (row) => editDialogCtl.openDialog(row), requires: [PermissionAction.UPDATE], }, { label: ActionColumnLabel.Delete, action: (row) => deleteDialogCtl.openDialog(row.id), requires: [PermissionAction.DELETE], }, ], t("label.operations"), ); const columns: GridColDef[] = [ { field: "id", headerName: "ID" }, { flex: 3, field: "name", headerName: t("label.name"), sortable: false, disableColumnMenu: true, renderHeader, }, { maxWidth: 140, field: "createdAt", headerName: t("label.createdAt"), disableColumnMenu: true, renderHeader, resizable: false, headerAlign: "left", valueGetter: (params) => t("datetime.created_at", getDateTimeFormatter(params)), }, { maxWidth: 140, field: "updatedAt", headerName: t("label.updatedAt"), disableColumnMenu: true, renderHeader, resizable: false, headerAlign: "left", valueGetter: (params) => t("datetime.updated_at", getDateTimeFormatter(params)), }, actionColumns, ]; return ( {permissionDialogCtl.open ? ( ) : null} { if (deleteDialogCtl.data) deleteRole(deleteDialogCtl.data); }} /> {hasPermission(EntityType.ROLE, PermissionAction.CREATE) ? ( ) : null} ); };