Files
plane/web/ee/components/projects/root.tsx
Ketan Sharma f387fc1241 [WEB-2484] fix: workspace projects with grouping bugs (#1526)
* Fix on hover problem and add header

* made progress

* fix header done

* fix cleanup code

* fix remove unnexessary file

* fix remove archive from header

* add seperate local storage for archives

* fix related bugs

* code cleanup

* code cleanup

* fix archive colour and no of projects listed

* code cleanup

* made recommended changes
2024-10-24 19:12:57 +05:30

108 lines
3.5 KiB
TypeScript

"use client";
import { FC, useCallback, useEffect } from "react";
import { observer } from "mobx-react";
// plane web components
import { usePathname, useSearchParams } from "next/navigation";
import { useProject } from "@/hooks/store";
import { ProjectLayoutRoot } from "@/plane-web/components/projects";
// plane web hooks
import { useProjectFilter } from "@/plane-web/hooks/store";
import {
EProjectFilters,
EProjectScope,
TProjectFilters,
TProjectAttributes,
} from "@/plane-web/types/workspace-project-filters";
import { ProjectAppliedFiltersList } from "./applied-filters";
type TWorkspaceProjectsRoot = {
workspaceSlug: string;
workspaceId: string;
isArchived?: boolean;
};
export const WorkspaceProjectsRoot: FC<TWorkspaceProjectsRoot> = observer((props) => {
const { workspaceSlug, isArchived = false } = props;
//pathname
const pathname = usePathname();
// hooks
const {
initWorkspaceFilters,
appliedAttributesCount,
filters,
filteredProjectIds,
clearAllFilters,
updateAttributes,
scopeProjectsCount,
} = useProjectFilter();
const searchParams = useSearchParams();
const showAllProjects = searchParams.get("show-all-projects");
const { loader } = useProject();
// derived values
const selectedScope = filters?.scope;
const selectedScopeCount = selectedScope && scopeProjectsCount?.[selectedScope];
const allProjectCount = scopeProjectsCount[EProjectScope.ALL_PROJECTS];
useEffect(() => {
if (workspaceSlug) {
let filtersToInit = [EProjectFilters.LAYOUT, EProjectFilters.ATTRIBUTES, EProjectFilters.DISPLAY_FILTERS];
filtersToInit = loader ? filtersToInit : [EProjectFilters.SCOPE, ...filtersToInit];
initWorkspaceFilters(
workspaceSlug,
typeof showAllProjects === "string"
? showAllProjects === "true"
? EProjectScope.ALL_PROJECTS
: EProjectScope.MY_PROJECTS
: undefined,
filtersToInit,
isArchived
);
}
}, [workspaceSlug, initWorkspaceFilters, pathname, showAllProjects, loader, isArchived]);
const handleClearAllFilters = useCallback(() => {
if (!workspaceSlug) return;
clearAllFilters(workspaceSlug, isArchived);
}, [clearAllFilters, isArchived, workspaceSlug]);
// TProjectAttributes has arrays of different types, value is an element of that array
const handleRemoveFilter = useCallback(
<T extends keyof TProjectAttributes>(key: T, value: any) => {
if (!workspaceSlug || !filters) return;
if (!value) {
updateAttributes(workspaceSlug, key, [] as unknown as TProjectAttributes[T], isArchived);
return;
}
let newValues = filters.attributes[key];
if (Array.isArray(newValues)) {
newValues = newValues.filter((val) => val !== value) as TProjectAttributes[T];
updateAttributes(workspaceSlug, key, newValues, isArchived);
} else if (typeof value === "boolean") {
updateAttributes(workspaceSlug, "archived", !value, isArchived);
}
},
[filters, isArchived, updateAttributes, workspaceSlug]
);
return (
<div className="flex h-full w-full flex-col">
{appliedAttributesCount > 0 && (
<ProjectAppliedFiltersList
appliedFilters={filters ?? ({} as TProjectFilters)}
handleClearAllFilters={handleClearAllFilters}
filteredProjects={filteredProjectIds?.length ?? 0}
totalProjects={selectedScopeCount ?? allProjectCount}
handleRemoveFilter={handleRemoveFilter}
alwaysAllowEditing
/>
)}
<ProjectLayoutRoot />
</div>
);
});