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.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/application/discussions.js +43 -0
  3. data/app/assets/stylesheets/application/_modules.scss +2 -0
  4. data/app/assets/stylesheets/application/modules/_checkboxes.scss +21 -8
  5. data/app/assets/stylesheets/application/modules/_discussion.scss +339 -0
  6. data/app/assets/stylesheets/application/modules/_pagination.scss +10 -0
  7. data/app/controllers/application_controller.rb +4 -9
  8. data/app/controllers/book_discussions_controller.rb +7 -0
  9. data/app/controllers/chapters_controller.rb +2 -0
  10. data/app/controllers/discussions_controller.rb +65 -0
  11. data/app/controllers/discussions_messages_controller.rb +25 -0
  12. data/app/controllers/exercises_controller.rb +1 -0
  13. data/app/controllers/guide_container_controller.rb +1 -0
  14. data/app/controllers/messages_controller.rb +1 -1
  15. data/app/controllers/users_controller.rb +1 -0
  16. data/app/helpers/application_helper.rb +7 -0
  17. data/app/helpers/assignment_result_helper.rb +10 -30
  18. data/app/helpers/breadcrumbs_helper.rb +7 -3
  19. data/app/helpers/contextualization_result_helper.rb +31 -0
  20. data/app/helpers/discussions_helper.rb +163 -0
  21. data/app/helpers/exercise_input_helper.rb +33 -5
  22. data/app/helpers/icons_helper.rb +20 -3
  23. data/app/helpers/messages_helper.rb +4 -0
  24. data/app/helpers/status_helper.rb +2 -2
  25. data/app/models/assignment.rb +31 -47
  26. data/app/models/book.rb +3 -0
  27. data/app/models/chapter.rb +2 -0
  28. data/app/models/concerns/contextualization.rb +85 -0
  29. data/app/models/concerns/submittable/solvable.rb +1 -0
  30. data/app/models/concerns/with_assignments.rb +1 -1
  31. data/app/models/concerns/with_discussion_creation.rb +9 -0
  32. data/app/models/concerns/with_discussion_creation/subscription.rb +33 -0
  33. data/app/models/concerns/with_discussion_creation/upvote.rb +28 -0
  34. data/app/models/concerns/with_discussion_status.rb +11 -0
  35. data/app/models/concerns/with_discussions.rb +23 -0
  36. data/app/models/concerns/with_randomizations.rb +34 -0
  37. data/app/models/concerns/with_scoped_queries.rb +47 -0
  38. data/app/models/concerns/with_scoped_queries/filter.rb +15 -0
  39. data/app/models/concerns/with_scoped_queries/page.rb +10 -0
  40. data/app/models/concerns/with_scoped_queries/sort.rb +47 -0
  41. data/app/models/discussion.rb +128 -0
  42. data/app/models/exercise.rb +10 -1
  43. data/app/models/guide.rb +1 -1
  44. data/app/models/message.rb +24 -3
  45. data/app/models/organization.rb +4 -0
  46. data/app/models/submission/confirmation.rb +1 -1
  47. data/app/models/submission/console_submission.rb +1 -1
  48. data/app/models/submission/submission.rb +13 -0
  49. data/app/models/subscription.rb +12 -0
  50. data/app/models/topic.rb +1 -1
  51. data/app/models/upvote.rb +4 -0
  52. data/app/models/user.rb +3 -2
  53. data/app/views/book_discussions/index.html.erb +23 -0
  54. data/app/views/chapters/show.html.erb +0 -1
  55. data/app/views/discussions/_message.html.erb +22 -0
  56. data/app/views/discussions/_message_container.html.erb +8 -0
  57. data/app/views/discussions/_new_message.html.erb +19 -0
  58. data/app/views/discussions/index.html.erb +30 -0
  59. data/app/views/discussions/show.html.erb +76 -0
  60. data/app/views/exercise_solutions/_contextualization_results.html.erb +21 -0
  61. data/app/views/exercise_solutions/_contextualization_results_container.html.erb +4 -0
  62. data/app/views/exercise_solutions/_expectations.html.erb +9 -3
  63. data/app/views/exercise_solutions/_kids_results.html.erb +1 -1
  64. data/app/views/exercise_solutions/_results.html.erb +21 -55
  65. data/app/views/exercise_solutions/_results_title.html.erb +2 -2
  66. data/app/views/exercises/_exercise_assignment.html.erb +20 -0
  67. data/app/views/exercises/_read_only.html.erb +104 -0
  68. data/app/views/exercises/show.html.erb +4 -20
  69. data/app/views/layouts/_discussions.html.erb +68 -0
  70. data/app/views/layouts/_kids.html.erb +9 -6
  71. data/app/views/layouts/_messages.html.erb +1 -1
  72. data/app/views/layouts/_result.html.erb +2 -2
  73. data/app/views/layouts/_test_results.html.erb +6 -6
  74. data/app/views/layouts/application.html.erb +10 -9
  75. data/app/views/layouts/exercise_inputs/forms/_form.html.erb +5 -6
  76. data/app/views/layouts/exercise_inputs/forms/_interactive_form.html.erb +5 -5
  77. data/app/views/layouts/exercise_inputs/forms/_kids_form.html.erb +9 -17
  78. data/app/views/layouts/exercise_inputs/forms/_playground_form.html.erb +5 -5
  79. data/app/views/layouts/exercise_inputs/forms/_problem_form.html.erb +11 -11
  80. data/app/views/layouts/exercise_inputs/forms/_reading_form.html.erb +1 -1
  81. data/app/views/layouts/exercise_inputs/layouts/_input_bottom.html.erb +1 -1
  82. data/app/views/layouts/exercise_inputs/layouts/_input_kids.html.erb +7 -7
  83. data/app/views/layouts/exercise_inputs/layouts/_input_right.html.erb +1 -1
  84. data/app/views/layouts/exercise_inputs/read_only_editors/_code.html.erb +3 -0
  85. data/app/views/layouts/exercise_inputs/read_only_editors/_custom.html.erb +6 -0
  86. data/app/views/layouts/exercise_inputs/read_only_editors/_multiple_choice.html.erb +8 -0
  87. data/app/views/layouts/exercise_inputs/read_only_editors/_single_choice.html.erb +8 -0
  88. data/app/views/layouts/modals/_kids_context.html.erb +2 -2
  89. data/app/views/layouts/modals/_new_discussion.html.erb +27 -0
  90. data/app/views/users/show.html.erb +23 -3
  91. data/config/routes.rb +21 -1
  92. data/db/migrate/20180504173548_create_discussions.rb +12 -0
  93. data/db/migrate/20180504185845_add_discussion_id_to_message.rb +5 -0
  94. data/db/migrate/20180605143727_add_submission_to_discussion.rb +16 -0
  95. data/db/migrate/20180619182555_create_subscriptions.rb +9 -0
  96. data/db/migrate/20180702153442_create_upvotes.rb +8 -0
  97. data/db/migrate/20180702175220_add_upvotes_count_to_discussions.rb +5 -0
  98. data/db/migrate/20180704150839_rename_assignment_status_to_submission_status.rb +5 -0
  99. data/lib/mumuki/laboratory.rb +2 -0
  100. data/lib/mumuki/laboratory/controllers.rb +2 -1
  101. data/lib/mumuki/laboratory/controllers/content.rb +12 -0
  102. data/lib/mumuki/laboratory/controllers/notifications.rb +31 -0
  103. data/lib/mumuki/laboratory/controllers/results_rendering.rb +1 -1
  104. data/lib/mumuki/laboratory/engine.rb +0 -2
  105. data/lib/mumuki/laboratory/evaluation/manual.rb +1 -1
  106. data/lib/mumuki/laboratory/locales/en.yml +37 -1
  107. data/lib/mumuki/laboratory/locales/es.yml +42 -1
  108. data/lib/mumuki/laboratory/locales/pt.yml +33 -1
  109. data/lib/mumuki/laboratory/status.rb +51 -44
  110. data/lib/mumuki/laboratory/status/discussion/closed.rb +15 -0
  111. data/lib/mumuki/laboratory/status/discussion/discussion.rb +56 -0
  112. data/lib/mumuki/laboratory/status/discussion/opened.rb +27 -0
  113. data/lib/mumuki/laboratory/status/discussion/pending_review.rb +15 -0
  114. data/lib/mumuki/laboratory/status/discussion/solved.rb +19 -0
  115. data/lib/mumuki/laboratory/status/submission/aborted.rb +11 -0
  116. data/lib/mumuki/laboratory/status/submission/errored.rb +15 -0
  117. data/lib/mumuki/laboratory/status/{failed.rb → submission/failed.rb} +2 -2
  118. data/lib/mumuki/laboratory/status/submission/manual_evaluation_pending.rb +15 -0
  119. data/lib/mumuki/laboratory/status/{passed.rb → submission/passed.rb} +2 -2
  120. data/lib/mumuki/laboratory/status/{passed_with_warnings.rb → submission/passed_with_warnings.rb} +2 -2
  121. data/lib/mumuki/laboratory/status/submission/pending.rb +11 -0
  122. data/lib/mumuki/laboratory/status/submission/running.rb +11 -0
  123. data/lib/mumuki/laboratory/status/submission/submission.rb +49 -0
  124. data/lib/mumuki/laboratory/status/{unknown.rb → submission/unknown.rb} +2 -2
  125. data/lib/mumuki/laboratory/version.rb +1 -1
  126. data/spec/controllers/chapters_controller_spec.rb +17 -0
  127. data/spec/controllers/discussions_controller_spec.rb +19 -0
  128. data/spec/dummy/config/environments/development.rb +0 -2
  129. data/spec/dummy/config/environments/test.rb +0 -2
  130. data/spec/dummy/db/schema.rb +42 -2
  131. data/spec/evaluation_helper.rb +1 -1
  132. data/spec/factories/discussion_factory.rb +8 -0
  133. data/spec/features/dynamic_exam_spec.rb +1 -1
  134. data/spec/helpers/exercise_input_helper_spec.rb +25 -0
  135. data/spec/helpers/test_results_rendering_spec.rb +7 -7
  136. data/spec/models/assignment_spec.rb +17 -2
  137. data/spec/models/discussion_spec.rb +153 -0
  138. metadata +108 -27
  139. data/app/models/concerns/with_status.rb +0 -43
  140. data/app/models/status_rendering_verbosity.rb +0 -40
  141. data/lib/mumuki/laboratory/controllers/messages.rb +0 -9
  142. data/lib/mumuki/laboratory/status/aborted.rb +0 -7
  143. data/lib/mumuki/laboratory/status/base.rb +0 -47
  144. data/lib/mumuki/laboratory/status/errored.rb +0 -15
  145. data/lib/mumuki/laboratory/status/manual_evaluation_pending.rb +0 -15
  146. data/lib/mumuki/laboratory/status/pending.rb +0 -11
  147. data/lib/mumuki/laboratory/status/running.rb +0 -11
  148. data/spec/models/randomizer_spec.rb +0 -18
  149. data/spec/models/verbosity_spec.rb +0 -24
@@ -0,0 +1,12 @@
1
+ class Subscription < ApplicationRecord
2
+ belongs_to :user
3
+ belongs_to :discussion
4
+
5
+ def unread!
6
+ update! read: false
7
+ end
8
+
9
+ def read!
10
+ update! read: true
11
+ end
12
+ end
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.status = #{Mumuki::Laboratory::Status::Passed.to_i}").
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
@@ -0,0 +1,4 @@
1
+ class Upvote < ApplicationRecord
2
+ belongs_to :user
3
+ belongs_to :discussion, counter_cache: true
4
+ 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.status' => Mumuki::Laboratory::Status::Passed.to_i) },
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>
@@ -23,7 +23,6 @@
23
23
  </div>
24
24
  <% end %>
25
25
 
26
-
27
26
  <% if @chapter.appendix.present? %>
28
27
  <div>
29
28
  <h3><%= t(:appendix) %></h3>
@@ -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,8 @@
1
+ <div class="discussion-message">
2
+ <div class="discussion-message-user-avatar">
3
+ <%= user_avatar(user) %>
4
+ </div>
5
+ <div class="discussion-message-bubble-container">
6
+ <%= yield %>
7
+ </div>
8
+ </div>
@@ -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) %>:&nbsp;</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 %>
@@ -0,0 +1,4 @@
1
+ <div class="<%= "bs-callout bs-callout-#{class_for_status contextualization.submission_status}" %>">
2
+ <%= render partial: 'exercise_solutions/results_title', locals: {contextualization: contextualization} %>
3
+ <%= yield %>
4
+ </div>
@@ -1,7 +1,13 @@
1
- <% expectation = assignment.visible_expectation_results.find { |it| it[:result].failed? } %>
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
- <li><%= status_icon(expectation[:result]) %> <%= t_expectation expectation %></li>
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.status}" %>">
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
- <div class="<%= "bs-callout bs-callout-#{class_for_status assignment.status}" %>">
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
- <% if assignment.results_visible? %>
14
- <div>
15
- <% if assignment.expectation_results_visible? %>
16
- <div class="results-item">
17
- <strong><%= t :unmeet_expectations %>:</strong>
18
- <ul class="results-list">
19
- <% assignment.visible_expectation_results.each do |it| %>
20
- <li><%= status_icon(it[:result]) %> <%= t_expectation it %></li>
21
- <% end %>
22
- </ul>
23
- </div>
24
- <% end %>
25
- <% if render_feedback?(assignment) %>
26
- <div class="results-item">
27
- <strong><%= t :feedback %>:</strong>
28
- <div>
29
- <%= assignment.feedback_html %>
30
- </div>
31
- <a data-toggle="collapse" href="#results-section" class="text-danger">
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
- </div>
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(assignment.status) %>">
2
- <strong><%= fa_icon icon_type_for_status(assignment.status) %> <%= t_assignment_status assignment %></strong>
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) %>:&nbsp;</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>