engine2 1.0.2 → 1.0.3

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/conf/message.yaml +7 -0
  3. data/conf/message_pl.yaml +7 -0
  4. data/engine2.gemspec +1 -1
  5. data/lib/engine2/action.rb +0 -5
  6. data/lib/engine2/core.rb +9 -8
  7. data/lib/engine2/handler.rb +2 -2
  8. data/lib/engine2/meta.rb +196 -33
  9. data/lib/engine2/meta/decode_meta.rb +2 -1
  10. data/lib/engine2/meta/form_meta.rb +3 -132
  11. data/lib/engine2/meta/infra_meta.rb +14 -9
  12. data/lib/engine2/meta/list_meta.rb +1 -4
  13. data/lib/engine2/meta/view_meta.rb +0 -14
  14. data/lib/engine2/models/UserInfo.rb +0 -4
  15. data/lib/engine2/scheme.rb +5 -5
  16. data/lib/engine2/type_info.rb +0 -1
  17. data/lib/engine2/version.rb +1 -1
  18. data/public/assets/javascripts.js +13 -13
  19. data/public/js/angular-animate.js +52 -20
  20. data/public/js/angular-cookies.js +2 -2
  21. data/public/js/angular-route.js +10 -7
  22. data/public/js/angular-sanitize.js +4 -4
  23. data/public/js/angular.js +322 -168
  24. data/public/js/lodash.custom.min.js +95 -93
  25. data/views/engine2.coffee +34 -29
  26. data/views/engine2actions.coffee +62 -60
  27. data/views/infra/index.slim +2 -2
  28. data/views/infra/inspect.slim +5 -1
  29. data/views/scaffold/confirm.slim +1 -1
  30. data/views/scaffold/list.slim +11 -23
  31. data/views/scaffold/message.slim +1 -1
  32. data/views/scaffold/search.slim +1 -2
  33. data/views/scaffold/view.slim +1 -1
  34. data/views/search_fields/checkbox2.slim +1 -1
  35. data/views/search_fields/checkbox_buttons.slim +3 -3
  36. data/views/search_fields/date_range.slim +4 -4
  37. data/views/search_fields/decimal_date_range.slim +4 -4
  38. data/views/search_fields/input_text.slim +2 -2
  39. data/views/search_fields/integer.slim +2 -2
  40. data/views/search_fields/integer_range.slim +2 -2
  41. data/views/search_fields/list_bsmselect.slim +2 -2
  42. data/views/search_fields/list_bsselect.slim +2 -2
  43. data/views/search_fields/list_buttons.slim +2 -2
  44. data/views/search_fields/list_select.slim +2 -2
  45. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5a2ad0107737d0e5096b9a72b31743f01b8107ba
4
- data.tar.gz: 6557952f0c927307bb297d71afc2cbb8086d3318
3
+ metadata.gz: c81c9b9a3857540db437d0bc5ad18bab4e420a28
4
+ data.tar.gz: 543048567b1754a90c6c286c6860181882aecd46
5
5
  SHA512:
6
- metadata.gz: 247de7a7bd6535a169b713cd08d1c9034d4e9de87301530986d9eae7b4ef98b4ceb9bff5610daf7ee66cc168c7f110dd585dd7db5691e07112f372c3345792d4
7
- data.tar.gz: b41f9ea4e158dd174b4f71566f93d4fcc0f5bff6270f3885cc5f13e52b9e7fae0ba2f696273611453222bec33aed9f34556cd5a63c46f3a3f3dc8787e4ea7917
6
+ metadata.gz: fc5faef135f2d9e1115016345988b2eb562e2aa2cec1fc106286fc79d70c43a73da84f580aa37583816af3b2d40e28104341cb0f0fcb9491232e1841bc01088d
7
+ data.tar.gz: f6d800d24a201d967d91af602fd46918e73263f9fbd1572c525b80eada313b53967e19f010311e8be87666d06bc6485f721ff4502ef0f04b98540e5f6a1a250c
data/conf/message.yaml CHANGED
@@ -92,3 +92,10 @@
92
92
  :access_unauthorized: Access unauthorized
93
93
  :access_not_found: Not found
94
94
  :access_method_not_allowed: Metod not allowed
95
+
96
+ :list_locs:
97
+ :search: Search
98
+ :page: Page
99
+ :selected: Selected
100
+
101
+ :logged_on: Logged on
data/conf/message_pl.yaml CHANGED
@@ -92,3 +92,10 @@
92
92
  :access_unauthorized: Dostęp nieautoryzowany
93
93
  :access_not_found: Nie znaleziono
94
94
  :access_method_not_allowed: Metoda niedozwolona
95
+
96
+ :list_locs:
97
+ :search: Szukaj
98
+ :page: Strona
99
+ :selected: Wybranych
100
+
101
+ :logged_on: Zalogowany
data/engine2.gemspec CHANGED
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.add_dependency 'coffee-script', '~> 2.4'
29
29
 
30
30
  spec.add_development_dependency "bundler", "~> 1.11"
31
- spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "rake", "~> 11.1"
32
32
  spec.add_development_dependency 'uglifier', '~> 3.0'
33
33
  spec.add_development_dependency 'yui-compressor', '~> 0.12'
34
34
  end
@@ -71,11 +71,6 @@ module Engine2
71
71
  end
72
72
  end
73
73
 
74
- def undefine_action name
75
- ::Kernel.raise E2Error.new("No action #{name} defined") unless @actions[name]
76
- @actions.delete(name)
77
- end
78
-
79
74
  def define_action_bundle name, *actions
80
75
  define_singleton_method!(name) do |&blk|
81
76
  if blk
data/lib/engine2/core.rb CHANGED
@@ -120,7 +120,7 @@ class Symbol
120
120
  end
121
121
 
122
122
  class << Sequel
123
- attr_accessor :alias_tables_in_joins
123
+ attr_accessor :alias_columns_in_joins
124
124
 
125
125
  def split_keys id
126
126
  id.split('|')
@@ -147,7 +147,7 @@ end
147
147
  Sequel.quote_identifiers = false
148
148
  Sequel.extension :core_extensions
149
149
  Sequel::Inflections.clear
150
- Sequel.alias_tables_in_joins = true
150
+ Sequel.alias_columns_in_joins = true
151
151
  # Sequel::Model.plugin :json_serializer, :naked => true
152
152
  # Sequel::Model.plugin :timestamps
153
153
  # Sequel::Model.plugin :validation_class_methods
@@ -364,7 +364,7 @@ module E2Model
364
364
  # nil
365
365
  else
366
366
  if table != model_table_name
367
- if Sequel.alias_tables_in_joins
367
+ if Sequel.alias_columns_in_joins
368
368
  name.qualify(table).as(:"#{table}__#{name}")
369
369
  else
370
370
  name.qualify(table)
@@ -435,7 +435,7 @@ module Engine2
435
435
  PATH ||= File.expand_path('../..', File.dirname(__FILE__))
436
436
 
437
437
  class << self
438
- attr_reader :app, :reloading
438
+ attr_reader :app, :app_name, :reloading
439
439
  attr_reader :core_loaded
440
440
 
441
441
  def database name
@@ -457,8 +457,8 @@ module Engine2
457
457
 
458
458
  def bootstrap_e2db
459
459
  e2_db_file = (defined? JRUBY_VERSION) ? "jdbc:sqlite:#{@app}/engine2.db" : "sqlite://#{@app}/engine2.db"
460
- Engine2.const_set :E2DB, connect(e2_db_file, loggers: [Logger.new($stdout)], convert_types: false, name: :engine2)
461
- Engine2.const_set :DUMMYDB, Sequel::Database.new(uri: 'dummy')
460
+ const_set :E2DB, connect(e2_db_file, loggers: [Logger.new($stdout)], convert_types: false, name: :engine2)
461
+ const_set :DUMMYDB, Sequel::Database.new(uri: 'dummy')
462
462
  def DUMMYDB.synchronize *args;end
463
463
  end
464
464
 
@@ -482,8 +482,8 @@ module Engine2
482
482
  puts "MODELS: #{Sequel::DATABASES.reduce(0){|s, d|s + d.models.size}}, Time: #{Time.now - t}"
483
483
  Sequel::DATABASES.each &:dump_schema_cache_to_file
484
484
 
485
- Engine2.send(:remove_const, :ROOT) if defined? ROOT
486
- Engine2.const_set(:ROOT, Action.new(nil, :api, DummyMeta, {}))
485
+ send(:remove_const, :ROOT) if defined? ROOT
486
+ const_set(:ROOT, Action.new(nil, :api, RootMeta, {}))
487
487
 
488
488
  @boot_blk.(ROOT)
489
489
  ROOT.setup_action_tree
@@ -492,6 +492,7 @@ module Engine2
492
492
 
493
493
  def bootstrap app, opts = {}
494
494
  @app = app
495
+ @app_name = opts[:name] || File::basename(app)
495
496
  @reloading = opts[:reloading]
496
497
  bootstrap_e2db
497
498
 
@@ -30,7 +30,7 @@ module Engine2
30
30
  end
31
31
 
32
32
  def permit access
33
- halt_forbidden 'Permission denied' unless access
33
+ settings.development? ? raise(E2Error.new("Permission denied")) : halt_forbidden('Permission denied') unless access
34
34
  end
35
35
 
36
36
  def initial?
@@ -113,7 +113,7 @@ module Engine2
113
113
  get '/*' do |name|
114
114
  headers 'Cache-Control' => 'no-cache, no-store, must-revalidate', 'Pragma' => 'no-cache', 'Expires' => '0'
115
115
  if name.empty?
116
- if settings.environment == :development
116
+ if settings.development?
117
117
  load('engine2.rb') if Engine2::reloading
118
118
  Engine2::reload
119
119
  end
data/lib/engine2/meta.rb CHANGED
@@ -26,10 +26,6 @@ module Engine2
26
26
  @static = static
27
27
  end
28
28
 
29
- # def self.method_added name
30
- # puts "ADDED #{name}"
31
- # end
32
-
33
29
  def http_method
34
30
  @http_method # || (raise E2Error.new("No http method for meta #{self.class}"))
35
31
  end
@@ -47,22 +43,14 @@ module Engine2
47
43
  meta = self.class.new(action, assets, self)
48
44
  meta.instance_exec(handler, *meta.request_meta_proc_params(handler), &rmp)
49
45
  meta.post_process
50
-
51
- {response: meta.invoke(handler), meta: meta.get}
46
+ response = meta.invoke(handler)
47
+ response[:meta] = meta.get
48
+ response
52
49
  else
53
- response = invoke(handler)
54
- if response.is_a?(Hash)
55
- {response: response}
56
- else
57
- response
58
- end
50
+ invoke(handler)
59
51
  end
60
52
  end
61
53
 
62
- def response args
63
- (@meta[:response] ||= {}).merge!(args)
64
- end
65
-
66
54
  def get
67
55
  @meta
68
56
  end
@@ -142,6 +130,14 @@ module Engine2
142
130
  meta_type :dummy
143
131
  end
144
132
 
133
+ class RootMeta < Meta
134
+ def initialize *args
135
+ super
136
+ @meta[:environment] = Handler::environment
137
+ @meta[:application] = Engine2::app_name
138
+ end
139
+ end
140
+
145
141
  module MetaAPISupport
146
142
  def reload_routes!
147
143
  @meta[:reload_routes] = true
@@ -158,16 +154,12 @@ module Engine2
158
154
  def info! *fields, options
159
155
  raise E2Error.new("No fields given to info") if fields.empty?
160
156
  fields.each do |field|
161
- if options
162
- (info[field] ||= {}).merge! options # rmerge ?
163
- else
164
- info[field] = false
165
- end
157
+ (info[field] ||= {}).merge! options # rmerge ?
166
158
  end
167
159
  end
168
160
 
169
161
  def loc! hash
170
- hash.each{|k, v| info! k, loc: v}
162
+ (@meta[:loc] ||= {}).merge! hash
171
163
  end
172
164
 
173
165
  def decorate list
@@ -202,6 +194,10 @@ module Engine2
202
194
  @menus[menu_name]
203
195
  end
204
196
 
197
+ def menu? menu_name
198
+ @menus && @menus[menu_name]
199
+ end
200
+
205
201
  def post_process
206
202
  super
207
203
  if @menus && !@menus.empty?
@@ -356,6 +352,10 @@ module Engine2
356
352
  end
357
353
  end
358
354
 
355
+ def find_record handler, id
356
+ get_query[assets[:model].primary_keys_hash_qualified(split_keys(id))]
357
+ end
358
+
359
359
  def select *args, &blk
360
360
  assets[:model].select(*args, &blk).ensure_primary_key.setup! (@meta[:fields] = [])
361
361
  end
@@ -424,7 +424,7 @@ module Engine2
424
424
  panel_panel_template 'menu_m' unless panel[:panel_template] == false
425
425
  # modal_action false if panel[:panel_template] == false
426
426
  panel_class '' unless panel[:class]
427
- footer true unless panel[:footer] == false
427
+ panel_footer true if panel[:footer] != false && menu?(:panel_menu)
428
428
  end
429
429
  end
430
430
 
@@ -452,7 +452,7 @@ module Engine2
452
452
  panel[:title] = tle
453
453
  end
454
454
 
455
- def footer ftr
455
+ def panel_footer ftr
456
456
  panel[:footer] = ftr
457
457
  end
458
458
  end
@@ -470,6 +470,10 @@ module Engine2
470
470
  include MetaPanelSupport, MetaMenuSupport
471
471
  meta_type :confirm
472
472
 
473
+ def message msg
474
+ @meta[:message] = msg
475
+ end
476
+
473
477
  def pre_run
474
478
  super
475
479
  panel_template 'scaffold/message'
@@ -477,7 +481,7 @@ module Engine2
477
481
  panel_class 'modal-default'
478
482
 
479
483
  menu :panel_menu do
480
- option :approve, icon: "ok", loc: LOCS[:ok], disabled: 'action.action_pending'
484
+ option :approve, icon: "ok", loc: LOCS[:ok], disabled: 'action.action_pending()'
481
485
  option :cancel, icon: "remove"
482
486
  end
483
487
  end
@@ -544,15 +548,14 @@ module Engine2
544
548
  super
545
549
  config.merge!(per_page: 10, use_count: false, show_item_menu: true, selectable: true) # search_active: false,
546
550
 
547
- # modal_action self.class != ListMeta
548
551
  panel_template 'scaffold/list'
549
552
  panel_panel_template 'panels/menu_m' unless action.parent.*.assets[:model]
550
553
  search_template 'scaffold/search'
551
554
  panel_title "#{:list.icon} #{LOCS[assets[:model].name.to_sym]}"
552
- menu(:panel_menu).option :cancel, icon: "remove"
555
+ loc! LOCS[:list_locs]
553
556
  menu :menu do
554
557
  properties break: 2, group_class: "btn-group-xs"
555
- option :search_toggle, icon: "search", show: "action.meta.search_fields", class: "action.ui_state.search_active && 'active'", button_loc: false
558
+ option :search_toggle, icon: "search", show: "action.meta.search_fields", active: "action.ui_state.search_active", button_loc: false
556
559
  # divider
557
560
  option :refresh, icon: "refresh", button_loc: false
558
561
  option :default_order, icon: "signal", button_loc: false
@@ -572,7 +575,7 @@ module Engine2
572
575
  def select_toggle_menu
573
576
  m = menu :menu
574
577
  unless m.option_index(:select_toggle, false)
575
- m.option_after :default_order, :select_toggle, icon: "check", enabled: "action.meta.config.selectable", button_loc: false
578
+ m.option_after :default_order, :select_toggle, icon: "check", enabled: "action.meta.config.selectable", active: "action.selection", button_loc: false
576
579
  end
577
580
  end
578
581
 
@@ -725,7 +728,7 @@ module Engine2
725
728
  def invoke handler
726
729
  json = handler.post_to_json
727
730
  record = allocate_record(handler, json)
728
- validate_and_approve(handler, record, json) ? static.record(handler, record) : {record: record.to_hash, errors: record.errors}
731
+ validate_and_approve(handler, record, json) ? static.record(handler, record) : {record!: record.to_hash, errors!: record.errors}
729
732
  end
730
733
 
731
734
  def validate name, &blk
@@ -747,6 +750,154 @@ module Engine2
747
750
  end
748
751
  end
749
752
 
753
+ module MetaFormSupport
754
+ include MetaModelSupport, MetaAPISupport, MetaTabSupport, MetaPanelSupport, MetaMenuSupport, MetaAngularSupport, MetaOnChangeSupport
755
+
756
+ def field_template template
757
+ panel[:field_template] = template
758
+ end
759
+
760
+ def pre_run
761
+ super
762
+ panel_template 'scaffold/form'
763
+ field_template 'scaffold/fields'
764
+ panel_class 'modal-large'
765
+
766
+ menu :panel_menu do
767
+ option :approve, icon: "ok", disabled: 'action.action_pending()' # text: true,
768
+ option :cancel, icon: "remove" # text: true,
769
+ end
770
+ # modal_action false
771
+ end
772
+
773
+ def record handler, record
774
+ end
775
+
776
+ def post_process
777
+ if fields = @meta[:fields]
778
+ fields = fields - static.get[:fields] if dynamic?
779
+
780
+ decorate(fields)
781
+
782
+ fields.each do |name|
783
+ # type_info = model.type_info.fetch(name)
784
+ type_info = get_type_info(name)
785
+
786
+ info[name][:render] ||= begin
787
+ renderer = DefaultFormRenderers[type_info[:type]] # .merge(default: true)
788
+ raise E2Error.new("No form renderer found for field '#{type_info[:name]}' of type '#{type_info[:type]}'") unless renderer
789
+ renderer.(self, type_info)
790
+ end
791
+
792
+ proc = FormRendererPostProcessors[type_info[:type]]
793
+ proc.(self, name, type_info) if proc
794
+ end
795
+
796
+ assoc = assets[:assoc]
797
+ if assoc && assoc[:type] == :one_to_many
798
+ # fields.select{|f| assoc[:keys].include? f}.each do |key|
799
+ # # hide_fields(key) if self[:info, key, :hidden] == nil
800
+ # info! key, disabled: true
801
+ # end
802
+ assoc[:keys].each do |key|
803
+ info! key, disabled: true if fields.include? key
804
+ end
805
+ end
806
+ end
807
+
808
+ super
809
+ end
810
+
811
+ def post_run
812
+ super
813
+ @meta[:primary_fields] = assets[:model].primary_keys
814
+ end
815
+
816
+ def template
817
+ Templates
818
+ end
819
+
820
+ def hr_after field, message = '-'
821
+ info! field, hr: message
822
+ end
823
+ end
824
+
825
+ module MetaCreateSupport
826
+ include MetaFormSupport
827
+
828
+ def self.included meta
829
+ meta.meta_type :create
830
+ end
831
+
832
+ def pre_run
833
+ super
834
+ panel_title LOCS[:create_title]
835
+ action.parent.*.menu(:menu).option_at 0, action.name, icon: "plus-sign", button_loc: false
836
+
837
+ hide_pk unless assets[:model].natural_key
838
+ end
839
+
840
+ def record handler, record
841
+ create_record(handler, record)
842
+ end
843
+
844
+ def create_record handler, record
845
+ end
846
+
847
+ def invoke handler
848
+ record = {}
849
+ if assoc = assets[:assoc]
850
+ case assoc[:type]
851
+ when :one_to_many
852
+ handler.permit parent = handler.params[:parent_id]
853
+ assoc[:keys].zip(split_keys(parent)).each{|key, val| record[key] = val}
854
+ end
855
+ end
856
+ static.record(handler, record)
857
+ {record: record, new: true}
858
+ end
859
+ end
860
+
861
+ module MetaModifySupport
862
+ include MetaFormSupport
863
+
864
+ def self.included meta
865
+ meta.meta_type :modify
866
+ end
867
+
868
+ def pre_run
869
+ super
870
+ panel_title LOCS[:modify_title]
871
+ action.parent.*.menu(:item_menu).option action.name, icon: "pencil", button_loc: false
872
+ end
873
+
874
+ def record handler, record
875
+ modify_record(handler, record)
876
+ end
877
+
878
+ def modify_record handler, record
879
+ end
880
+
881
+ def invoke handler
882
+ handler.permit id = handler.params[:id]
883
+ record = find_record(handler, id)
884
+
885
+ if record
886
+ static.record(handler, record)
887
+ {record: record}
888
+ else
889
+ handler.halt_not_found LOCS[:no_entry]
890
+ end
891
+ end
892
+
893
+ def post_run
894
+ super
895
+ assets[:model].primary_keys.each do |key| # pre_run ?
896
+ info! key, disabled: true
897
+ end
898
+ end
899
+ end
900
+
750
901
  module MetaViewSupport
751
902
  include MetaModelSupport, MetaAPISupport, MetaTabSupport, MetaPanelSupport, MetaMenuSupport
752
903
 
@@ -763,6 +914,20 @@ module Engine2
763
914
  action.parent.*.menu(:item_menu).option action.name, icon: "file", button_loc: false
764
915
  end
765
916
 
917
+ def record handler, record
918
+ end
919
+
920
+ def invoke handler
921
+ handler.permit id = handler.params[:id]
922
+ record = find_record(handler, id)
923
+ if record
924
+ static.record(handler, record)
925
+ {record: record}
926
+ else
927
+ handler.halt_not_found LOCS[:no_entry]
928
+ end
929
+ end
930
+
766
931
  def post_process
767
932
  if fields = @meta[:fields]
768
933
  fields = fields - static.get[:fields] if dynamic?
@@ -850,7 +1015,6 @@ module Engine2
850
1015
  field_info[:assoc] = :"#{info[:assoc_name]}!"
851
1016
  field_info[:fields] = info[:keys]
852
1017
  field_info[:type] = info[:otype]
853
- # field_info[:table_loc] = LOCS[info[:assoc_name]]
854
1018
 
855
1019
  (info[:keys] - [field]).each do |of|
856
1020
  f_info = meta.info.fetch(of)
@@ -919,7 +1083,6 @@ module Engine2
919
1083
  field_info[:assoc] = :"#{info[:assoc_name]}!"
920
1084
  field_info[:fields] = keys
921
1085
  field_info[:type] = info[:otype]
922
- # field_info[:table_loc] = LOCS[info[:assoc_name]]
923
1086
 
924
1087
  (keys - [field]).each do |of|
925
1088
  f_info = meta.info[of]
@@ -972,7 +1135,7 @@ module Engine2
972
1135
  end
973
1136
  },
974
1137
  star_to_many_field: lambda{|meta, info| Templates.scaffold},
975
- many_to_one: lambda{|meta, info| # Templates.scaffold_picker
1138
+ many_to_one: lambda{|meta, info|
976
1139
  tmpl_type = info[:decode][:form]
977
1140
  case
978
1141
  when tmpl_type[:scaffold]; Templates.scaffold_picker