refactor(RecruitingSelection): OpenReason -> VacancyOpenReason (обход коллизии Search)
Колонка OpenReason/OpenReasonDetails называлась одинаково с полями в других списках сайта, из-за чего Search индексировал managed property только у ОДНОГО из них — не у этого (см. sp-write props/field, разбирались 2026-08-28/29 в tnsu-approval-route). Переименование снимает коллизию: VacancyOpenReasonOWSMTXT/ VacancyOpenReasonDetailsOWSTEXT теперь индексируются нормально, проверено. Данные из старых колонок на живом сайте уже перенесены отдельным скриптом (migrate-openreason.sh, разово, вне репозитория). provisioning.json обновлён на новые internalName — он только добавляет колонки, никогда не удаляет, так что старые OpenReason/OpenReasonDetails на сайте провижининг сам не уберёт. load.ts/submit.ts менять не пришлось — оба читают/пишут поля по ключам IFormData обобщённо. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -18,8 +18,15 @@ export interface IFormData {
|
||||
Responsible: string;
|
||||
SubmitDate: string;
|
||||
ClosingDeadline: string;
|
||||
OpenReason: string;
|
||||
OpenReasonDetails: string;
|
||||
/**
|
||||
* Префикс Vacancy — не для читаемости, а обход коллизии managed properties:
|
||||
* колонка называлась просто OpenReason, и Search индексировал её только у
|
||||
* ОДНОГО из списков сайта с таким internal name (см. sp-write props/field в
|
||||
* tools). Переименовали и перенесли данные скриптом (2026-08-29) — трогать
|
||||
* имя обратно нельзя, коллизия вернётся.
|
||||
*/
|
||||
VacancyOpenReason: string;
|
||||
VacancyOpenReasonDetails: string;
|
||||
Companies: ICompany[];
|
||||
ObjectProject: string;
|
||||
ObjectProjectId: string;
|
||||
@@ -92,8 +99,8 @@ export const EMPTY_DATA: IFormData = {
|
||||
Responsible: '',
|
||||
SubmitDate: '',
|
||||
ClosingDeadline: '',
|
||||
OpenReason: '',
|
||||
OpenReasonDetails: '',
|
||||
VacancyOpenReason: '',
|
||||
VacancyOpenReasonDetails: '',
|
||||
Companies: [],
|
||||
ObjectProject: '',
|
||||
ObjectProjectId: '',
|
||||
@@ -149,7 +156,7 @@ export const OPEN_REASON_REPLACE = 'Замена уволенного сотру
|
||||
export const OPEN_REASON_TRANSFER = 'Перевод сотрудника';
|
||||
export const OPEN_REASON_NEW = 'Новая штатная единица';
|
||||
|
||||
/** Варианты «Причина открытия вакансии» — совпадают с choices колонки OpenReason. */
|
||||
/** Варианты «Причина открытия вакансии» — совпадают с choices колонки VacancyOpenReason. */
|
||||
export const OPEN_REASON_OPTIONS: ISelectOption[] = [
|
||||
{ value: OPEN_REASON_REPLACE, label: OPEN_REASON_REPLACE },
|
||||
{ value: OPEN_REASON_TRANSFER, label: OPEN_REASON_TRANSFER },
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
{ "internalName": "RequestStatus", "title": "Статус", "type": "Choice", "choices": ["Черновик", "На согласовании", "Согласовано", "Отклонено", "Возвращена на доработку", "Выполнение", "Закрыта"] },
|
||||
{ "internalName": "Responsible", "title": "Ответственный за подачу заявки", "type": "User", "userSelectionMode": "PeopleOnly", "required": true },
|
||||
{ "internalName": "SubmitDate", "title": "Дата подачи заявки", "type": "DateTime", "dateOnly": true },
|
||||
{ "internalName": "OpenReason", "title": "Причина открытия вакансии", "type": "Choice", "choices": ["Замена уволенного сотрудника", "Перевод сотрудника", "Новая штатная единица", "Другое"] },
|
||||
{ "internalName": "OpenReasonDetails", "title": "Причина открытия — ФИО / уточнение", "type": "Text" },
|
||||
{ "internalName": "VacancyOpenReason", "title": "Причина открытия вакансии", "type": "Choice", "choices": ["Замена уволенного сотрудника", "Перевод сотрудника", "Новая штатная единица", "Другое"] },
|
||||
{ "internalName": "VacancyOpenReasonDetails", "title": "Причина открытия — ФИО / уточнение", "type": "Text" },
|
||||
{ "internalName": "CompaniesJson", "title": "Компании (JSON)", "type": "Note" },
|
||||
{ "internalName": "ObjectProject", "title": "Объект/Проект", "type": "Text" },
|
||||
{ "internalName": "ObjectProjectId", "title": "Объект/Проект — Id", "type": "Text" },
|
||||
|
||||
+10
-10
@@ -11,7 +11,7 @@ import {
|
||||
} from '../model';
|
||||
|
||||
export const ApplicationSection: React.FC<ISectionProps> = ({ data, set, context, onResponsibleChange }) => {
|
||||
const reason = data.OpenReason;
|
||||
const reason = data.VacancyOpenReason;
|
||||
const showReasonDetails = reason !== '' && reason !== OPEN_REASON_NEW;
|
||||
const reasonDetailsLabel =
|
||||
reason === OPEN_REASON_REPLACE || reason === OPEN_REASON_TRANSFER ? 'ФИО сотрудника' : 'Уточните причину';
|
||||
@@ -45,24 +45,24 @@ export const ApplicationSection: React.FC<ISectionProps> = ({ data, set, context
|
||||
onChange={(v) => set('ClosingDeadline', v)}
|
||||
/>
|
||||
</FormField>
|
||||
<FormField label="1.5 Причина открытия вакансии" htmlFor="OpenReason">
|
||||
<FormField label="1.5 Причина открытия вакансии" htmlFor="VacancyOpenReason">
|
||||
<Select
|
||||
id="OpenReason"
|
||||
value={data.OpenReason}
|
||||
id="VacancyOpenReason"
|
||||
value={data.VacancyOpenReason}
|
||||
onChange={(v) => {
|
||||
set('OpenReason', v);
|
||||
if (v === '' || v === OPEN_REASON_NEW) set('OpenReasonDetails', '');
|
||||
set('VacancyOpenReason', v);
|
||||
if (v === '' || v === OPEN_REASON_NEW) set('VacancyOpenReasonDetails', '');
|
||||
}}
|
||||
options={OPEN_REASON_OPTIONS}
|
||||
placeholder="— выберите —"
|
||||
/>
|
||||
</FormField>
|
||||
{showReasonDetails && (
|
||||
<FormField label={reasonDetailsLabel} htmlFor="OpenReasonDetails">
|
||||
<FormField label={reasonDetailsLabel} htmlFor="VacancyOpenReasonDetails">
|
||||
<TextInput
|
||||
id="OpenReasonDetails"
|
||||
value={data.OpenReasonDetails}
|
||||
onChange={(v) => set('OpenReasonDetails', v)}
|
||||
id="VacancyOpenReasonDetails"
|
||||
value={data.VacancyOpenReasonDetails}
|
||||
onChange={(v) => set('VacancyOpenReasonDetails', v)}
|
||||
/>
|
||||
</FormField>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user