2 * Copyright © 2016-2017 European Support Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
13 * or implied. See the License for the specific language governing
14 * permissions and limitations under the License.
17 import React from 'react';
18 import PropTypes from 'prop-types';
19 import { DragSource, DropTarget } from 'react-dnd';
21 import Common from '../../../../../../common/Common';
23 import Icon from '../../../../../icons/Icon';
24 import iconHandle from '../../../../../../../../../../res/ecomp/asdc/sequencer/sprites/icons/handle.svg';
25 import iconDelete from '../../../../../../../../../../res/ecomp/asdc/sequencer/sprites/icons/delete.svg';
28 * LHS lifeline row view.
30 class Lifeline extends React.Component {
32 // ///////////////////////////////////////////////////////////////////////////////////////////////
35 * Construct editor view.
36 * @param props element properties.
37 * @param context react context.
39 constructor(props, context) {
40 super(props, context);
44 name: props.lifeline.name,
47 const metamodel = Common.assertNotNull(this.props.metamodel).unwrap();
48 this.canReorder = metamodel.diagram.lifelines.constraints.reorder;
49 this.canDelete = metamodel.diagram.lifelines.constraints.delete;
53 this.onChangeName = this.onChangeName.bind(this);
54 this.onBlurName = this.onBlurName.bind(this);
55 this.onClickDelete = this.onClickDelete.bind(this);
56 this.onMouseEnter = this.onMouseEnter.bind(this);
57 this.onMouseLeave = this.onMouseLeave.bind(this);
60 // ///////////////////////////////////////////////////////////////////////////////////////////////
64 * @param event change event.
67 this.setState({ name: event.target.value });
70 // ///////////////////////////////////////////////////////////////////////////////////////////////
74 * @param event change event.
77 const options = this.props.application.getOptions();
78 const sanitized = Common.sanitizeText(event.target.value, options, 'lifeline');
80 id: this.props.lifeline.id,
83 this.props.designer.updateLifeline(props);
84 this.setState({ name: sanitized });
87 // ///////////////////////////////////////////////////////////////////////////////////////////////
90 * Handle lifeline delete.
93 this.props.designer.deleteLifeline(this.props.lifeline.id);
96 // ///////////////////////////////////////////////////////////////////////////////////////////////
99 * Handle mouseover event.
102 this.setState({ active: true });
103 this.props.designer.onMouseEnterLifeline(this.props.lifeline.id);
106 // ///////////////////////////////////////////////////////////////////////////////////////////////
109 * Handle mouseleave event.
112 this.setState({ active: false });
113 this.props.designer.onMouseLeaveLifeline(this.props.lifeline.id);
116 // ///////////////////////////////////////////////////////////////////////////////////////////////
119 * Get whether metadata permits reorder.
120 * @returns true if reorderable.
123 return this.canReorder;
126 // ///////////////////////////////////////////////////////////////////////////////////////////////
129 * Get whether metadata permits delete.
130 * @returns true if lifeline can be deleted.
133 return this.canDelete;
136 // ///////////////////////////////////////////////////////////////////////////////////////////////
144 const id = this.props.lifeline.id;
145 const activeClass = (this.props.active === true) ? 'asdcs-active' : '';
146 const { connectDragSource, connectDropTarget } = this.props;
147 return connectDragSource(connectDropTarget(
150 className={`asdcs-designer-lifeline ${activeClass}`}
152 onMouseEnter={this.onMouseEnter}
153 onMouseLeave={this.onMouseLeave}
155 <table className="asdcs-designer-layout asdcs-designer-lifeline-row1">
159 <div className="asdcs-designer-sort asdcs-designer-icon">
160 <Icon glyph={iconHandle} />
164 <div className="asdcs-designer-lifeline-index">{this.props.lifeline.index}.</div>
167 <div className="asdcs-designer-lifeline-name">
170 className="asdcs-editable"
171 placeholder="Unnamed"
172 value={this.state.name}
173 onChange={this.onChangeName}
174 onBlur={this.onBlurName}
179 <div className="asdcs-designer-delete asdcs-designer-icon" onClick={this.onClickDelete}>
180 <Icon glyph={iconDelete} />
192 * Declare properties.
194 Lifeline.propTypes = {
195 application: PropTypes.object.isRequired,
196 designer: PropTypes.object.isRequired,
197 lifeline: PropTypes.object.isRequired,
198 active: PropTypes.bool.isRequired,
199 metamodel: PropTypes.object.isRequired,
200 id: PropTypes.any.isRequired,
201 index: PropTypes.number.isRequired,
202 lifelines: PropTypes.object.isRequired,
203 isDragging: PropTypes.bool.isRequired,
204 connectDragSource: PropTypes.func.isRequired,
205 connectDropTarget: PropTypes.func.isRequired,
219 const sourceCollect = function collection(connect, monitor) {
221 connectDragSource: connect.dragSource(),
222 isDragging: monitor.isDragging(),
228 drop(props, monitor, component) {
229 Common.assertNotNull(props);
230 Common.assertNotNull(monitor);
231 const decorated = component.getDecoratedComponentInstance();
233 const lifelines = decorated.props.lifelines;
235 const dragIndex = monitor.getItem().index;
236 const hoverIndex = lifelines.getHoverIndex();
237 lifelines.onDrop(dragIndex, hoverIndex);
241 hover(props, monitor, component) {
242 Common.assertNotNull(props);
243 Common.assertNotNull(monitor);
245 const decorated = component.getDecoratedComponentInstance();
247 const lifelines = decorated.props.lifelines;
249 lifelines.setHoverIndex(decorated.props.index);
257 function targetCollect(connect, monitor) {
259 connectDropTarget: connect.dropTarget(),
260 isOver: monitor.isOver(),
264 const wrapper1 = DragSource('lifeline', source, sourceCollect)(Lifeline);
265 export default DropTarget(['lifeline', 'lifeline-new'], target, targetCollect)(wrapper1);