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