From 182c497139ed4a4281cf9cbd04fce64fd1050d7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B8=D0=BC=D1=83=D1=80=20=D0=93=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D1=86=D0=BA=D0=B8=D0=B9?= Date: Tue, 29 Sep 2026 12:51:57 +0500 Subject: [PATCH] =?UTF-8?q?fix:=20=D1=81=D0=BB=D1=83=D0=B6=D0=B5=D0=B1?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D1=85=D0=B2=D0=BE=D1=81=D1=82=20=D0=B2=20?= =?UTF-8?q?=D0=A4=D0=98=D0=9E=20=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B0=20?= =?UTF-8?q?=D0=B8=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Поисковое свойство AuthorOWSUSER хранит «почта | ФИО | служебный id и claims-логин», а parseAuthorOwsUser брал как ФИО всё после первого разделителя. Пока ФИО бралось из свойства Author, это было не видно; после 13ba9c9 (ФИО из AuthorOWSUSER) хвост вылез в колонках «Автор» и «Исполнитель». Теперь ФИО — ровно вторая часть строки. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../features/myRequests/myRequests.service.ts | 22 ++++++++++--------- .../myRequests/parseAuthorOwsUser.test.ts | 21 ++++++++++++++++++ 2 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 src/webparts/requestPortal/features/myRequests/parseAuthorOwsUser.test.ts diff --git a/src/webparts/requestPortal/features/myRequests/myRequests.service.ts b/src/webparts/requestPortal/features/myRequests/myRequests.service.ts index 36c2468..5f2e48e 100644 --- a/src/webparts/requestPortal/features/myRequests/myRequests.service.ts +++ b/src/webparts/requestPortal/features/myRequests/myRequests.service.ts @@ -107,17 +107,19 @@ const MP_CODE = 'RequestUniqueCodeOWSTEXT'; const OWN_SELECT_PROPERTIES = ['ListItemID', 'Path', 'Title', 'Created', 'Author', MP_AUTHOR, MP_REQUEST_STATUS, MP_CODE]; /** - * Managed property Person-поля хранит и логин, и ФИО одной строкой: - * «<логин> | <ФИО>» (проверено вручную, tools/sp props, 2026-08-20). Разделитель - * — именно " | " С ПРОБЕЛАМИ: сам логин при claims-аутентификации выглядит как - * `i:0#.f|membership|user@domain` и содержит "|" без пробелов вокруг, поэтому - * делить по ПЕРВОМУ "|" нельзя — часть логина отрезалась бы вместе с почтой. + * Managed property Person-поля хранит несколько значений одной строкой через + * " | ": «<почта> | <ФИО> | <служебный id> » (первые два — + * проверено вручную, tools/sp props, 2026-08-20; хвост вылез в UI 2026-09-29, + * когда ФИО стали брать отсюда). Поэтому ФИО — ровно ВТОРОЙ кусок, а не «всё + * после первого разделителя». + * + * Разделитель — именно " | " С ПРОБЕЛАМИ: claims-логин + * `i:0#.f|membership|user@domain` содержит "|" без пробелов вокруг, и деление по + * голому "|" порезало бы его на части. */ -function parseAuthorOwsUser(value: unknown): { email: string; name: string } { - const text = typeof value === 'string' ? value : ''; - const sep = text.indexOf(' | '); - if (sep < 0) return { email: text.trim(), name: '' }; - return { email: text.slice(0, sep).trim(), name: text.slice(sep + 3).trim() }; +export function parseAuthorOwsUser(value: unknown): { email: string; name: string } { + const parts = (typeof value === 'string' ? value : '').split(' | ').map((p) => p.trim()); + return { email: parts[0] ?? '', name: parts[1] ?? '' }; } // effectiveUserEmail, а не pageContext напрямую: при отладочной подмене личности diff --git a/src/webparts/requestPortal/features/myRequests/parseAuthorOwsUser.test.ts b/src/webparts/requestPortal/features/myRequests/parseAuthorOwsUser.test.ts new file mode 100644 index 0000000..743d305 --- /dev/null +++ b/src/webparts/requestPortal/features/myRequests/parseAuthorOwsUser.test.ts @@ -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: '' }); + }); +});