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