1
1
/**
2
- * @typedef {{status: string, test_results: [{status: string, title: string}]} } ClientResult
2
+ * @typedef {"errored"|"failed"|"passed_with_warnings"|"passed"|"pending"|"aborted" } SubmissionStatus
3
3
*/
4
4
5
5
/**
6
- * @typedef {{solution: object, client_result?: ClientResult} } Submission
6
+ * @typedef {{
7
+ * status: SubmissionStatus,
8
+ * test_results: [{status: SubmissionStatus, title: string}]
9
+ * }} SubmissionClientResult
7
10
*/
8
11
9
- var mumuki = mumuki || { } ;
10
-
11
- ( function ( mumuki ) {
12
- var lastSubmission = { } ;
13
-
14
- function Laboratory ( exerciseId ) {
15
- this . exerciseId = exerciseId ;
16
- }
17
-
18
- function asString ( json ) {
19
- return JSON . stringify ( json ) ;
20
- }
21
-
22
- function sameAsLastSolution ( newSolution ) {
23
- return asString ( lastSubmission . content ) === asString ( newSolution ) ;
24
- }
25
-
26
- function lastSubmissionFinishedSuccessfully ( ) {
27
- return lastSubmission . result && lastSubmission . result . status !== 'aborted' ;
28
- }
29
-
30
- function sendNewSolution ( submission ) {
31
- var token = new mumuki . CsrfToken ( ) ;
32
- var request = token . newRequest ( {
33
- type : 'POST' ,
34
- url : window . location . origin + window . location . pathname + '/solutions' + window . location . search ,
35
- data : submission
36
- } ) ;
37
-
38
- return $ . ajax ( request ) . then ( preRenderResult ) . done ( function ( result ) {
39
- lastSubmission = { content : { solution : submission . solution } , result : result } ;
40
- } ) ;
41
- }
12
+ /**
13
+ * @typedef {{
14
+ * status: SubmissionStatus,
15
+ * class_for_progress_list_item?: string,
16
+ * guide_finished_by_solution?: boolean
17
+ * }} SubmissionResult
18
+ */
42
19
20
+ /**
21
+ * @typedef {object } Solution
22
+ */
43
23
44
- /**
45
- * Pre-renders some html parts of submission UI
46
- * */
47
- function preRenderResult ( result ) {
48
- result . class_for_progress_list_item = mumuki . renderers . progressListItemClassForStatus ( result . status , true )
49
- return result ;
50
- }
24
+ /**
25
+ * @typedef {{
26
+ * "solution[content]"?:string,
27
+ * solution?: Solution,
28
+ * client_result?: SubmissionClientResult
29
+ * }} Submission
30
+ */
51
31
52
- mumuki . load ( function ( ) {
53
- lastSubmission = { } ;
54
- } ) ;
32
+ /**
33
+ * @typedef { {submission?: Submission, result?: SubmissionResult} } SubmissionAndResult
34
+ */
55
35
56
- Laboratory . prototype = {
36
+ mumuki . bridge = ( ( ) => {
57
37
38
+ class Laboratory {
58
39
// ==========
59
40
// Public API
60
41
// ==========
@@ -65,9 +46,9 @@ var mumuki = mumuki || {};
65
46
*
66
47
* @param {object } content the content object
67
48
* */
68
- runTests : function ( content ) {
49
+ runTests ( content ) {
69
50
return this . _submitSolution ( { solution : content } ) ;
70
- } ,
51
+ }
71
52
72
53
// ===========
73
54
// Private API
@@ -77,18 +58,46 @@ var mumuki = mumuki || {};
77
58
* Sends a solution object
78
59
*
79
60
* @param {Submission } submission the submission object
61
+ * @returns {JQuery.Promise<SubmissionResult> }
80
62
*/
81
- _submitSolution : function ( submission ) {
82
- if ( lastSubmissionFinishedSuccessfully ( ) && sameAsLastSolution ( submission ) ) {
83
- return $ . Deferred ( ) . resolve ( lastSubmission . result ) ;
63
+ _submitSolution ( submission ) {
64
+ const lastSubmission = mumuki . SubmissionsStore . getCachedResultFor ( mumuki . currentExerciseId , submission ) ;
65
+ if ( lastSubmission ) {
66
+ return $ . Deferred ( ) . resolve ( lastSubmission ) ;
84
67
} else {
85
- return sendNewSolution ( submission ) ;
68
+ return this . _sendNewSolution ( submission ) . done ( ( result ) => {
69
+ mumuki . SubmissionsStore . setLastSubmission ( mumuki . currentExerciseId , { submission, result} ) ;
70
+ } ) ;
86
71
}
87
72
}
88
- } ;
89
73
90
- mumuki . bridge = {
91
- Laboratory : Laboratory
92
- } ;
74
+ /**
75
+ * @param {Submission } submission the submission object
76
+ * @returns {JQuery.Promise<SubmissionResult> }
77
+ */
78
+ _sendNewSolution ( submission ) {
79
+ var token = new mumuki . CsrfToken ( ) ;
80
+ var request = token . newRequest ( {
81
+ type : 'POST' ,
82
+ url : window . location . origin + window . location . pathname + '/solutions' + window . location . search ,
83
+ data : submission
84
+ } ) ;
85
+ return $ . ajax ( request ) . then ( ( result ) => this . _preRenderResult ( result ) ) ;
86
+ }
87
+
88
+ /**
89
+ * Pre-renders some html parts of submission UI, adding them to the given result
90
+ *
91
+ * @param {SubmissionResult } result
92
+ * @returns {SubmissionResult }
93
+ */
94
+ _preRenderResult ( result ) {
95
+ result . class_for_progress_list_item = mumuki . renderers . progressListItemClassForStatus ( result . status , true )
96
+ return result ;
97
+ }
98
+ }
93
99
94
- } ( mumuki ) ) ;
100
+ return {
101
+ Laboratory
102
+ } ;
103
+ } ) ( ) ;
0 commit comments