Rift.IO OSM R1 Initial Submission
[osm/UI.git] / skyquake / plugins / composer / src / src / components / EditorForwardingGraph / mapRecordServicePath.js
diff --git a/skyquake/plugins/composer/src/src/components/EditorForwardingGraph/mapRecordServicePath.js b/skyquake/plugins/composer/src/src/components/EditorForwardingGraph/mapRecordServicePath.js
new file mode 100644 (file)
index 0000000..d5a6b00
--- /dev/null
@@ -0,0 +1,154 @@
+/**
+ * Created by onvelocity on 3/2/16.
+ */
+
+'use strict';
+
+import d3 from 'd3'
+import React from 'react'
+import Button from '../Button'
+import LayoutRow from '../LayoutRow'
+import ContentEditableDiv from '../ContentEditableDiv'
+import EditableProperty from './EditableProperty'
+import changeCase from 'change-case'
+import ClassNames from 'classnames'
+import DescriptorModelFactory from '../../libraries/model/DescriptorModelFactory'
+import DescriptorModelMetaFactory from '../../libraries/model/DescriptorModelMetaFactory'
+import HighlightRecordServicePaths from '../../libraries/graph/HighlightRecordServicePaths'
+import ComposerAppActions from '../../actions/ComposerAppActions'
+import CatalogItemsActions from '../../actions/CatalogItemsActions'
+import SelectionManager from '../../libraries/SelectionManager'
+import DeletionManager from '../../libraries/DeletionManager'
+import TooltipManager from '../../libraries/TooltipManager'
+import mapConnectionPoint from './mapConnectionPoint'
+import ConnectionPointSelector from './ConnectionPointSelector'
+import onCutDelegateToRemove from './onCutDelegateToRemove'
+import onClickSelectAndShowInDetailsPanel from './onClickSelectAndShowInDetailsPanel'
+import onFormInputChangedModifyContainerAndNotify from './onFormInputChangedModifyContainerAndNotify'
+import onHoverHighlightConnectionPoint from './onHoverHighlightConnectionPoint'
+
+import imgNSD from '../../images/default-catalog-icon.svg'
+import imgFG from '../../../../node_modules/open-iconic/svg/infinity.svg'
+import imgRemove from '../../../../node_modules/open-iconic/svg/trash.svg'
+import imgAdd from '../../../../node_modules/open-iconic/svg/plus.svg'
+import imgConnection from '../../../../node_modules/open-iconic/svg/random.svg'
+import imgClassifier from '../../../../node_modules/open-iconic/svg/spreadsheet.svg'
+import imgReorder from '../../../../node_modules/open-iconic/svg/menu.svg'
+
+export default function mapRecordServicePath (context, rsp, i) {
+
+       rsp.uiState.showPath = rsp.uiState.hasOwnProperty('showPath') ? rsp.uiState.showPath : true;
+
+       function removeHighlighting() {
+               HighlightRecordServicePaths.removeHighlighting();
+       }
+
+       function highlightPath(rsp) {
+               HighlightRecordServicePaths.highlightPaths(rsp);
+       }
+
+       function onClickRemoveRecordServicePath(rsp, event) {
+               event.preventDefault();
+               const root = rsp.getRoot();
+               rsp.remove();
+               CatalogItemsActions.catalogItemDescriptorChanged(root);
+       }
+
+       function onClickEnterPathEdithMode(component, rspUid, event) {
+               event.preventDefault();
+               component.setState({editPathsMode: rspUid});
+       }
+
+       function onClickToggleRSPShowPath(rsp, event) {
+               // warn preventing default will undo the user's action
+               //event.preventDefault();
+               event.stopPropagation();
+               rsp.uiState.showPath = event.target.checked;
+               rsp.parent.uiState.showPaths = rsp.parent.rsp.filter(rsp => rsp.uiState.showPath === true).length === rsp.parent.rsp.length;
+               CatalogItemsActions.catalogItemMetaDataChanged(rsp.getRoot().model);
+       }
+
+       function onClickExitPathEdithMode(component, event) {
+               event.preventDefault();
+               component.setState({editPathsMode: false});
+       }
+
+       function onClickAddConnectionPointRef(component, rsp, connector, event) {
+               event.preventDefault();
+               if (rsp.isFactory) {
+                       const newRsp = rsp.createVnfdConnectionPointRef(connector);
+                       component.setState({editPathsMode: newRsp.uid});
+               } else {
+                       rsp.createVnfdConnectionPointRef(connector);
+               }
+               CatalogItemsActions.catalogItemDescriptorChanged(rsp.getRoot());
+       }
+
+       const isEditPathsMode = context.component.state.editPathsMode === rsp.uid;
+
+       const toggleSelectionOrCreateNewPath = (
+               <div>
+                       {!rsp.isFactory ? <input type="checkbox" id={'show-path-' + rsp.uid} checked={rsp.uiState.showPath} onChange={() => {}} onClick={onClickToggleRSPShowPath.bind(null, rsp)} /> : ' '}
+               </div>
+       );
+
+       const editRspName = (
+               <EditableProperty title="name">
+                       <ContentEditableDiv name="name" value={rsp.name} autoPadRight="true" onChange={onFormInputChangedModifyContainerAndNotify.bind(null, rsp)} />
+               </EditableProperty>
+       );
+
+       const hasServiceFunctionVNFDs = context.containers.filter(d => DescriptorModelFactory.isConstituentVnfdWithServiceChain(d, 'SF')).length > 0;
+
+       if (!hasServiceFunctionVNFDs && rsp.isFactory) {
+               return null;
+       }
+
+       let cpRefMapped = rsp.connectionPoints.map((cpRef, i) => {
+               return {
+                       index: i,
+                       value: cpRef
+               }
+       });
+
+       cpRefMapped.sort((a, b) => {
+               return a.value.order - b.value.order;
+       });
+
+       let connectionPointsSorted = cpRefMapped.map((cpRef) => {
+               return rsp.connectionPoints[cpRef.index];
+       });
+
+
+       return (
+               <div key={i} data-offset-width="table.fg-classifier" data-uid={rsp.uid}
+                        onClick={onClickSelectAndShowInDetailsPanel.bind(null, rsp)}
+                        onMouseOver={highlightPath.bind(null, rsp)}
+                        onMouseOut={removeHighlighting.bind(null, rsp)}
+                        onMouseLeave={removeHighlighting.bind(null, rsp)}
+                        onCut={onCutDelegateToRemove.bind(null, rsp)}>
+                       <div className={ClassNames(rsp.className, {'-is-factory': rsp.isFactory, '-is-edit-paths-mode': isEditPathsMode})}>
+                               <LayoutRow primaryActionColumn={toggleSelectionOrCreateNewPath} secondaryActionColumn={null}>
+                                       {editRspName}
+                                       <div className="connection-points">
+                                               {connectionPointsSorted.map(mapConnectionPoint.bind(null, context.stylePrimary, true))}
+                                               {hasServiceFunctionVNFDs ? <div className="rsp-create-new-connection-point-line rsp-line" style={context.styleSecondary}></div> : null}
+                                               {hasServiceFunctionVNFDs ? <div className="enter-path-edit-mode connection-point" style={context.styleSecondary}
+                                                        onClick={onClickEnterPathEdithMode.bind(null, context.component, rsp.uid)}>
+                                                       <small>+CP</small>
+                                               </div> : null}
+                                               {hasServiceFunctionVNFDs ? <ConnectionPointSelector containers={context.containers}
+                                                                                                style={context.styleSecondary}
+                                                                                                serviceChain="SF"
+                                                                                                onExitEditPathMode={onClickExitPathEdithMode.bind(null, context.component)}
+                                                                                                onAddConnectionPointRef={onClickAddConnectionPointRef.bind(null, context.component, rsp)}
+                                               /> : null}
+                                               {!hasServiceFunctionVNFDs && !rsp.isFactory ? <small className="hint">A VNFD with the chain SF is required to build Rendered Service Paths.</small> : null}
+                                               {rsp.isFactory && !isEditPathsMode? <small className="enter-path-edit-mode-hint hint">Tap to start creating a new path.</small> : null}
+                                       </div>
+                               </LayoutRow>
+                       </div>
+               </div>
+       );
+
+}