Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export class RemoteCreateGeneralCultivationPestUseCase

if (statusCode === HttpStatusCode.forbidden) {
throw new ForbiddenError(
'Você não tem permissão para criar uma praga geral de cultivo.'
'Você não tem permissão para criar uma praga de cultivo geral.'
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export class RemoteDeleteGeneralCultivationPestUseCase

if (statusCode === HttpStatusCode.forbidden) {
throw new ForbiddenError(
'Você não tem permissão para excluir uma praga geral de cultivo.'
'Você não tem permissão para excluir uma praga de cultivo geral.'
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export class RemoteGetGeneralCultivationPestUseCase

if (statusCode === HttpStatusCode.forbidden) {
throw new ForbiddenError(
'Você não tem permissão para buscar uma praga geral de cultivo.'
'Você não tem permissão para buscar uma praga de cultivo geral.'
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ export class RemoteGetGeneralCultivationPestsUseCase

if (statusCode === HttpStatusCode.forbidden) {
throw new ForbiddenError(
'Você não tem permissão para buscar as pragas gerais de cultivo.'
'Você não tem permissão para buscar as pragas de cultivo geral.'
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export class RemoteUpdateGeneralCultivationPestUseCase

if (statusCode === HttpStatusCode.forbidden) {
throw new ForbiddenError(
'Você não tem permissão para editar uma praga geral de cultivo.'
'Você não tem permissão para editar uma praga de cultivo geral.'
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ export type GeneralCultivationPestModel = WithId<{
name: string
}>

// todo: refactor to be consistent with Api response
export type GeneralCultivationPestApiResponse = WithId<{
name: string
}>
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ export const getGeneralCultivationPestHandler = httpWithMiddleware<
}

const generalCultivationPestsFound = generalCultivationPestsData.find(
(generalCultivation) => generalCultivation.id === Number(params.id)
(generalCultivationPest) =>
generalCultivationPest.id === Number(params.id)
)

if (!generalCultivationPestsFound) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,7 @@ export const getGeneralCultivationPestsHandler = httpWithMiddleware<
)
}

let generalCultivationPests = generalCultivationPestsData.map((pest) => ({
id: pest.id,
name: pest.name,
}))
let generalCultivationPests = generalCultivationPestsData

if (filters)
generalCultivationPests = filterData<GeneralCultivationPestApiResponse>(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import { useMemo, useState } from 'react'

import { MoreHorizontalIcon, PencilIcon, Trash2Icon } from 'lucide-react'

import { DropdownMenu } from '@/core/presentation/components/ui'
import { useDebounce } from '@/core/presentation/hooks'

import { useGeneralCultivationPestContext } from '../../hooks/general-cultivation-pest-context.hook'
import { useGeneralCultivationPestsQuery } from '../../hooks/queries/general-cultivation-pests-query.hook'

import type { GeneralCultivationPestModel } from '../../../domain/models/general-cultivation-pests-model'
import type { GeneralCultivationPestSort } from '../../types/general-cultivation-pest-types'
import type { ColumnDef } from '@tanstack/react-table'

export function useGeneralCultivationPestDataTable() {
const {
filters,
openEditGeneralCultivationPestForm,
openDeleteGeneralCultivationPestContainer,
} = useGeneralCultivationPestContext()

const [page, setPage] = useState(1)
const [sort, setSort] = useState<GeneralCultivationPestSort>()

const debouncedFilters = useDebounce({ value: filters })

const { isLoading, generalCultivationPests } =
useGeneralCultivationPestsQuery({
filters: debouncedFilters,
page,
sort,
})

const columns = useMemo<ColumnDef<GeneralCultivationPestModel>[]>(
() => [
{
accessorKey: 'name',
header: 'Nome',
},
{
id: 'row-actions',
header: '',
cell: ({ row }) => {
const { original: generalCultivationPest } = row

return (
<DropdownMenu.Root key={generalCultivationPest.id}>
<DropdownMenu.Trigger>
<MoreHorizontalIcon />
</DropdownMenu.Trigger>
<DropdownMenu.Content>
<DropdownMenu.Item
className="gap-2"
onClick={() =>
openEditGeneralCultivationPestForm(generalCultivationPest)
}
>
<PencilIcon size={14} /> Editar
</DropdownMenu.Item>
<DropdownMenu.Separator />
<DropdownMenu.Item
className="gap-2"
onClick={() =>
openDeleteGeneralCultivationPestContainer(
generalCultivationPest
)
}
>
<Trash2Icon size={14} /> Excluir
</DropdownMenu.Item>
</DropdownMenu.Content>
</DropdownMenu.Root>
)
},
},
],
[
openDeleteGeneralCultivationPestContainer,
openEditGeneralCultivationPestForm,
]
)

return {
columns,
generalCultivationPests,
isLoading,
page,
sort,
setSort,
setPage,
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { DataTable } from '@/core/presentation/components/ui'

import { useGeneralCultivationPestDataTable } from './general-cultivation-pest-data-table.hook'

import type { GeneralCultivationPestModel } from '../../../domain/models/general-cultivation-pests-model'

export function GeneralCultivationPestDataTable() {
const {
columns,
generalCultivationPests,
isLoading,
page,
sort,
setSort,
setPage,
} = useGeneralCultivationPestDataTable()

return (
<DataTable<GeneralCultivationPestModel>
columns={columns}
data={generalCultivationPests.resources}
totalPages={generalCultivationPests.totalPages}
pagination={{
currentPage: page,
onPageChange: setPage,
}}
sorting={{
currentSorting: sort,
onSorting: setSort,
}}
loading={isLoading}
/>
)
}

GeneralCultivationPestDataTable.displayName = 'GeneralCultivationPestDataTable'
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './general-cultivation-pest-data-table'
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import { useCallback } from 'react'

import { useQueryClient, useMutation } from '@tanstack/react-query'
import toast from 'react-hot-toast'

import { AlertDialog } from '@/core/presentation/components/ui'

import { makeRemoteDeleteGeneralCultivationPestUseCase } from '../../../main/factories/use-cases/general-cultivation-pests-use-cases'
import { useGeneralCultivationPestContext } from '../../hooks/general-cultivation-pest-context.hook'

export function GeneralCultivationPestDeleteDialog() {
const deleteGeneralCultivationPestUseCase =
makeRemoteDeleteGeneralCultivationPestUseCase()

const {
selectedGeneralCultivationPest,
isOpenDeleteGeneralCultivationPestContainer,
closeDeleteGeneralCultivationPestContainer,
} = useGeneralCultivationPestContext()

const queryClient = useQueryClient()

const { mutateAsync: mutateHandleDeleteGeneralCultivationPest } = useMutation(
{
mutationFn: deleteGeneralCultivationPestUseCase.execute,
}
)

const handleDeleteGeneralCultivationPest = useCallback(async () => {
if (!selectedGeneralCultivationPest) {
toast.error('Erro ao remover praga de cultivo geral')
return
}

try {
await mutateHandleDeleteGeneralCultivationPest({
id: selectedGeneralCultivationPest.id,
})

queryClient.invalidateQueries({
queryKey: ['general-cultivation-pests'],
exact: false,
})

toast.success('Praga de cultivo geral removida com sucesso')
} catch {
toast.error('Erro ao remover praga de cultivo geral')
} finally {
closeDeleteGeneralCultivationPestContainer()
}
}, [
closeDeleteGeneralCultivationPestContainer,
mutateHandleDeleteGeneralCultivationPest,
queryClient,
selectedGeneralCultivationPest,
])

return (
<AlertDialog.Root
open={isOpenDeleteGeneralCultivationPestContainer}
onOpenChange={closeDeleteGeneralCultivationPestContainer}
>
<AlertDialog.Content>
<AlertDialog.Header>
<AlertDialog.Title>
{`Deseja remover a praga de cultivo geral ${selectedGeneralCultivationPest?.name}?`}
</AlertDialog.Title>
<AlertDialog.Description>
Não será possível desfazer essa ação!
</AlertDialog.Description>
</AlertDialog.Header>
<AlertDialog.Footer>
<AlertDialog.Cancel>Cancelar</AlertDialog.Cancel>
<AlertDialog.Action onClick={handleDeleteGeneralCultivationPest}>
Remover
</AlertDialog.Action>
</AlertDialog.Footer>
</AlertDialog.Content>
</AlertDialog.Root>
)
}

GeneralCultivationPestDeleteDialog.displayName =
'GeneralCultivationPestDeleteDialog'
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './general-cultivation-pest-delete-dialog'
Loading
Loading