mushy 0.0.1 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/mushy +81 -1
- data/lib/mushy.rb +2 -0
- data/lib/mushy/builder/api.rb +71 -0
- data/lib/mushy/builder/axios.rb +15 -0
- data/lib/mushy/builder/dark.rb +812 -0
- data/lib/mushy/builder/index.rb +355 -0
- data/lib/mushy/builder/vue.rb +11977 -0
- data/lib/mushy/flow.rb +3 -1
- data/lib/mushy/flux.rb +7 -6
- data/lib/mushy/fluxs/browser.rb +8 -0
- data/lib/mushy/fluxs/format.rb +19 -0
- data/lib/mushy/fluxs/write_file.rb +6 -7
- data/lib/site.rb +30 -34
- data/mushy.gemspec +5 -2
- metadata +50 -3
- data/lib/public/index.html +0 -256
data/lib/mushy/flow.rb
CHANGED
@@ -26,9 +26,11 @@ module Mushy
|
|
26
26
|
|
27
27
|
def self.parse data
|
28
28
|
data = JSON.parse data
|
29
|
-
flow = new
|
30
29
|
|
31
30
|
data_fluxs = data['fluxs'] || []
|
31
|
+
data_fluxs.select { |x| x['parent'] }.map { |r| r["parent_fluxs"] = [r["parent"]] }
|
32
|
+
|
33
|
+
flow = new
|
32
34
|
|
33
35
|
flow.fluxs = data_fluxs.map { |s| build_flux s }
|
34
36
|
|
data/lib/mushy/flux.rb
CHANGED
@@ -40,17 +40,18 @@ module Mushy
|
|
40
40
|
|
41
41
|
event = incoming_event
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
incoming_split = masher.mash(config, event)[:incoming_split]
|
44
|
+
config_considering_an_imcoming_split = config
|
45
|
+
.reject { |x, _| incoming_split && x.to_s == 'join' }
|
46
|
+
.reduce({}) { |t, i| t[i[0]] = i[1]; t }
|
46
47
|
|
47
48
|
events = incoming_split ? incoming_event[incoming_split] : [event]
|
48
49
|
|
49
|
-
results = events.map { |e| execute_single_event e,
|
50
|
+
results = events.map { |e| execute_single_event e, config_considering_an_imcoming_split }
|
50
51
|
|
51
52
|
return results.first unless incoming_split
|
52
53
|
|
53
|
-
results = join_these_results(results, event, config[:join]) if config[:join]
|
54
|
+
results = join_these_results([results].flatten, event, config[:join]) if config[:join]
|
54
55
|
|
55
56
|
results.flatten
|
56
57
|
end
|
@@ -67,7 +68,7 @@ module Mushy
|
|
67
68
|
returned_one_result = results.is_a?(Hash)
|
68
69
|
|
69
70
|
results = standardize_these results
|
70
|
-
results = shape_these results, event,
|
71
|
+
results = shape_these results, event, config
|
71
72
|
|
72
73
|
return results.first if the_original_join
|
73
74
|
|
data/lib/mushy/fluxs/browser.rb
CHANGED
@@ -27,6 +27,7 @@ module Mushy
|
|
27
27
|
cookies: {
|
28
28
|
description: 'Cookies for the web request. These can be received from a previous browser event with {{cookies}}, or can be typed manually.',
|
29
29
|
type: 'editgrid',
|
30
|
+
shrink: true,
|
30
31
|
value: [],
|
31
32
|
editors: [
|
32
33
|
{ id: 'name', target: 'name', field: { type: 'text', value: '', default: '' } },
|
@@ -57,6 +58,11 @@ module Mushy
|
|
57
58
|
type: 'text',
|
58
59
|
value: 'headers',
|
59
60
|
},
|
61
|
+
wait_before_closing: {
|
62
|
+
description: 'Wait this many seconds before closing the browser.',
|
63
|
+
type: 'integer',
|
64
|
+
value: '',
|
65
|
+
},
|
60
66
|
},
|
61
67
|
}
|
62
68
|
end
|
@@ -80,6 +86,8 @@ module Mushy
|
|
80
86
|
body: browser.body
|
81
87
|
}
|
82
88
|
|
89
|
+
sleep(config[:wait_before_closing].to_i) if config[:wait_before_closing] && config[:wait_before_closing].to_i > 0
|
90
|
+
|
83
91
|
browser.quit
|
84
92
|
|
85
93
|
result
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Mushy
|
2
|
+
|
3
|
+
class Format < Flux
|
4
|
+
|
5
|
+
def self.details
|
6
|
+
{
|
7
|
+
name: 'Format',
|
8
|
+
description: 'Return the event passed to it. This opens the opportunity to further alter results.',
|
9
|
+
config: {},
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def process event, config
|
14
|
+
event
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -10,26 +10,25 @@ module Mushy
|
|
10
10
|
name: {
|
11
11
|
description: 'The name of the file.',
|
12
12
|
type: 'text',
|
13
|
-
value: '
|
13
|
+
value: 'file.csv',
|
14
14
|
},
|
15
15
|
directory: {
|
16
16
|
description: 'The directory in which to write the file. Leave blank for the current directory.',
|
17
17
|
type: 'text',
|
18
|
-
value: '
|
18
|
+
value: '',
|
19
19
|
},
|
20
|
-
|
21
|
-
description: 'The
|
20
|
+
data: {
|
21
|
+
description: 'The text to write. You can use Liquid templating here to pull data from the event, or write hardcoded data.',
|
22
22
|
type: 'text',
|
23
|
-
value: '
|
23
|
+
value: '{{data}}',
|
24
24
|
},
|
25
25
|
},
|
26
26
|
}
|
27
27
|
end
|
28
28
|
|
29
29
|
def process event, config
|
30
|
-
data = event[config[:path].to_sym] || event[config[:path].to_s]
|
31
30
|
|
32
|
-
File.open(config[:name], 'w') { |f| f.write data }
|
31
|
+
File.open(config[:name], 'w') { |f| f.write config[:data] }
|
33
32
|
|
34
33
|
{}
|
35
34
|
end
|
data/lib/site.rb
CHANGED
@@ -2,53 +2,49 @@ require 'sinatra'
|
|
2
2
|
|
3
3
|
require_relative 'mushy'
|
4
4
|
|
5
|
+
the_file = 'hey.json'
|
6
|
+
|
5
7
|
get '/' do
|
6
|
-
|
8
|
+
Mushy::Builder::Index.file
|
9
|
+
end
|
10
|
+
|
11
|
+
get '/dark.css' do
|
12
|
+
content_type :css
|
13
|
+
Mushy::Builder::Dark.file
|
14
|
+
end
|
15
|
+
|
16
|
+
get '/axios.js' do
|
17
|
+
content_type :js
|
18
|
+
Mushy::Builder::Axios.file
|
19
|
+
end
|
20
|
+
|
21
|
+
get '/vue.js' do
|
22
|
+
content_type :js
|
23
|
+
Mushy::Builder::Vue.file
|
24
|
+
end
|
25
|
+
|
26
|
+
get '/flow' do
|
27
|
+
content_type :json
|
28
|
+
Mushy::Builder::Api.get_flow(the_file).to_json
|
7
29
|
end
|
8
30
|
|
9
31
|
get '/fluxs' do
|
10
32
|
content_type :json
|
11
|
-
|
12
|
-
fluxs: Mushy::Flux.all.select { |x| x.respond_to? :details }.map do |flux|
|
13
|
-
details = flux.details
|
14
|
-
details[:config][:incoming_split] = { type: 'text', description: 'Split an incoming event into multiple events by this key, an each event will be processed independently.' }
|
15
|
-
details[:config][:outgoing_split] = { type: 'text', description: 'Split an outgoing event into multiple events by this key.' }
|
16
|
-
details[:config][:merge] = { type: 'text', description: 'A comma-delimited list of fields from the event to carry through. Use * to merge all fields.' }
|
17
|
-
details[:config][:group] = { type: 'text', description: 'Group events by a field, which is stored in a key. The format is group_by|group_key.' }
|
18
|
-
details[:config][:limit] = { type: 'integer', description: 'Limit the number of events to this number.' }
|
19
|
-
details[:config][:join] = { type: 'text', description: 'Join all of the events from this flux into one event, under this name.' }
|
20
|
-
details[:config][:sort] = { type: 'text', description: 'Sort by this key.' }
|
21
|
-
details[:config][:model] = { type: 'keyvalue', description: 'Reshape the outgoing events.', value: {} }
|
22
|
-
|
23
|
-
details[:config]
|
24
|
-
.select { |_, v| v[:type] == 'keyvalue' }
|
25
|
-
.select { |_, v| v[:editors].nil? }
|
26
|
-
.each do |_, v|
|
27
|
-
v[:editors] = [
|
28
|
-
{ id: 'new_key', target: 'key', field: { type: 'text', value: '', default: '' } },
|
29
|
-
{ id: 'new_value', target: 'value', field: { type: 'text', value: '', default: '' } }
|
30
|
-
]
|
31
|
-
end
|
32
|
-
|
33
|
-
details
|
34
|
-
end
|
35
|
-
}.to_json
|
33
|
+
Mushy::Builder::Api.get_fluxs.to_json
|
36
34
|
end
|
37
35
|
|
38
36
|
post '/run' do
|
39
37
|
content_type :json
|
40
38
|
|
41
|
-
|
42
|
-
|
43
|
-
event = SymbolizedHash.new JSON.parse(data[:setup][:event].to_json)
|
44
|
-
|
45
|
-
config = SymbolizedHash.new data[:config]
|
39
|
+
result = Mushy::Builder::Api.run request.body.read
|
46
40
|
|
47
|
-
|
41
|
+
{ result: result }.to_json
|
42
|
+
end
|
48
43
|
|
49
|
-
|
44
|
+
post '/save' do
|
45
|
+
content_type :json
|
50
46
|
|
51
|
-
result =
|
47
|
+
result = Mushy::Builder::Api.save the_file, request.body.read
|
52
48
|
|
53
49
|
{ result: result }.to_json
|
54
50
|
end
|
data/mushy.gemspec
CHANGED
@@ -4,10 +4,10 @@ require 'mushy/version'
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = 'mushy'
|
7
|
-
s.version = '0.0.
|
7
|
+
s.version = '0.0.7'
|
8
8
|
s.date = '2020-11-23'
|
9
9
|
s.summary = 'Process streams of work using common modules.'
|
10
|
-
s.description = '
|
10
|
+
s.description = 'This tool assists in the creation and processing of workflows.'
|
11
11
|
s.authors = ['Darren Cauthon']
|
12
12
|
s.email = 'darren@cauthon.com'
|
13
13
|
s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
@@ -17,6 +17,9 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.license = 'MIT'
|
18
18
|
|
19
19
|
s.add_development_dependency 'minitest'
|
20
|
+
s.add_runtime_dependency 'sinatra'
|
21
|
+
s.add_runtime_dependency 'symbolized'
|
22
|
+
s.add_runtime_dependency 'thor'
|
20
23
|
s.add_runtime_dependency 'liquid'
|
21
24
|
s.add_runtime_dependency 'ferrum'
|
22
25
|
s.add_runtime_dependency 'nokogiri'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mushy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darren Cauthon
|
@@ -24,6 +24,48 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sinatra
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: symbolized
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: thor
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
27
69
|
- !ruby/object:Gem::Dependency
|
28
70
|
name: liquid
|
29
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,7 +122,7 @@ dependencies:
|
|
80
122
|
- - ">="
|
81
123
|
- !ruby/object:Gem::Version
|
82
124
|
version: '0'
|
83
|
-
description:
|
125
|
+
description: This tool assists in the creation and processing of workflows.
|
84
126
|
email: darren@cauthon.com
|
85
127
|
executables:
|
86
128
|
- mushy
|
@@ -89,6 +131,11 @@ extra_rdoc_files: []
|
|
89
131
|
files:
|
90
132
|
- bin/mushy
|
91
133
|
- lib/mushy.rb
|
134
|
+
- lib/mushy/builder/api.rb
|
135
|
+
- lib/mushy/builder/axios.rb
|
136
|
+
- lib/mushy/builder/dark.rb
|
137
|
+
- lib/mushy/builder/index.rb
|
138
|
+
- lib/mushy/builder/vue.rb
|
92
139
|
- lib/mushy/event.rb
|
93
140
|
- lib/mushy/flow.rb
|
94
141
|
- lib/mushy/flux.rb
|
@@ -97,6 +144,7 @@ files:
|
|
97
144
|
- lib/mushy/fluxs/build_csv.rb
|
98
145
|
- lib/mushy/fluxs/collection.rb
|
99
146
|
- lib/mushy/fluxs/filter.rb
|
147
|
+
- lib/mushy/fluxs/format.rb
|
100
148
|
- lib/mushy/fluxs/get.rb
|
101
149
|
- lib/mushy/fluxs/ls.rb
|
102
150
|
- lib/mushy/fluxs/parse_html.rb
|
@@ -106,7 +154,6 @@ files:
|
|
106
154
|
- lib/mushy/run.rb
|
107
155
|
- lib/mushy/runner.rb
|
108
156
|
- lib/mushy/version.rb
|
109
|
-
- lib/public/index.html
|
110
157
|
- lib/site.rb
|
111
158
|
- mushy.gemspec
|
112
159
|
- note.txt
|
data/lib/public/index.html
DELETED
@@ -1,256 +0,0 @@
|
|
1
|
-
<html>
|
2
|
-
<head>
|
3
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/water.css@2/out/dark.css">
|
4
|
-
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
|
5
|
-
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
|
6
|
-
</head>
|
7
|
-
<body>
|
8
|
-
<div id="app">
|
9
|
-
<table>
|
10
|
-
<tr v-for="flux in flow.fluxs">
|
11
|
-
<td>{{flux.name}}</td>
|
12
|
-
</tr>
|
13
|
-
</table>
|
14
|
-
<mip-heavy :data="setup"></mip-heavy>
|
15
|
-
<mip-heavy v-for="(data, id) in configs" v-show="setup.flux.value === id" :data="data"></mip-heavy>
|
16
|
-
<div v-if="results.loading">Loading...</div>
|
17
|
-
<div v-else>{{results.length}} result{{results.length == 1 ? "" : "s"}}</div>
|
18
|
-
<mip-heavy v-for="data in results" :data="data"></mip-heavy>
|
19
|
-
</div>
|
20
|
-
</body>
|
21
|
-
</html>
|
22
|
-
|
23
|
-
<script type="text/javascript">
|
24
|
-
|
25
|
-
var fancyName = function(id) { return '(' + id + '.split(/[ _]/).map(function(x){return x[0].toUpperCase() + x.substring(1)}).join(\' \'))' };
|
26
|
-
var thingToData = function(thing) {
|
27
|
-
var record = {};
|
28
|
-
for (var key in thing)
|
29
|
-
if (thing[key].value)
|
30
|
-
if (thing[key].type == 'json')
|
31
|
-
record[key] = JSON.parse(thing[key].value);
|
32
|
-
else
|
33
|
-
record[key] = thing[key].value;
|
34
|
-
return record;
|
35
|
-
};
|
36
|
-
|
37
|
-
var components = {
|
38
|
-
label: {
|
39
|
-
props: ['label', 'description'],
|
40
|
-
template: '<label :for="id" v-if="label != \'\'">{{label || ' + fancyName('id') + '}} <i v-show="description">({{description}})</i></label>'
|
41
|
-
},
|
42
|
-
text: {
|
43
|
-
props: ['label', 'placeholder', 'disabled', 'readonly', 'value', 'description'],
|
44
|
-
template: '<div><mip-label :id="id" :label="label" :description="description"></mip-label><input type="text" :name="id" :placeholder="placeholder" v-bind:value="value" v-on:input="$emit(\'update:value\', $event.target.value);" :disabled="disabled == \'true\'" :readonly="readonly == \'true\'"></div>'
|
45
|
-
},
|
46
|
-
integer: {
|
47
|
-
props: ['label', 'placeholder', 'disabled', 'readonly', 'value', 'description'],
|
48
|
-
template: '<div><mip-label :id="id" :label="label" :description="description"></mip-label><input type="text" :name="id" :placeholder="placeholder" v-bind:value="value" v-on:input="$emit(\'update:value\', $event.target.value);" :disabled="disabled == \'true\'" :readonly="readonly == \'true\'"></div>'
|
49
|
-
},
|
50
|
-
email: {
|
51
|
-
props: ['label', 'placeholder', 'disabled', 'readonly', 'value', 'description'],
|
52
|
-
template: '<div><mip-label :id="id" :label="label" :description="description"></mip-label><input type="email" :name="id" :placeholder="placeholder" v-bind:value="value" v-on:input="$emit(\'update:value\', $event.target.value)" :disabled="disabled == \'true\'" :readonly="readonly == \'true\'"></div>'
|
53
|
-
},
|
54
|
-
textarea: {
|
55
|
-
props: ['label', 'placeholder', 'disabled', 'readonly', 'value', 'description'],
|
56
|
-
template: '<div><mip-label :id="id" :label="label" :description="description"></mip-label><textarea :name="id" :placeholder="placeholder" v-bind:value="value" v-on:input="$emit(\'update:value\', $event.target.value)" :disabled="disabled == \'true\'" :readonly="readonly == \'true\'"></textarea></div>'
|
57
|
-
},
|
58
|
-
json: {
|
59
|
-
props: ['label', 'placeholder', 'disabled', 'readonly', 'value', 'description'],
|
60
|
-
template: '<div><mip-label :id="id" :label="label" :description="description"></mip-label><pre><code>{{value}}</code></pre><textarea :name="id" :placeholder="placeholder" v-bind:value="value" v-on:input="$emit(\'update:value\', $event.target.value)" :disabled="disabled == \'true\'" :readonly="readonly == \'true\'"></textarea></div>'
|
61
|
-
},
|
62
|
-
jsonview: {
|
63
|
-
data: function() {
|
64
|
-
return {
|
65
|
-
toggle: function(view) { return view == 'beautiful' ? 'thin' : 'beautiful'; },
|
66
|
-
copy: function(view, json) { console.log(view); return navigator.clipboard.writeText((view == 'beautiful' ? JSON.stringify(json, null, " ") : JSON.stringify(json))); },
|
67
|
-
show: function(view, json) { return view == 'beautiful' ? JSON.stringify(json, null, " ") : JSON.stringify(json); },
|
68
|
-
};
|
69
|
-
},
|
70
|
-
props: ['label', 'placeholder', 'disabled', 'readonly', 'value', 'description', 'view'],
|
71
|
-
template: '<div><mip-label :id="id" :label="label" :description="description"></mip-label> <a href="#" v-on:click.prevent.stop="view=toggle(view)">{{(view == \'beautiful\' ? \'>\' : \'^\')}}</a><a href="#" v-on:click.prevent.stop="copy(view, value)">copy</a><pre><code>{{show(view, value)}}</code></pre></div>'
|
72
|
-
},
|
73
|
-
radio: {
|
74
|
-
props: ['label', 'value', 'options', 'description'],
|
75
|
-
template: '<div><mip-label :id="id" :label="label" :description="description"></mip-label><div v-for="option in options"><input type="radio" :name="id" v-bind:value="option" v-on:input="$emit(\'update:value\', $event.target.value)" :checked="value == option"> <label for="option">{{option}}</label></div></div>'
|
76
|
-
},
|
77
|
-
select: {
|
78
|
-
props: ['label', 'value', 'options', 'description'],
|
79
|
-
template: '<div><mip-label :id="id" :label="label" :description="description"></mip-label><select :name="id" v-on:input="$emit(\'update:value\', $event.target.value)"><option v-for="option in options" v-bind:value="option" :selected="value == option">{{option}}</option></select></div>'
|
80
|
-
},
|
81
|
-
boolean: {
|
82
|
-
props: ['label', 'value', 'options', 'description'],
|
83
|
-
template: '<div><mip-label :id="id" :label="label" :description="description"></mip-label><select :name="id" v-on:input="$emit(\'update:value\', $event.target.value)"><option v-for="option in [true, false]" v-bind:value="option" :selected="value == option">{{option}}</option></select></div>'
|
84
|
-
},
|
85
|
-
table: {
|
86
|
-
props: ['value', 'description'],
|
87
|
-
template: '<table><tr><th v-for="(d, i) in value[0]">{{' + fancyName('i') + '}}</th></tr><tr v-for="v in value"><td v-for="(d, i) in v">{{d}}</td></tr></table>'
|
88
|
-
},
|
89
|
-
editgrid: {
|
90
|
-
data: function() {
|
91
|
-
return {
|
92
|
-
removeRecord: function(record, records, index) { records.splice(index, 1); },
|
93
|
-
addRecord: function(editors, records) {
|
94
|
-
var record = {};
|
95
|
-
for (var i = 0; i < editors.length; i++)
|
96
|
-
{
|
97
|
-
record[editors[i].target] = editors[i].field.value;
|
98
|
-
editors[i].field.value = editors[i].field.default ? editors[i].field.default : '';
|
99
|
-
}
|
100
|
-
records.push(record);
|
101
|
-
}
|
102
|
-
};
|
103
|
-
},
|
104
|
-
props: ['value', 'editors', 'label', 'description'],
|
105
|
-
template: '<div><mip-label :id="id" :label="label" :description="description"></mip-label><table><tr><th v-for="(d, i) in value[0]">{{' + fancyName('i') + '}}</th></tr><tr v-for="(v, z) in value"><td v-for="(d, i) in v">{{d}}</td><td><a href="#" v-on:click.prevent.stop="removeRecord(v, value, z)">[x]</a></td></tr><tr><td v-for="editor in editors"><mip-thing :data="editor.field" :id="editor.id"></mip-thing></td><td><a href="#" v-on:click.prevent.stop="addRecord(editors, value)">[Add]</a></td></tr></table></div>'
|
106
|
-
},
|
107
|
-
keyvalue: {
|
108
|
-
data: function() {
|
109
|
-
return {
|
110
|
-
removeRecord: function(data, key) { Vue.delete(data, key) },
|
111
|
-
addRecord: function(editors, data) {
|
112
|
-
Vue.set(data, editors[0].field.value, editors[1].field.value)
|
113
|
-
editors[0].field.value = editors[0].field.default;
|
114
|
-
editors[1].field.value = editors[1].field.default;
|
115
|
-
}
|
116
|
-
};
|
117
|
-
},
|
118
|
-
props: ['value', 'label', 'editors', 'description'],
|
119
|
-
template: '<div><mip-label :id="id" :label="label" :description="description"></mip-label><table><tr v-for="(v, k) in value"><td>{{k}}</td><td>{{v}}</td><td><a href="#" v-on:click.prevent.stop="removeRecord(value, k)">[x]</a></td></tr><tr><td v-for="editor in editors"><mip-thing :data="editor.field" :id="editor.id"></mip-thing></td><td><a href="#" v-on:click.prevent.stop="addRecord(editors, value)" v-show="editors[0].field.value">[Add]</a></td></tr></table></div>'
|
120
|
-
},
|
121
|
-
button: {
|
122
|
-
props: ['click', 'description'],
|
123
|
-
template: '<button v-on:click.prevent.stop="click(pull(this))">{{id}}</button>'
|
124
|
-
}
|
125
|
-
};
|
126
|
-
|
127
|
-
for(var property in components)
|
128
|
-
{
|
129
|
-
var props = JSON.parse(JSON.stringify(components[property].props));
|
130
|
-
props.push('id');
|
131
|
-
Vue.component('mip-' + property, {
|
132
|
-
data: components[property].data ?? function () {
|
133
|
-
var foundIt = this.$parent;
|
134
|
-
var counter = 0;
|
135
|
-
while (foundIt.$parent.constructor.name == "VueComponent" && counter < 10)
|
136
|
-
{
|
137
|
-
foundIt = foundIt.$parent;
|
138
|
-
counter += 1;
|
139
|
-
}
|
140
|
-
return {
|
141
|
-
console: console,
|
142
|
-
pull: function(x) { return thingToData(foundIt.data); },
|
143
|
-
}
|
144
|
-
},
|
145
|
-
props: props,
|
146
|
-
template: components[property].template
|
147
|
-
});
|
148
|
-
}
|
149
|
-
|
150
|
-
var thingTemplate = '<div>';
|
151
|
-
for (var property in components)
|
152
|
-
thingTemplate = thingTemplate + '<mip-' + property + ' v-if="data.type == \'' + property + '\'" :id="id" ' + components[property].props.map(function(x){ return ':' + x + '.sync="data.' + x + '"';}).join(' ') + '></mip-' + property + '>'
|
153
|
-
thingTemplate = thingTemplate + '</div>';
|
154
|
-
|
155
|
-
Vue.component('mip-thing', {
|
156
|
-
data: function () {
|
157
|
-
return {
|
158
|
-
console: console,
|
159
|
-
}
|
160
|
-
},
|
161
|
-
props: ['data', 'value', 'id', 'model'],
|
162
|
-
template: thingTemplate
|
163
|
-
});
|
164
|
-
|
165
|
-
Vue.component('mip-heavy', {
|
166
|
-
data: function () {
|
167
|
-
return {
|
168
|
-
console: console,
|
169
|
-
}
|
170
|
-
},
|
171
|
-
props: ['data'],
|
172
|
-
template: '<div><mip-thing v-for="(d, id) in data" :data="d" :id="id"></mip-thing></div>',
|
173
|
-
});
|
174
|
-
|
175
|
-
var sample = {
|
176
|
-
email: { type: 'email', value: 'darren@cauthon.com' },
|
177
|
-
first_name: { type: 'text', value: 'Darren' },
|
178
|
-
description: { type: 'textarea', value: 'more data' },
|
179
|
-
size: { type: 'select', value: 'medium', options: ['small', 'medium', 'large']},
|
180
|
-
heynow: { type: 'keyvalue',
|
181
|
-
value: {
|
182
|
-
first_name: 'John',
|
183
|
-
last_name: 'Doe',
|
184
|
-
},
|
185
|
-
editors: [
|
186
|
-
{ id: 'new_key', target: 'key', field: { type: 'text', value: '', default: '' } },
|
187
|
-
{ id: 'new_value', target: 'value', field: { type: 'text', value: '', default: '' } }
|
188
|
-
] },
|
189
|
-
past: { type: 'editgrid',
|
190
|
-
value: [
|
191
|
-
{ name: 'Godzilla', quantity: 1 },
|
192
|
-
{ name: 'Mothra', quantity: 2 },
|
193
|
-
],
|
194
|
-
editors: [
|
195
|
-
{ id: 'new_name', target: 'name', field: { type: 'text', value: '', default: '' } },
|
196
|
-
{ id: 'new_quantity', target: 'quantity', field: { type: 'select', value: '1', options: [1, 2, 3], default: 1 } }
|
197
|
-
] },
|
198
|
-
super_action: { type: 'button', click: function(x) { console.log(x) } },
|
199
|
-
};
|
200
|
-
|
201
|
-
var app = null;
|
202
|
-
|
203
|
-
axios.get('/fluxs')
|
204
|
-
.then(function(data){
|
205
|
-
|
206
|
-
var configs = {};
|
207
|
-
data.data.fluxs.map(function(x){
|
208
|
-
configs[x.name] = x.config;
|
209
|
-
});
|
210
|
-
|
211
|
-
var setup = {
|
212
|
-
event: { type: 'json', value: '{}' },
|
213
|
-
id: { type: 'text', value: '' },
|
214
|
-
name: { type: 'text', value: '' },
|
215
|
-
flux: { type: 'select', value: data.data.fluxs[0].name, options: data.data.fluxs.map(function(x){ return x.name })},
|
216
|
-
};
|
217
|
-
|
218
|
-
for (var key in configs)
|
219
|
-
{
|
220
|
-
configs[key].go = { type: 'button', click: function(c) {
|
221
|
-
app.results = [];
|
222
|
-
Vue.set(app.results, 'loading', true);
|
223
|
-
axios.post('/run', { config: c, setup: thingToData(app.setup) })
|
224
|
-
.then(function(r){
|
225
|
-
Vue.set(app.results, 'loading', false);
|
226
|
-
for (var key in r.data.result)
|
227
|
-
app.results.push({darren: { type:'jsonview', value: r.data.result[key], view: 'thin' }});
|
228
|
-
});
|
229
|
-
} };
|
230
|
-
|
231
|
-
configs[key].save = { type: 'button', click: function(config) {
|
232
|
-
var setup = thingToData(app.setup);
|
233
|
-
var flux = {
|
234
|
-
id: setup.id,
|
235
|
-
name: setup.name,
|
236
|
-
config: config,
|
237
|
-
};
|
238
|
-
app.flow.fluxs.push(flux);
|
239
|
-
console.log(flux);
|
240
|
-
}
|
241
|
-
};
|
242
|
-
}
|
243
|
-
|
244
|
-
app = new Vue({
|
245
|
-
el: '#app',
|
246
|
-
data: {
|
247
|
-
flow: {
|
248
|
-
fluxs: [],
|
249
|
-
},
|
250
|
-
configs: configs,
|
251
|
-
setup: setup,
|
252
|
-
results: [],
|
253
|
-
}
|
254
|
-
});
|
255
|
-
});
|
256
|
-
</script>
|