cpee 2.1.43 → 2.1.45
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/cockpit/css/wfadaptor.css +9 -2
- data/cockpit/js/instance.js +45 -29
- data/cockpit/templates/Coopis 2010.xml +69 -10
- data/cockpit/themes/compact/symbols/delete.svg +4 -0
- data/cockpit/themes/compact/theme.js +31 -4
- data/cockpit/themes/control/symbols/delete.svg +4 -0
- data/cockpit/themes/control/theme.js +31 -4
- data/cockpit/themes/default/symbols/delete.svg +4 -0
- data/cockpit/themes/default/theme.js +31 -4
- data/cockpit/themes/extended/symbols/delete.svg +4 -0
- data/cockpit/themes/extended/theme.js +31 -4
- data/cockpit/themes/model/symbols/delete.svg +4 -0
- data/cockpit/themes/model/theme.js +30 -3
- data/cockpit/themes/packed/symbols/delete.svg +4 -0
- data/cockpit/themes/packed/theme.js +31 -4
- data/cockpit/themes/preset/symbols/delete.svg +4 -0
- data/cockpit/themes/preset/theme.js +31 -4
- data/cpee.gemspec +1 -1
- data/server/executionhandlers/ruby/backend/instance.template +1 -1
- data/server/executionhandlers/ruby/connection.rb +4 -0
- data/server/routing/forward-events.lock +0 -0
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 310a80c81a71084a7728c434c6e6e94f87f6af6f5f335385d7ed894bac4ae969
|
4
|
+
data.tar.gz: 8f154ce48422441b0cb2fe74e6a4c3f49ca55e650bef9d9e5f89b3b0b01becef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f839d65b84a85fce540360accafd66641a39481354e237e874d18e43d1c7b2193b644430f7f481ea49bf101886768e2b3d732b644d17d359d030d380a6f37d40
|
7
|
+
data.tar.gz: d13397de40eb2e07287e760399b9d9107bdf2ee4cdc290a222f027e5fd4c2c68e8b09bd170aa1c7d76f4a353da9196666f329addc68410e7c95462c2308553ce
|
data/cockpit/css/wfadaptor.css
CHANGED
@@ -27,7 +27,7 @@
|
|
27
27
|
--wfadaptor-selected: #f57900;
|
28
28
|
--wfadaptor-stripe: #e9e9e9;
|
29
29
|
--wfadaptor-background: #ffffff;
|
30
|
-
--wfadaptor-
|
30
|
+
--wfadaptor-menu: #ef2929;
|
31
31
|
--wfadaptor-border: #a1a1a1;
|
32
32
|
}
|
33
33
|
|
@@ -73,7 +73,11 @@ svg g.vote .rline {
|
|
73
73
|
}
|
74
74
|
|
75
75
|
svg .rfill.menu {
|
76
|
-
fill: var(--wfadaptor-
|
76
|
+
fill: var(--wfadaptor-menu);
|
77
|
+
fill-opacity:1;
|
78
|
+
}
|
79
|
+
svg .hfill.menu {
|
80
|
+
fill: var(--wfadaptor-menu);
|
77
81
|
fill-opacity:1;
|
78
82
|
}
|
79
83
|
|
@@ -130,6 +134,9 @@ svg .standfat {
|
|
130
134
|
stroke-opacity:1;
|
131
135
|
stroke-dasharray:none;
|
132
136
|
}
|
137
|
+
svg .standfat.menu {
|
138
|
+
stroke: var(--wfadaptor-menu);
|
139
|
+
}
|
133
140
|
svg .normal {
|
134
141
|
fill: var(--wfadaptor-base);
|
135
142
|
fill-opacity:1;
|
data/cockpit/js/instance.js
CHANGED
@@ -19,7 +19,8 @@ function global_init() {
|
|
19
19
|
subscription_state = 'less';
|
20
20
|
save['state']= undefined;
|
21
21
|
save['dsl'] = undefined;
|
22
|
-
save['
|
22
|
+
save['activity_red_states'] = {}
|
23
|
+
save['activity_blue_states'] = {}
|
23
24
|
save['graph'] = undefined;
|
24
25
|
save['graph_theme'] = undefined;
|
25
26
|
save['graph_adaptor'] = undefined;
|
@@ -682,25 +683,56 @@ function monitor_instance_pos() {// {{{
|
|
682
683
|
}// }}}
|
683
684
|
|
684
685
|
function monitor_instance_running(content,event) {// {{{
|
685
|
-
if (save['state'] == "stopping") return;
|
686
686
|
if (event == "calling") {
|
687
|
-
if (!save['
|
688
|
-
save['
|
687
|
+
if (!save['activity_red_states'][content['activity-uuid']]) {
|
688
|
+
save['activity_red_states'][content['activity-uuid']] = true
|
689
689
|
format_visual_add(content.activity,"active")
|
690
690
|
}
|
691
691
|
} else if (event == "manipulating") {
|
692
|
-
if (!save['
|
693
|
-
save['
|
692
|
+
if (!save['activity_red_states'][content['activity-uuid']]) {
|
693
|
+
save['activity_red_states'][content['activity-uuid']] = true
|
694
694
|
format_visual_add(content.activity,"active")
|
695
695
|
}
|
696
696
|
} else if (event == "done") {
|
697
|
-
if (save['
|
698
|
-
|
699
|
-
format_visual_remove(content.activity,"active")
|
700
|
-
setTimeout(() => {delete save['activity_states'][content['activity-uuid']]},5000);
|
697
|
+
if (save['activity_red_states'][content['activity-uuid']]) {
|
698
|
+
format_visual_remove(content.activity,"active");
|
701
699
|
}
|
700
|
+
save['activity_red_states'][content['activity-uuid']] = true
|
701
|
+
setTimeout(() => {delete save['activity_red_states'][content['activity-uuid']]},5000);
|
702
702
|
}
|
703
703
|
} // }}}
|
704
|
+
function monitor_instance_pos_change(content) {// {{{
|
705
|
+
if (content['at']) {
|
706
|
+
$.each(content['at'],function(a,b){
|
707
|
+
if (!save['activity_blue_states'][b.uuid]) {
|
708
|
+
save['activity_blue_states'][b.uuid] = true
|
709
|
+
format_visual_add(b.position,"passive");
|
710
|
+
}
|
711
|
+
});
|
712
|
+
}
|
713
|
+
if (content['after']) {
|
714
|
+
$.each(content['after'],function(a,b){
|
715
|
+
if (!save['activity_blue_states'][b.uuid]) {
|
716
|
+
save['activity_blue_states'][b.uuid] = true
|
717
|
+
format_visual_add(b.position,"passive");
|
718
|
+
}
|
719
|
+
});
|
720
|
+
}
|
721
|
+
if (content['unmark']) {
|
722
|
+
$.each(content['unmark'],function(a,b){
|
723
|
+
if (save['activity_blue_states'][b.uuid]) {
|
724
|
+
format_visual_remove(b.position,"passive")
|
725
|
+
}
|
726
|
+
save['activity_blue_states'][b.uuid] = true
|
727
|
+
setTimeout(() => {delete save['activity_blue_states'][b.uuid]},5000);
|
728
|
+
});
|
729
|
+
}
|
730
|
+
if (!content['at'] && !content['unmark'] && !content['after'] && !content['wait']) {
|
731
|
+
monitor_instance_pos();
|
732
|
+
}
|
733
|
+
} // }}}
|
734
|
+
|
735
|
+
|
704
736
|
function monitor_instance_state_change(notification) { //{{{
|
705
737
|
if ($('#trackcolumn').length > 0) {
|
706
738
|
if (notification == "finished" || notification == "abandoned") {
|
@@ -763,22 +795,6 @@ function monitor_instance_state_change(notification) { //{{{
|
|
763
795
|
$("#state_text").text(notification);
|
764
796
|
}
|
765
797
|
} //}}}
|
766
|
-
function monitor_instance_pos_change(content) {// {{{
|
767
|
-
if (content['unmark']) {
|
768
|
-
$.each(content['unmark'],function(a,b){
|
769
|
-
format_visual_remove(b.position,"passive")
|
770
|
-
});
|
771
|
-
}
|
772
|
-
if (content['at']) {
|
773
|
-
$.each(content['at'],function(a,b){
|
774
|
-
format_visual_add(b.position,"passive");
|
775
|
-
});
|
776
|
-
}
|
777
|
-
if (!content['at'] && !content['unmark'] && !content['after'] && !content['wait']) {
|
778
|
-
monitor_instance_pos();
|
779
|
-
}
|
780
|
-
} // }}}
|
781
|
-
|
782
798
|
function monitor_instance_vote_add(parts) {// {{{
|
783
799
|
var ctv = $("#votes");
|
784
800
|
|
@@ -1415,12 +1431,12 @@ function ui_pos(e,bl) {
|
|
1415
1431
|
var url = $('body').attr('current-instance');
|
1416
1432
|
var coll = [];
|
1417
1433
|
$('g.element.primitive > g.activities.active, g.element.primitive > g.activities.passive').each(function(a,b){
|
1418
|
-
coll.push($(b).parent().attr('element-id'));
|
1434
|
+
coll.push([$(b).parent().attr('element-id'), $(b).parent().attr('element-type') == 'stop' ? 'after' : 'at']);
|
1419
1435
|
});
|
1420
1436
|
coll = bl(coll);
|
1421
1437
|
var vals = "";
|
1422
1438
|
$(coll).each(function(k,ele){
|
1423
|
-
vals += "<" + ele + ">
|
1439
|
+
vals += "<" + ele[0] + ">" + ele[1] + "</" + ele[0] + ">";
|
1424
1440
|
});
|
1425
1441
|
vals = "<positions xmlns='http://cpee.org/ns/properties/2.0'>" + vals + "</positions>";
|
1426
1442
|
$.ajax({
|
@@ -1444,7 +1460,7 @@ function del_ui_pos(e) {
|
|
1444
1460
|
}
|
1445
1461
|
function add_ui_pos(e) {
|
1446
1462
|
ui_pos(e,function(coll){
|
1447
|
-
coll.push($(e).attr('id'));
|
1463
|
+
coll.push([$(e).attr('id'), e.nodeName == 'stop' ? 'after' : 'at']);
|
1448
1464
|
return coll;
|
1449
1465
|
});
|
1450
1466
|
}
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<dataelements>
|
5
5
|
<persons>3</persons>
|
6
6
|
<card>Visa_12345</card>
|
7
|
-
<airline
|
7
|
+
<airline/>
|
8
8
|
<hotels>[]</hotels>
|
9
9
|
<from>Vienna</from>
|
10
10
|
<to>Prague</to>
|
@@ -37,9 +37,9 @@
|
|
37
37
|
<label>Book Airline 1</label>
|
38
38
|
<method>:post</method>
|
39
39
|
<arguments>
|
40
|
-
<from
|
41
|
-
<to
|
42
|
-
<persons
|
40
|
+
<from>!data.from</from>
|
41
|
+
<to>!data.to</to>
|
42
|
+
<persons>!data.persons</persons>
|
43
43
|
</arguments>
|
44
44
|
</parameters>
|
45
45
|
<code>
|
@@ -56,6 +56,9 @@ status.update 1, 'Hotel'</finalize>
|
|
56
56
|
<_timing_avg/>
|
57
57
|
<explanations/>
|
58
58
|
</_timing>
|
59
|
+
<_shifting>
|
60
|
+
<_shifting_type>Duration</_shifting_type>
|
61
|
+
</_shifting>
|
59
62
|
<_context_data_analysis>
|
60
63
|
<probes/>
|
61
64
|
<ips/>
|
@@ -86,15 +89,46 @@ status.update 1, 'Hotel'</finalize>
|
|
86
89
|
<label>Book Hotel</label>
|
87
90
|
<method>:post</method>
|
88
91
|
<arguments>
|
89
|
-
<to
|
92
|
+
<to>!data.to</to>
|
90
93
|
</arguments>
|
91
94
|
</parameters>
|
92
95
|
<code>
|
96
|
+
<prepare/>
|
93
97
|
<finalize output="result">data.hotels << result.value('id')
|
94
98
|
data.costs += result.value('costs').to_f</finalize>
|
99
|
+
<update output="result"/>
|
100
|
+
<rescue output="result"/>
|
95
101
|
</code>
|
96
|
-
<annotations
|
97
|
-
|
102
|
+
<annotations>
|
103
|
+
<_timing>
|
104
|
+
<_timing_weight/>
|
105
|
+
<_timing_avg/>
|
106
|
+
<explanations/>
|
107
|
+
</_timing>
|
108
|
+
<_shifting>
|
109
|
+
<_shifting_type>Duration</_shifting_type>
|
110
|
+
</_shifting>
|
111
|
+
<_context_data_analysis>
|
112
|
+
<probes/>
|
113
|
+
<ips/>
|
114
|
+
</_context_data_analysis>
|
115
|
+
<report>
|
116
|
+
<url/>
|
117
|
+
</report>
|
118
|
+
<_notes>
|
119
|
+
<_notes_general/>
|
120
|
+
</_notes>
|
121
|
+
</annotations>
|
122
|
+
<documentation>
|
123
|
+
<input/>
|
124
|
+
<output/>
|
125
|
+
<implementation>
|
126
|
+
<description/>
|
127
|
+
</implementation>
|
128
|
+
<code>
|
129
|
+
<description/>
|
130
|
+
</code>
|
131
|
+
</documentation>
|
98
132
|
</call>
|
99
133
|
</parallel_branch>
|
100
134
|
<manipulate id="a3">data.persons -= 1</manipulate>
|
@@ -107,11 +141,36 @@ data.costs += result.value('costs').to_f</finalize>
|
|
107
141
|
<label>Approve Hotel</label>
|
108
142
|
<method>:post</method>
|
109
143
|
<arguments>
|
110
|
-
<costs
|
144
|
+
<costs>!data.costs</costs>
|
111
145
|
</arguments>
|
112
146
|
</parameters>
|
113
|
-
<annotations
|
114
|
-
|
147
|
+
<annotations>
|
148
|
+
<_timing>
|
149
|
+
<_timing_weight/>
|
150
|
+
<_timing_avg/>
|
151
|
+
<explanations/>
|
152
|
+
</_timing>
|
153
|
+
<_shifting>
|
154
|
+
<_shifting_type>Duration</_shifting_type>
|
155
|
+
</_shifting>
|
156
|
+
<_context_data_analysis>
|
157
|
+
<probes/>
|
158
|
+
<ips/>
|
159
|
+
</_context_data_analysis>
|
160
|
+
<report>
|
161
|
+
<url/>
|
162
|
+
</report>
|
163
|
+
<_notes>
|
164
|
+
<_notes_general/>
|
165
|
+
</_notes>
|
166
|
+
</annotations>
|
167
|
+
<documentation>
|
168
|
+
<input/>
|
169
|
+
<output/>
|
170
|
+
<implementation>
|
171
|
+
<description/>
|
172
|
+
</implementation>
|
173
|
+
</documentation>
|
115
174
|
</call>
|
116
175
|
</alternative>
|
117
176
|
</choose>
|
@@ -93,7 +93,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
93
93
|
|
94
94
|
nodes = JSON.parse(nodes);
|
95
95
|
$(nodes).each(function(key,str) {
|
96
|
-
nodes[key] = $X(str)
|
96
|
+
nodes[key] = $X(str);
|
97
97
|
});
|
98
98
|
|
99
99
|
var check1 = [];
|
@@ -176,14 +176,40 @@ function WFAdaptorManifestation(adaptor) {
|
|
176
176
|
|
177
177
|
if(xml_node.get(0).tagName != 'description' && !self.elements[xml_node.get(0).tagName].neverdelete) {
|
178
178
|
var icon = self.elements[xml_node.get(0).tagName].illustrator.svg.clone();
|
179
|
-
icon.
|
179
|
+
icon.find('.rfill').addClass('menu');
|
180
|
+
icon.find('.hfill').addClass('menu');
|
180
181
|
menu['Delete'] = [{
|
181
182
|
'label': 'Remove Element',
|
182
|
-
'function_call': function(selector,target,selected){
|
183
|
+
'function_call': function(selector,target,selected){
|
184
|
+
del_ui_pos(target)
|
185
|
+
self.adaptor.description.remove(selector,target);
|
186
|
+
},
|
183
187
|
'menu_icon': icon,
|
184
188
|
'type': undefined,
|
185
189
|
'params': [null, xml_node, self.selected()]
|
186
190
|
}];
|
191
|
+
var nodes = localStorage.getItem('marked');
|
192
|
+
nodes = JSON.parse(nodes);
|
193
|
+
if (nodes && nodes.length > 0) {
|
194
|
+
var icond = self.resources['delete'].clone();
|
195
|
+
icond.children('.standfat').addClass('menu');
|
196
|
+
menu['Delete'].push({
|
197
|
+
'label': 'Remove Marked Elements',
|
198
|
+
'function_call': function(){
|
199
|
+
$(nodes).each(function(key,str) {
|
200
|
+
nodes[key] = $X(str);
|
201
|
+
});
|
202
|
+
$(nodes).each(function(key,node){
|
203
|
+
var target = self.adaptor.description.get_node_by_svg_id($(node).attr('svg-id'));
|
204
|
+
del_ui_pos(target)
|
205
|
+
self.adaptor.description.remove(null,target);
|
206
|
+
});
|
207
|
+
},
|
208
|
+
'menu_icon': icond,
|
209
|
+
'type': undefined,
|
210
|
+
'params': []
|
211
|
+
})
|
212
|
+
}
|
187
213
|
}
|
188
214
|
if($('> code', xml_node).length > 0 && xml_node.get(0).tagName == 'call') {
|
189
215
|
var icon = self.elements.callmanipulate.illustrator.svg.clone();
|
@@ -198,7 +224,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
198
224
|
}
|
199
225
|
if (xml_node.get(0).tagName == "call" || xml_node.get(0).tagName == "manipulate" || xml_node.get(0).tagName == "stop") {
|
200
226
|
var icon = self.elements.call.illustrator.svg.clone();
|
201
|
-
icon.children('g.replace').addClass('
|
227
|
+
icon.children('g.replace').addClass('passive');
|
202
228
|
var vtarget = self.adaptor.illustrator.get_node_by_svg_id(svgid);
|
203
229
|
if (vtarget.length > 0) {
|
204
230
|
if (vtarget.parents('g.activities.passive, g.activities.active').length > 0) {
|
@@ -299,6 +325,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
299
325
|
|
300
326
|
// other resources
|
301
327
|
this.resources.arrow = self.adaptor.theme_dir + 'symbols/arrow.svg';
|
328
|
+
this.resources.delete = self.adaptor.theme_dir + 'symbols/delete.svg';
|
302
329
|
|
303
330
|
// Primitive Elements
|
304
331
|
this.elements.call = { /*{{{*/
|
@@ -93,7 +93,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
93
93
|
|
94
94
|
nodes = JSON.parse(nodes);
|
95
95
|
$(nodes).each(function(key,str) {
|
96
|
-
nodes[key] = $X(str)
|
96
|
+
nodes[key] = $X(str);
|
97
97
|
});
|
98
98
|
|
99
99
|
var check1 = [];
|
@@ -176,14 +176,40 @@ function WFAdaptorManifestation(adaptor) {
|
|
176
176
|
|
177
177
|
if(xml_node.get(0).tagName != 'description' && !self.elements[xml_node.get(0).tagName].neverdelete) {
|
178
178
|
var icon = self.elements[xml_node.get(0).tagName].illustrator.svg.clone();
|
179
|
-
icon.
|
179
|
+
icon.find('.rfill').addClass('menu');
|
180
|
+
icon.find('.hfill').addClass('menu');
|
180
181
|
menu['Delete'] = [{
|
181
182
|
'label': 'Remove Element',
|
182
|
-
'function_call': function(selector,target,selected){
|
183
|
+
'function_call': function(selector,target,selected){
|
184
|
+
del_ui_pos(target)
|
185
|
+
self.adaptor.description.remove(selector,target);
|
186
|
+
},
|
183
187
|
'menu_icon': icon,
|
184
188
|
'type': undefined,
|
185
189
|
'params': [null, xml_node, self.selected()]
|
186
190
|
}];
|
191
|
+
var nodes = localStorage.getItem('marked');
|
192
|
+
nodes = JSON.parse(nodes);
|
193
|
+
if (nodes && nodes.length > 0) {
|
194
|
+
var icond = self.resources['delete'].clone();
|
195
|
+
icond.children('.standfat').addClass('menu');
|
196
|
+
menu['Delete'].push({
|
197
|
+
'label': 'Remove Marked Elements',
|
198
|
+
'function_call': function(){
|
199
|
+
$(nodes).each(function(key,str) {
|
200
|
+
nodes[key] = $X(str);
|
201
|
+
});
|
202
|
+
$(nodes).each(function(key,node){
|
203
|
+
var target = self.adaptor.description.get_node_by_svg_id($(node).attr('svg-id'));
|
204
|
+
del_ui_pos(target)
|
205
|
+
self.adaptor.description.remove(null,target);
|
206
|
+
});
|
207
|
+
},
|
208
|
+
'menu_icon': icond,
|
209
|
+
'type': undefined,
|
210
|
+
'params': []
|
211
|
+
})
|
212
|
+
}
|
187
213
|
}
|
188
214
|
if($('> code', xml_node).length > 0 && xml_node.get(0).tagName == 'call') {
|
189
215
|
var icon = self.elements.callmanipulate.illustrator.svg.clone();
|
@@ -198,7 +224,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
198
224
|
}
|
199
225
|
if (xml_node.get(0).tagName == "call" || xml_node.get(0).tagName == "manipulate" || xml_node.get(0).tagName == "stop") {
|
200
226
|
var icon = self.elements.call.illustrator.svg.clone();
|
201
|
-
icon.children('g.replace').addClass('
|
227
|
+
icon.children('g.replace').addClass('passive');
|
202
228
|
var vtarget = self.adaptor.illustrator.get_node_by_svg_id(svgid);
|
203
229
|
if (vtarget.length > 0) {
|
204
230
|
if (vtarget.parents('g.activities.passive, g.activities.active').length > 0) {
|
@@ -299,6 +325,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
299
325
|
|
300
326
|
// other resources
|
301
327
|
this.resources.arrow = self.adaptor.theme_dir + 'symbols/arrow.svg';
|
328
|
+
this.resources.delete = self.adaptor.theme_dir + 'symbols/delete.svg';
|
302
329
|
|
303
330
|
// Primitive Elements
|
304
331
|
this.elements.call = { /*{{{*/
|
@@ -93,7 +93,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
93
93
|
|
94
94
|
nodes = JSON.parse(nodes);
|
95
95
|
$(nodes).each(function(key,str) {
|
96
|
-
nodes[key] = $X(str)
|
96
|
+
nodes[key] = $X(str);
|
97
97
|
});
|
98
98
|
|
99
99
|
var check1 = [];
|
@@ -176,14 +176,40 @@ function WFAdaptorManifestation(adaptor) {
|
|
176
176
|
|
177
177
|
if(xml_node.get(0).tagName != 'description' && !self.elements[xml_node.get(0).tagName].neverdelete) {
|
178
178
|
var icon = self.elements[xml_node.get(0).tagName].illustrator.svg.clone();
|
179
|
-
icon.
|
179
|
+
icon.find('.rfill').addClass('menu');
|
180
|
+
icon.find('.hfill').addClass('menu');
|
180
181
|
menu['Delete'] = [{
|
181
182
|
'label': 'Remove Element',
|
182
|
-
'function_call': function(selector,target,selected){
|
183
|
+
'function_call': function(selector,target,selected){
|
184
|
+
del_ui_pos(target)
|
185
|
+
self.adaptor.description.remove(selector,target);
|
186
|
+
},
|
183
187
|
'menu_icon': icon,
|
184
188
|
'type': undefined,
|
185
189
|
'params': [null, xml_node, self.selected()]
|
186
190
|
}];
|
191
|
+
var nodes = localStorage.getItem('marked');
|
192
|
+
nodes = JSON.parse(nodes);
|
193
|
+
if (nodes && nodes.length > 0) {
|
194
|
+
var icond = self.resources['delete'].clone();
|
195
|
+
icond.children('.standfat').addClass('menu');
|
196
|
+
menu['Delete'].push({
|
197
|
+
'label': 'Remove Marked Elements',
|
198
|
+
'function_call': function(){
|
199
|
+
$(nodes).each(function(key,str) {
|
200
|
+
nodes[key] = $X(str);
|
201
|
+
});
|
202
|
+
$(nodes).each(function(key,node){
|
203
|
+
var target = self.adaptor.description.get_node_by_svg_id($(node).attr('svg-id'));
|
204
|
+
del_ui_pos(target)
|
205
|
+
self.adaptor.description.remove(null,target);
|
206
|
+
});
|
207
|
+
},
|
208
|
+
'menu_icon': icond,
|
209
|
+
'type': undefined,
|
210
|
+
'params': []
|
211
|
+
})
|
212
|
+
}
|
187
213
|
}
|
188
214
|
if($('> code', xml_node).length > 0 && xml_node.get(0).tagName == 'call') {
|
189
215
|
var icon = self.elements.callmanipulate.illustrator.svg.clone();
|
@@ -198,7 +224,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
198
224
|
}
|
199
225
|
if (xml_node.get(0).tagName == "call" || xml_node.get(0).tagName == "manipulate" || xml_node.get(0).tagName == "stop") {
|
200
226
|
var icon = self.elements.call.illustrator.svg.clone();
|
201
|
-
icon.children('g.replace').addClass('
|
227
|
+
icon.children('g.replace').addClass('passive');
|
202
228
|
var vtarget = self.adaptor.illustrator.get_node_by_svg_id(svgid);
|
203
229
|
if (vtarget.length > 0) {
|
204
230
|
if (vtarget.parents('g.activities.passive, g.activities.active').length > 0) {
|
@@ -299,6 +325,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
299
325
|
|
300
326
|
// other resources
|
301
327
|
this.resources.arrow = self.adaptor.theme_dir + 'symbols/arrow.svg';
|
328
|
+
this.resources.delete = self.adaptor.theme_dir + 'symbols/delete.svg';
|
302
329
|
|
303
330
|
// Primitive Elements
|
304
331
|
this.elements.call = { /*{{{*/
|
@@ -93,7 +93,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
93
93
|
|
94
94
|
nodes = JSON.parse(nodes);
|
95
95
|
$(nodes).each(function(key,str) {
|
96
|
-
nodes[key] = $X(str)
|
96
|
+
nodes[key] = $X(str);
|
97
97
|
});
|
98
98
|
|
99
99
|
var check1 = [];
|
@@ -176,14 +176,40 @@ function WFAdaptorManifestation(adaptor) {
|
|
176
176
|
|
177
177
|
if(xml_node.get(0).tagName != 'description' && !self.elements[xml_node.get(0).tagName].neverdelete) {
|
178
178
|
var icon = self.elements[xml_node.get(0).tagName].illustrator.svg.clone();
|
179
|
-
icon.
|
179
|
+
icon.find('.rfill').addClass('menu');
|
180
|
+
icon.find('.hfill').addClass('menu');
|
180
181
|
menu['Delete'] = [{
|
181
182
|
'label': 'Remove Element',
|
182
|
-
'function_call': function(selector,target,selected){
|
183
|
+
'function_call': function(selector,target,selected){
|
184
|
+
del_ui_pos(target)
|
185
|
+
self.adaptor.description.remove(selector,target);
|
186
|
+
},
|
183
187
|
'menu_icon': icon,
|
184
188
|
'type': undefined,
|
185
189
|
'params': [null, xml_node, self.selected()]
|
186
190
|
}];
|
191
|
+
var nodes = localStorage.getItem('marked');
|
192
|
+
nodes = JSON.parse(nodes);
|
193
|
+
if (nodes && nodes.length > 0) {
|
194
|
+
var icond = self.resources['delete'].clone();
|
195
|
+
icond.children('.standfat').addClass('menu');
|
196
|
+
menu['Delete'].push({
|
197
|
+
'label': 'Remove Marked Elements',
|
198
|
+
'function_call': function(){
|
199
|
+
$(nodes).each(function(key,str) {
|
200
|
+
nodes[key] = $X(str);
|
201
|
+
});
|
202
|
+
$(nodes).each(function(key,node){
|
203
|
+
var target = self.adaptor.description.get_node_by_svg_id($(node).attr('svg-id'));
|
204
|
+
del_ui_pos(target)
|
205
|
+
self.adaptor.description.remove(null,target);
|
206
|
+
});
|
207
|
+
},
|
208
|
+
'menu_icon': icond,
|
209
|
+
'type': undefined,
|
210
|
+
'params': []
|
211
|
+
})
|
212
|
+
}
|
187
213
|
}
|
188
214
|
if($('> code', xml_node).length > 0 && xml_node.get(0).tagName == 'call') {
|
189
215
|
var icon = self.elements.callmanipulate.illustrator.svg.clone();
|
@@ -198,7 +224,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
198
224
|
}
|
199
225
|
if (xml_node.get(0).tagName == "call" || xml_node.get(0).tagName == "manipulate" || xml_node.get(0).tagName == "stop") {
|
200
226
|
var icon = self.elements.call.illustrator.svg.clone();
|
201
|
-
icon.children('g.replace').addClass('
|
227
|
+
icon.children('g.replace').addClass('passive');
|
202
228
|
var vtarget = self.adaptor.illustrator.get_node_by_svg_id(svgid);
|
203
229
|
if (vtarget.length > 0) {
|
204
230
|
if (vtarget.parents('g.activities.passive, g.activities.active').length > 0) {
|
@@ -299,6 +325,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
299
325
|
|
300
326
|
// other resources
|
301
327
|
this.resources.arrow = self.adaptor.theme_dir + 'symbols/arrow.svg';
|
328
|
+
this.resources.delete = self.adaptor.theme_dir + 'symbols/delete.svg';
|
302
329
|
|
303
330
|
// Primitive Elements
|
304
331
|
this.elements.call = { /*{{{*/
|
@@ -93,7 +93,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
93
93
|
|
94
94
|
nodes = JSON.parse(nodes);
|
95
95
|
$(nodes).each(function(key,str) {
|
96
|
-
nodes[key] = $X(str)
|
96
|
+
nodes[key] = $X(str);
|
97
97
|
});
|
98
98
|
|
99
99
|
var check1 = [];
|
@@ -176,14 +176,40 @@ function WFAdaptorManifestation(adaptor) {
|
|
176
176
|
|
177
177
|
if(xml_node.get(0).tagName != 'description' && !self.elements[xml_node.get(0).tagName].neverdelete) {
|
178
178
|
var icon = self.elements[xml_node.get(0).tagName].illustrator.svg.clone();
|
179
|
-
icon.
|
179
|
+
icon.find('.rfill').addClass('menu');
|
180
|
+
icon.find('.hfill').addClass('menu');
|
180
181
|
menu['Delete'] = [{
|
181
182
|
'label': 'Remove Element',
|
182
|
-
'function_call': function(selector,target,selected){
|
183
|
+
'function_call': function(selector,target,selected){
|
184
|
+
del_ui_pos(target)
|
185
|
+
self.adaptor.description.remove(selector,target);
|
186
|
+
},
|
183
187
|
'menu_icon': icon,
|
184
188
|
'type': undefined,
|
185
189
|
'params': [null, xml_node, self.selected()]
|
186
190
|
}];
|
191
|
+
var nodes = localStorage.getItem('marked');
|
192
|
+
nodes = JSON.parse(nodes);
|
193
|
+
if (nodes && nodes.length > 0) {
|
194
|
+
var icond = self.resources['delete'].clone();
|
195
|
+
icond.children('.standfat').addClass('menu');
|
196
|
+
menu['Delete'].push({
|
197
|
+
'label': 'Remove Marked Elements',
|
198
|
+
'function_call': function(){
|
199
|
+
$(nodes).each(function(key,str) {
|
200
|
+
nodes[key] = $X(str);
|
201
|
+
});
|
202
|
+
$(nodes).each(function(key,node){
|
203
|
+
var target = self.adaptor.description.get_node_by_svg_id($(node).attr('svg-id'));
|
204
|
+
del_ui_pos(target)
|
205
|
+
self.adaptor.description.remove(null,target);
|
206
|
+
});
|
207
|
+
},
|
208
|
+
'menu_icon': icond,
|
209
|
+
'type': undefined,
|
210
|
+
'params': []
|
211
|
+
})
|
212
|
+
}
|
187
213
|
}
|
188
214
|
if($('> code', xml_node).length > 0 && xml_node.get(0).tagName == 'call') {
|
189
215
|
var icon = self.elements.callmanipulate.illustrator.svg.clone();
|
@@ -275,6 +301,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
275
301
|
|
276
302
|
// other resources
|
277
303
|
this.resources.arrow = self.adaptor.theme_dir + 'symbols/arrow.svg';
|
304
|
+
this.resources.delete = self.adaptor.theme_dir + 'symbols/delete.svg';
|
278
305
|
|
279
306
|
// Primitive Elements
|
280
307
|
this.elements.call = { /*{{{*/
|
@@ -93,7 +93,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
93
93
|
|
94
94
|
nodes = JSON.parse(nodes);
|
95
95
|
$(nodes).each(function(key,str) {
|
96
|
-
nodes[key] = $X(str)
|
96
|
+
nodes[key] = $X(str);
|
97
97
|
});
|
98
98
|
|
99
99
|
var check1 = [];
|
@@ -176,14 +176,40 @@ function WFAdaptorManifestation(adaptor) {
|
|
176
176
|
|
177
177
|
if(xml_node.get(0).tagName != 'description' && !self.elements[xml_node.get(0).tagName].neverdelete) {
|
178
178
|
var icon = self.elements[xml_node.get(0).tagName].illustrator.svg.clone();
|
179
|
-
icon.
|
179
|
+
icon.find('.rfill').addClass('menu');
|
180
|
+
icon.find('.hfill').addClass('menu');
|
180
181
|
menu['Delete'] = [{
|
181
182
|
'label': 'Remove Element',
|
182
|
-
'function_call': function(selector,target,selected){
|
183
|
+
'function_call': function(selector,target,selected){
|
184
|
+
del_ui_pos(target)
|
185
|
+
self.adaptor.description.remove(selector,target);
|
186
|
+
},
|
183
187
|
'menu_icon': icon,
|
184
188
|
'type': undefined,
|
185
189
|
'params': [null, xml_node, self.selected()]
|
186
190
|
}];
|
191
|
+
var nodes = localStorage.getItem('marked');
|
192
|
+
nodes = JSON.parse(nodes);
|
193
|
+
if (nodes && nodes.length > 0) {
|
194
|
+
var icond = self.resources['delete'].clone();
|
195
|
+
icond.children('.standfat').addClass('menu');
|
196
|
+
menu['Delete'].push({
|
197
|
+
'label': 'Remove Marked Elements',
|
198
|
+
'function_call': function(){
|
199
|
+
$(nodes).each(function(key,str) {
|
200
|
+
nodes[key] = $X(str);
|
201
|
+
});
|
202
|
+
$(nodes).each(function(key,node){
|
203
|
+
var target = self.adaptor.description.get_node_by_svg_id($(node).attr('svg-id'));
|
204
|
+
del_ui_pos(target)
|
205
|
+
self.adaptor.description.remove(null,target);
|
206
|
+
});
|
207
|
+
},
|
208
|
+
'menu_icon': icond,
|
209
|
+
'type': undefined,
|
210
|
+
'params': []
|
211
|
+
})
|
212
|
+
}
|
187
213
|
}
|
188
214
|
if($('> code', xml_node).length > 0 && xml_node.get(0).tagName == 'call') {
|
189
215
|
var icon = self.elements.callmanipulate.illustrator.svg.clone();
|
@@ -198,7 +224,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
198
224
|
}
|
199
225
|
if (xml_node.get(0).tagName == "call" || xml_node.get(0).tagName == "manipulate" || xml_node.get(0).tagName == "stop") {
|
200
226
|
var icon = self.elements.call.illustrator.svg.clone();
|
201
|
-
icon.children('g.replace').addClass('
|
227
|
+
icon.children('g.replace').addClass('passive');
|
202
228
|
var vtarget = self.adaptor.illustrator.get_node_by_svg_id(svgid);
|
203
229
|
if (vtarget.length > 0) {
|
204
230
|
if (vtarget.parents('g.activities.passive, g.activities.active').length > 0) {
|
@@ -299,6 +325,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
299
325
|
|
300
326
|
// other resources
|
301
327
|
this.resources.arrow = self.adaptor.theme_dir + 'symbols/arrow.svg';
|
328
|
+
this.resources.delete = self.adaptor.theme_dir + 'symbols/delete.svg';
|
302
329
|
|
303
330
|
// Primitive Elements
|
304
331
|
this.elements.call = { /*{{{*/
|
@@ -93,7 +93,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
93
93
|
|
94
94
|
nodes = JSON.parse(nodes);
|
95
95
|
$(nodes).each(function(key,str) {
|
96
|
-
nodes[key] = $X(str)
|
96
|
+
nodes[key] = $X(str);
|
97
97
|
});
|
98
98
|
|
99
99
|
var check1 = [];
|
@@ -176,14 +176,40 @@ function WFAdaptorManifestation(adaptor) {
|
|
176
176
|
|
177
177
|
if(xml_node.get(0).tagName != 'description' && !self.elements[xml_node.get(0).tagName].neverdelete) {
|
178
178
|
var icon = self.elements[xml_node.get(0).tagName].illustrator.svg.clone();
|
179
|
-
icon.
|
179
|
+
icon.find('.rfill').addClass('menu');
|
180
|
+
icon.find('.hfill').addClass('menu');
|
180
181
|
menu['Delete'] = [{
|
181
182
|
'label': 'Remove Element',
|
182
|
-
'function_call': function(selector,target,selected){
|
183
|
+
'function_call': function(selector,target,selected){
|
184
|
+
del_ui_pos(target)
|
185
|
+
self.adaptor.description.remove(selector,target);
|
186
|
+
},
|
183
187
|
'menu_icon': icon,
|
184
188
|
'type': undefined,
|
185
189
|
'params': [null, xml_node, self.selected()]
|
186
190
|
}];
|
191
|
+
var nodes = localStorage.getItem('marked');
|
192
|
+
nodes = JSON.parse(nodes);
|
193
|
+
if (nodes && nodes.length > 0) {
|
194
|
+
var icond = self.resources['delete'].clone();
|
195
|
+
icond.children('.standfat').addClass('menu');
|
196
|
+
menu['Delete'].push({
|
197
|
+
'label': 'Remove Marked Elements',
|
198
|
+
'function_call': function(){
|
199
|
+
$(nodes).each(function(key,str) {
|
200
|
+
nodes[key] = $X(str);
|
201
|
+
});
|
202
|
+
$(nodes).each(function(key,node){
|
203
|
+
var target = self.adaptor.description.get_node_by_svg_id($(node).attr('svg-id'));
|
204
|
+
del_ui_pos(target)
|
205
|
+
self.adaptor.description.remove(null,target);
|
206
|
+
});
|
207
|
+
},
|
208
|
+
'menu_icon': icond,
|
209
|
+
'type': undefined,
|
210
|
+
'params': []
|
211
|
+
})
|
212
|
+
}
|
187
213
|
}
|
188
214
|
if($('> code', xml_node).length > 0 && xml_node.get(0).tagName == 'call') {
|
189
215
|
var icon = self.elements.callmanipulate.illustrator.svg.clone();
|
@@ -198,7 +224,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
198
224
|
}
|
199
225
|
if (xml_node.get(0).tagName == "call" || xml_node.get(0).tagName == "manipulate" || xml_node.get(0).tagName == "stop") {
|
200
226
|
var icon = self.elements.call.illustrator.svg.clone();
|
201
|
-
icon.children('g.replace').addClass('
|
227
|
+
icon.children('g.replace').addClass('passive');
|
202
228
|
var vtarget = self.adaptor.illustrator.get_node_by_svg_id(svgid);
|
203
229
|
if (vtarget.length > 0) {
|
204
230
|
if (vtarget.parents('g.activities.passive, g.activities.active').length > 0) {
|
@@ -299,6 +325,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
299
325
|
|
300
326
|
// other resources
|
301
327
|
this.resources.arrow = self.adaptor.theme_dir + 'symbols/arrow.svg';
|
328
|
+
this.resources.delete = self.adaptor.theme_dir + 'symbols/delete.svg';
|
302
329
|
|
303
330
|
// Primitive Elements
|
304
331
|
this.elements.call = { /*{{{*/
|
data/cpee.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "cpee"
|
3
|
-
s.version = "2.1.
|
3
|
+
s.version = "2.1.45"
|
4
4
|
s.platform = Gem::Platform::RUBY
|
5
5
|
s.license = "LGPL-3.0"
|
6
6
|
s.summary = "Preliminary release of cloud process execution engine (cpee.org). If you just need workflow execution, without a rest service exposing it, then use WEEL."
|
@@ -11,7 +11,7 @@ class Instance < WEEL
|
|
11
11
|
<% end -%>
|
12
12
|
|
13
13
|
<% unless positions.nil? || positions.empty? -%>
|
14
|
-
search <% positions.each_with_index { |de,i| %><%= (i > 0 ? ', ' : '') %>Position.new(:<%= de[0] %>, :<%=de[1] %>, <%= de[2].nil? || de[2].strip.empty? ? 'nil' : '"' + de[2] + '"' %>)<% } %>
|
14
|
+
search <% positions.each_with_index { |de,i| %><%= (i > 0 ? ', ' : '') %>Position.new(:<%= de[0] %>, 0, :<%=de[1] %>, <%= de[2].nil? || de[2].strip.empty? ? 'nil' : '"' + de[2] + '"' %>)<% } %>
|
15
15
|
<% end -%>
|
16
16
|
|
17
17
|
<%= dsl.strip.gsub(/\n/,"\n ") %>
|
@@ -200,6 +200,10 @@ class ConnectionWrapper < WEEL::ConnectionWrapperBase
|
|
200
200
|
true
|
201
201
|
end # }}}
|
202
202
|
|
203
|
+
def activity_uuid
|
204
|
+
@handler_activity_uuid
|
205
|
+
end
|
206
|
+
|
203
207
|
def inform_activity_done # {{{
|
204
208
|
@controller.notify("activity/done", :'activity-uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position)
|
205
209
|
@controller.notify("status/resource_utilization", :mib => GetProcessMem.new.mb, **Process.times.to_h)
|
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cpee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.45
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juergen eTM Mangler
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: tools
|
12
12
|
cert_chain: []
|
13
|
-
date: 2023-03-
|
13
|
+
date: 2023-03-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: riddl
|
@@ -293,6 +293,7 @@ files:
|
|
293
293
|
- cockpit/themes/compact/symbols/closed_loop_measuring.svg
|
294
294
|
- cockpit/themes/compact/symbols/complex.svg
|
295
295
|
- cockpit/themes/compact/symbols/critical.svg
|
296
|
+
- cockpit/themes/compact/symbols/delete.svg
|
296
297
|
- cockpit/themes/compact/symbols/end.svg
|
297
298
|
- cockpit/themes/compact/symbols/escape.svg
|
298
299
|
- cockpit/themes/compact/symbols/event_end.svg
|
@@ -348,6 +349,7 @@ files:
|
|
348
349
|
- cockpit/themes/control/symbols/closed_loop_measuring.svg
|
349
350
|
- cockpit/themes/control/symbols/complex.svg
|
350
351
|
- cockpit/themes/control/symbols/critical.svg
|
352
|
+
- cockpit/themes/control/symbols/delete.svg
|
351
353
|
- cockpit/themes/control/symbols/end.svg
|
352
354
|
- cockpit/themes/control/symbols/escape.svg
|
353
355
|
- cockpit/themes/control/symbols/event_end.svg
|
@@ -403,6 +405,7 @@ files:
|
|
403
405
|
- cockpit/themes/default/symbols/closed_loop_measuring.svg
|
404
406
|
- cockpit/themes/default/symbols/complex.svg
|
405
407
|
- cockpit/themes/default/symbols/critical.svg
|
408
|
+
- cockpit/themes/default/symbols/delete.svg
|
406
409
|
- cockpit/themes/default/symbols/end.svg
|
407
410
|
- cockpit/themes/default/symbols/escape.svg
|
408
411
|
- cockpit/themes/default/symbols/event_end.svg
|
@@ -458,6 +461,7 @@ files:
|
|
458
461
|
- cockpit/themes/extended/symbols/closed_loop_measuring.svg
|
459
462
|
- cockpit/themes/extended/symbols/complex.svg
|
460
463
|
- cockpit/themes/extended/symbols/critical.svg
|
464
|
+
- cockpit/themes/extended/symbols/delete.svg
|
461
465
|
- cockpit/themes/extended/symbols/end.svg
|
462
466
|
- cockpit/themes/extended/symbols/escape.svg
|
463
467
|
- cockpit/themes/extended/symbols/event_end.svg
|
@@ -508,6 +512,7 @@ files:
|
|
508
512
|
- cockpit/themes/model/symbols/closed_loop_measuring.svg
|
509
513
|
- cockpit/themes/model/symbols/complex.svg
|
510
514
|
- cockpit/themes/model/symbols/critical.svg
|
515
|
+
- cockpit/themes/model/symbols/delete.svg
|
511
516
|
- cockpit/themes/model/symbols/end.svg
|
512
517
|
- cockpit/themes/model/symbols/escape.svg
|
513
518
|
- cockpit/themes/model/symbols/event_end.svg
|
@@ -563,6 +568,7 @@ files:
|
|
563
568
|
- cockpit/themes/packed/symbols/closed_loop_measuring.svg
|
564
569
|
- cockpit/themes/packed/symbols/complex.svg
|
565
570
|
- cockpit/themes/packed/symbols/critical.svg
|
571
|
+
- cockpit/themes/packed/symbols/delete.svg
|
566
572
|
- cockpit/themes/packed/symbols/end.svg
|
567
573
|
- cockpit/themes/packed/symbols/escape.svg
|
568
574
|
- cockpit/themes/packed/symbols/event_end.svg
|
@@ -618,6 +624,7 @@ files:
|
|
618
624
|
- cockpit/themes/preset/symbols/closed_loop_measuring.svg
|
619
625
|
- cockpit/themes/preset/symbols/complex.svg
|
620
626
|
- cockpit/themes/preset/symbols/critical.svg
|
627
|
+
- cockpit/themes/preset/symbols/delete.svg
|
621
628
|
- cockpit/themes/preset/symbols/end.svg
|
622
629
|
- cockpit/themes/preset/symbols/escape.svg
|
623
630
|
- cockpit/themes/preset/symbols/event_end.svg
|
@@ -708,6 +715,7 @@ files:
|
|
708
715
|
- server/resources/topics.xml
|
709
716
|
- server/resources/transformation.xml
|
710
717
|
- server/routing/end.rb
|
718
|
+
- server/routing/forward-events.lock
|
711
719
|
- server/routing/forward-events.rb
|
712
720
|
- server/routing/forward-votes.rb
|
713
721
|
- server/routing/persist.rb
|