// react import React, { useState } from "react"; // next import { useRouter } from "next/router"; // swr import useSWR, { mutate } from "swr"; // services import modulesService from "lib/services/modules.service"; import projectService from "lib/services/project.service"; import issuesService from "lib/services/issues.service"; // hooks import useUser from "lib/hooks/useUser"; import useIssuesFilter from "lib/hooks/useIssuesFilter"; import useIssuesProperties from "lib/hooks/useIssuesProperties"; // layouts import AppLayout from "layouts/app-layout"; // components import ExistingIssuesListModal from "components/common/existing-issues-list-modal"; import ModulesBoardView from "components/project/modules/board-view"; import ModulesListView from "components/project/modules/list-view"; import ConfirmIssueDeletion from "components/project/issues/confirm-issue-deletion"; import ModuleDetailSidebar from "components/project/modules/module-detail-sidebar"; import ConfirmModuleDeletion from "components/project/modules/confirm-module-deleteion"; // headless ui import { Popover, Transition } from "@headlessui/react"; // ui import { BreadcrumbItem, Breadcrumbs, CustomMenu } from "ui"; // icons import { ArrowLeftIcon, ArrowPathIcon, ChevronDownIcon, ListBulletIcon, } from "@heroicons/react/24/outline"; import { Squares2X2Icon } from "@heroicons/react/20/solid"; // types import { IIssue, IModule, ModuleIssueResponse, Properties, SelectModuleType } from "types"; // fetch-keys import { MODULE_DETAIL, MODULE_ISSUES, PROJECT_MEMBERS } from "constants/fetch-keys"; // common import { classNames, replaceUnderscoreIfSnakeCase } from "constants/common"; // constants import { filterIssueOptions, groupByOptions, orderByOptions } from "constants/"; const SingleModule = () => { const [moduleIssuesListModal, setModuleIssuesListModal] = useState(false); const [deleteIssue, setDeleteIssue] = useState(undefined); const [moduleSidebar, setModuleSidebar] = useState(false); const [moduleDeleteModal, setModuleDeleteModal] = useState(false); const [selectedModuleForDelete, setSelectedModuleForDelete] = useState(); const [preloadedData, setPreloadedData] = useState< (Partial & { actionType: "createIssue" | "edit" | "delete" }) | undefined >(undefined); const { activeWorkspace, activeProject, issues, modules } = useUser(); const router = useRouter(); const { moduleId } = router.query; const [properties, setProperties] = useIssuesProperties( activeWorkspace?.slug, activeProject?.id as string ); const { data: moduleIssues } = useSWR( activeWorkspace && activeProject && moduleId ? MODULE_ISSUES(moduleId as string) : null, activeWorkspace && activeProject && moduleId ? () => modulesService.getModuleIssues( activeWorkspace?.slug, activeProject?.id, moduleId as string ) : null ); const moduleIssuesArray = moduleIssues?.map((issue) => { return { bridge: issue.id, ...issue.issue_detail }; }); const { data: moduleDetail } = useSWR( MODULE_DETAIL, activeWorkspace && activeProject && moduleId ? () => modulesService.getModuleDetails( activeWorkspace?.slug, activeProject?.id, moduleId as string ) : null ); const { issueView, groupByProperty, setGroupByProperty, groupedByIssues, setOrderBy, setFilterIssue, orderBy, filterIssue, setIssueViewToKanban, setIssueViewToList, } = useIssuesFilter(moduleIssuesArray ?? []); const { data: members } = useSWR( activeWorkspace && activeProject ? PROJECT_MEMBERS(activeProject.id) : null, activeWorkspace && activeProject ? () => projectService.projectMembers(activeWorkspace.slug, activeProject.id) : null, { onErrorRetry(err, _, __, revalidate, revalidateOpts) { if (err?.status === 403) return; setTimeout(() => revalidate(revalidateOpts), 5000); }, } ); const handleAddIssuesToModule = (data: { issues: string[] }) => { if (activeWorkspace && activeProject) { modulesService .addIssuesToModule(activeWorkspace.slug, activeProject.id, moduleId as string, data) .then((res) => { console.log(res); }) .catch((e) => console.log(e)); } }; const partialUpdateIssue = (formData: Partial, issueId: string) => { if (!activeWorkspace || !activeProject) return; issuesService .patchIssue(activeWorkspace.slug, activeProject.id, issueId, formData) .then((response) => { mutate(MODULE_ISSUES(moduleId as string)); }) .catch((error) => { console.log(error); }); }; const openCreateIssueModal = () => {}; const openIssuesListModal = () => { setModuleIssuesListModal(true); }; const removeIssueFromModule = (issueId: string) => { if (!activeWorkspace || !activeProject) return; modulesService .removeIssueFromModule(activeWorkspace.slug, activeProject.id, moduleId as string, issueId) .then((res) => { console.log(res); mutate(MODULE_ISSUES(moduleId as string)); }) .catch((e) => { console.log(e); }); }; const handleDeleteModule = () => { if (!moduleDetail) return; setSelectedModuleForDelete({ ...moduleDetail, actionType: "delete" }); setModuleDeleteModal(true); }; return ( <> setModuleIssuesListModal(false)} type="module" issues={issues?.results ?? []} handleOnSubmit={handleAddIssuesToModule} /> setDeleteIssue(undefined)} isOpen={!!deleteIssue} data={issues?.results.find((issue) => issue.id === deleteIssue)} /> } left={ {modules?.find((c) => c.id === moduleId)?.name} } className="ml-1.5" width="auto" > {modules?.map((module) => ( {module.name} ))} } right={
{({ open }) => ( <> View

Group by

option.key === groupByProperty) ?.name ?? "Select" } width="auto" > {groupByOptions.map((option) => ( setGroupByProperty(option.key)} > {option.name} ))}

Order by

option.key === orderBy)?.name ?? "Select" } width="auto" > {orderByOptions.map((option) => groupByProperty === "priority" && option.key === "priority" ? null : ( setOrderBy(option.key)} > {option.name} ) )}

Issue type

option.key === filterIssue) ?.name ?? "Select" } width="auto" > {filterIssueOptions.map((option) => ( setFilterIssue(option.key)} > {option.name} ))}

Properties

{Object.keys(properties).map((key) => ( ))}
)}
} >
{issueView === "list" ? ( ) : ( )}
); }; export default SingleModule;