diff --git a/plane-src/apps/web/app/(all)/[workspaceSlug]/(projects)/project-shell-top-toolbar.tsx b/plane-src/apps/web/app/(all)/[workspaceSlug]/(projects)/project-shell-top-toolbar.tsx index 2f8942c..963c3c0 100644 --- a/plane-src/apps/web/app/(all)/[workspaceSlug]/(projects)/project-shell-top-toolbar.tsx +++ b/plane-src/apps/web/app/(all)/[workspaceSlug]/(projects)/project-shell-top-toolbar.tsx @@ -23,7 +23,7 @@ import { useTranslation } from "@plane/i18n"; import { InboxIcon, PlusIcon, ProjectIcon } from "@plane/propel/icons"; import { TOAST_TYPE, setToast } from "@plane/propel/toast"; import { Tooltip } from "@plane/propel/tooltip"; -import { copyUrlToClipboard, joinUrlPath } from "@plane/utils"; +import { cn, copyUrlToClipboard, joinUrlPath } from "@plane/utils"; import { TopNavPowerK } from "@/components/navigation"; import { useCommandPalette } from "@/hooks/store/use-command-palette"; import { useProject } from "@/hooks/store/use-project"; @@ -246,9 +246,15 @@ export const ProjectShellTopToolbar = observer(function ProjectShellTopToolbar() }).sort((a, b) => a.sort_order - b.sort_order), [pathname, workspacePreferences, workspaceSlug] ); + const workspaceSlugValue = workspaceSlug?.toString(); + const isWorkspaceHome = pathname === `/${workspaceSlugValue}` || pathname === `/${workspaceSlugValue}/`; return ( -
+
diff --git a/plane-src/apps/web/ce/components/home/header.tsx b/plane-src/apps/web/ce/components/home/header.tsx index 0f6d205..67777a6 100644 --- a/plane-src/apps/web/ce/components/home/header.tsx +++ b/plane-src/apps/web/ce/components/home/header.tsx @@ -14,10 +14,11 @@ type HomePageHeaderProps = { selectedProject?: THomeProjectData; selectedProjectAnalytics?: TProjectAnalyticsCount; recents?: TActivityEntityData[]; + workspaceName?: string; }; export function HomePageHeader(props: HomePageHeaderProps) { - const { currentUser, selectedProject, selectedProjectAnalytics, recents } = props; + const { currentUser, selectedProject, selectedProjectAnalytics, recents, workspaceName } = props; const { currentLocale } = useTranslation(); const { currentTime } = useCurrentTime(); @@ -48,6 +49,7 @@ export function HomePageHeader(props: HomePageHeaderProps) { { label: "Открытые задачи", value: openIssues.toString(), caption: "в работе" }, { label: "Касания 7 дней", value: recentTouchpoints.toString(), caption: "recent" }, ]; + const workspaceDisplayName = workspaceName?.trim() || "Workspace"; return (
@@ -57,26 +59,19 @@ export function HomePageHeader(props: HomePageHeaderProps) {
-
-

WORKSPACE HOME

-

- {selectedProject - ? `${selectedProject.identifier} в фокусе домашней сводки.` - : "Выберите проект для фокуса, Ганта и рабочей аналитики."} -

-
-
Фокус
-
+
{selectedProject?.name ?? "Workspace"}
-
- {selectedProject?.description || selectedProject?.identifier || "Координационный обзор"} -
+ {selectedProject?.identifier && ( +
+ {selectedProject.identifier} +
+ )}
@@ -86,7 +81,7 @@ export function HomePageHeader(props: HomePageHeaderProps) {
{metric.label}
{metric.value}
-
+
+ +
+
Workspace
+

{workspaceDisplayName}

+
); diff --git a/plane-src/apps/web/core/components/gantt-chart/preview/timeline-preview.tsx b/plane-src/apps/web/core/components/gantt-chart/preview/timeline-preview.tsx index 9053fd5..f2ce50d 100644 --- a/plane-src/apps/web/core/components/gantt-chart/preview/timeline-preview.tsx +++ b/plane-src/apps/web/core/components/gantt-chart/preview/timeline-preview.tsx @@ -5,7 +5,7 @@ */ import { useEffect, useMemo, useRef, useState } from "react"; -import { CalendarDays, Check, Filter, SlidersHorizontal } from "lucide-react"; +import { Check, Filter, SlidersHorizontal, X } from "lucide-react"; import type { ChartDataType, IGanttBlock } from "@plane/types"; import { cn } from "@plane/utils"; import { getItemPositionWidth } from "@/components/gantt-chart/views/helpers"; @@ -249,11 +249,12 @@ const sortPreviewItems = (items: TGanttTimelinePreviewItem[], sortMode: TGanttPr }); export function GanttTimelinePreview(props: TGanttTimelinePreviewProps) { - const { emptyMessage, isLoading = false, items, locale, subtitle, title } = props; + const { emptyMessage, isLoading = false, items, locale } = props; const [activeRange, setActiveRange] = useState("Live"); const [activePanel, setActivePanel] = useState<"filters" | "view" | null>(null); const [activeDateFilters, setActiveDateFilters] = useState([]); const [activeStatusFilters, setActiveStatusFilters] = useState([]); + const [selectedPreviewItemId, setSelectedPreviewItemId] = useState(null); const [showFullTaskName, setShowFullTaskName] = useState(false); const [sortMode, setSortMode] = useState("target_date_asc"); const scrollContainerRef = useRef(null); @@ -329,6 +330,15 @@ export function GanttTimelinePreview(props: TGanttTimelinePreviewProps) { const hiddenItemsCount = Math.max(items.length - timeline.blocks.length, 0); const activeFilterCount = activeDateFilters.length + activeStatusFilters.length + (sortMode === "target_date_asc" ? 0 : 1); + const selectedPreviewItem = + timeline.blocks.find((item) => item.id === selectedPreviewItemId) ?? timeline.blocks.find((item) => item.id === items[0]?.id); + const selectedPreviewItemDate = selectedPreviewItem?.target_date + ? getDateFromValue(selectedPreviewItem.target_date) + : undefined; + const selectedPreviewItemStartDate = selectedPreviewItem?.start_date + ? getDateFromValue(selectedPreviewItem.start_date) + : undefined; + const formatPreviewDate = (date?: Date) => (date ? getShortDateLabel(date, locale) : "Нет"); const toggleStatusFilter = (filterKey: TGanttPreviewStatusFilter) => setActiveStatusFilters((currentFilters) => @@ -350,6 +360,13 @@ export function GanttTimelinePreview(props: TGanttTimelinePreviewProps) { setSortMode("target_date_asc"); }; + useEffect(() => { + if (!selectedPreviewItemId) return; + if (timeline.blocks.some((item) => item.id === selectedPreviewItemId)) return; + + setSelectedPreviewItemId(null); + }, [selectedPreviewItemId, timeline.blocks]); + useEffect(() => { const scrollElement = scrollContainerRef.current; if (!scrollElement || isLoading) return; @@ -366,28 +383,24 @@ export function GanttTimelinePreview(props: TGanttTimelinePreviewProps) { return (
-
-
- -
-
-
{title}
- {subtitle &&
{subtitle}
} -
-
+