Rev 1775 | Rev 1782 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1670 | jmachado | 1 | <%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %> |
2 | <%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %> |
||
3 | <%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %> |
||
4 | <%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %> |
||
5 | <%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %> |
||
6 | <%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %> |
||
7 | <%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %> |
||
1781 | jmachado | 8 | <%@ page import="jomm.dao.impl.AbstractDao" %> |
9 | <%@ page import="pt.estgp.estgweb.domain.BpmnProcessImpl" %> |
||
10 | <%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %> |
||
1670 | jmachado | 11 | <%@ page import="pt.estgp.estgweb.web.filters.UserRoleProxy" %> |
1781 | jmachado | 12 | <%@ taglib tagdir="/WEB-INF/tags" prefix="bacoTags" %> |
1670 | jmachado | 13 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
1781 | jmachado | 14 | <% |
1670 | jmachado | 15 | |
1781 | jmachado | 16 | Long processId = Long.parseLong(request.getParameter("id")); |
17 | AbstractDao.getCurrentSession().beginTransaction(); |
||
18 | BpmnProcessImpl process = (BpmnProcessImpl) DaoFactory.getBpmnProcessDaoImpl().get(processId); |
||
1670 | jmachado | 19 | |
1781 | jmachado | 20 | |
21 | %> |
||
22 | |||
23 | <style> |
||
24 | div.dirty |
||
25 | { |
||
26 | border: 3px dashed orangered !important; |
||
27 | } |
||
28 | </style> |
||
29 | |||
30 | |||
1670 | jmachado | 31 | <link rel="stylesheet" href="<%=request.getContextPath()%>/user/pagecontent/jorgeaux/angulartree/bower_components/angular-ui-tree/dist/angular-ui-tree.min.css"> |
32 | <script type="text/javascript" src="<%=request.getContextPath()%>/user/pagecontent/jorgeaux/angulartree/bower_components/angular-ui-tree/dist/angular-ui-tree.js"></script> |
||
33 | |||
34 | |||
35 | <div class="container-fluid" |
||
36 | id="processEditorModule" |
||
37 | ng-app="processEditorModule" |
||
1775 | jmachado | 38 | ng-controller="processEditorModuleController" |
39 | ng-init="initBuilder()"> |
||
1670 | jmachado | 40 | |
41 | <style> |
||
42 | .has-error .chosen-container |
||
43 | { |
||
44 | border: 1px solid #a94442 !important; |
||
45 | } |
||
46 | </style> |
||
47 | <script> |
||
48 | |||
49 | //DECLARACAO DA APLICACAO LOCAL EM ANGULAR |
||
50 | var processEditorModule = angular.module('processEditorModule', ['ui.tree']); |
||
51 | GLOBAL_BacoAngularAppDependencies.push('processEditorModule'); |
||
52 | |||
53 | /**Fim de directiva reutilizavel**/ |
||
54 | |||
1781 | jmachado | 55 | processEditorModule.controller('processEditorModuleController', function($scope,$interval,$filter) |
56 | { |
||
1670 | jmachado | 57 | |
1781 | jmachado | 58 | $scope.autoSavesObjects = []; |
59 | $scope.inicializarSaves = function() |
||
60 | { |
||
61 | $interval(autoSaves,5000); |
||
62 | } |
||
1670 | jmachado | 63 | |
1781 | jmachado | 64 | $scope.autoSaves = function() |
1775 | jmachado | 65 | { |
1781 | jmachado | 66 | for(x in process.flowComponents) |
67 | { |
||
68 | var obj = process.flowComponents[x]; |
||
69 | if(obj.dirty == true) |
||
70 | { |
||
71 | |||
72 | } |
||
73 | } |
||
74 | for(x in process.actorPools) |
||
75 | { |
||
76 | var obj = process.actorPools[f]; |
||
77 | if(obj.dirty == true) |
||
78 | { |
||
79 | |||
80 | } |
||
81 | } |
||
1775 | jmachado | 82 | } |
83 | |||
1781 | jmachado | 84 | $scope.callService = function(service,parameters,callback) |
1775 | jmachado | 85 | { |
86 | widgetCallWithActionParameters( |
||
87 | "<%=request.getContextPath()%>/admin/bpmn/bpmnController.do", |
||
1781 | jmachado | 88 | service, |
89 | parameters, |
||
90 | "#processEditorModule", |
||
91 | function(jsonAnswer) |
||
1775 | jmachado | 92 | { |
1781 | jmachado | 93 | callback(jsonAnswer); |
1775 | jmachado | 94 | $scope.$apply(); |
95 | } |
||
96 | ); |
||
97 | } |
||
1781 | jmachado | 98 | $scope.callSimpleService = function(service,parameters,callback) |
99 | { |
||
100 | widgetSimpleCallWithActionParameters( |
||
101 | "<%=request.getContextPath()%>/admin/bpmn/bpmnController.do", |
||
102 | service, |
||
103 | parameters, |
||
104 | "#processEditorModule", |
||
105 | function() |
||
106 | { |
||
107 | callback(); |
||
108 | $scope.$apply(); |
||
109 | } |
||
110 | ); |
||
111 | } |
||
1775 | jmachado | 112 | |
1781 | jmachado | 113 | //$scope.files = {"service":"ok","uploadedFiles":[{fileName:"teste"}]}; |
114 | $scope.idTemp = -1; |
||
1775 | jmachado | 115 | |
1781 | jmachado | 116 | $scope.jsps = []; |
117 | |||
118 | |||
119 | $scope.initBuilder = function() |
||
120 | { |
||
121 | $scope.initJsps(); |
||
122 | } |
||
123 | |||
124 | $scope.initJsps = function() |
||
125 | { |
||
126 | $scope.callService("loadJspsPlugins",{},function(interfaces) |
||
127 | { |
||
128 | $scope.jsps = interfaces.jsps; |
||
129 | $scope.$apply(); |
||
130 | $(".angularChosen").chosen(); |
||
131 | }); |
||
132 | } |
||
133 | |||
134 | |||
1670 | jmachado | 135 | /** Funções que interagem com directiva reutilizavel **/ |
136 | $scope.save = function() { |
||
137 | $scope.$broadcast('show-errors-check-validity'); |
||
138 | |||
139 | if (!$scope.processoForm.$invalid) { |
||
140 | alert('User saved'); |
||
141 | //$scope.reset(); |
||
142 | } |
||
143 | else |
||
144 | { |
||
145 | alert("Existem erros no form"); |
||
146 | } |
||
147 | }; |
||
148 | $scope.reset = function() { |
||
149 | $scope.$broadcast('show-errors-reset'); |
||
150 | $scope.user = { name: '', email: '' }; |
||
151 | } |
||
152 | /** Fim de Funções que interagem com directiva reutilizavel **/ |
||
153 | |||
154 | |||
1781 | jmachado | 155 | $scope.process = <%=process.toJson()%>; |
1670 | jmachado | 156 | |
1781 | jmachado | 157 | $scope.removeTask = function (poolId,taskId,$index) |
158 | { |
||
159 | $scope.callSimpleService("removeTask",{"poolId":poolId,"taskId":taskId},function() |
||
160 | { |
||
161 | var pool = $filter('filter')($scope.process.actorPools, {id: poolId })[0]; |
||
162 | pool.flowComponents.splice($index,1); |
||
163 | }); |
||
1670 | jmachado | 164 | } |
165 | |||
1781 | jmachado | 166 | $scope.setDirty = function(obj) |
167 | { |
||
168 | obj.dirty = "true"; |
||
169 | $scope.autoSavesObjects.push(obj); |
||
1670 | jmachado | 170 | } |
171 | |||
1781 | jmachado | 172 | |
173 | |||
1670 | jmachado | 174 | $scope.newActorPool = function() |
175 | { |
||
1781 | jmachado | 176 | $scope.callService("addActorPool",{"processId":$scope.process.id},function(actorPool) |
177 | { |
||
178 | if($scope.process.actorPools == null) |
||
179 | $scope.process.actorPools = []; |
||
180 | $scope.process.actorPools.push(actorPool); |
||
181 | $scope.$apply(); |
||
182 | invokeChosenSelects("#bpmnPools"); |
||
183 | }); |
||
1670 | jmachado | 184 | } |
185 | |||
1781 | jmachado | 186 | $scope.addTaskActor = function(pool) |
187 | { |
||
188 | $scope.callService("addTaskActor",{"poolId":pool.id},function(taskActor) |
||
189 | { |
||
190 | if(pool.flowComponents == null) |
||
191 | pool.flowComponents = []; |
||
192 | pool.flowComponents.push(taskActor); |
||
193 | $scope.$apply(); |
||
194 | //invokeChosenSelects("#bpmnPools"); |
||
195 | }); |
||
196 | } |
||
197 | |||
1670 | jmachado | 198 | $scope.newRoleForPool = function(item) |
199 | { |
||
200 | $scope.idTemp--; |
||
1781 | jmachado | 201 | if(item.roles == null) |
202 | { |
||
203 | item.roles = []; |
||
204 | } |
||
1670 | jmachado | 205 | item.roles.push( |
206 | { |
||
207 | "role" : "", |
||
208 | "trans" : "" |
||
209 | } |
||
210 | ); |
||
211 | //O chosen está off para que na primeira interação nao actue sobre |
||
212 | //o option padrão que está sempre presente para preenchimento pelo Angular |
||
213 | setTimeout(function() { invokeChosenSelects("#bpmnPools"); }, 100); |
||
214 | } |
||
215 | |||
216 | }); |
||
217 | /** |
||
218 | Directiva showErrors reutilizavel para validação de forms groups |
||
219 | Basta que um campo no form tenha a classe form-control* |
||
220 | |||
221 | em cada campo onde quisermos validação é necessario colocar show-errors no container |
||
222 | e dar um nome unico ao input a validar e também a directiva required |
||
223 | |||
224 | é necessario dar o nome processoForm neste caso para o save atuar sobre a verificacao de validade da form |
||
225 | é necessario definir a class .has-error .chosen-container com #a94442 e !important para se sobrebor nos selects do chosen |
||
226 | */ |
||
227 | |||
228 | processEditorModule.directive('showErrors', function($timeout) { |
||
229 | return { |
||
230 | restrict: 'A', |
||
231 | require: '^form', |
||
232 | link: function (scope, el, attrs, formCtrl) |
||
233 | { |
||
234 | scope.initOk = function(scope, el, attrs, formCtrl) { |
||
235 | |||
236 | var inputEl = el[0].querySelector("[name]"); |
||
237 | var inputNgEl = angular.element(inputEl); |
||
238 | |||
239 | var inputName = inputNgEl.attr('name'); |
||
240 | |||
241 | var blurred = false; |
||
242 | // only apply the has-error class after the user leaves the text box |
||
243 | inputNgEl.bind('blur', function() { |
||
244 | blurred = true; |
||
245 | el.toggleClass('has-error', formCtrl[inputName].$invalid); |
||
246 | }); |
||
247 | |||
248 | scope.$watch(function() { |
||
249 | return formCtrl[inputName].$invalid |
||
250 | }, |
||
251 | function(invalid) { |
||
252 | // we only want to toggle the has-error class after the blur |
||
253 | // event or if the control becomes valid |
||
254 | if (!blurred && invalid) { return } |
||
255 | el.toggleClass('has-error', invalid); |
||
256 | |||
257 | }); |
||
258 | |||
259 | |||
260 | scope.$on('show-errors-check-validity', function() { |
||
261 | el.toggleClass('has-error', formCtrl[inputName].$invalid); |
||
262 | }); |
||
263 | |||
264 | scope.$on('show-errors-reset', function() { |
||
265 | $timeout(function() { |
||
266 | el.removeClass('has-error'); |
||
267 | }, 0, false); |
||
268 | }); |
||
269 | } |
||
270 | scope.initClean = function(scope, el, attrs, formCtrl) { |
||
271 | |||
272 | |||
273 | var inputEl = el[0].querySelector("[name]"); |
||
274 | var inputNgEl = angular.element(inputEl); |
||
275 | |||
276 | //scope.$watch("processoForm", function( newValue, oldValue ) { |
||
277 | if ( inputNgEl.attr('name').indexOf("{")>=0 ) { |
||
278 | console.log( "Sujo..." + inputNgEl.attr('name')); |
||
279 | $timeout(function() { |
||
280 | scope.initClean(scope, el, attrs, formCtrl); |
||
281 | } |
||
282 | , 100); |
||
283 | return; |
||
284 | } |
||
285 | else{ |
||
286 | console.log("LIMPO..." + inputNgEl.attr('name')); |
||
287 | scope.initOk(scope, el, attrs, formCtrl); |
||
288 | } |
||
289 | //}); |
||
290 | }; |
||
291 | |||
292 | scope.initClean(scope, el, attrs, formCtrl); |
||
293 | } |
||
294 | } |
||
295 | }); |
||
296 | |||
297 | </script> |
||
298 | |||
1775 | jmachado | 299 | <!--TODO TIRAR DAQUI--> |
300 | <select ng-model="jsp" class="chosenOff angularChosen" ng-options="o for o in jsps"></select> |
||
301 | |||
1781 | jmachado | 302 | |
1670 | jmachado | 303 | <form class="row" name="processoForm"> |
304 | <button type="submit" ng-click="save()">Teste</button> |
||
305 | <div class="col-md-9 form-horizontal"> |
||
306 | |||
307 | <div class="panel panel-primary"> |
||
308 | <div class="panel-heading"> |
||
309 | Identificação do Processo |
||
310 | </div> |
||
311 | <div class="panel-body"> |
||
312 | <div class="form-group"> |
||
313 | <label class="col-md-2 control-label">Classe:</label> |
||
314 | <div class="col-md-10"> |
||
315 | <select name="process.class" ng-model="process.class" class="chosenOff form-control"> |
||
316 | <option value="BpmnProcessImpl" ng-selected="{{process.class == 'BpmnProcessImpl'}}">Processo Genérico</option> |
||
317 | <option value="BpmnProcessControloAtividadeDocenteImpl" ng-selected="{{process.class == 'BpmnProcessControloAtividadeDocenteImpl'}}">Controlo de Atividade Docente</option> |
||
318 | </select> |
||
319 | </div> |
||
320 | </div> |
||
321 | <div class="form-group" show-errors> |
||
322 | <label class="col-md-2 control-label">Nome:</label> |
||
323 | <div class="col-md-10"><input name="process.name" required class="form-control" ng-model="process.name"></div> |
||
324 | </div> |
||
325 | <div class="form-group" show-errors> |
||
326 | <label class="col-md-2 control-label">Description:</label> |
||
327 | <div class="col-md-10"><textarea name="process.description" required rows="5" class="form-control" ng-model="process.description"></textarea></div> |
||
328 | </div> |
||
329 | |||
330 | <div id="controloAtividadeDocente" ng-if="process.class == 'BpmnProcessControloAtividadeDocenteImpl'"> |
||
331 | <div class="well well-sm"> |
||
332 | Controlo de Atividade Docente |
||
333 | <a class="pull-right btn btn-success btn-xs" data-nodrag ng-click="newAtividadePontuada()" style="margin-right: 8px;"> |
||
334 | <span class="glyphicon glyphicon-plus"></span></a> |
||
335 | </div> |
||
336 | <table class="table"> |
||
337 | <thead> |
||
338 | <tr> |
||
339 | <th>Chave ID</th> |
||
340 | <th style="width: 50%">Papel Validador</th> |
||
341 | <th>Pontos</th> |
||
342 | <th>Tipo de Atividade</th> |
||
343 | </tr> |
||
344 | </thead> |
||
345 | <tbody> |
||
346 | <tr ng-repeat="a in process.esquemaPontos.atividades"> |
||
347 | <td show-errors><input name="process.esquemaPontos.atividades[{{$index}}].tipoAtividadeChave" required type="text" class="form-control" ng-model="a.tipoAtividadeChave"></td> |
||
348 | <td show-errors> |
||
349 | <select name="process.esquemaPontos.atividades[{{$index}}].papelValidador" required class="chosenOff form-control" ng-model="a.papelValidador" class="form-control"> |
||
350 | <% |
||
351 | for(String role: UserRoleProxy.getUserRoles()) |
||
352 | { |
||
353 | request.setAttribute("role",role); |
||
354 | %> |
||
355 | <option value="${role}" ng-selected="{{a.papelValidador == '${role}'}}"><bean:message key="user.role.${role}"/></option> |
||
356 | <% |
||
357 | } |
||
358 | %> |
||
359 | </select> |
||
360 | </td> |
||
361 | <td show-errors><input name="process.esquemaPontos.atividades[{{$index}}].pontos" required type="text" class="form-control" ng-model="a.pontos"></td> |
||
362 | <td show-errors><input name="process.esquemaPontos.atividades[{{$index}}].tipoAtividadeNome" required type="text" class="form-control" ng-model="a.tipoAtividadeNome"></td> |
||
363 | </tr> |
||
364 | </tbody> |
||
365 | </table> |
||
366 | </div> |
||
367 | </div> |
||
368 | </div> |
||
369 | |||
370 | <div class="panel panel-info panel-block" id="bpmnPools"> |
||
371 | <div class="panel-heading clearfix"> |
||
372 | <span class="glyphicon glyphicon-users"></span> |
||
373 | Pools de Atores |
||
374 | <button class="btn btn-xs btn-success pull-right" type="button" ng-click="newActorPool()"><span class="glyphicon glyphicon-plus"></span></button> |
||
375 | </div> |
||
376 | |||
377 | <div ng-repeat="a in process.actorPools" class="panel-body gutter-0"> |
||
1781 | jmachado | 378 | <div class="panel panel-default"> |
379 | <div class="panel-heading clearfix"> |
||
380 | <a class="pull-right btn btn-default btn-xs bpmnTask" data-nodrag ng-click="addTaskActor(a)" style="margin-right: 8px;"> |
||
381 | <span class="bpmn-icon-task"></span></a> |
||
382 | <a class="pull-right btn btn-default btn-xs bpmnGateway" data-nodrag ng-click="newFlowComponent('bpmnGateway')" style="margin-right: 8px;"> |
||
383 | <span class="bpmn-icon-gateway-none"></span></a> |
||
384 | <a class="pull-right btn btn-default btn-xs bpmnEndEvent" data-nodrag ng-click="newFlowComponent('bpmnEndEvent')" style="margin-right: 8px;"> |
||
385 | <span class="bpmn-icon-end-event-none"></span></a> |
||
386 | </div> |
||
387 | <div class="panel-body"> |
||
388 | <div class="col-md-1"> |
||
389 | <span class="glyphicon glyphicon-user"></span> |
||
1670 | jmachado | 390 | </div> |
1781 | jmachado | 391 | <div class="col-md-5"> |
392 | <input placeholder="Coloque aqui o nome do ator" class="form-control" ng-model="a.name"> |
||
393 | </div> |
||
394 | <div class="col-md-1"> |
||
395 | <button class="btn btn-xs btn-success pull-right" type="button" ng-click="newRoleForPool(a)"><span class="glyphicon glyphicon-plus"></span>Papel</button> |
||
396 | </div> |
||
397 | <div class="col-md-4"> |
||
398 | <label ng-if="a.roles.length == 0">Não obrigatórios</label> |
||
399 | <div ng-repeat="r in a.roles" class="gutter-0"> |
||
400 | <div class="col-md-2"> |
||
401 | <a class="btn btn-danger btn-xs" data-nodrag ng-click="a.roles.splice($index, 1)"><span |
||
402 | class="glyphicon glyphicon-remove"></span></a> |
||
403 | </div> |
||
404 | <div class="col-md-10"> |
||
1670 | jmachado | 405 | |
1781 | jmachado | 406 | <select class="chosenOff" ng-model="r.role" class="form-control"> |
407 | <% |
||
408 | for(String role: UserRoleProxy.getUserRoles()) |
||
409 | { |
||
410 | request.setAttribute("role",role); |
||
411 | %> |
||
412 | <option value="${role}" ng-selected="{{r.role == '${role}'}}"><bean:message key="user.role.${role}"/></option> |
||
413 | <% |
||
414 | } |
||
415 | %> |
||
416 | </select> |
||
417 | </div> |
||
418 | |||
419 | </div> |
||
1670 | jmachado | 420 | </div> |
1781 | jmachado | 421 | <div class="col-md-1"> |
422 | <a class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="process.actorPools.splice($index, 1)"><span |
||
423 | class="glyphicon glyphicon-remove"></span></a> |
||
424 | </div> |
||
425 | </div> |
||
426 | <div class="panel-body"> |
||
427 | <div ui-tree="treeOptions" id="page-content-root"> |
||
428 | <div class="form-group"> |
||
429 | <label class="control-label"> Pesquisar:</label> |
||
430 | <div class="col-md-4"> |
||
431 | <input class="form-control" ng-model="a.searchText"> |
||
432 | </div> |
||
433 | </div> |
||
1670 | jmachado | 434 | |
1781 | jmachado | 435 | <ol ui-tree-nodes ng-model="a.flowComponents"> |
436 | <li ng-repeat="node in a.flowComponents | filter:a.searchText" ui-tree-node ng-include="'flowComponent_renderer.html'" ng-init="pool=a"></li> |
||
437 | </ol> |
||
438 | </div> |
||
1670 | jmachado | 439 | </div> |
440 | </div> |
||
1781 | jmachado | 441 | |
1670 | jmachado | 442 | </div> |
443 | |||
444 | </div> |
||
445 | |||
446 | |||
447 | |||
448 | |||
1781 | jmachado | 449 | |
1670 | jmachado | 450 | </div> |
451 | |||
452 | <div style="background-color: #fff2c3" class="col-md-3"> |
||
453 | <h2>Debug</h2> |
||
454 | <pre class="code">{{ process | json }}</pre> |
||
1775 | jmachado | 455 | |
1670 | jmachado | 456 | </div> |
457 | </form> |
||
458 | |||
459 | |||
460 | |||
461 | |||
462 | |||
463 | |||
464 | <script type="text/ng-template" id="flowComponent_renderer.html"> |
||
465 | <!-- Coloquei aqui o predicado no NGClass que quando existe uma property nodrop = true o angular coloca nodrop na class o que faz o elemento ficar a vermelho e nao permite drop--> |
||
1781 | jmachado | 466 | <div class="panel panel-default panel-block tree-node tree-node-content nodrop" ng-class="{bpmnActorTask: node['@class'] == 'pt.estgp.estgweb.domain.BpmnFlowComponentTaskActorImpl',dirty: node.dirty=='true',nodrop: node.nodrop, nodrag: node.nodrag, moved: node.moved}"> |
1670 | jmachado | 467 | <div class="panel-heading clearfix" ng-class="node.type"> |
468 | <div class="row gutter-0"> |
||
469 | <div class="col-md-1"> |
||
470 | <i class="glyphicon glyphicon-resize-vertical" ui-tree-handle></i> |
||
471 | </div> |
||
472 | <div class="col-md-2"> |
||
1781 | jmachado | 473 | <span ng-if="node['@class'] == 'pt.estgp.estgweb.domain.BpmnFlowComponentTaskActorImpl'" class="bpmn-icon-task"></span> |
1670 | jmachado | 474 | <span ng-if="node.type == 'bpmnGateway'" class="bpmn-icon-gateway-none"></span> |
475 | <span ng-if="node.type == 'bpmnEndEvent'" class="bpmn-icon-end-event-none"></span> |
||
476 | |||
1781 | jmachado | 477 | <label ng-if="node['@class'] == 'pt.estgp.estgweb.domain.BpmnFlowComponentTaskActorImpl'" class="control-label">Tarefa Actor</label> |
1670 | jmachado | 478 | <label ng-if="node.type == 'bpmnGateway'" class="control-label">Gateway</label> |
479 | <label ng-if="node.type == 'bpmnEndEvent'" class="control-label">EventoFim</label> |
||
480 | </div> |
||
481 | <div class="col-md-8 no-drag" data-nodrag> |
||
1781 | jmachado | 482 | <input ng-keyup="setDirty(node)" data-nodrag class="form-control" ng-model="node.name"> |
1670 | jmachado | 483 | </div> |
484 | <div class="col-md-1"> |
||
1781 | jmachado | 485 | |
486 | <bacoTags:confirm msg="Tem a certeza que deseja remover a atividade {{node.name}}" targetFunction="angular.element($('#processEditorModule')).scope().removeTask({{pool.id}},{{node.id}},{{$index}});angular.element($('#processEditorModule')).scope().$apply();" btnClass="btn btn-danger btn-xs pull-right" icon="glyphicon glyphicon-remove"/> |
||
487 | |||
1670 | jmachado | 488 | </div> |
489 | </div> |
||
490 | </div> |
||
491 | <div class="panel-body"> |
||
492 | |||
493 | <div class="form-group"> |
||
494 | <div class="col-md-2"> |
||
495 | <span class="glyphicon glyphicon-user"></span> Actor Pool |
||
496 | </div> |
||
497 | <div class="col-md-10"> |
||
1781 | jmachado | 498 | <select ng-change="setDirty(node)" class="chosenOff form-control" ng-model="node.actorPool" class="form-control"> |
1670 | jmachado | 499 | <option ng-repeat="a in process.actorPools" value="{{a.dbId}}" ng-selected="{{a.dbId == node.actorPool}}">{{a.name}}</option> |
500 | </select> |
||
501 | </div> |
||
502 | </div> |
||
503 | </div> |
||
504 | <div class="panel-footer clearfix"> |
||
505 | <a class="btn btn-success btn-xs" ng-if="node.flowConnectors && node.flowConnectors.length > 0" data-nodrag ng-click="toggle(this)"> |
||
506 | <span class="glyphicon" ng-class="{'glyphicon-chevron-right': collapsed,'glyphicon-chevron-down': !collapsed}"></span> |
||
507 | </a> |
||
508 | |||
509 | <a class="pull-right btn btn-default btn-xs" data-nodrag ng-click="newFlowConnector(node)" style="margin-right: 8px;"><span |
||
510 | class="bpmn-icon-connection"></span></a> |
||
511 | |||
512 | </div> |
||
513 | </div> |
||
514 | |||
515 | <ol ui-tree-nodes="" data-nodrop-enabled="true" ng-model="node.flowConnectors" ng-class="{hidden: collapsed}"> |
||
516 | <li ng-repeat="node in node.flowConnectors" ui-tree-node ng-include="'connector_renderer.html'"> |
||
517 | </li> |
||
518 | </ol> |
||
519 | </script> |
||
520 | |||
521 | |||
522 | <script type="text/ng-template" id="connector_renderer.html"> |
||
523 | <!-- Coloquei aqui o predicado no NGClass que quando existe uma property nodrop = true o angular coloca nodrop na class o que faz o elemento ficar a vermelho e nao permite drop--> |
||
524 | |||
525 | |||
526 | <div class="panel panel-default panel-block tree-node tree-node-content bpmnConnector" ui-tree-handle data-nodrag ng-class="{nodrop: node.nodrop, nodrag: node.nodrag, moved: node.moved}"> |
||
527 | <div class="panel-heading clearfix" ng-class="node.type"> |
||
528 | <div class="row gutter-0"> |
||
529 | <div class="col-md-2"> |
||
530 | <span class="bpmn-icon-connection control-label"></span> Conector |
||
531 | </div> |
||
532 | <div class="col-md-9"> |
||
533 | <input data-nodrag class="form-control" ng-model="node.name"> |
||
534 | </div> |
||
535 | <div class="col-md-1"> |
||
536 | <a class="pull-right btn btn-danger btn-xs" data-nodrag ng-click="remove(this)"><span |
||
537 | class="glyphicon glyphicon-remove"></span></a> |
||
538 | </div> |
||
539 | </div> |
||
540 | </div> |
||
541 | <div class="panel-body"> |
||
542 | <div class="form-group"> |
||
543 | <div class="col-md-2"> |
||
544 | <span class="glyphicon glyphicon-arrow-right"></span> Ligação |
||
545 | </div> |
||
546 | <div class="col-md-10"> |
||
547 | <select data-nodrag class="form-control" ng-model="node.targetComponent"> |
||
548 | <option ng-repeat="f in process.flowComponents" value="{{f.dbId}}">{{f.name}}</option> |
||
549 | </select> |
||
550 | </div> |
||
551 | </div> |
||
552 | <div class="form-group"> |
||
553 | <div class="col-md-2"> |
||
554 | <span class="glyphicon glyphicon-tag"></span> Chave |
||
555 | </div> |
||
556 | <div class="col-md-10"> |
||
557 | <input type="text" data-nodrag class="form-control" ng-model="node.key"> |
||
558 | </div> |
||
559 | </div> |
||
560 | <div class="form-group"> |
||
561 | <div class="col-md-2"> |
||
562 | <span class="glyphicon glyphicon-envelope"></span> Enviar Emails |
||
563 | </div> |
||
564 | <div class="col-md-2"> |
||
565 | <select data-nodrag class="form-control" ng-model="node.sendEmail"> |
||
566 | <option value="true" ng-selected="{{node.sendEmail == true}}">Sim</option> |
||
567 | <option value="false" ng-selected="{{node.sendEmail == false}}">Não</option> |
||
568 | </select> |
||
569 | </div> |
||
570 | </div> |
||
571 | <div class="form-group" ng-show="node.sendEmail"> |
||
572 | <div class="col-md-2"> |
||
573 | Mensagem |
||
574 | </div> |
||
575 | <div class="col-md-10"> |
||
576 | <textarea rows="3" class="form-control" ng-model="node.emailMsg"></textarea> |
||
577 | </div> |
||
578 | </div> |
||
579 | </div> |
||
580 | </div> |
||
581 | |||
582 | |||
583 | |||
584 | </script> |
||
585 | |||
586 | |||
587 | |||
588 | <!--Estilos CSS do Exemplo do Overview Nem olhei para eles copy paste e pronto--> |
||
589 | <style> |
||
590 | |||
591 | .panel-block .panel-heading, .panel-block .panel-footer |
||
592 | { |
||
593 | padding:5px; |
||
594 | } |
||
595 | |||
596 | /* remove */ |
||
597 | .gutter-0.row { |
||
598 | margin-right: -0px !important; |
||
599 | margin-left: -0px !important; |
||
600 | } |
||
601 | .gutter-0 > [class*="col-"]{ |
||
602 | padding-right: 0px !important; |
||
603 | padding-left: 0px !important; |
||
604 | } |
||
605 | |||
606 | /* customize */ |
||
607 | .gutter-6.row { |
||
608 | margin-right: -3px !important; |
||
609 | margin-left: -3px !important; |
||
610 | } |
||
611 | .gutter-6 > [class*="col-"] { |
||
612 | padding-right: 3px !important; |
||
613 | padding-left: 3px !important; |
||
614 | } |
||
615 | |||
616 | |||
617 | |||
618 | |||
1781 | jmachado | 619 | .bpmnActorTask { background-color: #fff2c3 !important;border-color: #c69763 !important } |
1670 | jmachado | 620 | .bpmnTask { background-color: #fff2c3 !important;border-color: #c69763 !important } |
621 | .bpmnStartEvent { background-color: #EEF1CA !important; border-color: #A5CF84 !important } |
||
622 | .bpmnMiddleEvent { background-color: #A7BBCF !important ;border-color: #4F87B0 !important} |
||
623 | .bpmnEndEvent { background-color: #FDE6E2 !important; border-color: #8C121D; !important } |
||
624 | .bpmnGateway { background-color: #ffcf53 !important; border-color: #ffa42a !important} |
||
625 | .bpmnFase { background-color: #ECECF4 !important; border-color: #276E9F !important} |
||
626 | .bpmnConnector { background-color: white !important; ;border-color: #b7bdbb !important } |
||
627 | |||
628 | .btn { |
||
629 | margin-right: 8px; |
||
630 | } |
||
631 | |||
632 | |||
633 | .angular-ui-tree-handle { |
||
634 | background: #f8faff; |
||
635 | border: 1px solid #dae2ea; |
||
636 | color: #7c9eb2; |
||
637 | padding: 0; |
||
638 | } |
||
639 | |||
640 | .angular-ui-tree-handle:hover { |
||
641 | color: #438eb9; |
||
642 | background: #f4f6f7; |
||
643 | border-color: #dce2e8; |
||
644 | } |
||
645 | |||
646 | .angular-ui-tree-placeholder { |
||
647 | background: #f0f9ff; |
||
648 | border: 2px dashed #bed2db; |
||
649 | -webkit-box-sizing: border-box; |
||
650 | -moz-box-sizing: border-box; |
||
651 | box-sizing: border-box; |
||
652 | } |
||
653 | |||
654 | tr.angular-ui-tree-empty { |
||
655 | height:100px |
||
656 | } |
||
657 | |||
658 | .group-title { |
||
659 | background-color: #687074 !important; |
||
660 | color: #FFF !important; |
||
661 | } |
||
662 | |||
663 | |||
664 | /* --- Tree --- */ |
||
665 | .tree-node { |
||
666 | border: 1px solid #dae2ea; |
||
667 | background: #f8faff; |
||
668 | color: #7c9eb2; |
||
669 | } |
||
670 | |||
671 | .nodrop { |
||
672 | background-color: #f2dede; |
||
673 | } |
||
674 | |||
675 | |||
676 | .nodrag { |
||
677 | background-color: #f2eec1; |
||
678 | } |
||
679 | |||
680 | .tree-node-content { |
||
681 | margin: 10px; |
||
682 | } |
||
683 | .tree-handle { |
||
684 | /*padding: 10px;*/ |
||
685 | background: #428bca; |
||
686 | color: #FFF; |
||
687 | margin-right: 15px; |
||
688 | } |
||
689 | |||
690 | .angular-ui-tree-handle:hover { |
||
691 | } |
||
692 | |||
693 | .angular-ui-tree-placeholder { |
||
694 | background: #f0f9ff; |
||
695 | border: 2px dashed #bed2db; |
||
696 | -webkit-box-sizing: border-box; |
||
697 | -moz-box-sizing: border-box; |
||
698 | box-sizing: border-box; |
||
699 | } |
||
700 | |||
701 | /*Estilo adicionado por mim para os movidos*/ |
||
702 | .moved |
||
703 | { |
||
704 | border: 2px solid blue !important; |
||
705 | } |
||
706 | </style> |
||
707 | </div> |
||
708 | |||
1781 | jmachado | 709 | <% |
710 | AbstractDao.getCurrentSession().getTransaction().commit(); |
||
711 | %> |
||
712 |