mumuki-laboratory 8.6.0 → 9.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/mumuki_laboratory/application/certificate.js +17 -0
  3. data/app/assets/javascripts/mumuki_laboratory/application/faqs.js +90 -0
  4. data/app/assets/javascripts/mumuki_laboratory/application/upload.js +69 -14
  5. data/app/assets/javascripts/mumuki_laboratory/application/user.js +16 -5
  6. data/app/assets/stylesheets/mumuki_laboratory/application/_layout.scss +3 -0
  7. data/app/assets/stylesheets/mumuki_laboratory/application/_modules.scss +3 -0
  8. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_certificate.scss +33 -0
  9. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_content_show.scss +15 -2
  10. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_faqs.scss +84 -0
  11. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_medal.scss +1 -1
  12. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_user_menu.scss +63 -0
  13. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_user_profile.scss +11 -0
  14. data/app/controllers/api/base_controller.rb +0 -1
  15. data/app/controllers/api/courses_controller.rb +1 -1
  16. data/app/controllers/api/organizations_controller.rb +5 -2
  17. data/app/controllers/api/roles_controller.rb +4 -0
  18. data/app/controllers/api/users_controller.rb +6 -1
  19. data/app/controllers/certificates_controller.rb +28 -0
  20. data/app/controllers/concerns/with_authorization.rb +1 -16
  21. data/app/controllers/concerns/with_certificate_render.rb +25 -0
  22. data/app/controllers/concerns/with_user_params.rb +4 -0
  23. data/app/controllers/discussions_messages_controller.rb +0 -1
  24. data/app/controllers/faqs_controller.rb +6 -0
  25. data/app/controllers/users_controller.rb +12 -5
  26. data/app/helpers/breadcrumbs_helper.rb +4 -0
  27. data/app/helpers/certificate_helper.rb +13 -0
  28. data/app/helpers/content_view_helper.rb +19 -0
  29. data/app/helpers/exercise_input_helper.rb +8 -17
  30. data/app/helpers/links_helper.rb +11 -3
  31. data/app/helpers/menu_bar_helper.rb +15 -11
  32. data/app/helpers/user_menu_helper.rb +36 -0
  33. data/app/mailers/application_mailer.rb +0 -1
  34. data/app/mailers/user_mailer.rb +9 -0
  35. data/app/views/certificates/_certificate.html.erb +44 -0
  36. data/app/views/certificates/_download.html.erb +20 -0
  37. data/app/views/certificates/verify.html.erb +40 -0
  38. data/app/views/chapters/show.html.erb +15 -14
  39. data/app/views/complements/show.html.erb +1 -1
  40. data/app/views/exams/show.html.erb +1 -1
  41. data/app/views/{layouts → exercises}/_exercise_skipped.html.erb +0 -0
  42. data/app/views/exercises/_exercise_title_icons.html.erb +4 -0
  43. data/app/views/exercises/show.html.erb +4 -7
  44. data/app/views/faqs/index.html.erb +20 -0
  45. data/app/views/{layouts → guides}/_guide.html.erb +0 -0
  46. data/app/views/guides/_guide_container.html.erb +24 -0
  47. data/app/views/{layouts → guides}/_guide_title_icons.html.erb +1 -3
  48. data/app/views/layouts/_progress_listing.html.erb +1 -1
  49. data/app/views/layouts/_user_menu.html.erb +17 -0
  50. data/app/views/layouts/application.html.erb +6 -1
  51. data/app/views/layouts/exercise_inputs/editors/_code.html.erb +2 -1
  52. data/app/views/layouts/exercise_inputs/editors/_upload.html.erb +11 -2
  53. data/app/views/lessons/show.html.erb +1 -1
  54. data/app/views/user_mailer/certificate.html.erb +339 -0
  55. data/app/views/user_mailer/certificate.text.erb +10 -0
  56. data/app/views/users/_user_form.html.erb +10 -8
  57. data/app/views/users/certificates.html.erb +32 -0
  58. data/app/views/users/discussions.html.erb +28 -0
  59. data/app/views/users/edit.html.erb +1 -1
  60. data/app/views/users/messages.html.erb +27 -0
  61. data/app/views/users/show.html.erb +4 -51
  62. data/app/views/users/terms.html.erb +2 -2
  63. data/config/routes.rb +9 -0
  64. data/lib/mumuki/laboratory/locales/en.yml +13 -3
  65. data/lib/mumuki/laboratory/locales/es-CL.yml +13 -3
  66. data/lib/mumuki/laboratory/locales/es.yml +12 -2
  67. data/lib/mumuki/laboratory/locales/pt.yml +12 -2
  68. data/lib/mumuki/laboratory/version.rb +1 -1
  69. data/spec/controllers/certificates_controller_spec.rb +15 -0
  70. data/spec/controllers/organizations_api_controller_spec.rb +16 -9
  71. data/spec/dummy/db/schema.rb +25 -1
  72. data/spec/features/certificate_programs_flow_spec.rb +17 -0
  73. data/spec/features/exercise_flow_spec.rb +3 -3
  74. data/spec/features/login_flow_spec.rb +1 -1
  75. data/spec/features/menu_bar_spec.rb +44 -24
  76. data/spec/features/profile_flow_spec.rb +18 -9
  77. data/spec/features/terms_flow_spec.rb +30 -0
  78. data/spec/helpers/application_helper_spec.rb +10 -0
  79. data/spec/helpers/certificate_helper_spec.rb +15 -0
  80. data/spec/javascripts/upload-spec.js +80 -0
  81. metadata +86 -14
  82. data/app/views/layouts/_guide_container.html.erb +0 -28
@@ -13,4 +13,3 @@ class ApplicationMailer < ActionMailer::Base
13
13
  mailer_environment_variables.all? { |env_var| ENV[env_var].present? }
14
14
  end
15
15
  end
16
-
@@ -1,4 +1,6 @@
1
1
  class UserMailer < ApplicationMailer
2
+ include WithCertificateRender
3
+
2
4
  def welcome_email(user, organization)
3
5
  with_locale(user, organization) do
4
6
  organization_name = organization.display_name || t(:your_new_organization)
@@ -18,6 +20,13 @@ class UserMailer < ApplicationMailer
18
20
  end
19
21
  end
20
22
 
23
+ def certificate(certificate)
24
+ with_locale certificate.user, certificate.organization do
25
+ attachments[certificate.filename] = pdf_for(certificate)
26
+ mail to: certificate.user.email, subject: t(:certificate)
27
+ end
28
+ end
29
+
21
30
  def with_locale(user, organization = nil, &block)
22
31
  @user = user
23
32
  @unsubscribe_code = User.unsubscription_verifier.generate(user.id)
@@ -0,0 +1,44 @@
1
+ <style>
2
+
3
+ .mu-certificate-box {
4
+ overflow: hidden;
5
+ height: 210mm;
6
+ width: 297mm;
7
+ max-height: 210mm;
8
+ max-width: 297mm;
9
+ min-height: 210mm;
10
+ min-width: 297mm;
11
+ margin: 0;
12
+ box-sizing: border-box;
13
+ position: relative;
14
+ border: 1px solid lightgrey;
15
+ }
16
+
17
+ .mu-certificate-box section {
18
+ background: transparent;
19
+ z-index: 10;
20
+ }
21
+
22
+ .background-image {
23
+ position: absolute;
24
+ height: 210mm;
25
+ width: 297mm;
26
+ margin: 0;
27
+ padding: 0;
28
+ z-index: 0;
29
+ }
30
+
31
+ .qr-code {
32
+ position: absolute;
33
+ z-index: 10;
34
+ }
35
+
36
+ </style>
37
+
38
+ <div class="mu-certificate-box">
39
+ <img src="<%= certificate.background_image_url %>" class="background-image"/>
40
+ <%= render inline: certificate.template_html_erb, locals: certificate.template_locals %>
41
+ <a href="<%= verify_certificate_path certificate.code %>" target="_blank">
42
+ <div><img class="qr-code" src="<%= qr_for certificate %>"/></div>
43
+ </a>
44
+ </div>
@@ -0,0 +1,20 @@
1
+ <%= wicked_pdf_stylesheet_link_tag 'pdf' -%>
2
+ <%= wicked_pdf_stylesheet_link_tag 'mumuki_laboratory/application', media: 'all' %>
3
+ <style>
4
+ html, body {
5
+ overflow: hidden;
6
+ height: 210mm;
7
+ width: 297mm;
8
+ max-height: 210mm;
9
+ max-width: 297mm;
10
+ min-height: 210mm;
11
+ min-width: 297mm;
12
+ margin: 0;
13
+ padding: 0;
14
+ box-sizing: border-box;
15
+ position: relative;
16
+ }
17
+ </style>
18
+
19
+ <%= render partial: 'certificates/certificate', locals: { certificate: certificate } %>
20
+
@@ -0,0 +1,40 @@
1
+ <%= content_for :breadcrumbs do %>
2
+ <%= home_breadcrumb %>
3
+ <% end %>
4
+
5
+ <h1><%= t :certificate %>: <%= @certificate.title %></h1>
6
+
7
+ <div class="container">
8
+ <div class="row mu-certificate-data">
9
+ <div class="col-md-6">
10
+ <div class="row text-center jumbotron">
11
+ <div class="col-md-12">
12
+ <h3 class="mu-certificate-name">
13
+ <%= t :completed_by %>
14
+ <strong><%= @certificate.user.formal_full_name %></strong>
15
+ </h3>
16
+ <div><small><%= @certificate.created_at.to_date %></small></div>
17
+ <span><%= t(:certificate_verified_legend, description: @certificate.description, full_name: @certificate.user.formal_full_name).html_safe %></span>
18
+ </div>
19
+ </div>
20
+ <% if @certificate.for_user? current_user %>
21
+ <div class="row mu-certificate-buttons">
22
+ <a href="<%= linkedin_post_url @certificate %>" target="_blank">
23
+ <img src="https://download.linkedin.com/desktop/add2profile/buttons/<%= t :linkedin_profile_button_locale %>.png" alt="LinkedIn Add to Profile button">
24
+ </a>
25
+ <a class="btn btn-success mu-certificate-download-btn pull-right" href="<%= download_certificate_path @certificate.code %>" target="_blank">
26
+ <i class="fas fa-fw fa-lg fa-download mu-certificate-download-btn-icon"></i>
27
+ <span class="mu-certificate-download-btn-text"><%= t :certificate %></span>
28
+ </a>
29
+ </div>
30
+ <% end %>
31
+ </div>
32
+ <div class="certificate-preview col-md-6">
33
+ <%= render partial: 'certificates/certificate', locals: { certificate: @certificate } %>
34
+ </div>
35
+ </div>
36
+ </div>
37
+
38
+ <%= content_for :profile do %>
39
+ <%= home_breadcrumb %>
40
+ <% end %>
@@ -2,26 +2,27 @@
2
2
  <%= breadcrumbs @chapter %>
3
3
  <% end %>
4
4
 
5
- <div class="chapter-description">
6
- <h1 class="pull-left">
7
- <span class="hidden-xs pull-left"><%= t(:chapter_number, number: @chapter.number) %>:&nbsp;</span>
8
- <span class="pull-left"><%= @chapter.name %></span>
5
+ <div class="row">
6
+ <div class="mu-inline-block-left">
7
+ <h1 class="hidden-xs"><%= full_title_for @chapter %></h1>
8
+ <h1 class="visible-xs"><%= short_title_for @chapter %></h1>
9
+
9
10
  <% if @chapter.monolesson? %>
10
- <div class="mu-monolesson pull-left">
11
- <%= render partial: 'layouts/guide_title_icons' %>
12
- </div>
11
+ <%= render partial: 'guides/guide_title_icons' %>
13
12
  <% end %>
14
- </h1>
15
-
16
- <%= @chapter.description_html %>
17
-
13
+ </div>
14
+ </div>
15
+ <div class="row">
16
+ <div class="col-md-12">
17
+ <div class="text-box mu-chapter-description">
18
+ <%= @chapter.description_html %>
19
+ </div>
20
+ </div>
18
21
  </div>
19
22
 
20
23
  <% if @chapter.lessons.present? %>
21
24
  <% if @chapter.monolesson? %>
22
- <div class="mu-monolesson">
23
- <%= render partial: 'layouts/guide', locals: { subject: @monolesson } %>
24
- </div>
25
+ <div> <%= render partial: 'guides/guide', locals: { subject: @monolesson } %> </div>
25
26
  <% else %>
26
27
  <div>
27
28
  <h3><%= t(:lessons) %></h3>
@@ -1 +1 @@
1
- <%= render partial: "layouts/guide_container", locals: { subject: @complement }%>
1
+ <%= render partial: "guides/guide_container", locals: { subject: @complement }%>
@@ -1 +1 @@
1
- <%= render partial: "layouts/guide_container", locals: { subject: @exam }%>
1
+ <%= render partial: "guides/guide_container", locals: { subject: @exam }%>
@@ -0,0 +1,4 @@
1
+ <div class="mu-content-title-icons">
2
+ <%= teacher_info_button @exercise %>
3
+ <%= link_to_bibliotheca_exercise @exercise %>
4
+ </div>
@@ -18,12 +18,9 @@
18
18
  <h1><%= language_icon @exercise.language %></h1>
19
19
  </div>
20
20
  <div class="mu-inline-block-left">
21
- <h1>
22
- <span class="hidden-xs"><%= t(:exercise_number, number: @exercise.number) %>:&nbsp;</span>
23
- <span><%= @exercise.name %></span>
24
- <%= teacher_info_button @exercise %>
25
- <%= link_to_bibliotheca_exercise @exercise %>
26
- </h1>
21
+ <h1 class="hidden-xs"><%= full_title_for @exercise %></h1>
22
+ <h1 class="visible-xs"><%= short_title_for @exercise %></h1>
23
+ <%= render partial: 'exercises/exercise_title_icons' %>
27
24
  </div>
28
25
  </div>
29
26
  <% end %>
@@ -58,7 +55,7 @@
58
55
 
59
56
  <%= content_for :no_container do %>
60
57
  <% if @assignment.skipped? %>
61
- <%= render partial: 'layouts/exercise_skipped' %>
58
+ <%= render partial: 'exercises/exercise_skipped' %>
62
59
  <% end %>
63
60
 
64
61
  <% if in_gamified_context? %>
@@ -0,0 +1,20 @@
1
+ <% content_for :breadcrumbs do %>
2
+ <%= header_breadcrumbs %>
3
+ <% end %>
4
+
5
+ <div class="mu-faqs">
6
+ <h1><%= t(:faqs) %></h1>
7
+
8
+ <div class="mu-faqs-container">
9
+ <div class="mu-faqs-content">
10
+ <%= @faqs %>
11
+ </div>
12
+ <div class="mu-faqs-navbar hidden-xs">
13
+ <nav>
14
+ <ul>
15
+ </ul>
16
+ </nav>
17
+ </div>
18
+ </div>
19
+
20
+ </div>
File without changes
@@ -0,0 +1,24 @@
1
+ <%= content_for :breadcrumbs do %>
2
+ <%= breadcrumbs subject %>
3
+ <% end %>
4
+
5
+ <%= render layout: 'guides/guide', locals: { subject: subject } do %>
6
+
7
+ <div class="row">
8
+ <div class="mu-inline-block-right hidden-xs">
9
+ <h1><%= language_icon @guide.language %></h1>
10
+ </div>
11
+ <div class="mu-inline-block-left">
12
+ <h1><%= short_title_for @guide %></h1>
13
+ <%= render partial: 'guides/guide_title_icons' %>
14
+ </div>
15
+ </div>
16
+ <div class="row">
17
+ <div class="col-md-12">
18
+ <div class="text-box">
19
+ <%= @guide.description_html %>
20
+ </div>
21
+ </div>
22
+ </div>
23
+
24
+ <% end %>
@@ -1,8 +1,6 @@
1
- <div class="guide-title-icons pull-left">
1
+ <div class="mu-content-title-icons">
2
2
  <% if current_user? && should_display_medal?(@guide, Organization.current) %>
3
- <div class="pull-left">
4
3
  <%= content_medal_for(@guide, current_user) %>
5
- </div>
6
4
  <% end %>
7
5
  <%= teacher_info_button @guide %>
8
6
  <%= link_to_bibliotheca_guide @guide %>
@@ -1,6 +1,6 @@
1
1
  <ul class="progress-listing">
2
2
  <% guide.assignments_for(current_user).each do |assignment| %>
3
- <% cache [assignment.exercise, assignment.status, Organization.current] do %>
3
+ <% cache [assignment.exercise, assignment.status, Organization.current.name, current_user?] do %>
4
4
  <li <%= turbolinks_enable_for(assignment.exercise) %>>
5
5
  <%= assignment_status_icon assignment %>
6
6
  <%= link_to_path_element(assignment.exercise) %>
@@ -0,0 +1,17 @@
1
+ <div class="col-md-3 mu-tab-body">
2
+ <div class="mu-user-menu">
3
+ <div class="mu-user-menu-content">
4
+ <%= user_menu_header %>
5
+ <div class="col-xs-12 mu-user-menu-items hidden-sm-screen">
6
+ <%= profile_user_menu_link %>
7
+ <%= user_menu_divider %>
8
+ <%= messages_user_menu_link %>
9
+ <%= discussions_user_menu_link %>
10
+ <%= user_menu_divider %>
11
+ <%= certificates_user_menu_link %>
12
+ </div>
13
+ </div>
14
+ <div class="mu-user-menu-divider vertical hidden-sm hidden-xs"></div>
15
+ </div>
16
+ </div>
17
+ <div class="mu-user-menu-divider horizontal visible-sm visible-xs"></div>
@@ -36,7 +36,11 @@
36
36
  <% if any_menu_bar_links? %>
37
37
  <li class="divider"></li>
38
38
  <% end %>
39
- <%= logout_link %>
39
+ <% if faqs_enabled_here? %>
40
+ <%= menu_link_to_faqs %>
41
+ <li class="divider"></li>
42
+ <% end %>
43
+ <%= logout_menu_link %>
40
44
  </ul>
41
45
  </div>
42
46
  <% else %>
@@ -62,6 +66,7 @@
62
66
  </div>
63
67
 
64
68
  <div class="mu-footer-terms">
69
+ <div><%= link_to_faqs %></div>
65
70
  <div><%= link_to_profile_terms %></div>
66
71
  <% if current_user&.can_discuss_here? %>
67
72
  <div><%= link_to_forum_terms %></div>
@@ -3,7 +3,8 @@
3
3
  placeholder: t(:editor_placeholder),
4
4
  class: 'form-control editor',
5
5
  value: @current_content,
6
- data: {lines: 17} %>
6
+ data: {lines: 17},
7
+ autocomplete: 'off' %>
7
8
  <div class="mu-overlapped">
8
9
  <a class="editor-resize"> <%= expand_icon %></a>
9
10
  <a class="editor-format"><%= format_icon %></a>
@@ -1,4 +1,13 @@
1
1
  <div class="form-group">
2
- <textarea id="solution_content" type="text" name="solution[content]" style="display: none"></textarea>
3
- <input id="upload-input" type="file" class="upload submission-control" size="5120" accept=".<%= @exercise.language.extension %>" />
2
+ <% @max_file_size = 256000 %>
3
+
4
+ <textarea id="solution_content" type="text" name="solution[content]" class="hidden"></textarea>
5
+ <input id="mu-upload-input" type="file" class="upload submission-control hidden" mu-upload-file-limit=<%= @max_file_size %> accept=".<%= @exercise.language.extension %>" />
6
+ <div>
7
+ <label id="mu-upload-label" for="mu-upload-input" class="btn btn-success">
8
+ <%= fa_icon(:upload, text: t(:select_file), id: "mu-upload-icon") %>
9
+ </label>
10
+ <div id="mu-upload-file-limit-exceeded" class="hidden">
11
+ <%= fa_icon("exclamation-triangle", text: t(:file_exceeds_max_size, size_kb: (@max_file_size / 1000))) %></div>
12
+ </div>
4
13
  </div>
@@ -1 +1 @@
1
- <%= render partial: "layouts/guide_container", locals: { subject: @lesson }%>
1
+ <%= render partial: "guides/guide_container", locals: { subject: @lesson }%>
@@ -0,0 +1,339 @@
1
+ <center>
2
+ <table align="center" border="0" cellpadding="0" cellspacing="0" height="100%" width="100%" id="bodyTable">
3
+ <tbody><tr>
4
+ <td align="center" valign="top" id="bodyCell">
5
+ <!-- BEGIN TEMPLATE // -->
6
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
7
+ <tbody><tr>
8
+ <td align="center" valign="top" id="templateHeader" data-template-container="">
9
+ <!--[if (gte mso 9)|(IE)]>
10
+ <table align="center" border="0" cellspacing="0" cellpadding="0" width="600" style="width:600px;">
11
+ <tr>
12
+ <td align="center" valign="top" width="600" style="width:600px;">
13
+ <![endif]-->
14
+ <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" class="templateContainer">
15
+ <tbody><tr>
16
+ <td valign="top" class="headerContainer"><table border="0" cellpadding="0" cellspacing="0" width="100%" class="muMailTextBlock" style="min-width:100%;">
17
+ <tbody class="muMailTextBlockOuter">
18
+ <tr>
19
+ <td valign="top" class="muMailTextBlockInner" style="padding-top:9px;">
20
+ <!--[if mso]>
21
+ <table align="left" border="0" cellspacing="0" cellpadding="0" width="100%" style="width:100%;">
22
+ <tr>
23
+ <![endif]-->
24
+
25
+ <!--[if mso]>
26
+ <td valign="top" width="600" style="width:600px;">
27
+ <![endif]-->
28
+ <table align="left" border="0" cellpadding="0" cellspacing="0" style="max-width:100%; min-width:100%;" width="100%" class="muMailTextContentContainer">
29
+ <tbody><tr>
30
+
31
+ <td valign="top" class="muMailTextContent" style="padding-top:0; padding-right:18px; padding-bottom:9px; padding-left:18px;">
32
+
33
+ <h1><span style="color:#FFFFFF"><%= t :new_certificate_mailer_title %></span></h1>
34
+
35
+ </td>
36
+ </tr>
37
+ </tbody></table>
38
+ <!--[if mso]>
39
+ </td>
40
+ <![endif]-->
41
+
42
+ <!--[if mso]>
43
+ </tr>
44
+ </table>
45
+ <![endif]-->
46
+ </td>
47
+ </tr>
48
+ </tbody>
49
+ </table></td>
50
+ </tr>
51
+ </tbody></table>
52
+ <!--[if (gte mso 9)|(IE)]>
53
+ </td>
54
+ </tr>
55
+ </table>
56
+ <![endif]-->
57
+ </td>
58
+ </tr>
59
+ <tr>
60
+ <td align="center" valign="top" id="templateBody" data-template-container="">
61
+ <!--[if (gte mso 9)|(IE)]>
62
+ <table align="center" border="0" cellspacing="0" cellpadding="0" width="600" style="width:600px;">
63
+ <tr>
64
+ <td align="center" valign="top" width="600" style="width:600px;">
65
+ <![endif]-->
66
+ <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" class="templateContainer">
67
+ <tbody><tr>
68
+ <td valign="top" class="bodyContainer"><table border="0" cellpadding="0" cellspacing="0" width="100%" class="muMailCaptionBlock">
69
+ <tbody class="muMailCaptionBlockOuter">
70
+ <tr>
71
+ <td class="muMailCaptionBlockInner" valign="top" style="padding:9px;">
72
+
73
+
74
+
75
+
76
+ <table border="0" cellpadding="0" cellspacing="0" class="muMailCaptionRightContentOuter" width="100%">
77
+ <tbody><tr>
78
+ <td valign="top" class="muMailCaptionRightContentInner" style="padding:0 9px ;">
79
+ <table align="left" border="0" cellpadding="0" cellspacing="0" class="muMailCaptionRightImageContentContainer" width="264">
80
+ <tbody><tr>
81
+ <td class="muMailCaptionRightImageContent" align="center" valign="top">
82
+
83
+
84
+
85
+ <img alt="" src="https://gallery.mailchimp.com/046b6c670d9f80ebd6c5d075b/images/225fe60f-780a-451e-90aa-afb01f88a1b4.png" width="159" style="max-width:159px;" class="muMailImage">
86
+
87
+
88
+
89
+ </td>
90
+ </tr>
91
+ </tbody></table>
92
+ <table class="muMailCaptionRightTextContentContainer" align="right" border="0" cellpadding="0" cellspacing="0" width="264">
93
+ <tbody><tr>
94
+ <td valign="top" class="muMailTextContent">
95
+ <h3 class="null" style="text-align: center;"><br>
96
+ <span style="font-size:24px"><%= t :new_certificate_mailer_p1 %></span></h3>
97
+
98
+ <div style="text-align: center;"><br>
99
+ <span style="font-size:16px"><%= t :new_certificate_mailer_p2 %></span></div>
100
+
101
+ </td>
102
+ </tr>
103
+ </tbody></table>
104
+ </td>
105
+ </tr>
106
+ </tbody></table>
107
+
108
+
109
+
110
+
111
+ </td>
112
+ </tr>
113
+ </tbody>
114
+ </table><table border="0" cellpadding="0" cellspacing="0" width="100%" class="muMailButtonBlock" style="min-width:100%;">
115
+ <tbody class="muMailButtonBlockOuter">
116
+ <tr>
117
+ <td style="padding-top:0; padding-right:18px; padding-bottom:18px; padding-left:18px;" valign="top" align="center" class="muMailButtonBlockInner">
118
+ </td>
119
+ </tr>
120
+ </tbody>
121
+ </table></td>
122
+ </tr>
123
+ </tbody></table>
124
+ <!--[if (gte mso 9)|(IE)]>
125
+ </td>
126
+ </tr>
127
+ </table>
128
+ <![endif]-->
129
+ </td>
130
+ </tr>
131
+ <tr>
132
+ <td align="center" valign="top" id="templateFooter" data-template-container="">
133
+ <!--[if (gte mso 9)|(IE)]>
134
+ <table align="center" border="0" cellspacing="0" cellpadding="0" width="600" style="width:600px;">
135
+ <tr>
136
+ <td align="center" valign="top" width="600" style="width:600px;">
137
+ <![endif]-->
138
+ <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" class="templateContainer">
139
+ <tbody><tr>
140
+ <td valign="top" class="footerContainer"><table border="0" cellpadding="0" cellspacing="0" width="100%" class="muMailFollowBlock" style="min-width:100%;">
141
+ <tbody class="muMailFollowBlockOuter">
142
+ <tr>
143
+ <td align="center" valign="top" style="padding:9px" class="muMailFollowBlockInner">
144
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" class="muMailFollowContentContainer" style="min-width:100%;">
145
+ <tbody><tr>
146
+ <td align="center" style="padding-left:9px;padding-right:9px;">
147
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" style="min-width:100%;" class="muMailFollowContent">
148
+ <tbody><tr>
149
+ <td align="center" valign="top" style="padding-top:9px; padding-right:9px; padding-left:9px;">
150
+ <table align="center" border="0" cellpadding="0" cellspacing="0">
151
+ <tbody><tr>
152
+ <td align="center" valign="top">
153
+ <!--[if mso]>
154
+ <table align="center" border="0" cellspacing="0" cellpadding="0">
155
+ <tr>
156
+ <![endif]-->
157
+
158
+ <!--[if mso]>
159
+ <td align="center" valign="top">
160
+ <![endif]-->
161
+
162
+
163
+ <table align="left" border="0" cellpadding="0" cellspacing="0" style="display:inline;">
164
+ <tbody><tr>
165
+ <td valign="top" style="padding-right:10px; padding-bottom:9px;" class="muMailFollowContentItemContainer">
166
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" class="muMailFollowContentItem">
167
+ <tbody><tr>
168
+ <td align="left" valign="middle" style="padding-top:5px; padding-right:10px; padding-bottom:5px; padding-left:9px;">
169
+ <table align="left" border="0" cellpadding="0" cellspacing="0" width="">
170
+ <tbody><tr>
171
+
172
+ <td align="center" valign="middle" width="24" class="muMailFollowIconContent">
173
+ <a href="http://www.facebook.com/MumukiOrg" target="_blank"><img src="https://cdn-images.mailchimp.com/icons/social-block-v2/outline-light-facebook-48.png" style="display:block;" height="24" width="24" class=""></a>
174
+ </td>
175
+
176
+
177
+ </tr>
178
+ </tbody></table>
179
+ </td>
180
+ </tr>
181
+ </tbody></table>
182
+ </td>
183
+ </tr>
184
+ </tbody></table>
185
+
186
+ <!--[if mso]>
187
+ </td>
188
+ <![endif]-->
189
+
190
+ <!--[if mso]>
191
+ <td align="center" valign="top">
192
+ <![endif]-->
193
+
194
+
195
+ <table align="left" border="0" cellpadding="0" cellspacing="0" style="display:inline;">
196
+ <tbody><tr>
197
+ <td valign="top" style="padding-right:10px; padding-bottom:9px;" class="muMailFollowContentItemContainer">
198
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" class="muMailFollowContentItem">
199
+ <tbody><tr>
200
+ <td align="left" valign="middle" style="padding-top:5px; padding-right:10px; padding-bottom:5px; padding-left:9px;">
201
+ <table align="left" border="0" cellpadding="0" cellspacing="0" width="">
202
+ <tbody><tr>
203
+
204
+ <td align="center" valign="middle" width="24" class="muMailFollowIconContent">
205
+ <a href="http://www.twitter.com/MumukiOrg" target="_blank"><img src="https://cdn-images.mailchimp.com/icons/social-block-v2/outline-light-twitter-48.png" style="display:block;" height="24" width="24" class=""></a>
206
+ </td>
207
+
208
+
209
+ </tr>
210
+ </tbody></table>
211
+ </td>
212
+ </tr>
213
+ </tbody></table>
214
+ </td>
215
+ </tr>
216
+ </tbody></table>
217
+
218
+ <!--[if mso]>
219
+ </td>
220
+ <![endif]-->
221
+
222
+ <!--[if mso]>
223
+ <td align="center" valign="top">
224
+ <![endif]-->
225
+
226
+
227
+ <table align="left" border="0" cellpadding="0" cellspacing="0" style="display:inline;">
228
+ <tbody><tr>
229
+ <td valign="top" style="padding-right:0; padding-bottom:9px;" class="muMailFollowContentItemContainer">
230
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" class="muMailFollowContentItem">
231
+ <tbody><tr>
232
+ <td align="left" valign="middle" style="padding-top:5px; padding-right:10px; padding-bottom:5px; padding-left:9px;">
233
+ <table align="left" border="0" cellpadding="0" cellspacing="0" width="">
234
+ <tbody><tr>
235
+
236
+ <td align="center" valign="middle" width="24" class="muMailFollowIconContent">
237
+ <a href="https://www.youtube.com/channel/UCQmkknsaTT2TDLT_-MDSGvQ" target="_blank"><img src="https://cdn-images.mailchimp.com/icons/social-block-v2/outline-light-youtube-48.png" style="display:block;" height="24" width="24" class=""></a>
238
+ </td>
239
+
240
+
241
+ </tr>
242
+ </tbody></table>
243
+ </td>
244
+ </tr>
245
+ </tbody></table>
246
+ </td>
247
+ </tr>
248
+ </tbody></table>
249
+
250
+ <!--[if mso]>
251
+ </td>
252
+ <![endif]-->
253
+
254
+ <!--[if mso]>
255
+ </tr>
256
+ </table>
257
+ <![endif]-->
258
+ </td>
259
+ </tr>
260
+ </tbody></table>
261
+ </td>
262
+ </tr>
263
+ </tbody></table>
264
+ </td>
265
+ </tr>
266
+ </tbody></table>
267
+
268
+ </td>
269
+ </tr>
270
+ </tbody>
271
+ </table><table border="0" cellpadding="0" cellspacing="0" width="100%" class="muMailDividerBlock" style="min-width:100%;">
272
+ <tbody class="muMailDividerBlockOuter">
273
+ <tr>
274
+ <td class="muMailDividerBlockInner" style="min-width:100%; padding:18px;">
275
+ <table class="muMailDividerContent" border="0" cellpadding="0" cellspacing="0" width="100%" style="min-width: 100%;border-top: 2px solid #505050;">
276
+ <tbody><tr>
277
+ <td>
278
+ <span></span>
279
+ </td>
280
+ </tr>
281
+ </tbody></table>
282
+ <!--
283
+ <td class="muMailDividerBlockInner" style="padding: 18px;">
284
+ <hr class="muMailDividerContent" style="border-bottom-color:none; border-left-color:none; border-right-color:none; border-bottom-width:0; border-left-width:0; border-right-width:0; margin-top:0; margin-right:0; margin-bottom:0; margin-left:0;" />
285
+ -->
286
+ </td>
287
+ </tr>
288
+ </tbody>
289
+ </table><table border="0" cellpadding="0" cellspacing="0" width="100%" class="muMailTextBlock" style="min-width:100%;">
290
+ <tbody class="muMailTextBlockOuter">
291
+ <tr>
292
+ <td valign="top" class="muMailTextBlockInner" style="padding-top:9px;">
293
+ <!--[if mso]>
294
+ <table align="left" border="0" cellspacing="0" cellpadding="0" width="100%" style="width:100%;">
295
+ <tr>
296
+ <![endif]-->
297
+
298
+ <!--[if mso]>
299
+ <td valign="top" width="600" style="width:600px;">
300
+ <![endif]-->
301
+ <table align="left" border="0" cellpadding="0" cellspacing="0" style="max-width:100%; min-width:100%;" width="100%" class="muMailTextContentContainer">
302
+ <tbody><tr>
303
+
304
+ <td valign="top" class="muMailTextContent" style="padding-top:0; padding-right:18px; padding-bottom:9px; padding-left:18px;">
305
+
306
+ © Copyright 2015-<%= DateTime.now.year %>&nbsp;<a href="https://mumuki.org/home/">Mumuki</a><em>.</em><br>
307
+ <br>
308
+ <%= t :stop_emails? %><br>
309
+ <%= link_to t(:cancel_subscription), @organization.url_for("/user/unsubscribe?id=#{@unsubscribe_code}"), target: :_blank %>
310
+ </td>
311
+ </tr>
312
+ </tbody></table>
313
+ <!--[if mso]>
314
+ </td>
315
+ <![endif]-->
316
+
317
+ <!--[if mso]>
318
+ </tr>
319
+ </table>
320
+ <![endif]-->
321
+ </td>
322
+ </tr>
323
+ </tbody>
324
+ </table></td>
325
+ </tr>
326
+ </tbody></table>
327
+ <!--[if (gte mso 9)|(IE)]>
328
+ </td>
329
+ </tr>
330
+ </table>
331
+ <![endif]-->
332
+ </td>
333
+ </tr>
334
+ </tbody></table>
335
+ <!-- // END TEMPLATE -->
336
+ </td>
337
+ </tr>
338
+ </tbody></table>
339
+ </center>