mumuki-laboratory 9.0.4 → 9.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/mumuki_laboratory/application/discussions.js +43 -2
- data/app/assets/javascripts/mumuki_laboratory/application/user.js +1 -1
- data/app/assets/stylesheets/mumuki_laboratory/application/_modules.scss +1 -0
- data/app/assets/stylesheets/mumuki_laboratory/application/modules/_activity.scss +12 -0
- data/app/assets/stylesheets/mumuki_laboratory/application/modules/_discussion.scss +14 -2
- data/app/assets/stylesheets/mumuki_laboratory/application/modules/_user_menu.scss +1 -1
- data/app/assets/stylesheets/mumuki_laboratory/application/modules/_user_profile.scss +1 -0
- data/app/controllers/discussions_messages_controller.rb +6 -2
- data/app/controllers/users_controller.rb +13 -0
- data/app/helpers/discussions_helper.rb +5 -1
- data/app/helpers/user_activity_helper.rb +48 -0
- data/app/helpers/user_menu_helper.rb +4 -0
- data/app/views/discussions/_description_message.html.erb +1 -1
- data/app/views/discussions/_message.html.erb +1 -1
- data/app/views/discussions/_new_message.html.erb +13 -2
- data/app/views/discussions/new.html.erb +1 -1
- data/app/views/layouts/_user_menu.html.erb +2 -2
- data/app/views/users/_activity_indicator.html.erb +17 -0
- data/app/views/users/activity.html.erb +37 -0
- data/config/routes.rb +3 -0
- data/lib/mumuki/laboratory/extensions.rb +1 -0
- data/lib/mumuki/laboratory/extensions/date_and_time.rb +11 -0
- data/lib/mumuki/laboratory/locales/en.yml +13 -1
- data/lib/mumuki/laboratory/locales/es-CL.yml +18 -3
- data/lib/mumuki/laboratory/locales/es.yml +18 -3
- data/lib/mumuki/laboratory/locales/pt.yml +19 -1
- data/lib/mumuki/laboratory/version.rb +1 -1
- data/spec/controllers/discussions_messages_controller_spec.rb +20 -1
- data/spec/dummy/db/schema.rb +4 -1
- data/spec/features/discussion_flow_spec.rb +2 -0
- data/spec/features/user_activity_flow_spec.rb +65 -0
- data/spec/helpers/user_activity_helper_spec.rb +32 -0
- metadata +110 -102
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d72de447465b6716ee6b249aae76c6158aaa6ca02c87d58ea4e19fcf783ad85e
|
4
|
+
data.tar.gz: 387fef678b907e118266847df85eada3fb2aaea616162bb00e136776f2010629
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae0f9022a999d502065a58c4fca2224c4ea3f21562c56d55489889793d70c7d561554bbd2eeb0f940295a7fc071adac35cf439219b228aa150799c62ed9f6a25
|
7
|
+
data.tar.gz: 5e40cd1dc2accffef46a0a6981d0ad588f031070c611d67d8c0811cdd6919a6d4733b8363b1bf6d02018c41f9d72945c4b6b497bc465ebe6621c00e17087d6c5
|
@@ -1,9 +1,13 @@
|
|
1
1
|
mumuki.load(() => {
|
2
2
|
var $subscriptionSpans = $('.discussion-subscription > span');
|
3
3
|
var $upvoteSpans = $('.discussion-upvote > span');
|
4
|
+
let $messagePreviewButton = $('.discussion-new-message-preview-button.preview');
|
5
|
+
let $messageEditButton = $('.discussion-new-message-preview-button.edit');
|
6
|
+
let $newMessageContent = $('.discussion-new-message-content');
|
7
|
+
let $newMessagePreview = $('#discussion-new-message-preview');
|
4
8
|
|
5
9
|
function createNewMessageEditor() {
|
6
|
-
var $textarea = $("#new-
|
10
|
+
var $textarea = $("#discussion-new-message");
|
7
11
|
var textarea = $textarea[0];
|
8
12
|
if (!textarea) return;
|
9
13
|
|
@@ -26,7 +30,7 @@ mumuki.load(() => {
|
|
26
30
|
}
|
27
31
|
|
28
32
|
createReadOnlyEditors();
|
29
|
-
createNewMessageEditor();
|
33
|
+
let editor = createNewMessageEditor();
|
30
34
|
|
31
35
|
var Forum = {
|
32
36
|
toggleButton: function (spans) {
|
@@ -67,9 +71,46 @@ mumuki.load(() => {
|
|
67
71
|
const params = new URLSearchParams(location.search);
|
68
72
|
elem.is(':checked') ? params.set(key, elem.val()) : params.delete(key);
|
69
73
|
location.search = params.toString();
|
74
|
+
},
|
75
|
+
discussionMessagePreview: function (url) {
|
76
|
+
return Forum.tokenRequest({
|
77
|
+
url: url,
|
78
|
+
method: 'GET',
|
79
|
+
processData: false,
|
80
|
+
dataType: 'json',
|
81
|
+
data: new URLSearchParams({ content: editor.getValue() } ),
|
82
|
+
success: function (response) {
|
83
|
+
showPreview(response.preview);
|
84
|
+
},
|
85
|
+
error: function (e) {
|
86
|
+
error = $messagePreviewButton.attr('error-text');
|
87
|
+
showPreview(error);
|
88
|
+
},
|
89
|
+
xhrFields: {withCredentials: true}
|
90
|
+
});
|
91
|
+
},
|
92
|
+
hidePreviewAndShowEditor: function(elem) {
|
93
|
+
togglePreviewAndEditButtons();
|
94
|
+
togglePreviewAndContentMessage();
|
70
95
|
}
|
71
96
|
};
|
72
97
|
|
98
|
+
function showPreview(preview) {
|
99
|
+
$newMessagePreview.html($.parseHTML(preview));
|
100
|
+
togglePreviewAndEditButtons();
|
101
|
+
togglePreviewAndContentMessage();
|
102
|
+
}
|
103
|
+
|
104
|
+
function togglePreviewAndEditButtons() {
|
105
|
+
$messagePreviewButton.toggleClass('hidden');
|
106
|
+
$messageEditButton.toggleClass('hidden');
|
107
|
+
}
|
108
|
+
|
109
|
+
function togglePreviewAndContentMessage() {
|
110
|
+
$newMessagePreview.toggleClass('hidden');
|
111
|
+
$newMessageContent.toggleClass('hidden');
|
112
|
+
}
|
113
|
+
|
73
114
|
mumuki.Forum = Forum;
|
74
115
|
|
75
116
|
});
|
@@ -34,7 +34,7 @@ mumuki.load(() => {
|
|
34
34
|
let onUserProfile = document.querySelector('.mu-profile-info') !== null;
|
35
35
|
|
36
36
|
$userMenuHeader.click(() => {
|
37
|
-
$('.mu-user-menu-items').toggleClass('hidden-sm-screen');
|
37
|
+
$('.mu-user-menu-items').toggleClass('mu-hidden-sm-screen');
|
38
38
|
$('#mu-user-menu-header-icon').toggleClass('fa-chevron-up fa-chevron-down');
|
39
39
|
});
|
40
40
|
|
@@ -287,9 +287,21 @@ summary.discussion-summary {
|
|
287
287
|
}
|
288
288
|
}
|
289
289
|
|
290
|
+
.discussion-new-message-buttons {
|
291
|
+
display: flex;
|
292
|
+
margin: 0 -10px;
|
293
|
+
|
294
|
+
.btn {
|
295
|
+
margin: 15px 10px;
|
296
|
+
}
|
297
|
+
}
|
298
|
+
|
299
|
+
.discussion-new-message-preview-button {
|
300
|
+
flex-grow: 0.2;
|
301
|
+
}
|
302
|
+
|
290
303
|
.discussion-new-message-button {
|
291
|
-
|
292
|
-
margin-top: 15px;
|
304
|
+
flex-grow: 1;
|
293
305
|
}
|
294
306
|
|
295
307
|
.discussion-message {
|
@@ -3,7 +3,7 @@ class DiscussionsMessagesController < AjaxController
|
|
3
3
|
|
4
4
|
before_action :set_discussion!, only: [:create, :destroy]
|
5
5
|
before_action :authorize_user!, only: [:destroy]
|
6
|
-
before_action :authorize_moderator!, only: [:question, :approve]
|
6
|
+
before_action :authorize_moderator!, only: [:question, :approve, :preview]
|
7
7
|
|
8
8
|
def create
|
9
9
|
@discussion.submit_message! message_params, current_user
|
@@ -15,8 +15,12 @@ class DiscussionsMessagesController < AjaxController
|
|
15
15
|
redirect_back(fallback_location: root_path)
|
16
16
|
end
|
17
17
|
|
18
|
+
def preview
|
19
|
+
render json: { preview: Message.new(content: params[:content]).content_html }
|
20
|
+
end
|
21
|
+
|
18
22
|
def approve
|
19
|
-
current_message.toggle_approved!
|
23
|
+
current_message.toggle_approved! current_user
|
20
24
|
head :ok
|
21
25
|
end
|
22
26
|
|
@@ -30,6 +30,10 @@ class UsersController < ApplicationController
|
|
30
30
|
@watched_discussions = current_user.watched_discussions_in_organization
|
31
31
|
end
|
32
32
|
|
33
|
+
def activity
|
34
|
+
@activity = UserStats.stats_for(current_user).activity date_range_params
|
35
|
+
end
|
36
|
+
|
33
37
|
def certificates
|
34
38
|
@certificates ||= current_user.certificates_in_organization
|
35
39
|
end
|
@@ -54,4 +58,13 @@ class UsersController < ApplicationController
|
|
54
58
|
@user = current_user
|
55
59
|
end
|
56
60
|
|
61
|
+
def date_range_params
|
62
|
+
@date_from = params[:date_from].try { |it| Date.parse it }
|
63
|
+
to = params[:date_to].try { |it| Date.parse it }
|
64
|
+
if @date_from && to
|
65
|
+
@date_from.beginning_of_day..(to - 1.day).end_of_day
|
66
|
+
else
|
67
|
+
nil
|
68
|
+
end
|
69
|
+
end
|
57
70
|
end
|
@@ -12,7 +12,7 @@ module DiscussionsHelper
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def user_discussions_link
|
15
|
-
discussions_link
|
15
|
+
discussions_link(user_discussions_icon(t(:my_doubts)), discussions_user_path) if current_user.watched_discussions.present?
|
16
16
|
end
|
17
17
|
|
18
18
|
def others_discussions_icon(text)
|
@@ -195,4 +195,8 @@ module DiscussionsHelper
|
|
195
195
|
def should_show_approved_for?(user, message)
|
196
196
|
!user&.moderator_here? && message.approved? && !message.from_moderator?
|
197
197
|
end
|
198
|
+
|
199
|
+
def discussion_user_name(user)
|
200
|
+
user.name
|
201
|
+
end
|
198
202
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module UserActivityHelper
|
2
|
+
def activity_selector_week_range_for(organization = Organization.current)
|
3
|
+
start = organization.activity_start_date min_week
|
4
|
+
(start.prev_occurring(:monday) + 1..Date.today)
|
5
|
+
.step(7)
|
6
|
+
.to_a
|
7
|
+
.reverse
|
8
|
+
.map { |it| [it, it + 7.days] }
|
9
|
+
end
|
10
|
+
|
11
|
+
def mark_period_if_active(period_start)
|
12
|
+
active_period?(period_start) && 'class=active'
|
13
|
+
end
|
14
|
+
|
15
|
+
def solved_exercises_percentage
|
16
|
+
percentage = @activity[:exercises][:solved_count].to_f / @activity[:exercises][:count] * 100
|
17
|
+
"#{percentage.ceil}%"
|
18
|
+
end
|
19
|
+
|
20
|
+
def exercises_activity_stats
|
21
|
+
solved_count = {
|
22
|
+
name: t(:solved_exercises_count, count: @activity[:exercises][:solved_count]),
|
23
|
+
value: @activity[:exercises][:solved_count] }
|
24
|
+
solved_percentage = {
|
25
|
+
name: t(:solved_exercises_percentage),
|
26
|
+
value: solved_exercises_percentage }
|
27
|
+
|
28
|
+
@date_from ? [solved_count] : [solved_count, solved_percentage]
|
29
|
+
end
|
30
|
+
|
31
|
+
def messages_activity_stats
|
32
|
+
count = @activity[:messages][:count]
|
33
|
+
approved = @activity[:messages][:approved]
|
34
|
+
|
35
|
+
[{name: t(:messages_pluralized, count: count), value: count},
|
36
|
+
{name: t(:approved_messages, count: approved), value: approved}]
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def active_period?(period_start)
|
42
|
+
period_start ? @date_from == period_start : !@date_from
|
43
|
+
end
|
44
|
+
|
45
|
+
def min_week
|
46
|
+
8.week.ago.to_date
|
47
|
+
end
|
48
|
+
end
|
@@ -19,6 +19,10 @@ module UserMenuHelper
|
|
19
19
|
user_menu_item t(:discussions), discussions_user_path, 'discussions' if current_user&.can_discuss_here?
|
20
20
|
end
|
21
21
|
|
22
|
+
def activity_user_menu_link
|
23
|
+
user_menu_item t(:activity), activity_user_path, 'activity'
|
24
|
+
end
|
25
|
+
|
22
26
|
def certificates_user_menu_link
|
23
27
|
user_menu_item t(:certificates), certificates_user_path, 'certificates'
|
24
28
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<div class="discussion-message-bubble">
|
3
3
|
<div class="discussion-message-bubble-header">
|
4
4
|
<div class="discussion-message-bubble-title">
|
5
|
-
<%= discussion.initiator
|
5
|
+
<%= discussion_user_name(discussion.initiator) %>
|
6
6
|
<span class="message-date">
|
7
7
|
<%= t(:time_since, time: time_ago_in_words(discussion.created_at)) %>
|
8
8
|
</span>
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<div class="discussion-message-bubble">
|
3
3
|
<div class="discussion-message-bubble-header">
|
4
4
|
<div class="discussion-message-bubble-title">
|
5
|
-
<%= user
|
5
|
+
<%= discussion_user_name user %>
|
6
6
|
<% if user.moderator_here? %>
|
7
7
|
<span class="moderator-badge"><%= t(:moderation) %></span>
|
8
8
|
<% end %>
|
@@ -10,12 +10,23 @@
|
|
10
10
|
<div class="container-fluid">
|
11
11
|
<div class="row">
|
12
12
|
<div class="discussion-new-message-content">
|
13
|
-
<%= f.editor :content, '', { id: 'new-
|
13
|
+
<%= f.editor :content, '', { id: 'discussion-new-message', class: 'form-control', placeholder: t(:message) } %>
|
14
14
|
</div>
|
15
|
+
<div class="discussion-message-content hidden" id="discussion-new-message-preview"></div>
|
15
16
|
</div>
|
16
17
|
</div>
|
17
18
|
</div>
|
18
19
|
</div>
|
19
|
-
<
|
20
|
+
<div class="discussion-new-message-buttons">
|
21
|
+
<% if user.moderator_here? %>
|
22
|
+
<button class="btn btn-default discussion-new-message-preview-button preview" type="button" error-text="<%= t :preview_error %>"
|
23
|
+
onclick="mumuki.Forum.discussionMessagePreview('<%= preview_discussion_message_url %>')"> <%= fa_icon('eye', text: t(:preview)) %> </button>
|
24
|
+
<button class="btn btn-default discussion-new-message-preview-button edit hidden" type="button"
|
25
|
+
onclick="mumuki.Forum.hidePreviewAndShowEditor()"> <%= fa_icon('pencil-alt', text: t(:edit_message)) %> </button>
|
26
|
+
<% end %>
|
27
|
+
<%= button_tag type: 'submit', class: 'btn btn-success discussion-new-message-button', data: { disable: true } do %>
|
28
|
+
<%= fa_icon('comment', text: t(:comment)) %>
|
29
|
+
<% end %>
|
30
|
+
</div>
|
20
31
|
<% end %>
|
21
32
|
<% end %>
|
@@ -22,7 +22,7 @@
|
|
22
22
|
<div class="container-fluid">
|
23
23
|
<div class="row">
|
24
24
|
<div class="discussion-new-message-content">
|
25
|
-
<%= f.editor :description, '', {id: 'new-
|
25
|
+
<%= f.editor :description, '', {id: 'discussion-new-message', class: 'form-control', placeholder: t(:discussion_description_placeholder)} %>
|
26
26
|
</div>
|
27
27
|
</div>
|
28
28
|
</div>
|
@@ -2,13 +2,13 @@
|
|
2
2
|
<div class="mu-user-menu">
|
3
3
|
<div class="mu-user-menu-content">
|
4
4
|
<%= user_menu_header %>
|
5
|
-
<div class="col-xs-12 mu-user-menu-items hidden-sm-screen">
|
5
|
+
<div class="col-xs-12 mu-user-menu-items mu-hidden-sm-screen">
|
6
6
|
<%= profile_user_menu_link %>
|
7
7
|
<%= user_menu_divider %>
|
8
8
|
<%= messages_user_menu_link %>
|
9
9
|
<%= discussions_user_menu_link %>
|
10
10
|
<%= user_menu_divider %>
|
11
|
-
<%=
|
11
|
+
<%= activity_user_menu_link %>
|
12
12
|
</div>
|
13
13
|
</div>
|
14
14
|
<div class="mu-user-menu-divider vertical hidden-sm hidden-xs"></div>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<div class="row">
|
2
|
+
<div class="col-md-12">
|
3
|
+
<h3><%= title %></h3>
|
4
|
+
</div>
|
5
|
+
</div>
|
6
|
+
<div class="row">
|
7
|
+
<% stats.each do |s| %>
|
8
|
+
<div class="col-md-6">
|
9
|
+
<div class="jumbotron mu-user-activity-indicator">
|
10
|
+
<h1>
|
11
|
+
<%= s[:value] %>
|
12
|
+
<p><%= s[:name].downcase %></p>
|
13
|
+
</h1>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
17
|
+
</div>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<%= content_for :breadcrumbs do %>
|
2
|
+
<%= breadcrumbs_for_my_account %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<%= render partial: 'layouts/user_menu' %>
|
6
|
+
|
7
|
+
<div class="col-md-9 mu-tab-body">
|
8
|
+
<div class="mu-user-header">
|
9
|
+
<h1><%= t(:activity) %></h1>
|
10
|
+
</div>
|
11
|
+
<div class="col-md-8">
|
12
|
+
<%= render partial: 'activity_indicator',
|
13
|
+
locals: {
|
14
|
+
title: t(:exercises),
|
15
|
+
stats: exercises_activity_stats
|
16
|
+
} %>
|
17
|
+
|
18
|
+
<%= render partial: 'activity_indicator',
|
19
|
+
locals: {
|
20
|
+
title: t(:forum),
|
21
|
+
stats: messages_activity_stats
|
22
|
+
} %>
|
23
|
+
</div>
|
24
|
+
|
25
|
+
<div class="col-md-4">
|
26
|
+
<ul class="nav nav-pills nav-stacked mu-user-activity-selector">
|
27
|
+
<li <%= mark_period_if_active nil %>>
|
28
|
+
<%= link_to t(:total), activity_user_path %>
|
29
|
+
</li>
|
30
|
+
<% activity_selector_week_range_for.each do |(week_start, week_end)| %>
|
31
|
+
<li <%= mark_period_if_active week_start %>>
|
32
|
+
<%= link_to t(:week_of, date: l(week_start)), activity_user_path(date_from: week_start, date_to: week_end) %>
|
33
|
+
</li>
|
34
|
+
<% end %>
|
35
|
+
</ul>
|
36
|
+
</div>
|
37
|
+
</div>
|
data/config/routes.rb
CHANGED
@@ -21,6 +21,7 @@ Rails.application.routes.draw do
|
|
21
21
|
post :question, on: :member
|
22
22
|
end
|
23
23
|
end
|
24
|
+
get '/discussions/messages/preview', to: 'discussions_messages#preview', as: :preview_discussion_message
|
24
25
|
|
25
26
|
resources :exam_registrations, only: [:show]
|
26
27
|
resources :exam_authorization_requests, only: [:show, :create, :update]
|
@@ -65,7 +66,9 @@ Rails.application.routes.draw do
|
|
65
66
|
|
66
67
|
get :messages
|
67
68
|
get :discussions
|
69
|
+
get :activity
|
68
70
|
get :certificates
|
71
|
+
|
69
72
|
end
|
70
73
|
|
71
74
|
resources :faqs, only: [:index]
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module DateAndTime
|
2
|
+
module Calculations
|
3
|
+
# Polyfill, already implemented on Rails 5.2
|
4
|
+
# https://api.rubyonrails.org/classes/DateAndTime/Calculations.html#method-i-prev_occurring
|
5
|
+
def prev_occurring(day_of_week)
|
6
|
+
ago = wday - DAYS_INTO_WEEK.fetch(day_of_week)
|
7
|
+
ago += 7 unless ago > 0
|
8
|
+
advance(days: -ago)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -14,6 +14,8 @@ en:
|
|
14
14
|
appendix: Appendix
|
15
15
|
appendix_teaser: Do you want to learn more? <a href="%{link}">Check this chapter's appendix</a>"
|
16
16
|
approved_message: Validated by mentor
|
17
|
+
approved_messages:
|
18
|
+
other: validated
|
17
19
|
are_you_sure: Are you sure you want to %{action}?
|
18
20
|
ask_a_question: Ask a question!
|
19
21
|
ask_community: Ask community for help
|
@@ -77,6 +79,7 @@ en:
|
|
77
79
|
dont_leave_us: Don't leave us! Learning is fun. You just have to keep at it.
|
78
80
|
download: Download your solution
|
79
81
|
edit: Edit
|
82
|
+
edit_message: Edit message
|
80
83
|
edit_profile: Edit profile
|
81
84
|
editor_placeholder: "write your solution here..."
|
82
85
|
email: Email
|
@@ -176,6 +179,9 @@ en:
|
|
176
179
|
messages: Messages
|
177
180
|
messages_error: Previous messages are unavailable. Please try again later.
|
178
181
|
moderation: Mentoring
|
182
|
+
messages_pluralized:
|
183
|
+
one: Message
|
184
|
+
other: Messages
|
179
185
|
moderator: Mentor
|
180
186
|
more_messages: More
|
181
187
|
my_account: My account
|
@@ -224,6 +230,8 @@ en:
|
|
224
230
|
permissions: Permissions
|
225
231
|
please_fill_profile_data: Please complete your profile data to continue!
|
226
232
|
please_validate: 'Please validate your data before continue:'
|
233
|
+
preview: Preview
|
234
|
+
preview_error: The preview cannot be shown. Check your internet connection or try with a shorter message.
|
227
235
|
previous_exercise: Previous
|
228
236
|
problem_with_exercise: '[Mumuki] Problem with exercise: %{title}'
|
229
237
|
processing_your_solution: We are processing you solution
|
@@ -256,11 +264,13 @@ en:
|
|
256
264
|
skipped_solve_anyway: Solve anyway
|
257
265
|
solution: Solution
|
258
266
|
solved: Solved
|
259
|
-
solved_count: '%{count} solved'
|
260
267
|
solve_doubts: Solve other's doubts
|
261
268
|
solve_more_exercises_to_level_up: Solve <span>number</span> more exercises to advance to the next level.
|
262
269
|
solve_your_doubts: Solve your doubts
|
263
270
|
solve_your_doubts_teaser: Do you have any doubts?
|
271
|
+
solved_count: '%{count} solved'
|
272
|
+
solved_exercises_count: solved
|
273
|
+
solved_exercises_percentage: done
|
264
274
|
something_went_wrong: Something went wrong!
|
265
275
|
sort: Sort
|
266
276
|
sources: Sources
|
@@ -293,6 +303,7 @@ en:
|
|
293
303
|
to_pending_review: Mark as solved
|
294
304
|
to_solved: Mark as solved
|
295
305
|
unauthorized_explanation: You have no permissions for this content. Maybe you logged in with another account.
|
306
|
+
total: Total
|
296
307
|
undo_upvote: Undo upvote
|
297
308
|
unlocked_medal_as_avatar: You earned this medal! You can now choose it as an avatar.
|
298
309
|
unspecified: I'd rather not say
|
@@ -310,6 +321,7 @@ en:
|
|
310
321
|
view_details: View details
|
311
322
|
want_permissions: The next user requires permissions
|
312
323
|
we_miss_you: We miss you!
|
324
|
+
week_of: Week of %{date}
|
313
325
|
welcome: Welcome to %{name}!
|
314
326
|
working: "Working"
|
315
327
|
wrong_answer: The answer is wrong
|
@@ -13,6 +13,9 @@ es-CL:
|
|
13
13
|
appendix_teaser: ¿Quieres saber más? <a href="%{link}">Consulta el apéndice de este capítulo</a>
|
14
14
|
are_you_sure: '¿Estás seguro que quieres %{action}?'
|
15
15
|
ask_a_question: ¡Haz una pregunta!
|
16
|
+
approved_messages:
|
17
|
+
one: validado
|
18
|
+
other: validados
|
16
19
|
ask_community: Pregunta a la comunidad
|
17
20
|
ask_redirect: ¿Quieres que te llevemos ahí?
|
18
21
|
ask_the_first_question: ¡Haz la primera pregunta!
|
@@ -77,6 +80,7 @@ es-CL:
|
|
77
80
|
dont_leave_us: ¡No nos abandones! Aprender a programar es divertido. Sólo tienes que seguir practicando.
|
78
81
|
download: "Descarga lo que hiciste"
|
79
82
|
edit: Editar
|
83
|
+
edit_message: Editar mensaje
|
80
84
|
editor_placeholder: "...escribe tu solución acá..."
|
81
85
|
email: Email
|
82
86
|
error_description: Esto es lo que se conoce como <span class="error-link">%{error}</span>.
|
@@ -174,6 +178,9 @@ es-CL:
|
|
174
178
|
message: Mensaje
|
175
179
|
messages: Mensajes
|
176
180
|
messages_error: Los mensajes anteriores no están disponibles en este momento. ¡Vuelve a intentar más tarde!
|
181
|
+
messages_pluralized:
|
182
|
+
one: Mensaje
|
183
|
+
other: Mensajes
|
177
184
|
minute: minuto
|
178
185
|
minutes: minutos
|
179
186
|
moderation: Mentoría
|
@@ -230,6 +237,8 @@ es-CL:
|
|
230
237
|
permissions: Permisos
|
231
238
|
please_fill_profile_data: ¡Completa tus datos personales para continuar!
|
232
239
|
please_validate: 'Estás a punto de ingresar al curso. Para poder ofrecerte una mejor experiencia, por favor valida que tus datos a continuación sean reales y correctos.'
|
240
|
+
preview: Vista previa
|
241
|
+
preview_error: No se puede mostrar la vista previa. Revisa tu conexión a internet o prueba con un mensaje más corto.
|
233
242
|
previous_exercise: Anterior
|
234
243
|
problem_with_exercise: '[Mumuki] Error con el ejercicio: %{title}'
|
235
244
|
processing_your_solution: Estamos procesando tu solución
|
@@ -260,15 +269,19 @@ es-CL:
|
|
260
269
|
skipped_solve_anyway: Resolver de todos modos
|
261
270
|
solution: Solución
|
262
271
|
solved: Resuelta
|
263
|
-
solved_count:
|
264
|
-
one: 1 resuelta
|
265
|
-
other: '%{count} resueltas'
|
266
272
|
solved_exercises: Ejercicios Resueltos
|
267
273
|
solve_doubts: Resuelve consultas
|
268
274
|
solve_more_exercises_to_level_up: Resuelve <span>number</span> ejercicios más para pasar al siguiente nivel.
|
269
275
|
solve_your_doubts: Consulta tus dudas
|
270
276
|
solve_your_doubts_teaser: ¿Tienes alguna consulta?
|
271
277
|
something_went_wrong: ¡Ups!, algo no anduvo bien...
|
278
|
+
solved_count:
|
279
|
+
one: 1 resuelta
|
280
|
+
other: '%{count} resueltas'
|
281
|
+
solved_exercises_count:
|
282
|
+
one: resuelto
|
283
|
+
other: resueltos
|
284
|
+
solved_exercises_percentage: realizado
|
272
285
|
sort: Ordenar
|
273
286
|
sources: Bibliografía
|
274
287
|
start_lesson: ¡Comienza esta lección!
|
@@ -300,6 +313,7 @@ es-CL:
|
|
300
313
|
to_pending_review: Resolver
|
301
314
|
to_solved: Resolver
|
302
315
|
unauthorized_explanation: ¡Ups! Esto es lo que se conoce como %{error}, es decir que no iniciaste sesión.
|
316
|
+
total: Total
|
303
317
|
uncategorized: No categorizado
|
304
318
|
undo_upvote: No es útil
|
305
319
|
unlocked_medal_as_avatar: ¡Obtuviste esta medalla! Ya puedes elegirla como avatar.
|
@@ -318,6 +332,7 @@ es-CL:
|
|
318
332
|
view_details: Ver detalles
|
319
333
|
want_permissions: El siguiente usuario requiere permisos
|
320
334
|
we_miss_you: ¡Te extrañamos!
|
335
|
+
week_of: Semana del %{date}
|
321
336
|
will_paginate:
|
322
337
|
previous_label: "← Anterior"
|
323
338
|
next_label: "Siguiente →"
|
@@ -17,6 +17,9 @@ es:
|
|
17
17
|
approved_message: Validado por mentor
|
18
18
|
are_you_sure: '¿Estás seguro que querés %{action}?'
|
19
19
|
ask_a_question: ¡Hacé una pregunta!
|
20
|
+
approved_messages:
|
21
|
+
one: validado
|
22
|
+
other: validados
|
20
23
|
ask_community: Preguntá a la comunidad
|
21
24
|
ask_redirect: ¿Querés que te llevemos ahí?
|
22
25
|
ask_the_first_question: ¡Hacé la primera pregunta!
|
@@ -84,6 +87,7 @@ es:
|
|
84
87
|
dont_leave_us: ¡No nos abandones! Aprender a programar es divertido. Sólo tenés que seguir practicando.
|
85
88
|
download: "Descargá lo que hiciste"
|
86
89
|
edit: Editar
|
90
|
+
edit_message: Editar mensaje
|
87
91
|
edit_profile: Editar perfil
|
88
92
|
editor_placeholder: "...escribí tu solución acá..."
|
89
93
|
email: Email
|
@@ -185,6 +189,9 @@ es:
|
|
185
189
|
message: Mensaje
|
186
190
|
messages: Mensajes
|
187
191
|
messages_error: Los mensajes anteriores no están disponibles en este momento. ¡Volvé a intentar mas tarde!
|
192
|
+
messages_pluralized:
|
193
|
+
one: Mensaje
|
194
|
+
other: Mensajes
|
188
195
|
minute: minuto
|
189
196
|
minutes: minutos
|
190
197
|
moderation: Mentoría
|
@@ -241,6 +248,8 @@ es:
|
|
241
248
|
permissions: Permisos
|
242
249
|
please_fill_profile_data: ¡Completá tus datos personales para continuar!
|
243
250
|
please_validate: 'Estás a punto de ingresar al curso. Para poder ofrecerte una mejor experiencia, por favor validá que tus datos a continuación sean reales y correctos.'
|
251
|
+
preview: Vista previa
|
252
|
+
preview_error: No se puede mostrar la vista previa. Revisá tu conexión a internet o probá con un mensaje más corto.
|
244
253
|
previous_exercise: Anterior
|
245
254
|
problem_with_exercise: '[Mumuki] Error con el ejercicio: %{title}'
|
246
255
|
processing_your_solution: Estamos procesando tu solución
|
@@ -275,15 +284,19 @@ es:
|
|
275
284
|
skipped_solve_anyway: Resolver de todos modos
|
276
285
|
solution: Solución
|
277
286
|
solved: Resuelta
|
278
|
-
solved_count:
|
279
|
-
one: 1 resuelta
|
280
|
-
other: '%{count} resueltas'
|
281
287
|
solved_exercises: Ejercicios Resueltos
|
282
288
|
solve_doubts: Resolvé consultas
|
283
289
|
solve_more_exercises_to_level_up: Resolvé <span>number</span> ejercicios más para pasar al siguiente nivel.
|
284
290
|
solve_your_doubts: Consultá tus dudas
|
285
291
|
solve_your_doubts_teaser: ¿Tenés alguna consulta?
|
286
292
|
something_went_wrong: ¡Ups!, algo no anduvo bien...
|
293
|
+
solved_count:
|
294
|
+
one: 1 resuelta
|
295
|
+
other: '%{count} resueltas'
|
296
|
+
solved_exercises_count:
|
297
|
+
one: resuelto
|
298
|
+
other: resueltos
|
299
|
+
solved_exercises_percentage: realizado
|
287
300
|
sort: Ordenar
|
288
301
|
sources: Bibliografía
|
289
302
|
start_lesson: ¡Comenzá esta lección!
|
@@ -316,6 +329,7 @@ es:
|
|
316
329
|
to_pending_review: Resolver
|
317
330
|
to_solved: Resolver
|
318
331
|
unauthorized_explanation: ¡Ups! Esto es lo que se conoce como %{error}, es decir que no iniciaste sesión.
|
332
|
+
total: Total
|
319
333
|
uncategorized: No categorizado
|
320
334
|
undo_upvote: No es útil
|
321
335
|
unlocked_medal_as_avatar: ¡Obtuviste esta medalla! Ya podés elegirla como avatar.
|
@@ -335,6 +349,7 @@ es:
|
|
335
349
|
want_permissions: El siguiente usuario requiere permisos
|
336
350
|
we_miss_you: ¡Te extrañamos!
|
337
351
|
welcome: ¡Te damos la bienvenida a %{name}!
|
352
|
+
week_of: Semana del %{date}
|
338
353
|
will_paginate:
|
339
354
|
previous_label: "← Anterior"
|
340
355
|
next_label: "Siguiente →"
|
@@ -16,6 +16,9 @@ pt:
|
|
16
16
|
appendix_teaser: Você quer saber mais? <a href="%{link}"> Consulte o apêndice deste capítulo </a>
|
17
17
|
approved_message: Validado pelo mentor
|
18
18
|
are_you_sure: 'Tem certeza de que deseja %{action}?'
|
19
|
+
approved_messages:
|
20
|
+
one: validado
|
21
|
+
other: validados
|
19
22
|
ask_a_question: Faça uma pergunta!
|
20
23
|
ask_community: Pergunte à comunidade
|
21
24
|
ask_redirect: Você quer que nós o levemos para lá?
|
@@ -80,6 +83,7 @@ pt:
|
|
80
83
|
discussions_will_be_here: As perguntas que você fizer no espaço de consulta aparecerão aqui.
|
81
84
|
download: Faça o download do que você fez
|
82
85
|
edit: Editar
|
86
|
+
edit_message: Editar mensagem
|
83
87
|
edit_profile: Editar perfil
|
84
88
|
editor_placeholder: ... Escreva sua solução aqui ...
|
85
89
|
email: E-mail
|
@@ -179,6 +183,10 @@ pt:
|
|
179
183
|
message: Mensagem
|
180
184
|
messages: Mensagens
|
181
185
|
messages_error: As mensagens acima não estão disponíveis no momento. Eu tentei novamente mais tarde!
|
186
|
+
mais tarde!
|
187
|
+
messages_pluralized:
|
188
|
+
one: Mensagem
|
189
|
+
other: Mensagens
|
182
190
|
minute: minuto
|
183
191
|
minutes: minutos
|
184
192
|
moderation: Mentoria
|
@@ -232,6 +240,8 @@ pt:
|
|
232
240
|
permissions: Permissões
|
233
241
|
please_fill_profile_data: Preencha suas informações pessoais para continuar!
|
234
242
|
please_validate: Você está prestes a entrar no curso. Para oferecer uma experiência melhor, valide que seus dados abaixo sejam reais e corretos.
|
243
|
+
preview: Vista prévia
|
244
|
+
preview_error: A visualizaçao não pode ser mostrada. Verifique sua conexão com a internet ou tente com uma mensagem mais curta.
|
235
245
|
previous_exercise: Anterior
|
236
246
|
problem_with_exercise: '[Mumuki] Erro com exercício %{title}'
|
237
247
|
processing_your_solution: Estamos processando sua solução
|
@@ -264,12 +274,18 @@ pt:
|
|
264
274
|
skipped_solve_anyway: Resolver mesmo assim
|
265
275
|
solution: Solução
|
266
276
|
solved: Resolvido
|
267
|
-
solved_count: '%{count} resolvido'
|
268
277
|
solved_exercises: Exercícios resolvidos
|
278
|
+
solved_count:
|
279
|
+
one: 1 resolvido
|
280
|
+
other: '%{count} resolvidos'
|
269
281
|
solve_doubts: Resolvi dúvidas
|
270
282
|
solve_more_exercises_to_level_up: Resolva mais <span>number</span> exercícios para avançar para o próximo nível.
|
271
283
|
solve_your_doubts: Consulte suas dúvidas
|
272
284
|
solve_your_doubts_teaser: Você tem alguma dúvida?
|
285
|
+
solved_exercises_count:
|
286
|
+
one: resolvido
|
287
|
+
other: resolvidos
|
288
|
+
solved_exercises_percentage: realizado
|
273
289
|
something_went_wrong: Oops!, Algo não estava certo ...
|
274
290
|
sort: Ordenar
|
275
291
|
sources: Bibliografia
|
@@ -301,6 +317,7 @@ pt:
|
|
301
317
|
to_pending_review: Marcar como resolvida
|
302
318
|
to_solved: Marcar como resolvida
|
303
319
|
unauthorized_explanation: Opa! Isso é o que é conhecido como %{error}, ou seja, você não fez logon.
|
320
|
+
total: Total
|
304
321
|
uncategorized: Não classificado
|
305
322
|
unlocked_medal_as_avatar: Você ganhou essa medalha! Agora você pode escolhê-la como avatar.
|
306
323
|
unspecified: Eu preferiria não dizer
|
@@ -313,6 +330,7 @@ pt:
|
|
313
330
|
username: Nome de usuário
|
314
331
|
view_details: Ver detalhes
|
315
332
|
want_permissions: O próximo usuário requer permissões
|
333
|
+
week_of: Semana de %{date}
|
316
334
|
welcome: Convidamos você a {name}!
|
317
335
|
working: Processamento
|
318
336
|
wrong_answer: A resposta não é correta
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe DiscussionsMessagesController, organization_workspace: :test do
|
3
|
+
describe DiscussionsMessagesController, type: :controller, organization_workspace: :test do
|
4
4
|
let(:student) { create(:user, permissions: {student: 'test/*'}) }
|
5
5
|
let(:moderator) { create(:user, permissions: {moderator: 'test/*', student: 'test/*'}) }
|
6
6
|
|
@@ -69,5 +69,24 @@ describe DiscussionsMessagesController, organization_workspace: :test do
|
|
69
69
|
it { expect(response.status).to eq 200 }
|
70
70
|
it { expect(message.reload.not_actually_a_question).to be true }
|
71
71
|
end
|
72
|
+
|
73
|
+
describe 'preview' do
|
74
|
+
let(:message) { create(:message, content: 'Message in **bold** and _italics_', discussion: discussion, sender: student.uid) }
|
75
|
+
|
76
|
+
describe 'for student' do
|
77
|
+
before { set_current_user! student }
|
78
|
+
before { get :preview, params: {content: message.content} }
|
79
|
+
|
80
|
+
it { expect(response.status).to eq 403 }
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'for moderator' do
|
84
|
+
before { set_current_user! moderator }
|
85
|
+
before { get :preview, params: {content: message.content} }
|
86
|
+
|
87
|
+
it { expect(response.status).to eq 200 }
|
88
|
+
it { expect(JSON.parse(response.body)['preview']).to eq "<p>Message in <strong>bold</strong> and <em>italics</em></p>\n" }
|
89
|
+
end
|
90
|
+
end
|
72
91
|
end
|
73
92
|
end
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
#
|
11
11
|
# It's strongly recommended that you check this file into your version control system.
|
12
12
|
|
13
|
-
ActiveRecord::Schema.define(version:
|
13
|
+
ActiveRecord::Schema.define(version: 20210308145910) do
|
14
14
|
|
15
15
|
# These are extensions that must be enabled in order to support this database
|
16
16
|
enable_extension "plpgsql"
|
@@ -368,6 +368,9 @@ ActiveRecord::Schema.define(version: 20210302181654) do
|
|
368
368
|
t.integer "discussion_id"
|
369
369
|
t.boolean "approved", default: false
|
370
370
|
t.boolean "not_actually_a_question", default: false
|
371
|
+
t.datetime "approved_at"
|
372
|
+
t.bigint "approved_by_id"
|
373
|
+
t.index ["approved_by_id"], name: "index_messages_on_approved_by_id"
|
371
374
|
end
|
372
375
|
|
373
376
|
create_table "notifications", force: :cascade do |t|
|
@@ -169,6 +169,7 @@ feature 'Discussion Flow', organization_workspace: :test do
|
|
169
169
|
expect(page).to have_text(problem_2.name)
|
170
170
|
expect(page).to have_text('Open')
|
171
171
|
expect(page).to have_text('Messages')
|
172
|
+
expect(page).not_to have_text('Preview')
|
172
173
|
expect(page).not_to have_xpath("//div[@class='discussion-actions']")
|
173
174
|
end
|
174
175
|
|
@@ -180,6 +181,7 @@ feature 'Discussion Flow', organization_workspace: :test do
|
|
180
181
|
expect(page).to have_text(problem_2.name)
|
181
182
|
expect(page).to have_text('Open')
|
182
183
|
expect(page).to have_text('Messages')
|
184
|
+
expect(page).to have_text('Preview')
|
183
185
|
expect(page).to have_xpath("//div[@class='discussion-actions']")
|
184
186
|
end
|
185
187
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'User Activity Flow', organization_workspace: :test do
|
4
|
+
let(:user) { create(:user) }
|
5
|
+
before { set_current_user!(user) }
|
6
|
+
|
7
|
+
let(:fake_stats) { double('stats') }
|
8
|
+
before do
|
9
|
+
allow(UserStats).to receive(:stats_for).and_return(fake_stats)
|
10
|
+
allow(fake_stats).to receive(:activity).and_return(
|
11
|
+
{ exercises: { solved_count: 8, count: 10 },
|
12
|
+
messages: { count: 12, approved: 6 } })
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:week_start) { Time.new(2020, 10, 12) }
|
16
|
+
before do
|
17
|
+
allow(Time).to receive(:now).and_return(week_start)
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'total' do
|
21
|
+
before { visit activity_user_path }
|
22
|
+
|
23
|
+
scenario 'displays exercises done percentage' do
|
24
|
+
expect(page).to have_text('80%')
|
25
|
+
expect(page).to have_text('done')
|
26
|
+
end
|
27
|
+
|
28
|
+
scenario 'displays exercises solved count' do
|
29
|
+
expect(page).to have_text('8')
|
30
|
+
expect(page).to have_text('solved')
|
31
|
+
end
|
32
|
+
|
33
|
+
scenario 'displays messages count' do
|
34
|
+
expect(page).to have_text('12')
|
35
|
+
expect(page).to have_text('messages')
|
36
|
+
end
|
37
|
+
|
38
|
+
scenario 'displays validated messages count' do
|
39
|
+
expect(page).to have_text('6')
|
40
|
+
expect(page).to have_text('validated')
|
41
|
+
end
|
42
|
+
|
43
|
+
scenario 'displays recent weeks' do
|
44
|
+
expect(page).to have_text 'Week of 2020-10-12'
|
45
|
+
expect(page).to have_text 'Week of 2020-10-05'
|
46
|
+
expect(page).to have_text 'Week of 2020-09-28'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'selecting a specific week' do
|
51
|
+
before do
|
52
|
+
visit activity_user_path
|
53
|
+
click_on 'Week of 2020-10-12'
|
54
|
+
end
|
55
|
+
|
56
|
+
scenario "redirects to week activity" do
|
57
|
+
expect(page).to have_current_path('/user/activity?date_from=2020-10-12&date_to=2020-10-19')
|
58
|
+
end
|
59
|
+
|
60
|
+
scenario "doesn't display exercises done percentage" do
|
61
|
+
expect(page).not_to have_text('80%')
|
62
|
+
expect(page).not_to have_text('done')
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe UserActivityHelper, organization_workspace: :test do
|
4
|
+
helper UserActivityHelper
|
5
|
+
|
6
|
+
let(:organization) { Organization.current }
|
7
|
+
|
8
|
+
before do
|
9
|
+
# Set today date to Wednesday to test week always starts on Monday
|
10
|
+
allow(Date).to receive(:today).and_return(Date.new(2021, 2, 10))
|
11
|
+
allow_any_instance_of(UserActivityHelper).to receive(:min_week).and_return(8.weeks.ago(Date.today))
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'activity_selector_week_range_for' do
|
15
|
+
let(:range) { activity_selector_week_range_for organization }
|
16
|
+
let(:closest_monday) { Date.new(2021, 2, 8) }
|
17
|
+
|
18
|
+
context 'organization without in preparation until' do
|
19
|
+
it { expect(range.length).to eq 9 }
|
20
|
+
it { expect(range.first).to eq [closest_monday, 1.week.since(closest_monday).to_date] }
|
21
|
+
it { expect(range.last).to eq [8.week.ago(closest_monday).to_date, 7.week.ago(closest_monday).to_date] }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'organization with in preparation until' do
|
25
|
+
before { organization.update! in_preparation_until: 3.week.ago(Date.today) }
|
26
|
+
|
27
|
+
it { expect(range.length).to eq 4 }
|
28
|
+
it { expect(range.first).to eq [closest_monday, 1.week.since(closest_monday).to_date] }
|
29
|
+
it { expect(range.last).to eq [3.week.ago(closest_monday).to_date, 2.week.ago(closest_monday).to_date] }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mumuki-laboratory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 9.0.
|
4
|
+
version: 9.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Franco Bulgarelli
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-03-
|
11
|
+
date: 2021-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 9.0.
|
33
|
+
version: 9.0.5
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 9.0.
|
40
|
+
version: 9.0.5
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: mumukit-bridge
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -456,6 +456,7 @@ files:
|
|
456
456
|
- app/assets/stylesheets/mumuki_laboratory/application/_vendor.scss
|
457
457
|
- app/assets/stylesheets/mumuki_laboratory/application/codemirror-themes/_mu-light.scss
|
458
458
|
- app/assets/stylesheets/mumuki_laboratory/application/hovers.scss
|
459
|
+
- app/assets/stylesheets/mumuki_laboratory/application/modules/_activity.scss
|
459
460
|
- app/assets/stylesheets/mumuki_laboratory/application/modules/_avatar.scss
|
460
461
|
- app/assets/stylesheets/mumuki_laboratory/application/modules/_book_header.scss
|
461
462
|
- app/assets/stylesheets/mumuki_laboratory/application/modules/_breadcrumb.scss
|
@@ -571,6 +572,7 @@ files:
|
|
571
572
|
- app/helpers/progress_bar_helper.rb
|
572
573
|
- app/helpers/progress_helper.rb
|
573
574
|
- app/helpers/runner_assets_helper.rb
|
575
|
+
- app/helpers/user_activity_helper.rb
|
574
576
|
- app/helpers/user_menu_helper.rb
|
575
577
|
- app/mailers/application_mailer.rb
|
576
578
|
- app/mailers/user_mailer.rb
|
@@ -702,11 +704,13 @@ files:
|
|
702
704
|
- app/views/user_mailer/certificate.text.erb
|
703
705
|
- app/views/user_mailer/no_submissions_reminder.html.erb
|
704
706
|
- app/views/user_mailer/no_submissions_reminder.text.erb
|
707
|
+
- app/views/users/_activity_indicator.html.erb
|
705
708
|
- app/views/users/_avatar_list.html.erb
|
706
709
|
- app/views/users/_edit_user_form.html.erb
|
707
710
|
- app/views/users/_profile_fields.html.erb
|
708
711
|
- app/views/users/_term.html.erb
|
709
712
|
- app/views/users/_user_form.html.erb
|
713
|
+
- app/views/users/activity.html.erb
|
710
714
|
- app/views/users/certificates.html.erb
|
711
715
|
- app/views/users/discussions.html.erb
|
712
716
|
- app/views/users/edit.html.erb
|
@@ -736,6 +740,7 @@ files:
|
|
736
740
|
- lib/mumuki/laboratory/engine.rb
|
737
741
|
- lib/mumuki/laboratory/events/events.rb
|
738
742
|
- lib/mumuki/laboratory/extensions.rb
|
743
|
+
- lib/mumuki/laboratory/extensions/date_and_time.rb
|
739
744
|
- lib/mumuki/laboratory/extensions/request.rb
|
740
745
|
- lib/mumuki/laboratory/locales/datetime.es.yml
|
741
746
|
- lib/mumuki/laboratory/locales/en.yml
|
@@ -849,6 +854,7 @@ files:
|
|
849
854
|
- spec/features/standard_flow_spec.rb
|
850
855
|
- spec/features/terms_flow_spec.rb
|
851
856
|
- spec/features/topic_flow_spec.rb
|
857
|
+
- spec/features/user_activity_flow_spec.rb
|
852
858
|
- spec/helpers/application_helper_spec.rb
|
853
859
|
- spec/helpers/authors_helper_spec.rb
|
854
860
|
- spec/helpers/avatar_helper_spec.rb
|
@@ -859,6 +865,7 @@ files:
|
|
859
865
|
- spec/helpers/icons_helper_spec.rb
|
860
866
|
- spec/helpers/page_title_helper_spec.rb
|
861
867
|
- spec/helpers/test_results_rendering_spec.rb
|
868
|
+
- spec/helpers/user_activity_helper_spec.rb
|
862
869
|
- spec/helpers/with_choices_spec.rb
|
863
870
|
- spec/helpers/with_navigation_spec.rb
|
864
871
|
- spec/javascripts/bridge-spec.js
|
@@ -943,138 +950,139 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
943
950
|
- !ruby/object:Gem::Version
|
944
951
|
version: '0'
|
945
952
|
requirements: []
|
946
|
-
|
947
|
-
rubygems_version: 2.7.6
|
953
|
+
rubygems_version: 3.1.2
|
948
954
|
signing_key:
|
949
955
|
specification_version: 4
|
950
956
|
summary: Code assement web application for the Mumuki Platform.
|
951
957
|
test_files:
|
952
|
-
- spec/
|
953
|
-
- spec/
|
954
|
-
- spec/
|
955
|
-
- spec/
|
956
|
-
- spec/
|
957
|
-
- spec/
|
958
|
-
- spec/
|
959
|
-
- spec/
|
960
|
-
- spec/
|
961
|
-
- spec/
|
962
|
-
- spec/
|
963
|
-
- spec/
|
964
|
-
- spec/
|
965
|
-
- spec/
|
966
|
-
- spec/
|
967
|
-
- spec/
|
968
|
-
- spec/
|
969
|
-
- spec/evaluation_helper.rb
|
970
|
-
- spec/capybara_helper.rb
|
971
|
-
- spec/login_helper.rb
|
972
|
-
- spec/mailers/previews/user_mailer_preview.rb
|
973
|
-
- spec/mailers/user_mailer_spec.rb
|
974
|
-
- spec/spec_helper.rb
|
958
|
+
- spec/dummy/config/cable.yml
|
959
|
+
- spec/dummy/config/application.rb
|
960
|
+
- spec/dummy/config/spring.rb
|
961
|
+
- spec/dummy/config/database.yml
|
962
|
+
- spec/dummy/config/environment.rb
|
963
|
+
- spec/dummy/config/rabbit.yml
|
964
|
+
- spec/dummy/config/puma.rb
|
965
|
+
- spec/dummy/config/locales/en.yml
|
966
|
+
- spec/dummy/config/secrets.yml
|
967
|
+
- spec/dummy/config/environments/development.rb
|
968
|
+
- spec/dummy/config/environments/test.rb
|
969
|
+
- spec/dummy/config/boot.rb
|
970
|
+
- spec/dummy/config/initializers/cookies_serializer.rb
|
971
|
+
- spec/dummy/config/initializers/wrap_parameters.rb
|
972
|
+
- spec/dummy/config/initializers/filter_parameter_logging.rb
|
973
|
+
- spec/dummy/config/initializers/assets.rb
|
974
|
+
- spec/dummy/config/routes.rb
|
975
975
|
- spec/dummy/package.json
|
976
|
+
- spec/dummy/Rakefile
|
977
|
+
- spec/dummy/config.ru
|
978
|
+
- spec/dummy/bin/rails
|
979
|
+
- spec/dummy/bin/yarn
|
980
|
+
- spec/dummy/bin/rake
|
976
981
|
- spec/dummy/bin/bundle
|
977
982
|
- spec/dummy/bin/update
|
978
983
|
- spec/dummy/bin/setup
|
979
|
-
- spec/dummy/
|
980
|
-
- spec/dummy/bin/rails
|
981
|
-
- spec/dummy/bin/yarn
|
982
|
-
- spec/dummy/public/character/kibi/jump.svg
|
983
|
-
- spec/dummy/public/character/kibi/context.svg
|
984
|
-
- spec/dummy/public/character/kibi/success_l.svg
|
984
|
+
- spec/dummy/public/character/animations.json
|
985
985
|
- spec/dummy/public/character/kibi/failure.svg
|
986
|
-
- spec/dummy/public/character/kibi/
|
986
|
+
- spec/dummy/public/character/kibi/success_l.svg
|
987
987
|
- spec/dummy/public/character/kibi/passed_with_warnings.svg
|
988
|
+
- spec/dummy/public/character/kibi/success2_l.svg
|
989
|
+
- spec/dummy/public/character/kibi/jump.svg
|
990
|
+
- spec/dummy/public/character/kibi/context.svg
|
988
991
|
- spec/dummy/public/character/magnifying_glass/apparition.svg
|
989
992
|
- spec/dummy/public/character/magnifying_glass/loop.svg
|
990
|
-
- spec/dummy/public/
|
991
|
-
- spec/dummy/public/medal/outline.svg
|
992
|
-
- spec/dummy/public/error/403.svg
|
993
|
-
- spec/dummy/public/error/410.svg
|
993
|
+
- spec/dummy/public/error/timeout_2.svg
|
994
994
|
- spec/dummy/public/error/401.svg
|
995
|
-
- spec/dummy/public/error/
|
996
|
-
- spec/dummy/public/error/500.svg
|
995
|
+
- spec/dummy/public/error/403.svg
|
997
996
|
- spec/dummy/public/error/timeout_1.svg
|
998
997
|
- spec/dummy/public/error/timeout_3.svg
|
999
|
-
- spec/dummy/public/error/
|
1000
|
-
- spec/dummy/
|
1001
|
-
- spec/dummy/
|
998
|
+
- spec/dummy/public/error/404.svg
|
999
|
+
- spec/dummy/public/error/410.svg
|
1000
|
+
- spec/dummy/public/error/500.svg
|
1001
|
+
- spec/dummy/public/medal/outline.svg
|
1002
1002
|
- spec/dummy/db/seeds.rb
|
1003
|
-
- spec/dummy/
|
1004
|
-
- spec/dummy/config/boot.rb
|
1005
|
-
- spec/dummy/config/initializers/filter_parameter_logging.rb
|
1006
|
-
- spec/dummy/config/initializers/cookies_serializer.rb
|
1007
|
-
- spec/dummy/config/initializers/wrap_parameters.rb
|
1008
|
-
- spec/dummy/config/initializers/assets.rb
|
1009
|
-
- spec/dummy/config/puma.rb
|
1010
|
-
- spec/dummy/config/environments/development.rb
|
1011
|
-
- spec/dummy/config/environments/test.rb
|
1012
|
-
- spec/dummy/config/database.yml
|
1013
|
-
- spec/dummy/config/locales/en.yml
|
1014
|
-
- spec/dummy/config/secrets.yml
|
1015
|
-
- spec/dummy/config/environment.rb
|
1016
|
-
- spec/dummy/config/spring.rb
|
1017
|
-
- spec/dummy/config/cable.yml
|
1018
|
-
- spec/dummy/config/rabbit.yml
|
1019
|
-
- spec/dummy/config/routes.rb
|
1020
|
-
- spec/dummy/Rakefile
|
1021
|
-
- spec/api_helper.rb
|
1022
|
-
- spec/features/profile_flow_spec.rb
|
1023
|
-
- spec/features/not_found_public_flow_spec.rb
|
1024
|
-
- spec/features/home_private_flow_spec.rb
|
1025
|
-
- spec/features/login_flow_spec.rb
|
1026
|
-
- spec/features/certificate_programs_flow_spec.rb
|
1027
|
-
- spec/features/links_flow_spec.rb
|
1028
|
-
- spec/features/complements_flow_spec.rb
|
1003
|
+
- spec/dummy/db/schema.rb
|
1029
1004
|
- spec/features/notifications_flow_spec.rb
|
1030
|
-
- spec/features/topic_flow_spec.rb
|
1031
|
-
- spec/features/guide_reset_spec.rb
|
1032
1005
|
- spec/features/menu_bar_spec.rb
|
1033
|
-
- spec/features/
|
1034
|
-
- spec/features/dynamic_exam_spec.rb
|
1006
|
+
- spec/features/user_activity_flow_spec.rb
|
1035
1007
|
- spec/features/standard_flow_spec.rb
|
1036
|
-
- spec/features/
|
1037
|
-
- spec/features/
|
1038
|
-
- spec/features/
|
1039
|
-
- spec/features/
|
1008
|
+
- spec/features/exams_flow_spec.rb
|
1009
|
+
- spec/features/discussion_flow_spec.rb
|
1010
|
+
- spec/features/login_flow_spec.rb
|
1011
|
+
- spec/features/links_flow_spec.rb
|
1040
1012
|
- spec/features/terms_flow_spec.rb
|
1041
1013
|
- spec/features/progressive_tips_spec.rb
|
1042
|
-
- spec/features/
|
1043
|
-
- spec/features/
|
1044
|
-
- spec/features/invitations_flow_spec.rb
|
1014
|
+
- spec/features/immersive_redirection_spec.rb
|
1015
|
+
- spec/features/not_found_public_flow_spec.rb
|
1045
1016
|
- spec/features/guides_flow_spec.rb
|
1017
|
+
- spec/features/chapters_flow_spec.rb
|
1018
|
+
- spec/features/dynamic_exam_spec.rb
|
1019
|
+
- spec/features/home_private_flow_spec.rb
|
1020
|
+
- spec/features/complements_flow_spec.rb
|
1021
|
+
- spec/features/disable_user_flow_spec.rb
|
1022
|
+
- spec/features/disabled_organization_flow_spec.rb
|
1046
1023
|
- spec/features/runner_assets_spec.rb
|
1047
|
-
- spec/features/
|
1024
|
+
- spec/features/home_public_flow_spec.rb
|
1025
|
+
- spec/features/topic_flow_spec.rb
|
1026
|
+
- spec/features/guide_reset_spec.rb
|
1027
|
+
- spec/features/not_found_private_flow_spec.rb
|
1028
|
+
- spec/features/invitations_flow_spec.rb
|
1029
|
+
- spec/features/certificate_programs_flow_spec.rb
|
1030
|
+
- spec/features/profile_flow_spec.rb
|
1031
|
+
- spec/features/lessons_flow_spec.rb
|
1048
1032
|
- spec/features/exercise_flow_spec.rb
|
1049
|
-
- spec/
|
1050
|
-
- spec/
|
1051
|
-
- spec/
|
1033
|
+
- spec/teaspoon_env.rb
|
1034
|
+
- spec/login_helper.rb
|
1035
|
+
- spec/mailers/user_mailer_spec.rb
|
1036
|
+
- spec/mailers/previews/user_mailer_preview.rb
|
1037
|
+
- spec/evaluation_helper.rb
|
1038
|
+
- spec/spec_helper.rb
|
1052
1039
|
- spec/javascripts/timeout-spec.js
|
1053
|
-
- spec/javascripts/results-renderers-spec.js
|
1054
|
-
- spec/javascripts/kids-button-spec.js
|
1055
|
-
- spec/javascripts/timer-spec.js
|
1056
1040
|
- spec/javascripts/sync-mode-spec.js
|
1057
|
-
- spec/javascripts/
|
1041
|
+
- spec/javascripts/kids-button-spec.js
|
1042
|
+
- spec/javascripts/csrf-token-spec.js
|
1058
1043
|
- spec/javascripts/editors-spec.js
|
1044
|
+
- spec/javascripts/i18n-spec.js
|
1045
|
+
- spec/javascripts/submissions-store-spec.js
|
1059
1046
|
- spec/javascripts/exercise-spec.js
|
1047
|
+
- spec/javascripts/speech-bubble-renderer-spec.js
|
1048
|
+
- spec/javascripts/events-spec.js
|
1060
1049
|
- spec/javascripts/elipsis-spec.js
|
1061
1050
|
- spec/javascripts/upload-spec.js
|
1051
|
+
- spec/javascripts/results-renderers-spec.js
|
1052
|
+
- spec/javascripts/timer-spec.js
|
1062
1053
|
- spec/javascripts/spec-helper.js
|
1063
|
-
- spec/javascripts/
|
1064
|
-
- spec/javascripts/gamification-spec.js
|
1065
|
-
- spec/javascripts/csrf-token-spec.js
|
1054
|
+
- spec/javascripts/bridge-spec.js
|
1066
1055
|
- spec/javascripts/global-spec.js
|
1067
|
-
- spec/javascripts/
|
1068
|
-
- spec/
|
1069
|
-
- spec/
|
1070
|
-
- spec/
|
1071
|
-
- spec/
|
1072
|
-
- spec/
|
1056
|
+
- spec/javascripts/gamification-spec.js
|
1057
|
+
- spec/controllers/users_api_controller_spec.rb
|
1058
|
+
- spec/controllers/exercise_solutions_controller_spec.rb
|
1059
|
+
- spec/controllers/guide_progress_controller_spec.rb
|
1060
|
+
- spec/controllers/exam_registrations_controller_spec.rb
|
1061
|
+
- spec/controllers/courses_api_controller_spec.rb
|
1062
|
+
- spec/controllers/organizations_api_controller_spec.rb
|
1063
|
+
- spec/controllers/discussions_messages_controller_spec.rb
|
1064
|
+
- spec/controllers/confirmations_controller_spec.rb
|
1065
|
+
- spec/controllers/exam_authorization_requests_controller_spec.rb
|
1066
|
+
- spec/controllers/students_api_controller_spec.rb
|
1067
|
+
- spec/controllers/certificates_controller_spec.rb
|
1068
|
+
- spec/controllers/chapters_controller_spec.rb
|
1069
|
+
- spec/controllers/api_clients_controller.rb
|
1070
|
+
- spec/controllers/discussions_controller_spec.rb
|
1071
|
+
- spec/controllers/users_controller_spec.rb
|
1072
|
+
- spec/controllers/invitations_controller_spec.rb
|
1073
|
+
- spec/controllers/messages_controller_spec.rb
|
1074
|
+
- spec/api_helper.rb
|
1075
|
+
- spec/capybara_helper.rb
|
1073
1076
|
- spec/helpers/authors_helper_spec.rb
|
1077
|
+
- spec/helpers/exercise_input_helper_spec.rb
|
1078
|
+
- spec/helpers/avatar_helper_spec.rb
|
1074
1079
|
- spec/helpers/certificate_helper_spec.rb
|
1075
|
-
- spec/helpers/
|
1080
|
+
- spec/helpers/breadcrumbs_helper_spec.rb
|
1076
1081
|
- spec/helpers/with_choices_spec.rb
|
1077
|
-
- spec/helpers/
|
1082
|
+
- spec/helpers/with_navigation_spec.rb
|
1083
|
+
- spec/helpers/email_helper_spec.rb
|
1084
|
+
- spec/helpers/user_activity_helper_spec.rb
|
1085
|
+
- spec/helpers/page_title_helper_spec.rb
|
1086
|
+
- spec/helpers/application_helper_spec.rb
|
1078
1087
|
- spec/helpers/icons_helper_spec.rb
|
1079
1088
|
- spec/helpers/test_results_rendering_spec.rb
|
1080
|
-
- spec/helpers/breadcrumbs_helper_spec.rb
|