igniteui-react-core
Version:
Ignite UI React Core.
537 lines (533 loc) • 16.7 kB
JavaScript
import * as React from 'react';
import { toRect, ensureEnum, brushToString, stringToBrush, ensureBool, initializePropertiesFromCss, NamePatcher, isValidProp, toSpinal, getModifiedProps } from "./componentUtil";
import { ReactRenderer, PortalManager } from "./react-renderer";
import { delegateCombine, delegateRemove } from "./type";
import { Popup } from './Popup';
import { IgrOnPopupEventArgs } from './igr-on-popup-event-args';
import { IgrOnClosedEventArgs } from './igr-on-closed-event-args';
import { IgrFocusEventArgs } from './igr-focus-event-args';
import { PopupAnimationType_$type } from "./PopupAnimationType";
import { PopupPointerPosition_$type } from "./PopupPointerPosition";
import { IgrPopupMeasuringContentSizeEventArgs } from './igr-popup-measuring-content-size-event-args';
export class IgrPopup extends React.Component {
set height(value) {
this._height = value;
if (this._elRef) {
this._elRef.style.height = value;
this.i.notifySizeChanged();
}
}
get height() {
return this._height;
}
set width(value) {
this._width = value;
if (this._elRef) {
this._elRef.style.height = value;
this.i.notifySizeChanged();
}
}
get width() {
return this._width;
}
_getMainRef(ref) {
this._elRef = ref;
this.verifyReferences();
}
verifyReferences() {
if (this._elRef) {
this.requestRender = this.requestRender.bind(this);
this._portalManager = new PortalManager("popupContent", this.requestRender);
this._reactRenderer = new ReactRenderer(this._elRef, document, true, {}, this._portalManager);
// render needs to fire again after the portalManager is created.
this.requestRender();
this.i.provideRenderer(this._reactRenderer);
}
}
render() {
let propChildren = this.props.children;
let children = [];
React.Children.forEach(propChildren, (ch) => {
children.push(React.cloneElement(ch));
});
if (this._portalManager)
this._portalManager.onRender(children);
let div = React.createElement("div", {
ref: this._getMainRef,
children: children
});
return div;
}
requestRender() {
if (this._initialized)
this.setState({});
}
constructor(props) {
super(props);
this._reactRenderer = null;
this._implementation = null;
this.__p = null;
this._hasUserValues = new Set();
this._stylingContainer = null;
this._stylingParent = null;
this._inStyling = false;
this._onClosed = null;
this._onClosed_wrapped = null;
this._onPopup = null;
this._onPopup_wrapped = null;
this._popupGotFocus = null;
this._popupGotFocus_wrapped = null;
this._popupLostFocus = null;
this._popupLostFocus_wrapped = null;
this._measuringContentSize = null;
this._measuringContentSize_wrapped = null;
if (this._styling) {
NamePatcher.ensureStylablePatched(Object.getPrototypeOf(this));
}
this._implementation = this.createImplementation();
this._getMainRef = this._getMainRef.bind(this);
if (props) {
this.initializeProperties();
}
this._initialized = true;
}
shouldComponentUpdate(nextProps, nextState) {
const mod = getModifiedProps(this.props, nextProps);
for (const p of Object.keys(mod)) {
if (isValidProp(this, p)) {
this[p] = mod[p];
}
}
return true;
}
initializeProperties() {
for (const p of Object.keys(this.props)) {
if (isValidProp(this, p)) {
this[p] = this.props[p];
}
}
}
// supports angular themes or custom properties set in CSS
updateStyle() {
this._styling(this._elRef, this);
}
destroy() {
this.i.destroy();
if (this._reactRenderer)
this._reactRenderer.destroy();
}
componentWillUnmount() {
}
componentDidMount() {
this._elRef.style.width = this._width ? this._width : "";
this._elRef.style.height = this._height ? this._height : "";
this.initializeContent();
}
initializeContent() {
this._styling(this._elRef, this);
this.updateStyle();
}
createImplementation() {
return new Popup();
}
get i() {
return this._implementation;
}
get isFocusable() {
return this.i.as;
}
set isFocusable(v) {
this.i.as = ensureBool(v);
}
/**
* Gets or sets the duration of the Popup and Closeup animations in milliseconds.
*/
get animationDuration() {
return this.i.a9;
}
set animationDuration(v) {
this.i.a9 = +v;
}
/**
* Gets or sets whether the popup and closeup animations are animated.
*/
get animationEnabled() {
return this.i.am;
}
set animationEnabled(v) {
this.i.am = ensureBool(v);
}
/**
* Gets or sets the type of animation to use when the popup opens and closes.
*/
get animationType() {
return this.i.p;
}
set animationType(v) {
this.i.p = ensureEnum(PopupAnimationType_$type, v);
}
/**
* Gets or sets the elevation to use for the button regardless of type.
*/
get elevation() {
return this.i.bb;
}
set elevation(v) {
this.i.bb = +v;
}
/**
* Gets or sets the elevation of the border shadow
*/
get actualElevation() {
return this.i.a7;
}
set actualElevation(v) {
this.i.a7 = +v;
}
/**
* Gets / sets the isShown state of the panel.
*/
get isShown() {
return this.i.ax;
}
/**
* Gets or sets the color to use for the check mark when the checkbox is checked.
*/
get actualUmbraShadowColor() {
return brushToString(this.i.cz);
}
set actualUmbraShadowColor(v) {
this.i.cz = stringToBrush(v);
}
/**
* Gets or sets the color to use for the check mark when the checkbox is checked.
*/
get actualPenumbraShadowColor() {
return brushToString(this.i.cy);
}
set actualPenumbraShadowColor(v) {
this.i.cy = stringToBrush(v);
}
/**
* Gets or sets the color to use for the check mark when the checkbox is checked.
*/
get actualAmbientShadowColor() {
return brushToString(this.i.cx);
}
set actualAmbientShadowColor(v) {
this.i.cx = stringToBrush(v);
}
/**
* Gets or sets the background color of the popup.
*/
get background() {
return brushToString(this.i.c0);
}
set background(v) {
this.i.c0 = stringToBrush(v);
}
get cornerRadius() {
return this.i.a1;
}
set cornerRadius(v) {
this.i.a1 = +v;
}
/**
* Gets or sets whether to disable hit testing on the popup.
*/
get isHitTestVisible() {
return this.i.at;
}
set isHitTestVisible(v) {
this.i.at = ensureBool(v);
}
/**
* Gets or sets whether to disable hit testing during the open and close animations.
*/
get disableHitTestDuringAnimation() {
return this.i.ao;
}
set disableHitTestDuringAnimation(v) {
this.i.ao = ensureBool(v);
}
/**
* Gets or sets whether to show a pointer off the side of the popup towards the popup target.
*/
get isPointerEnabled() {
return this.i.au;
}
set isPointerEnabled(v) {
this.i.au = ensureBool(v);
}
/**
* Gets or sets the pointer position.
*/
get pointerPosition() {
return this.i.v;
}
set pointerPosition(v) {
this.i.v = ensureEnum(PopupPointerPosition_$type, v);
}
/**
* Gets or sets the pointer background color.
*/
get pointerBackground() {
return brushToString(this.i.c4);
}
set pointerBackground(v) {
this.i.c4 = stringToBrush(v);
}
/**
* Gets or sets the pointer size.
*/
get pointerSize() {
return this.i.a4;
}
set pointerSize(v) {
this.i.a4 = +v;
}
/**
* Gets whether the popup is in the middle of opening or not.
*/
get isShowing() {
return this.i.av;
}
set isShowing(v) {
this.i.av = ensureBool(v);
}
/**
* Gets whether the popup is in the middle of closing or not.
*/
get isClosing() {
return this.i.aq;
}
set isClosing(v) {
this.i.aq = ensureBool(v);
}
/**
* Indicates that the popup will position itself relative to the window instead of the document.
*/
get isFixed() {
return this.i.ar;
}
set isFixed(v) {
this.i.ar = ensureBool(v);
}
/**
* Indicates that the popup will place itself into the browser top layer.
*/
get useTopLayer() {
return this.i.ay;
}
set useTopLayer(v) {
this.i.ay = ensureBool(v);
}
findByName(name) {
if (this.findEphemera) {
if (name && name.indexOf("@@e:") == 0) {
return this.findEphemera(name);
}
}
return null;
}
get hasUserValues() {
return this._hasUserValues;
}
__m(propertyName) {
if (!this._inStyling) {
this._hasUserValues.add(propertyName);
}
}
_styling(container, component, parent) {
if (this._inStyling) {
return;
}
this._inStyling = true;
this._stylingContainer = container;
this._stylingParent = component;
let genericPrefix = "";
let typeName = this.i.$type.name;
if (typeName.indexOf("Xam") === 0) {
typeName = typeName.substring(3);
}
genericPrefix = toSpinal("Popup");
let additionalPrefixes = [];
let prefix = toSpinal(typeName);
additionalPrefixes.push(prefix + "-");
let b = this.i.$type.baseType;
while (b && b.name != "Object" &&
b.name != "Base" &&
b.name != "Control" &&
b.Name != "DependencyObject" &&
b.Name != "FrameworkElement") {
typeName = b.name;
if (typeName.indexOf("Xam") === 0) {
typeName = typeName.substring(3);
}
let basePrefix = toSpinal(typeName);
additionalPrefixes.push(basePrefix + "-");
b = b.baseType;
}
if (parent) {
let parentTypeName = parent.i.$type.name;
if (parentTypeName.indexOf("Xam") === 0) {
parentTypeName = parentTypeName.substring(3);
}
let parentPrefix = toSpinal(parentTypeName);
additionalPrefixes.push(parentPrefix + "-" + genericPrefix + "-");
additionalPrefixes.push(parentPrefix + "-" + prefix + "-");
}
initializePropertiesFromCss(container, this, genericPrefix + "-", this.hasUserValues, false, additionalPrefixes);
if (this._otherStyling) {
this._otherStyling(container, component, parent);
}
this._inStyling = false;
}
/**
* Closes the popup.
*/
close() {
this.i.b6();
}
showRelativeToExclusionRect(exclusionRect, popupDirection, popupAlignment) {
this.i.showRelativeToExclusionRect(toRect(exclusionRect), (popupDirection == null ? null : popupDirection), (popupAlignment == null ? null : popupAlignment));
}
/**
* Exports visual information about the current state of the grid.
*/
exportVisualModel() {
let iv = this.i.bd();
return (iv);
}
/**
* Returns a serialized copy of the exported visual model
*/
exportSerializedVisualModel() {
let iv = this.i.bq();
return (iv);
}
get onClosed() {
return this._onClosed;
}
set onClosed(ev) {
if (this._onClosed_wrapped !== null) {
this.i.onClosed = delegateRemove(this.i.onClosed, this._onClosed_wrapped);
this._onClosed_wrapped = null;
this._onClosed = null;
}
this._onClosed = ev;
this._onClosed_wrapped = (o, e) => {
let outerArgs = new IgrOnClosedEventArgs();
outerArgs._provideImplementation(e);
if (this.beforeOnClosed) {
this.beforeOnClosed(this, outerArgs);
}
if (this._onClosed) {
this._onClosed(this, outerArgs);
}
};
this.i.onClosed = delegateCombine(this.i.onClosed, this._onClosed_wrapped);
;
}
/**
* Fires when the popup is shown
*/
get onPopup() {
return this._onPopup;
}
set onPopup(ev) {
if (this._onPopup_wrapped !== null) {
this.i.onPopup = delegateRemove(this.i.onPopup, this._onPopup_wrapped);
this._onPopup_wrapped = null;
this._onPopup = null;
}
this._onPopup = ev;
this._onPopup_wrapped = (o, e) => {
let outerArgs = new IgrOnPopupEventArgs();
outerArgs._provideImplementation(e);
if (this.beforeOnPopup) {
this.beforeOnPopup(this, outerArgs);
}
if (this._onPopup) {
this._onPopup(this, outerArgs);
}
};
this.i.onPopup = delegateCombine(this.i.onPopup, this._onPopup_wrapped);
;
}
/**
* Fired when the open popup gains focus.
*/
get popupGotFocus() {
return this._popupGotFocus;
}
set popupGotFocus(ev) {
if (this._popupGotFocus_wrapped !== null) {
this.i.popupGotFocus = delegateRemove(this.i.popupGotFocus, this._popupGotFocus_wrapped);
this._popupGotFocus_wrapped = null;
this._popupGotFocus = null;
}
this._popupGotFocus = ev;
this._popupGotFocus_wrapped = (o, e) => {
let outerArgs = new IgrFocusEventArgs();
outerArgs._provideImplementation(e);
if (this.beforePopupGotFocus) {
this.beforePopupGotFocus(this, outerArgs);
}
if (this._popupGotFocus) {
this._popupGotFocus(this, outerArgs);
}
};
this.i.popupGotFocus = delegateCombine(this.i.popupGotFocus, this._popupGotFocus_wrapped);
;
}
/**
* Fired when the open popup loses focus.
*/
get popupLostFocus() {
return this._popupLostFocus;
}
set popupLostFocus(ev) {
if (this._popupLostFocus_wrapped !== null) {
this.i.popupLostFocus = delegateRemove(this.i.popupLostFocus, this._popupLostFocus_wrapped);
this._popupLostFocus_wrapped = null;
this._popupLostFocus = null;
}
this._popupLostFocus = ev;
this._popupLostFocus_wrapped = (o, e) => {
let outerArgs = new IgrFocusEventArgs();
outerArgs._provideImplementation(e);
if (this.beforePopupLostFocus) {
this.beforePopupLostFocus(this, outerArgs);
}
if (this._popupLostFocus) {
this._popupLostFocus(this, outerArgs);
}
};
this.i.popupLostFocus = delegateCombine(this.i.popupLostFocus, this._popupLostFocus_wrapped);
;
}
get measuringContentSize() {
return this._measuringContentSize;
}
set measuringContentSize(ev) {
if (this._measuringContentSize_wrapped !== null) {
this.i.measuringContentSize = delegateRemove(this.i.measuringContentSize, this._measuringContentSize_wrapped);
this._measuringContentSize_wrapped = null;
this._measuringContentSize = null;
}
this._measuringContentSize = ev;
this._measuringContentSize_wrapped = (o, e) => {
let outerArgs = new IgrPopupMeasuringContentSizeEventArgs();
outerArgs._provideImplementation(e);
if (this.beforeMeasuringContentSize) {
this.beforeMeasuringContentSize(this, outerArgs);
}
if (this._measuringContentSize) {
this._measuringContentSize(this, outerArgs);
}
};
this.i.measuringContentSize = delegateCombine(this.i.measuringContentSize, this._measuringContentSize_wrapped);
;
}
}