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
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
source "https://rubygems.org"
|
|
2
|
-
|
|
3
|
-
# Declare your gem's dependencies in express_templates.gemspec.
|
|
4
|
-
# Bundler will treat runtime dependencies like base dependencies, and
|
|
5
|
-
# development dependencies will be added by default to the :development group.
|
|
6
|
-
gemspec
|
|
7
|
-
|
|
8
|
-
# Declare any dependencies that are still in development here instead of in
|
|
9
|
-
# your gemspec. These might include edge Rails or gems from your path or
|
|
10
|
-
# Git. Remember to move these dependencies to your gemspec before releasing
|
|
11
|
-
# your gem to rubygems.org.
|
|
12
|
-
|
|
13
|
-
# To use debugger
|
|
14
|
-
# gem 'debugger'
|
|
15
|
-
gem 'pry-byebug'
|
|
16
|
-
gem 'minitest-reporters'
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
The MIT License (MIT)
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2014 ÆLOGICA | Build it better here.
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
# ExpressTemplates
|
|
2
|
-
|
|
3
|
-
Provides a DSL for HTML templates using a declarative style of Ruby as an alternative to Erb or HAML.
|
|
4
|
-
|
|
5
|
-
Although originally we implemented our own DSL and used a code generation approach,
|
|
6
|
-
this gem now uses [ActiveAdmin's arbre](https://github.com/activeadmin/arbre). Arbre is widely
|
|
7
|
-
used as part of ActiveAdmin, has a long history and many contributors and is conceptually much simpler.
|
|
8
|
-
|
|
9
|
-
## Usage
|
|
10
|
-
|
|
11
|
-
Add this to your gemfile:
|
|
12
|
-
|
|
13
|
-
```ruby
|
|
14
|
-
gem 'express_templates'
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
Rename your application.html.erb to application.html.et.
|
|
18
|
-
|
|
19
|
-
Change your template to look like this.
|
|
20
|
-
|
|
21
|
-
```ruby
|
|
22
|
-
html(lang: "en") {
|
|
23
|
-
head {
|
|
24
|
-
meta charset: 'utf-8'
|
|
25
|
-
meta name: 'viewport', content: "width=device-width, initial-scale=1.0"
|
|
26
|
-
title {
|
|
27
|
-
content_for(:title)
|
|
28
|
-
}
|
|
29
|
-
stylesheet_link_tag "application", media: 'all', 'data-turbolinks-track' => true
|
|
30
|
-
csrf_meta_tags
|
|
31
|
-
}
|
|
32
|
-
body {
|
|
33
|
-
current_arbre_element.add_child yield
|
|
34
|
-
javascript_include_tag "application"
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
Everything should work as you would expect.
|
|
40
|
-
|
|
41
|
-
Set your editor syntax for .et files to Ruby.
|
|
42
|
-
|
|
43
|
-
You can now utilize components which are found with documentation and examples in <tt>ExpressTemplates::Components</tt>.
|
|
44
|
-
|
|
45
|
-
Components are the real strength of both arbre and express_templates.
|
|
46
|
-
|
|
47
|
-
express_templates now *is* arbre + some components + some conventions. ExpressTemplates::Components::Base provides a little syntactic sugar in the form of the emits class method.
|
|
48
|
-
|
|
49
|
-
In terms of conventions, we use brace blocks { } to indicate html structure and do/end blocks to indicate control flow.
|
|
50
|
-
|
|
51
|
-
Control flow should only be used in Components. This is currently not enforced but it will be in the future.
|
|
52
|
-
|
|
53
|
-
The purpose of express_templates is to provide a foundation for a library of reusable UX components which we can enhance for drag-and-drop style UX construction and template editing.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
## Block Structure
|
|
57
|
-
|
|
58
|
-
ExpressTemplates use Ruby's block structure and execution order to indicate parent-child relationships and to build the tree structure that ultimately results in nodes in the DOM.
|
|
59
|
-
|
|
60
|
-
Example:
|
|
61
|
-
|
|
62
|
-
```ruby
|
|
63
|
-
ul {
|
|
64
|
-
li { "one" }
|
|
65
|
-
li "two"
|
|
66
|
-
li %Q(#{@three})
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
Let us suppose that an @three variable exists in the view context with the value "three". This would yield the following markup:
|
|
71
|
-
|
|
72
|
-
```html
|
|
73
|
-
<ul>
|
|
74
|
-
<li>one</li>
|
|
75
|
-
<li>two</li>
|
|
76
|
-
<li>three</li>
|
|
77
|
-
</ul>
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## Components
|
|
81
|
-
|
|
82
|
-
Given the constraint that logic must not go in the template, where does one put it? The answer is we make a component!
|
|
83
|
-
|
|
84
|
-
ExpressTemplates provide a framework for construction of components by encapsulating common logic patterns found in view code into Capabilities which Components may include. These Capabilities form a DSL which allows Components to be built in a declarative fashion. This makes them "low-cost" entities to construct in terms of developer time.
|
|
85
|
-
|
|
86
|
-
A common need is for a list items such as in the above example to be generated from a collection or array of data. Let us suppose we expect the view context to have:
|
|
87
|
-
|
|
88
|
-
```ruby
|
|
89
|
-
@list = %w(one two three)
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
We can make a simple component like so:
|
|
93
|
-
|
|
94
|
-
```ruby
|
|
95
|
-
class ListComponent < ExpressTemplates::Components::Base
|
|
96
|
-
emits -> {
|
|
97
|
-
ul {
|
|
98
|
-
# assumes view provides list
|
|
99
|
-
list.each do |item|
|
|
100
|
-
li {
|
|
101
|
-
item
|
|
102
|
-
}
|
|
103
|
-
end
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
end
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
This would be used in a view template just as if it were a tag, like so:
|
|
110
|
-
|
|
111
|
-
```ruby
|
|
112
|
-
div(class: "active") {
|
|
113
|
-
list_component
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
Now when the template renders, it will yield:
|
|
118
|
-
|
|
119
|
-
```html
|
|
120
|
-
<div class="active">
|
|
121
|
-
<ul>
|
|
122
|
-
<li>one</li>
|
|
123
|
-
<li>two</li>
|
|
124
|
-
<li>three</li>
|
|
125
|
-
</ul>
|
|
126
|
-
</div>
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## Background
|
|
130
|
-
|
|
131
|
-
ExpressTemplates is a key part of the AppExpress platform at [appexpress.io](http://appexpress.io).
|
|
132
|
-
|
|
133
|
-
This project rocks and uses MIT-LICENSE.
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
begin
|
|
2
|
-
require 'bundler/setup'
|
|
3
|
-
rescue LoadError
|
|
4
|
-
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
require 'rdoc/task'
|
|
8
|
-
|
|
9
|
-
RDoc::Task.new(:rdoc) do |rdoc|
|
|
10
|
-
rdoc.rdoc_dir = 'rdoc'
|
|
11
|
-
rdoc.title = 'ExpressTemplates'
|
|
12
|
-
rdoc.options << '--line-numbers'
|
|
13
|
-
rdoc.rdoc_files.include('README.rdoc')
|
|
14
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Bundler::GemHelper.install_tasks
|
|
21
|
-
|
|
22
|
-
require 'rake/testtask'
|
|
23
|
-
|
|
24
|
-
Rake::TestTask.new(:test) do |t|
|
|
25
|
-
t.libs << 'lib'
|
|
26
|
-
t.libs << 'test'
|
|
27
|
-
t.pattern = 'test/**/*_test.rb'
|
|
28
|
-
t.verbose = false
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
task default: :test
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
$:.push File.expand_path("../lib", __FILE__)
|
|
2
|
-
|
|
3
|
-
# Maintain your gem's version:
|
|
4
|
-
require "express_templates/version"
|
|
5
|
-
|
|
6
|
-
# Describe your gem and declare its dependencies:
|
|
7
|
-
Gem::Specification.new do |s|
|
|
8
|
-
s.name = "express_templates"
|
|
9
|
-
s.version = ExpressTemplates::VERSION
|
|
10
|
-
s.authors = ["Steven Talcott Smith", "Eumir Gaspar"]
|
|
11
|
-
s.email = ["steve@aelogica.com", "eumir@aelogica.com"]
|
|
12
|
-
s.homepage = "https://github.com/aelogica/express_templates"
|
|
13
|
-
s.summary = "Write HTML templates in declarative Ruby. Create reusable view components."
|
|
14
|
-
s.description = "Replace Erb/HAML/Slim with ExpressTemplates and write templates in a declartive style of Ruby. With ExpressTemplates you may easily create a library of components for use across projects."
|
|
15
|
-
s.license = "MIT"
|
|
16
|
-
|
|
17
|
-
s.files = Dir["{app,config,db,lib}/**/*", "LICENSE", "Rakefile", "README.md"]
|
|
18
|
-
s.test_files = Dir["test/**/*"] - Dir["test/log/*", "test/tmp/*", "test/dummy/tmp/**/*", "test/dummy/log/*"]
|
|
19
|
-
|
|
20
|
-
s.add_dependency "activesupport", "~> 4.2" # strictly speaking we only depend on active support
|
|
21
|
-
s.add_dependency "parslet", "~> 1.6"
|
|
22
|
-
s.add_dependency "arbre", "~> 1.0"
|
|
23
|
-
|
|
24
|
-
s.add_development_dependency "rails", "~> 4.2"
|
|
25
|
-
s.add_development_dependency "pry", "~> 0"
|
|
26
|
-
s.add_development_dependency "erubis", "~> 2.7"
|
|
27
|
-
s.add_development_dependency "haml", "~> 4.0"
|
|
28
|
-
s.add_development_dependency "better_errors", "~> 2.0"
|
|
29
|
-
s.add_development_dependency "binding_of_caller", "~> 0.7"
|
|
30
|
-
s.add_development_dependency "pry-stack_explorer", "~> 0.4"
|
|
31
|
-
s.add_development_dependency "minitest-line"
|
|
32
|
-
end
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
module Arbre
|
|
2
|
-
class Context
|
|
3
|
-
def resource
|
|
4
|
-
helpers.resource
|
|
5
|
-
end
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
class Element
|
|
9
|
-
|
|
10
|
-
module BuilderMethods
|
|
11
|
-
|
|
12
|
-
# we do not want to check the arity of the
|
|
13
|
-
# block in express templates because components
|
|
14
|
-
# are expected to be able to contain other components or template code
|
|
15
|
-
# without use of a builder style syntax
|
|
16
|
-
def build_tag(klass, *args, &block)
|
|
17
|
-
tag = klass.new(arbre_context)
|
|
18
|
-
tag.parent = current_arbre_element
|
|
19
|
-
|
|
20
|
-
with_current_arbre_element tag do
|
|
21
|
-
tag.build(*args, &block)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
tag
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def possible_route_proxy(name)
|
|
29
|
-
if helpers.controller.class.parent &&
|
|
30
|
-
helpers.respond_to?(namespace = helpers.controller.class.parent.to_s.underscore)
|
|
31
|
-
if (route_proxy = helpers.send(namespace)).respond_to?(name)
|
|
32
|
-
return route_proxy
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
return nil
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# Implements the method lookup chain. When you call a method that
|
|
39
|
-
# doesn't exist, we:
|
|
40
|
-
#
|
|
41
|
-
# 1. Try to call the method on the current DOM context
|
|
42
|
-
# 2. Return an assigned variable of the same name
|
|
43
|
-
# 3. Call the method on the helper object
|
|
44
|
-
# 4. Call super
|
|
45
|
-
#
|
|
46
|
-
def method_missing(name, *args, &block)
|
|
47
|
-
if current_arbre_element.respond_to?(name)
|
|
48
|
-
current_arbre_element.send name, *args, &block
|
|
49
|
-
elsif assigns && assigns.has_key?(name.to_sym)
|
|
50
|
-
assigns[name.to_sym]
|
|
51
|
-
elsif helpers.respond_to?(name)
|
|
52
|
-
helper_method(name, *args, &block)
|
|
53
|
-
elsif route_proxy = possible_route_proxy(name)
|
|
54
|
-
route_proxy.send(name, *args, &block)
|
|
55
|
-
else
|
|
56
|
-
super
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# In order to not pollute our templates with helpers. prefixed
|
|
61
|
-
# everywhere we want to try to distinguish helpers that are almost
|
|
62
|
-
# always used as parameters to other methods such as path helpers
|
|
63
|
-
# and not add them as elements
|
|
64
|
-
def helper_method(name, *args, &block)
|
|
65
|
-
if name.match /_path$/
|
|
66
|
-
helpers.send(name, *args, &block)
|
|
67
|
-
elsif (const_get([name, 'engine'].join('/').classify) rescue nil)
|
|
68
|
-
helpers.send(name, *args, &block)
|
|
69
|
-
else
|
|
70
|
-
current_arbre_element.add_child helpers.send(name, *args, &block)
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
end
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
require 'ripper'
|
|
2
|
-
require 'pp'
|
|
3
|
-
class Proc
|
|
4
|
-
|
|
5
|
-
TLAMBEG = [:on_tlambeg, "{"]
|
|
6
|
-
TLAMBDA = [:on_tlambda, "->"]
|
|
7
|
-
LBRACE = [:on_lbrace, '{']
|
|
8
|
-
|
|
9
|
-
TOKEN_PAIRS = {LBRACE => [:on_rbrace, '}'],
|
|
10
|
-
[:on_kw, 'do'] => [:on_kw, 'end'],
|
|
11
|
-
TLAMBDA => [:on_rbrace, '}']}
|
|
12
|
-
|
|
13
|
-
# Make a best effort to provide the original source for a block
|
|
14
|
-
# based on extracting a string from the file identified in
|
|
15
|
-
# Proc#source_location using Ruby's tokenizer.
|
|
16
|
-
#
|
|
17
|
-
# This works for first block declared on a line in a source
|
|
18
|
-
# file. If additional blocks are specified inside the first block
|
|
19
|
-
# on the same line as the start of the block, only the outer-most
|
|
20
|
-
# block declaration will be identified as a the block we want.
|
|
21
|
-
#
|
|
22
|
-
# If you require only the source of blocks-within-other-blocks, start them
|
|
23
|
-
# on a new line as would be best practice for clarity and readability.
|
|
24
|
-
def source
|
|
25
|
-
@source ||= begin
|
|
26
|
-
file, line_no = source_location
|
|
27
|
-
raise "no file provided by source_location: #{self}" if file.nil?
|
|
28
|
-
raise "no line number provided for source_location: #{self}" if line_no.nil?
|
|
29
|
-
tokens = Ripper.lex File.read(file)
|
|
30
|
-
tokens_on_line = tokens.select {|pos, lbl, str| pos[0].eql?(line_no) }
|
|
31
|
-
starting_token = tokens_on_line.detect do |pos, lbl, str|
|
|
32
|
-
TOKEN_PAIRS.keys.include?([lbl, str]) &&
|
|
33
|
-
_actually_starting_a_proc?(tokens, [pos, lbl, str])
|
|
34
|
-
end
|
|
35
|
-
starting_token_type = [starting_token[1], starting_token[2]]
|
|
36
|
-
ending_token_type = TOKEN_PAIRS[starting_token_type]
|
|
37
|
-
source_str = ""
|
|
38
|
-
remaining_tokens = tokens[tokens.index(starting_token)..-1]
|
|
39
|
-
nesting = -1
|
|
40
|
-
starting_nesting_token_types = if [TLAMBDA, LBRACE].include?(starting_token_type)
|
|
41
|
-
[TLAMBDA, LBRACE]
|
|
42
|
-
else
|
|
43
|
-
[starting_token_type]
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
while token = remaining_tokens.shift
|
|
47
|
-
token = [token[1], token[2]] # strip position
|
|
48
|
-
source_str << token[1]
|
|
49
|
-
nesting += 1 if starting_nesting_token_types.include? token
|
|
50
|
-
is_ending_token = token.eql?(ending_token_type)
|
|
51
|
-
break if is_ending_token && nesting.eql?(0)
|
|
52
|
-
nesting -= 1 if is_ending_token
|
|
53
|
-
end
|
|
54
|
-
source_str
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def _actually_starting_a_proc?(tokens, tok)
|
|
59
|
-
return true if tokens.index(tok).eql?(0)
|
|
60
|
-
look_back = tokens.slice(0..tokens.index(tok)-1)
|
|
61
|
-
look_back.pop if look_back.last.try(:[], 1).eql? :on_sp
|
|
62
|
-
if [:on_tlambeg, :on_tlambda].include?(tok[1])
|
|
63
|
-
true
|
|
64
|
-
else
|
|
65
|
-
![:on_comma, :on_lparen, :on_label].include?(look_back.last.try(:[], 1))
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# Examines the source of a proc to extract the body by
|
|
70
|
-
# removing the outermost block delimiters and any surrounding.
|
|
71
|
-
# whitespace.
|
|
72
|
-
#
|
|
73
|
-
# Raises exception if the block takes arguments.
|
|
74
|
-
#
|
|
75
|
-
def source_body
|
|
76
|
-
raise "Cannot extract proc body on non-zero arity" unless arity.eql?(0)
|
|
77
|
-
tokens = Ripper.lex source
|
|
78
|
-
body_start_idx = 2
|
|
79
|
-
body_end_idx = -1
|
|
80
|
-
if tokens[0][1].eql?(:on_tlambda)
|
|
81
|
-
body_start_idx = tokens.index(tokens.detect { |t| t[1].eql?(:on_tlambeg) }) + 1
|
|
82
|
-
end
|
|
83
|
-
body_tokens = tokens[body_start_idx..-1]
|
|
84
|
-
|
|
85
|
-
body_tokens.pop # ending token of proc
|
|
86
|
-
# remove trailing whitespace
|
|
87
|
-
whitespace = [:on_sp, :on_nl, :on_ignored_nl]
|
|
88
|
-
body_tokens.pop while whitespace.include?(body_tokens[-1][1])
|
|
89
|
-
# remove leading whitespace
|
|
90
|
-
body_tokens.shift while whitespace.include?(body_tokens[0][1])
|
|
91
|
-
|
|
92
|
-
# put them back together
|
|
93
|
-
body_tokens.map {|token| token[2] }.join
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def self.from_source(prc_src)
|
|
97
|
-
raise ArgumentError unless prc_src.kind_of?(String)
|
|
98
|
-
prc = eval(prc_src)
|
|
99
|
-
prc.instance_variable_set(:@source, prc_src)
|
|
100
|
-
prc
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
end
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# We use Hash#inspect in ExpressTemplates::Markup::Wrapper to reproduce arguments
|
|
2
|
-
# to helpers in the Rails view.
|
|
3
|
-
#
|
|
4
|
-
# Hash#inspect calls #inspect on values and keys. This allows us to
|
|
5
|
-
# place the resulting string into the view code with a simple substitution
|
|
6
|
-
# or concatenation.
|
|
7
|
-
#
|
|
8
|
-
# In special cases, however, we might want the argument or one of its keys
|
|
9
|
-
# or values to be the result of evaluating of a ruby expression in the view
|
|
10
|
-
# that does not itself return a String. The result of #inspect
|
|
11
|
-
# is normally a quoted and escaped string which would evaluate to a string
|
|
12
|
-
# in the view. What we want is a simple string of code. Here we provide
|
|
13
|
-
# a method that overrides #inspect in the strings eigenclass to strip off
|
|
14
|
-
# enclosing quotes or unwanted escapes. It shouldn't bother anybody and
|
|
15
|
-
# it keeps us from doing messy things elsewhere for now.
|
|
16
|
-
class String
|
|
17
|
-
def to_view_code
|
|
18
|
-
class << self
|
|
19
|
-
def inspect
|
|
20
|
-
super.gsub(/^"(.*)"$/,'\1')
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
return self
|
|
24
|
-
end
|
|
25
|
-
end
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
module ExpressTemplates
|
|
2
|
-
module Compiler
|
|
3
|
-
def compile(template_or_src=nil, &block)
|
|
4
|
-
|
|
5
|
-
template, src = _normalize(template_or_src)
|
|
6
|
-
|
|
7
|
-
%Q[assigns.merge!(template_virtual_path: @virtual_path) ; Arbre::Context.new(assigns, self) { #{src || block.source_body} }.to_s]
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
private
|
|
11
|
-
def _normalize(template_or_src)
|
|
12
|
-
template, src = nil, nil
|
|
13
|
-
if template_or_src.respond_to?(:source)
|
|
14
|
-
template = template_or_src
|
|
15
|
-
src = template_or_src.source
|
|
16
|
-
else
|
|
17
|
-
src = template_or_src
|
|
18
|
-
end
|
|
19
|
-
return template, src
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
module ExpressTemplates
|
|
2
|
-
module Components
|
|
3
|
-
module Presenters
|
|
4
|
-
class All < Container
|
|
5
|
-
|
|
6
|
-
has_argument :id, "Name of the collection", as: :collection_name, type: :symbol
|
|
7
|
-
|
|
8
|
-
contains -> (&block) {
|
|
9
|
-
prepended
|
|
10
|
-
collection.each do |item|
|
|
11
|
-
assigns[member_name.to_sym] = item
|
|
12
|
-
block.call(self) if block
|
|
13
|
-
end
|
|
14
|
-
appended
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
def member_name
|
|
18
|
-
config[:collection_name].to_s.singularize.to_sym
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def collection
|
|
22
|
-
self.send(config[:collection_name])
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
capabilities = Dir.glob(File.join(File.dirname(__FILE__), 'capabilities', '*.rb'))
|
|
2
|
-
capabilities.each {|capability| require capability}
|
|
3
|
-
|
|
4
|
-
module ExpressTemplates
|
|
5
|
-
# Components provide self-contained reusable view code meant to be shared
|
|
6
|
-
# within a project or across many projects through a library of components
|
|
7
|
-
#
|
|
8
|
-
module Components
|
|
9
|
-
|
|
10
|
-
# Components::Base is the base class for ExpressTemplates view components.
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
class Base < Arbre::Component
|
|
14
|
-
|
|
15
|
-
class_attribute :before_build_hooks
|
|
16
|
-
self.before_build_hooks = []
|
|
17
|
-
|
|
18
|
-
class_attribute :builder_method_name
|
|
19
|
-
|
|
20
|
-
# mark a component as abstract ie. can't be used
|
|
21
|
-
# in Express Designer
|
|
22
|
-
#
|
|
23
|
-
@is_abstract = false
|
|
24
|
-
|
|
25
|
-
def self.abstract_component(value = true)
|
|
26
|
-
@is_abstract = value
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def self.abstract_component?
|
|
30
|
-
@is_abstract
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
abstract_component
|
|
34
|
-
|
|
35
|
-
# define the parent componennt ie. can't be used
|
|
36
|
-
# in Express Designer unless parent is present
|
|
37
|
-
#
|
|
38
|
-
@parent_component = nil
|
|
39
|
-
|
|
40
|
-
def self.require_parent(component)
|
|
41
|
-
raise "must pass a sublcass of ExpressTemplates::Components::Base" if !component.kind_of? ExpressTemplates::Components::Base
|
|
42
|
-
@parent_component = component
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def self.required_parent
|
|
46
|
-
@parent_component
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def self.builder_method_and_class(method_name, klass)
|
|
50
|
-
Arbre::Element::BuilderMethods.class_eval <<-EOF, __FILE__, __LINE__
|
|
51
|
-
def #{method_name}(*args, &block)
|
|
52
|
-
insert_tag ::#{klass.name}, *args, &block
|
|
53
|
-
end
|
|
54
|
-
EOF
|
|
55
|
-
self.builder_method_name = method_name
|
|
56
|
-
# puts "added #{method_name} -> #{klass.name}"
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def initialize(*)
|
|
60
|
-
super
|
|
61
|
-
_default_attributes.each do |name, value|
|
|
62
|
-
set_attribute(name, value)
|
|
63
|
-
end
|
|
64
|
-
add_class _default_classes
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def self.contains(proc = nil, &block)
|
|
68
|
-
define_method(:_build_body, &(proc || block))
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# Override the tag_name method for other than <div>
|
|
72
|
-
def self.tag(tag)
|
|
73
|
-
define_method(:tag_name) { tag }
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
# Provide default attributes for the enclosing tag
|
|
77
|
-
# of the component
|
|
78
|
-
def self.has_attributes(attribs)
|
|
79
|
-
self._default_classes = attribs.delete(:class)
|
|
80
|
-
_default_attributes.merge!(attribs)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def self.before_build(proc_or_symbol = nil, exclusive: false, &block)
|
|
84
|
-
hook = (proc_or_symbol || block)
|
|
85
|
-
unless hook.kind_of?(Symbol) or hook.respond_to?(:call)
|
|
86
|
-
raise "before_build requires symbol (method_name), proc or block"
|
|
87
|
-
end
|
|
88
|
-
if exclusive
|
|
89
|
-
self.before_build_hooks = [hook]
|
|
90
|
-
else
|
|
91
|
-
self.before_build_hooks += [hook]
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def build(*args, &block)
|
|
96
|
-
_extract_class!(args)
|
|
97
|
-
_run_before_build_hooks
|
|
98
|
-
super(*args) {
|
|
99
|
-
_build_body(&block) if respond_to?(:_build_body)
|
|
100
|
-
}
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def resource
|
|
104
|
-
helpers.resource
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def self.inherited(subclass)
|
|
108
|
-
subclass.builder_method_and_class subclass.to_s.demodulize.underscore, subclass
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
def self.builder_method(name)
|
|
112
|
-
builder_method_and_class name, self
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
def self.descendants
|
|
116
|
-
ObjectSpace.each_object(Class).select { |klass| klass < self }
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
protected
|
|
120
|
-
def default_class_name
|
|
121
|
-
self.class.name.demodulize.underscore.dasherize
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
private
|
|
126
|
-
def _run_before_build_hooks
|
|
127
|
-
before_build_hooks.each do |hook|
|
|
128
|
-
if hook.kind_of?(Symbol)
|
|
129
|
-
self.send(hook)
|
|
130
|
-
else
|
|
131
|
-
instance_exec &hook
|
|
132
|
-
end
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
def _extract_class!(args)
|
|
136
|
-
add_class args.last.delete(:class) if args.last.try(:kind_of?, Hash)
|
|
137
|
-
end
|
|
138
|
-
def _default_attributes
|
|
139
|
-
self.class._default_attributes
|
|
140
|
-
end
|
|
141
|
-
def self._default_attributes
|
|
142
|
-
@default_attributes ||= {}
|
|
143
|
-
end
|
|
144
|
-
def _default_classes
|
|
145
|
-
self.class._default_classes
|
|
146
|
-
end
|
|
147
|
-
def self._default_classes
|
|
148
|
-
@default_classes ||= ''
|
|
149
|
-
end
|
|
150
|
-
def self._default_classes=(classes)
|
|
151
|
-
@default_classes = classes
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
end
|
|
155
|
-
end
|
|
156
|
-
end
|