Архивация списков #9

Merged
gorbenko.pavel merged 17 commits from archive into main 2026-08-19 09:07:53 +00:00
3 changed files with 42 additions and 4 deletions
Showing only changes of commit 2b3de32d3f - Show all commits
@@ -3,6 +3,7 @@ import * as ReactDom from 'react-dom';
import { Version } from '@microsoft/sp-core-library';
import {
type IPropertyPaneConfiguration,
PropertyPaneDropdown,
PropertyPaneTextField
} from '@microsoft/sp-property-pane';
import { BaseClientSideWebPart } from '@microsoft/sp-webpart-base';
@@ -14,12 +15,15 @@ import { IRequestPortalProps } from './components/IRequestPortalProps';
import { initSP } from './shared/pnp/pnpjs';
import { installErrorLogging } from './shared/diagnostics';
import { setImpersonatedEmail } from './shared/impersonation';
import { APPROVAL_API_BASE_URL_LOCAL, APPROVAL_API_BASE_URL_PROD, setApprovalApiBaseUrl } from './shared/config';
import { ErrorOverlay } from './shared/ui';
export interface IRequestPortalWebPartProps {
description: string;
/** Отладочная подмена личности — см. shared/impersonation.ts. На бою пусто. */
debugUserEmail: string;
/** Куда шлём запросы approval-route (маршруты согласования) — прод или локальный backend. */
approvalApiBaseUrl: string;
}
export default class RequestPortalWebPart extends BaseClientSideWebPart<IRequestPortalWebPartProps> {
@@ -31,6 +35,8 @@ export default class RequestPortalWebPart extends BaseClientSideWebPart<IRequest
// Именно здесь, а не в onInit: свойство меняется в панели без перезапуска
// веб-части, и render вызывается на каждое такое изменение.
setImpersonatedEmail(this.properties.debugUserEmail);
this.properties.approvalApiBaseUrl = this.properties.approvalApiBaseUrl || APPROVAL_API_BASE_URL_PROD;
setApprovalApiBaseUrl(this.properties.approvalApiBaseUrl);
const element: React.ReactElement = React.createElement(
ErrorOverlay,
@@ -131,6 +137,19 @@ export default class RequestPortalWebPart extends BaseClientSideWebPart<IRequest
placeholder: 'employee@tnsu.kz'
})
]
},
{
groupName: 'Approval Route API',
groupFields: [
PropertyPaneDropdown('approvalApiBaseUrl', {
label: 'Api Base Url',
selectedKey: this.properties.approvalApiBaseUrl,
options: [
{ key: APPROVAL_API_BASE_URL_PROD, text: `Прод (${APPROVAL_API_BASE_URL_PROD})` },
{ key: APPROVAL_API_BASE_URL_LOCAL, text: `Локально (${APPROVAL_API_BASE_URL_LOCAL})` }
]
})
]
}
]
}
@@ -1,6 +1,6 @@
import { AadHttpClient, HttpClientResponse } from '@microsoft/sp-http';
import { WebPartContext } from '@microsoft/sp-webpart-base';
import { APPROVAL_API_CLIENT_ID, APPROVAL_API_BASE_URL } from '../config';
import { APPROVAL_API_CLIENT_ID, getApprovalApiBaseUrl } from '../config';
import { ApprovalStatus, IApiResponse, IRequestType, IResolvedRoute, IResolveFieldValue } from './models/IApprovalRouteApi';
// Все обращения к внешнему approval-route API — только здесь.
@@ -14,7 +14,7 @@ async function client(context: WebPartContext): Promise<AadHttpClient> {
export async function getRequestTypes(context: WebPartContext): Promise<IRequestType[]> {
const c = await client(context);
const response: HttpClientResponse = await c.get(
`${APPROVAL_API_BASE_URL}/api/request-types`,
`${getApprovalApiBaseUrl()}/api/request-types`,
AadHttpClient.configurations.v1
);
if (!response.ok) {
@@ -82,7 +82,7 @@ export async function resolveRoute(
projectId: string | null = null
): Promise<IResolvedRoute> {
const c = await client(context);
const url = `${APPROVAL_API_BASE_URL}/api/template-routes/resolve`;
const url = `${getApprovalApiBaseUrl()}/api/template-routes/resolve`;
// Эндпоинт сменился с GET (query) на POST (JSON-тело).
// projectId (uuid проекта) — для форм, где согласующий зависит от проекта
+20 -1
View File
@@ -16,7 +16,26 @@ export const DATA_SITE_URL = 'https://tnsukz.sharepoint.com/sites/requests';
* в Центре администрирования SharePoint (API access) при развёртывании.
*/
export const APPROVAL_API_CLIENT_ID = '9232d9e2-9807-4753-808f-07250e5474b0';
export const APPROVAL_API_BASE_URL = 'https://api.tnsu.kz/approval-route';
/** Прод — то же самое значение, что default в свойстве approvalApiBaseUrl веб-части. */
export const APPROVAL_API_BASE_URL_PROD = 'https://api.tnsu.kz/approval-route';
/** Локальный backend — порт из tnsu-approval-route/backend/.../launchSettings.json. */
export const APPROVAL_API_BASE_URL_LOCAL = 'http://localhost:5080';
// Настраивается свойством веб-части approvalApiBaseUrl (селект в панели свойств,
// см. RequestPortalWebPart.render) — тот же приём, что и у debugUserEmail/
// setImpersonatedEmail: модульный синглтон, а не проброс параметром через все
// вызовы approvalRoute.service.ts, потому что эти вызовы разбросаны по формам и
// не имеют общего входа, через который можно было бы прокинуть контекст.
let _approvalApiBaseUrl = APPROVAL_API_BASE_URL_PROD;
export function setApprovalApiBaseUrl(url: string): void {
_approvalApiBaseUrl = url || APPROVAL_API_BASE_URL_PROD;
}
export function getApprovalApiBaseUrl(): string {
return _approvalApiBaseUrl;
}
/**
* Справочники (Dictionary API) — тот же gateway api.tnsu.kz и тот же AAD-app