engine2 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +3 -117
- data/{views → app}/app.coffee +0 -0
- data/{public/css → app}/app.css +203 -196
- data/{views → app}/engine2.coffee +111 -60
- data/{views → app}/engine2actions.coffee +47 -28
- data/bower.json +13 -0
- data/conf/message.yaml +2 -1
- data/conf/message_pl.yaml +2 -1
- data/config.coffee +62 -0
- data/engine2.gemspec +2 -5
- data/lib/engine2.rb +1 -1
- data/lib/engine2/action.rb +9 -24
- data/lib/engine2/core.rb +9 -8
- data/lib/engine2/handler.rb +1 -5
- data/lib/engine2/meta.rb +61 -24
- data/lib/engine2/meta/array_meta.rb +82 -0
- data/lib/engine2/meta/decode_meta.rb +1 -1
- data/lib/engine2/meta/infra_meta.rb +21 -26
- data/lib/engine2/meta/list_meta.rb +2 -3
- data/lib/engine2/model.rb +5 -5
- data/lib/engine2/pre_bootstrap.rb +9 -1
- data/lib/engine2/scheme.rb +4 -0
- data/lib/engine2/type_info.rb +8 -1
- data/lib/engine2/version.rb +1 -1
- data/package.json +38 -0
- data/public/img/ajax-loader.gif +0 -0
- data/views/fields/blob.slim +4 -5
- data/views/fields/bs_select.slim +2 -2
- data/views/fields/bsselect_picker.slim +1 -2
- data/views/fields/bsselect_picker_opt.slim +1 -2
- data/views/fields/checkbox.slim +1 -1
- data/views/fields/checkbox_buttons.slim +1 -1
- data/views/fields/checkbox_buttons_opt.slim +1 -1
- data/views/fields/currency.slim +2 -2
- data/views/fields/date.slim +0 -1
- data/views/fields/date_range.slim +0 -1
- data/views/fields/date_time.slim +0 -1
- data/views/fields/datetime.slim +0 -2
- data/views/fields/decimal.slim +0 -1
- data/views/fields/decimal_date.slim +0 -1
- data/views/fields/decimal_time.slim +0 -1
- data/views/fields/email.slim +1 -2
- data/views/fields/file_store.slim +1 -1
- data/views/fields/input_text.slim +1 -2
- data/views/fields/integer.slim +1 -1
- data/views/fields/list_bsselect.slim +1 -2
- data/views/fields/list_bsselect_opt.slim +2 -3
- data/views/fields/list_buttons.slim +1 -1
- data/views/fields/list_buttons_opt.slim +1 -1
- data/views/fields/list_select.slim +1 -2
- data/views/fields/list_select_opt.slim +2 -3
- data/views/fields/password.slim +1 -2
- data/views/fields/radio_checkbox.slim +1 -1
- data/views/fields/scaffold.slim +1 -1
- data/views/fields/scaffold_picker.slim +1 -2
- data/views/fields/select_picker.slim +1 -2
- data/views/fields/select_picker_opt.slim +1 -2
- data/views/fields/text_area.slim +0 -1
- data/views/fields/time.slim +0 -1
- data/views/fields/typeahead_picker.slim +1 -2
- data/views/index.slim +4 -8
- data/views/scaffold/fields.slim +4 -4
- data/views/scaffold/form.slim +1 -7
- data/views/scaffold/form_collapse.slim +19 -0
- data/views/scaffold/form_tabs.slim +9 -0
- data/views/scaffold/list.slim +1 -12
- data/views/scaffold/search.slim +2 -9
- data/views/scaffold/search_collapse.slim +26 -0
- data/views/scaffold/search_tabs.slim +15 -0
- data/views/scaffold/view.slim +5 -15
- data/views/scaffold/view_collapse.slim +22 -0
- data/views/scaffold/view_tabs.slim +11 -0
- data/views/search_fields/bsmselect_picker.slim +1 -2
- data/views/search_fields/bsselect_picker.slim +1 -2
- data/views/search_fields/checkbox.slim +3 -3
- data/views/search_fields/checkbox2.slim +5 -5
- data/views/search_fields/checkbox_buttons.slim +2 -2
- data/views/search_fields/date_range.slim +0 -2
- data/views/search_fields/decimal_date_range.slim +5 -5
- data/views/search_fields/input_text.slim +2 -2
- data/views/search_fields/integer.slim +1 -1
- data/views/search_fields/integer_range.slim +2 -2
- data/views/search_fields/list_bsmselect.slim +1 -1
- data/views/search_fields/list_bsselect.slim +0 -1
- data/views/search_fields/list_buttons.slim +2 -2
- data/views/search_fields/list_select.slim +1 -2
- data/views/search_fields/scaffold_picker.slim +1 -2
- data/views/search_fields/select_picker.slim +1 -2
- data/views/search_fields/typeahead_picker.slim +1 -2
- metadata +29 -103
- data/public/assets/javascripts.js +0 -13
- data/public/assets/styles.css +0 -4
- data/public/css/angular-motion.css +0 -1022
- data/public/css/angular-ui-tree.min.css +0 -1
- data/public/css/bootstrap-additions.css +0 -1560
- data/public/css/bootstrap.min.css +0 -11
- data/public/css/font-awesome.min.css +0 -4
- data/public/fonts/FontAwesome.otf +0 -0
- data/public/fonts/fontawesome-webfont.eot +0 -0
- data/public/fonts/fontawesome-webfont.svg +0 -655
- data/public/fonts/fontawesome-webfont.ttf +0 -0
- data/public/fonts/fontawesome-webfont.woff +0 -0
- data/public/fonts/fontawesome-webfont.woff2 +0 -0
- data/public/fonts/glyphicons-halflings-regular.eot +0 -0
- data/public/fonts/glyphicons-halflings-regular.svg +0 -288
- data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/public/fonts/glyphicons-halflings-regular.woff +0 -0
- data/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
- data/public/images/file.png +0 -0
- data/public/images/folder-closed.png +0 -0
- data/public/images/folder.png +0 -0
- data/public/images/node-closed-2.png +0 -0
- data/public/images/node-closed-light.png +0 -0
- data/public/images/node-closed.png +0 -0
- data/public/images/node-opened-2.png +0 -0
- data/public/images/node-opened-light.png +0 -0
- data/public/images/node-opened.png +0 -0
- data/public/img/ajax-loader-light.gif +0 -0
- data/public/js/angular-animate.js +0 -4147
- data/public/js/angular-cookies.js +0 -322
- data/public/js/angular-local-storage.js +0 -455
- data/public/js/angular-route.js +0 -1025
- data/public/js/angular-sanitize.js +0 -717
- data/public/js/angular-strap.js +0 -4339
- data/public/js/angular-strap.tpl.js +0 -43
- data/public/js/angular-ui-tree.js +0 -1569
- data/public/js/angular.js +0 -30868
- data/public/js/i18n/angular-locale_pl.js +0 -115
- data/public/js/lodash.custom.min.js +0 -99
- data/public/js/ng-file-upload-shim.min.js +0 -2
- data/public/js/ng-file-upload.min.js +0 -3
- 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
|
@@ -18,7 +18,7 @@ module Engine2
|
|
18
18
|
|
19
19
|
@meta_type = :infra
|
20
20
|
|
21
|
-
|
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
|
-
|
56
|
-
|
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
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
{
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
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
|
-
|
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 =
|
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 =
|
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
|
data/lib/engine2/model.rb
CHANGED
@@ -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] = {
|
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 =
|
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 =
|
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 =
|
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 =
|
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
|
-
|
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
|
data/lib/engine2/scheme.rb
CHANGED
data/lib/engine2/type_info.rb
CHANGED
@@ -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
|
data/lib/engine2/version.rb
CHANGED
data/package.json
ADDED
@@ -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
|
+
}
|
data/public/img/ajax-loader.gif
CHANGED
Binary file
|
data/views/fields/blob.slim
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
e2-action action="[f + '_blob_store!']"
|
2
2
|
.col-lg-11
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
]
|
3
|
+
input [
|
4
|
+
type="hidden"
|
5
|
+
ng-model="action.record[f]"
|
6
|
+
]
|
8
7
|
|
9
8
|
div
|
10
9
|
.progress.progress-striped
|
data/views/fields/bs_select.slim
CHANGED
@@ -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="
|
5
|
+
select-resource="info.render.resource"
|
6
6
|
bs-select=""
|
7
|
-
ng-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="[
|
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="[
|
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()"
|
data/views/fields/checkbox.slim
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
.col-lg-1
|
2
2
|
.checkbox
|
3
3
|
input [
|
4
|
-
ng-init="
|
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="
|
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-
|
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"
|
data/views/fields/currency.slim
CHANGED
data/views/fields/date.slim
CHANGED