engine2 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +3 -117
  3. data/{views → app}/app.coffee +0 -0
  4. data/{public/css → app}/app.css +203 -196
  5. data/{views → app}/engine2.coffee +111 -60
  6. data/{views → app}/engine2actions.coffee +47 -28
  7. data/bower.json +13 -0
  8. data/conf/message.yaml +2 -1
  9. data/conf/message_pl.yaml +2 -1
  10. data/config.coffee +62 -0
  11. data/engine2.gemspec +2 -5
  12. data/lib/engine2.rb +1 -1
  13. data/lib/engine2/action.rb +9 -24
  14. data/lib/engine2/core.rb +9 -8
  15. data/lib/engine2/handler.rb +1 -5
  16. data/lib/engine2/meta.rb +61 -24
  17. data/lib/engine2/meta/array_meta.rb +82 -0
  18. data/lib/engine2/meta/decode_meta.rb +1 -1
  19. data/lib/engine2/meta/infra_meta.rb +21 -26
  20. data/lib/engine2/meta/list_meta.rb +2 -3
  21. data/lib/engine2/model.rb +5 -5
  22. data/lib/engine2/pre_bootstrap.rb +9 -1
  23. data/lib/engine2/scheme.rb +4 -0
  24. data/lib/engine2/type_info.rb +8 -1
  25. data/lib/engine2/version.rb +1 -1
  26. data/package.json +38 -0
  27. data/public/img/ajax-loader.gif +0 -0
  28. data/views/fields/blob.slim +4 -5
  29. data/views/fields/bs_select.slim +2 -2
  30. data/views/fields/bsselect_picker.slim +1 -2
  31. data/views/fields/bsselect_picker_opt.slim +1 -2
  32. data/views/fields/checkbox.slim +1 -1
  33. data/views/fields/checkbox_buttons.slim +1 -1
  34. data/views/fields/checkbox_buttons_opt.slim +1 -1
  35. data/views/fields/currency.slim +2 -2
  36. data/views/fields/date.slim +0 -1
  37. data/views/fields/date_range.slim +0 -1
  38. data/views/fields/date_time.slim +0 -1
  39. data/views/fields/datetime.slim +0 -2
  40. data/views/fields/decimal.slim +0 -1
  41. data/views/fields/decimal_date.slim +0 -1
  42. data/views/fields/decimal_time.slim +0 -1
  43. data/views/fields/email.slim +1 -2
  44. data/views/fields/file_store.slim +1 -1
  45. data/views/fields/input_text.slim +1 -2
  46. data/views/fields/integer.slim +1 -1
  47. data/views/fields/list_bsselect.slim +1 -2
  48. data/views/fields/list_bsselect_opt.slim +2 -3
  49. data/views/fields/list_buttons.slim +1 -1
  50. data/views/fields/list_buttons_opt.slim +1 -1
  51. data/views/fields/list_select.slim +1 -2
  52. data/views/fields/list_select_opt.slim +2 -3
  53. data/views/fields/password.slim +1 -2
  54. data/views/fields/radio_checkbox.slim +1 -1
  55. data/views/fields/scaffold.slim +1 -1
  56. data/views/fields/scaffold_picker.slim +1 -2
  57. data/views/fields/select_picker.slim +1 -2
  58. data/views/fields/select_picker_opt.slim +1 -2
  59. data/views/fields/text_area.slim +0 -1
  60. data/views/fields/time.slim +0 -1
  61. data/views/fields/typeahead_picker.slim +1 -2
  62. data/views/index.slim +4 -8
  63. data/views/scaffold/fields.slim +4 -4
  64. data/views/scaffold/form.slim +1 -7
  65. data/views/scaffold/form_collapse.slim +19 -0
  66. data/views/scaffold/form_tabs.slim +9 -0
  67. data/views/scaffold/list.slim +1 -12
  68. data/views/scaffold/search.slim +2 -9
  69. data/views/scaffold/search_collapse.slim +26 -0
  70. data/views/scaffold/search_tabs.slim +15 -0
  71. data/views/scaffold/view.slim +5 -15
  72. data/views/scaffold/view_collapse.slim +22 -0
  73. data/views/scaffold/view_tabs.slim +11 -0
  74. data/views/search_fields/bsmselect_picker.slim +1 -2
  75. data/views/search_fields/bsselect_picker.slim +1 -2
  76. data/views/search_fields/checkbox.slim +3 -3
  77. data/views/search_fields/checkbox2.slim +5 -5
  78. data/views/search_fields/checkbox_buttons.slim +2 -2
  79. data/views/search_fields/date_range.slim +0 -2
  80. data/views/search_fields/decimal_date_range.slim +5 -5
  81. data/views/search_fields/input_text.slim +2 -2
  82. data/views/search_fields/integer.slim +1 -1
  83. data/views/search_fields/integer_range.slim +2 -2
  84. data/views/search_fields/list_bsmselect.slim +1 -1
  85. data/views/search_fields/list_bsselect.slim +0 -1
  86. data/views/search_fields/list_buttons.slim +2 -2
  87. data/views/search_fields/list_select.slim +1 -2
  88. data/views/search_fields/scaffold_picker.slim +1 -2
  89. data/views/search_fields/select_picker.slim +1 -2
  90. data/views/search_fields/typeahead_picker.slim +1 -2
  91. metadata +29 -103
  92. data/public/assets/javascripts.js +0 -13
  93. data/public/assets/styles.css +0 -4
  94. data/public/css/angular-motion.css +0 -1022
  95. data/public/css/angular-ui-tree.min.css +0 -1
  96. data/public/css/bootstrap-additions.css +0 -1560
  97. data/public/css/bootstrap.min.css +0 -11
  98. data/public/css/font-awesome.min.css +0 -4
  99. data/public/fonts/FontAwesome.otf +0 -0
  100. data/public/fonts/fontawesome-webfont.eot +0 -0
  101. data/public/fonts/fontawesome-webfont.svg +0 -655
  102. data/public/fonts/fontawesome-webfont.ttf +0 -0
  103. data/public/fonts/fontawesome-webfont.woff +0 -0
  104. data/public/fonts/fontawesome-webfont.woff2 +0 -0
  105. data/public/fonts/glyphicons-halflings-regular.eot +0 -0
  106. data/public/fonts/glyphicons-halflings-regular.svg +0 -288
  107. data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  108. data/public/fonts/glyphicons-halflings-regular.woff +0 -0
  109. data/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
  110. data/public/images/file.png +0 -0
  111. data/public/images/folder-closed.png +0 -0
  112. data/public/images/folder.png +0 -0
  113. data/public/images/node-closed-2.png +0 -0
  114. data/public/images/node-closed-light.png +0 -0
  115. data/public/images/node-closed.png +0 -0
  116. data/public/images/node-opened-2.png +0 -0
  117. data/public/images/node-opened-light.png +0 -0
  118. data/public/images/node-opened.png +0 -0
  119. data/public/img/ajax-loader-light.gif +0 -0
  120. data/public/js/angular-animate.js +0 -4147
  121. data/public/js/angular-cookies.js +0 -322
  122. data/public/js/angular-local-storage.js +0 -455
  123. data/public/js/angular-route.js +0 -1025
  124. data/public/js/angular-sanitize.js +0 -717
  125. data/public/js/angular-strap.js +0 -4339
  126. data/public/js/angular-strap.tpl.js +0 -43
  127. data/public/js/angular-ui-tree.js +0 -1569
  128. data/public/js/angular.js +0 -30868
  129. data/public/js/i18n/angular-locale_pl.js +0 -115
  130. data/public/js/lodash.custom.min.js +0 -99
  131. data/public/js/ng-file-upload-shim.min.js +0 -2
  132. data/public/js/ng-file-upload.min.js +0 -3
  133. data/views/engine2templates.coffee +0 -0
@@ -0,0 +1,82 @@
1
+ # coding: utf-8
2
+
3
+ module Engine2
4
+ class ArrayListMeta < Meta
5
+ meta_type :list
6
+ include MetaListSupport
7
+
8
+ (DefaultFilters ||= {}).merge!(
9
+ exact: lambda{|entries, name, value, type_info, hash|
10
+ entries.select{|e|e[name] == value}
11
+ },
12
+ string: lambda{|entries, name, value, type_info, hash|
13
+ entries.select{|e|e[name].to_s[value]}
14
+ },
15
+ boolean: lambda{|*args| DefaultFilters[:exact].(*args)},
16
+ integer: lambda{|entries, name, value, type_info, hash|
17
+ if value.is_a? Hash
18
+ from, to = value[:from], value[:to]
19
+ if from && to
20
+ entries.select{|e|e[name] >= from.to_i && e[name] <= to.to_i}
21
+ else
22
+ entries.select{|e| from ? e[name] >= from.to_i : e[name] <= to.to_i}
23
+ end
24
+ elsif value.is_a? Integer
25
+ entries.select{|e|e[name] == value.to_i}
26
+ else
27
+ nil
28
+ end
29
+ }
30
+ )
31
+
32
+ def data_source handler
33
+ []
34
+ end
35
+
36
+ def invoke handler
37
+ params = handler.params
38
+ # if params[:initial] || params[:refresh]
39
+ entries = data_source(handler)
40
+
41
+ per_page = lookup(:config, :per_page)
42
+ page = params[:page].to_i
43
+ handler.permit page >= 0 && page < 1000
44
+
45
+ if order_str = params[:order]
46
+ order = order_str.to_sym
47
+ handler.permit lookup(:info, order, :sort)
48
+ entries = entries.sort_by{|e|e[order].to_s}
49
+ entries = entries.reverse if params[:asc] == "true"
50
+ end
51
+
52
+ if search = params[:search]
53
+ entries = list_search(entries, handler, search)
54
+ end
55
+
56
+ {entries: entries.drop(page).take(per_page), count: entries.size}
57
+ end
58
+
59
+ def list_search entries, handler, search
60
+ hash = JSON.parse(search, symbolize_names: true) rescue handler.halt_forbidden
61
+ model = assets[:model]
62
+ sfields = lookup(:search_fields)
63
+ handler.permit sfields
64
+ hash.each_pair do |name, value|
65
+ handler.permit sfields.include?(name)
66
+
67
+ type_info = get_type_info(name)
68
+ entries = if filter = (@filters && @filters[name]) || (dynamic? && (static.filters && static.filters[name]))
69
+ filter.(entries, hash, handler)
70
+ elsif filter = DefaultFilters[type_info[:otype]]
71
+ filter.(entries, name, value, type_info, hash)
72
+ else
73
+ raise E2Error.new("Filter not found for field '#{name}' in model '#{model}'") unless filter
74
+ end
75
+
76
+ handler.permit entries
77
+ end
78
+
79
+ entries
80
+ end
81
+ end
82
+ end
@@ -36,7 +36,7 @@ module Engine2
36
36
  decode = assoc[:model].type_info[assoc[:keys].first][:decode]
37
37
  if decode[:search][:multiple]
38
38
  show_max_selected 3
39
- @meta[:decode_selected] = LOCS[:decode_selected]
39
+ loc! decode_selected: LOCS[:decode_selected]
40
40
  end
41
41
  end
42
42
  end
@@ -18,7 +18,7 @@ module Engine2
18
18
 
19
19
  @meta_type = :infra
20
20
 
21
- def invoke handler
21
+ define_invoke do |handler|
22
22
  user = handler.user
23
23
  {user: user ? user.to_hash : nil}
24
24
  end
@@ -41,40 +41,35 @@ module Engine2
41
41
  extend MetaPanelSupport, MetaMenuSupport
42
42
  modal_action
43
43
  panel_template 'infra/inspect'
44
- panel_title "Inspect"
44
+ panel_title "#{:wrench.icon} Inspect"
45
45
  panel_class "modal-huge"
46
+ panel[:backdrop] = true
46
47
  menu(:panel_menu).option :cancel, icon: "remove"
47
-
48
- # def invoke handler;{};end
49
48
  end
50
49
  define_action :inspect do
51
50
  self.* do
52
51
  @meta_type = :inspect
53
52
  end
54
53
 
55
- define_action :models do
56
- def (self.*).invoke handler
57
- {models: Sequel::DATABASES.map{|db| {name: db.uri, models: db.models.keys} }}
58
- end
54
+ define_action_invoke :models do |handler|
55
+ {models: Sequel::DATABASES.map{|db| {name: db.uri, models: db.models.keys} }}
59
56
  end
60
57
 
61
- define_action :model_info do
62
- def (self.*).invoke handler
63
- db_name = handler.params[:db]
64
- handler.permit db = Sequel::DATABASES.find{|d|d.uri == db_name || (d.uri && d.uri.start_with?(db_name))}
65
- handler.permit model = db.models[handler.params[:model].to_sym]
66
- {
67
- model!: {
68
- info: {
69
- name: model.to_s,
70
- table: model.table_name
71
- },
72
- assoc: model.association_reflections,
73
- schema: model.db_schema,
74
- type_info: model.type_info
75
- }
58
+ define_action_invoke :model_info do |handler|
59
+ db_name = handler.params[:db]
60
+ handler.permit db = Sequel::DATABASES.find{|d|d.uri == db_name || (d.uri && d.uri.start_with?(db_name))}
61
+ handler.permit model = db.models[handler.params[:model].to_sym]
62
+ {
63
+ model!: {
64
+ info: {
65
+ name: model.to_s,
66
+ table: model.table_name
67
+ },
68
+ assoc: model.association_reflections,
69
+ schema: model.db_schema,
70
+ type_info: model.type_info
76
71
  }
77
- end
72
+ }
78
73
  end
79
74
  end
80
75
  end
@@ -189,7 +184,7 @@ module Engine2
189
184
 
190
185
  inf = model.type_info[field]
191
186
  assoc = model.association_reflections[inf[:assoc_name]]
192
- blob_model = Object.const_get(assoc[:class_name])
187
+ blob_model = assoc.associated_class
193
188
 
194
189
  rec = model.naked.select(assoc[:key]).where(model.primary_keys_hash(split_keys(id))).first
195
190
  handler.permit rec
@@ -208,7 +203,7 @@ module Engine2
208
203
  model = action.parent.*.model
209
204
  inf = model.type_info[action.parent.*.field]
210
205
  assoc = model.association_reflections[inf[:assoc_name]]
211
- blob_model = Object.const_get(assoc[:class_name])
206
+ blob_model = assoc.associated_class
212
207
  handler.permit id = handler.params[:id]
213
208
  rec = model.naked.select(assoc[:key]).where(model.primary_keys_hash(split_keys(id))).first
214
209
  handler.permit rec
@@ -48,8 +48,7 @@ module Engine2
48
48
  if keys.length == 1
49
49
  query.where(name => value)
50
50
  else
51
- query.where(keys.map{|k| hash[k]}.transpose.map{|vals| Hash[keys.zip(vals)]}.inject{|q, c| q | c
52
- })
51
+ query.where(keys.map{|k| hash[k]}.transpose.map{|vals| Hash[keys.zip(vals)]}.inject{|q, c| q | c})
53
52
  end
54
53
  when :list_select
55
54
  query.where(name => value) # decode in sql query ?
@@ -123,7 +122,7 @@ module Engine2
123
122
  name = model.type_info[name] ? name.qualify(model.table_name) : Sequel.expr(name)
124
123
  filter.(query, name, value, type_info, hash)
125
124
  else
126
- raise E2Error.new("Filter not found for field #{name} in model #{model}") unless filter
125
+ raise E2Error.new("Filter not found for field '#{name}' in model '#{model}'") unless filter
127
126
  end
128
127
 
129
128
  handler.permit query
@@ -46,7 +46,7 @@ module Engine2
46
46
  @model.primary_keys.each{|pk| (schema[pk]||={})[:primary_key] = true} if @model.primary_key
47
47
 
48
48
  schema.each_pair do |name, db_info|
49
- @info[name] = {otype: db_info[:type]}
49
+ @info[name] = {}
50
50
 
51
51
  case db_info[:type]
52
52
  when :integer
@@ -119,7 +119,7 @@ module Engine2
119
119
 
120
120
  def verify_associations
121
121
  one_to_many_associations.each do |name, assoc|
122
- other = Object.const_get(assoc[:class_name])
122
+ other = assoc.associated_class
123
123
  other_type_info = other.type_info
124
124
  if other_keys = assoc[:keys]
125
125
  other_keys.each do |key|
@@ -307,7 +307,7 @@ module Engine2
307
307
  foreign_blob_store: lambda{|record, field, info|
308
308
  if value = record.values[field] # attachment info
309
309
  assoc = record.model.association_reflections[info[:assoc_name]]
310
- blob_model = Object.const_get(assoc[:class_name])
310
+ blob_model = assoc.associated_class
311
311
  file_fields = {info[:bytes_field] => :$data, info[:name_field] => :$name_field, info[:mime_field] => :$mime_field}
312
312
  upload = info[:store][:upload]
313
313
  file_data = {data: Sequel.blob(open("#{upload}/#{value[:rackname]}", "rb"){|f|f.read}), name_field: value[:name], mime_field: value[:mime]}
@@ -331,7 +331,7 @@ module Engine2
331
331
  value = record.values[field]
332
332
  if value && value.is_a?(Hash)
333
333
  assoc = record.model.association_reflections[info[:assoc_name]]
334
- other_model = Object.const_get(assoc[:class_name])
334
+ other_model = assoc.associated_class
335
335
  unlinked = value[:unlinked]
336
336
  linked = value[:linked]
337
337
  parent_key = record.primary_key_values
@@ -383,7 +383,7 @@ module Engine2
383
383
  assoc = record.model.association_reflections[info[:assoc_name]]
384
384
  key = record.model.naked.select(assoc[:key]).where(record.model.primary_keys_hash(record.primary_key_values)).first
385
385
  if key
386
- blob_model = Object.const_get(assoc[:class_name])
386
+ blob_model = assoc.associated_class
387
387
  blob_model.where(blob_model.primary_key => key[assoc[:key]]).delete
388
388
  end
389
389
  }
@@ -24,4 +24,12 @@ module Sequel
24
24
  end
25
25
  end
26
26
  end if defined?(JDBC::AS400)
27
- end if defined? JRUBY_VERSION
27
+
28
+ module SchemaCaching
29
+ def load_schema_cache(file)
30
+ @schemas = Marshal.load(File.read(file, mode: 'rb'))
31
+ nil
32
+ end
33
+ end
34
+
35
+ end if defined? JRUBY_VERSION
@@ -190,5 +190,9 @@ module Engine2
190
190
  end
191
191
  end
192
192
 
193
+ define_scheme :array do |name, model|
194
+ define_action name, ArrayListMeta, model: model do
195
+ end
196
+ end
193
197
  end
194
198
  end
@@ -19,6 +19,7 @@ module Engine2
19
19
 
20
20
  info.merge!({
21
21
  name: field,
22
+ otype: type,
22
23
  type: type,
23
24
  validations: {}
24
25
  })
@@ -67,6 +68,11 @@ module Engine2
67
68
  end
68
69
  end
69
70
 
71
+ def boolean_field field
72
+ define_field field, :boolean do |info|
73
+ end
74
+ end
75
+
70
76
  def date_field field, format, model_format
71
77
  define_field field, :date do |info|
72
78
  info[:format] = format
@@ -247,9 +253,10 @@ module Engine2
247
253
  end
248
254
  end
249
255
 
250
- def currency field
256
+ def currency field, symbol = LOCS[:currency_symbol]
251
257
  modify_field field do |info|
252
258
  info[:type] = :currency
259
+ info[:symbol] = symbol
253
260
  info[:validations][:currency] = true
254
261
  end
255
262
  end
@@ -1,7 +1,7 @@
1
1
  # coding: utf-8
2
2
 
3
3
  module Engine2
4
- MAJOR, MINOR, TINY = [1, 0, 3]
4
+ MAJOR, MINOR, TINY = [1, 0, 4]
5
5
  VERSION = [MAJOR, MINOR, TINY].join('.').freeze
6
6
  def self.version
7
7
  VERSION
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "engine2",
3
+ "description": "engine2",
4
+ "version": "1.0.0",
5
+ "scripts": {
6
+ "postinstall": "bower install",
7
+ "dev": "brunch w",
8
+ "build": "brunch build --production"
9
+ },
10
+ "dependencies": {
11
+ "angular": "^1.5.8",
12
+ "angular-animate": "^1.5.8",
13
+ "angular-cookies": "^1.5.8",
14
+ "angular-local-storage": "0.1.5",
15
+ "angular-motion": "^0.4.0",
16
+ "angular-route": "^1.5.8",
17
+ "angular-sanitize": "^1.5.8",
18
+ "angular-ui-tree": "2.22.1",
19
+ "bootstrap": "^3.3.0",
20
+ "bootstrap-additions": "0.3.1",
21
+ "font-awesome": "~4.7.0",
22
+ "lodash": "~4.17.0",
23
+ "ng-file-upload": "12.2.12"
24
+ },
25
+ "devDependencies": {
26
+ "auto-reload-brunch": "^2.7.1",
27
+ "bower": "~1.8.0",
28
+ "brunch": "^2.9.1",
29
+ "clean-css-brunch": "^2.0.0",
30
+ "coffee-script-brunch": "^2.1.0",
31
+ "copycat-brunch": "^1.1.0",
32
+ "css-brunch": "^2.6.1",
33
+ "javascript-brunch": "^2.0.0",
34
+ "ng-annotate-brunch": "^1.7.2",
35
+ "replacement-brunch": "^2.0.4",
36
+ "uglify-js-brunch": "^2.0.1"
37
+ }
38
+ }
Binary file
@@ -1,10 +1,9 @@
1
1
  e2-action action="[f + '_blob_store!']"
2
2
  .col-lg-11
3
- div ng-init="info = action.meta.info[f]"
4
- input [
5
- type="hidden"
6
- ng-model="action.record[f]"
7
- ]
3
+ input [
4
+ type="hidden"
5
+ ng-model="action.record[f]"
6
+ ]
8
7
 
9
8
  div
10
9
  .progress.progress-striped
@@ -2,9 +2,9 @@
2
2
  select [
3
3
  ng-model="action.record[f]"
4
4
  bs-options="v.id as v.value for v in values"
5
- select-resource="action.meta.info[f].render.resource"
5
+ select-resource="info.render.resource"
6
6
  bs-select=""
7
- ng-disabled="action.meta.info[f].disabled"
7
+ ng-disabled="info.disabled"
8
8
  class="form-control input-sm"
9
9
  e2-field=""
10
10
  ]
@@ -1,8 +1,7 @@
1
- e2-action action="[action.meta.info[f].assoc, 'list']"
1
+ e2-action action="[info.assoc, 'list']"
2
2
  .col-lg-7.col-md-8.col-sm-12
3
3
  button.btn.btn-default.btn-sm [
4
4
  type="button"
5
- ng-init="info = action.meta.info[f]"
6
5
  ng-model="action.selected"
7
6
  bs-options="v.id as v.value for v in action.values"
8
7
  ng-change="action.change()"
@@ -1,9 +1,8 @@
1
- e2-action action="[action.meta.info[f].assoc, 'list']"
1
+ e2-action action="[info.assoc, 'list']"
2
2
  .col-lg-7.col-md-12.col-sm-12
3
3
  .input-group.input-group-sm
4
4
  button.btn.btn-default.btn-sm [
5
5
  type="button"
6
- ng-init="info = action.meta.info[f]"
7
6
  ng-model="action.selected"
8
7
  bs-options="v.id as v.value for v in action.values"
9
8
  ng-change="action.change()"
@@ -1,7 +1,7 @@
1
1
  .col-lg-1
2
2
  .checkbox
3
3
  input [
4
- ng-init="info = action.meta.info[f]; action.record[f] = action.record[f] || info.render.false_value"
4
+ ng-init="action.record[f] = action.record[f] || info.render.false_value"
5
5
  type="checkbox"
6
6
  ng-model="action.record[f]"
7
7
  ng-true-value="{{::info.render.true_value}}"
@@ -1,5 +1,5 @@
1
1
  .col-lg-12
2
- .btn-group.btn-group-sm ng-init="info = action.meta.info[f]; (action.record[f] === undefined) && (action.record[f] = info.render.false_value)" ng-model="action.record[f]" e2-field=""
2
+ .btn-group.btn-group-sm ng-init="(action.record[f] === undefined) && (action.record[f] = info.render.false_value)" ng-model="action.record[f]" e2-field=""
3
3
  a.btn.btn-default ng-class="action.record[f] === info.render.true_value && 'active'" ng-click="action.record[f] = info.render.true_value" ng-disabled="info.disabled"
4
4
  span.glyphicon.glyphicon-check
5
5
  a.btn.btn-default ng-class="action.record[f] === info.render.false_value && 'active'" ng-click="action.record[f] = info.render.false_value" ng-disabled="info.disabled"
@@ -1,5 +1,5 @@
1
1
  .col-lg-12
2
- .btn-group.btn-group-sm ng-init="info = action.meta.info[f]" ng-model="action.record[f]" e2-field=""
2
+ .btn-group.btn-group-sm ng-model="action.record[f]" e2-field=""
3
3
  a.btn.btn-default ng-class="action.record[f] === info.render.true_value && 'active'" ng-click="action.record[f] = info.render.true_value" ng-disabled="info.disabled"
4
4
  span.glyphicon.glyphicon-check
5
5
  a.btn.btn-default ng-class="action.record[f] === info.render.false_value && 'active'" ng-click="action.record[f] = info.render.false_value" ng-disabled="info.disabled"
@@ -4,7 +4,7 @@
4
4
  type="text"
5
5
  ng-model="action.record[f]"
6
6
  class="form-control"
7
- ng-disabled="action.meta.info[f].disabled"
7
+ ng-disabled="info.disabled"
8
8
  e2-field=""
9
9
  ]
10
- span.input-group-addon
10
+ span.input-group-addon ng-bind="info.render.symbol"
@@ -1,7 +1,6 @@
1
1
  .col-lg-3.col-md-3.col-sm-5
2
2
  .input-group.input-group-sm
3
3
  input.btn.btn-default [
4
- ng-init="info = action.meta.info[f]"
5
4
  type="text"
6
5
  class="form-control"
7
6
  ng-model="value"
@@ -2,7 +2,6 @@
2
2
  .col-lg-3.col-md-3.col-sm-5
3
3
  .input-group.input-group-sm
4
4
  input.btn.btn-default [
5
- ng-init="info = action.meta.info[f]"
6
5
  type="text"
7
6
  class="form-control"
8
7
  ng-model="value.from"