diff --git a/Classes/Controller/StandardController.php b/Classes/Controller/StandardController.php index 3888f99..50b8010 100644 --- a/Classes/Controller/StandardController.php +++ b/Classes/Controller/StandardController.php @@ -62,7 +62,14 @@ public function queryAction($preset, $nodeContextPath, $page = 1) ]; $nodes = \Neos\Eel\Utility::evaluateEelExpression($expression, $this->eelEvaluator, $contextVariables, $this->defaultContextConfiguration); $nodeInfoHelper = new NodeInfoHelper(); - $result = $nodeInfoHelper->renderNodes($nodes, $this->getControllerContext(), true); + + $result = []; + foreach ($nodes as $node) { + $nodeInfo = $nodeInfoHelper->renderNodeWithMinimalPropertiesAndChildrenInformation($node, $this->getControllerContext()); + $nodeInfo['properties']['_removed'] = $node->isRemoved(); + $nodeInfo['properties']['_hidden'] = $node->isHidden(); + $result[] = $nodeInfo; + } $this->view->assign('value', $result); } @@ -81,7 +88,8 @@ public function getNewReferenceNodePathAction($preset, $nodeContextPath) $expression = '${' . $this->presets[$preset]['newReferenceNodePath'] . '}'; $baseNode = $this->nodeService->getNodeFromContextPath($nodeContextPath, null, null, true); $contextVariables = [ - 'node' => $baseNode + 'node' => $baseNode, + 'site' => $baseNode ]; $newReferenceNodePath = \Neos\Eel\Utility::evaluateEelExpression($expression, $this->eelEvaluator, $contextVariables, $this->defaultContextConfiguration); $this->view->assign('value', $newReferenceNodePath); diff --git a/Configuration/Settings.yaml b/Configuration/Settings.yaml index 2b49f4f..085b957 100644 --- a/Configuration/Settings.yaml +++ b/Configuration/Settings.yaml @@ -1,5 +1,10 @@ Neos: Neos: + userInterface: + translation: + autoInclude: + Psmb.FlatNav: + - Main Ui: resources: javascript: @@ -19,6 +24,7 @@ Neos: # type: flat # query: 'Search.query(node).nodeType("Your.Namespace:News").sortDesc("date").from((page - 1) * 20).limit(20).execute().toArray()' # newReferenceNodePath: '/sites/site' + # # If now `newNodeType` is defined, then the nodetype selection dialog would be shown # newNodeType: 'Your.Namespace:News' # disablePagination: false ## Example without pagination diff --git a/Resources/Private/FlatNav/src/FlatNav.js b/Resources/Private/FlatNav/src/FlatNav.js index 32323f0..6ce810e 100644 --- a/Resources/Private/FlatNav/src/FlatNav.js +++ b/Resources/Private/FlatNav/src/FlatNav.js @@ -1,170 +1,35 @@ import React, {Component} from 'react'; import PropTypes from 'prop-types'; import {$get, $transform} from 'plow-js'; -import {Button, Icon, IconButton, Tabs} from '@neos-project/react-ui-components'; +import {Button, Icon, IconButton} from '@neos-project/react-ui-components'; import {connect} from 'react-redux'; import {actions, selectors} from '@neos-project/neos-ui-redux-store'; import {neos} from '@neos-project/neos-ui-decorators'; -import {fetchWithErrorHandling} from '@neos-project/neos-ui-backend-connector'; import HideSelectedNode from './HideSelectedNode'; import DeleteSelectedNode from './DeleteSelectedNode'; import mergeClassNames from 'classnames'; import style from './style.css'; import RefreshNodes from "./RefreshNodes"; - -const makeFlatNavContainer = OriginalPageTree => { - class FlatNavContainer extends Component { - state = {}; - - constructor(props) { - super(props); - Object.keys(this.props.options.presets).forEach(preset => { - this.state[preset] = { - page: 1, - isLoading: false, - isLoadingReferenceNodePath: false, - nodes: [], - moreNodesAvailable: true, - newReferenceNodePath: '' - }; - }); - } - - makeResetNodes = preset => callback => { - this.setState({ - [preset]: { - ...this.state[preset], - page: 1, - nodes: [], - moreNodesAvailable: true - } - }, callback); - } - - makeFetchNodes = preset => () => { - this.setState({ - [preset]: { - ...this.state[preset], - isLoading: true, - moreNodesAvailable: true - } - }); - fetchWithErrorHandling.withCsrfToken(csrfToken => ({ - url: `/flatnav/query?nodeContextPath=${this.props.siteNodeContextPath}&preset=${preset}&page=${this.state[preset].page}`, - method: 'GET', - credentials: 'include', - headers: { - 'X-Flow-Csrftoken': csrfToken, - 'Content-Type': 'application/json' - } - })) - .then(response => response && response.json()) - .then(nodes => { - if (nodes.length > 0) { - const nodesMap = nodes.reduce((result, node) => { - result[node.contextPath] = node; - return result; - }, {}); - this.props.merge(nodesMap); - this.setState({ - [preset]: { - ...this.state[preset], - page: this.state[preset].page + 1, - isLoading: false, - nodes: [...this.state[preset].nodes, ...Object.keys(nodesMap)], - moreNodesAvailable: true - } - }); - } else { - this.setState({ - [preset]: { - ...this.state[preset], - isLoading: false, - moreNodesAvailable: false - } - }); - } - }); - }; - - makeGetNewReferenceNodePath = preset => () => { - this.setState({ - [preset]: { - ...this.state[preset], - isLoadingReferenceNodePath: true - } - }); - fetchWithErrorHandling.withCsrfToken(csrfToken => ({ - url: `/flatnav/getNewReferenceNodePath?nodeContextPath=${this.props.siteNodeContextPath}&preset=${preset}`, - method: 'GET', - credentials: 'include', - headers: { - 'X-Flow-Csrftoken': csrfToken, - 'Content-Type': 'application/json' - } - })) - .then(response => response && response.json()) - .then(newReferenceNodePath => { - this.setState({ - [preset]: { - ...this.state[preset], - isLoading: false, - isLoadingReferenceNodePath: false, - newReferenceNodePath: newReferenceNodePath - } - }); - }); - }; - - render() { - return ( - - {Object.keys(this.props.options.presets).map(presetName => { - const preset = this.props.options.presets[presetName]; - return ( - - {preset.type === 'flat' && ()} - {preset.type === 'tree' && ()} - - ); - })} - - ); - } - } - return neos(globalRegistry => ({ - options: globalRegistry.get('frontendConfiguration').get('Psmb_FlatNav') - }))(connect($transform({ - siteNodeContextPath: $get('cr.nodes.siteNode') - }), { - merge: actions.CR.Nodes.merge - })(FlatNavContainer)); -}; - -export default makeFlatNavContainer; - @neos(globalRegistry => ({ nodeTypesRegistry: globalRegistry.get('@neos-project/neos-ui-contentrepository'), - serverFeedbackHandlers: globalRegistry.get('serverFeedbackHandlers') + serverFeedbackHandlers: globalRegistry.get('serverFeedbackHandlers'), + i18nRegistry: globalRegistry.get('i18n') })) @connect($transform({ nodeData: $get('cr.nodes.byContextPath'), focused: $get('ui.pageTree.isFocused'), - siteNodeContextPath: $get('cr.nodes.siteNode') + siteNodeContextPath: $get('cr.nodes.siteNode'), + baseWorkspaceName: $get('cr.workspaces.personalWorkspace.baseWorkspace'), + publishableNodes: $get('cr.workspaces.personalWorkspace.publishableNodes') }), { setSrc: actions.UI.ContentCanvas.setSrc, focus: actions.UI.PageTree.focus, openNodeCreationDialog: actions.UI.NodeCreationDialog.open, commenceNodeCreation: actions.CR.Nodes.commenceCreation, - selectNodeType: actions.UI.SelectNodeTypeModal.apply + selectNodeType: actions.UI.SelectNodeTypeModal.apply, + merge: actions.CR.Nodes.merge }) -class FlatNav extends Component { +export default class FlatNav extends Component { static propTypes = { nodes: PropTypes.array.isRequired, preset: PropTypes.object.isRequired, @@ -176,14 +41,20 @@ class FlatNav extends Component { }; componentDidMount() { + this.populateTheState(); + this.props.serverFeedbackHandlers.set('Neos.Neos.Ui:NodeCreated/DocumentAdded', this.handleNodeWasCreated, 'after Neos.Neos.Ui:NodeCreated/Main'); + } + + componentDidUpdate(prevProps) { + this.populateTheState(); + } + + populateTheState = () => { if (this.props.nodes.length === 0) { this.props.fetchNodes(); - if (this.props.preset.newReferenceNodePath.indexOf('/') !== 0) { - this.props.fetchNewReferenceNodePath(); - } + this.props.fetchNewReference(); } - this.props.serverFeedbackHandlers.set('Neos.Neos.Ui:NodeCreated/DocumentAdded', this.handleNodeWasCreated, 'after Neos.Neos.Ui:NodeCreated/Main'); - } + }; handleNodeWasCreated = (feedbackPayload, {store}) => { const state = store.getState(); @@ -197,40 +68,86 @@ class FlatNav extends Component { } } - createNode = () => { + buildNewReferenceNodePath = () => { const context = this.props.siteNodeContextPath.split('@')[1]; - const contextPath = (this.props.newReferenceNodePath || this.props.preset.newReferenceNodePath) + '@' + context; - this.props.commenceNodeCreation(contextPath); - this.props.selectNodeType('into', this.props.preset.newNodeType); + return this.props.newReferenceNodePath + '@' + context; + }; + + createNode = () => { + const contextPath = this.buildNewReferenceNodePath(); + this.props.commenceNodeCreation(contextPath, undefined, 'into', this.props.preset.newNodeType || undefined); } refreshFlatNav = () => { this.props.resetNodes(this.props.fetchNodes); } + getNodeIconComponent(node) { + const nodeTypeName = $get('nodeType', node); + const nodeType = this.props.nodeTypesRegistry.getNodeType(nodeTypeName); + const isHidden = $get('properties._hidden', node); + const isHiddenBefore = $get('properties._hiddenBeforeDateTime', node); + const isHiddenAfter = $get('properties._hiddenAfterDateTime', node); + + if (isHidden) { + return ( + + + + + + ); + } + + if (isHiddenBefore || isHiddenAfter) { + return ( + + + + + + ); + } + + return ( + + ); + } + renderNodes = () => { return this.props.nodes .map(contextPath => { const item = $get([contextPath], this.props.nodeData); + if (item) { - const nodeTypeName = $get('nodeType', item); - const nodeType = this.props.nodeTypesRegistry.getNodeType(nodeTypeName); + const isFocused = this.props.focused === contextPath; + const isDirty = this.props.publishableNodes.filter(i => ( + $get('contextPath', i) === contextPath || + $get('documentContextPath', i) === contextPath + )).count() > 0; + const isRemoved = $get('properties._removed', item); + const nodeIconComponent = this.getNodeIconComponent(item); + return (
{ - this.props.setSrc($get('uri', item)); - this.props.focus(contextPath); + if ( ! isRemoved) { + this.props.setSrc($get('uri', item)); + this.props.focus(contextPath); + } }} role="button" >
- + {nodeIconComponent}
@@ -267,7 +184,7 @@ class FlatNav extends Component { spin={this.props.isLoading} icon={this.props.isLoading ? 'spinner' : 'angle-double-down'} /> -  {this.props.isLoading ? 'Loading...' : 'Load more'} +  {this.props.isLoading ? this.props.i18nRegistry.translate('Psmb.FlatNav:Main:loading') : this.props.i18nRegistry.translate('Psmb.FlatNav:Main:loadMore')}
)} diff --git a/Resources/Private/FlatNav/src/makeFlatNavContainer.js b/Resources/Private/FlatNav/src/makeFlatNavContainer.js new file mode 100644 index 0000000..405d85c --- /dev/null +++ b/Resources/Private/FlatNav/src/makeFlatNavContainer.js @@ -0,0 +1,243 @@ +import React, {Component} from 'react'; +import {$get, $transform} from 'plow-js'; +import {Tabs} from '@neos-project/react-ui-components'; +import {connect} from 'react-redux'; +import {actions} from '@neos-project/neos-ui-redux-store'; +import {neos} from '@neos-project/neos-ui-decorators'; +import {fetchWithErrorHandling} from '@neos-project/neos-ui-backend-connector'; +import backend from '@neos-project/neos-ui-backend-connector'; +import FlatNav from './FlatNav'; +import style from './style.css'; + +// Taken from here, as it's not exported in the UI +// https://github.com/neos/neos-ui/blob/b2a52d66a211b192dfc541799779a8be27bf5a31/packages/neos-ui-sagas/src/CR/NodeOperations/helpers.js#L3 +const parentNodeContextPath = contextPath => { + if (typeof contextPath !== 'string') { + return null; + } + + const [path, context] = contextPath.split('@'); + + if (path.length === 0) { + // We are at top level; so there is no parent anymore! + return false; + } + + return `${path.substr(0, path.lastIndexOf('/'))}@${context}`; +}; + +const makeFlatNavContainer = OriginalPageTree => { + class FlatNavContainer extends Component { + state = {}; + + constructor(props) { + super(props); + this.state = this.buildDefaultState(props); + + // It's not safe to rely on React's state to do the locking + this.loadingLock = {}; + this.loadingReferenceNodePathLock = {}; + } + + componentDidUpdate(prevProps) { + // If the siteNodeContextPath or baseWorkspaceName have changed, fully reset the state + if ( + this.props.siteNodeContextPath !== prevProps.siteNodeContextPath || + this.props.baseWorkspaceName !== prevProps.baseWorkspaceName + ) { + this.fullReset(); + } + } + + buildDefaultState = props => { + const state = {}; + Object.keys(props.options.presets).forEach(preset => { + let newReferenceNodePath; + // If `newReferenceNodePath` is static, append context to it, otherwise set to empty, as it would be fetched later + const newReferenceNodePathSetting = $get(['options', 'presets', preset, 'newReferenceNodePath'], props); + if (typeof newReferenceNodePathSetting === 'string' && newReferenceNodePathSetting.indexOf('/') === 0) { + newReferenceNodePath = props.options.presets[preset].newReferenceNodePath; + } else { + newReferenceNodePath = ''; + } + state[preset] = { + page: 1, + isLoading: false, + isLoadingReferenceNodePath: false, + nodes: [], + moreNodesAvailable: true, + newReferenceNodePath + }; + }); + return state; + }; + + fullReset = () => { + const defaultState = this.buildDefaultState(this.props); + this.setState({ + ...defaultState + }); + } + + makeResetNodes = preset => callback => { + this.setState({ + [preset]: { + ...this.state[preset], + page: 1, + nodes: [], + moreNodesAvailable: true + } + }, callback); + } + + makeFetchNodes = preset => () => { + if (this.loadingLock[preset]) { + return; + } + this.loadingLock[preset] = true; + this.setState({ + [preset]: { + ...this.state[preset], + isLoading: true, + moreNodesAvailable: true + } + }); + fetchWithErrorHandling.withCsrfToken(csrfToken => ({ + url: `/flatnav/query?nodeContextPath=${encodeURIComponent(this.props.siteNodeContextPath)}&preset=${preset}&page=${this.state[preset].page}`, + method: 'GET', + credentials: 'include', + headers: { + 'X-Flow-Csrftoken': csrfToken, + 'Content-Type': 'application/json' + } + })) + .then(response => response && response.json()) + .then(nodes => { + if (nodes.length > 0) { + const nodesMap = nodes.reduce((result, node) => { + result[node.contextPath] = node; + return result; + }, {}); + this.props.merge(nodesMap); + this.setState({ + [preset]: { + ...this.state[preset], + page: this.state[preset].page + 1, + isLoading: false, + nodes: [...this.state[preset].nodes, ...Object.keys(nodesMap)], + moreNodesAvailable: true + } + }); + } else { + this.setState({ + [preset]: { + ...this.state[preset], + isLoading: false, + moreNodesAvailable: false + } + }); + } + this.loadingLock[preset] = false; + }); + }; + + // Gets the `newReferenceNodePath` setting and loads that node into state + makeGetNewReference = preset => () => { + if (this.loadingReferenceNodePathLock[preset]) { + return; + } + this.loadingReferenceNodePathLock[preset] = true; + const context = this.props.siteNodeContextPath.split('@')[1]; + if (this.state[preset].newReferenceNodePath.indexOf('/') === 0) { + this.fetchNodeWithParents(this.state[preset].newReferenceNodePath + '@' + context); + } else { + this.setState({ + [preset]: { + ...this.state[preset], + isLoadingReferenceNodePath: true + } + }); + fetchWithErrorHandling.withCsrfToken(csrfToken => ({ + url: `/flatnav/getNewReferenceNodePath?nodeContextPath=${encodeURIComponent(this.props.siteNodeContextPath)}&preset=${preset}`, + method: 'GET', + credentials: 'include', + headers: { + 'X-Flow-Csrftoken': csrfToken, + 'Content-Type': 'application/json' + } + })) + .then(response => response && response.json()) + .then(newReferenceNodePath => { + this.setState({ + [preset]: { + ...this.state[preset], + isLoadingReferenceNodePath: false, + newReferenceNodePath + } + }); + this.fetchNodeWithParents(newReferenceNodePath + '@' + context); + this.loadingReferenceNodePathLock[preset] = false; + }); + } + }; + + fetchNodeWithParents = contextPath => { + // This is rather a hack. We need to make sure the target NewReferenceNode is loaded + // in order to be able to create anything inside it. + const {siteNodeContextPath} = this.props; + const {q} = backend.get(); + + let parentContextPath = contextPath; + + while (parentContextPath !== siteNodeContextPath) { + const node = $get([parentContextPath], this.props.nodeData); + // If the given node is not in the state, load it + if (!node) { + q(parentContextPath).get().then(nodes => { + this.props.merge(nodes.reduce((nodeMap, node) => { + nodeMap[$get('contextPath', node)] = node; + return nodeMap; + }, {})); + }); + } + parentContextPath = parentNodeContextPath(parentContextPath); + } + }; + + render() { + return ( + + {Object.keys(this.props.options.presets).map(presetName => { + const preset = this.props.options.presets[presetName]; + return ( + + {preset.type === 'flat' && ()} + {preset.type === 'tree' && ()} + + ); + })} + + ); + } + } + return neos(globalRegistry => ({ + options: globalRegistry.get('frontendConfiguration').get('Psmb_FlatNav'), + i18nRegistry: globalRegistry.get('i18n') + }))(connect($transform({ + siteNodeContextPath: $get('cr.nodes.siteNode'), + baseWorkspaceName: $get('cr.workspaces.personalWorkspace.baseWorkspace') + }), { + merge: actions.CR.Nodes.merge + })(FlatNavContainer)); +}; + +export default makeFlatNavContainer; diff --git a/Resources/Private/FlatNav/src/manifest.js b/Resources/Private/FlatNav/src/manifest.js index b78df56..34516c2 100644 --- a/Resources/Private/FlatNav/src/manifest.js +++ b/Resources/Private/FlatNav/src/manifest.js @@ -1,6 +1,6 @@ import React from 'react'; import manifest from '@neos-project/neos-ui-extensibility'; -import makeFlatNavContainer from './FlatNav'; +import makeFlatNavContainer from './makeFlatNavContainer'; manifest('Psmb.FlatNav:FlatNav', {}, globalRegistry => { const containerRegistry = globalRegistry.get('containers'); diff --git a/Resources/Private/FlatNav/src/style.css b/Resources/Private/FlatNav/src/style.css index 8141547..cdfcbb6 100644 --- a/Resources/Private/FlatNav/src/style.css +++ b/Resources/Private/FlatNav/src/style.css @@ -3,6 +3,10 @@ opacity: 1 !important; } +.tabs__content { + height: calc(100% - 41px); +} + .toolbar { border-bottom: 1px solid var(--colors-ContrastDark); } @@ -26,6 +30,18 @@ .node--focused .node__label { color: var(--colors-PrimaryBlue); } +.node--dirty { + border-left: 2px solid var(--colors-Warn); + padding-left: 4px; +} +.node--removed { + cursor: not-allowed; + border-color: var(--colors-Error); +} +.node--removed .node__label, +.node--removed .node__iconWrapper { + opacity: 0.5; +} .node__iconWrapper { width: 2em; @@ -36,4 +52,4 @@ .node__label { margin-left: 2em; -} +} \ No newline at end of file diff --git a/Resources/Private/Translations/en/Main.xlf b/Resources/Private/Translations/en/Main.xlf new file mode 100644 index 0000000..ab9ee1c --- /dev/null +++ b/Resources/Private/Translations/en/Main.xlf @@ -0,0 +1,13 @@ + + + + + + Loading... + + + Load more + + + + diff --git a/Resources/Public/JavaScript/FlatNav/Plugin.js b/Resources/Public/JavaScript/FlatNav/Plugin.js index f8d06ab..48e0810 100644 --- a/Resources/Public/JavaScript/FlatNav/Plugin.js +++ b/Resources/Public/JavaScript/FlatNav/Plugin.js @@ -144,7 +144,7 @@ var _readFromConsumerApi2 = _interopRequireDefault(_readFromConsumerApi); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -module.exports = (0, _readFromConsumerApi2.default)('vendor')().PropTypes; +module.exports = (0, _readFromConsumerApi2.default)('vendor')().plow; /***/ }), /* 5 */ @@ -159,7 +159,7 @@ var _readFromConsumerApi2 = _interopRequireDefault(_readFromConsumerApi); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -module.exports = (0, _readFromConsumerApi2.default)('vendor')().plow; +module.exports = (0, _readFromConsumerApi2.default)('vendor')().reactRedux; /***/ }), /* 6 */ @@ -174,7 +174,7 @@ var _readFromConsumerApi2 = _interopRequireDefault(_readFromConsumerApi); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -module.exports = (0, _readFromConsumerApi2.default)('vendor')().reactRedux; +module.exports = (0, _readFromConsumerApi2.default)('NeosProjectPackages')().NeosUiReduxStore; /***/ }), /* 7 */ @@ -189,29 +189,14 @@ var _readFromConsumerApi2 = _interopRequireDefault(_readFromConsumerApi); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -module.exports = (0, _readFromConsumerApi2.default)('NeosProjectPackages')().NeosUiReduxStore; +module.exports = (0, _readFromConsumerApi2.default)('vendor')().PropTypes; /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - -var _readFromConsumerApi = __webpack_require__(0); - -var _readFromConsumerApi2 = _interopRequireDefault(_readFromConsumerApi); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -module.exports = (0, _readFromConsumerApi2.default)('vendor')().classnames; - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - - -var content = __webpack_require__(20); +var content = __webpack_require__(21); if(typeof content === 'string') content = [[module.i, content, '']]; @@ -225,7 +210,7 @@ var options = {"hmr":true} options.transform = transform options.insertInto = undefined; -var update = __webpack_require__(22)(content, options); +var update = __webpack_require__(23)(content, options); if(content.locals) module.exports = content.locals; @@ -256,6 +241,21 @@ if(false) { module.hot.dispose(function() { update(); }); } +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _readFromConsumerApi = __webpack_require__(0); + +var _readFromConsumerApi2 = _interopRequireDefault(_readFromConsumerApi); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +module.exports = (0, _readFromConsumerApi2.default)('vendor')().classnames; + /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { @@ -280,9 +280,9 @@ var _neosUiExtensibility = __webpack_require__(12); var _neosUiExtensibility2 = _interopRequireDefault(_neosUiExtensibility); -var _FlatNav = __webpack_require__(16); +var _makeFlatNavContainer = __webpack_require__(16); -var _FlatNav2 = _interopRequireDefault(_FlatNav); +var _makeFlatNavContainer2 = _interopRequireDefault(_makeFlatNavContainer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -308,7 +308,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de return null; }); - containerRegistry.set('LeftSideBar/Top/PageTree', (0, _FlatNav2.default)(OriginalTree)); + containerRegistry.set('LeftSideBar/Top/PageTree', (0, _makeFlatNavContainer2.default)(OriginalTree)); }); /***/ }), @@ -417,52 +417,38 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _dec, _dec2, _class2, _class3, _temp2; - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + var _react = __webpack_require__(1); var _react2 = _interopRequireDefault(_react); -var _propTypes = __webpack_require__(4); - -var _propTypes2 = _interopRequireDefault(_propTypes); - -var _plowJs = __webpack_require__(5); +var _plowJs = __webpack_require__(4); var _reactUiComponents = __webpack_require__(2); -var _reactRedux = __webpack_require__(6); +var _reactRedux = __webpack_require__(5); -var _neosUiReduxStore = __webpack_require__(7); +var _neosUiReduxStore = __webpack_require__(6); var _neosUiDecorators = __webpack_require__(3); var _neosUiBackendConnector = __webpack_require__(17); -var _HideSelectedNode = __webpack_require__(18); - -var _HideSelectedNode2 = _interopRequireDefault(_HideSelectedNode); - -var _DeleteSelectedNode = __webpack_require__(19); - -var _DeleteSelectedNode2 = _interopRequireDefault(_DeleteSelectedNode); +var _neosUiBackendConnector2 = _interopRequireDefault(_neosUiBackendConnector); -var _classnames = __webpack_require__(8); +var _FlatNav = __webpack_require__(18); -var _classnames2 = _interopRequireDefault(_classnames); +var _FlatNav2 = _interopRequireDefault(_FlatNav); -var _style = __webpack_require__(9); +var _style = __webpack_require__(8); var _style2 = _interopRequireDefault(_style); -var _RefreshNodes = __webpack_require__(24); - -var _RefreshNodes2 = _interopRequireDefault(_RefreshNodes); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } @@ -475,8 +461,30 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +// Taken from here, as it's not exported in the UI +// https://github.com/neos/neos-ui/blob/b2a52d66a211b192dfc541799779a8be27bf5a31/packages/neos-ui-sagas/src/CR/NodeOperations/helpers.js#L3 +var parentNodeContextPath = function parentNodeContextPath(contextPath) { + if (typeof contextPath !== 'string') { + return null; + } + + var _contextPath$split = contextPath.split('@'), + _contextPath$split2 = _slicedToArray(_contextPath$split, 2), + path = _contextPath$split2[0], + context = _contextPath$split2[1]; + + if (path.length === 0) { + // We are at top level; so there is no parent anymore! + return false; + } + + return path.substr(0, path.lastIndexOf('/')) + '@' + context; +}; + var makeFlatNavContainer = function makeFlatNavContainer(OriginalPageTree) { - var FlatNavContainer = function (_Component) { + var _class, _temp, _initialiseProps; + + var FlatNavContainer = (_temp = _class = function (_Component) { _inherits(FlatNavContainer, _Component); function FlatNavContainer(props) { @@ -484,117 +492,48 @@ var makeFlatNavContainer = function makeFlatNavContainer(OriginalPageTree) { var _this = _possibleConstructorReturn(this, (FlatNavContainer.__proto__ || Object.getPrototypeOf(FlatNavContainer)).call(this, props)); - _this.state = {}; + _initialiseProps.call(_this); - _this.makeResetNodes = function (preset) { - return function (callback) { - _this.setState(_defineProperty({}, preset, _extends({}, _this.state[preset], { - page: 1, - nodes: [], - moreNodesAvailable: true - })), callback); - }; - }; + _this.state = _this.buildDefaultState(props); - _this.makeFetchNodes = function (preset) { - return function () { - _this.setState(_defineProperty({}, preset, _extends({}, _this.state[preset], { - isLoading: true, - moreNodesAvailable: true - }))); - _neosUiBackendConnector.fetchWithErrorHandling.withCsrfToken(function (csrfToken) { - return { - url: '/flatnav/query?nodeContextPath=' + _this.props.siteNodeContextPath + '&preset=' + preset + '&page=' + _this.state[preset].page, - method: 'GET', - credentials: 'include', - headers: { - 'X-Flow-Csrftoken': csrfToken, - 'Content-Type': 'application/json' - } - }; - }).then(function (response) { - return response && response.json(); - }).then(function (nodes) { - if (nodes.length > 0) { - var nodesMap = nodes.reduce(function (result, node) { - result[node.contextPath] = node; - return result; - }, {}); - _this.props.merge(nodesMap); - _this.setState(_defineProperty({}, preset, _extends({}, _this.state[preset], { - page: _this.state[preset].page + 1, - isLoading: false, - nodes: [].concat(_toConsumableArray(_this.state[preset].nodes), _toConsumableArray(Object.keys(nodesMap))), - moreNodesAvailable: true - }))); - } else { - _this.setState(_defineProperty({}, preset, _extends({}, _this.state[preset], { - isLoading: false, - moreNodesAvailable: false - }))); - } - }); - }; - }; - - _this.makeGetNewReferenceNodePath = function (preset) { - return function () { - _this.setState(_defineProperty({}, preset, _extends({}, _this.state[preset], { - isLoadingReferenceNodePath: true - }))); - _neosUiBackendConnector.fetchWithErrorHandling.withCsrfToken(function (csrfToken) { - return { - url: '/flatnav/getNewReferenceNodePath?nodeContextPath=' + _this.props.siteNodeContextPath + '&preset=' + preset, - method: 'GET', - credentials: 'include', - headers: { - 'X-Flow-Csrftoken': csrfToken, - 'Content-Type': 'application/json' - } - }; - }).then(function (response) { - return response && response.json(); - }).then(function (newReferenceNodePath) { - _this.setState(_defineProperty({}, preset, _extends({}, _this.state[preset], { - isLoading: false, - isLoadingReferenceNodePath: false, - newReferenceNodePath: newReferenceNodePath - }))); - }); - }; - }; - - Object.keys(_this.props.options.presets).forEach(function (preset) { - _this.state[preset] = { - page: 1, - isLoading: false, - isLoadingReferenceNodePath: false, - nodes: [], - moreNodesAvailable: true, - newReferenceNodePath: '' - }; - }); + // It's not safe to rely on React's state to do the locking + _this.loadingLock = {}; + _this.loadingReferenceNodePathLock = {}; return _this; } _createClass(FlatNavContainer, [{ + key: 'componentDidUpdate', + value: function componentDidUpdate(prevProps) { + // If the siteNodeContextPath or baseWorkspaceName have changed, fully reset the state + if (this.props.siteNodeContextPath !== prevProps.siteNodeContextPath || this.props.baseWorkspaceName !== prevProps.baseWorkspaceName) { + this.fullReset(); + } + } + + // Gets the `newReferenceNodePath` setting and loads that node into state + + }, { key: 'render', value: function render() { var _this2 = this; return _react2.default.createElement( _reactUiComponents.Tabs, - null, + { theme: { + tabs__content: _style2.default.tabs__content + } }, Object.keys(this.props.options.presets).map(function (presetName) { var preset = _this2.props.options.presets[presetName]; return _react2.default.createElement( _reactUiComponents.Tabs.Panel, - { key: presetName, icon: preset.icon, tooltip: preset.label }, - preset.type === 'flat' && _react2.default.createElement(FlatNav, _extends({ + { id: presetName, key: presetName, icon: preset.icon, tooltip: _this2.props.i18nRegistry.translate(preset.label) }, + preset.type === 'flat' && _react2.default.createElement(_FlatNav2.default, _extends({ preset: preset, fetchNodes: _this2.makeFetchNodes(presetName), resetNodes: _this2.makeResetNodes(presetName), - fetchNewReferenceNodePath: _this2.makeGetNewReferenceNodePath(presetName) + fullReset: _this2.fullReset, + fetchNewReference: _this2.makeGetNewReference(presetName) }, _this2.state[presetName])), preset.type === 'tree' && _react2.default.createElement(OriginalPageTree, null) ); @@ -604,42 +543,285 @@ var makeFlatNavContainer = function makeFlatNavContainer(OriginalPageTree) { }]); return FlatNavContainer; - }(_react.Component); + }(_react.Component), _initialiseProps = function _initialiseProps() { + var _this3 = this; + + this.state = {}; + + this.buildDefaultState = function (props) { + var state = {}; + Object.keys(props.options.presets).forEach(function (preset) { + var newReferenceNodePath = void 0; + // If `newReferenceNodePath` is static, append context to it, otherwise set to empty, as it would be fetched later + var newReferenceNodePathSetting = (0, _plowJs.$get)(['options', 'presets', preset, 'newReferenceNodePath'], props); + if (typeof newReferenceNodePathSetting === 'string' && newReferenceNodePathSetting.indexOf('/') === 0) { + newReferenceNodePath = props.options.presets[preset].newReferenceNodePath; + } else { + newReferenceNodePath = ''; + } + state[preset] = { + page: 1, + isLoading: false, + isLoadingReferenceNodePath: false, + nodes: [], + moreNodesAvailable: true, + newReferenceNodePath: newReferenceNodePath + }; + }); + return state; + }; + + this.fullReset = function () { + var defaultState = _this3.buildDefaultState(_this3.props); + _this3.setState(_extends({}, defaultState)); + }; + + this.makeResetNodes = function (preset) { + return function (callback) { + _this3.setState(_defineProperty({}, preset, _extends({}, _this3.state[preset], { + page: 1, + nodes: [], + moreNodesAvailable: true + })), callback); + }; + }; + + this.makeFetchNodes = function (preset) { + return function () { + if (_this3.loadingLock[preset]) { + return; + } + _this3.loadingLock[preset] = true; + _this3.setState(_defineProperty({}, preset, _extends({}, _this3.state[preset], { + isLoading: true, + moreNodesAvailable: true + }))); + _neosUiBackendConnector.fetchWithErrorHandling.withCsrfToken(function (csrfToken) { + return { + url: '/flatnav/query?nodeContextPath=' + encodeURIComponent(_this3.props.siteNodeContextPath) + '&preset=' + preset + '&page=' + _this3.state[preset].page, + method: 'GET', + credentials: 'include', + headers: { + 'X-Flow-Csrftoken': csrfToken, + 'Content-Type': 'application/json' + } + }; + }).then(function (response) { + return response && response.json(); + }).then(function (nodes) { + if (nodes.length > 0) { + var nodesMap = nodes.reduce(function (result, node) { + result[node.contextPath] = node; + return result; + }, {}); + _this3.props.merge(nodesMap); + _this3.setState(_defineProperty({}, preset, _extends({}, _this3.state[preset], { + page: _this3.state[preset].page + 1, + isLoading: false, + nodes: [].concat(_toConsumableArray(_this3.state[preset].nodes), _toConsumableArray(Object.keys(nodesMap))), + moreNodesAvailable: true + }))); + } else { + _this3.setState(_defineProperty({}, preset, _extends({}, _this3.state[preset], { + isLoading: false, + moreNodesAvailable: false + }))); + } + _this3.loadingLock[preset] = false; + }); + }; + }; + + this.makeGetNewReference = function (preset) { + return function () { + if (_this3.loadingReferenceNodePathLock[preset]) { + return; + } + _this3.loadingReferenceNodePathLock[preset] = true; + var context = _this3.props.siteNodeContextPath.split('@')[1]; + if (_this3.state[preset].newReferenceNodePath.indexOf('/') === 0) { + _this3.fetchNodeWithParents(_this3.state[preset].newReferenceNodePath + '@' + context); + } else { + _this3.setState(_defineProperty({}, preset, _extends({}, _this3.state[preset], { + isLoadingReferenceNodePath: true + }))); + _neosUiBackendConnector.fetchWithErrorHandling.withCsrfToken(function (csrfToken) { + return { + url: '/flatnav/getNewReferenceNodePath?nodeContextPath=' + encodeURIComponent(_this3.props.siteNodeContextPath) + '&preset=' + preset, + method: 'GET', + credentials: 'include', + headers: { + 'X-Flow-Csrftoken': csrfToken, + 'Content-Type': 'application/json' + } + }; + }).then(function (response) { + return response && response.json(); + }).then(function (newReferenceNodePath) { + _this3.setState(_defineProperty({}, preset, _extends({}, _this3.state[preset], { + isLoadingReferenceNodePath: false, + newReferenceNodePath: newReferenceNodePath + }))); + _this3.fetchNodeWithParents(newReferenceNodePath + '@' + context); + _this3.loadingReferenceNodePathLock[preset] = false; + }); + } + }; + }; + + this.fetchNodeWithParents = function (contextPath) { + // This is rather a hack. We need to make sure the target NewReferenceNode is loaded + // in order to be able to create anything inside it. + var siteNodeContextPath = _this3.props.siteNodeContextPath; + + var _backend$get = _neosUiBackendConnector2.default.get(), + q = _backend$get.q; + + var parentContextPath = contextPath; + + while (parentContextPath !== siteNodeContextPath) { + var node = (0, _plowJs.$get)([parentContextPath], _this3.props.nodeData); + // If the given node is not in the state, load it + if (!node) { + q(parentContextPath).get().then(function (nodes) { + _this3.props.merge(nodes.reduce(function (nodeMap, node) { + nodeMap[(0, _plowJs.$get)('contextPath', node)] = node; + return nodeMap; + }, {})); + }); + } + parentContextPath = parentNodeContextPath(parentContextPath); + } + }; + }, _temp); return (0, _neosUiDecorators.neos)(function (globalRegistry) { return { - options: globalRegistry.get('frontendConfiguration').get('Psmb_FlatNav') + options: globalRegistry.get('frontendConfiguration').get('Psmb_FlatNav'), + i18nRegistry: globalRegistry.get('i18n') }; })((0, _reactRedux.connect)((0, _plowJs.$transform)({ - siteNodeContextPath: (0, _plowJs.$get)('cr.nodes.siteNode') + siteNodeContextPath: (0, _plowJs.$get)('cr.nodes.siteNode'), + baseWorkspaceName: (0, _plowJs.$get)('cr.workspaces.personalWorkspace.baseWorkspace') }), { merge: _neosUiReduxStore.actions.CR.Nodes.merge })(FlatNavContainer)); }; exports.default = makeFlatNavContainer; + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.fetchWithErrorHandling = undefined; + +var _readFromConsumerApi = __webpack_require__(0); + +var _readFromConsumerApi2 = _interopRequireDefault(_readFromConsumerApi); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = (0, _readFromConsumerApi2.default)('NeosProjectPackages')().NeosUiBackendConnectorDefault; +var fetchWithErrorHandling = (0, _readFromConsumerApi2.default)('NeosProjectPackages')().NeosUiBackendConnector.fetchWithErrorHandling; +exports.fetchWithErrorHandling = fetchWithErrorHandling; + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _dec, _dec2, _class, _class2, _temp2; + +var _react = __webpack_require__(1); + +var _react2 = _interopRequireDefault(_react); + +var _propTypes = __webpack_require__(7); + +var _propTypes2 = _interopRequireDefault(_propTypes); + +var _plowJs = __webpack_require__(4); + +var _reactUiComponents = __webpack_require__(2); + +var _reactRedux = __webpack_require__(5); + +var _neosUiReduxStore = __webpack_require__(6); + +var _neosUiDecorators = __webpack_require__(3); + +var _HideSelectedNode = __webpack_require__(19); + +var _HideSelectedNode2 = _interopRequireDefault(_HideSelectedNode); + +var _DeleteSelectedNode = __webpack_require__(20); + +var _DeleteSelectedNode2 = _interopRequireDefault(_DeleteSelectedNode); + +var _classnames = __webpack_require__(9); + +var _classnames2 = _interopRequireDefault(_classnames); + +var _style = __webpack_require__(8); + +var _style2 = _interopRequireDefault(_style); + +var _RefreshNodes = __webpack_require__(25); + +var _RefreshNodes2 = _interopRequireDefault(_RefreshNodes); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + var FlatNav = (_dec = (0, _neosUiDecorators.neos)(function (globalRegistry) { return { nodeTypesRegistry: globalRegistry.get('@neos-project/neos-ui-contentrepository'), - serverFeedbackHandlers: globalRegistry.get('serverFeedbackHandlers') + serverFeedbackHandlers: globalRegistry.get('serverFeedbackHandlers'), + i18nRegistry: globalRegistry.get('i18n') }; }), _dec2 = (0, _reactRedux.connect)((0, _plowJs.$transform)({ nodeData: (0, _plowJs.$get)('cr.nodes.byContextPath'), focused: (0, _plowJs.$get)('ui.pageTree.isFocused'), - siteNodeContextPath: (0, _plowJs.$get)('cr.nodes.siteNode') + siteNodeContextPath: (0, _plowJs.$get)('cr.nodes.siteNode'), + baseWorkspaceName: (0, _plowJs.$get)('cr.workspaces.personalWorkspace.baseWorkspace'), + publishableNodes: (0, _plowJs.$get)('cr.workspaces.personalWorkspace.publishableNodes') }), { setSrc: _neosUiReduxStore.actions.UI.ContentCanvas.setSrc, focus: _neosUiReduxStore.actions.UI.PageTree.focus, openNodeCreationDialog: _neosUiReduxStore.actions.UI.NodeCreationDialog.open, commenceNodeCreation: _neosUiReduxStore.actions.CR.Nodes.commenceCreation, - selectNodeType: _neosUiReduxStore.actions.UI.SelectNodeTypeModal.apply -}), _dec(_class2 = _dec2(_class2 = (_temp2 = _class3 = function (_Component2) { - _inherits(FlatNav, _Component2); + selectNodeType: _neosUiReduxStore.actions.UI.SelectNodeTypeModal.apply, + merge: _neosUiReduxStore.actions.CR.Nodes.merge +}), _dec(_class = _dec2(_class = (_temp2 = _class2 = function (_Component) { + _inherits(FlatNav, _Component); function FlatNav() { var _ref; - var _temp, _this3, _ret; + var _temp, _this, _ret; _classCallCheck(this, FlatNav); @@ -647,7 +829,12 @@ var FlatNav = (_dec = (0, _neosUiDecorators.neos)(function (globalRegistry) { args[_key] = arguments[_key]; } - return _ret = (_temp = (_this3 = _possibleConstructorReturn(this, (_ref = FlatNav.__proto__ || Object.getPrototypeOf(FlatNav)).call.apply(_ref, [this].concat(args))), _this3), _this3.handleNodeWasCreated = function (feedbackPayload, _ref2) { + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = FlatNav.__proto__ || Object.getPrototypeOf(FlatNav)).call.apply(_ref, [this].concat(args))), _this), _this.populateTheState = function () { + if (_this.props.nodes.length === 0) { + _this.props.fetchNodes(); + _this.props.fetchNewReference(); + } + }, _this.handleNodeWasCreated = function (feedbackPayload, _ref2) { var store = _ref2.store; var state = store.getState(); @@ -656,32 +843,41 @@ var FlatNav = (_dec = (0, _neosUiDecorators.neos)(function (globalRegistry) { var node = getNodeByContextPathSelector(state); var nodeTypeName = (0, _plowJs.$get)('nodeType', node); - if (nodeTypeName === _this3.props.preset.newNodeType) { - _this3.refreshFlatNav(); + if (nodeTypeName === _this.props.preset.newNodeType) { + _this.refreshFlatNav(); } - }, _this3.createNode = function () { - var context = _this3.props.siteNodeContextPath.split('@')[1]; - var contextPath = (_this3.props.newReferenceNodePath || _this3.props.preset.newReferenceNodePath) + '@' + context; - _this3.props.commenceNodeCreation(contextPath); - _this3.props.selectNodeType('into', _this3.props.preset.newNodeType); - }, _this3.refreshFlatNav = function () { - _this3.props.resetNodes(_this3.props.fetchNodes); - }, _this3.renderNodes = function () { - return _this3.props.nodes.map(function (contextPath) { - var item = (0, _plowJs.$get)([contextPath], _this3.props.nodeData); + }, _this.buildNewReferenceNodePath = function () { + var context = _this.props.siteNodeContextPath.split('@')[1]; + return _this.props.newReferenceNodePath + '@' + context; + }, _this.createNode = function () { + var contextPath = _this.buildNewReferenceNodePath(); + _this.props.commenceNodeCreation(contextPath, undefined, 'into', _this.props.preset.newNodeType || undefined); + }, _this.refreshFlatNav = function () { + _this.props.resetNodes(_this.props.fetchNodes); + }, _this.renderNodes = function () { + return _this.props.nodes.map(function (contextPath) { + var item = (0, _plowJs.$get)([contextPath], _this.props.nodeData); + if (item) { var _mergeClassNames; - var nodeTypeName = (0, _plowJs.$get)('nodeType', item); - var nodeType = _this3.props.nodeTypesRegistry.getNodeType(nodeTypeName); + var isFocused = _this.props.focused === contextPath; + var isDirty = _this.props.publishableNodes.filter(function (i) { + return (0, _plowJs.$get)('contextPath', i) === contextPath || (0, _plowJs.$get)('documentContextPath', i) === contextPath; + }).count() > 0; + var isRemoved = (0, _plowJs.$get)('properties._removed', item); + var nodeIconComponent = _this.getNodeIconComponent(item); + return _react2.default.createElement( 'div', { - className: (0, _classnames2.default)((_mergeClassNames = {}, _defineProperty(_mergeClassNames, _style2.default.node, true), _defineProperty(_mergeClassNames, _style2.default['node--focused'], _this3.props.focused === contextPath), _mergeClassNames)), + className: (0, _classnames2.default)((_mergeClassNames = {}, _defineProperty(_mergeClassNames, _style2.default.node, true), _defineProperty(_mergeClassNames, _style2.default['node--focused'], isFocused), _defineProperty(_mergeClassNames, _style2.default['node--dirty'], isDirty), _defineProperty(_mergeClassNames, _style2.default['node--removed'], isRemoved), _mergeClassNames)), key: contextPath, onClick: function onClick() { - _this3.props.setSrc((0, _plowJs.$get)('uri', item)); - _this3.props.focus(contextPath); + if (!isRemoved) { + _this.props.setSrc((0, _plowJs.$get)('uri', item)); + _this.props.focus(contextPath); + } }, role: 'button' }, @@ -689,7 +885,7 @@ var FlatNav = (_dec = (0, _neosUiDecorators.neos)(function (globalRegistry) { 'div', { className: _style2.default.node__iconWrapper }, - _react2.default.createElement(_reactUiComponents.Icon, { icon: (0, _plowJs.$get)('ui.icon', nodeType) }) + nodeIconComponent ), _react2.default.createElement( 'span', @@ -703,20 +899,51 @@ var FlatNav = (_dec = (0, _neosUiDecorators.neos)(function (globalRegistry) { }).filter(function (i) { return i; }); - }, _temp), _possibleConstructorReturn(_this3, _ret); + }, _temp), _possibleConstructorReturn(_this, _ret); } _createClass(FlatNav, [{ key: 'componentDidMount', value: function componentDidMount() { - if (this.props.nodes.length === 0) { - this.props.fetchNodes(); - if (this.props.preset.newReferenceNodePath.indexOf('/') !== 0) { - this.props.fetchNewReferenceNodePath(); - } - } + this.populateTheState(); this.props.serverFeedbackHandlers.set('Neos.Neos.Ui:NodeCreated/DocumentAdded', this.handleNodeWasCreated, 'after Neos.Neos.Ui:NodeCreated/Main'); } + }, { + key: 'componentDidUpdate', + value: function componentDidUpdate(prevProps) { + this.populateTheState(); + } + }, { + key: 'getNodeIconComponent', + value: function getNodeIconComponent(node) { + var nodeTypeName = (0, _plowJs.$get)('nodeType', node); + var nodeType = this.props.nodeTypesRegistry.getNodeType(nodeTypeName); + var isHidden = (0, _plowJs.$get)('properties._hidden', node); + var isHiddenBefore = (0, _plowJs.$get)('properties._hiddenBeforeDateTime', node); + var isHiddenAfter = (0, _plowJs.$get)('properties._hiddenAfterDateTime', node); + + if (isHidden) { + return _react2.default.createElement( + 'span', + { className: 'fa-layers fa-fw' }, + _react2.default.createElement(_reactUiComponents.Icon, { icon: (0, _plowJs.$get)('ui.icon', nodeType) }), + _react2.default.createElement(_reactUiComponents.Icon, { icon: 'circle', color: 'error', transform: 'shrink-3 down-6 right-4' }), + _react2.default.createElement(_reactUiComponents.Icon, { icon: 'times', transform: 'shrink-7 down-6 right-4' }) + ); + } + + if (isHiddenBefore || isHiddenAfter) { + return _react2.default.createElement( + 'span', + { className: 'fa-layers fa-fw' }, + _react2.default.createElement(_reactUiComponents.Icon, { icon: (0, _plowJs.$get)('ui.icon', nodeType) }), + _react2.default.createElement(_reactUiComponents.Icon, { icon: 'circle', color: 'primaryBlue', transform: 'shrink-5 down-6 right-4' }), + _react2.default.createElement(_reactUiComponents.Icon, { icon: 'clock', transform: 'shrink-9 down-6 right-4' }) + ); + } + + return _react2.default.createElement(_reactUiComponents.Icon, { icon: (0, _plowJs.$get)('ui.icon', nodeType) }); + } }, { key: 'render', value: function render() { @@ -752,7 +979,7 @@ var FlatNav = (_dec = (0, _neosUiDecorators.neos)(function (globalRegistry) { icon: this.props.isLoading ? 'spinner' : 'angle-double-down' }), '\xA0', - this.props.isLoading ? 'Loading...' : 'Load more' + this.props.isLoading ? this.props.i18nRegistry.translate('Psmb.FlatNav:Main:loading') : this.props.i18nRegistry.translate('Psmb.FlatNav:Main:loadMore') ) ) ); @@ -760,7 +987,7 @@ var FlatNav = (_dec = (0, _neosUiDecorators.neos)(function (globalRegistry) { }]); return FlatNav; -}(_react.Component), _class3.propTypes = { +}(_react.Component), _class2.propTypes = { nodes: _propTypes2.default.array.isRequired, preset: _propTypes2.default.object.isRequired, isLoading: _propTypes2.default.bool.isRequired, @@ -768,32 +995,11 @@ var FlatNav = (_dec = (0, _neosUiDecorators.neos)(function (globalRegistry) { page: _propTypes2.default.number.isRequired, newReferenceNodePath: _propTypes2.default.string.isRequired, moreNodesAvailable: _propTypes2.default.bool.isRequired -}, _temp2)) || _class2) || _class2); - -/***/ }), -/* 17 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.fetchWithErrorHandling = undefined; - -var _readFromConsumerApi = __webpack_require__(0); - -var _readFromConsumerApi2 = _interopRequireDefault(_readFromConsumerApi); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = (0, _readFromConsumerApi2.default)('NeosProjectPackages')().NeosUiBackendConnectorDefault; -var fetchWithErrorHandling = (0, _readFromConsumerApi2.default)('NeosProjectPackages')().NeosUiBackendConnector.fetchWithErrorHandling; -exports.fetchWithErrorHandling = fetchWithErrorHandling; +}, _temp2)) || _class) || _class); +exports.default = FlatNav; /***/ }), -/* 18 */ +/* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -812,19 +1018,19 @@ var _react = __webpack_require__(1); var _react2 = _interopRequireDefault(_react); -var _propTypes = __webpack_require__(4); +var _propTypes = __webpack_require__(7); var _propTypes2 = _interopRequireDefault(_propTypes); -var _reactRedux = __webpack_require__(6); +var _reactRedux = __webpack_require__(5); var _neosUiDecorators = __webpack_require__(3); -var _plowJs = __webpack_require__(5); +var _plowJs = __webpack_require__(4); var _reactUiComponents = __webpack_require__(2); -var _neosUiReduxStore = __webpack_require__(7); +var _neosUiReduxStore = __webpack_require__(6); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -906,7 +1112,7 @@ var HideSelectedNode = (_dec = (0, _neosUiDecorators.neos)(function (globalRegis exports.default = HideSelectedNode; /***/ }), -/* 19 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -925,15 +1131,15 @@ var _react = __webpack_require__(1); var _react2 = _interopRequireDefault(_react); -var _reactRedux = __webpack_require__(6); +var _reactRedux = __webpack_require__(5); -var _plowJs = __webpack_require__(5); +var _plowJs = __webpack_require__(4); var _neosUiDecorators = __webpack_require__(3); var _reactUiComponents = __webpack_require__(2); -var _neosUiReduxStore = __webpack_require__(7); +var _neosUiReduxStore = __webpack_require__(6); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -997,29 +1203,32 @@ var DeleteSelectedNode = (_dec = (0, _neosUiDecorators.neos)(function (globalReg exports.default = DeleteSelectedNode; /***/ }), -/* 20 */ +/* 21 */ /***/ (function(module, exports, __webpack_require__) { -exports = module.exports = __webpack_require__(21)(false); +exports = module.exports = __webpack_require__(22)(false); // imports // module -exports.push([module.i, ".style__loadMoreButton___9u14e {\n width: 100% !important;\n opacity: 1 !important;\n}\n\n.style__toolbar___Y2z2P {\n border-bottom: 1px solid #3f3f3f;\n}\n\n.style__treeWrapper___1Ki9q {\n padding: 5px 0;\n}\n\n.style__node___37dXu {\n position: relative;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n width: 100%;\n padding: 3px 6px;\n cursor: pointer;\n}\n\n.style__node--focused___2Ad0k {\n background-color: #323232;\n}\n\n.style__node--focused___2Ad0k .style__node__label___2ktrO {\n color: #00ADEE;\n}\n\n.style__node__iconWrapper___32kOo {\n width: 2em;\n display: inline-block;\n position: absolute;\n text-align: center;\n}\n\n.style__node__label___2ktrO {\n margin-left: 2em;\n}\n", ""]); +exports.push([module.i, ".style__loadMoreButton___9u14e {\n width: 100% !important;\n opacity: 1 !important;\n}\n\n.style__tabs__content___pnV9i {\n height: calc(100% - 41px);\n}\n\n.style__toolbar___Y2z2P {\n border-bottom: 1px solid #3f3f3f;\n}\n\n.style__treeWrapper___1Ki9q {\n padding: 5px 0;\n}\n\n.style__node___37dXu {\n position: relative;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n width: 100%;\n padding: 3px 6px;\n cursor: pointer;\n}\n\n.style__node--focused___2Ad0k {\n background-color: #323232;\n}\n\n.style__node--focused___2Ad0k .style__node__label___2ktrO {\n color: #00ADEE;\n}\n\n.style__node--dirty___K2yEx {\n border-left: 2px solid #ff8700;\n padding-left: 4px;\n}\n\n.style__node--removed___3ycgN {\n cursor: not-allowed;\n border-color: #ff460d;\n}\n\n.style__node--removed___3ycgN .style__node__label___2ktrO,\n.style__node--removed___3ycgN .style__node__iconWrapper___32kOo {\n opacity: 0.5;\n}\n\n.style__node__iconWrapper___32kOo {\n width: 2em;\n display: inline-block;\n position: absolute;\n text-align: center;\n}\n\n.style__node__label___2ktrO {\n margin-left: 2em;\n}", ""]); // exports exports.locals = { "loadMoreButton": "style__loadMoreButton___9u14e", + "tabs__content": "style__tabs__content___pnV9i", "toolbar": "style__toolbar___Y2z2P", "treeWrapper": "style__treeWrapper___1Ki9q", "node": "style__node___37dXu", "node--focused": "style__node--focused___2Ad0k", "node__label": "style__node__label___2ktrO", + "node--dirty": "style__node--dirty___K2yEx", + "node--removed": "style__node--removed___3ycgN", "node__iconWrapper": "style__node__iconWrapper___32kOo" }; /***/ }), -/* 21 */ +/* 22 */ /***/ (function(module, exports) { /* @@ -1101,7 +1310,7 @@ function toComment(sourceMap) { /***/ }), -/* 22 */ +/* 23 */ /***/ (function(module, exports, __webpack_require__) { /* @@ -1167,7 +1376,7 @@ var singleton = null; var singletonCounter = 0; var stylesInsertedAtTop = []; -var fixUrls = __webpack_require__(23); +var fixUrls = __webpack_require__(24); module.exports = function(list, options) { if (typeof DEBUG !== "undefined" && DEBUG) { @@ -1487,7 +1696,7 @@ function updateLink (link, options, obj) { /***/ }), -/* 23 */ +/* 24 */ /***/ (function(module, exports) { @@ -1582,7 +1791,7 @@ module.exports = function (css) { /***/ }), -/* 24 */ +/* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1601,11 +1810,11 @@ var _react = __webpack_require__(1); var _react2 = _interopRequireDefault(_react); -var _propTypes = __webpack_require__(4); +var _propTypes = __webpack_require__(7); var _propTypes2 = _interopRequireDefault(_propTypes); -var _classnames = __webpack_require__(8); +var _classnames = __webpack_require__(9); var _classnames2 = _interopRequireDefault(_classnames); @@ -1613,7 +1822,7 @@ var _neosUiDecorators = __webpack_require__(3); var _reactUiComponents = __webpack_require__(2); -var _style = __webpack_require__(9); +var _style = __webpack_require__(8); var _style2 = _interopRequireDefault(_style); diff --git a/Resources/Public/JavaScript/FlatNav/Plugin.js.map b/Resources/Public/JavaScript/FlatNav/Plugin.js.map index 3f08b43..77a506f 100644 --- a/Resources/Public/JavaScript/FlatNav/Plugin.js.map +++ b/Resources/Public/JavaScript/FlatNav/Plugin.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 4f66a09e16e67fa66f7b","webpack:///./node_modules/@neos-project/neos-ui-extensibility/src/readFromConsumerApi.js","webpack:///./node_modules/@neos-project/neos-ui-extensibility/src/shims/vendor/react/index.js","webpack:///./node_modules/@neos-project/neos-ui-extensibility/src/shims/neosProjectPackages/react-ui-components/index.js","webpack:///./node_modules/@neos-project/neos-ui-extensibility/src/shims/neosProjectPackages/neos-ui-decorators/index.js","webpack:///./node_modules/@neos-project/neos-ui-extensibility/src/shims/vendor/prop-types/index.js","webpack:///./node_modules/@neos-project/neos-ui-extensibility/src/shims/vendor/plow-js/index.js","webpack:///./node_modules/@neos-project/neos-ui-extensibility/src/shims/vendor/react-redux/index.js","webpack:///./node_modules/@neos-project/neos-ui-extensibility/src/shims/neosProjectPackages/neos-ui-redux-store/index.js","webpack:///./node_modules/@neos-project/neos-ui-extensibility/src/shims/vendor/classnames/index.js","webpack:///./src/style.css?67b2","webpack:///./src/index.js","webpack:///./src/manifest.js","webpack:///./node_modules/@neos-project/neos-ui-extensibility/src/index.js","webpack:///./node_modules/@neos-project/neos-ui-extensibility/src/createConsumerApi.js","webpack:///./node_modules/@neos-project/neos-ui-extensibility/package.json","webpack:///./node_modules/@neos-project/neos-ui-extensibility/src/manifest.js","webpack:///./src/FlatNav.js","webpack:///./node_modules/@neos-project/neos-ui-extensibility/src/shims/neosProjectPackages/neos-ui-backend-connector/index.js","webpack:///./src/HideSelectedNode.js","webpack:///./src/DeleteSelectedNode.js","webpack:///./src/style.css","webpack:///./node_modules/css-loader/lib/css-base.js","webpack:///./node_modules/style-loader/lib/addStyles.js","webpack:///./node_modules/style-loader/lib/urls.js","webpack:///./src/RefreshNodes.js"],"names":["readFromConsumerApi","key","window","Error","module","exports","React","ReactUiComponents","NeosUiDecorators","PropTypes","plow","reactRedux","NeosUiReduxStore","classnames","require","containerRegistry","globalRegistry","get","PageTreeToolbar","PageTreeSearchbar","PageTree","OriginalTree","set","createConsumerApi","createReadOnlyValue","value","writable","enumerable","configurable","manifests","exposureMap","api","Object","keys","forEach","defineProperty","version","identifier","options","bootstrap","push","makeFlatNavContainer","FlatNavContainer","props","state","makeResetNodes","setState","preset","page","nodes","moreNodesAvailable","callback","makeFetchNodes","isLoading","fetchWithErrorHandling","withCsrfToken","url","siteNodeContextPath","method","credentials","headers","csrfToken","then","response","json","length","nodesMap","reduce","result","node","contextPath","merge","makeGetNewReferenceNodePath","isLoadingReferenceNodePath","newReferenceNodePath","presets","map","presetName","icon","label","type","Component","actions","CR","Nodes","FlatNav","nodeTypesRegistry","serverFeedbackHandlers","nodeData","focused","setSrc","UI","ContentCanvas","focus","openNodeCreationDialog","NodeCreationDialog","open","commenceNodeCreation","commenceCreation","selectNodeType","SelectNodeTypeModal","apply","handleNodeWasCreated","feedbackPayload","store","getState","getNodeByContextPathSelector","selectors","makeGetNodeByContextPathSelector","nodeTypeName","newNodeType","refreshFlatNav","createNode","context","split","resetNodes","fetchNodes","renderNodes","item","nodeType","getNodeType","style","node__iconWrapper","node__label","filter","i","indexOf","fetchNewReferenceNodePath","overflow","toolbar","treeWrapper","overflowY","disablePagination","loadMoreButton","textAlign","propTypes","array","isRequired","object","bool","number","string","NeosUiBackendConnectorDefault","NeosUiBackendConnector","HideSelectedNode","i18nRegistry","focusedSelector","hideNode","hide","showNode","show","handleHideNode","handleShowNode","className","isHidden","translate","PureComponent","func","DeleteSelectedNode","commenceNodeRemoval","commenceRemoval","handleDeleteSelectedNodeClick","RefreshNodes","handleClick","onClick","finalClassName","spinning"],"mappings":"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9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA,cAAc,mBAAO,CAAC,EAAQ;;AAE9B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,iBAAiB,mBAAmB;AACpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iBAAiB,sBAAsB;AACvC;;AAEA;AACA,mBAAmB,2BAA2B;;AAE9C;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,mBAAmB;AACnC;AACA;;AAEA;AACA;;AAEA,iBAAiB,2BAA2B;AAC5C;AACA;;AAEA,QAAQ,uBAAuB;AAC/B;AACA;AACA,GAAG;AACH;;AAEA,iBAAiB,uBAAuB;AACxC;AACA;;AAEA,2BAA2B;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA,cAAc;;AAEd,kDAAkD,sBAAsB;AACxE;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA,EAAE;AACF;AACA,EAAE;AACF;AACA;AACA,EAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uDAAuD;AACvD;;AAEA,6BAA6B,mBAAmB;;AAEhD;;AAEA;;AAEA;AACA;;;;;;;;AC1XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,WAAW,EAAE;AACrD,wCAAwC,WAAW,EAAE;;AAErD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,sCAAsC;AACtC,GAAG;AACH;AACA,8DAA8D;AAC9D;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;;;;;;;;;;;;;;;;;;;ACxFA;;;;AACA;;;;AACA;;;;AACA;;AACA;;AACA;;;;;;;;;;;;;;IAMqBI,Y,WAJpB,4BAAK;AAAA,WAAmB;AACrBjB,sBAAcjI,eAAeC,GAAf,CAAmB,MAAnB;AADO,KAAnB;AAAA,CAAL,C;;;;;;;;;;;;;;sMAaGkJ,W,GAAc,YAAM;AAAA,gBACTC,OADS,GACE,MAAKzH,KADP,CACTyH,OADS;;;AAGhBA;AACH,S;;;;;iCAEQ;AAAA;;AAAA,yBACwC,KAAKzH,KAD7C;AAAA,gBACEU,SADF,UACEA,SADF;AAAA,gBACaoG,SADb,UACaA,SADb;AAAA,gBACwBR,YADxB,UACwBA,YADxB;;AAEL,gBAAMoB,iBAAiB,oFAClB5C,gBAAM6C,QADY,EACDjH,SADC,qCAElBoG,SAFkB,EAENA,aAAaA,UAAUxF,MAFjB,qBAAvB;;AAKA,mBACI,8BAAC,6BAAD;AACI,2BAAWoG,cADf;AAEI,4BAAYhH,SAFhB;AAGI,yBAAS,KAAK8G,WAHlB;AAII,sBAAK,MAJT;AAKI,4BAAW,OALf;AAMI,uBAAOlB,aAAaU,SAAb,CAAuB,SAAvB;AANX,cADJ;AAUH;;;;EAhCqCC,oB,WAC/BrB,S,GAAY;AACflE,UAAM5D,oBAAUiI,MADD;AAEfe,eAAWhJ,oBAAUoI,MAFN;AAGfuB,aAAS3J,oBAAUoJ,IAAV,CAAepB,UAHT;AAIfpF,eAAW5C,oBAAUkI,IAAV,CAAeF,UAJX;AAKfQ,kBAAcxI,oBAAUiI,MAAV,CAAiBD;AALhB,C;kBADFyB,Y","file":"Plugin.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 10);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4f66a09e16e67fa66f7b","export default function readFromConsumerApi(key) {\n return (...args) => {\n if (window['@Neos:HostPluginAPI'] && window['@Neos:HostPluginAPI'][`@${key}`]) {\n return window['@Neos:HostPluginAPI'][`@${key}`](...args);\n }\n\n throw new Error(`You are trying to read from a consumer api that hasn't been initialized yet!`);\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@neos-project/neos-ui-extensibility/src/readFromConsumerApi.js","import readFromConsumerApi from '../../../readFromConsumerApi';\n\nmodule.exports = readFromConsumerApi('vendor')().React;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@neos-project/neos-ui-extensibility/src/shims/vendor/react/index.js","import readFromConsumerApi from '../../../readFromConsumerApi';\n\nmodule.exports = readFromConsumerApi('NeosProjectPackages')().ReactUiComponents;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@neos-project/neos-ui-extensibility/src/shims/neosProjectPackages/react-ui-components/index.js","import readFromConsumerApi from '../../../readFromConsumerApi';\n\nmodule.exports = readFromConsumerApi('NeosProjectPackages')().NeosUiDecorators;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@neos-project/neos-ui-extensibility/src/shims/neosProjectPackages/neos-ui-decorators/index.js","import readFromConsumerApi from '../../../readFromConsumerApi';\n\nmodule.exports = readFromConsumerApi('vendor')().PropTypes;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@neos-project/neos-ui-extensibility/src/shims/vendor/prop-types/index.js","import readFromConsumerApi from '../../../readFromConsumerApi';\n\nmodule.exports = readFromConsumerApi('vendor')().plow;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@neos-project/neos-ui-extensibility/src/shims/vendor/plow-js/index.js","import readFromConsumerApi from '../../../readFromConsumerApi';\n\nmodule.exports = readFromConsumerApi('vendor')().reactRedux;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@neos-project/neos-ui-extensibility/src/shims/vendor/react-redux/index.js","import readFromConsumerApi from '../../../readFromConsumerApi';\n\nmodule.exports = readFromConsumerApi('NeosProjectPackages')().NeosUiReduxStore;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@neos-project/neos-ui-extensibility/src/shims/neosProjectPackages/neos-ui-redux-store/index.js","import readFromConsumerApi from '../../../readFromConsumerApi';\n\nmodule.exports = readFromConsumerApi('vendor')().classnames;\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@neos-project/neos-ui-extensibility/src/shims/vendor/classnames/index.js","\nvar content = require(\"!!../node_modules/css-loader/index.js??ref--6-2!../node_modules/postcss-loader/lib/index.js??ref--6-3!./style.css\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../node_modules/css-loader/index.js??ref--6-2!../node_modules/postcss-loader/lib/index.js??ref--6-3!./style.css\", function() {\n\t\tvar newContent = require(\"!!../node_modules/css-loader/index.js??ref--6-2!../node_modules/postcss-loader/lib/index.js??ref--6-3!./style.css\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/style.css\n// module id = 9\n// module chunks = 0","require('./manifest');\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","import React from 'react';\nimport manifest from '@neos-project/neos-ui-extensibility';\nimport makeFlatNavContainer from './FlatNav';\n\nmanifest('Psmb.FlatNav:FlatNav', {}, globalRegistry => {\n const containerRegistry = globalRegistry.get('containers');\n const PageTreeToolbar = containerRegistry.get('LeftSideBar/Top/PageTreeToolbar');\n const PageTreeSearchbar = containerRegistry.get('LeftSideBar/Top/PageTreeSearchbar');\n const PageTree = containerRegistry.get('LeftSideBar/Top/PageTree');\n\n const OriginalTree = () => (\n
\n \n \n \n
\n );\n containerRegistry.set('LeftSideBar/Top/PageTreeToolbar', () => null);\n containerRegistry.set('LeftSideBar/Top/PageTreeSearchbar', () => null);\n\n containerRegistry.set('LeftSideBar/Top/PageTree', makeFlatNavContainer(OriginalTree));\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/manifest.js","import createConsumerApi from './createConsumerApi';\nimport readFromConsumerApi from './readFromConsumerApi';\n\nexport default readFromConsumerApi('manifest');\n\nexport {\n createConsumerApi\n};\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@neos-project/neos-ui-extensibility/src/index.js","import {version} from '../package.json';\nimport createManifestFunction from './manifest';\n\nconst createReadOnlyValue = value => ({\n value,\n writable: false,\n enumerable: false,\n configurable: true\n});\n\nexport default function createConsumerApi(manifests, exposureMap) {\n const api = {};\n\n Object.keys(exposureMap).forEach(key => {\n Object.defineProperty(api, key, createReadOnlyValue(exposureMap[key]));\n });\n\n Object.defineProperty(api, '@manifest', createReadOnlyValue(\n createManifestFunction(manifests)\n ));\n\n Object.defineProperty(window, '@Neos:HostPluginAPI', createReadOnlyValue(api));\n Object.defineProperty(window['@Neos:HostPluginAPI'], 'VERSION', createReadOnlyValue(version));\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@neos-project/neos-ui-extensibility/src/createConsumerApi.js","module.exports = {\"name\":\"@neos-project/neos-ui-extensibility\",\"version\":\"1.3.3\",\"description\":\"Extensibility mechanisms for the Neos CMS UI\",\"main\":\"./src/index.js\",\"scripts\":{\"prebuild\":\"check-dependencies && yarn clean\",\"test\":\"yarn jest -- -w 2 --coverage\",\"test:watch\":\"yarn jest -- --watch\",\"build\":\"exit 0\",\"build:watch\":\"exit 0\",\"clean\":\"rimraf ./lib ./dist\",\"lint\":\"eslint src\",\"jest\":\"NODE_ENV=test jest\"},\"devDependencies\":{\"@neos-project/babel-preset-neos-ui\":\"1.3.3\",\"@neos-project/jest-preset-neos-ui\":\"1.3.3\"},\"dependencies\":{\"@neos-project/build-essentials\":\"1.3.3\",\"@neos-project/positional-array-sorter\":\"1.3.3\",\"babel-core\":\"^6.13.2\",\"babel-eslint\":\"^7.1.1\",\"babel-loader\":\"^7.1.2\",\"babel-plugin-transform-decorators-legacy\":\"^1.3.4\",\"babel-plugin-transform-object-rest-spread\":\"^6.20.1\",\"babel-plugin-webpack-alias\":\"^2.1.1\",\"babel-preset-es2015\":\"^6.13.2\",\"babel-preset-react\":\"^6.3.13\",\"babel-preset-stage-0\":\"^6.3.13\",\"chalk\":\"^1.1.3\",\"css-loader\":\"^0.28.4\",\"file-loader\":\"^1.1.5\",\"json-loader\":\"^0.5.4\",\"postcss-loader\":\"^2.0.10\",\"react-dev-utils\":\"^0.5.0\",\"style-loader\":\"^0.21.0\"},\"bin\":{\"neos-react-scripts\":\"./bin/neos-react-scripts.js\"},\"jest\":{\"preset\":\"@neos-project/jest-preset-neos-ui\"}}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/@neos-project/neos-ui-extensibility/package.json\n// module id = 14\n// module chunks = 0","export default manifests => {\n return function (identifier, options, bootstrap) {\n manifests.push({\n [identifier]: {\n options,\n bootstrap\n }\n });\n };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@neos-project/neos-ui-extensibility/src/manifest.js","import React, {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport {$get, $transform} from 'plow-js';\nimport {Button, Icon, IconButton, Tabs} from '@neos-project/react-ui-components';\nimport {connect} from 'react-redux';\nimport {actions, selectors} from '@neos-project/neos-ui-redux-store';\nimport {neos} from '@neos-project/neos-ui-decorators';\nimport {fetchWithErrorHandling} from '@neos-project/neos-ui-backend-connector';\nimport HideSelectedNode from './HideSelectedNode';\nimport DeleteSelectedNode from './DeleteSelectedNode';\nimport mergeClassNames from 'classnames';\nimport style from './style.css';\nimport RefreshNodes from \"./RefreshNodes\";\n\nconst makeFlatNavContainer = OriginalPageTree => {\n class FlatNavContainer extends Component {\n state = {};\n\n constructor(props) {\n super(props);\n Object.keys(this.props.options.presets).forEach(preset => {\n this.state[preset] = {\n page: 1,\n isLoading: false,\n isLoadingReferenceNodePath: false,\n nodes: [],\n moreNodesAvailable: true,\n newReferenceNodePath: ''\n };\n });\n }\n\n makeResetNodes = preset => callback => {\n this.setState({\n [preset]: {\n ...this.state[preset],\n page: 1,\n nodes: [],\n moreNodesAvailable: true\n }\n }, callback);\n }\n\n makeFetchNodes = preset => () => {\n this.setState({\n [preset]: {\n ...this.state[preset],\n isLoading: true,\n moreNodesAvailable: true\n }\n });\n fetchWithErrorHandling.withCsrfToken(csrfToken => ({\n url: `/flatnav/query?nodeContextPath=${this.props.siteNodeContextPath}&preset=${preset}&page=${this.state[preset].page}`,\n method: 'GET',\n credentials: 'include',\n headers: {\n 'X-Flow-Csrftoken': csrfToken,\n 'Content-Type': 'application/json'\n }\n }))\n .then(response => response && response.json())\n .then(nodes => {\n if (nodes.length > 0) {\n const nodesMap = nodes.reduce((result, node) => {\n result[node.contextPath] = node;\n return result;\n }, {});\n this.props.merge(nodesMap);\n this.setState({\n [preset]: {\n ...this.state[preset],\n page: this.state[preset].page + 1,\n isLoading: false,\n nodes: [...this.state[preset].nodes, ...Object.keys(nodesMap)],\n moreNodesAvailable: true\n }\n });\n } else {\n this.setState({\n [preset]: {\n ...this.state[preset],\n isLoading: false,\n moreNodesAvailable: false\n }\n });\n }\n });\n };\n\n makeGetNewReferenceNodePath = preset => () => {\n this.setState({\n [preset]: {\n ...this.state[preset],\n isLoadingReferenceNodePath: true\n }\n });\n fetchWithErrorHandling.withCsrfToken(csrfToken => ({\n url: `/flatnav/getNewReferenceNodePath?nodeContextPath=${this.props.siteNodeContextPath}&preset=${preset}`,\n method: 'GET',\n credentials: 'include',\n headers: {\n 'X-Flow-Csrftoken': csrfToken,\n 'Content-Type': 'application/json'\n }\n }))\n .then(response => response && response.json())\n .then(newReferenceNodePath => {\n this.setState({\n [preset]: {\n ...this.state[preset],\n isLoading: false,\n isLoadingReferenceNodePath: false,\n newReferenceNodePath: newReferenceNodePath\n }\n });\n });\n };\n\n render() {\n return (\n \n {Object.keys(this.props.options.presets).map(presetName => {\n const preset = this.props.options.presets[presetName];\n return (\n \n {preset.type === 'flat' && ()}\n {preset.type === 'tree' && ()}\n \n );\n })}\n \n );\n }\n }\n return neos(globalRegistry => ({\n options: globalRegistry.get('frontendConfiguration').get('Psmb_FlatNav')\n }))(connect($transform({\n siteNodeContextPath: $get('cr.nodes.siteNode')\n }), {\n merge: actions.CR.Nodes.merge\n })(FlatNavContainer));\n};\n\nexport default makeFlatNavContainer;\n\n@neos(globalRegistry => ({\n nodeTypesRegistry: globalRegistry.get('@neos-project/neos-ui-contentrepository'),\n serverFeedbackHandlers: globalRegistry.get('serverFeedbackHandlers')\n}))\n@connect($transform({\n nodeData: $get('cr.nodes.byContextPath'),\n focused: $get('ui.pageTree.isFocused'),\n siteNodeContextPath: $get('cr.nodes.siteNode')\n}), {\n setSrc: actions.UI.ContentCanvas.setSrc,\n focus: actions.UI.PageTree.focus,\n openNodeCreationDialog: actions.UI.NodeCreationDialog.open,\n commenceNodeCreation: actions.CR.Nodes.commenceCreation,\n selectNodeType: actions.UI.SelectNodeTypeModal.apply\n})\nclass FlatNav extends Component {\n static propTypes = {\n nodes: PropTypes.array.isRequired,\n preset: PropTypes.object.isRequired,\n isLoading: PropTypes.bool.isRequired,\n isLoadingReferenceNodePath: PropTypes.bool.isRequired,\n page: PropTypes.number.isRequired,\n newReferenceNodePath: PropTypes.string.isRequired,\n moreNodesAvailable: PropTypes.bool.isRequired\n };\n\n componentDidMount() {\n if (this.props.nodes.length === 0) {\n this.props.fetchNodes();\n if (this.props.preset.newReferenceNodePath.indexOf('/') !== 0) {\n this.props.fetchNewReferenceNodePath();\n }\n }\n this.props.serverFeedbackHandlers.set('Neos.Neos.Ui:NodeCreated/DocumentAdded', this.handleNodeWasCreated, 'after Neos.Neos.Ui:NodeCreated/Main');\n }\n\n handleNodeWasCreated = (feedbackPayload, {store}) => {\n const state = store.getState();\n\n const getNodeByContextPathSelector = selectors.CR.Nodes.makeGetNodeByContextPathSelector(feedbackPayload.contextPath);\n const node = getNodeByContextPathSelector(state);\n const nodeTypeName = $get('nodeType', node);\n\n if (nodeTypeName === this.props.preset.newNodeType) {\n this.refreshFlatNav();\n }\n }\n\n createNode = () => {\n const context = this.props.siteNodeContextPath.split('@')[1];\n const contextPath = (this.props.newReferenceNodePath || this.props.preset.newReferenceNodePath) + '@' + context;\n this.props.commenceNodeCreation(contextPath);\n this.props.selectNodeType('into', this.props.preset.newNodeType);\n }\n\n refreshFlatNav = () => {\n this.props.resetNodes(this.props.fetchNodes);\n }\n\n renderNodes = () => {\n return this.props.nodes\n .map(contextPath => {\n const item = $get([contextPath], this.props.nodeData);\n if (item) {\n const nodeTypeName = $get('nodeType', item);\n const nodeType = this.props.nodeTypesRegistry.getNodeType(nodeTypeName);\n return (\n {\n this.props.setSrc($get('uri', item));\n this.props.focus(contextPath);\n }}\n role=\"button\"\n >\n \n \n \n \n {$get('label', item)}\n \n \n );\n }\n return null;\n }).filter(i => i);\n };\n\n render() {\n return (\n
\n
\n {!this.props.isLoadingReferenceNodePath && ()}\n \n \n \n
\n\n
\n {this.renderNodes()}\n
\n {!this.props.preset.disablePagination && this.props.moreNodesAvailable && (\n
\n \n  {this.props.isLoading ? 'Loading...' : 'Load more'}\n
\n )}\n
\n );\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/FlatNav.js","import readFromConsumerApi from '../../../readFromConsumerApi';\n\nexport default readFromConsumerApi('NeosProjectPackages')().NeosUiBackendConnectorDefault;\n\nconst {fetchWithErrorHandling} = readFromConsumerApi('NeosProjectPackages')().NeosUiBackendConnector;\nexport {fetchWithErrorHandling};\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/@neos-project/neos-ui-extensibility/src/shims/neosProjectPackages/neos-ui-backend-connector/index.js","import React, {PureComponent} from 'react';\nimport PropTypes from 'prop-types';\nimport {connect} from 'react-redux';\nimport {neos} from '@neos-project/neos-ui-decorators';\nimport {$transform, $get} from 'plow-js';\nimport {IconButton} from '@neos-project/react-ui-components';\n\nimport {selectors, actions} from '@neos-project/neos-ui-redux-store';\n\n@neos(globalRegistry => ({\n i18nRegistry: globalRegistry.get('i18n')\n}))\n@connect($transform({\n node: selectors.CR.Nodes.focusedSelector\n}), {\n hideNode: actions.CR.Nodes.hide,\n showNode: actions.CR.Nodes.show\n})\nexport default class HideSelectedNode extends PureComponent {\n static propTypes = {\n node: PropTypes.object,\n className: PropTypes.string,\n hideNode: PropTypes.func.isRequired,\n showNode: PropTypes.func.isRequired,\n i18nRegistry: PropTypes.object.isRequired\n };\n\n handleHideNode = () => {\n const {node, hideNode} = this.props;\n\n hideNode($get('contextPath', node));\n }\n\n handleShowNode = () => {\n const {node, showNode} = this.props;\n\n showNode($get('contextPath', node));\n }\n\n render() {\n const {className, node, i18nRegistry} = this.props;\n const isHidden = $get('properties._hidden', node);\n\n return (\n \n );\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/HideSelectedNode.js","import React, {PureComponent} from 'react';\nimport {connect} from 'react-redux';\nimport {$transform, $get} from 'plow-js';\nimport {neos} from '@neos-project/neos-ui-decorators';\nimport {IconButton} from '@neos-project/react-ui-components';\nimport {selectors, actions} from '@neos-project/neos-ui-redux-store';\n\n@neos(globalRegistry => ({\n i18nRegistry: globalRegistry.get('i18n')\n}))\n@connect($transform({\n node: selectors.CR.Nodes.focusedSelector\n}), {\n commenceNodeRemoval: actions.CR.Nodes.commenceRemoval\n})\nexport default class DeleteSelectedNode extends PureComponent {\n handleDeleteSelectedNodeClick = () => {\n const {node, commenceNodeRemoval} = this.props;\n commenceNodeRemoval($get('contextPath', node));\n }\n\n render() {\n const {className, i18nRegistry} = this.props;\n\n return (\n \n );\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/DeleteSelectedNode.js","exports = module.exports = require(\"../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".style__loadMoreButton___9u14e {\\n width: 100% !important;\\n opacity: 1 !important;\\n}\\n\\n.style__toolbar___Y2z2P {\\n border-bottom: 1px solid #3f3f3f;\\n}\\n\\n.style__treeWrapper___1Ki9q {\\n padding: 5px 0;\\n}\\n\\n.style__node___37dXu {\\n position: relative;\\n overflow: hidden;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n width: 100%;\\n padding: 3px 6px;\\n cursor: pointer;\\n}\\n\\n.style__node--focused___2Ad0k {\\n background-color: #323232;\\n}\\n\\n.style__node--focused___2Ad0k .style__node__label___2ktrO {\\n color: #00ADEE;\\n}\\n\\n.style__node__iconWrapper___32kOo {\\n width: 2em;\\n display: inline-block;\\n position: absolute;\\n text-align: center;\\n}\\n\\n.style__node__label___2ktrO {\\n margin-left: 2em;\\n}\\n\", \"\"]);\n\n// exports\nexports.locals = {\n\t\"loadMoreButton\": \"style__loadMoreButton___9u14e\",\n\t\"toolbar\": \"style__toolbar___Y2z2P\",\n\t\"treeWrapper\": \"style__treeWrapper___1Ki9q\",\n\t\"node\": \"style__node___37dXu\",\n\t\"node--focused\": \"style__node--focused___2Ad0k\",\n\t\"node__label\": \"style__node__label___2ktrO\",\n\t\"node__iconWrapper\": \"style__node__iconWrapper___32kOo\"\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/css-loader??ref--6-2!./node_modules/postcss-loader/lib??ref--6-3!./src/style.css\n// module id = 20\n// module chunks = 0","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t// when a module is imported multiple times with different media queries.\n\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/css-loader/lib/css-base.js\n// module id = 21\n// module chunks = 0","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n\nvar stylesInDom = {};\n\nvar\tmemoize = function (fn) {\n\tvar memo;\n\n\treturn function () {\n\t\tif (typeof memo === \"undefined\") memo = fn.apply(this, arguments);\n\t\treturn memo;\n\t};\n};\n\nvar isOldIE = memoize(function () {\n\t// Test for IE <= 9 as proposed by Browserhacks\n\t// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n\t// Tests for existence of standard globals is to allow style-loader\n\t// to operate correctly into non-standard environments\n\t// @see https://github.com/webpack-contrib/style-loader/issues/177\n\treturn window && document && document.all && !window.atob;\n});\n\nvar getTarget = function (target) {\n return document.querySelector(target);\n};\n\nvar getElement = (function (fn) {\n\tvar memo = {};\n\n\treturn function(target) {\n // If passing function in options, then use it for resolve \"head\" element.\n // Useful for Shadow Root style i.e\n // {\n // insertInto: function () { return document.querySelector(\"#foo\").shadowRoot }\n // }\n if (typeof target === 'function') {\n return target();\n }\n if (typeof memo[target] === \"undefined\") {\n\t\t\tvar styleTarget = getTarget.call(this, target);\n\t\t\t// Special case to return head of iframe instead of iframe itself\n\t\t\tif (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n\t\t\t\ttry {\n\t\t\t\t\t// This will throw an exception if access to iframe is blocked\n\t\t\t\t\t// due to cross-origin restrictions\n\t\t\t\t\tstyleTarget = styleTarget.contentDocument.head;\n\t\t\t\t} catch(e) {\n\t\t\t\t\tstyleTarget = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmemo[target] = styleTarget;\n\t\t}\n\t\treturn memo[target]\n\t};\n})();\n\nvar singleton = null;\nvar\tsingletonCounter = 0;\nvar\tstylesInsertedAtTop = [];\n\nvar\tfixUrls = require(\"./urls\");\n\nmodule.exports = function(list, options) {\n\tif (typeof DEBUG !== \"undefined\" && DEBUG) {\n\t\tif (typeof document !== \"object\") throw new Error(\"The style-loader cannot be used in a non-browser environment\");\n\t}\n\n\toptions = options || {};\n\n\toptions.attrs = typeof options.attrs === \"object\" ? options.attrs : {};\n\n\t// Force single-tag solution on IE6-9, which has a hard limit on the # of