mumuki-laboratory 6.6.1 → 6.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -3
  3. data/app/assets/config/mumuki_laboratory_engine.js +2 -0
  4. data/app/assets/javascripts/{application → mumuki_laboratory/application}/alias-modes.js +0 -0
  5. data/app/assets/javascripts/{application → mumuki_laboratory/application}/bridge.js +0 -0
  6. data/app/assets/javascripts/{application → mumuki_laboratory/application}/characters.js +1 -1
  7. data/app/assets/javascripts/{application → mumuki_laboratory/application}/codemirror-builder.js +0 -0
  8. data/app/assets/javascripts/{application → mumuki_laboratory/application}/codemirror.js +0 -0
  9. data/app/assets/javascripts/{application → mumuki_laboratory/application}/confirmation.js +0 -0
  10. data/app/assets/javascripts/{application → mumuki_laboratory/application}/console.js +0 -0
  11. data/app/assets/javascripts/{application → mumuki_laboratory/application}/csrf-token.js +0 -0
  12. data/app/assets/javascripts/{application → mumuki_laboratory/application}/custom-editor.js +0 -0
  13. data/app/assets/javascripts/{application → mumuki_laboratory/application}/discussions.js +0 -0
  14. data/app/assets/javascripts/{application → mumuki_laboratory/application}/free-form.js +0 -0
  15. data/app/assets/javascripts/{application → mumuki_laboratory/application}/inputs.js +0 -0
  16. data/app/assets/javascripts/{application → mumuki_laboratory/application}/kids.js +31 -6
  17. data/app/assets/javascripts/{application → mumuki_laboratory/application}/load-analytics.js +0 -0
  18. data/app/assets/javascripts/{application → mumuki_laboratory/application}/load-error-svg.js +0 -0
  19. data/app/assets/javascripts/{application → mumuki_laboratory/application}/messages.js +0 -0
  20. data/app/assets/javascripts/{application → mumuki_laboratory/application}/multiple-choice.js +0 -0
  21. data/app/assets/javascripts/{application → mumuki_laboratory/application}/multiple-files.js +29 -15
  22. data/app/assets/javascripts/{application → mumuki_laboratory/application}/multiple-scenarios.js +0 -0
  23. data/app/assets/javascripts/{application → mumuki_laboratory/application}/pin.js +0 -0
  24. data/app/assets/javascripts/{application → mumuki_laboratory/application}/popover.js +0 -0
  25. data/app/assets/javascripts/{application → mumuki_laboratory/application}/progress.js +0 -0
  26. data/app/assets/javascripts/{application → mumuki_laboratory/application}/submission.js +0 -0
  27. data/app/assets/javascripts/{application → mumuki_laboratory/application}/timer.js +0 -0
  28. data/app/assets/javascripts/{application → mumuki_laboratory/application}/tooltip.js +0 -0
  29. data/app/assets/javascripts/{application → mumuki_laboratory/application}/upload.js +0 -0
  30. data/app/assets/javascripts/{application → mumuki_laboratory/application}/user.js +0 -0
  31. data/app/assets/javascripts/{application.js → mumuki_laboratory/application.js} +1 -1
  32. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/_alerts.scss +0 -0
  33. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/_errors.scss +0 -0
  34. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/_fonts.scss +0 -0
  35. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/_invitations.scss +0 -0
  36. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/_layout.scss +0 -0
  37. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/_mixins.scss +0 -0
  38. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/_modules.scss +0 -0
  39. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/_tooltip.scss +0 -0
  40. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/_vendor.scss +0 -0
  41. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/hovers.scss +0 -0
  42. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_book_header.scss +0 -0
  43. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_breadcrumb.scss +0 -0
  44. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_chapter_show.scss +0 -0
  45. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_checkboxes.scss +0 -0
  46. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_console.scss +0 -0
  47. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_discussion.scss +0 -0
  48. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_dropdown.scss +0 -0
  49. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_editor.scss +0 -0
  50. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_exercise_assignment.scss +0 -0
  51. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_exercise_results.scss +0 -0
  52. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_flash.scss +0 -0
  53. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_follow_us.scss +0 -0
  54. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_gs-board.scss +0 -0
  55. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_highlight.scss +0 -0
  56. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_kids.scss +111 -38
  57. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_kids_results.scss +0 -0
  58. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_modal.scss +0 -0
  59. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_organization_chooser.scss +0 -0
  60. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_overlap.scss +0 -0
  61. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_progress_bar.scss +0 -0
  62. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_progress_listing.scss +0 -0
  63. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_timer.scss +0 -0
  64. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/_upload.scss +0 -0
  65. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/guide-corollary.scss +0 -0
  66. data/app/assets/stylesheets/{application → mumuki_laboratory/application}/modules/popover.scss +0 -0
  67. data/app/assets/stylesheets/{application.scss → mumuki_laboratory/application.scss} +3 -3
  68. data/app/controllers/invitations_controller.rb +1 -1
  69. data/app/helpers/assets_helper.rb +2 -2
  70. data/app/helpers/authors_helper.rb +10 -0
  71. data/app/helpers/discussions_helper.rb +6 -2
  72. data/app/views/book/show.html.erb +1 -1
  73. data/app/views/discussions/show.html.erb +1 -1
  74. data/app/views/invitations/show.html.erb +1 -1
  75. data/app/views/layouts/_authoring.html.erb +1 -1
  76. data/app/views/layouts/_kids.html.erb +5 -2
  77. data/app/views/layouts/_submission_result_error_body.html.erb +1 -1
  78. data/app/views/layouts/exercise_inputs/read_only_editors/_custom.html.erb +3 -3
  79. data/lib/mumuki/laboratory/locales/en.yml +5 -4
  80. data/lib/mumuki/laboratory/locales/es.yml +5 -4
  81. data/lib/mumuki/laboratory/locales/pt.yml +5 -4
  82. data/lib/mumuki/laboratory/version.rb +1 -1
  83. data/spec/dummy/public/character/animations.json +1 -0
  84. data/spec/features/invitations_flow_spec.rb +46 -0
  85. data/spec/helpers/authors_helper_spec.rb +18 -0
  86. data/vendor/assets/javascripts/codemirror-modes/index.js +1 -0
  87. metadata +73 -66
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5a23d1e0d46f76b2354b1cf7355f30a81aa42a803bfeb51ef2f9d6d05e0129e
4
- data.tar.gz: dce90aac8effdd1aa4d5e2b54dc51f8b4e30ddaa18504f2c4cd4741248152db2
3
+ metadata.gz: '0847a01d85f5a6b32a8c181b47930d4bd8a4963844107befc5f327c762f5cbc7'
4
+ data.tar.gz: 37f4f2fb0551b55a5ff8bd5e7d63faf529a6cd34bc0a920a26b7a8492e28c270
5
5
  SHA512:
6
- metadata.gz: d2feb8cd5973e1447e430abfde874918de914bc92638143fb313f9eff350dc282a01af534fdfebe9b0deb2a383730fa69066b98b2e2726509060f5d97e26e391
7
- data.tar.gz: 983337746d5427068af046e152d3bbee98d631a842020992bb7160bde00179b40c5f5c57324b0eb19c12aeee7ff625af65325dfe21b7c7aee1f70620a54bf7bc
6
+ metadata.gz: b0669c5d38531eb94e9b84e8ab395d51e12014569f355448144aa39bf77786de1426d3231f6731acee57d7aa7b9dcae3ae2bf023f30b61e9e7cf51812049158c
7
+ data.tar.gz: 194ee095c0fefbdec24876a58c994115a064b97244e16847918d887c4e9a6a751e042c76cfcb57942822904b072d10d0e94c280e847e90e7ac648447935dc56e
data/README.md CHANGED
@@ -36,8 +36,8 @@ echo 'eval "$(rbenv init -)"' >> ~/.bashrc # or .bash_profile
36
36
  > Now we have rbenv installed, we can install ruby and [bundler](http://bundler.io/)
37
37
 
38
38
  ```bash
39
- rbenv install 2.3.1
40
- rbenv global 2.3.1
39
+ rbenv install 2.6.3
40
+ rbenv global 2.6.3
41
41
  rbenv rehash
42
42
  gem install bundler
43
43
  ```
@@ -191,6 +191,11 @@ which are granted to be safe and stable.
191
191
  * `currentScenarioIndex`
192
192
  * `resetIndicators`
193
193
  * `updateIndicators`
194
+ * `mumuki.multipleFileEditor`
195
+ * `setUpAddFile`
196
+ * `setUpDeleteFiles`
197
+ * `setUpDeleteFile`
198
+ * `updateButtonsVisibility`
194
199
  * `mumuki.version`
195
200
 
196
201
  ### Kids Call order
@@ -207,7 +212,7 @@ content URL in the current organization transparently:
207
212
 
208
213
  * `GET <organization-url>/topics/<organization>/<repository>`
209
214
  * `GET <organization-url>/guides/<organization>/<repository>`
210
- * `GET <organization-url>/exercies/<organization>/<repository>/<bibliotheca-id>`
215
+ * `GET <organization-url>/exercises/<organization>/<repository>/<bibliotheca-id>`
211
216
 
212
217
  ## REST API Docs
213
218
 
@@ -0,0 +1,2 @@
1
+ //= link_directory ../javascripts/mumuki_laboratory.js
2
+ //= link_directory ../stylesheets/mumuki_laboratory.css
@@ -9,7 +9,7 @@ mumuki.load(() => {
9
9
  });
10
10
 
11
11
  function placeKidsAnimations() {
12
- placeAnimation('.mu-kids-character-animation', 'talk');
12
+ placeAnimation('.mu-kids-character-animation', 'blink');
13
13
  placeAnimation('.mu-kids-character-context', 'context');
14
14
  }
15
15
 
@@ -1,6 +1,5 @@
1
1
  mumuki.load(function () {
2
2
  var $bubble = $('.mu-kids-character-speech-bubble').children('.mu-kids-character-speech-bubble-normal');
3
- if(!$bubble.length) return;
4
3
 
5
4
  var availableTabs = ['.description', '.hint'];
6
5
  var $speechParagraphs, paragraphHeight, scrollHeight, nextSpeechBlinking;
@@ -12,6 +11,9 @@ mumuki.load(function () {
12
11
  var $speechTabs = $('.mu-kids-character-speech-bubble-tabs > li:not(.separator)');
13
12
  var $defaultSpeechTabName = 'description';
14
13
  var $texts = $bubble.children(availableTabs.join(", "));
14
+ var $hint = $('.mu-kids-hint');
15
+ var discussionsLinkHtml = $('#mu-kids-discussion-link-html').html();
16
+ var $description = $('.mu-kids-description');
15
17
 
16
18
  function floatFromPx(value) {
17
19
  return parseFloat(value.substring(0, value.length - 2));
@@ -120,7 +122,7 @@ mumuki.load(function () {
120
122
  mumuki.kids._hideMessageOnCharacterBubble();
121
123
  var $bubble = mumuki.kids._getCharacterBubble();
122
124
  Object.keys(mumuki.kids.resultAction).forEach($bubble.removeClass.bind($bubble));
123
- mumuki.presenterCharacter.playAnimation('talk', mumuki.kids._getCharaterImage());
125
+ mumuki.presenterCharacter.playAnimation('talk', mumuki.kids._getCharacterImage());
124
126
  },
125
127
 
126
128
  // ===========
@@ -139,7 +141,7 @@ mumuki.load(function () {
139
141
  return $('#kids-results-aborted');
140
142
  },
141
143
 
142
- _getCharaterImage: function () {
144
+ _getCharacterImage: function () {
143
145
  return $('.mu-kids-character > img');
144
146
  },
145
147
 
@@ -156,6 +158,7 @@ mumuki.load(function () {
156
158
  $bubble.find('.mu-kids-character-speech-bubble-tabs').show();
157
159
  $bubble.find('.mu-kids-character-speech-bubble-normal').show();
158
160
  $bubble.find('.mu-kids-character-speech-bubble-failed').hide();
161
+ $bubble.find('.mu-kids-discussion-link').remove();
159
162
  Object.keys(mumuki.kids.resultAction).forEach($bubble.removeClass.bind($bubble));
160
163
  mumuki.kids._getOverlay().hide();
161
164
  },
@@ -169,12 +172,19 @@ mumuki.load(function () {
169
172
  if (data.status === 'passed_with_warnings') {
170
173
  $bubble.find('.mu-kids-character-speech-bubble-failed').append(data.expectations_html);
171
174
  }
175
+ if (this._shouldDisplayDiscussionsLink(data.status)) {
176
+ $bubble.append(discussionsLinkHtml);
177
+ }
172
178
  mumuki.kids._getOverlay().show();
173
179
  },
174
180
 
181
+ _shouldDisplayDiscussionsLink: function (status) {
182
+ return ['failed', 'passed_with_warnings'].some(it => it === status);
183
+ },
184
+
175
185
  _showOnSuccessPopup: function (data) {
176
186
  mumuki.kids._updateSubmissionResult(data.html);
177
- mumuki.presenterCharacter.playAnimation('success_l', mumuki.kids._getCharaterImage());
187
+ mumuki.presenterCharacter.playAnimation('success_l', mumuki.kids._getCharacterImage());
178
188
  mumuki.kids._showMessageOnCharacterBubble(data);
179
189
  mumuki.presenterCharacter.playAnimation('success2_l', $('.mu-kids-character-success'));
180
190
  setTimeout(function () {
@@ -199,7 +209,7 @@ mumuki.load(function () {
199
209
  },
200
210
 
201
211
  _showOnCharacterBubble: function (data) {
202
- mumuki.presenterCharacter.playAnimation('failure', mumuki.kids._getCharaterImage());
212
+ mumuki.presenterCharacter.playAnimation('failure', mumuki.kids._getCharacterImage());
203
213
  mumuki.kids._showMessageOnCharacterBubble(data);
204
214
  },
205
215
 
@@ -250,7 +260,11 @@ mumuki.load(function () {
250
260
  }
251
261
 
252
262
  function animateSpeech() {
253
- mumuki.presenterCharacter.playAnimation('talk', mumuki.kids._getCharaterImage());
263
+ mumuki.presenterCharacter.playAnimation('talk', mumuki.kids._getCharacterImage());
264
+ }
265
+
266
+ function animateHint() {
267
+ mumuki.presenterCharacter.playAnimation('hint', mumuki.kids._getCharaterImage());
254
268
  }
255
269
 
256
270
  mumuki.kids.resultAction.passed = mumuki.kids._showOnSuccessPopup;
@@ -262,8 +276,13 @@ mumuki.load(function () {
262
276
  mumuki.kids.resultAction.errored = mumuki.kids._showOnCharacterBubble;
263
277
  mumuki.kids.resultAction.pending = mumuki.kids._showOnCharacterBubble;
264
278
 
279
+ $('.mu-kids-context').on('hidden.bs.modal', function () {
280
+ animateSpeech();
281
+ });
282
+
265
283
  $(document).ready(() => {
266
284
  // Speech initialization
285
+ if(!$bubble.length) return;
267
286
 
268
287
  availableTabs.forEach(function (tabSelector) {
269
288
  tabParagraphs(tabSelector).contents().unwrap().wrapAll('<p>');
@@ -290,6 +309,12 @@ mumuki.load(function () {
290
309
 
291
310
  $nextSpeech.click(showNextParagraph);
292
311
  $prevSpeech.click(showPrevParagraph);
312
+ $description.click(animateSpeech);
313
+
314
+ $hint.click(function () {
315
+ animateHint();
316
+ this.classList.remove('blink');
317
+ });
293
318
 
294
319
  // States initial resizing
295
320
 
@@ -23,6 +23,10 @@ mumuki.load(() => {
23
23
  return this.tab.find(File.NAME_CLASS).text(name);
24
24
  }
25
25
 
26
+ get deleteButton() {
27
+ return this.tab.find(File.DELETE_BUTTON_CLASS);
28
+ }
29
+
26
30
  get isSelected() {
27
31
  return this.tab.hasClass("active");
28
32
  }
@@ -71,7 +75,15 @@ mumuki.load(() => {
71
75
  this.MAX_TABS = 5;
72
76
 
73
77
  this._addFileButton = this.tabsContainer.siblings('.add-file-button');
74
- this._updateButtonsVisibility();
78
+ this.updateButtonsVisibility();
79
+ }
80
+
81
+ get mainFile() {
82
+ return this._mainFile || '';
83
+ }
84
+
85
+ set mainFile(mainFile) {
86
+ this._mainFile = mainFile;
75
87
  }
76
88
 
77
89
  get files() {
@@ -111,7 +123,16 @@ mumuki.load(() => {
111
123
  }
112
124
 
113
125
  setUpDeleteFile(file) {
114
- file.setUpOnRemove(this._deleteFile.bind(this));
126
+ file.setUpOnRemove(() => this._deleteFile(file));
127
+ }
128
+
129
+ updateButtonsVisibility() {
130
+ const filesCount = this._getFilesCount();
131
+
132
+ this._setVisibility(this._addFileButton, filesCount < this.MAX_TABS);
133
+ this.files.toArray().forEach(file => {
134
+ this._setVisibility(file.deleteButton, file.name !== this.mainFile && filesCount > 1)
135
+ });
115
136
  }
116
137
 
117
138
  _addFile() {
@@ -126,27 +147,19 @@ mumuki.load(() => {
126
147
  const file = this.files.last().get(0).initialize(name);
127
148
  this.setUpDeleteFile(file);
128
149
 
129
- this._updateButtonsVisibility();
150
+ this.updateButtonsVisibility();
130
151
  }
131
152
 
132
153
  _deleteFile(file) {
133
- const index = this.files.toArray()
134
- .map((file) => file.name)
154
+ const index = this.files.toArray()
155
+ .map(file => file.name)
135
156
  .indexOf(file.name);
136
157
  const previousIndex = Math.max(index - 1, 0);
137
158
 
138
159
  const wasSelected = file.remove();
139
160
  if (wasSelected) this.files[previousIndex].select();
140
161
 
141
- this._updateButtonsVisibility();
142
- }
143
-
144
- _updateButtonsVisibility() {
145
- const filesCount = this._getFilesCount();
146
- const deleteButtons = this.tabs.find(File.DELETE_BUTTON_CLASS);
147
-
148
- this._setVisibility(this._addFileButton, filesCount < this.MAX_TABS);
149
- this._setVisibility(deleteButtons, filesCount > 1);
162
+ this.updateButtonsVisibility();
150
163
  }
151
164
 
152
165
  _createTab(name, id) {
@@ -212,16 +225,17 @@ mumuki.load(() => {
212
225
  }
213
226
  }
214
227
 
215
-
216
228
  const setUpTabsBehavior = () => {
217
229
  const tabsContainer = $('.nav-tabs').last();
218
230
  if (!tabsContainer.length) return;
219
231
  const editorsContainer = $('.tab-content');
220
232
 
221
233
  const multipleFileEditor = new MultipleFileEditor(tabsContainer, editorsContainer);
234
+ mumuki.multipleFileEditor = multipleFileEditor;
222
235
  multipleFileEditor.setUpAddFile();
223
236
  multipleFileEditor.setUpDeleteFiles();
224
237
  };
225
238
 
226
239
  $(document).ready(setUpTabsBehavior);
240
+
227
241
  });
@@ -24,7 +24,7 @@
24
24
 
25
25
  //= require codemirror.min
26
26
  //= require codemirror-autorefresh
27
- //= require_tree ../../../vendor/assets/javascripts/codemirror-modes
27
+ //= require codemirror-modes
28
28
  //= require analytics
29
29
  //= require hotjar
30
30
  //= require muvment
@@ -110,6 +110,18 @@ $kids-speech-tabs-width: 40px;
110
110
  height: 100%;
111
111
  }
112
112
  .mu-kids-character-speech-bubble {
113
+ &.failed, &.passed_with_warnings {
114
+ padding-right: 20px;
115
+ }
116
+ .mu-kids-discussion-link {
117
+ i {
118
+ width: 13px;
119
+ height: 13px;
120
+ line-height: 13px;
121
+ border-radius: 50%;
122
+ }
123
+
124
+ }
113
125
 
114
126
  @media screen and (max-width: $screen-sm-max) {
115
127
  h4 {
@@ -342,50 +354,111 @@ $kids-speech-tabs-width: 40px;
342
354
  }
343
355
  }
344
356
  }
357
+ }
345
358
 
346
- .mu-kids-blocks {
347
- form,
348
- [id*="custom-editor"],
349
- gs-element-blockly,
350
- #blocklyDiv,
351
- .blocklySvg {
352
- min-width: 100% !important;
353
- min-height: 100% !important;
354
- width: 100% !important;
355
- height: 100% !important;
356
- }
357
- gs-element-blockly {
358
- padding: 0;
359
- margin: 0;
360
- }
361
- .blocklyMainBackground {
362
- rx: 10px !important;
363
- ry: 10px !important;
364
- }
365
- .blocklyScrollbarHandle {
366
- fill: $kids-scrollbar-background-color !important;
367
- stroke: $kids-speech-border-color !important;
368
- stroke-width: 1px !important;
369
- }
370
- .blocklyMainWorkspaceScrollbar {
371
- display: none;
359
+ .mu-kids-blocks, .mu-read-only-editor {
360
+ form,
361
+ [id*="custom-editor"],
362
+ gs-element-blockly,
363
+ #blocklyDiv,
364
+ .blocklySvg {
365
+ min-width: 100% !important;
366
+ min-height: 100% !important;
367
+ width: 100% !important;
368
+ height: 100% !important;
369
+ }
370
+ gs-element-blockly {
371
+ padding: 0;
372
+ margin: 0;
373
+ }
374
+ .blocklyMainBackground {
375
+ rx: 10px !important;
376
+ ry: 10px !important;
377
+ }
378
+ .blocklyScrollbarHandle {
379
+ fill: $kids-scrollbar-background-color !important;
380
+ stroke: $kids-speech-border-color !important;
381
+ stroke-width: 1px !important;
382
+ }
383
+ .blocklyMainWorkspaceScrollbar {
384
+ display: none;
385
+ }
386
+ .blocklyScrollbarHorizontal {
387
+ display: none;
388
+ }
389
+ .blocklyToolboxDiv {
390
+ background-color: $kids-speech-background-color !important;
391
+ border: $kids-speech-border !important;
392
+ border-right: none !important;
393
+ border-top-left-radius: 10px !important;
394
+ border-bottom-left-radius: 10px !important;
395
+ }
396
+ .blocklyFlyoutBackground {
397
+ fill: $kids-speech-background-color !important;
398
+ border: $kids-speech-border !important;
399
+ border-right: none !important;
400
+ }
401
+ }
402
+
403
+ $statuses-glow-animation: (
404
+ failed: $mu-color-danger,
405
+ passed_with_warnings: $mu-color-warning
406
+ );
407
+
408
+ @each $status, $color in $statuses-glow-animation {
409
+ @keyframes glow-#{$status} {
410
+ 0% {
411
+ box-shadow: 0 0 0 #ffff7f;
372
412
  }
373
- .blocklyScrollbarHorizontal {
374
- display: none;
413
+ 50% {
414
+ box-shadow: 0 0 15px 4px $color;
415
+ color: darken($color, 10%);
416
+ transform: scale(1.2);
375
417
  }
376
- .blocklyToolboxDiv {
377
- background-color: $kids-speech-background-color !important;
378
- border: $kids-speech-border !important;
379
- border-right: none !important;
380
- border-top-left-radius: 10px !important;
381
- border-bottom-left-radius: 10px !important;
418
+ 100% {
419
+ box-shadow: 0 0 25px 4px transparent;
382
420
  }
383
- .blocklyFlyoutBackground {
384
- fill: $kids-speech-background-color !important;
385
- border: $kids-speech-border !important;
386
- border-right: none !important;
421
+ }
422
+
423
+ .#{$status} .mu-kids-discussion-link {
424
+ color: $color;
425
+ i {
426
+ -webkit-animation: glow-#{$status} 1.5s ease infinite;
427
+ -moz-animation: glow-#{$status} 1.5s ease infinite;
428
+ animation: glow-#{$status} 1.5s ease infinite;
387
429
  }
388
430
  }
431
+
432
+ }
433
+
434
+ .mu-kids-hint.blink i {
435
+ width: 8px;
436
+ height: 8px;
437
+ line-height: 12px;
438
+ margin: 0 2px 4px 0;
439
+ -webkit-animation: hint-blink 1.5s ease infinite;
440
+ -moz-animation: hint-blink 1.5s ease infinite;
441
+ animation: hint-blink 1.5s ease infinite;
442
+ }
443
+
444
+ @keyframes hint-blink {
445
+ 50% {
446
+ color: #7f7f00;
447
+ background-color: rgba(255,255,0, 0.5);
448
+ transform: scale(1.2);
449
+ }
450
+ }
451
+
452
+ .mu-read-only-editor {
453
+ #blocklyDiv {
454
+ height: 400px !important;
455
+ }
456
+ #blocklyDiv {
457
+ border: $kids-speech-border !important;
458
+ }
459
+ .blocklyMainBackground {
460
+ stroke-width: 0px;
461
+ }
389
462
  }
390
463
 
391
464
  .mu-kids-landscape-support {
@@ -1,6 +1,6 @@
1
- $icon-font-path: '../assets/bootstrap/';
2
- $fa-font-path: '../assets';
3
- $da-font-path: '../assets';
1
+ $icon-font-path: asset-path('assets/bootstrap');
2
+ $fa-font-path: asset-path('assets');
3
+ $da-font-path: asset-path('assets');
4
4
 
5
5
  @import "scss/mumuki-styles";
6
6
  @import "codemirror/codemirror.min";
@@ -3,7 +3,7 @@ class InvitationsController < ApplicationController
3
3
  before_action :set_invitation!
4
4
 
5
5
  def show
6
- redirect_to_organization! if current_user.student_of? @organization
6
+ redirect_to_organization! if current_user.student_of? @invitation.course
7
7
  end
8
8
 
9
9
  def join
@@ -9,8 +9,8 @@ module AssetsHelper
9
9
 
10
10
  def laboratory_assets_include_tags
11
11
  %Q{
12
- #{stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'}
13
- #{javascript_include_tag 'application', 'data-turbolinks-track': 'reload'}
12
+ #{stylesheet_link_tag 'mumuki_laboratory/application', media: 'all', 'data-turbolinks-track': 'reload'}
13
+ #{javascript_include_tag 'mumuki_laboratory/application.js', 'data-turbolinks-track': 'reload'}
14
14
  }
15
15
  end
16
16
 
@@ -0,0 +1,10 @@
1
+ module AuthorsHelper
2
+
3
+ def attribution_caption(guide)
4
+ if guide.collaborators.present?
5
+ t(:authoring_note_with_collaborators_html, authors: guide.authors, collaborators: "https://raw.githubusercontent.com/#{guide.slug}/master/COLLABORATORS.txt")
6
+ else
7
+ t(:authoring_note_html, authors: guide.authors)
8
+ end
9
+ end
10
+ end