Skip to content

Commit

Permalink
added referrals
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewbilham committed Jun 19, 2024
1 parent 50ec7ad commit 4cef3c3
Show file tree
Hide file tree
Showing 10 changed files with 386 additions and 7 deletions.
3 changes: 2 additions & 1 deletion backend/app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class UpdatePassword(SQLModel):
class User(UserBase, table=True):
id: int | None = Field(default=None, primary_key=True)
hashed_password: str
source_id: int | None = Field(default=None, foreign_key="source.id", nullable=True)
created_datetime: datetime | None = Field(
default=None,
sa_type= sa.DateTime(timezone=True),
Expand Down Expand Up @@ -562,7 +563,7 @@ class Referral(ReferralBase, table=True):
sa_column_kwargs={"onupdate": sa.func.now(), "server_default": sa.func.now()},
)
source_id: int | None = Field(default=None, foreign_key="source.id", nullable=False)
##source: Source | None = Relationship(back_populates="referrals")
source: Source | None = Relationship(back_populates="referrals")
claim_id: int | None = Field(default=None, foreign_key="claim.id", nullable=False)
##claim: Claim | None = Relationship(back_populates="referrals")
supplier_id: int | None = Field(default=None, foreign_key="supplier.id", nullable=True)
Expand Down
11 changes: 9 additions & 2 deletions frontend/src/components/Common/ActionsMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,19 @@ import {
import { BsThreeDotsVertical } from "react-icons/bs"
import { FiEdit, FiTrash } from "react-icons/fi"

import type { ItemPublic, UserPublic, SourcePublic, ClaimPublic } from "../../client"
import type { ItemPublic, UserPublic, SourcePublic, ClaimPublic, ReferralPublic} from "../../client"
import EditUser from "../Admin/EditUser"
import EditItem from "../Items/EditItem"
import EditSource from "../Sources/EditSource"
import EditClaim from "../Claims/EditClaim"
import EditReferral from "../Referrals/EditReferral"
import Delete from "./DeleteAlert"



interface ActionsMenuProps {
type: string
value: ItemPublic | UserPublic | SourcePublic | ClaimPublic
value: ItemPublic | UserPublic | SourcePublic | ClaimPublic | ReferralPublic
disabled?: boolean
}

Expand Down Expand Up @@ -73,6 +74,12 @@ const ActionsMenu = ({ type, value, disabled }: ActionsMenuProps) => {
isOpen={editUserModal.isOpen}
onClose={editUserModal.onClose}
/>
) : type === "Referral" ? (
<EditReferral
referral={value as ReferralPublic}
isOpen={editUserModal.isOpen}
onClose={editUserModal.onClose}
/>
) :
<EditClaim
claim={value as ClaimPublic}
Expand Down
12 changes: 11 additions & 1 deletion frontend/src/components/Common/Navbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import { FaPlus } from "react-icons/fa"
import AddUser from "../Admin/AddUser"
import AddItem from "../Items/AddItem"
import AddSource from "../Sources/AddSource"
import AddClaim from "../Claims/AddClaim"
import AddReferral from "../Referrals/AddReferral"

interface NavbarProps {
type: string
Expand All @@ -13,6 +15,8 @@ const Navbar = ({ type }: NavbarProps) => {
const addUserModal = useDisclosure()
const addItemModal = useDisclosure()
const addSourceModal = useDisclosure()
const addClaimModal = useDisclosure()
const addReferralModal = useDisclosure()

return (
<>
Expand All @@ -28,13 +32,19 @@ const Navbar = ({ type }: NavbarProps) => {
variant="primary"
gap={1}
fontSize={{ base: "sm", md: "inherit" }}
onClick={type === "User" ? addUserModal.onOpen : type === "Item" ? addItemModal.onOpen : addSourceModal.onOpen}
onClick={type === "User" ? addUserModal.onOpen
: type === "Item" ? addItemModal.onOpen
: type === "Source" ? addSourceModal.onOpen
: type === "Referral" ? addReferralModal.onOpen
: addClaimModal.onOpen}
>
<Icon as={FaPlus} /> Add {type}
</Button>
<AddUser isOpen={addUserModal.isOpen} onClose={addUserModal.onClose} />
<AddItem isOpen={addItemModal.isOpen} onClose={addItemModal.onClose} />
<AddSource isOpen={addSourceModal.isOpen} onClose={addSourceModal.onClose} />
<AddClaim isOpen={addClaimModal.isOpen} onClose={addClaimModal.onClose} />
<AddReferral isOpen={addReferralModal.isOpen} onClose={addReferralModal.onClose} />
</Flex>
</>
)
Expand Down
1 change: 1 addition & 0 deletions frontend/src/components/Common/SidebarItems.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ const items = [
{ icon: FiBriefcase, title: "Items", path: "/items" },
{ icon: FiBriefcase, title: "Sources", path: "/sources" },
{ icon: FiBriefcase, title: "Claims", path: "/claims" },
{ icon: FiBriefcase, title: "Referrals", path: "/referrals" },
{ icon: FiSettings, title: "User Settings", path: "/settings" },
]

Expand Down
114 changes: 114 additions & 0 deletions frontend/src/components/Referrals/AddReferral.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import {
Button,
FormControl,
FormErrorMessage,
FormLabel,
Input,
Modal,
ModalBody,
ModalCloseButton,
ModalContent,
ModalFooter,
ModalHeader,
ModalOverlay,
} from "@chakra-ui/react"
import { useMutation, useQueryClient } from "@tanstack/react-query"
import { type SubmitHandler, useForm } from "react-hook-form"

import { type ApiError, type ReferralCreate, ReferralsService } from "../../client"
import useCustomToast from "../../hooks/useCustomToast"

interface AddReferralProps {
isOpen: boolean
onClose: () => void
}

const AddReferral = ({ isOpen, onClose }: AddReferralProps) => {
const queryClient = useQueryClient()
const showToast = useCustomToast()
const {
register,
handleSubmit,
reset,
formState: { errors, isSubmitting },
} = useForm<ReferralCreate>({
mode: "onBlur",
criteriaMode: "all",
defaultValues: {
//claim_id: ,
//description: "",
},
})

const mutation = useMutation({
mutationFn: (data: ReferralCreate) =>
ReferralsService.createReferral({ requestBody: data }),
onSuccess: () => {
showToast("Success!", "Referral created successfully.", "success")
reset()
onClose()
},
onError: (err: ApiError) => {
const errDetail = (err.body as any)?.detail
showToast("Something went wrong.", `${errDetail}`, "error")
},
onSettled: () => {
queryClient.invalidateQueries({ queryKey: ["referrals"] })
},
})

const onSubmit: SubmitHandler<ReferralCreate> = (data) => {
mutation.mutate(data)
}

return (
<>
<Modal
isOpen={isOpen}
onClose={onClose}
size={{ base: "sm", md: "md" }}
isCentered
>
<ModalOverlay />
<ModalContent as="form" onSubmit={handleSubmit(onSubmit)}>
<ModalHeader>Add Referral</ModalHeader>
<ModalCloseButton />
<ModalBody pb={6}>
<FormControl isRequired isInvalid={!!errors.source_id}>
<FormLabel htmlFor="source_id">Source ID</FormLabel>
<Input
id="source_id"
{...register("source_id", {
required: "Source ID is required.",
})}
placeholder="Source ID"
type="text"
/>
{errors.source_id && (
<FormErrorMessage>{errors.source_id.message}</FormErrorMessage>
)}
</FormControl>
{/* <FormControl mt={4}>
<FormLabel htmlFor="description">Description</FormLabel>
<Input
id="description"
{...register("description")}
placeholder="Description"
type="text"
/>
</FormControl> */}
</ModalBody>

<ModalFooter gap={3}>
<Button variant="primary" type="submit" isLoading={isSubmitting}>
Save
</Button>
<Button onClick={onClose}>Cancel</Button>
</ModalFooter>
</ModalContent>
</Modal>
</>
)
}

export default AddReferral
124 changes: 124 additions & 0 deletions frontend/src/components/Referrals/EditReferral.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
import {
Button,
FormControl,
FormErrorMessage,
FormLabel,
Input,
Modal,
ModalBody,
ModalCloseButton,
ModalContent,
ModalFooter,
ModalHeader,
ModalOverlay,
} from "@chakra-ui/react"
import { useMutation, useQueryClient } from "@tanstack/react-query"
import { type SubmitHandler, useForm } from "react-hook-form"

import {
type ApiError,
type ReferralPublic,
type ReferralUpdate,
ReferralsService,
} from "../../client"
import useCustomToast from "../../hooks/useCustomToast"

interface EditReferralProps {
referral: ReferralPublic
isOpen: boolean
onClose: () => void
}

const EditReferral = ({ referral, isOpen, onClose }: EditReferralProps) => {
const queryClient = useQueryClient()
const showToast = useCustomToast()
const {
register,
handleSubmit,
reset,
formState: { isSubmitting, errors, isDirty },
} = useForm<ReferralUpdate>({
mode: "onBlur",
criteriaMode: "all",
defaultValues: referral,
})

const mutation = useMutation({
mutationFn: (data: ReferralUpdate) =>
ReferralsService.updateReferral({ id: referral.id, requestBody: data }),
onSuccess: () => {
showToast("Success!", "Referral updated successfully.", "success")
onClose()
},
onError: (err: ApiError) => {
const errDetail = (err.body as any)?.detail
showToast("Something went wrong.", `${errDetail}`, "error")
},
onSettled: () => {
queryClient.invalidateQueries({ queryKey: ["referrals"] })
},
})

const onSubmit: SubmitHandler<ReferralUpdate> = async (data) => {
mutation.mutate(data)
}

const onCancel = () => {
reset()
onClose()
}

return (
<>
<Modal
isOpen={isOpen}
onClose={onClose}
size={{ base: "sm", md: "md" }}
isCentered
>
<ModalOverlay />
<ModalContent as="form" onSubmit={handleSubmit(onSubmit)}>
<ModalHeader>Edit Referral</ModalHeader>
<ModalCloseButton />
<ModalBody pb={6}>
<FormControl isInvalid={!!errors.source_id}>
<FormLabel htmlFor="source_id">Source ID</FormLabel>
<Input
id="source_id"
{...register("source_id", {
required: "Source ID is required",
})}
type="text"
/>
{errors.source_id && (
<FormErrorMessage>{errors.source_id.message}</FormErrorMessage>
)}
</FormControl>
{/* <FormControl mt={4}>
<FormLabel htmlFor="description">Description</FormLabel>
<Input
id="description"
{...register("description")}
placeholder="Description"
type="text"
/>
</FormControl> */}
</ModalBody>
<ModalFooter gap={3}>
<Button
variant="primary"
type="submit"
isLoading={isSubmitting}
isDisabled={!isDirty}
>
Save
</Button>
<Button onClick={onCancel}>Cancel</Button>
</ModalFooter>
</ModalContent>
</Modal>
</>
)
}

export default EditReferral
11 changes: 11 additions & 0 deletions frontend/src/routeTree.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import { Route as LayoutImport } from './routes/_layout'
import { Route as LayoutIndexImport } from './routes/_layout/index'
import { Route as LayoutSourcesImport } from './routes/_layout/sources'
import { Route as LayoutSettingsImport } from './routes/_layout/settings'
import { Route as LayoutReferralsImport } from './routes/_layout/referrals'
import { Route as LayoutItemsImport } from './routes/_layout/items'
import { Route as LayoutClaimsImport } from './routes/_layout/claims'
import { Route as LayoutAdminImport } from './routes/_layout/admin'
Expand Down Expand Up @@ -59,6 +60,11 @@ const LayoutSettingsRoute = LayoutSettingsImport.update({
getParentRoute: () => LayoutRoute,
} as any)

const LayoutReferralsRoute = LayoutReferralsImport.update({
path: '/referrals',
getParentRoute: () => LayoutRoute,
} as any)

const LayoutItemsRoute = LayoutItemsImport.update({
path: '/items',
getParentRoute: () => LayoutRoute,
Expand Down Expand Up @@ -106,6 +112,10 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof LayoutItemsImport
parentRoute: typeof LayoutImport
}
'/_layout/referrals': {
preLoaderRoute: typeof LayoutReferralsImport
parentRoute: typeof LayoutImport
}
'/_layout/settings': {
preLoaderRoute: typeof LayoutSettingsImport
parentRoute: typeof LayoutImport
Expand All @@ -128,6 +138,7 @@ export const routeTree = rootRoute.addChildren([
LayoutAdminRoute,
LayoutClaimsRoute,
LayoutItemsRoute,
LayoutReferralsRoute,
LayoutSettingsRoute,
LayoutSourcesRoute,
LayoutIndexRoute,
Expand Down
6 changes: 4 additions & 2 deletions frontend/src/routes/_layout/claims.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ function ClaimsTableBody() {
<Td color={!claim.client_lastname ? "ui.dim" : "inherit"}>
{claim.client_lastname || "N/A"}
</Td>

<Td>
<ActionsMenu type={"Claim"} value={claim} />
</Td>
Expand All @@ -54,8 +55,9 @@ function ClaimsTable() {
<Thead>
<Tr>
<Th>ID</Th>
<Th>Title</Th>
<Th>Description</Th>
<Th>First Name</Th>
<Th>Last Name</Th>

<Th>Actions</Th>
</Tr>
</Thead>
Expand Down
Loading

0 comments on commit 4cef3c3

Please sign in to comment.