sinatra-hexacta 1.0.0 → 1.1.1
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 +4 -4
- data/lib/sinatra/extensions/processmanager.rb +15 -12
- data/lib/sinatra/handlers/constants.rb +51 -0
- data/lib/sinatra/handlers/init.rb +1 -0
- data/lib/sinatra/handlers/processes.rb +5 -3
- data/lib/sinatra/views/charts/bar.slim +50 -47
- data/lib/sinatra/views/charts/pie.slim +5 -1
- data/lib/sinatra/views/charts/stacked_bar.slim +2 -2
- data/lib/sinatra/views/constants/group.slim +59 -0
- data/lib/sinatra/views/constants/new.slim +35 -0
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8db700323222cf195e1fc968c6ed3d0d69e2b8e988fb14a0ea05edfaa066efb
|
4
|
+
data.tar.gz: 648716c0e7d0adf003cc9d04a1fffc6cacb0c41789902af1217780e7df600bf2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dea149aa1379c39b280c0aad1946cfabea46fa798e90632a9f767adf71bc134eaf7a6980c65c8e772df01da3ee1b744db42f0cca9191a406cb12d9aae5e8a942
|
7
|
+
data.tar.gz: 9aafab704a4ff92c917082ab6ddd159b581cdf376073de7d21280c7504bde6d0af5561b159bcaeceaa39ba63f94e438c50286be05dbfff869a660534558c7ddb
|
@@ -3,6 +3,7 @@
|
|
3
3
|
class AsyncProcess
|
4
4
|
include SuckerPunch::Job
|
5
5
|
attr_reader :handler
|
6
|
+
attr_reader :user_id
|
6
7
|
end
|
7
8
|
|
8
9
|
class ExampleProcess < AsyncProcess
|
@@ -25,10 +26,10 @@ end
|
|
25
26
|
|
26
27
|
class ProcessHandler
|
27
28
|
|
28
|
-
attr_reader :log, :error, :interrupted, :name, :id, :performed, :total, :clazz
|
29
|
+
attr_reader :log, :error, :interrupted, :name, :id, :performed, :total, :clazz, :user_id
|
29
30
|
attr_accessor :total
|
30
31
|
|
31
|
-
def initialize(id, name, clazz)
|
32
|
+
def initialize(id, name, clazz, user_id)
|
32
33
|
@id = id
|
33
34
|
@total = 0
|
34
35
|
@performed = 0
|
@@ -37,6 +38,7 @@ class ProcessHandler
|
|
37
38
|
@interrupted = false
|
38
39
|
@name = name
|
39
40
|
@clazz = clazz
|
41
|
+
@user_id = user_id
|
40
42
|
end
|
41
43
|
|
42
44
|
def progress
|
@@ -74,21 +76,22 @@ class ProcessManager
|
|
74
76
|
@handlers = []
|
75
77
|
end
|
76
78
|
|
77
|
-
def find(clazz)
|
78
|
-
@handlers.find { |handler| handler.clazz == clazz }
|
79
|
+
def find(clazz,user_id)
|
80
|
+
@handlers.find { |handler| handler.clazz == clazz && handler.user_id == user_id }
|
79
81
|
end
|
80
82
|
|
81
83
|
def run(*args)
|
82
|
-
|
83
|
-
|
84
|
-
|
84
|
+
user_id = args[1][:user_id]
|
85
|
+
clean(args.first.to_s,user_id)
|
86
|
+
if !running?(args.first.to_s,user_id)
|
87
|
+
handler = ProcessHandler.new(rand(1..100000000), args.first.name, args.first.to_s, user_id)
|
85
88
|
clazz = args.first
|
86
89
|
args[0] = handler
|
87
90
|
clazz.perform_async(*args)
|
88
91
|
@handlers << handler
|
89
92
|
handler
|
90
93
|
else
|
91
|
-
find(args.first.to_s)
|
94
|
+
find(args.first.to_s,user_id)
|
92
95
|
end
|
93
96
|
end
|
94
97
|
|
@@ -96,15 +99,15 @@ class ProcessManager
|
|
96
99
|
@handlers -= [handler]
|
97
100
|
end
|
98
101
|
|
99
|
-
def clean(clazz)
|
100
|
-
@handlers.select { |handler| handler.clazz == clazz }.each do |handler|
|
102
|
+
def clean(clazz,user_id)
|
103
|
+
@handlers.select { |handler| handler.clazz == clazz && handler.user_id == user_id }.each do |handler|
|
101
104
|
handler.interrupt
|
102
105
|
self.finish(handler)
|
103
106
|
end
|
104
107
|
end
|
105
108
|
|
106
|
-
def running?(clazz)
|
107
|
-
!@handlers.select { |handler| handler.clazz == clazz }.empty?
|
109
|
+
def running?(clazz,user_id)
|
110
|
+
!@handlers.select { |handler| handler.clazz == clazz && handler.user_id == user_id }.empty?
|
108
111
|
end
|
109
112
|
|
110
113
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Sinatra
|
3
|
+
module ConstantHandler
|
4
|
+
extend Hexacta
|
5
|
+
|
6
|
+
def enable_constants
|
7
|
+
p "Enabling constants..."
|
8
|
+
ConstantHandler.setup_dir("/app/views/#{Hexacta::GEM_FILE_DIR}/constants")
|
9
|
+
ConstantHandler.copy_all_files("/lib/sinatra/views/constants","/app/views/#{Hexacta::GEM_FILE_DIR}/constants")
|
10
|
+
|
11
|
+
before '/constant*' do
|
12
|
+
error(403) if authenticated(User).permissions.empty? && authenticated(User).recruiter.nil?
|
13
|
+
end
|
14
|
+
|
15
|
+
get '/constants' do
|
16
|
+
params[:format] = 'group' if params[:format].nil?
|
17
|
+
query = Constant.where(:kind => Constant.descendants.collect { |constant_class| constant_class.to_s })
|
18
|
+
slim :"#{Hexacta::GEM_FILE_DIR}/constants/#{params[:format]}", locals: { :constants => query.order(:kind,:value).all, :total => query.count, :filters => params, :query => query }
|
19
|
+
end
|
20
|
+
|
21
|
+
post '/constant' do
|
22
|
+
attributes = params.select { |attribute| Constant.columns.include?(attribute.to_sym) }
|
23
|
+
if params[:values].nil?
|
24
|
+
constant = Constant.create(attributes)
|
25
|
+
else
|
26
|
+
for value in params[:values].split(',')
|
27
|
+
attributes[:value] = value
|
28
|
+
constant = Constant.find_or_create(attributes)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
redirect back
|
32
|
+
end
|
33
|
+
|
34
|
+
post '/constants/:id' do |id|
|
35
|
+
constant = Constant.find(:id => id.to_i)
|
36
|
+
constant.update_fields(params, Constant.columns, :missing=>:skip)
|
37
|
+
constant.save #This is import to force before save
|
38
|
+
redirect back
|
39
|
+
end
|
40
|
+
|
41
|
+
delete '/constants/:id' do |id|
|
42
|
+
constant = Constant.find(:id => id.to_i)
|
43
|
+
constant.destroy.to_hash.to_json
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
register ConstantHandler
|
51
|
+
end
|
@@ -7,17 +7,19 @@ module Sinatra
|
|
7
7
|
p "Enabling processes..."
|
8
8
|
|
9
9
|
get '/processes' do
|
10
|
-
return "" if ProcessManager.instance.find(params[:class]).nil?
|
10
|
+
return "" if ProcessManager.instance.find(params[:class],authenticated(User).id).nil?
|
11
11
|
content_type :json
|
12
|
-
|
12
|
+
process = ProcessManager.instance.find(params[:class],authenticated(User).id)
|
13
|
+
return { 'name' => process.name, 'progress' => process.progress }.to_json
|
13
14
|
end
|
14
15
|
|
15
16
|
post '/processes/:clazz' do |clazz|
|
16
|
-
ProcessManager.instance.clean(clazz)
|
17
|
+
ProcessManager.instance.clean(clazz,authenticated(User).id)
|
17
18
|
200
|
18
19
|
end
|
19
20
|
|
20
21
|
post '/process' do
|
22
|
+
params[:user_id] = authenticated(User).id
|
21
23
|
klass = Object.const_get("#{params[:class]}")
|
22
24
|
a_handler = ProcessManager.instance.run(klass,params)
|
23
25
|
a_handler.to_json
|
@@ -1,56 +1,59 @@
|
|
1
|
-
|
1
|
+
-if labels.empty? || series.empty?
|
2
|
+
== empty_alert({ :title => "Sin datos suficientes", :message => "No hay suficientes datos para mostrar esta información."})
|
3
|
+
-else
|
4
|
+
.ct-chart.bar-chart id="#{id}"
|
2
5
|
|
3
|
-
.table-responsive.chart-table
|
4
|
-
|
5
|
-
|
6
|
-
tr
|
7
|
-
-for label in labels
|
8
|
-
th #{label}
|
9
|
-
-for serie in series
|
6
|
+
.table-responsive.chart-table
|
7
|
+
table.table.table-striped
|
8
|
+
tbody
|
10
9
|
tr
|
11
|
-
-for
|
12
|
-
|
10
|
+
-for label in labels
|
11
|
+
th #{label}
|
12
|
+
-for serie in series
|
13
|
+
tr
|
14
|
+
-for element in serie
|
15
|
+
td #{element}
|
13
16
|
|
14
17
|
|
15
|
-
javascript:
|
16
|
-
|
17
|
-
|
18
|
+
javascript:
|
19
|
+
var labels = #{{labels}};
|
20
|
+
var series = #{{series}};
|
18
21
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
22
|
+
var options = {
|
23
|
+
seriesBarDistance: 30,
|
24
|
+
fullWidth: true,
|
25
|
+
chartPadding: {
|
26
|
+
right: 40
|
27
|
+
},
|
28
|
+
height: '300px',
|
29
|
+
showLabel: true,
|
30
|
+
plugins: [
|
31
|
+
Chartist.plugins.legend({
|
32
|
+
legendNames: #{{names}},
|
33
|
+
})
|
34
|
+
]
|
35
|
+
};
|
33
36
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
var responsiveOptions = [
|
38
|
+
['screen and (max-width: 640px)', {
|
39
|
+
seriesBarDistance: 5,
|
40
|
+
axisX: {
|
41
|
+
labelInterpolationFnc: function (value) {
|
42
|
+
return value[0];
|
43
|
+
}
|
40
44
|
}
|
41
|
-
}
|
42
|
-
|
43
|
-
];
|
45
|
+
}]
|
46
|
+
];
|
44
47
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
new Chartist.Bar("##{id}", {
|
49
|
+
labels: labels,
|
50
|
+
series: series
|
51
|
+
},
|
52
|
+
options,
|
53
|
+
responsiveOptions
|
54
|
+
);
|
52
55
|
|
53
|
-
css:
|
54
|
-
|
55
|
-
|
56
|
-
|
56
|
+
css:
|
57
|
+
##{{id}} .ct-bar {
|
58
|
+
stroke-width: #{{100/(labels.count*series.count)}}%
|
59
|
+
}
|
@@ -9,6 +9,10 @@
|
|
9
9
|
tr
|
10
10
|
-for element in serie
|
11
11
|
td #{element}
|
12
|
+
tr
|
13
|
+
-total = [1,serie.reduce(:+)].max
|
14
|
+
-for element in serie
|
15
|
+
td #{(element.to_f*100/total).round(0)}%
|
12
16
|
|
13
17
|
javascript:
|
14
18
|
var labels = #{{labels}};
|
@@ -25,7 +29,7 @@ javascript:
|
|
25
29
|
Chartist.plugins.legend()
|
26
30
|
]
|
27
31
|
}
|
28
|
-
|
32
|
+
);
|
29
33
|
|
30
34
|
css:
|
31
35
|
.pie .ct-legend.ct-legend-inside {
|
@@ -0,0 +1,59 @@
|
|
1
|
+
.block-header
|
2
|
+
h2
|
3
|
+
| Constantes
|
4
|
+
|
5
|
+
-grouped_constants = constants.group_by { |constant| constant.kind }
|
6
|
+
-for kind in grouped_constants.keys
|
7
|
+
.card.m-b-5
|
8
|
+
.card-header style="padding: 20px;"
|
9
|
+
.media
|
10
|
+
.media-body.m-t-0
|
11
|
+
.row
|
12
|
+
.col-md-3
|
13
|
+
h2
|
14
|
+
small.m-0 Tipo de constante
|
15
|
+
h5.m-0 #{grouped_constants[kind].first.name}
|
16
|
+
small.m-0 #{grouped_constants[kind].count} valores
|
17
|
+
.col-md-9
|
18
|
+
-for constant in grouped_constants[kind]
|
19
|
+
a.btn.btn-link.bgm-lightgray.m-5.c-gray onclick="editConstant(#{constant.id},'#{constant.kind}','#{constant.value}')"
|
20
|
+
.di-block.v-middle #{constant.value}
|
21
|
+
|
22
|
+
.footer-text
|
23
|
+
a.text.btn.bgm-white.c-gray data-toggle="modal" data-target="#new-constant" Nueva constante
|
24
|
+
|
25
|
+
a.btn.btn-float.bgm-blue.m-btn.waves-effect.waves-circle.waves-float data-toggle="modal" data-target="#new-constant"
|
26
|
+
i.zmdi.zmdi-plus
|
27
|
+
|
28
|
+
== slim :'sinatra-hexacta/constants/new'
|
29
|
+
|
30
|
+
|
31
|
+
.modal.fade id="edit-constant" tabindex="-1" role="dialog" aria-labelledby="editConstant"
|
32
|
+
.modal-dialog
|
33
|
+
form.modal-content method="POST" data-toggle="validator"
|
34
|
+
.modal-content
|
35
|
+
.modal-header
|
36
|
+
h4.modal-title Editar constante
|
37
|
+
.modal-body
|
38
|
+
.row
|
39
|
+
.col-sm-12
|
40
|
+
== select_input({ :id => 'edit_kind', :name => "kind", :elements => [{ :value => nil, :text => 'Elige tipo de constante' }] + (Constant.descendants).collect { |constant_class| { :value => constant_class, :text => constant_class.new.name } }.uniq, :placeholder => "Tipo de constante", :chosen => nil, :required => true })
|
41
|
+
.col-sm-12
|
42
|
+
== input({ :id => 'edit_value', :name => "value", :title => "Valor", :type => 'text', :value => nil, :required => true })
|
43
|
+
.modal-footer
|
44
|
+
a.btn.waves-effect.bgm-red#delete.pull-left.c-white Borrar
|
45
|
+
button.btn.btn-link.waves-effect data-dismiss="modal" type="button" Cerrar
|
46
|
+
button.btn.btn-link.waves-effect type="submit" Actualizar
|
47
|
+
|
48
|
+
|
49
|
+
javascript:
|
50
|
+
function editConstant(constant_id,kind,value) {
|
51
|
+
$('#edit-constant .action').attr('action', '/constants/' + constant_id);
|
52
|
+
|
53
|
+
$('#edit-constant #edit_kind').val(kind);
|
54
|
+
$('#edit-constant #edit_value').val(value);
|
55
|
+
|
56
|
+
$('#edit-constant #edit_kind').trigger("chosen:updated");
|
57
|
+
$('#edit-constant #delete').attr("onclick","rm_object('constants','"+ constant_id +"')");
|
58
|
+
$('#edit-constant').modal('show');
|
59
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
.modal.fade id="new-constant" tabindex="-1" role="dialog" aria-labelledby="newConstant"
|
2
|
+
.modal-dialog.modal-lg
|
3
|
+
.row
|
4
|
+
.col-xs-4
|
5
|
+
form.modal-content action="/constant" method="POST" data-toggle="validator"
|
6
|
+
.modal-content
|
7
|
+
.modal-header
|
8
|
+
h4.modal-title Nueva constante
|
9
|
+
.modal-body
|
10
|
+
.row
|
11
|
+
.col-sm-12
|
12
|
+
== select_input({ :name => "kind", :elements => [{ :value => nil, :text => 'Elige tipo de constante' }] + (Constant.descendants).collect { |constant_class| { :value => constant_class, :text => constant_class.new.name } }.uniq, :placeholder => "Tipo de constante", :selected_elements => nil, :required => true })
|
13
|
+
.col-sm-12
|
14
|
+
== input({:name => "value", :title => "Valor", :type => 'text', :value => '', :required => true })
|
15
|
+
.modal-footer
|
16
|
+
button.btn.btn-link.waves-effect data-dismiss="modal" type="button" Cerrar
|
17
|
+
button.btn.btn-link.waves-effect type="submit" Crear
|
18
|
+
|
19
|
+
.col-xs-8
|
20
|
+
form.modal-content action="/constant" method="POST" data-toggle="validator"
|
21
|
+
.modal-content
|
22
|
+
.modal-header
|
23
|
+
h4.modal-title Nuevas constantes
|
24
|
+
.modal-body
|
25
|
+
.row
|
26
|
+
.col-sm-12
|
27
|
+
== select_input({ :name => "kind", :elements => [{ :value => nil, :text => 'Elige tipo de constante' }] + (Constant.descendants).collect { |constant_class| { :value => constant_class, :text => constant_class.new.name } }.uniq, :placeholder => "Tipo de constante", :selected_elements => nil, :required => true })
|
28
|
+
.col-sm-12
|
29
|
+
== input({:name => "values", :title => "Valores separados por coma", :type => 'text', :value => '', :required => true })
|
30
|
+
.modal-footer
|
31
|
+
button.btn.btn-link.waves-effect data-dismiss="modal" type="button" Cerrar
|
32
|
+
button.btn.btn-link.waves-effect type="submit" Crear
|
33
|
+
br
|
34
|
+
.modal-content
|
35
|
+
== slim info_alert({ :title => 'Creación masiva', :message => "Separa por coma los valores para crear multiples constantes de una sola vez."})
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra-hexacta
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marco Zanger
|
@@ -83,6 +83,7 @@ files:
|
|
83
83
|
- lib/sinatra/extensions/menu.rb
|
84
84
|
- lib/sinatra/extensions/notification.rb
|
85
85
|
- lib/sinatra/extensions/processmanager.rb
|
86
|
+
- lib/sinatra/handlers/constants.rb
|
86
87
|
- lib/sinatra/handlers/errors.rb
|
87
88
|
- lib/sinatra/handlers/init.rb
|
88
89
|
- lib/sinatra/handlers/notifications.rb
|
@@ -185,6 +186,8 @@ files:
|
|
185
186
|
- lib/sinatra/views/charts/line.slim
|
186
187
|
- lib/sinatra/views/charts/pie.slim
|
187
188
|
- lib/sinatra/views/charts/stacked_bar.slim
|
189
|
+
- lib/sinatra/views/constants/group.slim
|
190
|
+
- lib/sinatra/views/constants/new.slim
|
188
191
|
- lib/sinatra/views/errors/403.slim
|
189
192
|
- lib/sinatra/views/errors/404.slim
|
190
193
|
- lib/sinatra/views/errors/500.slim
|