From c6ace8b9cc7d9f437c599592a6ac14acbcc93437 Mon Sep 17 00:00:00 2001 From: DCCONSTRUCTIONS Date: Mon, 20 Apr 2026 10:05:31 +0300 Subject: [PATCH] =?UTF-8?q?UI=20-=20=D0=9C=D0=95=D0=96=D0=9F=D0=A0=D0=9E?= =?UTF-8?q?=D0=95=D0=9A=D0=A2=D0=9D=D0=90=D0=AF=20=D0=9A=D0=9E=D0=9C=D0=9C?= =?UTF-8?q?=D0=A3=D0=9D=D0=98=D0=9A=D0=90=D0=A6=D0=98=D0=AF:=20auth=20scre?= =?UTF-8?q?ens,=20error=20pages=20=D0=B8=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9?= =?UTF-8?q?=20=D0=BA=D0=B0=D0=BD=D0=BE=D0=BD=20=D0=B2=D0=BD=D0=B5=D1=88?= =?UTF-8?q?=D0=BD=D0=B8=D1=85=20=D0=BA=D0=BE=D0=BD=D1=82=D1=83=D1=80=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/instance/maintenance-mode-dark.svg | 8 +- .../instance/maintenance-mode-light.svg | 8 +- plane-src/apps/web/app/error/dev.tsx | 75 ++--- plane-src/apps/web/app/error/prod.tsx | 36 +-- .../instance/maintenance-message.tsx | 14 +- .../external-contours/issue-properties.tsx | 14 +- .../projects/external-contours/issue-root.tsx | 31 +- .../projects/external-contours/list-item.tsx | 19 +- .../external-contours/mirrored-activity.tsx | 6 +- .../mirrored-attachments.tsx | 6 +- .../external-contours/mirrored-comments.tsx | 6 +- .../request-traceability.tsx | 16 +- .../projects/external-contours/root.tsx | 14 +- .../projects/external-contours/sidebar.tsx | 68 +++-- .../external-contours/source-reply-box.tsx | 10 +- .../account/auth-forms/auth-banner.tsx | 13 +- .../account/auth-forms/auth-header.tsx | 6 +- .../account/auth-forms/auth-root.tsx | 4 +- .../components/account/auth-forms/email.tsx | 9 +- .../account/auth-forms/password.tsx | 20 +- .../components/auth-screens/auth-base.tsx | 2 +- .../core/components/auth-screens/header.tsx | 6 +- .../web/helpers/authentication.helper.tsx | 287 ++++++++---------- plane-src/apps/web/styles/globals.css | 235 ++++++++++++++ .../src/empty-state/detailed-empty-state.tsx | 11 +- 25 files changed, 564 insertions(+), 360 deletions(-) diff --git a/plane-src/apps/web/app/assets/instance/maintenance-mode-dark.svg b/plane-src/apps/web/app/assets/instance/maintenance-mode-dark.svg index 546125f..2d69593 100644 --- a/plane-src/apps/web/app/assets/instance/maintenance-mode-dark.svg +++ b/plane-src/apps/web/app/assets/instance/maintenance-mode-dark.svg @@ -20,9 +20,9 @@ - - - + + + @@ -66,7 +66,7 @@ - + diff --git a/plane-src/apps/web/app/assets/instance/maintenance-mode-light.svg b/plane-src/apps/web/app/assets/instance/maintenance-mode-light.svg index 6cd8bab..97d883a 100644 --- a/plane-src/apps/web/app/assets/instance/maintenance-mode-light.svg +++ b/plane-src/apps/web/app/assets/instance/maintenance-mode-light.svg @@ -20,9 +20,9 @@ - - - + + + @@ -66,7 +66,7 @@ - + diff --git a/plane-src/apps/web/app/error/dev.tsx b/plane-src/apps/web/app/error/dev.tsx index 0269dcb..ef2030a 100644 --- a/plane-src/apps/web/app/error/dev.tsx +++ b/plane-src/apps/web/app/error/dev.tsx @@ -4,11 +4,9 @@ * See the LICENSE file for details. */ -// plane imports import { isRouteErrorResponse } from "react-router"; import { Banner } from "@plane/propel/banner"; import { Button } from "@plane/propel/button"; -import { Card, ECardVariant } from "@plane/propel/card"; import { InfoFillIcon } from "@plane/propel/icons"; interface ErrorActionsProps { @@ -19,12 +17,12 @@ interface ErrorActionsProps { function ErrorActions({ onGoHome, onReload }: ErrorActionsProps) { return (
- {onReload && ( - )}
@@ -37,19 +35,17 @@ interface DevErrorComponentProps { onReload: () => void; } +const ErrorShell = ({ children }: { children: React.ReactNode }) => ( +
{children}
+); + export function DevErrorComponent({ error, onGoHome, onReload }: DevErrorComponentProps) { if (isRouteErrorResponse(error)) { return (
- } - title="Route Error Response" - animationDuration={0} - /> - - + } title="Ошибка маршрута" animationDuration={0} /> +

@@ -59,15 +55,15 @@ export function DevErrorComponent({ error, onGoHome, onReload }: DevErrorCompone

-

Error Data

-
+

Данные ошибки

+

{error.data}

- +
); @@ -80,27 +76,27 @@ export function DevErrorComponent({ error, onGoHome, onReload }: DevErrorCompone } - title="Runtime Error" + title="Ошибка выполнения" animationDuration={0} /> - +
-

Error

+

Ошибка

-

Message

-
+

Сообщение

+

{error.message}

{error.stack && (
-

Stack Trace

-
+

Стек вызовов

+
                       {error.stack}
                     
@@ -110,20 +106,20 @@ export function DevErrorComponent({ error, onGoHome, onReload }: DevErrorCompone
- + - +
-

Development Mode

+

Режим разработки

- This detailed error view is only visible in development. In production, users will see a friendly - error page. + Этот подробный экран ошибок виден только в разработке. В production пользователи увидят упрощённую + страницу ошибки.

- +
); @@ -132,29 +128,24 @@ export function DevErrorComponent({ error, onGoHome, onReload }: DevErrorCompone return (
- } - title="Unknown Error" - animationDuration={0} - /> - - + } title="Неизвестная ошибка" animationDuration={0} /> +
-

Unknown Error

+

Неизвестная ошибка

-
+

- An unknown error occurred. Please try refreshing the page or contact support if the problem persists. + Произошла неизвестная ошибка. Обновите страницу. Если проблема сохранится, обратитесь в службу + поддержки.

- +
); diff --git a/plane-src/apps/web/app/error/prod.tsx b/plane-src/apps/web/app/error/prod.tsx index a8d6182..3ecf7d2 100644 --- a/plane-src/apps/web/app/error/prod.tsx +++ b/plane-src/apps/web/app/error/prod.tsx @@ -16,18 +16,8 @@ import DefaultLayout from "@/layouts/default-layout"; const linkMap = [ { key: "mail_to", - label: "Contact Support", - value: "mailto:support@plane.so", - }, - { - key: "status", - label: "Status Page", - value: "https://status.plane.so/", - }, - { - key: "twitter_handle", - label: "@planepowers", - value: "https://x.com/planepowers", + label: "Служба поддержки", + value: "https://nodedc.dctouch.ru/", }, ]; @@ -45,22 +35,20 @@ export function ProdErrorComponent({ onGoHome }: ProdErrorComponentProps) { return ( -
-
+
+
ProjectSettingImg -
-
-

🚧 Looks like something went wrong!

- - We track these errors automatically and working on getting things back up and running. If the problem - persists feel free to contact us. In the meantime, try refreshing. +

🚧 Похоже, что-то пошло не так.

+ + Мы уже зафиксировали ошибку и пытаемся восстановить работу. Если проблема сохраняется, обратитесь в + службу поддержки и обновите страницу.
@@ -71,7 +59,7 @@ export function ProdErrorComponent({ onGoHome }: ProdErrorComponentProps) { href={link.value} target="_blank" rel="noopener noreferrer" - className="text-13 text-accent-primary hover:underline" + className="nodedc-error-link text-13" > {link.label} @@ -80,8 +68,8 @@ export function ProdErrorComponent({ onGoHome }: ProdErrorComponentProps) {
-
diff --git a/plane-src/apps/web/ce/components/instance/maintenance-message.tsx b/plane-src/apps/web/ce/components/instance/maintenance-message.tsx index bce4163..6843325 100644 --- a/plane-src/apps/web/ce/components/instance/maintenance-message.tsx +++ b/plane-src/apps/web/ce/components/instance/maintenance-message.tsx @@ -8,20 +8,18 @@ export function MaintenanceMessage() { const linkMap = [ { key: "mail_to", - label: "Contact Support", - value: "mailto:support@plane.so", + label: "Служба поддержки", + value: "https://nodedc.dctouch.ru/", }, ]; return ( <>
-

- 🚧 Looks like NODE.DC didn't start up correctly! -

+

🚧 NODE.DC запустился с ошибкой.

- Some services might have failed to start. Please check your container logs to identify and resolve the issue. - If you're stuck, reach out to our support team for more help. + Часть сервисов могла не подняться. Проверьте логи контейнеров и устраните причину. Если нужна помощь, + переходите в службу поддержки.
@@ -31,7 +29,7 @@ export function MaintenanceMessage() { href={link.value} target="_blank" rel="noopener noreferrer" - className="text-13 text-accent-primary hover:underline" + className="nodedc-error-link text-13" > {link.label} diff --git a/plane-src/apps/web/ce/components/projects/external-contours/issue-properties.tsx b/plane-src/apps/web/ce/components/projects/external-contours/issue-properties.tsx index a01881c..c31bb5a 100644 --- a/plane-src/apps/web/ce/components/projects/external-contours/issue-properties.tsx +++ b/plane-src/apps/web/ce/components/projects/external-contours/issue-properties.tsx @@ -29,13 +29,13 @@ export const ExternalContoursIssueContentProperties = observer(function External if (!issue || !issue?.id) return <>; return ( -
+
{t("external_contours_page.properties.section_title")}
-
+
-
-
+
+
{t("priority")}
@@ -44,14 +44,14 @@ export const ExternalContoursIssueContentProperties = observer(function External onChange={(val) => issue?.id && issueOperations.update(workspaceSlug, targetProjectId, issue.id, { priority: val })} disabled={!isEditable} buttonVariant="border-with-text" - className="w-3/5 flex-grow rounded-sm px-2 hover:bg-layer-1" + className="w-3/5 flex-grow rounded-full px-3 hover:bg-white/6" buttonContainerClassName="w-full text-left" buttonClassName="h-auto w-min whitespace-nowrap" />
-
-
+
+
{t("labels")}
diff --git a/plane-src/apps/web/ce/components/projects/external-contours/issue-root.tsx b/plane-src/apps/web/ce/components/projects/external-contours/issue-root.tsx index d092c44..7180545 100644 --- a/plane-src/apps/web/ce/components/projects/external-contours/issue-root.tsx +++ b/plane-src/apps/web/ce/components/projects/external-contours/issue-root.tsx @@ -9,7 +9,6 @@ import { useEffect, useMemo, useRef } from "react"; import { observer } from "mobx-react"; import type { EditorRefApi } from "@plane/editor"; import { useTranslation } from "@plane/i18n"; -import { Badge } from "@plane/propel/badge"; import { TOAST_TYPE, setToast } from "@plane/propel/toast"; import type { TExternalContourRequest, TIssue, TNameDescriptionLoader } from "@plane/types"; import { EFileAssetType } from "@plane/types"; @@ -139,8 +138,8 @@ export const ExternalContoursIssueMainContent = observer(function ExternalContou if (!hasDirectTargetAccess) { return ( - <> -
+
+
{isSourceEditable ? ( <> -
- -
+ -
-
{t("external_contours_page.properties.section_title")}
+
+
{t("external_contours_page.properties.section_title")}
-
+
{t("priority")} - {issue.priority || t("none")} + + {issue.priority || t("none")} +
-
+
{t("labels")} {issue.label_details?.length ? ( issue.label_details.map((label) => ( -
+
{label.name}
@@ -230,8 +229,12 @@ export const ExternalContoursIssueMainContent = observer(function ExternalContou - {!isSourceEditable &&
{t("external_contours_page.readonly_source_view")}
} - + {!isSourceEditable && ( +
+ {t("external_contours_page.readonly_source_view")} +
+ )} +
); } diff --git a/plane-src/apps/web/ce/components/projects/external-contours/list-item.tsx b/plane-src/apps/web/ce/components/projects/external-contours/list-item.tsx index 6cc7e5a..7ef1ccd 100644 --- a/plane-src/apps/web/ce/components/projects/external-contours/list-item.tsx +++ b/plane-src/apps/web/ce/components/projects/external-contours/list-item.tsx @@ -53,14 +53,15 @@ export const ExternalContoursListItem = observer(function ExternalContoursListIt onClick={(e) => handleIssueRedirection(e, request.id)} > -
+
-
+
{issue.project_detail?.identifier || "REQ"}-{issue.sequence_id} @@ -71,9 +72,11 @@ export const ExternalContoursListItem = observer(function ExternalContoursListIt )}
- +
+ +
-

{issue.name}

+

{issue.name}

@@ -93,7 +96,7 @@ export const ExternalContoursListItem = observer(function ExternalContoursListIt )} {visibleLabels.map((label) => ( -
+
{label.name}
@@ -107,7 +110,7 @@ export const ExternalContoursListItem = observer(function ExternalContoursListIt key={assignee.id} src={assignee.avatar_url || ""} name={assignee.display_name || "NODE.DC"} - size="md" + size="lg" showTooltip /> ))} diff --git a/plane-src/apps/web/ce/components/projects/external-contours/mirrored-activity.tsx b/plane-src/apps/web/ce/components/projects/external-contours/mirrored-activity.tsx index 3171b0f..84f2c4d 100644 --- a/plane-src/apps/web/ce/components/projects/external-contours/mirrored-activity.tsx +++ b/plane-src/apps/web/ce/components/projects/external-contours/mirrored-activity.tsx @@ -65,20 +65,20 @@ export const ExternalContoursMirroredActivity = observer(function ExternalContou }; return ( -
+
{t("external_contours_page.mirror.activity_title")}
{activity.length > 0 ? (
{activity.map((item) => ( -
+
{renderMessage(item)}
{renderFormattedDate(item.created_at)}
))}
) : ( -
+
{t("external_contours_page.mirror.activity_empty")}
)} diff --git a/plane-src/apps/web/ce/components/projects/external-contours/mirrored-attachments.tsx b/plane-src/apps/web/ce/components/projects/external-contours/mirrored-attachments.tsx index 280be5f..189f4a6 100644 --- a/plane-src/apps/web/ce/components/projects/external-contours/mirrored-attachments.tsx +++ b/plane-src/apps/web/ce/components/projects/external-contours/mirrored-attachments.tsx @@ -19,7 +19,7 @@ export const ExternalContoursMirroredAttachments = observer(function ExternalCon const { t } = useTranslation(); return ( -
+
{t("external_contours_page.mirror.attachments_title")}
{attachments.length > 0 ? ( @@ -36,7 +36,7 @@ export const ExternalContoursMirroredAttachments = observer(function ExternalCon href={attachment.download_url || "#"} target="_blank" rel="noreferrer" - className="flex min-h-[60px] items-center justify-between gap-3 rounded-md border-[2px] border-subtle bg-surface-1 px-4 py-2 text-13 transition-colors hover:bg-surface-2" + className="nodedc-external-panel flex min-h-[72px] items-center justify-between gap-3 px-4 py-3 text-13 transition-colors hover:bg-white/6" >
{fileIcon}
@@ -55,7 +55,7 @@ export const ExternalContoursMirroredAttachments = observer(function ExternalCon })}
) : ( -
+
{t("external_contours_page.mirror.attachments_empty")}
)} diff --git a/plane-src/apps/web/ce/components/projects/external-contours/mirrored-comments.tsx b/plane-src/apps/web/ce/components/projects/external-contours/mirrored-comments.tsx index 589d299..8fd77ac 100644 --- a/plane-src/apps/web/ce/components/projects/external-contours/mirrored-comments.tsx +++ b/plane-src/apps/web/ce/components/projects/external-contours/mirrored-comments.tsx @@ -19,7 +19,7 @@ export const ExternalContoursMirroredComments = observer(function ExternalContou const { t } = useTranslation(); return ( -
+
{t("external_contours_page.mirror.comments_title")}
{comments.length > 0 ? ( @@ -27,7 +27,7 @@ export const ExternalContoursMirroredComments = observer(function ExternalContou {comments.map((comment) => { const actorName = comment.actor_detail?.display_name || t("external_contours_page.mirror.system_actor"); return ( -
+
@@ -49,7 +49,7 @@ export const ExternalContoursMirroredComments = observer(function ExternalContou })}
) : ( -
+
{t("external_contours_page.mirror.comments_empty")}
)} diff --git a/plane-src/apps/web/ce/components/projects/external-contours/request-traceability.tsx b/plane-src/apps/web/ce/components/projects/external-contours/request-traceability.tsx index 8505bfc..a676280 100644 --- a/plane-src/apps/web/ce/components/projects/external-contours/request-traceability.tsx +++ b/plane-src/apps/web/ce/components/projects/external-contours/request-traceability.tsx @@ -17,9 +17,9 @@ type Props = { }; const TraceabilityCell = ({ label, children }: { label: string; children: ReactNode }) => ( -
+
{label}
-
{children}
+
{children}
); @@ -41,7 +41,7 @@ export const ExternalContoursRequestTraceability = observer(function ExternalCon const assigneeDetails = issue.assignee_details ?? []; return ( -
+
{t("external_contours_page.traceability.title")}

{t("external_contours_page.traceability.description")}

@@ -73,7 +73,7 @@ export const ExternalContoursRequestTraceability = observer(function ExternalCon {assigneeDetails.map((assignee) => (
- {assignee.display_name} + {assignee.display_name}
))}
@@ -90,13 +90,13 @@ export const ExternalContoursRequestTraceability = observer(function ExternalCon {requestedAt ? renderFormattedDate(requestedAt) : t("common.none")} - - {lastUpdatedAt ? renderFormattedDate(lastUpdatedAt) : t("common.none")} - - {dueDate} + + + {lastUpdatedAt ? renderFormattedDate(lastUpdatedAt) : t("common.none")} +
); diff --git a/plane-src/apps/web/ce/components/projects/external-contours/root.tsx b/plane-src/apps/web/ce/components/projects/external-contours/root.tsx index 87e8818..ee0f3a3 100644 --- a/plane-src/apps/web/ce/components/projects/external-contours/root.tsx +++ b/plane-src/apps/web/ce/components/projects/external-contours/root.tsx @@ -97,11 +97,15 @@ export const ExternalContoursRoot = observer(function ExternalContoursRoot(props inboxIssueId={inboxIssueId.toString()} /> ) : ( - +
+
+ +
+
)}
diff --git a/plane-src/apps/web/ce/components/projects/external-contours/sidebar.tsx b/plane-src/apps/web/ce/components/projects/external-contours/sidebar.tsx index 1d98ba5..753c711 100644 --- a/plane-src/apps/web/ce/components/projects/external-contours/sidebar.tsx +++ b/plane-src/apps/web/ce/components/projects/external-contours/sidebar.tsx @@ -10,7 +10,6 @@ import { useTranslation } from "@plane/i18n"; import { EmptyStateDetailed } from "@plane/propel/empty-state"; import type { TInboxIssueCurrentTab } from "@plane/types"; import { EInboxIssueCurrentTab } from "@plane/types"; -import { EHeaderVariant, Header } from "@plane/ui"; import { cn } from "@plane/utils"; import { useProjectExternalContours } from "@/hooks/store/use-project-external-contours"; import { useAppRouter } from "@/hooks/use-app-router"; @@ -42,18 +41,20 @@ export const ExternalContoursSidebar = observer(function ExternalContoursSidebar } }, [currentTab, filteredRequestIds, inboxIssueId, projectId, router, workspaceSlug]); - const currentCount = currentTab === EInboxIssueCurrentTab.CLOSED ? closedRequestIds.length : openRequestIds.length; - return ( -
+
-
- {tabNavigationOptions.map((option) => ( -
+
+ {tabNavigationOptions.map((option) => { + const count = option.key === EInboxIssueCurrentTab.CLOSED ? closedRequestIds.length : openRequestIds.length; + return ( +
+ + ); + })} +
+
-
+
{filteredRequestIds.length > 0 ? ( - filteredRequestIds.map((requestId) => ( - - )) +
+ {filteredRequestIds.map((requestId) => ( + + ))} +
) : (
{currentTab === EInboxIssueCurrentTab.OPEN ? ( diff --git a/plane-src/apps/web/ce/components/projects/external-contours/source-reply-box.tsx b/plane-src/apps/web/ce/components/projects/external-contours/source-reply-box.tsx index 1ebe760..1283bd6 100644 --- a/plane-src/apps/web/ce/components/projects/external-contours/source-reply-box.tsx +++ b/plane-src/apps/web/ce/components/projects/external-contours/source-reply-box.tsx @@ -47,7 +47,7 @@ export const ExternalContoursSourceReplyBox = observer(function ExternalContours }; return ( -
+
{t("external_contours_page.reply.title")}