mumuki-laboratory 7.3.1 → 7.4.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/stylesheets/mumuki_laboratory/application/modules/_progress_bar.scss +3 -0
- data/app/helpers/breadcrumbs_helper.rb +13 -0
- data/app/helpers/contextualization_result_helper.rb +1 -1
- data/app/helpers/icons_helper.rb +21 -10
- data/app/helpers/progress_bar_helper.rb +1 -1
- data/app/views/discussions/show.html.erb +1 -2
- data/app/views/exercise_solutions/{_contextualization_results.html.erb → _contextualization_results_body.html.erb} +4 -6
- data/app/views/exercise_solutions/_contextualization_results_container.html.erb +1 -1
- data/app/views/exercise_solutions/_kids_results.html.erb +1 -1
- data/app/views/exercise_solutions/_out_of_attempts.html.erb +0 -1
- data/app/views/exercise_solutions/_results.html.erb +33 -26
- data/app/views/exercise_solutions/_results_hidden.html.erb +5 -0
- data/app/views/exercise_solutions/_results_title.html.erb +2 -2
- data/app/views/exercises/_read_only.html.erb +1 -1
- data/app/views/layouts/_timer.html.erb +1 -1
- data/lib/mumuki/laboratory/controllers/results_rendering.rb +0 -1
- data/lib/mumuki/laboratory/locales/en.yml +2 -0
- data/lib/mumuki/laboratory/locales/es.yml +1 -0
- data/lib/mumuki/laboratory/locales/pt.yml +3 -1
- data/lib/mumuki/laboratory/version.rb +1 -1
- data/spec/dummy/db/schema.rb +2 -1
- data/spec/features/exams_flow_spec.rb +87 -16
- data/spec/features/exercise_flow_spec.rb +1 -1
- data/spec/helpers/breadcrumbs_helper_spec.rb +26 -0
- metadata +6 -6
- data/app/helpers/status_helper.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c23a0042d4601c10b7b61f3196cb7e227fe0ac33f9c7a48b70c57a8a12854cb
|
4
|
+
data.tar.gz: ee21361e7e928cdd3552e00c112ef2d4a38215b8e165f353e9ec701dfa1a22f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df62506d35e812616ec5476b728d89d8128594503c04b9d152778be3aa4242f209cd20578a49ca85df231e7bc812b3530a555680b897034667f006bc56f53f60
|
7
|
+
data.tar.gz: b4c914f2ebaa83f9d685b0e87262e8f1588e154896cc0f18fa434c00edd3504324b63c10f8251f607990d3d9bf4d50b30d35d5f1459e7416b8d456b5a57ca3db
|
@@ -1,4 +1,6 @@
|
|
1
1
|
module BreadcrumbsHelper
|
2
|
+
include DiscussionsHelper
|
3
|
+
|
2
4
|
def breadcrumbs(e, extra=nil)
|
3
5
|
breadcrumbs0(e.navigable_name, e, extra, 'last')
|
4
6
|
end
|
@@ -28,6 +30,17 @@ module BreadcrumbsHelper
|
|
28
30
|
breadcrumb_list_item link_to(e, link_path), clazz
|
29
31
|
end
|
30
32
|
|
33
|
+
def breadcrumbs_for_discussion(discussion, e)
|
34
|
+
discussions_breadcrumb = breadcrumbs_for_linkable(e, link_to(t(:discussions), item_discussions_path(e)))
|
35
|
+
discussion_item = breadcrumb_list_item(breadcrumb_name_for(discussion), 'last')
|
36
|
+
|
37
|
+
discussions_breadcrumb + discussion_item
|
38
|
+
end
|
39
|
+
|
40
|
+
def breadcrumb_name_for(discussion)
|
41
|
+
discussion.friendly.truncate_words(4)
|
42
|
+
end
|
43
|
+
|
31
44
|
private
|
32
45
|
|
33
46
|
def breadcrumbs_for_linkable(e, extra=nil, last='')
|
@@ -18,7 +18,7 @@ module ContextualizationResultHelper
|
|
18
18
|
def contextualization_status(contextualization)
|
19
19
|
if contextualization.exercise.hidden?
|
20
20
|
:hidden_done
|
21
|
-
elsif contextualization.exercise.
|
21
|
+
elsif contextualization.exercise.choice?
|
22
22
|
contextualization.passed? ? :correct_answer : :wrong_answer
|
23
23
|
else
|
24
24
|
contextualization.submission_status
|
data/app/helpers/icons_helper.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module IconsHelper
|
2
|
-
#FIXME refactor names
|
3
2
|
def status_icon(status_like)
|
4
|
-
fa_icon *
|
3
|
+
fa_icon *icon_for(status_like.to_submission_status)
|
5
4
|
end
|
6
5
|
|
7
6
|
def fixed_fa_icon(name, options={})
|
@@ -19,25 +18,37 @@ module IconsHelper
|
|
19
18
|
|
20
19
|
private
|
21
20
|
|
22
|
-
def
|
23
|
-
fa_icon(*
|
21
|
+
def contextualization_fa_icon(contextualization)
|
22
|
+
fa_icon(*icon_for(contextualization))
|
24
23
|
end
|
25
24
|
|
26
25
|
def exercise_status_fa_icon(exercise)
|
27
|
-
|
26
|
+
contextualization_fa_icon(exercise.assignment_for(current_user))
|
28
27
|
end
|
29
28
|
|
30
29
|
def discussion_status_fa_icon(discussion)
|
31
|
-
|
30
|
+
contextualization_fa_icon(discussion)
|
32
31
|
end
|
33
32
|
|
34
|
-
def
|
35
|
-
iconized =
|
33
|
+
def icon_for(iconizable)
|
34
|
+
iconized = iconizable.iconize
|
36
35
|
[iconized[:type], class: "text-#{iconized[:class]} status-icon"]
|
37
36
|
end
|
38
37
|
|
39
|
-
def
|
40
|
-
|
38
|
+
def class_for_exercise(exercise)
|
39
|
+
icon_class_for(exercise.assignment_for(current_user))
|
40
|
+
end
|
41
|
+
|
42
|
+
def icon_class_for(iconizable)
|
43
|
+
iconizable.iconize[:class].to_s
|
44
|
+
end
|
45
|
+
|
46
|
+
def icon_type_for(iconizable)
|
47
|
+
iconizable.iconize[:type].to_s
|
48
|
+
end
|
49
|
+
|
50
|
+
def label_for_contextualization(contextualization)
|
51
|
+
iconized = contextualization.iconize
|
41
52
|
%Q{
|
42
53
|
<span class="text-#{iconized[:class]} status-label">
|
43
54
|
#{fa_icon "#{iconized[:type]}"}
|
@@ -1,6 +1,5 @@
|
|
1
1
|
<%= content_for :breadcrumbs do %>
|
2
|
-
<%=
|
3
|
-
<%= breadcrumb_list_item('last', @discussion.friendly.truncate_words(4)) %>
|
2
|
+
<%= breadcrumbs_for_discussion @discussion, @debatable %>
|
4
3
|
<% end %>
|
5
4
|
|
6
5
|
<div>
|
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<div>
|
2
|
+
<% unless contextualization.results_body_hidden? %>
|
3
3
|
<%= render partial: 'exercise_solutions/expectations', locals: {assignment: contextualization} %>
|
4
4
|
<% if render_feedback?(contextualization) %>
|
5
5
|
<div class="results-item">
|
@@ -15,7 +15,5 @@
|
|
15
15
|
<div id="results-section" class="<%= 'collapse' if render_feedback?(contextualization) %> results-item">
|
16
16
|
<%= render_test_results contextualization %>
|
17
17
|
</div>
|
18
|
-
|
19
|
-
|
20
|
-
<div></div>
|
21
|
-
<% end %>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<div class="<%= "bs-callout bs-callout-#{
|
1
|
+
<div class="<%= "bs-callout bs-callout-#{icon_class_for contextualization}" %>">
|
2
2
|
<%= render partial: 'exercise_solutions/results_title', locals: {contextualization: contextualization} %>
|
3
3
|
<%= yield %>
|
4
4
|
</div>
|
@@ -3,35 +3,42 @@
|
|
3
3
|
@stats = @guide.stats_for(current_user)
|
4
4
|
%>
|
5
5
|
|
6
|
-
|
7
|
-
<%=
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
6
|
+
<% if assignment.results_hidden? %>
|
7
|
+
<%= render partial: 'exercise_solutions/results_hidden', locals: {assignment: assignment} %>
|
8
|
+
<% elsif !assignment.attempts_left? %>
|
9
|
+
<%= render partial: 'exercise_solutions/out_of_attempts', locals: {assignment: assignment} %>
|
10
|
+
<% else %>
|
11
|
+
<%= render layout: 'exercise_solutions/contextualization_results_container', locals: {contextualization: assignment} do %>
|
12
|
+
<%= manual_evaluation_comment assignment %>
|
13
|
+
<% unless assignment.manual_evaluation_comment? %>
|
14
|
+
<%= render partial: 'exercise_solutions/contextualization_results_body', locals: {contextualization: assignment} %>
|
15
|
+
<% if should_render_need_help_dropdown?(assignment) %>
|
16
|
+
<div class="notify-problem-box">
|
17
|
+
<div class="dropdown">
|
18
|
+
<%= link_to fa_icon(:'question-circle', text: t(:need_help)), "", {'data-toggle': 'dropdown'} %>
|
19
|
+
<ul class="dropdown-menu" aria-labelledby="helpDropdown">
|
20
|
+
<li>
|
21
|
+
<%= read_discussions_link(@exercise) %>
|
22
|
+
</li>
|
23
|
+
<li>
|
24
|
+
<%= render_community_link %>
|
25
|
+
</li>
|
26
|
+
<li>
|
27
|
+
<%= report_bug_link(assignment) %>
|
28
|
+
</li>
|
29
|
+
</ul>
|
30
|
+
</div>
|
25
31
|
</div>
|
26
|
-
|
32
|
+
<% end %>
|
27
33
|
<% end %>
|
34
|
+
<%= solution_download_link assignment %>
|
28
35
|
<% end %>
|
29
|
-
<%= solution_download_link assignment %>
|
30
|
-
<% end %>
|
31
36
|
|
32
|
-
<% if assignment.passed? %>
|
33
|
-
|
34
|
-
<% else %>
|
35
|
-
|
37
|
+
<% if assignment.passed? %>
|
38
|
+
<%= corollary_box @exercise %>
|
39
|
+
<% else %>
|
40
|
+
<%= assistance_box assignment %>
|
41
|
+
<% end %>
|
36
42
|
<% end %>
|
43
|
+
|
37
44
|
<%= render partial: 'exercise_solutions/results_button', locals: {assignment: assignment} %>
|
@@ -1,3 +1,3 @@
|
|
1
|
-
<h4 class="text-<%=
|
2
|
-
<strong><%= fa_icon
|
1
|
+
<h4 class="text-<%= icon_class_for(contextualization) %>">
|
2
|
+
<strong><%= fa_icon icon_type_for(contextualization) %> <%= t_contextualization_status contextualization %></strong>
|
3
3
|
</h4>
|
@@ -67,7 +67,7 @@
|
|
67
67
|
<%= render layout: 'exercise_solutions/contextualization_results_container', locals: {contextualization: @discussion } do %>
|
68
68
|
<div class="row">
|
69
69
|
<div class="col-md-12 submission-results">
|
70
|
-
<%= render partial: 'exercise_solutions/
|
70
|
+
<%= render partial: 'exercise_solutions/contextualization_results_body',
|
71
71
|
locals: {contextualization: @discussion, guide_finished_by_solution: false} %>
|
72
72
|
</div>
|
73
73
|
</div>
|
@@ -36,7 +36,6 @@ module Mumuki::Laboratory::Controllers::ResultsRendering
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def render_results_html(results_partial, assignment)
|
39
|
-
results_partial = 'out_of_attempts' unless assignment.attempts_left?
|
40
39
|
render_to_string partial: results_partial,
|
41
40
|
locals: {assignment: assignment}
|
42
41
|
end
|
@@ -17,6 +17,7 @@ en:
|
|
17
17
|
ask_the_first_question: Be the first one to ask!
|
18
18
|
attempts_left:
|
19
19
|
zero: "You've run out of attempts "
|
20
|
+
one: "1 attempt remaining"
|
20
21
|
other: '%{count} attempts remaining'
|
21
22
|
author: Author
|
22
23
|
authoring: "Authoring"
|
@@ -181,6 +182,7 @@ en:
|
|
181
182
|
reset_query: Clear current search filters
|
182
183
|
restart: Restart
|
183
184
|
results: Results
|
185
|
+
results_hidden: Your solution was submitted successfully!
|
184
186
|
retry_exercise: Retry
|
185
187
|
running: running
|
186
188
|
save: Save
|
@@ -199,6 +199,7 @@ es:
|
|
199
199
|
refresh_or_wait: Si no se muestra automáticamente en unos segundos, presioná F5
|
200
200
|
reset_query: Borrar los filtros de búsqueda actuales
|
201
201
|
restart: Reiniciar
|
202
|
+
results_hidden: ¡Tu solución fue enviada con éxito!
|
202
203
|
results: Resultados
|
203
204
|
retry_exercise: Reintentar
|
204
205
|
running: procesando
|
@@ -18,7 +18,8 @@ pt:
|
|
18
18
|
ask_the_first_question: Faça a primeira pergunta!
|
19
19
|
attempts_left:
|
20
20
|
zero: 'Você ficou sem tentativas'
|
21
|
-
|
21
|
+
one: '1 tentativa restante'
|
22
|
+
other: '%{count} tentativas restantes'
|
22
23
|
author: Autor
|
23
24
|
authoring: Autores
|
24
25
|
authoring_note_html: 'Este guia foi desenvolvido por %{authors} nos termos do <a href = "https://creativecommons.org/licenses/by-sa/4.0/" target="_blank"> Creative Commons License Share-Equal, 4.0 </a>.'
|
@@ -192,6 +193,7 @@ pt:
|
|
192
193
|
reset_query: Limpar filtros de pesquisa atuais
|
193
194
|
restart: Reiniciar
|
194
195
|
results: Resultados
|
196
|
+
results_hidden: Sua solução foi enviada com sucesso!
|
195
197
|
retry_exercise: Tentar novamente
|
196
198
|
running: processamento
|
197
199
|
save: Salvar
|
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: 20200312181842) do
|
14
14
|
|
15
15
|
# These are extensions that must be enabled in order to support this database
|
16
16
|
enable_extension "plpgsql"
|
@@ -137,6 +137,7 @@ ActiveRecord::Schema.define(version: 20200213175736) do
|
|
137
137
|
t.integer "duration"
|
138
138
|
t.integer "max_problem_submissions"
|
139
139
|
t.integer "max_choice_submissions"
|
140
|
+
t.boolean "results_hidden_for_choices", default: false
|
140
141
|
t.index ["classroom_id"], name: "index_exams_on_classroom_id", unique: true
|
141
142
|
t.index ["guide_id"], name: "index_exams_on_guide_id"
|
142
143
|
t.index ["organization_id"], name: "index_exams_on_organization_id"
|
@@ -7,11 +7,22 @@ feature 'Exams Flow', organization_workspace: :test do
|
|
7
7
|
|
8
8
|
let(:other_organization) { create(:organization, name: 'baz') }
|
9
9
|
|
10
|
-
let(:
|
10
|
+
let(:test_organization) { Organization.locate! 'test' }
|
11
|
+
let(:exam_with_no_submission_limits) { create(:exam, organization: test_organization, guide: guide) }
|
12
|
+
|
13
|
+
let(:capped_exam) { create(:exam, organization: test_organization, guide: problems_guide, max_choice_submissions: 2, max_problem_submissions: 5) }
|
14
|
+
|
11
15
|
let(:guide) { create(:guide, exercises: [exercise])}
|
12
16
|
let(:exercise) { create(:exercise, name: 'Exam Exercise') }
|
13
17
|
|
14
|
-
|
18
|
+
let(:problems_guide) { create(:guide, exercises: [choice_problem, code_problem])}
|
19
|
+
|
20
|
+
let(:choice_problem) { create(:problem, name: 'Exam Choice Problem', editor: :multiple_choice,
|
21
|
+
choices: [{ value: "A", checked: true }, { value: "B", checked: false }]) }
|
22
|
+
|
23
|
+
let(:code_problem) { create(:problem, name: 'Exam Code Problem') }
|
24
|
+
|
25
|
+
before { exam_with_no_submission_limits.index_usage! test_organization }
|
15
26
|
|
16
27
|
before { reindex_current_organization! }
|
17
28
|
|
@@ -44,22 +55,82 @@ feature 'Exams Flow', organization_workspace: :test do
|
|
44
55
|
expect(page).to have_text('You have no permissions for this content.')
|
45
56
|
end
|
46
57
|
|
47
|
-
|
48
|
-
user
|
49
|
-
|
50
|
-
exam.authorize!(user)
|
51
|
-
expect_any_instance_of(Exam).to receive(:enabled_for?).and_return(false)
|
52
|
-
visit "/exams/#{exam.classroom_id}"
|
58
|
+
context 'visit authorized exam for user' do
|
59
|
+
let(:user) { create(:user) }
|
60
|
+
let(:current_exam) { exam }
|
53
61
|
|
54
|
-
|
55
|
-
|
62
|
+
before do
|
63
|
+
current_exam.authorize! user
|
64
|
+
set_current_user! user
|
65
|
+
end
|
66
|
+
|
67
|
+
scenario 'in path, when there is no more time' do
|
68
|
+
expect_any_instance_of(Exam).to receive(:enabled_for?).and_return(false)
|
69
|
+
visit "/exams/#{current_exam.classroom_id}"
|
70
|
+
|
71
|
+
expect(page).to have_text('This content is no longer available.')
|
72
|
+
end
|
56
73
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
74
|
+
feature 'with no submission limits' do
|
75
|
+
let(:current_exam) { exam_with_no_submission_limits }
|
76
|
+
|
77
|
+
scenario 'in a particular exercise' do
|
78
|
+
visit "/exercises/#{exercise.id}"
|
79
|
+
|
80
|
+
expect(page).to have_text('Exam Exercise')
|
81
|
+
end
|
82
|
+
end
|
62
83
|
|
63
|
-
|
84
|
+
feature 'with submission limits' do
|
85
|
+
let(:current_exam) { capped_exam }
|
86
|
+
|
87
|
+
feature 'when user has no remaining attempts' do
|
88
|
+
feature 'for code problem' do
|
89
|
+
before { 5.times { code_problem.submit_solution!(user, content: 'foo') } }
|
90
|
+
|
91
|
+
scenario do
|
92
|
+
visit "/exercises/#{code_problem.id}"
|
93
|
+
|
94
|
+
expect(page).to have_text('Exam Code Problem')
|
95
|
+
expect(page).to have_text('out of attempts')
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
feature 'for choice problem' do
|
100
|
+
before { 2.times { choice_problem.submit_solution!(user, content: 'foo') } }
|
101
|
+
|
102
|
+
scenario do
|
103
|
+
visit "/exercises/#{choice_problem.id}"
|
104
|
+
|
105
|
+
expect(page).to have_text('Exam Choice Problem')
|
106
|
+
expect(page).to have_text('out of attempts')
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
feature 'when user has remaining attempts' do
|
112
|
+
feature 'for code problem' do
|
113
|
+
before { 2.times { code_problem.submit_solution!(user, content: 'foo') } }
|
114
|
+
|
115
|
+
scenario do
|
116
|
+
visit "/exercises/#{code_problem.id}"
|
117
|
+
|
118
|
+
expect(page).to have_text('Exam Code Problem')
|
119
|
+
expect(page).to have_text('3 attempts remaining')
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
feature 'for choice problem' do
|
124
|
+
before { 1.times { choice_problem.submit_solution!(user, content: 'foo') } }
|
125
|
+
|
126
|
+
scenario do
|
127
|
+
visit "/exercises/#{choice_problem.id}"
|
128
|
+
|
129
|
+
expect(page).to have_text('Exam Choice Problem')
|
130
|
+
expect(page).to have_text('1 attempt remaining')
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
64
135
|
end
|
65
136
|
end
|
@@ -12,7 +12,7 @@ feature 'Exercise Flow', organization_workspace: :test do
|
|
12
12
|
let!(:problem_4) { build(:problem, name: 'Succ4', description: 'Description of Succ4', layout: :input_bottom, extra: 'x = 2') }
|
13
13
|
let!(:problem_5) { build(:problem, name: 'Succ5', description: 'Description of Succ5', layout: :input_right, editor: :upload, hint: 'lele', language: gobstones) }
|
14
14
|
let!(:problem_6) { build(:problem, name: 'Succ6', description: 'Description of Succ6', layout: :input_right, editor: :hidden, language: haskell) }
|
15
|
-
let!(:problem_7) { build(:problem, name: 'Succ7', description: 'Description of Succ7', choices: [{value: 'some choice', checked: true}]) }
|
15
|
+
let!(:problem_7) { build(:problem, name: 'Succ7', description: 'Description of Succ7', editor: :single_choice, choices: [{value: 'some choice', checked: true}]) }
|
16
16
|
let!(:playground_1) { build(:playground, name: 'Succ5', description: 'Description of Succ4', layout: :input_right) }
|
17
17
|
let!(:playground_2) { build(:playground, name: 'Succ6', description: 'Description of Succ4', layout: :input_right, extra: 'x = 4') }
|
18
18
|
let!(:reading) { build(:reading, name: 'Reading about Succ', description: 'Lets understand succ history') }
|
@@ -71,6 +71,32 @@ describe BreadcrumbsHelper, organization_workspace: :test do
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
+
context 'discussion' do
|
75
|
+
let!(:chapter) { create(:chapter, name: 'my chapter', lessons: [lesson]) }
|
76
|
+
let(:lesson) { create(:lesson, name: 'my lesson', exercises: [exercise]) }
|
77
|
+
let(:exercise) { create(:exercise, name: 'my exercise') }
|
78
|
+
|
79
|
+
let(:discussion) { create(:discussion, item: debatable) }
|
80
|
+
let(:breadcrumb) { breadcrumbs_for_discussion(discussion, debatable) }
|
81
|
+
|
82
|
+
before { reindex_current_organization! }
|
83
|
+
|
84
|
+
context 'in exercise' do
|
85
|
+
let(:debatable) { exercise }
|
86
|
+
|
87
|
+
it 'breadcrumb goes mumuki / test organization / chapter / lesson / exercise / discussions / discussion' do
|
88
|
+
expect(breadcrumb).to include('da da-mumuki')
|
89
|
+
expect(breadcrumb).to include('test')
|
90
|
+
expect(breadcrumb).to include('my chapter')
|
91
|
+
expect(breadcrumb).to include('my lesson')
|
92
|
+
expect(breadcrumb).to include('my exercise')
|
93
|
+
expect(breadcrumb).to include('discussions')
|
94
|
+
expect(breadcrumb).to include(discussion.title)
|
95
|
+
expect(breadcrumb).to be_html_safe
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
74
100
|
context 'book' do
|
75
101
|
let(:breadcrumb) { header_breadcrumbs(link_for_organization: false) }
|
76
102
|
|
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: 7.
|
4
|
+
version: 7.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Franco Bulgarelli
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04-
|
11
|
+
date: 2020-04-02 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: 7.
|
33
|
+
version: 7.4.0
|
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: 7.
|
40
|
+
version: 7.4.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: mumukit-login
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -454,7 +454,6 @@ files:
|
|
454
454
|
- app/helpers/progress_helper.rb
|
455
455
|
- app/helpers/reset_button_helper.rb
|
456
456
|
- app/helpers/runner_assets_helper.rb
|
457
|
-
- app/helpers/status_helper.rb
|
458
457
|
- app/helpers/version_helper.rb
|
459
458
|
- app/mailers/application_mailer.rb
|
460
459
|
- app/mailers/user_mailer.rb
|
@@ -475,7 +474,7 @@ files:
|
|
475
474
|
- app/views/errors/not_found.html.erb
|
476
475
|
- app/views/errors/unauthorized.html.erb
|
477
476
|
- app/views/exams/show.html.erb
|
478
|
-
- app/views/exercise_solutions/
|
477
|
+
- app/views/exercise_solutions/_contextualization_results_body.html.erb
|
479
478
|
- app/views/exercise_solutions/_contextualization_results_container.html.erb
|
480
479
|
- app/views/exercise_solutions/_expectations.html.erb
|
481
480
|
- app/views/exercise_solutions/_kids_results.html.erb
|
@@ -483,6 +482,7 @@ files:
|
|
483
482
|
- app/views/exercise_solutions/_out_of_attempts.html.erb
|
484
483
|
- app/views/exercise_solutions/_results.html.erb
|
485
484
|
- app/views/exercise_solutions/_results_button.html.erb
|
485
|
+
- app/views/exercise_solutions/_results_hidden.html.erb
|
486
486
|
- app/views/exercise_solutions/_results_title.html.erb
|
487
487
|
- app/views/exercises/_exercise_assignment.html.erb
|
488
488
|
- app/views/exercises/_read_only.html.erb
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module StatusHelper
|
2
|
-
def class_for_status(s)
|
3
|
-
s.to_submission_status.iconize[:class].to_s
|
4
|
-
end
|
5
|
-
|
6
|
-
def icon_type_for_status(s)
|
7
|
-
s.to_submission_status.iconize[:type].to_s
|
8
|
-
end
|
9
|
-
|
10
|
-
def class_for_exercise(exercise)
|
11
|
-
class_for_status(exercise.status_for(current_user))
|
12
|
-
end
|
13
|
-
end
|