Заявка на услуги (#18)
Tests / frontend-test (push) Successful in 1m15s

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/18
This commit was merged in pull request #18.
This commit is contained in:
2026-09-01 12:48:41 +00:00
parent ddce6b4f25
commit cc2efd8771
56 changed files with 2557 additions and 97 deletions
@@ -1,6 +1,7 @@
import * as React from 'react';
import { WebPartContext } from '@microsoft/sp-webpart-base';
import { resolveDebugUser } from '../shared/impersonation';
import { useStableCallback } from '../shared/useStableCallback';
export interface IDebugUserFieldProps {
label: string;
@@ -22,6 +23,10 @@ const DEBOUNCE_MS = 400;
* чтобы не гадать, кого именно подставили.
*/
export const DebugUserField: React.FC<IDebugUserFieldProps> = ({ label, description, context, initialQuery, onResolved }) => {
// onResolved приходит из панели свойств и пересоздаётся на каждом её рендере:
// в зависимостях эффекта он перезапускал бы поиск, без него — эффект звал бы
// навсегда запомненную первую версию колбэка. Стабильная обёртка снимает оба.
const notifyResolved = useStableCallback(onResolved);
const [query, setQuery] = React.useState(initialQuery || '');
const [status, setStatus] = React.useState<Status>('idle');
const [found, setFound] = React.useState<{ email: string; displayName: string } | undefined>(undefined);
@@ -32,7 +37,7 @@ export const DebugUserField: React.FC<IDebugUserFieldProps> = ({ label, descript
if (!text) {
setStatus('idle');
setFound(undefined);
onResolved('', '', '');
notifyResolved('', '', '');
return;
}
@@ -49,25 +54,25 @@ export const DebugUserField: React.FC<IDebugUserFieldProps> = ({ label, descript
if (cancelled) return;
if (isEmail) {
setFound(hit);
onResolved(text, text, hit ? hit.displayName : '');
notifyResolved(text, text, hit ? hit.displayName : '');
} else if (hit) {
setStatus('found');
setFound(hit);
onResolved(text, hit.email, hit.displayName);
notifyResolved(text, hit.email, hit.displayName);
} else {
setStatus('notfound');
setFound(undefined);
onResolved(text, '', '');
notifyResolved(text, '', '');
}
})
.catch(() => {
if (cancelled) return;
if (isEmail) {
onResolved(text, text, '');
notifyResolved(text, text, '');
} else {
setStatus('notfound');
setFound(undefined);
onResolved(text, '', '');
notifyResolved(text, '', '');
}
});
}, DEBOUNCE_MS);
@@ -76,8 +81,7 @@ export const DebugUserField: React.FC<IDebugUserFieldProps> = ({ label, descript
cancelled = true;
window.clearTimeout(timer);
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [query]);
}, [query, context, notifyResolved]);
return (
<div>