engine2 1.0.8 → 1.0.9
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/Rakefile +3 -3
- data/app/actions.coffee +87 -50
- data/app/app.css +2 -1
- data/app/engine2.coffee +37 -19
- data/app/modal.coffee +8 -3
- data/bower.json +3 -2
- data/conf/message.yaml +3 -0
- data/conf/message_pl.yaml +5 -2
- data/config.coffee +16 -15
- data/engine2.gemspec +1 -1
- data/lib/engine2/action.rb +51 -23
- data/lib/engine2/action/array.rb +94 -1
- data/lib/engine2/action/decode.rb +29 -3
- data/lib/engine2/action/delete.rb +1 -2
- data/lib/engine2/action/infra.rb +5 -4
- data/lib/engine2/action/list.rb +70 -25
- data/lib/engine2/action/save.rb +0 -2
- data/lib/engine2/action_node.rb +2 -4
- data/lib/engine2/core.rb +30 -21
- data/lib/engine2/handler.rb +5 -5
- data/lib/engine2/model.rb +18 -9
- data/lib/engine2/models/Files.rb +2 -0
- data/lib/engine2/scheme.rb +1 -6
- data/lib/engine2/templates.rb +32 -6
- data/lib/engine2/type_info.rb +9 -5
- data/lib/engine2/version.rb +1 -1
- data/package.json +9 -8
- data/views/fields/checkbox_button.slim +6 -0
- data/views/fields/checkbox_buttons.slim +1 -1
- data/views/fields/list_mbuttons.slim +9 -0
- data/views/fields/list_mbuttons_opt.slim +11 -0
- data/views/fields/list_mselect.slim +12 -0
- data/views/fields/scaffold.slim +1 -1
- data/views/fields/typeahead_picker.slim +8 -5
- data/views/infra/inspect.slim +19 -16
- data/views/scaffold/fields.slim +3 -1
- data/views/scaffold/search.slim +2 -2
- data/views/scaffold/search_collapse.slim +2 -2
- data/views/scaffold/search_tabs.slim +2 -2
- data/views/search_fields/date.slim +20 -0
- data/views/search_fields/list_mbuttons.slim +12 -0
- data/views/search_fields/typeahead_picker.slim +4 -3
- metadata +11 -5
data/app/modal.coffee
CHANGED
@@ -97,11 +97,16 @@ angular.module('Engine2')
|
|
97
97
|
modal.show()
|
98
98
|
modal
|
99
99
|
|
100
|
-
|
101
|
-
body = if html then msg else "<div class='alert alert
|
102
|
-
clazz = if html then "modal-huge" else
|
100
|
+
show_modal: (title, msg, options = {html: false, alert_class: 'alert-danger', modal_class: 'modal-large'}) ->
|
101
|
+
body = if options.html then msg else "<div class='alert alert-#{options.alert_class}'>#{msg}</div>"
|
102
|
+
clazz = if options.html then "modal-huge" else options.modal_class
|
103
103
|
@show meta: panel: (panel_template: "close_m", template_string: body, title: title, class: clazz, footer: true) # message: msg,
|
104
104
|
|
105
|
+
|
106
|
+
info: (title, msg, options = {alert_class: 'info', modal_class: 'modal-large'}) -> @show_modal(title, msg, options)
|
107
|
+
warning: (title, msg, options = {alert_class: 'warning', modal_class: 'modal-large'}) -> @show_modal(title, msg, options)
|
108
|
+
error: (title, msg, options = {alert_class: 'danger', modal_class: 'modal-huge'}) -> @show_modal(title, msg, options)
|
109
|
+
|
105
110
|
confirm: (title, msg, action) ->
|
106
111
|
body = "<div class='alert alert-warning'>#{msg}</div>"
|
107
112
|
clazz = "modal-large"
|
data/bower.json
CHANGED
@@ -2,9 +2,10 @@
|
|
2
2
|
"name": "engine2",
|
3
3
|
"version": "1.0.0",
|
4
4
|
"dependencies": {
|
5
|
-
"angular-strap": "^2.3.
|
5
|
+
"angular-strap": "^2.3.12",
|
6
6
|
"angular": "^1.5.8",
|
7
|
-
"angular-websocket": "^2.0.0"
|
7
|
+
"angular-websocket": "^2.0.0",
|
8
|
+
"angular-toastr": "^2.1.1"
|
8
9
|
},
|
9
10
|
"overrides": {
|
10
11
|
"angular": {
|
data/conf/message.yaml
CHANGED
@@ -10,11 +10,14 @@
|
|
10
10
|
:decode_selected: selected
|
11
11
|
:list_select_selected: Selected
|
12
12
|
|
13
|
+
:E2Files: Files
|
14
|
+
:files: File
|
13
15
|
:name: Name
|
14
16
|
:mime: Mime
|
15
17
|
:owner: Owner
|
16
18
|
:model: Model
|
17
19
|
:field: Field
|
20
|
+
:uploaded: Uploaded
|
18
21
|
:updated: Updated
|
19
22
|
|
20
23
|
:ok: Ok
|
data/conf/message_pl.yaml
CHANGED
@@ -10,11 +10,14 @@
|
|
10
10
|
:decode_selected: wybranych
|
11
11
|
:list_select_selected: Wybranych
|
12
12
|
|
13
|
+
:E2Files: Pliki
|
14
|
+
:files: Plik
|
13
15
|
:name: Nazwa
|
14
16
|
:mime: Mime
|
15
17
|
:owner: Właściciel
|
16
18
|
:model: Model
|
17
19
|
:field: Pole
|
20
|
+
:uploaded: Wysłany
|
18
21
|
:updated: Aktualizowany
|
19
22
|
|
20
23
|
:ok: Ok
|
@@ -31,12 +34,12 @@
|
|
31
34
|
:select_toggle: Zaznacz
|
32
35
|
:confirm_delete: Usuń
|
33
36
|
:confirm_delete_title: <span class='glyphicon glyphicon-trash'></span> Potwierdzenie
|
34
|
-
:confirm_bulk_delete: Usuń
|
37
|
+
:confirm_bulk_delete: Usuń zaznaczone
|
35
38
|
:delete_restricted: Blokujące relacje
|
36
39
|
:confirm_bulk_delete_title: <span class='glyphicon glyphicon-trash'></span> Potwierdzenie
|
37
40
|
:confirm_unlink: Odłącz
|
38
41
|
:confirm_unlink_title: <span class='glyphicon glyphicon-minus'></span> Potwierdzenie
|
39
|
-
:confirm_bulk_unlink: Odłącz
|
42
|
+
:confirm_bulk_unlink: Odłącz zaznaczone
|
40
43
|
:confirm_bulk_unlink_title: <span class='glyphicon glyphicon-minus'></span> Potwierdzenie
|
41
44
|
:debug_info: Debug info
|
42
45
|
:show_meta: Metainfo
|
data/config.coffee
CHANGED
@@ -24,8 +24,8 @@ exports.config =
|
|
24
24
|
files:
|
25
25
|
javascripts:
|
26
26
|
joinTo:
|
27
|
-
'engine2vendor.js': /^node_modules|bower_components/
|
28
|
-
'engine2.js': /^app/
|
27
|
+
'assets/engine2vendor.js': /^node_modules|bower_components/
|
28
|
+
'assets/engine2.js': /^app/
|
29
29
|
order:
|
30
30
|
before: [
|
31
31
|
"app/engine2.coffee"
|
@@ -33,35 +33,36 @@ exports.config =
|
|
33
33
|
|
34
34
|
stylesheets:
|
35
35
|
joinTo:
|
36
|
-
'engine2vendor.css': /^node_modules/
|
37
|
-
'
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
36
|
+
'assets/engine2vendor.css': /^(?:node_modules||bower_components)\/(?!(bootstrap\/))/
|
37
|
+
'assets/bootstrap.css': /^node_modules\/(bootstrap\/)/
|
38
|
+
'assets/engine2.css': /^app/
|
39
|
+
# order:
|
40
|
+
# before: [
|
41
|
+
# /bootstrap\.css$/
|
42
|
+
# ]
|
42
43
|
|
43
44
|
plugins:
|
44
45
|
on: ["ng-annotate-brunch"]
|
45
46
|
|
46
47
|
uglify:
|
47
|
-
mangle:
|
48
|
+
mangle: true
|
48
49
|
compress:
|
49
50
|
global_defs:
|
50
51
|
DEBUG: false
|
51
52
|
|
52
53
|
replacement:
|
53
54
|
replacements: [
|
54
|
-
files: [/vendor
|
55
|
+
files: [/vendor\.js$/]
|
55
56
|
match: (
|
56
57
|
fix = "$modal.$element = compileData.link(modalScope, function(clonedElement, scope) {});"
|
57
58
|
find: fix.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1")
|
58
59
|
replace: "#{fix}$modal.$backdrop = backdropElement;"
|
59
|
-
),
|
60
|
-
files: [/vendor\.css$/]
|
61
|
-
match: (
|
62
|
-
find: "../fonts"
|
63
|
-
replace: "fonts"
|
64
60
|
)
|
61
|
+
# files: [/\.css$/]
|
62
|
+
# match: (
|
63
|
+
# find: "../fonts"
|
64
|
+
# replace: "fonts"
|
65
|
+
# )
|
65
66
|
]
|
66
67
|
|
67
68
|
copycat:
|
data/engine2.gemspec
CHANGED
data/lib/engine2/action.rb
CHANGED
@@ -69,7 +69,7 @@ module Engine2
|
|
69
69
|
action = self.class.new(node, assets, self)
|
70
70
|
result = action.instance_exec(handler, *action.request_action_proc_params(handler), &rmp)
|
71
71
|
action.post_process
|
72
|
-
response = @requestable ? (result
|
72
|
+
response = @requestable ? (result.is_a?(Hash) ? result : {}) : action.invoke(handler)
|
73
73
|
response[:meta] = action.meta
|
74
74
|
response
|
75
75
|
else
|
@@ -82,7 +82,7 @@ module Engine2
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def arguments args
|
85
|
-
@meta[:arguments]
|
85
|
+
(@meta[:arguments] ||= {}).merge! args
|
86
86
|
end
|
87
87
|
|
88
88
|
def execute command
|
@@ -235,7 +235,8 @@ module Engine2
|
|
235
235
|
class RootAction < Action
|
236
236
|
def initialize *args
|
237
237
|
super
|
238
|
-
@meta.merge! environment: Handler::environment, application: Engine2::SETTINGS[:name],
|
238
|
+
@meta.merge! environment: Handler::environment, application: Engine2::SETTINGS[:name], uuid: SecureRandom.uuid,
|
239
|
+
key_separator: Engine2::SETTINGS[:key_separator], ws_methods: ActionWebSocketSupport::WS_METHODS
|
239
240
|
end
|
240
241
|
end
|
241
242
|
|
@@ -459,7 +460,7 @@ module Engine2
|
|
459
460
|
|
460
461
|
module ActionAngularSupport
|
461
462
|
def ng_execute expr
|
462
|
-
(@meta[:execute] ||=
|
463
|
+
(@meta[:execute] ||= String.new) << expr + ";"
|
463
464
|
end
|
464
465
|
|
465
466
|
def ng_record! name, value
|
@@ -586,13 +587,12 @@ module Engine2
|
|
586
587
|
end
|
587
588
|
|
588
589
|
module ActionOnChangeSupport
|
589
|
-
def on_change field, &blk
|
590
|
+
def on_change field, trigger_on_start = false, &blk
|
590
591
|
node_name = :"#{field}_on_change"
|
591
|
-
nd = node.define_node node_name, (blk.arity
|
592
|
+
nd = node.define_node node_name, (blk.arity <= 2 ? OnChangeGetAction : OnChangePostAction)
|
592
593
|
nd.*{request &blk}
|
593
594
|
|
594
|
-
fields! field, remote_onchange: node_name
|
595
|
-
fields! field, remote_onchange_record: :true if blk.arity > 2
|
595
|
+
fields! field, remote_onchange: {action: node_name, record: blk.arity > 2, trigger_on_start: trigger_on_start}
|
596
596
|
end
|
597
597
|
|
598
598
|
class OnChangeAction < Action
|
@@ -608,9 +608,9 @@ module Engine2
|
|
608
608
|
end
|
609
609
|
end
|
610
610
|
|
611
|
-
def invoke handler
|
612
|
-
|
613
|
-
end
|
611
|
+
# def invoke handler
|
612
|
+
# {}
|
613
|
+
# end
|
614
614
|
end
|
615
615
|
|
616
616
|
class OnChangeGetAction < OnChangeAction
|
@@ -635,17 +635,17 @@ module Engine2
|
|
635
635
|
|
636
636
|
module ActionListSupport
|
637
637
|
include ActionModelSupport, ActionAPISupport, ActionTabSupport, ActionPanelSupport, ActionMenuSupport, ActionOnChangeSupport, ActionDraggableSupport
|
638
|
-
attr_reader :filters, :orders
|
638
|
+
attr_reader :filters, :orders, :default_order_field
|
639
639
|
|
640
640
|
def pre_run
|
641
641
|
super
|
642
642
|
config.merge!(per_page: 10, use_count: false, selectable: true) # search_active: false,
|
643
643
|
|
644
644
|
panel_template 'scaffold/list'
|
645
|
-
panel_title "#{:
|
645
|
+
panel_title "#{assets[:model].model_icon.icon} #{LOCS[assets[:model].model_route]}"
|
646
646
|
loc! LOCS[:list_locs]
|
647
647
|
menu :menu do
|
648
|
-
properties break: 2, group_class: "btn-group-
|
648
|
+
properties break: 2, group_class: "btn-group-sm"
|
649
649
|
option :search_toggle, icon: "search", show: "action.meta.search_field_list", active: "action.ui_state.search_active", button_loc: false
|
650
650
|
# divider
|
651
651
|
option :refresh, icon: "refresh", button_loc: false
|
@@ -657,7 +657,7 @@ module Engine2
|
|
657
657
|
end
|
658
658
|
|
659
659
|
menu :item_menu do
|
660
|
-
properties break: 1, group_class: "btn-group-
|
660
|
+
properties break: 1, group_class: "btn-group-sm"
|
661
661
|
end
|
662
662
|
|
663
663
|
@meta[:state] = [:query, :ui_state]
|
@@ -676,6 +676,8 @@ module Engine2
|
|
676
676
|
end
|
677
677
|
|
678
678
|
def post_run
|
679
|
+
super
|
680
|
+
|
679
681
|
unless panel[:class]
|
680
682
|
panel_class case @meta[:field_list].size
|
681
683
|
when 1..3; ''
|
@@ -684,7 +686,6 @@ module Engine2
|
|
684
686
|
end
|
685
687
|
end
|
686
688
|
|
687
|
-
super
|
688
689
|
@meta[:primary_fields] = assets[:model].primary_keys
|
689
690
|
end
|
690
691
|
|
@@ -744,8 +745,15 @@ module Engine2
|
|
744
745
|
fields! *flds, sort: true
|
745
746
|
end
|
746
747
|
|
748
|
+
def default_order order
|
749
|
+
@default_order_field = order
|
750
|
+
end
|
751
|
+
|
747
752
|
def search_live *flds
|
748
|
-
|
753
|
+
if flds.empty?
|
754
|
+
flds = @meta[:search_field_list]
|
755
|
+
@meta[:disable_search_button] = true
|
756
|
+
end
|
749
757
|
fields! *flds, search_live: true
|
750
758
|
end
|
751
759
|
|
@@ -770,8 +778,12 @@ module Engine2
|
|
770
778
|
end
|
771
779
|
|
772
780
|
def filter_case_insensitive name
|
773
|
-
|
774
|
-
|
781
|
+
model = assets[:model]
|
782
|
+
raise E2Error.new("Field '#{name}' needs to be a string") unless model.find_type_info(name)[:otype] == :string
|
783
|
+
filter name do |handler, query, hash|
|
784
|
+
value = hash[name]
|
785
|
+
value ? query.where(model.table_name.q(name).ilike("%#{value}%")) : query
|
786
|
+
end
|
775
787
|
end
|
776
788
|
|
777
789
|
def order name, &blk
|
@@ -817,7 +829,10 @@ module Engine2
|
|
817
829
|
model = assets[:model]
|
818
830
|
handler.permit json_rec.is_a?(Hash)
|
819
831
|
val_fields = (dynamic? ? static.validate_fields : @validate_fields) || model.type_info.keys
|
820
|
-
|
832
|
+
left_fields = (json_rec.keys - val_fields)
|
833
|
+
|
834
|
+
puts "Left: #{left_fields.inspect}" unless left_fields.empty?
|
835
|
+
handler.permit left_fields.empty?
|
821
836
|
|
822
837
|
record = model.call(json_rec)
|
823
838
|
record.validate_fields = val_fields
|
@@ -1025,6 +1040,14 @@ module Engine2
|
|
1025
1040
|
def hr_after field, message = '-'
|
1026
1041
|
fields! field, hr: message
|
1027
1042
|
end
|
1043
|
+
|
1044
|
+
def create?
|
1045
|
+
@action_type == :create
|
1046
|
+
end
|
1047
|
+
|
1048
|
+
def modify?
|
1049
|
+
@action_type == :modify
|
1050
|
+
end
|
1028
1051
|
end
|
1029
1052
|
|
1030
1053
|
module ActionCreateSupport
|
@@ -1037,7 +1060,7 @@ module Engine2
|
|
1037
1060
|
def pre_run
|
1038
1061
|
super
|
1039
1062
|
panel_title "#{LOCS[:create_title]} - #{LOCS[assets[:model].table_name]}"
|
1040
|
-
node.parent.*.menu(:menu).option_at 0, node.name, icon: "plus-sign", button_loc: false if node.parent.*.is_a?(
|
1063
|
+
node.parent.*.menu(:menu).option_at 0, node.name, icon: "plus-sign", button_loc: false if node.parent.*.is_a?(ActionListSupport)
|
1041
1064
|
|
1042
1065
|
hide_pk unless assets[:model].natural_key
|
1043
1066
|
end
|
@@ -1305,6 +1328,10 @@ module Engine2
|
|
1305
1328
|
action.fields(field)[:render] ||= {}
|
1306
1329
|
action.fields(field)[:render].merge! format: info[:format], model_format: info[:model_format] # Model::DEFAULT_DATE_FORMAT
|
1307
1330
|
},
|
1331
|
+
datetime: lambda{|action, field, info|
|
1332
|
+
action.fields(field)[:render] ||= {}
|
1333
|
+
action.fields(field)[:render].merge! format: info[:date_format], model_format: info[:date_model_format] # Model::DEFAULT_DATE_FORMAT
|
1334
|
+
},
|
1308
1335
|
decimal_date: lambda{|action, field, info|
|
1309
1336
|
SearchRendererPostProcessors[:date].(action, field, info)
|
1310
1337
|
}
|
@@ -1330,11 +1357,11 @@ module Engine2
|
|
1330
1357
|
email: lambda{|action, info| Templates.email(info[:length])},
|
1331
1358
|
password: lambda{|action, info| Templates.password(info[:length])},
|
1332
1359
|
# date_range: lambda{|action, info| Templates.date_range},
|
1333
|
-
boolean: lambda{|action, info| Templates.
|
1360
|
+
boolean: lambda{|action, info| Templates.checkbox_button},
|
1334
1361
|
currency: lambda{|action, info| Templates.currency},
|
1335
1362
|
list_select: lambda{|action, info|
|
1336
1363
|
length = info[:values].length
|
1337
|
-
max_length = info[:values].map(&:last).max_by(&:length).length
|
1364
|
+
max_length = length > 0 ? info[:values].map(&:last).max_by(&:length).length : 0
|
1338
1365
|
if info[:multiselect]
|
1339
1366
|
Templates.list_bsmselect(max_length)
|
1340
1367
|
elsif length <= 3
|
@@ -1360,6 +1387,7 @@ module Engine2
|
|
1360
1387
|
|
1361
1388
|
(DefaultSearchRenderers ||= {}).merge!(
|
1362
1389
|
date: lambda{|action, info| SearchTemplates.date_range},
|
1390
|
+
datetime: lambda{|action, info| SearchTemplates.date_range},
|
1363
1391
|
decimal_date: lambda{|action, info| SearchTemplates.date_range},
|
1364
1392
|
integer: lambda{|action, info| SearchTemplates.integer_range},
|
1365
1393
|
string: lambda{|action, info| SearchTemplates.input_text},
|
data/lib/engine2/action/array.rb
CHANGED
@@ -93,4 +93,97 @@ module Engine2
|
|
93
93
|
entries
|
94
94
|
end
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
|
+
class ArrayViewAction < Action
|
98
|
+
include ActionViewSupport
|
99
|
+
|
100
|
+
def find_record handler, id
|
101
|
+
node.parent.*.data_source(handler)[id.to_i]
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class ArrayFormAction < Action
|
106
|
+
end
|
107
|
+
|
108
|
+
class ArrayCreateAction < ArrayFormAction
|
109
|
+
include ActionCreateSupport
|
110
|
+
end
|
111
|
+
|
112
|
+
class ArrayModifyAction < ArrayFormAction
|
113
|
+
include ActionModifySupport
|
114
|
+
|
115
|
+
def find_record handler, id
|
116
|
+
node.parent.*.data_source(handler)[id.to_i]
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
class ArrayDeleteAction < Action
|
121
|
+
include ActionDeleteSupport
|
122
|
+
|
123
|
+
def invoke handler
|
124
|
+
handler.permit id = handler.params[:id]
|
125
|
+
node.parent.parent.*.data_source(handler).delete_at(id.to_i)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
class ArraySaveAction < Action
|
130
|
+
include ActionApproveSupport
|
131
|
+
end
|
132
|
+
|
133
|
+
class ArrayInsertAction < ArraySaveAction
|
134
|
+
include ActionInsertSupport
|
135
|
+
action_type :approve
|
136
|
+
|
137
|
+
def after_approve handler, record
|
138
|
+
# handler.permit id = record[:id]
|
139
|
+
# ds = node.parent.parent.*.data_source(handler)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
class ArrayUpdateAction < ArraySaveAction
|
144
|
+
include ActionUpdateSupport
|
145
|
+
action_type :approve
|
146
|
+
|
147
|
+
def after_approve handler, record
|
148
|
+
handler.permit id = record[:id]
|
149
|
+
node.parent.parent.*.data_source(handler)[id].merge!(record.values)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
class Schemes
|
154
|
+
ARRAY_CRUD ||= {array_create: true, array_view: true, array_modify: true, array_delete: true}.freeze
|
155
|
+
ARRAY_VIEW ||= {array_view: true}
|
156
|
+
end
|
157
|
+
|
158
|
+
SCHEMES.instance_eval do
|
159
|
+
define_scheme :array_view do |name = :view|
|
160
|
+
define_node name, ArrayViewAction
|
161
|
+
end
|
162
|
+
|
163
|
+
define_scheme :array_modify do |name = :modify|
|
164
|
+
define_node name, ArrayModifyAction do
|
165
|
+
define_node :approve, ArrayUpdateAction
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
define_scheme :array_create do |name = :create|
|
170
|
+
define_node name, ArrayCreateAction do
|
171
|
+
define_node :approve, ArrayInsertAction
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
define_scheme :array_delete do
|
176
|
+
run_scheme :confirm, :delete, ArrayDeleteAction,
|
177
|
+
message: LOCS[:delete_question], title: LOCS[:confirm_delete_title]
|
178
|
+
end
|
179
|
+
|
180
|
+
define_scheme :array do |name, model, options|
|
181
|
+
options ||= Schemes::ARRAY_CRUD
|
182
|
+
define_node name, ArrayListAction, model: model do
|
183
|
+
options.each{|k, v| run_scheme(k) if v}
|
184
|
+
|
185
|
+
define_node_bundle :form, :create, :modify if options[:array_create] && options[:array_modify]
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|