engine2 1.0.3 → 1.0.4

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 (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"