mumuki-laboratory 9.8.2 → 9.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/mumuki_laboratory/application/bridge.js +15 -9
  3. data/app/assets/javascripts/mumuki_laboratory/application/confirmation.js +10 -8
  4. data/app/assets/javascripts/mumuki_laboratory/application/editors.js +5 -3
  5. data/app/assets/javascripts/mumuki_laboratory/application/messages.js +1 -30
  6. data/app/assets/javascripts/mumuki_laboratory/application/progress.js +4 -4
  7. data/app/assets/javascripts/mumuki_laboratory/application/results-renderer.js +12 -1
  8. data/app/assets/javascripts/mumuki_laboratory/application/submissions-store.js +8 -2
  9. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_discussion.scss +32 -34
  10. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_dropdown.scss +11 -0
  11. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_editor.scss +3 -0
  12. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_faqs.scss +1 -1
  13. data/app/controllers/application_controller.rb +1 -1
  14. data/app/controllers/messages_controller.rb +2 -5
  15. data/app/controllers/users_controller.rb +38 -1
  16. data/app/helpers/application_helper.rb +6 -2
  17. data/app/helpers/discussions_helper.rb +11 -4
  18. data/app/helpers/exam_registration_helper.rb +0 -4
  19. data/app/helpers/icons_helper.rb +1 -1
  20. data/app/helpers/menu_bar_helper.rb +7 -3
  21. data/app/helpers/messages_helper.rb +4 -8
  22. data/app/helpers/notifications_helper.rb +13 -0
  23. data/app/helpers/profile_helper.rb +4 -0
  24. data/app/helpers/time_zone_helper.rb +5 -0
  25. data/app/helpers/user_discussions_helper.rb +38 -0
  26. data/app/helpers/user_menu_helper.rb +4 -0
  27. data/app/mailers/user_mailer.rb +11 -1
  28. data/app/views/discussions/new.html.erb +1 -1
  29. data/app/views/layouts/_copyright.html.erb +1 -1
  30. data/app/views/layouts/_discussions.html.erb +1 -37
  31. data/app/views/layouts/_discussions_list.html.erb +38 -0
  32. data/app/views/layouts/_messages.html.erb +1 -7
  33. data/app/views/layouts/_user_menu.html.erb +1 -0
  34. data/app/views/layouts/exercise_inputs/forms/_interactive_form.html.erb +1 -1
  35. data/app/views/layouts/exercise_inputs/forms/_problem_form.html.erb +1 -1
  36. data/app/views/layouts/exercise_inputs/read_only_editors/_code.html.erb +1 -1
  37. data/app/views/layouts/exercise_inputs/read_only_editors/_multiple_files.html.erb +4 -4
  38. data/app/views/layouts/mailer.html.erb +7 -1
  39. data/app/views/notifications/_custom.html.erb +1 -0
  40. data/app/views/notifications/_dropdown.html.erb +2 -2
  41. data/app/views/notifications/_exam_authorization_request_updated.html.erb +2 -0
  42. data/app/views/notifications/_exam_registration.html.erb +2 -1
  43. data/app/views/notifications/previews/_custom.html.erb +1 -0
  44. data/app/views/notifications/previews/_discussion.html.erb +2 -0
  45. data/app/views/notifications/previews/_exam_authorization_request_updated.html.erb +2 -0
  46. data/app/views/notifications/previews/_exam_registration.html.erb +2 -0
  47. data/app/views/notifications/previews/_message.html.erb +2 -0
  48. data/app/views/user_mailer/1st_reminder.html.erb +7 -349
  49. data/app/views/user_mailer/1st_reminder.text.erb +1 -5
  50. data/app/views/user_mailer/2nd_reminder.html.erb +7 -349
  51. data/app/views/user_mailer/2nd_reminder.text.erb +1 -5
  52. data/app/views/user_mailer/3rd_reminder.html.erb +7 -349
  53. data/app/views/user_mailer/3rd_reminder.text.erb +1 -5
  54. data/app/views/user_mailer/_mail_template.erb +336 -0
  55. data/app/views/user_mailer/certificate.html.erb +7 -335
  56. data/app/views/user_mailer/certificate.text.erb +1 -4
  57. data/app/views/user_mailer/no_submissions_reminder.html.erb +7 -349
  58. data/app/views/user_mailer/no_submissions_reminder.text.erb +1 -5
  59. data/app/views/user_mailer/notification.html.erb +1 -0
  60. data/app/views/user_mailer/notification.text.erb +6 -0
  61. data/app/views/user_mailer/notifications/_custom.html.erb +11 -0
  62. data/app/views/user_mailer/notifications/_exam_authorization_request_updated.html.erb +1 -0
  63. data/app/views/user_mailer/notifications/_exam_registration.html.erb +7 -0
  64. data/app/views/user_mailer/notifications/exam_authorization_request_updated/_approved.html.erb +7 -0
  65. data/app/views/user_mailer/notifications/exam_authorization_request_updated/_rejected.html.erb +7 -0
  66. data/app/views/users/_basic_profile_fields.html.erb +30 -0
  67. data/app/views/users/_profile_fields.html.erb +1 -20
  68. data/app/views/users/discussions.html.erb +19 -11
  69. data/app/views/users/manage_notifications.html.erb +26 -0
  70. data/app/views/users/messages.html.erb +1 -1
  71. data/app/views/users/notifications.html.erb +54 -0
  72. data/config/routes.rb +4 -1
  73. data/lib/mumuki/laboratory.rb +1 -0
  74. data/lib/mumuki/laboratory/controllers/notifications.rb +2 -2
  75. data/lib/mumuki/laboratory/locales/en.yml +47 -7
  76. data/lib/mumuki/laboratory/locales/es-CL.yml +48 -7
  77. data/lib/mumuki/laboratory/locales/es.yml +49 -9
  78. data/lib/mumuki/laboratory/locales/pt.yml +46 -6
  79. data/lib/mumuki/laboratory/mailers/message_delivery.rb +15 -0
  80. data/lib/mumuki/laboratory/version.rb +1 -1
  81. data/spec/controllers/organizations_api_controller_spec.rb +6 -1
  82. data/spec/controllers/students_api_controller_spec.rb +1 -1
  83. data/spec/controllers/users_controller_spec.rb +48 -0
  84. data/spec/dummy/db/schema.rb +9 -1
  85. data/spec/features/not_found_public_flow_spec.rb +1 -1
  86. data/spec/features/notifications_flow_spec.rb +2 -1
  87. data/spec/features/profile_flow_spec.rb +1 -1
  88. data/spec/javascripts/editors-spec.js +21 -3
  89. data/spec/javascripts/submissions-store-spec.js +11 -0
  90. data/spec/mailers/previews/user_mailer_preview.rb +87 -1
  91. metadata +134 -115
  92. data/app/views/messages/errors.html.erb +0 -1
  93. data/app/views/notifications/_discussion.html.erb +0 -1
  94. data/app/views/notifications/_exam_authorization_request.html.erb +0 -1
  95. data/app/views/notifications/_message.html.erb +0 -1
@@ -45,7 +45,11 @@ module ApplicationHelper
45
45
  }.html_safe
46
46
  end
47
47
 
48
- def notification_preview_for(target)
49
- render "notifications/#{target.class.name.underscore}", { target: target }
48
+ def notification_preview_for(notification)
49
+ render "notifications/previews/#{notification.subject}", { notification: notification }
50
+ end
51
+
52
+ def current_time_zone_html
53
+ %Q{(<span class="select-date-timezone">#{Organization.current.time_zone}</span>)}.html_safe
50
54
  end
51
55
  end
@@ -60,11 +60,18 @@ module DiscussionsHelper
60
60
  }.html_safe
61
61
  end
62
62
 
63
- def discussion_messages_icon(discussion)
63
+ def discussion_messages_count(discussion)
64
64
  %Q{
65
- <span class="discussion-icon fa-stack fa-xs">
66
- <i class="far fa-comment fa-stack-2x"></i>
67
- <i class="fas fa-stack-1x">#{discussion.validated_messages_count}</i>
65
+ <span class="discussion-messages-count">
66
+ #{fa_icon :comments, type: :regular, text: discussion.messages_count}
67
+ </span>
68
+ }.html_safe
69
+ end
70
+
71
+ def discussion_validated_messages_count(discussion)
72
+ %Q{
73
+ <span class="discussion-validated-messages-count">
74
+ #{fa_icon :comment, type: :regular}#{fa_icon :check, text: discussion.validated_messages_count}
68
75
  </span>
69
76
  }.html_safe
70
77
  end
@@ -6,8 +6,4 @@ module ExamRegistrationHelper
6
6
  { icon: :info_circle, class: :info, t: :exam_registration_explanation_html }
7
7
  end
8
8
  end
9
-
10
- def current_time_zone_html
11
- %Q{(<span class="select-date-timezone">#{Organization.current&.time_zone}</span>)}.html_safe
12
- end
13
9
  end
@@ -50,6 +50,6 @@ module IconsHelper
50
50
  end
51
51
 
52
52
  def icon_for_read(read)
53
- tag('i', class: "fa#{read ? 'r' : 's'} fa-envelope")
53
+ tag.i(class: "fa#{read ? 'r' : 's'} fa-envelope#{read ? '-open' : ''}")
54
54
  end
55
55
  end
@@ -39,8 +39,12 @@ module MenuBarHelper
39
39
  li_tag menu_item('sign-out-alt', :sign_out, logout_path(origin: url_for))
40
40
  end
41
41
 
42
- def menu_item(icon, name, url, translation_params = {})
43
- link_to fixed_fa_icon(icon, text: t(name, translation_params)), url, role: 'menuitem', tabindex: '-1', class: 'dropdown-item'
42
+ def menu_item(icon, name, url, css_class = nil, **translation_params)
43
+ menu_text_item(icon, t(name, translation_params), url, css_class)
44
+ end
45
+
46
+ def menu_text_item(icon, text, url, css_class = nil)
47
+ link_to fixed_fa_icon(icon, text: text), url, role: 'menuitem', tabindex: '-1', class: "dropdown-item #{css_class}"
44
48
  end
45
49
 
46
50
  def any_menu_bar_links?
@@ -48,6 +52,6 @@ module MenuBarHelper
48
52
  end
49
53
 
50
54
  def menu_link_to_faqs
51
- li_tag menu_item('question', :faqs, faqs_path)
55
+ li_tag menu_item(:info, :faqs_abbreviated, faqs_path)
52
56
  end
53
57
  end
@@ -1,8 +1,4 @@
1
1
  module MessagesHelper
2
- def messages_url(exercise)
3
- exercise.messages_url_for(current_user) if current_user?
4
- end
5
-
6
2
  def hidden_pending(assignment)
7
3
  assignment.pending_messages? ? '' : 'd-none'
8
4
  end
@@ -15,11 +11,11 @@ module MessagesHelper
15
11
  'pending-messages-filter' if assignment.pending_messages?
16
12
  end
17
13
 
18
- def read_messages_caption(assignment)
19
- assignment.pending_messages? ? :read_messages : :exit
20
- end
21
-
22
14
  def sender_class(message)
23
15
  message.blank? || message.from_user?(current_user) ? 'self' : 'other'
24
16
  end
17
+
18
+ def staleness_class(message)
19
+ 'mu-stale' if message.stale?
20
+ end
25
21
  end
@@ -0,0 +1,13 @@
1
+ module NotificationsHelper
2
+ def background_for_notification(notification)
3
+ notification.read? ? '' : 'bg-light'
4
+ end
5
+
6
+ def notification_preview_item(icon, name, url, **translation_params)
7
+ menu_item icon, name, url, 'mu-notification-preview', **translation_params
8
+ end
9
+
10
+ def notification_text_preview_item(icon, text, url)
11
+ menu_text_item(icon, text, url, 'mu-notification-preview')
12
+ end
13
+ end
@@ -10,4 +10,8 @@ module ProfileHelper
10
10
  def save_edit_profile_button(form)
11
11
  form.submit t(:save), class: 'btn btn-complementary mu-edit-profile-btn'
12
12
  end
13
+
14
+ def show_verified_full_name_notice?(user, organization)
15
+ user.has_verified_full_name? && organization.private?
16
+ end
13
17
  end
@@ -0,0 +1,5 @@
1
+ module TimeZoneHelper
2
+ def local_time(time, time_zone = Time.zone.name)
3
+ "#{l(time.in_time_zone(time_zone), format: :long)} (#{time_zone})"
4
+ end
5
+ end
@@ -0,0 +1,38 @@
1
+ module UserDiscussionsHelper
2
+ def user_discussions_table_title(discussion, user, last_read)
3
+ %Q{
4
+ <tr></tr>
5
+ <thead>
6
+ <tr>
7
+ <td class="#{last_read.nil? ? '' : 'pt-5'}" colspan="4">
8
+ <strong>#{discussion.read_by?(user) ? t(:discussions_read) : t(:discussions_unread)}</strong>
9
+ </td>
10
+ </tr>
11
+ </thead>
12
+ }.html_safe
13
+ end
14
+
15
+ def user_discussions_table_header
16
+ %Q{
17
+ <tr class="fw-bold">
18
+ <td></td>
19
+ <td>#{t(:exercise)}</td>
20
+ <td>#{t(:discussion_created_by)}</td>
21
+ <td>#{t(:last_message)}</td>
22
+ </tr>
23
+ }.html_safe
24
+ end
25
+
26
+ def user_discussions_table_item(discussion, user)
27
+ %Q{
28
+ <tr>
29
+ <td class="text-center">
30
+ #{icon_for_read(discussion.read_by?(user))}
31
+ </td>
32
+ <td>#{link_to discussion.item.name, item_discussion_path(discussion)}</td>
33
+ <td>#{discussion_user_name discussion.initiator}</td>
34
+ <td>#{t(:time_since, time: time_ago_in_words(discussion.last_message_date))}</td>
35
+ </tr>
36
+ }.html_safe
37
+ end
38
+ end
@@ -31,6 +31,10 @@ module UserMenuHelper
31
31
  user_menu_item t(:exams), exam_authorizations_user_path, 'exam_authorizations'
32
32
  end
33
33
 
34
+ def notifications_user_menu_link
35
+ user_menu_item t(:notifications), notifications_user_path, 'notifications'
36
+ end
37
+
34
38
  private
35
39
 
36
40
  def user_menu_item(label, path, active_on)
@@ -1,6 +1,8 @@
1
1
  class UserMailer < ApplicationMailer
2
2
  include WithCertificateRender
3
3
 
4
+ helper :time_zone
5
+
4
6
  def welcome_email(user, organization)
5
7
  with_locale(user, organization) do
6
8
  organization_name = organization.display_name || t(:your_new_organization)
@@ -23,7 +25,15 @@ class UserMailer < ApplicationMailer
23
25
  def certificate(certificate)
24
26
  with_locale certificate.user, certificate.organization do
25
27
  attachments[certificate.filename] = pdf_for(certificate)
26
- mail to: certificate.user.email, subject: certificate.description
28
+ mail to: certificate.user.email, subject: t(:certificate_available)
29
+ end
30
+ end
31
+
32
+ def notification(notification)
33
+ @notification = notification
34
+
35
+ with_locale(notification.user, notification.organization) do
36
+ build_email notification.custom_title || t("mailer.title.#{notification.subject}"), 'notification'
27
37
  end
28
38
  end
29
39
 
@@ -28,6 +28,6 @@
28
28
  </div>
29
29
  </div>
30
30
  </div>
31
- <%= f.submit t(:save), class: 'btn btn-complementary w-100 discussion-new-message-button' %>
31
+ <%= f.submit t(:publish_discussion), class: 'btn btn-complementary w-100 discussion-new-message-button' %>
32
32
  <% end %>
33
33
  <% end %>
@@ -1,2 +1,2 @@
1
- &copy; 2015-<%= DateTime.now.year %>
1
+ &copy; 2015-<%= Time.current.year %>
2
2
  <a href="http://mumuki.org/" class="mu-org-link"><span class="da da-mumuki-circle"></span> Mumuki</a>
@@ -40,43 +40,7 @@
40
40
  </span>
41
41
  </div>
42
42
  <% else %>
43
- <div class="discussions">
44
- <% @filtered_discussions.each do |discussion| %>
45
- <%= link_to exercise_discussion_path(discussion.exercise.id, discussion) do %>
46
- <div class="discussion">
47
- <div class="discussion-row">
48
- <%= discussion_messages_icon(discussion) %>
49
- <% unless @debatable.respond_to? :language %>
50
- <div class="discussion-language-icon">
51
- <%= language_icon(discussion.exercise.language) %>
52
- </div>
53
- <% end %>
54
- <div>
55
- <div class="discussion-title">
56
- <span class="discussion-status-icon">
57
- <%= discussion_status_fa_icon(discussion) %>
58
- </span>
59
- <span class="d-none d-lg-inline"><%= discussion.exercise.guide.name %> -</span>
60
- <span><%= discussion.exercise.name %></span>
61
- <% if discussion.current_responsible_visible_for?(current_user) %>
62
- <div class="float-end discussion-moderator-access" >
63
- <%= profile_picture_for(discussion.responsible_moderator_by, height: 32) %>
64
- <span class="moderator-initials">
65
- <%= discussion.responsible_moderator_by.name_initials %>
66
- </span>
67
- </div>
68
- <% end %>
69
-
70
- </div>
71
- <span class="discussion-description">
72
- <%= discussion.description %>
73
- </span>
74
- </div>
75
- </div>
76
- </div>
77
- <% end %>
78
- <% end %>
79
- </div>
43
+ <%= render partial: 'layouts/discussions_list' %>
80
44
 
81
45
  <div class="discussion-pagination">
82
46
  <%= paginate @filtered_discussions, nav_class: 'pagination' %>
@@ -0,0 +1,38 @@
1
+ <div class="discussions">
2
+ <% @filtered_discussions.each do |discussion| %>
3
+ <%= link_to exercise_discussion_path(discussion.exercise.id, discussion), class: 'discussion-link' do %>
4
+ <div class="discussion">
5
+ <div class="discussion-row">
6
+ <div class="d-flex justify-content-between">
7
+ <div class="discussion-title">
8
+ <div class="discussion-language-icon">
9
+ <%= language_icon(discussion.exercise.language) %>
10
+ </div>
11
+ <span class="d-none d-lg-inline"><%= discussion.exercise.guide.name %> -</span>
12
+ <span><%= discussion.exercise.name %></span>
13
+ <% if discussion.current_responsible_visible_for?(current_user) %>
14
+ <span class="badge ms-1 bg-dark">
15
+ <%= responsible_moderator_text_for(discussion, current_user)%>
16
+ </span>
17
+ <% end %>
18
+ </div>
19
+ <div class="discussion-title-icons">
20
+ <%= discussion_messages_count(discussion) %>
21
+ <%= discussion_validated_messages_count(discussion) %>
22
+ </div>
23
+ </div>
24
+ <span class="discussion-description">
25
+ <%= discussion.description %>
26
+ </span>
27
+ <span class="discussion-initiator">
28
+ <strong><%= discussion_user_name discussion.initiator %></strong>
29
+ <%= t(:asked_time_since, time: time_ago_in_words(discussion.created_at)) %>
30
+ <span class="discussion-status-icon">
31
+ <%= discussion_status_fa_icon(discussion) %>
32
+ </span>
33
+ </span>
34
+ </div>
35
+ </div>
36
+ <% end %>
37
+ <% end %>
38
+ </div>
@@ -1,14 +1,8 @@
1
1
  <div class="mu-view-messages">
2
2
  <div class="mu-messages">
3
3
  <ol class="mu-chat">
4
- <li>
5
- <a href="javascript:{}"
6
- onclick="mumuki.Chat.submitMessagesForm('<%= messages_url(@exercise) %>', '<%= read_messages_path(@exercise) %>', '<%= messages_errors_path %>')">
7
- <%= t :more_messages %>
8
- </a>
9
- </li>
10
4
  <% messages.each do |message| %>
11
- <li class="<%= sender_class(message) %>">
5
+ <li class="<%= sender_class(message) %> <%= staleness_class(message) %>">
12
6
  <div class="message">
13
7
  <p> <%= message.content_html %></p>
14
8
  <div class="sender"><%= message.sender unless message.sender == current_user_uid %></div>
@@ -4,6 +4,7 @@
4
4
  <%= user_menu_header %>
5
5
  <div class="mu-user-menu-items mu-hidden-sm-screen">
6
6
  <%= profile_user_menu_link %>
7
+ <%= notifications_user_menu_link %>
7
8
  <%= user_menu_divider %>
8
9
  <%= messages_user_menu_link %>
9
10
  <%= discussions_user_menu_link %>
@@ -15,7 +15,7 @@
15
15
  <% if @assignment.pending_messages? %>
16
16
  <span class="pending-messages-text"> <%= t :pending_messages_explanation %>
17
17
  <a href="javascript:{}"
18
- onclick="mumuki.Chat.submitMessagesForm('<%= messages_url(exercise) %>', '<%= read_messages_path(exercise) %>')"
18
+ onclick="mumuki.Chat.readMessages('<%= read_messages_path(exercise) %>')"
19
19
  class="<%= hidden_pending(@assignment) %>"
20
20
  data-waiting="<%= t(:sending_solution) %>">
21
21
  <%= t :get_messages %>
@@ -23,7 +23,7 @@
23
23
  <% if @assignment.pending_messages? %>
24
24
  <span class="pending-messages-text"> <%= t :pending_messages_explanation %>
25
25
  <a href="javascript:{}"
26
- onclick="mumuki.Chat.submitMessagesForm('<%= messages_url(exercise) %>', '<%= read_messages_path(exercise) %>')"
26
+ onclick="mumuki.Chat.readMessages('<%= read_messages_path(exercise) %>')"
27
27
  class="<%= hidden_pending(@assignment) %>"
28
28
  data-waiting="<%= t(:sending_solution) %>">
29
29
  <%= t :get_messages %>
@@ -1,3 +1,3 @@
1
1
  <div>
2
- <%= read_only_editor content, exercise.language.name %>
2
+ <%= read_only_editor content, exercise.language.highlight_mode %>
3
3
  </div>
@@ -4,10 +4,10 @@
4
4
 
5
5
  <div class="editor-files">
6
6
  <span class="files-tabs">
7
- <ul class="nav nav-tabs">
7
+ <ul class="nav nav-tabs" role="tablist">
8
8
  <% files.each_with_index do |file, index| %>
9
- <li role="presentation" class="file-tab <%= 'active' if index == 0 %>" data-bs-target="#editor-file-<%= index %>" tabindex='0' data-bs-toggle='tab'>
10
- <a class="file-name" href="#"><%= file.name %></a>
9
+ <li role="presentation" class="nav-item file-tab">
10
+ <a class="file-name nav-link <%= 'active' if index == 0 %>" href="#" data-bs-target="#editor-file-<%= index %>" tabindex="0" data-bs-toggle="tab"><%= file.name %></a>
11
11
  </li>
12
12
  <% end %>
13
13
  </ul>
@@ -17,7 +17,7 @@
17
17
 
18
18
  <div class="tab-content">
19
19
  <% files.each_with_index do |file, index| %>
20
- <div role="tabpanel" class="file-editor tab-pane mu-input-panel <%= 'fade in active' if index == 0 %>" id="editor-file-<%= index %>">
20
+ <div role="tabpanel" class="file-editor tab-pane mu-input-panel fade <%= 'show active' if index == 0 %>" id="editor-file-<%= index %>">
21
21
  <div class=<%="content[#{file.name}]"%>>
22
22
  <%= read_only_editor file.content, file.highlight_mode %>
23
23
  </div>
@@ -244,7 +244,7 @@
244
244
  @section Body Text
245
245
  */
246
246
  .bodyContainer .muMailTextContent,.bodyContainer .muMailTextContent p{
247
- /*@editable*/color:#808080;
247
+ /*@editable*/color:#616060;
248
248
  /*@editable*/font-family:Helvetica;
249
249
  /*@editable*/font-size:16px;
250
250
  /*@editable*/line-height:150%;
@@ -309,6 +309,12 @@
309
309
  /*@editable*/font-weight:normal;
310
310
  /*@editable*/text-decoration:underline;
311
311
  }
312
+
313
+ .mu-stealth-link {
314
+ text-decoration: none !important;
315
+ color: unset !important;
316
+ }
317
+
312
318
  @media only screen and (min-width:768px){
313
319
  .templateContainer{
314
320
  width:600px !important;
@@ -0,0 +1 @@
1
+ <%= notification.custom_content_plain_text %>
@@ -4,9 +4,9 @@
4
4
  <span class="badge badge-notifications"><%= notifications_count %></span>
5
5
  </div>
6
6
  <ul id="notificationsPanel" class="dropdown-menu dropdown-menu-end" aria-labelledby="notificationsDropdown">
7
- <% notifications.each do |it| %>
7
+ <% user_notifications.each do |it| %>
8
8
  <li>
9
- <%= notification_preview_for it.target %>
9
+ <%= notification_preview_for it %>
10
10
  </li>
11
11
  <% end %>
12
12
  </ul>
@@ -0,0 +1,2 @@
1
+ <% target = notification.target %>
2
+ <%= link_to t(:exam_authorization_request_updated, description: target.exam_registration.description), notification.organization.url_for('/user/exam_authorizations'), class: 'mu-stealth-link' %>
@@ -1 +1,2 @@
1
- <%= menu_item :book_open, :exam_registration_open, url_for(target), { description: target.description } %>
1
+ <% target = notification.target %>
2
+ <%= link_to t(:exam_registration_open, description: target.description), exam_registration_url(notification.organization, target), class: 'mu-stealth-link' %>
@@ -0,0 +1 @@
1
+ <%= notification_text_preview_item :envelope, notification.custom_title, notification.organization.url_for('/user/notifications') %>