UNPKG

@docsvision/webclient

Version:

Type definitions for DocsVision WebClient scripts and extensions.

380 lines (379 loc) 29.2 kB
import { GenModels } from '@docsvision/webclient/Generated/DocsVision.WebClient.Models'; import { IControlContainer } from '@docsvision/webclient/Helpers/ControlSelector/IControlContainer'; import { BaseControlImpl, BaseControlImplState } from "@docsvision/webclient/System/BaseControlImpl"; import { IBlurEventArgs } from "@docsvision/webclient/System/IBlurEventArgs"; import { IFocusEventArgs } from "@docsvision/webclient/System/IFocusEventArgs"; import { IMouseOutEventArgs } from "@docsvision/webclient/System/IMouseOutEventArgs"; import { IMouseOverEventArgs } from "@docsvision/webclient/System/IMouseOverEventArgs"; import { Layout } from "@docsvision/webclient/System/Layout"; import { IBindingResult } from "@docsvision/webclient/System/IBindingResult"; import { IBindingsWriteRequest } from "@docsvision/webclient/System/IBindingsWriteRequest"; import { IControlContext } from '@docsvision/webclient/System/IControlContext'; import { BubblingEventCallback, IBubblingEventInfo, ISupportEventBubbling } from "@docsvision/webclient/System/ISupportEventBubling"; import { IApiPropertyDescriptor } from "@docsvision/webclient/System/IApiPropertyDescriptor"; import { FieldSpec } from '@docsvision/webclient/System/GetFieldName'; import { BasicApiEvent, CancelableApiEvent } from "@docsvision/webclient/System/ApiEvent"; import { BasicEventHandler } from "@docsvision/webclient/System/IBasicEvent"; import { IEventArgs } from "@docsvision/webclient/System/IEventArgs"; import { IValidationParams } from "@docsvision/webclient/System/IValidationParams"; import { IValidationResult } from "@docsvision/webclient/System/IValidationResult"; import React from "react"; import { IValidateEventArgs } from '@docsvision/webclient/System/IValidateEventArgs'; export declare let DEFAULT_CONTROL_NAME: string; export declare const BASE_CONTROL_SYSTEM_HANDLER = "BASE_CONTROL_SYSTEM_HANDLER"; /** * Базовый класс для описания публичных свойств контрола. * * Публичные свойства должны объявляться использованием одного из трех декораторов: * {@link r} (свойство, котрое запрещено изменять после создания контрола), * {@link rw} (разрешено изменять) или * {@link event} (событие). * Например: * * @r isLoaded?: boolean; * @rw visibility?: boolean = true; * @event click?: BasicApiEvent<IClickEventArgs>; * * Свойства, которые не существенны для контрола (либо имеют значения по умолчанию) должны быть помечены как необязательные * (с помощью знака вопроса, например `@rw compactMode?: boolean = false;`). Это позволит не указывать данные свойства при создании контрола * через JSX из скриптов. * * Получение и запись значения публичных свойств можно переопределить в методах {@link BaseControl.setParamValue}, * {@link BaseControl.getParamValue}, либо при помощи объявления свойств с декоратором {@link handler}. */ export declare class BaseControlParams { /** Возвращает ссылку на родительский элемент управления. @see {@link BaseControl.parent} */ parent?: BaseControl<BaseControlParams, BaseControlState>; /** Возвращает имя класса элемента управления. */ controlTypeName?: string; /** Возвращает наименование класса TypeScript, реализующего компонент */ controlComponentName?: string; /** Возвращает уникальное (для текущей разметки) имя элемента управления. */ name?: string; /** * Возвращает набор стандартных классов, определяющих стиль элемента управления. * Стандартные классы, указываемые по умолчанию для всех элементов управления, не могут быть изменены. */ standardCssClass?: string; /** Пользовательские классы стилей элемента управления, дополняющие стили из {@link BaseControlParams.standardCssClass}. */ customCssClasses?: string; /** Определяет, отображается ли элемент управления на странице: `true` - отображается, `false` - скрыт. */ visibility?: boolean; /** Видимость блока, связанная с ролевой моделью. */ visibilityEditOperation?: string; /** Определяет, есть ли возможность редактировать элемент управления: `true` - нельзя редактировать, `false` - можно. */ disabled?: boolean; /** Хранит дополнительную информацию или настройки в виде строкового ресурса */ tag?: string; /** * Определяет, должен ли элемент управления получать фокус при переходе по Tab: * `true` - должен, `false` - не должен. * @see {@link BaseControlImpl.getTabIndex} */ tabStop?: boolean; /** * Определяет, должен ли элемент управления отображаться в компактном режиме, в котором у элемента отсутствуют отступы и т.п. * Компактный режим, например, используется при отрисовке контролов в таблице (см. {@link Table}). */ compactMode?: boolean; /** Стиль родительского (по отношению к данному элементу управления) div-элемента. */ customCssStyle?: React.CSSProperties; /** * Определяет, завершена ли инициализация элемента управления: * `true` - объект {@link BaseControl.controlImpl} создан, * `false` - инициализация не завершена. */ isLoaded?: boolean; /** Компонент, осуществляющий рендеринг контрола. */ container?: IControlContainer; /** Идентификатор карточки, к которой привязан контрол. */ dataSourceCardId?: string; /** Идентификатор секции, к которой привязан контрол. */ dataSourceSectionId?: string; /** Идентификатор строки секции, к которой привязан контрол. */ dataSourceRowId?: string; /** Временная метка изменения карточки, к которой привязан контрол. */ dataSourceCardTimestamp?: number; /** Событие, возникающее при щелчке мышью в области элемента управления. */ click?: BasicApiEvent<any>; /** Событие, возникающее при попадании мыши в область элемента управления. */ mouseOver?: BasicApiEvent<IMouseOverEventArgs>; /** Событие, возникающее при выведении мыши из области элемента управления. */ mouseOut?: BasicApiEvent<IMouseOutEventArgs>; /** Событие, возникающее при получении элементом управления фокуса. */ focus?: BasicApiEvent<IFocusEventArgs>; /** Событие, возникающее при потере элементом управления фокуса. */ blur?: BasicApiEvent<IBlurEventArgs>; /** Событие, возникающее, когда свойство {@link isLoaded} устанавливается в `true`. */ loaded?: BasicApiEvent<IEventArgs>; /** Событие, возникающее при удалении элемента управления из разметки. */ unloading?: CancelableApiEvent<IEventArgs>; /** Событие, возникающее при валидации контрола. */ validation?: BasicApiEvent<IValidateEventArgs>; /** Интерфейсный компонент контрола (см. описание класса {@link BaseControl}). */ wrapper?: BaseControl<BaseControlParams, BaseControlState>; } /** Базовый интерфейс для описания состояния интерфейсного компонента элемента управления. */ export interface BaseControlState extends BaseControlParams { /** Инициализирован ли компонент. */ initialized: boolean; passedValidation?: boolean; } /** Синоним `BaseControl<any, any>` */ export declare type LayoutControl = BaseControl<BaseControlParams, any>; /** * Базовый класс элементов управления модуля Web-клиент. * * Элементы управления Модуля состоят из двух классов: интерфейсного и реализации. Интерфейсная часть наследуется от данного класса, * а реализация от {@link BaseControlImpl}. Интерфейсный компонент обеспечивает взаимодействие контрола с внешним миром (работа с binding, * обращения к серверу, к разметке, в которой находится контрол и т.д.), в то время как компонент реализации содержит логику контрола, * абстрагированную от внешнего окружения. * * Публичные свойства контрола объявляются в специальном классе, наследующемся от {@link BaseControlParams}. Данные свойства * доступны через объект {@link BaseControl.params}. Публичные методы контрола объявляются в классе с использованием декоратора {@link api}. * * @param P Класс, наследующийся от {@link BaseControlParams} и описывающий публичные свойства компонента. * @param S Интерфейс, расширяющий {@link BaseControlState} и описывающий внутренние переменные инетрфейсного компонента. */ export declare abstract class BaseControl<P extends BaseControlParams, S extends BaseControlState> extends React.Component<P, S> implements ISupportEventBubbling { /** * Если значение данного поля `false`, то вызов метода {@link forceUpdate} не инициирует перерисовку компонента. * Используется методом {@link batchUpdate}. */ protected shouldUpdate: boolean; private paramsObject; private propertyHandlers; private propertyGetHandlers; private propertySetHandlers; private controlImplRef; private bubblingEventSubscribers; private lastContextServices; protected newStyleControlImpl: boolean; private contextImpl; state: S; static contextType: React.Context<IControlContext>; /** * Инициализирует контрол * @param props Свойства, переданные контролу */ constructor(props: P); /** * Получить сервис из контейнера контрола. * * @param name Имя сервиса. * * Примеры: * * // Основной вариант * control.getService($RequestManager).post(url, JSON.stringify(data)); * // Альтернативный вариант * control.getService<$RequestManager>().requestManager.post(url, JSON.stringify(data)); * */ getService<T>(name?: FieldSpec<any, T>): T; /** * При переопределении в дочернем классе должен возвращать новый * экземпляр параметров компонента, созданный через оператор new (например: `new MyControlParams()`) * Данный объект будет присвоен свойству this.state. */ protected abstract createParams(): P; /** * При переопределении в дочернем классе должен возвращать новый * экземпляр реализации компонента, созданный через оператор new (например: `new MyControlImpl()`) * Данный объект будет присвоен свойству this.controlImpl. */ protected createImpl(): BaseControlImpl<BaseControlParams, BaseControlImplState>; /** * Аналог свойства {@link BaseControl.params}. */ protected getParams(): P; /** * Инициализация */ init(): void; /** * Деинициализация */ deinit(): void; /** @internal */ protected registerChild(child: BaseControl<BaseControlParams, BaseControlState>): void; protected set visibilityEditOperation(editOperation: string); /** @internal */ protected unregisterChild(child: BaseControl<BaseControlParams, BaseControlState>): void; /** * Компонент реализации (см. описание класса {@link BaseControl}) * @see {@link getParamValue}, {@link setParamValue}, {@link attachControl}, */ protected get controlImpl(): BaseControlImpl<BaseControlParams, BaseControlImplState>; protected set controlImpl(control: BaseControlImpl<BaseControlParams, BaseControlImplState>); protected getImpl<T>(): T; /** * Получает значения через метод {@link getBindingsWriteRequests} и сохраняет их на сервере. */ save(): Promise<any>; reloadFromServer(): Promise<this>; loadControlModelFromServer(): Promise<GenModels.LayoutViewModel>; /** * Публичные свойства элемента управления. * Обращения к параметрам через данный объект обрабатываются функциями {@link getParamValue} и {@link setParamValue}. * Свойства данного объекта объявляются в методе {@link setupParamsAccessors}. * Сам объект создается в методе {@link createParams} */ get params(): P; /** * Устанавливает значение {@ controlImpl}, в соответствии с идиомой Pimpl. * Метод должен передаваться в качестве значения ref в функции render. Например: * * <MyControlImpl ref={this.attachControl} />; * * @param control Reference to contorl implementation */ protected attachControl(control: any): void; /** @internal Создает impl-эземпляр через вызов {@see createImpl}. */ protected onCreateImpl(): void; /** Вызывается до рендеринга и до вызова хандлеров, но после инициализации сервисов. */ protected construct(): void; /** Вызывается до рендеринга, но после вызова хандлеров и инициализации сервисов. */ protected prepare(): void; /** См. [документацию React](https://facebook.github.io/react/docs/react-component.html#the-component-lifecycle) */ UNSAFE_componentWillMount(): void; private internalInitializeDataSourceServices; private internalRegisterInStore; /** См. [документацию React](https://facebook.github.io/react/docs/react-component.html#the-component-lifecycle) */ componentDidMount(): void; get layout(): Layout; /** * Родительский компонент. Отношение родитель-потомок определяет, прежде всего, логику {@link getBindingsWriteRequests}. * * Внимание! Отношение родитель-потомок может отличаться от логической вложенности компонентов (например, дочерние компоненты, вложенные один в другой * могут иметь общего родителя). */ get parent(): BaseControl<BaseControlParams, BaseControlState>; /** См. [документацию React](https://facebook.github.io/react/docs/react-component.html#the-component-lifecycle) */ componentWillUnmount(): void; internalInit(): void; internalDispose(): void; /** См. [документацию React](https://facebook.github.io/react/docs/react-component.html#the-component-lifecycle) */ UNSAFE_componentWillReceiveProps(nextProps: P, nextContext: any): void; /** См. [документацию React](https://facebook.github.io/react/docs/react-component.html#the-component-lifecycle) */ UNSAFE_componentWillUpdate(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: any): void; /** См. [документацию React](https://facebook.github.io/react/docs/react-component.html#the-component-lifecycle) */ componentDidUpdate(prevProps: Readonly<P>, prevState: Readonly<S>, prevContext: any): void; shouldComponentUpdate(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: any): boolean; /** * Вызывает перерисовку компонента. * Присваивание параметрам новых значений автоматически вызывает перерисовку, и в таких случаях вызывать метод не следует. * Данный метод нужно вызывать только в том случае, когда либо меняются поля объекта параметра, либо устанавливается значение state. * @param callBack Функция, которая будет вызвана после того, как перерисовка компонента завершится. * @see [Документация React](https://facebook.github.io/react/docs/react-component.html#other-apis) */ forceUpdate(callBack?: () => void): void; /** * Позволяет установить значение нескольких параметров, вызвав только одну перерисовку компонента. * В методе нет необходимости, если значения параметров меняются в рамках обработки одного React-события (в этом случае * React автоматически предотвращает многократную перерисовку компонента). * @param updateLogic Функция, который выполняет изменение параметров * @param callback Функция, которая вызывается после обновления компонента (передается параметром в forceUpdate) */ batchUpdate(updateLogic: Function, callback?: () => any): void; /** Возвращает сервисы, используемые текущим контролом. */ getControlServices(): any; /** @internal */ protected getApiProperties(): IApiPropertyDescriptor[]; /** @internal */ private get isLoaded(); /** * Вызывается перед сохранением карточки. * @returns Сохранение будет продолжено только после того, как данный объект перейдет в состояние "resolved". */ onSaving(): Promise<any>; /** * Вызывается после сохранения карточки. * @returns Логика после сохранения карточки продолжит выполняться только после того, как данный объект перейдет в состояние "resolved". */ onSaved(): Promise<any>; hasContent: () => boolean; /** * Подготавливает собственные значения и значения всех дочерних контролов для отправки на сервер. * Метод вызывает {@link getBindings} для получения значений. * @param withChildren Включать в результат значения дочерних контролов или нет. */ getBindingsWriteRequests(withChildren?: boolean): IBindingsWriteRequest[]; /** * При переопределнии в дочерних классах, должен возвращать все значения, * которые контрол должен отправлять на сервер при сохранении. */ protected getBindings(): IBindingResult<any>[]; /** * Проверяет корректность значения элемента управления. * * К примеру, если у элемента управления с флагом "обязательный" отсутствует значение, * валидация не будет пройдена (см. {@link InputBasedControl}). При этом можно показать предупреждающее сообщение. * @param params Параметры выполнения валидации. Например, показывать ли сообщение о неудаче в UI или нет. */ validate(params: any): IValidationResult[]; createValidationResult(params: IValidationParams, results: IValidationResult[]): IValidationResult[]; /** * Производится обнаружение и регистрация всех свойств, объявленных с декоратором {@link handler}. */ protected registerParamHandlers(): void; private registerParamHandlersInternal; /** * Возвращает значение параметра при обращении через {@link params} объект. * По умолчанию реализуется следующая логика: * 1. Если объявлено get-свойство с декоратором {@link handler}, то возвращается значение данного свойства * 2. Если свойство controlImpl содержит объект, то возвращается реультат вызова {@link BaseControlImpl.getParamValue}. * 3. Если свойство controlImpl равно undefined, то выдается предупреждение, о том что controlImpl еще не инициализирован. * Данная ситуация может возникнуть, если обращение к свойству происходит до вызова componentDidMount. * @param paramName Имя параметра, значение которого необходимо получить * @returns Значение параметра */ getParamValue(paramName: string): any; /** * Обрабатывает новые значения свойств. Вызывается в `componentWillMount` и `componentWillReceiveProps`. * @param newProps Новые значения props компонента при вызове из componentWillReceiveProps или this.props при вызове из componentWillMount. * @param initial Значение истино, если метод вызывается при инициализации компонента (из componentWillMount). */ protected setParamValues(newProps: BaseControlParams, initial: boolean): void; /** * Обработчик, вызываемый всякий раз, когда установливается значение параметра. * Происходить это может в следующих случаях: * 1. При инициализации компонента (см. {@link setParamValues}) * 2. При получении новых props компонента (ситуация возможна при создании компонента из скриптов через JSX-синтаксис, см. {@link setParamValues}). * 3. При установке значения через объект {@link params} (например `params.visiblity = false`). * * Метод Реализует следующую логику: * 1. Если параметр является событием (объявлен с декоратором {@link event}), то вызывается {@link setEventValue}. * 2. Если запись не разрешена (параметр только для чтения (объявлен с декоратором {@link r}) и initial = false), то сообщается об ошибке. * 3. Если запись разрешена, то * а) Ищется set-свойство в текущем классе с декоратором {@link handler} для данного параметра, и если оно присутствует, то вызывается оно. * б) Если свойство не найдено, значение параметра помещается в `state`. В методе `render` значения из `state` обычно передаются в {@link controlImpl}. * @param paramName Имя параметра, значение которого нужно установить. * @param value Значение параметра * @param initial Значение истино, если метод вызывается при инициализации компонента (из componentWillMount). */ setParamValue(paramName: string, value: any, initial: boolean): void; /** * Вызывается методом {@link setParamValue}, в случае если параметр является событием (объявлен с декоратором {@link event}). * @param paramName Имя события * @param newVal Одна или несколько функций-обработчик события * Если передаётся строка, то несколько функций можно указать через один из разделителей: * ",", ";", "|" или "&" с произвольным количеством пробелов между ними. * @param initial Значение истино, если метод вызывается при инициализации компонента (из componentWillMount). */ protected setEventValue(paramName: string, val: BasicEventHandler<any> | BasicEventHandler<any>[] | string, initial: boolean): Promise<void>; protected callEventHandlers(sender: any, args: any, handlersName: string, paramName: string): Promise<void>; /** * Инициализирует объект {@link params}. * В объекте объявляются get и set акссессоры для всех параметров, которые вызывают * методы {@link getParamValue} и {@link setParamValue}. * Для успешной настройки параметров они должны быть объявлены с декоратором {@link r}, {@link rw} или {@link event}. */ protected setupParamsAccessors(): void; get supportEventBubbling(): boolean; getEventInfo<T>(event: any): IBubblingEventInfo; triggerBubblingEvent<T>(eventName: string, actualSender: ISupportEventBubbling, args: T): void; subscribeToBubblingEvent(eventNameSpec: string | FieldSpec<any, any>, callback: BubblingEventCallback): void; unsubscribeFromBubblingEvent(eventNameSpec: string | FieldSpec<any, any>, callback: BubblingEventCallback): void; render(): React.ReactNode; }