Add role management

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
This commit is contained in:
Sacha Al Himdani
2025-11-07 09:20:38 +01:00
parent 696adb7d79
commit 21c4b7cd9d
143 changed files with 5976 additions and 2094 deletions

View File

@@ -26,6 +26,8 @@ import TaskFormDialog, {
import { useOrganizationId } from "/hooks/useOrganizationId";
import { Link, useLocation, useParams } from "react-router";
import { promisifyMutation } from "@probo/helpers";
import { Authorized } from "/permissions";
import { isAuthorized } from "/permissions";
import type { TaskFormDialogFragment$key } from "./__generated__/TaskFormDialogFragment.graphql";
import { updateStoreCounter } from "/hooks/useMutationWithIncrement";
@@ -49,6 +51,7 @@ type Props = {
export default function TasksCard({ tasks, connectionId }: Props) {
const { __ } = useTranslate();
const organizationId = useOrganizationId();
const hash = useLocation().hash.replace("#", "");
const hashes = [
@@ -67,6 +70,9 @@ export default function TasksCard({ tasks, connectionId }: Props) {
usePageTitle(__("Tasks"));
const hasAnyAction = isAuthorized(organizationId, "Task", "updateTask") ||
isAuthorized(organizationId, "Task", "deleteTask");
return (
<div className="space-y-6">
{tasks?.length === 0 ? (
@@ -100,6 +106,7 @@ export default function TasksCard({ tasks, connectionId }: Props) {
key={task.id}
task={task}
connectionId={connectionId}
hasAnyAction={hasAnyAction}
/>
))}
</Fragment>
@@ -110,6 +117,7 @@ export default function TasksCard({ tasks, connectionId }: Props) {
key={task.id}
task={task}
connectionId={connectionId}
hasAnyAction={hasAnyAction}
/>
))}
</div>
@@ -122,6 +130,7 @@ export default function TasksCard({ tasks, connectionId }: Props) {
type TaskRowProps = {
task: ItemOf<Props["tasks"]> & TaskFormDialogFragment$key;
connectionId: string;
hasAnyAction: boolean;
};
const deleteMutation = graphql`
@@ -221,21 +230,27 @@ function TaskRow(props: TaskRowProps) {
<Avatar name={props.task.assignedTo?.fullName ?? ""} />
</Link>
)}
<ActionDropdown>
<DropdownItem
icon={IconPencil}
onClick={() => dialogRef.current?.open()}
>
{__("Edit")}
</DropdownItem>
<DropdownItem
variant="danger"
icon={IconTrashCan}
onClick={onDelete}
>
{__("Delete")}
</DropdownItem>
</ActionDropdown>
{props.hasAnyAction && (
<ActionDropdown>
<Authorized entity="Task" action="updateTask">
<DropdownItem
icon={IconPencil}
onClick={() => dialogRef.current?.open()}
>
{__("Edit")}
</DropdownItem>
</Authorized>
<Authorized entity="Task" action="deleteTask">
<DropdownItem
variant="danger"
icon={IconTrashCan}
onClick={onDelete}
>
{__("Delete")}
</DropdownItem>
</Authorized>
</ActionDropdown>
)}
</div>
</div>
</>