cpee-model-management 1.1.4 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/cpee-model-management.gemspec +1 -1
- data/lib/cpee-model-management/implementation.rb +66 -35
- data/lib/cpee-model-management/implementation.xml +15 -15
- data/server/redis.rdb +0 -0
- data/ui/css/moma.css +114 -0
- data/ui/index.html +21 -35
- data/ui/instances.html +1 -1
- data/ui/instances_view.html +1 -1
- data/ui/js/moma.js +379 -0
- data/ui/js/stats.js +1 -0
- metadata +6 -5
- data/ui/css/design.css +0 -67
- data/ui/js/design.js +0 -245
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7844d39f8bdb0619c97fc35b4b4f030cb200cab9fbf74182db415cd8ca601ae3
|
4
|
+
data.tar.gz: 97ca85020b275d58fc533173c824f44c239dfcd967eee996e8ed85c0f86b14f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fdf7e58b10267d03897965ece7f14f01c3868d1ff1a5814acc85573d52d38b2e072ebaa4fbaeeb69ab76e4dcd97fdac50355a2f514739a6a698030611352bcec
|
7
|
+
data.tar.gz: 557f02d4df9dc953dd0cb17328c2b33b9a75930bd4df4f0bea3dc3e0da322f53dfd7a54fec8aee36f5934e8b976661d9454a3a8d1ebc1f3b8a3a174dba6982cf
|
@@ -26,6 +26,7 @@ require 'pathname'
|
|
26
26
|
require 'shellwords'
|
27
27
|
require 'securerandom'
|
28
28
|
require 'cpee/redis'
|
29
|
+
require 'digest/sha1'
|
29
30
|
|
30
31
|
module CPEE
|
31
32
|
module ModelManagement
|
@@ -180,7 +181,7 @@ module CPEE
|
|
180
181
|
|
181
182
|
class GetList < Riddl::Implementation #{{{
|
182
183
|
def response
|
183
|
-
where = @a[0] == :main ? '' : Riddl::Protocols::Utils::unescape(
|
184
|
+
where = @a[0] == :main ? '' : @r.map{ |d| Riddl::Protocols::Utils::unescape(d) }.join('/')
|
184
185
|
views = @a[1]
|
185
186
|
models = @a[2]
|
186
187
|
stage = [@p[0]&.value] || ['draft']
|
@@ -195,7 +196,10 @@ module CPEE
|
|
195
196
|
{ :type => :file, :name => File.basename(f), :creator => attrs['creator'], :author => attrs['author'], :guarded => attrs['guarded'], :guarded_id => attrs['guarded_id'], :stage => fstage, :date => File.mtime(f).xmlschema } if stage.include?(fstage)
|
196
197
|
end.compact.uniq.sort_by{ |e| e[:name] }
|
197
198
|
|
198
|
-
|
199
|
+
ret = JSON::pretty_generate(names)
|
200
|
+
@headers << Riddl::Header.new('CPEE-MOMA-FINGERPRINT', Digest::SHA1.hexdigest(ret))
|
201
|
+
|
202
|
+
Riddl::Parameter::Complex.new('list','application/json',ret)
|
199
203
|
end
|
200
204
|
end #}}}
|
201
205
|
class GetListFull < Riddl::Implementation #{{{
|
@@ -226,7 +230,7 @@ module CPEE
|
|
226
230
|
|
227
231
|
class ShiftItem < Riddl::Implementation #{{{
|
228
232
|
def response
|
229
|
-
where = @a[0] == :main ? '' : Riddl::Protocols::Utils::unescape(
|
233
|
+
where = @a[0] == :main ? '' : @r[0..-2].map{ |d| Riddl::Protocols::Utils::unescape(d) }.join('/')
|
230
234
|
conns = @a[1]
|
231
235
|
themes = @a[2]
|
232
236
|
models = @a[3]
|
@@ -263,7 +267,7 @@ module CPEE
|
|
263
267
|
|
264
268
|
class RenameItem < Riddl::Implementation #{{{
|
265
269
|
def response
|
266
|
-
where = @a[0] == :main ? '' : Riddl::Protocols::Utils::unescape(
|
270
|
+
where = @a[0] == :main ? '' : @r[0..-2].map{ |d| Riddl::Protocols::Utils::unescape(d) }.join('/')
|
267
271
|
conns = @a[1]
|
268
272
|
models = @a[2]
|
269
273
|
name = File.basename(@r.last,'.xml')
|
@@ -302,10 +306,11 @@ module CPEE
|
|
302
306
|
end #}}}
|
303
307
|
class RenameDir < Riddl::Implementation #{{{
|
304
308
|
def response
|
309
|
+
where = @r[0..-2].map{ |d| Riddl::Protocols::Utils::unescape(d) }.join('/')
|
305
310
|
conns = @a[0]
|
306
311
|
models = @a[1]
|
307
|
-
name = File.basename(@r.last,'.dir')
|
308
|
-
nname =
|
312
|
+
name = File.join(where,File.basename(@r.last,'.dir'))
|
313
|
+
nname = File.join(where,@p[0].value)
|
309
314
|
fname = File.join(models,name + '.dir')
|
310
315
|
fnname = File.join(models,nname + '.dir')
|
311
316
|
counter = 0
|
@@ -342,15 +347,16 @@ module CPEE
|
|
342
347
|
|
343
348
|
class CreateDir < Riddl::Implementation #{{{
|
344
349
|
def response
|
350
|
+
where = @a[0] == :main ? '' : @r.map{ |d| Riddl::Protocols::Utils::unescape(d) }.join('/')
|
345
351
|
name = @p[0].value
|
346
|
-
conns = @a[
|
347
|
-
models = @a[
|
352
|
+
conns = @a[1]
|
353
|
+
models = @a[2]
|
348
354
|
|
349
|
-
fname = File.join(models,name + '.dir')
|
355
|
+
fname = File.join(models,where,name + '.dir')
|
350
356
|
counter = 0
|
351
357
|
while File.exist?(fname)
|
352
358
|
counter += 1
|
353
|
-
fname = File.join(models,name + counter.to_s + '.dir')
|
359
|
+
fname = File.join(models,where,name + counter.to_s + '.dir')
|
354
360
|
end
|
355
361
|
|
356
362
|
dn = CPEE::ModelManagement::get_dn @h['DN']
|
@@ -371,19 +377,23 @@ module CPEE
|
|
371
377
|
end #}}}
|
372
378
|
class Create < Riddl::Implementation #{{{
|
373
379
|
def response
|
374
|
-
|
375
|
-
|
376
|
-
|
380
|
+
models = @a[4]
|
381
|
+
views = @a[1]
|
382
|
+
conns = @a[2]
|
383
|
+
templates = @a[3]
|
384
|
+
if @p.first.name == 'stage'
|
385
|
+
where = @a[0] == :main ? '' : @r.map{ |d| Riddl::Protocols::Utils::unescape(d) }.join('/')
|
386
|
+
stage = @p.shift.value
|
387
|
+
name = @p[0].value
|
388
|
+
source = templates[stage] ? templates[stage] : 'testset.xml'
|
377
389
|
else
|
378
|
-
|
390
|
+
where = @r[0..-2].map{ |d| Riddl::Protocols::Utils::unescape(d) }.join('/')
|
391
|
+
stage = nil
|
392
|
+
name = @r[-1].sub(/\.xml$/,'')
|
393
|
+
source = File.join(models,where,name + '.xml')
|
394
|
+
where = @p[0].value
|
379
395
|
end
|
380
|
-
views = @a[2]
|
381
|
-
conns = @a[3]
|
382
|
-
templates = @a[4]
|
383
|
-
models = @a[5]
|
384
396
|
|
385
|
-
name = @p[0].value
|
386
|
-
source = @p[1] ? File.join(models,where,@p[1].value) : (templates[stage] ? templates[stage] : 'testset.xml')
|
387
397
|
fname = File.join(models,where,name + '.xml')
|
388
398
|
|
389
399
|
attrs = JSON::load File.open(fname + '.attrs') rescue {}
|
@@ -436,7 +446,7 @@ module CPEE
|
|
436
446
|
|
437
447
|
class GetItem < Riddl::Implementation #{{{
|
438
448
|
def response
|
439
|
-
where = @a[0] == :main ? '' : Riddl::Protocols::Utils::unescape(
|
449
|
+
where = @a[0] == :main ? '' : @r[0..-2].map{ |d| Riddl::Protocols::Utils::unescape(d) }.join('/')
|
440
450
|
models = @a[1]
|
441
451
|
name = File.basename(@r[-1],'.xml')
|
442
452
|
fname = File.join(models,where,name + '.xml')
|
@@ -449,7 +459,7 @@ module CPEE
|
|
449
459
|
end #}}}
|
450
460
|
class OpenItem < Riddl::Implementation #{{{
|
451
461
|
def response
|
452
|
-
where = @a[0] == :main ? '' : Riddl::Protocols::Utils::unescape(
|
462
|
+
where = @a[0] == :main ? '' : @r[0..-3].map{ |d| Riddl::Protocols::Utils::unescape(d) }.join('/')
|
453
463
|
name = File.basename(@r[-2],'.xml')
|
454
464
|
insta = @a[1]
|
455
465
|
cock = @a[2]
|
@@ -530,7 +540,7 @@ module CPEE
|
|
530
540
|
|
531
541
|
class MoveItem < Riddl::Implementation #{{{
|
532
542
|
def response
|
533
|
-
where = @a[0] == :main ? '' : Riddl::Protocols::Utils::unescape(
|
543
|
+
where = @a[0] == :main ? '' : @r[0..-2].map{ |d| Riddl::Protocols::Utils::unescape(d) }.join('/')
|
534
544
|
conns = @a[1]
|
535
545
|
models = @a[2]
|
536
546
|
|
@@ -560,7 +570,7 @@ module CPEE
|
|
560
570
|
end #}}}
|
561
571
|
class PutItem < Riddl::Implementation #{{{
|
562
572
|
def response
|
563
|
-
where = @a[0] == :main ? '' : Riddl::Protocols::Utils::unescape(
|
573
|
+
where = @a[0] == :main ? '' : @r[0..-2].map{ |d| Riddl::Protocols::Utils::unescape(d) }.join('/')
|
564
574
|
conns = @a[1]
|
565
575
|
models = @a[2]
|
566
576
|
name = File.basename(@r.last,'.xml')
|
@@ -569,6 +579,8 @@ module CPEE
|
|
569
579
|
|
570
580
|
fname = File.join(models,where,name + '.xml')
|
571
581
|
|
582
|
+
p fname
|
583
|
+
|
572
584
|
if File.exist?(fname)
|
573
585
|
author = dn['GN'] + ' ' + dn['SN']
|
574
586
|
attrs = {}
|
@@ -599,7 +611,7 @@ module CPEE
|
|
599
611
|
end #}}}
|
600
612
|
class DeleteItem < Riddl::Implementation #{{{
|
601
613
|
def response
|
602
|
-
where = @a[0] == :main ? '' : Riddl::Protocols::Utils::unescape(
|
614
|
+
where = @a[0] == :main ? '' : @r[0..-2].map{ |d| Riddl::Protocols::Utils::unescape(d) }.join('/')
|
603
615
|
conns = @a[1]
|
604
616
|
models = @a[2]
|
605
617
|
name = File.basename(@r.last,'.xml')
|
@@ -614,15 +626,16 @@ module CPEE
|
|
614
626
|
end #}}}
|
615
627
|
class DeleteDir < Riddl::Implementation #{{{
|
616
628
|
def response
|
629
|
+
where = @r[0..-2].map{ |d| Riddl::Protocols::Utils::unescape(d) }.join('/')
|
617
630
|
conns = @a[0]
|
618
631
|
models = @a[1]
|
619
632
|
name = File.basename(@r.last,'.dir')
|
620
|
-
fname = File.join(models,name + '.dir')
|
633
|
+
fname = File.join(models,where,name + '.dir')
|
621
634
|
|
622
635
|
dn = CPEE::ModelManagement::get_dn @h['DN']
|
623
636
|
author = dn['GN'] + ' ' + dn['SN']
|
624
637
|
|
625
|
-
CPEE::ModelManagement::op author, 'rm', models, File.join(name + '.dir')
|
638
|
+
CPEE::ModelManagement::op author, 'rm', models, File.join(where,name + '.dir')
|
626
639
|
CPEE::ModelManagement::notify conns, 'delete', models, fname
|
627
640
|
end
|
628
641
|
end #}}}
|
@@ -856,30 +869,47 @@ module CPEE
|
|
856
869
|
|
857
870
|
CPEE::redis_connect opts, 'Server Main'
|
858
871
|
|
872
|
+
opts[:sse_keepalive_frequency] ||= 10
|
873
|
+
|
859
874
|
Proc.new do
|
875
|
+
|
876
|
+
parallel do
|
877
|
+
EM.add_periodic_timer(opts[:sse_keepalive_frequency]) do
|
878
|
+
opts[:management_receivers].each do |sse|
|
879
|
+
sse.send_with_id('heartbeat', '42') unless sse&.closed?
|
880
|
+
end
|
881
|
+
opts[:stat_receivers].each do |sse|
|
882
|
+
sse.send_with_id('heartbeat', '42') unless sse&.closed?
|
883
|
+
end
|
884
|
+
end
|
885
|
+
end
|
886
|
+
|
860
887
|
interface 'events' do
|
861
888
|
run StatReceive, opts[:redis], opts[:stat_receivers] if post 'event'
|
862
889
|
end
|
890
|
+
|
863
891
|
interface 'implementation' do
|
864
892
|
run GetList, :main, opts[:views], opts[:models] if get 'stage'
|
865
893
|
run GetListFull, opts[:views], opts[:models] if get 'full'
|
866
894
|
run GetStages, opts[:themes] if get 'stages'
|
867
|
-
run Create, :main,
|
868
|
-
run
|
869
|
-
|
870
|
-
|
895
|
+
run Create, :main, opts[:views], opts[:management_receivers], opts[:templates], opts[:models] if post 'item'
|
896
|
+
run CreateDir, :main, opts[:management_receivers], opts[:models] if post 'dir'
|
897
|
+
on resource 'management' do
|
898
|
+
run ManagementSend, opts[:management_receivers] if sse
|
899
|
+
end
|
871
900
|
on resource '[a-zA-Z0-9öäüÖÄÜ _-]+\.dir' do
|
872
901
|
run GetList, :sub, opts[:views], opts[:models] if get 'stage'
|
873
|
-
run Create, :sub,
|
874
|
-
run Create, :sub, :dup, opts[:views], opts[:management_receivers], opts[:templates], opts[:models] if post 'duplicate'
|
902
|
+
run Create, :sub, opts[:views], opts[:management_receivers], opts[:templates], opts[:models] if post 'item'
|
875
903
|
run DeleteDir, opts[:management_receivers], opts[:models] if delete
|
876
904
|
run RenameDir, opts[:management_receivers], opts[:models] if put 'name'
|
905
|
+
run CreateDir, :sub, opts[:management_receivers], opts[:models] if post 'dir'
|
877
906
|
on resource '[a-zA-Z0-9öäüÖÄÜ _-]+\.xml' do
|
878
907
|
run DeleteItem, :sub, opts[:management_receivers], opts[:models] if delete
|
879
908
|
run GetItem, :sub, opts[:models] if get
|
880
909
|
run PutItem, :sub, opts[:management_receivers], opts[:models] if put 'content'
|
881
910
|
run RenameItem, :sub, opts[:management_receivers], opts[:models] if put 'name'
|
882
|
-
run MoveItem, :sub, opts[:management_receivers], opts[:models] if put '
|
911
|
+
run MoveItem, :sub, opts[:management_receivers], opts[:models] if put 'movedir'
|
912
|
+
run Create, :sub, opts[:views], opts[:management_receivers], opts[:templates], opts[:models] if put 'dupdir'
|
883
913
|
run ShiftItem, :sub, opts[:management_receivers], opts[:themes], opts[:models] if put 'newstage'
|
884
914
|
on resource 'open' do
|
885
915
|
run OpenItem, :sub, opts[:instantiate], opts[:cockpit], opts[:views], false, opts[:models] if get 'stage'
|
@@ -894,7 +924,8 @@ module CPEE
|
|
894
924
|
run GetItem, :main, opts[:models] if get
|
895
925
|
run PutItem, :main, opts[:management_receivers], opts[:models] if put 'content'
|
896
926
|
run RenameItem, :main, opts[:management_receivers], opts[:models] if put 'name'
|
897
|
-
run MoveItem, :main, opts[:management_receivers], opts[:models] if put '
|
927
|
+
run MoveItem, :main, opts[:management_receivers], opts[:models] if put 'movedir'
|
928
|
+
run Create, :main, opts[:views], opts[:management_receivers], opts[:templates], opts[:models] if put 'dupdir'
|
898
929
|
run ShiftItem, :main, opts[:management_receivers], opts[:themes], opts[:models] if put 'newstage'
|
899
930
|
on resource 'open' do
|
900
931
|
run OpenItem, :main, opts[:instantiate], opts[:cockpit], opts[:views], false, opts[:models] if get 'stage'
|
@@ -32,17 +32,14 @@
|
|
32
32
|
<param name="pattern">([a-zA-Z0-9öäüÖÄÜ _-]+)|</param>
|
33
33
|
</parameter>
|
34
34
|
</message>
|
35
|
-
<message name="
|
36
|
-
<parameter name="
|
37
|
-
<param name="pattern">([a-zA-Z0-9öäüÖÄÜ _-]+)\.dir|</param>
|
35
|
+
<message name="movedir">
|
36
|
+
<parameter name="movedir" type="string">
|
37
|
+
<param name="pattern">(([a-zA-Z0-9öäüÖÄÜ _-]+)\.dir(\/([a-zA-Z0-9öäüÖÄÜ _-]+)\.dir)*)(\/?)|</param>
|
38
38
|
</parameter>
|
39
39
|
</message>
|
40
|
-
<message name="
|
41
|
-
<parameter name="
|
42
|
-
<param name="pattern">[a-zA-Z0-9öäüÖÄÜ _-]
|
43
|
-
</parameter>
|
44
|
-
<parameter name="old" type="string">
|
45
|
-
<param name="pattern">[a-zA-Z0-9öäüÖÄÜ _-]+\.xml</param>
|
40
|
+
<message name="dupdir">
|
41
|
+
<parameter name="dupdir" type="string">
|
42
|
+
<param name="pattern">(([a-zA-Z0-9öäüÖÄÜ _-]+)\.dir(\/([a-zA-Z0-9öäüÖÄÜ _-]+)\.dir)*)(\/?)|</param>
|
46
43
|
</parameter>
|
47
44
|
</message>
|
48
45
|
<message name="stages">
|
@@ -77,14 +74,15 @@
|
|
77
74
|
<resource>
|
78
75
|
<post in="item"/>
|
79
76
|
<post in="dir"/>
|
80
|
-
<post in="duplicate"/>
|
81
77
|
<get in="stage" out="list"/>
|
82
78
|
<get in="full" out="list"/>
|
83
79
|
<get in="stages" out="list"/>
|
84
|
-
<
|
85
|
-
|
80
|
+
<resource relative="management">
|
81
|
+
<sse/>
|
82
|
+
</resource>
|
83
|
+
<resource relative="[a-zA-Z0-9öäüÖÄÜ _-]+\.dir" recursive="true">
|
86
84
|
<post in="item"/>
|
87
|
-
<post in="
|
85
|
+
<post in="dir"/>
|
88
86
|
<get in="stage" out="list"/>
|
89
87
|
<delete/>
|
90
88
|
<put in="name"/> <!-- rename -->
|
@@ -93,8 +91,9 @@
|
|
93
91
|
<delete/>
|
94
92
|
<put in="content"/>
|
95
93
|
<put in="name"/> <!-- rename -->
|
96
|
-
<put in="
|
94
|
+
<put in="movedir"/> <!-- move -->
|
97
95
|
<put in="newstage"/> <!-- shift -->
|
96
|
+
<put in="dupdir"/> <!-- duplicate -->
|
98
97
|
<resource relative="open"><get in="stage"/></resource>
|
99
98
|
<resource relative="open-new"><get in="stage"/></resource>
|
100
99
|
</resource>
|
@@ -104,7 +103,8 @@
|
|
104
103
|
<delete/>
|
105
104
|
<put in="content"/>
|
106
105
|
<put in="name"/> <!-- rename -->
|
107
|
-
<put in="
|
106
|
+
<put in="movedir"/> <!-- move -->
|
107
|
+
<put in="dupdir"/> <!-- duplicate -->
|
108
108
|
<put in="newstage"/> <!-- shift -->
|
109
109
|
<resource relative="open"><get in="stage"/></resource>
|
110
110
|
<resource relative="open-new"><get in="stage"/></resource>
|
data/server/redis.rdb
ADDED
Binary file
|
data/ui/css/moma.css
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
:root {
|
2
|
+
--x-ui-selection-background-light: #ef29297f;
|
3
|
+
--x-ui-selection-background: #ef2929;
|
4
|
+
}
|
5
|
+
|
6
|
+
[data-class=model] { min-width: 1.5em; text-align: center; font-size: 1.7em; cursor: pointer; }
|
7
|
+
[data-class=folder] { min-width: 1.5em; text-align: center; font-size: 1.7em; }
|
8
|
+
[data-class=model]:hover { background-color: var(--x-ui-selection-background-light) !important; }
|
9
|
+
[data-class=ops] { cursor: pointer; }
|
10
|
+
[data-class=special] { cursor: pointer; min-width: 1.5em; text-align: center !important; font-size: 1.7em; }
|
11
|
+
[data-class=special].invisible { cursor: auto; visibility: hidden; }
|
12
|
+
[data-class=special]:hover { background-color: var(--x-ui-selection-background-light) !important; }
|
13
|
+
|
14
|
+
[data-class=special] {
|
15
|
+
position: relative;
|
16
|
+
z-index: 0;
|
17
|
+
animation: important 0.2s infinite;
|
18
|
+
}
|
19
|
+
@keyframes important {
|
20
|
+
0% { transform: rotate(0deg); }
|
21
|
+
|
22
|
+
8% { transform: rotate(3deg); }
|
23
|
+
16% { transform: rotate(6deg); }
|
24
|
+
24% { transform: rotate(9deg); }
|
25
|
+
32% { transform: rotate(6deg); }
|
26
|
+
38% { transform: rotate(3deg); }
|
27
|
+
|
28
|
+
50% { transform: rotate(0deg); }
|
29
|
+
|
30
|
+
58% { transform: rotate(-3deg); }
|
31
|
+
66% { transform: rotate(-6deg); }
|
32
|
+
74% { transform: rotate(-9deg); }
|
33
|
+
82% { transform: rotate(-6deg); }
|
34
|
+
88% { transform: rotate(-3deg); }
|
35
|
+
|
36
|
+
100% { transform: rotate(0deg); }
|
37
|
+
}
|
38
|
+
|
39
|
+
td.selected {
|
40
|
+
background-color: var(--x-ui-selection-background) !important;
|
41
|
+
}
|
42
|
+
|
43
|
+
div.fixed {
|
44
|
+
position: sticky;
|
45
|
+
z-index: 1;
|
46
|
+
top: 0;
|
47
|
+
width: 100%;
|
48
|
+
background-color: var(--x-ui-background-color);
|
49
|
+
}
|
50
|
+
div.text { padding-top: 1em; }
|
51
|
+
div.breadcrumb { padding-top: 0.5em; padding-bottom: 1em; }
|
52
|
+
div.breadcrumb span.separator {
|
53
|
+
padding-left: 1em;
|
54
|
+
padding-right: 1em;
|
55
|
+
}
|
56
|
+
div.breadcrumb span.crumb:last-child { }
|
57
|
+
div.breadcrumb span.crumb:not(:last-child) {
|
58
|
+
color: var(--x-ui-link-color);
|
59
|
+
cursor: pointer;
|
60
|
+
}
|
61
|
+
div.breadcrumb span.crumb:not(:last-child):hover {
|
62
|
+
color: var(--x-ui-light-text-color);
|
63
|
+
text-decoration: underline;
|
64
|
+
}
|
65
|
+
|
66
|
+
form input {
|
67
|
+
width: 45em !important;
|
68
|
+
}
|
69
|
+
|
70
|
+
ui-behind {
|
71
|
+
text-transform: capitalize;
|
72
|
+
font-weight: bold;
|
73
|
+
color: #d0d0d0;
|
74
|
+
}
|
75
|
+
|
76
|
+
ui-behind span {
|
77
|
+
cursor: pointer;
|
78
|
+
}
|
79
|
+
|
80
|
+
[is="x-ui-"] table.ui-table {
|
81
|
+
border-collapse: collapse;
|
82
|
+
}
|
83
|
+
[is="x-ui-"] table.ui-table thead th {
|
84
|
+
font-weight: bold;
|
85
|
+
text-align: left;
|
86
|
+
padding: 0.3em 0.5em;
|
87
|
+
}
|
88
|
+
|
89
|
+
[is="x-ui-"] table.ui-table tbody td {
|
90
|
+
padding: 0.1em 0.5em;
|
91
|
+
}
|
92
|
+
[is="x-ui-"] table.ui-table tbody tr:nth-child(odd) td {
|
93
|
+
background-color: var(--x-ui-content-light-background);
|
94
|
+
}
|
95
|
+
[is="x-ui-"] table.ui-table tbody tr:hover td {
|
96
|
+
background-color: var(--x-ui-content-hover-background);
|
97
|
+
}
|
98
|
+
[is="x-ui-"] table.ui-table tbody td[data-class=ops] {
|
99
|
+
text-align: center;
|
100
|
+
}
|
101
|
+
[is="x-ui-"] table.ui-table tbody tr:nth-child(odd) td[data-class=ops] {
|
102
|
+
background-color: #d0d0d0;
|
103
|
+
}
|
104
|
+
[is="x-ui-"] table.ui-table tbody tr:hover td[data-class=ops] {
|
105
|
+
background-color: #99cee6b0;
|
106
|
+
}
|
107
|
+
|
108
|
+
[is="x-ui-"] ui-rest > ui-content > ui-area {
|
109
|
+
padding: 0em 1em 1em 1em;
|
110
|
+
}
|
111
|
+
|
112
|
+
tr.contextmenuitem .capitalized {
|
113
|
+
text-transform: capitalize;
|
114
|
+
}
|
data/ui/index.html
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
21
21
|
<head>
|
22
22
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
23
|
-
<title>Process Hub</title>
|
23
|
+
<title data-orig="Process Hub">Process Hub</title>
|
24
24
|
<link rel="icon" type="image/x-icon" href="favicon.ico">
|
25
25
|
|
26
26
|
<!-- libs, do not modify. When local than load local libs. -->
|
@@ -53,9 +53,9 @@
|
|
53
53
|
<link rel="stylesheet" href="/js_libs/relaxngui.css" type="text/css"/>
|
54
54
|
|
55
55
|
<!-- custom stuff, play arround -->
|
56
|
-
<link rel="stylesheet" href="css/
|
56
|
+
<link rel="stylesheet" href="css/moma.css" type="text/css"/>
|
57
57
|
<link rel="stylesheet" href="css/stats.css" type="text/css"/>
|
58
|
-
<script type="text/javascript" src="js/
|
58
|
+
<script type="text/javascript" src="js/moma.js"></script>
|
59
59
|
<script type="text/javascript" src="js/stats.js"></script>
|
60
60
|
</head>
|
61
61
|
<body is="x-ui-">
|
@@ -73,10 +73,13 @@
|
|
73
73
|
</ui-tabbar>
|
74
74
|
<ui-content class="noselect">
|
75
75
|
<ui-area data-belongs-to-tab="models">
|
76
|
-
<
|
76
|
+
<div class="fixed">
|
77
|
+
<div class="text">Your Models are saved/versioned in <a target='_blank' href='https://git-scm.com/'>GIT</a>. So fret not. Just send an email to <a href="mail:helpdesk@cpee.org">helpdesk@cpee.org</a> if you are lost. Click on <strong>Icons</strong> of directory entries, to mark them. Then change to a different directory and move/copy them there. And as always: <a target='_blank' href='https://www.youtube.com/watch?v=kkxj5xVLyj0&feature=youtu.be&t=56'>get dressed for success</a>.</div>
|
78
|
+
<div class="breadcrumb"><span class="crumb" onclick="">⌂ Home</span></div>
|
79
|
+
</div>
|
77
80
|
<table id="models" class='ui-table'>
|
78
81
|
<thead>
|
79
|
-
<th
|
82
|
+
<th data-class='special' class='invisible' title='click for operations'>🔧</th>
|
80
83
|
<th>Name</th>
|
81
84
|
<th><abbr title='force new instance'>F</abbr></th>
|
82
85
|
<th><abbr title='link to model source'>M</abbr></th>
|
@@ -86,22 +89,9 @@
|
|
86
89
|
<th>Changed At</th>
|
87
90
|
<th><abbr title='Operations'>Op</abbr></th>
|
88
91
|
</thead>
|
89
|
-
<template id="up">
|
90
|
-
<tr>
|
91
|
-
<td data-class='folder' class="noselect">📁</td>
|
92
|
-
<td data-class='name' data-full-name=''><a href=''></a></td>
|
93
|
-
<td></td>
|
94
|
-
<td></td>
|
95
|
-
<td></td>
|
96
|
-
<td></td>
|
97
|
-
<td></td>
|
98
|
-
<td data-class='date'></td>
|
99
|
-
<td data-class=''></td>
|
100
|
-
</tr>
|
101
|
-
</template>
|
102
92
|
<template id="folder">
|
103
93
|
<tr>
|
104
|
-
<td data-class='folder' class="noselect">📁</td>
|
94
|
+
<td data-class='folder' class="noselect" title='click to mark'>📁</td>
|
105
95
|
<td data-class='name' data-full-name=''><a href=''></a></td>
|
106
96
|
<td></td>
|
107
97
|
<td></td>
|
@@ -109,12 +99,12 @@
|
|
109
99
|
<td></td>
|
110
100
|
<td></td>
|
111
101
|
<td data-class='date'></td>
|
112
|
-
<td data-class='ops' class="noselect"><span
|
102
|
+
<td data-class='ops' class="noselect" title='click for operations'><span>🔧</span></td>
|
113
103
|
</tr>
|
114
104
|
</template>
|
115
105
|
<template id="model">
|
116
106
|
<tr>
|
117
|
-
<td data-class='model' class="noselect"
|
107
|
+
<td data-class='model' class="noselect" title='click to mark'>𝌭</td>
|
118
108
|
<td data-class='name' data-full-name=''><a target='_blank' href=''></a></td>
|
119
109
|
<td data-class='force'>[<a target='_blank' href='' title='force new instance'>F</a>]</td>
|
120
110
|
<td data-class='raw'>[<a target='_blank' href='' title='link to model source'>M</a>]</td>
|
@@ -122,7 +112,7 @@
|
|
122
112
|
<td data-class='guarded'><abbr title=''></abbr></td>
|
123
113
|
<td data-class='resource'></td>
|
124
114
|
<td data-class='date'></td>
|
125
|
-
<td data-class='ops' class="noselect"><span
|
115
|
+
<td data-class='ops' class="noselect" title='click for operations'><span>🔧</span></td>
|
126
116
|
</tr>
|
127
117
|
</template>
|
128
118
|
<tbody>
|
@@ -130,18 +120,17 @@
|
|
130
120
|
</table>
|
131
121
|
</ui-area>
|
132
122
|
<ui-area data-belongs-to-tab="newmodel" class="inactive">
|
133
|
-
<
|
123
|
+
<div class="text">
|
134
124
|
Create an empty model. Beware, if a model of the same name already
|
135
125
|
exists in one of the categories (e.g. draft, development,
|
136
126
|
production, archive) it can not be created. To protect you from
|
137
127
|
getting confused and shooting yourself in the foot in your little
|
138
128
|
modelling world we allow only unique names. Better safe than sorry.
|
139
|
-
</
|
129
|
+
</div>
|
130
|
+
<div class="breadcrumb"><span class="crumb" onclick="">⌂ Home</span></div>
|
140
131
|
<form id="newmod">
|
141
|
-
<input type="hidden" name="stage" value=""/>
|
142
|
-
<input type="hidden" name="dir" value=""/>
|
143
132
|
<p>
|
144
|
-
<input type="text" name="new" required pattern="^[a-zA-Z0-9öäüÖÄÜ _
|
133
|
+
<input type="text" name="new" required pattern="^[a-zA-Z0-9öäüÖÄÜ _\-]+" placeholder="Filename (no extension necessary). Only use characters, spaces, underlines and dashes."/>
|
145
134
|
</p>
|
146
135
|
<p>
|
147
136
|
<button>New Model</button>
|
@@ -149,17 +138,14 @@
|
|
149
138
|
</form>
|
150
139
|
</ui-area>
|
151
140
|
<ui-area data-belongs-to-tab="newdir" class="inactive">
|
152
|
-
<
|
141
|
+
<div class="text">
|
153
142
|
Create an empty directory. Beware, if a directory of the same name
|
154
|
-
already exists
|
155
|
-
|
156
|
-
|
157
|
-
modelling world we allow only unique names. Better safe than sorry.
|
158
|
-
</p>
|
143
|
+
already exists it can not be created.
|
144
|
+
</div>
|
145
|
+
<div class="breadcrumb"><span class="crumb" onclick="">⌂ Home</span></div>
|
159
146
|
<form id="newdir">
|
160
|
-
<input type="hidden" name="stage" value=""/>
|
161
147
|
<p>
|
162
|
-
<input type="text" name="newdir" required pattern="^[a-zA-Z0-9öäüÖÄÜ _
|
148
|
+
<input type="text" name="newdir" required pattern="^[a-zA-Z0-9öäüÖÄÜ _\-]+" placeholder="Directory name. Only use characters, spaces, underlines and dashes."/>
|
163
149
|
</p>
|
164
150
|
<p>
|
165
151
|
<button>New Directory</button>
|
data/ui/instances.html
CHANGED
@@ -53,7 +53,7 @@
|
|
53
53
|
<link rel="stylesheet" href="/js_libs/relaxngui.css" type="text/css"/>
|
54
54
|
|
55
55
|
<!-- custom stuff, play arround -->
|
56
|
-
<link rel="stylesheet" href="css/
|
56
|
+
<link rel="stylesheet" href="css/moma.css" type="text/css"/>
|
57
57
|
<link rel="stylesheet" href="css/stats.css" type="text/css"/>
|
58
58
|
<link rel="stylesheet" href="css/stats_standalone.css" type="text/css"/>
|
59
59
|
<script type="text/javascript" src="js/stats.js"></script>
|
data/ui/instances_view.html
CHANGED
@@ -53,7 +53,7 @@
|
|
53
53
|
<link rel="stylesheet" href="/js_libs/relaxngui.css" type="text/css"/>
|
54
54
|
|
55
55
|
<!-- custom stuff, play arround -->
|
56
|
-
<link rel="stylesheet" href="css/
|
56
|
+
<link rel="stylesheet" href="css/moma.css" type="text/css"/>
|
57
57
|
<link rel="stylesheet" href="css/stats.css" type="text/css"/>
|
58
58
|
<link rel="stylesheet" href="css/stats_standalone.css" type="text/css"/>
|
59
59
|
<script type="text/javascript" src="js/stats.js"></script>
|