engine2 1.0.0

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 (145) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +2 -0
  3. data/Rakefile +138 -0
  4. data/conf/message.yaml +93 -0
  5. data/conf/message_pl.yaml +93 -0
  6. data/engine2.gemspec +34 -0
  7. data/lib/engine2.rb +34 -0
  8. data/lib/engine2/action.rb +217 -0
  9. data/lib/engine2/core.rb +572 -0
  10. data/lib/engine2/handler.rb +134 -0
  11. data/lib/engine2/meta.rb +969 -0
  12. data/lib/engine2/meta/decode_meta.rb +110 -0
  13. data/lib/engine2/meta/delete_meta.rb +73 -0
  14. data/lib/engine2/meta/form_meta.rb +144 -0
  15. data/lib/engine2/meta/infra_meta.rb +292 -0
  16. data/lib/engine2/meta/link_meta.rb +133 -0
  17. data/lib/engine2/meta/list_meta.rb +284 -0
  18. data/lib/engine2/meta/save_meta.rb +63 -0
  19. data/lib/engine2/meta/view_meta.rb +22 -0
  20. data/lib/engine2/model.rb +390 -0
  21. data/lib/engine2/models/Files.rb +38 -0
  22. data/lib/engine2/models/UserInfo.rb +24 -0
  23. data/lib/engine2/post_bootstrap.rb +83 -0
  24. data/lib/engine2/pre_bootstrap.rb +27 -0
  25. data/lib/engine2/scheme.rb +202 -0
  26. data/lib/engine2/templates.rb +229 -0
  27. data/lib/engine2/type_info.rb +342 -0
  28. data/lib/engine2/version.rb +9 -0
  29. data/public/assets/javascripts.js +13 -0
  30. data/public/assets/styles.css +4 -0
  31. data/public/css/angular-motion.css +1022 -0
  32. data/public/css/angular-ui-tree.min.css +1 -0
  33. data/public/css/app.css +196 -0
  34. data/public/css/bootstrap-additions.css +1560 -0
  35. data/public/css/bootstrap.min.css +11 -0
  36. data/public/css/font-awesome.min.css +4 -0
  37. data/public/favicon.ico +0 -0
  38. data/public/fonts/FontAwesome.otf +0 -0
  39. data/public/fonts/fontawesome-webfont.eot +0 -0
  40. data/public/fonts/fontawesome-webfont.svg +655 -0
  41. data/public/fonts/fontawesome-webfont.ttf +0 -0
  42. data/public/fonts/fontawesome-webfont.woff +0 -0
  43. data/public/fonts/fontawesome-webfont.woff2 +0 -0
  44. data/public/fonts/glyphicons-halflings-regular.eot +0 -0
  45. data/public/fonts/glyphicons-halflings-regular.svg +288 -0
  46. data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  47. data/public/fonts/glyphicons-halflings-regular.woff +0 -0
  48. data/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
  49. data/public/images/file.png +0 -0
  50. data/public/images/folder-closed.png +0 -0
  51. data/public/images/folder.png +0 -0
  52. data/public/images/node-closed-2.png +0 -0
  53. data/public/images/node-closed-light.png +0 -0
  54. data/public/images/node-closed.png +0 -0
  55. data/public/images/node-opened-2.png +0 -0
  56. data/public/images/node-opened-light.png +0 -0
  57. data/public/images/node-opened.png +0 -0
  58. data/public/img/ajax-loader-dark.gif +0 -0
  59. data/public/img/ajax-loader-light.gif +0 -0
  60. data/public/img/ajax-loader.gif +0 -0
  61. data/public/js/angular-animate.js +4115 -0
  62. data/public/js/angular-cookies.js +322 -0
  63. data/public/js/angular-local-storage.js +455 -0
  64. data/public/js/angular-route.js +1022 -0
  65. data/public/js/angular-sanitize.js +717 -0
  66. data/public/js/angular-strap.js +4339 -0
  67. data/public/js/angular-strap.tpl.js +43 -0
  68. data/public/js/angular-ui-tree.js +1569 -0
  69. data/public/js/angular.js +30714 -0
  70. data/public/js/i18n/angular-locale_pl.js +115 -0
  71. data/public/js/lodash.custom.min.js +97 -0
  72. data/public/js/ng-file-upload-shim.min.js +2 -0
  73. data/public/js/ng-file-upload.min.js +3 -0
  74. data/views/app.coffee +3 -0
  75. data/views/engine2.coffee +557 -0
  76. data/views/engine2actions.coffee +849 -0
  77. data/views/engine2templates.coffee +0 -0
  78. data/views/fields/blob.slim +22 -0
  79. data/views/fields/bs_select.slim +10 -0
  80. data/views/fields/bsselect_picker.slim +18 -0
  81. data/views/fields/bsselect_picker_opt.slim +22 -0
  82. data/views/fields/checkbox.slim +11 -0
  83. data/views/fields/checkbox_buttons.slim +6 -0
  84. data/views/fields/checkbox_buttons_opt.slim +8 -0
  85. data/views/fields/currency.slim +10 -0
  86. data/views/fields/date.slim +21 -0
  87. data/views/fields/date_range.slim +44 -0
  88. data/views/fields/date_time.slim +42 -0
  89. data/views/fields/datetime.slim +42 -0
  90. data/views/fields/decimal.slim +11 -0
  91. data/views/fields/decimal_date.slim +22 -0
  92. data/views/fields/decimal_time.slim +26 -0
  93. data/views/fields/email.slim +13 -0
  94. data/views/fields/file_store.slim +61 -0
  95. data/views/fields/input_text.slim +14 -0
  96. data/views/fields/integer.slim +11 -0
  97. data/views/fields/list_bsselect.slim +18 -0
  98. data/views/fields/list_bsselect_opt.slim +21 -0
  99. data/views/fields/list_buttons.slim +3 -0
  100. data/views/fields/list_buttons_opt.slim +5 -0
  101. data/views/fields/list_select.slim +11 -0
  102. data/views/fields/list_select_opt.slim +15 -0
  103. data/views/fields/password.slim +14 -0
  104. data/views/fields/radio_checkbox.slim +10 -0
  105. data/views/fields/scaffold.slim +2 -0
  106. data/views/fields/scaffold_picker.slim +20 -0
  107. data/views/fields/select_picker.slim +12 -0
  108. data/views/fields/select_picker_opt.slim +16 -0
  109. data/views/fields/text_area.slim +10 -0
  110. data/views/fields/time.slim +22 -0
  111. data/views/fields/typeahead_picker.slim +25 -0
  112. data/views/index.slim +44 -0
  113. data/views/infra/index.slim +5 -0
  114. data/views/infra/inspect.slim +81 -0
  115. data/views/modals/close_m.slim +15 -0
  116. data/views/modals/confirm_m.slim +19 -0
  117. data/views/modals/empty_m.slim +12 -0
  118. data/views/modals/menu_m.slim +13 -0
  119. data/views/modals/yes_no_m.slim +19 -0
  120. data/views/panels/menu_m.slim +9 -0
  121. data/views/scaffold/confirm.slim +3 -0
  122. data/views/scaffold/fields.slim +10 -0
  123. data/views/scaffold/form.slim +11 -0
  124. data/views/scaffold/list.slim +42 -0
  125. data/views/scaffold/message.slim +3 -0
  126. data/views/scaffold/search.slim +20 -0
  127. data/views/scaffold/view.slim +18 -0
  128. data/views/search_fields/bsmselect_picker.slim +25 -0
  129. data/views/search_fields/bsselect_picker.slim +24 -0
  130. data/views/search_fields/checkbox.slim +11 -0
  131. data/views/search_fields/checkbox2.slim +14 -0
  132. data/views/search_fields/checkbox_buttons.slim +10 -0
  133. data/views/search_fields/date_range.slim +46 -0
  134. data/views/search_fields/decimal_date_range.slim +47 -0
  135. data/views/search_fields/input_text.slim +18 -0
  136. data/views/search_fields/integer.slim +18 -0
  137. data/views/search_fields/integer_range.slim +27 -0
  138. data/views/search_fields/list_bsmselect.slim +24 -0
  139. data/views/search_fields/list_bsselect.slim +22 -0
  140. data/views/search_fields/list_buttons.slim +8 -0
  141. data/views/search_fields/list_select.slim +17 -0
  142. data/views/search_fields/scaffold_picker.slim +19 -0
  143. data/views/search_fields/select_picker.slim +17 -0
  144. data/views/search_fields/typeahead_picker.slim +25 -0
  145. metadata +327 -0
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+
3
+ module Engine2
4
+ class UserInfo < Sequel::Model(DUMMYDB)
5
+ extend MemoryModel
6
+ set_natural_key :name
7
+
8
+ type_info do
9
+ string_field :name, 10
10
+ required :name, LOCS[:user_required]
11
+ string_field :password, 20
12
+ required :password, LOCS[:password_required]
13
+ password :password
14
+ end
15
+
16
+ def after_validation
17
+ @values[:password] = nil
18
+ end
19
+
20
+ def to_hash
21
+ {name: @values[:name]}
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,83 @@
1
+ # coding: utf-8
2
+
3
+ module Sequel
4
+ module SequelFixes
5
+ def self.fix_aliased_expression ds
6
+ ds.get_opts[:select].map do |sel|
7
+ case sel
8
+ when Sequel::SQL::QualifiedIdentifier
9
+ sel.column
10
+ when Sequel::SQL::AliasedExpression
11
+ Sequel::SQL::Identifier.new sel.aliaz
12
+ else
13
+ sel # symbol ?
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ module EmulateOffsetWithRowNumber
20
+ def select_sql
21
+ return super unless emulate_offset_with_row_number?
22
+ offset = @opts[:offset]
23
+ order = @opts[:order]
24
+ if require_offset_order?
25
+ order ||= default_offset_order
26
+ if order.nil? || order.empty?
27
+ raise(Error, "#{db.database_type} requires an order be provided if using an offset")
28
+ end
29
+ end
30
+ # columns = clone(:append_sql=>'', :placeholder_literal_null=>true).columns
31
+ columns = SequelFixes.fix_aliased_expression(clone(:append_sql=>'', :placeholder_literal_null=>true))
32
+ dsa1 = dataset_alias(1)
33
+ rn = row_number_column
34
+ sql = @opts[:append_sql] || ''
35
+ subselect_sql_append(sql, unlimited.
36
+ unordered.
37
+ select_append{ROW_NUMBER{}.over(:order=>order).as(rn)}.
38
+ from_self(:alias=>dsa1).
39
+ select(*columns).
40
+ limit(@opts[:limit]).
41
+ where(SQL::Identifier.new(rn) > offset).
42
+ order(rn))
43
+ sql
44
+ end
45
+
46
+ def default_offset_order
47
+ model.primary_keys_qualified
48
+ end
49
+ end
50
+
51
+ module Oracle::DatasetMethods
52
+ def select_sql
53
+ return super if @opts[:sql]
54
+ if o = @opts[:offset]
55
+ # columns = clone(:append_sql=>String.new, :placeholder_literal_null=>true).columns
56
+ columns = SequelFixes.fix_aliased_expression(clone(:append_sql=>String.new, :placeholder_literal_null=>true))
57
+ dsa1 = dataset_alias(1)
58
+ rn = row_number_column
59
+ limit = @opts[:limit]
60
+ ds = unlimited.
61
+ from_self(:alias=>dsa1).
62
+ select_append(ROW_NUMBER_EXPRESSION.as(rn)).
63
+ from_self(:alias=>dsa1).
64
+ select(*columns).
65
+ where(SQL::Identifier.new(rn) > o)
66
+ ds = ds.where(SQL::Identifier.new(rn) <= Sequel.+(o, limit)) if limit
67
+ sql = @opts[:append_sql] || String.new
68
+ subselect_sql_append(sql, ds)
69
+ sql
70
+ elsif limit = @opts[:limit]
71
+ ds = clone(:limit=>nil)
72
+ # Lock doesn't work in subselects, so don't use a subselect when locking.
73
+ # Don't use a subselect if custom SQL is used, as it breaks somethings.
74
+ ds = ds.from_self unless @opts[:lock]
75
+ sql = @opts[:append_sql] || String.new
76
+ subselect_sql_append(sql, ds.where(SQL::ComplexExpression.new(:<=, ROW_NUMBER_EXPRESSION, limit)))
77
+ sql
78
+ else
79
+ super
80
+ end
81
+ end
82
+ end if defined? Oracle
83
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+
3
+ module Sequel
4
+ class JDBC::Database
5
+ def metadata_schema_and_table(table, opts)
6
+ im = input_identifier_meth(opts[:dataset])
7
+ schema, table = schema_and_table(table)
8
+ schema ||= default_schema
9
+ schema ||= opts[:schema]
10
+ schema = im.call(schema) if schema
11
+ table = im.call(table)
12
+ [schema, table]
13
+ end
14
+ end
15
+
16
+ module JDBC::AS400::DatabaseMethods
17
+ IDENTITY_VAL_LOCAL ||= "SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1".freeze
18
+ def last_insert_id(conn, opts=OPTS)
19
+ statement(conn) do |stmt|
20
+ sql = IDENTITY_VAL_LOCAL
21
+ rs = log_yield(sql){stmt.executeQuery(sql)}
22
+ rs.next
23
+ rs.getInt(1)
24
+ end
25
+ end
26
+ end if defined?(JDBC::AS400)
27
+ end if defined? JRUBY_VERSION
@@ -0,0 +1,202 @@
1
+ # coding: utf-8
2
+
3
+ module Engine2
4
+ class Schemes
5
+ CRUD ||= {create: true, view: true, modify: true, delete: true}.freeze # bulk_delete: true
6
+ VIEW ||= {view: true}.freeze
7
+ LINK ||= {star_to_many_link: true, view: true, star_to_many_unlink: true}.freeze # star_to_many_bulk_unlink: true
8
+
9
+ attr_reader :schemes, :builtin
10
+ def initialize
11
+ @builtin = {}
12
+ @schemes = {}
13
+ end
14
+
15
+ def define_scheme name, &blk
16
+ schemes = Engine2::core_loading ? @builtin : @schemes
17
+ raise "Scheme '#{name}' already defined" if schemes[name]
18
+ schemes[name] = blk
19
+ end
20
+
21
+ def clear
22
+ @schemes = {}
23
+ end
24
+
25
+ def [] name
26
+ scheme = @schemes[name]
27
+ raise E2Error.new("Scheme #{name} not found") unless scheme
28
+ scheme
29
+ end
30
+
31
+ def merge!
32
+ @schemes.merge!(@builtin){|n| raise E2Error.new("Scheme collision: #{n}")}
33
+ end
34
+ end
35
+
36
+ SCHEMES ||= Schemes.new
37
+ SCHEMES.builtin.clear
38
+ SCHEMES.instance_eval do
39
+
40
+ define_scheme :view do |name = :view|
41
+ define_action name, ViewMeta
42
+ end
43
+
44
+ define_scheme :create do |name = :create|
45
+ define_action name, CreateMeta do
46
+ define_action :approve, InsertMeta
47
+ end
48
+ end
49
+
50
+ define_scheme :modify do |name = :modify|
51
+ define_action name, ModifyMeta do
52
+ define_action :approve, UpdateMeta
53
+ end
54
+ end
55
+
56
+ define_scheme :delete do
57
+ define_action :confirm_delete, ConfirmMeta do
58
+ self.*.response message: LOCS[:delete_question]
59
+ self.*.panel_title LOCS[:confirm_delete_title]
60
+ define_action :delete, DeleteMeta
61
+ end
62
+ end
63
+
64
+ define_scheme :bulk_delete do
65
+ define_action :confirm_bulk_delete, ConfirmMeta do
66
+ self.*.response message: LOCS[:delete_question]
67
+ self.*.panel_title LOCS[:confirm_bulk_delete_title]
68
+ define_action :bulk_delete, BulkDeleteMeta
69
+ end
70
+ end
71
+
72
+ define_scheme :default do |name, model, options|
73
+ options ||= Schemes::CRUD
74
+ define_action name, ListMeta, model: model do
75
+ options.each{|k, v| run_scheme(k) if v}
76
+
77
+ define_action_bundle :form, :create, :modify if options[:create] && options[:modify]
78
+ # define_action_bundle :decode, :decode_entry, :decode_list, :typahead
79
+
80
+ # if ?
81
+ define_action :decode_entry, DecodeEntryMeta
82
+ define_action :decode_list, DecodeListMeta
83
+ define_action :typeahead, TypeAheadMeta
84
+ end
85
+ end
86
+
87
+ #
88
+ # Many to One
89
+ #
90
+ define_scheme :many_to_one do
91
+ define_action :list, ManyToOneListMeta do
92
+ run_scheme :view
93
+ end
94
+ end
95
+
96
+ define_scheme :decode do |model, assoc_name, options = {scaffold: true}|
97
+ assoc = model.association_reflections[assoc_name]
98
+ ::Kernel::raise E2Error.new("Association '#{assoc_name}' not found for model '#{model}'") unless assoc
99
+
100
+ if self.*.assets[:model] != model && self.*.is_a?(ListMeta)
101
+ # verify relations ?
102
+ mdl = assoc[:model]
103
+ info = mdl.type_info[assoc[:keys].first]
104
+ options = info[:decode][:search]
105
+ end
106
+
107
+ define_action :"#{assoc_name}!" do
108
+ # iterate over options like in :default ?
109
+ define_action :list, DecodeListMeta, assoc: assoc if options[:list]
110
+ define_action :typeahead, TypeAheadMeta, assoc: assoc if options[:typeahead]
111
+ define_action :decode, DecodeEntryMeta, assoc: assoc do
112
+ run_scheme :many_to_one
113
+ end if options[:scaffold]
114
+ end
115
+ end
116
+
117
+ #
118
+ # * to Many
119
+ #
120
+ define_scheme :star_to_many_unlink do
121
+ define_action :confirm_unlink, ConfirmMeta do
122
+ self.*.response message: LOCS[:unlink_question]
123
+ self.*.panel_title LOCS[:confirm_unlink_title]
124
+ define_action :unlink, StarToManyUnlinkMeta
125
+ end
126
+ end
127
+
128
+ define_scheme :star_to_many_bulk_unlink do
129
+ define_action :confirm_bulk_unlink, ConfirmMeta do
130
+ self.*.response message: LOCS[:unlink_question]
131
+ self.*.panel_title LOCS[:confirm_bulk_unlink_title]
132
+ define_action :bulk_unlink, StarToManyBulkUnlinkMeta
133
+ end
134
+ end
135
+
136
+ define_scheme :star_to_many_link do
137
+ define_action :link_list, StarToManyLinkListMeta do
138
+ run_scheme :view
139
+ define_action :link, StarToManyLinkMeta
140
+ end
141
+ end
142
+
143
+ define_scheme :star_to_many do |act, assoc, model|
144
+ options = assoc[:options] || Schemes::LINK
145
+ define_action act, StarToManyListMeta, model: model, assoc: assoc do
146
+ options.each{|k, v| run_scheme(k) if v}
147
+
148
+ define_action_bundle :form, :create, :modify if options[:create] && options[:modify]
149
+ end
150
+ end
151
+
152
+ #
153
+ # arbitrary files per form
154
+ #
155
+ define_scheme :file_store do |model, field|
156
+ define_action :"#{field}_file_store!", FileStoreMeta do
157
+ self.*.model = model
158
+ self.*.field = field
159
+ define_action :download, DownloadFileStoreMeta
160
+ define_action :upload, UploadFileStoreMeta
161
+ end
162
+ end
163
+
164
+ #
165
+ # blob field in source table
166
+ #
167
+ define_scheme :blob_store do |model, field|
168
+ define_action :"#{field}_blob_store!", BlobStoreMeta do
169
+ self.*.model = model
170
+ self.*.field = field # model.type_info[field][:field]
171
+ define_action :download, DownloadBlobStoreMeta
172
+ define_action :upload, UploadBlobStoreMeta
173
+ end
174
+ end
175
+
176
+ #
177
+ # blob field in foreign (one to one) table
178
+ #
179
+ define_scheme :foreign_blob_store do |model, field|
180
+ define_action :"#{field}_blob_store!", ForeignBlobStoreMeta do
181
+ self.*.model = model
182
+ self.*.field = field # model.type_info[field][:field]
183
+ define_action :download, DownloadForeignBlobStoreMeta
184
+ define_action :upload, UploadBlobStoreMeta
185
+ end
186
+ end
187
+
188
+ define_scheme :star_to_many_field do |assoc, field|
189
+ define_action :"#{field}!", StarToManyFieldMeta, assoc: assoc do
190
+ run_scheme :view
191
+ define_action :confirm_unlink, ConfirmMeta do
192
+ self.*.response message: LOCS[:unlink_question]
193
+ define_action :unlink, StarToManyFieldUnlinkMeta
194
+ end
195
+ define_action :link_list, StarToManyFieldLinkListMeta do
196
+ run_scheme :view
197
+ end
198
+ end
199
+ end
200
+
201
+ end
202
+ end
@@ -0,0 +1,229 @@
1
+ # coding: utf-8
2
+
3
+ module Engine2
4
+ BS_ANIMATION ||= "am-flip-x" # "am-fade"
5
+
6
+ class Templates
7
+ class << self
8
+ def default_template
9
+ {template: "fields/input_text"}
10
+ end
11
+
12
+ def text_area cols, rows
13
+ {template: "fields/text_area", cols: cols, rows: rows}
14
+ end
15
+
16
+ def input_text length
17
+ {template: "fields/input_text", length: length}
18
+ end
19
+
20
+ def text
21
+ {template: "fields/text"}
22
+ end
23
+
24
+ def password length
25
+ {template: "fields/password", length: length}
26
+ end
27
+
28
+ def file_store
29
+ {template: "fields/file_store"}
30
+ end
31
+
32
+ def blob
33
+ {template: "fields/blob"}
34
+ end
35
+
36
+ def integer
37
+ {template: "fields/integer"}
38
+ end
39
+
40
+ def decimal
41
+ {template: "fields/integer"}
42
+ end
43
+
44
+ def decimal_date
45
+ {template: "fields/decimal_date", animation: BS_ANIMATION}
46
+ end
47
+
48
+ def decimal_time
49
+ {template: "fields/decimal_time", animation: BS_ANIMATION}
50
+ end
51
+
52
+ def date_picker
53
+ {template: "fields/date", animation: BS_ANIMATION}
54
+ end
55
+
56
+ def time_picker
57
+ {template: "fields/time", animation: BS_ANIMATION}
58
+ end
59
+
60
+ def datetime_picker
61
+ {template: "fields/datetime", animation: BS_ANIMATION}
62
+ end
63
+
64
+ def list_select length, options = {}
65
+ options.merge({
66
+ template: options[:optional] ? "fields/list_select_opt" : "fields/list_select",
67
+ length: length
68
+ })
69
+ end
70
+
71
+ def list_bsselect length, options = {}
72
+ options.merge({
73
+ template: options[:optional] ? "fields/list_bsselect_opt" : "fields/list_bsselect",
74
+ length: length,
75
+ animation: BS_ANIMATION
76
+ })
77
+ end
78
+
79
+ def list_buttons options = {}
80
+ options.merge({
81
+ template: options[:optional] ? "fields/list_buttons_opt" : "fields/list_buttons"
82
+ })
83
+ end
84
+
85
+ def select_picker options = {}
86
+ options.merge({
87
+ template: options[:optional] ? "fields/select_picker_opt" : "fields/select_picker"
88
+ })
89
+ end
90
+
91
+ def bsselect_picker options = {}
92
+ options.merge({
93
+ template: options[:optional] ? "fields/bsselect_picker_opt" : "fields/bsselect_picker",
94
+ animation: BS_ANIMATION
95
+ })
96
+ end
97
+
98
+ # def bs_select_picker(options)
99
+ # {
100
+ # resource: options[:resource],
101
+ # template: "fields/bs_select"
102
+ # }
103
+ # end
104
+
105
+ def scaffold_picker options = {}
106
+ options.merge({
107
+ template: 'fields/scaffold_picker'
108
+ })
109
+ end
110
+
111
+ def typeahead_picker
112
+ {template: "fields/typeahead_picker", animation: BS_ANIMATION}
113
+ end
114
+
115
+ def email length
116
+ {template: "fields/email", length: length}
117
+ end
118
+
119
+ def date_range
120
+ {template: "fields/date_range", animation: BS_ANIMATION}
121
+ end
122
+
123
+ def date_time
124
+ {template: "fields/date_time", animation: BS_ANIMATION}
125
+ end
126
+
127
+ def currency
128
+ {template: "fields/currency"}
129
+ end
130
+
131
+ def checkbox
132
+ {template: "fields/checkbox"}
133
+ end
134
+
135
+ def checkbox_buttons options = {}
136
+ options.merge({
137
+ template: options[:optional] ? "fields/checkbox_buttons_opt" : "fields/checkbox_buttons"
138
+ })
139
+ end
140
+
141
+ def radio_checkbox
142
+ {template: "fields/radio_checkbox"}
143
+ end
144
+
145
+ def scaffold
146
+ {template: "fields/scaffold"}
147
+ end
148
+
149
+ end
150
+ end
151
+
152
+ class SearchTemplates
153
+ class << self
154
+ def input_text
155
+ {template: "search_fields/input_text"}
156
+ end
157
+
158
+ def date_range options = {}
159
+ options.merge({
160
+ template: "search_fields/date_range",
161
+ animation: BS_ANIMATION
162
+ })
163
+ end
164
+
165
+ def integer_range
166
+ {template: "search_fields/integer_range"}
167
+ end
168
+
169
+ def integer
170
+ {template: "search_fields/integer"}
171
+ end
172
+
173
+ def select_picker options = {}
174
+ options.merge({
175
+ template: "search_fields/select_picker"
176
+ })
177
+ end
178
+
179
+ def bsselect_picker options = {}
180
+ options.merge({
181
+ template: options[:multiple] ? "search_fields/bsmselect_picker" : "search_fields/bsselect_picker",
182
+ animation: BS_ANIMATION
183
+ })
184
+ end
185
+
186
+ def scaffold_picker options = {}
187
+ options.merge({
188
+ # template: options[:multiple] ? "search_fields/scaffold_picker" : "search_fields/scaffold_picker"
189
+ template: "search_fields/scaffold_picker"
190
+ })
191
+ end
192
+
193
+ def typeahead_picker
194
+ {template: "search_fields/typeahead_picker", animation: BS_ANIMATION}
195
+ end
196
+
197
+ # def checkbox_search true_v = "1", false_v = "0"
198
+ # {
199
+ # template: "search_fields/checkbox2",
200
+ # true_value: true_v,
201
+ # false_value: false_v
202
+ # }
203
+ # end
204
+
205
+ def checkbox_buttons
206
+ {template: 'search_fields/checkbox_buttons'}
207
+ end
208
+
209
+ def list_select
210
+ {template: "search_fields/list_select"}
211
+ end
212
+
213
+ def list_bsselect options = {}
214
+ options.merge({
215
+ template: options[:multiple] ? "search_fields/list_bsmselect" : "search_fields/list_bsselect",
216
+ animation: BS_ANIMATION
217
+ })
218
+ end
219
+
220
+ def list_buttons
221
+ {template: "search_fields/list_buttons"}
222
+ end
223
+
224
+ def decimal_date
225
+ {template: "search_fields/decimal_date_range", animation: BS_ANIMATION}
226
+ end
227
+ end
228
+ end
229
+ end