feat: create label option in create issue modal (#281)

This commit is contained in:
Aaryan Khandelwal 2023-02-14 20:05:32 +05:30 committed by GitHub
parent fcba332589
commit 6f0539f01d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 580 additions and 478 deletions

View file

@ -23,20 +23,12 @@ import AppLayout from "layouts/app-layout";
import { IssueViewContextProvider } from "contexts/issue-view.context";
// components
import { ExistingIssuesListModal, IssuesFilterView, IssuesView } from "components/core";
import { CreateUpdateIssueModal } from "components/issues";
import { DeleteModuleModal, ModuleDetailsSidebar } from "components/modules";
import { ModuleDetailsSidebar } from "components/modules";
// ui
import { CustomMenu, EmptySpace, EmptySpaceItem, Spinner } from "components/ui";
import { BreadcrumbItem, Breadcrumbs } from "components/breadcrumbs";
// types
import {
IIssue,
IModule,
ModuleIssueResponse,
SelectIssue,
SelectModuleType,
UserAuth,
} from "types";
import { IModule, ModuleIssueResponse, UserAuth } from "types";
// fetch-keys
import {
@ -47,15 +39,8 @@ import {
} from "constants/fetch-keys";
const SingleModule: React.FC<UserAuth> = (props) => {
const [moduleSidebar, setModuleSidebar] = useState(true);
const [moduleDeleteModal, setModuleDeleteModal] = useState(false);
const [selectedIssues, setSelectedIssues] = useState<SelectIssue>(null);
const [moduleIssuesListModal, setModuleIssuesListModal] = useState(false);
const [createUpdateIssueModal, setCreateUpdateIssueModal] = useState(false);
const [selectedModuleForDelete, setSelectedModuleForDelete] = useState<SelectModuleType>();
const [preloadedData, setPreloadedData] = useState<
(Partial<IIssue> & { actionType: "createIssue" | "edit" | "delete" }) | null
>(null);
const [moduleSidebar, setModuleSidebar] = useState(true);
const router = useRouter();
const { workspaceSlug, projectId, moduleId } = router.query;
@ -119,43 +104,12 @@ const SingleModule: React.FC<UserAuth> = (props) => {
.catch((e) => console.log(e));
};
const openCreateIssueModal = (
issue?: IIssue,
actionType: "create" | "edit" | "delete" = "create"
) => {
if (issue) {
setPreloadedData(null);
setSelectedIssues({ ...issue, actionType });
} else setSelectedIssues(null);
setCreateUpdateIssueModal(true);
};
const openIssuesListModal = () => {
setModuleIssuesListModal(true);
};
const handleDeleteModule = () => {
if (!moduleDetails) return;
setSelectedModuleForDelete({ ...moduleDetails, actionType: "delete" });
setModuleDeleteModal(true);
};
return (
<IssueViewContextProvider>
{moduleId && (
<CreateUpdateIssueModal
isOpen={createUpdateIssueModal && selectedIssues?.actionType !== "delete"}
data={selectedIssues}
prePopulateData={
preloadedData
? { module: moduleId as string, ...preloadedData }
: { module: moduleId as string, ...selectedIssues }
}
handleClose={() => setCreateUpdateIssueModal(false)}
/>
)}
<ExistingIssuesListModal
isOpen={moduleIssuesListModal}
handleClose={() => setModuleIssuesListModal(false)}
@ -163,15 +117,6 @@ const SingleModule: React.FC<UserAuth> = (props) => {
issues={issues?.results.filter((i) => !i.issue_module) ?? []}
handleOnSubmit={handleAddIssuesToModule}
/>
<DeleteModuleModal
isOpen={
moduleDeleteModal &&
!!selectedModuleForDelete &&
selectedModuleForDelete.actionType === "delete"
}
setIsOpen={setModuleDeleteModal}
data={selectedModuleForDelete}
/>
<AppLayout
breadcrumbs={
<Breadcrumbs>
@ -271,7 +216,6 @@ const SingleModule: React.FC<UserAuth> = (props) => {
module={moduleDetails}
isOpen={moduleSidebar}
moduleIssues={moduleIssues}
handleDeleteModule={handleDeleteModule}
/>
</AppLayout>
</IssueViewContextProvider>

View file

@ -3,19 +3,21 @@ import Link from "next/link";
import { useRouter } from "next/router";
import useSWR from "swr";
// icons
import { CubeIcon, PlusIcon } from "@heroicons/react/24/outline";
// lib
import { requiredAuth } from "lib/auth";
// services
import workspaceService from "services/workspace.service";
// hooks
import useUser from "hooks/use-user";
import { requiredAuth } from "lib/auth";
import useToast from "hooks/use-toast";
// layouts
import DefaultLayout from "layouts/default-layout";
// components
import SingleInvitation from "components/workspace/single-invitation";
// ui
import { Button, Spinner, EmptySpace, EmptySpaceItem } from "components/ui";
// icons
import { CubeIcon, PlusIcon } from "@heroicons/react/24/outline";
// types
import type { NextPage, NextPageContext } from "next";
import type { IWorkspaceMemberInvitation } from "types";
@ -27,6 +29,8 @@ const OnBoard: NextPage = () => {
const router = useRouter();
const { setToastAlert } = useToast();
const { data: invitations, mutate: mutateInvitations } = useSWR(
"USER_WORKSPACE_INVITATIONS",
() => workspaceService.userWorkspaceInvitations()
@ -52,6 +56,15 @@ const OnBoard: NextPage = () => {
const submitInvitations = () => {
// userService.updateUserOnBoard();
if (invitationsRespond.length === 0) {
setToastAlert({
type: "error",
title: "Error!",
message: "Please select atleast one invitation.",
});
return;
}
workspaceService
.joinWorkspaces({ invitations: invitationsRespond })
.then(() => {
@ -100,9 +113,13 @@ const OnBoard: NextPage = () => {
))}
</ul>
<div className="mt-6 flex items-center gap-2">
<Button className="w-full" theme="secondary" onClick={() => router.push("/")}>
Skip
</Button>
<Link href="/">
<a className="w-full">
<Button className="w-full" theme="secondary">
Go to Home
</Button>
</a>
</Link>
<Button className="w-full" onClick={submitInvitations}>
Accept and Continue
</Button>
@ -112,26 +129,20 @@ const OnBoard: NextPage = () => {
<div className="mt-3 flex flex-col gap-y-3">
<h2 className="mb-4 text-2xl font-medium">Your workspaces</h2>
{workspaces.map((workspace) => (
<div
className="mb-2 flex items-center justify-between rounded border px-4 py-2"
key={workspace.id}
>
<div className="flex items-center gap-x-2">
<CubeIcon className="h-5 w-5 text-gray-400" />
<Link href={workspace.slug}>
<a>{workspace.name}</a>
</Link>
</div>
<div className="flex items-center gap-x-2">
<p className="text-sm">{workspace.owner.first_name}</p>
</div>
</div>
<Link key={workspace.id} href={workspace.slug}>
<a>
<div className="mb-2 flex items-center justify-between rounded border px-4 py-2">
<div className="flex items-center gap-x-2">
<CubeIcon className="h-5 w-5 text-gray-400" />
{workspace.name}
</div>
<div className="flex items-center gap-x-2">
<p className="text-sm">{workspace.owner.first_name}</p>
</div>
</div>
</a>
</Link>
))}
<Link href="/">
<a>
<Button type="button">Go to workspaces</Button>
</a>
</Link>
</div>
) : (
invitations.length === 0 &&