diff --git a/apiserver/plane/app/views/workspace/recent_visit.py b/apiserver/plane/app/views/workspace/recent_visit.py index 175172a8015..4fe15b51312 100644 --- a/apiserver/plane/app/views/workspace/recent_visit.py +++ b/apiserver/plane/app/views/workspace/recent_visit.py @@ -9,6 +9,7 @@ from ..base import BaseViewSet from plane.app.permissions import allow_permission, ROLE + class UserRecentVisitViewSet(BaseViewSet): model = UserRecentVisit @@ -17,15 +18,18 @@ def get_serializer_class(self): @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE") def list(self, request, slug): - user_recent_visits = UserRecentVisit.objects.filter(workspace__slug=slug) + user_recent_visits = UserRecentVisit.objects.filter( + workspace__slug=slug, user=request.user + ) + + entity_name = request.query_params.get("entity_name") - entity_name = request.query_params.get("entity_name") + if entity_name: + user_recent_visits = user_recent_visits.filter(entity_name=entity_name) - if entity_name: - user_recent_visits = user_recent_visits.filter(entity_name=entity_name) - - user_recent_visits = user_recent_visits.filter(entity_name__in=["issue","page","project"]) - - serializer = WorkspaceRecentVisitSerializer(user_recent_visits[:20], many=True) - return Response(serializer.data, status=status.HTTP_200_OK) + user_recent_visits = user_recent_visits.filter( + entity_name__in=["issue", "page", "project"] + ) + serializer = WorkspaceRecentVisitSerializer(user_recent_visits[:20], many=True) + return Response(serializer.data, status=status.HTTP_200_OK) diff --git a/web/app/[workspaceSlug]/(projects)/home/header.tsx b/web/app/[workspaceSlug]/(projects)/home/header.tsx deleted file mode 100644 index a7a19afe6b0..00000000000 --- a/web/app/[workspaceSlug]/(projects)/home/header.tsx +++ /dev/null @@ -1,60 +0,0 @@ -"use client"; - -import Image from "next/image"; -import { useTheme } from "next-themes"; -import { Home } from "lucide-react"; -// images -import githubBlackImage from "/public/logos/github-black.png"; -import githubWhiteImage from "/public/logos/github-white.png"; -// ui -import { Breadcrumbs, Header } from "@plane/ui"; -// components -import { BreadcrumbLink } from "@/components/common"; -// constants -import { GITHUB_REDIRECTED } from "@/constants/event-tracker"; -// hooks -import { useEventTracker } from "@/hooks/store"; - -export const WorkspaceDashboardHeader = () => { - // hooks - const { captureEvent } = useEventTracker(); - const { resolvedTheme } = useTheme(); - - return ( - <> -
- -
- - } />} - /> - -
-
- - - captureEvent(GITHUB_REDIRECTED, { - element: "navbar", - }) - } - className="flex flex-shrink-0 items-center gap-1.5 rounded bg-custom-background-80 px-3 py-1.5" - href="https://github.com/makeplane/plane" - target="_blank" - rel="noopener noreferrer" - > - GitHub Logo - Star us on GitHub - - -
- - ); -}; diff --git a/web/app/[workspaceSlug]/(projects)/home/page.tsx b/web/app/[workspaceSlug]/(projects)/home/page.tsx deleted file mode 100644 index 9f9f535e03d..00000000000 --- a/web/app/[workspaceSlug]/(projects)/home/page.tsx +++ /dev/null @@ -1,28 +0,0 @@ -"use client"; - -import { observer } from "mobx-react"; -// components -import { PageHead, AppHeader, ContentWrapper } from "@/components/core"; -// hooks -import { WorkspaceHomeView } from "@/components/home"; -import { useWorkspace } from "@/hooks/store"; -// local components -import { WorkspaceDashboardHeader } from "../header"; - -const WorkspaceDashboardPage = observer(() => { - const { currentWorkspace } = useWorkspace(); - // derived values - const pageTitle = currentWorkspace?.name ? `${currentWorkspace?.name} - Home` : undefined; - - return ( - <> - } /> - - - - - - ); -}); - -export default WorkspaceDashboardPage; diff --git a/web/core/components/core/content-overflow-HOC.tsx b/web/core/components/core/content-overflow-HOC.tsx index fc3fcf455d9..f6a2423cd61 100644 --- a/web/core/components/core/content-overflow-HOC.tsx +++ b/web/core/components/core/content-overflow-HOC.tsx @@ -23,9 +23,11 @@ export const ContentOverflowWrapper = observer((props: IContentOverflowWrapper) // states const [containerHeight, setContainerHeight] = useState(0); const [showAll, setShowAll] = useState(false); + const [isTransitioning, setIsTransitioning] = useState(false); // refs const contentRef = useRef(null); + const containerRef = useRef(null); useEffect(() => { if (!contentRef?.current) return; @@ -70,37 +72,72 @@ export const ContentOverflowWrapper = observer((props: IContentOverflowWrapper) }; }, [contentRef?.current]); + useEffect(() => { + if (!containerRef.current) return; + + const handleTransitionEnd = () => { + setIsTransitioning(false); + }; + + containerRef.current.addEventListener("transitionend", handleTransitionEnd); + + return () => { + containerRef.current?.removeEventListener("transitionend", handleTransitionEnd); + }; + }, []); + + const handleToggle = () => { + setIsTransitioning(true); + setShowAll((prev) => !prev); + }; + if (!children) return fallback; return (
maxHeight, }, containerClassName )} - style={{ maxHeight: showAll ? "100%" : `${maxHeight}px` }} + style={{ + height: showAll ? `${containerHeight}px` : `${Math.min(maxHeight, containerHeight)}px`, + }} > -
{children}
+
+ {children} +
{containerHeight > maxHeight && (
diff --git a/web/core/components/home/widgets/links/links.tsx b/web/core/components/home/widgets/links/links.tsx index 85feab84040..1fd5dea9f7b 100644 --- a/web/core/components/home/widgets/links/links.tsx +++ b/web/core/components/home/widgets/links/links.tsx @@ -28,20 +28,21 @@ export const ProjectLinkList: FC = observer((props) => { if (links === undefined) return ; if (links.length === 0) return toggleLinkModal(true)} />; + return ( - } - buttonClassName="bg-custom-background-90/20" - > -
-
+
+ } + buttonClassName="bg-custom-background-90/20" + > +
{links && links.length > 0 && links.map((linkId) => )}
-
- + +
); }); diff --git a/web/core/components/home/widgets/recents/index.tsx b/web/core/components/home/widgets/recents/index.tsx index 4e31928b536..ba3893f6b05 100644 --- a/web/core/components/home/widgets/recents/index.tsx +++ b/web/core/components/home/widgets/recents/index.tsx @@ -17,6 +17,7 @@ import { FiltersDropdown } from "./filters"; import { RecentIssue } from "./issue"; import { RecentPage } from "./page"; import { RecentProject } from "./project"; +import { ContentOverflowWrapper } from "@/components/core/content-overflow-HOC"; const WIDGET_KEY = EWidgetKeys.RECENT_ACTIVITY; const workspaceService = new WorkspaceService(); @@ -79,7 +80,12 @@ export const RecentActivityWidget: React.FC = observer((props) ); return ( -
+ } + buttonClassName="bg-custom-background-90/20" + >
Recents
@@ -89,8 +95,10 @@ export const RecentActivityWidget: React.FC = observer((props) {isLoading && } {!isLoading && recents?.length > 0 && - recents.map((activity: TActivityEntityData) =>
{resolveRecent(activity)}
)} + recents + .filter((recent: TActivityEntityData) => recent.entity_data) + .map((activity: TActivityEntityData) =>
{resolveRecent(activity)}
)}
-
+ ); });