udongo 5.9.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/backend/bootstrap.js +4 -4
  3. data/app/assets/javascripts/backend/flexible_content.js +1 -1
  4. data/app/assets/javascripts/backend/flexible_content_breakpoints.js +32 -0
  5. data/app/assets/stylesheets/backend/bootstrap.scss +4877 -1925
  6. data/app/assets/stylesheets/backend/components/_card.scss +3 -0
  7. data/app/assets/stylesheets/backend/components/_form.scss +1 -1
  8. data/app/assets/stylesheets/backend/components/{_tabs.scss → _tab.scss} +0 -0
  9. data/app/assets/stylesheets/backend/udongo.scss +2 -1
  10. data/app/controllers/backend/content/rows/videos_controller.rb +6 -0
  11. data/app/controllers/backend/content/rows_controller.rb +22 -1
  12. data/app/decorators/content_row_decorator.rb +20 -0
  13. data/app/decorators/content_video_decorator.rb +23 -0
  14. data/app/helpers/backend/dropdown_helper.rb +1 -1
  15. data/app/models/content_video.rb +11 -0
  16. data/app/models/email_template.rb +1 -1
  17. data/app/views/backend/_breadcrumbs.html.erb +3 -2
  18. data/app/views/backend/_navigation.html.erb +5 -2
  19. data/app/views/backend/admins/index.html.erb +2 -2
  20. data/app/views/backend/articles/images/index.html.erb +2 -2
  21. data/app/views/backend/articles/index.html.erb +2 -2
  22. data/app/views/backend/assets/index.html.erb +2 -2
  23. data/app/views/backend/content/_rows.html.erb +36 -2
  24. data/app/views/backend/content/_video.html.erb +8 -0
  25. data/app/views/backend/content/rows/columns/_column_width_explanation.html.erb +5 -0
  26. data/app/views/backend/content/rows/columns/_dimension_fields.html.erb +28 -10
  27. data/app/views/backend/content/rows/columns/edit.html.erb +2 -0
  28. data/app/views/backend/content/rows/columns/new.html.erb +2 -0
  29. data/app/views/backend/content/rows/videos/edit.html.erb +14 -0
  30. data/app/views/backend/email_templates/index.html.erb +1 -1
  31. data/app/views/backend/emails/index.html.erb +1 -1
  32. data/app/views/backend/forms/fields/index.html.erb +10 -17
  33. data/app/views/backend/forms/index.html.erb +7 -9
  34. data/app/views/backend/forms/submissions/index.html.erb +4 -9
  35. data/app/views/backend/images/index.html.erb +1 -3
  36. data/app/views/backend/images/new.html.erb +0 -1
  37. data/app/views/backend/navigations/index.html.erb +2 -2
  38. data/app/views/backend/pages/index.html.erb +1 -1
  39. data/app/views/backend/redirects/index.html.erb +3 -4
  40. data/app/views/backend/search_synonyms/_form.html.erb +15 -7
  41. data/app/views/backend/search_synonyms/index.html.erb +2 -2
  42. data/app/views/backend/snippets/index.html.erb +1 -1
  43. data/app/views/backend/users/index.html.erb +2 -2
  44. data/app/views/layouts/backend/_top_navigation.html.erb +46 -41
  45. data/app/views/layouts/backend/lightbox.html.erb +5 -1
  46. data/changelog.md +12 -0
  47. data/config/locales/en_backend.yml +11 -2
  48. data/config/locales/nl_backend.yml +11 -2
  49. data/config/routes.rb +4 -0
  50. data/db/migrate/20170507092541_add_alignment_options_to_content_rows.rb +7 -0
  51. data/db/migrate/20170507163532_create_content_videos.rb +10 -0
  52. data/lib/udongo/configs/flexible_content.rb +2 -6
  53. data/lib/udongo/version.rb +1 -1
  54. data/readme.md +1 -6
  55. data/spec/factories/content_videos.rb +4 -0
  56. metadata +14 -3
@@ -0,0 +1,3 @@
1
+ .card {
2
+ margin-bottom: 1rem;
3
+ }
@@ -1,5 +1,5 @@
1
1
  .form-actions {
2
- margin-top: 10px;
2
+ margin-bottom: 1rem;
3
3
  }
4
4
 
5
5
  .help-block {
@@ -10,12 +10,13 @@
10
10
 
11
11
  // Components
12
12
  @import 'components/navbar';
13
- @import 'components/tabs';
13
+ @import 'components/tab';
14
14
  @import 'components/breadcrumb';
15
15
  @import 'components/form';
16
16
  @import 'components/nav';
17
17
  @import 'components/page_tree';
18
18
  @import 'components/table';
19
+ @import 'components/card';
19
20
 
20
21
  // Page specific styles
21
22
  @import 'pages/login';
@@ -0,0 +1,6 @@
1
+ class Backend::Content::Rows::VideosController < Backend::BaseController
2
+ include Concerns::Backend::ContentTypeController
3
+
4
+ model ContentVideo
5
+ allowed_params :url, :aspect_ratio
6
+ end
@@ -1,6 +1,6 @@
1
1
  class Backend::Content::RowsController < Backend::BaseController
2
2
  include Concerns::Backend::PositionableController
3
- before_action :find_model, only: [:update_position, :destroy]
3
+ before_action :find_model, except: [:new]
4
4
 
5
5
  def new
6
6
  if params[:klass] && params[:id] && params[:locale]
@@ -13,6 +13,27 @@ class Backend::Content::RowsController < Backend::BaseController
13
13
  end
14
14
  end
15
15
 
16
+ def horizontal_alignment
17
+ align = params[:align].to_s
18
+ align = 'left' unless %w(left center right).include?(align)
19
+ @row.update_attribute :horizontal_alignment, align
20
+
21
+ redirect_back_to_content
22
+ end
23
+
24
+ def vertical_alignment
25
+ align = params[:align].to_s
26
+ align = 'top' unless %w(top center bottom).include?(align)
27
+ @row.update_attribute :vertical_alignment, align
28
+
29
+ redirect_back_to_content
30
+ end
31
+
32
+ def toggle_full_width
33
+ @row.update_attribute :full_width, !@row.full_width?
34
+ redirect_back_to_content
35
+ end
36
+
16
37
  def destroy
17
38
  @row.destroy
18
39
  redirect_back_to_content('content-rows')
@@ -6,4 +6,24 @@ class ContentRowDecorator < ApplicationDecorator
6
6
  def column_limit_reached?
7
7
  column_width_calculator.total(:width_xl) >= 12
8
8
  end
9
+
10
+ def classes
11
+ list = []
12
+
13
+ if horizontal_alignment.to_s == 'center'
14
+ list << 'justify-content-center'
15
+
16
+ elsif horizontal_alignment.to_s == 'right'
17
+ list << 'justify-content-end'
18
+ end
19
+
20
+ if vertical_alignment.to_s == 'center'
21
+ list << 'align-items-center'
22
+
23
+ elsif vertical_alignment.to_s == 'bottom'
24
+ list << 'align-items-end'
25
+ end
26
+
27
+ list
28
+ end
9
29
  end
@@ -0,0 +1,23 @@
1
+ class ContentVideoDecorator < ApplicationDecorator
2
+ delegate_all
3
+
4
+ def embed_url
5
+ url.to_s.include?('vimeo') ? vimeo_embed_url : youtube_embed_url
6
+ end
7
+
8
+ def aspect_ratio_class
9
+ aspect_ratio.to_s.split('x').join('by')
10
+ end
11
+
12
+ private
13
+
14
+ def vimeo_embed_url
15
+ video_id = /[0-9*]+/.match(url.to_s).to_s
16
+ "https://player.vimeo.com/video/#{video_id}"
17
+ end
18
+
19
+ def youtube_embed_url
20
+ video_id = url.to_s.split('v=').last
21
+ "https://www.youtube.com/embed/#{video_id}?rel=0"
22
+ end
23
+ end
@@ -8,7 +8,7 @@ module Backend
8
8
 
9
9
  def options_for_column_widths
10
10
  (1..12).to_a.reverse.map do |i|
11
- ["#{(i.to_f / 12.0 * 100).to_i}%", i]
11
+ ["#{i}/12", i]
12
12
  end
13
13
  end
14
14
  end
@@ -0,0 +1,11 @@
1
+ class ContentVideo < ApplicationRecord
2
+ include Concerns::ContentType
3
+
4
+ ASPECT_RATIOS = %w(16x9 21x9 4x3 1x1)
5
+
6
+ belongs_to :asset
7
+
8
+ def content_type
9
+ :video
10
+ end
11
+ end
@@ -4,7 +4,7 @@ class EmailTemplate < ApplicationRecord
4
4
 
5
5
  include Concerns::Sortable
6
6
 
7
- validates :description, :from_name, presence: true
7
+ validates :description, :from_name, :from_email, presence: true
8
8
  validates :identifier, presence: true, uniqueness: { case_sensitive: false }
9
9
  validates :from_email, email: true
10
10
  validates :cc, :bcc, email: true, allow_blank: true
@@ -3,10 +3,11 @@
3
3
  <li class="breadcrumb-item"><%= link_to icon(:home), backend_path %></li>
4
4
 
5
5
  <% breadcrumb.each do |item| %>
6
- <% klass = (item == breadcrumb.all.last) ? 'active' : '' %>
6
+ <% last = (item == breadcrumb.all.last) %>
7
+ <% klass = last ? 'active' : '' %>
7
8
  <li class="breadcrumb-item <%= klass %>">
8
9
 
9
- <% if item[:link].present? %>
10
+ <% if item[:link].present? && !last %>
10
11
  <%= link_to item[:name].to_s.html_safe, item[:link] %>
11
12
  <% else %>
12
13
  <%= item[:name].to_s.html_safe %>
@@ -1,8 +1,11 @@
1
- <nav class="navbar navbar-dark bg-inverse">
1
+ <nav class="navbar navbar-toggleable-md navbar-inverse bg-inverse">
2
+ <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#udongo-navbar" aria-controls="udongo-navbar" aria-expanded="false" aria-label="Toggle navigation">
3
+ <span class="navbar-toggler-icon"></span>
4
+ </button>
5
+
2
6
  <%= link_to backend_path, class: 'navbar-brand' do %>
3
7
  <%= Udongo.config.base.project_name %>
4
8
  <% end %>
5
9
 
6
10
  <%= render 'layouts/backend/top_navigation' %>
7
11
  </nav>
8
-
@@ -1,6 +1,6 @@
1
1
  <%= render 'backend/breadcrumbs' %>
2
2
 
3
- <p class="text-xs-right">
3
+ <p class="text-right">
4
4
  <%= link_to icon(:plus, t('b.add')), new_backend_admin_path, class: 'btn btn-primary btn-sm' %>
5
5
  </p>
6
6
 
@@ -19,7 +19,7 @@
19
19
  <tr>
20
20
  <td><%= a.full_name %></td>
21
21
  <td><%= mail_to a.email %></td>
22
- <td class="text-xs-right">
22
+ <td class="text-right">
23
23
  <%= link_to_edit [:backend, a] %>
24
24
  <%= link_to_delete [:backend, a] %>
25
25
  </td>
@@ -2,7 +2,7 @@
2
2
  <%= render 'backend/breadcrumbs' %>
3
3
  <%= render 'backend/articles/tabs', model: @article, active: :images %>
4
4
 
5
- <p class="text-xs-right">
5
+ <p class="text-right">
6
6
  <%= link_to icon(:plus, t('b.add')), backend_images_path(klass: @article.class.name, id: @article.id), class: 'btn btn-primary btn-sm' %>
7
7
  </p>
8
8
 
@@ -30,7 +30,7 @@
30
30
  <td><%= number_to_human_size a.filesize %></td>
31
31
  <td><%= simple_format a.description %></td>
32
32
  <td><%= l a.updated_at %></td>
33
- <td class="text-xs-right">
33
+ <td class="text-right">
34
34
  <%= link_to icon(:trash), unlink_backend_images_path(klass: @article.class.name, id: @article.id, asset_id: a.id), data: { confirm: t('b.msg.confirm') }, title: t('b.delete') %>
35
35
  </td>
36
36
  </tr>
@@ -1,6 +1,6 @@
1
1
  <%= render 'backend/breadcrumbs' %>
2
2
 
3
- <p class="text-xs-right">
3
+ <p class="text-right">
4
4
  <%= link_to icon(:plus, t('b.add')), new_backend_article_path, class: 'btn btn-primary btn-sm' %>
5
5
  </p>
6
6
 
@@ -40,7 +40,7 @@
40
40
  <td><%= l a.published_at if a.published_at %></td>
41
41
  <td><%= t a.visible?.to_s %></td>
42
42
  <td><%= t a.press_release?.to_s %></td>
43
- <td class="text-xs-right">
43
+ <td class="text-right">
44
44
  <%= link_to_edit_translation [:backend, a] %>
45
45
  <%= link_to_delete [:backend, a] %>
46
46
  </td>
@@ -1,7 +1,7 @@
1
1
  <%= render 'backend/breadcrumbs' %>
2
2
  <%= render 'filter' %>
3
3
 
4
- <p class="text-xs-right">
4
+ <p class="text-right">
5
5
  <%= link_to icon(:plus, t('b.add')), new_backend_asset_path, class: 'btn btn-primary btn-sm' %>
6
6
  </p>
7
7
 
@@ -32,7 +32,7 @@
32
32
  <td><%= number_to_human_size a.filesize %></td>
33
33
  <td><%= simple_format a.description %></td>
34
34
  <td><%= l a.updated_at %></td>
35
- <td class="text-xs-right">
35
+ <td class="text-right">
36
36
  <%= link_to_edit [:backend, a] %>
37
37
  <%= link_to_delete [:backend, a] if a.deletable? %>
38
38
  </td>
@@ -21,11 +21,45 @@
21
21
  <div id="content-row-<%= row.id %>" class="card content-row" data-update-position="<%= update_position_backend_content_row_path(row) %>">
22
22
  <div class="card-header handle">
23
23
  <div class="btn-group" role="group">
24
- <%= link_to icon(:trash, t('b.msg.flexible_content.delete_row')), backend_content_row_path(row), class: 'btn btn-secondary', method: :delete, data: { confirm: t('b.msg.confirm') } %>
24
+ <% klass = 'btn btn-secondary' %>
25
+ <% klass << ' active' if row.horizontal_alignment == 'left' || row.horizontal_alignment.blank? %>
26
+ <%= link_to icon(:align_left), horizontal_alignment_backend_content_row_path(row, align: 'left'), class: klass, title: t('b.msg.flexible_content.align_left'), data: { toggle: 'tooltip', placement: 'bottom' } %>
27
+
28
+ <% klass = 'btn btn-secondary' %>
29
+ <% klass << ' active' if row.horizontal_alignment == 'center' %>
30
+ <%= link_to icon(:align_center), horizontal_alignment_backend_content_row_path(row, align: 'center'), class: klass, title: t('b.msg.flexible_content.align_center'), data: { toggle: 'tooltip', placement: 'bottom' } %>
31
+
32
+ <% klass = 'btn btn-secondary' %>
33
+ <% klass << ' active' if row.horizontal_alignment == 'right' %>
34
+ <%= link_to icon(:align_right), horizontal_alignment_backend_content_row_path(row, align: 'right'), class: klass, title: t('b.msg.flexible_content.align_right'), data: { toggle: 'tooltip', placement: 'bottom' } %>
35
+ </div>
36
+
37
+ <div class="btn-group" role="group">
38
+ <% klass = 'btn btn-secondary' %>
39
+ <% klass << ' active' if row.vertical_alignment == 'top' || row.vertical_alignment.blank? %>
40
+ <%= link_to icon(:long_arrow_up), vertical_alignment_backend_content_row_path(row, align: 'top') , class: klass, title: t('b.msg.flexible_content.align_vertical_top'), data: { toggle: 'tooltip', placement: 'bottom' } %>
41
+
42
+ <% klass = 'btn btn-secondary' %>
43
+ <% klass << ' active' if row.vertical_alignment == 'center' %>
44
+ <%= link_to icon(:arrows_v), vertical_alignment_backend_content_row_path(row, align: 'center'), class: klass, title: t('b.msg.flexible_content.align_vertical_center'), data: { toggle: 'tooltip', placement: 'bottom' } %>
45
+
46
+ <% klass = 'btn btn-secondary' %>
47
+ <% klass << ' active' if row.vertical_alignment == 'bottom' %>
48
+ <%= link_to icon(:long_arrow_down), vertical_alignment_backend_content_row_path(row, align: 'bottom'), class: klass, title: t('b.msg.flexible_content.align_vertical_bottom'), data: { toggle: 'tooltip', placement: 'bottom' } %>
49
+ </div>
50
+
51
+ <div class="btn-group" role="group">
52
+ <% klass = 'btn btn-secondary' %>
53
+ <% klass << ' active' if row.full_width? %>
54
+ <%= link_to icon(:arrows_h), toggle_full_width_backend_content_row_path(row), class: klass, title: t('b.msg.flexible_content.full_width'), data: { toggle: 'tooltip', placement: 'bottom' } %>
55
+ </div>
56
+
57
+ <div class="btn-group" role="group">
58
+ <%= link_to icon(:trash), backend_content_row_path(row), class: 'btn btn-secondary', title: t('b.delete'), method: :delete, data: { toggle: 'tooltip', placement: 'bottom', confirm: t('b.msg.confirm') } %>
25
59
  </div>
26
60
  </div>
27
61
 
28
- <div class="row content-columns card-block">
62
+ <div class="row content-columns card-block <%= row.classes.join(' ') %>">
29
63
  <% row.columns.each do |column| %>
30
64
  <% content = column.content.decorate %>
31
65
 
@@ -0,0 +1,8 @@
1
+ <% if object.url.present? && object.aspect_ratio.present? %>
2
+ <div class="embed-responsive embed-responsive-<%= object.aspect_ratio_class %>">
3
+ <iframe class="embed-responsive-item" src="<%= object.embed_url %>" allowfullscreen></iframe>
4
+ </div>
5
+
6
+ <% else %>
7
+ <p><%= t 'b.msg.flexible_content.no_video_present' %></p>
8
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <div class="alert alert-info">
2
+ <p class="m-b-0">
3
+ <%= icon(:info) %> <%= t 'b.msg.flexible_content.width_explanation' %>
4
+ </p>
5
+ </div>
@@ -1,11 +1,29 @@
1
- <% Udongo::Configs::FlexibleContent::BREAKPOINTS.each do |bp| %>
2
- <%=
3
- form.input(
4
- "width_#{bp}",
5
- as: :select,
6
- collection: options_for_column_widths,
7
- include_blank: false,
8
- wrapper_html: { hidden: !Udongo.config.flexible_content.allowed_breakpoint?(bp) }
9
- )
10
- %>
1
+ <% javascript 'backend/flexible_content_breakpoints' %>
2
+
3
+ <% Udongo::Configs::FlexibleContent::BREAKPOINTS.each do |b| %>
4
+ <% if b == Udongo::Configs::FlexibleContent::DEFAULT_BREAKPOINT %>
5
+ <%=
6
+ form.input(
7
+ "width_#{b}",
8
+ as: :select,
9
+ collection: options_for_column_widths,
10
+ include_blank: false,
11
+ label: t('simple_form.labels.defaults.width'),
12
+ wrapper_html: { data: { default_breakpoint: true }}
13
+ )
14
+ %>
15
+
16
+ <%= link_to icon(:cog, t('b.advanced')), '#', data: { show_all_breakpoints: true } %>
17
+
18
+ <% else %>
19
+ <%=
20
+ form.input(
21
+ "width_#{b}",
22
+ as: :select,
23
+ collection: options_for_column_widths,
24
+ include_blank: false,
25
+ wrapper_html: { style: 'display: none;', data: { advanced_breakpoint: true, "breakpoint_#{b}": true }}
26
+ )
27
+ %>
28
+ <% end %>
11
29
  <% end %>
@@ -1,6 +1,8 @@
1
1
  <%= render 'backend/general_form_error', object: @column %>
2
2
 
3
3
  <%= simple_form_for(@column, url: backend_content_row_column_path(@row, @column)) do |f| %>
4
+ <%= render 'column_width_explanation' %>
5
+
4
6
  <div class="card">
5
7
  <div class="card-header">
6
8
  <%= t 'b.msg.flexible_content.edit_column' %>
@@ -1,6 +1,8 @@
1
1
  <%= render 'backend/general_form_error', object: @column %>
2
2
 
3
3
  <%= simple_form_for(@column, url: backend_content_row_columns_path(@row)) do |f| %>
4
+ <%= render 'column_width_explanation' %>
5
+
4
6
  <div class="card">
5
7
  <div class="card-header">
6
8
  <%= t 'b.msg.flexible_content.add_column' %>
@@ -0,0 +1,14 @@
1
+ <%= simple_form_for [:backend, @model] do |f| %>
2
+ <div class="card">
3
+ <div class="card-header">
4
+ <%= t 'b.msg.flexible_content.edit_video' %>
5
+ </div>
6
+
7
+ <div class="card-block">
8
+ <%= f.input :url, as: :string %>
9
+ <%= f.input :aspect_ratio, collection: ContentVideo::ASPECT_RATIOS, include_blank: false %>
10
+ </div>
11
+ </div>
12
+
13
+ <%= render 'backend/form_actions', cancel_url: content_path %>
14
+ <% end %>
@@ -14,7 +14,7 @@
14
14
  <% @email_templates.each do |s| %>
15
15
  <tr data-update-position="<%= update_position_backend_email_template_path(s) %>">
16
16
  <td><%= s.description %></td>
17
- <td class="text-xs-right">
17
+ <td class="text-right">
18
18
  <%= link_to_edit_translation [:backend, s] %>
19
19
  </td>
20
20
  </tr>
@@ -27,7 +27,7 @@
27
27
  <%= t 'b.not_yet_sent' %>
28
28
  <% end %>
29
29
  </td>
30
- <td class="right icons">
30
+ <td class="text-right">
31
31
  <%= link_to_show [:backend, e] %>
32
32
  </td>
33
33
  </tr>
@@ -4,6 +4,10 @@
4
4
  <%= render 'backend/breadcrumbs' %>
5
5
 
6
6
  <% if @form.fields.any? %>
7
+ <p class="text-right">
8
+ <%= link_to icon(:plus, t('b.add')), new_backend_form_field_path(@form), class: 'btn btn-primary btn-sm' %>
9
+ </p>
10
+
7
11
  <table class="table table-striped table-hover">
8
12
  <thead class="thead-inverse">
9
13
  <tr>
@@ -12,19 +16,11 @@
12
16
  </tr>
13
17
  </thead>
14
18
 
15
- <tfoot>
16
- <tr>
17
- <td colspan="2" class="text-xs-center">
18
- <%= link_to icon(:plus, t('b.msg.form_fields.add')), new_backend_form_field_path(@form), class: 'btn btn-primary' %>
19
- </td>
20
- </tr>
21
- </tfoot>
22
-
23
19
  <tbody>
24
20
  <% @form.fields.each do |f| %>
25
21
  <tr data-update-position="<%= update_position_backend_form_field_path(@form, f) %>">
26
22
  <td><%= f.identifier %></td>
27
- <td class="text-xs-right">
23
+ <td class="text-right">
28
24
  <%= link_to_edit edit_backend_form_field_path(@form, f) %>
29
25
  <%= link_to_delete backend_form_field_path(@form, f) %>
30
26
  </td>
@@ -32,13 +28,10 @@
32
28
  <% end %>
33
29
  </tbody>
34
30
  </table>
31
+
35
32
  <% else %>
36
- <div class="text-xs-center">
37
- <p>
38
- <%= t('b.msg.form_fields.explanation') %>
39
- </p>
40
- <p>
41
- <%= link_to t('b.msg.form_fields.add_first'), new_backend_form_field_path(@form), class: 'btn btn-primary' %>
42
- </p>
43
- </div>
33
+ <p><%= t('b.msg.form_fields.explanation') %></p>
34
+ <p>
35
+ <%= link_to t('b.msg.form_fields.add_first'), new_backend_form_field_path(@form), class: 'btn btn-primary' %>
36
+ </p>
44
37
  <% end %>