селектбокс
This commit is contained in:
@@ -3,6 +3,7 @@ import * as ReactDom from 'react-dom';
|
|||||||
import { Version } from '@microsoft/sp-core-library';
|
import { Version } from '@microsoft/sp-core-library';
|
||||||
import {
|
import {
|
||||||
type IPropertyPaneConfiguration,
|
type IPropertyPaneConfiguration,
|
||||||
|
PropertyPaneDropdown,
|
||||||
PropertyPaneTextField
|
PropertyPaneTextField
|
||||||
} from '@microsoft/sp-property-pane';
|
} from '@microsoft/sp-property-pane';
|
||||||
import { BaseClientSideWebPart } from '@microsoft/sp-webpart-base';
|
import { BaseClientSideWebPart } from '@microsoft/sp-webpart-base';
|
||||||
@@ -14,12 +15,15 @@ import { IRequestPortalProps } from './components/IRequestPortalProps';
|
|||||||
import { initSP } from './shared/pnp/pnpjs';
|
import { initSP } from './shared/pnp/pnpjs';
|
||||||
import { installErrorLogging } from './shared/diagnostics';
|
import { installErrorLogging } from './shared/diagnostics';
|
||||||
import { setImpersonatedEmail } from './shared/impersonation';
|
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';
|
import { ErrorOverlay } from './shared/ui';
|
||||||
|
|
||||||
export interface IRequestPortalWebPartProps {
|
export interface IRequestPortalWebPartProps {
|
||||||
description: string;
|
description: string;
|
||||||
/** Отладочная подмена личности — см. shared/impersonation.ts. На бою пусто. */
|
/** Отладочная подмена личности — см. shared/impersonation.ts. На бою пусто. */
|
||||||
debugUserEmail: string;
|
debugUserEmail: string;
|
||||||
|
/** Куда шлём запросы approval-route (маршруты согласования) — прод или локальный backend. */
|
||||||
|
approvalApiBaseUrl: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class RequestPortalWebPart extends BaseClientSideWebPart<IRequestPortalWebPartProps> {
|
export default class RequestPortalWebPart extends BaseClientSideWebPart<IRequestPortalWebPartProps> {
|
||||||
@@ -31,6 +35,8 @@ export default class RequestPortalWebPart extends BaseClientSideWebPart<IRequest
|
|||||||
// Именно здесь, а не в onInit: свойство меняется в панели без перезапуска
|
// Именно здесь, а не в onInit: свойство меняется в панели без перезапуска
|
||||||
// веб-части, и render вызывается на каждое такое изменение.
|
// веб-части, и render вызывается на каждое такое изменение.
|
||||||
setImpersonatedEmail(this.properties.debugUserEmail);
|
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(
|
const element: React.ReactElement = React.createElement(
|
||||||
ErrorOverlay,
|
ErrorOverlay,
|
||||||
@@ -131,6 +137,19 @@ export default class RequestPortalWebPart extends BaseClientSideWebPart<IRequest
|
|||||||
placeholder: 'employee@tnsu.kz'
|
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 { AadHttpClient, HttpClientResponse } from '@microsoft/sp-http';
|
||||||
import { WebPartContext } from '@microsoft/sp-webpart-base';
|
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';
|
import { ApprovalStatus, IApiResponse, IRequestType, IResolvedRoute, IResolveFieldValue } from './models/IApprovalRouteApi';
|
||||||
|
|
||||||
// Все обращения к внешнему approval-route API — только здесь.
|
// Все обращения к внешнему approval-route API — только здесь.
|
||||||
@@ -14,7 +14,7 @@ async function client(context: WebPartContext): Promise<AadHttpClient> {
|
|||||||
export async function getRequestTypes(context: WebPartContext): Promise<IRequestType[]> {
|
export async function getRequestTypes(context: WebPartContext): Promise<IRequestType[]> {
|
||||||
const c = await client(context);
|
const c = await client(context);
|
||||||
const response: HttpClientResponse = await c.get(
|
const response: HttpClientResponse = await c.get(
|
||||||
`${APPROVAL_API_BASE_URL}/api/request-types`,
|
`${getApprovalApiBaseUrl()}/api/request-types`,
|
||||||
AadHttpClient.configurations.v1
|
AadHttpClient.configurations.v1
|
||||||
);
|
);
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
@@ -82,7 +82,7 @@ export async function resolveRoute(
|
|||||||
projectId: string | null = null
|
projectId: string | null = null
|
||||||
): Promise<IResolvedRoute> {
|
): Promise<IResolvedRoute> {
|
||||||
const c = await client(context);
|
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-тело).
|
// Эндпоинт сменился с GET (query) на POST (JSON-тело).
|
||||||
// projectId (uuid проекта) — для форм, где согласующий зависит от проекта
|
// projectId (uuid проекта) — для форм, где согласующий зависит от проекта
|
||||||
|
|||||||
@@ -16,7 +16,26 @@ export const DATA_SITE_URL = 'https://tnsukz.sharepoint.com/sites/requests';
|
|||||||
* в Центре администрирования SharePoint (API access) при развёртывании.
|
* в Центре администрирования SharePoint (API access) при развёртывании.
|
||||||
*/
|
*/
|
||||||
export const APPROVAL_API_CLIENT_ID = '9232d9e2-9807-4753-808f-07250e5474b0';
|
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
|
* Справочники (Dictionary API) — тот же gateway api.tnsu.kz и тот же AAD-app
|
||||||
|
|||||||
Reference in New Issue
Block a user