feat: added split print button
Tests / frontend-test (push) Successful in 4m15s

This commit is contained in:
Тимур Городецкий
2026-08-27 10:09:05 +05:00
parent 5a5e43e5c2
commit 6172321710
20 changed files with 92 additions and 93 deletions
@@ -2,7 +2,7 @@ import * as React from 'react';
import { useState, useEffect, useMemo, useCallback } from 'react';
import type { WebPartContext } from '@microsoft/sp-webpart-base';
import styles from './ClearanceView.module.scss';
import { Alert, Button, FormCard, InitiatorLine, FormModeProvider, PrintButton, PrintOrgSelect, OrgLetterhead } from '../../shared/ui';
import { Alert, Button, FormCard, InitiatorLine, FormModeProvider, PrintSplitButton, OrgLetterhead } from '../../shared/ui';
import {
ApproverService,
DecisionPanel,
@@ -65,7 +65,7 @@ const ClearanceView: React.FC<IClearanceViewProps> = ({ context, itemId, formKey
const [lockedWriteOffs, setLockedWriteOffs] = useState<Set<string>>(new Set());
const [saveState, setSaveState] = useState<SaveState>('idle');
// Какая из организаций сотрудника (см. OrganizationField) идёт в печать —
// выбор в тулбаре через PrintOrgSelect, по умолчанию первая.
// выбор в тулбаре через PrintSplitButton, по умолчанию первая.
const [printOrgIndex, setPrintOrgIndex] = useState<number>(0);
const [saveErrorMessage, setSaveErrorMessage] = useState<string>('');
@@ -263,8 +263,7 @@ const ClearanceView: React.FC<IClearanceViewProps> = ({ context, itemId, formKey
return (
<div>
<div className={`${styles.toolbar} rp-no-print`}>
<PrintOrgSelect value={data.Organization} selectedIndex={printOrgIndex} onChange={setPrintOrgIndex} />
<PrintButton />
<PrintSplitButton value={data.Organization} selectedIndex={printOrgIndex} onChange={setPrintOrgIndex} />
</div>
{canEditAnything && (
@@ -124,7 +124,7 @@ export interface ISectionProps {
* отдельный обработчик. Если не передан (режим чтения) — правка через set.
*/
onEmployeeChange?: (login: string) => void;
/** Индекс организации для печати (см. shared/ui/PrintOrgSelect и OrganizationField.printIndex). */
/** Индекс организации для печати (см. shared/ui/PrintSplitButton и OrganizationField.printIndex). */
printOrgIndex?: number;
}
@@ -2,7 +2,7 @@ import * as React from 'react';
import { useState, useEffect, useMemo, useCallback } from 'react';
import type { WebPartContext } from '@microsoft/sp-webpart-base';
import styles from './ReferralView.module.scss';
import { Alert, FormCard, InitiatorLine, FormModeProvider, PrintButton, PrintOrgSelect, OrgLetterhead } from '../../shared/ui';
import { Alert, FormCard, InitiatorLine, FormModeProvider, PrintSplitButton, OrgLetterhead } from '../../shared/ui';
import {
ApproverService,
DecisionPanel,
@@ -54,7 +54,7 @@ const ReferralView: React.FC<IReferralViewProps> = ({ context, itemId, formKey,
const [loading, setLoading] = useState<boolean>(true);
const [error, setError] = useState<string | null>(null);
// Какая из организаций рекомендателя (см. OrganizationField) идёт в печать —
// выбор в тулбаре через PrintOrgSelect, по умолчанию первая.
// выбор в тулбаре через PrintSplitButton, по умолчанию первая.
const [printOrgIndex, setPrintOrgIndex] = useState<number>(0);
// listId уже проверен в ApproveFeature (не смонтировались бы сюда иначе) —
@@ -146,10 +146,7 @@ const ReferralView: React.FC<IReferralViewProps> = ({ context, itemId, formKey,
<div>
<div className={`${styles.toolbar} rp-no-print`}>
{isApprovedStatus(status) && (
<>
<PrintOrgSelect value={data.Organization} selectedIndex={printOrgIndex} onChange={setPrintOrgIndex} />
<PrintButton />
</>
<PrintSplitButton value={data.Organization} selectedIndex={printOrgIndex} onChange={setPrintOrgIndex} />
)}
</div>
@@ -97,7 +97,7 @@ export interface ISectionProps {
* обработчик. Если не передан (режим чтения) — правка через set.
*/
onReferrerChange?: (login: string) => void;
/** Индекс организации для печати (см. shared/ui/PrintOrgSelect и OrganizationField.printIndex). */
/** Индекс организации для печати (см. shared/ui/PrintSplitButton и OrganizationField.printIndex). */
printOrgIndex?: number;
}
@@ -11,8 +11,7 @@ import {
CollapseSection,
FormField,
AttachmentList,
PrintButton,
PrintOrgSelect,
PrintSplitButton,
OrgLetterhead,
Icon
} from '../../shared/ui';
@@ -62,7 +61,7 @@ const TmcTransferView: React.FC<ITmcTransferViewProps> = ({ context, itemId, for
const [loading, setLoading] = useState<boolean>(true);
const [error, setError] = useState<string | null>(null);
// Какая из организаций заявителя (см. OrganizationField) идёт в печать —
// выбор в тулбаре через PrintOrgSelect, по умолчанию первая.
// выбор в тулбаре через PrintSplitButton, по умолчанию первая.
const [printOrgIndex, setPrintOrgIndex] = useState<number>(0);
const { id: requestTypeId } = useRequestTypeId(context, formKey);
@@ -159,8 +158,7 @@ const TmcTransferView: React.FC<ITmcTransferViewProps> = ({ context, itemId, for
Редактировать
</Button>
)}
<PrintOrgSelect value={data.Organization} selectedIndex={printOrgIndex} onChange={setPrintOrgIndex} />
<PrintButton />
<PrintSplitButton value={data.Organization} selectedIndex={printOrgIndex} onChange={setPrintOrgIndex} />
</div>
<div className="rp-print-root">
@@ -66,7 +66,7 @@ export interface ISectionProps {
data: IFormData;
set: SetField;
context: WebPartContext;
/** Индекс организации для печати (см. shared/ui/PrintOrgSelect и OrganizationField.printIndex). */
/** Индекс организации для печати (см. shared/ui/PrintSplitButton и OrganizationField.printIndex). */
printOrgIndex?: number;
/**
* Выбор заявителя подтягивает его ФИО и организации — поэтому у поля отдельный
@@ -2,7 +2,7 @@ import * as React from 'react';
import { useState, useEffect, useMemo, useCallback } from 'react';
import type { WebPartContext } from '@microsoft/sp-webpart-base';
import styles from './UnpaidLeaveView.module.scss';
import { Alert, FormCard, InitiatorLine, FormModeProvider, PrintButton, PrintOrgSelect, OrgLetterhead } from '../../shared/ui';
import { Alert, FormCard, InitiatorLine, FormModeProvider, PrintSplitButton, OrgLetterhead } from '../../shared/ui';
import {
ApproverService,
DecisionPanel,
@@ -48,7 +48,7 @@ const UnpaidLeaveView: React.FC<IUnpaidLeaveViewProps> = ({ context, itemId, for
const [loading, setLoading] = useState<boolean>(true);
const [error, setError] = useState<string | null>(null);
// Какая из организаций сотрудника (см. OrganizationField) идёт в печать —
// выбор в тулбаре через PrintOrgSelect, по умолчанию первая.
// выбор в тулбаре через PrintSplitButton, по умолчанию первая.
const [printOrgIndex, setPrintOrgIndex] = useState<number>(0);
// listId уже проверен в ApproveFeature (не смонтировались бы сюда иначе) —
@@ -121,8 +121,7 @@ const UnpaidLeaveView: React.FC<IUnpaidLeaveViewProps> = ({ context, itemId, for
return (
<div>
<div className={`${styles.toolbar} rp-no-print`}>
<PrintOrgSelect value={data.Organization} selectedIndex={printOrgIndex} onChange={setPrintOrgIndex} />
<PrintButton />
<PrintSplitButton value={data.Organization} selectedIndex={printOrgIndex} onChange={setPrintOrgIndex} />
</div>
<div className="rp-print-root">
@@ -60,7 +60,7 @@ export interface ISectionProps {
* отдельный обработчик. Если не передан (режим чтения) — правка через set.
*/
onEmployeeChange?: (login: string) => void;
/** Индекс организации для печати (см. shared/ui/PrintOrgSelect и OrganizationField.printIndex). */
/** Индекс организации для печати (см. shared/ui/PrintSplitButton и OrganizationField.printIndex). */
printOrgIndex?: number;
}
@@ -2,7 +2,7 @@ import * as React from 'react';
import { useState, useEffect, useMemo, useCallback } from 'react';
import type { WebPartContext } from '@microsoft/sp-webpart-base';
import styles from './VacationView.module.scss';
import { Alert, FormCard, InitiatorLine, FormModeProvider, PrintButton, PrintOrgSelect, OrgLetterhead } from '../../shared/ui';
import { Alert, FormCard, InitiatorLine, FormModeProvider, PrintSplitButton, OrgLetterhead } from '../../shared/ui';
import {
ApproverService,
DecisionPanel,
@@ -48,7 +48,7 @@ const VacationView: React.FC<IVacationViewProps> = ({ context, itemId, formKey,
const [loading, setLoading] = useState<boolean>(true);
const [error, setError] = useState<string | null>(null);
// Какая из организаций сотрудника (см. OrganizationField) идёт в печать —
// выбор в тулбаре через PrintOrgSelect, по умолчанию первая.
// выбор в тулбаре через PrintSplitButton, по умолчанию первая.
const [printOrgIndex, setPrintOrgIndex] = useState<number>(0);
// listId уже проверен в ApproveFeature (не смонтировались бы сюда иначе) —
@@ -121,8 +121,7 @@ const VacationView: React.FC<IVacationViewProps> = ({ context, itemId, formKey,
return (
<div>
<div className={`${styles.toolbar} rp-no-print`}>
<PrintOrgSelect value={data.Organization} selectedIndex={printOrgIndex} onChange={setPrintOrgIndex} />
<PrintButton />
<PrintSplitButton value={data.Organization} selectedIndex={printOrgIndex} onChange={setPrintOrgIndex} />
</div>
<div className="rp-print-root">
@@ -59,7 +59,7 @@ export interface ISectionProps {
* отдельный обработчик. Если не передан (режим чтения) — правка через set.
*/
onEmployeeChange?: (login: string) => void;
/** Индекс организации для печати (см. shared/ui/PrintOrgSelect и OrganizationField.printIndex). */
/** Индекс организации для печати (см. shared/ui/PrintSplitButton и OrganizationField.printIndex). */
printOrgIndex?: number;
}
@@ -11,8 +11,7 @@ import {
CollapseSection,
FormField,
AttachmentList,
PrintButton,
PrintOrgSelect,
PrintSplitButton,
OrgLetterhead,
Icon
} from '../../shared/ui';
@@ -68,7 +67,7 @@ const WorkplaceSetupView: React.FC<IWorkplaceSetupViewProps> = ({ context, itemI
const [canEditFields, setCanEditFields] = useState<boolean>(false);
const [saveState, setSaveState] = useState<SaveState>('idle');
// Какая из организаций заявителя (см. OrganizationField) идёт в печать —
// выбор в тулбаре через PrintOrgSelect, по умолчанию первая.
// выбор в тулбаре через PrintSplitButton, по умолчанию первая.
const [printOrgIndex, setPrintOrgIndex] = useState<number>(0);
const { id: requestTypeId } = useRequestTypeId(context, formKey);
@@ -213,8 +212,7 @@ const WorkplaceSetupView: React.FC<IWorkplaceSetupViewProps> = ({ context, itemI
Редактировать
</Button>
)}
<PrintOrgSelect value={data.Organization} selectedIndex={printOrgIndex} onChange={setPrintOrgIndex} />
<PrintButton />
<PrintSplitButton value={data.Organization} selectedIndex={printOrgIndex} onChange={setPrintOrgIndex} />
</div>
{canEditFields && (
@@ -53,7 +53,7 @@ export interface ISectionProps {
data: IFormData;
set: SetField;
context: WebPartContext;
/** Индекс организации для печати (см. shared/ui/PrintOrgSelect и OrganizationField.printIndex). */
/** Индекс организации для печати (см. shared/ui/PrintSplitButton и OrganizationField.printIndex). */
printOrgIndex?: number;
}