diff --git a/src/webparts/requestPortal/RequestPortalWebPart.ts b/src/webparts/requestPortal/RequestPortalWebPart.ts index 34789f4..8f319e7 100644 --- a/src/webparts/requestPortal/RequestPortalWebPart.ts +++ b/src/webparts/requestPortal/RequestPortalWebPart.ts @@ -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 { @@ -31,6 +35,8 @@ export default class RequestPortalWebPart extends BaseClientSideWebPart { export async function getRequestTypes(context: WebPartContext): Promise { 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 { 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 проекта) — для форм, где согласующий зависит от проекта diff --git a/src/webparts/requestPortal/shared/config.ts b/src/webparts/requestPortal/shared/config.ts index 98ab180..c4e6b56 100644 --- a/src/webparts/requestPortal/shared/config.ts +++ b/src/webparts/requestPortal/shared/config.ts @@ -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