fix: служебный хвост в ФИО автора и исполнителя
Поисковое свойство AuthorOWSUSER хранит «почта | ФИО | служебный id и
claims-логин», а parseAuthorOwsUser брал как ФИО всё после первого
разделителя. Пока ФИО бралось из свойства Author, это было не видно;
после 13ba9c9 (ФИО из AuthorOWSUSER) хвост вылез в колонках «Автор» и
«Исполнитель». Теперь ФИО — ровно вторая часть строки.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -107,17 +107,19 @@ const MP_CODE = 'RequestUniqueCodeOWSTEXT';
|
|||||||
const OWN_SELECT_PROPERTIES = ['ListItemID', 'Path', 'Title', 'Created', 'Author', MP_AUTHOR, MP_REQUEST_STATUS, MP_CODE];
|
const OWN_SELECT_PROPERTIES = ['ListItemID', 'Path', 'Title', 'Created', 'Author', MP_AUTHOR, MP_REQUEST_STATUS, MP_CODE];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Managed property Person-поля хранит и логин, и ФИО одной строкой:
|
* Managed property Person-поля хранит несколько значений одной строкой через
|
||||||
* «<логин> | <ФИО>» (проверено вручную, tools/sp props, 2026-08-20). Разделитель
|
* " | ": «<почта> | <ФИО> | <служебный id> <claims-логин>» (первые два —
|
||||||
* — именно " | " С ПРОБЕЛАМИ: сам логин при claims-аутентификации выглядит как
|
* проверено вручную, tools/sp props, 2026-08-20; хвост вылез в UI 2026-09-29,
|
||||||
* `i:0#.f|membership|user@domain` и содержит "|" без пробелов вокруг, поэтому
|
* когда ФИО стали брать отсюда). Поэтому ФИО — ровно ВТОРОЙ кусок, а не «всё
|
||||||
* делить по ПЕРВОМУ "|" нельзя — часть логина отрезалась бы вместе с почтой.
|
* после первого разделителя».
|
||||||
|
*
|
||||||
|
* Разделитель — именно " | " С ПРОБЕЛАМИ: claims-логин
|
||||||
|
* `i:0#.f|membership|user@domain` содержит "|" без пробелов вокруг, и деление по
|
||||||
|
* голому "|" порезало бы его на части.
|
||||||
*/
|
*/
|
||||||
function parseAuthorOwsUser(value: unknown): { email: string; name: string } {
|
export function parseAuthorOwsUser(value: unknown): { email: string; name: string } {
|
||||||
const text = typeof value === 'string' ? value : '';
|
const parts = (typeof value === 'string' ? value : '').split(' | ').map((p) => p.trim());
|
||||||
const sep = text.indexOf(' | ');
|
return { email: parts[0] ?? '', name: parts[1] ?? '' };
|
||||||
if (sep < 0) return { email: text.trim(), name: '' };
|
|
||||||
return { email: text.slice(0, sep).trim(), name: text.slice(sep + 3).trim() };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// effectiveUserEmail, а не pageContext напрямую: при отладочной подмене личности
|
// effectiveUserEmail, а не pageContext напрямую: при отладочной подмене личности
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import { parseAuthorOwsUser } from './myRequests.service';
|
||||||
|
|
||||||
|
describe('parseAuthorOwsUser', () => {
|
||||||
|
it('ФИО — ровно второй кусок, служебный хвост отбрасывается', () => {
|
||||||
|
const value =
|
||||||
|
'gorodetskiy.timur@tnsu.kz | Тимур Городецкий | 693A30232E667C6D656D626572736869707C676F726F646574736B69792E74696D757240746E73752E6B7A i:0#.f|membership|gorodetskiy.timur@tnsu.kz';
|
||||||
|
expect(parseAuthorOwsUser(value)).toEqual({ email: 'gorodetskiy.timur@tnsu.kz', name: 'Тимур Городецкий' });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('формат из двух частей — как раньше', () => {
|
||||||
|
expect(parseAuthorOwsUser('a@tnsu.kz | Анна Ким')).toEqual({ email: 'a@tnsu.kz', name: 'Анна Ким' });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('без разделителя — только почта', () => {
|
||||||
|
expect(parseAuthorOwsUser('a@tnsu.kz')).toEqual({ email: 'a@tnsu.kz', name: '' });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('не строка — пусто', () => {
|
||||||
|
expect(parseAuthorOwsUser(undefined)).toEqual({ email: '', name: '' });
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user