engine2 1.0.4 → 1.0.5
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/Gemfile +0 -0
- data/Rakefile +1 -1
- data/app/{engine2actions.coffee → actions.coffee} +192 -142
- data/app/app.coffee +0 -0
- data/app/app.css +4 -0
- data/app/engine2.coffee +87 -175
- data/app/modal.coffee +133 -0
- data/bower.json +2 -1
- data/conf/message.yaml +0 -0
- data/conf/message_pl.yaml +0 -0
- data/config.coffee +11 -2
- data/engine2.gemspec +2 -2
- data/lib/engine2.rb +12 -10
- data/lib/engine2/action.rb +1290 -134
- data/lib/engine2/{meta/array_meta.rb → action/array.rb} +4 -3
- data/lib/engine2/{meta/decode_meta.rb → action/decode.rb} +16 -15
- data/lib/engine2/action/delete.rb +65 -0
- data/lib/engine2/action/form.rb +16 -0
- data/lib/engine2/{meta/infra_meta.rb → action/infra.rb} +118 -85
- data/lib/engine2/action/link.rb +117 -0
- data/lib/engine2/{meta/list_meta.rb → action/list.rb} +61 -62
- data/lib/engine2/action/save.rb +30 -0
- data/lib/engine2/action/view.rb +8 -0
- data/lib/engine2/action_node.rb +221 -0
- data/lib/engine2/core.rb +120 -77
- data/lib/engine2/handler.rb +9 -10
- data/lib/engine2/model.rb +4 -20
- data/lib/engine2/models/Files.rb +2 -1
- data/lib/engine2/models/UserInfo.rb +6 -3
- data/lib/engine2/post_bootstrap.rb +3 -2
- data/lib/engine2/pre_bootstrap.rb +1 -0
- data/lib/engine2/scheme.rb +98 -47
- data/lib/engine2/templates.rb +1 -0
- data/lib/engine2/type_info.rb +6 -4
- data/lib/engine2/version.rb +2 -1
- data/package.json +12 -10
- data/public/favicon.ico +0 -0
- data/public/img/ajax-loader-dark.gif +0 -0
- data/public/img/ajax-loader.gif +0 -0
- data/views/fields/blob.slim +0 -0
- data/views/fields/bs_select.slim +0 -0
- data/views/fields/bsselect_picker.slim +0 -0
- data/views/fields/bsselect_picker_opt.slim +0 -0
- data/views/fields/checkbox.slim +0 -0
- data/views/fields/checkbox_buttons.slim +0 -0
- data/views/fields/checkbox_buttons_opt.slim +0 -0
- data/views/fields/currency.slim +0 -0
- data/views/fields/date.slim +0 -0
- data/views/fields/date_range.slim +0 -0
- data/views/fields/date_time.slim +0 -0
- data/views/fields/datetime.slim +0 -0
- data/views/fields/decimal.slim +0 -0
- data/views/fields/decimal_date.slim +0 -0
- data/views/fields/decimal_time.slim +0 -0
- data/views/fields/email.slim +0 -0
- data/views/fields/file_store.slim +7 -7
- data/views/fields/input_text.slim +0 -0
- data/views/fields/integer.slim +0 -0
- data/views/fields/list_bsselect.slim +0 -0
- data/views/fields/list_bsselect_opt.slim +0 -0
- data/views/fields/list_buttons.slim +0 -0
- data/views/fields/list_buttons_opt.slim +0 -0
- data/views/fields/list_select.slim +0 -0
- data/views/fields/list_select_opt.slim +0 -0
- data/views/fields/password.slim +0 -0
- data/views/fields/radio_checkbox.slim +0 -0
- data/views/fields/scaffold.slim +0 -0
- data/views/fields/scaffold_picker.slim +0 -0
- data/views/fields/select_picker.slim +0 -0
- data/views/fields/select_picker_opt.slim +0 -0
- data/views/fields/text_area.slim +1 -0
- data/views/fields/time.slim +0 -0
- data/views/fields/typeahead_picker.slim +0 -0
- data/views/index.slim +3 -3
- data/views/infra/index.slim +0 -0
- data/views/infra/inspect.slim +20 -0
- data/views/modals/close_m.slim +0 -0
- data/views/modals/confirm_m.slim +0 -0
- data/views/modals/empty_m.slim +0 -0
- data/views/modals/menu_m.slim +1 -1
- data/views/modals/yes_no_m.slim +0 -0
- data/views/panels/menu_m.slim +1 -1
- data/views/scaffold/confirm.slim +0 -0
- data/views/scaffold/fields.slim +0 -0
- data/views/scaffold/form.slim +0 -0
- data/views/scaffold/form_collapse.slim +0 -0
- data/views/scaffold/form_tabs.slim +0 -0
- data/views/scaffold/list.slim +0 -0
- data/views/scaffold/message.slim +0 -0
- data/views/scaffold/search.slim +0 -0
- data/views/scaffold/search_collapse.slim +0 -0
- data/views/scaffold/search_tabs.slim +0 -0
- data/views/scaffold/view.slim +0 -0
- data/views/scaffold/view_collapse.slim +0 -0
- data/views/scaffold/view_tabs.slim +0 -0
- data/views/search_fields/bsmselect_picker.slim +0 -0
- data/views/search_fields/bsselect_picker.slim +0 -0
- data/views/search_fields/checkbox.slim +0 -0
- data/views/search_fields/checkbox2.slim +0 -0
- data/views/search_fields/checkbox_buttons.slim +0 -0
- data/views/search_fields/date_range.slim +0 -0
- data/views/search_fields/decimal_date_range.slim +0 -0
- data/views/search_fields/input_text.slim +0 -0
- data/views/search_fields/integer.slim +0 -0
- data/views/search_fields/integer_range.slim +0 -0
- data/views/search_fields/list_bsmselect.slim +0 -0
- data/views/search_fields/list_bsselect.slim +0 -0
- data/views/search_fields/list_buttons.slim +0 -0
- data/views/search_fields/list_select.slim +0 -0
- data/views/search_fields/scaffold_picker.slim +0 -0
- data/views/search_fields/select_picker.slim +0 -0
- data/views/search_fields/typeahead_picker.slim +0 -0
- metadata +41 -42
- data/lib/engine2/meta.rb +0 -1216
- data/lib/engine2/meta/delete_meta.rb +0 -60
- data/lib/engine2/meta/form_meta.rb +0 -15
- data/lib/engine2/meta/link_meta.rb +0 -134
- data/lib/engine2/meta/save_meta.rb +0 -50
- data/lib/engine2/meta/view_meta.rb +0 -7
- data/public/__sinatra__/404.png +0 -0
- data/public/__sinatra__/500.png +0 -0
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
module Engine2
|
|
4
|
-
class
|
|
5
|
-
|
|
6
|
-
include
|
|
5
|
+
class ArrayListAction < Action
|
|
6
|
+
action_type :list
|
|
7
|
+
include ActionListSupport
|
|
7
8
|
|
|
8
9
|
(DefaultFilters ||= {}).merge!(
|
|
9
10
|
exact: lambda{|entries, name, value, type_info, hash|
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
module Engine2
|
|
4
|
-
class
|
|
5
|
-
include
|
|
5
|
+
class DecodeAction < Action
|
|
6
|
+
include ActionAPISupport, ActionModelSupport, ActionQuerySupport
|
|
6
7
|
|
|
7
8
|
def decode *fields, &blk
|
|
8
9
|
query select(*fields), &blk
|
|
@@ -19,7 +20,7 @@ module Engine2
|
|
|
19
20
|
|
|
20
21
|
def post_process
|
|
21
22
|
if fields = @meta[:fields]
|
|
22
|
-
fields = fields - static.
|
|
23
|
+
fields = fields - static.meta[:fields] if dynamic?
|
|
23
24
|
# no decorate here
|
|
24
25
|
fields.each do |name|
|
|
25
26
|
type_info = assets[:model].type_info[name] # foreign keys ?
|
|
@@ -42,7 +43,7 @@ module Engine2
|
|
|
42
43
|
end
|
|
43
44
|
|
|
44
45
|
def post_run
|
|
45
|
-
|
|
46
|
+
decode(*assets[:model].primary_keys) unless @query
|
|
46
47
|
@meta[:separator] = '/' unless @meta[:separator]
|
|
47
48
|
super
|
|
48
49
|
@meta[:primary_fields] = assets[:model].primary_keys
|
|
@@ -50,16 +51,16 @@ module Engine2
|
|
|
50
51
|
|
|
51
52
|
end
|
|
52
53
|
|
|
53
|
-
class
|
|
54
|
-
|
|
54
|
+
class DecodeListAction < DecodeAction
|
|
55
|
+
action_type :decode_list
|
|
55
56
|
|
|
56
57
|
def invoke handler
|
|
57
58
|
{entries: get_query.limit(200).all}
|
|
58
59
|
end
|
|
59
60
|
end
|
|
60
61
|
|
|
61
|
-
class
|
|
62
|
-
|
|
62
|
+
class TypeAheadAction < DecodeAction
|
|
63
|
+
action_type :typeahead
|
|
63
64
|
|
|
64
65
|
def pre_run
|
|
65
66
|
super
|
|
@@ -72,7 +73,7 @@ module Engine2
|
|
|
72
73
|
|
|
73
74
|
def invoke handler
|
|
74
75
|
if query = handler.params[:query]
|
|
75
|
-
condition =
|
|
76
|
+
condition = @meta[:decode_fields].map{|f|f.like("%#{query}%")}.reduce{|q, f| q | f}
|
|
76
77
|
{entries: get_query.where(condition).limit(@meta[:limit]).all}
|
|
77
78
|
else
|
|
78
79
|
handler.permit id = handler.params[:id]
|
|
@@ -83,15 +84,15 @@ module Engine2
|
|
|
83
84
|
end
|
|
84
85
|
end
|
|
85
86
|
|
|
86
|
-
class
|
|
87
|
-
|
|
87
|
+
class DecodeEntryAction < DecodeAction
|
|
88
|
+
action_type :decode_entry
|
|
88
89
|
|
|
89
90
|
def invoke handler
|
|
90
91
|
{entries: invoke_decode(handler, handler.param_to_json(:ids))}
|
|
91
92
|
end
|
|
92
93
|
|
|
93
94
|
def invoke_decode handler, ids
|
|
94
|
-
records = get_query.where(ids.map{|keys| Hash[assets[:model].primary_keys.zip(keys)]}.
|
|
95
|
+
records = get_query.where(ids.map{|keys| Hash[assets[:model].primary_keys.zip(keys)]}.reduce{|q, c| q | c}).all
|
|
95
96
|
# handler.halt_not_found(LOCS[:no_entry]) if records.empty?
|
|
96
97
|
records
|
|
97
98
|
end
|
|
@@ -101,9 +102,9 @@ module Engine2
|
|
|
101
102
|
if assoc = assets[:assoc]
|
|
102
103
|
decode = assoc[:model].type_info[assoc[:keys].first][:decode]
|
|
103
104
|
|
|
104
|
-
if decode[:search][:multiple] &&
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
if decode[:search][:multiple] && node.parent.parent.*.is_a?(ListAction)
|
|
106
|
+
node.list.*.menu(:panel_menu).option :choose, icon: :ok #, disabled: "action.selected_size() == 0"
|
|
107
|
+
node.list.*.menu(:panel_menu).option :cancel, icon: "remove"
|
|
107
108
|
end
|
|
108
109
|
end
|
|
109
110
|
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Engine2
|
|
5
|
+
class DeleteActionBase < Action
|
|
6
|
+
def invoke_delete_db handler, ids, from_assoc = nil
|
|
7
|
+
model = assets[:model]
|
|
8
|
+
model.db.transaction do
|
|
9
|
+
ids.each do |id|
|
|
10
|
+
keys = split_keys(id)
|
|
11
|
+
|
|
12
|
+
model.association_reflections.each do |name, assoc|
|
|
13
|
+
ds = case assoc[:type]
|
|
14
|
+
when :one_to_one
|
|
15
|
+
when :one_to_many
|
|
16
|
+
model.db[assoc.associated_class.table_name].where(Hash[assoc[:keys].zip(keys)])
|
|
17
|
+
when :many_to_many
|
|
18
|
+
model.db[assoc[:join_table]].where(Hash[assoc[:left_keys].zip(keys)])
|
|
19
|
+
when :many_to_one
|
|
20
|
+
nil
|
|
21
|
+
else
|
|
22
|
+
unsupported_association assoc[:type]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
if assoc[:cascade] || from_assoc == assoc.associated_class.table_name
|
|
26
|
+
ds.delete
|
|
27
|
+
else
|
|
28
|
+
raise Sequel::DestroyFailed.new("#{LOCS[:delete_restricted]}: #{name}") unless ds.empty?
|
|
29
|
+
end if ds
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
rec = model.call(Hash[model.primary_keys.zip(keys)])
|
|
33
|
+
rec.destroy(transaction: false)
|
|
34
|
+
# model.where(model.primary_keys_hash(keys)).delete # model.dataset[model.primary_key => id].delete
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
rescue Sequel::NoExistingObject
|
|
39
|
+
handler.halt_not_found LOCS[:no_entry]
|
|
40
|
+
rescue Sequel::DestroyFailed => failure
|
|
41
|
+
handler.halt_forbidden failure.error.to_s
|
|
42
|
+
{}
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
class DeleteAction < DeleteActionBase
|
|
47
|
+
include ActionDeleteSupport
|
|
48
|
+
|
|
49
|
+
def invoke handler
|
|
50
|
+
handler.permit id = handler.params[:id]
|
|
51
|
+
invoke_delete_db(handler, [id])
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class BulkDeleteAction < DeleteActionBase
|
|
56
|
+
include ActionBulkDeleteSupport
|
|
57
|
+
|
|
58
|
+
def invoke handler
|
|
59
|
+
ids = handler.param_to_json(:ids)
|
|
60
|
+
handler.permit ids.is_a?(Array)
|
|
61
|
+
invoke_delete_db(handler, ids)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Engine2
|
|
5
|
+
class FormAction < Action
|
|
6
|
+
include ActionQuerySupport
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class CreateAction < FormAction
|
|
10
|
+
include ActionCreateSupport
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class ModifyAction < FormAction
|
|
14
|
+
include ActionModifySupport
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -1,61 +1,43 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
module Engine2
|
|
4
|
-
SCHEMES::define_scheme :
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
loc! logged_on: LOCS[:logged_on]
|
|
11
|
-
menu :menu do
|
|
12
|
-
properties group_class: "btn-group-sm"
|
|
13
|
-
option :inspect_modal, icon: :wrench, button_loc: false # , show: "action.logged_on"
|
|
14
|
-
|
|
15
|
-
option :logout_form, icon: :"log-out" # , show: "action.logged_on"
|
|
16
|
-
option :login_form, icon: :"log-in", disabled: 'action.action_pending()' # , show: "!action.logged_on"
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
@meta_type = :infra
|
|
20
|
-
|
|
21
|
-
define_invoke do |handler|
|
|
22
|
-
user = handler.user
|
|
23
|
-
{user: user ? user.to_hash : nil}
|
|
24
|
-
end
|
|
25
|
-
end
|
|
5
|
+
SCHEMES::define_scheme :login! do |user_info_model = UserInfo|
|
|
6
|
+
define_node :login_form, LoginFormAction, model: user_info_model do
|
|
7
|
+
access!{|h|!h.logged_in?}
|
|
8
|
+
define_node :login, LoginAction
|
|
9
|
+
end
|
|
10
|
+
end
|
|
26
11
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
12
|
+
SCHEMES::define_scheme :logout! do
|
|
13
|
+
define_node :logout_form, LogoutFormAction do
|
|
14
|
+
access! &:logged_in?
|
|
15
|
+
define_node :logout, LogoutAction
|
|
16
|
+
end
|
|
17
|
+
end
|
|
31
18
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
19
|
+
SCHEMES::define_scheme :infra! do |user_info_model = UserInfo|
|
|
20
|
+
run_scheme :login!, user_info_model
|
|
21
|
+
define_node :infra!, InfraAction do
|
|
22
|
+
run_scheme :login!, user_info_model
|
|
23
|
+
run_scheme :logout!
|
|
36
24
|
|
|
37
|
-
|
|
25
|
+
define_node :inspect_modal, InspectModalAction do
|
|
38
26
|
access! &:logged_in?
|
|
39
|
-
|
|
40
|
-
self.* do
|
|
41
|
-
extend MetaPanelSupport, MetaMenuSupport
|
|
42
|
-
modal_action
|
|
43
|
-
panel_template 'infra/inspect'
|
|
44
|
-
panel_title "#{:wrench.icon} Inspect"
|
|
45
|
-
panel_class "modal-huge"
|
|
46
|
-
panel[:backdrop] = true
|
|
47
|
-
menu(:panel_menu).option :cancel, icon: "remove"
|
|
48
|
-
end
|
|
49
|
-
define_action :inspect do
|
|
27
|
+
define_node :inspect, WebSocketAction.inherit do
|
|
50
28
|
self.* do
|
|
51
|
-
@
|
|
29
|
+
@action_type = :inspect
|
|
30
|
+
|
|
31
|
+
ws_message do |msg, ws|
|
|
32
|
+
ws.send! number: msg[:number].to_i + 1
|
|
33
|
+
end
|
|
52
34
|
end
|
|
53
35
|
|
|
54
|
-
|
|
36
|
+
define_invoke :models do |handler|
|
|
55
37
|
{models: Sequel::DATABASES.map{|db| {name: db.uri, models: db.models.keys} }}
|
|
56
38
|
end
|
|
57
39
|
|
|
58
|
-
|
|
40
|
+
define_invoke :model_info do |handler|
|
|
59
41
|
db_name = handler.params[:db]
|
|
60
42
|
handler.permit db = Sequel::DATABASES.find{|d|d.uri == db_name || (d.uri && d.uri.start_with?(db_name))}
|
|
61
43
|
handler.permit model = db.models[handler.params[:model].to_sym]
|
|
@@ -71,18 +53,22 @@ module Engine2
|
|
|
71
53
|
}
|
|
72
54
|
}
|
|
73
55
|
end
|
|
56
|
+
|
|
57
|
+
define_invoke :environment do |handler|
|
|
58
|
+
{environment: handler.env}
|
|
59
|
+
end
|
|
74
60
|
end
|
|
75
61
|
end
|
|
76
62
|
end
|
|
77
63
|
end
|
|
78
64
|
|
|
79
65
|
SCHEMES::define_scheme :menu! do
|
|
80
|
-
|
|
66
|
+
define_node :menu!, MenuAction do
|
|
81
67
|
end
|
|
82
68
|
end
|
|
83
69
|
|
|
84
|
-
class
|
|
85
|
-
|
|
70
|
+
class FileStoreAction < Action
|
|
71
|
+
action_type :file_store
|
|
86
72
|
|
|
87
73
|
attr_accessor :model, :field
|
|
88
74
|
|
|
@@ -93,7 +79,7 @@ module Engine2
|
|
|
93
79
|
end
|
|
94
80
|
|
|
95
81
|
|
|
96
|
-
module
|
|
82
|
+
module BlobSupportAction
|
|
97
83
|
def serve_blob handler, entry, inf
|
|
98
84
|
handler.permit entry
|
|
99
85
|
handler.attachment entry[inf[:name_field]]
|
|
@@ -102,8 +88,8 @@ module Engine2
|
|
|
102
88
|
end
|
|
103
89
|
end
|
|
104
90
|
|
|
105
|
-
class
|
|
106
|
-
|
|
91
|
+
class DownloadFileStoreAction < Action
|
|
92
|
+
action_type :download
|
|
107
93
|
|
|
108
94
|
def invoke handler
|
|
109
95
|
handler.permit id = handler.params[:id]
|
|
@@ -111,28 +97,28 @@ module Engine2
|
|
|
111
97
|
handler.permit entry
|
|
112
98
|
handler.attachment entry[:name]
|
|
113
99
|
handler.content_type (entry[:mime].to_s.empty? ? "application/octet-stream" : entry[:mime])
|
|
114
|
-
info =
|
|
100
|
+
info = node.parent.*.model.type_info[node.parent.*.field]
|
|
115
101
|
open("#{info[:store][:files]}/#{entry[:name]}_#{id}", 'rb'){|f|f.read}
|
|
116
102
|
end
|
|
117
103
|
end
|
|
118
104
|
|
|
119
|
-
class
|
|
105
|
+
class UploadFileStoreAction < Action
|
|
120
106
|
http_method :post
|
|
121
|
-
|
|
107
|
+
action_type :upload
|
|
122
108
|
|
|
123
109
|
def invoke handler
|
|
124
110
|
file = handler.params[:file]
|
|
125
111
|
temp = file[:tempfile]
|
|
126
112
|
temp.close
|
|
127
113
|
rackname = File.basename(temp.path)
|
|
128
|
-
info =
|
|
114
|
+
info = node.parent.*.model.type_info[node.parent.*.field]
|
|
129
115
|
File.rename(temp.path, "#{info[:store][:upload]}/#{rackname}")
|
|
130
116
|
{rackname: rackname}
|
|
131
117
|
end
|
|
132
118
|
end
|
|
133
119
|
|
|
134
|
-
class
|
|
135
|
-
|
|
120
|
+
class BlobStoreAction < Action
|
|
121
|
+
action_type :blob_store
|
|
136
122
|
|
|
137
123
|
attr_accessor :model, :field
|
|
138
124
|
|
|
@@ -145,13 +131,13 @@ module Engine2
|
|
|
145
131
|
end
|
|
146
132
|
end
|
|
147
133
|
|
|
148
|
-
class
|
|
149
|
-
include
|
|
150
|
-
|
|
134
|
+
class DownloadBlobStoreAction < Action
|
|
135
|
+
include BlobSupportAction
|
|
136
|
+
action_type :download_blob
|
|
151
137
|
|
|
152
138
|
def invoke handler
|
|
153
|
-
model =
|
|
154
|
-
inf = model.type_info[
|
|
139
|
+
model = node.parent.*.model
|
|
140
|
+
inf = model.type_info[node.parent.*.field]
|
|
155
141
|
handler.permit id = handler.params[:id]
|
|
156
142
|
|
|
157
143
|
entry = model.naked.select(inf[:bytes_field], inf[:name_field], inf[:mime_field]).where(model.primary_keys_hash(split_keys(id))).first
|
|
@@ -159,23 +145,23 @@ module Engine2
|
|
|
159
145
|
end
|
|
160
146
|
end
|
|
161
147
|
|
|
162
|
-
class
|
|
148
|
+
class UploadBlobStoreAction < Action
|
|
163
149
|
http_method :post
|
|
164
|
-
|
|
150
|
+
action_type :upload_blob
|
|
165
151
|
|
|
166
152
|
def invoke handler
|
|
167
153
|
file = handler.params[:file]
|
|
168
154
|
temp = file[:tempfile]
|
|
169
155
|
temp.close
|
|
170
156
|
rackname = File.basename(temp.path)
|
|
171
|
-
info =
|
|
157
|
+
info = node.parent.*.model.type_info[node.parent.*.field]
|
|
172
158
|
File.rename(temp.path, "#{info[:store][:upload]}/#{rackname}")
|
|
173
159
|
{rackname: rackname}
|
|
174
160
|
end
|
|
175
161
|
end
|
|
176
162
|
|
|
177
|
-
class
|
|
178
|
-
|
|
163
|
+
class ForeignBlobStoreAction < Action
|
|
164
|
+
action_type :blob_store
|
|
179
165
|
|
|
180
166
|
attr_accessor :model, :field
|
|
181
167
|
|
|
@@ -195,13 +181,13 @@ module Engine2
|
|
|
195
181
|
end
|
|
196
182
|
end
|
|
197
183
|
|
|
198
|
-
class
|
|
199
|
-
include
|
|
200
|
-
|
|
184
|
+
class DownloadForeignBlobStoreAction < Action
|
|
185
|
+
include BlobSupportAction
|
|
186
|
+
action_type :download_blob
|
|
201
187
|
|
|
202
188
|
def invoke handler
|
|
203
|
-
model =
|
|
204
|
-
inf = model.type_info[
|
|
189
|
+
model = node.parent.*.model
|
|
190
|
+
inf = model.type_info[node.parent.*.field]
|
|
205
191
|
assoc = model.association_reflections[inf[:assoc_name]]
|
|
206
192
|
blob_model = assoc.associated_class
|
|
207
193
|
handler.permit id = handler.params[:id]
|
|
@@ -213,9 +199,9 @@ module Engine2
|
|
|
213
199
|
end
|
|
214
200
|
end
|
|
215
201
|
|
|
216
|
-
# class
|
|
202
|
+
# class UploadForeignBlobStoreAction < Action
|
|
217
203
|
# http_method :post
|
|
218
|
-
#
|
|
204
|
+
# action_type :upload_blob
|
|
219
205
|
|
|
220
206
|
# def invoke handler
|
|
221
207
|
# file = handler.params[:file]
|
|
@@ -227,9 +213,51 @@ module Engine2
|
|
|
227
213
|
# end
|
|
228
214
|
# end
|
|
229
215
|
|
|
230
|
-
class
|
|
231
|
-
include
|
|
232
|
-
|
|
216
|
+
class InfraAction < Action
|
|
217
|
+
include ActionPanelSupport, ActionMenuSupport, ActionAPISupport
|
|
218
|
+
action_type :infra
|
|
219
|
+
|
|
220
|
+
def pre_run
|
|
221
|
+
super
|
|
222
|
+
panel_panel_template false
|
|
223
|
+
panel_template 'infra/index'
|
|
224
|
+
loc! logged_on: LOCS[:logged_on]
|
|
225
|
+
menu :menu do
|
|
226
|
+
properties group_class: "btn-group-sm"
|
|
227
|
+
option :inspect_modal, icon: :wrench, button_loc: false # , show: "action.logged_on"
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def invoke handler
|
|
232
|
+
user = handler.user
|
|
233
|
+
{user: user ? user.to_hash : nil}
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def login_meta show_login_otion = 'false', &blk
|
|
237
|
+
node.login_form.* &blk
|
|
238
|
+
menu(:menu).modify_option :login_form, show: show_login_otion
|
|
239
|
+
node.parent.login_form.* &blk
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
class InspectModalAction < Action
|
|
244
|
+
include ActionPanelSupport, ActionMenuSupport
|
|
245
|
+
action_type :inline
|
|
246
|
+
|
|
247
|
+
def pre_run
|
|
248
|
+
super
|
|
249
|
+
modal_action
|
|
250
|
+
panel_template 'infra/inspect'
|
|
251
|
+
panel_title "#{:wrench.icon} Inspect"
|
|
252
|
+
panel_class "modal-huge"
|
|
253
|
+
panel[:backdrop] = true
|
|
254
|
+
menu(:panel_menu).option :cancel, icon: "remove"
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
class LoginFormAction < Action
|
|
259
|
+
include ActionFormSupport
|
|
260
|
+
action_type :login_form
|
|
233
261
|
|
|
234
262
|
def pre_run
|
|
235
263
|
super
|
|
@@ -238,6 +266,10 @@ module Engine2
|
|
|
238
266
|
info! :name, loc: LOCS[:user_name]
|
|
239
267
|
menu(:panel_menu).modify_option :approve, name: :login, icon: :"log-in"
|
|
240
268
|
@meta[:fields] = [:name, :password]
|
|
269
|
+
parent_action = node.parent.*
|
|
270
|
+
if parent_action.is_a? ActionMenuSupport
|
|
271
|
+
parent_action.menu(:menu).option :login_form, icon: :"log-in", disabled: "action.action_pending()"
|
|
272
|
+
end
|
|
241
273
|
end
|
|
242
274
|
|
|
243
275
|
def invoke handler
|
|
@@ -245,9 +277,9 @@ module Engine2
|
|
|
245
277
|
end
|
|
246
278
|
end
|
|
247
279
|
|
|
248
|
-
class
|
|
249
|
-
include
|
|
250
|
-
|
|
280
|
+
class LoginAction < Action
|
|
281
|
+
include ActionApproveSupport
|
|
282
|
+
action_type :login
|
|
251
283
|
|
|
252
284
|
def validate_record handler, record
|
|
253
285
|
super
|
|
@@ -263,15 +295,16 @@ module Engine2
|
|
|
263
295
|
end
|
|
264
296
|
end
|
|
265
297
|
|
|
266
|
-
class
|
|
267
|
-
include
|
|
268
|
-
|
|
298
|
+
class LogoutFormAction < Action
|
|
299
|
+
include ActionPanelSupport, ActionMenuSupport
|
|
300
|
+
action_type :logout_form
|
|
269
301
|
def pre_run
|
|
270
302
|
super
|
|
271
303
|
panel_template 'scaffold/message'
|
|
272
304
|
panel_title LOCS[:logout_title]
|
|
273
305
|
panel_class 'modal-default'
|
|
274
306
|
@meta[:message] = LOCS[:logout_message]
|
|
307
|
+
node.parent.*.menu(:menu).option :logout_form, icon: :"log-out" # , show: "action.logged_on"
|
|
275
308
|
menu :panel_menu do
|
|
276
309
|
option :logout, icon: "ok", loc: LOCS[:ok]
|
|
277
310
|
option :cancel, icon: "remove"
|
|
@@ -279,8 +312,8 @@ module Engine2
|
|
|
279
312
|
end
|
|
280
313
|
end
|
|
281
314
|
|
|
282
|
-
class
|
|
283
|
-
|
|
315
|
+
class LogoutAction < Action
|
|
316
|
+
action_type :logout
|
|
284
317
|
|
|
285
318
|
def invoke handler
|
|
286
319
|
handler.session.clear
|