селектбокс
This commit is contained in:
@@ -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 проекта) — для форм, где согласующий зависит от проекта
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user