UNPKG

office-ui-fabric-react

Version:

Reusable React components for building experiences for Office 365.

121 lines (119 loc) 5.44 kB
"use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var __assign = (this && this.__assign) || Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var React = require('react'); var ReactDOM = require('react-dom'); var Fabric_1 = require('../../Fabric'); var Utilities_1 = require('../../Utilities'); var ProjectedLayer_1 = require('./ProjectedLayer'); var DEFAULT_HOST_ID = '__layerHost'; /** * LayerHost provides a wrapper that acts as a passthrough, rendering the given children within it, but also * appending a div at the end, which projects all content wrapped in the Layer components within. Projecting * DOM to the end of the document allows for overlaying and stacking scenarios. * * Normally you do not need to interact directly with LayerHost. If you render Layers within content that isn't * wrapped within a LayerHost, a LayerHost will be created and appended to the end of the document body, where * layer content will then be projected. However in some circumstances you want Layered content to be rendered * in a specific place rather than document body (for example in a popup window or contained within a scrollable * region.) In those cases, wrap the content wihtin a LayerHost. * * @example * <LayerHost> * <Layer>I will at the end of LayerHost.</Layer> * <div>I will render normally.</div> * </LayerHost> **/ var LayerHost = (function (_super) { __extends(LayerHost, _super); function LayerHost(props) { _super.call(this, props); this.state = { layers: [] }; this._layers = []; this._layerRefs = {}; } LayerHost.getDefault = function (layerElement) { var doc = layerElement.ownerDocument; var hostElement = doc.getElementById(DEFAULT_HOST_ID); if (hostElement) { return hostElement[DEFAULT_HOST_ID]; } else { hostElement = doc.createElement('div'); hostElement.id = DEFAULT_HOST_ID; doc.body.appendChild(hostElement); var defaultHost = ReactDOM.render(React.createElement(LayerHost, null), hostElement); hostElement[DEFAULT_HOST_ID] = defaultHost; return defaultHost; } }; LayerHost.prototype.getChildContext = function () { return { layerHost: this }; }; LayerHost.prototype.render = function () { var _this = this; var divProps = Utilities_1.getNativeProps(this.props, Utilities_1.divProperties); return (React.createElement("div", __assign({}, divProps, {className: Utilities_1.css('ms-LayerHost', this.props.className)}), React.createElement(Fabric_1.Fabric, null, this.props.children, React.createElement("div", {className: 'ms-LayerHost-overlay'}, this._layers.map(function (layer) { return (React.createElement(ProjectedLayer_1.ProjectedLayer, {key: layer.id, layerId: layer.id, parentElement: layer.parentElement, defaultRemoteProps: layer.props, ref: _this._resolveLayer})); }))) )); }; LayerHost.prototype.addLayer = function (id, parentElement, props, onMounted) { this._layers.push({ id: id, parentElement: parentElement, props: props, onMounted: onMounted }); this.forceUpdate(); }; LayerHost.prototype.removeLayer = function (id) { var index = Utilities_1.findIndex(this._layers, function (layer) { return layer.id === id; }); if (index >= 0) { this._layers.splice(index, 1); delete this._layerRefs[id]; this.forceUpdate(); } }; LayerHost.prototype._resolveLayer = function (projectedLayer) { if (projectedLayer) { var layerId_1 = projectedLayer.getId(); var index = Utilities_1.findIndex(this._layers, function (layer) { return layer.id === layerId_1; }); if (index >= 0 && this._layerRefs[layerId_1] !== projectedLayer) { this._layerRefs[layerId_1] = projectedLayer; this._layers[index].onMounted(projectedLayer); } } }; LayerHost.childContextTypes = { layerHost: React.PropTypes.object }; __decorate([ Utilities_1.autobind ], LayerHost.prototype, "_resolveLayer", null); return LayerHost; }(Utilities_1.BaseComponent)); exports.LayerHost = LayerHost; //# sourceMappingURL=LayerHost.js.map