mumuki-laboratory 5.5.0 → 5.6.0
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/application/discussions.js +43 -0
- data/app/assets/stylesheets/application/_modules.scss +2 -0
- data/app/assets/stylesheets/application/modules/_checkboxes.scss +21 -8
- data/app/assets/stylesheets/application/modules/_discussion.scss +339 -0
- data/app/assets/stylesheets/application/modules/_pagination.scss +10 -0
- data/app/controllers/application_controller.rb +4 -9
- data/app/controllers/book_discussions_controller.rb +7 -0
- data/app/controllers/chapters_controller.rb +2 -0
- data/app/controllers/discussions_controller.rb +65 -0
- data/app/controllers/discussions_messages_controller.rb +25 -0
- data/app/controllers/exercises_controller.rb +1 -0
- data/app/controllers/guide_container_controller.rb +1 -0
- data/app/controllers/messages_controller.rb +1 -1
- data/app/controllers/users_controller.rb +1 -0
- data/app/helpers/application_helper.rb +7 -0
- data/app/helpers/assignment_result_helper.rb +10 -30
- data/app/helpers/breadcrumbs_helper.rb +7 -3
- data/app/helpers/contextualization_result_helper.rb +31 -0
- data/app/helpers/discussions_helper.rb +163 -0
- data/app/helpers/exercise_input_helper.rb +33 -5
- data/app/helpers/icons_helper.rb +20 -3
- data/app/helpers/messages_helper.rb +4 -0
- data/app/helpers/status_helper.rb +2 -2
- data/app/models/assignment.rb +31 -47
- data/app/models/book.rb +3 -0
- data/app/models/chapter.rb +2 -0
- data/app/models/concerns/contextualization.rb +85 -0
- data/app/models/concerns/submittable/solvable.rb +1 -0
- data/app/models/concerns/with_assignments.rb +1 -1
- data/app/models/concerns/with_discussion_creation.rb +9 -0
- data/app/models/concerns/with_discussion_creation/subscription.rb +33 -0
- data/app/models/concerns/with_discussion_creation/upvote.rb +28 -0
- data/app/models/concerns/with_discussion_status.rb +11 -0
- data/app/models/concerns/with_discussions.rb +23 -0
- data/app/models/concerns/with_randomizations.rb +34 -0
- data/app/models/concerns/with_scoped_queries.rb +47 -0
- data/app/models/concerns/with_scoped_queries/filter.rb +15 -0
- data/app/models/concerns/with_scoped_queries/page.rb +10 -0
- data/app/models/concerns/with_scoped_queries/sort.rb +47 -0
- data/app/models/discussion.rb +128 -0
- data/app/models/exercise.rb +10 -1
- data/app/models/guide.rb +1 -1
- data/app/models/message.rb +24 -3
- data/app/models/organization.rb +4 -0
- data/app/models/submission/confirmation.rb +1 -1
- data/app/models/submission/console_submission.rb +1 -1
- data/app/models/submission/submission.rb +13 -0
- data/app/models/subscription.rb +12 -0
- data/app/models/topic.rb +1 -1
- data/app/models/upvote.rb +4 -0
- data/app/models/user.rb +3 -2
- data/app/views/book_discussions/index.html.erb +23 -0
- data/app/views/chapters/show.html.erb +0 -1
- data/app/views/discussions/_message.html.erb +22 -0
- data/app/views/discussions/_message_container.html.erb +8 -0
- data/app/views/discussions/_new_message.html.erb +19 -0
- data/app/views/discussions/index.html.erb +30 -0
- data/app/views/discussions/show.html.erb +76 -0
- data/app/views/exercise_solutions/_contextualization_results.html.erb +21 -0
- data/app/views/exercise_solutions/_contextualization_results_container.html.erb +4 -0
- data/app/views/exercise_solutions/_expectations.html.erb +9 -3
- data/app/views/exercise_solutions/_kids_results.html.erb +1 -1
- data/app/views/exercise_solutions/_results.html.erb +21 -55
- data/app/views/exercise_solutions/_results_title.html.erb +2 -2
- data/app/views/exercises/_exercise_assignment.html.erb +20 -0
- data/app/views/exercises/_read_only.html.erb +104 -0
- data/app/views/exercises/show.html.erb +4 -20
- data/app/views/layouts/_discussions.html.erb +68 -0
- data/app/views/layouts/_kids.html.erb +9 -6
- data/app/views/layouts/_messages.html.erb +1 -1
- data/app/views/layouts/_result.html.erb +2 -2
- data/app/views/layouts/_test_results.html.erb +6 -6
- data/app/views/layouts/application.html.erb +10 -9
- data/app/views/layouts/exercise_inputs/forms/_form.html.erb +5 -6
- data/app/views/layouts/exercise_inputs/forms/_interactive_form.html.erb +5 -5
- data/app/views/layouts/exercise_inputs/forms/_kids_form.html.erb +9 -17
- data/app/views/layouts/exercise_inputs/forms/_playground_form.html.erb +5 -5
- data/app/views/layouts/exercise_inputs/forms/_problem_form.html.erb +11 -11
- data/app/views/layouts/exercise_inputs/forms/_reading_form.html.erb +1 -1
- data/app/views/layouts/exercise_inputs/layouts/_input_bottom.html.erb +1 -1
- data/app/views/layouts/exercise_inputs/layouts/_input_kids.html.erb +7 -7
- data/app/views/layouts/exercise_inputs/layouts/_input_right.html.erb +1 -1
- data/app/views/layouts/exercise_inputs/read_only_editors/_code.html.erb +3 -0
- data/app/views/layouts/exercise_inputs/read_only_editors/_custom.html.erb +6 -0
- data/app/views/layouts/exercise_inputs/read_only_editors/_multiple_choice.html.erb +8 -0
- data/app/views/layouts/exercise_inputs/read_only_editors/_single_choice.html.erb +8 -0
- data/app/views/layouts/modals/_kids_context.html.erb +2 -2
- data/app/views/layouts/modals/_new_discussion.html.erb +27 -0
- data/app/views/users/show.html.erb +23 -3
- data/config/routes.rb +21 -1
- data/db/migrate/20180504173548_create_discussions.rb +12 -0
- data/db/migrate/20180504185845_add_discussion_id_to_message.rb +5 -0
- data/db/migrate/20180605143727_add_submission_to_discussion.rb +16 -0
- data/db/migrate/20180619182555_create_subscriptions.rb +9 -0
- data/db/migrate/20180702153442_create_upvotes.rb +8 -0
- data/db/migrate/20180702175220_add_upvotes_count_to_discussions.rb +5 -0
- data/db/migrate/20180704150839_rename_assignment_status_to_submission_status.rb +5 -0
- data/lib/mumuki/laboratory.rb +2 -0
- data/lib/mumuki/laboratory/controllers.rb +2 -1
- data/lib/mumuki/laboratory/controllers/content.rb +12 -0
- data/lib/mumuki/laboratory/controllers/notifications.rb +31 -0
- data/lib/mumuki/laboratory/controllers/results_rendering.rb +1 -1
- data/lib/mumuki/laboratory/engine.rb +0 -2
- data/lib/mumuki/laboratory/evaluation/manual.rb +1 -1
- data/lib/mumuki/laboratory/locales/en.yml +37 -1
- data/lib/mumuki/laboratory/locales/es.yml +42 -1
- data/lib/mumuki/laboratory/locales/pt.yml +33 -1
- data/lib/mumuki/laboratory/status.rb +51 -44
- data/lib/mumuki/laboratory/status/discussion/closed.rb +15 -0
- data/lib/mumuki/laboratory/status/discussion/discussion.rb +56 -0
- data/lib/mumuki/laboratory/status/discussion/opened.rb +27 -0
- data/lib/mumuki/laboratory/status/discussion/pending_review.rb +15 -0
- data/lib/mumuki/laboratory/status/discussion/solved.rb +19 -0
- data/lib/mumuki/laboratory/status/submission/aborted.rb +11 -0
- data/lib/mumuki/laboratory/status/submission/errored.rb +15 -0
- data/lib/mumuki/laboratory/status/{failed.rb → submission/failed.rb} +2 -2
- data/lib/mumuki/laboratory/status/submission/manual_evaluation_pending.rb +15 -0
- data/lib/mumuki/laboratory/status/{passed.rb → submission/passed.rb} +2 -2
- data/lib/mumuki/laboratory/status/{passed_with_warnings.rb → submission/passed_with_warnings.rb} +2 -2
- data/lib/mumuki/laboratory/status/submission/pending.rb +11 -0
- data/lib/mumuki/laboratory/status/submission/running.rb +11 -0
- data/lib/mumuki/laboratory/status/submission/submission.rb +49 -0
- data/lib/mumuki/laboratory/status/{unknown.rb → submission/unknown.rb} +2 -2
- data/lib/mumuki/laboratory/version.rb +1 -1
- data/spec/controllers/chapters_controller_spec.rb +17 -0
- data/spec/controllers/discussions_controller_spec.rb +19 -0
- data/spec/dummy/config/environments/development.rb +0 -2
- data/spec/dummy/config/environments/test.rb +0 -2
- data/spec/dummy/db/schema.rb +42 -2
- data/spec/evaluation_helper.rb +1 -1
- data/spec/factories/discussion_factory.rb +8 -0
- data/spec/features/dynamic_exam_spec.rb +1 -1
- data/spec/helpers/exercise_input_helper_spec.rb +25 -0
- data/spec/helpers/test_results_rendering_spec.rb +7 -7
- data/spec/models/assignment_spec.rb +17 -2
- data/spec/models/discussion_spec.rb +153 -0
- metadata +108 -27
- data/app/models/concerns/with_status.rb +0 -43
- data/app/models/status_rendering_verbosity.rb +0 -40
- data/lib/mumuki/laboratory/controllers/messages.rb +0 -9
- data/lib/mumuki/laboratory/status/aborted.rb +0 -7
- data/lib/mumuki/laboratory/status/base.rb +0 -47
- data/lib/mumuki/laboratory/status/errored.rb +0 -15
- data/lib/mumuki/laboratory/status/manual_evaluation_pending.rb +0 -15
- data/lib/mumuki/laboratory/status/pending.rb +0 -11
- data/lib/mumuki/laboratory/status/running.rb +0 -11
- data/spec/models/randomizer_spec.rb +0 -18
- data/spec/models/verbosity_spec.rb +0 -24
data/app/models/topic.rb
CHANGED
@@ -16,7 +16,7 @@ class Topic < Content
|
|
16
16
|
joins("left join public.assignments assignments
|
17
17
|
on assignments.exercise_id = exercises.id
|
18
18
|
and assignments.submitter_id = #{user.id}
|
19
|
-
and assignments.
|
19
|
+
and assignments.submission_status = #{Mumuki::Laboratory::Status::Submission::Passed.to_i}").
|
20
20
|
where('assignments.id is null').
|
21
21
|
group('public.guides.id', 'lessons.number').map(&:lesson)
|
22
22
|
end
|
data/app/models/user.rb
CHANGED
@@ -2,6 +2,7 @@ class User < ApplicationRecord
|
|
2
2
|
include WithProfile,
|
3
3
|
WithUserNavigation,
|
4
4
|
WithReminders,
|
5
|
+
WithDiscussionCreation,
|
5
6
|
Mumukit::Platform::User::Helpers
|
6
7
|
|
7
8
|
serialize :permissions, Mumukit::Auth::Permissions
|
@@ -13,7 +14,7 @@ class User < ApplicationRecord
|
|
13
14
|
has_many :submitted_exercises, through: :assignments, class_name: 'Exercise', source: :exercise
|
14
15
|
|
15
16
|
has_many :solved_exercises,
|
16
|
-
-> { where('assignments.
|
17
|
+
-> { where('assignments.submission_status' => Mumuki::Laboratory::Status::Submission::Passed.to_i) },
|
17
18
|
through: :assignments,
|
18
19
|
class_name: 'Exercise',
|
19
20
|
source: :exercise
|
@@ -50,7 +51,7 @@ class User < ApplicationRecord
|
|
50
51
|
end
|
51
52
|
|
52
53
|
def passed_assignments
|
53
|
-
assignments.where(status: Mumuki::Laboratory::Status::Passed.to_i)
|
54
|
+
assignments.where(status: Mumuki::Laboratory::Status::Submission::Passed.to_i)
|
54
55
|
end
|
55
56
|
|
56
57
|
def unread_messages
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<%= content_for :breadcrumbs do %>
|
2
|
+
<%= home_breadcrumb %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<%= content_for :extra_filters do %>
|
6
|
+
<%= discussion_dropdown_filter :language, discussions_languages(@discussions) do |language_filter| %>
|
7
|
+
<%= language_filter.capitalize %>
|
8
|
+
<% end %>
|
9
|
+
<% end %>
|
10
|
+
|
11
|
+
<div class="row">
|
12
|
+
<div class="mu-inline-block-left">
|
13
|
+
<h1><%= @debatable.name %></h1>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<div>
|
18
|
+
<% if @discussions.empty? %>
|
19
|
+
<h4><%= t :no_questions %></h4>
|
20
|
+
<% else %>
|
21
|
+
<%= render partial: 'layouts/discussions' %>
|
22
|
+
<% end %>
|
23
|
+
</div>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<%= render layout: 'discussions/message_container', locals: {user: user} do %>
|
2
|
+
<div class="discussion-message-bubble">
|
3
|
+
<div class="discussion-message-bubble-header">
|
4
|
+
<div class="discussion-message-bubble-title">
|
5
|
+
<%= user.name %>
|
6
|
+
<span class="message-date">
|
7
|
+
<%= t(:time_since, time: time_ago_in_words(message.created_at)) %>
|
8
|
+
</span>
|
9
|
+
<% if message.authorized? current_user %>
|
10
|
+
<span class="actions">
|
11
|
+
<%= link_to fa_icon('trash-o'), discussion_message_path(@discussion, message), method: :delete, data: { confirm: t(:are_you_sure, action: t(:destroy_message)) } %>
|
12
|
+
</span>
|
13
|
+
<% end %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<div class="discussion-message-bubble-content">
|
17
|
+
<div class="discussion-message-content">
|
18
|
+
<%= message.content %>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
<% end %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<%= form_for [@discussion, Message.new] do |f| %>
|
2
|
+
<%= render layout: 'discussions/message_container', locals: {user: user} do %>
|
3
|
+
<div class="discussion-message-bubble">
|
4
|
+
<div class="discussion-message-bubble-header">
|
5
|
+
<div class="discussion-message-bubble-title">
|
6
|
+
<%= user.name %>
|
7
|
+
</div>
|
8
|
+
</div>
|
9
|
+
<div class="discussion-message-bubble-content">
|
10
|
+
<div class="container-fluid">
|
11
|
+
<div class="row">
|
12
|
+
<div><%= f.text_area :content, class: 'form-control discussion-new-message-content', placeholder: t(:message), required: true %></div>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<button class="btn btn-success btn-block discussion-new-message-button"> <%= t :comment %> </button>
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<%= content_for :breadcrumbs do %>
|
2
|
+
<%= breadcrumbs(@debatable, t(:discussions)) %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<div class="row">
|
6
|
+
<% if @debatable.respond_to? :language %>
|
7
|
+
<div class="mu-inline-block-right hidden-xs">
|
8
|
+
<h1><%= language_icon @debatable.language %></h1>
|
9
|
+
</div>
|
10
|
+
<% end %>
|
11
|
+
<div class="mu-inline-block-left">
|
12
|
+
<h1>
|
13
|
+
<span class="hidden-xs"><%= t("#{@debatable_class.downcase}_number", number: @debatable.number) %>: </span>
|
14
|
+
<span><%= @debatable.name %></span>
|
15
|
+
</h1>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<% if @discussions.empty? %>
|
20
|
+
<%= new_discussion_link(:no_questions, :ask_the_first_question) %>
|
21
|
+
<% else %>
|
22
|
+
<%= render partial: 'layouts/discussions' %>
|
23
|
+
<%= new_discussion_link(:no_useful_result, :ask_a_question) %>
|
24
|
+
<% end %>
|
25
|
+
|
26
|
+
<%= content_for :no_container do %>
|
27
|
+
<%= render partial: 'layouts/modals/new_discussion', locals: {debatable: @debatable} %>
|
28
|
+
<% end if current_user? %>
|
29
|
+
|
30
|
+
|
@@ -0,0 +1,76 @@
|
|
1
|
+
<%= content_for :breadcrumbs do %>
|
2
|
+
<%= breadcrumbs0 @debatable, link_to(t(:discussions), item_discussions_path(@debatable))%>
|
3
|
+
<%= breadcrumb_list_item('last', @discussion.friendly.truncate_words(4)) %>
|
4
|
+
<% end %>
|
5
|
+
|
6
|
+
<div>
|
7
|
+
<div class="row">
|
8
|
+
<% if current_user && !current_user.moderator? %>
|
9
|
+
<div class="mu-inline-block-right hidden-xs discussion-user-menu">
|
10
|
+
<h3>
|
11
|
+
<% if @discussion.subscribable? %>
|
12
|
+
<a class="discussion-subscription" onclick="mumuki.Forum.discussionSubscription('<%= subscription_discussion_url(@discussion) %>')">
|
13
|
+
<%= fa_icon(:eye, class: 'fa-xs') %>
|
14
|
+
<%= span_toggle t(:subscribe), t(:unsubscribe), current_user.subscribed_to?(@discussion) %>
|
15
|
+
</a>
|
16
|
+
<% end %>
|
17
|
+
<% if @discussion.solved? %>
|
18
|
+
<a class="discussion-upvote" onclick="mumuki.Forum.discussionUpvote('<%= upvote_discussion_url(@discussion) %>')">
|
19
|
+
<%= fa_icon(:star, class: 'fa-xs') %>
|
20
|
+
<%= span_toggle t(:upvote), t(:undo_upvote), current_user.upvoted?(@discussion) %>
|
21
|
+
</a>
|
22
|
+
<% end %>
|
23
|
+
</h3>
|
24
|
+
</div>
|
25
|
+
<% end %>
|
26
|
+
<div class="mu-inline-block-left">
|
27
|
+
<div class="discussion-header">
|
28
|
+
<h3 class="discussion-title">
|
29
|
+
<%= @discussion.title %>
|
30
|
+
</h3>
|
31
|
+
</div>
|
32
|
+
<div class="discussion-description">
|
33
|
+
<%= label_for_status(@discussion.status) %> ·
|
34
|
+
<span class="discussion-info">
|
35
|
+
<span class="discussion-initiator-name">
|
36
|
+
<%= @discussion.initiator.name %>
|
37
|
+
</span>
|
38
|
+
<%= discussion_info(@discussion) %>
|
39
|
+
</span>
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
|
44
|
+
<div class="discussion-context">
|
45
|
+
<%= render partial: 'exercises/read_only', locals: {exercise: @debatable} %>
|
46
|
+
</div>
|
47
|
+
|
48
|
+
</div>
|
49
|
+
|
50
|
+
<% if @discussion.has_messages? || @discussion.commentable_by?(current_user) %>
|
51
|
+
<hr class="message-divider">
|
52
|
+
|
53
|
+
<h3>
|
54
|
+
<%= t :messages %>
|
55
|
+
</h3>
|
56
|
+
|
57
|
+
<% if @discussion.has_messages? %>
|
58
|
+
<div class="discussion-messages">
|
59
|
+
<% @discussion.messages.each do |message| %>
|
60
|
+
<%= render partial: 'discussions/message', locals: {user: message.sender_user, message: message} %>
|
61
|
+
<% end %>
|
62
|
+
<% if @discussion.commentable_by?(current_user) %>
|
63
|
+
<hr class="message-divider">
|
64
|
+
<% end %>
|
65
|
+
</div>
|
66
|
+
<% end %>
|
67
|
+
|
68
|
+
<%= render partial: 'discussions/new_message', locals: {user: current_user} if @discussion.commentable_by?(current_user) %>
|
69
|
+
|
70
|
+
<% end %>
|
71
|
+
|
72
|
+
<div class="discussion-actions">
|
73
|
+
<% @discussion.reachable_statuses_for(current_user).each do |status| %>
|
74
|
+
<%= discussion_update_status_button(status) %>
|
75
|
+
<% end if current_user %>
|
76
|
+
</div>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<% if contextualization.results_visible? %>
|
2
|
+
<div>
|
3
|
+
<%= render partial: 'exercise_solutions/expectations', locals: {assignment: contextualization} %>
|
4
|
+
<% if render_feedback?(contextualization) %>
|
5
|
+
<div class="results-item">
|
6
|
+
<strong><%= t :feedback %>:</strong>
|
7
|
+
<div>
|
8
|
+
<%= contextualization.feedback_html %>
|
9
|
+
</div>
|
10
|
+
<a data-toggle="collapse" href="#results-section" class="text-danger">
|
11
|
+
<%= fa_icon 'question-circle' %> <%= t :details %>
|
12
|
+
</a>
|
13
|
+
</div>
|
14
|
+
<% end %>
|
15
|
+
<div id="results-section" class="<%= 'collapse' if render_feedback?(contextualization) %> results-item">
|
16
|
+
<%= render_test_results contextualization %>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
<% else %>
|
20
|
+
<div></div>
|
21
|
+
<% end %>
|
@@ -1,7 +1,13 @@
|
|
1
|
-
<%
|
1
|
+
<% if assignment.expectation_results_visible? %>
|
2
|
+
<div class="results-item">
|
3
|
+
<% unless assignment.exercise.input_kids?%>
|
4
|
+
<strong><%= t :unmeet_expectations %>:</strong>
|
5
|
+
<% end %>
|
2
6
|
|
3
|
-
<% if expectation %>
|
4
7
|
<ul class="results-list">
|
5
|
-
|
8
|
+
<% assignment.humanized_expectation_results.each do |it| %>
|
9
|
+
<%= humanized_expectation_result_item it %>
|
10
|
+
<% end %>
|
6
11
|
</ul>
|
12
|
+
</div>
|
7
13
|
<% end %>
|
@@ -3,7 +3,7 @@
|
|
3
3
|
@stats = @guide.stats_for(current_user)
|
4
4
|
%>
|
5
5
|
|
6
|
-
<div class="<%= "mu-kids-callout-#{class_for_status assignment.
|
6
|
+
<div class="<%= "mu-kids-callout-#{class_for_status assignment.submission_status}" %>">
|
7
7
|
<%= manual_evaluation_comment assignment %>
|
8
8
|
</div>
|
9
9
|
|
@@ -3,65 +3,31 @@
|
|
3
3
|
@stats = @guide.stats_for(current_user)
|
4
4
|
%>
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
<%= render partial: 'exercise_solutions/results_title', locals: {assignment: assignment} %>
|
9
|
-
|
10
|
-
|
6
|
+
<%= render layout: 'exercise_solutions/contextualization_results_container', locals: {contextualization: assignment} do %>
|
11
7
|
<%= manual_evaluation_comment assignment %>
|
12
8
|
<% unless assignment.manual_evaluation_comment? %>
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
<%= fa_icon 'question-circle' %> <%= t :details %>
|
33
|
-
</a>
|
34
|
-
</div>
|
35
|
-
<% end %>
|
36
|
-
<div id="results-section" class="<%= 'collapse' if render_feedback?(assignment) %> results-item">
|
37
|
-
<%= render_test_results assignment %>
|
38
|
-
</div>
|
39
|
-
</div>
|
40
|
-
<% else %>
|
41
|
-
<div></div>
|
42
|
-
<% end %>
|
43
|
-
<% unless assignment.passed? %>
|
44
|
-
<div class="notify-problem-box">
|
45
|
-
<div class="dropdown">
|
46
|
-
<%= link_to fa_icon(:'question-circle', text: t(:need_help)), "", {'data-toggle': 'dropdown'} %>
|
47
|
-
<ul class="dropdown-menu" aria-labelledby="helpDropdown">
|
48
|
-
<li>
|
49
|
-
<%= mail_to contact_email,
|
50
|
-
fa_icon(:bug, text: t(:notify_problem_with_exercise), class: 'fa-fw'),
|
51
|
-
subject: t(:problem_with_exercise, title: @exercise.name),
|
52
|
-
body: assignment_help_email_body(assignment),
|
53
|
-
class: 'warning' %>
|
54
|
-
</li>
|
55
|
-
<li>
|
56
|
-
<%= render_community_link %>
|
57
|
-
</li>
|
58
|
-
</ul>
|
59
|
-
</div>
|
60
|
-
</div>
|
61
|
-
<% end %>
|
9
|
+
<%= render partial: 'exercise_solutions/contextualization_results', locals: {contextualization: assignment} %>
|
10
|
+
<% if should_render_need_help_dropdown?(assignment) %>
|
11
|
+
<div class="notify-problem-box">
|
12
|
+
<div class="dropdown">
|
13
|
+
<%= link_to fa_icon(:'question-circle', text: t(:need_help)), "", {'data-toggle': 'dropdown'} %>
|
14
|
+
<ul class="dropdown-menu" aria-labelledby="helpDropdown">
|
15
|
+
<li>
|
16
|
+
<%= read_discussions_link(@exercise) %>
|
17
|
+
</li>
|
18
|
+
<li>
|
19
|
+
<%= render_community_link %>
|
20
|
+
</li>
|
21
|
+
<li>
|
22
|
+
<%= report_bug_link(assignment) %>
|
23
|
+
</li>
|
24
|
+
</ul>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
<% end %>
|
62
28
|
<% end %>
|
63
29
|
<%= solution_download_link assignment %>
|
64
|
-
|
30
|
+
<% end %>
|
65
31
|
|
66
32
|
<% if assignment.should_retry? %>
|
67
33
|
<%= assistance_box assignment %>
|
@@ -1,3 +1,3 @@
|
|
1
|
-
<h4 class="text-<%= class_for_status(
|
2
|
-
<strong><%= fa_icon icon_type_for_status(
|
1
|
+
<h4 class="text-<%= class_for_status(contextualization.submission_status) %>">
|
2
|
+
<strong><%= fa_icon icon_type_for_status(contextualization.submission_status) %> <%= t_contextualization_status contextualization %></strong>
|
3
3
|
</h4>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<div class="text-box">
|
2
|
+
<%= exercise.description_html %>
|
3
|
+
</div>
|
4
|
+
<div class="row">
|
5
|
+
<div class="col-md-12">
|
6
|
+
<div class="hint-box <%= 'hidden' if exercise.hint.blank? %>">
|
7
|
+
<% if exercise.hint.present? %>
|
8
|
+
<a data-toggle="collapse" href="#hint-section" class="text-info">
|
9
|
+
<%= fa_icon 'lightbulb-o' %> <%= t :need_a_hint %>
|
10
|
+
</a>
|
11
|
+
|
12
|
+
<div id="hint-section" class="collapse">
|
13
|
+
<p>
|
14
|
+
<%= exercise.hint_html %>
|
15
|
+
</p>
|
16
|
+
</div>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
</div>
|
@@ -0,0 +1,104 @@
|
|
1
|
+
<%= render_runner_assets exercise.language, :layout %>
|
2
|
+
|
3
|
+
<% if exercise.console? %>
|
4
|
+
<%= hidden_field_tag(:stateful_console, exercise.stateful_console?) %>
|
5
|
+
<%= hidden_field_tag(:prompt, exercise.prompt) %>
|
6
|
+
<% end %>
|
7
|
+
<%= hidden_field_tag(:exercise_language, exercise.highlight_mode) %>
|
8
|
+
<%= hidden_field_tag :console_endpoint, exercise_queries_path(exercise) %>
|
9
|
+
|
10
|
+
<details open>
|
11
|
+
<summary class="discussion-summary">
|
12
|
+
<div class="mu-inline-block-right hidden-xs">
|
13
|
+
<h1><%= language_icon @debatable.language %></h1>
|
14
|
+
</div>
|
15
|
+
<h3 class="discussion-exercise-title">
|
16
|
+
<span class="hidden-xs"><%= t(:exercise_number, number: exercise.number) %>: </span>
|
17
|
+
<span><%= @debatable.name %></span>
|
18
|
+
</h3>
|
19
|
+
</summary>
|
20
|
+
|
21
|
+
<% if should_render_read_only_exercise_tabs?(@discussion) %>
|
22
|
+
|
23
|
+
<ul class="nav nav-tabs discussion-tabs" role="tablist">
|
24
|
+
<% if @discussion.has_submission? %>
|
25
|
+
<li role="presentation" class="active">
|
26
|
+
<a data-target="#solution" aria-controls="solution" role="tab" data-toggle="tab" class="editor-tab">
|
27
|
+
<%= t :solution %>
|
28
|
+
</a>
|
29
|
+
</li>
|
30
|
+
<li role="presentation">
|
31
|
+
<a data-target="#results" aria-controls="results" role="tab" data-toggle="tab" class="editor-tab">
|
32
|
+
<%= t :results %>
|
33
|
+
</a>
|
34
|
+
</li>
|
35
|
+
<% end %>
|
36
|
+
|
37
|
+
<li role="presentation" <%= "class=active" unless @discussion.has_submission? %>>
|
38
|
+
<a data-target="#content" aria-controls="content" role="tab" data-toggle="tab" class="editor-tab">
|
39
|
+
<%= t :description %>
|
40
|
+
</a>
|
41
|
+
</li>
|
42
|
+
|
43
|
+
<% if exercise.extra_visible? %>
|
44
|
+
<%= extra_code_tab %>
|
45
|
+
<% end %>
|
46
|
+
|
47
|
+
<% if exercise.queriable? %>
|
48
|
+
<%= console_tab %>
|
49
|
+
<% end %>
|
50
|
+
</ul>
|
51
|
+
|
52
|
+
<div class="tab-content">
|
53
|
+
|
54
|
+
<% if @discussion.has_submission? %>
|
55
|
+
<div role="tabpanel" class="tab-pane active" id="solution">
|
56
|
+
<div class="mu-tab-body">
|
57
|
+
<div role="tabpanel" class="tab-pane mu-input-panel fade in active" id="editor">
|
58
|
+
<%= render_exercise_read_only_editor exercise, @discussion.solution %>
|
59
|
+
</div>
|
60
|
+
</div>
|
61
|
+
</div>
|
62
|
+
|
63
|
+
<div role="tabpanel" class="tab-pane" id="results">
|
64
|
+
<div class="mu-tab-body">
|
65
|
+
<%= render layout: 'exercise_solutions/contextualization_results_container', locals: {contextualization: @discussion } do %>
|
66
|
+
<div class="row">
|
67
|
+
<div class="col-md-12 submission-results">
|
68
|
+
<%= render partial: 'exercise_solutions/contextualization_results',
|
69
|
+
locals: {contextualization: @discussion, guide_finished_by_solution: false} %>
|
70
|
+
</div>
|
71
|
+
</div>
|
72
|
+
<% end %>
|
73
|
+
</div>
|
74
|
+
</div>
|
75
|
+
<% end %>
|
76
|
+
|
77
|
+
<div role="tabpanel" class="tab-pane <%= 'active' unless @discussion.has_submission? %>" id="content">
|
78
|
+
<div class="mu-tab-body">
|
79
|
+
<div class="exercise-assignment">
|
80
|
+
<%= render partial: 'exercises/exercise_assignment', locals: {exercise: exercise} %>
|
81
|
+
</div>
|
82
|
+
</div>
|
83
|
+
</div>
|
84
|
+
|
85
|
+
<div role="tabpanel" class="tab-pane mu-input-panel fade" id="console">
|
86
|
+
<div class="mu-overlapped-container">
|
87
|
+
<div class="console">
|
88
|
+
</div>
|
89
|
+
<div class="mu-overlapped">
|
90
|
+
<a class="console-reset submission-reset"><%= restart_icon %></a>
|
91
|
+
</div>
|
92
|
+
</div>
|
93
|
+
</div>
|
94
|
+
|
95
|
+
<div role="tabpanel" class="tab-pane mu-input-panel fade" id="visible-extra">
|
96
|
+
<%= exercise.extra_preview_html(@discussion.initiator) %>
|
97
|
+
</div>
|
98
|
+
</div>
|
99
|
+
<% else %>
|
100
|
+
<div class="exercise-assignment">
|
101
|
+
<%= render partial: 'exercises/exercise_assignment', locals: {exercise: exercise} %>
|
102
|
+
</div>
|
103
|
+
<% end %>
|
104
|
+
</details>
|