442 lines
16 KiB
PHP
442 lines
16 KiB
PHP
<script src="{{$asset_url}}/vendor/jquery.plumb.min.js" type="text/javascript"></script>
|
|
|
|
<script type="text/javascript">
|
|
var intervalTimer = null;
|
|
var nowStepId = null;
|
|
var normalStepSelector = ".wf-step:not(.wf-step-end)";
|
|
// var normalStepSelector = ".wf-step:not(.wf-step-start,.wf-step-end)";
|
|
|
|
// 判断连接器是否指向了自己
|
|
var isConnectToSelf = function(param) {
|
|
return param.sourceId === param.targetId
|
|
},
|
|
isFromStartToEnd = function(param) {
|
|
return param.sourceId === "step_1" && param.targetId === "step_0"
|
|
},
|
|
// 判断连接步骤是否重复
|
|
stepIsRepeat = function(param){
|
|
// 获取同一scope下的链接器,判断当前链接是否有重复
|
|
var cnts = jsPlumb.getConnections(param.scope);
|
|
if(cnts.length > 0) {
|
|
for(var i = 0, len = cnts.length; i < len; i++) {
|
|
// 如果有链接器 sourceId 及 targetId 都相等,那大概也许可能就相等了。
|
|
if(param.sourceId === cnts[i].sourceId && param.targetId === cnts[i].targetId) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
// 连接前的事件
|
|
var beforeDropHandler = function(param) {
|
|
|
|
if(isConnectToSelf(param)) {
|
|
toastrError('连接点不能是自己。');
|
|
return false;
|
|
}
|
|
// 连接步骤是否重复
|
|
if(stepIsRepeat(param)) {
|
|
toastrError('连接点已经存在。');
|
|
return false;
|
|
}
|
|
// 连接步骤是结束
|
|
if(isFromStartToEnd(param)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
|
|
$(document).ready(function()
|
|
{
|
|
// 获取步骤图
|
|
workStep.init();
|
|
|
|
$('#graph').contextmenu({'target':'#graph-menu'});
|
|
|
|
// 阻止非空白处的右键事件,不出现菜单
|
|
//$container.on("contextmenu", "*", function(evt) {
|
|
//evt.stopPropagation();
|
|
//});
|
|
|
|
// 点击或双击事件,这里进行了一个单击事件延迟,因为同时绑定了双击事件
|
|
$("#rows").on('click', 'div', function() {
|
|
clearTimeout(intervalTimer);
|
|
intervalTimer = setTimeout(function() {
|
|
workStep.click();
|
|
},300);
|
|
|
|
}).on('dblclick', 'div', function(e) {
|
|
nowStepId = $(e.target).attr('step_id');
|
|
clearTimeout(intervalTimer);
|
|
workStep.dblClick('base');
|
|
});
|
|
});
|
|
|
|
var workStep = {
|
|
|
|
init:function() {
|
|
|
|
jsPlumb.reset();
|
|
|
|
jsPlumb.bind("beforeDrop", beforeDropHandler);
|
|
|
|
$.post("{{url('index2')}}",{bill_id:'{{$bill_id}}'},function(res)
|
|
{
|
|
$('#rows').empty();
|
|
var nLastStepId = 0;
|
|
|
|
if(res.status == true) {
|
|
jsPlumb.importDefaults({
|
|
DragOptions:{cursor:'pointer'},
|
|
ConnectionOverlays:[
|
|
["Arrow",{location:1,id:"arrow",width:10,length:8}]
|
|
],
|
|
Anchor:'Continuous',
|
|
Endpoint :"Blank",
|
|
EndpointStyle:{radius:3,strokeStyle:'#1e8151'},
|
|
HoverPaintStyle:{radius:3,strokeStyle:'#999'},
|
|
ConnectorZIndex:5,
|
|
HoverPaintStyle:workStep.connectorHoverStyle
|
|
});
|
|
|
|
if(!$.support.leadingWhitespace) {
|
|
// ie9以下,用VML画图
|
|
jsPlumb.setRenderMode(jsPlumb.VML);
|
|
} else {
|
|
// 其他浏览器用SVG
|
|
jsPlumb.setRenderMode(jsPlumb.SVG);
|
|
}
|
|
|
|
// 第一次循环,生成页面元素div
|
|
var left = 20;
|
|
var top = 20;
|
|
|
|
var rows = res.data;
|
|
var setd = {};
|
|
|
|
$.each(rows, function(id, row) {
|
|
var title = '<span class="ep">' + (row.option == 1 ? '审核' : '知会') + '</span> ' + row.name;
|
|
if (row.type == 'start') {
|
|
title = '<span class="ep"><i class="icon icon-play"></i></span> ' + row.name;
|
|
} else if(row.type == 'end') {
|
|
title = '<span class="ep"><i class="icon icon-stop"></i></span> ' + row.name;
|
|
}
|
|
|
|
var css = 'wf-step';
|
|
if (row.type == 'start') {
|
|
css = 'wf-step wf-step-start';
|
|
} else if(row.type == 'end') {
|
|
css = 'wf-step wf-step-end';
|
|
}
|
|
|
|
var nodeDiv = document.createElement('div');
|
|
var $node = $(nodeDiv);
|
|
|
|
$node.attr("id", "step_" + row.id)
|
|
.attr("join", row.join)
|
|
.attr("step_id", row.id)
|
|
.css({"left":row.left+'px',"top":row.top+'px',"cursor":"move"})
|
|
.addClass(css)
|
|
.html(title);
|
|
|
|
/*
|
|
$(normalStepSelector).on('mousedown', function(e) {
|
|
|
|
//if(row.number > 0) {
|
|
nowStepId = $(e.target).attr('step_id');
|
|
// $(this).contextmenu({'target':'#step-menu'});
|
|
//}
|
|
//e.stopPropagation();
|
|
});
|
|
*/
|
|
|
|
$("#rows").append($node);
|
|
|
|
// 索引变量
|
|
nLastStepId++;
|
|
|
|
});
|
|
|
|
// 绑定右键操作菜单
|
|
$(normalStepSelector).on('mousedown', function(e) {
|
|
nowStepId = $(e.target).attr('step_id');
|
|
$(this).contextmenu({'target':'#step-menu'});
|
|
// e.stopPropagation();
|
|
});
|
|
|
|
// 使之可拖动
|
|
jsPlumb.draggable($(".wf-step"));
|
|
|
|
$(".ep").each(function(i,e) {
|
|
var p = $(e).parent();
|
|
jsPlumb.makeSource($(e), {
|
|
parent:p,
|
|
anchor:"Continuous",
|
|
endpoint:"Blank",
|
|
paintStyle:{
|
|
strokeStyle:"#3399cc",
|
|
fillStyle:"transparent",
|
|
radius:2,
|
|
lineWidth:2
|
|
},
|
|
// stub 线条弯曲角度 gap 距离节点位置 cornerRadius 线条圆角
|
|
connector:["Flowchart",{stub:[10, 30], gap:0, cornerRadius:3, alwaysRespectStubs:true}],
|
|
connectorStyle:workStep.connectorPaintStyle,
|
|
hoverPaintStyle:workStep.endpointHoverStyle,
|
|
connectorHoverStyle:workStep.connectorHoverStyle,
|
|
dragOptions:{},
|
|
maxConnections:-1
|
|
});
|
|
});
|
|
|
|
// 绑定删除确认操作
|
|
jsPlumb.bind("click", function(e) {
|
|
jsPlumb.detach(e);
|
|
});
|
|
|
|
// 连接关联的步骤
|
|
$('.wf-step').each(function(i) {
|
|
var id = $(this).attr('id');
|
|
var join = $(this).attr('join') || '';
|
|
var joinArray = join.split(",");
|
|
$.each(joinArray,function(j, n) {
|
|
if(n > 0) {
|
|
jsPlumb.connect({source:id, target:"step_"+n});
|
|
}
|
|
})
|
|
});
|
|
|
|
jsPlumb.makeTarget($('.wf-step'), {
|
|
dropOptions: {hoverClass:"dragHover", activeClass:"active"},
|
|
anchor: "Continuous",
|
|
maxConnections: 5
|
|
});
|
|
}
|
|
},'json');
|
|
},
|
|
connectorPaintStyle:{
|
|
lineWidth:2,
|
|
strokeStyle:"#3399cc",
|
|
joinstyle:"round",
|
|
outlineColor:"white",
|
|
dashstyle:"0",
|
|
outlineWidth:2
|
|
},
|
|
connectorHoverStyle:{
|
|
lineWidth:2,
|
|
strokeStyle:"#999999",
|
|
outlineWidth:2,
|
|
dashstyle:"4 1",
|
|
outlineColor:"white"
|
|
},
|
|
endpointHoverStyle:{
|
|
strokeStyle:"#216477"
|
|
},
|
|
// 清空所有连接
|
|
clear:function() {
|
|
jsPlumb.detachEveryConnection();
|
|
jsPlumb.deleteEveryEndpoint();
|
|
},
|
|
// 单击事件
|
|
click:function() {
|
|
if (nowStepId > 0) {
|
|
$('#tree').hide();
|
|
$.post('{{url("show")}}',{id:nowStepId, bill_id:'{{$bill_id}}'}, function(res) {
|
|
$('#tree').html(res.data).show();
|
|
})
|
|
}
|
|
},
|
|
// 删除步骤
|
|
deleted:function() {
|
|
$.messager.confirm('操作警告','确认要删除该步骤吗?',function(btn) {
|
|
if (btn) {
|
|
$.post('{{url("delete")}}',{id:nowStepId, bill_id:'{{$bill_id}}'}, function(res) {
|
|
if (res.status) {
|
|
workStep.init();
|
|
toastrSuccess('操作成功');
|
|
}
|
|
},'json');
|
|
}
|
|
|
|
});
|
|
},
|
|
// 克隆步骤
|
|
clone:function() {
|
|
$.messager.confirm('操作警告','确认要克隆该步骤吗?',function(btn) {
|
|
if (btn) {
|
|
$.post('{{url("add")}}',{id:nowStepId,bill_id:'{{$bill_id}}'},function(data) {
|
|
if(data.status) {
|
|
workStep.init();
|
|
toastrSuccess('操作成功');
|
|
}
|
|
},'json');
|
|
}
|
|
});
|
|
},
|
|
dblClick:function(tab) {
|
|
if (nowStepId > 0) {
|
|
if(tab == 'base') {
|
|
$.dialog({
|
|
title:'基本设置',
|
|
url:'{{url("create")}}?bill_id={{$bill_id}}&id='+nowStepId+'&tab='+tab,
|
|
dialogClass: 'modal-lg',
|
|
buttons:[{
|
|
class: 'btn-info',
|
|
text:'<i class="fa fa-check-circle"></i> 提交',
|
|
click: function() {
|
|
var formData = $('#mystep').serialize();
|
|
$.post('{{url("create")}}', formData, function(res) {
|
|
if (res.status) {
|
|
workStep.init();
|
|
toastrSuccess('保存当前视图成功');
|
|
}
|
|
},'json');
|
|
$(this).dialog("close");
|
|
}
|
|
},{
|
|
text:'<i class="fa fa-times"></i> 取消',
|
|
click: function() {
|
|
$(this).dialog("close");
|
|
}
|
|
}]
|
|
});
|
|
}
|
|
if (tab == 'condition') {
|
|
$.dialog({
|
|
title:'条件设置',
|
|
url:'{{url("condition")}}?bill_id={{$bill_id}}&id='+nowStepId+'&tab='+tab,
|
|
dialogClass: 'modal-lg',
|
|
buttons:[{
|
|
class: 'btn-info',
|
|
text:'<i class="fa fa-check-circle"></i> 提交',
|
|
click: function() {
|
|
var formData = $('#conditionform').serialize();
|
|
$.post('{{url("condition")}}', formData, function(res) {
|
|
if (res.status) {
|
|
workStep.init();
|
|
toastrSuccess('保存当前视图成功');
|
|
}
|
|
},'json');
|
|
$(this).dialog("close");
|
|
}
|
|
},{
|
|
text:'<i class="fa fa-times"></i> 取消',
|
|
click: function() {
|
|
$(this).dialog("close");
|
|
}
|
|
}]
|
|
});
|
|
}
|
|
}
|
|
},
|
|
add:function() {
|
|
$.post('{{url("add")}}',{bill_id:'{{$bill_id}}'},function(res) {
|
|
if (res.status) {
|
|
workStep.init();
|
|
toastrSuccess('操作成功');
|
|
}
|
|
},'json');
|
|
},
|
|
save:function() {
|
|
var join = [],position = [];
|
|
var rows = jsPlumb.getConnections();
|
|
|
|
if(rows.length == 0) {
|
|
toastrError('请先建立连接');
|
|
return;
|
|
}
|
|
|
|
for (var i = 0; i < rows.length; i++) {
|
|
var sourceId = rows[i].sourceId.substring(5);
|
|
var targetId = rows[i].targetId.substring(5);
|
|
join[i] = {id:sourceId,target:targetId};
|
|
}
|
|
|
|
$('#rows div').each(function(i) {
|
|
if(this.id.substring(0,5) == 'step_') {
|
|
var stepId = this.id.substring(5);
|
|
var left = $(this).css('left');
|
|
var top = $(this).css('top');
|
|
position[i] = {'id':stepId,'posX':left,'posY':top};
|
|
}
|
|
});
|
|
|
|
$.post('{{url("save")}}', {join:join,position:position,bill_id:'{{$bill_id}}'},function(result) {
|
|
if(result.status) {
|
|
toastrSuccess('保存当前视图成功');
|
|
}
|
|
},'json');
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
html { overflow: hidden; }
|
|
.form-panel-body {
|
|
overflow: hidden;
|
|
}
|
|
.graph-box {
|
|
overflow: auto;
|
|
width: 100vw;
|
|
height: calc(100vh - 48px);
|
|
}
|
|
.content-body {
|
|
margin: 0;
|
|
}
|
|
.font-thin {
|
|
padding: 10px;
|
|
padding-bottom: 0;
|
|
font-size: 14px;
|
|
}
|
|
</style>
|
|
|
|
<div class="form-panel">
|
|
|
|
<div class="form-panel-header">
|
|
<div class="pull-right m-r-sm">
|
|
<a class="btn btn-sm btn-info" onclick="workStep.add();" href="javascript:;">新建步骤</a>
|
|
<a class="btn btn-sm btn-default" onclick="workStep.init();" href="javascript:;">重新加载</a>
|
|
<a href="javascript:;" onclick="workStep.clear();" class="btn btn-sm btn-default"><i class="fa fa-ban"></i> 清空连接</a>
|
|
<a href="javascript:;" onclick="workStep.save();" class="btn btn-sm btn-info"><i class="fa fa-random"></i> 保存连接和视图</a>
|
|
<a class="btn btn-sm btn-default" data-toggle="closetab" data-id="flow_step_index2"><i class="fa fa-sign-out"></i> 退出</a>
|
|
</div>
|
|
<div class="font-thin">
|
|
<i class="fa fa-file-text-o"></i> {{$bill['name']}}流程
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-panel-body">
|
|
<div class="wrapper-xs graph-box">
|
|
<div class="graph" id="graph" data-toggle="context" data-target="#graph-menu">
|
|
<div id="rows"></div>
|
|
</div>
|
|
<div id="graph-menu">
|
|
<ul class="dropdown-menu" role="menu">
|
|
<li role="presentation"><a role="menuitem" onclick="workStep.add();" href="javascript:;">新建步骤</a></li>
|
|
<li role="presentation" class="divider"></li>
|
|
<li role="presentation"><a role="menuitem" onclick="workStep.save();" href="javascript:;">保存视图</a></li>
|
|
<li role="presentation"><a role="menuitem" onclick="workStep.init();" href="javascript:;">重新加载</a></li>
|
|
</ul>
|
|
</div>
|
|
<div id="step-menu">
|
|
<ul class="dropdown-menu" role="menu">
|
|
<li role="presentation"><a role="menuitem" onclick="workStep.dblClick('base');" href="javascript:;">基本设置</a></li>
|
|
<!--
|
|
<li role="presentation"><a role="menuitem" onclick="workStep.dblClick('handle');" href="javascript:;">经办权限</a></li>
|
|
<li role="presentation"><a role="menuitem" onclick="workStep.dblClick('field');" href="javascript:;">表单字段</a></li>
|
|
-->
|
|
<li role="presentation"><a role="menuitem" onclick="workStep.dblClick('condition');" href="javascript:;">条件设置</a></li>
|
|
<li role="presentation" class="divider"></li>
|
|
<li role="presentation"><a role="menuitem" onclick="workStep.clone();" href="javascript:;">克隆该步骤</a></li>
|
|
<li role="presentation"><a role="menuitem" onclick="workStep.deleted();" href="javascript:;">删除该步骤</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="clearfix"></div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|