cpee-model-management 1.0.7 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e0dba813806b528c9a04f3852938e621b74e736f813c73796ac05560ed47975e
4
- data.tar.gz: 066f46470ecd3f580f742bba5596e20f8737f3c3e0c02d3cedf4b1470461b3af
3
+ metadata.gz: 3f01249cf02b86d83022b913a2b81ebcfd06e48f19eb307bcf8645c619260da7
4
+ data.tar.gz: '08805c52f1143242b9e2f675886ab894d33fe28f5a05cc4408e0563eac592937'
5
5
  SHA512:
6
- metadata.gz: 9da118eb3836c211aa4ddafff4c5bc8c066f5ad059b80ae03c6b0d2913216836cdef391327378153e90285c48cc6fcca998a3e4e1f77f33701d7ec5e45c1c866
7
- data.tar.gz: 9a0a983fb62d4b30c06eaf054661fdb98fe450f359ab26536619df6e0e0a174833c257b1ca544c521f6c6d29ba6af53f6a2599540295454f45f8f3ff3253b4ba
6
+ metadata.gz: 4ea1643623a79c0ad75814965d0ed339591767f7c7d423c4d5f0a15dd88eb4f2626c0246b3f4e72a24989aff9dc8eb6cca2f5f72bea0751f6f0831ee437e5db7
7
+ data.tar.gz: a36b6d9995c293f6ed8c2eca53ed0231c74cf1a44b07a3e53bd50e6c958349612fd71ce586e1cba65989a334148e35ae7752ca0eaddcd615bfc812ddf9d8084f
@@ -1,13 +1,13 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "cpee-model-management"
3
- s.version = "1.0.7"
3
+ s.version = "1.0.12"
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.license = "LGPL-3.0"
6
6
  s.summary = "(Lifecycle) manage your process models in a directory or git repo."
7
7
 
8
8
  s.description = "see http://cpee.org"
9
9
 
10
- s.files = Dir['{server/*,tools/**/*,lib/**/*}'] + %w(LICENSE Rakefile cpee-model-management.gemspec README.md AUTHORS)
10
+ s.files = Dir['{server/*,tools/**/*,lib/**/*,ui/**/*}'] + %w(LICENSE Rakefile cpee-model-management.gemspec README.md AUTHORS)
11
11
  s.require_path = 'lib'
12
12
  s.extra_rdoc_files = ['README.md']
13
13
  s.bindir = 'tools'
@@ -35,36 +35,39 @@ module CPEE
35
35
  Dir.chdir(File.join(models,File.dirname(old)))
36
36
  p1 = Pathname.new(File.dirname(old))
37
37
  p2 = Pathname.new(File.dirname(new))
38
- old = File.basename(old)
39
- new = File.join(p1.relative_path_from(p1).to_s,File.basename(new))
40
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple mv "#{old}" "#{new}" 2>/dev/null`
41
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{old + '.active'}" 2>/dev/null`
42
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{old + '.active-uuid'}" 2>/dev/null`
43
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple mv "#{old + '.author'}" "#{new + '.author'}" 2>/dev/null`
44
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple mv "#{old + '.creator'}" "#{new + '.creator'}" 2>/dev/null`
45
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple mv "#{old + '.stage'}" "#{new + '.stage'}" 2>/dev/null`
38
+ told = File.basename(old)
39
+ tnew = File.join(p1.relative_path_from(p1).to_s,File.basename(new))
40
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple mv "#{told}" "#{tnew}" 2>/dev/null`
41
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{told + '.active'}" 2>/dev/null`
42
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{told + '.active-uuid'}" 2>/dev/null`
43
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple mv "#{told + '.author'}" "#{tnew + '.author'}" 2>/dev/null`
44
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple mv "#{told + '.creator'}" "#{tnew + '.creator'}" 2>/dev/null`
45
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple mv "#{told + '.stage'}" "#{tnew + '.stage'}" 2>/dev/null`
46
46
  Dir.chdir(cdir)
47
+ CPEE::ModelManagement::fs_mv(models,old,new) # fallback
47
48
  end
48
49
  def self::git_rm(models,new)
49
50
  cdir = Dir.pwd
50
51
  Dir.chdir(File.join(models,File.dirname(new)))
51
- new = File.basename(new)
52
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{new}" 2>/dev/null`
53
- FileUtils.rm_rf(new)
54
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{new}.active" 2>/dev/null`
55
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{new}.active-uuid" 2>/dev/null`
56
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{new}.author" 2>/dev/null`
57
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{new}.creator" 2>/dev/null`
58
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{new}.stage" 2>/dev/null`
52
+ tnew = File.basename(new)
53
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{tnew}" 2>/dev/null`
54
+ FileUtils.rm_rf(tnew)
55
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{tnew}.active" 2>/dev/null`
56
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{tnew}.active-uuid" 2>/dev/null`
57
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{tnew}.author" 2>/dev/null`
58
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{tnew}.creator" 2>/dev/null`
59
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{tnew}.stage" 2>/dev/null`
59
60
  Dir.chdir(cdir)
61
+ CPEE::ModelManagement::fs_rm(models,new) # fallback
60
62
  end
61
63
  def self::git_shift(models,new)
62
64
  cdir = Dir.pwd
63
65
  Dir.chdir(File.join(models,File.dirname(new)))
64
- new = File.basename(new)
65
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{new}.active" 2>/dev/null`
66
- `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{new}.active-uuid" 2>/dev/null`
66
+ nnew = File.basename(new)
67
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{nnew}.active" 2>/dev/null`
68
+ `git -c user.name='Christine Ashcreek' -c user.email=dev@null.com -c push.default=simple rm -rf "#{nnew}.active-uuid" 2>/dev/null`
67
69
  Dir.chdir(cdir)
70
+ CPEE::ModelManagement::fs_shift(models,new) # fallback
68
71
  end
69
72
  def self::git_commit(models,new,author)
70
73
  rp = File.realpath(models)
@@ -74,7 +77,7 @@ module CPEE
74
77
  def self::fs_mv(models,old,new)
75
78
  fname = File.join(models,old)
76
79
  fnname = File.join(models,new)
77
- FileUtils.mv(fname,fnname)
80
+ FileUtils.mv(fname,fnname) rescue nil
78
81
  File.delete(fname + '.active',fnname + '.active') rescue nil
79
82
  File.delete(fname + '.active-uuid',fnname + '.active-uuid') rescue nil
80
83
  FileUtils.mv(fname + '.author',fnname + '.author') rescue nil
@@ -104,7 +107,6 @@ module CPEE
104
107
  fname = File.join(models,new)
105
108
  File.delete(fname + '.active') rescue nil
106
109
  File.delete(fname + '.active-uuid') rescue nil
107
- Dir.chdir(cdir)
108
110
  end
109
111
 
110
112
  def self::git_dir(models,file)
data/server/model.xml CHANGED
@@ -1,6 +1,6 @@
1
1
  <testset xmlns="http://cpee.org/ns/properties/2.0">
2
2
  <dataelements/>
3
- <handlerwrapper>DefaultHandlerWrapper</handlerwrapper>
3
+ <executionhandler>ruby</executionhandler>
4
4
  <endpoints>
5
5
  <machine>machine</machine>
6
6
  <sensor>sensor</sensor>
data/server/testset.xml CHANGED
@@ -1,6 +1,6 @@
1
1
  <testset xmlns="http://cpee.org/ns/properties/2.0">
2
2
  <dataelements/>
3
- <handlerwrapper>DefaultHandlerWrapper</handlerwrapper>
3
+ <executionhandler>ruby</executionhandler>
4
4
  <endpoints>
5
5
  <timeout>https://cpee.org/services/timeout.php</timeout>
6
6
  <subprocess>https://cpee.org/flow/start/url/</subprocess>
data/tools/cpee-moma CHANGED
@@ -5,6 +5,7 @@ require 'optparse'
5
5
  require 'fileutils'
6
6
  require 'xml/smart'
7
7
  require 'zip'
8
+ require 'typhoeus'
8
9
 
9
10
  def wrap(s, width=78, indent=18)
10
11
  lines = []
@@ -24,6 +25,29 @@ def wrap(s, width=78, indent=18)
24
25
  return lines.join "\n"
25
26
  end
26
27
 
28
+ def js_libs(cockpit)
29
+ res = Typhoeus.get('https://cpee.org/js_libs/js_libs.zip')
30
+ if res.success?
31
+ File.write(File.join(cockpit,'js_libs.zip'),res.response_body)
32
+ Zip::File.open(File.join(cockpit,'js_libs.zip')) do |zip_file|
33
+ zip_file.each do |entry|
34
+ case entry.ftype
35
+ when :directory
36
+ Dir.mkdir(File.join(cockpit,entry.name)) rescue nil
37
+ when :file
38
+ File.write(File.join(cockpit,entry.name),entry.get_input_stream.read)
39
+ when :symlink
40
+ FileUtils.ln_s(File.join('.',entry.get_input_stream.read),File.join(cockpit,entry.name), force: true)
41
+ end
42
+ end
43
+ end
44
+ true
45
+ else
46
+ puts 'Internet access required to download javascript libs from "http://cpee.org/js_libs/js_libs.zip".'
47
+ false
48
+ end
49
+ end
50
+
27
51
  ARGV.options { |opt|
28
52
  opt.summary_indent = ' ' * 2
29
53
  opt.summary_width = 15
@@ -66,6 +90,19 @@ elsif command == 'convert'
66
90
  name = File.basename(f,'.xml')
67
91
  creator = author = design_dir = design_stage = nil
68
92
 
93
+ if doc.find('/x:testset/x:attributes').length == 0
94
+ n = doc.root.add('x:attributes')
95
+ end
96
+
97
+ if doc.find('/x:testset/x:attributes/x:theme').length == 0
98
+ n = doc.find('/x:testset/x:attributes').first
99
+ n.add('x:theme','extended')
100
+ end
101
+ if doc.find('/x:testset/x:attributes/x:info').length == 0
102
+ n = doc.find('/x:testset/x:attributes').first
103
+ n.add('x:info',name)
104
+ end
105
+
69
106
  if (dt = doc.find('/x:testset/x:attributes/x:creator')).length > 0
70
107
  dt.each do |e|
71
108
  creator = e.text
@@ -102,12 +139,14 @@ elsif command == 'convert'
102
139
  end
103
140
  File.write(f + '.stage',design_stage)
104
141
 
142
+ dd = ENV['PWD'] || Dir.pwd
143
+ ma = dd.scan(/\/([^\/]+\.dir)/)
144
+ design_dir = ma.join('/')
105
145
  if (dt = doc.find('/x:testset/x:attributes/x:design_dir')).length > 0
106
146
  dt.each do |e|
107
- design_dir = e.text
147
+ e.text = design_dir
108
148
  end
109
149
  else
110
- design_dir = Dir.pwd.sub(/^.*?models\/?/,'')
111
150
  doc.find('/x:testset/x:attributes').each do |e|
112
151
  e.add('x:design_dir',design_dir)
113
152
  end
data/ui/css/design.css ADDED
@@ -0,0 +1,50 @@
1
+ td {
2
+ padding-right: 1em;
3
+ }
4
+
5
+ td[data-class=model] {
6
+ font-size: 1.7em;
7
+ }
8
+ td[data-class=folder] {
9
+ font-size: 1.7em;
10
+ }
11
+ td[data-class=ops] {
12
+ cursor: pointer;
13
+ }
14
+
15
+ td[draggable] {
16
+ cursor: move;
17
+ }
18
+
19
+ form input {
20
+ width: 45em !important;
21
+ }
22
+
23
+ ui-behind {
24
+ text-transform: capitalize;
25
+ }
26
+
27
+ [is="x-ui-"] table.ui-table {
28
+ border-collapse: collapse;
29
+ }
30
+ [is="x-ui-"] table.ui-table thead th {
31
+ font-weight: bold;
32
+ text-align: left;
33
+ padding: 0.3em 0.5em;
34
+ }
35
+ [is="x-ui-"] table.ui-table tbody td {
36
+ padding: 0.1em 0.5em;
37
+ }
38
+ [is="x-ui-"] table.ui-table tbody tr:nth-child(odd) td {
39
+ background-color: var(--x-ui-content-light-background);
40
+ }
41
+ [is="x-ui-"] table.ui-table tbody tr:hover td {
42
+ background-color: var(--x-ui-content-hover-background);
43
+ }
44
+
45
+ [is="x-ui-"] table.ui-table tbody tr:nth-child(odd) td[data-class=ops] {
46
+ background-color: #d0d0d0;
47
+ }
48
+ [is="x-ui-"] table.ui-table tbody tr:hover td[data-class=ops] {
49
+ background-color: #99cee6b0;
50
+ }
data/ui/index.html ADDED
@@ -0,0 +1,151 @@
1
+ <!--
2
+ This file is part of CPEE-MODEL-MANAGEMENT.
3
+
4
+ CPEE-MODEL-MANAGEMENT is free software: you can redistribute it and/or
5
+ modify it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or (at your
7
+ option) any later version.
8
+
9
+ CPEE-MODEL-MANAGEMENT is distributed in the hope that it will be useful, but
10
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
+ more details.
13
+
14
+ You should have received a copy of the GNU General Public License along with
15
+ CPEE-MODEL-MANAGEMENT (file LICENSE in the main directory). If not, see
16
+ <http://www.gnu.org/licenses/>.
17
+ -->
18
+
19
+ <!DOCTYPE html>
20
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
21
+ <head>
22
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
23
+ <title>Design</title>
24
+
25
+ <!-- libs, do not modify. When local than load local libs. -->
26
+ <script type="text/javascript" src="/js_libs/jquery.min.js"></script>
27
+ <script type="text/javascript" src="/js_libs/jquery.browser.js"></script>
28
+ <script type="text/javascript" src="/js_libs/jquery.svg.min.js"></script>
29
+ <script type="text/javascript" src="/js_libs/jquery.svgdom.min.js"></script>
30
+ <script type="text/javascript" src="/js_libs/vkbeautify.js"></script>
31
+ <script type="text/javascript" src="/js_libs/util.js"></script>
32
+ <script type="text/javascript" src="/js_libs/printf.js"></script>
33
+ <script type="text/javascript" src="/js_libs/strftime.min.js"></script>
34
+ <script type="text/javascript" src="/js_libs/parsequery.js"></script>
35
+ <script type="text/javascript" src="/js_libs/underscore.min.js"></script>
36
+ <script type="text/javascript" src="/js_libs/jquery.caret.min.js"></script>
37
+ <script type="text/javascript" src="/js_libs/jquery.cookie.js"></script>
38
+
39
+ <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.qrcode/1.0/jquery.qrcode.min.js"></script>
40
+
41
+ <script type="text/javascript" src="/js_libs/relaxngui.js"></script>
42
+
43
+ <script type="text/javascript" src="/js_libs/uidash.js"></script>
44
+ <script type="text/javascript" src="/js_libs/custommenu.js"></script>
45
+
46
+ <link rel="stylesheet" href="/js_libs/custommenu.css" type="text/css"/>
47
+ <link rel="stylesheet" href="/js_libs/uidash.css" type="text/css"/>
48
+
49
+ <link rel="stylesheet" href="/global_ui/ui.css" type="text/css"/>
50
+
51
+ <link rel="stylesheet" href="/js_libs/relaxngui.css" type="text/css"/>
52
+
53
+ <!-- custom stuff, play arround -->
54
+ <link rel="stylesheet" href="css/design.css" type="text/css"/>
55
+ <script type="text/javascript" src="js/design.js"></script>
56
+ </head>
57
+ <body is="x-ui-">
58
+ <ui-rest id="main">
59
+ <ui-tabbar>
60
+ <ui-before ></ui-before>
61
+ <ui-tab class="" data-tab="models" >Models</ui-tab>
62
+ <ui-tab class="inactive" data-tab="newmodel">New Model</ui-tab>
63
+ <ui-tab class="inactive" data-tab="newdir" >New Dir</ui-tab>
64
+ <ui-behind ></ui-behind>
65
+ <ui-last ><a class="logo" href=".."></a></ui-last>
66
+ </ui-tabbar>
67
+ <ui-content class="noselect">
68
+ <ui-area data-belongs-to-tab="models">
69
+ <p>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@acdp.at">helpdesk@acdp.at</a> if you are lost. And as always: <a target='_blank' href='https://www.youtube.com/watch?v=kkxj5xVLyj0&feature=youtu.be&t=56'>get dressed for success</a>.</p>
70
+ <table id="models" class='ui-table'>
71
+ <template id="up">
72
+ <tr>
73
+ <td data-class='folder' class="noselect">📁</td>
74
+ <td data-class='name' data-full-name=''><a href=''></a></td>
75
+ <td></td>
76
+ <td></td>
77
+ <td data-class='creator'></td>
78
+ <td></td>
79
+ <td data-class='date'></td>
80
+ <td data-class=''></td>
81
+ </tr>
82
+ </template>
83
+ <template id="folder">
84
+ <tr>
85
+ <td data-class='folder' class="noselect">📁</td>
86
+ <td data-class='name' data-full-name=''><a href=''></a></td>
87
+ <td></td>
88
+ <td></td>
89
+ <td data-class='creator'></td>
90
+ <td></td>
91
+ <td data-class='date'></td>
92
+ <td data-class='ops' class="noselect"><span>…</span></td>
93
+ </tr>
94
+ </template>
95
+ <template id="model">
96
+ <tr>
97
+ <td data-class='model' class="noselect" draggable="true" title='drag to folders to move'>𝌭</td>
98
+ <td data-class='name' data-full-name=''><a target='_blank' href=''></a></td>
99
+ <td data-class='force'>[<a target='_blank' href='' title='force new instance'>F</a>]</td>
100
+ <td data-class='raw'>[<a target='_blank' href='' title='link to model source'>M</a>]</td>
101
+ <td data-class='creator'></td>
102
+ <td data-class='author'></td>
103
+ <td data-class='date'></td>
104
+ <td data-class='ops' class="noselect"><span>…</span></td>
105
+ </tr>
106
+ </template>
107
+ <tbody>
108
+ </tbody>
109
+ </table>
110
+ </ui-area>
111
+ <ui-area data-belongs-to-tab="newmodel" class="inactive">
112
+ <p>
113
+ Create an empty model. Beware, if a model of the same name already
114
+ exists in one of the categories (e.g. draft, development,
115
+ production, archive) it can not be created. To protect you from
116
+ getting confused and shooting yourself in the foot in your little
117
+ modelling world we allow only unique names. Better safe than sorry.
118
+ </p>
119
+ <form id="newmod">
120
+ <input type="hidden" name="stage" value=""/>
121
+ <input type="hidden" name="dir" value=""/>
122
+ <p>
123
+ <input type="text" name="new" required pattern="^[a-zA-Z0-9öäüÖÄÜ _-]+" placeholder="Filename (no extension necessary). Only use characters, spaces, underlines and dashes."/>
124
+ </p>
125
+ <p>
126
+ <button>New Model</button>
127
+ </p>
128
+ </form>
129
+ </ui-area>
130
+ <ui-area data-belongs-to-tab="newdir" class="inactive">
131
+ <p>
132
+ Create an empty directory. Beware, if a directory of the same name
133
+ already exists in one of the categories (e.g. draft, development,
134
+ production, archive) it can not be created. To protect you from
135
+ getting confused and shooting yourself in the foot in your little
136
+ modelling world we allow only unique names. Better safe than sorry.
137
+ </p>
138
+ <form id="newdir">
139
+ <input type="hidden" name="stage" value=""/>
140
+ <p>
141
+ <input type="text" name="newdir" required pattern="^[a-zA-Z0-9öäüÖÄÜ _-]+" placeholder="Directory name. Only use characters, spaces, underlines and dashes."/>
142
+ </p>
143
+ <p>
144
+ <button>New Directory</button>
145
+ </p>
146
+ </id>
147
+ </ui-area>
148
+ </ui-content>
149
+ </ui-rest>
150
+ </body>
151
+ </html>
data/ui/js/design.js ADDED
@@ -0,0 +1,214 @@
1
+ var gstage;
2
+ var gdir;
3
+
4
+ function move_it(name,todir) {
5
+ $.ajax({
6
+ type: "PUT",
7
+ url: "server/" + gdir + name,
8
+ data: { dir: todir }
9
+ });
10
+ }
11
+ function shift_it(name,to) {
12
+ $.ajax({
13
+ type: "PUT",
14
+ url: "server/" + gdir + name,
15
+ data: { stage: to }
16
+ });
17
+ }
18
+ function rename_it(name) {
19
+ var newname;
20
+ if (newname = prompt('New name please!',name.replace(/\.xml$/,'').replace(/\.dir$/,''))) {
21
+ $.ajax({
22
+ type: "PUT",
23
+ url: "server/" + gdir + name,
24
+ data: { new: newname }
25
+ });
26
+ }
27
+ }
28
+ function duplicate_it(name) {
29
+ var newname;
30
+ if (newname = prompt('New name please!',name.replace(/\.xml$/,'').replace(/\.dir$/,''))) {
31
+ $.ajax({
32
+ type: "POST",
33
+ url: "server/" + gdir,
34
+ data: { new: newname, old: name }
35
+ });
36
+ }
37
+ }
38
+ function delete_it(name) {
39
+ if (confirm('Are you really, really, REALLY sure!')) {
40
+ $.ajax({
41
+ type: "DELETE",
42
+ url: "server/" + gdir + name
43
+ });
44
+ }
45
+ }
46
+
47
+ function es_init(gdir,gstage) {
48
+ var es = new EventSource('server/');
49
+ es.onopen = function() {
50
+ console.log('es open');
51
+ };
52
+ es.onmessage = function(e) {
53
+ paint(gdir,gstage);
54
+ };
55
+ es.onerror = function() {
56
+ console.log('es error');
57
+ // es_init();
58
+ };
59
+ }
60
+
61
+ function paint(gdir,gstage) {
62
+ $('#models tbody').empty();
63
+ if (gdir && gdir != '') {
64
+ var clone = document.importNode(document.querySelector('#up').content,true);
65
+ $('[data-class=name] a',clone).text('..');
66
+ $('[data-class=name] a',clone).attr('href',window.location.pathname + '?stage=' + gstage + '&dir=');
67
+ $('#models tbody').append(clone);
68
+ }
69
+ $.ajax({
70
+ type: "GET",
71
+ url: "server/" + gdir,
72
+ data: { stage: gstage },
73
+ success: function(res) {
74
+ $(res).each(function(k,data) {
75
+ if (data.type == 'dir') {
76
+ var clone = document.importNode(document.querySelector('#folder').content,true);
77
+ $('[data-class=name] a',clone).text(data['name'].replace(/\.dir$/,''));
78
+ $('[data-class=name]',clone).attr('data-full-name',data['name']);
79
+ $('[data-class=name] a',clone).attr('href',window.location.pathname + '?stage=' + gstage + '&dir=' + data['name']);
80
+ } else {
81
+ var clone = document.importNode(document.querySelector('#model').content,true);
82
+ $('[data-class=name] a',clone).text(data['name']);
83
+ $('[data-class=name]',clone).attr('data-full-name',data['name']);
84
+ $('[data-class=name] a',clone).attr('href','server/' + gdir + data['name'] + '/open?stage=' + gstage);
85
+ $('[data-class=force] a',clone).attr('href','server/' + gdir + data['name'] + '/open-new?stage=' + gstage);
86
+ $('[data-class=raw] a',clone).attr('href','server/' + gdir + data['name']);
87
+ }
88
+ $('[data-class=creator]',clone).text(data['creator']);
89
+ $('[data-class=author]',clone).text(data['author']);
90
+ $('[data-class=date]',clone).text(new Date(data['date']).strftime('%Y-%m-%d, %H:%M:%S'));
91
+ $('#models tbody').append(clone);
92
+ });
93
+ }
94
+ });
95
+ }
96
+
97
+ $(document).ready(function() {
98
+ const queryString = window.location.search;
99
+ const urlParams = new URLSearchParams(queryString);
100
+
101
+ gstage = urlParams.get('stage') || 'draft';
102
+ gdir = urlParams.get('dir') ? (urlParams.get('dir') + '/').replace(/\/+/,'/') : '';
103
+
104
+ es_init(gdir,gstage);
105
+
106
+ $('input[name=stage]').val(gstage);
107
+ $('input[name=dir]').val(gdir);
108
+ $('ui-behind').text(gstage);
109
+
110
+ var dragged;
111
+ $('#models').on('drag','td[data-class=model]',false);
112
+ $('#models').on('dragstart','td[data-class=model]',(e) => {
113
+ dragged = $(e.currentTarget).parents('tr').find('td[data-class=name]').text();
114
+ });
115
+ $('#models').on('dragover','td[data-class=folder]',false);
116
+ $('#models').on('drop','td[data-class=folder]',(e) => {
117
+ e.preventDefault();
118
+ e.stopPropagation();
119
+ if (dragged) {
120
+ console.log(dragged);
121
+ var todir = $(e.currentTarget).parents('tr').find('td[data-class=name]').text();
122
+ todir = todir.replace(/\./g,'');
123
+ if (todir != '') {
124
+ todir += '.dir';
125
+ }
126
+ move_it(dragged,todir);
127
+ dragged = undefined;
128
+ }
129
+ });
130
+ var shifts = []
131
+ $.ajax({
132
+ type: "GET",
133
+ url: "server/",
134
+ data: { stages: 'stages' },
135
+ success: (r) => {
136
+ shifts = shifts.concat(r);
137
+ shifts = shifts.filter(item => item !== gstage);
138
+ }
139
+ });
140
+ $('#models').on('click','td[data-class=ops]',(e) => {
141
+ var menu = {};
142
+ var name = $(e.currentTarget).parents('tr').find('td[data-class=name]').attr('data-full-name');
143
+ menu['Operations'] = [
144
+ {
145
+ 'label': 'Delete',
146
+ 'function_call': delete_it,
147
+ 'text_icon': '❌',
148
+ 'type': undefined,
149
+ 'params': [name]
150
+ },
151
+ {
152
+ 'label': 'Rename',
153
+ 'function_call': rename_it,
154
+ 'type': undefined,
155
+ 'text_icon': '📛',
156
+ 'params': [name]
157
+ }
158
+ ];
159
+ if (name.match(/\.xml$/)) {
160
+ menu['Operations'].unshift(
161
+ {
162
+ 'label': 'Duplicate',
163
+ 'function_call': duplicate_it,
164
+ 'text_icon': '➕',
165
+ 'type': undefined,
166
+ 'params': [name]
167
+ }
168
+ );
169
+ }
170
+ if (shifts.length > 0) {
171
+ menu['Shifting'] = [];
172
+ shifts.forEach(ele => {
173
+ menu['Shifting'].push(
174
+ {
175
+ 'label': 'Shift to ' + ele,
176
+ 'function_call': shift_it,
177
+ 'text_icon': '➔',
178
+ 'type': undefined,
179
+ 'params': [name,ele]
180
+ }
181
+ );
182
+ });
183
+ }
184
+ console.log(shifts);
185
+ new CustomMenu(e).contextmenu(menu);
186
+ });
187
+
188
+ history.pushState({}, document.title, window.location.pathname + '?stage=' + gstage + '&dir=' + gdir);
189
+ paint(gdir,gstage);
190
+
191
+ $('#newmod').on('submit',(e) => {
192
+ $.ajax({
193
+ type: "POST",
194
+ url: "server/" + gdir,
195
+ data: { stage: gstage, new: $("#newmod input[name=new]").val() },
196
+ success: (r) => {
197
+ uidash_activate_tab($('ui-tab').first());
198
+ }
199
+ });
200
+ return false;
201
+ });
202
+
203
+ $('#newdir').on('submit',(e) => {
204
+ $.ajax({
205
+ type: "POST",
206
+ url: "server/",
207
+ data: { dir: $("#newdir input[name=newdir]").val() },
208
+ success: (r) => {
209
+ uidash_activate_tab($('ui-tab').first());
210
+ }
211
+ });
212
+ return false;
213
+ });
214
+ });
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cpee-model-management
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juergen eTM Mangler
8
8
  autorequire:
9
9
  bindir: tools
10
10
  cert_chain: []
11
- date: 2021-05-18 00:00:00.000000000 Z
11
+ date: 2021-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: riddl
@@ -60,6 +60,9 @@ files:
60
60
  - server/moma.conf
61
61
  - server/testset.xml
62
62
  - tools/cpee-moma
63
+ - ui/css/design.css
64
+ - ui/index.html
65
+ - ui/js/design.js
63
66
  homepage: http://cpee.org/
64
67
  licenses:
65
68
  - LGPL-3.0
@@ -79,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
82
  - !ruby/object:Gem::Version
80
83
  version: '0'
81
84
  requirements: []
82
- rubygems_version: 3.1.4
85
+ rubygems_version: 3.1.6
83
86
  signing_key:
84
87
  specification_version: 4
85
88
  summary: "(Lifecycle) manage your process models in a directory or git repo."