import React, { useEffect, useRef, useState } from "react"; import { useRouter } from "next/router"; import { observer } from "mobx-react-lite"; // hooks import useLocalStorage from "hooks/use-local-storage"; // components import { // ListInlineCreateIssueForm, SpreadsheetAssigneeColumn, SpreadsheetCreatedOnColumn, SpreadsheetDueDateColumn, SpreadsheetEstimateColumn, SpreadsheetIssuesColumn, SpreadsheetLabelColumn, SpreadsheetPriorityColumn, SpreadsheetStartDateColumn, SpreadsheetStateColumn, SpreadsheetUpdatedOnColumn, } from "components/core"; import { CustomMenu, Icon } from "components/ui"; import { IssuePeekOverview } from "components/issues"; import { Spinner } from "@plane/ui"; // types import { IIssue, IIssueDisplayFilterOptions, IIssueDisplayProperties, TIssueOrderByOptions } from "types"; // icon import { CheckIcon, ChevronDownIcon, PlusIcon } from "lucide-react"; type Props = { displayProperties: IIssueDisplayProperties; displayFilters: IIssueDisplayFilterOptions; handleDisplayFilterUpdate: (data: Partial) => void; issues: IIssue[] | undefined; handleIssueAction: (issue: IIssue, action: "copy" | "delete" | "edit") => void; handleUpdateIssue: (issueId: string, data: Partial) => void; openIssuesListModal?: (() => void) | null; disableUserActions: boolean; }; export const SpreadsheetView: React.FC = observer((props) => { const { displayProperties, displayFilters, handleDisplayFilterUpdate, issues, handleIssueAction, handleUpdateIssue, openIssuesListModal, disableUserActions, } = props; const [expandedIssues, setExpandedIssues] = useState([]); const [currentProjectId, setCurrentProjectId] = useState(null); const [isInlineCreateIssueFormOpen, setIsInlineCreateIssueFormOpen] = useState(false); const [isScrolled, setIsScrolled] = useState(false); const containerRef = useRef(null); const router = useRouter(); const { workspaceSlug, cycleId, moduleId } = router.query; const type = cycleId ? "cycle" : moduleId ? "module" : "issue"; const { storedValue: selectedMenuItem, setValue: setSelectedMenuItem } = useLocalStorage( "spreadsheetViewSorting", "" ); const { storedValue: activeSortingProperty, setValue: setActiveSortingProperty } = useLocalStorage( "spreadsheetViewActiveSortingProperty", "" ); const handleOrderBy = (order: TIssueOrderByOptions, itemKey: string) => { handleDisplayFilterUpdate({ order_by: order }); setSelectedMenuItem(`${order}_${itemKey}`); setActiveSortingProperty(order === "-created_at" ? "" : itemKey); }; const renderColumn = ( header: string, propertyName: string, Component: React.ComponentType, ascendingOrder: TIssueOrderByOptions, descendingOrder: TIssueOrderByOptions ) => (
{activeSortingProperty === propertyName && (
)} {header}
} width="xl" > { handleOrderBy(ascendingOrder, propertyName); }} >
{propertyName === "assignee" || propertyName === "labels" ? ( <> A Z ) : propertyName === "due_date" || propertyName === "created_on" || propertyName === "updated_on" ? ( <> New Old ) : ( <> First Last )}
{ handleOrderBy(descendingOrder, propertyName); }} >
{propertyName === "assignee" || propertyName === "labels" ? ( <> Z A ) : propertyName === "due_date" ? ( <> Old New ) : ( <> Last First )}
{selectedMenuItem && selectedMenuItem !== "" && displayFilters?.order_by !== "-created_at" && selectedMenuItem.includes(propertyName) && ( { handleOrderBy("-created_at", propertyName); }} >
Clear sorting
)}
{issues?.map((issue) => ( ))}
); const handleScroll = () => { if (containerRef.current) { const scrollLeft = containerRef.current.scrollLeft; setIsScrolled(scrollLeft > 0); } }; useEffect(() => { const currentContainerRef = containerRef.current; if (currentContainerRef) { currentContainerRef.addEventListener("scroll", handleScroll); } return () => { if (currentContainerRef) { currentContainerRef.removeEventListener("scroll", handleScroll); } }; }, []); return ( <>
{issues ? ( <>
{displayProperties.key && ( ID )} Issue
{issues.map((issue: IIssue, index) => ( ))}
{displayProperties.state && renderColumn("State", "state", SpreadsheetStateColumn, "state__name", "-state__name")} {displayProperties.priority && renderColumn("Priority", "priority", SpreadsheetPriorityColumn, "priority", "-priority")} {displayProperties.assignee && renderColumn( "Assignees", "assignee", SpreadsheetAssigneeColumn, "assignees__first_name", "-assignees__first_name" )} {displayProperties.labels && renderColumn("Label", "labels", SpreadsheetLabelColumn, "labels__name", "-labels__name")} {displayProperties.start_date && renderColumn("Start Date", "start_date", SpreadsheetStartDateColumn, "-start_date", "start_date")} {displayProperties.due_date && renderColumn("Due Date", "due_date", SpreadsheetDueDateColumn, "-target_date", "target_date")} {displayProperties.estimate && renderColumn("Estimate", "estimate", SpreadsheetEstimateColumn, "estimate_point", "-estimate_point")} {displayProperties.created_on && renderColumn("Created On", "created_on", SpreadsheetCreatedOnColumn, "-created_at", "created_at")} {displayProperties.updated_on && renderColumn("Updated On", "updated_on", SpreadsheetUpdatedOnColumn, "-updated_at", "updated_at")} ) : (
)}
{/* setIsInlineCreateIssueFormOpen(false)} prePopulatedData={{ ...(cycleId && { cycle: cycleId.toString() }), ...(moduleId && { module: moduleId.toString() }), }} /> */}
{type === "issue" ? !disableUserActions && !isInlineCreateIssueFormOpen && ( ) : !disableUserActions && !isInlineCreateIssueFormOpen && ( New Issue } optionsClassName="left-5 !w-36" noBorder > setIsInlineCreateIssueFormOpen(true)}> Create new {openIssuesListModal && ( Add an existing issue )} )}
); });