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,67 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
class BaseTest < ActiveSupport::TestCase
|
|
4
|
-
|
|
5
|
-
class Context
|
|
6
|
-
def assigns
|
|
7
|
-
{}
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def render(&block)
|
|
12
|
-
ExpressTemplates.render(Context.new, &block)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
class UnorderedList < ExpressTemplates::Components::Base
|
|
16
|
-
tag :ul
|
|
17
|
-
|
|
18
|
-
has_attributes :class => 'something',
|
|
19
|
-
'data-foo' => 'something-else'
|
|
20
|
-
|
|
21
|
-
contains {
|
|
22
|
-
li { "Some stuff" }
|
|
23
|
-
}
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
test ".tag_name determines the enclosing tag" do
|
|
27
|
-
assert_match /^\<ul/, render { unordered_list }
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
test ".has_attributes creates default attributes" do
|
|
31
|
-
assert_match /class="[^"]*something[^"]*"/, render { unordered_list }
|
|
32
|
-
assert_match /data-foo="[^"]*something-else[^"]*"/, render { unordered_list }
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
test ".contains places fragment inside the enclosing tag" do
|
|
36
|
-
markup = render { unordered_list }
|
|
37
|
-
assert_match /\<ul.*\<li.*\/li\>.*\/ul\>/, markup.gsub("\n", '')
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
test "class name is dasherized instead of underscored" do
|
|
41
|
-
assert_match /class="[^"]*unordered-list[^"]*"/, render { unordered_list }
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
test "options are passed to html attributes" do
|
|
45
|
-
assert_match /rows="5"/, render { unordered_list(rows: 5) }
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
test "class option adds a class, does not override" do
|
|
49
|
-
markup = render { unordered_list(class: 'extra') }
|
|
50
|
-
assert_match /class="[^"]*something[^"]*"/, markup
|
|
51
|
-
assert_match /class="[^"]*unordered-list[^"]*"/, markup
|
|
52
|
-
assert_match /class="[^"]*extra[^"]*"/, markup
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
class BeforeBuildHook < ExpressTemplates::Components::Base
|
|
56
|
-
before_build :add_my_foo
|
|
57
|
-
|
|
58
|
-
def add_my_foo
|
|
59
|
-
set_attribute('data-foo', 'bar')
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
test "before_build hook runs before build" do
|
|
64
|
-
assert_match /data-foo="bar"/, render { before_build_hook }
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
end
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
module AdminModule
|
|
4
|
-
module Engine
|
|
5
|
-
end
|
|
6
|
-
class SmartThing < ExpressTemplates::Components::Configurable
|
|
7
|
-
include ExpressTemplates::Components::Capabilities::Resourceful
|
|
8
|
-
|
|
9
|
-
attr_accessor :virtual_path, :config
|
|
10
|
-
|
|
11
|
-
def initialize(virtual_path, config = {})
|
|
12
|
-
@virtual_path = virtual_path
|
|
13
|
-
@config = config
|
|
14
|
-
@args = [self]
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def template_virtual_path
|
|
18
|
-
@virtual_path
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
module Admin; end
|
|
24
|
-
|
|
25
|
-
class FooBar; end
|
|
26
|
-
|
|
27
|
-
class Something; end
|
|
28
|
-
|
|
29
|
-
module ExpressTemplates
|
|
30
|
-
|
|
31
|
-
class ResourcefulTest < ActiveSupport::TestCase
|
|
32
|
-
test 'infers namespace and path prefix within an engine and scope' do
|
|
33
|
-
smart_thing = AdminModule::SmartThing.new('admin_module/admin/something/index')
|
|
34
|
-
assert_equal 'admin_module', smart_thing.namespace
|
|
35
|
-
assert_equal 'admin', smart_thing.path_prefix
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
test 'infers a namespace and no prefix within an engine' do
|
|
39
|
-
# if defined? ExpressFoo::Engine
|
|
40
|
-
smart_thing = AdminModule::SmartThing.new('admin_module/something/index')
|
|
41
|
-
assert_equal 'admin_module', smart_thing.namespace
|
|
42
|
-
assert_equal nil, smart_thing.path_prefix
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
test 'no namespace, infers prefix within a scope within an app' do
|
|
46
|
-
# else of case above
|
|
47
|
-
smart_thing = AdminModule::SmartThing.new('admin/something/index')
|
|
48
|
-
assert_equal nil, smart_thing.namespace
|
|
49
|
-
assert_equal 'admin', smart_thing.path_prefix
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
test 'no namespace, no prefix within an app' do
|
|
53
|
-
smart_thing = AdminModule::SmartThing.new('somethings/index')
|
|
54
|
-
assert_equal nil, smart_thing.namespace
|
|
55
|
-
assert_equal nil, smart_thing.path_prefix
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
test "#resource_class returns resource_class option if specified" do
|
|
59
|
-
assert_equal FooBar, AdminModule::SmartThing.new('somethings/index', resource_class: 'FooBar').resource_class
|
|
60
|
-
assert_equal Something, AdminModule::SmartThing.new('somethings/index', id: :something).resource_class
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
class ConfigurableTest < ActiveSupport::TestCase
|
|
4
|
-
|
|
5
|
-
class Context
|
|
6
|
-
def assigns
|
|
7
|
-
{}
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def render(&block)
|
|
12
|
-
ExpressTemplates.render(Context.new, &block)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
ETCC = ExpressTemplates::Components::Configurable
|
|
16
|
-
|
|
17
|
-
class ConfigurableComponent < ETCC
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
test "renders first argument as dom id" do
|
|
21
|
-
assert_match /id="foo"/, render { configurable_component(:foo) }
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
test "has no id attribute if not specified" do
|
|
25
|
-
assert_no_match /id="foo"/, render { configurable_component }
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
class ConfigWithOption < ETCC
|
|
29
|
-
has_option :thing, 'Something about things'
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
test "supports option declaration" do
|
|
33
|
-
markup = render { config_with_option }
|
|
34
|
-
assert_equal %Q(<div class="config-with-option"></div>\n), markup
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
test "does not pass declared options as html attributes" do
|
|
38
|
-
markup = render { config_with_option(thing: 'whatever') }
|
|
39
|
-
assert_equal %Q(<div class="config-with-option"></div>\n), markup
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
test "unrecognized options raises an exception" do
|
|
43
|
-
assert_raises(ArgumentError) do
|
|
44
|
-
class ConfigWithUnrecognizedOptions < ETCC
|
|
45
|
-
has_option :title, 'asdfasdf', something_unrecognized: 'whatever'
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
class ConfigWithDefaultOption < ETCC
|
|
51
|
-
has_option :rows, 'Number of rows', type: :integer, default: 5, attribute: true
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
test "default values are supported" do
|
|
55
|
-
markup = render { config_with_default_option }
|
|
56
|
-
assert_equal %Q(<div class="config-with-default-option" rows="5"></div>\n), markup
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
test "default values for attributes can be overridden" do
|
|
60
|
-
markup = render { config_with_default_option(rows: 999) }
|
|
61
|
-
assert_equal %Q(<div class="config-with-default-option" rows="999"></div>\n), markup
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
class ConfigWithRequiredOptions < ETCC
|
|
65
|
-
has_option :title, 'adds a title', required: true
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
test "required options are required" do
|
|
69
|
-
assert_raises(RuntimeError) do
|
|
70
|
-
render { config_with_required_options }
|
|
71
|
-
end
|
|
72
|
-
assert render { config_with_required_options(title: 'foo') }
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
class ConfigWithOptionValues < ETCC
|
|
76
|
-
has_option :virtual, 'gets the virtual_attributes of a resource', values: -> (*) { resource_class.virtual_attributes }
|
|
77
|
-
|
|
78
|
-
def resource_class
|
|
79
|
-
OpenStruct.new(virtual_attributes: [:password, :password_confirmation])
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
test "values can be set for options" do
|
|
84
|
-
component = ConfigWithOptionValues.new
|
|
85
|
-
assert_equal [:password, :password_confirmation], component.instance_eval(&ConfigWithOptionValues.new.supported_options[:virtual][:values])
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
class ConfigSubclass < ConfigWithRequiredOptions
|
|
89
|
-
has_option :status, 'something'
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
test "options are inherited" do
|
|
93
|
-
assert_equal [:title, :status], ConfigSubclass.supported_options.keys
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
class ConfigArgument < ETCC
|
|
97
|
-
has_argument :name, "The name.", type: :string
|
|
98
|
-
|
|
99
|
-
has_option :something, "else"
|
|
100
|
-
|
|
101
|
-
contains {
|
|
102
|
-
text_node config[:name]
|
|
103
|
-
}
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
test ".has_argument adds a positional configuration argument" do
|
|
107
|
-
assert_equal :name, ConfigArgument.new.supported_arguments.keys.last
|
|
108
|
-
assert_equal "The name.", ConfigArgument.new.supported_arguments.values.last[:description]
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
test ".has_argument makes builder arguments accessible by name according to position" do
|
|
112
|
-
html = render &-> {
|
|
113
|
-
config_argument :bar, 'Foo'
|
|
114
|
-
}
|
|
115
|
-
assert_match />Foo</, html
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
class ConfigAnotherArgument < ConfigArgument
|
|
119
|
-
has_argument :title, "comes after name", type: :string
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
test ".has_argument appends supported arguments in order of inheritence" do
|
|
123
|
-
assert_equal [:id, :name, :title], ConfigAnotherArgument.new.supported_arguments.keys
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
class ConfigOverwriteId < ConfigArgument
|
|
127
|
-
has_argument :id, 'Should overwrite :id',
|
|
128
|
-
as: :foo, type: :symbol
|
|
129
|
-
contains -> {
|
|
130
|
-
text_node config[:foo]
|
|
131
|
-
}
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
test ".has_argument as: allows overwrite of inherited argument" do
|
|
135
|
-
html = render {
|
|
136
|
-
config_overwrite_id(:whatever, 'Ignore me')
|
|
137
|
-
}
|
|
138
|
-
assert_match /div.*>whatever/, html
|
|
139
|
-
end
|
|
140
|
-
end
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
require 'active_model'
|
|
3
|
-
|
|
4
|
-
class BasicFieldsTest < ActiveSupport::TestCase
|
|
5
|
-
|
|
6
|
-
BASIC_FIELDS = %w(email phone text password color file date datetime
|
|
7
|
-
datetime_local number range
|
|
8
|
-
search telephone time url week)
|
|
9
|
-
|
|
10
|
-
def assigns
|
|
11
|
-
{foo: resource}
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def helpers
|
|
15
|
-
mock_action_view do
|
|
16
|
-
def foos_path
|
|
17
|
-
'/foos'
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def field_type_map
|
|
23
|
-
Hash[BASIC_FIELDS.map {|f| [f, f]}].merge(
|
|
24
|
-
{'phone' => 'tel',
|
|
25
|
-
'telephone' => 'tel',
|
|
26
|
-
'datetime_local' => 'datetime-local' })
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def label_html
|
|
30
|
-
'<label for="foo_bar">Bar</label>'
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
test "all fields work" do
|
|
34
|
-
BASIC_FIELDS.each do |type|
|
|
35
|
-
fragment = -> (ctx) {
|
|
36
|
-
express_form(:foo) {
|
|
37
|
-
send(type, :bar)
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
html = arbre(&fragment)
|
|
41
|
-
assert_match label_html, html
|
|
42
|
-
assert_match(/input.*type="#{field_type_map[type]}"/, html)
|
|
43
|
-
# assert_match "#{type}_field(:foo, :bar, {})", arbre(&fragment)
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
test "passing html options to fields work" do
|
|
48
|
-
options = {style: 'width: 10em;'}
|
|
49
|
-
['email'].each do |type|
|
|
50
|
-
html = arbre {
|
|
51
|
-
express_form(:foo) {
|
|
52
|
-
send(type, :bar, options)
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
assert_match label_html, html
|
|
56
|
-
assert_match /input.*type="#{field_type_map[type]}"/, html
|
|
57
|
-
assert_match /input.*style="width: 10em;"/, html
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
test "textarea uses rails text_area helper" do
|
|
62
|
-
html = arbre {
|
|
63
|
-
express_form(:foo) {
|
|
64
|
-
textarea :bar
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
assert_match label_html, html
|
|
68
|
-
assert_match /<textarea name="foo\[bar\]" id="foo_bar"><\/textarea>/, html.gsub("\n", '')
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
test "textarea passes additional html options to rails helper" do
|
|
72
|
-
html = arbre {
|
|
73
|
-
express_form(:foo) {
|
|
74
|
-
textarea :bar, rows: 5, class: 'tinymce form-field'
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
assert_match label_html, html
|
|
78
|
-
assert_match /<textarea name="foo\[bar\]" id="foo_bar" rows="5" class="tinymce form-field"><\/textarea>/, html.gsub("\n", '')
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
test "hidden uses rails hidden_tag helper" do
|
|
82
|
-
html = arbre {
|
|
83
|
-
express_form(:foo) {
|
|
84
|
-
hidden :bar
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
assert_no_match label_html, html
|
|
88
|
-
assert_match '<input type="hidden"', html
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
test "hidden field passes additional html options to rails helper" do
|
|
92
|
-
html = arbre {
|
|
93
|
-
express_form(:foo) {
|
|
94
|
-
hidden :bar, class: 'hidden form-field', value: 'ninja'
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
assert_no_match label_html, html
|
|
98
|
-
assert_match /<input type="hidden" name="foo\[bar\]" id="foo_bar" value="ninja" class="hidden form-field"/, html
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def resource_with_errors
|
|
102
|
-
mock_resource = resource
|
|
103
|
-
class << mock_resource
|
|
104
|
-
def errors
|
|
105
|
-
errors = ActiveModel::Errors.new(self)
|
|
106
|
-
errors.add(:name, "Can't be Foo")
|
|
107
|
-
errors
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
mock_resource
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def has_error_class
|
|
114
|
-
/div[^>]*class="[^"]*error[^"]*"/
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def has_error_class_on(field, html)
|
|
118
|
-
md = html.match(/(<div[^>]*id="[^"]*#{field}_wrapper[^"]*"[^>]*>)/)
|
|
119
|
-
assert md, "field has no wrapper"
|
|
120
|
-
return !!md[1].match(has_error_class)
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
test "adds error class if there are errors on a field with no input attributes" do
|
|
124
|
-
html_with_error = arbre(foo: resource_with_errors) {
|
|
125
|
-
express_form(:foo) {
|
|
126
|
-
text :name
|
|
127
|
-
text :body
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
assert resource_with_errors.errors.any?
|
|
131
|
-
assert assigns[:foo].errors.any?
|
|
132
|
-
assert has_error_class_on(:name, html_with_error), "name field has no error when expected"
|
|
133
|
-
refute has_error_class_on(:body, html_with_error), "body field has error class when it should not"
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
test "adds error class if there are errors on a field with no class set" do
|
|
137
|
-
html_with_error = arbre(foo: resource_with_errors) {
|
|
138
|
-
express_form(:foo) {
|
|
139
|
-
text :name, value: 'ninja'
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
assert resource_with_errors.errors.any?
|
|
143
|
-
assert assigns[:foo].errors.any?
|
|
144
|
-
assert_match has_error_class, html_with_error
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
test "adds error to class if there are errors on a field with existing class" do
|
|
148
|
-
html_with_error = arbre(foo: resource_with_errors) {
|
|
149
|
-
express_form(:foo) {
|
|
150
|
-
text :name, value: 'ninja', class: 'slug'
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
assert resource_with_errors.errors.any?
|
|
154
|
-
assert assigns[:foo].errors.any?
|
|
155
|
-
assert_match has_error_class, html_with_error
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
end
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
class Account
|
|
4
|
-
end
|
|
5
|
-
|
|
6
|
-
class CheckboxTest < ActiveSupport::TestCase
|
|
7
|
-
|
|
8
|
-
def assigns
|
|
9
|
-
{account: resource}
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def helpers
|
|
13
|
-
mock_action_view do
|
|
14
|
-
def accounts_path
|
|
15
|
-
'/accounts'
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
test "checkbox places the label before the input" do
|
|
22
|
-
html = arbre(account: resource) {
|
|
23
|
-
express_form(:account) {
|
|
24
|
-
checkbox :eula
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
label = '<label for="account_eula"'
|
|
28
|
-
field = 'input type="checkbox" value="1" name="account\[eula\]"'
|
|
29
|
-
assert_match /#{label}/, html
|
|
30
|
-
assert_match /#{field}/, html
|
|
31
|
-
label_idx = html.index(label)
|
|
32
|
-
field_idx = html.index(field.gsub('\\', ''))
|
|
33
|
-
assert (field_idx > label_idx), "label must come first"
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
test "checkbox respects label_after: true " do
|
|
37
|
-
html = arbre(account: resource) {
|
|
38
|
-
express_form(:account) {
|
|
39
|
-
checkbox :eula, label_after: true
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
label = '<label for="account_eula"'
|
|
43
|
-
field = 'input type="checkbox" value="1" name="account\[eula\]"'
|
|
44
|
-
assert_match /#{label}/, html
|
|
45
|
-
assert_match /#{field}/, html
|
|
46
|
-
label_idx = html.index(label)
|
|
47
|
-
field_idx = html.index(field.gsub('\\', ''))
|
|
48
|
-
assert (field_idx < label_idx), "label must come after when label_after: true"
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
end
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
class Foo
|
|
4
|
-
def self.columns ; [] ; end
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
class ExpressFormTest < ActiveSupport::TestCase
|
|
8
|
-
|
|
9
|
-
def simplest_form
|
|
10
|
-
arbre(foo: resource) {
|
|
11
|
-
express_form(:foo) {
|
|
12
|
-
submit value: 'Save it!'
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def helpers
|
|
18
|
-
mock_action_view do
|
|
19
|
-
def foos_path
|
|
20
|
-
'/foos'
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
test "simplest form renders" do
|
|
26
|
-
assert simplest_form
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
test "simplest form will have the proper id" do
|
|
30
|
-
assert_match /<form.*id="foo_1"/, simplest_form
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
test "simplest form contains form tag" do
|
|
34
|
-
assert_match "<form", simplest_form
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
test "express_form contents are inside the form" do
|
|
38
|
-
assert_match /<form.*submit.*\/form>/, simplest_form.gsub("\n",'')
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
test "simplest form contains rails form helpers" do
|
|
42
|
-
compiled_src = simplest_form
|
|
43
|
-
assert_match "input name=\"utf8\" type=\"hidden\"", compiled_src
|
|
44
|
-
assert_match "input type=\"hidden\" name=\"_method\"", compiled_src
|
|
45
|
-
assert_match "name=\"authenticity_token\" value=\"AUTH_TOKEN\"", compiled_src
|
|
46
|
-
assert_match /<form.*authenticity_token.*\/form>/, compiled_src.gsub("\n",'')
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
test "simplest_form contains submit" do
|
|
50
|
-
assert_match '<input type="submit" name="commit" value="Save it!" />', simplest_form
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
test "simplest_form uses form_action for the action" do
|
|
54
|
-
form_open_tag = simplest_form.match(/<form[^>]*>/)[0]
|
|
55
|
-
assert_match 'action="/foos"', form_open_tag
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
test "express_form default method is POST" do
|
|
59
|
-
assert_match 'method="POST"', simplest_form
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
end
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
class RadioTest < ActiveSupport::TestCase
|
|
4
|
-
|
|
5
|
-
def assigns
|
|
6
|
-
{person: ::Person.new}
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def helpers
|
|
10
|
-
mock_action_view do
|
|
11
|
-
def people_path
|
|
12
|
-
'/people'
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def employees_path
|
|
16
|
-
'/employees'
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
test "radio requires a parent component" do
|
|
22
|
-
assert_raises(RuntimeError) {
|
|
23
|
-
html = arbre {
|
|
24
|
-
radio :preferred_email_format, options: ['HTML', 'Text']
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def radio_with_array_options
|
|
30
|
-
html = arbre {
|
|
31
|
-
express_form(:person) {
|
|
32
|
-
radio :preferred_email_format, options: ['HTML', 'Text']
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
test "radio has correct label field name and text" do
|
|
38
|
-
assert_match /<label for="person_preferred_email_format"/,
|
|
39
|
-
radio_with_array_options
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
test "radio options present with class 'radio'" do
|
|
43
|
-
assert_match /<input.*class="radio"/,
|
|
44
|
-
radio_with_array_options
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def radio_with_hash_options
|
|
48
|
-
html = arbre {
|
|
49
|
-
express_form(:person) {
|
|
50
|
-
radio :subscribed, options: {1 => 'Yes', 0 => 'No'}, label_wrapper_class: 'my-wrapper'
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
test "radio options may be specified with a hash" do
|
|
56
|
-
compiled = radio_with_hash_options
|
|
57
|
-
assert_match '<label class="my-wrapper">', compiled
|
|
58
|
-
assert_match 'input class="radio" type="radio" value="0" name="person[subscribed]" id="person_subscribed_0" />No', compiled
|
|
59
|
-
assert_match 'input class="radio" type="radio" value="1" name="person[subscribed]" id="person_subscribed_1" />Yes', compiled
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
test "radio throws error if given improper options" do
|
|
63
|
-
assert_raises(RuntimeError) {
|
|
64
|
-
html = arbre {
|
|
65
|
-
express_form(:person) {
|
|
66
|
-
radio :subscribed, "Garbage options"
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def radio_with_options_omitted
|
|
73
|
-
html = arbre(employee: resource) {
|
|
74
|
-
express_form(:employee) {
|
|
75
|
-
radio :department_id
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
class ::Department < ::Gender
|
|
81
|
-
def self.order(*)
|
|
82
|
-
all
|
|
83
|
-
end
|
|
84
|
-
def self.all
|
|
85
|
-
return [new(1, 'Accounting'), new(2, 'Marketing')]
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
class ::Employee
|
|
89
|
-
def self.reflect_on_association(name)
|
|
90
|
-
if name.eql? :department
|
|
91
|
-
dummy_association = Object.new
|
|
92
|
-
class << dummy_association
|
|
93
|
-
def macro ; :belongs_to ; end
|
|
94
|
-
def klass ; ::Department ; end
|
|
95
|
-
def polymorphic? ; false ; end
|
|
96
|
-
end
|
|
97
|
-
return dummy_association
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
test "radio options from collection when options omitted" do
|
|
103
|
-
assert_match /input type="radio" value="1" name="employee\[department_id\]" id="employee_department_id_1"/,
|
|
104
|
-
radio_with_options_omitted
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
# test "radio supports html options"
|
|
108
|
-
|
|
109
|
-
# test "html_options passed correctly when collection is omitted"
|
|
110
|
-
|
|
111
|
-
# test "radio helper options passed to collection_radio_buttons"
|
|
112
|
-
end
|