wallaby 4.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +29 -0
- data/app/assets/javascripts/wallaby/application.js +15 -0
- data/app/assets/javascripts/wallaby/form.js +8 -0
- data/app/assets/stylesheets/wallaby/application.scss +51 -0
- data/app/assets/stylesheets/wallaby/base/_functions.scss +0 -0
- data/app/assets/stylesheets/wallaby/base/_layout.scss +14 -0
- data/app/assets/stylesheets/wallaby/base/_mixins.scss +0 -0
- data/app/assets/stylesheets/wallaby/base/_normalize.scss +0 -0
- data/app/assets/stylesheets/wallaby/base/_reset.scss +0 -0
- data/app/assets/stylesheets/wallaby/base/_vars.scss +5 -0
- data/app/assets/stylesheets/wallaby/components/_forms.scss +53 -0
- data/app/assets/stylesheets/wallaby/components/_nav.scss +19 -0
- data/app/assets/stylesheets/wallaby/components/_pagination.scss +105 -0
- data/app/assets/stylesheets/wallaby/components/_tables.scss +78 -0
- data/app/assets/stylesheets/wallaby/components/_text.scss +11 -0
- data/app/assets/stylesheets/wallaby/form.scss +11 -0
- data/app/assets/stylesheets/wallaby/summernote.scss.erb +7 -0
- data/app/controllers/wallaby/application_controller.rb +21 -0
- data/app/controllers/wallaby/core_controller.rb +28 -0
- data/app/controllers/wallaby/resources_controller.rb +134 -0
- data/app/controllers/wallaby/secure_controller.rb +42 -0
- data/app/routes/wallaby/resources_router.rb +52 -0
- data/app/security/ability.rb +33 -0
- data/app/views/layouts/wallaby/_footer.html.erb +2 -0
- data/app/views/layouts/wallaby/_header.html.erb +57 -0
- data/app/views/layouts/wallaby/_navs.html.erb +1 -0
- data/app/views/layouts/wallaby/application.html.erb +22 -0
- data/app/views/layouts/wallaby/error.html.erb +20 -0
- data/app/views/wallaby/core/home.html.erb +5 -0
- data/app/views/wallaby/errors/access_denied.html.erb +1 -0
- data/app/views/wallaby/errors/not_authenticated.html.erb +1 -0
- data/app/views/wallaby/errors/not_found.html.erb +6 -0
- data/app/views/wallaby/errors/unprocessable_entity.erb +1 -0
- data/app/views/wallaby/resources/_form.html.erb +12 -0
- data/app/views/wallaby/resources/_index_actions.html.erb +1 -0
- data/app/views/wallaby/resources/_resource_actions.html.erb +3 -0
- data/app/views/wallaby/resources/edit.html.erb +14 -0
- data/app/views/wallaby/resources/form/_belongs_to.html.erb +21 -0
- data/app/views/wallaby/resources/form/_bigint.html.erb +9 -0
- data/app/views/wallaby/resources/form/_binary.html.erb +12 -0
- data/app/views/wallaby/resources/form/_bit.html.erb +9 -0
- data/app/views/wallaby/resources/form/_bit_varying.html.erb +9 -0
- data/app/views/wallaby/resources/form/_boolean.html.erb +14 -0
- data/app/views/wallaby/resources/form/_cidr.html.erb +9 -0
- data/app/views/wallaby/resources/form/_citext.html.erb +21 -0
- data/app/views/wallaby/resources/form/_color.html.erb +20 -0
- data/app/views/wallaby/resources/form/_date.html.erb +29 -0
- data/app/views/wallaby/resources/form/_daterange.html.erb +37 -0
- data/app/views/wallaby/resources/form/_datetime.html.erb +30 -0
- data/app/views/wallaby/resources/form/_decimal.html.erb +9 -0
- data/app/views/wallaby/resources/form/_email.html.erb +5 -0
- data/app/views/wallaby/resources/form/_float.html.erb +9 -0
- data/app/views/wallaby/resources/form/_has_and_belongs_to_many.html.erb +13 -0
- data/app/views/wallaby/resources/form/_has_many.html.erb +13 -0
- data/app/views/wallaby/resources/form/_has_one.html.erb +7 -0
- data/app/views/wallaby/resources/form/_hstore.html.erb +25 -0
- data/app/views/wallaby/resources/form/_inet.html.erb +9 -0
- data/app/views/wallaby/resources/form/_int4range.html.erb +18 -0
- data/app/views/wallaby/resources/form/_int8range.html.erb +18 -0
- data/app/views/wallaby/resources/form/_integer.html.erb +9 -0
- data/app/views/wallaby/resources/form/_json.html.erb +23 -0
- data/app/views/wallaby/resources/form/_jsonb.html.erb +23 -0
- data/app/views/wallaby/resources/form/_ltree.html.erb +5 -0
- data/app/views/wallaby/resources/form/_macaddr.html.erb +9 -0
- data/app/views/wallaby/resources/form/_money.html.erb +12 -0
- data/app/views/wallaby/resources/form/_numrange.html.erb +18 -0
- data/app/views/wallaby/resources/form/_password.html.erb +5 -0
- data/app/views/wallaby/resources/form/_point.html.erb +18 -0
- data/app/views/wallaby/resources/form/_string.html.erb +5 -0
- data/app/views/wallaby/resources/form/_text.html.erb +21 -0
- data/app/views/wallaby/resources/form/_time.html.erb +29 -0
- data/app/views/wallaby/resources/form/_tsrange.html.erb +38 -0
- data/app/views/wallaby/resources/form/_tstzrange.html.erb +38 -0
- data/app/views/wallaby/resources/form/_tsvector.html.erb +5 -0
- data/app/views/wallaby/resources/form/_uuid.html.erb +9 -0
- data/app/views/wallaby/resources/form/_xml.html.erb +23 -0
- data/app/views/wallaby/resources/index/_belongs_to.html.erb +1 -0
- data/app/views/wallaby/resources/index/_bigint.html.erb +1 -0
- data/app/views/wallaby/resources/index/_binary.html.erb +1 -0
- data/app/views/wallaby/resources/index/_bit.html.erb +5 -0
- data/app/views/wallaby/resources/index/_bit_varying.html.erb +5 -0
- data/app/views/wallaby/resources/index/_boolean.html.erb +5 -0
- data/app/views/wallaby/resources/index/_cidr.html.erb +6 -0
- data/app/views/wallaby/resources/index/_citext.html.erb +12 -0
- data/app/views/wallaby/resources/index/_color.html.erb +5 -0
- data/app/views/wallaby/resources/index/_date.html.erb +7 -0
- data/app/views/wallaby/resources/index/_daterange.html.erb +8 -0
- data/app/views/wallaby/resources/index/_datetime.html.erb +7 -0
- data/app/views/wallaby/resources/index/_decimal.html.erb +1 -0
- data/app/views/wallaby/resources/index/_email.html.erb +1 -0
- data/app/views/wallaby/resources/index/_float.html.erb +1 -0
- data/app/views/wallaby/resources/index/_has_and_belongs_to_many.html.erb +11 -0
- data/app/views/wallaby/resources/index/_has_many.html.erb +11 -0
- data/app/views/wallaby/resources/index/_has_one.html.erb +1 -0
- data/app/views/wallaby/resources/index/_hstore.html.erb +12 -0
- data/app/views/wallaby/resources/index/_inet.html.erb +6 -0
- data/app/views/wallaby/resources/index/_int4range.html.erb +7 -0
- data/app/views/wallaby/resources/index/_int8range.html.erb +7 -0
- data/app/views/wallaby/resources/index/_integer.html.erb +1 -0
- data/app/views/wallaby/resources/index/_json.html.erb +12 -0
- data/app/views/wallaby/resources/index/_jsonb.html.erb +12 -0
- data/app/views/wallaby/resources/index/_ltree.html.erb +12 -0
- data/app/views/wallaby/resources/index/_macaddr.html.erb +5 -0
- data/app/views/wallaby/resources/index/_money.html.erb +1 -0
- data/app/views/wallaby/resources/index/_numrange.html.erb +7 -0
- data/app/views/wallaby/resources/index/_point.html.erb +6 -0
- data/app/views/wallaby/resources/index/_string.html.erb +12 -0
- data/app/views/wallaby/resources/index/_text.html.erb +12 -0
- data/app/views/wallaby/resources/index/_time.html.erb +6 -0
- data/app/views/wallaby/resources/index/_tsrange.html.erb +8 -0
- data/app/views/wallaby/resources/index/_tstzrange.html.erb +8 -0
- data/app/views/wallaby/resources/index/_tsvector.html.erb +12 -0
- data/app/views/wallaby/resources/index/_uuid.html.erb +12 -0
- data/app/views/wallaby/resources/index/_xml.html.erb +12 -0
- data/app/views/wallaby/resources/index.html.erb +66 -0
- data/app/views/wallaby/resources/new.html.erb +14 -0
- data/app/views/wallaby/resources/shared/_resource_nav.html.erb +29 -0
- data/app/views/wallaby/resources/show/_belongs_to.html.erb +7 -0
- data/app/views/wallaby/resources/show/_bigint.html.erb +1 -0
- data/app/views/wallaby/resources/show/_binary.html.erb +1 -0
- data/app/views/wallaby/resources/show/_bit.html.erb +5 -0
- data/app/views/wallaby/resources/show/_bit_varying.html.erb +5 -0
- data/app/views/wallaby/resources/show/_boolean.html.erb +5 -0
- data/app/views/wallaby/resources/show/_cidr.html.erb +6 -0
- data/app/views/wallaby/resources/show/_citext.html.erb +1 -0
- data/app/views/wallaby/resources/show/_color.html.erb +5 -0
- data/app/views/wallaby/resources/show/_date.html.erb +7 -0
- data/app/views/wallaby/resources/show/_daterange.html.erb +7 -0
- data/app/views/wallaby/resources/show/_datetime.html.erb +6 -0
- data/app/views/wallaby/resources/show/_decimal.html.erb +1 -0
- data/app/views/wallaby/resources/show/_email.html.erb +1 -0
- data/app/views/wallaby/resources/show/_float.html.erb +1 -0
- data/app/views/wallaby/resources/show/_has_and_belongs_to_many.html.erb +5 -0
- data/app/views/wallaby/resources/show/_has_many.html.erb +5 -0
- data/app/views/wallaby/resources/show/_has_one.html.erb +1 -0
- data/app/views/wallaby/resources/show/_hstore.html.erb +5 -0
- data/app/views/wallaby/resources/show/_inet.html.erb +6 -0
- data/app/views/wallaby/resources/show/_int4range.html.erb +7 -0
- data/app/views/wallaby/resources/show/_int8range.html.erb +7 -0
- data/app/views/wallaby/resources/show/_integer.html.erb +1 -0
- data/app/views/wallaby/resources/show/_json.html.erb +5 -0
- data/app/views/wallaby/resources/show/_jsonb.html.erb +5 -0
- data/app/views/wallaby/resources/show/_ltree.html.erb +1 -0
- data/app/views/wallaby/resources/show/_macaddr.html.erb +5 -0
- data/app/views/wallaby/resources/show/_money.html.erb +1 -0
- data/app/views/wallaby/resources/show/_numrange.html.erb +7 -0
- data/app/views/wallaby/resources/show/_point.html.erb +6 -0
- data/app/views/wallaby/resources/show/_string.html.erb +1 -0
- data/app/views/wallaby/resources/show/_text.html.erb +1 -0
- data/app/views/wallaby/resources/show/_time.html.erb +6 -0
- data/app/views/wallaby/resources/show/_tsrange.html.erb +7 -0
- data/app/views/wallaby/resources/show/_tstzrange.html.erb +7 -0
- data/app/views/wallaby/resources/show/_tsvector.html.erb +1 -0
- data/app/views/wallaby/resources/show/_uuid.html.erb +5 -0
- data/app/views/wallaby/resources/show/_xml.html.erb +5 -0
- data/app/views/wallaby/resources/show.html.erb +31 -0
- data/app/views/wallaby/shared/_flash_messages.html.erb +13 -0
- data/config/locales/en.yml +29 -0
- data/config/routes.rb +34 -0
- data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder.rb +105 -0
- data/lib/adaptors/wallaby/active_record/model_decorator/title_field_finder.rb +18 -0
- data/lib/adaptors/wallaby/active_record/model_decorator.rb +81 -0
- data/lib/adaptors/wallaby/active_record/model_finder.rb +12 -0
- data/lib/adaptors/wallaby/active_record/model_operator/normalizer.rb +44 -0
- data/lib/adaptors/wallaby/active_record/model_operator/permitter.rb +50 -0
- data/lib/adaptors/wallaby/active_record/model_operator/querier.rb +47 -0
- data/lib/adaptors/wallaby/active_record/model_operator/validator.rb +16 -0
- data/lib/adaptors/wallaby/active_record/model_operator.rb +82 -0
- data/lib/adaptors/wallaby/active_record.rb +2 -0
- data/lib/decorators/wallaby/resource_decorator.rb +78 -0
- data/lib/errors/wallaby/deprecated.rb +4 -0
- data/lib/errors/wallaby/general_error.rb +4 -0
- data/lib/errors/wallaby/invalid_error.rb +4 -0
- data/lib/errors/wallaby/model_not_found.rb +4 -0
- data/lib/errors/wallaby/not_authenticated.rb +4 -0
- data/lib/errors/wallaby/not_implemented.rb +4 -0
- data/lib/errors/wallaby/operation_not_found.rb +4 -0
- data/lib/errors/wallaby/resource_not_found.rb +4 -0
- data/lib/forms/wallaby/form_builder.rb +30 -0
- data/lib/handlers/wallaby/cached_compiled_erb.rb +14 -0
- data/lib/helpers/wallaby/application_helper.rb +30 -0
- data/lib/helpers/wallaby/core_helper.rb +50 -0
- data/lib/helpers/wallaby/form_helper.rb +21 -0
- data/lib/helpers/wallaby/links_helper.rb +83 -0
- data/lib/helpers/wallaby/paginatable_helper.rb +9 -0
- data/lib/helpers/wallaby/resources_helper.rb +55 -0
- data/lib/helpers/wallaby/secure_helper.rb +25 -0
- data/lib/helpers/wallaby/sorting_helper.rb +43 -0
- data/lib/helpers/wallaby/styling_helper.rb +57 -0
- data/lib/interfaces/wallaby/mode.rb +18 -0
- data/lib/interfaces/wallaby/model_decorator.rb +58 -0
- data/lib/interfaces/wallaby/model_finder.rb +5 -0
- data/lib/interfaces/wallaby/model_operator.rb +31 -0
- data/lib/services/wallaby/decorator_finder.rb +16 -0
- data/lib/services/wallaby/lookup_context_wrapper.rb +40 -0
- data/lib/services/wallaby/map.rb +53 -0
- data/lib/services/wallaby/model_servicer.rb +38 -0
- data/lib/services/wallaby/servicer_finder.rb +5 -0
- data/lib/tasks/wallaby_tasks.rake +4 -0
- data/lib/utils/wallaby/utils.rb +31 -0
- data/lib/wallaby/configuration/models.rb +17 -0
- data/lib/wallaby/configuration/security.rb +30 -0
- data/lib/wallaby/configuration.rb +49 -0
- data/lib/wallaby/engine.rb +89 -0
- data/lib/wallaby/version.rb +3 -0
- data/lib/wallaby.rb +5 -0
- metadata +459 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
if Rails.env.development?
|
2
|
+
# NOTE: Rails reload! will hit here
|
3
|
+
Rails.logger.debug '--> [ Wallaby ] Ready to preload and clear cache on reload. <--'
|
4
|
+
GC.start
|
5
|
+
Rails.cache.delete_matched 'wallaby/*'
|
6
|
+
|
7
|
+
# NOTE: we search for subclasses of Wallaby::ResourcesController and Wallaby::ResourceDecorator.
|
8
|
+
# therefore, under development environment, we need to preload all classes under /app folder in main_app
|
9
|
+
# using `require` is not working for preloading, we need to constantize the class names to make Rails reload classes properly
|
10
|
+
Wallaby::ApplicationController
|
11
|
+
|
12
|
+
def preload(file_pattern)
|
13
|
+
Dir[ file_pattern ].each do |file_path|
|
14
|
+
begin
|
15
|
+
name = file_path[ %r(app/[^/]+/(.+)\.rb), 1 ].gsub('concerns/', '')
|
16
|
+
name.classify.constantize
|
17
|
+
rescue NameError, LoadError => e
|
18
|
+
Rails.logger.debug "PRELOAD ERROR: #{ e.message }"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
preload 'app/models/**.rb'
|
24
|
+
preload 'app/**/*.rb'
|
25
|
+
end
|
26
|
+
|
27
|
+
class Wallaby::ResourcesRouter
|
28
|
+
DEFAULT_CONTROLLER = Wallaby::ResourcesController
|
29
|
+
|
30
|
+
def call(env)
|
31
|
+
params = env['action_dispatch.request.path_parameters']
|
32
|
+
controller = find_controller_by params[:resources]
|
33
|
+
params[:action] = check_action_name_by controller, params
|
34
|
+
|
35
|
+
controller.action(params[:action]).call env
|
36
|
+
rescue AbstractController::ActionNotFound, Wallaby::ModelNotFound => e
|
37
|
+
params[:error] = e
|
38
|
+
DEFAULT_CONTROLLER.action(:not_found).call env
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
def find_controller_by(resources_name)
|
43
|
+
model_class = Wallaby::Utils.to_model_class resources_name
|
44
|
+
Wallaby::Map.controller_map[model_class] || DEFAULT_CONTROLLER
|
45
|
+
end
|
46
|
+
|
47
|
+
def check_action_name_by(controller, params)
|
48
|
+
params[:id].try do |id_action|
|
49
|
+
id_action if controller.public_method_defined? id_action
|
50
|
+
end || params[:action]
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class Ability
|
2
|
+
include CanCan::Ability
|
3
|
+
|
4
|
+
def initialize(user)
|
5
|
+
# Define abilities for the passed in user here. For example:
|
6
|
+
#
|
7
|
+
# user ||= User.new # guest user (not logged in)
|
8
|
+
# if user.admin?
|
9
|
+
# can :manage, :all
|
10
|
+
# else
|
11
|
+
# can :read, :all
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# The first argument to `can` is the action you are giving the user
|
15
|
+
# permission to do.
|
16
|
+
# If you pass :manage it will apply to every action. Other common actions
|
17
|
+
# here are :read, :create, :update and :destroy.
|
18
|
+
#
|
19
|
+
# The second argument is the resource the user can perform the action on.
|
20
|
+
# If you pass :all it will apply to every resource. Otherwise pass a Ruby
|
21
|
+
# class of the resource.
|
22
|
+
#
|
23
|
+
# The third argument is an optional hash of conditions to further filter the
|
24
|
+
# objects.
|
25
|
+
# For example, here the user can only update published articles.
|
26
|
+
#
|
27
|
+
# can :update, Article, :published => true
|
28
|
+
#
|
29
|
+
# See the wiki for details:
|
30
|
+
# https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
|
31
|
+
can :manage, :all
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
<header>
|
2
|
+
<nav class="top-nav navbar navbar-default">
|
3
|
+
<div class="container-fluid">
|
4
|
+
<%# Brand %>
|
5
|
+
<div class="navbar-header">
|
6
|
+
<%# Mobile Menu Toggler %>
|
7
|
+
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#top-menu" aria-expanded="false">
|
8
|
+
<span class="sr-only">Toggle navigation</span>
|
9
|
+
<span class="icon-bar"></span>
|
10
|
+
<span class="icon-bar"></span>
|
11
|
+
<span class="icon-bar"></span>
|
12
|
+
</button>
|
13
|
+
<%# //Mobile Menu Toggler %>
|
14
|
+
<a class="navbar-brand" href="<%= wallaby_engine.root_path %>">Wallaby Admin</a>
|
15
|
+
</div>
|
16
|
+
<%# //Brand %>
|
17
|
+
|
18
|
+
<div id="top-menu" class="collapse navbar-collapse">
|
19
|
+
<%# Resources navigation %>
|
20
|
+
<ul class="nav navbar-nav">
|
21
|
+
<li class="dropdown">
|
22
|
+
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
|
23
|
+
<%= current_model_label %>
|
24
|
+
<span class="caret"></span>
|
25
|
+
</a>
|
26
|
+
<ul class="dropdown-menu">
|
27
|
+
<% model_classes.each do |model_class| %>
|
28
|
+
<li><%= index_link model_class %> </li>
|
29
|
+
<% end %>
|
30
|
+
</ul>
|
31
|
+
</li>
|
32
|
+
</ul>
|
33
|
+
<%= render 'layouts/wallaby/navs' %>
|
34
|
+
<%# //Resources navigation %>
|
35
|
+
<%# User account %>
|
36
|
+
<% if current_user.present? %>
|
37
|
+
<ul class="nav navbar-nav navbar-right">
|
38
|
+
<li role="separator" class="divider"></li>
|
39
|
+
<li>
|
40
|
+
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
|
41
|
+
<%= user_portrait %>
|
42
|
+
<span class="visible-xs-inline-block">User</span>
|
43
|
+
<span class="caret"></span>
|
44
|
+
</a>
|
45
|
+
<% if logout_path.present? %>
|
46
|
+
<ul class="dropdown-menu">
|
47
|
+
<li><%= link_to 'Sign out', logout_path, method: logout_method %></li>
|
48
|
+
</ul>
|
49
|
+
<% end %>
|
50
|
+
</li>
|
51
|
+
</ul>
|
52
|
+
<% end %>
|
53
|
+
<%# //User account %>
|
54
|
+
</div>
|
55
|
+
</div>
|
56
|
+
</nav>
|
57
|
+
</header>
|
@@ -0,0 +1 @@
|
|
1
|
+
<% # can be overriden %>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="<%= I18n.locale %>">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
6
|
+
|
7
|
+
<title><%= page_title %></title>
|
8
|
+
|
9
|
+
<%= stylesheet_link_tag 'wallaby/application', media: 'all', 'data-turbolinks-track' => true %>
|
10
|
+
<%= yield :custom_stylesheet %>
|
11
|
+
<%= csrf_meta_tags %>
|
12
|
+
</head>
|
13
|
+
<body class="application <%= body_class %>">
|
14
|
+
<%= render 'layouts/wallaby/header' %>
|
15
|
+
<main>
|
16
|
+
<%= yield %>
|
17
|
+
</main>
|
18
|
+
<%= render 'layouts/wallaby/footer' %>
|
19
|
+
<%= javascript_include_tag 'wallaby/application', 'data-turbolinks-track' => true %>
|
20
|
+
<%= yield :custom_javascript %>
|
21
|
+
</body>
|
22
|
+
</html>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="<%= I18n.locale %>">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8" />
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
6
|
+
|
7
|
+
<title><%= page_title %></title>
|
8
|
+
|
9
|
+
<%= stylesheet_link_tag 'wallaby/application', media: 'all', 'data-turbolinks-track' => true %>
|
10
|
+
<%= yield :custom_stylesheet %>
|
11
|
+
<%= csrf_meta_tags %>
|
12
|
+
</head>
|
13
|
+
<body class="error <%= body_class %>">
|
14
|
+
<main>
|
15
|
+
<%= yield %>
|
16
|
+
</main>
|
17
|
+
<%= javascript_include_tag 'wallaby/application', 'data-turbolinks-track' => true %>
|
18
|
+
<%= yield :custom_javascript %>
|
19
|
+
</body>
|
20
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= @exception.message %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= @exception.message %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= @exception.message %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<% decorated.errors[:base].try do |messages| %>
|
2
|
+
<% Array(messages).each do |message| %>
|
3
|
+
<div class="alert alert-danger alert-dismissible" role="alert">
|
4
|
+
<%= raw message %>
|
5
|
+
</div>
|
6
|
+
<% end %>
|
7
|
+
<% end %>
|
8
|
+
<% decorated.form_field_names.each do |field_name| %>
|
9
|
+
<%= form_type_partial_render decorated.form_type_of(field_name).to_s, field_name: field_name, form: form %>
|
10
|
+
<% end %>
|
11
|
+
<%= form.submit class: 'btn btn-primary' %>
|
12
|
+
<%= cancel_link class: 'btn btn-default' %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= new_link(current_model_class, class: 'btn btn-primary') { ct 'link.new' } %>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<% decorated = decorate resource %>
|
2
|
+
<section>
|
3
|
+
<%= render 'wallaby/resources/shared/resource_nav' %>
|
4
|
+
<div class="page-header">
|
5
|
+
<h1>Edit # <%= decorated.id %></h1>
|
6
|
+
</div>
|
7
|
+
<%= render 'wallaby/shared/flash_messages' %>
|
8
|
+
<%= form_for decorated, url: wallaby_engine.resource_path, method: :put, html: { :multipart => true }, builder: Wallaby::FormBuilder do |form| %>
|
9
|
+
<%= render 'form', form: form, decorated: decorated %>
|
10
|
+
<% end %>
|
11
|
+
</section>
|
12
|
+
|
13
|
+
<% content_for :custom_stylesheet, stylesheet_link_tag('wallaby/form', media: 'all', 'data-turbolinks-track' => true) %>
|
14
|
+
<% content_for :custom_javascript, javascript_include_tag('wallaby/form', 'data-turbolinks-track' => true) %>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label metadata[:foreign_key], metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<% if metadata[:is_polymorphic] %>
|
5
|
+
<div class="col-xs-6 col-sm-3">
|
6
|
+
<%= form.select metadata[:polymorphic_type], metadata[:polymorphic_list].try(:map, &:to_s), { include_blank: true }, { class: 'form-control' } %>
|
7
|
+
</div>
|
8
|
+
<div class="col-xs-3">
|
9
|
+
<%= form.text_field metadata[:foreign_key], class: 'form-control' %>
|
10
|
+
</div>
|
11
|
+
<% else %>
|
12
|
+
<div class="col-xs-6 col-sm-3">
|
13
|
+
<%= form.select metadata[:foreign_key], model_choices(model_decorator metadata[:class]), { include_blank: true }, { class: 'form-control' } %>
|
14
|
+
<p class="help-block">
|
15
|
+
<%= new_link metadata[:class], prepend: 'Or' %>
|
16
|
+
</p>
|
17
|
+
</div>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
20
|
+
<%= form.error_messages field_name %>
|
21
|
+
</div>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<%= form.number_field field_name, class: 'form-control' %>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<%= form.error_messages field_name %>
|
9
|
+
</div>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-3">
|
5
|
+
<%= form.label field_name, class: 'btn btn-default' do %>
|
6
|
+
<%= form.file_field field_name, class: 'hidden' %>
|
7
|
+
<%= icon 'upload' %> <%= ct 'lable.upload' %>
|
8
|
+
<% end %>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
<%= form.error_messages field_name %>
|
12
|
+
</div>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<%= form.number_field field_name, class: 'form-control' %>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<%= form.error_messages field_name %>
|
9
|
+
</div>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<%= form.number_field field_name, class: 'form-control' %>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<%= form.error_messages field_name %>
|
9
|
+
</div>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-12">
|
5
|
+
<label class="radio-inline">
|
6
|
+
<%= form.radio_button field_name, true %> Yes
|
7
|
+
</label>
|
8
|
+
<label class="radio-inline">
|
9
|
+
<%= form.radio_button field_name, false %> No
|
10
|
+
</label>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
<%= form.error_messages field_name %>
|
14
|
+
</div>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<%= form.text_field field_name, class: 'form-control' %>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<%= form.error_messages field_name %>
|
9
|
+
</div>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<%= form.text_area field_name, class: 'form-control', data: { init: 'summernote' } %>
|
4
|
+
<%= form.error_messages field_name %>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<% unless @summernote_init %>
|
8
|
+
<% @summernote_init = true %>
|
9
|
+
<% content_for :custom_javascript do %>
|
10
|
+
<% javascript_tag do %>
|
11
|
+
jQuery(function($) {
|
12
|
+
$('textarea[data-init="summernote"]').summernote({
|
13
|
+
height: 150,
|
14
|
+
codemirror: { // codemirror options
|
15
|
+
theme: 'monokai'
|
16
|
+
}
|
17
|
+
})
|
18
|
+
})
|
19
|
+
<% end %>
|
20
|
+
<% end %>
|
21
|
+
<% end %>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<%= form.text_field field_name, class: 'form-control', data: { init: 'colorpicker' } %>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<%= form.error_messages field_name %>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<% unless @colorpicker_init %>
|
12
|
+
<% @colorpicker_init = true %>
|
13
|
+
<% content_for :custom_javascript do %>
|
14
|
+
<% javascript_tag do %>
|
15
|
+
jQuery(function($) {
|
16
|
+
$('[data-init="colorpicker"]').minicolors({ theme: 'bootstrap' })
|
17
|
+
})
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
20
|
+
<% end %>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<div class="input-group date" data-init='datepicker'>
|
6
|
+
<%= form.text_field field_name, class: 'form-control' %>
|
7
|
+
<span class="input-group-addon"><%= icon 'calendar' %></span>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
<%= form.error_messages field_name %>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<% unless @datepicker_init %>
|
15
|
+
<% @datepicker_init = true %>
|
16
|
+
<% content_for :custom_javascript do %>
|
17
|
+
<% javascript_tag do %>
|
18
|
+
jQuery(function($) {
|
19
|
+
$('[data-init="datepicker"]').each(function() {
|
20
|
+
var $input = $('input', this)
|
21
|
+
$input.val(moment($input.attr('value')).format('YYYY-MM-DD'))
|
22
|
+
$(this).datetimepicker({
|
23
|
+
format: 'YYYY-MM-DD'
|
24
|
+
})
|
25
|
+
})
|
26
|
+
})
|
27
|
+
<% end %>
|
28
|
+
<% end %>
|
29
|
+
<% end %>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<div class="input-group date" data-init='datepicker'>
|
6
|
+
<span class="input-group-addon">F</span>
|
7
|
+
<%= form.text_field field_name, value: value.try(:first), multiple: true, class: 'form-control' %>
|
8
|
+
<span class="input-group-addon"><%= icon 'calendar' %></span>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
<div class="col-xs-6 col-sm-3">
|
12
|
+
<div class="input-group date" data-init='datepicker'>
|
13
|
+
<span class="input-group-addon">T</span>
|
14
|
+
<%= form.text_field field_name, value: value.try(:last), multiple: true, class: 'form-control' %>
|
15
|
+
<span class="input-group-addon"><%= icon 'calendar' %></span>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
<%= form.error_messages field_name %>
|
20
|
+
</div>
|
21
|
+
|
22
|
+
<% unless @datepicker_init %>
|
23
|
+
<% @datepicker_init = true %>
|
24
|
+
<% content_for :custom_javascript do %>
|
25
|
+
<% javascript_tag do %>
|
26
|
+
jQuery(function($) {
|
27
|
+
$('[data-init="datepicker"]').each(function() {
|
28
|
+
var $input = $('input', this)
|
29
|
+
$input.val(moment($input.attr('value')).format('YYYY-MM-DD'))
|
30
|
+
$(this).datetimepicker({
|
31
|
+
format: 'YYYY-MM-DD'
|
32
|
+
})
|
33
|
+
})
|
34
|
+
})
|
35
|
+
<% end %>
|
36
|
+
<% end %>
|
37
|
+
<% end %>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<div class="input-group date" data-init='datetimepicker'>
|
6
|
+
<%= form.text_field field_name, value: value, class: 'form-control' %>
|
7
|
+
<span class="input-group-addon"><%= icon 'calendar' %></span>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
<%= form.error_messages field_name %>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<% unless @datetimepicker_init %>
|
15
|
+
<% @datetimepicker_init = true %>
|
16
|
+
<% content_for :custom_javascript do %>
|
17
|
+
<% javascript_tag do %>
|
18
|
+
jQuery(function($) {
|
19
|
+
$('[data-init="datetimepicker"]').each(function() {
|
20
|
+
var $input = $('input', this)
|
21
|
+
$input.val(moment($input.attr('value')).format('YYYY-MM-DD HH:mm'))
|
22
|
+
$(this).datetimepicker({
|
23
|
+
format: 'YYYY-MM-DD HH:mm',
|
24
|
+
sideBySide: true
|
25
|
+
})
|
26
|
+
})
|
27
|
+
})
|
28
|
+
<% end %>
|
29
|
+
<% end %>
|
30
|
+
<% end %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<%= form.number_field field_name, class: 'form-control' %>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<%= form.error_messages field_name %>
|
9
|
+
</div>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<%= form.number_field field_name, class: 'form-control' %>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<%= form.error_messages field_name %>
|
9
|
+
</div>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label metadata[:foreign_key], metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<%= form.select metadata[:foreign_key], model_choices(model_decorator metadata[:class]), { }, { class: 'form-control', multiple: true } %>
|
6
|
+
<p class="help-block">
|
7
|
+
Press CTRL to select/deselect multiple items.
|
8
|
+
<%= new_link metadata[:class], prepend: 'Or' %>
|
9
|
+
</p>
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
<%= form.error_messages field_name %>
|
13
|
+
</div>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label metadata[:foreign_key], metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<%= form.select metadata[:foreign_key], model_choices(model_decorator metadata[:class]), { }, { class: 'form-control', multiple: true } %>
|
6
|
+
<p class="help-block">
|
7
|
+
Press CTRL to select/deselect multiple items.
|
8
|
+
<%= new_link metadata[:class], prepend: 'Or' %>
|
9
|
+
</p>
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
<%= form.error_messages field_name %>
|
13
|
+
</div>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<% # TODO: consider to pass new_link default params to create %>
|
2
|
+
<div class="form-group <%= form.error_class field_name %>">
|
3
|
+
<%= form.label field_name, metadata[:label] %>
|
4
|
+
<div>
|
5
|
+
<%= value.present? ? edit_link(value) : new_link(metadata[:class]) %>
|
6
|
+
</div>
|
7
|
+
</div>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<%= form.text_area field_name, value: value.to_s[%r(\A{(.*)}\Z), 1], class: 'form-control', data: { init: 'codemirror', mode: 'ruby' } %>
|
4
|
+
<%= form.error_messages field_name %>
|
5
|
+
<p class="help-block">
|
6
|
+
Format: <code>"KEY1" => "VALUE1", "KEY2" => "VALUE2"</code>
|
7
|
+
</p>
|
8
|
+
</div>
|
9
|
+
|
10
|
+
<% unless @codemirror_init %>
|
11
|
+
<% @codemirror_init = true %>
|
12
|
+
<% content_for :custom_javascript do %>
|
13
|
+
<% javascript_tag do %>
|
14
|
+
jQuery(function($) {
|
15
|
+
$('textarea[data-init="codemirror"]').each(function (index, element) {
|
16
|
+
CodeMirror.fromTextArea(element, {
|
17
|
+
mode: $(element).data('mode'),
|
18
|
+
theme: "default",
|
19
|
+
lineNumbers: true
|
20
|
+
});
|
21
|
+
})
|
22
|
+
})
|
23
|
+
<% end %>
|
24
|
+
<% end %>
|
25
|
+
<% end %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<%= form.text_field field_name, class: 'form-control' %>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<%= form.error_messages field_name %>
|
9
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<div class="input-group">
|
6
|
+
<span class="input-group-addon">F</span>
|
7
|
+
<%= form.number_field field_name, value: value.try(:first), multiple: true, class: 'form-control' %>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
<div class="col-xs-6 col-sm-3">
|
11
|
+
<div class="input-group">
|
12
|
+
<span class="input-group-addon">T</span>
|
13
|
+
<%= form.number_field field_name, value: value.try(:last), multiple: true, class: 'form-control' %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<%= form.error_messages field_name %>
|
18
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<div class="form-group <%= form.error_class field_name %>">
|
2
|
+
<%= form.label field_name, metadata[:label] %>
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-xs-6 col-sm-3">
|
5
|
+
<div class="input-group">
|
6
|
+
<span class="input-group-addon">F</span>
|
7
|
+
<%= form.number_field field_name, value: value.try(:first), multiple: true, class: 'form-control' %>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
<div class="col-xs-6 col-sm-3">
|
11
|
+
<div class="input-group">
|
12
|
+
<span class="input-group-addon">T</span>
|
13
|
+
<%= form.number_field field_name, value: value.try(:last), multiple: true, class: 'form-control' %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<%= form.error_messages field_name %>
|
18
|
+
</div>
|