UNPKG

@docsvision/webclient

Version:

Type definitions for DocsVision WebClient scripts and extensions.

147 lines (146 loc) 10.7 kB
import { BaseControlParams, BaseControlState } from "@docsvision/webclient/System/BaseControl"; import React from "react"; /** Базовый интерфейс, для описания состояния контролов, наследующихся от {@link BaseControlImpl} */ export declare type BaseControlImplState = BaseControlState; /** * Базовый класс для реализации контролов Web-клиента. * Реализация контрола содержит логику, без привязки к окружению (взаимодействие с сервером, с разметкой и т.д.). * Реализация используется основным, 'интерфейсным' классом контрола, наследующимся от {@link BaseControl}, который обеспечивает связь * контрола с внешним миром. * * @param P Класс или интерфейс, наследующийся от {@link BaseControlParams} и описывающий параметры компонента реализации. * @param S Интерфейс, расширяющий {@link BaseControlImplState} и описывающий внутренние переменные компонента реализации. */ export declare abstract class BaseControlImpl<P extends BaseControlParams, S extends BaseControlImplState> extends React.Component<P, S> { private _componentDOMNode; private propertyHandlers; private propertyGetHandlers; private propertySetHandlers; private changedParams; private newStyleControlImpl; protected containerElement: HTMLElement; state: S; /** * Инициализирует объект. * * В конструкторе необходимо создать объекты событий. Например: * * this.state.inPlaceEditOpeninig = CancelableEvent.Create(this.state.wrapper); * this.state.inPlaceEditOpened = SimpleEvent.Create(this.state.wrapper); * * **Внимание!** Значения свойств контрола (`props`) автоматически копируются в `state` в методе `componentDidMount` * (при помощи {@link setParamValue}), который вызывается после того, как конструктор завершил выполнение. * Соответственно, в теле конструктора значения в `state` еще недоступны, и нужно обращаться к `props`. * * ** Внимание!** При вызове конструктора объект `this.props` еще недоступен, необходимо обращаться к параметру `props`. * * @param props Параметры, переданные компоненту. */ constructor(props: P, state?: S); attachContainer: (elem: HTMLElement) => void; getContainerElem: () => HTMLElement; protected onFocusedKeyDown(event: React.KeyboardEvent<any>, handler: () => void): void; /** * Производится обнаружение и регистрация всех свойств, объявленных с декоратором {@link handler}. */ protected registerPropHandlers(): void; /** * При переопределении в дочерних классах, должен содержать логику отрисовки контрола. Например: * * renderControl() { * return <span> {this.state.text} </span> * } */ protected abstract renderControl(): any; setState<K extends keyof S>(state: ((prevState: Readonly<S>, props: P) => (Pick<S, K> | S)) | (Pick<S, K> | S), callback?: () => void): void; forceUpdate(callback?: () => void): void; forceUpdateAsync(): Promise<void>; /** @internal */ protected get componentDOMNode(): Element; protected set componentDOMNode(val: Element); /** См. [документацию React](https://facebook.github.io/react/docs/react-component.html#the-component-lifecycle) */ componentDidMount(): void; /** См. [документацию React](https://facebook.github.io/react/docs/react-component.html#the-component-lifecycle) */ componentWillUnmount(): void; /** См. [документацию React](https://facebook.github.io/react/docs/react-component.html#the-component-lifecycle) */ UNSAFE_componentWillMount(): void; /** См. [документацию React](https://facebook.github.io/react/docs/react-component.html#the-component-lifecycle) */ UNSAFE_componentWillReceiveProps(nextProps: P, nextContext: any): void; /** * Данный метод вызывается из {@link BaseControl.getParamValue}. * * По умолчанию реализуется следующая логика: * 1. Если объявлено get-свойство с декоратором {@link handler}, то возвращается значение данного свойства; * 2. Иначе возвращается значение из `state`. * @param paramName Имя параметра, значение которого необходимо получить */ getParamValue(paramName: string): any; prepareSetParamValue(propName: string): void; /** * Обработчик, вызываемый всякий раз, когда установливается значение параметра. * Происходить это может в следующих случаях: * 1. При инициализации компонента (из метода `componentWillMount`). * 2. При получении новых props компонента (из метода `componentWillReceiveProps`). Как правило, новые свойства * передаются интерфейсным компонентом при вызове {@link BaseControl.setParamValue}. * * Метод Реализует следующую логику: * 1. Если объявлено set-свойство с декоратором {@link handler}, то возвращается значение данного свойства; * 2. Иначе устаналивается значение в `state`. * @param paramName Имя параметра, значение которого нужно установить. * @param value Значение параметра * @param initial Значение истино, если метод вызывается при инициализации компонента (из componentWillMount). */ setParamValue(propName: string, newVal: any, initial: boolean): void; /** Обработчик события `click` по области контрола. Генерирует событие {@link BaseControlParams.click}. */ protected handleClick(event: React.MouseEvent<any>): void; /** Обработчик события `mouseover` в области контрола. Генерирует событие {@link BaseControlParams.mouseOver}. */ protected handleMouseOver(event: React.MouseEvent<any>): void; /** Обработчик события `mouseout` в области контрола. Генерирует событие {@link BaseControlParams.mouseOut}. */ protected handleMouseOut(event: React.MouseEvent<any>): void; /** Обработчик события `focus`. Генерирует событие {@link BaseControlParams.focus}. */ protected handleFocus(event: React.FocusEvent<any>): void; /** Обработчик события `blur`. Генерирует событие {@link BaseControlParams.blur}. */ protected handleBlur(event: React.FocusEvent<any>): void; /** Формирует список классов для основного html-тэга контрола. */ protected getCssClass(): string; /** * Формирует словарь стилей для основного html-тэга контрола * см. [документацию React](https://facebook.github.io/react/docs/dom-elements.html#style) */ protected getCssStyle(): React.CSSProperties; /** * Определяет, нужно ли показывать контрол в зависимости от наличия контента * При переопределении в дочернем классе должен возвращать: * true - если контент внутри контрола есть и контрол должен рендериться, * false - если контента внутри контрола нет и контрол не должен рендериться. * По умолчанию - true */ hasContent(): boolean; /** * Возвращает 0 если {@link BaseControlParams.tabStop} == true, и -1 в противном случае. По умолчанию данный метод не используется, * он может быть использован производным классом при отрисовке интерактивных элементов. */ getTabIndex(): 0 | -1; /** * Возвращает полное наименование внутреннего контрола, которое следует передать * при его отрисовке в функции Render. * @param innerControlName наименование внутреннего контрола */ protected getInnerControlFullName(innerControlName: string): string; protected getDataControlComponentName(): { "data-control-component-name": P["controlComponentName"]; } | { "data-control-component-name"?: undefined; }; protected renderDisabledControl(): any; /** * Выполняет отрисовку главного html-тега контрола, внутрь которого помещается содержимое параметра. * @param controlContent Обычно результат вызова {@link renderControl} */ renderControlRoot(controlContent: any): JSX.Element; /** * Основной метод, выполняющий отрисовку контрола. * Возвращает результат вызова {@link renderControlRoot}, передавая ему параметром результат вызова {@link renderControl}. */ render(): JSX.Element; }