express_admin 1.7.5 → 1.7.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/express_admin/components/command_button.js.coffee +25 -0
  3. data/app/assets/stylesheets/express_admin/components/_command_button.sass +6 -1
  4. data/app/assets/stylesheets/express_admin/globals/_variables.sass +2 -0
  5. data/app/assets/stylesheets/express_admin/plugins/_select2.sass +3 -0
  6. data/app/assets/stylesheets/express_admin/screen.sass +0 -2
  7. data/app/assets/stylesheets/express_admin/shared/_tables.sass +2 -0
  8. data/app/components/express_admin/command_button.rb +9 -3
  9. data/app/components/express_admin/definition_table.rb +1 -1
  10. data/app/components/express_admin/smart_table.rb +6 -0
  11. data/app/views/layouts/devise.html.erb +19 -0
  12. data/config/initializers/postgresql_trigram.rb +13 -0
  13. data/db/migrate/20150928044202_install_trigram.rb +18 -0
  14. data/lib/express_admin/engine.rb +4 -2
  15. data/lib/express_admin/search.rb +51 -0
  16. data/lib/express_admin/standard_actions.rb +18 -5
  17. data/lib/express_admin/version.rb +1 -1
  18. data/test/dummy/db/test.sqlite3 +0 -0
  19. data/test/dummy/test/components/command_button_test.rb +2 -2
  20. metadata +22 -160
  21. data/app/assets/stylesheets/express_admin/shared/_buttons.sass +0 -3
  22. data/app/assets/stylesheets/express_admin/shared/_tabs.sass +0 -25
  23. data/vendor/gems/express_templates/CHANGELOG.md +0 -12
  24. data/vendor/gems/express_templates/Gemfile +0 -16
  25. data/vendor/gems/express_templates/LICENSE +0 -21
  26. data/vendor/gems/express_templates/README.md +0 -133
  27. data/vendor/gems/express_templates/Rakefile +0 -32
  28. data/vendor/gems/express_templates/express_templates.gemspec +0 -32
  29. data/vendor/gems/express_templates/lib/arbre/patches.rb +0 -76
  30. data/vendor/gems/express_templates/lib/core_extensions/proc.rb +0 -103
  31. data/vendor/gems/express_templates/lib/core_extensions/string.rb +0 -25
  32. data/vendor/gems/express_templates/lib/express_templates/compiler.rb +0 -22
  33. data/vendor/gems/express_templates/lib/express_templates/components/all.rb +0 -28
  34. data/vendor/gems/express_templates/lib/express_templates/components/base.rb +0 -156
  35. data/vendor/gems/express_templates/lib/express_templates/components/capabilities/resourceful.rb +0 -213
  36. data/vendor/gems/express_templates/lib/express_templates/components/configurable.rb +0 -181
  37. data/vendor/gems/express_templates/lib/express_templates/components/container.rb +0 -45
  38. data/vendor/gems/express_templates/lib/express_templates/components/forms/basic_fields.rb +0 -52
  39. data/vendor/gems/express_templates/lib/express_templates/components/forms/checkbox.rb +0 -37
  40. data/vendor/gems/express_templates/lib/express_templates/components/forms/express_form.rb +0 -48
  41. data/vendor/gems/express_templates/lib/express_templates/components/forms/form_component.rb +0 -88
  42. data/vendor/gems/express_templates/lib/express_templates/components/forms/option_support.rb +0 -69
  43. data/vendor/gems/express_templates/lib/express_templates/components/forms/radio.rb +0 -65
  44. data/vendor/gems/express_templates/lib/express_templates/components/forms/select.rb +0 -126
  45. data/vendor/gems/express_templates/lib/express_templates/components/forms/select_collection.rb +0 -45
  46. data/vendor/gems/express_templates/lib/express_templates/components/forms/submit.rb +0 -30
  47. data/vendor/gems/express_templates/lib/express_templates/components/forms.rb +0 -16
  48. data/vendor/gems/express_templates/lib/express_templates/components/tree_for.rb +0 -88
  49. data/vendor/gems/express_templates/lib/express_templates/components.rb +0 -11
  50. data/vendor/gems/express_templates/lib/express_templates/indenter.rb +0 -47
  51. data/vendor/gems/express_templates/lib/express_templates/interpolator.rb +0 -36
  52. data/vendor/gems/express_templates/lib/express_templates/renderer.rb +0 -9
  53. data/vendor/gems/express_templates/lib/express_templates/template/handler.rb +0 -32
  54. data/vendor/gems/express_templates/lib/express_templates/version.rb +0 -3
  55. data/vendor/gems/express_templates/lib/express_templates.rb +0 -18
  56. data/vendor/gems/express_templates/lib/tasks/express_templates.rake +0 -4
  57. data/vendor/gems/express_templates/test/compiler_test.rb +0 -9
  58. data/vendor/gems/express_templates/test/components/base_test.rb +0 -67
  59. data/vendor/gems/express_templates/test/components/capabilities/resourceful_test.rb +0 -63
  60. data/vendor/gems/express_templates/test/components/configurable_test.rb +0 -140
  61. data/vendor/gems/express_templates/test/components/forms/basic_fields_test.rb +0 -158
  62. data/vendor/gems/express_templates/test/components/forms/checkbox_test.rb +0 -51
  63. data/vendor/gems/express_templates/test/components/forms/express_form_test.rb +0 -62
  64. data/vendor/gems/express_templates/test/components/forms/radio_test.rb +0 -112
  65. data/vendor/gems/express_templates/test/components/forms/select_test.rb +0 -129
  66. data/vendor/gems/express_templates/test/components/forms/submit_test.rb +0 -36
  67. data/vendor/gems/express_templates/test/components/tree_for_test.rb +0 -70
  68. data/vendor/gems/express_templates/test/core_extensions/proc_test.rb +0 -90
  69. data/vendor/gems/express_templates/test/core_extensions/string_test.rb +0 -20
  70. data/vendor/gems/express_templates/test/dummy/Rakefile +0 -6
  71. data/vendor/gems/express_templates/test/dummy/app/assets/javascripts/application.js +0 -13
  72. data/vendor/gems/express_templates/test/dummy/app/assets/stylesheets/application.css +0 -15
  73. data/vendor/gems/express_templates/test/dummy/app/controllers/application_controller.rb +0 -5
  74. data/vendor/gems/express_templates/test/dummy/app/controllers/hello_controller.rb +0 -5
  75. data/vendor/gems/express_templates/test/dummy/app/helpers/application_helper.rb +0 -2
  76. data/vendor/gems/express_templates/test/dummy/app/views/hello/show.html.et +0 -6
  77. data/vendor/gems/express_templates/test/dummy/app/views/layouts/application.html.et +0 -15
  78. data/vendor/gems/express_templates/test/dummy/bin/bundle +0 -3
  79. data/vendor/gems/express_templates/test/dummy/bin/rails +0 -4
  80. data/vendor/gems/express_templates/test/dummy/bin/rake +0 -4
  81. data/vendor/gems/express_templates/test/dummy/config/application.rb +0 -26
  82. data/vendor/gems/express_templates/test/dummy/config/boot.rb +0 -5
  83. data/vendor/gems/express_templates/test/dummy/config/environment.rb +0 -5
  84. data/vendor/gems/express_templates/test/dummy/config/environments/development.rb +0 -37
  85. data/vendor/gems/express_templates/test/dummy/config/environments/production.rb +0 -82
  86. data/vendor/gems/express_templates/test/dummy/config/environments/test.rb +0 -40
  87. data/vendor/gems/express_templates/test/dummy/config/initializers/assets.rb +0 -8
  88. data/vendor/gems/express_templates/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  89. data/vendor/gems/express_templates/test/dummy/config/initializers/cookies_serializer.rb +0 -3
  90. data/vendor/gems/express_templates/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  91. data/vendor/gems/express_templates/test/dummy/config/initializers/inflections.rb +0 -16
  92. data/vendor/gems/express_templates/test/dummy/config/initializers/mime_types.rb +0 -4
  93. data/vendor/gems/express_templates/test/dummy/config/initializers/session_store.rb +0 -3
  94. data/vendor/gems/express_templates/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  95. data/vendor/gems/express_templates/test/dummy/config/locales/en.yml +0 -23
  96. data/vendor/gems/express_templates/test/dummy/config/routes.rb +0 -4
  97. data/vendor/gems/express_templates/test/dummy/config/secrets.yml +0 -22
  98. data/vendor/gems/express_templates/test/dummy/config.ru +0 -4
  99. data/vendor/gems/express_templates/test/dummy/public/404.html +0 -67
  100. data/vendor/gems/express_templates/test/dummy/public/422.html +0 -67
  101. data/vendor/gems/express_templates/test/dummy/public/500.html +0 -66
  102. data/vendor/gems/express_templates/test/dummy/public/favicon.ico +0 -0
  103. data/vendor/gems/express_templates/test/dummy/test/controllers/hello_controller_test.rb +0 -14
  104. data/vendor/gems/express_templates/test/dummy/test/helpers/hello_helper_test.rb +0 -4
  105. data/vendor/gems/express_templates/test/express_templates_test.rb +0 -23
  106. data/vendor/gems/express_templates/test/handler_test.rb +0 -148
  107. data/vendor/gems/express_templates/test/indenter_test.rb +0 -27
  108. data/vendor/gems/express_templates/test/interpolator_test.rb +0 -80
  109. data/vendor/gems/express_templates/test/performance_test.rb +0 -97
  110. data/vendor/gems/express_templates/test/test_helper.rb +0 -178
  111. data/vendor/gems/foundation_apps_styles/Gemfile +0 -4
  112. data/vendor/gems/foundation_apps_styles/LICENSE.txt +0 -21
  113. data/vendor/gems/foundation_apps_styles/README.md +0 -41
  114. data/vendor/gems/foundation_apps_styles/Rakefile +0 -13
  115. data/vendor/gems/foundation_apps_styles/bin/console +0 -14
  116. data/vendor/gems/foundation_apps_styles/bin/setup +0 -7
  117. data/vendor/gems/foundation_apps_styles/foundation_apps_styles.gemspec +0 -24
  118. data/vendor/gems/foundation_apps_styles/lib/foundation_apps_styles/version.rb +0 -3
  119. data/vendor/gems/foundation_apps_styles/lib/foundation_apps_styles.rb +0 -6
  120. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/account.svg +0 -44
  121. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/action.svg +0 -38
  122. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/ban.svg +0 -17
  123. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/bell.svg +0 -22
  124. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/bookmark.svg +0 -14
  125. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/cart.svg +0 -35
  126. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/chevron.svg +0 -28
  127. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/circle-check.svg +0 -25
  128. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/circle-x.svg +0 -25
  129. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/cog.svg +0 -17
  130. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/comment-square.svg +0 -14
  131. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/dashboard.svg +0 -38
  132. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/document.svg +0 -28
  133. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/envelope.svg +0 -44
  134. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/flag.svg +0 -24
  135. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/home.svg +0 -28
  136. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/lock.svg +0 -55
  137. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/magnifying-glass.svg +0 -26
  138. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/person.svg +0 -62
  139. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/reload.svg +0 -19
  140. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/share-boxed.svg +0 -17
  141. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/star.svg +0 -14
  142. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/thumb.svg +0 -38
  143. data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/zoom.svg +0 -56
  144. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/_global.scss +0 -131
  145. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/_includes.scss +0 -33
  146. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/_settings.scss +0 -614
  147. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_accordion.scss +0 -72
  148. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_action-sheet.scss +0 -265
  149. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_block-list.scss +0 -360
  150. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_button-group.scss +0 -197
  151. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_button.scss +0 -205
  152. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_card.scss +0 -93
  153. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_extras.scss +0 -54
  154. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_forms.scss +0 -460
  155. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_grid.scss +0 -422
  156. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_iconic.scss +0 -95
  157. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_label.scss +0 -134
  158. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_list.scss +0 -19
  159. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_menu-bar.scss +0 -382
  160. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_modal.scss +0 -129
  161. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_motion.scss +0 -525
  162. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_notification.scss +0 -207
  163. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_off-canvas.scss +0 -169
  164. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_panel.scss +0 -134
  165. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_popup.scss +0 -68
  166. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_switch.scss +0 -134
  167. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_tabs.scss +0 -100
  168. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_title-bar.scss +0 -135
  169. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_typography.scss +0 -345
  170. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_utilities.scss +0 -160
  171. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/foundation-apps.css +0 -6146
  172. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/foundation.scss +0 -50
  173. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/helpers/_breakpoints.scss +0 -154
  174. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/helpers/_functions.scss +0 -343
  175. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/helpers/_images.scss +0 -19
  176. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/helpers/_mixins.scss +0 -123
  177. data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/vendor/_normalize.scss +0 -424
@@ -1,213 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- module Capabilities
4
-
5
- module Resourceful
6
-
7
- def self.included(base)
8
- base.class_eval do
9
- has_argument :id, "The name of the collection", type: :symbol, optional: false
10
- has_option :collection, 'Provide an explicit collection as a resource.'
11
- has_option :collection_path, 'Provide an explicit path for the collection resource.', type: [:string, :proc]
12
- has_option :resource_class, 'Overrides namespaced resource_class for using resources from a different module or namespace.'
13
- has_option :resource_path, 'Overides the resource path which is otherwise inferred from the class name.', type: [:string, :proc]
14
- has_option :path_prefix, 'Rarely used. Override inferred path_prefix for path helpers.'
15
- # note there is some duplication here.
16
- # resource_path can be specified as a proc which can specify a namespace
17
- # TODO: investigate which approach is better and deprecate if desirable
18
- has_option :namespace, 'Rarely used. Overrides inferred namespace for resources.'
19
- end
20
- end
21
-
22
- def namespace
23
- config[:namespace] || infer_namespace
24
- end
25
-
26
- def path_prefix
27
- config[:path_prefix] || infer_path_prefix
28
- end
29
-
30
- def resource_class
31
- resource_class = config[:resource_class] || _namespaced_resource_class
32
- resource_class.constantize
33
- end
34
-
35
- private
36
-
37
- def _namespaced_resource_class
38
- if namespace
39
- "#{namespace}/#{resource_name}".classify
40
- else
41
- resource_name.to_s.classify
42
- end
43
- end
44
-
45
- def template_virtual_path
46
- begin
47
- super
48
- rescue
49
- nil
50
- end
51
- end
52
-
53
- def infer_namespace
54
- if template_virtual_path
55
- path_parts = template_virtual_path.split('/')
56
-
57
- case
58
- when path_parts.size == 4
59
- path_parts.first
60
- when path_parts.size == 3
61
- mod = path_parts.first.classify.constantize
62
- if mod.const_defined?(:Engine)
63
- path_parts.first
64
- else
65
- nil
66
- end
67
- else
68
- nil
69
- end
70
- else
71
- nil
72
- end
73
- end
74
-
75
- def infer_path_prefix
76
- if template_virtual_path
77
- path_parts = template_virtual_path.split('/')
78
-
79
- case
80
- when path_parts.size == 4
81
- path_parts[1]
82
- when path_parts.size == 3
83
- mod = path_parts.first.classify.constantize
84
- if mod.const_defined?(:Engine)
85
- nil
86
- else
87
- path_parts.first
88
- end
89
- else
90
- nil
91
- end
92
- else
93
- nil
94
- end
95
- end
96
-
97
- # TODO: this can now be inferred from the template.virtual_path
98
- # if not supplied...
99
- def resource_name
100
- config[:id].to_s.singularize
101
- end
102
-
103
- def collection_member_name
104
- resource_name
105
- end
106
-
107
- def collection_name
108
- collection_member_name.pluralize
109
- end
110
-
111
- def collection_var
112
- "@#{collection_name}".to_sym
113
- end
114
-
115
- def collection
116
- if config[:collection]
117
- if config[:collection].respond_to?(:call)
118
- config[:collection].call()
119
- else
120
- config[:collection]
121
- end
122
- else
123
- self.send(collection_name) # should be in view assigns
124
- end
125
- end
126
-
127
- def collection_path
128
- if config[:collection_path]
129
- if config[:collection_path].respond_to?(:call)
130
- config[:collection_path].call()
131
- else
132
- config[:collection_path]
133
- end
134
- else
135
- if helpers.respond_to?(:collection_path)
136
- helpers.collection_path
137
- else
138
- helpers.instance_eval collection_path_helper
139
- end
140
- end
141
- end
142
-
143
- def collection_path_helper
144
- if path_namespace
145
- "#{path_namespace}.#{collection_name_with_prefix}_path"
146
- else
147
- "#{collection_name_with_prefix}_path"
148
- end
149
- end
150
-
151
- def collection_name_with_prefix
152
- if path_prefix
153
- "#{path_prefix}_#{collection_name}"
154
- else
155
- collection_name
156
- end
157
- end
158
-
159
- def resource_path_helper
160
- if path_namespace
161
- "#{path_namespace}.#{resource_name_with_path_prefix}_path"
162
- else
163
- "#{resource_name_with_path_prefix}_path"
164
- end
165
- end
166
-
167
- def path_namespace
168
- resource_class_name = resource_class.to_s
169
- resource_class_name.match(/::/) ?
170
- resource_class_name.split("::").first.try(:underscore) : nil
171
- end
172
-
173
- def resource_path(object = nil)
174
- if config[:resource_path]
175
- if config[:resource_path].respond_to?(:call) && object.respond_to?(:to_param)
176
- config[:resource_path].call(object)
177
- else
178
- config[:resource_path]
179
- end
180
- else
181
- if helpers.respond_to?(:resource_path) &&
182
- helpers.resource.to_param.present? # skip on nil resource
183
- helpers.resource_path
184
- else
185
- if resource_path_helper.match(/\w+\.\w+/)
186
- namespace, path_helper = resource_path_helper.split('.')
187
- helpers.send(namespace).send(path_helper, object)
188
- else
189
- helpers.send(resource_path_helper, object)
190
- end
191
- end
192
- end
193
- end
194
-
195
- def resource_name_with_path_prefix
196
- if path_prefix
197
- "#{path_prefix}_#{resource_name}"
198
- else
199
- resource_name
200
- end
201
- end
202
-
203
- def resource_attributes
204
- resource_class.columns
205
- end
206
-
207
- def resource
208
- self.send(resource_name)
209
- end
210
- end
211
- end
212
- end
213
- end
@@ -1,181 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- # Configurable components support configuration options supplied to the
4
- # builder method. Supported options must be declared. All other options
5
- # are passed along and converted to html attributes.
6
- #
7
- # Example:
8
- #
9
- # ```ruby
10
- #
11
- # class Pane < ExpressTemplates::Components::Configurable
12
- # has_option :title, "Displayed in the title area", required: true
13
- # has_option :status, "Displayed in the status area"
14
- # end
15
- #
16
- # # Usage:
17
- #
18
- # pane(title: "People", status: "#{people.count} people")
19
- #
20
- # ```ruby
21
- #
22
- # Options specified as required must be supplied.
23
- #
24
- # Default values may be supplied for options with a default: keyword.
25
- #
26
- # Options may be passed as html attributes with attribute: true
27
- #
28
- class Configurable < Base
29
-
30
- abstract_component
31
-
32
- class_attribute :supported_options
33
- self.supported_options = {}
34
-
35
- class_attribute :supported_arguments
36
- self.supported_arguments = {}
37
-
38
- def self.emits(*args, &block)
39
- warn ".emits is deprecrated"
40
- self.contains(*args, &block)
41
- end
42
-
43
- def build(*args, &block)
44
- _process_builder_args!(args)
45
- super(*args, &block)
46
- end
47
-
48
- def config
49
- @config ||= {}
50
- end
51
-
52
- def self.has_option(name, description, type: :string, required: nil, default: nil, attribute: nil, values: nil)
53
- raise "name must be a symbol" unless name.kind_of?(Symbol)
54
- option_definition = {description: description}
55
- option_definition.merge!(type: type, required: required, default: default, attribute: attribute, values: values)
56
- self.supported_options =
57
- self.supported_options.merge(name => option_definition)
58
- end
59
-
60
- def required_options
61
- supported_options.select {|k,v| v[:required] unless v[:default] }
62
- end
63
-
64
- def self.has_argument(name, description, as: nil, type: :string, default: nil, optional: false)
65
- raise "name must be a symbol" unless name.kind_of?(Symbol)
66
- argument_definition = {description: description, as: as, type: type, default: default, optional: optional}
67
- self.supported_arguments =
68
- self.supported_arguments.merge(name => argument_definition)
69
- end
70
-
71
- has_argument :id, "The id of the component.", type: :symbol, optional: true
72
-
73
- protected
74
-
75
- def _default_options
76
- supported_options.select {|k,v| v[:default] }
77
- end
78
-
79
- def _check_required_options(supplied)
80
- missing = required_options.keys - supplied.keys
81
- if missing.any?
82
- raise "#{self.class} missing required option(s): #{missing}"
83
- end
84
- end
85
-
86
- def _set_defaults
87
- _default_options.each do |key, value|
88
- if !!value[:attribute]
89
- set_attribute key, value[:default]
90
- else
91
- if config[key].nil?
92
- config[key] = value[:default]
93
- end
94
- end
95
- end
96
- end
97
-
98
- def _valid_types(definition)
99
- valid_type_names = if definition[:type].kind_of?(Symbol)
100
- [definition[:type]]
101
- elsif definition[:type].respond_to?(:keys)
102
- definition[:type].keys
103
- else
104
- definition[:type] || []
105
- end
106
- valid_type_names.map do |type_name|
107
- if type_name.eql?(:boolean)
108
- type_name
109
- else
110
- type_name.to_s.classify.constantize
111
- end
112
- end
113
- end
114
-
115
- def _is_valid?(value, definition)
116
- valid_types = _valid_types(definition)
117
- if valid_types.empty? && value.kind_of?(String)
118
- true
119
- elsif valid_types.include?(value.class)
120
- true
121
- elsif valid_types.include?(:boolean) &&
122
- [1, 0, true, false].include?(value)
123
- true
124
- else
125
- false
126
- end
127
- end
128
-
129
- def _optional_argument?(definition)
130
- definition[:default] || definition[:optional]
131
- end
132
-
133
- def _required_argument?(definition)
134
- !_optional_argument?(definition)
135
- end
136
-
137
- def _extract_supported_arguments!(args)
138
- supported_arguments.each do |key, definition|
139
- value = args.shift
140
- if value.nil? && _required_argument?(definition)
141
- raise "argument for #{key} not supplied"
142
- end
143
- unless _is_valid?(value, definition)
144
- if _required_argument?(definition)
145
- raise "argument for #{key} invalid (#{value.class}) '#{value.to_s}'; Allowable: #{_valid_types(definition).inspect}"
146
- else
147
- args.unshift value
148
- next
149
- end
150
- end
151
- config_key = definition[:as] || key
152
- config[config_key] = value || definition[:default]
153
- end
154
- end
155
-
156
- def _set_id_attribute
157
- attributes[:id] = config[:id]
158
- end
159
-
160
- def _extract_supported_options!(builder_options)
161
- builder_options.each do |key, value|
162
- if supported_options.keys.include?(key)
163
- unless supported_options[key][:attribute]
164
- config[key] = builder_options.delete(key)
165
- end
166
- end
167
- end
168
- end
169
-
170
- def _process_builder_args!(args)
171
- _extract_supported_arguments!(args)
172
- builder_options = args.last.try(:kind_of?, Hash) ? args.last : {}
173
- _check_required_options(builder_options)
174
- _extract_supported_options!(builder_options)
175
- _set_defaults
176
- _set_id_attribute
177
- end
178
-
179
- end
180
- end
181
- end
@@ -1,45 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- class Container < Configurable
4
-
5
- abstract_component
6
-
7
- class_attribute :prepended_blocks
8
- self.prepended_blocks = []
9
-
10
- class_attribute :appended_blocks
11
- self.appended_blocks = []
12
-
13
- contains -> (&block) {
14
- prepended
15
- block.call(self) if block
16
- appended
17
- }
18
-
19
- def prepended
20
- prepended_blocks.each do |block_to_prepend|
21
- call_block(block_to_prepend)
22
- end
23
- end
24
-
25
- def appended
26
- appended_blocks.each do |block_to_append|
27
- call_block(block_to_append)
28
- end
29
- end
30
-
31
- def call_block(block)
32
- instance_exec &block
33
- end
34
-
35
- def self.prepends(proc = nil, &block)
36
- self.prepended_blocks += [proc || block]
37
- end
38
-
39
- def self.appends(proc = nil, &block)
40
- self.appended_blocks += [proc || block]
41
- end
42
-
43
- end
44
- end
45
- end
@@ -1,52 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- module Forms
4
- module BasicFields
5
- ALL = %w(email phone text password color date datetime
6
- datetime_local number range
7
- search telephone time url week)
8
-
9
- ALL.each do |type|
10
- class_definition = <<-RUBY
11
- class #{type.classify} < FormComponent
12
- contains {
13
- label_tag(label_name, label_text)
14
- #{type}_field_tag field_name_attribute, field_value, field_helper_options
15
- }
16
- end
17
- RUBY
18
-
19
- eval(class_definition)
20
-
21
- end
22
- end
23
-
24
- # class Email < FormComponent
25
- # contains {
26
- # label_tag label_name, label_text
27
- # email_field field_name_attribute, field_value, field_helper_options
28
- # }
29
- # end
30
-
31
- class File < FormComponent
32
- contains {
33
- label_tag(label_name, label_text)
34
- file_field_tag field_name_attribute, field_helper_options
35
- }
36
- end
37
-
38
- class Textarea < FormComponent
39
- contains {
40
- label_tag(label_name, label_text)
41
- text_area_tag field_name_attribute, field_value, field_helper_options
42
- }
43
- end
44
-
45
- class Hidden < FormComponent
46
- contains {
47
- hidden_field_tag field_name_attribute, field_value, field_helper_options
48
- }
49
- end
50
- end
51
- end
52
- end
@@ -1,37 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- module Forms
4
- class Checkbox < FormComponent
5
-
6
- has_option :label_after, 'Positions the option label after the checkbox.', default: false
7
-
8
- contains {
9
- label_tag(label_name, label_text) if label_before?
10
- check_box(resource_name, field_name.to_sym, field_options, checked_value, unchecked_value)
11
- label_tag(label_name, label_text) if label_after?
12
- }
13
-
14
- def label_before?
15
- !label_after?
16
- end
17
-
18
- def label_after?
19
- !!config[:label_after]
20
- end
21
-
22
- def field_options
23
- {}
24
- end
25
-
26
- def checked_value
27
- "1"
28
- end
29
-
30
- def unchecked_value
31
- "0"
32
- end
33
-
34
- end
35
- end
36
- end
37
- end
@@ -1,48 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- module Forms
4
- class ExpressForm < Container
5
- include ExpressTemplates::Components::Capabilities::Resourceful
6
-
7
- tag :form
8
-
9
- has_option :method, 'The form method', default: 'POST', attribute: true #, options: ['PUT', 'POST', 'GET', 'DELETE']
10
- has_option :action, 'The form action containing the resource path or url.'
11
- has_option :on_success, 'Pass a form value indicating where to go on a successful submission.'
12
- has_option :on_failure, 'Pass a form value indicating where to go on a failed submission.'
13
- has_option :enctype, 'The enctype attribute specifies how the form-data should be encoded when submitting it to the server.'
14
-
15
- prepends -> {
16
- div(style: 'display:none') {
17
- add_child helpers.utf8_enforcer_tag
18
- add_child helpers.send(:method_tag, resource.persisted? ? :put : :post)
19
- add_child helpers.send(:token_tag)
20
- hidden_field_tag :on_success, config[:on_success] if config[:on_success]
21
- hidden_field_tag :on_failure, config[:on_failure] if config[:on_failure]
22
- }
23
- }
24
-
25
- before_build -> {
26
- set_attribute(:id, form_id)
27
- set_attribute(:action, form_action)
28
- set_attribute(:enctype, form_enctype) if form_enctype
29
- add_class(config[:id])
30
- }
31
-
32
- def form_id
33
- [config[:id], resource.try(:id)].compact.join('_')
34
- end
35
-
36
- def form_action
37
- config[:action] || (resource.try(:persisted?) ? resource_path(resource) : collection_path)
38
- end
39
-
40
- def form_enctype
41
- config[:enctype]
42
- end
43
-
44
- end
45
- end
46
- end
47
- end
48
-
@@ -1,88 +0,0 @@
1
- module ExpressTemplates
2
- module Components
3
- module Forms
4
- class FormComponent < Configurable
5
-
6
- attr :input_attributes
7
-
8
- before_build -> {
9
- set_attribute(:id, "#{resource_name}_#{field_name}_wrapper")
10
- add_class(config[:wrapper_class])
11
- add_class('error') if resource.respond_to?(:errors) &&
12
- resource.errors.include?(field_name.to_sym)
13
- }
14
-
15
- has_option :wrapper_class, 'Override the class of the wrapping div of a form component', default: 'field-wrapper'
16
- has_option :label, 'Override the inferred label of a form component'
17
-
18
- def resource
19
- self.send(resource_name)
20
- end
21
-
22
- # Lookup the resource_name from the parent ExpressForm.
23
- def resource_name
24
- raise "FormComponent must have a parent form" unless parent_form
25
- parent_form.config[:id].to_s
26
- end
27
-
28
- def resource_class
29
- parent_form.resource_class
30
- end
31
-
32
- # Return the name attribute for the label
33
- def label_name
34
- "#{resource_name.singularize}_#{field_name}"
35
- end
36
-
37
- # Return the text content for the label
38
- def label_text
39
- config[:label] || field_name.titleize
40
- end
41
-
42
- # Return the field_name as a string. This taken from the first argument
43
- # to the component macro in the template or fragment.
44
- def field_name
45
- (config[:id] || (@args.first.is_a?(String) && @args.first)).to_s
46
- end
47
-
48
- def field_value
49
- resource.send(field_name)
50
- end
51
-
52
- # Return the field name attribute. Currently handles only simple attributes
53
- # on the resource. Does not handle attributes for associated resources.
54
- def field_name_attribute
55
- "#{resource_name.singularize}[#{field_name}]"
56
- end
57
-
58
- def field_id_attribute
59
- "#{resource_name.singularize}_#{field_name}"
60
- end
61
-
62
- def field_helper_options
63
- {id: field_id_attribute}.merge(input_attributes||nil)
64
- end
65
-
66
- # Search the parent graph until we find an ExpressForm. Returns nil if none found.
67
- def parent_form
68
- @my_form ||= parent
69
- until @my_form.nil? || @my_form.kind_of?(ExpressForm)
70
- @my_form = @my_form.parent
71
- end
72
- return @my_form
73
- end
74
-
75
- protected
76
-
77
- # saving attributes for passing to the input field
78
- def _process_builder_args!(args)
79
- super(args)
80
- @input_attributes = args.last if args.last.kind_of?(Hash)
81
- @input_attributes ||= {}
82
- args.clear
83
- end
84
-
85
- end
86
- end
87
- end
88
- end