UI - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: выравнивание верхних блоков и зазоров внешних контуров

This commit is contained in:
DCCONSTRUCTIONS 2026-04-20 17:49:37 +03:00
parent a4e9c3751a
commit 47d379e77f
4 changed files with 32 additions and 14 deletions

View File

@ -78,7 +78,7 @@ export const ExternalContoursContentRoot = observer(function ExternalContoursCon
if (!contourRequest || !issue) return <></>; if (!contourRequest || !issue) return <></>;
return ( return (
<div className="relative flex h-full w-full flex-col overflow-hidden"> <div className="relative flex h-full w-full flex-col overflow-hidden pt-6">
<div className="z-[11] min-h-[52px] flex-shrink-0"> <div className="z-[11] min-h-[52px] flex-shrink-0">
<ExternalContoursIssueActionsHeader <ExternalContoursIssueActionsHeader
setIsMobileSidebar={setIsMobileSidebar} setIsMobileSidebar={setIsMobileSidebar}
@ -90,7 +90,7 @@ export const ExternalContoursContentRoot = observer(function ExternalContoursCon
hasDirectTargetAccess={hasDirectTargetAccess} hasDirectTargetAccess={hasDirectTargetAccess}
/> />
</div> </div>
<ContentWrapper className="space-y-4 px-4 py-4"> <ContentWrapper className="space-y-4 px-4 pb-4 pt-4">
<ExternalContoursIssueMainContent <ExternalContoursIssueMainContent
workspaceSlug={workspaceSlug} workspaceSlug={workspaceSlug}
sourceProjectId={projectId} sourceProjectId={projectId}

View File

@ -34,8 +34,8 @@ export const ProjectExternalContoursHeader = observer(function ProjectExternalCo
); );
return ( return (
<Header> <Header className="pt-4">
<Header.LeftItem> <Header.LeftItem className="items-center pt-2">
<div className="flex flex-grow items-center gap-4"> <div className="flex flex-grow items-center gap-4">
<Breadcrumbs isLoading={currentProjectDetailsLoader === "init-loader"}> <Breadcrumbs isLoading={currentProjectDetailsLoader === "init-loader"}>
<CommonProjectBreadcrumbs workspaceSlug={workspaceSlug?.toString()} projectId={projectId?.toString()} /> <CommonProjectBreadcrumbs workspaceSlug={workspaceSlug?.toString()} projectId={projectId?.toString()} />
@ -60,7 +60,7 @@ export const ProjectExternalContoursHeader = observer(function ProjectExternalCo
)} )}
</div> </div>
</Header.LeftItem> </Header.LeftItem>
<Header.RightItem> <Header.RightItem className="pt-2">
{workspaceSlug && projectId && isAuthorized ? ( {workspaceSlug && projectId && isAuthorized ? (
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<ExternalContourCreateModalRoot <ExternalContourCreateModalRoot
@ -73,7 +73,7 @@ export const ProjectExternalContoursHeader = observer(function ProjectExternalCo
variant="primary" variant="primary"
size="lg" size="lg"
onClick={() => setCreateIssueModal(true)} onClick={() => setCreateIssueModal(true)}
className="nodedc-external-primary-button min-w-[13rem]" className="nodedc-external-primary-button min-w-[14rem]"
> >
{t("external_contours_page.header.add_request")} {t("external_contours_page.header.add_request")}
</Button> </Button>

View File

@ -33,6 +33,7 @@ export const ExternalContoursListItem = observer(function ExternalContoursListIt
const { isMobile } = usePlatformOS(); const { isMobile } = usePlatformOS();
const request = getRequestById(requestId); const request = getRequestById(requestId);
const issue = request?.issue; const issue = request?.issue;
const isActive = selectedInboxIssueId === requestId;
const handleIssueRedirection = (event: MouseEvent, currentIssueId: string | undefined) => { const handleIssueRedirection = (event: MouseEvent, currentIssueId: string | undefined) => {
if (selectedInboxIssueId === currentIssueId) event.preventDefault(); if (selectedInboxIssueId === currentIssueId) event.preventDefault();
@ -52,14 +53,15 @@ export const ExternalContoursListItem = observer(function ExternalContoursListIt
<Link <Link
id={`external-contour-list-item-${request.id}`} id={`external-contour-list-item-${request.id}`}
key={`${projectId}_${request.id}`} key={`${projectId}_${request.id}`}
className="block"
href={`/${workspaceSlug}/projects/${projectId}/external-contours?currentTab=${currentTab}&inboxIssueId=${request.id}`} href={`/${workspaceSlug}/projects/${projectId}/external-contours?currentTab=${currentTab}&inboxIssueId=${request.id}`}
onClick={(e) => handleIssueRedirection(e, request.id)} onClick={(e) => handleIssueRedirection(e, request.id)}
> >
<div <div
data-active={selectedInboxIssueId === request.id} data-active={isActive}
className={cn( className={cn(
"nodedc-external-card relative flex min-h-[15rem] cursor-pointer flex-col gap-5 px-6 py-5 transition-all hover:bg-white/5", "nodedc-external-card relative flex min-h-[15rem] cursor-pointer flex-col gap-5 px-6 py-5 transition-all hover:bg-white/5",
{ "ring-0": selectedInboxIssueId === request.id } { "ring-0": isActive }
)} )}
> >
<div className="space-y-0.5"> <div className="space-y-0.5">
@ -72,12 +74,16 @@ export const ExternalContoursListItem = observer(function ExternalContoursListIt
showTooltip showTooltip
/> />
<div className="min-w-0"> <div className="min-w-0">
<div className="truncate text-[15px] leading-5 font-semibold text-primary">{requesterName}</div> <div
className={cn("truncate text-[15px] leading-5 font-semibold", isActive ? "text-[#0b1117]" : "text-primary")}
>
{requesterName}
</div>
</div> </div>
</div> </div>
<div className="flex shrink-0 items-center gap-2"> <div className="flex shrink-0 items-center gap-2">
<div className="text-11 font-medium text-tertiary"> <div className={cn("text-11 font-medium", isActive ? "text-[#17212b]/70" : "text-tertiary")}>
{issue.project_detail?.identifier || "REQ"}-{issue.sequence_id} {issue.project_detail?.identifier || "REQ"}-{issue.sequence_id}
</div> </div>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
@ -91,11 +97,18 @@ export const ExternalContoursListItem = observer(function ExternalContoursListIt
</div> </div>
</div> </div>
<div className="truncate pl-10 text-[12px] font-medium leading-4 text-secondary">{contourName}</div> <div className={cn("truncate pl-10 text-[12px] font-medium leading-4", isActive ? "text-[#17212b]/75" : "text-secondary")}>
{contourName}
</div>
</div> </div>
<div className="flex flex-1 items-center justify-center px-5 py-2 text-center"> <div className="flex flex-1 items-center justify-center px-5 py-2 text-center">
<h3 className="line-clamp-3 w-full max-w-[18.5rem] text-center text-16 leading-7 font-semibold text-primary"> <h3
className={cn(
"line-clamp-3 w-full max-w-[18.5rem] text-center text-16 leading-7 font-semibold",
isActive ? "text-[#0b1117]" : "text-primary"
)}
>
{issue.name} {issue.name}
</h3> </h3>
</div> </div>
@ -125,7 +138,12 @@ export const ExternalContoursListItem = observer(function ExternalContoursListIt
tooltipContent={`${renderFormattedDate(lastUpdatedAt ?? "")}`} tooltipContent={`${renderFormattedDate(lastUpdatedAt ?? "")}`}
isMobile={isMobile} isMobile={isMobile}
> >
<div className="rounded-full bg-white/6 px-3 py-1.5 text-12 text-secondary"> <div
className={cn(
"rounded-full px-3 py-1.5 text-12",
isActive ? "bg-black/10 text-[#17212b]/80" : "bg-white/6 text-secondary"
)}
>
{renderFormattedDate(lastUpdatedAt ?? "")} {renderFormattedDate(lastUpdatedAt ?? "")}
</div> </div>
</Tooltip> </Tooltip>

View File

@ -100,7 +100,7 @@ export const ExternalContoursSidebar = observer(function ExternalContoursSidebar
</div> </div>
</div> </div>
) : filteredRequestIds.length > 0 ? ( ) : filteredRequestIds.length > 0 ? (
<div key={resolvedTab} className="space-y-3"> <div key={resolvedTab} className="space-y-4 pb-1">
{filteredRequestIds.map((requestId) => ( {filteredRequestIds.map((requestId) => (
<ExternalContoursListItem <ExternalContoursListItem
key={requestId} key={requestId}