作者 zhangFan

机场口岸通关物流辅助管理系统

运行版
正在显示 70 个修改的文件 包含 4614 行增加0 行删除

要显示太多修改。

为保证性能只显示 70 of 70+ 个文件。

  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +'use strict';
  20 +
  21 +var ACTIVITI = ACTIVITI || {};
  22 +
  23 +ACTIVITI.CONFIG = {
  24 + 'contextRoot' : appContextRoot+'/service',
  25 +};
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +'use strict';
  20 +
  21 +var activitiModeler = angular.module('activitiModeler', [
  22 + 'ngCookies',
  23 + 'ngResource',
  24 + 'ngSanitize',
  25 + 'ngRoute',
  26 + 'ngDragDrop',
  27 + 'mgcrea.ngStrap',
  28 + 'ngGrid',
  29 + 'ngAnimate',
  30 + 'pascalprecht.translate',
  31 + 'duScroll'
  32 +]);
  33 +
  34 +var activitiModule = activitiModeler;
  35 +
  36 +activitiModeler
  37 + // Initialize routes
  38 + .config(['$selectProvider', '$translateProvider', function ($selectProvider, $translateProvider) {
  39 +
  40 + // Override caret for bs-select directive
  41 + angular.extend($selectProvider.defaults, {
  42 + caretHtml: '&nbsp;<i class="icon icon-caret-down"></i>'
  43 + });
  44 +
  45 + // Initialize angular-translate
  46 + $translateProvider.useStaticFilesLoader({
  47 + prefix: './editor-app/i18n/',
  48 + suffix: '.json'
  49 + });
  50 +
  51 + $translateProvider.preferredLanguage('en');
  52 +
  53 + // remember language
  54 + $translateProvider.useCookieStorage();
  55 +
  56 + }])
  57 + .run(['$rootScope', '$timeout', '$modal', '$translate', '$location', '$window', '$http', '$q',
  58 + function($rootScope, $timeout, $modal, $translate, $location, $window, $http, $q) {
  59 +
  60 + $rootScope.config = ACTIVITI.CONFIG;
  61 +
  62 + $rootScope.editorInitialized = false;
  63 +
  64 + $rootScope.editorFactory = $q.defer();
  65 +
  66 + $rootScope.forceSelectionRefresh = false;
  67 +
  68 + $rootScope.ignoreChanges = false; // by default never ignore changes
  69 +
  70 + $rootScope.validationErrors = [];
  71 +
  72 + $rootScope.staticIncludeVersion = Date.now();
  73 +
  74 + /**
  75 + * A 'safer' apply that avoids concurrent updates (which $apply allows).
  76 + */
  77 + $rootScope.safeApply = function(fn) {
  78 + var phase = this.$root.$$phase;
  79 + if(phase == '$apply' || phase == '$digest') {
  80 + if(fn && (typeof(fn) === 'function')) {
  81 + fn();
  82 + }
  83 + } else {
  84 + this.$apply(fn);
  85 + }
  86 + };
  87 +
  88 +
  89 + /**
  90 + * Initialize the event bus: couple all Oryx events with a dispatch of the
  91 + * event of the event bus. This way, it gets much easier to attach custom logic
  92 + * to any event.
  93 + */
  94 +
  95 + /* Helper method to fetch model from server (always needed) */
  96 + function fetchModel(modelId) {
  97 +
  98 + var modelUrl = KISBPM.URL.getModel(modelId);
  99 +
  100 + $http({method: 'GET', url: modelUrl}).
  101 + success(function (data, status, headers, config) {
  102 + $rootScope.editor = new ORYX.Editor(data);
  103 + $rootScope.modelData = angular.fromJson(data);
  104 + $rootScope.editorFactory.resolve();
  105 + }).
  106 + error(function (data, status, headers, config) {
  107 + console.log('Error loading model with id ' + modelId + ' ' + data);
  108 + });
  109 + }
  110 +
  111 +
  112 + function initScrollHandling() {
  113 + var canvasSection = jQuery('#canvasSection');
  114 + canvasSection.scroll(function() {
  115 +
  116 + // Hides the resizer and quick menu items during scrolling
  117 +
  118 + var selectedElements = $rootScope.editor.selection;
  119 + var subSelectionElements = $rootScope.editor._subSelection;
  120 +
  121 + $rootScope.selectedElements = selectedElements;
  122 + $rootScope.subSelectionElements = subSelectionElements;
  123 + if (selectedElements && selectedElements.length > 0) {
  124 + $rootScope.selectedElementBeforeScrolling = selectedElements[0];
  125 + }
  126 +
  127 + jQuery('.Oryx_button').each(function(i, obj) {
  128 + $rootScope.orginalOryxButtonStyle = obj.style.display;
  129 + obj.style.display = 'none';
  130 + });
  131 +
  132 + jQuery('.resizer_southeast').each(function(i, obj) {
  133 + $rootScope.orginalResizerSEStyle = obj.style.display;
  134 + obj.style.display = 'none';
  135 + });
  136 + jQuery('.resizer_northwest').each(function(i, obj) {
  137 + $rootScope.orginalResizerNWStyle = obj.style.display;
  138 + obj.style.display = 'none';
  139 + });
  140 + $rootScope.editor.handleEvents({type:ORYX.CONFIG.EVENT_CANVAS_SCROLL});
  141 + });
  142 +
  143 + canvasSection.scrollStopped(function(){
  144 +
  145 + // Puts the quick menu items and resizer back when scroll is stopped.
  146 +
  147 + $rootScope.editor.setSelection([]); // needed cause it checks for element changes and does nothing if the elements are the same
  148 + $rootScope.editor.setSelection($rootScope.selectedElements, $rootScope.subSelectionElements);
  149 + $rootScope.selectedElements = undefined;
  150 + $rootScope.subSelectionElements = undefined;
  151 +
  152 + function handleDisplayProperty(obj) {
  153 + if (jQuery(obj).position().top > 0) {
  154 + obj.style.display = 'block';
  155 + } else {
  156 + obj.style.display = 'none';
  157 + }
  158 + }
  159 +
  160 + jQuery('.Oryx_button').each(function(i, obj) {
  161 + handleDisplayProperty(obj);
  162 + });
  163 +
  164 + jQuery('.resizer_southeast').each(function(i, obj) {
  165 + handleDisplayProperty(obj);
  166 + });
  167 + jQuery('.resizer_northwest').each(function(i, obj) {
  168 + handleDisplayProperty(obj);
  169 + });
  170 +
  171 + });
  172 + }
  173 +
  174 + /**
  175 + * Initialize the Oryx Editor when the content has been loaded
  176 + */
  177 + $rootScope.$on('$includeContentLoaded', function (event) {
  178 + if (!$rootScope.editorInitialized) {
  179 +
  180 + ORYX._loadPlugins();
  181 +
  182 + var modelId = EDITOR.UTIL.getParameterByName('modelId');
  183 + fetchModel(modelId);
  184 +
  185 + $rootScope.window = {};
  186 + var updateWindowSize = function() {
  187 + $rootScope.window.width = $window.innerWidth;
  188 + $rootScope.window.height = $window.innerHeight;
  189 + };
  190 +
  191 + // Window resize hook
  192 + angular.element($window).bind('resize', function() {
  193 + $rootScope.safeApply(updateWindowSize());
  194 + });
  195 +
  196 + $rootScope.$watch('window.forceRefresh', function(newValue) {
  197 + if(newValue) {
  198 + $timeout(function() {
  199 + updateWindowSize();
  200 + $rootScope.window.forceRefresh = false;
  201 + });
  202 + }
  203 + });
  204 +
  205 + updateWindowSize();
  206 +
  207 + // Hook in resizing of main panels when window resizes
  208 + // TODO: perhaps move to a separate JS-file?
  209 + jQuery(window).resize(function () {
  210 +
  211 + // Calculate the offset based on the bottom of the module header
  212 + var offset = jQuery("#editor-header").offset();
  213 + var propSectionHeight = jQuery('#propertySection').height();
  214 + var canvas = jQuery('#canvasSection');
  215 + var mainHeader = jQuery('#main-header');
  216 +
  217 + if (offset == undefined || offset === null
  218 + || propSectionHeight === undefined || propSectionHeight === null
  219 + || canvas === undefined || canvas === null || mainHeader === null) {
  220 + return;
  221 + }
  222 +
  223 + if ($rootScope.editor)
  224 + {
  225 + var selectedElements = $rootScope.editor.selection;
  226 + var subSelectionElements = $rootScope.editor._subSelection;
  227 +
  228 + $rootScope.selectedElements = selectedElements;
  229 + $rootScope.subSelectionElements = subSelectionElements;
  230 + if (selectedElements && selectedElements.length > 0)
  231 + {
  232 + $rootScope.selectedElementBeforeScrolling = selectedElements[0];
  233 +
  234 + $rootScope.editor.setSelection([]); // needed cause it checks for element changes and does nothing if the elements are the same
  235 + $rootScope.editor.setSelection($rootScope.selectedElements, $rootScope.subSelectionElements);
  236 + $rootScope.selectedElements = undefined;
  237 + $rootScope.subSelectionElements = undefined;
  238 + }
  239 + }
  240 +
  241 +// var totalAvailable = jQuery(window).height() - offset.top - mainHeader.height() - 21;
  242 + var totalAvailable = jQuery(window).height() - offset.top - mainHeader.height() - 42; // 隐藏顶部标题栏,调整下fix参数 ThinkGem
  243 + canvas.height(totalAvailable - propSectionHeight);
  244 + jQuery('#paletteSection').height(totalAvailable);
  245 +
  246 + // Update positions of the resize-markers, according to the canvas
  247 +
  248 + var actualCanvas = null;
  249 + if (canvas && canvas[0].children[1]) {
  250 + actualCanvas = canvas[0].children[1];
  251 + }
  252 +
  253 + var canvasTop = canvas.position().top;
  254 + var canvasLeft = canvas.position().left;
  255 + var canvasHeight = canvas[0].clientHeight;
  256 + var canvasWidth = canvas[0].clientWidth;
  257 + var iconCenterOffset = 8;
  258 + var widthDiff = 0;
  259 +
  260 + var actualWidth = 0;
  261 + if(actualCanvas) {
  262 + // In some browsers, the SVG-element clientwidth isn't available, so we revert to the parent
  263 + actualWidth = actualCanvas.clientWidth || actualCanvas.parentNode.clientWidth;
  264 + }
  265 +
  266 +
  267 + if(actualWidth < canvas[0].clientWidth) {
  268 + widthDiff = actualWidth - canvas[0].clientWidth;
  269 + // In case the canvas is smaller than the actual viewport, the resizers should be moved
  270 + canvasLeft -= widthDiff / 2;
  271 + canvasWidth += widthDiff;
  272 + }
  273 +
  274 + var iconWidth = 17;
  275 + var iconOffset = 20;
  276 +
  277 + var north = jQuery('#canvas-grow-N');
  278 + north.css('top', canvasTop + iconOffset + 'px');
  279 + north.css('left', canvasLeft - 10 + (canvasWidth - iconWidth) / 2 + 'px');
  280 +
  281 + var south = jQuery('#canvas-grow-S');
  282 + south.css('top', (canvasTop + canvasHeight - iconOffset - iconCenterOffset) + 'px');
  283 + south.css('left', canvasLeft - 10 + (canvasWidth - iconWidth) / 2 + 'px');
  284 +
  285 + var east = jQuery('#canvas-grow-E');
  286 + east.css('top', canvasTop - 10 + (canvasHeight - iconWidth) / 2 + 'px');
  287 + east.css('left', (canvasLeft + canvasWidth - iconOffset - iconCenterOffset) + 'px');
  288 +
  289 + var west = jQuery('#canvas-grow-W');
  290 + west.css('top', canvasTop -10 + (canvasHeight - iconWidth) / 2 + 'px');
  291 + west.css('left', canvasLeft + iconOffset + 'px');
  292 +
  293 + north = jQuery('#canvas-shrink-N');
  294 + north.css('top', canvasTop + iconOffset + 'px');
  295 + north.css('left', canvasLeft + 10 + (canvasWidth - iconWidth) / 2 + 'px');
  296 +
  297 + south = jQuery('#canvas-shrink-S');
  298 + south.css('top', (canvasTop + canvasHeight - iconOffset - iconCenterOffset) + 'px');
  299 + south.css('left', canvasLeft +10 + (canvasWidth - iconWidth) / 2 + 'px');
  300 +
  301 + east = jQuery('#canvas-shrink-E');
  302 + east.css('top', canvasTop + 10 + (canvasHeight - iconWidth) / 2 + 'px');
  303 + east.css('left', (canvasLeft + canvasWidth - iconOffset - iconCenterOffset) + 'px');
  304 +
  305 + west = jQuery('#canvas-shrink-W');
  306 + west.css('top', canvasTop + 10 + (canvasHeight - iconWidth) / 2 + 'px');
  307 + west.css('left', canvasLeft + iconOffset + 'px');
  308 + });
  309 +
  310 + jQuery(window).trigger('resize');
  311 +
  312 + jQuery.fn.scrollStopped = function(callback) {
  313 + jQuery(this).scroll(function(){
  314 + var self = this, $this = jQuery(self);
  315 + if ($this.data('scrollTimeout')) {
  316 + clearTimeout($this.data('scrollTimeout'));
  317 + }
  318 + $this.data('scrollTimeout', setTimeout(callback,50,self));
  319 + });
  320 + };
  321 +
  322 + // Always needed, cause the DOM element on which the scroll event listeners are attached are changed for every new model
  323 + initScrollHandling();
  324 +
  325 + $rootScope.editorInitialized = true;
  326 + }
  327 + });
  328 +
  329 + /**
  330 + * Initialize the event bus: couple all Oryx events with a dispatch of the
  331 + * event of the event bus. This way, it gets much easier to attach custom logic
  332 + * to any event.
  333 + */
  334 +
  335 + $rootScope.editorFactory.promise.then(function() {
  336 +
  337 + KISBPM.eventBus.editor = $rootScope.editor;
  338 +
  339 + var eventMappings = [
  340 + { oryxType : ORYX.CONFIG.EVENT_SELECTION_CHANGED, kisBpmType : KISBPM.eventBus.EVENT_TYPE_SELECTION_CHANGE },
  341 + { oryxType : ORYX.CONFIG.EVENT_DBLCLICK, kisBpmType : KISBPM.eventBus.EVENT_TYPE_DOUBLE_CLICK },
  342 + { oryxType : ORYX.CONFIG.EVENT_MOUSEOUT, kisBpmType : KISBPM.eventBus.EVENT_TYPE_MOUSE_OUT },
  343 + { oryxType : ORYX.CONFIG.EVENT_MOUSEOVER, kisBpmType : KISBPM.eventBus.EVENT_TYPE_MOUSE_OVER }
  344 +
  345 + ];
  346 +
  347 + eventMappings.forEach(function(eventMapping) {
  348 + $rootScope.editor.registerOnEvent(eventMapping.oryxType, function(event) {
  349 + KISBPM.eventBus.dispatch(eventMapping.kisBpmType, event);
  350 + });
  351 + });
  352 +
  353 + $rootScope.editor.registerOnEvent(ORYX.CONFIG.EVENT_SHAPEREMOVED, function (event) {
  354 + var validateButton = document.getElementById(event.shape.resourceId + "-validate-button");
  355 + if (validateButton)
  356 + {
  357 + validateButton.style.display = 'none';
  358 + }
  359 + });
  360 +
  361 + // The Oryx canvas is ready (we know since we're in this promise callback) and the
  362 + // event bus is ready. The editor is now ready for use
  363 + KISBPM.eventBus.dispatch(KISBPM.eventBus.EVENT_TYPE_EDITOR_READY, {type : KISBPM.eventBus.EVENT_TYPE_EDITOR_READY});
  364 +
  365 + });
  366 +
  367 + // Alerts
  368 + $rootScope.alerts = {
  369 + queue: []
  370 + };
  371 +
  372 + $rootScope.showAlert = function(alert) {
  373 + if(alert.queue.length > 0) {
  374 + alert.current = alert.queue.shift();
  375 + // Start timout for message-pruning
  376 + alert.timeout = $timeout(function() {
  377 + if (alert.queue.length == 0) {
  378 + alert.current = undefined;
  379 + alert.timeout = undefined;
  380 + } else {
  381 + $rootScope.showAlert(alert);
  382 + }
  383 + }, (alert.current.type == 'error' ? 5000 : 1000));
  384 + } else {
  385 + $rootScope.alerts.current = undefined;
  386 + }
  387 + };
  388 +
  389 + $rootScope.addAlert = function(message, type) {
  390 + var newAlert = {message: message, type: type};
  391 + if (!$rootScope.alerts.timeout) {
  392 + // Timeout for message queue is not running, start one
  393 + $rootScope.alerts.queue.push(newAlert);
  394 + $rootScope.showAlert($rootScope.alerts);
  395 + } else {
  396 + $rootScope.alerts.queue.push(newAlert);
  397 + }
  398 + };
  399 +
  400 + $rootScope.dismissAlert = function() {
  401 + if (!$rootScope.alerts.timeout) {
  402 + $rootScope.alerts.current = undefined;
  403 + } else {
  404 + $timeout.cancel($rootScope.alerts.timeout);
  405 + $rootScope.alerts.timeout = undefined;
  406 + $rootScope.showAlert($rootScope.alerts);
  407 + }
  408 + };
  409 +
  410 + $rootScope.addAlertPromise = function(promise, type) {
  411 + if (promise) {
  412 + promise.then(function(data) {
  413 + $rootScope.addAlert(data, type);
  414 + });
  415 + }
  416 + };
  417 +
  418 + }
  419 + ])
  420 +
  421 + // Moment-JS date-formatting filter
  422 + .filter('dateformat', function() {
  423 + return function(date, format) {
  424 + if (date) {
  425 + if (format) {
  426 + return moment(date).format(format);
  427 + } else {
  428 + return moment(date).calendar();
  429 + }
  430 + }
  431 + return '';
  432 + };
  433 + });
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +/*
  21 + * Assignment
  22 + */
  23 +var KisBpmAssignmentCtrl = [ '$scope', '$modal', function($scope, $modal) {
  24 +
  25 + // Config for the modal window
  26 + var opts = {
  27 + template: 'editor-app/configuration/properties/assignment-popup.html?version=' + Date.now(),
  28 + scope: $scope
  29 + };
  30 +
  31 + // Open the dialog
  32 + $modal(opts);
  33 +}];
  34 +
  35 +var KisBpmAssignmentPopupCtrl = [ '$scope', function($scope) {
  36 +
  37 + // Put json representing assignment on scope
  38 + if ($scope.property.value !== undefined && $scope.property.value !== null
  39 + && $scope.property.value.assignment !== undefined
  40 + && $scope.property.value.assignment !== null)
  41 + {
  42 + $scope.assignment = $scope.property.value.assignment;
  43 + } else {
  44 + $scope.assignment = {};
  45 + }
  46 +
  47 + if ($scope.assignment.candidateUsers == undefined || $scope.assignment.candidateUsers.length == 0)
  48 + {
  49 + $scope.assignment.candidateUsers = [{value: ''}];
  50 + }
  51 +
  52 + // Click handler for + button after enum value
  53 + var userValueIndex = 1;
  54 + $scope.addCandidateUserValue = function(index) {
  55 + $scope.assignment.candidateUsers.splice(index + 1, 0, {value: 'value ' + userValueIndex++});
  56 + };
  57 +
  58 + // Click handler for - button after enum value
  59 + $scope.removeCandidateUserValue = function(index) {
  60 + $scope.assignment.candidateUsers.splice(index, 1);
  61 + };
  62 +
  63 + if ($scope.assignment.candidateGroups == undefined || $scope.assignment.candidateGroups.length == 0)
  64 + {
  65 + $scope.assignment.candidateGroups = [{value: ''}];
  66 + }
  67 +
  68 + var groupValueIndex = 1;
  69 + $scope.addCandidateGroupValue = function(index) {
  70 + $scope.assignment.candidateGroups.splice(index + 1, 0, {value: 'value ' + groupValueIndex++});
  71 + };
  72 +
  73 + // Click handler for - button after enum value
  74 + $scope.removeCandidateGroupValue = function(index) {
  75 + $scope.assignment.candidateGroups.splice(index, 1);
  76 + };
  77 +
  78 + $scope.save = function() {
  79 +
  80 + $scope.property.value = {};
  81 + handleAssignmentInput($scope);
  82 + $scope.property.value.assignment = $scope.assignment;
  83 +
  84 + $scope.updatePropertyInModel($scope.property);
  85 + $scope.close();
  86 + };
  87 +
  88 + // Close button handler
  89 + $scope.close = function() {
  90 + handleAssignmentInput($scope);
  91 + $scope.property.mode = 'read';
  92 + $scope.$hide();
  93 + };
  94 +
  95 + var handleAssignmentInput = function($scope) {
  96 + if ($scope.assignment.candidateUsers)
  97 + {
  98 + var emptyUsers = true;
  99 + var toRemoveIndexes = [];
  100 + for (var i = 0; i < $scope.assignment.candidateUsers.length; i++)
  101 + {
  102 + if ($scope.assignment.candidateUsers[i].value != '')
  103 + {
  104 + emptyUsers = false;
  105 + }
  106 + else
  107 + {
  108 + toRemoveIndexes[toRemoveIndexes.length] = i;
  109 + }
  110 + }
  111 +
  112 + for (var i = 0; i < toRemoveIndexes.length; i++)
  113 + {
  114 + $scope.assignment.candidateUsers.splice(toRemoveIndexes[i], 1);
  115 + }
  116 +
  117 + if (emptyUsers)
  118 + {
  119 + $scope.assignment.candidateUsers = undefined;
  120 + }
  121 + }
  122 +
  123 + if ($scope.assignment.candidateGroups)
  124 + {
  125 + var emptyGroups = true;
  126 + var toRemoveIndexes = [];
  127 + for (var i = 0; i < $scope.assignment.candidateGroups.length; i++)
  128 + {
  129 + if ($scope.assignment.candidateGroups[i].value != '')
  130 + {
  131 + emptyGroups = false;
  132 + }
  133 + else
  134 + {
  135 + toRemoveIndexes[toRemoveIndexes.length] = i;
  136 + }
  137 + }
  138 +
  139 + for (var i = 0; i < toRemoveIndexes.length; i++)
  140 + {
  141 + $scope.assignment.candidateGroups.splice(toRemoveIndexes[i], 1);
  142 + }
  143 +
  144 + if (emptyGroups)
  145 + {
  146 + $scope.assignment.candidateGroups = undefined;
  147 + }
  148 + }
  149 + };
  150 +}];
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +/*
  21 + * Condition expression
  22 + */
  23 +
  24 +var KisBpmConditionExpressionCtrl = [ '$scope', '$modal', function($scope, $modal) {
  25 +
  26 + // Config for the modal window
  27 + var opts = {
  28 + template: 'editor-app/configuration/properties/condition-expression-popup.html?version=' + Date.now(),
  29 + scope: $scope
  30 + };
  31 +
  32 + // Open the dialog
  33 + $modal(opts);
  34 +}];
  35 +
  36 +var KisBpmConditionExpressionPopupCtrl = [ '$scope', '$translate', '$http', function($scope, $translate, $http) {
  37 +
  38 + // Put json representing condition on scope
  39 + if ($scope.property.value !== undefined && $scope.property.value !== null) {
  40 +
  41 + $scope.conditionExpression = {value: $scope.property.value};
  42 +
  43 + } else {
  44 + $scope.conditionExpression = {value: ''};
  45 + }
  46 +
  47 + $scope.save = function() {
  48 + $scope.property.value = $scope.conditionExpression.value;
  49 + $scope.updatePropertyInModel($scope.property);
  50 + $scope.close();
  51 + };
  52 +
  53 + // Close button handler
  54 + $scope.close = function() {
  55 + $scope.property.mode = 'read';
  56 + $scope.$hide();
  57 + };
  58 +}];
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +/*
  21 + * String controller
  22 + */
  23 +
  24 +var KisBpmStringPropertyCtrl = [ '$scope', function ($scope) {
  25 +
  26 + $scope.shapeId = $scope.selectedShape.id;
  27 + $scope.valueFlushed = false;
  28 + /** Handler called when input field is blurred */
  29 + $scope.inputBlurred = function() {
  30 + $scope.valueFlushed = true;
  31 + if ($scope.property.value) {
  32 + $scope.property.value = $scope.property.value.replace(/(<([^>]+)>)/ig,"");
  33 + }
  34 + $scope.updatePropertyInModel($scope.property);
  35 + };
  36 +
  37 + $scope.enterPressed = function(keyEvent) {
  38 + if (keyEvent && keyEvent.which === 13) {
  39 + keyEvent.preventDefault();
  40 + $scope.inputBlurred(); // we want to do the same as if the user would blur the input field
  41 + }
  42 + };
  43 +
  44 + $scope.$on('$destroy', function controllerDestroyed() {
  45 + if(!$scope.valueFlushed) {
  46 + if ($scope.property.value) {
  47 + $scope.property.value = $scope.property.value.replace(/(<([^>]+)>)/ig,"");
  48 + }
  49 + $scope.updatePropertyInModel($scope.property, $scope.shapeId);
  50 + }
  51 + });
  52 +
  53 +}];
  54 +
  55 +/*
  56 + * Boolean controller
  57 + */
  58 +
  59 +var KisBpmBooleanPropertyCtrl = ['$scope', function ($scope) {
  60 +
  61 + $scope.changeValue = function() {
  62 + if ($scope.property.key === 'oryx-defaultflow' && $scope.property.value) {
  63 + var selectedShape = $scope.selectedShape;
  64 + if (selectedShape) {
  65 + var incomingNodes = selectedShape.getIncomingShapes();
  66 + if (incomingNodes && incomingNodes.length > 0) {
  67 + // get first node, since there can be only one for a sequence flow
  68 + var rootNode = incomingNodes[0];
  69 + var flows = rootNode.getOutgoingShapes();
  70 + if (flows && flows.length > 1) {
  71 + // in case there are more flows, check if another flow is already defined as default
  72 + for (var i = 0; i < flows.length; i++) {
  73 + if (flows[i].resourceId != selectedShape.resourceId) {
  74 + var defaultFlowProp = flows[i].properties['oryx-defaultflow'];
  75 + if (defaultFlowProp) {
  76 + flows[i].setProperty('oryx-defaultflow', false, true);
  77 + }
  78 + }
  79 + }
  80 + }
  81 + }
  82 + }
  83 + }
  84 + $scope.updatePropertyInModel($scope.property);
  85 + };
  86 +
  87 +}];
  88 +
  89 +/*
  90 + * Text controller
  91 + */
  92 +
  93 +var KisBpmTextPropertyCtrl = [ '$scope', '$modal', function($scope, $modal) {
  94 +
  95 + var opts = {
  96 + template: 'editor-app/configuration/properties/text-popup.html?version=' + Date.now(),
  97 + scope: $scope
  98 + };
  99 +
  100 + // Open the dialog
  101 + $modal(opts);
  102 +}];
  103 +
  104 +var KisBpmTextPropertyPopupCtrl = ['$scope', function($scope) {
  105 +
  106 + $scope.save = function() {
  107 + $scope.updatePropertyInModel($scope.property);
  108 + $scope.close();
  109 + };
  110 +
  111 + $scope.close = function() {
  112 + $scope.property.mode = 'read';
  113 + $scope.$hide();
  114 + };
  115 +}];
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +/*
  21 + * Execution listeners
  22 + */
  23 +
  24 +var KisBpmEventListenersCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
  25 +
  26 + // Config for the modal window
  27 + var opts = {
  28 + template: 'editor-app/configuration/properties/event-listeners-popup.html?version=' + Date.now(),
  29 + scope: $scope
  30 + };
  31 +
  32 + // Open the dialog
  33 + $modal(opts);
  34 +}];
  35 +
  36 +//Need a separate controller for the modal window due to https://github.com/angular-ui/bootstrap/issues/259
  37 +// Will be fixed in a newer version of Angular UI
  38 +var KisBpmEventListenersPopupCtrl = [ '$scope', '$q', '$translate', function($scope, $q, $translate) {
  39 +
  40 + // Put json representing form properties on scope
  41 + if ($scope.property.value !== undefined && $scope.property.value !== null
  42 + && $scope.property.value.eventListeners !== undefined
  43 + && $scope.property.value.eventListeners !== null) {
  44 +
  45 + if ($scope.property.value.eventListeners.constructor == String)
  46 + {
  47 + $scope.eventListeners = JSON.parse($scope.property.value.eventListeners);
  48 + }
  49 + else
  50 + {
  51 + // Note that we clone the json object rather then setting it directly,
  52 + // this to cope with the fact that the user can click the cancel button and no changes should have happened
  53 + $scope.eventListeners = angular.copy($scope.property.value.eventListeners);
  54 + }
  55 +
  56 + } else {
  57 + $scope.eventListeners = [];
  58 + }
  59 +
  60 + // Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
  61 + $scope.selectedListeners = [];
  62 + $scope.translationsRetrieved = false;
  63 +
  64 + $scope.labels = {};
  65 +
  66 + var eventPromise = $translate('PROPERTY.EXECUTIONLISTENERS.EVENT');
  67 + var implementationPromise = $translate('PROPERTY.EXECUTIONLISTENERS.FIELDS.IMPLEMENTATION');
  68 + var namePromise = $translate('PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME');
  69 +
  70 + $q.all([eventPromise, implementationPromise, namePromise]).then(function(results) {
  71 + $scope.labels.eventLabel = results[0];
  72 + $scope.labels.implementationLabel = results[1];
  73 + $scope.labels.nameLabel = results[2];
  74 + $scope.translationsRetrieved = true;
  75 +
  76 + // Config for grid
  77 + $scope.gridOptions = {
  78 + data: 'eventListeners',
  79 + enableRowReordering: true,
  80 + headerRowHeight: 28,
  81 + multiSelect: false,
  82 + keepLastSelected : false,
  83 + selectedItems: $scope.selectedListeners,
  84 + afterSelectionChange: function (rowItem, event) {
  85 +
  86 + if ($scope.selectedListeners.length > 0)
  87 + {
  88 + var fields = $scope.selectedListeners[0].fields;
  89 + if (fields !== undefined && fields !== null)
  90 + {
  91 + for (var i = 0; i < fields.length; i++)
  92 + {
  93 + var field = fields[i];
  94 + if (field.stringValue !== undefined && field.stringValue !== '')
  95 + {
  96 + field.implementation = field.stringValue;
  97 + }
  98 + else if (field.expression !== undefined && field.expression !== '')
  99 + {
  100 + field.implementation = field.expression;
  101 + }
  102 + else if (field.string !== undefined && field.string !== '')
  103 + {
  104 + field.implementation = field.string;
  105 + }
  106 + }
  107 + }
  108 +
  109 + if (!$scope.selectedListeners[0].events || $scope.selectedListeners[0].events.length == 0)
  110 + {
  111 + $scope.selectedListeners[0].events = [{event: ''}];
  112 + }
  113 + }
  114 + },
  115 + columnDefs: [{ field: 'event', displayName: $scope.labels.eventLabel },
  116 + { field: 'implementation', displayName: $scope.labels.implementationLabel }]
  117 + };
  118 + });
  119 +
  120 + // Click handler for + button after enum value
  121 + $scope.addEventValue = function(index) {
  122 + $scope.selectedListeners[0].events.splice(index + 1, 0, {event: ''});
  123 + };
  124 +
  125 + // Click handler for - button after enum value
  126 + $scope.removeEventValue = function(index) {
  127 + $scope.selectedListeners[0].events.splice(index, 1);
  128 + $scope.listenerDetailsChanged();
  129 + };
  130 +
  131 + $scope.listenerDetailsChanged = function() {
  132 + var listener = $scope.selectedListeners[0];
  133 + if (listener.events)
  134 + {
  135 + var eventText = '';
  136 + for (var i = 0; i < listener.events.length; i++)
  137 + {
  138 + if (i > 0)
  139 + {
  140 + eventText += ", ";
  141 + }
  142 + eventText += listener.events[i].event;
  143 + }
  144 + $scope.selectedListeners[0].event = eventText;
  145 + }
  146 +
  147 + if (listener.rethrowEvent)
  148 + {
  149 + var implementationText = '';
  150 + if (listener.rethrowType && listener.rethrowType.length > 0)
  151 + {
  152 + if (listener.rethrowType === 'error' && listener.errorcode !== '')
  153 + {
  154 + implementationText = "Rethrow as error " + listener.errorcode;
  155 + }
  156 + else if (listener.rethrowType === 'message' && listener.messagename !== '')
  157 + {
  158 + implementationText = "Rethrow as message " + listener.messagename;
  159 + }
  160 + else if ((listener.rethrowType === 'signal' || listener.rethrowType === 'globalSignal') && listener.signalname !== '')
  161 + {
  162 + implementationText = "Rethrow as signal " + listener.signalname;
  163 + }
  164 + }
  165 + $scope.selectedListeners[0].implementation = implementationText;
  166 + }
  167 + else
  168 + {
  169 + if ($scope.selectedListeners[0].className !== '')
  170 + {
  171 + $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].className;
  172 + }
  173 + else if ($scope.selectedListeners[0].delegateExpression !== '')
  174 + {
  175 + $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].delegateExpression;
  176 + }
  177 + else
  178 + {
  179 + $scope.selectedListeners[0].implementation = '';
  180 + }
  181 + }
  182 + };
  183 +
  184 + // Click handler for add button
  185 + $scope.addNewListener = function() {
  186 + $scope.eventListeners.push({ event : '',
  187 + implementation : '',
  188 + className : '',
  189 + delegateExpression: '',
  190 + retrowEvent: false});
  191 + };
  192 +
  193 + // Click handler for remove button
  194 + $scope.removeListener = function() {
  195 + if ($scope.selectedListeners.length > 0) {
  196 + var index = $scope.eventListeners.indexOf($scope.selectedListeners[0]);
  197 + $scope.gridOptions.selectItem(index, false);
  198 + $scope.eventListeners.splice(index, 1);
  199 +
  200 + $scope.selectedListeners.length = 0;
  201 + if (index < $scope.eventListeners.length) {
  202 + $scope.gridOptions.selectItem(index + 1, true);
  203 + } else if ($scope.eventListeners.length > 0) {
  204 + $scope.gridOptions.selectItem(index - 1, true);
  205 + }
  206 + }
  207 + };
  208 +
  209 + // Click handler for up button
  210 + $scope.moveListenerUp = function() {
  211 + if ($scope.selectedListeners.length > 0) {
  212 + var index = $scope.eventListeners.indexOf($scope.selectedListeners[0]);
  213 + if (index != 0) { // If it's the first, no moving up of course
  214 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  215 + var temp = $scope.eventListeners[index];
  216 + $scope.eventListeners.splice(index, 1);
  217 + $timeout(function(){
  218 + $scope.eventListeners.splice(index + -1, 0, temp);
  219 + }, 100);
  220 +
  221 + }
  222 + }
  223 + };
  224 +
  225 + // Click handler for down button
  226 + $scope.moveListenerDown = function() {
  227 + if ($scope.selectedListeners.length > 0) {
  228 + var index = $scope.eventListeners.indexOf($scope.selectedListeners[0]);
  229 + if (index != $scope.eventListeners.length - 1) { // If it's the last element, no moving down of course
  230 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  231 + var temp = $scope.eventListeners[index];
  232 + $scope.eventListeners.splice(index, 1);
  233 + $timeout(function(){
  234 + $scope.eventListeners.splice(index + 1, 0, temp);
  235 + }, 100);
  236 +
  237 + }
  238 + }
  239 + };
  240 +
  241 + // Click handler for save button
  242 + $scope.save = function() {
  243 +
  244 + if ($scope.eventListeners.length > 0) {
  245 + $scope.property.value = {};
  246 + $scope.property.value.eventListeners = $scope.eventListeners;
  247 + } else {
  248 + $scope.property.value = null;
  249 + }
  250 +
  251 + $scope.updatePropertyInModel($scope.property);
  252 + $scope.close();
  253 + };
  254 +
  255 + $scope.cancel = function() {
  256 + $scope.property.mode = 'read';
  257 + $scope.$hide();
  258 + };
  259 +
  260 + // Close button handler
  261 + $scope.close = function() {
  262 + $scope.property.mode = 'read';
  263 + $scope.$hide();
  264 + };
  265 +
  266 +}];
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +/*
  21 + * Execution listeners
  22 + */
  23 +
  24 +var KisBpmExecutionListenersCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
  25 +
  26 + // Config for the modal window
  27 + var opts = {
  28 + template: 'editor-app/configuration/properties/execution-listeners-popup.html?version=' + Date.now(),
  29 + scope: $scope
  30 + };
  31 +
  32 + // Open the dialog
  33 + $modal(opts);
  34 +}];
  35 +
  36 +var KisBpmExecutionListenersPopupCtrl = [ '$scope', '$q', '$translate', function($scope, $q, $translate) {
  37 +
  38 + // Put json representing form properties on scope
  39 + if ($scope.property.value !== undefined && $scope.property.value !== null
  40 + && $scope.property.value.executionListeners !== undefined
  41 + && $scope.property.value.executionListeners !== null) {
  42 +
  43 + if ($scope.property.value.executionListeners.constructor == String)
  44 + {
  45 + $scope.executionListeners = JSON.parse($scope.property.value.executionListeners);
  46 + }
  47 + else
  48 + {
  49 + // Note that we clone the json object rather then setting it directly,
  50 + // this to cope with the fact that the user can click the cancel button and no changes should have happened
  51 + $scope.executionListeners = angular.copy($scope.property.value.executionListeners);
  52 + }
  53 +
  54 + for (var i = 0; i < $scope.executionListeners.length; i++)
  55 + {
  56 + var executionListener = $scope.executionListeners[i];
  57 + if (executionListener.className !== undefined && executionListener.className !== '')
  58 + {
  59 + executionListener.implementation = executionListener.className;
  60 + }
  61 + else if (executionListener.expression !== undefined && executionListener.expression !== '')
  62 + {
  63 + executionListener.implementation = executionListener.expression;
  64 + }
  65 + else if (executionListener.delegateExpression !== undefined && executionListener.delegateExpression !== '')
  66 + {
  67 + executionListener.implementation = executionListener.delegateExpression;
  68 + }
  69 + }
  70 + } else {
  71 + $scope.executionListeners = [];
  72 + }
  73 +
  74 + // Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
  75 + $scope.selectedListeners = [];
  76 + $scope.selectedFields = [];
  77 + $scope.translationsRetrieved = false;
  78 +
  79 + $scope.labels = {};
  80 +
  81 + var eventPromise = $translate('PROPERTY.EXECUTIONLISTENERS.EVENT');
  82 + var implementationPromise = $translate('PROPERTY.EXECUTIONLISTENERS.FIELDS.IMPLEMENTATION');
  83 + var namePromise = $translate('PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME');
  84 +
  85 + $q.all([eventPromise, implementationPromise, namePromise]).then(function(results) {
  86 + $scope.labels.eventLabel = results[0];
  87 + $scope.labels.implementationLabel = results[1];
  88 + $scope.labels.nameLabel = results[2];
  89 + $scope.translationsRetrieved = true;
  90 +
  91 + // Config for grid
  92 + $scope.gridOptions = {
  93 + data: 'executionListeners',
  94 + enableRowReordering: true,
  95 + headerRowHeight: 28,
  96 + multiSelect: false,
  97 + keepLastSelected : false,
  98 + selectedItems: $scope.selectedListeners,
  99 + afterSelectionChange: function (rowItem, event) {
  100 + $scope.selectedFields.length = 0;
  101 + if ($scope.selectedListeners.length > 0)
  102 + {
  103 + var fields = $scope.selectedListeners[0].fields;
  104 + if (fields !== undefined && fields !== null)
  105 + {
  106 + for (var i = 0; i < fields.length; i++)
  107 + {
  108 + var field = fields[i];
  109 + if (field.stringValue !== undefined && field.stringValue !== '')
  110 + {
  111 + field.implementation = field.stringValue;
  112 + }
  113 + else if (field.expression !== undefined && field.expression !== '')
  114 + {
  115 + field.implementation = field.expression;
  116 + }
  117 + else if (field.string !== undefined && field.string !== '')
  118 + {
  119 + field.implementation = field.string;
  120 + }
  121 + }
  122 + }
  123 + }
  124 + },
  125 + columnDefs: [{ field: 'event', displayName: $scope.labels.eventLabel },
  126 + { field: 'implementation', displayName: $scope.labels.implementationLabel }]
  127 + };
  128 +
  129 + // Config for field grid
  130 + $scope.gridFieldOptions = {
  131 + data: 'selectedListeners[0].fields',
  132 + enableRowReordering: true,
  133 + headerRowHeight: 28,
  134 + multiSelect: false,
  135 + keepLastSelected : false,
  136 + selectedItems: $scope.selectedFields,
  137 + columnDefs: [{ field: 'name', displayName: $scope.labels.nameLabel },
  138 + { field: 'implementation', displayName: $scope.labels.implementationLabel}]
  139 + };
  140 + });
  141 +
  142 + $scope.listenerDetailsChanged = function() {
  143 + if ($scope.selectedListeners[0].className !== '')
  144 + {
  145 + $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].className;
  146 + }
  147 + else if ($scope.selectedListeners[0].expression !== '')
  148 + {
  149 + $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].expression;
  150 + }
  151 + else if ($scope.selectedListeners[0].delegateExpression !== '')
  152 + {
  153 + $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].delegateExpression;
  154 + }
  155 + else
  156 + {
  157 + $scope.selectedListeners[0].implementation = '';
  158 + }
  159 + };
  160 +
  161 + // Click handler for add button
  162 + $scope.addNewListener = function() {
  163 + $scope.executionListeners.push({ event : 'start',
  164 + implementation : '',
  165 + className : '',
  166 + expression: '',
  167 + delegateExpression: ''});
  168 + };
  169 +
  170 + // Click handler for remove button
  171 + $scope.removeListener = function() {
  172 + if ($scope.selectedListeners.length > 0) {
  173 + var index = $scope.executionListeners.indexOf($scope.selectedListeners[0]);
  174 + $scope.gridOptions.selectItem(index, false);
  175 + $scope.executionListeners.splice(index, 1);
  176 +
  177 + $scope.selectedListeners.length = 0;
  178 + if (index < $scope.executionListeners.length) {
  179 + $scope.gridOptions.selectItem(index + 1, true);
  180 + } else if ($scope.executionListeners.length > 0) {
  181 + $scope.gridOptions.selectItem(index - 1, true);
  182 + }
  183 + }
  184 + };
  185 +
  186 + // Click handler for up button
  187 + $scope.moveListenerUp = function() {
  188 + if ($scope.selectedListeners.length > 0) {
  189 + var index = $scope.executionListeners.indexOf($scope.selectedListeners[0]);
  190 + if (index != 0) { // If it's the first, no moving up of course
  191 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  192 + var temp = $scope.executionListeners[index];
  193 + $scope.executionListeners.splice(index, 1);
  194 + $timeout(function(){
  195 + $scope.executionListeners.splice(index + -1, 0, temp);
  196 + }, 100);
  197 +
  198 + }
  199 + }
  200 + };
  201 +
  202 + // Click handler for down button
  203 + $scope.moveListenerDown = function() {
  204 + if ($scope.selectedListeners.length > 0) {
  205 + var index = $scope.executionListeners.indexOf($scope.selectedListeners[0]);
  206 + if (index != $scope.executionListeners.length - 1) { // If it's the last element, no moving down of course
  207 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  208 + var temp = $scope.executionListeners[index];
  209 + $scope.executionListeners.splice(index, 1);
  210 + $timeout(function(){
  211 + $scope.executionListeners.splice(index + 1, 0, temp);
  212 + }, 100);
  213 +
  214 + }
  215 + }
  216 + };
  217 +
  218 + $scope.fieldDetailsChanged = function() {
  219 + if ($scope.selectedFields[0].stringValue !== '')
  220 + {
  221 + $scope.selectedFields[0].implementation = $scope.selectedFields[0].stringValue;
  222 + }
  223 + else if ($scope.selectedFields[0].expression !== '')
  224 + {
  225 + $scope.selectedFields[0].implementation = $scope.selectedFields[0].expression;
  226 + }
  227 + else if ($scope.selectedFields[0].string !== '')
  228 + {
  229 + $scope.selectedFields[0].implementation = $scope.selectedFields[0].string;
  230 + }
  231 + else
  232 + {
  233 + $scope.selectedFields[0].implementation = '';
  234 + }
  235 + };
  236 +
  237 + // Click handler for add button
  238 + $scope.addNewField = function() {
  239 + if ($scope.selectedListeners.length > 0)
  240 + {
  241 + if ($scope.selectedListeners[0].fields == undefined)
  242 + {
  243 + $scope.selectedListeners[0].fields = [];
  244 + }
  245 + $scope.selectedListeners[0].fields.push({ name : 'fieldName',
  246 + implementation : '',
  247 + stringValue : '',
  248 + expression: '',
  249 + string: ''});
  250 + }
  251 + };
  252 +
  253 + // Click handler for remove button
  254 + $scope.removeField = function() {
  255 + if ($scope.selectedFields.length > 0) {
  256 + var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
  257 + $scope.gridFieldOptions.selectItem(index, false);
  258 + $scope.selectedListeners[0].fields.splice(index, 1);
  259 +
  260 + $scope.selectedFields.length = 0;
  261 + if (index < $scope.selectedListeners[0].fields.length) {
  262 + $scope.gridFieldOptions.selectItem(index + 1, true);
  263 + } else if ($scope.selectedListeners[0].fields.length > 0) {
  264 + $scope.gridFieldOptions.selectItem(index - 1, true);
  265 + }
  266 + }
  267 + };
  268 +
  269 + // Click handler for up button
  270 + $scope.moveFieldUp = function() {
  271 + if ($scope.selectedFields.length > 0) {
  272 + var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
  273 + if (index != 0) { // If it's the first, no moving up of course
  274 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  275 + var temp = $scope.selectedListeners[0].fields[index];
  276 + $scope.selectedListeners[0].fields.splice(index, 1);
  277 + $timeout(function(){
  278 + $scope.selectedListeners[0].fields.splice(index + -1, 0, temp);
  279 + }, 100);
  280 +
  281 + }
  282 + }
  283 + };
  284 +
  285 + // Click handler for down button
  286 + $scope.moveFieldDown = function() {
  287 + if ($scope.selectedFields.length > 0) {
  288 + var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
  289 + if (index != $scope.selectedListeners[0].fields.length - 1) { // If it's the last element, no moving down of course
  290 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  291 + var temp = $scope.selectedListeners[0].fields[index];
  292 + $scope.selectedListeners[0].fields.splice(index, 1);
  293 + $timeout(function(){
  294 + $scope.selectedListeners[0].fields.splice(index + 1, 0, temp);
  295 + }, 100);
  296 +
  297 + }
  298 + }
  299 + };
  300 +
  301 + // Click handler for save button
  302 + $scope.save = function() {
  303 +
  304 + if ($scope.executionListeners.length > 0) {
  305 + $scope.property.value = {};
  306 + $scope.property.value.executionListeners = $scope.executionListeners;
  307 + } else {
  308 + $scope.property.value = null;
  309 + }
  310 +
  311 + $scope.updatePropertyInModel($scope.property);
  312 + $scope.close();
  313 + };
  314 +
  315 + $scope.cancel = function() {
  316 + $scope.$hide();
  317 + $scope.property.mode = 'read';
  318 + };
  319 +
  320 + // Close button handler
  321 + $scope.close = function() {
  322 + $scope.$hide();
  323 + $scope.property.mode = 'read';
  324 + };
  325 +
  326 +}];
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +/*
  21 + * Task listeners
  22 + */
  23 +
  24 +var KisBpmFieldsCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
  25 +
  26 + // Config for the modal window
  27 + var opts = {
  28 + template: 'editor-app/configuration/properties/fields-popup.html',
  29 + scope: $scope
  30 + };
  31 +
  32 + // Open the dialog
  33 + $modal(opts);
  34 +}];
  35 +
  36 +var KisBpmFieldsPopupCtrl = [ '$scope', '$q', '$translate', function($scope, $q, $translate) {
  37 +
  38 + // Put json representing form properties on scope
  39 + if ($scope.property.value !== undefined && $scope.property.value !== null
  40 + && $scope.property.value.fields !== undefined
  41 + && $scope.property.value.fields !== null) {
  42 + // Note that we clone the json object rather then setting it directly,
  43 + // this to cope with the fact that the user can click the cancel button and no changes should have happened
  44 + $scope.fields = angular.copy($scope.property.value.fields);
  45 +
  46 + for (var i = 0; i < $scope.fields.length; i++)
  47 + {
  48 + var field = $scope.fields[i];
  49 + if (field.stringValue !== undefined && field.stringValue !== '')
  50 + {
  51 + field.implementation = field.stringValue;
  52 + }
  53 + else if (field.expression !== undefined && field.expression !== '')
  54 + {
  55 + field.implementation = field.expression;
  56 + }
  57 + else if (field.string !== undefined && field.string !== '')
  58 + {
  59 + field.implementation = field.string;
  60 + }
  61 + }
  62 +
  63 + } else {
  64 + $scope.fields = [];
  65 + }
  66 +
  67 + // Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
  68 + $scope.selectedFields = [];
  69 + $scope.translationsRetrieved = false;
  70 + $scope.labels = {};
  71 +
  72 + var namePromise = $translate('PROPERTY.FIELDS.NAME');
  73 + var implementationPromise = $translate('PROPERTY.FIELDS.IMPLEMENTATION');
  74 +
  75 + $q.all([namePromise, implementationPromise]).then(function(results) {
  76 + $scope.labels.nameLabel = results[0];
  77 + $scope.labels.implementationLabel = results[1];
  78 + $scope.translationsRetrieved = true;
  79 +
  80 + // Config for grid
  81 + $scope.gridOptions = {
  82 + data: 'fields',
  83 + enableRowReordering: true,
  84 + headerRowHeight: 28,
  85 + multiSelect: false,
  86 + keepLastSelected: false,
  87 + selectedItems: $scope.selectedFields,
  88 + columnDefs: [{field: 'name', displayName: $scope.labels.nameLabel},
  89 + {field: 'implementation', displayName: $scope.labels.implementationLabel}]
  90 + };
  91 + });
  92 +
  93 + $scope.fieldDetailsChanged = function() {
  94 + if ($scope.selectedFields[0].stringValue != '')
  95 + {
  96 + $scope.selectedFields[0].implementation = $scope.selectedFields[0].stringValue;
  97 + }
  98 + else if ($scope.selectedFields[0].expression != '')
  99 + {
  100 + $scope.selectedFields[0].implementation = $scope.selectedFields[0].expression;
  101 + }
  102 + else if ($scope.selectedFields[0].string != '')
  103 + {
  104 + $scope.selectedFields[0].implementation = $scope.selectedFields[0].string;
  105 + }
  106 + else
  107 + {
  108 + $scope.selectedFields[0].implementation = '';
  109 + }
  110 + };
  111 +
  112 + // Click handler for add button
  113 + $scope.addNewField = function() {
  114 + $scope.fields.push({ name : 'fieldName',
  115 + implementation : '',
  116 + stringValue : '',
  117 + expression: '',
  118 + string: ''});
  119 + };
  120 +
  121 + // Click handler for remove button
  122 + $scope.removeField = function() {
  123 + if ($scope.selectedFields.length > 0) {
  124 + var index = $scope.fields.indexOf($scope.selectedFields[0]);
  125 + $scope.gridOptions.selectItem(index, false);
  126 + $scope.fields.splice(index, 1);
  127 +
  128 + $scope.selectedFields.length = 0;
  129 + if (index < $scope.fields.length) {
  130 + $scope.gridOptions.selectItem(index + 1, true);
  131 + } else if ($scope.fields.length > 0) {
  132 + $scope.gridOptions.selectItem(index - 1, true);
  133 + }
  134 + }
  135 + };
  136 +
  137 + // Click handler for up button
  138 + $scope.moveFieldUp = function() {
  139 + if ($scope.selectedFields.length > 0) {
  140 + var index = $scope.fields.indexOf($scope.selectedFields[0]);
  141 + if (index != 0) { // If it's the first, no moving up of course
  142 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  143 + var temp = $scope.fields[index];
  144 + $scope.fields.splice(index, 1);
  145 + $timeout(function(){
  146 + $scope.fields.splice(index + -1, 0, temp);
  147 + }, 100);
  148 +
  149 + }
  150 + }
  151 + };
  152 +
  153 + // Click handler for down button
  154 + $scope.moveFieldDown = function() {
  155 + if ($scope.selectedFields.length > 0) {
  156 + var index = $scope.fields.indexOf($scope.selectedFields[0]);
  157 + if (index != $scope.fields.length - 1) { // If it's the last element, no moving down of course
  158 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  159 + var temp = $scope.fields[index];
  160 + $scope.fields.splice(index, 1);
  161 + $timeout(function(){
  162 + $scope.fields.splice(index + 1, 0, temp);
  163 + }, 100);
  164 +
  165 + }
  166 + }
  167 + };
  168 +
  169 + // Click handler for save button
  170 + $scope.save = function() {
  171 +
  172 + if ($scope.fields.length > 0) {
  173 + $scope.property.value = {};
  174 + $scope.property.value.fields = $scope.fields;
  175 + } else {
  176 + $scope.property.value = null;
  177 + }
  178 +
  179 + $scope.updatePropertyInModel($scope.property);
  180 + $scope.close();
  181 + };
  182 +
  183 + $scope.cancel = function() {
  184 + $scope.close();
  185 + };
  186 +
  187 + // Close button handler
  188 + $scope.close = function() {
  189 + $scope.property.mode = 'read';
  190 + $scope.$hide();
  191 + };
  192 +}];
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +/*
  21 + * Form Properties
  22 + */
  23 +
  24 +var KisBpmFormPropertiesCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
  25 +
  26 + // Config for the modal window
  27 + var opts = {
  28 + template: 'editor-app/configuration/properties/form-properties-popup.html?version=' + Date.now(),
  29 + scope: $scope
  30 + };
  31 +
  32 + // Open the dialog
  33 + $modal(opts);
  34 +}];
  35 +
  36 +var KisBpmFormPropertiesPopupCtrl = ['$scope', '$q', '$translate', '$timeout', function($scope, $q, $translate, $timeout) {
  37 +
  38 + // Put json representing form properties on scope
  39 + if ($scope.property.value !== undefined && $scope.property.value !== null
  40 + && $scope.property.value.formProperties !== undefined
  41 + && $scope.property.value.formProperties !== null) {
  42 + // Note that we clone the json object rather then setting it directly,
  43 + // this to cope with the fact that the user can click the cancel button and no changes should have happended
  44 + $scope.formProperties = angular.copy($scope.property.value.formProperties);
  45 +
  46 + for (var i = 0; i < $scope.formProperties.length; i++) {
  47 + var formProperty = $scope.formProperties[i];
  48 + if (formProperty.enumValues && formProperty.enumValues.length > 0) {
  49 + for (var j = 0; j < formProperty.enumValues.length; j++) {
  50 + var enumValue = formProperty.enumValues[j];
  51 + if (!enumValue.id && !enumValue.name && enumValue.value) {
  52 + enumValue.id = enumValue.value;
  53 + enumValue.name = enumValue.value;
  54 + }
  55 + }
  56 + }
  57 + }
  58 +
  59 + } else {
  60 + $scope.formProperties = [];
  61 + }
  62 +
  63 + // Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
  64 + $scope.selectedProperties = [];
  65 + $scope.selectedEnumValues = [];
  66 +
  67 + $scope.translationsRetrieved = false;
  68 +
  69 + $scope.labels = {};
  70 +
  71 + var idPromise = $translate('PROPERTY.FORMPROPERTIES.ID');
  72 + var namePromise = $translate('PROPERTY.FORMPROPERTIES.NAME');
  73 + var typePromise = $translate('PROPERTY.FORMPROPERTIES.TYPE');
  74 +
  75 + $q.all([idPromise, namePromise, typePromise]).then(function(results) {
  76 + $scope.labels.idLabel = results[0];
  77 + $scope.labels.nameLabel = results[1];
  78 + $scope.labels.typeLabel = results[2];
  79 + $scope.translationsRetrieved = true;
  80 +
  81 + // Config for grid
  82 + $scope.gridOptions = {
  83 + data: 'formProperties',
  84 + enableRowReordering: true,
  85 + headerRowHeight: 28,
  86 + multiSelect: false,
  87 + keepLastSelected : false,
  88 + selectedItems: $scope.selectedProperties,
  89 + columnDefs: [{ field: 'id', displayName: $scope.labels.idLabel },
  90 + { field: 'name', displayName: $scope.labels.nameLabel},
  91 + { field: 'type', displayName: $scope.labels.typeLabel}]
  92 + };
  93 +
  94 + $scope.enumGridOptions = {
  95 + data: 'selectedProperties[0].enumValues',
  96 + enableRowReordering: true,
  97 + headerRowHeight: 28,
  98 + multiSelect: false,
  99 + keepLastSelected : false,
  100 + selectedItems: $scope.selectedEnumValues,
  101 + columnDefs: [{ field: 'id', displayName: $scope.labels.idLabel },
  102 + { field: 'name', displayName: $scope.labels.nameLabel}]
  103 + }
  104 + });
  105 +
  106 + // Handler for when the value of the type dropdown changes
  107 + $scope.propertyTypeChanged = function() {
  108 +
  109 + // Check date. If date, show date pattern
  110 + if ($scope.selectedProperties[0].type === 'date') {
  111 + $scope.selectedProperties[0].datePattern = 'MM-dd-yyyy hh:mm';
  112 +
  113 + } else {
  114 + delete $scope.selectedProperties[0].datePattern;
  115 + }
  116 +
  117 + // Check enum. If enum, show list of options
  118 + if ($scope.selectedProperties[0].type === 'enum') {
  119 + $scope.selectedProperties[0].enumValues = [ {id: 'value1', name: 'Value 1'}, {id: 'value2', name: 'Value 2'}];
  120 +
  121 + } else {
  122 + delete $scope.selectedProperties[0].enumValues;
  123 + }
  124 + };
  125 +
  126 + // Click handler for add button
  127 + var propertyIndex = 1;
  128 + $scope.addNewProperty = function() {
  129 + $scope.formProperties.push({ id : 'new_property_' + propertyIndex++,
  130 + name : '',
  131 + type : 'string',
  132 + readable: true,
  133 + writable: true});
  134 +
  135 + $timeout(function(){
  136 + $scope.gridOptions.selectItem($scope.formProperties.length - 1, true);
  137 + });
  138 + };
  139 +
  140 + // Click handler for remove button
  141 + $scope.removeProperty = function() {
  142 + if ($scope.selectedProperties.length > 0) {
  143 + var index = $scope.formProperties.indexOf($scope.selectedProperties[0]);
  144 + $scope.gridOptions.selectItem(index, false);
  145 + $scope.formProperties.splice(index, 1);
  146 +
  147 + $scope.selectedProperties.length = 0;
  148 + if (index < $scope.formProperties.length) {
  149 + $scope.gridOptions.selectItem(index + 1, true);
  150 + } else if ($scope.formProperties.length > 0) {
  151 + $scope.gridOptions.selectItem(index - 1, true);
  152 + }
  153 + }
  154 + };
  155 +
  156 + // Click handler for up button
  157 + $scope.movePropertyUp = function() {
  158 + if ($scope.selectedProperties.length > 0) {
  159 + var index = $scope.formProperties.indexOf($scope.selectedProperties[0]);
  160 + if (index != 0) { // If it's the first, no moving up of course
  161 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  162 + var temp = $scope.formProperties[index];
  163 + $scope.formProperties.splice(index, 1);
  164 + $timeout(function(){
  165 + $scope.formProperties.splice(index + -1, 0, temp);
  166 + }, 100);
  167 +
  168 + }
  169 + }
  170 + };
  171 +
  172 + // Click handler for down button
  173 + $scope.movePropertyDown = function() {
  174 + if ($scope.selectedProperties.length > 0) {
  175 + var index = $scope.formProperties.indexOf($scope.selectedProperties[0]);
  176 + if (index != $scope.formProperties.length - 1) { // If it's the last element, no moving down of course
  177 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  178 + var temp = $scope.formProperties[index];
  179 + $scope.formProperties.splice(index, 1);
  180 + $timeout(function(){
  181 + $scope.formProperties.splice(index + 1, 0, temp);
  182 + }, 100);
  183 +
  184 + }
  185 + }
  186 + };
  187 +
  188 + $scope.addNewEnumValue = function() {
  189 + if ($scope.selectedProperties.length > 0) {
  190 + $scope.selectedProperties[0].enumValues.push({ id : '', name : ''});
  191 + }
  192 +
  193 + $timeout(function(){
  194 + $scope.enumGridOptions.selectItem($scope.selectedProperties[0].enumValues.length - 1, true);
  195 + });
  196 + };
  197 +
  198 + // Click handler for remove button
  199 + $scope.removeEnumValue = function() {
  200 + if ($scope.selectedProperties.length > 0 && $scope.selectedEnumValues.length > 0) {
  201 + var index = $scope.selectedProperties[0].enumValues.indexOf($scope.selectedEnumValues[0]);
  202 + $scope.enumGridOptions.selectItem(index, false);
  203 + $scope.selectedProperties[0].enumValues.splice(index, 1);
  204 +
  205 + $scope.selectedEnumValues.length = 0;
  206 + if (index < $scope.selectedProperties[0].enumValues.length) {
  207 + $timeout(function(){
  208 + $scope.enumGridOptions.selectItem(index + 1, true);
  209 + });
  210 +
  211 + } else if ($scope.selectedProperties[0].enumValues.length > 0) {
  212 + $timeout(function(){
  213 + $scope.enumGridOptions.selectItem(index - 1, true);
  214 + });
  215 + }
  216 + }
  217 + };
  218 +
  219 + // Click handler for up button
  220 + $scope.moveEnumValueUp = function() {
  221 + if ($scope.selectedProperties.length > 0 && $scope.selectedEnumValues.length > 0) {
  222 + var index = $scope.selectedProperties[0].enumValues.indexOf($scope.selectedEnumValues[0]);
  223 + if (index != 0) { // If it's the first, no moving up of course
  224 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  225 + var temp = $scope.selectedProperties[0].enumValues[index];
  226 + $scope.selectedProperties[0].enumValues.splice(index, 1);
  227 + $timeout(function(){
  228 + $scope.selectedProperties[0].enumValues.splice(index + -1, 0, temp);
  229 + });
  230 +
  231 + }
  232 + }
  233 + };
  234 +
  235 + // Click handler for down button
  236 + $scope.moveEnumValueDown = function() {
  237 + if ($scope.selectedProperties.length > 0 && $scope.selectedEnumValues.length > 0) {
  238 + var index = $scope.selectedProperties[0].enumValues.indexOf($scope.selectedEnumValues[0]);
  239 + if (index != $scope.selectedProperties[0].enumValues.length - 1) { // If it's the last element, no moving down of course
  240 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  241 + var temp = $scope.selectedProperties[0].enumValues[index];
  242 + $scope.selectedProperties[0].enumValues.splice(index, 1);
  243 + $timeout(function(){
  244 + $scope.selectedProperties[0].enumValues.splice(index + 1, 0, temp);
  245 + });
  246 +
  247 + }
  248 + }
  249 + };
  250 +
  251 + // Click handler for save button
  252 + $scope.save = function() {
  253 +
  254 + if ($scope.formProperties.length > 0) {
  255 + $scope.property.value = {};
  256 + $scope.property.value.formProperties = $scope.formProperties;
  257 + } else {
  258 + $scope.property.value = null;
  259 + }
  260 +
  261 + $scope.updatePropertyInModel($scope.property);
  262 + $scope.close();
  263 + };
  264 +
  265 + $scope.cancel = function() {
  266 + $scope.$hide();
  267 + $scope.property.mode = 'read';
  268 + };
  269 +
  270 + // Close button handler
  271 + $scope.close = function() {
  272 + $scope.$hide();
  273 + $scope.property.mode = 'read';
  274 + };
  275 +
  276 +}];
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +/*
  21 + * Input parameters for call activity
  22 + */
  23 +
  24 +var KisBpmInParametersCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
  25 +
  26 + // Config for the modal window
  27 + var opts = {
  28 + template: 'editor-app/configuration/properties/in-parameters-popup.html?version=' + Date.now(),
  29 + scope: $scope
  30 + };
  31 +
  32 + // Open the dialog
  33 + $modal(opts);
  34 +}];
  35 +
  36 +var KisBpmInParametersPopupCtrl = ['$scope', '$q', '$translate', function($scope, $q, $translate) {
  37 +
  38 + // Put json representing form properties on scope
  39 + if ($scope.property.value !== undefined && $scope.property.value !== null
  40 + && $scope.property.value.inParameters !== undefined
  41 + && $scope.property.value.inParameters !== null) {
  42 + // Note that we clone the json object rather then setting it directly,
  43 + // this to cope with the fact that the user can click the cancel button and no changes should have happened
  44 + $scope.parameters = angular.copy($scope.property.value.inParameters);
  45 + } else {
  46 + $scope.parameters = [];
  47 + }
  48 +
  49 + // Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
  50 + $scope.selectedParameters = [];
  51 + $scope.translationsRetrieved = false;
  52 +
  53 + $scope.labels = {};
  54 +
  55 + var sourcePromise = $translate('PROPERTY.PARAMETER.SOURCE');
  56 + var sourceExpressionPromise = $translate('PROPERTY.PARAMETER.SOURCEEXPRESSION');
  57 + var targetPromise = $translate('PROPERTY.PARAMETER.TARGET');
  58 +
  59 + $q.all([sourcePromise, sourceExpressionPromise, targetPromise]).then(function(results) {
  60 + $scope.labels.sourceLabel = results[0];
  61 + $scope.labels.sourceExpressionLabel = results[1];
  62 + $scope.labels.targetLabel = results[2];
  63 + $scope.translationsRetrieved = true;
  64 +
  65 + // Config for grid
  66 + $scope.gridOptions = {
  67 + data: 'parameters',
  68 + enableRowReordering: true,
  69 + headerRowHeight: 28,
  70 + multiSelect: false,
  71 + keepLastSelected : false,
  72 + selectedItems: $scope.selectedParameters,
  73 + columnDefs: [{ field: 'source', displayName: $scope.labels.sourceLabel },
  74 + { field: 'sourceExpression', displayName: $scope.labels.sourceExpressionLabel },
  75 + { field: 'target', displayName: $scope.labels.targetLabel }]
  76 + };
  77 + });
  78 +
  79 + // Click handler for add button
  80 + $scope.addNewParameter = function() {
  81 + $scope.parameters.push({ source : '',
  82 + sourceExpression : '',
  83 + target : ''});
  84 + };
  85 +
  86 + // Click handler for remove button
  87 + $scope.removeParameter = function() {
  88 + if ($scope.selectedParameters.length > 0) {
  89 + var index = $scope.parameters.indexOf($scope.selectedParameters[0]);
  90 + $scope.gridOptions.selectItem(index, false);
  91 + $scope.parameters.splice(index, 1);
  92 +
  93 + $scope.selectedParameters.length = 0;
  94 + if (index < $scope.parameters.length) {
  95 + $scope.gridOptions.selectItem(index + 1, true);
  96 + } else if ($scope.parameters.length > 0) {
  97 + $scope.gridOptions.selectItem(index - 1, true);
  98 + }
  99 + }
  100 + };
  101 +
  102 + // Click handler for up button
  103 + $scope.moveParameterUp = function() {
  104 + if ($scope.selectedParameters.length > 0) {
  105 + var index = $scope.parameters.indexOf($scope.selectedParameters[0]);
  106 + if (index != 0) { // If it's the first, no moving up of course
  107 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  108 + var temp = $scope.parameters[index];
  109 + $scope.parameters.splice(index, 1);
  110 + $timeout(function(){
  111 + $scope.parameters.splice(index + -1, 0, temp);
  112 + }, 100);
  113 +
  114 + }
  115 + }
  116 + };
  117 +
  118 + // Click handler for down button
  119 + $scope.moveParameterDown = function() {
  120 + if ($scope.selectedParameters.length > 0) {
  121 + var index = $scope.parameters.indexOf($scope.selectedParameters[0]);
  122 + if (index != $scope.parameters.length - 1) { // If it's the last element, no moving down of course
  123 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  124 + var temp = $scope.parameters[index];
  125 + $scope.parameters.splice(index, 1);
  126 + $timeout(function(){
  127 + $scope.parameters.splice(index + 1, 0, temp);
  128 + }, 100);
  129 +
  130 + }
  131 + }
  132 + };
  133 +
  134 + // Click handler for save button
  135 + $scope.save = function() {
  136 +
  137 + if ($scope.parameters.length > 0) {
  138 + $scope.property.value = {};
  139 + $scope.property.value.inParameters = $scope.parameters;
  140 + } else {
  141 + $scope.property.value = null;
  142 + }
  143 +
  144 + $scope.updatePropertyInModel($scope.property);
  145 + $scope.close();
  146 + };
  147 +
  148 + $scope.cancel = function() {
  149 + $scope.close();
  150 + };
  151 +
  152 + // Close button handler
  153 + $scope.close = function() {
  154 + $scope.property.mode = 'read';
  155 + $scope.$hide();
  156 + };
  157 +
  158 +}];
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +/*
  21 + * Execution listeners
  22 + */
  23 +
  24 +angular.module('activitiModeler').controller('ActivitiMessageDefinitionsCtrl', ['$scope', '$modal', function ($scope, $modal) {
  25 +
  26 + // Config for the modal window
  27 + var opts = {
  28 + template: 'editor-app/configuration/properties/message-definitions-popup.html?version=' + Date.now(),
  29 + scope: $scope
  30 + };
  31 +
  32 + // Open the dialog
  33 + $modal(opts);
  34 +}]);
  35 +
  36 +//Need a separate controller for the modal window due to https://github.com/angular-ui/bootstrap/issues/259
  37 +// Will be fixed in a newer version of Angular UI
  38 +angular.module('activitiModeler').controller('ActivitiMessageDefinitionsPopupCtrl',
  39 + ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) {
  40 +
  41 + // Put json representing mesage definitions on scope
  42 + if ($scope.property.value !== undefined && $scope.property.value !== null && $scope.property.value.length > 0) {
  43 +
  44 + if ($scope.property.value.constructor == String) {
  45 + $scope.messageDefinitions = JSON.parse($scope.property.value);
  46 + }
  47 + else {
  48 + // Note that we clone the json object rather then setting it directly,
  49 + // this to cope with the fact that the user can click the cancel button and no changes should have happened
  50 + $scope.messageDefinitions = angular.copy($scope.property.value);
  51 + }
  52 +
  53 + } else {
  54 + $scope.messageDefinitions = [];
  55 + }
  56 +
  57 + // Array to contain selected mesage definitions (yes - we only can select one, but ng-grid isn't smart enough)
  58 + $scope.selectedMessages = [];
  59 + $scope.translationsRetrieved = false;
  60 +
  61 + $scope.labels = {};
  62 +
  63 + var idPromise = $translate('PROPERTY.MESSAGEDEFINITIONS.ID');
  64 + var namePromise = $translate('PROPERTY.MESSAGEDEFINITIONS.NAME');
  65 +
  66 + $q.all([idPromise, namePromise]).then(function (results) {
  67 +
  68 + $scope.labels.idLabel = results[0];
  69 + $scope.labels.nameLabel = results[1];
  70 + $scope.translationsRetrieved = true;
  71 +
  72 + // Config for grid
  73 + $scope.gridOptions = {
  74 + data: 'messageDefinitions',
  75 + headerRowHeight: 28,
  76 + enableRowSelection: true,
  77 + enableRowHeaderSelection: false,
  78 + multiSelect: false,
  79 + keepLastSelected : false,
  80 + selectedItems: $scope.selectedMessages,
  81 + columnDefs: [
  82 + {field: 'id', displayName: $scope.labels.idLabel},
  83 + {field: 'name', displayName: $scope.labels.nameLabel}]
  84 + };
  85 + });
  86 +
  87 + // Click handler for add button
  88 + $scope.addNewMessageDefinition = function () {
  89 + var newMessageDefinition = {id: '', name: ''};
  90 +
  91 + $scope.messageDefinitions.push(newMessageDefinition);
  92 + $timeout(function () {
  93 + $scope.gridOptions.selectItem($scope.messageDefinitions.length - 1, true);
  94 + });
  95 + };
  96 +
  97 + // Click handler for remove button
  98 + $scope.removeMessageDefinition = function () {
  99 + if ($scope.selectedMessages && $scope.selectedMessages.length > 0) {
  100 + var index = $scope.messageDefinitions.indexOf($scope.selectedMessages[0]);
  101 + $scope.gridOptions.selectItem(index, false);
  102 + $scope.messageDefinitions.splice(index, 1);
  103 +
  104 + $scope.selectedMessages.length = 0;
  105 + if (index < $scope.messageDefinitions.length) {
  106 + $scope.gridOptions.selectItem(index + 1, true);
  107 + } else if ($scope.messageDefinitions.length > 0) {
  108 + $scope.gridOptions.selectItem(index - 1, true);
  109 + }
  110 + }
  111 + };
  112 +
  113 + // Click handler for save button
  114 + $scope.save = function () {
  115 +
  116 + if ($scope.messageDefinitions.length > 0) {
  117 + $scope.property.value = $scope.messageDefinitions;
  118 + } else {
  119 + $scope.property.value = null;
  120 + }
  121 +
  122 + $scope.updatePropertyInModel($scope.property);
  123 + $scope.close();
  124 + };
  125 +
  126 + $scope.cancel = function () {
  127 + $scope.property.mode = 'read';
  128 + $scope.$hide();
  129 + };
  130 +
  131 + // Close button handler
  132 + $scope.close = function () {
  133 + $scope.property.mode = 'read';
  134 + $scope.$hide();
  135 + };
  136 +
  137 + }]);
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +angular.module('activitiModeler').controller('ActivitiMessageRefCtrl', [ '$scope', function($scope) {
  21 +
  22 + // Find the parent shape on which the message definitions are defined
  23 + var messageDefinitionsProperty = undefined;
  24 + var parent = $scope.selectedShape;
  25 + while (parent !== null && parent !== undefined && messageDefinitionsProperty === undefined) {
  26 + if (parent.properties && parent.properties['oryx-messagedefinitions']) {
  27 + messageDefinitionsProperty = parent.properties['oryx-messagedefinitions'];
  28 + } else {
  29 + parent = parent.parent;
  30 + }
  31 + }
  32 +
  33 + try {
  34 + messageDefinitionsProperty = JSON.parse(messageDefinitionsProperty);
  35 + if (typeof messageDefinitionsProperty == 'string') {
  36 + messageDefinitionsProperty = JSON.parse(messageDefinitionsProperty);
  37 + }
  38 + } catch (err) {
  39 + // Do nothing here, just to be sure we try-catch it
  40 + }
  41 +
  42 + $scope.messageDefinitions = messageDefinitionsProperty;
  43 +
  44 +
  45 + $scope.messageChanged = function() {
  46 + $scope.updatePropertyInModel($scope.property);
  47 + };
  48 +}]);
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +/*
  21 + * Execution listeners
  22 + */
  23 +
  24 +var KisBpmMultiInstanceCtrl = [ '$scope', function($scope) {
  25 +
  26 + if ($scope.property.value == undefined && $scope.property.value == null)
  27 + {
  28 + $scope.property.value = 'None';
  29 + }
  30 +
  31 + $scope.multiInstanceChanged = function() {
  32 + $scope.updatePropertyInModel($scope.property);
  33 + };
  34 +}];
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +/*
  21 + * Input parameters for call activity
  22 + */
  23 +
  24 +var KisBpmOutParametersCtrl = [ '$scope' , '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
  25 +
  26 + // Config for the modal window
  27 + var opts = {
  28 + template: 'editor-app/configuration/properties/out-parameters-popup.html?version=' + Date.now(),
  29 + scope: $scope
  30 + };
  31 +
  32 + // Open the dialog
  33 + $modal(opts);
  34 +}];
  35 +
  36 +var KisBpmOutParametersPopupCtrl = [ '$scope', '$q', '$translate', function($scope, $q, $translate) {
  37 +
  38 + // Put json representing form properties on scope
  39 + if ($scope.property.value !== undefined && $scope.property.value !== null
  40 + && $scope.property.value.outParameters !== undefined
  41 + && $scope.property.value.outParameters !== null) {
  42 + // Note that we clone the json object rather then setting it directly,
  43 + // this to cope with the fact that the user can click the cancel button and no changes should have happened
  44 + $scope.parameters = angular.copy($scope.property.value.outParameters);
  45 + } else {
  46 + $scope.parameters = [];
  47 + }
  48 +
  49 + // Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
  50 + $scope.selectedParameters = [];
  51 + $scope.translationsRetrieved = false;
  52 +
  53 + $scope.labels = {};
  54 +
  55 + var sourcePromise = $translate('PROPERTY.PARAMETER.SOURCE');
  56 + var sourceExpressionPromise = $translate('PROPERTY.PARAMETER.SOURCEEXPRESSION');
  57 + var targetPromise = $translate('PROPERTY.PARAMETER.TARGET');
  58 +
  59 + $q.all([sourcePromise, sourceExpressionPromise, targetPromise]).then(function(results) {
  60 + $scope.labels.sourceLabel = results[0];
  61 + $scope.labels.sourceExpressionLabel = results[1];
  62 + $scope.labels.targetLabel = results[2];
  63 + $scope.translationsRetrieved = true;
  64 +
  65 + // Config for grid
  66 + $scope.gridOptions = {
  67 + data: 'parameters',
  68 + enableRowReordering: true,
  69 + headerRowHeight: 28,
  70 + multiSelect: false,
  71 + keepLastSelected : false,
  72 + selectedItems: $scope.selectedParameters,
  73 + columnDefs: [{ field: 'source', displayName: $scope.labels.sourceLabel },
  74 + { field: 'sourceExpression', displayName: $scope.labels.sourceExpressionLabel },
  75 + { field: 'target', displayName: $scope.labels.targetLabel }]
  76 + };
  77 + });
  78 +
  79 + // Click handler for add button
  80 + $scope.addNewParameter = function() {
  81 + $scope.parameters.push({ source : '',
  82 + sourceExpression : '',
  83 + target : ''});
  84 + };
  85 +
  86 + // Click handler for remove button
  87 + $scope.removeParameter = function() {
  88 + if ($scope.selectedParameters.length > 0) {
  89 + var index = $scope.parameters.indexOf($scope.selectedParameters[0]);
  90 + $scope.gridOptions.selectItem(index, false);
  91 + $scope.parameters.splice(index, 1);
  92 +
  93 + $scope.selectedParameters.length = 0;
  94 + if (index < $scope.parameters.length) {
  95 + $scope.gridOptions.selectItem(index + 1, true);
  96 + } else if ($scope.parameters.length > 0) {
  97 + $scope.gridOptions.selectItem(index - 1, true);
  98 + }
  99 + }
  100 + };
  101 +
  102 + // Click handler for up button
  103 + $scope.moveParameterUp = function() {
  104 + if ($scope.selectedParameters.length > 0) {
  105 + var index = $scope.parameters.indexOf($scope.selectedParameters[0]);
  106 + if (index != 0) { // If it's the first, no moving up of course
  107 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  108 + var temp = $scope.parameters[index];
  109 + $scope.parameters.splice(index, 1);
  110 + $timeout(function(){
  111 + $scope.parameters.splice(index + -1, 0, temp);
  112 + }, 100);
  113 +
  114 + }
  115 + }
  116 + };
  117 +
  118 + // Click handler for down button
  119 + $scope.moveParameterDown = function() {
  120 + if ($scope.selectedParameters.length > 0) {
  121 + var index = $scope.parameters.indexOf($scope.selectedParameters[0]);
  122 + if (index != $scope.parameters.length - 1) { // If it's the last element, no moving down of course
  123 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  124 + var temp = $scope.parameters[index];
  125 + $scope.parameters.splice(index, 1);
  126 + $timeout(function(){
  127 + $scope.parameters.splice(index + 1, 0, temp);
  128 + }, 100);
  129 +
  130 + }
  131 + }
  132 + };
  133 +
  134 + // Click handler for save button
  135 + $scope.save = function() {
  136 +
  137 + if ($scope.parameters.length > 0) {
  138 + $scope.property.value = {};
  139 + $scope.property.value.outParameters = $scope.parameters;
  140 + } else {
  141 + $scope.property.value = null;
  142 + }
  143 +
  144 + $scope.updatePropertyInModel($scope.property);
  145 + $scope.close();
  146 + };
  147 +
  148 + $scope.cancel = function() {
  149 + $scope.close();
  150 + };
  151 +
  152 + // Close button handler
  153 + $scope.close = function() {
  154 + $scope.property.mode = 'read';
  155 + $scope.$hide();
  156 + };
  157 +
  158 +}];
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +/*
  21 + * Sequence flow order controller
  22 + */
  23 +
  24 +var KisBpmSequenceFlowOrderCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
  25 +
  26 + // Config for the modal window
  27 + var opts = {
  28 + template: 'editor-app/configuration/properties/sequenceflow-order-popup.html?version=' + Date.now(),
  29 + scope: $scope
  30 + };
  31 +
  32 + $modal(opts);
  33 +}];
  34 +
  35 +var KisBpmSequenceFlowOrderPopupCtrl = ['$scope', '$translate', function($scope, $translate) {
  36 +
  37 + // Find the outgoing sequence flow of the current selected shape
  38 + var outgoingSequenceFlow = [];
  39 + var selectedShape = $scope.selectedShape;
  40 + if (selectedShape) {
  41 + var outgoingNodes = selectedShape.getOutgoingShapes();
  42 + for (var i=0; i<outgoingNodes.length; i++) {
  43 + if (outgoingNodes[i].getStencil().title() === 'Sequence flow') {
  44 + var targetActivity = outgoingNodes[i].getTarget();
  45 + // We need the resourceId of a sequence flow, not the id because that will change with every editor load
  46 + outgoingSequenceFlow.push({
  47 + id : outgoingNodes[i].resourceId,
  48 + targetTitle : targetActivity.properties['oryx-name'],
  49 + targetType : targetActivity.getStencil().title()
  50 + });
  51 + }
  52 + }
  53 + } else {
  54 + console.log('Programmatic error: no selected shape found');
  55 + }
  56 +
  57 + // Now we can apply the order which was (possibly) previously saved
  58 + var orderedOutgoingSequenceFlow = [];
  59 + if ($scope.property.value && $scope.property.value.sequenceFlowOrder) {
  60 +
  61 + var sequenceFlowOrderList = $scope.property.value.sequenceFlowOrder;
  62 +
  63 + // Loop the list of sequence flow that was saved in the json model and match them with the outgoing sequence flow found above
  64 + for (var flowIndex=0; flowIndex < sequenceFlowOrderList.length; flowIndex++) {
  65 +
  66 + // find the sequence flow in the outgoing sequence flows.
  67 +
  68 + for (var outgoingFlowIndex=0; outgoingFlowIndex < outgoingSequenceFlow.length; outgoingFlowIndex++) {
  69 + if (outgoingSequenceFlow[outgoingFlowIndex].id === sequenceFlowOrderList[flowIndex]) {
  70 + orderedOutgoingSequenceFlow.push(outgoingSequenceFlow[outgoingFlowIndex]);
  71 + outgoingSequenceFlow.splice(outgoingFlowIndex, 1);
  72 + break;
  73 + }
  74 + }
  75 + }
  76 +
  77 + // Now all the matching sequence flow we're removed from the outgoing sequence flow list
  78 + // We can simply apply the remaining ones (these are new vs. the time when the values were saved to the model)
  79 + orderedOutgoingSequenceFlow = orderedOutgoingSequenceFlow.concat(outgoingSequenceFlow);
  80 +
  81 + } else {
  82 + orderedOutgoingSequenceFlow = outgoingSequenceFlow;
  83 + }
  84 +
  85 + // Now we can put it on the scope
  86 + $scope.outgoingSequenceFlow = orderedOutgoingSequenceFlow;
  87 +
  88 + // Move up click handler
  89 + $scope.moveUp = function(index) {
  90 + var temp = $scope.outgoingSequenceFlow[index];
  91 + $scope.outgoingSequenceFlow[index] = $scope.outgoingSequenceFlow[index - 1];
  92 + $scope.outgoingSequenceFlow[index - 1] = temp;
  93 + };
  94 +
  95 + // Move down click handler
  96 + $scope.moveDown = function(index) {
  97 + var temp = $scope.outgoingSequenceFlow[index];
  98 + $scope.outgoingSequenceFlow[index] = $scope.outgoingSequenceFlow[index + 1];
  99 + $scope.outgoingSequenceFlow[index + 1] = temp;
  100 + };
  101 +
  102 + // Save click handler
  103 + $scope.save = function() {
  104 + if ($scope.outgoingSequenceFlow.length > 0) {
  105 + $scope.property.value = {};
  106 + $scope.property.value.sequenceFlowOrder = [];
  107 +
  108 + for (var flowIndex=0; flowIndex < $scope.outgoingSequenceFlow.length; flowIndex++) {
  109 + $scope.property.value.sequenceFlowOrder.push($scope.outgoingSequenceFlow[flowIndex].id);
  110 + }
  111 + } else {
  112 + $scope.property.value = null;
  113 + }
  114 +
  115 + $scope.updatePropertyInModel($scope.property);
  116 + $scope.close();
  117 + };
  118 +
  119 + // Cancel click handler
  120 + $scope.cancel = function() {
  121 + $scope.close();
  122 + };
  123 +
  124 + // Close button handler
  125 + $scope.close = function() {
  126 + $scope.property.mode = 'read';
  127 + $scope.$hide();
  128 + };
  129 +
  130 +}];
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +angular.module('activitiModeler').controller('ActivitiSignalDefinitionsCtrl', ['$scope', '$modal', function ($scope, $modal) {
  21 +
  22 + // Config for the modal window
  23 + var opts = {
  24 + template: 'editor-app/configuration/properties/signal-definitions-popup.html?version=' + Date.now(),
  25 + scope: $scope
  26 + };
  27 +
  28 + // Open the dialog
  29 + $modal(opts);
  30 +}]);
  31 +
  32 +//Need a separate controller for the modal window due to https://github.com/angular-ui/bootstrap/issues/259
  33 +// Will be fixed in a newer version of Angular UI
  34 +angular.module('activitiModeler').controller('ActivitiSignalDefinitionsPopupCtrl',
  35 + ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) {
  36 +
  37 + // Put json representing signal definitions on scope
  38 + if ($scope.property.value !== undefined && $scope.property.value !== null && $scope.property.value.length > 0) {
  39 +
  40 + if ($scope.property.value.constructor == String) {
  41 + $scope.signalDefinitions = JSON.parse($scope.property.value);
  42 + }
  43 + else {
  44 + // Note that we clone the json object rather then setting it directly,
  45 + // this to cope with the fact that the user can click the cancel button and no changes should have happened
  46 + $scope.signalDefinitions = angular.copy($scope.property.value);
  47 + }
  48 +
  49 + } else {
  50 + $scope.signalDefinitions = [];
  51 + }
  52 +
  53 + // Array to contain selected signal definitions (yes - we only can select one, but ng-grid isn't smart enough)
  54 + $scope.selectedSignals = [];
  55 + $scope.translationsRetrieved = false;
  56 +
  57 + $scope.labels = {};
  58 +
  59 + var idPromise = $translate('PROPERTY.SIGNALDEFINITIONS.ID');
  60 + var namePromise = $translate('PROPERTY.SIGNALDEFINITIONS.NAME');
  61 + var scopePromise = $translate('PROPERTY.SIGNALDEFINITIONS.SCOPE');
  62 +
  63 + $q.all([idPromise, namePromise, scopePromise]).then(function (results) {
  64 +
  65 + $scope.labels.idLabel = results[0];
  66 + $scope.labels.nameLabel = results[1];
  67 + $scope.labels.scopeLabel = results[2];
  68 + $scope.translationsRetrieved = true;
  69 +
  70 + // Config for grid
  71 + $scope.gridOptions = {
  72 + data: 'signalDefinitions',
  73 + headerRowHeight: 28,
  74 + enableRowSelection: true,
  75 + enableRowHeaderSelection: false,
  76 + multiSelect: false,
  77 + keepLastSelected : false,
  78 + selectedItems: $scope.selectedSignals,
  79 + columnDefs: [
  80 + {field: 'id', displayName: $scope.labels.idLabel},
  81 + {field: 'name', displayName: $scope.labels.nameLabel},
  82 + {field: 'scope', displayName: $scope.labels.scopeLabel}]
  83 + };
  84 + });
  85 +
  86 + // Click handler for add button
  87 + $scope.addNewSignalDefinition = function () {
  88 + var newSignalDefinition = {id: '', name: '', scope: 'global'};
  89 +
  90 + $scope.signalDefinitions.push(newSignalDefinition);
  91 + $timeout(function () {
  92 + $scope.gridOptions.selectItem($scope.signalDefinitions.length - 1, true);
  93 + });
  94 + };
  95 +
  96 + // Click handler for remove button
  97 + $scope.removeSignalDefinition = function () {
  98 + if ($scope.selectedSignals && $scope.selectedSignals.length > 0) {
  99 + var index = $scope.signalDefinitions.indexOf($scope.selectedSignals[0]);
  100 + $scope.gridOptions.selectItem(index, false);
  101 + $scope.signalDefinitions.splice(index, 1);
  102 +
  103 + $scope.selectedSignals.length = 0;
  104 + if (index < $scope.signalDefinitions.length) {
  105 + $scope.gridOptions.selectItem(index + 1, true);
  106 + } else if ($scope.signalDefinitions.length > 0) {
  107 + $scope.gridOptions.selectItem(index - 1, true);
  108 + }
  109 + }
  110 + };
  111 +
  112 + // Click handler for save button
  113 + $scope.save = function () {
  114 +
  115 + if ($scope.signalDefinitions.length > 0) {
  116 + $scope.property.value = $scope.signalDefinitions;
  117 + } else {
  118 + $scope.property.value = null;
  119 + }
  120 +
  121 + $scope.updatePropertyInModel($scope.property);
  122 + $scope.close();
  123 + };
  124 +
  125 + $scope.cancel = function () {
  126 + $scope.property.mode = 'read';
  127 + $scope.$hide();
  128 + };
  129 +
  130 + // Close button handler
  131 + $scope.close = function () {
  132 + $scope.property.mode = 'read';
  133 + $scope.$hide();
  134 + };
  135 +
  136 + }]);
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +angular.module('activitiModeler').controller('ActivitiSignalRefCtrl', [ '$scope', function($scope) {
  20 +
  21 + // Find the parent shape on which the signal definitions are defined
  22 + var signalDefinitionsProperty = undefined;
  23 + var parent = $scope.selectedShape;
  24 + while (parent !== null && parent !== undefined && signalDefinitionsProperty === undefined) {
  25 + if (parent.properties && parent.properties['oryx-signaldefinitions']) {
  26 + signalDefinitionsProperty = parent.properties['oryx-signaldefinitions'];
  27 + } else {
  28 + parent = parent.parent;
  29 + }
  30 + }
  31 +
  32 + try {
  33 + signalDefinitionsProperty = JSON.parse(signalDefinitionsProperty);
  34 + if (typeof signalDefinitionsProperty == 'string') {
  35 + signalDefinitionsProperty = JSON.parse(signalDefinitionsProperty);
  36 + }
  37 + } catch (err) {
  38 + // Do nothing here, just to be sure we try-catch it
  39 + }
  40 +
  41 + $scope.signalDefinitions = signalDefinitionsProperty;
  42 +
  43 +
  44 + $scope.signalChanged = function() {
  45 + $scope.updatePropertyInModel($scope.property);
  46 + };
  47 +}]);
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +
  20 +/*
  21 + * Task listeners
  22 + */
  23 +
  24 +var KisBpmTaskListenersCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
  25 +
  26 + // Config for the modal window
  27 + var opts = {
  28 + template: 'editor-app/configuration/properties/task-listeners-popup.html?version=' + Date.now(),
  29 + scope: $scope
  30 + };
  31 +
  32 + // Open the dialog
  33 + $modal(opts);
  34 +}];
  35 +
  36 +var KisBpmTaskListenersPopupCtrl = [ '$scope', '$q', '$translate', function($scope, $q, $translate) {
  37 +
  38 + // Put json representing form properties on scope
  39 + if ($scope.property.value !== undefined && $scope.property.value !== null
  40 + && $scope.property.value.taskListeners !== undefined
  41 + && $scope.property.value.taskListeners !== null) {
  42 +
  43 + if ($scope.property.value.taskListeners.constructor == String)
  44 + {
  45 + $scope.taskListeners = JSON.parse($scope.property.value.taskListeners);
  46 + }
  47 + else
  48 + {
  49 + // Note that we clone the json object rather then setting it directly,
  50 + // this to cope with the fact that the user can click the cancel button and no changes should have happened
  51 + $scope.taskListeners = angular.copy($scope.property.value.taskListeners);
  52 + }
  53 +
  54 + for (var i = 0; i < $scope.taskListeners.length; i++)
  55 + {
  56 + var taskListener = $scope.taskListeners[i];
  57 + if (taskListener.className !== undefined && taskListener.className !== '')
  58 + {
  59 + taskListener.implementation = taskListener.className;
  60 + }
  61 + else if (taskListener.expression !== undefined && taskListener.expression !== '')
  62 + {
  63 + taskListener.implementation = taskListener.expression;
  64 + }
  65 + else if (taskListener.delegateExpression !== undefined && taskListener.delegateExpression !== '')
  66 + {
  67 + taskListener.implementation = taskListener.delegateExpression;
  68 + }
  69 + }
  70 + } else {
  71 + $scope.taskListeners = [];
  72 + }
  73 +
  74 + // Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
  75 + $scope.selectedListeners = [];
  76 + $scope.selectedFields = [];
  77 + $scope.translationsRetrieved = false;
  78 +
  79 + $scope.labels = {};
  80 +
  81 + var eventPromise = $translate('PROPERTY.TASKLISTENERS.EVENT');
  82 + var implementationPromise = $translate('PROPERTY.TASKLISTENERS.FIELDS.IMPLEMENTATION');
  83 + var namePromise = $translate('PROPERTY.TASKLISTENERS.FIELDS.NAME');
  84 +
  85 + $q.all([eventPromise, implementationPromise, namePromise]).then(function(results) {
  86 + $scope.labels.eventLabel = results[0];
  87 + $scope.labels.implementationLabel = results[1];
  88 + $scope.labels.nameLabel = results[2];
  89 + $scope.translationsRetrieved = true;
  90 +
  91 + // Config for grid
  92 + $scope.gridOptions = {
  93 + data: 'taskListeners',
  94 + enableRowReordering: true,
  95 + headerRowHeight: 28,
  96 + multiSelect: false,
  97 + keepLastSelected : false,
  98 + selectedItems: $scope.selectedListeners,
  99 + afterSelectionChange: function (rowItem, event) {
  100 + $scope.selectedFields.length = 0;
  101 + if ($scope.selectedListeners.length > 0)
  102 + {
  103 + var fields = $scope.selectedListeners[0].fields;
  104 + if (fields !== undefined && fields !== null)
  105 + {
  106 + for (var i = 0; i < fields.length; i++)
  107 + {
  108 + var field = fields[i];
  109 + if (field.stringValue !== undefined && field.stringValue !== '')
  110 + {
  111 + field.implementation = field.stringValue;
  112 + }
  113 + else if (field.expression !== undefined && field.expression !== '')
  114 + {
  115 + field.implementation = field.expression;
  116 + }
  117 + else if (field.string !== undefined && field.string !== '')
  118 + {
  119 + field.implementation = field.string;
  120 + }
  121 + }
  122 + }
  123 + }
  124 + },
  125 + columnDefs: [{ field: 'event', displayName: $scope.labels.eventLabel },
  126 + { field: 'implementation', displayName: $scope.labels.implementationLabel}]
  127 + };
  128 +
  129 + // Config for field grid
  130 + $scope.gridFieldOptions = {
  131 + data: 'selectedListeners[0].fields',
  132 + enableRowReordering: true,
  133 + headerRowHeight: 28,
  134 + multiSelect: false,
  135 + keepLastSelected : false,
  136 + selectedItems: $scope.selectedFields,
  137 + columnDefs: [{ field: 'name', displayName: $scope.labels.name },
  138 + { field: 'implementation', displayName: $scope.labels.implementationLabel}]
  139 + };
  140 + });
  141 +
  142 + $scope.listenerDetailsChanged = function() {
  143 + if ($scope.selectedListeners[0].className !== '')
  144 + {
  145 + $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].className;
  146 + }
  147 + else if ($scope.selectedListeners[0].expression !== '')
  148 + {
  149 + $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].expression;
  150 + }
  151 + else if ($scope.selectedListeners[0].delegateExpression !== '')
  152 + {
  153 + $scope.selectedListeners[0].implementation = $scope.selectedListeners[0].delegateExpression;
  154 + }
  155 + else
  156 + {
  157 + $scope.selectedListeners[0].implementation = '';
  158 + }
  159 + };
  160 +
  161 + // Click handler for add button
  162 + $scope.addNewListener = function() {
  163 + $scope.taskListeners.push({ event : 'create',
  164 + implementation : '',
  165 + className : '',
  166 + expression: '',
  167 + delegateExpression: ''});
  168 + };
  169 +
  170 + // Click handler for remove button
  171 + $scope.removeListener = function() {
  172 + if ($scope.selectedListeners.length > 0) {
  173 + var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]);
  174 + $scope.gridOptions.selectItem(index, false);
  175 + $scope.taskListeners.splice(index, 1);
  176 +
  177 + $scope.selectedListeners.length = 0;
  178 + if (index < $scope.taskListeners.length) {
  179 + $scope.gridOptions.selectItem(index + 1, true);
  180 + } else if ($scope.taskListeners.length > 0) {
  181 + $scope.gridOptions.selectItem(index - 1, true);
  182 + }
  183 + }
  184 + };
  185 +
  186 + // Click handler for up button
  187 + $scope.moveListenerUp = function() {
  188 + if ($scope.selectedListeners.length > 0) {
  189 + var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]);
  190 + if (index != 0) { // If it's the first, no moving up of course
  191 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  192 + var temp = $scope.taskListeners[index];
  193 + $scope.taskListeners.splice(index, 1);
  194 + $timeout(function(){
  195 + $scope.taskListeners.splice(index + -1, 0, temp);
  196 + }, 100);
  197 +
  198 + }
  199 + }
  200 + };
  201 +
  202 + // Click handler for down button
  203 + $scope.moveListenerDown = function() {
  204 + if ($scope.selectedListeners.length > 0) {
  205 + var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]);
  206 + if (index != $scope.taskListeners.length - 1) { // If it's the last element, no moving down of course
  207 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  208 + var temp = $scope.taskListeners[index];
  209 + $scope.taskListeners.splice(index, 1);
  210 + $timeout(function(){
  211 + $scope.taskListeners.splice(index + 1, 0, temp);
  212 + }, 100);
  213 +
  214 + }
  215 + }
  216 + };
  217 +
  218 + $scope.fieldDetailsChanged = function() {
  219 + if ($scope.selectedFields[0].stringValue != '')
  220 + {
  221 + $scope.selectedFields[0].implementation = $scope.selectedFields[0].stringValue;
  222 + }
  223 + else if ($scope.selectedFields[0].expression != '')
  224 + {
  225 + $scope.selectedFields[0].implementation = $scope.selectedFields[0].expression;
  226 + }
  227 + else if ($scope.selectedFields[0].string != '')
  228 + {
  229 + $scope.selectedFields[0].implementation = $scope.selectedFields[0].string;
  230 + }
  231 + else
  232 + {
  233 + $scope.selectedFields[0].implementation = '';
  234 + }
  235 + };
  236 +
  237 + // Click handler for add button
  238 + $scope.addNewField = function() {
  239 + if ($scope.selectedListeners.length > 0)
  240 + {
  241 + if ($scope.selectedListeners[0].fields == undefined)
  242 + {
  243 + $scope.selectedListeners[0].fields = [];
  244 + }
  245 + $scope.selectedListeners[0].fields.push({ name : 'fieldName',
  246 + implementation : '',
  247 + stringValue : '',
  248 + expression: '',
  249 + string: ''});
  250 + }
  251 + };
  252 +
  253 + // Click handler for remove button
  254 + $scope.removeField = function() {
  255 + if ($scope.selectedFields.length > 0) {
  256 + var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
  257 + $scope.gridFieldOptions.selectItem(index, false);
  258 + $scope.selectedListeners[0].fields.splice(index, 1);
  259 +
  260 + $scope.selectedFields.length = 0;
  261 + if (index < $scope.selectedListeners[0].fields.length) {
  262 + $scope.gridFieldOptions.selectItem(index + 1, true);
  263 + } else if ($scope.selectedListeners[0].fields.length > 0) {
  264 + $scope.gridFieldOptions.selectItem(index - 1, true);
  265 + }
  266 + }
  267 + };
  268 +
  269 + // Click handler for up button
  270 + $scope.moveFieldUp = function() {
  271 + if ($scope.selectedFields.length > 0) {
  272 + var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
  273 + if (index != 0) { // If it's the first, no moving up of course
  274 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  275 + var temp = $scope.selectedListeners[0].fields[index];
  276 + $scope.selectedListeners[0].fields.splice(index, 1);
  277 + $timeout(function(){
  278 + $scope.selectedListeners[0].fields.splice(index + -1, 0, temp);
  279 + }, 100);
  280 +
  281 + }
  282 + }
  283 + };
  284 +
  285 + // Click handler for down button
  286 + $scope.moveFieldDown = function() {
  287 + if ($scope.selectedFields.length > 0) {
  288 + var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
  289 + if (index != $scope.selectedListeners[0].fields.length - 1) { // If it's the last element, no moving down of course
  290 + // Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
  291 + var temp = $scope.selectedListeners[0].fields[index];
  292 + $scope.selectedListeners[0].fields.splice(index, 1);
  293 + $timeout(function(){
  294 + $scope.selectedListeners[0].fields.splice(index + 1, 0, temp);
  295 + }, 100);
  296 +
  297 + }
  298 + }
  299 + };
  300 +
  301 + // Click handler for save button
  302 + $scope.save = function() {
  303 +
  304 + if ($scope.taskListeners.length > 0) {
  305 + $scope.property.value = {};
  306 + $scope.property.value.taskListeners = $scope.taskListeners;
  307 + } else {
  308 + $scope.property.value = null;
  309 + }
  310 +
  311 + $scope.updatePropertyInModel($scope.property);
  312 + $scope.close();
  313 + };
  314 +
  315 + $scope.cancel = function() {
  316 + $scope.close();
  317 + };
  318 +
  319 + // Close button handler
  320 + $scope.close = function() {
  321 + $scope.property.mode = 'read';
  322 + $scope.$hide();
  323 + };
  324 +
  325 +}];
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +'use strict';
  20 +
  21 +var KISBPM = KISBPM || {};
  22 +KISBPM.PROPERTY_CONFIG =
  23 +{
  24 + "string": {
  25 + "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html",
  26 + "writeModeTemplateUrl": "editor-app/configuration/properties/string-property-write-mode-template.html"
  27 + },
  28 + "boolean": {
  29 + "templateUrl": "editor-app/configuration/properties/boolean-property-template.html"
  30 + },
  31 + "text" : {
  32 + "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html",
  33 + "writeModeTemplateUrl": "editor-app/configuration/properties/text-property-write-template.html"
  34 + },
  35 + "kisbpm-multiinstance" : {
  36 + "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html",
  37 + "writeModeTemplateUrl": "editor-app/configuration/properties/multiinstance-property-write-template.html"
  38 + },
  39 + "oryx-formproperties-complex": {
  40 + "readModeTemplateUrl": "editor-app/configuration/properties/form-properties-display-template.html",
  41 + "writeModeTemplateUrl": "editor-app/configuration/properties/form-properties-write-template.html"
  42 + },
  43 + "oryx-executionlisteners-multiplecomplex": {
  44 + "readModeTemplateUrl": "editor-app/configuration/properties/execution-listeners-display-template.html",
  45 + "writeModeTemplateUrl": "editor-app/configuration/properties/execution-listeners-write-template.html"
  46 + },
  47 + "oryx-tasklisteners-multiplecomplex": {
  48 + "readModeTemplateUrl": "editor-app/configuration/properties/task-listeners-display-template.html",
  49 + "writeModeTemplateUrl": "editor-app/configuration/properties/task-listeners-write-template.html"
  50 + },
  51 + "oryx-eventlisteners-multiplecomplex": {
  52 + "readModeTemplateUrl": "editor-app/configuration/properties/event-listeners-display-template.html",
  53 + "writeModeTemplateUrl": "editor-app/configuration/properties/event-listeners-write-template.html"
  54 + },
  55 + "oryx-usertaskassignment-complex": {
  56 + "readModeTemplateUrl": "editor-app/configuration/properties/assignment-display-template.html",
  57 + "writeModeTemplateUrl": "editor-app/configuration/properties/assignment-write-template.html"
  58 + },
  59 + "oryx-servicetaskfields-complex": {
  60 + "readModeTemplateUrl": "editor-app/configuration/properties/fields-display-template.html",
  61 + "writeModeTemplateUrl": "editor-app/configuration/properties/fields-write-template.html"
  62 + },
  63 + "oryx-callactivityinparameters-complex": {
  64 + "readModeTemplateUrl": "editor-app/configuration/properties/in-parameters-display-template.html",
  65 + "writeModeTemplateUrl": "editor-app/configuration/properties/in-parameters-write-template.html"
  66 + },
  67 + "oryx-callactivityoutparameters-complex": {
  68 + "readModeTemplateUrl": "editor-app/configuration/properties/out-parameters-display-template.html",
  69 + "writeModeTemplateUrl": "editor-app/configuration/properties/out-parameters-write-template.html"
  70 + },
  71 + "oryx-subprocessreference-complex": {
  72 + "readModeTemplateUrl": "editor-app/configuration/properties/subprocess-reference-display-template.html",
  73 + "writeModeTemplateUrl": "editor-app/configuration/properties/subprocess-reference-write-template.html"
  74 + },
  75 + "oryx-sequencefloworder-complex" : {
  76 + "readModeTemplateUrl": "editor-app/configuration/properties/sequenceflow-order-display-template.html",
  77 + "writeModeTemplateUrl": "editor-app/configuration/properties/sequenceflow-order-write-template.html"
  78 + },
  79 + "oryx-conditionsequenceflow-complex" : {
  80 + "readModeTemplateUrl": "editor-app/configuration/properties/condition-expression-display-template.html",
  81 + "writeModeTemplateUrl": "editor-app/configuration/properties/condition-expression-write-template.html"
  82 + },
  83 + "oryx-signaldefinitions-multiplecomplex" : {
  84 + "readModeTemplateUrl": "editor-app/configuration/properties/signal-definitions-display-template.html",
  85 + "writeModeTemplateUrl": "editor-app/configuration/properties/signal-definitions-write-template.html"
  86 + },
  87 + "oryx-signalref-string" : {
  88 + "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html",
  89 + "writeModeTemplateUrl": "editor-app/configuration/properties/signal-property-write-template.html"
  90 + },
  91 + "oryx-messagedefinitions-multiplecomplex" : {
  92 + "readModeTemplateUrl": "editor-app/configuration/properties/message-definitions-display-template.html",
  93 + "writeModeTemplateUrl": "editor-app/configuration/properties/message-definitions-write-template.html"
  94 + },
  95 + "oryx-messageref-string" : {
  96 + "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html",
  97 + "writeModeTemplateUrl": "editor-app/configuration/properties/message-property-write-template.html"
  98 + }
  99 +};
  1 +<span ng-if="property.value.assignment.assignee">{{'PROPERTY.ASSIGNMENT.ASSIGNEE_DISPLAY' | translate:property.value.assignment }} </span>
  2 +<span ng-if="property.value.assignment.candidateUsers.length > 0">{{'PROPERTY.ASSIGNMENT.CANDIDATE_USERS_DISPLAY' | translate:property.value.assignment.candidateUsers}} </span>
  3 +<span ng-if="property.value.assignment.candidateGroups.length > 0">{{'PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS_DISPLAY' | translate:property.value.assignment.candidateGroups}} </span>
  4 +<span ng-if="!property.value.assignment.assignee && (!property.value.assignment.candidateUsers || property.value.assignment.candidateUsers.length == 0) && (!property.value.assignment.candidateGroups || property.value.assignment.candidateGroups.length == 0)" translate>PROPERTY.ASSIGNMENT.EMPTY</span>
  1 +<div class="modal" ng-controller="KisBpmAssignmentPopupCtrl">
  2 + <div class="modal-dialog">
  3 + <div class="modal-content">
  4 + <div class="modal-header">
  5 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
  6 + <h2 translate>PROPERTY.ASSIGNMENT.TITLE</h2>
  7 + </div>
  8 + <div class="modal-body">
  9 +
  10 + <div class="row row-no-gutter">
  11 + <div class="form-group">
  12 + <label for="assigneeField">{{'PROPERTY.ASSIGNMENT.ASSIGNEE' | translate}}</label>
  13 + <input type="text" id="assigneeField" class="form-control" ng-model="assignment.assignee" placeholder="{{'PROPERTY.ASSIGNMENT.ASSIGNEE_PLACEHOLDER' | translate}}" />
  14 + </div>
  15 + </div>
  16 +
  17 + <div class="row row-no-gutter">
  18 + <div class="form-group">
  19 + <label for="userField">{{'PROPERTY.ASSIGNMENT.CANDIDATE_USERS' | translate}}</label>
  20 + <div ng-repeat="candidateUser in assignment.candidateUsers">
  21 + <input id="userField" class="form-control" type="text" ng-model="candidateUser.value" />
  22 + <i class="glyphicon glyphicon-minus clickable-property" ng-click="removeCandidateUserValue($index)"></i>
  23 + <i ng-if="$index == (assignment.candidateUsers.length - 1)" class="glyphicon glyphicon-plus clickable-property" ng-click="addCandidateUserValue($index)"></i>
  24 + </div>
  25 + </div>
  26 +
  27 + <div class="form-group">
  28 + <label for="groupField">{{'PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS' | translate}}</label>
  29 + <div ng-repeat="candidateGroup in assignment.candidateGroups">
  30 + <input id="groupField" class="form-control" type="text" ng-model="candidateGroup.value" />
  31 + <i class="glyphicon glyphicon-minus clickable-property" ng-click="removeCandidateGroupValue($index)"></i>
  32 + <i ng-if="$index == (assignment.candidateGroups.length - 1)" class="glyphicon glyphicon-plus clickable-property" ng-click="addCandidateGroupValue($index)"></i>
  33 + </div>
  34 + </div>
  35 + </div>
  36 +
  37 + </div>
  38 + <div class="modal-footer">
  39 + <button ng-click="close()" class="btn btn-primary" translate>ACTION.CANCEL</button>
  40 + <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
  41 + </div>
  42 + </div>
  43 + </div>
  44 +</div>
  1 +
  2 +<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
  3 +<span ng-controller="KisBpmAssignmentCtrl">
  4 +</span>
  1 +
  2 +<div ng-controller="KisBpmBooleanPropertyCtrl">
  3 + <input type="checkbox" ng-model="property.value" ng-change="changeValue()"/>
  4 +</div>
  1 +<span ng-if="property.value">{{property.value|limitTo:20}}</span>
  2 +<span ng-if="!property.value">{{'PROPERTY.SEQUENCEFLOW.CONDITION.NO-CONDITION-DISPLAY' | translate}}</span>
  1 +
  2 +<div class="modal" ng-controller="KisBpmConditionExpressionPopupCtrl">
  3 +<div class="modal-dialog">
  4 +<div class="modal-content">
  5 +<div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
  7 + <h2 translate>PROPERTY.SEQUENCEFLOW.CONDITION.TITLE</h2>
  8 +</div>
  9 +<div class="modal-body">
  10 +
  11 + <div class="detail-group clearfix">
  12 +
  13 + <div class="form-group clearfix">
  14 + <div class="col-xs-12">
  15 + <label class="col-xs-3">{{'PROPERTY.SEQUENCEFLOW.CONDITION.STATIC' | translate}}</label>
  16 + <div class="col-xs-9">
  17 + <textarea class="form-control" ng-model="conditionExpression.value" style="width:90%; height:100%; max-width: 100%; max-height: 100%; min-height: 100px"/>
  18 + </div>
  19 + </div>
  20 + </div>
  21 +
  22 + </div>
  23 + <div class="modal-footer">
  24 + <button ng-click="close()" class="btn btn-primary" translate>ACTION.CANCEL</button>
  25 + <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
  26 + </div>
  27 +</div>
  28 +</div>
  29 +</div>
  1 +
  2 +<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
  3 +<span ng-controller="KisBpmConditionExpressionCtrl">
  4 +</span>
  1 +
  2 +<span ng-if="!property.noValue">{{property.value|limitTo:20}}</span>
  3 +<span ng-if="!property.noValue && property.value != null && property.value.length > 20">...</span>
  4 +<span ng-if="property.noValue" translate>PROPERTY.EMPTY</span>
  1 +
  2 +<span ng-if="!property.noValue">{{'PROPERTY.EVENTLISTENERS.DISPLAY' | translate:property.value.eventListeners}}</span>
  3 +<span ng-if="property.noValue" translate>PROPERTY.EVENTLISTENERS.EMPTY</span>
  1 +
  2 +<div class="modal" ng-controller="KisBpmEventListenersPopupCtrl">
  3 + <div class="modal-dialog modal-wide">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
  7 + <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
  8 + </div>
  9 + <div class="modal-body">
  10 +
  11 + <div class="row row-no-gutter">
  12 + <div class="col-xs-10">
  13 + <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
  14 + <div class="pull-right">
  15 + <div class="btn-group">
  16 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.UP | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveListenerUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
  17 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.DOWN | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveListenerDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
  18 + </div>
  19 + <div class="btn-group">
  20 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.ADD | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewListener()"><i class="glyphicon glyphicon-plus"></i></a>
  21 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.REMOVE | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeListener()"><i class="glyphicon glyphicon-minus"></i></a>
  22 + </div>
  23 + </div>
  24 + </div>
  25 + </div>
  26 +
  27 + <div class="row row-no-gutter">
  28 + <div ng-if="translationsRetrieved" ng-show="selectedListeners.length > 0" class="col-xs-6">
  29 + <div class="form-group">
  30 + <label for="userField">{{'PROPERTY.EVENTLISTENERS.EVENTS' | translate}}</label>
  31 + <div ng-repeat="eventDefinition in selectedListeners[0].events">
  32 + <select id="eventField" class="form-control" ng-model="eventDefinition.event" ng-change="listenerDetailsChanged()">
  33 + <option title="{{'EVENT_TYPE.ACTIVITY.COMPENSATE.TOOLTIP' | translate}}">ACTIVITY_COMPENSATE</option>
  34 + <option title="{{'EVENT_TYPE.ACTIVITY.COMPLETED.TOOLTIP' | translate}}">ACTIVITY_COMPLETED</option>
  35 + <option title="bla">ACTIVITY_ERROR_RECEIVED</option>
  36 + <option>ACTIVITY_MESSAGE_RECEIVED</option>
  37 + <option>ACTIVITY_SIGNALED</option>
  38 + <option>ACTIVITY_STARTED</option>
  39 + <option>ENGINE_CLOSED</option>
  40 + <option>ENGINE_CREATED</option>
  41 + <option>ENTITY_ACTIVATED</option>
  42 + <option>ENTITY_CREATED</option>
  43 + <option>ENTITY_DELETED</option>
  44 + <option>ENTITY_INITIALIZED</option>
  45 + <option>ENTITY_SUSPENDED</option>
  46 + <option>ENTITY_UPDATED</option>
  47 + <option>JOB_EXECUTION_FAILURE</option>
  48 + <option>JOB_EXECUTION_SUCCESS</option>
  49 + <option>JOB_RETRIES_DECREMENTED</option>
  50 + <option title="{{'EVENT_TYPE.MEMBERSHIP.CREATED.TOOLTIP' | translate}}">MEMBERSHIP_CREATED</option>
  51 + <option title="{{'EVENT_TYPE.MEMBERSHIP.DELETED.TOOLTIP' | translate}}">MEMBERSHIP_DELETED</option>
  52 + <option title="{{'EVENT_TYPE.MEMBERSHIPS.DELETED.TOOLTIP' | translate}}">MEMBERSHIPS_DELETED</option>
  53 + <option title="{{'EVENT_TYPE.TASK.ASSIGNED.TOOLTIP' | translate}}">TASK_ASSIGNED</option>
  54 + <option title="{{'EVENT_TYPE.TASK.COMPLETED.TOOLTIP' | translate}}">TASK_COMPLETED</option>
  55 + <option>TIMER_FIRED</option>
  56 + <option title="{{'EVENT_TYPE.UNCAUGHT.BPMNERROR.TOOLTIP' | translate}}">UNCAUGHT_BPMN_ERROR</option>
  57 + <option title="{{'EVENT_TYPE.VARIABLE.CREATED.TOOLTIP' | translate}}">VARIABLE_CREATED</option>
  58 + <option title="{{'EVENT_TYPE.VARIABLE.DELETED.TOOLTIP' | translate}}">VARIABLE_DELETED</option>
  59 + <option title="{{'EVENT_TYPE.VARIABLE.UPDATED.TOOLTIP' | translate}}">VARIABLE_UPDATED</option>
  60 + </select>
  61 + <i ng-if="$index > 0" class="glyphicon glyphicon-minus clickable-property" ng-click="removeEventValue($index)"></i>
  62 + <i class="glyphicon glyphicon-plus clickable-property" ng-click="addEventValue($index)"></i>
  63 + </div>
  64 + <div class="form-group">
  65 + <label for="classField">{{'PROPERTY.EVENTLISTENERS.RETHROW' | translate}}</label>
  66 + <input type="checkbox" id="rethrowField" class="form-control" ng-model="selectedListeners[0].rethrowEvent" ng-change="listenerDetailsChanged()" />
  67 + </div>
  68 + </div>
  69 + </div>
  70 + <div ng-show="selectedListeners.length > 0 && selectedListeners[0].events[0].event" class="col-xs-6">
  71 + <div class="form-group" ng-if="!selectedListeners[0].rethrowEvent">
  72 + <label for="classField">{{'PROPERTY.EVENTLISTENERS.CLASS' | translate}}</label>
  73 + <input type="text" id="classField" class="form-control" ng-model="selectedListeners[0].className" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EVENTLISTENERS.CLASS.PLACEHOLDER' | translate}}" />
  74 + </div>
  75 + <div class="form-group" ng-if="!selectedListeners[0].rethrowEvent">
  76 + <label for="delegateExpressionField">{{'PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION' | translate}}</label>
  77 + <input type="text" id="delegateExpressionField" class="form-control" ng-model="selectedListeners[0].delegateExpression" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER' | translate}}" />
  78 + </div>
  79 + <div class="form-group" ng-if="!selectedListeners[0].rethrowEvent">
  80 + <label for="entityTypeField">{{'PROPERTY.EVENTLISTENERS.ENTITYTYPE' | translate}}</label>
  81 + <input type="text" id="entityTypeField" class="form-control" ng-model="selectedListeners[0].entityType" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EVENTLISTENERS.ENTITYTYPE.PLACEHOLDER' | translate}}" />
  82 + </div>
  83 + <div class="form-group" ng-if="selectedListeners[0].rethrowEvent">
  84 + <label for="delegateExpressionField">{{'PROPERTY.EVENTLISTENERS.RETHROWTYPE' | translate}}</label>
  85 + <select id="rethrowTypeField" class="form-control" ng-model="selectedListeners[0].rethrowType" ng-change="rethrowTypeChanged()">
  86 + <option>error</option>
  87 + <option>message</option>
  88 + <option>signal</option>
  89 + <option>globalSignal</option>
  90 + </select>
  91 + </div>
  92 + <div class="form-group" ng-if="selectedListeners[0].rethrowType === 'error'">
  93 + <label for="errorCodeField">{{'PROPERTY.EVENTLISTENERS.ERRORCODE' | translate}}</label>
  94 + <input type="text" id="errorCodeField" class="form-control" ng-model="selectedListeners[0].errorcode" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EVENTLISTENERS.ERRORCODE.PLACEHOLDER' | translate}}" />
  95 + </div>
  96 + <div class="form-group" ng-if="selectedListeners[0].rethrowType === 'message'">
  97 + <label for="messageNameField">{{'PROPERTY.EVENTLISTENERS.MESSAGENAME' | translate}}</label>
  98 + <input type="text" id="messageNameField" class="form-control" ng-model="selectedListeners[0].messagename" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EVENTLISTENERS.MESSAGENAME.PLACEHOLDER' | translate}}" />
  99 + </div>
  100 + <div class="form-group" ng-if="selectedListeners[0].rethrowType === 'signal' || selectedListeners[0].rethrowType === 'globalSignal'">
  101 + <label for="messageNameField">{{'PROPERTY.EVENTLISTENERS.SIGNALNAME' | translate}}</label>
  102 + <input type="text" id="signalNameField" class="form-control" ng-model="selectedListeners[0].signalname" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EVENTLISTENERS.SIGNALNAME.PLACEHOLDER' | translate}}" />
  103 + </div>
  104 + </div>
  105 + <div ng-show="selectedListeners.length == 0" class="col-xs-6 muted no-property-selected" translate>PROPERTY.EVENTLISTENERS.UNSELECTED</div>
  106 + </div>
  107 +
  108 + </div>
  109 + <div class="modal-footer">
  110 + <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
  111 + <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
  112 + </div>
  113 + </div>
  114 + </div>
  115 +</div>
  1 +
  2 +<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
  3 +<span ng-controller="KisBpmEventListenersCtrl">
  4 +</span>
  1 +
  2 +<span ng-if="!property.noValue">{{'PROPERTY.EXECUTIONLISTENERS.DISPLAY' | translate:property.value.executionListeners}}</span>
  3 +<span ng-if="property.noValue" translate>PROPERTY.EXECUTIONLISTENERS.EMPTY</span>
  1 +
  2 +<div class="modal" ng-controller="KisBpmExecutionListenersPopupCtrl">
  3 + <div class="modal-dialog modal-wide">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
  7 + <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
  8 + </div>
  9 + <div class="modal-body">
  10 +
  11 + <div class="row row-no-gutter">
  12 + <div class="col-xs-6">
  13 + <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
  14 + <div class="pull-right">
  15 + <div class="btn-group">
  16 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.UP | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveListenerUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
  17 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.DOWN | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveListenerDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
  18 + </div>
  19 + <div class="btn-group">
  20 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.ADD | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewListener()"><i class="glyphicon glyphicon-plus"></i></a>
  21 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.REMOVE | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeListener()"><i class="glyphicon glyphicon-minus"></i></a>
  22 + </div>
  23 + </div>
  24 + </div>
  25 +
  26 + <div class="col-xs-6">
  27 + <div ng-show="selectedListeners.length > 0">
  28 +
  29 + <div class="form-group">
  30 + <label for="eventField">{{'PROPERTY.EXECUTIONLISTENERS.EVENT' | translate}}</label>
  31 + <select id="eventField" class="form-control" ng-model="selectedListeners[0].event">
  32 + <option>start</option>
  33 + <option>end</option>
  34 + <option>take</option>
  35 + </select>
  36 + </div>
  37 + <div class="form-group">
  38 + <label for="classField">{{'PROPERTY.EXECUTIONLISTENERS.CLASS' | translate}}</label>
  39 + <input type="text" id="classField" class="form-control" ng-model="selectedListeners[0].className" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EXECUTIONLISTENERS.CLASS.PLACEHOLDER' | translate}}" />
  40 + </div>
  41 + <div class="form-group">
  42 + <label for="expressionField">{{'PROPERTY.EXECUTIONLISTENERS.EXPRESSION' | translate}}</label>
  43 + <input type="text" id="expressionField" class="form-control" ng-model="selectedListeners[0].expression" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EXECUTIONLISTENERS.EXPRESSION.PLACEHOLDER' | translate}}" />
  44 + </div>
  45 + <div class="form-group">
  46 + <label for="delegateExpressionField">{{'PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION' | translate}}</label>
  47 + <input type="text" id="delegateExpressionField" class="form-control" ng-model="selectedListeners[0].delegateExpression" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER' | translate}}" />
  48 + </div>
  49 + </div>
  50 + <div ng-show="selectedListeners.length == 0" class="muted no-property-selected" translate>PROPERTY.EXECUTIONLISTENERS.UNSELECTED</div>
  51 + </div>
  52 + </div>
  53 +
  54 + <div class="row row-no-gutter">
  55 + <div class="col-xs-6">
  56 + <div ng-if="translationsRetrieved" class="kis-field-grid" ng-grid="gridFieldOptions"></div>
  57 + <div class="pull-right">
  58 + <div class="btn-group">
  59 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.UP | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveFieldUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
  60 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.DOWN | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveFieldDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
  61 + </div>
  62 + <div class="btn-group">
  63 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.ADD | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewField()"><i class="glyphicon glyphicon-plus"></i></a>
  64 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.REMOVE | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeField()"><i class="glyphicon glyphicon-minus"></i></a>
  65 + </div>
  66 + </div>
  67 + </div>
  68 +
  69 + <div class="col-xs-6">
  70 + <div ng-show="selectedFields.length > 0">
  71 +
  72 + <div class="form-group">
  73 + <label for="nameField">{{'PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME' | translate}}</label>
  74 + <input type="text" id="nameField" class="form-control" ng-model="selectedFields[0].name" placeholder="{{'PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME.PLACEHOLDER' | translate}}" />
  75 + </div>
  76 + <div class="form-group">
  77 + <label for="stringValueField">{{'PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE' | translate}}</label>
  78 + <input type="text" id="stringValueField" class="form-control" ng-model="selectedFields[0].stringValue" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER' | translate}}" />
  79 + </div>
  80 + <div class="form-group">
  81 + <label for="expressionField">{{'PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION' | translate}}</label>
  82 + <input type="text" id="expressionField" class="form-control" ng-model="selectedFields[0].expression" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER' | translate}}" />
  83 + </div>
  84 + <div class="form-group">
  85 + <label for="stringField">{{'PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING' | translate}}</label>
  86 + <textarea id="stringField" class="form-control" ng-model="selectedFields[0].string" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING.PLACEHOLDER' | translate}}"></textarea>
  87 + </div>
  88 +
  89 + </div>
  90 + <div ng-show="selectedFields.length == 0" class="muted no-property-selected"translate>PROPERTY.EXECUTIONLISTENERS.FIELDS.EMPTY</div>
  91 + </div>
  92 + </div>
  93 +
  94 + </div>
  95 + <div class="modal-footer">
  96 + <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
  97 + <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
  98 + </div>
  99 + </div>
  100 + </div>
  101 +</div>
  1 +
  2 +<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
  3 +<span ng-controller="KisBpmExecutionListenersCtrl">
  4 +</span>
  1 +
  2 +<div class="modal" ng-controller="BpmnFeedbackPopupCtrl">
  3 + <div class="modal-dialog">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <h2>{{'PROPERTY.FEEDBACK.TITLE' | translate:property}}</h2>
  7 + </div>
  8 + <div class="modal-body">
  9 + <p><textarea auto-focus class="form-control" ng-model="model.feedback" style="width:90%; height:100%; max-width: 100%; max-height: 100%; min-height: 300px"/></p>
  10 + </div>
  11 + <div class="modal-footer">
  12 + <button ng-click="cancel()" class="btn btn-primary" translate >ACTION.CANCEL</button>
  13 + <button ng-click="send()" ng-disabled="model.feedback.length === 0" class="btn btn-primary" translate >ACTION.SEND</button>
  14 + </div>
  15 + </div>
  16 + </div>
  17 +</div>
  1 +
  2 +<span ng-if="!property.noValue">{{'PROPERTY.FIELDS' | translate:property.value.fields}}</span>
  3 +<span ng-if="property.noValue">{{'PROPERTY.FIELDS.EMPTY' | translate}}</span>
  1 +
  2 +<div class="modal" ng-controller="KisBpmFieldsPopupCtrl">
  3 + <div class="modal-dialog modal-wide">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
  7 + <h3>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h3>
  8 + </div>
  9 + <div class="modal-body">
  10 +
  11 + <div class="row row-no-gutter">
  12 + <div class="col-xs-6">
  13 + <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
  14 + <div class="pull-right">
  15 + <div class="btn-group">
  16 + <a href="#" class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.UP' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveFieldUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
  17 + <a href="#" class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.DOWN' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveFieldDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
  18 + </div>
  19 + <div class="btn-group">
  20 + <a href="#" class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.ADD' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewField()"><i class="glyphicon glyphicon-plus"></i></a>
  21 + <a href="#" class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.REMOVE' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeField()"><i class="glyphicon glyphicon-minus"></i></a>
  22 + </div>
  23 + </div>
  24 + </div>
  25 +
  26 + <div class="col-xs-6">
  27 + <div ng-show="selectedFields.length > 0">
  28 +
  29 + <div class="form-group">
  30 + <label for="fieldName">{{'PROPERTY.FIELDS.NAME' | translate}}</label>
  31 + <input type="text" id="fieldName" class="form-control" ng-model="selectedFields[0].name" placeholder="{{'PROPERTY.FIELDS.NAME.PLACEHOLDER' | translate}}" />
  32 + </div>
  33 +
  34 + <div class="form-group">
  35 + <label for="fieldStringValue">{{'PROPERTY.FIELDS.STRINGVALUE' | translate}}</label>
  36 + <input type="text" id="fieldStringValue" class="form-control" ng-model="selectedFields[0].stringValue" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.FIELDS.STRINGVALUE.PLACEHOLDER' | translate}}" />
  37 + </div>
  38 +
  39 + <div class="form-group">
  40 + <label for="fieldExpression">{{'PROPERTY.FIELDS.EXPRESSION' | translate}}</label>
  41 + <input type="text" id="fieldExpression" class="form-control" ng-model="selectedFields[0].expression" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.FIELDS.EXPRESSION.PLACEHOLDER' | translate}}" />
  42 + </div>
  43 +
  44 + <div class="form-group">
  45 + <label for="fieldString">{{'PROPERTY.FIELDS.STRING' | translate}}</label>
  46 + <textarea type="text" id="fieldString" class="form-control" ng-model="selectedFields[0].string" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.FIELDS.STRING.PLACEHOLDER' | translate}}"></textarea>
  47 + </div>
  48 +
  49 + </div>
  50 + <div ng-show="selectedFields.length == 0" class="muted no-property-selected" translate>PROPERTY.FIELDS.EMPTY</div>
  51 + </div>
  52 + </div>
  53 +
  54 + </div>
  55 + <div class="modal-footer">
  56 + <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
  57 + <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
  58 + </div>
  59 + </div>
  60 + </div>
  61 +</div>
  1 +
  2 +<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
  3 +<span ng-controller="KisBpmFieldsCtrl">
  4 +</span>
  1 +
  2 +<span ng-if="!property.noValue">{{'PROPERTY.FORMPROPERTIES.VALUE' | translate:property.value.formProperties}}</span>
  3 +<span ng-if="property.noValue" translate>PROPERTY.FORMPROPERTIES.EMPTY</span>
  1 +
  2 +<div class="modal" ng-controller="KisBpmFormPropertiesPopupCtrl">
  3 + <div class="modal-dialog modal-wide">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
  7 + <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
  8 + </div>
  9 + <div class="modal-body">
  10 +
  11 + <div class="row row-no-gutter">
  12 + <div class="col-xs-6">
  13 + <div ng-if="translationsRetrieved" class="default-grid" ng-grid="gridOptions"></div>
  14 + <div class="pull-right">
  15 + <div class="btn-group">
  16 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.UP' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="movePropertyUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
  17 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.DOWN' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="movePropertyDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
  18 + </div>
  19 + <div class="btn-group">
  20 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.ADD' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewProperty()"><i class="glyphicon glyphicon-plus"></i></a>
  21 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.REMOVE' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeProperty()"><i class="glyphicon glyphicon-minus"></i></a>
  22 + </div>
  23 + </div>
  24 + </div>
  25 +
  26 + <div class="col-xs-6">
  27 + <div ng-show="selectedProperties.length > 0">
  28 +
  29 + <div class="form-group">
  30 + <label for="idField">{{'PROPERTY.FORMPROPERTIES.ID' | translate}}</label>
  31 + <input id="idField" class="form-control" type="text" ng-model="selectedProperties[0].id" placeholder="{{'PROPERTY.FORMPROPERTIES.ID.PLACEHOLDER' | translate }}" />
  32 + </div>
  33 + <div class="form-group">
  34 + <label for="nameField">{{'PROPERTY.FORMPROPERTIES.NAME' | translate}}</label>
  35 + <input id="nameField" class="form-control" type="text" ng-model="selectedProperties[0].name" placeholder="{{'PROPERTY.FORMPROPERTIES.NAME.PLACEHOLDER' | translate }}" />
  36 + </div>
  37 + <div class="form-group">
  38 + <label for="typeField">{{'PROPERTY.FORMPROPERTIES.TYPE' | translate}}</label>
  39 + <select id="typeField" class="form-control" ng-model="selectedProperties[0].type" ng-change="propertyTypeChanged()">
  40 + <option>string</option>
  41 + <option>long</option>
  42 + <option>boolean</option>
  43 + <option>date</option>
  44 + <option>enum</option>
  45 + </select>
  46 + </div>
  47 + <div class="form-group" ng-show="selectedProperties[0].datePattern">
  48 + <label for="datePatternField">{{'PROPERTY.FORMPROPERTIES.DATEPATTERN' | translate}}</label>
  49 + <input id="datePatternField" class="form-control" type="text" ng-model="selectedProperties[0].datePattern" placeholder="{{'PROPERTY.FORMPROPERTIES.DATEPATTERN.PLACEHOLDER' | translate }}" />
  50 + </div>
  51 + <div ng-if="selectedProperties[0].type == 'enum'" style="padding-bottom:10px">
  52 + <div class="row row-no-gutter">
  53 + <div class="col-xs-6">
  54 + <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="enumGridOptions"></div>
  55 + <div class="pull-right">
  56 + <div class="btn-group">
  57 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.UP | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveEnumValueUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
  58 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.DOWN | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveEnumValueDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
  59 + </div>
  60 + <div class="btn-group">
  61 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.ADD | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewEnumValue()"><i class="glyphicon glyphicon-plus"></i></a>
  62 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.REMOVE | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeEnumValue()"><i class="glyphicon glyphicon-minus"></i></a>
  63 + </div>
  64 + </div>
  65 + </div>
  66 +
  67 + <div class="col-xs-6">
  68 + <div ng-show="selectedEnumValues.length > 0">
  69 +
  70 + <div class="form-group">
  71 + <label for="classField">{{'PROPERTY.FORMPROPERTIES.VALUES.ID' | translate}}</label>
  72 + <input type="text" id="classField" class="form-control" ng-model="selectedEnumValues[0].id" placeholder="{{'PROPERTY.FORMPROPERTIES.VALUES.ID.PLACEHOLDER' | translate}}" />
  73 + </div>
  74 + <div class="form-group">
  75 + <label for="classField">{{'PROPERTY.FORMPROPERTIES.VALUES.NAME' | translate}}</label>
  76 + <input type="text" id="classField" class="form-control" ng-model="selectedEnumValues[0].name" placeholder="{{'PROPERTY.FORMPROPERTIES.VALUES.NAME.PLACEHOLDER' | translate}}" />
  77 + </div>
  78 + </div>
  79 + <div ng-show="selectedEnumValues.length == 0" class="muted no-property-selected" translate>PROPERTY.FORMPROPERTIES.ENUMVALUES.EMPTY</div>
  80 + </div>
  81 + </div>
  82 + </div>
  83 + <div class="form-group">
  84 + <label for="expressionField">{{'PROPERTY.FORMPROPERTIES.EXPRESSION' | translate}}</label>
  85 + <input id="expressionField" class="form-control" type="text" ng-model="selectedProperties[0].expression" placeholder="{{'PROPERTY.FORMPROPERTIES.EXPRESSION.PLACEHOLDER' | translate }}" />
  86 + </div>
  87 + <div class="form-group">
  88 + <label for="variableField">{{'PROPERTY.FORMPROPERTIES.VARIABLE' | translate}}</label>
  89 + <input id="variableField" class="form-control" type="text" ng-model="selectedProperties[0].variable" placeholder="{{'PROPERTY.FORMPROPERTIES.VARIABLE.PLACEHOLDER' | translate }}" />
  90 + </div>
  91 + <div class="form-inline">
  92 + <div class="form-group col-xs-2" >
  93 + <label for="requiredField">{{'PROPERTY.FORMPROPERTIES.REQUIRED' | translate}}</label>
  94 + <input id="requiredField" class="form-control" type="checkbox" ng-model="selectedProperties[0].required" />
  95 + </div>
  96 + <div class="form-group col-xs-2">
  97 + <label for="readableField">{{'PROPERTY.FORMPROPERTIES.READABLE' | translate}}</label>
  98 + <input id="readableField" class="form-control" type="checkbox" ng-model="selectedProperties[0].readable" />
  99 + </div>
  100 + <div class="form-group col-xs-2">
  101 + <label for="writableField">{{'PROPERTY.FORMPROPERTIES.WRITABLE' | translate}}</label>
  102 + <input id="writableField" class="form-control" type="checkbox" ng-model="selectedProperties[0].writable" />
  103 + </div>
  104 + </div>
  105 + </div>
  106 + <div ng-show="selectedProperties.length == 0" class="muted no-property-selected" translate>PROPERTY.FORMPROPERTIES.EMPTY</div>
  107 + </div>
  108 + </div>
  109 +
  110 + </div>
  111 + <div class="modal-footer">
  112 + <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
  113 + <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
  114 + </div>
  115 + </div>
  116 + </div>
  117 +</div>
  1 +
  2 +<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
  3 +<span ng-controller="KisBpmFormPropertiesCtrl">
  4 +</span>
  1 +
  2 +<span ng-if="!property.noValue">{{'PROPERTY.INPARAMETERS.VALUE' | translate:property.value.inParameters}}</span>
  3 +<span ng-if="property.noValue" translate>PROPERTY.INPARAMETERS.EMPTY</span>
  1 +
  2 +<div class="modal" ng-controller="KisBpmInParametersPopupCtrl">
  3 + <div class="modal-dialog modal-wide">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
  7 + <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
  8 + </div>
  9 + <div class="modal-body">
  10 +
  11 + <div class="row row-no-gutter">
  12 + <div class="col-xs-6">
  13 + <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
  14 + <div class="pull-right">
  15 + <div class="btn-group">
  16 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.UP' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveParameterUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
  17 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.DOWN' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveParameterDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
  18 + </div>
  19 + <div class="btn-group">
  20 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.ADD' | translate:property}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewParameter()"><i class="glyphicon glyphicon-plus"></i></a>
  21 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.REMOVE' | translate:property}}" data-placement="bottom" data-original-title="" title="" ng-click="removeParameter()"><i class="glyphicon glyphicon-minus"></i></a>
  22 + </div>
  23 + </div>
  24 + </div>
  25 +
  26 + <div class="col-xs-6">
  27 + <div ng-show="selectedParameters.length > 0">
  28 +
  29 + <div class="form-group">
  30 + <label for="sourceField">{{'PROPERTY.PARAMETER.SOURCE' | translate}}</label>
  31 + <input type="text" id="sourceField" class="form-control" ng-model="selectedParameters[0].source" placeholder="{{'PROPERTY.PARAMETER.SOURCE.PLACEHOLDER' | translate}}" />
  32 + </div>
  33 + <div class="form-group">
  34 + <label for="expressionField">{{'PROPERTY.PARAMETER.SOURCEEXPRESSION' | translate}}</label>
  35 + <input type="text" id="expressionField" class="form-control" ng-model="selectedParameters[0].sourceExpression" placeholder="{{'PROPERTY.PARAMETER.SOURCEEXPRESSION.PLACEHOLDER' | translate}}" />
  36 + </div>
  37 + <div class="form-group">
  38 + <label for="expressionField">{{'PROPERTY.PARAMETER.TARGET' | translate}}</label>
  39 + <input type="text" id="expressionField" class="form-control" ng-model="selectedParameters[0].target" placeholder="{{'PROPERTY.PARAMETER.TARGET.PLACEHOLDER' | translate}}" />
  40 + </div>
  41 +
  42 + </div>
  43 + <div ng-show="selectedParameters.length == 0" class="muted no-property-selected" translate>PROPERTY.PARAMETER.EMPTY</div>
  44 + </div>
  45 + </div>
  46 + </div>
  47 + <div class="modal-footer">
  48 + <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
  49 + <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
  50 + </div>
  51 + </div>
  52 + </div>
  53 +</div>
  1 +
  2 +<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
  3 +<span ng-controller="KisBpmInParametersCtrl">
  4 +</span>
  1 +<span ng-if="!property.noValue">{{'PROPERTY.MESSAGEDEFINITIONS.DISPLAY' | translate:property.value}}</span>
  2 +<span ng-if="property.noValue" translate>PROPERTY.MESSAGEDEFINITIONS.EMPTY</span>
  1 +
  2 +<div class="modal" ng-controller="ActivitiMessageDefinitionsPopupCtrl">
  3 + <div class="modal-dialog modal-wide">
  4 + <div class="modal-content">
  5 +
  6 + <div class="modal-header">
  7 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
  8 + <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
  9 + </div>
  10 +
  11 + <div class="modal-body">
  12 +
  13 + <div class="row row-no-gutter">
  14 +
  15 + <div class="col-xs-8">
  16 + <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
  17 + <div class="pull-right">
  18 + <div class="btn-group">
  19 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.ADD | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewMessageDefinition()"><i class="glyphicon glyphicon-plus"></i></a>
  20 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.REMOVE | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeMessageDefinition()"><i class="glyphicon glyphicon-minus"></i></a>
  21 + </div>
  22 + </div>
  23 + </div>
  24 +
  25 + <div class="col-xs-4" ng-show="selectedMessages && selectedMessages.length > 0">
  26 +
  27 + <div class="form-group">
  28 + <label>{{'PROPERTY.MESSAGEDEFINITIONS.ID' | translate}}</label>
  29 + <input type="text" class="form-control" ng-model="selectedMessages[0].id">
  30 + </div>
  31 +
  32 + <div class="form-group">
  33 + <label>{{'PROPERTY.MESSAGEDEFINITIONS.NAME' | translate}}</label>
  34 + <input type="text" class="form-control" ng-model="selectedMessages[0].name">
  35 + </div>
  36 +
  37 + </div>
  38 +
  39 + </div>
  40 +
  41 + </div>
  42 +
  43 + <div class="modal-footer">
  44 + <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
  45 + <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
  46 + </div>
  47 +
  48 + </div>
  49 + </div>
  50 +</div>
  1 +<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
  2 +<span ng-controller="ActivitiMessageDefinitionsCtrl">
  3 +</span>
  1 +<div ng-controller="ActivitiMessageRefCtrl">
  2 + <select ng-model="property.value" ng-change="messageChanged()" ng-options="messageDefinition.id as (messageDefinition.name + ' (' + messageDefinition.id + ')') for messageDefinition in messageDefinitions">
  3 + </select>
  4 +</div>
  1 +
  2 +<div ng-controller="KisBpmMultiInstanceCtrl">
  3 + <select ng-model="property.value" ng-change="multiInstanceChanged()">
  4 + <option>None</option>
  5 + <option value="Parallel">并行(Parallel)</option>
  6 + <option value="Sequential">顺序(Sequential)</option>
  7 + </select>
  8 +</div>
  1 +
  2 +<span ng-if="!property.noValue">{{'PROPERTY.OUTPARAMETERS.VALUE' | translate:property.value.outParameters}}</span>
  3 +<span ng-if="property.noValue" translate>PROPERTY.OUTPARAMETERS.EMPTY</span>
  1 +
  2 +<div class="modal" ng-controller="KisBpmOutParametersPopupCtrl">
  3 + <div class="modal-dialog modal-wide">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
  7 + <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
  8 + </div>
  9 + <div class="modal-body">
  10 +
  11 + <div class="row row-no-gutter">
  12 + <div class="col-xs-6">
  13 + <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
  14 + <div class="pull-right">
  15 + <div class="btn-group">
  16 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.UP' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveParameterUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
  17 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.MOVE.DOWN' | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveParameterDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
  18 + </div>
  19 + <div class="btn-group">
  20 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.ADD' | translate:property}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewParameter()"><i class="glyphicon glyphicon-plus"></i></a>
  21 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{'ACTION.REMOVE' | translate:property}}" data-placement="bottom" data-original-title="" title="" ng-click="removeParameter()"><i class="glyphicon glyphicon-minus"></i></a>
  22 + </div>
  23 + </div>
  24 + </div>
  25 +
  26 + <div class="col-xs-6">
  27 + <div ng-show="selectedParameters.length > 0">
  28 +
  29 + <div class="form-group">
  30 + <label for="sourceField">{{'PROPERTY.PARAMETER.SOURCE' | translate}}</label>
  31 + <input type="text" id="sourceField" class="form-control" ng-model="selectedParameters[0].source" placeholder="{{'PROPERTY.PARAMETER.SOURCE.PLACEHOLDER' | translate}}" />
  32 + </div>
  33 + <div class="form-group">
  34 + <label for="expressionField">{{'PROPERTY.PARAMETER.SOURCEEXPRESSION' | translate}}</label>
  35 + <input type="text" id="expressionField" class="form-control" ng-model="selectedParameters[0].sourceExpression" placeholder="{{'PROPERTY.PARAMETER.SOURCEEXPRESSION.PLACEHOLDER' | translate}}" />
  36 + </div>
  37 + <div class="form-group">
  38 + <label for="expressionField">{{'PROPERTY.PARAMETER.TARGET' | translate}}</label>
  39 + <input type="text" id="expressionField" class="form-control" ng-model="selectedParameters[0].target" placeholder="{{'PROPERTY.PARAMETER.TARGET.PLACEHOLDER' | translate}}" />
  40 + </div>
  41 +
  42 + </div>
  43 + <div ng-show="selectedParameters.length == 0" class="muted no-property-selected" translate>PROPERTY.PARAMETER.EMPTY</div>
  44 + </div>
  45 + </div>
  46 + </div>
  47 + <div class="modal-footer">
  48 + <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
  49 + <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
  50 + </div>
  51 + </div>
  52 + </div>
  53 +</div>
  1 +
  2 +<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
  3 +<span ng-controller="KisBpmOutParametersCtrl">
  4 +</span>
  1 +
  2 +<span ng-if="!property.noValue" translate>PROPERTY.SEQUENCEFLOW.ORDER.NOT.EMPTY</span>
  3 +<span ng-if="property.noValue" translate>PROPERTY.SEQUENCEFLOW.ORDER.EMPTY</span>
  1 +
  2 +<div class="modal" ng-controller="KisBpmSequenceFlowOrderPopupCtrl">
  3 + <div class="modal-dialog">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
  7 + <h3>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h3>
  8 + </div>
  9 +
  10 + <div class="modal-body">
  11 +
  12 + <div translate>PROPERTY.SEQUENCEFLOW.ORDER.DESCRIPTION</div>
  13 + <br/>
  14 + <ol>
  15 + <li class="sequence-flow-order-element" ng-repeat="sequenceFlow in outgoingSequenceFlow">
  16 + {{'PROPERTY.SEQUENCEFLOW.ORDER.SEQUENCEFLOW.VALUE' | translate:sequenceFlow}}
  17 + <a class="btn btn-icon btn-sm"
  18 + rel="tooltip"
  19 + data-title="{{'ACTION.MOVE.UP' | translate}}"
  20 + data-placement="bottom"
  21 + data-original-title="" title=""
  22 + ng-click="moveUp($index)"
  23 + ng-if="$index > 0">
  24 + <i class="glyphicon glyphicon-arrow-up"></i>
  25 + </a>
  26 + <a class="btn btn-icon btn-sm"
  27 + rel="tooltip"
  28 + data-title="{{'ACTION.MOVE.DOWN' | translate}}"
  29 + data-placement="bottom"
  30 + data-original-title=""
  31 + title=""
  32 + ng-click="moveDown($index)"
  33 + ng-if="$index < outgoingSequenceFlow.length - 1">
  34 + <i class="glyphicon glyphicon-arrow-down"></i>
  35 + </a>
  36 + </li>
  37 + </ol>
  38 +
  39 +
  40 + </div>
  41 + <div class="modal-footer">
  42 + <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
  43 + <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
  44 + </div>
  45 + </div>
  46 + </div>
  47 +</div>
  1 +
  2 +<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
  3 +<span ng-controller="KisBpmSequenceFlowOrderCtrl">
  4 +</span>
  1 +
  2 +<span ng-if="!property.noValue">{{'PROPERTY.SIGNALDEFINITIONS.DISPLAY' | translate:property.value}}</span>
  3 +<span ng-if="property.noValue" translate>PROPERTY.SIGNALDEFINITIONS.EMPTY</span>
  1 +
  2 +<div class="modal" ng-controller="ActivitiSignalDefinitionsPopupCtrl">
  3 + <div class="modal-dialog modal-wide">
  4 + <div class="modal-content">
  5 +
  6 + <div class="modal-header">
  7 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
  8 + <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
  9 + </div>
  10 +
  11 + <div class="modal-body">
  12 +
  13 + <div class="row row-no-gutter">
  14 +
  15 + <div class="col-xs-8">
  16 + <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
  17 + <div class="pull-right">
  18 + <div class="btn-group">
  19 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.ADD | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewSignalDefinition()"><i class="glyphicon glyphicon-plus"></i></a>
  20 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.REMOVE | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeSignalDefinition()"><i class="glyphicon glyphicon-minus"></i></a>
  21 + </div>
  22 + </div>
  23 + </div>
  24 +
  25 + <div class="col-xs-4" ng-show="selectedSignals && selectedSignals.length > 0">
  26 +
  27 + <div class="form-group">
  28 + <label>{{'PROPERTY.SIGNALDEFINITIONS.ID' | translate}}</label>
  29 + <input type="text" class="form-control" ng-model="selectedSignals[0].id">
  30 + </div>
  31 +
  32 + <div class="form-group">
  33 + <label>{{'PROPERTY.SIGNALDEFINITIONS.NAME' | translate}}</label>
  34 + <input type="text" class="form-control" ng-model="selectedSignals[0].name">
  35 + </div>
  36 +
  37 + <div class="form-group">
  38 + <label>{{'PROPERTY.SIGNALDEFINITIONS.SCOPE' | translate}}</label>
  39 + <select class="form-control" ng-model="selectedSignals[0].scope">
  40 + <option value="global">{{'PROPERTY.SIGNALDEFINITIONS.SCOPE-GLOBAL' | translate}}</option>
  41 + <option value="processInstance">{{'PROPERTY.SIGNALDEFINITIONS.SCOPE-PROCESSINSTANCE' | translate}}</option>
  42 + </select>
  43 + </div>
  44 +
  45 + </div>
  46 +
  47 + </div>
  48 +
  49 + </div>
  50 +
  51 + <div class="modal-footer">
  52 + <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
  53 + <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
  54 + </div>
  55 +
  56 + </div>
  57 + </div>
  58 +</div>
  1 +
  2 +<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
  3 +<span ng-controller="ActivitiSignalDefinitionsCtrl">
  4 +</span>
  1 +<div ng-controller="ActivitiSignalRefCtrl">
  2 + <select ng-model="property.value" ng-change="signalChanged()" ng-options="signalDefinition.id as (signalDefinition.name + ' (' + signalDefinition.id + ')') for signalDefinition in signalDefinitions">
  3 + </select>
  4 +</div>
  1 +
  2 +<div ng-controller="KisBpmStringPropertyCtrl">
  3 + <input type="text" ng-model="property.value"
  4 + class="form-control"
  5 + auto-focus
  6 + ng-blur="inputBlurred()"
  7 + ng-keypress="enterPressed($event)"/>
  8 +</div>
  1 +
  2 +<span ng-if="property.value.name">{{property.value.name}}</span>
  3 +<span ng-if="!property.value || !property.value.name" translate>PROPERTY.SUBPROCESSREFERENCE.EMPTY</span>
  1 +
  2 +<div class="modal" ng-controller="KisBpmCollapsedSubprocessReferencePopupCrtl">
  3 + <div class="modal-dialog modal-wide">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
  7 + <h2>
  8 + {{'PROPERTY.SUBPROCESSREFERENCE.TITLE' | translate}}
  9 + <span ng-show="selectedSubProcess != null"> - {{selectedSubProcess.name}}</span>
  10 + <span ng-show="selectedSubProcess == null"> - {{'PROPERTY.SUBPROCESSREFERENCE.EMPTY' | translate}}</span>
  11 +
  12 + </h2>
  13 + </div>
  14 + <div class="modal-body">
  15 + <div class="detail-group clearfix">
  16 + <div class="col-xs-12">
  17 + <div class="alert alert-error" ng-show="(!state.loadingFolders && !state.loadingSubprocesses) && state.subprocessError" translate>PROPERTY.SUBPROCESSREFERENCE.ERROR.SUBPROCESS</div>
  18 + </div>
  19 + </div>
  20 + <div class="detail-group clearfix">
  21 + <div class="col-xs-12 editor-item-picker">
  22 + <div ng-if="!state.loadingSubprocesses && !state.subprocessError" class="col-xs-4 editor-item-picker-component" ng-repeat="sub in subProcesses" ng-class="{'selected' : sub.id == selectedSubProcess.id}" ng-click="selectSubProcess(sub, $event)">
  23 + <div class="controls">
  24 + <input type="checkbox" value="option1" ng-click="selectSubProcess(sub, $event)" ng-checked="sub.id == selectedSubProcess.id" />
  25 + </div>
  26 + <h4>{{sub.name}}</h4>
  27 + <img src="{{config.contextRoot}}/app/rest/models/{{sub.id}}/thumbnail" />
  28 + </div>
  29 + <div ng-show="state.loadingSubprocesses">
  30 + <p class="loading" translate>PROPERTY.SUBPROCESSREFERENCE.SUBPROCESS.LOADING</p>
  31 + </div>
  32 + <div ng-show="!state.loadingSubprocesses && subProcesses.length == 0">
  33 + <p translate>PROPERTY.SUBPROCESSREFERENCE.SUBPROCESS.EMPTY</p>
  34 + </div>
  35 + </div>
  36 + </div>
  37 + </div>
  38 + <div class="modal-footer">
  39 + <button ng-disabled="state.subprocessError" ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
  40 + </div>
  41 + </div>
  42 + </div>
  43 +</div>
  1 +
  2 +<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
  3 +<span ng-controller="KisBpmCollapsedSubprocessReferenceCrtl">
  4 +</span>
  1 +
  2 +<span ng-if="!property.noValue">{{'PROPERTY.TASKLISTENERS.VALUE' | translate:property.value.taskListeners}}</span>
  3 +<span ng-if="property.noValue" translate>PROPERTY.TASKLISTENERS.EMPTY</span>
  1 +
  2 +<div class="modal" ng-controller="KisBpmTaskListenersPopupCtrl">
  3 + <div class="modal-dialog modal-wide">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
  7 + <h2>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h2>
  8 + </div>
  9 + <div class="modal-body">
  10 +
  11 + <div class="row row-no-gutter">
  12 + <div class="col-xs-6">
  13 + <div ng-if="translationsRetrieved" class="kis-listener-grid" ng-grid="gridOptions"></div>
  14 + <div class="pull-right">
  15 + <div class="btn-group">
  16 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.UP | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveListenerUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
  17 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.DOWN | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveListenerDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
  18 + </div>
  19 + <div class="btn-group">
  20 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.ADD | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewListener()"><i class="glyphicon glyphicon-plus"></i></a>
  21 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.REMOVE | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeListener()"><i class="glyphicon glyphicon-minus"></i></a>
  22 + </div>
  23 + </div>
  24 + </div>
  25 +
  26 + <div class="col-xs-6">
  27 + <div ng-show="selectedListeners.length > 0">
  28 +
  29 + <div class="form-group">
  30 + <label for="eventField">{{'PROPERTY.TASKLISTENERS.EVENT' | translate}}</label>
  31 + <select id="eventField" class="form-control" ng-model="selectedListeners[0].event">
  32 + <option>create</option>
  33 + <option>assignment</option>
  34 + <option>complete</option>
  35 + <option>delete</option>
  36 + </select>
  37 + </div>
  38 + <div class="form-group">
  39 + <label for="classField">{{'PROPERTY.TASKLISTENERS.CLASS' | translate}}</label>
  40 + <input type="text" id="classField" class="form-control" ng-model="selectedListeners[0].className" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.TASKLISTENERS.CLASS.PLACEHOLDER' | translate}}" />
  41 + </div>
  42 + <div class="form-group">
  43 + <label for="expressionField">{{'PROPERTY.TASKLISTENERS.EXPRESSION' | translate}}</label>
  44 + <input type="text" id="expressionField" class="form-control" ng-model="selectedListeners[0].expression" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.TASKLISTENERS.EXPRESSION.PLACEHOLDER' | translate}}" />
  45 + </div>
  46 + <div class="form-group">
  47 + <label for="delegateExpressionField">{{'PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION' | translate}}</label>
  48 + <input type="text" id="delegateExpressionField" class="form-control" ng-model="selectedListeners[0].delegateExpression" ng-change="listenerDetailsChanged()" placeholder="{{'PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER' | translate}}" />
  49 + </div>
  50 + </div>
  51 + <div ng-show="selectedListeners.length == 0" class="muted no-property-selected" translate>PROPERTY.TASKLISTENERS.UNSELECTED</div>
  52 + </div>
  53 + </div>
  54 +
  55 + <div class="row row-no-gutter">
  56 + <div class="col-xs-6">
  57 + <div ng-if="translationsRetrieved" class="kis-field-grid" ng-grid="gridFieldOptions"></div>
  58 + <div class="pull-right">
  59 + <div class="btn-group">
  60 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.UP | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveFieldUp()"><i class="glyphicon glyphicon-arrow-up"></i></a>
  61 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.MOVE.DOWN | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="moveFieldDown()"><i class="glyphicon glyphicon-arrow-down"></i></a>
  62 + </div>
  63 + <div class="btn-group">
  64 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.ADD | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="addNewField()"><i class="glyphicon glyphicon-plus"></i></a>
  65 + <a class="btn btn-icon btn-lg" rel="tooltip" data-title="{{ACTION.REMOVE | translate}}" data-placement="bottom" data-original-title="" title="" ng-click="removeField()"><i class="glyphicon glyphicon-minus"></i></a>
  66 + </div>
  67 + </div>
  68 + </div>
  69 +
  70 + <div class="col-xs-6">
  71 + <div ng-show="selectedFields.length > 0">
  72 +
  73 + <div class="form-group">
  74 + <label for="nameField">{{'PROPERTY.TASKLISTENERS.FIELDS.NAME' | translate}}</label>
  75 + <input type="text" id="nameField" class="form-control" ng-model="selectedFields[0].name" placeholder="{{'PROPERTY.TASKLISTENERS.FIELDS.NAME.PLACEHOLDER' | translate}}" />
  76 + </div>
  77 + <div class="form-group">
  78 + <label for="stringValueField">{{'PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE' | translate}}</label>
  79 + <input type="text" id="stringValueField" class="form-control" ng-model="selectedFields[0].stringValue" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER' | translate}}" />
  80 + </div>
  81 + <div class="form-group">
  82 + <label for="expressionField">{{'PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION' | translate}}</label>
  83 + <input type="text" id="expressionField" class="form-control" ng-model="selectedFields[0].expression" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER' | translate}}" />
  84 + </div>
  85 + <div class="form-group">
  86 + <label for="stringField">{{'PROPERTY.TASKLISTENERS.FIELDS.STRING' | translate}}</label>
  87 + <textarea id="stringField" class="form-control" ng-model="selectedFields[0].string" ng-change="fieldDetailsChanged()" placeholder="{{'PROPERTY.TASKLISTENERS.FIELDS.STRING.PLACEHOLDER' | translate}}"></textarea>
  88 + </div>
  89 +
  90 + </div>
  91 + <div ng-show="selectedFields.length == 0" class="muted no-property-selected"translate>PROPERTY.TASKLISTENERS.FIELDS.EMPTY</div>
  92 + </div>
  93 + </div>
  94 +
  95 + </div>
  96 + <div class="modal-footer">
  97 + <button ng-click="cancel()" class="btn btn-primary" translate>ACTION.CANCEL</button>
  98 + <button ng-click="save()" class="btn btn-primary" translate>ACTION.SAVE</button>
  99 + </div>
  100 + </div>
  101 + </div>
  102 +</div>
  1 +
  2 +<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
  3 +<span ng-controller="KisBpmTaskListenersCtrl">
  4 +</span>
  1 +
  2 +<div class="modal" ng-controller="KisBpmTextPropertyPopupCtrl">
  3 + <div class="modal-dialog">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" ng-click="close()">&times;</button>
  7 + <h3>{{'PROPERTY.PROPERTY.EDIT.TITLE' | translate:property}}</h3>
  8 + </div>
  9 + <div class="modal-body">
  10 + <p><textarea auto-focus class="form-control" ng-model="property.value" style="width:70%; height:100%; max-width: 100%; max-height: 100%; min-height: 200px"/></p>
  11 + </div>
  12 + <div class="modal-footer">
  13 + <button ng-click="save()" class="btn btn-primary" translate >ACTION.SAVE</button>
  14 + </div>
  15 + </div>
  16 + </div>
  17 +</div>
  1 +
  2 +<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
  3 +<span ng-controller="KisBpmTextPropertyCtrl">
  4 +</span>
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  1 +/*
  2 + * Activiti Modeler component part of the Activiti project
  3 + * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
  4 + *
  5 + * This library is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU Lesser General Public
  7 + * License as published by the Free Software Foundation; either
  8 + * version 2.1 of the License, or (at your option) any later version.
  9 + *
  10 + * This library is distributed in the hope that it will be useful,
  11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 + * Lesser General Public License for more details.
  14 +
  15 + * You should have received a copy of the GNU Lesser General Public
  16 + * License along with this library; if not, write to the Free Software
  17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18 + */
  19 +'use strict';
  20 +
  21 +var KISBPM = KISBPM || {};
  22 +KISBPM.TOOLBAR = {
  23 + ACTIONS: {
  24 +
  25 + saveModel: function (services) {
  26 +
  27 + var modal = services.$modal({
  28 + backdrop: true,
  29 + keyboard: true,
  30 + template: 'editor-app/popups/save-model.html?version=' + Date.now(),
  31 + scope: services.$scope
  32 + });
  33 + },
  34 +
  35 + undo: function (services) {
  36 +
  37 + // Get the last commands
  38 + var lastCommands = services.$scope.undoStack.pop();
  39 +
  40 + if (lastCommands) {
  41 + // Add the commands to the redo stack
  42 + services.$scope.redoStack.push(lastCommands);
  43 +
  44 + // Force refresh of selection, might be that the undo command
  45 + // impacts properties in the selected item
  46 + if (services.$rootScope && services.$rootScope.forceSelectionRefresh)
  47 + {
  48 + services.$rootScope.forceSelectionRefresh = true;
  49 + }
  50 +
  51 + // Rollback every command
  52 + for (var i = lastCommands.length - 1; i >= 0; --i) {
  53 + lastCommands[i].rollback();
  54 + }
  55 +
  56 + // Update and refresh the canvas
  57 + services.$scope.editor.handleEvents({
  58 + type: ORYX.CONFIG.EVENT_UNDO_ROLLBACK,
  59 + commands: lastCommands
  60 + });
  61 +
  62 + // Update
  63 + services.$scope.editor.getCanvas().update();
  64 + services.$scope.editor.updateSelection();
  65 + }
  66 +
  67 + var toggleUndo = false;
  68 + if (services.$scope.undoStack.length == 0)
  69 + {
  70 + toggleUndo = true;
  71 + }
  72 +
  73 + var toggleRedo = false;
  74 + if (services.$scope.redoStack.length > 0)
  75 + {
  76 + toggleRedo = true;
  77 + }
  78 +
  79 + if (toggleUndo || toggleRedo) {
  80 + for (var i = 0; i < services.$scope.items.length; i++) {
  81 + var item = services.$scope.items[i];
  82 + if (toggleUndo && item.action === 'KISBPM.TOOLBAR.ACTIONS.undo') {
  83 + services.$scope.safeApply(function () {
  84 + item.enabled = false;
  85 + });
  86 + }
  87 + else if (toggleRedo && item.action === 'KISBPM.TOOLBAR.ACTIONS.redo') {
  88 + services.$scope.safeApply(function () {
  89 + item.enabled = true;
  90 + });
  91 + }
  92 + }
  93 + }
  94 + },
  95 +
  96 + redo: function (services) {
  97 +
  98 + // Get the last commands from the redo stack
  99 + var lastCommands = services.$scope.redoStack.pop();
  100 +
  101 + if (lastCommands) {
  102 + // Add this commands to the undo stack
  103 + services.$scope.undoStack.push(lastCommands);
  104 +
  105 + // Force refresh of selection, might be that the redo command
  106 + // impacts properties in the selected item
  107 + if (services.$rootScope && services.$rootScope.forceSelectionRefresh)
  108 + {
  109 + services.$rootScope.forceSelectionRefresh = true;
  110 + }
  111 +
  112 + // Execute those commands
  113 + lastCommands.each(function (command) {
  114 + command.execute();
  115 + });
  116 +
  117 + // Update and refresh the canvas
  118 + services.$scope.editor.handleEvents({
  119 + type: ORYX.CONFIG.EVENT_UNDO_EXECUTE,
  120 + commands: lastCommands
  121 + });
  122 +
  123 + // Update
  124 + services.$scope.editor.getCanvas().update();
  125 + services.$scope.editor.updateSelection();
  126 + }
  127 +
  128 + var toggleUndo = false;
  129 + if (services.$scope.undoStack.length > 0) {
  130 + toggleUndo = true;
  131 + }
  132 +
  133 + var toggleRedo = false;
  134 + if (services.$scope.redoStack.length == 0) {
  135 + toggleRedo = true;
  136 + }
  137 +
  138 + if (toggleUndo || toggleRedo) {
  139 + for (var i = 0; i < services.$scope.items.length; i++) {
  140 + var item = services.$scope.items[i];
  141 + if (toggleUndo && item.action === 'KISBPM.TOOLBAR.ACTIONS.undo') {
  142 + services.$scope.safeApply(function () {
  143 + item.enabled = true;
  144 + });
  145 + }
  146 + else if (toggleRedo && item.action === 'KISBPM.TOOLBAR.ACTIONS.redo') {
  147 + services.$scope.safeApply(function () {
  148 + item.enabled = false;
  149 + });
  150 + }
  151 + }
  152 + }
  153 + },
  154 +
  155 + cut: function (services) {
  156 + KISBPM.TOOLBAR.ACTIONS._getOryxEditPlugin(services.$scope).editCut();
  157 + for (var i = 0; i < services.$scope.items.length; i++) {
  158 + var item = services.$scope.items[i];
  159 + if (item.action === 'KISBPM.TOOLBAR.ACTIONS.paste') {
  160 + services.$scope.safeApply(function () {
  161 + item.enabled = true;
  162 + });
  163 + }
  164 + }
  165 + },
  166 +
  167 + copy: function (services) {
  168 + KISBPM.TOOLBAR.ACTIONS._getOryxEditPlugin(services.$scope).editCopy();
  169 + for (var i = 0; i < services.$scope.items.length; i++) {
  170 + var item = services.$scope.items[i];
  171 + if (item.action === 'KISBPM.TOOLBAR.ACTIONS.paste') {
  172 + services.$scope.safeApply(function () {
  173 + item.enabled = true;
  174 + });
  175 + }
  176 + }
  177 + },
  178 +
  179 + paste: function (services) {
  180 + KISBPM.TOOLBAR.ACTIONS._getOryxEditPlugin(services.$scope).editPaste();
  181 + },
  182 +
  183 + deleteItem: function (services) {
  184 + KISBPM.TOOLBAR.ACTIONS._getOryxEditPlugin(services.$scope).editDelete();
  185 + },
  186 +
  187 + addBendPoint: function (services) {
  188 +
  189 + var dockerPlugin = KISBPM.TOOLBAR.ACTIONS._getOryxDockerPlugin(services.$scope);
  190 +
  191 + var enableAdd = !dockerPlugin.enabledAdd();
  192 + dockerPlugin.setEnableAdd(enableAdd);
  193 + if (enableAdd)
  194 + {
  195 + dockerPlugin.setEnableRemove(false);
  196 + document.body.style.cursor = 'pointer';
  197 + }
  198 + else
  199 + {
  200 + document.body.style.cursor = 'default';
  201 + }
  202 + },
  203 +
  204 + removeBendPoint: function (services) {
  205 +
  206 + var dockerPlugin = KISBPM.TOOLBAR.ACTIONS._getOryxDockerPlugin(services.$scope);
  207 +
  208 + var enableRemove = !dockerPlugin.enabledRemove();
  209 + dockerPlugin.setEnableRemove(enableRemove);
  210 + if (enableRemove)
  211 + {
  212 + dockerPlugin.setEnableAdd(false);
  213 + document.body.style.cursor = 'pointer';
  214 + }
  215 + else
  216 + {
  217 + document.body.style.cursor = 'default';
  218 + }
  219 + },
  220 +
  221 + /**
  222 + * Helper method: fetches the Oryx Edit plugin from the provided scope,
  223 + * if not on the scope, it is created and put on the scope for further use.
  224 + *
  225 + * It's important to reuse the same EditPlugin while the same scope is active,
  226 + * as the clipboard is stored for the whole lifetime of the scope.
  227 + */
  228 + _getOryxEditPlugin: function ($scope) {
  229 + if ($scope.oryxEditPlugin === undefined || $scope.oryxEditPlugin === null) {
  230 + $scope.oryxEditPlugin = new ORYX.Plugins.Edit($scope.editor);
  231 + }
  232 + return $scope.oryxEditPlugin;
  233 + },
  234 +
  235 + zoomIn: function (services) {
  236 + KISBPM.TOOLBAR.ACTIONS._getOryxViewPlugin(services.$scope).zoom([1.0 + ORYX.CONFIG.ZOOM_OFFSET]);
  237 + },
  238 +
  239 + zoomOut: function (services) {
  240 + KISBPM.TOOLBAR.ACTIONS._getOryxViewPlugin(services.$scope).zoom([1.0 - ORYX.CONFIG.ZOOM_OFFSET]);
  241 + },
  242 +
  243 + zoomActual: function (services) {
  244 + KISBPM.TOOLBAR.ACTIONS._getOryxViewPlugin(services.$scope).setAFixZoomLevel(1);
  245 + },
  246 +
  247 + zoomFit: function (services) {
  248 + KISBPM.TOOLBAR.ACTIONS._getOryxViewPlugin(services.$scope).zoomFitToModel();
  249 + },
  250 +
  251 + alignVertical: function (services) {
  252 + KISBPM.TOOLBAR.ACTIONS._getOryxArrangmentPlugin(services.$scope).alignShapes([ORYX.CONFIG.EDITOR_ALIGN_MIDDLE]);
  253 + },
  254 +
  255 + alignHorizontal: function (services) {
  256 + KISBPM.TOOLBAR.ACTIONS._getOryxArrangmentPlugin(services.$scope).alignShapes([ORYX.CONFIG.EDITOR_ALIGN_CENTER]);
  257 + },
  258 +
  259 + sameSize: function (services) {
  260 + KISBPM.TOOLBAR.ACTIONS._getOryxArrangmentPlugin(services.$scope).alignShapes([ORYX.CONFIG.EDITOR_ALIGN_SIZE]);
  261 + },
  262 +
  263 + closeEditor: function(services) {
  264 + //window.location.href = "./";
  265 + if(window.confirm('请确认数据是否已经保存,确定要关闭编辑器吗?'))
  266 + window.close();//add by cheshuyan at 2016.05.21
  267 + },
  268 +
  269 + /**
  270 + * Helper method: fetches the Oryx View plugin from the provided scope,
  271 + * if not on the scope, it is created and put on the scope for further use.
  272 + */
  273 + _getOryxViewPlugin: function ($scope) {
  274 + if ($scope.oryxViewPlugin === undefined || $scope.oryxViewPlugin === null) {
  275 + $scope.oryxViewPlugin = new ORYX.Plugins.View($scope.editor);
  276 + }
  277 + return $scope.oryxViewPlugin;
  278 + },
  279 +
  280 + _getOryxArrangmentPlugin: function ($scope) {
  281 + if ($scope.oryxArrangmentPlugin === undefined || $scope.oryxArrangmentPlugin === null) {
  282 + $scope.oryxArrangmentPlugin = new ORYX.Plugins.Arrangement($scope.editor);
  283 + }
  284 + return $scope.oryxArrangmentPlugin;
  285 + },
  286 +
  287 + _getOryxDockerPlugin: function ($scope) {
  288 + if ($scope.oryxDockerPlugin === undefined || $scope.oryxDockerPlugin === null) {
  289 + $scope.oryxDockerPlugin = new ORYX.Plugins.AddDocker($scope.editor);
  290 + }
  291 + return $scope.oryxDockerPlugin;
  292 + }
  293 + }
  294 +};
  295 +
  296 +/** Custom controller for the save dialog */
  297 +var SaveModelCtrl = [ '$rootScope', '$scope', '$http', '$route', '$location',
  298 + function ($rootScope, $scope, $http, $route, $location) {
  299 +
  300 + var modelMetaData = $scope.editor.getModelMetaData();
  301 +
  302 + var description = '';
  303 + if (modelMetaData.description) {
  304 + description = modelMetaData.description;
  305 + }
  306 +
  307 + var saveDialog = { 'name' : modelMetaData.name,
  308 + 'description' : description};
  309 +
  310 + $scope.saveDialog = saveDialog;
  311 +
  312 + var json = $scope.editor.getJSON();
  313 + json = JSON.stringify(json);
  314 +
  315 + var params = {
  316 + modeltype: modelMetaData.model.modelType,
  317 + json_xml: json,
  318 + name: 'model'
  319 + };
  320 +
  321 + $scope.status = {
  322 + loading: false
  323 + };
  324 +
  325 + $scope.close = function () {
  326 + $scope.$hide();
  327 + };
  328 +
  329 + $scope.saveAndClose = function () {
  330 + $scope.save(function() {
  331 + //window.location.href = "./";
  332 + if(window.confirm('请确认数据是否已经保存,确定要关闭编辑器吗?'))
  333 + window.close();//add by cheshuyan at 2016.05.21
  334 + });
  335 + };
  336 + $scope.save = function (successCallback) {
  337 +
  338 + if (!$scope.saveDialog.name || $scope.saveDialog.name.length == 0) {
  339 + return;
  340 + }
  341 +
  342 + // Indicator spinner image
  343 + $scope.status = {
  344 + loading: true
  345 + };
  346 +
  347 + modelMetaData.name = $scope.saveDialog.name;
  348 + modelMetaData.description = $scope.saveDialog.description;
  349 +
  350 + var json = $scope.editor.getJSON();
  351 + json = JSON.stringify(json);
  352 +
  353 + var selection = $scope.editor.getSelection();
  354 + $scope.editor.setSelection([]);
  355 +
  356 + // Get the serialized svg image source
  357 + var svgClone = $scope.editor.getCanvas().getSVGRepresentation(true);
  358 + $scope.editor.setSelection(selection);
  359 + if ($scope.editor.getCanvas().properties["oryx-showstripableelements"] === false) {
  360 + var stripOutArray = jQuery(svgClone).find(".stripable-element");
  361 + for (var i = stripOutArray.length - 1; i >= 0; i--) {
  362 + stripOutArray[i].remove();
  363 + }
  364 + }
  365 +
  366 + // Remove all forced stripable elements
  367 + var stripOutArray = jQuery(svgClone).find(".stripable-element-force");
  368 + for (var i = stripOutArray.length - 1; i >= 0; i--) {
  369 + stripOutArray[i].remove();
  370 + }
  371 +
  372 + // Parse dom to string
  373 + var svgDOM = DataManager.serialize(svgClone);
  374 +
  375 + var params = {
  376 + json_xml: json,
  377 + svg_xml: svgDOM,
  378 + name: $scope.saveDialog.name,
  379 + description: $scope.saveDialog.description
  380 + };
  381 +
  382 + // Update
  383 + $http({ method: 'PUT',
  384 + data: params,
  385 + ignoreErrors: true,
  386 + headers: {'Accept': 'application/json',
  387 + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
  388 + transformRequest: function (obj) {
  389 + var str = [];
  390 + for (var p in obj) {
  391 + str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
  392 + }
  393 + return str.join("&");
  394 + },
  395 + url: KISBPM.URL.putModel(modelMetaData.modelId)})
  396 +
  397 + .success(function (data, status, headers, config) {
  398 + $scope.editor.handleEvents({
  399 + type: ORYX.CONFIG.EVENT_SAVED
  400 + });
  401 + $scope.modelData.name = $scope.saveDialog.name;
  402 + $scope.modelData.lastUpdated = data.lastUpdated;
  403 +
  404 + $scope.status.loading = false;
  405 + $scope.$hide();
  406 +
  407 + // Fire event to all who is listening
  408 + var saveEvent = {
  409 + type: KISBPM.eventBus.EVENT_TYPE_MODEL_SAVED,
  410 + model: params,
  411 + modelId: modelMetaData.modelId,
  412 + eventType: 'update-model'
  413 + };
  414 + KISBPM.eventBus.dispatch(KISBPM.eventBus.EVENT_TYPE_MODEL_SAVED, saveEvent);
  415 +
  416 + // Reset state
  417 + $scope.error = undefined;
  418 + $scope.status.loading = false;
  419 +
  420 + // Execute any callback
  421 + if (successCallback) {
  422 + successCallback();
  423 + }
  424 +
  425 + })
  426 + .error(function (data, status, headers, config) {
  427 + $scope.error = {};
  428 + console.log('Something went wrong when updating the process model:' + JSON.stringify(data));
  429 + $scope.status.loading = false;
  430 + });
  431 + };
  432 +
  433 +}];