скрипт
This commit is contained in:
@@ -24,8 +24,9 @@ import {
|
||||
findUnassignedStep
|
||||
} from '../../shared/approval';
|
||||
import { IRequestFormProps } from '../../models/types';
|
||||
import { IFormData, EMPTY_DATA, SetField } from './model';
|
||||
import { saveClearanceRequest, clearanceApprovalService, DATA_LIST_TITLE, APPROVAL_LIST_TITLE } from './submit';
|
||||
import { approvalListTitle, dataListTitle } from '../../shared/listTitles';
|
||||
import { FORM_ID, IFormData, EMPTY_DATA, SetField } from './model';
|
||||
import { saveClearanceRequest, clearanceApprovalService } from './submit';
|
||||
import { loadClearanceRequest } from './load';
|
||||
import { RequestSection } from './sections/RequestSection';
|
||||
|
||||
@@ -160,8 +161,8 @@ const ClearanceForm: React.FC<IRequestFormProps> = ({ requestType, context, onCa
|
||||
if (status === REQUEST_STATUS.onApproval) {
|
||||
await notifyActiveStep(context, approval, id, {
|
||||
requestTypeId: rtId,
|
||||
dataListName: DATA_LIST_TITLE,
|
||||
approvalListName: APPROVAL_LIST_TITLE
|
||||
dataListName: dataListTitle(FORM_ID),
|
||||
approvalListName: approvalListTitle(FORM_ID)
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -196,7 +197,7 @@ const ClearanceForm: React.FC<IRequestFormProps> = ({ requestType, context, onCa
|
||||
<FormCard
|
||||
title={requestType.title}
|
||||
subtitle="Категория: Отдел кадров"
|
||||
belowSubtitle={<InitiatorLine listTitle={DATA_LIST_TITLE} itemId={requestId} />}
|
||||
belowSubtitle={<InitiatorLine listTitle={dataListTitle(FORM_ID)} itemId={requestId} />}
|
||||
headerRight={
|
||||
requestId || requestStatus ? (
|
||||
<>
|
||||
|
||||
@@ -13,14 +13,13 @@ import {
|
||||
useRequestTypeId,
|
||||
APPROVAL_PHASE
|
||||
} from '../../shared/approval';
|
||||
import { IFormData, EMPTY_DATA, SetField } from './model';
|
||||
import { approvalListTitle, dataListTitle } from '../../shared/listTitles';
|
||||
import { FORM_ID, IFormData, EMPTY_DATA, SetField } from './model';
|
||||
import { loadClearanceRequest } from './load';
|
||||
import {
|
||||
clearanceApprovalService,
|
||||
updateApproverFields,
|
||||
IApproverEditableFields,
|
||||
DATA_LIST_TITLE,
|
||||
APPROVAL_LIST_TITLE
|
||||
IApproverEditableFields
|
||||
} from './submit';
|
||||
import { canEditHrRecordsFields, canEditParkingField } from './approverRights';
|
||||
import { RequestSection } from './sections/RequestSection';
|
||||
@@ -51,7 +50,10 @@ const ClearanceView: React.FC<IClearanceViewProps> = ({ context, itemId, formKey
|
||||
|
||||
const approval = useMemo(() => clearanceApprovalService(), []);
|
||||
const { id: requestTypeId } = useRequestTypeId(context, formKey);
|
||||
const approverService = useMemo(() => new ApproverService(approval, DATA_LIST_TITLE), [approval]);
|
||||
const approverService = useMemo(
|
||||
() => new ApproverService(approval, dataListTitle(FORM_ID)),
|
||||
[approval]
|
||||
);
|
||||
|
||||
// Матрица маршрута из фактических строк заявки (read-only). decisionSeq в
|
||||
// reloadKey: после решения строки на сервере меняются — перечитываем матрицу.
|
||||
@@ -155,8 +157,8 @@ const ClearanceView: React.FC<IClearanceViewProps> = ({ context, itemId, formKey
|
||||
if (!requestTypeId) return;
|
||||
notifyActiveStep(context, approval, itemId, {
|
||||
requestTypeId,
|
||||
dataListName: DATA_LIST_TITLE,
|
||||
approvalListName: APPROVAL_LIST_TITLE
|
||||
dataListName: dataListTitle(FORM_ID),
|
||||
approvalListName: approvalListTitle(FORM_ID)
|
||||
}).catch(() => undefined);
|
||||
};
|
||||
|
||||
@@ -185,7 +187,7 @@ const ClearanceView: React.FC<IClearanceViewProps> = ({ context, itemId, formKey
|
||||
<FormCard
|
||||
title="Обходной лист"
|
||||
subtitle={`№${code || itemId}`}
|
||||
belowSubtitle={<InitiatorLine listTitle={DATA_LIST_TITLE} itemId={itemId} />}
|
||||
belowSubtitle={<InitiatorLine listTitle={dataListTitle(FORM_ID)} itemId={itemId} />}
|
||||
headerRight={status ? <StatusBadge status={status} /> : undefined}
|
||||
>
|
||||
<FormModeProvider readOnly>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { getSP } from '../../shared/pnp/pnpjs';
|
||||
import { IFormData, EMPTY_DATA } from './model';
|
||||
|
||||
const LIST_TITLE = 'Обходной лист — данные';
|
||||
import { dataListTitle } from '../../shared/listTitles';
|
||||
import { FORM_ID, IFormData, EMPTY_DATA } from './model';
|
||||
|
||||
export interface ILoadedRequest {
|
||||
data: IFormData;
|
||||
@@ -15,7 +14,7 @@ export interface ILoadedRequest {
|
||||
/** Прочитать обходной лист по id: модель формы + статус (правка / просмотр). */
|
||||
export async function loadClearanceRequest(itemId: number): Promise<ILoadedRequest> {
|
||||
const item = (await getSP()
|
||||
.web.lists.getByTitle(LIST_TITLE)
|
||||
.web.lists.getByTitle(dataListTitle(FORM_ID))
|
||||
.items.getById(itemId)
|
||||
.select(
|
||||
'Id',
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
import { WebPartContext } from '@microsoft/sp-webpart-base';
|
||||
import { RequestTypeId } from '../../models/types';
|
||||
|
||||
/**
|
||||
* Тип заявки этой формы — ключ реестра форм (forms/registry.ts). Имена списков
|
||||
* SharePoint выводятся из него, см. shared/listTitles.ts.
|
||||
*/
|
||||
export const FORM_ID: RequestTypeId = 'clearance-form';
|
||||
|
||||
/**
|
||||
* Данные формы «Обходной лист». Ключи по возможности = internalName колонок
|
||||
* SP-списка «Обходной лист — данные». Employee хранит e-mail УВОЛЬНЯЕМОГО
|
||||
* списка данных этой формы (см. shared/listTitles.ts). Employee хранит e-mail УВОЛЬНЯЕМОГО
|
||||
* сотрудника (то, что отдаёт PeopleField) — заявку подаёт HR/руководитель,
|
||||
* а не сам увольняемый, поэтому и маршрут согласования резолвится по email
|
||||
* из этого поля, а не по email инициатора (как в «Заявке на отпуск»).
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
import { getSP } from '../../shared/pnp/pnpjs';
|
||||
import { ApprovalListService, IApproverToWrite, writeRoute } from '../../shared/approval';
|
||||
import { buildRequestUniqueCode } from '../../shared/requestCode';
|
||||
import { IFormData } from './model';
|
||||
|
||||
export const DATA_LIST_TITLE = 'Обходной лист — данные';
|
||||
export const APPROVAL_LIST_TITLE = 'Обходной лист — согласование';
|
||||
import { approvalListTitle, dataListTitle } from '../../shared/listTitles';
|
||||
import { FORM_ID, IFormData } from './model';
|
||||
|
||||
/** Экземпляр сервиса списка согласования этой формы. */
|
||||
export function clearanceApprovalService(): ApprovalListService {
|
||||
return new ApprovalListService(APPROVAL_LIST_TITLE);
|
||||
return new ApprovalListService(approvalListTitle(FORM_ID));
|
||||
}
|
||||
|
||||
/** Отметки, которые проставляет не инициатор, а профильный согласующий (см. approverRights.ts). */
|
||||
@@ -36,7 +34,7 @@ export async function updateApproverFields(
|
||||
Number.isFinite(amount) && fields.TrainingAmount.trim() !== '' ? amount : null;
|
||||
}
|
||||
if (Object.keys(item).length === 0) return;
|
||||
await getSP().web.lists.getByTitle(DATA_LIST_TITLE).items.getById(id).update(item);
|
||||
await getSP().web.lists.getByTitle(dataListTitle(FORM_ID)).items.getById(id).update(item);
|
||||
}
|
||||
|
||||
/** email / claims-логин → пользователь сайта (Id для Person-поля + Title для заголовка). */
|
||||
@@ -90,7 +88,7 @@ export async function saveClearanceRequest(
|
||||
approvers: IApproverToWrite[],
|
||||
status: string
|
||||
): Promise<ISaveResult> {
|
||||
const list = getSP().web.lists.getByTitle(DATA_LIST_TITLE);
|
||||
const list = getSP().web.lists.getByTitle(dataListTitle(FORM_ID));
|
||||
const employee = await ensureEmployee(data.Employee);
|
||||
const item = buildItem(data, status, employee.Id, employee.Title || data.Employee);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user