source: branches/1.2/workflow/js/move_instances/main.js @ 1349

Revision 1349, 6.4 KB checked in by niltonneto, 15 years ago (diff)

Ticket #561 - Inclusão do módulo Workflow faltante nessa versão.

Line 
1function callAjax(action, mode, handler, parameters)
2{
3        var url = '$this.' + action + '.' + mode;
4        if (parameters)
5                cExecute(url, handler, $H(parameters).toQueryString());
6        else
7                cExecute(url, handler);
8}
9
10/* check for error on ajax calls */
11function checkError(data)
12{
13        if (data['error'])
14        {
15                alert(data['error']);
16                return true;
17        }
18        else
19                return false;
20}
21
22/* construct the processes list (combos) */
23function buildProcessesList(data)
24{
25        if (checkError(data))
26                return;
27
28        function createCombo(data, name)
29        {
30                var output = '<select name="' + name + '" id="' + name + '" onchange="loadActivities();">';
31                output += '<option value="-1"></option>';
32                for (var i = 0; i < data.length; i++)
33                        output += '<option value="' + data[i]['wf_p_id'] + '">' + data[i]['wf_name'] + ' (v' + data[i]['wf_version'] + ')</option>';
34                output += '</select>';
35                return output;
36        }
37
38        $('divFrom').innerHTML = '<h3>Origem</h3>' + createCombo(data, 'processFrom');
39        $('divTo').innerHTML = '<h3>Destino</h3>' + createCombo(data, 'processTo');
40}
41
42/* load the activities of the selected process */
43function loadActivities()
44{
45        function loadActivitiesResult(data)
46        {
47                if (checkError(data))
48                        return;
49
50                var divFromActivities;
51                var divToActivities;
52                if ($('divFromActivities') != null)
53                {
54                        $('divTo').removeChild($('divToActivities'));
55                        $('divFrom').removeChild($('divWindow'));
56                }
57
58                new Insertion.Bottom($('divTo'), '<div id="divToActivities"></div>');
59                new Insertion.Bottom($('divFrom'), '<div class="window" id="divWindow" style="position: fixed;"><h3 id="fromTitle">Atividades</h3><div id="divFromActivities" class="activities"></div></div>');
60                divToActivities = $('divToActivities');
61                divFromActivities = $('divFromActivities');
62
63                /* create the "from" activities list */
64                var current;
65                for (var i = 0; i < data['from'].length; i++)
66                {
67                        current = data['from'][i];
68                        divFromActivities.innerHTML += '<h2 class="activity" id="af' + current['wf_activity_id'] + '">' + current['wf_name'] + '</h2>';
69                }
70                /* make the activities draggable */
71                for (var i = 0; i < data['from'].length; i++)
72                        new Draggable('af' + data['from'][i]['wf_activity_id'], {revert:true});
73
74                /* create the "to" activities list */
75                for (var i = 0; i < data['to'].length; i++)
76                {
77                        current = data['to'][i];
78                        divToActivities.innerHTML += '<div class="window"><h3>' + current['wf_name'] + '</h3><div class="activities" style="min-height: 30px;" id="at' + current['wf_activity_id'] + '"></div></div>';
79                }
80
81                /* add a drop zone to the activities div */
82                for (var i = 0; i < data['to'].length; i++)
83                        Droppables.add('at' + data['to'][i]['wf_activity_id'], {accept: 'activity', onDrop: dropActivity});
84
85                /* round the corners of the divs */
86                Nifty("div.window h3","top");
87
88                /* add the "Move Instances" button */
89                if (!$('moveInstancesButton'))
90                {
91                        new Insertion.Bottom($('mainBody'), '<p id="pInfo">Mova as atividades do processo de origem para as atividades correspondentes do processo de destino</p>')
92                        var newContent = '<center><table><tr><td><label><input type="checkbox" name="active" id="active" checked="checked"/> Incluir instâncias ativas</label></td></tr>';
93                        newContent += '<tr><td><label><input type="checkbox" name="completed" id="completed" checked="checked"/> Incluir instâncias finalizadas</label></td></tr>';
94                        newContent += '<tr><td align="center"><button onclick="moveInstances(); return false;" style="display: none;" id="moveInstancesButton" class="moveInstancesButton">Mover Instâncias</button></td></tr></table></center>';
95                        new Insertion.Bottom($('mainBody'), newContent)
96                }
97
98                /* pre-match some activities (based on their names) */
99                autoAssignActivities(data['pre-match']);
100        }
101
102        if (($F('processFrom') == -1) || ($F('processTo') == -1))
103        {
104                if ($('divFromActivities'))
105                {
106                        $('divTo').removeChild($('divToActivities'));
107                        $('divFrom').removeChild($('divWindow'));
108                        $('moveInstancesButton').hide();
109                }
110                return false;
111        }
112        var params = {
113                from: $F('processFrom'),
114                to: $F('processTo')
115        };
116
117        callAjax('bo_move_instances', 'loadActivities', loadActivitiesResult, params);
118}
119
120/* move the instances from on process to another */
121function moveInstances()
122{
123        if ($F('processFrom') == $F('processTo'))
124        {
125                alert('O processo de origem e destino são o mesmo.');
126                return false;
127        }
128
129        if ($$('div#divFromActivities h2').length > 0)
130        {
131                alert('Todas as atividades do processo de origem devem ser mapeadas.');
132                return false;
133        }
134
135        if (!confirm("Tem certeza que deseja mover as instâncias?"))
136                return false;
137
138        function moveInstancesResult(data)
139        {
140                if (checkError(data))
141                        return;
142
143                if (data)
144                        alert("As instâncias foram movidas com sucesso");
145        }
146
147        var activityMappings = new Array();
148        $A($('divToActivities').childNodes).each(function(toElement)
149                {
150                        if (toElement.childNodes[1].childNodes.length > 0)
151                        {
152                                var toID = toElement.childNodes[1].id.substring(2);
153                                activityMappings[toID] = new Array();
154                                $A(toElement.childNodes[1].childNodes).each(function (fromElement)
155                                        {
156                                                activityMappings[toID][activityMappings[toID].length] = fromElement.id.substring(2);
157                                        }
158                                );
159                                activityMappings[toID] = $H(activityMappings[toID]);
160                        }
161                }
162        );
163
164        var params = {
165                from: $F('processFrom'),
166                to: $F('processTo'),
167                activityMappings: JSON.stringify($H(activityMappings)),
168                active: $F('active'),
169                completed: $F('completed')
170        };
171
172        callAjax('bo_move_instances', 'moveInstances', moveInstancesResult, params);
173}
174
175/* drag and drop manager */
176function dropActivity(dragElement, dropElement)
177{
178        var parentElement = dragElement.parentNode;
179        dropElement.appendChild(dragElement);
180        if ($('pInfo'))
181        {
182                $('mainBody').removeChild($('pInfo'));
183        }
184        if ((parentElement.childNodes.length == 0) && (parentElement.id == 'divFromActivities'))
185        {
186                var paragraph = document.createElement('p');
187                paragraph.innerHTML = 'sem atividades';
188                parentElement.appendChild(paragraph);
189                $('moveInstancesButton').show();
190        }
191}
192
193/* assign pre-matched activities based on their names */
194function autoAssignActivities(matches)
195{
196        for (var i = 0; i < matches.length; i++)
197                $('at' + matches[i]['to']).appendChild($('af' + matches[i]['from']));
198        if ($('divFromActivities').childNodes.length == 0)
199        {
200                var paragraph = document.createElement('p');
201                paragraph.innerHTML = 'sem atividades';
202                $('divFromActivities').appendChild(paragraph);
203                $('moveInstancesButton').show();
204        }
205        else
206                $('moveInstancesButton').hide();
207}
208
209/* interface start */
210window.onload = function()
211{
212        callAjax('bo_move_instances', 'loadProcesses', buildProcessesList);
213};
Note: See TracBrowser for help on using the repository browser.