isncsci-ui
Version:
Web components package for the ISNCSCI project.
197 lines (189 loc) • 9.02 kB
JavaScript
;
var getNextActiveCell_useCase = require('../../getNextActiveCell.useCase-3565e781.js');
var examData_helper = require('../../examData.helper-43fb7cf8.js');
var core_boundaries_index = require('../boundaries/index.js');
require('../helpers/index.js');
require('../domain/index.js');
const formatFieldName = (fieldName) => {
const specialCases = {
'voluntaryAnalContraction': 'Voluntary Anal Contraction',
'deepAnalPressure': 'Deep Anal Pressure',
'rightLowestNonKeyMuscleWithMotorFunction': 'Right Lowest Non-Key Muscle',
'leftLowestNonKeyMuscleWithMotorFunction': 'Left Lowest Non-Key Muscle',
};
if (specialCases[fieldName]) {
return specialCases[fieldName];
}
let formatted = fieldName;
formatted = formatted
.replace(/-/g, ' ')
.replace(/([a-z])([A-Z])/g, '$1 $2')
// Capitalize first letter of ea word
.replace(/\b\w/g, (char) => char.toUpperCase())
// level indicators
.replace(/\b([CTLS])(\d+)/gi, (match, letter, number) => `${letter.toUpperCase()}${number}`)
// S4_5 or S4-5
.replace(/S(\d+)[_-](\d+)/gi, 'S$1-$2');
return formatted;
};
/*
* This use case is responsible for calculating the totals
* and updating the state of the application
*
* `UNK` values are allowed in the exam data, but they are not valid values in the ISNCSCI library.
* They are converted to `NT` before performing the calculation but not persisted as part of the state.
*
* 1. Get exam data from grid model
* 2. Check for missing values
* 2.1 If missing values are found,
* 2.1.1 add the missing values as calculation errors to the model
* 2.1.2 Update the external listeners so they are informed of the errors
* 2.1.3 Stop
* 3. Validate exam data
* 3.1 If errors are found,
* 3.1.1 add the calculation errors to the model
* 3.1.2 Update the external listeners so they are informed of the errors
* 3.1.3 Stop
* 4. Convert any `UNK` values to `NT` before performing the calculation
* 5. Calculate totals
* 6. Bind totals to exam data
* 7. Mark exam data as complete
* 8. Update state
* 9. Update external listeners
*/
const calculateUseCase = (gridModel, vac, dap, rightLowestNonKeyMuscle, leftLowestNonKeyMuscle, comments, appStoreProvider, examProvider, externalMessageProvider) => getNextActiveCell_useCase.__awaiter(void 0, void 0, void 0, function* () {
// 1. Get exam data from grid model
const { examData, missingValues } = examData_helper.getExamDataFromGridModel(gridModel, vac, dap, rightLowestNonKeyMuscle, leftLowestNonKeyMuscle, comments);
// 2. Check for missing values
if (missingValues.length > 0) {
try {
// 2.1 If missing values are found,
// 2.1.1 add the missing values as calculation errors to the model
const formattedMissingValues = missingValues.map(formatFieldName);
yield appStoreProvider.setCalculationError(`Missing values:\n${formattedMissingValues.join('\n')}`);
// 2.1.2 Update the external listeners so they are informed of the errors
examData.missingValues = missingValues;
yield externalMessageProvider.sendOutExamData(examData);
}
catch (error) {
console.log(error);
}
// 2.1.3 Stop
return;
}
// 3. Validate exam data
const errors = examData_helper.validateExamData(examData);
if (errors.length > 0) {
try {
// 3.1 If errors are found,
// 3.1.1 add the calculation errors
const formattedErrors = errors.map(error => {
// format any field names found in the error message
return error.replace(/\b([a-z]+(?:[A-Z][a-z]*)*(?:[A-Z]\d+)?)\b/gi, (match) => {
if (/[A-Z]/.test(match)) {
return formatFieldName(match);
}
return match;
});
});
yield appStoreProvider.setCalculationError(`The exam contains errors:\n${formattedErrors.join('\n')}`);
// 3.1.2 Update the external listeners so they are informed of the errors
examData.errors = errors;
yield externalMessageProvider.sendOutExamData(examData);
}
catch (error) {
console.log(error);
}
// 3.1.3 Stop
return;
}
// 3. Convert any `UNK` values to `NT` before performing the calculation
const clonedExamData = examData_helper.cloneExamData(examData, true);
try {
// 4. Calculate totals
const totals = yield examProvider.calculate(clonedExamData);
// 5. Bind totals to exam data
Object.keys(totals).forEach((key) => {
examData[key] = totals[key];
});
// 6. Mark exam data as complete
examData.isComplete = true;
// 7. Update state
yield appStoreProvider.setTotals(totals);
// 8. Update external listeners
yield externalMessageProvider.sendOutExamData(examData);
}
catch (error) {
console.log(error);
}
return examData;
});
/*
* 1. Generate an empty exam
* 2. Bind the empty exam to the grid model
* 3. Bind the empty exam to the totals
* 4. Update the state
* 5. Update external listeners
*/
const clearExamUseCase = (appStoreProvider, externalMessageProvider) => getNextActiveCell_useCase.__awaiter(void 0, void 0, void 0, function* () {
const emptyExamData = examData_helper.getEmptyExamData();
const gridModel = examData_helper.bindExamDataToGridModel(emptyExamData);
const totals = examData_helper.bindExamDataToTotals(emptyExamData);
try {
yield appStoreProvider.setActiveCell(null, []);
yield appStoreProvider.setGridModel(gridModel);
yield appStoreProvider.setTotals(totals);
yield appStoreProvider.setVacDap(null, null);
yield appStoreProvider.setExtraInputs(null, null, '', '');
yield externalMessageProvider.sendOutExamData(emptyExamData);
}
catch (error) {
console.log(error);
}
});
/*
* 1. Set the app status to `initializing`.
* 2. Set a blank grid model in the app store provider.
* 3. Set the app status to `ready`.
*/
const initializeAppUseCase = (appStoreProvider) => getNextActiveCell_useCase.__awaiter(void 0, void 0, void 0, function* () {
// 1. Set the app status to `initializing`.
yield appStoreProvider.updateStatus(core_boundaries_index.StatusCodes.Initializing);
// 2. Set a blank grid model in the app store provider.
yield appStoreProvider.setGridModel(examData_helper.bindExamDataToGridModel(examData_helper.getEmptyExamData()));
// 3. Set the app status to `ready`.
yield appStoreProvider.updateStatus(core_boundaries_index.StatusCodes.Ready);
});
const loadExternalExamDataUseCase = (appStoreProvider, examData) => getNextActiveCell_useCase.__awaiter(void 0, void 0, void 0, function* () {
//Sun: Dont validate the input, error will only be shown after calculation
// EE: We do not validate anymore as we do not want to trigger the alert box when loading an external exam
// We, however, still need to clear the error in case a previous exam with error was loaded.
// // 1. Validate exam data
// const errors = validateExamData(examData);
yield appStoreProvider.setCalculationError('');
// 2. Bind exam data to a new grid model
const gridModel = examData_helper.bindExamDataToGridModel(examData);
// 3. Bind exam data to the totals
const totals = examData_helper.bindExamDataToTotals(examData);
// 4. Update state
yield appStoreProvider.setActiveCell(null, []);
yield appStoreProvider.setGridModel(gridModel);
yield appStoreProvider.setTotals(totals);
yield appStoreProvider.setVacDap(examData.voluntaryAnalContraction, examData.deepAnalPressure);
yield appStoreProvider.setExtraInputs(examData.rightLowestNonKeyMuscleWithMotorFunction, examData.leftLowestNonKeyMuscleWithMotorFunction, examData.comments || '', examData.cellComments || '');
});
const setReadonlyUseCase = (readonly, appStoreProvider) => {
appStoreProvider.setReadonly(readonly);
};
exports.getNextActiveCellUseCase = getNextActiveCell_useCase.getNextActiveCellUseCase;
exports.setActiveCellUseCase = getNextActiveCell_useCase.setActiveCellUseCase;
exports.setCellsValueUseCase = getNextActiveCell_useCase.setCellsValueUseCase;
exports.setExtraInputsUseCase = getNextActiveCell_useCase.setExtraInputsUseCase;
exports.setStarDetailsUseCase = getNextActiveCell_useCase.setStarDetailsUseCase;
exports.setVacDapUseCase = getNextActiveCell_useCase.setVacDapUseCase;
exports.calculateUseCase = calculateUseCase;
exports.clearExamUseCase = clearExamUseCase;
exports.initializeAppUseCase = initializeAppUseCase;
exports.loadExternalExamDataUseCase = loadExternalExamDataUseCase;
exports.setReadonlyUseCase = setReadonlyUseCase;
//# sourceMappingURL=index.js.map