feat: add company management and manager role support

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
This commit is contained in:
esdrasrenan 2025-10-06 21:26:43 -03:00
parent 409cbea7b9
commit 854887f499
16 changed files with 955 additions and 126 deletions

View file

@ -60,7 +60,8 @@ function formatDuration(durationMs: number) {
}
export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
const { convexUserId } = useAuth()
const { convexUserId, role } = useAuth()
const isManager = role === "manager"
const changeAssignee = useMutation(api.tickets.changeAssignee)
const changeQueue = useMutation(api.tickets.changeQueue)
const updateSubject = useMutation(api.tickets.updateSubject)
@ -129,7 +130,7 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
setSaving(true)
try {
if (categoryDirty) {
if (categoryDirty && !isManager) {
toast.loading("Atualizando categoria...", { id: "ticket-category" })
try {
await updateCategories({
@ -147,6 +148,11 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
})
throw categoryError
}
} else if (categoryDirty && isManager) {
setCategorySelection({
categoryId: currentCategoryId,
subcategoryId: currentSubcategoryId,
})
}
if (dirty) {
@ -333,9 +339,10 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
<span className={sectionLabelClass}>Categoria primária</span>
{editing ? (
<Select
disabled={saving || categoriesLoading}
disabled={saving || categoriesLoading || isManager}
value={selectedCategoryId ? selectedCategoryId : EMPTY_CATEGORY_VALUE}
onValueChange={(value) => {
if (isManager) return
if (value === EMPTY_CATEGORY_VALUE) {
setCategorySelection({ categoryId: "", subcategoryId: "" })
return
@ -368,10 +375,11 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
{editing ? (
<Select
disabled={
saving || categoriesLoading || !selectedCategoryId
saving || categoriesLoading || !selectedCategoryId || isManager
}
value={selectedSubcategoryId ? selectedSubcategoryId : EMPTY_SUBCATEGORY_VALUE}
onValueChange={(value) => {
if (isManager) return
if (value === EMPTY_SUBCATEGORY_VALUE) {
setCategorySelection((prev) => ({ ...prev, subcategoryId: "" }))
return
@ -407,9 +415,11 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
<span className={sectionLabelClass}>Fila</span>
{editing ? (
<Select
disabled={isManager}
value={ticket.queue ?? ""}
onValueChange={async (value) => {
if (!convexUserId) return
if (isManager) return
const queue = queues.find((item) => item.name === value)
if (!queue) return
toast.loading("Atualizando fila...", { id: "queue" })
@ -444,9 +454,11 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
<span className={sectionLabelClass}>Responsável</span>
{editing ? (
<Select
disabled={isManager}
value={ticket.assignee?.id ?? ""}
onValueChange={async (value) => {
if (!convexUserId) return
if (isManager) return
toast.loading("Atribuindo responsável...", { id: "assignee" })
try {
await changeAssignee({ ticketId: ticket.id as Id<"tickets">, assigneeId: value as Id<"users">, actorId: convexUserId as Id<"users"> })