From e79c8bf4f01a407d90d9edf4cb10bd0bccf4e0e9 Mon Sep 17 00:00:00 2001 From: Pawel Korczak Date: Thu, 28 Dec 2023 12:20:40 +0100 Subject: [PATCH 1/6] chore: update methods to lodash 4 version --- views/js/controller/creator/encoders/dom2qti.js | 2 +- views/js/controller/creator/helpers/categorySelector.js | 2 +- views/js/controller/creator/helpers/outcome.js | 2 +- views/js/controller/creator/helpers/qtiTest.js | 6 +++--- views/js/controller/creator/helpers/scoring.js | 2 +- views/js/controller/creator/helpers/sectionCategory.js | 4 ++-- views/js/controller/creator/helpers/validators.js | 6 +++--- views/js/controller/runner/runner.js | 2 +- views/js/controller/runtime/testRunner.js | 4 ++-- views/js/test/creator/helpers/scoring/test.js | 8 ++++---- views/js/test/runner/mocks/areaBrokerMock.js | 2 +- views/js/testRunner/actionBar/button.js | 2 +- views/js/testRunner/testMetaData.js | 2 +- 13 files changed, 22 insertions(+), 22 deletions(-) diff --git a/views/js/controller/creator/encoders/dom2qti.js b/views/js/controller/creator/encoders/dom2qti.js index 1f48ab1969..951a391296 100644 --- a/views/js/controller/creator/encoders/dom2qti.js +++ b/views/js/controller/creator/encoders/dom2qti.js @@ -63,7 +63,7 @@ define([ * @returns {Array} */ function getAttributes(object) { - return _.omit(object, [ + return _.omitBy(object, [ 'qti-type', 'content', 'xmlBase', diff --git a/views/js/controller/creator/helpers/categorySelector.js b/views/js/controller/creator/helpers/categorySelector.js index 295edbeee3..d2f0c0d162 100644 --- a/views/js/controller/creator/helpers/categorySelector.js +++ b/views/js/controller/creator/helpers/categorySelector.js @@ -215,7 +215,7 @@ define([ */ function extractCategoriesFromPresets() { return allPresets.reduce(function (prev, current) { - const groupIds = _.pluck(current.presets, 'qtiCategory'); + const groupIds = _.map(current.presets, 'qtiCategory'); return prev.concat(groupIds); }, []); } diff --git a/views/js/controller/creator/helpers/outcome.js b/views/js/controller/creator/helpers/outcome.js index 27471332b3..d85976c64a 100644 --- a/views/js/controller/creator/helpers/outcome.js +++ b/views/js/controller/creator/helpers/outcome.js @@ -155,7 +155,7 @@ define([ if (_.isFunction(outcomes)) { check = outcomes; } else { - outcomes = _.indexBy(_.isArray(outcomes) ? outcomes : [outcomes], function (outcome) { + outcomes = _.keyBy(_.isArray(outcomes) ? outcomes : [outcomes], function (outcome) { return outcome; }); diff --git a/views/js/controller/creator/helpers/qtiTest.js b/views/js/controller/creator/helpers/qtiTest.js index bbf65b054c..be3da8f7c3 100644 --- a/views/js/controller/creator/helpers/qtiTest.js +++ b/views/js/controller/creator/helpers/qtiTest.js @@ -35,7 +35,7 @@ define(['jquery', 'lodash', 'taoQtiTest/controller/creator/helpers/validators'], * @returns {String[]} the list of unique identifiers */ getIdentifiers: function getIdentifiers(model, includesOnlyTypes, excludeTypes) { - return _.uniq(_.pluck(validators.extractIdentifiers(model, includesOnlyTypes, excludeTypes), 'identifier')); + return _.uniqBy(_.map(validators.extractIdentifiers(model, includesOnlyTypes, excludeTypes), 'identifier')); }, /** @@ -151,7 +151,7 @@ define(['jquery', 'lodash', 'taoQtiTest/controller/creator/helpers/validators'], const glue = '-'; let identifier; let current; - if (_.contains(validators.qtiTypesForUniqueIds, qtiType)) { + if (_.includes(validators.qtiTypesForUniqueIds, qtiType)) { current = this.getIdentifiers(model, validators.qtiTypesForUniqueIds); } else { current = this.getIdentifiersOf(model, qtiType); @@ -162,7 +162,7 @@ define(['jquery', 'lodash', 'taoQtiTest/controller/creator/helpers/validators'], do { identifier = suggestion + glue + index++; } while ( - _.contains(current, identifier.toUpperCase()) || // identifier exist in model + _.includes(current, identifier.toUpperCase()) || // identifier exist in model $(`#${identifier}`).length // identifier was in model but still exist in DOM ); diff --git a/views/js/controller/creator/helpers/scoring.js b/views/js/controller/creator/helpers/scoring.js index 6cd2ace212..cb43e709d5 100644 --- a/views/js/controller/creator/helpers/scoring.js +++ b/views/js/controller/creator/helpers/scoring.js @@ -905,7 +905,7 @@ define([ * @param {Object} model */ function removeScoring(model) { - var scoringOutcomes = _.indexBy(outcomeHelper.listOutcomes(model, getOutcomesRecipe), function (outcome) { + var scoringOutcomes = _.keyBy(outcomeHelper.listOutcomes(model, getOutcomesRecipe), function (outcome) { return outcome; }); diff --git a/views/js/controller/creator/helpers/sectionCategory.js b/views/js/controller/creator/helpers/sectionCategory.js index 1178b36bc0..de923a68bc 100644 --- a/views/js/controller/creator/helpers/sectionCategory.js +++ b/views/js/controller/creator/helpers/sectionCategory.js @@ -116,7 +116,7 @@ define(['lodash', 'i18n', 'core/errorHandler'], function (_, __, errorHandler) { */ function addCategories(model, categories) { if (isValidSectionModel(model)) { - _.each(model.sectionParts, function (sectionPart) { + _.forEach(model.sectionParts, function (sectionPart) { if (sectionPart['qti-type'] === 'assessmentItemRef') { if (!_.isArray(sectionPart.categories)) { sectionPart.categories = []; @@ -141,7 +141,7 @@ define(['lodash', 'i18n', 'core/errorHandler'], function (_, __, errorHandler) { */ function removeCategories(model, categories) { if (isValidSectionModel(model)) { - _.each(model.sectionParts, function (sectionPart) { + _.forEach(model.sectionParts, function (sectionPart) { if (sectionPart['qti-type'] === 'assessmentItemRef' && _.isArray(sectionPart.categories)) { sectionPart.categories = _.difference(sectionPart.categories, categories); } diff --git a/views/js/controller/creator/helpers/validators.js b/views/js/controller/creator/helpers/validators.js index acde04bc04..5237a3086e 100644 --- a/views/js/controller/creator/helpers/validators.js +++ b/views/js/controller/creator/helpers/validators.js @@ -118,7 +118,7 @@ define([ function validateModel(model) { const identifiers = extractIdentifiers(model, qtiTypesForUniqueIds); let nonUniqueIdentifiers = 0; - const outcomes = _.indexBy(outcomeHelper.listOutcomes(model)); + const outcomes = _.keyBy(outcomeHelper.listOutcomes(model)); let messageDetails = ''; _(identifiers) @@ -165,7 +165,7 @@ define([ const extract = function extract(element) { if (element && _.has(element, 'identifier') && _.isString(element.identifier)) { - if (!includesOnlyTypes.length || _.contains(includesOnlyTypes, element['qti-type'])) { + if (!includesOnlyTypes.length || _.includes(includesOnlyTypes, element['qti-type'])) { identifiers.push({ identifier: element.identifier.toUpperCase(), originalIdentifier: element.identifier, @@ -176,7 +176,7 @@ define([ } _.forEach(element, function (subElement) { if (_.isPlainObject(subElement) || _.isArray(subElement)) { - if (!excludeTypes.length || !_.contains(excludeTypes, subElement['qti-type'])) { + if (!excludeTypes.length || !_.includes(excludeTypes, subElement['qti-type'])) { extract(subElement); } } diff --git a/views/js/controller/runner/runner.js b/views/js/controller/runner/runner.js index c6bf79d645..306a1ded08 100644 --- a/views/js/controller/runner/runner.js +++ b/views/js/controller/runner/runner.js @@ -192,7 +192,7 @@ define([ providerLoader(config.providers, context.bundle) .then(function (results) { - const testRunnerConfig = _.omit(config, ['providers']); + const testRunnerConfig = _.omitBy(config, ['providers']); testRunnerConfig.renderTo = $container; if (results.proxy && typeof results.proxy.getAvailableProviders === 'function') { diff --git a/views/js/controller/runtime/testRunner.js b/views/js/controller/runtime/testRunner.js index 20d7f54034..048dab31c6 100644 --- a/views/js/controller/runtime/testRunner.js +++ b/views/js/controller/runtime/testRunner.js @@ -489,7 +489,7 @@ function ( */ isCurrentItemAnswered: function(){ var answered = false; - _.each(this.getCurrentItemState(), function(state){ + _.forEach(this.getCurrentItemState(), function(state){ if(state && _.isObject(state.response) && state.response.base !== null){ answered = true;//at least one response is not null so consider the item answered return false; @@ -789,7 +789,7 @@ function ( if (self.testContext.timerWarning && self.testContext.timerWarning[cst.qtiClassName]) { cst.warnings = {}; _(self.testContext.timerWarning[cst.qtiClassName]).forEach(function (value, key) { - if (_.contains(['info', 'warning', 'danger'], value)) { + if (_.includes(['info', 'warning', 'danger'], value)) { cst.warnings[key] = { type: value, showed: cst.seconds <= key, diff --git a/views/js/test/creator/helpers/scoring/test.js b/views/js/test/creator/helpers/scoring/test.js index 94c297b0e1..80774b549d 100644 --- a/views/js/test/creator/helpers/scoring/test.js +++ b/views/js/test/creator/helpers/scoring/test.js @@ -266,8 +266,8 @@ define([ modelOverseer.on('scoring-write', function(writtenModel) { - model = _.omit(model, 'scoring'); - writtenModel = _.omit(writtenModel, 'scoring'); + model = _.omitBy(model, 'scoring'); + writtenModel = _.omitBy(writtenModel, 'scoring'); assert.deepEqual(writtenModel, data.expected, 'The written model is as expected'); assert.deepEqual(model, data.expected, 'The score processing has been set'); @@ -293,8 +293,8 @@ define([ modelOverseer.on('scoring-write', function(writtenModel) { - model = _.omit(model, 'scoring'); - writtenModel = _.omit(writtenModel, 'scoring'); + model = _.omitBy(model, 'scoring'); + writtenModel = _.omitBy(writtenModel, 'scoring'); assert.deepEqual(writtenModel, scoringCustomSample, 'The written model is as expected'); assert.deepEqual(model, scoringCustomSample, 'The score processing has been set'); diff --git a/views/js/test/runner/mocks/areaBrokerMock.js b/views/js/test/runner/mocks/areaBrokerMock.js index 1fb092f88c..f2a15b371a 100644 --- a/views/js/test/runner/mocks/areaBrokerMock.js +++ b/views/js/test/runner/mocks/areaBrokerMock.js @@ -73,7 +73,7 @@ define(['jquery', 'lodash', 'ui/areaBroker', 'taoQtiTest/runner/ui/toolbox/toolb if (!config.areas) { config.areas = config.defaultAreas; } else { - config.areas = _.keys(_.merge(_.object(config.areas), _.object(config.defaultAreas))); + config.areas = _.keys(_.merge(_.fromPairs(config.areas), _.fromPairs(config.defaultAreas))); } _.forEach(config.areas, areaId => { diff --git a/views/js/testRunner/actionBar/button.js b/views/js/testRunner/actionBar/button.js index 1e325e44c1..47ad42ffa4 100644 --- a/views/js/testRunner/actionBar/button.js +++ b/views/js/testRunner/actionBar/button.js @@ -69,7 +69,7 @@ define([ * @returns {button} */ init : function init(id, config, testContext, testRunner) { - this.config = _.omit(config || {}, function(value) { + this.config = _.omitBy(config || {}, function(value) { return value === undefined || value === null; }); this.config.id = id; diff --git a/views/js/testRunner/testMetaData.js b/views/js/testRunner/testMetaData.js index 93f6539b16..69d0788522 100644 --- a/views/js/testRunner/testMetaData.js +++ b/views/js/testRunner/testMetaData.js @@ -44,7 +44,7 @@ * Data for each service call id will be stored in local storage to be able get data * after reloading the page or resuming the test session. * - * To clear all data related to current test_call_id used clearData method. + * To clear all data related to current test_.every_id used clearData method. */ define([ 'lodash' From 21c52e19dc5de697a2d7644f53f9b9f9aebb7e07 Mon Sep 17 00:00:00 2001 From: Pawel Korczak Date: Fri, 29 Dec 2023 15:18:13 +0100 Subject: [PATCH 2/6] fix: uniq method --- views/js/controller/creator/helpers/qtiTest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/js/controller/creator/helpers/qtiTest.js b/views/js/controller/creator/helpers/qtiTest.js index be3da8f7c3..ad5a725ac7 100644 --- a/views/js/controller/creator/helpers/qtiTest.js +++ b/views/js/controller/creator/helpers/qtiTest.js @@ -35,7 +35,7 @@ define(['jquery', 'lodash', 'taoQtiTest/controller/creator/helpers/validators'], * @returns {String[]} the list of unique identifiers */ getIdentifiers: function getIdentifiers(model, includesOnlyTypes, excludeTypes) { - return _.uniqBy(_.map(validators.extractIdentifiers(model, includesOnlyTypes, excludeTypes), 'identifier')); + return _.uniq(_.map(validators.extractIdentifiers(model, includesOnlyTypes, excludeTypes), 'identifier')); }, /** From 43213eb976f081784077a9f78a26db272663d895 Mon Sep 17 00:00:00 2001 From: Pawel Korczak Date: Thu, 25 Jan 2024 09:48:19 +0100 Subject: [PATCH 3/6] fix: update omit --- views/js/controller/creator/encoders/dom2qti.js | 2 +- views/js/controller/runner/runner.js | 2 +- views/js/test/creator/helpers/scoring/test.js | 8 ++++---- views/js/testRunner/actionBar/button.js | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/views/js/controller/creator/encoders/dom2qti.js b/views/js/controller/creator/encoders/dom2qti.js index 951a391296..1f48ab1969 100644 --- a/views/js/controller/creator/encoders/dom2qti.js +++ b/views/js/controller/creator/encoders/dom2qti.js @@ -63,7 +63,7 @@ define([ * @returns {Array} */ function getAttributes(object) { - return _.omitBy(object, [ + return _.omit(object, [ 'qti-type', 'content', 'xmlBase', diff --git a/views/js/controller/runner/runner.js b/views/js/controller/runner/runner.js index 306a1ded08..c6bf79d645 100644 --- a/views/js/controller/runner/runner.js +++ b/views/js/controller/runner/runner.js @@ -192,7 +192,7 @@ define([ providerLoader(config.providers, context.bundle) .then(function (results) { - const testRunnerConfig = _.omitBy(config, ['providers']); + const testRunnerConfig = _.omit(config, ['providers']); testRunnerConfig.renderTo = $container; if (results.proxy && typeof results.proxy.getAvailableProviders === 'function') { diff --git a/views/js/test/creator/helpers/scoring/test.js b/views/js/test/creator/helpers/scoring/test.js index 80774b549d..94c297b0e1 100644 --- a/views/js/test/creator/helpers/scoring/test.js +++ b/views/js/test/creator/helpers/scoring/test.js @@ -266,8 +266,8 @@ define([ modelOverseer.on('scoring-write', function(writtenModel) { - model = _.omitBy(model, 'scoring'); - writtenModel = _.omitBy(writtenModel, 'scoring'); + model = _.omit(model, 'scoring'); + writtenModel = _.omit(writtenModel, 'scoring'); assert.deepEqual(writtenModel, data.expected, 'The written model is as expected'); assert.deepEqual(model, data.expected, 'The score processing has been set'); @@ -293,8 +293,8 @@ define([ modelOverseer.on('scoring-write', function(writtenModel) { - model = _.omitBy(model, 'scoring'); - writtenModel = _.omitBy(writtenModel, 'scoring'); + model = _.omit(model, 'scoring'); + writtenModel = _.omit(writtenModel, 'scoring'); assert.deepEqual(writtenModel, scoringCustomSample, 'The written model is as expected'); assert.deepEqual(model, scoringCustomSample, 'The score processing has been set'); diff --git a/views/js/testRunner/actionBar/button.js b/views/js/testRunner/actionBar/button.js index 47ad42ffa4..1e325e44c1 100644 --- a/views/js/testRunner/actionBar/button.js +++ b/views/js/testRunner/actionBar/button.js @@ -69,7 +69,7 @@ define([ * @returns {button} */ init : function init(id, config, testContext, testRunner) { - this.config = _.omitBy(config || {}, function(value) { + this.config = _.omit(config || {}, function(value) { return value === undefined || value === null; }); this.config.id = id; From 2e7483a695cf16780475fba4b57f32983340bb56 Mon Sep 17 00:00:00 2001 From: Sergei Mikhailov Date: Thu, 1 Feb 2024 18:05:49 +0100 Subject: [PATCH 4/6] chore: add an explicit dependency on tao-core that is introducing lodash v4 Signed-off-by: Sergei Mikhailov --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 262b08f9b0..6380b9d7ef 100644 --- a/composer.json +++ b/composer.json @@ -64,7 +64,7 @@ "oat-sa/oatbox-extension-installer": "~1.1||dev-master", "qtism/qtism": ">=0.28.3", "oat-sa/generis" : ">=15.22", - "oat-sa/tao-core": ">=53.0.0", + "oat-sa/tao-core": ">=54.0.0", "oat-sa/extension-tao-item" : ">=12.1.0", "oat-sa/extension-tao-itemqti" : ">=30.0.0", "oat-sa/extension-tao-test" : ">=16.0.0", From 07fd63b8cf00f1f37db1be6933c5ca2532be8527 Mon Sep 17 00:00:00 2001 From: Pawel Korczak Date: Fri, 2 Feb 2024 10:56:15 +0100 Subject: [PATCH 5/6] fix: wrong comment --- views/js/testRunner/testMetaData.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/js/testRunner/testMetaData.js b/views/js/testRunner/testMetaData.js index 69d0788522..93f6539b16 100644 --- a/views/js/testRunner/testMetaData.js +++ b/views/js/testRunner/testMetaData.js @@ -44,7 +44,7 @@ * Data for each service call id will be stored in local storage to be able get data * after reloading the page or resuming the test session. * - * To clear all data related to current test_.every_id used clearData method. + * To clear all data related to current test_call_id used clearData method. */ define([ 'lodash' From 3fde131c624146694d64893c39c34a2f3e6fe7bd Mon Sep 17 00:00:00 2001 From: Martin Nicholson Date: Fri, 2 Feb 2024 12:43:09 +0100 Subject: [PATCH 6/6] fix: destructure NamedNodeMap so it can be merged --- views/js/controller/creator/encoders/dom2qti.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/views/js/controller/creator/encoders/dom2qti.js b/views/js/controller/creator/encoders/dom2qti.js index 1f48ab1969..bc2de9c506 100644 --- a/views/js/controller/creator/encoders/dom2qti.js +++ b/views/js/controller/creator/encoders/dom2qti.js @@ -156,13 +156,13 @@ define([ nodeName = normalizeNodeName(elt.nodeName); object = _.merge(qtiElementHelper.create(nodeName, { - 'id': '', - 'class': '', - 'xmlBase': '', - 'lang': '', - 'label': '' - }), - _.transform(elt.attributes, function (acc, value) { + 'id': '', + 'class': '', + 'xmlBase': '', + 'lang': '', + 'label': '' + }), { + ...(_.transform(elt.attributes, function (acc, value) { const attrName = normalizeNodeName(value.nodeName); if (attrName) { if (typedAttributes[nodeName] && typedAttributes[nodeName][attrName]) { @@ -171,7 +171,8 @@ define([ acc[attrName] = value.nodeValue; } } - })); + })) + }); if (elt.childNodes.length > 0) { object.content = self.decode(elt.childNodes); }