weeler 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/README.md +4 -0
  4. data/app/.DS_Store +0 -0
  5. data/app/assets/.DS_Store +0 -0
  6. data/app/assets/javascripts/.DS_Store +0 -0
  7. data/app/assets/javascripts/weeler.js.coffee +8 -0
  8. data/app/assets/javascripts/weeler/.DS_Store +0 -0
  9. data/app/assets/javascripts/weeler/bootstrap-fileupload.js +169 -0
  10. data/app/assets/javascripts/weeler/bootstrap.js +1992 -0
  11. data/app/assets/javascripts/weeler/bootstrap.rowlink.js +71 -0
  12. data/app/assets/javascripts/weeler/bootstrap.switch.js +382 -0
  13. data/app/assets/javascripts/weeler/jquery.pnotify.js +912 -0
  14. data/app/assets/stylesheets/.DS_Store +0 -0
  15. data/app/assets/stylesheets/weeler.css +9 -0
  16. data/app/assets/stylesheets/weeler/.DS_Store +0 -0
  17. data/app/assets/stylesheets/weeler/bootstrap-fileupload.css +132 -0
  18. data/app/assets/stylesheets/weeler/bootstrap.css +6086 -0
  19. data/app/assets/stylesheets/weeler/bootstrap.min.css +9 -0
  20. data/app/assets/stylesheets/weeler/bootstrap.rowlink.css +50 -0
  21. data/app/assets/stylesheets/weeler/bootstrap.spinner.css +43 -0
  22. data/app/assets/stylesheets/weeler/bootstrap.switch.css +408 -0
  23. data/app/assets/stylesheets/weeler/jquery.pnotify.css +84 -0
  24. data/app/assets/stylesheets/weeler/style.css.scss.erb +48 -0
  25. data/app/controllers/weeler/base_controller.rb +16 -0
  26. data/app/controllers/weeler/home_controller.rb +8 -0
  27. data/app/controllers/weeler/translations_controller.rb +151 -0
  28. data/app/views/kaminari/_first_page.html.erb +13 -0
  29. data/app/views/kaminari/_gap.html.erb +8 -0
  30. data/app/views/kaminari/_last_page.html.erb +13 -0
  31. data/app/views/kaminari/_next_page.html.erb +14 -0
  32. data/app/views/kaminari/_page.html.erb +12 -0
  33. data/app/views/kaminari/_paginator.html.erb +23 -0
  34. data/app/views/kaminari/_prev_page.html.erb +13 -0
  35. data/app/views/layouts/weeler/base.html.erb +86 -0
  36. data/app/views/weeler/home/about.html.erb +16 -0
  37. data/app/views/weeler/home/index.html.erb +4 -0
  38. data/app/views/weeler/translations/_form.html.erb +43 -0
  39. data/app/views/weeler/translations/_translation.html.erb +11 -0
  40. data/app/views/weeler/translations/edit.html.erb +19 -0
  41. data/app/views/weeler/translations/index.html.erb +106 -0
  42. data/app/views/weeler/translations/new.html.erb +19 -0
  43. data/config/initializers/weeler_mime_types.rb +1 -0
  44. data/lib/.DS_Store +0 -0
  45. data/lib/generators/weeler/.DS_Store +0 -0
  46. data/lib/generators/weeler/install_generator.rb +73 -0
  47. data/lib/generators/weeler/templates/initializers/weeler.rb +7 -0
  48. data/lib/generators/weeler/templates/migrations/create_weeler_translations.rb +16 -0
  49. data/lib/i18n/.DS_Store +0 -0
  50. data/lib/i18n/backend/.DS_Store +0 -0
  51. data/lib/i18n/backend/weeler.rb +76 -0
  52. data/lib/i18n/backend/weeler/store_procs.rb +39 -0
  53. data/lib/i18n/backend/weeler/translation.rb +118 -0
  54. data/lib/i18n/humanize_missing_translations.rb +11 -0
  55. data/lib/i18n/weeler.rb +6 -0
  56. data/lib/weeler.rb +25 -1
  57. data/lib/weeler/.DS_Store +0 -0
  58. data/lib/weeler/engine.rb +11 -0
  59. data/lib/weeler/route_mapper.rb +41 -0
  60. data/lib/weeler/version.rb +1 -1
  61. data/rspec.html +454 -0
  62. data/spec/.DS_Store +0 -0
  63. data/spec/controllers/translations_controller_spec.rb +41 -0
  64. data/spec/dummy/README.rdoc +28 -0
  65. data/spec/dummy/Rakefile +6 -0
  66. data/spec/dummy/app/assets/images/.keep +0 -0
  67. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  68. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  69. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  70. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  71. data/spec/dummy/app/controllers/weeler/posts_controller.rb +7 -0
  72. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  73. data/spec/dummy/app/mailers/.keep +0 -0
  74. data/spec/dummy/app/models/.keep +0 -0
  75. data/spec/dummy/app/models/concerns/.keep +0 -0
  76. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  77. data/spec/dummy/bin/bundle +3 -0
  78. data/spec/dummy/bin/rails +4 -0
  79. data/spec/dummy/bin/rake +4 -0
  80. data/spec/dummy/config.ru +4 -0
  81. data/spec/dummy/config/application.rb +23 -0
  82. data/spec/dummy/config/boot.rb +5 -0
  83. data/spec/dummy/config/database.yml +25 -0
  84. data/spec/dummy/config/environment.rb +5 -0
  85. data/spec/dummy/config/environments/development.rb +29 -0
  86. data/spec/dummy/config/environments/production.rb +80 -0
  87. data/spec/dummy/config/environments/test.rb +36 -0
  88. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  89. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  90. data/spec/dummy/config/initializers/inflections.rb +16 -0
  91. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  92. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  93. data/spec/dummy/config/initializers/session_store.rb +3 -0
  94. data/spec/dummy/config/initializers/weeler.rb +2 -0
  95. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  96. data/spec/dummy/config/locales/en.yml +23 -0
  97. data/spec/dummy/config/routes.rb +5 -0
  98. data/spec/dummy/db/development.sqlite3 +0 -0
  99. data/spec/dummy/db/migrate/20131015144900_create_weeler_translations.rb +16 -0
  100. data/spec/dummy/db/production.sqlite3 +0 -0
  101. data/spec/dummy/db/schema.rb +29 -0
  102. data/spec/dummy/db/test.sqlite3 +0 -0
  103. data/spec/dummy/lib/assets/.keep +0 -0
  104. data/spec/dummy/log/.keep +0 -0
  105. data/spec/dummy/log/development.log +19 -0
  106. data/spec/dummy/log/production.log +4 -0
  107. data/spec/dummy/log/test.log +38396 -0
  108. data/spec/dummy/public/404.html +58 -0
  109. data/spec/dummy/public/422.html +58 -0
  110. data/spec/dummy/public/500.html +57 -0
  111. data/spec/dummy/public/favicon.ico +0 -0
  112. data/spec/factories/translations.rb +7 -0
  113. data/spec/routing/routes_spec.rb +140 -0
  114. data/spec/spec_helper.rb +54 -0
  115. data/spec/weeler/.DS_Store +0 -0
  116. data/spec/weeler/i18n_backend_weeler_spec.rb +169 -0
  117. data/spec/weeler/i18n_humanize_missing_translations_spec.rb +18 -0
  118. data/weeler.gemspec +14 -0
  119. metadata +354 -3
@@ -0,0 +1,84 @@
1
+ /*
2
+ Document : jquery.pnotify.default.css
3
+ Created on : Nov 23, 2009, 3:14:10 PM
4
+ Author : Hunter Perrin
5
+ Version : 1.2.0
6
+ Link : http://pinesframework.org/pnotify/
7
+ Description:
8
+ Default styling for Pines Notify jQuery plugin.
9
+ */
10
+ /* -- Notice */
11
+ .ui-pnotify {
12
+ bottom: 25px;
13
+ right: 25px;
14
+ position: absolute;
15
+ height: auto;
16
+ /* Ensures notices are above everything */
17
+ z-index: 9999;
18
+ }
19
+ /* Hides position: fixed from IE6 */
20
+ html > body .ui-pnotify {
21
+ position: fixed;
22
+ }
23
+ .ui-pnotify .ui-pnotify-shadow {
24
+ -webkit-box-shadow: 0px 2px 10px rgba(50, 50, 50, 0.5);
25
+ -moz-box-shadow: 0px 2px 10px rgba(50, 50, 50, 0.5);
26
+ box-shadow: 0px 2px 10px rgba(50, 50, 50, 0.5);
27
+ }
28
+ .ui-pnotify-container {
29
+ background-position: 0 0;
30
+ padding: .8em;
31
+ height: 100%;
32
+ margin: 0;
33
+ }
34
+ .ui-pnotify-sharp {
35
+ -webkit-border-radius: 0;
36
+ -moz-border-radius: 0;
37
+ border-radius: 0;
38
+ }
39
+ .ui-pnotify-closer, .ui-pnotify-sticker {
40
+ float: right;
41
+ margin-left: .1em;
42
+ }
43
+ .ui-pnotify-title {
44
+ display: block;
45
+ margin-bottom: .1em;
46
+ text-transform: capitalize;
47
+ }
48
+ .ui-pnotify-text {
49
+ display: block;
50
+ }
51
+ .ui-pnotify-icon, .ui-pnotify-icon span {
52
+ display: block;
53
+ float: left;
54
+ margin-right: .1em;
55
+ }
56
+ /* -- History Pulldown */
57
+ .ui-pnotify-history-container {
58
+ position: absolute;
59
+ top: 0;
60
+ right: 18px;
61
+ width: 70px;
62
+ border-top: none;
63
+ padding: 0;
64
+ -webkit-border-top-left-radius: 0;
65
+ -moz-border-top-left-radius: 0;
66
+ border-top-left-radius: 0;
67
+ -webkit-border-top-right-radius: 0;
68
+ -moz-border-top-right-radius: 0;
69
+ border-top-right-radius: 0;
70
+ /* Ensures history container is above notices. */
71
+ z-index: 10000;
72
+ }
73
+ .ui-pnotify-history-container .ui-pnotify-history-header {
74
+ padding: 2px;
75
+ }
76
+ .ui-pnotify-history-container button {
77
+ cursor: pointer;
78
+ display: block;
79
+ width: 100%;
80
+ }
81
+ .ui-pnotify-history-container .ui-pnotify-history-pulldown {
82
+ display: block;
83
+ margin: 0 auto;
84
+ }
@@ -0,0 +1,48 @@
1
+ /*
2
+ * Style twaks
3
+ * --------------------------------------------------
4
+ */
5
+ body {
6
+ padding-top: 70px;
7
+ }
8
+ footer {
9
+ padding-left: 15px;
10
+ padding-right: 15px;
11
+ }
12
+
13
+ /*
14
+ * Off Canvas
15
+ * --------------------------------------------------
16
+ */
17
+ @media screen and (max-width: 768px) {
18
+ .row-offcanvas {
19
+ position: relative;
20
+ -webkit-transition: all 0.25s ease-out;
21
+ -moz-transition: all 0.25s ease-out;
22
+ transition: all 0.25s ease-out;
23
+ }
24
+
25
+ .row-offcanvas-right
26
+ .sidebar-offcanvas {
27
+ right: -50%; /* 6 columns */
28
+ }
29
+
30
+ .row-offcanvas-left
31
+ .sidebar-offcanvas {
32
+ left: -50%; /* 6 columns */
33
+ }
34
+
35
+ .row-offcanvas-right.active {
36
+ right: 50%; /* 6 columns */
37
+ }
38
+
39
+ .row-offcanvas-left.active {
40
+ left: 50%; /* 6 columns */
41
+ }
42
+
43
+ .sidebar-offcanvas {
44
+ position: absolute;
45
+ top: 0;
46
+ width: 50%; /* 6 columns */
47
+ }
48
+ }
@@ -0,0 +1,16 @@
1
+ module Weeler
2
+ class BaseController < ApplicationController
3
+ before_filter :set_current_menu_item
4
+ before_filter :run_weeler_required_user_method
5
+
6
+ private
7
+
8
+ def set_current_menu_item
9
+ @current_menu_item = "home"
10
+ end
11
+
12
+ def run_weeler_required_user_method
13
+ eval(Weeler.required_user_method.to_s) if Weeler.required_user_method.present?
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ module Weeler
2
+ class HomeController < BaseController
3
+ def index; end
4
+ def about
5
+ @current_menu_item = "about"
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,151 @@
1
+ module Weeler
2
+ class TranslationsController < BaseController
3
+
4
+ def index
5
+ @translations = translations_by_params
6
+ @translations = @translations.page(params[:page]).per(20)
7
+ @groups = I18n::Backend::Weeler::Translation.groups
8
+ end
9
+
10
+ def new
11
+ @translation = I18n::Backend::Weeler::Translation.new
12
+ end
13
+
14
+ def edit
15
+ @translation = I18n::Backend::Weeler::Translation.find(params[:id])
16
+ end
17
+
18
+ def create
19
+ @translation = I18n::Backend::Weeler::Translation.new(translation_params)
20
+ if @translation.save
21
+ redirect_to edit_weeler_translation_path(@translation), flash: {success: "Translation saved."}
22
+ else
23
+ flash.now[:error] = "Errors in saving."
24
+ render :edit
25
+ end
26
+ end
27
+
28
+ def update
29
+ @translation = I18n::Backend::Weeler::Translation.find(params[:id])
30
+ if @translation.update_attributes(translation_params)
31
+ redirect_to edit_weeler_translation_path(@translation), flash: {success: "Translation updated."}
32
+ else
33
+ flash.now[:error] = "Errors in updating."
34
+ render :edit
35
+ end
36
+ end
37
+
38
+ def destroy
39
+ @translation = I18n::Backend::Weeler::Translation.find(params[:id])
40
+ @translation.destroy
41
+ redirect_to weeler_translations_path, flash: {success: "Translation succesfully removed."}
42
+ end
43
+
44
+ def export
45
+ require( 'axlsx' )
46
+
47
+ # construct xlsx file
48
+ p = Axlsx::Package.new
49
+ # Numbers requires this
50
+ p.use_shared_strings = true
51
+
52
+ sheet = p.workbook.add_worksheet(name: "translations")
53
+
54
+ # All used locales and translations by params
55
+ locales = I18n::Backend::Weeler::Translation.available_locales
56
+ locales = locales.select{ |l| l.present? }
57
+ @translations = translations_by_params
58
+
59
+ # title row
60
+ row = [ 'Key' ]
61
+ locales.each do |locale|
62
+ row.push(locale.capitalize)
63
+ end
64
+
65
+ sheet.add_row(row)
66
+
67
+ @translations.each do |translation|
68
+ row = [ translation.key ]
69
+ locales.each do |locale|
70
+ result = I18n::Backend::Weeler::Translation.locale(locale).lookup(translation.key).load
71
+ if result.first.present?
72
+ row.push(result.first.value)
73
+ else
74
+ row.push("")
75
+ end
76
+ end
77
+
78
+ sheet.add_row(row)
79
+ end
80
+
81
+ respond_to do |format|
82
+ format.xlsx do
83
+ outstrio = StringIO.new
84
+ outstrio.write(p.to_stream.read)
85
+ send_data(outstrio.string, filename: "translations" + '.xlsx')
86
+ end
87
+ end
88
+
89
+ end
90
+
91
+ def import
92
+ require "roo"
93
+ xls = Roo::Excelx.new(params[:file].tempfile.path, file_warning: :ignore)
94
+
95
+ xls.each_with_pagename do |name, sheet|
96
+
97
+ # Lookup locales
98
+ locales = []
99
+ sheet.row(1).each_with_index do |cell, i|
100
+ if i > 0
101
+ locales.push(cell.downcase)
102
+ end
103
+ end
104
+
105
+ # Lookup values
106
+ (2..sheet.last_row).each do |row_no|
107
+ locale = nil
108
+ key = nil
109
+ value = nil
110
+ sheet.row(row_no).each_with_index do |cell, i|
111
+ if i == 0
112
+ key = cell
113
+ else
114
+ locale = locales[ i - 1 ]
115
+ value = cell.nil? ? '' : cell
116
+
117
+ p "> Readed: #{locale}.#{key} = #{value} "
118
+ if locale.present? && key.present?
119
+ translation = I18n::Backend::Weeler::Translation.find_or_initialize_by locale: locale, key: key
120
+ if translation.value != value
121
+ translation.value = value
122
+ translation.save
123
+ end
124
+ end
125
+
126
+ end
127
+ end # cells
128
+
129
+ end # rows
130
+
131
+ end # sheets
132
+ redirect_to weeler_translations_path, flash: {success: "Translations succesfully imported."}
133
+ end
134
+
135
+ private
136
+
137
+ def translation_params
138
+ params.require(:i18n_backend_weeler_translation).permit([:locale, :key, :value, :is_proc, :interpolations => []])
139
+ end
140
+
141
+ def translations_by_params
142
+ translations = I18n::Backend::Weeler::Translation.order("locale, key")
143
+
144
+ translations = translations.where("key LIKE ?", "%#{params[:query]}%") if params[:query]
145
+ translations = translations.where(locale: params[:locale]) if params[:locale].present?
146
+ translations = translations.lookup(params[:group]) if params[:group].present?
147
+ translations
148
+ end
149
+
150
+ end
151
+ end
@@ -0,0 +1,13 @@
1
+ <%# Link to the "First" page
2
+ - available local variables
3
+ url: url to the first page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <% unless current_page.first? -%>
10
+ <li class="first">
11
+ <%= link_to raw(t 'views.pagination.first'), url, {:remote => remote} %>
12
+ </li>
13
+ <% end -%>
@@ -0,0 +1,8 @@
1
+ <%# Non-link tag that stands for skipped pages...
2
+ - available local variables
3
+ current_page: a page object for the currently displayed page
4
+ total_pages: total number of pages
5
+ per_page: number of items to fetch per page
6
+ remote: data-remote
7
+ -%>
8
+ <li class="page gap disabled"><a href="javascript:void(0)"><%= raw(t 'views.pagination.truncate') %></a></li>
@@ -0,0 +1,13 @@
1
+ <%# Link to the "Last" page
2
+ - available local variables
3
+ url: url to the last page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <% unless current_page.last? -%>
10
+ <li class="last">
11
+ <%= link_to raw(t 'views.pagination.last'), url, {:remote => remote} %>
12
+ </li>
13
+ <% end -%>
@@ -0,0 +1,14 @@
1
+ <%# Link to the "Next" page
2
+ - available local variables
3
+ url: url to the next page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+
10
+ <% unless current_page.last? -%>
11
+ <li class="next">
12
+ <%= link_to raw(t 'views.pagination.next'), url, :remote => remote, :rel => 'next' %>
13
+ </li>
14
+ <% end -%>
@@ -0,0 +1,12 @@
1
+ <%# Link showing page number
2
+ - available local variables
3
+ page: a page object for "this" page
4
+ url: url to this page
5
+ current_page: a page object for the currently displayed page
6
+ total_pages: total number of pages
7
+ per_page: number of items to fetch per page
8
+ remote: data-remote
9
+ -%>
10
+ <li class="page<%= ' active' if page.current? %>">
11
+ <%= link_to page, (page.current? ? 'javascript:void(0)' : url), opts = {:remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil} %>
12
+ </li>
@@ -0,0 +1,23 @@
1
+ <%# The container tag
2
+ - available local variables
3
+ current_page: a page object for the currently displayed page
4
+ total_pages: total number of pages
5
+ per_page: number of items to fetch per page
6
+ remote: data-remote
7
+ paginator: the paginator that renders the pagination tags inside
8
+ -%>
9
+ <%= paginator.render do -%>
10
+ <ul class="pagination pagination-lg pull-right">
11
+ <%= first_page_tag unless current_page.first? %>
12
+ <%= prev_page_tag unless current_page.first? %>
13
+ <% each_page do |page| -%>
14
+ <% if page.left_outer? || page.right_outer? || page.inside_window? -%>
15
+ <%= page_tag page %>
16
+ <% elsif !page.was_truncated? -%>
17
+ <%= gap_tag %>
18
+ <% end -%>
19
+ <% end -%>
20
+ <%= next_page_tag unless current_page.last? %>
21
+ <%= last_page_tag unless current_page.last? %>
22
+ </ul>
23
+ <% end -%>
@@ -0,0 +1,13 @@
1
+ <%# Link to the "Previous" page
2
+ - available local variables
3
+ url: url to the previous page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <% unless current_page.first? -%>
10
+ <li class="prev">
11
+ <%= link_to raw(t 'views.pagination.previous'), url, :remote => remote, :rel => 'prev' %>
12
+ </li>
13
+ <% end -%>
@@ -0,0 +1,86 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <title>Weeler</title>
6
+
7
+ <meta charset="utf-8">
8
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
9
+
10
+ <%= stylesheet_link_tag "weeler", :media => "all" %>
11
+ <%= javascript_include_tag "weeler" %>
12
+
13
+ <%= csrf_meta_tags %>
14
+
15
+ <% flash.each do |name, message| %>
16
+ <script type="text/javascript">
17
+ $(function(){
18
+ $.pnotify({
19
+ type: '<%= name %>', // 'notice', 'info', 'success', 'error'
20
+ title: '<%= name %>',
21
+ text: '<%= message %>',
22
+ styling: 'bootstrap',
23
+ shadow: false,
24
+ animation: 'fade',
25
+ closer: true,
26
+ history: false,
27
+ auto_display: true
28
+ });
29
+ });
30
+ </script>
31
+ <% end %>
32
+ </head>
33
+
34
+ <body>
35
+ <div class="navbar navbar-fixed-top navbar-inverse" role="navigation">
36
+ <div class="container">
37
+ <div class="navbar-header">
38
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
39
+ <span class="icon-bar"></span>
40
+ <span class="icon-bar"></span>
41
+ <span class="icon-bar"></span>
42
+ </button>
43
+ <a class="navbar-brand" href="<%= weeler_root_path %>">Weeler</a>
44
+ </div>
45
+ <div class="collapse navbar-collapse">
46
+ <ul class="nav navbar-nav">
47
+ <li class="<%= 'active' if @current_menu_item == 'home' %>"><a href="<%= weeler_root_path %>">Home</a></li>
48
+ <li class="<%= 'active' if @current_menu_item == 'about' %>"><a href="<%= weeler_about_path %>">About</a></li>
49
+ </ul>
50
+ </div><!-- /.nav-collapse -->
51
+ </div><!-- /.container -->
52
+ </div><!-- /.navbar -->
53
+
54
+ <div class="container">
55
+
56
+ <div class="row row-offcanvas row-offcanvas-right">
57
+ <div class="col-xs-6 col-sm-3 sidebar-offcanvas" id="sidebar" role="navigation">
58
+ <div class="well sidebar-nav">
59
+ <ul class="nav">
60
+ <li>Configuration</li>
61
+ <li class="<%= "active" %> "><a href="<%= weeler_translations_path %>">Translations</a></li>
62
+ <li>Content</li>
63
+
64
+ <% Weeler.menu_items.each do |item| %>
65
+ <li><%= link_to item.to_s.capitalize, eval("weeler_#{item.to_s}_path") %></li>
66
+ <% end %>
67
+
68
+ </ul>
69
+ </div><!--/.well -->
70
+ </div><!--/span-->
71
+ <div class="col-xs-12 col-sm-9">
72
+ <%= yield %>
73
+ </div><!--/span-->
74
+ </div><!--/row-->
75
+
76
+ <hr>
77
+
78
+ <footer>
79
+ <p>&copy; Weby 2013</p>
80
+ </footer>
81
+
82
+ </div><!--/.container-->
83
+
84
+ </body>
85
+
86
+ </html>