From b77261079b174a460c297c8588d5f0043eff340f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B8=D0=BC=D1=83=D1=80=20=D0=93=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D1=86=D0=BA=D0=B8=D0=B9?= Date: Thu, 29 Oct 2026 12:51:50 +0500 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B5=20=D0=BF=D0=B5=D1=87?= =?UTF-8?q?=D0=B0=D1=82=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BD=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D0=BE=D0=B4=D0=BD=D0=BE=D0=B9=20=D1=84=D0=BE=D1=80?= =?UTF-8?q?=D0=BC=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исполнение — внутренняя работа после согласования, к печатному документу заявки оно не относится: на печати остаётся только маршрут согласования. Раньше так было лишь в отпусках, через ручную обёртку. Теперь у ApprovalMatrix есть признак printable, ExecutorsMatrix всегда выключает печать (и для будущих форм), а блоки «Исполнение», выведенные через ApprovalMatrix напрямую, помечены явно. На экране ничего не меняется. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../forms/BusinessTrip/BusinessTripView.tsx | 1 + .../requestPortal/forms/Clearance/ClearanceView.tsx | 1 + .../forms/RecruitingHire/RecruitingHireView.tsx | 1 + .../RecruitingSelection/RecruitingSelectionView.tsx | 1 + .../requestPortal/forms/Referral/ReferralView.tsx | 1 + .../SkudExplanation/components/SkudRouteTables.tsx | 4 +++- .../requestPortal/forms/Ticket1C/Ticket1CView.tsx | 1 + .../forms/TmcTransfer/TmcTransferView.tsx | 1 + .../forms/UnpaidLeave/UnpaidLeaveView.tsx | 7 ++----- .../requestPortal/forms/Vacation/VacationView.tsx | 7 ++----- .../forms/WorkplaceSetup/WorkplaceSetupView.tsx | 1 + .../shared/approval/ui/ApprovalMatrix.tsx | 10 +++++++++- .../shared/approval/ui/ExecutorsMatrix.tsx | 2 ++ 13 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/webparts/requestPortal/forms/BusinessTrip/BusinessTripView.tsx b/src/webparts/requestPortal/forms/BusinessTrip/BusinessTripView.tsx index 701b500..d05ba88 100644 --- a/src/webparts/requestPortal/forms/BusinessTrip/BusinessTripView.tsx +++ b/src/webparts/requestPortal/forms/BusinessTrip/BusinessTripView.tsx @@ -156,6 +156,7 @@ const BusinessTripView: React.FC = ({ context, itemId, f {!executors.loading && executors.rows.length > 0 && ( = ({ context, itemId, formKey {!executors.loading && executors.rows.length > 0 && ( approval.searchUsers(q)} title="Исполнение" roleLabel="Исполнитель" diff --git a/src/webparts/requestPortal/forms/RecruitingHire/RecruitingHireView.tsx b/src/webparts/requestPortal/forms/RecruitingHire/RecruitingHireView.tsx index d735734..8f453b4 100644 --- a/src/webparts/requestPortal/forms/RecruitingHire/RecruitingHireView.tsx +++ b/src/webparts/requestPortal/forms/RecruitingHire/RecruitingHireView.tsx @@ -452,6 +452,7 @@ const RecruitingHireView: React.FC = ({ context, itemI {!executors.loading && (executors.rows.length > 0 || canAddExecutor) && ( approval.searchUsers(q)} title="Исполнение" roleLabel="Исполнитель" diff --git a/src/webparts/requestPortal/forms/RecruitingSelection/RecruitingSelectionView.tsx b/src/webparts/requestPortal/forms/RecruitingSelection/RecruitingSelectionView.tsx index d8c0ba6..d0d01de 100644 --- a/src/webparts/requestPortal/forms/RecruitingSelection/RecruitingSelectionView.tsx +++ b/src/webparts/requestPortal/forms/RecruitingSelection/RecruitingSelectionView.tsx @@ -438,6 +438,7 @@ const RecruitingSelectionView: React.FC = ({ cont {!executors.loading && (executors.rows.length > 0 || canAddExecutor) && ( approval.searchUsers(q)} title="Исполнение" roleLabel="Исполнитель" diff --git a/src/webparts/requestPortal/forms/Referral/ReferralView.tsx b/src/webparts/requestPortal/forms/Referral/ReferralView.tsx index 124c649..fb09e1e 100644 --- a/src/webparts/requestPortal/forms/Referral/ReferralView.tsx +++ b/src/webparts/requestPortal/forms/Referral/ReferralView.tsx @@ -234,6 +234,7 @@ const ReferralView: React.FC = ({ context, itemId, formKey, {!executors.loading && executors.rows.length > 0 && ( approval.searchUsers(q)} title="Исполнение" roleLabel="Исполнитель" diff --git a/src/webparts/requestPortal/forms/SkudExplanation/components/SkudRouteTables.tsx b/src/webparts/requestPortal/forms/SkudExplanation/components/SkudRouteTables.tsx index 19782e9..d1d2be2 100644 --- a/src/webparts/requestPortal/forms/SkudExplanation/components/SkudRouteTables.tsx +++ b/src/webparts/requestPortal/forms/SkudExplanation/components/SkudRouteTables.tsx @@ -11,7 +11,8 @@ interface ISkudRouteTablesProps { /** * Маршрут согласования + исполнение (если исполнители есть). Рисуется дважды: * на экране под карточкой и внутри печатного блока под запиской — на печати - * таблица маршрута заменяет подпись сотрудника. + * таблица маршрута заменяет подпись сотрудника. Исполнение на печать не идёт + * (printable={false}), как во всех формах, — только согласование. */ export const SkudRouteTables: React.FC = ({ approvers, executors, search }) => { const hasExecutors = !executors.loading && executors.rows.length > 0; @@ -26,6 +27,7 @@ export const SkudRouteTables: React.FC = ({ approvers, ex title="Исполнение" roleLabel="Исполнитель" emptyText="Исполнители не назначены." + printable={false} /> )} diff --git a/src/webparts/requestPortal/forms/Ticket1C/Ticket1CView.tsx b/src/webparts/requestPortal/forms/Ticket1C/Ticket1CView.tsx index 57cdcb9..1c7f65f 100644 --- a/src/webparts/requestPortal/forms/Ticket1C/Ticket1CView.tsx +++ b/src/webparts/requestPortal/forms/Ticket1C/Ticket1CView.tsx @@ -224,6 +224,7 @@ const Ticket1CView: React.FC = ({ context, itemId, formKey, {!executors.loading && executors.rows.length > 0 && ( approval.searchUsers(q)} title="Исполнение" roleLabel="Исполнитель" diff --git a/src/webparts/requestPortal/forms/TmcTransfer/TmcTransferView.tsx b/src/webparts/requestPortal/forms/TmcTransfer/TmcTransferView.tsx index 5c79a2e..461383c 100644 --- a/src/webparts/requestPortal/forms/TmcTransfer/TmcTransferView.tsx +++ b/src/webparts/requestPortal/forms/TmcTransfer/TmcTransferView.tsx @@ -204,6 +204,7 @@ const TmcTransferView: React.FC = ({ context, itemId, for {!executors.loading && executors.rows.length > 0 && ( approval.searchUsers(q)} title="Исполнение" roleLabel="Исполнитель" diff --git a/src/webparts/requestPortal/forms/UnpaidLeave/UnpaidLeaveView.tsx b/src/webparts/requestPortal/forms/UnpaidLeave/UnpaidLeaveView.tsx index 3e8af71..6218c07 100644 --- a/src/webparts/requestPortal/forms/UnpaidLeave/UnpaidLeaveView.tsx +++ b/src/webparts/requestPortal/forms/UnpaidLeave/UnpaidLeaveView.tsx @@ -178,11 +178,8 @@ const UnpaidLeaveView: React.FC = ({ context, itemId, for approval.searchUsers(q)} /> - {/* Исполнение — внутренняя работа кадров после согласования, к заявлению - сотрудника не относится: на печати только маршрут согласования. */} -
- approval.searchUsers(q)} /> -
+ {/* Исполнение на печать не идёт — это делает сам ExecutorsMatrix (printable={false}). */} + approval.searchUsers(q)} /> {/* Панель решения — ВНЕ печати и FormModeProvider (комментарий редактируемый). */} diff --git a/src/webparts/requestPortal/forms/Vacation/VacationView.tsx b/src/webparts/requestPortal/forms/Vacation/VacationView.tsx index 39f468b..797d882 100644 --- a/src/webparts/requestPortal/forms/Vacation/VacationView.tsx +++ b/src/webparts/requestPortal/forms/Vacation/VacationView.tsx @@ -236,11 +236,8 @@ const VacationView: React.FC = ({ context, itemId, formKey, approval.searchUsers(q)} /> - {/* Исполнение — внутренняя работа кадров после согласования, к заявлению - сотрудника не относится: на печати только маршрут согласования. */} -
- approval.searchUsers(q)} /> -
+ {/* Исполнение на печать не идёт — это делает сам ExecutorsMatrix (printable={false}). */} + approval.searchUsers(q)} /> {/* Панель решения — ВНЕ печати и FormModeProvider (комментарий редактируемый). */} diff --git a/src/webparts/requestPortal/forms/WorkplaceSetup/WorkplaceSetupView.tsx b/src/webparts/requestPortal/forms/WorkplaceSetup/WorkplaceSetupView.tsx index db6ed75..62acab6 100644 --- a/src/webparts/requestPortal/forms/WorkplaceSetup/WorkplaceSetupView.tsx +++ b/src/webparts/requestPortal/forms/WorkplaceSetup/WorkplaceSetupView.tsx @@ -296,6 +296,7 @@ const WorkplaceSetupView: React.FC = ({ context, itemI {!executors.loading && executors.rows.length > 0 && ( approval.searchUsers(q)} title="Исполнение" roleLabel="Исполнитель" diff --git a/src/webparts/requestPortal/shared/approval/ui/ApprovalMatrix.tsx b/src/webparts/requestPortal/shared/approval/ui/ApprovalMatrix.tsx index 6f561df..b644b5e 100644 --- a/src/webparts/requestPortal/shared/approval/ui/ApprovalMatrix.tsx +++ b/src/webparts/requestPortal/shared/approval/ui/ApprovalMatrix.tsx @@ -76,6 +76,13 @@ export interface IApprovalMatrixProps { * editable. В черновике не нужен: там пикер добавляет строку локально. */ onAddRow?: (user: ISiteUser) => void; + /** + * Попадает ли блок в печатную версию заявки. По умолчанию да — маршрут + * согласования печатается. Исполнение (внутренняя работа после согласования) + * не печатается ни в одной форме: false у ExecutorsMatrix и у блоков + * «Исполнение», выведенных через ApprovalMatrix напрямую. + */ + printable?: boolean; } /** Таблица маршрута (согласование или исполнение) + (если editable) правка состава. */ @@ -95,6 +102,7 @@ export const ApprovalMatrix: React.FC = ({ canMoveRow, onMoveRow, onAddRow, + printable = true, }) => { const { rows, loading, error, editable, blocks, retry } = editor; // Строка, для которой открыт выбор замены (ReplaceRowPanel); undefined — закрыт. @@ -218,7 +226,7 @@ export const ApprovalMatrix: React.FC = ({ const hasActionsCol = editable || hasRemovable; return ( -
+
{title}
{waiting &&
{waitingText}
} {!waiting && loading &&
Загрузка маршрута…
} diff --git a/src/webparts/requestPortal/shared/approval/ui/ExecutorsMatrix.tsx b/src/webparts/requestPortal/shared/approval/ui/ExecutorsMatrix.tsx index c2e9430..a6d4325 100644 --- a/src/webparts/requestPortal/shared/approval/ui/ExecutorsMatrix.tsx +++ b/src/webparts/requestPortal/shared/approval/ui/ExecutorsMatrix.tsx @@ -13,6 +13,7 @@ interface IExecutorsMatrixProps { /** * Таблица исполнителей — рисуется только когда в маршруте из админки они есть: * у форм без фазы исполнения блока нет вовсе (кроме редактора маршрута, см. canEditExecutors). + * В печатную версию заявки не попадает (printable={false}) — на печати только согласование. */ export const ExecutorsMatrix: React.FC = ({ editor, search, title = 'Исполнение' }) => { // Редактор маршрута видит блок и пустым — иначе исполнителя некуда добавить. @@ -26,6 +27,7 @@ export const ExecutorsMatrix: React.FC = ({ editor, searc canRemoveRow={editor.editable ? () => true : undefined} pickerPlaceholder="Добавить исполнителя: начните вводить ФИО…" emptyText="Исполнители не назначены." + printable={false} /> ); };