forked from CIT/Vmeda.Online
		
	MOBILE-3893 assign: Check if submission is empty before saving
This commit is contained in:
		
							parent
							
								
									34f9124e9a
								
							
						
					
					
						commit
						a6076d3f42
					
				@ -432,6 +432,7 @@
 | 
				
			|||||||
  "addon.mod_assign.overdue": "assign",
 | 
					  "addon.mod_assign.overdue": "assign",
 | 
				
			||||||
  "addon.mod_assign.submission": "assign",
 | 
					  "addon.mod_assign.submission": "assign",
 | 
				
			||||||
  "addon.mod_assign.submissioneditable": "assign",
 | 
					  "addon.mod_assign.submissioneditable": "assign",
 | 
				
			||||||
 | 
					  "addon.mod_assign.submissionempty": "assign",
 | 
				
			||||||
  "addon.mod_assign.submissionnoteditable": "assign",
 | 
					  "addon.mod_assign.submissionnoteditable": "assign",
 | 
				
			||||||
  "addon.mod_assign.submissionnotsupported": "local_moodlemobileapp",
 | 
					  "addon.mod_assign.submissionnotsupported": "local_moodlemobileapp",
 | 
				
			||||||
  "addon.mod_assign.submissionslocked": "assign",
 | 
					  "addon.mod_assign.submissionslocked": "assign",
 | 
				
			||||||
 | 
				
			|||||||
@ -84,6 +84,7 @@
 | 
				
			|||||||
    "overdue": "Assignment is overdue by: {{$a}}",
 | 
					    "overdue": "Assignment is overdue by: {{$a}}",
 | 
				
			||||||
    "submission": "Submission",
 | 
					    "submission": "Submission",
 | 
				
			||||||
    "submissioneditable": "Student can edit this submission",
 | 
					    "submissioneditable": "Student can edit this submission",
 | 
				
			||||||
 | 
					    "submissionempty": "Nothing was submitted",
 | 
				
			||||||
    "submissionnoteditable": "Student cannot edit this submission",
 | 
					    "submissionnoteditable": "Student cannot edit this submission",
 | 
				
			||||||
    "submissionnotsupported": "This submission is not supported by the app and may not contain all the information.",
 | 
					    "submissionnotsupported": "This submission is not supported by the app and may not contain all the information.",
 | 
				
			||||||
    "submissionslocked": "This assignment is not accepting submissions",
 | 
					    "submissionslocked": "This assignment is not accepting submissions",
 | 
				
			||||||
 | 
				
			|||||||
@ -398,6 +398,10 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
 | 
				
			|||||||
            throw Translate.instant('addon.mod_assign.acceptsubmissionstatement');
 | 
					            throw Translate.instant('addon.mod_assign.acceptsubmissionstatement');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (AddonModAssignHelper.isSubmissionEmptyForEdit(this.assign!, this.userSubmission!, inputData)) {
 | 
				
			||||||
 | 
					            throw Translate.instant('addon.mod_assign.submissionempty');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let modal = await CoreLoadings.show();
 | 
					        let modal = await CoreLoadings.show();
 | 
				
			||||||
        let size = -1;
 | 
					        let size = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -237,6 +237,31 @@ export class AddonModAssignHelperProvider {
 | 
				
			|||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Check whether the edited submission has no content.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param assign Assignment object.
 | 
				
			||||||
 | 
					     * @param submission Submission to inspect.
 | 
				
			||||||
 | 
					     * @param inputData Data entered in the submission form.
 | 
				
			||||||
 | 
					     * @returns Whether the submission is empty.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    isSubmissionEmptyForEdit(
 | 
				
			||||||
 | 
					        assign: AddonModAssignAssign,
 | 
				
			||||||
 | 
					        submission: AddonModAssignSubmission,
 | 
				
			||||||
 | 
					        inputData: CoreFormFields,
 | 
				
			||||||
 | 
					    ): boolean {
 | 
				
			||||||
 | 
					        const anyNotEmpty = submission.plugins?.some((plugin) =>
 | 
				
			||||||
 | 
					            !AddonModAssignSubmissionDelegate.isPluginEmptyForEdit(assign, plugin, inputData));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // If any plugin is not empty, we consider that the submission is not empty either.
 | 
				
			||||||
 | 
					        if (anyNotEmpty) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // If all the plugins were empty (or there were no plugins), we consider the submission to be empty.
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * List the participants for a single assignment, with some summary info about their submissions.
 | 
					     * List the participants for a single assignment, with some summary info about their submissions.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 | 
				
			|||||||
@ -50,6 +50,17 @@ export class AddonModAssignDefaultSubmissionHandler implements AddonModAssignSub
 | 
				
			|||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @inheritdoc
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					   isEmptyForEdit(
 | 
				
			||||||
 | 
					       assign: AddonModAssignAssign, // eslint-disable-line @typescript-eslint/no-unused-vars
 | 
				
			||||||
 | 
					       plugin: AddonModAssignPlugin, // eslint-disable-line @typescript-eslint/no-unused-vars
 | 
				
			||||||
 | 
					       inputData: CoreFormFields, // eslint-disable-line @typescript-eslint/no-unused-vars
 | 
				
			||||||
 | 
					    ): boolean {
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @inheritdoc
 | 
					     * @inheritdoc
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
				
			|||||||
@ -62,6 +62,20 @@ export interface AddonModAssignSubmissionHandler extends CoreDelegateHandler {
 | 
				
			|||||||
        plugin: AddonModAssignPlugin,
 | 
					        plugin: AddonModAssignPlugin,
 | 
				
			||||||
    ): boolean;
 | 
					    ): boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Check if a plugin has no data in the edit form.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param assign The assignment.
 | 
				
			||||||
 | 
					     * @param plugin The plugin object.
 | 
				
			||||||
 | 
					     * @param inputData Data entered by the user for the submission.
 | 
				
			||||||
 | 
					     * @returns Whether the plugin is empty.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    isEmptyForEdit?(
 | 
				
			||||||
 | 
					        assign: AddonModAssignAssign,
 | 
				
			||||||
 | 
					        plugin: AddonModAssignPlugin,
 | 
				
			||||||
 | 
					        inputData: CoreFormFields,
 | 
				
			||||||
 | 
					    ): boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Should clear temporary data for a cancelled submission.
 | 
					     * Should clear temporary data for a cancelled submission.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
@ -502,6 +516,22 @@ export class AddonModAssignSubmissionDelegateService extends CoreDelegate<AddonM
 | 
				
			|||||||
        return this.executeFunctionOnEnabled(plugin.type, 'isEmpty', [assign, plugin]);
 | 
					        return this.executeFunctionOnEnabled(plugin.type, 'isEmpty', [assign, plugin]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Check if a plugin has no data in the edit form
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param assign The assignment.
 | 
				
			||||||
 | 
					     * @param plugin The plugin object.
 | 
				
			||||||
 | 
					     * @param inputData Data entered in the submission form.
 | 
				
			||||||
 | 
					     * @returns Whether the plugin is empty.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    isPluginEmptyForEdit(
 | 
				
			||||||
 | 
					        assign: AddonModAssignAssign,
 | 
				
			||||||
 | 
					        plugin: AddonModAssignPlugin,
 | 
				
			||||||
 | 
					        inputData: CoreFormFields,
 | 
				
			||||||
 | 
					    ): boolean | undefined {
 | 
				
			||||||
 | 
					        return this.executeFunctionOnEnabled(plugin.type, 'isEmptyForEdit', [assign, plugin, inputData]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Prefetch any required data for a submission plugin.
 | 
					     * Prefetch any required data for a submission plugin.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 | 
				
			|||||||
@ -61,6 +61,15 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
 | 
				
			|||||||
        return files.length === 0;
 | 
					        return files.length === 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @inheritdoc
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    isEmptyForEdit(assign: AddonModAssignAssign): boolean {
 | 
				
			||||||
 | 
					        const currentFiles = CoreFileSession.getFiles(ADDON_MOD_ASSIGN_COMPONENT, assign.id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return currentFiles.length == 0;
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @inheritdoc
 | 
					     * @inheritdoc
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
				
			|||||||
@ -58,6 +58,29 @@ export class AddonModAssignSubmissionOnlineTextHandlerService implements AddonMo
 | 
				
			|||||||
        return text.trim().length === 0;
 | 
					        return text.trim().length === 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @inheritdoc
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    isEmptyForEdit(
 | 
				
			||||||
 | 
					        assign: AddonModAssignAssign,
 | 
				
			||||||
 | 
					        plugin: AddonModAssignPlugin,
 | 
				
			||||||
 | 
					        inputData: AddonModAssignSubmissionOnlineTextData,
 | 
				
			||||||
 | 
					     ): boolean {
 | 
				
			||||||
 | 
					        const text = this.getTextToSubmit(plugin, inputData);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (CoreText.countWords(text) > 0) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Check if the online text submission contains video, audio or image elements
 | 
				
			||||||
 | 
					        // that can be ignored and stripped by count_words().
 | 
				
			||||||
 | 
					        if (/<\s*((video|audio)[^>]*>(.*?)<\s*\/\s*(video|audio)>)|(img[^>]*>)/.test(text)) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @inheritdoc
 | 
					     * @inheritdoc
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user