feat: название заявки на подбор «Подбор — Должность — Проект»
Tests / frontend-test (push) Successful in 1m14s
Tests / frontend-test (push) Successful in 1m14s
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import { ApprovalListService, IApproverToWrite, approvalServiceFor, writeRoute } from '../../shared/approval';
|
import { ApprovalListService, IApproverToWrite, approvalServiceFor, writeRoute } from '../../shared/approval';
|
||||||
import { ISaveItemResult, resolveDataList, saveRequestItem } from '../../shared/dataList';
|
import { ISaveItemResult, resolveDataList, saveRequestItem } from '../../shared/dataList';
|
||||||
import { IFieldChange, serializeFieldChanges } from '../../shared/fieldChanges/fieldChanges';
|
import { IFieldChange, serializeFieldChanges } from '../../shared/fieldChanges/fieldChanges';
|
||||||
|
import { buildRequestTitle } from '../../shared/requestTitle';
|
||||||
import { FORM_ID, IFormData } from './model';
|
import { FORM_ID, IFormData } from './model';
|
||||||
import { APPROVER_CHANGES_FIELD } from './changeTracking';
|
import { APPROVER_CHANGES_FIELD } from './changeTracking';
|
||||||
|
|
||||||
@@ -16,9 +17,9 @@ export function hireApprovalService(listId?: string): ApprovalListService {
|
|||||||
return approvalServiceFor(FORM_ID, listId);
|
return approvalServiceFor(FORM_ID, listId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Осмысленный заголовок элемента списка (системная колонка Title). */
|
/** Название заявки (Title): «Прием — ФИО кандидата — Должность». */
|
||||||
function buildTitle(data: IFormData): string {
|
function buildTitle(data: IFormData): string {
|
||||||
return ['Прием', data.HireCandidateName, data.Position].filter(Boolean).join(' — ');
|
return buildRequestTitle('Прием', [data.HireCandidateName, data.Position]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Поля элемента списка данных из модели формы (текст/выбор/даты/числа), без статуса. */
|
/** Поля элемента списка данных из модели формы (текст/выбор/даты/числа), без статуса. */
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { getSP } from '../../shared/pnp/pnpjs';
|
|||||||
import { ApprovalListService, IApproverToWrite, approvalServiceFor, writeRoute } from '../../shared/approval';
|
import { ApprovalListService, IApproverToWrite, approvalServiceFor, writeRoute } from '../../shared/approval';
|
||||||
import { ISaveItemResult, resolveDataList, saveRequestItem } from '../../shared/dataList';
|
import { ISaveItemResult, resolveDataList, saveRequestItem } from '../../shared/dataList';
|
||||||
import { IFieldChange, serializeFieldChanges } from '../../shared/fieldChanges/fieldChanges';
|
import { IFieldChange, serializeFieldChanges } from '../../shared/fieldChanges/fieldChanges';
|
||||||
|
import { buildRequestTitle } from '../../shared/requestTitle';
|
||||||
import { FORM_ID, IFormData } from './model';
|
import { FORM_ID, IFormData } from './model';
|
||||||
import { APPROVER_CHANGES_FIELD } from './changeTracking';
|
import { APPROVER_CHANGES_FIELD } from './changeTracking';
|
||||||
|
|
||||||
@@ -27,9 +28,14 @@ async function resolveUserId(login: string): Promise<number> {
|
|||||||
return ensured.Id;
|
return ensured.Id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Скалярные/числовые/да-нет поля из модели (людей и статус пропускаем — они отдельно). */
|
/** Название заявки (Title): «Подбор — Должность — Объект/Проект». */
|
||||||
|
function buildTitle(data: IFormData): string {
|
||||||
|
return buildRequestTitle('Подбор', [data.Position, data.ObjectProject]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Скалярные/числовые/да-нет поля из модели + название (людей и статус пропускаем — они отдельно). */
|
||||||
function buildScalarBody(data: IFormData): Record<string, unknown> {
|
function buildScalarBody(data: IFormData): Record<string, unknown> {
|
||||||
const item: Record<string, unknown> = {};
|
const item: Record<string, unknown> = { Title: buildTitle(data) };
|
||||||
(Object.keys(data) as (keyof IFormData)[]).forEach((key) => {
|
(Object.keys(data) as (keyof IFormData)[]).forEach((key) => {
|
||||||
if (PERSON_FIELDS.indexOf(key) !== -1 || MULTI_PERSON_FIELDS.indexOf(key) !== -1) {
|
if (PERSON_FIELDS.indexOf(key) !== -1 || MULTI_PERSON_FIELDS.indexOf(key) !== -1) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import { buildRequestTitle } from './requestTitle';
|
||||||
|
|
||||||
|
describe('buildRequestTitle', () => {
|
||||||
|
it('склеивает тип и части через тире', () => {
|
||||||
|
expect(buildRequestTitle('Подбор', ['Инженер', 'Проект X'])).toBe('Подбор — Инженер — Проект X');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('пропускает пустые и пробельные части', () => {
|
||||||
|
expect(buildRequestTitle('Подбор', ['', ' Проект X '])).toBe('Подбор — Проект X');
|
||||||
|
expect(buildRequestTitle('Прием', ['', ''])).toBe('Прием');
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
/** Разделитель частей названия заявки. */
|
||||||
|
const TITLE_SEPARATOR = ' — ';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Название заявки (системная колонка Title списка данных): тип + ключевые
|
||||||
|
* поля через тире, пустые части пропускаются — «Подбор — Инженер — Проект X».
|
||||||
|
* По нему заявку узнают в списке SP, в столбце «Заявка» списка согласования
|
||||||
|
* и в колонке «Название» таблиц портала.
|
||||||
|
*/
|
||||||
|
export function buildRequestTitle(typeLabel: string, parts: string[]): string {
|
||||||
|
return [typeLabel, ...parts.map((p) => p.trim())].filter(Boolean).join(TITLE_SEPARATOR);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user