express_admin 1.7.5 → 1.7.7

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