diff --git a/src/webparts/requestPortal/forms/Dismissal/README.md b/src/webparts/requestPortal/forms/Dismissal/README.md index 28e3e2d..8be7d0b 100644 --- a/src/webparts/requestPortal/forms/Dismissal/README.md +++ b/src/webparts/requestPortal/forms/Dismissal/README.md @@ -28,20 +28,22 @@ RequestTypeId» в `docs/forms.md`). Тип заведён в админке app People-picker (`Employee`), маршрут резолвится по e-mail **выбранного** сотрудника, reloadKey матрицы включает `data.Employee` и должность основной компании (см. ниже). - **Автоподстановка при выборе сотрудника:** вся таблица организаций — из ОДНОГО - справочника `Employee/ByEmail` (`shared/dictionary`) — см. «Организация · - подразделение · должность». -- **«Организация · подразделение · должность»** (`OrganizationsTable`, - `forms/Dismissal/sections/`) — ЕДИНСТВЕННОЕ место для компании, департамента и + справочника `Employee/ByEmail` (`shared/dictionary`) — см. ниже. +- **Таблица организаций** (`OrganizationsTable`, `forms/Dismissal/sections/`, без + подписи над собой — у неё уже есть заголовки колонок «Компания» / «Структурное + подразделение» / «Должность») — ЕДИНСТВЕННОЕ место для компании, подразделения и должности, и на форме подачи (редактируемая), и в режиме просмотра (read-only) — отдельных полей для них нет (были бы дублированием). `data.Organization: - IOrganizationRecord[]` — массив `{company, department, position}`, компания и - департамент по каждой строке read-only; редактируется только должность ПЕРВОЙ - (основной) записи — `primaryPosition(data.Organization)`, используется маршрутом - (условие «IsManager») и обязательна валидацией; должности остальных компаний - (совместитель) — информационные. Справочник ничего не вернул (сотрудник не найден - в api.tnsu.kz) — таблица всё равно рендерится одной строкой с прочерками вместо - компании/департамента и редактируемой должностью: иначе такому человеку нечем было - бы заполнить обязательное поле. + IOrganizationRecord[]` — массив `{company, department, position}`; поле называется + `department` (тот же справочник `Section`, что и раньше — см. следующий абзац), + колонка называется «Структурное подразделение», и то и другое read-only. Должность + редактируема В ЛЮБОЙ строке (справочник не всегда точен), но маршрут (условие + «IsManager») и обязательность по валидации завязаны ТОЛЬКО на должность ПЕРВОЙ + (основной) записи — `primaryPosition(data.Organization)`; должности остальных + компаний правятся, но ни на что не влияют. Справочник ничего не вернул (сотрудник + не найден в api.tnsu.kz) — таблица всё равно рендерится одной строкой с прочерками + вместо компании/подразделения и редактируемой должностью: иначе такому человеку + нечем было бы заполнить обязательное поле. **Хранение в SharePoint — три ПАРАЛЛЕЛЬНЫХ JSON-столбца**, не один общий блок: `Organization`/`Department`/`Position` — каждый содержит JSON-массив строк diff --git a/src/webparts/requestPortal/forms/Dismissal/sections/OrganizationsTable.module.scss b/src/webparts/requestPortal/forms/Dismissal/sections/OrganizationsTable.module.scss index ae32ded..53de8a3 100644 --- a/src/webparts/requestPortal/forms/Dismissal/sections/OrganizationsTable.module.scss +++ b/src/webparts/requestPortal/forms/Dismissal/sections/OrganizationsTable.module.scss @@ -1,5 +1,13 @@ @import '../../../../../styles/design-tokens'; +// Занять обе колонки сетки формы — то же, что даёт проп full у FormField +// (._full_1wk7n_8{grid-column:1/-1} в @tnsu/ui-kit), без самого FormField: +// подпись над таблицей не нужна, у неё уже есть заголовки колонок. +.wrapper { + grid-column: 1 / -1; + min-width: 0; +} + .table { width: 100%; border-collapse: collapse; diff --git a/src/webparts/requestPortal/forms/Dismissal/sections/OrganizationsTable.tsx b/src/webparts/requestPortal/forms/Dismissal/sections/OrganizationsTable.tsx index dbaeaeb..184cdd3 100644 --- a/src/webparts/requestPortal/forms/Dismissal/sections/OrganizationsTable.tsx +++ b/src/webparts/requestPortal/forms/Dismissal/sections/OrganizationsTable.tsx @@ -1,18 +1,18 @@ import * as React from 'react'; -import { FormField, Icon, TextInput } from '../../../shared/ui'; +import { Icon, TextInput } from '../../../shared/ui'; import { IOrganizationRecord } from '../model'; import styles from './OrganizationsTable.module.scss'; interface IOrganizationsTableProps { records: IOrganizationRecord[]; /** - * Должность ПЕРВОЙ (основной) компании редактируема — единственная ячейка - * таблицы, у которой это так: маршрут согласования резолвится по НЕЙ (см. - * DismissalForm — fieldValues.Position), должности остальных компаний - * (совместитель) — только для просмотра, ставить им что-то в соответствие - * незачем. Не задано — вся таблица read-only (режим просмотра, DismissalView). + * Должность любой строки можно поправить — справочник не всегда точен, а + * условие маршрута «IsManager» резолвится по должности ПЕРВОЙ (основной) + * компании (см. DismissalForm — primaryPosition/fieldValues.Position), так + * что расхождение со справочником там, где оно есть, важно уметь исправить. + * Не задано — вся таблица read-only (режим просмотра, DismissalView). */ - onChangePosition?: (value: string) => void; + onChangePosition?: (index: number, value: string) => void; /** * Убрать компанию из заявления — есть только на форме подачи (см. * DismissalForm.handleRemoveOrganization), не в режиме просмотра: там состав @@ -22,7 +22,7 @@ interface IOrganizationsTableProps { } /** - * Организации сотрудника — ЕДИНСТВЕННОЕ место для компании/департамента/ + * Организации сотрудника — ЕДИНСТВЕННОЕ место для компании/подразделения/ * должности, и на форме подачи (редактируемая — см. onChangePosition/onRemove), * и в режиме просмотра заявки (read-only, те же данные из сохранённой заявки, * а не live-запрос к справочнику — см. DismissalView). Раньше это были @@ -42,17 +42,21 @@ interface IOrganizationsTableProps { * редактируемой должностью: без этого заявление на человека без карточки в * справочнике нельзя было бы подать вовсе (некуда вписать должность вручную — * а маршрут согласования без неё не резолвит условие «IsManager»). + * + * Без обёртки FormField/подписи над таблицей намеренно — у нёе уже есть + * заголовки колонок, дублировать их общей подписью незачем; full-ширина взята + * напрямую (см. .wrapper), а не через FormField (там label обязателен). */ export const OrganizationsTable: React.FC = ({ records, onChangePosition, onRemove }) => { const rows = records.length > 0 ? records : [undefined]; return ( - +
- + {onRemove && @@ -62,9 +66,13 @@ export const OrganizationsTable: React.FC = ({ records - {i === 0 && onChangePosition ? ( + {onChangePosition ? ( ) : ( @@ -88,6 +96,6 @@ export const OrganizationsTable: React.FC = ({ records ))}
КомпанияДепартаментСтруктурное подразделение Должность}
{r?.company || '—'} {r?.department || '—'} - + onChangePosition(i, v)} + placeholder="Введите должность" + /> {r?.position || '—'}
- +
); }; diff --git a/src/webparts/requestPortal/forms/Dismissal/sections/RequestSection.tsx b/src/webparts/requestPortal/forms/Dismissal/sections/RequestSection.tsx index b7186c3..3b65fe8 100644 --- a/src/webparts/requestPortal/forms/Dismissal/sections/RequestSection.tsx +++ b/src/webparts/requestPortal/forms/Dismissal/sections/RequestSection.tsx @@ -37,7 +37,7 @@ export const RequestSection: React.FC = ({ placeholder={EMPLOYEE_PLACEHOLDER} />
- {/* ЕДИНСТВЕННОЕ место для компании/департамента/должности — и на форме + {/* ЕДИНСТВЕННОЕ место для компании/подразделения/должности — и на форме подачи (редактируемая, onRemoveOrganization задан), и в просмотре (read-only, ничего не передано). Отдельных полей для них нет — были бы дублированием того, что уже показывает эта таблица. */} @@ -45,11 +45,11 @@ export const RequestSection: React.FC = ({ records={data.Organization} onChangePosition={ onRemoveOrganization && - ((v) => + ((i, v) => set( 'Organization', data.Organization.length > 0 - ? data.Organization.map((r, i) => (i === 0 ? { ...r, position: v } : r)) + ? data.Organization.map((r, ri) => (ri === i ? { ...r, position: v } : r)) : [{ company: '', department: '', position: v }] )) }