mumuki-laboratory 6.6.1 → 6.7.0

Sign up to get free protection for your applications and to get access to all the features.
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