wallaby 4.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +29 -0
  4. data/app/assets/javascripts/wallaby/application.js +15 -0
  5. data/app/assets/javascripts/wallaby/form.js +8 -0
  6. data/app/assets/stylesheets/wallaby/application.scss +51 -0
  7. data/app/assets/stylesheets/wallaby/base/_functions.scss +0 -0
  8. data/app/assets/stylesheets/wallaby/base/_layout.scss +14 -0
  9. data/app/assets/stylesheets/wallaby/base/_mixins.scss +0 -0
  10. data/app/assets/stylesheets/wallaby/base/_normalize.scss +0 -0
  11. data/app/assets/stylesheets/wallaby/base/_reset.scss +0 -0
  12. data/app/assets/stylesheets/wallaby/base/_vars.scss +5 -0
  13. data/app/assets/stylesheets/wallaby/components/_forms.scss +53 -0
  14. data/app/assets/stylesheets/wallaby/components/_nav.scss +19 -0
  15. data/app/assets/stylesheets/wallaby/components/_pagination.scss +105 -0
  16. data/app/assets/stylesheets/wallaby/components/_tables.scss +78 -0
  17. data/app/assets/stylesheets/wallaby/components/_text.scss +11 -0
  18. data/app/assets/stylesheets/wallaby/form.scss +11 -0
  19. data/app/assets/stylesheets/wallaby/summernote.scss.erb +7 -0
  20. data/app/controllers/wallaby/application_controller.rb +21 -0
  21. data/app/controllers/wallaby/core_controller.rb +28 -0
  22. data/app/controllers/wallaby/resources_controller.rb +134 -0
  23. data/app/controllers/wallaby/secure_controller.rb +42 -0
  24. data/app/routes/wallaby/resources_router.rb +52 -0
  25. data/app/security/ability.rb +33 -0
  26. data/app/views/layouts/wallaby/_footer.html.erb +2 -0
  27. data/app/views/layouts/wallaby/_header.html.erb +57 -0
  28. data/app/views/layouts/wallaby/_navs.html.erb +1 -0
  29. data/app/views/layouts/wallaby/application.html.erb +22 -0
  30. data/app/views/layouts/wallaby/error.html.erb +20 -0
  31. data/app/views/wallaby/core/home.html.erb +5 -0
  32. data/app/views/wallaby/errors/access_denied.html.erb +1 -0
  33. data/app/views/wallaby/errors/not_authenticated.html.erb +1 -0
  34. data/app/views/wallaby/errors/not_found.html.erb +6 -0
  35. data/app/views/wallaby/errors/unprocessable_entity.erb +1 -0
  36. data/app/views/wallaby/resources/_form.html.erb +12 -0
  37. data/app/views/wallaby/resources/_index_actions.html.erb +1 -0
  38. data/app/views/wallaby/resources/_resource_actions.html.erb +3 -0
  39. data/app/views/wallaby/resources/edit.html.erb +14 -0
  40. data/app/views/wallaby/resources/form/_belongs_to.html.erb +21 -0
  41. data/app/views/wallaby/resources/form/_bigint.html.erb +9 -0
  42. data/app/views/wallaby/resources/form/_binary.html.erb +12 -0
  43. data/app/views/wallaby/resources/form/_bit.html.erb +9 -0
  44. data/app/views/wallaby/resources/form/_bit_varying.html.erb +9 -0
  45. data/app/views/wallaby/resources/form/_boolean.html.erb +14 -0
  46. data/app/views/wallaby/resources/form/_cidr.html.erb +9 -0
  47. data/app/views/wallaby/resources/form/_citext.html.erb +21 -0
  48. data/app/views/wallaby/resources/form/_color.html.erb +20 -0
  49. data/app/views/wallaby/resources/form/_date.html.erb +29 -0
  50. data/app/views/wallaby/resources/form/_daterange.html.erb +37 -0
  51. data/app/views/wallaby/resources/form/_datetime.html.erb +30 -0
  52. data/app/views/wallaby/resources/form/_decimal.html.erb +9 -0
  53. data/app/views/wallaby/resources/form/_email.html.erb +5 -0
  54. data/app/views/wallaby/resources/form/_float.html.erb +9 -0
  55. data/app/views/wallaby/resources/form/_has_and_belongs_to_many.html.erb +13 -0
  56. data/app/views/wallaby/resources/form/_has_many.html.erb +13 -0
  57. data/app/views/wallaby/resources/form/_has_one.html.erb +7 -0
  58. data/app/views/wallaby/resources/form/_hstore.html.erb +25 -0
  59. data/app/views/wallaby/resources/form/_inet.html.erb +9 -0
  60. data/app/views/wallaby/resources/form/_int4range.html.erb +18 -0
  61. data/app/views/wallaby/resources/form/_int8range.html.erb +18 -0
  62. data/app/views/wallaby/resources/form/_integer.html.erb +9 -0
  63. data/app/views/wallaby/resources/form/_json.html.erb +23 -0
  64. data/app/views/wallaby/resources/form/_jsonb.html.erb +23 -0
  65. data/app/views/wallaby/resources/form/_ltree.html.erb +5 -0
  66. data/app/views/wallaby/resources/form/_macaddr.html.erb +9 -0
  67. data/app/views/wallaby/resources/form/_money.html.erb +12 -0
  68. data/app/views/wallaby/resources/form/_numrange.html.erb +18 -0
  69. data/app/views/wallaby/resources/form/_password.html.erb +5 -0
  70. data/app/views/wallaby/resources/form/_point.html.erb +18 -0
  71. data/app/views/wallaby/resources/form/_string.html.erb +5 -0
  72. data/app/views/wallaby/resources/form/_text.html.erb +21 -0
  73. data/app/views/wallaby/resources/form/_time.html.erb +29 -0
  74. data/app/views/wallaby/resources/form/_tsrange.html.erb +38 -0
  75. data/app/views/wallaby/resources/form/_tstzrange.html.erb +38 -0
  76. data/app/views/wallaby/resources/form/_tsvector.html.erb +5 -0
  77. data/app/views/wallaby/resources/form/_uuid.html.erb +9 -0
  78. data/app/views/wallaby/resources/form/_xml.html.erb +23 -0
  79. data/app/views/wallaby/resources/index/_belongs_to.html.erb +1 -0
  80. data/app/views/wallaby/resources/index/_bigint.html.erb +1 -0
  81. data/app/views/wallaby/resources/index/_binary.html.erb +1 -0
  82. data/app/views/wallaby/resources/index/_bit.html.erb +5 -0
  83. data/app/views/wallaby/resources/index/_bit_varying.html.erb +5 -0
  84. data/app/views/wallaby/resources/index/_boolean.html.erb +5 -0
  85. data/app/views/wallaby/resources/index/_cidr.html.erb +6 -0
  86. data/app/views/wallaby/resources/index/_citext.html.erb +12 -0
  87. data/app/views/wallaby/resources/index/_color.html.erb +5 -0
  88. data/app/views/wallaby/resources/index/_date.html.erb +7 -0
  89. data/app/views/wallaby/resources/index/_daterange.html.erb +8 -0
  90. data/app/views/wallaby/resources/index/_datetime.html.erb +7 -0
  91. data/app/views/wallaby/resources/index/_decimal.html.erb +1 -0
  92. data/app/views/wallaby/resources/index/_email.html.erb +1 -0
  93. data/app/views/wallaby/resources/index/_float.html.erb +1 -0
  94. data/app/views/wallaby/resources/index/_has_and_belongs_to_many.html.erb +11 -0
  95. data/app/views/wallaby/resources/index/_has_many.html.erb +11 -0
  96. data/app/views/wallaby/resources/index/_has_one.html.erb +1 -0
  97. data/app/views/wallaby/resources/index/_hstore.html.erb +12 -0
  98. data/app/views/wallaby/resources/index/_inet.html.erb +6 -0
  99. data/app/views/wallaby/resources/index/_int4range.html.erb +7 -0
  100. data/app/views/wallaby/resources/index/_int8range.html.erb +7 -0
  101. data/app/views/wallaby/resources/index/_integer.html.erb +1 -0
  102. data/app/views/wallaby/resources/index/_json.html.erb +12 -0
  103. data/app/views/wallaby/resources/index/_jsonb.html.erb +12 -0
  104. data/app/views/wallaby/resources/index/_ltree.html.erb +12 -0
  105. data/app/views/wallaby/resources/index/_macaddr.html.erb +5 -0
  106. data/app/views/wallaby/resources/index/_money.html.erb +1 -0
  107. data/app/views/wallaby/resources/index/_numrange.html.erb +7 -0
  108. data/app/views/wallaby/resources/index/_point.html.erb +6 -0
  109. data/app/views/wallaby/resources/index/_string.html.erb +12 -0
  110. data/app/views/wallaby/resources/index/_text.html.erb +12 -0
  111. data/app/views/wallaby/resources/index/_time.html.erb +6 -0
  112. data/app/views/wallaby/resources/index/_tsrange.html.erb +8 -0
  113. data/app/views/wallaby/resources/index/_tstzrange.html.erb +8 -0
  114. data/app/views/wallaby/resources/index/_tsvector.html.erb +12 -0
  115. data/app/views/wallaby/resources/index/_uuid.html.erb +12 -0
  116. data/app/views/wallaby/resources/index/_xml.html.erb +12 -0
  117. data/app/views/wallaby/resources/index.html.erb +66 -0
  118. data/app/views/wallaby/resources/new.html.erb +14 -0
  119. data/app/views/wallaby/resources/shared/_resource_nav.html.erb +29 -0
  120. data/app/views/wallaby/resources/show/_belongs_to.html.erb +7 -0
  121. data/app/views/wallaby/resources/show/_bigint.html.erb +1 -0
  122. data/app/views/wallaby/resources/show/_binary.html.erb +1 -0
  123. data/app/views/wallaby/resources/show/_bit.html.erb +5 -0
  124. data/app/views/wallaby/resources/show/_bit_varying.html.erb +5 -0
  125. data/app/views/wallaby/resources/show/_boolean.html.erb +5 -0
  126. data/app/views/wallaby/resources/show/_cidr.html.erb +6 -0
  127. data/app/views/wallaby/resources/show/_citext.html.erb +1 -0
  128. data/app/views/wallaby/resources/show/_color.html.erb +5 -0
  129. data/app/views/wallaby/resources/show/_date.html.erb +7 -0
  130. data/app/views/wallaby/resources/show/_daterange.html.erb +7 -0
  131. data/app/views/wallaby/resources/show/_datetime.html.erb +6 -0
  132. data/app/views/wallaby/resources/show/_decimal.html.erb +1 -0
  133. data/app/views/wallaby/resources/show/_email.html.erb +1 -0
  134. data/app/views/wallaby/resources/show/_float.html.erb +1 -0
  135. data/app/views/wallaby/resources/show/_has_and_belongs_to_many.html.erb +5 -0
  136. data/app/views/wallaby/resources/show/_has_many.html.erb +5 -0
  137. data/app/views/wallaby/resources/show/_has_one.html.erb +1 -0
  138. data/app/views/wallaby/resources/show/_hstore.html.erb +5 -0
  139. data/app/views/wallaby/resources/show/_inet.html.erb +6 -0
  140. data/app/views/wallaby/resources/show/_int4range.html.erb +7 -0
  141. data/app/views/wallaby/resources/show/_int8range.html.erb +7 -0
  142. data/app/views/wallaby/resources/show/_integer.html.erb +1 -0
  143. data/app/views/wallaby/resources/show/_json.html.erb +5 -0
  144. data/app/views/wallaby/resources/show/_jsonb.html.erb +5 -0
  145. data/app/views/wallaby/resources/show/_ltree.html.erb +1 -0
  146. data/app/views/wallaby/resources/show/_macaddr.html.erb +5 -0
  147. data/app/views/wallaby/resources/show/_money.html.erb +1 -0
  148. data/app/views/wallaby/resources/show/_numrange.html.erb +7 -0
  149. data/app/views/wallaby/resources/show/_point.html.erb +6 -0
  150. data/app/views/wallaby/resources/show/_string.html.erb +1 -0
  151. data/app/views/wallaby/resources/show/_text.html.erb +1 -0
  152. data/app/views/wallaby/resources/show/_time.html.erb +6 -0
  153. data/app/views/wallaby/resources/show/_tsrange.html.erb +7 -0
  154. data/app/views/wallaby/resources/show/_tstzrange.html.erb +7 -0
  155. data/app/views/wallaby/resources/show/_tsvector.html.erb +1 -0
  156. data/app/views/wallaby/resources/show/_uuid.html.erb +5 -0
  157. data/app/views/wallaby/resources/show/_xml.html.erb +5 -0
  158. data/app/views/wallaby/resources/show.html.erb +31 -0
  159. data/app/views/wallaby/shared/_flash_messages.html.erb +13 -0
  160. data/config/locales/en.yml +29 -0
  161. data/config/routes.rb +34 -0
  162. data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder.rb +105 -0
  163. data/lib/adaptors/wallaby/active_record/model_decorator/title_field_finder.rb +18 -0
  164. data/lib/adaptors/wallaby/active_record/model_decorator.rb +81 -0
  165. data/lib/adaptors/wallaby/active_record/model_finder.rb +12 -0
  166. data/lib/adaptors/wallaby/active_record/model_operator/normalizer.rb +44 -0
  167. data/lib/adaptors/wallaby/active_record/model_operator/permitter.rb +50 -0
  168. data/lib/adaptors/wallaby/active_record/model_operator/querier.rb +47 -0
  169. data/lib/adaptors/wallaby/active_record/model_operator/validator.rb +16 -0
  170. data/lib/adaptors/wallaby/active_record/model_operator.rb +82 -0
  171. data/lib/adaptors/wallaby/active_record.rb +2 -0
  172. data/lib/decorators/wallaby/resource_decorator.rb +78 -0
  173. data/lib/errors/wallaby/deprecated.rb +4 -0
  174. data/lib/errors/wallaby/general_error.rb +4 -0
  175. data/lib/errors/wallaby/invalid_error.rb +4 -0
  176. data/lib/errors/wallaby/model_not_found.rb +4 -0
  177. data/lib/errors/wallaby/not_authenticated.rb +4 -0
  178. data/lib/errors/wallaby/not_implemented.rb +4 -0
  179. data/lib/errors/wallaby/operation_not_found.rb +4 -0
  180. data/lib/errors/wallaby/resource_not_found.rb +4 -0
  181. data/lib/forms/wallaby/form_builder.rb +30 -0
  182. data/lib/handlers/wallaby/cached_compiled_erb.rb +14 -0
  183. data/lib/helpers/wallaby/application_helper.rb +30 -0
  184. data/lib/helpers/wallaby/core_helper.rb +50 -0
  185. data/lib/helpers/wallaby/form_helper.rb +21 -0
  186. data/lib/helpers/wallaby/links_helper.rb +83 -0
  187. data/lib/helpers/wallaby/paginatable_helper.rb +9 -0
  188. data/lib/helpers/wallaby/resources_helper.rb +55 -0
  189. data/lib/helpers/wallaby/secure_helper.rb +25 -0
  190. data/lib/helpers/wallaby/sorting_helper.rb +43 -0
  191. data/lib/helpers/wallaby/styling_helper.rb +57 -0
  192. data/lib/interfaces/wallaby/mode.rb +18 -0
  193. data/lib/interfaces/wallaby/model_decorator.rb +58 -0
  194. data/lib/interfaces/wallaby/model_finder.rb +5 -0
  195. data/lib/interfaces/wallaby/model_operator.rb +31 -0
  196. data/lib/services/wallaby/decorator_finder.rb +16 -0
  197. data/lib/services/wallaby/lookup_context_wrapper.rb +40 -0
  198. data/lib/services/wallaby/map.rb +53 -0
  199. data/lib/services/wallaby/model_servicer.rb +38 -0
  200. data/lib/services/wallaby/servicer_finder.rb +5 -0
  201. data/lib/tasks/wallaby_tasks.rake +4 -0
  202. data/lib/utils/wallaby/utils.rb +31 -0
  203. data/lib/wallaby/configuration/models.rb +17 -0
  204. data/lib/wallaby/configuration/security.rb +30 -0
  205. data/lib/wallaby/configuration.rb +49 -0
  206. data/lib/wallaby/engine.rb +89 -0
  207. data/lib/wallaby/version.rb +3 -0
  208. data/lib/wallaby.rb +5 -0
  209. 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,2 @@
1
+ <footer>
2
+ </footer>
@@ -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,5 @@
1
+ <h1>
2
+ Welcome
3
+ </h1>
4
+ <%# TODO: turn this page into intro maybe? %>
5
+ <%= render 'wallaby/shared/flash_messages' %>
@@ -0,0 +1 @@
1
+ <%= @exception.message %>
@@ -0,0 +1 @@
1
+ <%= @exception.message %>
@@ -0,0 +1,6 @@
1
+ <% error = @exception || params[:error] %>
2
+ <% if error %>
3
+ <p>
4
+ <%= error.message %> not found.
5
+ </p>
6
+ <% end %>
@@ -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,3 @@
1
+ <%= show_link(decorated, class: 'text-info') { itooltip ct('link.show'), 'link' } %>
2
+ <%= edit_link(decorated) { itooltip ct('link.edit'), 'pencil' } %>
3
+ <%= delete_link(decorated) { itooltip ct('link.delete'), 'trash' } %>
@@ -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,5 @@
1
+ <div class="form-group <%= form.error_class field_name %>">
2
+ <%= form.label field_name, metadata[:label] %>
3
+ <%= form.email_field field_name, class: 'form-control' %>
4
+ <%= form.error_messages field_name %>
5
+ </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>