Requests tab working
This commit is contained in:
@@ -15,16 +15,13 @@ import RevokeRefreshTokenModal from "./modals/RevokeRefreshTokenModal";
|
||||
import RaidGroupAccountAdminButtons from "./RaidGroupAccountAdminButtons";
|
||||
|
||||
|
||||
export interface AccountsListProps {
|
||||
export default function AccountsList({
|
||||
accounts,
|
||||
raidGroup
|
||||
}:{
|
||||
accounts: Account[];
|
||||
raidGroup?: RaidGroup;
|
||||
}
|
||||
|
||||
|
||||
export default function AccountsList(props: AccountsListProps){
|
||||
const { accounts, raidGroup } = props;
|
||||
|
||||
|
||||
}){
|
||||
const [ selectedAccount, setSelectedAccount ] = useState<Account | undefined>(undefined);
|
||||
const [ displayForcePasswordResetModal, setDisplayForcePasswordResetModal ] = useState(false);
|
||||
const [ displayAccountPasswordSetModal, setDisplayAccountPasswordSetModal ] = useState(false);
|
||||
@@ -175,6 +172,7 @@ export default function AccountsList(props: AccountsListProps){
|
||||
display={displayRemoveAccountFromRaidGroupModal}
|
||||
close={() => {setDisplayRemoveAccountFromRaidGroupModal(false); setSelectedAccount(undefined);}}
|
||||
account={selectedAccount}
|
||||
raidGroup={raidGroup}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -51,7 +51,7 @@ export default function RaidGroupAccountsTab({
|
||||
|
||||
</div>
|
||||
<div
|
||||
className="flex flex-row items-center justify-end w-full"
|
||||
className="flex flex-row items-center justify-center w-full"
|
||||
>
|
||||
|
||||
</div>
|
||||
@@ -72,7 +72,7 @@ export default function RaidGroupAccountsTab({
|
||||
<AccountsByRaidGroupLoader
|
||||
page={page}
|
||||
pageSize={pageSize}
|
||||
searchTerm={searchTerm}
|
||||
searchTerm={sentSearchTerm}
|
||||
raidGroup={raidGroup}
|
||||
/>
|
||||
{/* Pagination */}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import DangerButton from "@/components/button/DangerButton";
|
||||
import SecondaryButton from "@/components/button/SecondaryButton";
|
||||
import RaidBuilderModal from "@/components/modal/RaidBuilderModal";
|
||||
import { UseRemoveAccountFromRaidGroup } from "@/hooks/AccountHooks";
|
||||
import { useRemoveAccountFromRaidGroup } from "@/hooks/AccountHooks";
|
||||
import { Account } from "@/interface/Account";
|
||||
import { RaidGroup } from "@/interface/RaidGroup";
|
||||
import { useTimedModal } from "@/providers/TimedModalProvider";
|
||||
@@ -19,7 +19,7 @@ export default function RemoveAccountFromRaidGroupModal({
|
||||
account?: Account;
|
||||
raidGroup?: RaidGroup;
|
||||
}){
|
||||
const removeAccountFromRaidGroupQuery = UseRemoveAccountFromRaidGroup(raidGroup?.raidGroupId ?? "", account?.accountId ?? "");
|
||||
const removeAccountFromRaidGroupQuery = useRemoveAccountFromRaidGroup(raidGroup?.raidGroupId ?? "", account?.accountId ?? "");
|
||||
const { addSuccessMessage, addErrorMessage } = useTimedModal();
|
||||
|
||||
|
||||
|
||||
38
src/ui/raidGroupRequest/RaidGroupRequestButtons.tsx
Normal file
38
src/ui/raidGroupRequest/RaidGroupRequestButtons.tsx
Normal file
@@ -0,0 +1,38 @@
|
||||
import { ButtonProps } from "@/components/button/Button";
|
||||
import DangerButton from "@/components/button/DangerButton";
|
||||
import PrimaryButton from "@/components/button/PrimaryButton";
|
||||
import { BsPencilFill, BsTrash3 } from "react-icons/bs";
|
||||
|
||||
|
||||
export default function RaidGroupRequestButtons({
|
||||
buttonProps,
|
||||
showRaidGroupRequestModal,
|
||||
showDeleteRaidGroupRequestModal
|
||||
}:{
|
||||
buttonProps: ButtonProps;
|
||||
showRaidGroupRequestModal: () => void;
|
||||
showDeleteRaidGroupRequestModal: () => void;
|
||||
}){
|
||||
return (
|
||||
<div
|
||||
className="flex flex-row items-center justify-center w-full gap-2"
|
||||
>
|
||||
<PrimaryButton
|
||||
{...buttonProps}
|
||||
onClick={showRaidGroupRequestModal}
|
||||
>
|
||||
<BsPencilFill
|
||||
size={22}
|
||||
/>
|
||||
</PrimaryButton>
|
||||
<DangerButton
|
||||
{...buttonProps}
|
||||
onClick={showDeleteRaidGroupRequestModal}
|
||||
>
|
||||
<BsTrash3
|
||||
size={22}
|
||||
/>
|
||||
</DangerButton>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
81
src/ui/raidGroupRequest/RaidGroupRequestList.tsx
Normal file
81
src/ui/raidGroupRequest/RaidGroupRequestList.tsx
Normal file
@@ -0,0 +1,81 @@
|
||||
import { ButtonProps } from "@/components/button/Button";
|
||||
import Table from "@/components/table/Table";
|
||||
import { RaidGroup } from "@/interface/RaidGroup";
|
||||
import { RaidGroupRequest } from "@/interface/RaidGroupRequest";
|
||||
import { useState } from "react";
|
||||
import DeleteRaidGroupRequestModal from "./modal/DeleteRaidGroupRequestModal";
|
||||
import RaidGroupRequestModal from "./modal/RaidGroupRequestModal";
|
||||
import RaidGroupRequestButtons from "./RaidGroupRequestButtons";
|
||||
|
||||
|
||||
export default function RaidGroupRequestList({
|
||||
raidGroupRequests,
|
||||
raidGroup
|
||||
}:{
|
||||
raidGroupRequests: RaidGroupRequest[];
|
||||
raidGroup: RaidGroup;
|
||||
}){
|
||||
const [ selectedRequest, setSelectedRequest ] = useState<RaidGroupRequest>();
|
||||
const [ displayRequestModal, setDisplayRequestModal ] = useState(false);
|
||||
const [ displayDeleteRequestModal, setDisplayDeleteRequestModal ] = useState(false);
|
||||
|
||||
|
||||
const buttonProps: ButtonProps = {
|
||||
variant: "ghost",
|
||||
size: "md",
|
||||
shape: "square"
|
||||
};
|
||||
|
||||
|
||||
const headElements: React.ReactNode[] = [
|
||||
<div>
|
||||
Username
|
||||
</div>,
|
||||
<div>
|
||||
Actions
|
||||
</div>
|
||||
];
|
||||
const bodyElements: React.ReactNode[][] = raidGroupRequests.map((request) => [
|
||||
<div>
|
||||
{request.username}
|
||||
</div>,
|
||||
<div
|
||||
className="flex flex-row items-center justify-center gap-2"
|
||||
>
|
||||
<div
|
||||
className="py-4 border-l border-neutral-500"
|
||||
>
|
||||
|
||||
</div>
|
||||
{
|
||||
raidGroup &&
|
||||
<RaidGroupRequestButtons
|
||||
buttonProps={buttonProps}
|
||||
showRaidGroupRequestModal={() => { setSelectedRequest(request); setDisplayRequestModal(true); }}
|
||||
showDeleteRaidGroupRequestModal={() => { setSelectedRequest(request); setDisplayDeleteRequestModal(true); }}
|
||||
/>
|
||||
}
|
||||
</div>
|
||||
]);
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
<Table
|
||||
tableHeadElements={headElements}
|
||||
tableBodyElements={bodyElements}
|
||||
/>
|
||||
<RaidGroupRequestModal
|
||||
display={displayRequestModal}
|
||||
close={() => {setDisplayRequestModal(false); setSelectedRequest(undefined);}}
|
||||
raidGroupRequest={selectedRequest}
|
||||
raidGroupId={raidGroup.raidGroupId ?? ""}
|
||||
/>
|
||||
<DeleteRaidGroupRequestModal
|
||||
display={displayDeleteRequestModal}
|
||||
close={() => {setDisplayDeleteRequestModal(false); setSelectedRequest(undefined);}}
|
||||
raidGroupRequest={selectedRequest}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
10
src/ui/raidGroupRequest/RaidGroupRequestListSkeleton.tsx
Normal file
10
src/ui/raidGroupRequest/RaidGroupRequestListSkeleton.tsx
Normal file
@@ -0,0 +1,10 @@
|
||||
export default function RaidGroupRequestListSkeleton(){
|
||||
//TODO:
|
||||
|
||||
|
||||
return (
|
||||
<div>
|
||||
Raid Group Request List Skeleton
|
||||
</div>
|
||||
);
|
||||
}
|
||||
36
src/ui/raidGroupRequest/RaidGroupRequestLoader.tsx
Normal file
36
src/ui/raidGroupRequest/RaidGroupRequestLoader.tsx
Normal file
@@ -0,0 +1,36 @@
|
||||
import DangerMessage from "@/components/message/DangerMessage";
|
||||
import { useGetRaidGroupRequests } from "@/hooks/RaidGroupRequestHooks";
|
||||
import { RaidGroup } from "@/interface/RaidGroup";
|
||||
import RaidGroupRequestList from "./RaidGroupRequestList";
|
||||
import RaidGroupRequestListSkeleton from "./RaidGroupRequestListSkeleton";
|
||||
|
||||
|
||||
export default function RaidGroupRequestLoader({
|
||||
page,
|
||||
pageSize,
|
||||
searchTerm,
|
||||
raidGroup
|
||||
}:{
|
||||
page: number;
|
||||
pageSize: number;
|
||||
searchTerm?: string;
|
||||
raidGroup: RaidGroup;
|
||||
}){
|
||||
const raidGroupRequestsQuery = useGetRaidGroupRequests(raidGroup.raidGroupId!, page - 1, pageSize, searchTerm);
|
||||
|
||||
|
||||
if(raidGroupRequestsQuery.status === "pending"){
|
||||
return <RaidGroupRequestListSkeleton/>
|
||||
}
|
||||
else if(raidGroupRequestsQuery.status === "error"){
|
||||
return <DangerMessage>Error: {raidGroupRequestsQuery.error.message}</DangerMessage>
|
||||
}
|
||||
else{
|
||||
return (
|
||||
<RaidGroupRequestList
|
||||
raidGroupRequests={raidGroupRequestsQuery.data ?? []}
|
||||
raidGroup={raidGroup}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
89
src/ui/raidGroupRequest/RaidGroupRequestTab.tsx
Normal file
89
src/ui/raidGroupRequest/RaidGroupRequestTab.tsx
Normal file
@@ -0,0 +1,89 @@
|
||||
import TextInput from "@/components/input/TextInput";
|
||||
import Pagination from "@/components/pagination/Pagination";
|
||||
import { useGetRaidGroupRequestCount } from "@/hooks/RaidGroupRequestHooks";
|
||||
import { RaidGroup } from "@/interface/RaidGroup";
|
||||
import { useEffect, useState } from "react";
|
||||
import { useDebouncedCallback } from "use-debounce";
|
||||
import RaidGroupRequestLoader from "./RaidGroupRequestLoader";
|
||||
|
||||
|
||||
export default function RaidGroupRequestTab({
|
||||
raidGroup
|
||||
}:{
|
||||
raidGroup: RaidGroup;
|
||||
}){
|
||||
const [ page, setPage ] = useState(1);
|
||||
const [ totalPages, setTotalPages ] = useState(1);
|
||||
const [ searchTerm, setSearchTerm ] = useState("");
|
||||
const [ sentSearchTerm, setSentSearchTerm ] = useState<string>();
|
||||
const pageSize = 10;
|
||||
const modalId = crypto.randomUUID().replaceAll("-", "");
|
||||
|
||||
|
||||
const raidGroupRequestsCountQuery = useGetRaidGroupRequestCount(raidGroup.raidGroupId);
|
||||
|
||||
const updateSearchTerm = useDebouncedCallback((newSearchTerm: string) => {
|
||||
setSentSearchTerm(newSearchTerm.length ? newSearchTerm : undefined);
|
||||
}, 1000);
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
updateSearchTerm(searchTerm ?? "");
|
||||
}, [ searchTerm, updateSearchTerm ]);
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
if(raidGroupRequestsCountQuery.status === "success"){
|
||||
setTotalPages(Math.ceil(raidGroupRequestsCountQuery.data / pageSize));
|
||||
}
|
||||
}, [ raidGroupRequestsCountQuery ]);
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
<div
|
||||
className="flex flex-row items-center justify-between w-full"
|
||||
>
|
||||
<div
|
||||
className="flex flex-row items-center justify-start w-full"
|
||||
>
|
||||
|
||||
</div>
|
||||
<div
|
||||
className="flex flex-row items-center justify-center w-full"
|
||||
>
|
||||
|
||||
</div>
|
||||
<div
|
||||
className="flex flex-row items-center justify-end w-full"
|
||||
>
|
||||
<div>
|
||||
<TextInput
|
||||
id={`accountSearchBox${modalId}`}
|
||||
value={searchTerm}
|
||||
onChange={(e) => setSearchTerm(e.target.value)}
|
||||
placeholder="Search"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/* Requests List */}
|
||||
<RaidGroupRequestLoader
|
||||
page={page}
|
||||
pageSize={pageSize}
|
||||
searchTerm={sentSearchTerm}
|
||||
raidGroup={raidGroup}
|
||||
/>
|
||||
{/* Pagination */}
|
||||
<div
|
||||
className="my-12"
|
||||
>
|
||||
<Pagination
|
||||
currentPage={page}
|
||||
totalPages={totalPages}
|
||||
onChange={setPage}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
import DangerButton from "@/components/button/DangerButton";
|
||||
import SecondaryButton from "@/components/button/SecondaryButton";
|
||||
import RaidBuilderModal from "@/components/modal/RaidBuilderModal";
|
||||
import { useDeleteRaidGroupRequest } from "@/hooks/RaidGroupRequestHooks";
|
||||
import { RaidGroupRequest } from "@/interface/RaidGroupRequest";
|
||||
import { useTimedModal } from "@/providers/TimedModalProvider";
|
||||
import { useEffect } from "react";
|
||||
|
||||
|
||||
export default function DeleteRaidGroupRequestModal({
|
||||
display,
|
||||
close,
|
||||
raidGroupRequest
|
||||
}:{
|
||||
display: boolean;
|
||||
close: () => void;
|
||||
raidGroupRequest?: RaidGroupRequest;
|
||||
}){
|
||||
const deleteRaidGroupRequestMutate = useDeleteRaidGroupRequest(raidGroupRequest?.raidGroupId ?? "", raidGroupRequest?.raidGroupRequestId ?? "");
|
||||
const { addSuccessMessage, addErrorMessage } = useTimedModal();
|
||||
|
||||
|
||||
const deleteRaidGroupRequest = () => {
|
||||
deleteRaidGroupRequestMutate.mutate();
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if(deleteRaidGroupRequestMutate.status === "success"){
|
||||
deleteRaidGroupRequestMutate.reset();
|
||||
addSuccessMessage("Raid Group Request deleted successfully");
|
||||
close();
|
||||
}
|
||||
else if(deleteRaidGroupRequestMutate.status === "error"){
|
||||
deleteRaidGroupRequestMutate.reset();
|
||||
addErrorMessage(`Error deleting Raid Group Request: ${deleteRaidGroupRequestMutate.error.message}`);
|
||||
console.log(deleteRaidGroupRequestMutate.error);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
return(
|
||||
<RaidBuilderModal
|
||||
display={display}
|
||||
close={close}
|
||||
modalHeader="Delete Raid Group Request"
|
||||
modalBody={`Are you sure you want to delete the request from ${raidGroupRequest?.username}?`}
|
||||
modalFooter={
|
||||
<>
|
||||
<DangerButton
|
||||
onClick={deleteRaidGroupRequest}
|
||||
>
|
||||
Delete
|
||||
</DangerButton>
|
||||
<SecondaryButton
|
||||
onClick={close}
|
||||
>
|
||||
Cancel
|
||||
</SecondaryButton>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
);
|
||||
}
|
||||
127
src/ui/raidGroupRequest/modal/RaidGroupRequestModal.tsx
Normal file
127
src/ui/raidGroupRequest/modal/RaidGroupRequestModal.tsx
Normal file
@@ -0,0 +1,127 @@
|
||||
import PrimaryButton from "@/components/button/PrimaryButton";
|
||||
import SecondaryButton from "@/components/button/SecondaryButton";
|
||||
import TextInput from "@/components/input/TextInput";
|
||||
import RaidBuilderModal from "@/components/modal/RaidBuilderModal";
|
||||
import RaidGroupPermissionSelector from "@/components/raidGroup/RaidGroupPermissionSelector";
|
||||
import { useCreateRaidGroupRequest, useResolveRaidGroupRequest } from "@/hooks/RaidGroupRequestHooks";
|
||||
import { Account } from "@/interface/Account";
|
||||
import { RaidGroupPermissionType } from "@/interface/RaidGroup";
|
||||
import { RaidGroupRequest } from "@/interface/RaidGroupRequest";
|
||||
import { useTimedModal } from "@/providers/TimedModalProvider";
|
||||
import { useEffect, useState } from "react";
|
||||
|
||||
|
||||
export default function RaidGroupRequestModal({
|
||||
display,
|
||||
close,
|
||||
raidGroupId,
|
||||
raidGroupRequest,
|
||||
account
|
||||
}:{
|
||||
display: boolean;
|
||||
close: () => void;
|
||||
raidGroupId: string;
|
||||
raidGroupRequest?: RaidGroupRequest;
|
||||
account?: Account;
|
||||
}){
|
||||
const [ currentPermission, setCurrentPermission ] = useState(RaidGroupPermissionType.RAIDER);
|
||||
const [ requestMessage, setRequestMessage ] = useState(raidGroupRequest?.requestMessage ?? "");
|
||||
const modalId = crypto.randomUUID().replaceAll("-", "");
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
setCurrentPermission(RaidGroupPermissionType.RAIDER);
|
||||
setRequestMessage(raidGroupRequest?.requestMessage ?? "");
|
||||
}, [ display, raidGroupRequest ]);
|
||||
|
||||
|
||||
const createRaidGroupRequestMutate = useCreateRaidGroupRequest(raidGroupId);
|
||||
const resolveRaidGroupRequestMutate = useResolveRaidGroupRequest(raidGroupId, raidGroupRequest?.raidGroupRequestId ?? "");
|
||||
const { addSuccessMessage, addErrorMessage } = useTimedModal();
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
if(createRaidGroupRequestMutate.status === "success"){
|
||||
createRaidGroupRequestMutate.reset();
|
||||
addSuccessMessage("Raid Group Request Created");
|
||||
close();
|
||||
}
|
||||
else if(createRaidGroupRequestMutate.status === "error"){
|
||||
createRaidGroupRequestMutate.reset();
|
||||
addErrorMessage(`Error creating raid group request: ${createRaidGroupRequestMutate.error.message}`);
|
||||
console.log(createRaidGroupRequestMutate.error);
|
||||
}
|
||||
else if(resolveRaidGroupRequestMutate.status === "success"){
|
||||
resolveRaidGroupRequestMutate.reset();
|
||||
addSuccessMessage("Raid Group Request Resolved");
|
||||
close();
|
||||
}
|
||||
else if(resolveRaidGroupRequestMutate.status === "error"){
|
||||
resolveRaidGroupRequestMutate.reset();
|
||||
addErrorMessage(`Error resolving raid group request: ${resolveRaidGroupRequestMutate.error.message}`);
|
||||
console.log(resolveRaidGroupRequestMutate.error);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const createRaidGroupRequest = () => {
|
||||
createRaidGroupRequestMutate.mutate(requestMessage);
|
||||
}
|
||||
|
||||
const resolveRaidGroupRequest = () => {
|
||||
resolveRaidGroupRequestMutate.mutate(currentPermission);
|
||||
}
|
||||
|
||||
|
||||
return (
|
||||
<RaidBuilderModal
|
||||
display={display}
|
||||
close={close}
|
||||
modalHeader="Raid Group Request"
|
||||
modalBody={
|
||||
<div
|
||||
className="flex flex-col items-center justify-center gap-4"
|
||||
>
|
||||
<div>
|
||||
{
|
||||
raidGroupRequest &&
|
||||
raidGroupRequest?.username
|
||||
}
|
||||
{
|
||||
account &&
|
||||
account?.username
|
||||
}
|
||||
</div>
|
||||
<TextInput
|
||||
id={`raidGroupRequestModalMessageInput${modalId}`}
|
||||
value={requestMessage}
|
||||
onChange={(e) => setRequestMessage(e.target.value)}
|
||||
placeholder="Message"
|
||||
disabled={!!raidGroupRequest}
|
||||
/>
|
||||
{
|
||||
raidGroupRequest &&
|
||||
<RaidGroupPermissionSelector
|
||||
value={currentPermission}
|
||||
onChange={(e) => setCurrentPermission(e.target.value as RaidGroupPermissionType)}
|
||||
/>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
modalFooter={
|
||||
<>
|
||||
<PrimaryButton
|
||||
onClick={raidGroupRequest ? resolveRaidGroupRequest : createRaidGroupRequest}
|
||||
>
|
||||
{raidGroupRequest ? "Resolve" : "Request"}
|
||||
</PrimaryButton>
|
||||
<SecondaryButton
|
||||
onClick={close}
|
||||
>
|
||||
Cancel
|
||||
</SecondaryButton>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -38,22 +38,17 @@ export default function RaidLayoutModal({
|
||||
}, [ raidLayout, selectedClassGroups ]);
|
||||
|
||||
const updateRaidLayoutSize = (newLayoutSize: number) => {
|
||||
console.log("newLayoutSize = " + newLayoutSize + ", " + classGroups.length);
|
||||
setRaidLayoutSize(newLayoutSize);
|
||||
if(newLayoutSize < classGroups.length){
|
||||
console.log("Removing");
|
||||
setClassGroups(classGroups.slice(0, newLayoutSize));
|
||||
}
|
||||
else if(newLayoutSize > classGroups.length){
|
||||
console.log("Adding");
|
||||
setClassGroups([
|
||||
...classGroups,
|
||||
null
|
||||
]);
|
||||
}
|
||||
}
|
||||
console.log("classGroups");
|
||||
console.log(classGroups);
|
||||
|
||||
|
||||
const createRaidLayoutMutate = useCreateRaidLayout(raidGroup.raidGroupId ?? "");
|
||||
|
||||
Reference in New Issue
Block a user