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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/express_admin/components/command_button.js.coffee +25 -0
- data/app/assets/stylesheets/express_admin/components/_command_button.sass +6 -1
- data/app/assets/stylesheets/express_admin/globals/_variables.sass +2 -0
- data/app/assets/stylesheets/express_admin/plugins/_select2.sass +3 -0
- data/app/assets/stylesheets/express_admin/screen.sass +0 -2
- data/app/assets/stylesheets/express_admin/shared/_tables.sass +2 -0
- data/app/components/express_admin/command_button.rb +9 -3
- data/app/components/express_admin/definition_table.rb +1 -1
- data/app/components/express_admin/smart_table.rb +6 -0
- data/app/views/layouts/devise.html.erb +19 -0
- data/config/initializers/postgresql_trigram.rb +13 -0
- data/db/migrate/20150928044202_install_trigram.rb +18 -0
- data/lib/express_admin/engine.rb +4 -2
- data/lib/express_admin/search.rb +51 -0
- data/lib/express_admin/standard_actions.rb +18 -5
- data/lib/express_admin/version.rb +1 -1
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/test/components/command_button_test.rb +2 -2
- metadata +22 -160
- data/app/assets/stylesheets/express_admin/shared/_buttons.sass +0 -3
- data/app/assets/stylesheets/express_admin/shared/_tabs.sass +0 -25
- data/vendor/gems/express_templates/CHANGELOG.md +0 -12
- data/vendor/gems/express_templates/Gemfile +0 -16
- data/vendor/gems/express_templates/LICENSE +0 -21
- data/vendor/gems/express_templates/README.md +0 -133
- data/vendor/gems/express_templates/Rakefile +0 -32
- data/vendor/gems/express_templates/express_templates.gemspec +0 -32
- data/vendor/gems/express_templates/lib/arbre/patches.rb +0 -76
- data/vendor/gems/express_templates/lib/core_extensions/proc.rb +0 -103
- data/vendor/gems/express_templates/lib/core_extensions/string.rb +0 -25
- data/vendor/gems/express_templates/lib/express_templates/compiler.rb +0 -22
- data/vendor/gems/express_templates/lib/express_templates/components/all.rb +0 -28
- data/vendor/gems/express_templates/lib/express_templates/components/base.rb +0 -156
- data/vendor/gems/express_templates/lib/express_templates/components/capabilities/resourceful.rb +0 -213
- data/vendor/gems/express_templates/lib/express_templates/components/configurable.rb +0 -181
- data/vendor/gems/express_templates/lib/express_templates/components/container.rb +0 -45
- data/vendor/gems/express_templates/lib/express_templates/components/forms/basic_fields.rb +0 -52
- data/vendor/gems/express_templates/lib/express_templates/components/forms/checkbox.rb +0 -37
- data/vendor/gems/express_templates/lib/express_templates/components/forms/express_form.rb +0 -48
- data/vendor/gems/express_templates/lib/express_templates/components/forms/form_component.rb +0 -88
- data/vendor/gems/express_templates/lib/express_templates/components/forms/option_support.rb +0 -69
- data/vendor/gems/express_templates/lib/express_templates/components/forms/radio.rb +0 -65
- data/vendor/gems/express_templates/lib/express_templates/components/forms/select.rb +0 -126
- data/vendor/gems/express_templates/lib/express_templates/components/forms/select_collection.rb +0 -45
- data/vendor/gems/express_templates/lib/express_templates/components/forms/submit.rb +0 -30
- data/vendor/gems/express_templates/lib/express_templates/components/forms.rb +0 -16
- data/vendor/gems/express_templates/lib/express_templates/components/tree_for.rb +0 -88
- data/vendor/gems/express_templates/lib/express_templates/components.rb +0 -11
- data/vendor/gems/express_templates/lib/express_templates/indenter.rb +0 -47
- data/vendor/gems/express_templates/lib/express_templates/interpolator.rb +0 -36
- data/vendor/gems/express_templates/lib/express_templates/renderer.rb +0 -9
- data/vendor/gems/express_templates/lib/express_templates/template/handler.rb +0 -32
- data/vendor/gems/express_templates/lib/express_templates/version.rb +0 -3
- data/vendor/gems/express_templates/lib/express_templates.rb +0 -18
- data/vendor/gems/express_templates/lib/tasks/express_templates.rake +0 -4
- data/vendor/gems/express_templates/test/compiler_test.rb +0 -9
- data/vendor/gems/express_templates/test/components/base_test.rb +0 -67
- data/vendor/gems/express_templates/test/components/capabilities/resourceful_test.rb +0 -63
- data/vendor/gems/express_templates/test/components/configurable_test.rb +0 -140
- data/vendor/gems/express_templates/test/components/forms/basic_fields_test.rb +0 -158
- data/vendor/gems/express_templates/test/components/forms/checkbox_test.rb +0 -51
- data/vendor/gems/express_templates/test/components/forms/express_form_test.rb +0 -62
- data/vendor/gems/express_templates/test/components/forms/radio_test.rb +0 -112
- data/vendor/gems/express_templates/test/components/forms/select_test.rb +0 -129
- data/vendor/gems/express_templates/test/components/forms/submit_test.rb +0 -36
- data/vendor/gems/express_templates/test/components/tree_for_test.rb +0 -70
- data/vendor/gems/express_templates/test/core_extensions/proc_test.rb +0 -90
- data/vendor/gems/express_templates/test/core_extensions/string_test.rb +0 -20
- data/vendor/gems/express_templates/test/dummy/Rakefile +0 -6
- data/vendor/gems/express_templates/test/dummy/app/assets/javascripts/application.js +0 -13
- data/vendor/gems/express_templates/test/dummy/app/assets/stylesheets/application.css +0 -15
- data/vendor/gems/express_templates/test/dummy/app/controllers/application_controller.rb +0 -5
- data/vendor/gems/express_templates/test/dummy/app/controllers/hello_controller.rb +0 -5
- data/vendor/gems/express_templates/test/dummy/app/helpers/application_helper.rb +0 -2
- data/vendor/gems/express_templates/test/dummy/app/views/hello/show.html.et +0 -6
- data/vendor/gems/express_templates/test/dummy/app/views/layouts/application.html.et +0 -15
- data/vendor/gems/express_templates/test/dummy/bin/bundle +0 -3
- data/vendor/gems/express_templates/test/dummy/bin/rails +0 -4
- data/vendor/gems/express_templates/test/dummy/bin/rake +0 -4
- data/vendor/gems/express_templates/test/dummy/config/application.rb +0 -26
- data/vendor/gems/express_templates/test/dummy/config/boot.rb +0 -5
- data/vendor/gems/express_templates/test/dummy/config/environment.rb +0 -5
- data/vendor/gems/express_templates/test/dummy/config/environments/development.rb +0 -37
- data/vendor/gems/express_templates/test/dummy/config/environments/production.rb +0 -82
- data/vendor/gems/express_templates/test/dummy/config/environments/test.rb +0 -40
- data/vendor/gems/express_templates/test/dummy/config/initializers/assets.rb +0 -8
- data/vendor/gems/express_templates/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/vendor/gems/express_templates/test/dummy/config/initializers/cookies_serializer.rb +0 -3
- data/vendor/gems/express_templates/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
- data/vendor/gems/express_templates/test/dummy/config/initializers/inflections.rb +0 -16
- data/vendor/gems/express_templates/test/dummy/config/initializers/mime_types.rb +0 -4
- data/vendor/gems/express_templates/test/dummy/config/initializers/session_store.rb +0 -3
- data/vendor/gems/express_templates/test/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/vendor/gems/express_templates/test/dummy/config/locales/en.yml +0 -23
- data/vendor/gems/express_templates/test/dummy/config/routes.rb +0 -4
- data/vendor/gems/express_templates/test/dummy/config/secrets.yml +0 -22
- data/vendor/gems/express_templates/test/dummy/config.ru +0 -4
- data/vendor/gems/express_templates/test/dummy/public/404.html +0 -67
- data/vendor/gems/express_templates/test/dummy/public/422.html +0 -67
- data/vendor/gems/express_templates/test/dummy/public/500.html +0 -66
- data/vendor/gems/express_templates/test/dummy/public/favicon.ico +0 -0
- data/vendor/gems/express_templates/test/dummy/test/controllers/hello_controller_test.rb +0 -14
- data/vendor/gems/express_templates/test/dummy/test/helpers/hello_helper_test.rb +0 -4
- data/vendor/gems/express_templates/test/express_templates_test.rb +0 -23
- data/vendor/gems/express_templates/test/handler_test.rb +0 -148
- data/vendor/gems/express_templates/test/indenter_test.rb +0 -27
- data/vendor/gems/express_templates/test/interpolator_test.rb +0 -80
- data/vendor/gems/express_templates/test/performance_test.rb +0 -97
- data/vendor/gems/express_templates/test/test_helper.rb +0 -178
- data/vendor/gems/foundation_apps_styles/Gemfile +0 -4
- data/vendor/gems/foundation_apps_styles/LICENSE.txt +0 -21
- data/vendor/gems/foundation_apps_styles/README.md +0 -41
- data/vendor/gems/foundation_apps_styles/Rakefile +0 -13
- data/vendor/gems/foundation_apps_styles/bin/console +0 -14
- data/vendor/gems/foundation_apps_styles/bin/setup +0 -7
- data/vendor/gems/foundation_apps_styles/foundation_apps_styles.gemspec +0 -24
- data/vendor/gems/foundation_apps_styles/lib/foundation_apps_styles/version.rb +0 -3
- data/vendor/gems/foundation_apps_styles/lib/foundation_apps_styles.rb +0 -6
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/account.svg +0 -44
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/action.svg +0 -38
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/ban.svg +0 -17
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/bell.svg +0 -22
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/bookmark.svg +0 -14
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/cart.svg +0 -35
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/chevron.svg +0 -28
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/circle-check.svg +0 -25
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/circle-x.svg +0 -25
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/cog.svg +0 -17
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/comment-square.svg +0 -14
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/dashboard.svg +0 -38
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/document.svg +0 -28
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/envelope.svg +0 -44
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/flag.svg +0 -24
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/home.svg +0 -28
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/lock.svg +0 -55
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/magnifying-glass.svg +0 -26
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/person.svg +0 -62
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/reload.svg +0 -19
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/share-boxed.svg +0 -17
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/star.svg +0 -14
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/thumb.svg +0 -38
- data/vendor/gems/foundation_apps_styles/vendor/assets/iconic/zoom.svg +0 -56
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/_global.scss +0 -131
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/_includes.scss +0 -33
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/_settings.scss +0 -614
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_accordion.scss +0 -72
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_action-sheet.scss +0 -265
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_block-list.scss +0 -360
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_button-group.scss +0 -197
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_button.scss +0 -205
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_card.scss +0 -93
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_extras.scss +0 -54
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_forms.scss +0 -460
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_grid.scss +0 -422
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_iconic.scss +0 -95
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_label.scss +0 -134
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_list.scss +0 -19
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_menu-bar.scss +0 -382
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_modal.scss +0 -129
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_motion.scss +0 -525
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_notification.scss +0 -207
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_off-canvas.scss +0 -169
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_panel.scss +0 -134
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_popup.scss +0 -68
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_switch.scss +0 -134
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_tabs.scss +0 -100
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_title-bar.scss +0 -135
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_typography.scss +0 -345
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/components/_utilities.scss +0 -160
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/foundation-apps.css +0 -6146
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/foundation.scss +0 -50
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/helpers/_breakpoints.scss +0 -154
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/helpers/_functions.scss +0 -343
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/helpers/_images.scss +0 -19
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/helpers/_mixins.scss +0 -123
- data/vendor/gems/foundation_apps_styles/vendor/assets/stylesheets/vendor/_normalize.scss +0 -424
data/vendor/gems/express_templates/lib/express_templates/components/capabilities/resourceful.rb
DELETED
@@ -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
|