diff --git a/src/assessment/extensions/validation/disableOnValidate.js b/src/assessment/extensions/validation/disableOnValidate.js new file mode 100644 index 0000000..0811344 --- /dev/null +++ b/src/assessment/extensions/validation/disableOnValidate.js @@ -0,0 +1,51 @@ +import * as app from '../../core/app'; +import { hasCheckAnswer, questionInstance, questionResponseIds } from '../../core/questions'; + +/** + * Extensions add specific functionality to Items API. + * They rely on modules within LT being available. + * + * -- + * + * This extension is used to disable the question after it has been validated + * using the "Check Answer" button. + * + * @module Extensions/Assessment/disableOnValidate + */ + +/** + * @example + * import { LT } from '@caspingus/lt/src/assessment/core'; + * import * as disableOnValidate from '@caspingus/lt/src/assessment/extensions/validation/disableOnValidate + * + * LT.init(itemsApp); // Set up LT with the Items API application instance variable + * + * disableOnValidate.run(); + * @since 2.17.0 + */ +export function run() { + app.appInstance().on('item:load', e => { + setup(e); + }); +} + +/** + * Determines if the "Check Answer" button is enabled for the current question. + * If so, the question is disabled after validation (click of the button). + * @param {object} e Item event object + * @since 2.17.0 + * @ignore + */ +function setup(e) { + const responses = questionResponseIds(); + + for (const response_id of responses) { + if (hasCheckAnswer(response_id)) { + app.appInstance() + .question(response_id) + .on('validated', ev => { + questionInstance(response_id).disable(); + }); + } + } +} diff --git a/src/assessment/index.js b/src/assessment/index.js index 8705522..73785da 100644 --- a/src/assessment/index.js +++ b/src/assessment/index.js @@ -11,6 +11,7 @@ import * as ariaCountOnNav from './extensions/accessibility/aria/ariaCountOnNav' import * as blockGrammarChecks from './extensions/validation/blockGrammarChecks'; import * as checkAnswerValidation from './extensions/validation/checkAnswerValidation'; import * as columnResizer from './extensions/accessibility/ux/columnResizer'; +import * as disableOnValidate from './extensions/validation/disableOnValidate'; import * as essayLimitByCharacter from './extensions/validation/essayLimitByCharacter'; import * as hideAlternatives from './extensions/accessibility/ux/hideAlternatives'; import * as keyboardShortcuts from './extensions/accessibility/ux/keyboardShortcuts'; @@ -29,6 +30,7 @@ const extensions = { blockGrammarChecks: { ...blockGrammarChecks }, checkAnswerValidation: { ...checkAnswerValidation }, columnResizer: { ...columnResizer }, + disableOnValidate: { ...disableOnValidate }, essayLimitByCharacter: { ...essayLimitByCharacter }, hideAlternatives: { ...hideAlternatives }, keyboardShortcuts: { ...keyboardShortcuts },