mumuki-laboratory 8.5.0 → 8.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/stylesheets/mumuki_laboratory/application/modules/_discussion.scss +31 -8
- data/app/controllers/application_controller.rb +1 -1
- data/app/controllers/exam_authorization_requests_controller.rb +26 -0
- data/app/controllers/exam_registrations_controller.rb +6 -0
- data/app/helpers/application_helper.rb +4 -0
- data/app/helpers/icons_helper.rb +3 -11
- data/app/helpers/menu_bar_helper.rb +2 -2
- data/app/helpers/progress_bar_helper.rb +2 -2
- data/app/views/chapters/show.html.erb +2 -2
- data/app/views/discussions/_message.html.erb +7 -7
- data/app/views/exam_authorization_requests/show.html.erb +17 -0
- data/app/views/exam_registrations/show.html.erb +37 -0
- data/app/views/exercises/show.html.erb +1 -1
- data/app/views/layouts/_guide.html.erb +3 -3
- data/app/views/layouts/_progress_bar.html.erb +9 -7
- data/app/views/layouts/_progress_listing.html.erb +5 -5
- data/app/views/layouts/application.html.erb +1 -6
- data/app/views/notifications/_discussion.html.erb +1 -0
- data/app/views/notifications/_dropdown.html.erb +13 -0
- data/app/views/notifications/_exam_authorization_request.html.erb +1 -0
- data/app/views/notifications/_exam_registration.html.erb +1 -0
- data/app/views/notifications/_message.html.erb +1 -0
- data/config/routes.rb +3 -0
- data/lib/mumuki/laboratory/controllers/notifications.rb +3 -22
- data/lib/mumuki/laboratory/locales/en.yml +28 -14
- data/lib/mumuki/laboratory/locales/es-CL.yml +20 -6
- data/lib/mumuki/laboratory/locales/es.yml +25 -12
- data/lib/mumuki/laboratory/locales/pt.yml +22 -8
- data/lib/mumuki/laboratory/version.rb +1 -1
- data/spec/controllers/exam_authorization_requests_controller_spec.rb +40 -0
- data/spec/controllers/exam_registrations_controller_spec.rb +19 -0
- data/spec/features/notifications_flow_spec.rb +46 -0
- metadata +113 -98
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 92a4fb878a7767d1fe4b760252213ae327d8e5ae82bab805065eddb85b3baa36
|
|
4
|
+
data.tar.gz: e45d454449b183f1f4c200152a25f2df58ef385c1c07949e3fda7be94e6de57c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9113399868c37c29fc38521c88b1f4acd2477b6094469c97be54983eb46753245e79ea7d4a56cb641ade8746b05323ecdeef276321aeb70e19ceca123d232566
|
|
7
|
+
data.tar.gz: 1f101adea0a26968fe86fc9f7d5084e4cd821ab9b17ca528762bb55573a0be5eeb98e2eba0e5affa83da30168f046c6ea1b7e7cd6654beed0eeb599ea0aaaa73
|
|
@@ -5,7 +5,7 @@ $discussion-toolbar-color: #f6f6fa;
|
|
|
5
5
|
$message-divider-color: #ecf0f1;
|
|
6
6
|
$discussion-button-color: #fafafa;
|
|
7
7
|
$toolbar-filter-color: #808080;
|
|
8
|
-
$moderator-
|
|
8
|
+
$moderator-badge-color: #dd9900;
|
|
9
9
|
|
|
10
10
|
.discussions-list {
|
|
11
11
|
margin: 30px 0;
|
|
@@ -177,8 +177,17 @@ $moderator-star-color: #dd9900;
|
|
|
177
177
|
width: 100%;
|
|
178
178
|
}
|
|
179
179
|
|
|
180
|
-
.moderator-
|
|
181
|
-
|
|
180
|
+
.moderator-badge {
|
|
181
|
+
position: relative;
|
|
182
|
+
top: -2px;
|
|
183
|
+
margin: 2px;
|
|
184
|
+
font-size: 12px;
|
|
185
|
+
text-transform: uppercase;
|
|
186
|
+
color: white;
|
|
187
|
+
background-color: $moderator-badge-color;
|
|
188
|
+
border: solid $moderator-badge-color 1px;
|
|
189
|
+
border-radius: 5px;
|
|
190
|
+
padding-inline: 5px;
|
|
182
191
|
}
|
|
183
192
|
|
|
184
193
|
.discussion-user-menu {
|
|
@@ -326,12 +335,15 @@ summary.discussion-summary {
|
|
|
326
335
|
.actions {
|
|
327
336
|
float: right;
|
|
328
337
|
a {
|
|
329
|
-
margin-left:
|
|
338
|
+
margin-left: 20px;
|
|
330
339
|
cursor: pointer;
|
|
331
340
|
}
|
|
332
341
|
.discussion-message-approved {
|
|
333
342
|
text-decoration: none;
|
|
334
|
-
|
|
343
|
+
i {
|
|
344
|
+
transition: color 0.3s;
|
|
345
|
+
}
|
|
346
|
+
&:hover, &.selected {
|
|
335
347
|
i {
|
|
336
348
|
color: $brand-success;
|
|
337
349
|
}
|
|
@@ -341,17 +353,20 @@ summary.discussion-summary {
|
|
|
341
353
|
text-decoration: none;
|
|
342
354
|
i {
|
|
343
355
|
position: relative;
|
|
356
|
+
transition: color 0.3s;
|
|
344
357
|
&:after {
|
|
345
358
|
position: absolute;
|
|
346
|
-
left:
|
|
359
|
+
left: 10px;
|
|
360
|
+
top: -6px;
|
|
347
361
|
content: ' ';
|
|
348
|
-
height:
|
|
362
|
+
height: 30px;
|
|
349
363
|
width: 2px;
|
|
350
364
|
transform: rotate(-45deg);
|
|
351
365
|
background-color: #aaaaaa;
|
|
366
|
+
transition: background-color 0.3s;
|
|
352
367
|
}
|
|
353
368
|
}
|
|
354
|
-
&.selected {
|
|
369
|
+
&:hover, &.selected {
|
|
355
370
|
i {
|
|
356
371
|
color: $brand-primary;
|
|
357
372
|
&:after {
|
|
@@ -360,6 +375,14 @@ summary.discussion-summary {
|
|
|
360
375
|
}
|
|
361
376
|
}
|
|
362
377
|
}
|
|
378
|
+
.discussion-delete-message {
|
|
379
|
+
i {
|
|
380
|
+
transition: color 0.3s;
|
|
381
|
+
&:hover {
|
|
382
|
+
color: black;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
363
386
|
i {
|
|
364
387
|
color: #aaaaaa
|
|
365
388
|
}
|
|
@@ -34,8 +34,8 @@ class ApplicationController < ActionController::Base
|
|
|
34
34
|
helper_method :current_workspace,
|
|
35
35
|
:login_button,
|
|
36
36
|
:notifications_count,
|
|
37
|
-
:user_notifications_path,
|
|
38
37
|
:has_notifications?,
|
|
38
|
+
:notifications,
|
|
39
39
|
:subject,
|
|
40
40
|
:should_choose_organization?,
|
|
41
41
|
:current_immersive_organizations,
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
class ExamAuthorizationRequestsController < ApplicationController
|
|
2
|
+
def show
|
|
3
|
+
@authorization_request = ExamAuthorizationRequest.find(params[:id])
|
|
4
|
+
current_user.read_notification! @authorization_request
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def create
|
|
8
|
+
authorization_request = ExamAuthorizationRequest.create! authorization_request_params
|
|
9
|
+
current_user.read_notification! authorization_request.exam_registration
|
|
10
|
+
flash.notice = I18n.t :exam_authorization_request_created
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def update
|
|
14
|
+
ExamAuthorizationRequest.update params[:id], authorization_request_params
|
|
15
|
+
flash.notice = I18n.t :exam_authorization_request_saved
|
|
16
|
+
redirect_to root_path
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def authorization_request_params
|
|
22
|
+
params
|
|
23
|
+
.require(:exam_authorization_request).permit(:exam_id, :exam_registration_id)
|
|
24
|
+
.merge(user: current_user, organization: Organization.current)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -44,4 +44,8 @@ module ApplicationHelper
|
|
|
44
44
|
<span class="#{'hidden' unless active} #{options[:class]}">#{active_text}</span>
|
|
45
45
|
}.html_safe
|
|
46
46
|
end
|
|
47
|
+
|
|
48
|
+
def notification_preview_for(target)
|
|
49
|
+
render "notifications/#{target.class.name.underscore}", { target: target }
|
|
50
|
+
end
|
|
47
51
|
end
|
data/app/helpers/icons_helper.rb
CHANGED
|
@@ -7,9 +7,9 @@ module IconsHelper
|
|
|
7
7
|
fa_icon name, options.merge(class: 'fa-fw fixed-icon')
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
def
|
|
11
|
-
link_to
|
|
12
|
-
exercise_path(exercise) if current_user?
|
|
10
|
+
def assignment_status_icon(assignment)
|
|
11
|
+
link_to contextualization_fa_icon(assignment),
|
|
12
|
+
exercise_path(assignment.exercise) if current_user?
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def language_icon(language)
|
|
@@ -22,10 +22,6 @@ module IconsHelper
|
|
|
22
22
|
fa_icon(*icon_for(contextualization))
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
def exercise_status_fa_icon(exercise)
|
|
26
|
-
contextualization_fa_icon(exercise.assignment_for(current_user))
|
|
27
|
-
end
|
|
28
|
-
|
|
29
25
|
def discussion_status_fa_icon(discussion)
|
|
30
26
|
contextualization_fa_icon(discussion)
|
|
31
27
|
end
|
|
@@ -35,10 +31,6 @@ module IconsHelper
|
|
|
35
31
|
[iconized[:type], class: "text-#{iconized[:class]} status-icon"]
|
|
36
32
|
end
|
|
37
33
|
|
|
38
|
-
def class_for_exercise(exercise)
|
|
39
|
-
icon_class_for(exercise.assignment_for(current_user))
|
|
40
|
-
end
|
|
41
|
-
|
|
42
34
|
def icon_class_for(iconizable)
|
|
43
35
|
iconizable.iconize[:class].to_s
|
|
44
36
|
end
|
|
@@ -39,8 +39,8 @@ 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)
|
|
43
|
-
link_to fixed_fa_icon(icon, text: t(name)), url, role: 'menuitem', tabindex: '-1'
|
|
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'
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
def any_menu_bar_links?
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
module ProgressBarHelper
|
|
2
2
|
include IconsHelper
|
|
3
3
|
|
|
4
|
-
def class_for_progress_list_item(
|
|
5
|
-
"progress-list-item text-center #{
|
|
4
|
+
def class_for_progress_list_item(assignment, active)
|
|
5
|
+
"progress-list-item text-center #{icon_class_for(assignment)} #{active ? 'active' : ''}"
|
|
6
6
|
end
|
|
7
7
|
|
|
8
8
|
end
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
<div>
|
|
27
27
|
<h3><%= t(:lessons) %></h3>
|
|
28
28
|
|
|
29
|
-
<% @chapter.lessons.each do |lesson| %>
|
|
29
|
+
<% @chapter.lessons.includes(guide: :exercises).each do |lesson| %>
|
|
30
30
|
<h4><%= lesson.number %>. <%= link_to_path_element lesson, mode: :plain %></h4>
|
|
31
|
-
<%= render partial: 'layouts/progress_listing', locals: {
|
|
31
|
+
<%= render partial: 'layouts/progress_listing', locals: { guide: lesson.guide } %>
|
|
32
32
|
<% end %>
|
|
33
33
|
</div>
|
|
34
34
|
<% end %>
|
|
@@ -3,29 +3,29 @@
|
|
|
3
3
|
<div class="discussion-message-bubble-header">
|
|
4
4
|
<div class="discussion-message-bubble-title">
|
|
5
5
|
<%= user.name %>
|
|
6
|
+
<% if user.moderator_here? %>
|
|
7
|
+
<span class="moderator-badge"><%= t(:moderation) %></span>
|
|
8
|
+
<% end %>
|
|
6
9
|
<span class="message-date">
|
|
7
10
|
<%= t(:time_since, time: time_ago_in_words(message.created_at)) %>
|
|
8
11
|
</span>
|
|
9
|
-
<% if user.moderator_here? %>
|
|
10
|
-
<%= fa_icon(:star, 'data-toggle': 'tooltip', title: (t :moderator), class: 'moderator-star') %>
|
|
11
|
-
<% end %>
|
|
12
12
|
<span class="actions">
|
|
13
13
|
<% if message.authorized? current_user %>
|
|
14
14
|
<% if current_user&.moderator_here? %>
|
|
15
15
|
<a class="discussion-message-approved <%= 'selected' if message.approved? %>" onclick="mumuki.Forum.discussionMessageToggleApprove('<%= approve_discussion_message_url(@discussion, message) %>', $(this))">
|
|
16
|
-
<%= fa_icon(:check, class: 'fa-
|
|
16
|
+
<%= fa_icon(:check, class: 'fa-lg') %>
|
|
17
17
|
</a>
|
|
18
18
|
<% if message.from_initiator? %>
|
|
19
19
|
<a class="discussion-message-not-actually-a-question <%= 'selected' if message.not_actually_a_question? %>" onclick="mumuki.Forum.discussionMessageToggleNotActuallyAQuestion('<%= question_discussion_message_url(@discussion, message) %>', $(this))">
|
|
20
|
-
<%= fa_icon('question-circle', type: 'regular', class: 'fa-
|
|
20
|
+
<%= fa_icon('question-circle', type: 'regular', class: 'fa-lg') %>
|
|
21
21
|
</a>
|
|
22
22
|
<% end %>
|
|
23
23
|
<% end %>
|
|
24
|
-
<%= link_to fa_icon('trash-alt', type: :regular), discussion_message_path(@discussion, message), method: :delete, data: { confirm: t(:are_you_sure, action: t(:destroy_message)) } %>
|
|
24
|
+
<%= link_to fa_icon('trash-alt', type: :regular, class: 'fa-lg'), discussion_message_path(@discussion, message), method: :delete, data: { confirm: t(:are_you_sure, action: t(:destroy_message)) }, class: 'discussion-delete-message' %>
|
|
25
25
|
<% end %>
|
|
26
26
|
<% if should_show_approved_for?(current_user, message) %>
|
|
27
27
|
<span class="discussion-message-approved selected">
|
|
28
|
-
<%= fa_icon(:check, class: 'fa-
|
|
28
|
+
<%= fa_icon(:check, class: 'fa-lg', 'data-toggle': 'tooltip', title: (t :approved_message)) %>
|
|
29
29
|
</span>
|
|
30
30
|
<% end %>
|
|
31
31
|
</span>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<%= content_for :breadcrumbs do %>
|
|
2
|
+
<%= breadcrumbs @authorization_request %>
|
|
3
|
+
<% end %>
|
|
4
|
+
|
|
5
|
+
<div class="row">
|
|
6
|
+
<div class="mu-inline-block-left">
|
|
7
|
+
<h1>
|
|
8
|
+
<%= t :exam_registration_to, description: @authorization_request.exam_registration.description %>
|
|
9
|
+
</h1>
|
|
10
|
+
</div>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<% if @authorization_request.approved? %>
|
|
14
|
+
<%= t :exam_authorization_request_approved_html, date: l(@authorization_request.exam.start_time, format: :long) %>
|
|
15
|
+
<% else %>
|
|
16
|
+
<%= t :exam_authorization_request_rejected %>
|
|
17
|
+
<% end %>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<%= content_for :breadcrumbs do %>
|
|
2
|
+
<%= breadcrumbs @registration %>
|
|
3
|
+
<% end %>
|
|
4
|
+
|
|
5
|
+
<div class="row">
|
|
6
|
+
<div class="mu-inline-block-left">
|
|
7
|
+
<h1>
|
|
8
|
+
<%= t :exam_registration_to, description: @registration.description %>
|
|
9
|
+
</h1>
|
|
10
|
+
</div>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div class="row">
|
|
14
|
+
<div class="mu-inline-block-left">
|
|
15
|
+
<div class="bs-callout bs-callout-info">
|
|
16
|
+
<h4 class="text-info">
|
|
17
|
+
<strong><%= fa_icon :info_circle %> <%= t :important_info %></strong>
|
|
18
|
+
</h4>
|
|
19
|
+
<p>
|
|
20
|
+
<%= t :exam_registration_explanation_html, date: l(@registration.end_time, format: :long) %>
|
|
21
|
+
</p>
|
|
22
|
+
</div>
|
|
23
|
+
<%= form_for @authorization_request do |f| %>
|
|
24
|
+
<%= f.hidden_field :exam_registration_id, value: @registration.id %>
|
|
25
|
+
<div class="form-group">
|
|
26
|
+
<%= f.label :exam_id, t(:exam_registration_choose_exam) %>
|
|
27
|
+
<% @registration.exams.each do |exam| %>
|
|
28
|
+
<div class="field radio complementary complementary-radio">
|
|
29
|
+
<%= f.radio_button(:exam_id, exam.id, id: exam.id, required: true, checked: @authorization_request.exam_id == exam.id) %>
|
|
30
|
+
<%= label_tag exam.id, l(exam.start_time, format: :long) %>
|
|
31
|
+
</div>
|
|
32
|
+
<% end %>
|
|
33
|
+
</div>
|
|
34
|
+
<button class="btn btn-success"> <%= t :save %> </button>
|
|
35
|
+
<% end %>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
@@ -65,6 +65,6 @@
|
|
|
65
65
|
<%= render partial: 'layouts/modals/level_up' %>
|
|
66
66
|
<% end %>
|
|
67
67
|
|
|
68
|
-
<%= render partial: 'layouts/modals/guide_corollary', locals: {guide: @guide} %>
|
|
68
|
+
<%= render partial: 'layouts/modals/guide_corollary', locals: {guide: @guide} if @stats.almost_done? %>
|
|
69
69
|
<%= render partial: 'layouts/modals/new_message', locals: {exercise: @exercise} if should_render_message_input?(@exercise) %>
|
|
70
70
|
<% end if current_user? %>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
<%= render partial: 'layouts/authoring', locals: {guide: @guide} %>
|
|
4
4
|
|
|
5
|
-
<% if subject.timed? &&
|
|
5
|
+
<% if subject.timed? && @stats.started? && !current_user.teacher? %>
|
|
6
6
|
<%= render partial: 'layouts/timer', locals: {end_time: subject.real_end_time(current_user)} %>
|
|
7
7
|
<% end %>
|
|
8
8
|
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
|
|
11
11
|
<h3>
|
|
12
12
|
<%= t :exercises %>
|
|
13
|
-
<%= restart_guide_link(@guide) if current_user && @
|
|
13
|
+
<%= restart_guide_link(@guide) if current_user && @stats.started? && @guide.resettable? %>
|
|
14
14
|
</h3>
|
|
15
15
|
|
|
16
|
-
<%= render partial: 'layouts/progress_listing', locals: {
|
|
16
|
+
<%= render partial: 'layouts/progress_listing', locals: { guide: @guide } %>
|
|
17
17
|
|
|
18
18
|
<% if @stats&.done? %>
|
|
19
19
|
<div class="text-box">
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
<div class="progress-list-flex">
|
|
2
|
-
<% guide.
|
|
2
|
+
<% assignments = guide.assignments_for(current_user) %>
|
|
3
|
+
<% assignments.each do |assignment| %>
|
|
4
|
+
<% exercise = assignment.exercise %>
|
|
3
5
|
<a
|
|
4
|
-
<%= turbolinks_enable_for
|
|
5
|
-
href="<%= exercise_path(
|
|
6
|
-
aria-label="<%=
|
|
7
|
-
title="<%=
|
|
8
|
-
data-mu-exercise-id="<%=
|
|
9
|
-
class="<%= class_for_progress_list_item(
|
|
6
|
+
<%= turbolinks_enable_for exercise %>
|
|
7
|
+
href="<%= exercise_path(exercise)%>"
|
|
8
|
+
aria-label="<%= exercise.navigable_name %>"
|
|
9
|
+
title="<%= exercise.navigable_name %>"
|
|
10
|
+
data-mu-exercise-id="<%= exercise.id %>"
|
|
11
|
+
class="<%= class_for_progress_list_item(assignment, exercise == actual)%>">
|
|
10
12
|
</a>
|
|
11
13
|
<% end %>
|
|
12
14
|
</div>
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<ul class="progress-listing">
|
|
2
|
-
<%
|
|
3
|
-
<% cache [exercise,
|
|
4
|
-
<li <%= turbolinks_enable_for(exercise) %>>
|
|
5
|
-
<%=
|
|
6
|
-
<%= link_to_path_element(exercise) %>
|
|
2
|
+
<% guide.assignments_for(current_user).each do |assignment| %>
|
|
3
|
+
<% cache [assignment.exercise, assignment.status, Organization.current] do %>
|
|
4
|
+
<li <%= turbolinks_enable_for(assignment.exercise) %>>
|
|
5
|
+
<%= assignment_status_icon assignment %>
|
|
6
|
+
<%= link_to_path_element(assignment.exercise) %>
|
|
7
7
|
</li>
|
|
8
8
|
<% end %>
|
|
9
9
|
<% end %>
|
|
@@ -25,12 +25,7 @@
|
|
|
25
25
|
<span class="mu-level-number"></span>
|
|
26
26
|
</div>
|
|
27
27
|
<% end %>
|
|
28
|
-
|
|
29
|
-
<a href=<%= "#{user_notifications_path}" %>>
|
|
30
|
-
<i class="fas fa-bell fa-fw fa-2x mu-navbar-icon"></i>
|
|
31
|
-
<span class="badge badge-notifications"><%= notifications_count %></span>
|
|
32
|
-
</a>
|
|
33
|
-
</div>
|
|
28
|
+
<%= render partial: 'notifications/dropdown' %>
|
|
34
29
|
<div class="dropdown mu-navbar-element">
|
|
35
30
|
<div id="profileDropdown" class="profile-dropdown" data-toggle="dropdown" aria-label="<%= t(:user) %>" role="menu" tabindex="0">
|
|
36
31
|
<%= profile_picture_for current_user %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= menu_item :comments, :new_discussion_message, url_for([target.item, target]), { title: target.item.name.truncate_words(3) } %>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<div class="dropdown mu-navbar-element notifications-box <%= 'notifications-box-empty' unless has_notifications? %>">
|
|
2
|
+
<div id="notificationsDropdown" class="profile-dropdown" data-toggle="dropdown" aria-label="<%= t(:notifications) %>" role="menu" tabindex="0">
|
|
3
|
+
<i class="fas fa-bell fa-fw fa-2x mu-navbar-icon"></i>
|
|
4
|
+
<span class="badge badge-notifications"><%= notifications_count %></span>
|
|
5
|
+
</div>
|
|
6
|
+
<ul id="notificationsPanel" class="dropdown-menu dropdown-menu-right" aria-labelledby="notificationsDropdown">
|
|
7
|
+
<% notifications.each do |it| %>
|
|
8
|
+
<li>
|
|
9
|
+
<%= notification_preview_for it.target %>
|
|
10
|
+
</li>
|
|
11
|
+
<% end %>
|
|
12
|
+
</ul>
|
|
13
|
+
</div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= menu_item :book_open, :exam_authorization_request_updated, url_for(target), { description: target.exam_registration.description } %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= menu_item :book_open, :exam_registration_open, url_for(target), { description: target.description } %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= menu_item :envelope, :new_message_received, url_for(target.exercise), { sender: target.sender } %>
|
data/config/routes.rb
CHANGED
|
@@ -22,6 +22,9 @@ Rails.application.routes.draw do
|
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
+
resources :exam_registrations, only: [:show]
|
|
26
|
+
resources :exam_authorization_requests, only: [:show, :create, :update]
|
|
27
|
+
|
|
25
28
|
resources :book, only: [:show]
|
|
26
29
|
resources :chapters, only: [:show] do
|
|
27
30
|
concerns :debatable, debatable_class: 'Chapter'
|