diff --git a/src/webparts/requestPortal/forms/Vacation/README.md b/src/webparts/requestPortal/forms/Vacation/README.md index 8ae6b46..3cb8677 100644 --- a/src/webparts/requestPortal/forms/Vacation/README.md +++ b/src/webparts/requestPortal/forms/Vacation/README.md @@ -28,6 +28,9 @@ - **Даты окончания нет**: отпуск задаётся началом и количеством дней, чтобы не считать праздники и выходные. Колонка `EndDate` не используется: из провижининга, типа контента и представления она убрана (само системное поле SharePoint `FromBaseType` удалить нельзя). - **Заголовок элемента** (`Title`): `Отпуск — {ФИО} — дд.мм.гггг`. +- **Комментарий** (с 10-28, `VacationComment`, Note) — необязательный, заполняет инициатор, + последним полем секции; в просмотре пустой не показывается. В DOCX для ЭДО (`vacationDocument.ts`) не идёт; при печати + просмотра виден, как остальные поля секции. ## Подписание в ЭДО > **Сейчас выключено** (`VACATION_EDO_SIGNING_ENABLED = false` в `shared/config.ts`): решение последнего @@ -71,7 +74,7 @@ SLA на бэкенде approval-route этот код не вызывает — такое заявление на подпись не уйдёт. ## Секции формы -RequestSection (сотрудник · должность · дата начала · количество дней) +RequestSection (сотрудник · должность · дата начала · количество дней · замещающий · комментарий) ## Точки входа - rptype: `hr-vacation` diff --git a/src/webparts/requestPortal/forms/Vacation/load.ts b/src/webparts/requestPortal/forms/Vacation/load.ts index 34d5c16..2977489 100644 --- a/src/webparts/requestPortal/forms/Vacation/load.ts +++ b/src/webparts/requestPortal/forms/Vacation/load.ts @@ -34,6 +34,7 @@ export async function loadVacationRequest(itemId: number, listId?: string): Prom 'DepartmentId', 'Project', 'ProjectId', + 'VacationComment', 'RequestStatus', 'RequestUniqueCode', 'Employee/Title', @@ -58,7 +59,8 @@ export async function loadVacationRequest(itemId: number, listId?: string): Prom Department: (item.Department as string) || '', DepartmentId: (item.DepartmentId as string) || '', Project: (item.Project as string) || '', - ProjectId: (item.ProjectId as string) || '' + ProjectId: (item.ProjectId as string) || '', + VacationComment: (item.VacationComment as string) || '' }; return { diff --git a/src/webparts/requestPortal/forms/Vacation/model.ts b/src/webparts/requestPortal/forms/Vacation/model.ts index 3f55b10..523027c 100644 --- a/src/webparts/requestPortal/forms/Vacation/model.ts +++ b/src/webparts/requestPortal/forms/Vacation/model.ts @@ -44,6 +44,8 @@ export interface IFormData { Project: string; /** oid проекта ('' — если введён вручную без выбора из списка). */ ProjectId: string; + /** Комментарий инициатора к заявке — необязательный, для согласующих. */ + VacationComment: string; } /** Обновление одного поля формы с сохранением типа значения. */ @@ -73,7 +75,8 @@ export const EMPTY_DATA: IFormData = { Department: '', DepartmentId: '', Project: '', - ProjectId: '' + ProjectId: '', + VacationComment: '' }; /** Плейсхолдер для поля выбора сотрудника. */ diff --git a/src/webparts/requestPortal/forms/Vacation/provisioning.json b/src/webparts/requestPortal/forms/Vacation/provisioning.json index 7bce38e..ce3db6b 100644 --- a/src/webparts/requestPortal/forms/Vacation/provisioning.json +++ b/src/webparts/requestPortal/forms/Vacation/provisioning.json @@ -13,6 +13,7 @@ { "internalName": "Department", "title": "Подразделение", "type": "Text" }, { "internalName": "DepartmentId", "title": "Id подразделения (справочник)", "type": "Text" }, { "internalName": "Project", "title": "Проект", "type": "Text" }, - { "internalName": "ProjectId", "title": "Id проекта (справочник)", "type": "Text" } + { "internalName": "ProjectId", "title": "Id проекта (справочник)", "type": "Text" }, + { "internalName": "VacationComment", "title": "Комментарий", "type": "Note" } ] } diff --git a/src/webparts/requestPortal/forms/Vacation/sections/RequestSection.tsx b/src/webparts/requestPortal/forms/Vacation/sections/RequestSection.tsx index 8c2603c..9f5d47a 100644 --- a/src/webparts/requestPortal/forms/Vacation/sections/RequestSection.tsx +++ b/src/webparts/requestPortal/forms/Vacation/sections/RequestSection.tsx @@ -1,60 +1,75 @@ import * as React from 'react'; -import { FormGrid, FormField, TextInput, PeopleField, OrganizationTable } from '../../../shared/ui'; +import { FormGrid, FormField, TextInput, TextArea, PeopleField, OrganizationTable, useFormReadOnly } from '../../../shared/ui'; import { ProjectPicker } from '../../../shared/dictionary'; import { ISectionProps, EMPLOYEE_PLACEHOLDER, SUBSTITUTE_PLACEHOLDER, MIN_NOTICE_DAYS, MAX_DAYS } from '../model'; import { isoDatePlusDays } from '../../../shared/dateUtils'; /** Единственная секция формы «Заявка на отпуск»: сотрудник (должность и подразделение подтягиваются из справочника), даты. */ -export const RequestSection: React.FC = ({ data, set, context, onEmployeeChange, printOrgIndex }) => ( - - - set('Employee', v))} - placeholder={EMPLOYEE_PLACEHOLDER} - /> - - - - { - set('Project', name); - set('ProjectId', id); - }} - placeholder="Начните вводить название или код проекта…" - /> - - - set('StartDate', v)} - min={isoDatePlusDays(MIN_NOTICE_DAYS)} - /> - - - set('DaysCount', v)} - min={1} - max={MAX_DAYS} - placeholder={`от 1 до ${MAX_DAYS}`} - /> - - - set('Substitute', v)} - placeholder={SUBSTITUTE_PLACEHOLDER} - /> - - -); +export const RequestSection: React.FC = ({ data, set, context, onEmployeeChange, printOrgIndex }) => { + const readOnly = useFormReadOnly(); + + return ( + + + set('Employee', v))} + placeholder={EMPLOYEE_PLACEHOLDER} + /> + + + + { + set('Project', name); + set('ProjectId', id); + }} + placeholder="Начните вводить название или код проекта…" + /> + + + set('StartDate', v)} + min={isoDatePlusDays(MIN_NOTICE_DAYS)} + /> + + + set('DaysCount', v)} + min={1} + max={MAX_DAYS} + placeholder={`от 1 до ${MAX_DAYS}`} + /> + + + set('Substitute', v)} + placeholder={SUBSTITUTE_PLACEHOLDER} + /> + + {/* Пустой комментарий в просмотре не показываем — пустое поле только мешает читать. */} + {(!readOnly || data.VacationComment.trim()) && ( + +