How to give JointJS elements a remove tool?

前端 未结 4 1723
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-09 06:53

In JointJS, links come with a handy responsive tool for removing links (when you hover over the link, an \"x\" appears, and clicking it removes the link). Elements, on the

4条回答
  •  渐次进展
    2020-12-09 07:52

    In my project I define a custom shape - toolElement - that encapsulates this behaviour and then extend this with other custom shapes as required.

    Full disclosure: This technique leans heavily on the jointjs code for links - I just adapted it :o)

    Here is a jsfiddle showing it working:

    http://jsfiddle.net/kj4bqczd/3/

    The toolElement is defined like this:

    joint.shapes.tm.toolElement = joint.shapes.basic.Generic.extend({
    
        toolMarkup: ['',
            '',
            '',
            'Remove this element from the model',
            '',
            ''].join(''),
    
        defaults: joint.util.deepSupplement({
            attrs: {
                text: { 'font-weight': 400, 'font-size': 'small', fill: 'black', 'text-anchor': 'middle', 'ref-x': .5, 'ref-y': .5, 'y-alignment': 'middle' },
            },
        }, joint.shapes.basic.Generic.prototype.defaults)
    
    });
    

    You can add more markup if you need other tools as well as the remove button.

    The remove behaviour is encapsulated in a custom view:

    joint.shapes.tm.ToolElementView = joint.dia.ElementView.extend({
    
        initialize: function() {
    
            joint.dia.ElementView.prototype.initialize.apply(this, arguments);
        },
    
        render: function () {
    
            joint.dia.ElementView.prototype.render.apply(this, arguments);
    
            this.renderTools();
            this.update();
    
            return this;
        },
    
        renderTools: function () {
    
            var toolMarkup = this.model.toolMarkup || this.model.get('toolMarkup');
    
            if (toolMarkup) {
    
                var nodes = V(toolMarkup);
                V(this.el).append(nodes);
    
            }
    
            return this;
        },
    
        pointerclick: function (evt, x, y) {
    
            this._dx = x;
            this._dy = y;
            this._action = '';
    
            var className = evt.target.parentNode.getAttribute('class');
    
            switch (className) {
    
                case 'element-tool-remove':
                    this.model.remove();
                    return;
                    break;
    
                default:
            }
    
            joint.dia.CellView.prototype.pointerclick.apply(this, arguments);
        },
    });
    

    You can then extend these to make your custom shapes. In my project, I am doing data flow diagrams and here is the definition of the Process shape:

    joint.shapes.tm.Process = joint.shapes.tm.toolElement.extend({
    
        markup: '</g><text/></g>',
    
        defaults: joint.util.deepSupplement({
            type: 'tm.Process',
            attrs: {
                '.element-process': { 'stroke-width': 1, r: 30, stroke: 'black', transform: 'translate(30, 30)' },
                text: { ref: '.element-process'}
            },
            size: { width: 100, height: 100 }
        }, joint.shapes.tm.toolElement.prototype.defaults)
    });
    </code></pre>
    
    <p>and view:</p>
    
    <pre><code>joint.shapes.tm.ProcessView = joint.shapes.tm.ToolElementView;
    </code></pre>
    
    <p>I show and hide the tool markup, depending whether the element is highlighted using CSS. You could do the same when hovering (like the links do) if you like:</p>
    
    <pre><code>.element .element-tools {
        display: none;
        cursor: pointer
    }
    
    .element.highlighted .element-tools {
        display: inline;
    }
    </code></pre>
    
    <p>When rendered, it looks like this (note: in my case, I have another button in the tools, not just the remove - that is what the green chevron button is. I removed this from the code samples above to make them simpler):</p>
    
    <p>When the element is not highlighted:</p>
    
    <p><img src="https://i.stack.imgur.com/K6eXE.png" alt="element tool unhighlighted render"></p>
    
    <p>When it is highlighted:</p>
    
    <p><img src="https://i.stack.imgur.com/shgN8.png" alt="rendering of the tool element"></p>
    
    <p>I can then define other shapes really easily by extending toolElement. Here are the data flow diagram shapes for data stores:</p>
    
    <p><img src="https://i.stack.imgur.com/ThZ0G.png" alt="enter image description here"></p>
    
    <p>and external actors:</p>
    
    <p><img src="https://i.stack.imgur.com/D1S9s.png" alt="enter image description here"></p>
        </p>
                 <div class="appendcontent">
                                                            </div>
                </div>
                <div class="jieda-reply">
                  <span class="jieda-zan button_agree" type="zan" data-id='997422'>
                    <i class="iconfont icon-zan"></i>
                    <em>0</em>
                  </span>
                       <span type="reply" class="showpinglun" data-id="997422">
                    <i class="iconfont icon-svgmoban53"></i>
                   讨论(0)
                  </span>
                                                      
                  
                  <div class="jieda-admin">
                              
                 
           
              
                  </div>
                                           <div class="noreplaytext bb">
    <center><div>   <a href="https://www.e-learn.cn/qa/q-309841.html">  查看其它4个回答
    </a>
    </div></center>
    </div>            </div>
                             <div class="comments-mod "  style="display: none; float:none;padding-top:10px;" id="comment_997422">
                        <div class="areabox clearfix">
    
    <form class="layui-form" action="">
                   
                <div class="layui-form-item">
        <label class="layui-form-label" style="padding-left:0px;width:60px;">发布评论:</label>
        <div class="layui-input-block" style="margin-left:90px;">
             <input type="text" placeholder="不少于5个字" AUTOCOMPLETE="off" class="comment-input layui-input" name="content" />
                            <input type='hidden' value='0' name='replyauthor' />
        </div>
        <div class="mar-t10"><span class="fr layui-btn layui-btn-sm addhuidapinglun" data-id="997422">提交评论 </span></div>
      </div>
      
    </form>
                        </div>
                        <hr>
                        <ul class="my-comments-list nav">
                            <li class="loading">
                            <img src='https://www.e-learn.cn/qa/static/css/default/loading.gif' align='absmiddle' />
                             加载中...
                            </li>
                        </ul>
                    </div>
              </li>
                                  			
            </ul>
            
            <div class="layui-form layui-form-pane">
              <form id="huidaform"  name="answerForm"  method="post">
                
                <div class="layui-form-item layui-form-text">
                  <a name="comment"></a>
                  <div class="layui-input-block">
                
        
    <script type="text/javascript" src="https://www.e-learn.cn/qa/static/js/neweditor/ueditor.config.js"></script>
    <script type="text/javascript" src="https://www.e-learn.cn/qa/static/js/neweditor/ueditor.all.js"></script>
    <script type="text/plain" id="editor"  name="content"  style="width:100%;height:200px;"></script>                                 
    <script type="text/javascript">
                                     var isueditor=1;
                var editor = UE.getEditor('editor',{
                    //这里可以选择自己需要的工具按钮名称,此处仅选择如下五个
                    toolbars:[['source','fullscreen',  '|', 'undo', 'redo', '|', 'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|', 'rowspacingtop', 'rowspacingbottom', 'lineheight', '|', 'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|', 'indent', '|', 'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'link', 'unlink', 'anchor', '|', 'simpleupload', 'insertimage', 'scrawl', 'insertvideo', 'attachment', 'map', 'insertcode', '|', 'horizontal', '|', 'preview', 'searchreplace', 'drafts']],
                
                    initialContent:'',
                    //关闭字数统计
                    wordCount:false,
                    zIndex:2,
                    //关闭elementPath
                    elementPathEnabled:false,
                    //默认的编辑区域高度
                    initialFrameHeight:250
                    //更多其他参数,请参考ueditor.config.js中的配置项
                    //更多其他参数,请参考ueditor.config.js中的配置项
                });
                            editor.ready(function() {
                	editor.setDisabled();
                	});
                                $("#editor").find("*").css("max-width","362px");
            </script>              </div>
                </div>
                              
        
    
            
             <div class="layui-form-item">
                    <label for="L_vercode" class="layui-form-label">验证码</label>
                    <div class="layui-input-inline">
                      <input type="text"  id="code" name="code"   value="" required lay-verify="required" placeholder="图片验证码" autocomplete="off" class="layui-input">
                    </div>
                    <div class="layui-form-mid">
                      <span style="color: #c00;"><img class="hand" src="https://www.e-learn.cn/qa/user/code.html" onclick="javascript:updatecode();" id="verifycode"><a class="changecode"  href="javascript:updatecode();"> 看不清?</a></span>
                    </div>
                  </div>
                                      <div class="layui-form-item">
                        <input type="hidden" value="309841" id="ans_qid" name="qid">
       <input type="hidden" id="tokenkey" name="tokenkey" value=''/>
                    <input type="hidden" value="How to give JointJS elements a remove tool?" id="ans_title" name="title"> 
                 
                  <div class="layui-btn    layui-btn-disabled"  id="ajaxsubmitasnwer" >提交回复</div>
                </div>
              </form>
            </div>
          </div>
          <input type="hidden" value="309841" id="adopt_qid"	name="qid" /> 
          <input type="hidden" id="adopt_answer" value="0"	name="aid" />
        </div>
        <div class="layui-col-md4">
              
     <!-- 热门讨论问题 -->
         
     <dl class="fly-panel fly-list-one">
            <dt class="fly-panel-title">热议问题</dt>
                <!-- 本周热门讨论问题显示10条-->