wallaby 4.1.6
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 +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>
|