Files
request-portal/src/webparts/requestPortal/forms/viewRegistry.ts
T
Тимур Городецкий 8eb5b13985 feat: форма «Заявка на командировку»
Цифровая версия бумажной заявки на командировку (отдел кадров). Можно
подать за другого сотрудника; маршрут — лентой точек (город + объект из
справочника проектов + даты) с видом транспорта на каждом участке и
вторым видом «Схема» (SVG, как схема метро). Задание — список задач.
Смета — карточками статей (суточные, проезд, проживание, страховка,
виза, другие расходы) с позициями, привязанными к точкам и участкам
маршрута; суммы только вручную, итог с долями и разбивкой по объектам.
Печать — без шапки с адресатом.

Плитка пока только для тестировщиков (comingSoon): списки SharePoint
не провизионированы, тип заявки и маршрут в админке не заведены.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 10:20:15 +05:00

87 lines
3.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import * as React from 'react';
import type { WebPartContext } from '@microsoft/sp-webpart-base';
export interface IApprovalViewProps {
context: WebPartContext;
itemId: number;
/**
* Ключ формы (= pageUrl типа заявки в approval-route API) — тот же, что и
* rptype в ссылке (см. ApproveFeature). Нужен режиму согласующего, чтобы
* самому резолвить числовой RequestTypeId через useRequestTypeId (форма
* подачи получает готовый requestType.id, а View — только itemId/context).
*/
formKey: string;
/**
* Партиция (серверный url списка), где лежит именно ЭТА заявка — см.
* shared/approval/listPartitions.ts. Не задан — просмотр откатывается на
* текущую партицию типа заявки (старые ссылки без параметра).
*/
listId?: string;
/**
* Уведомление о загруженном уникальном коде заявки — нужен родителю
* (RequestPortal) для заголовка Drawer, который рендерится ДО того, как
* View успевает загрузить саму заявку и узнать её код.
*/
onCodeLoaded?: (code: string) => void;
}
type ViewComponent = React.ComponentType<IApprovalViewProps>;
/**
* Реестр форм «только для чтения» (режим согласующего): ключ формы → ленивый просмотр.
* Добавить просмотр = создать <Форма>View.tsx + строка здесь.
*/
const viewRegistry: Record<string, React.LazyExoticComponent<ViewComponent>> = {
'recruiting-selection': React.lazy(
() => import(/* webpackChunkName: 'view-recruiting-selection' */ './RecruitingSelection/RecruitingSelectionView')
),
'recruiting-hire': React.lazy(
() => import(/* webpackChunkName: 'view-recruiting-hire' */ './RecruitingHire/RecruitingHireView')
),
'recruiting-referral': React.lazy(
() => import(/* webpackChunkName: 'view-referral' */ './Referral/ReferralView')
),
'it-workplace-setup': React.lazy(
() => import(/* webpackChunkName: 'view-workplace-setup' */ './WorkplaceSetup/WorkplaceSetupView')
),
'it-1c-ticket': React.lazy(
() => import(/* webpackChunkName: 'view-1c-ticket' */ './Ticket1C/Ticket1CView')
),
'hr-vacation': React.lazy(
() => import(/* webpackChunkName: 'view-vacation' */ './Vacation/VacationView')
),
'hr-unpaid-leave': React.lazy(
() => import(/* webpackChunkName: 'view-unpaid-leave' */ './UnpaidLeave/UnpaidLeaveView')
),
'hr-skud-explanation': React.lazy(
() => import(/* webpackChunkName: 'view-skud-explanation' */ './SkudExplanation/SkudExplanationView')
),
'hr-business-trip': React.lazy(
() => import(/* webpackChunkName: 'view-business-trip' */ './BusinessTrip/BusinessTripView')
),
'wh-tmc-transfer': React.lazy(
() => import(/* webpackChunkName: 'view-tmc-transfer' */ './TmcTransfer/TmcTransferView')
),
'wh-service-request': React.lazy(
() => import(/* webpackChunkName: 'view-service-request' */ './ServiceRequest/ServiceRequestView')
),
'clearance-form': React.lazy(
() => import(/* webpackChunkName: 'view-clearance' */ './Clearance/ClearanceView')
),
'hr-dismissal': React.lazy(
() => import(/* webpackChunkName: 'view-dismissal' */ './Dismissal/DismissalView')
),
'hr-transfer': React.lazy(
() => import(/* webpackChunkName: 'view-employee-transfer' */ './EmployeeTransfer/EmployeeTransferView')
),
'wh-concrete-request': React.lazy(
() => import(/* webpackChunkName: 'view-concrete-request' */ './ConcreteRequest/ConcreteRequestView')
)
};
export function getViewComponent(
formKey: string
): React.LazyExoticComponent<ViewComponent> | undefined {
return viewRegistry[formKey];
}