diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/QuestionnaireConfig.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/QuestionnaireConfig.kt index f4af386ad3..fca0178609 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/QuestionnaireConfig.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/configuration/QuestionnaireConfig.kt @@ -23,7 +23,6 @@ import org.hl7.fhir.r4.model.ResourceType import org.smartregister.fhircore.engine.configuration.event.EventWorkflow import org.smartregister.fhircore.engine.domain.model.ActionConfig import org.smartregister.fhircore.engine.domain.model.ActionParameter -import org.smartregister.fhircore.engine.domain.model.QuestionnaireType import org.smartregister.fhircore.engine.domain.model.RuleConfig import org.smartregister.fhircore.engine.domain.model.SnackBarMessageConfig import org.smartregister.fhircore.engine.util.extension.extractLogicalIdUuid @@ -36,7 +35,7 @@ data class QuestionnaireConfig( val title: String? = null, val saveButtonText: String? = null, val planDefinitions: List? = null, - var type: QuestionnaireType = QuestionnaireType.DEFAULT, + var type: String = "DEFAULT", val resourceIdentifier: String? = null, val resourceType: ResourceType? = null, val removeResource: Boolean? = null, @@ -66,6 +65,7 @@ data class QuestionnaireConfig( id = id.interpolate(computedValuesMap).extractLogicalIdUuid(), taskId = taskId?.interpolate(computedValuesMap), title = title?.interpolate(computedValuesMap), + type = type.interpolate(computedValuesMap), resourceIdentifier = resourceIdentifier?.interpolate(computedValuesMap)?.extractLogicalIdUuid(), groupResource = diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/QuestionnaireType.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/QuestionnaireType.kt index 62ad2e4b4f..709a118746 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/QuestionnaireType.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/domain/model/QuestionnaireType.kt @@ -16,15 +16,19 @@ package org.smartregister.fhircore.engine.domain.model +import org.smartregister.fhircore.engine.configuration.QuestionnaireConfig + enum class QuestionnaireType { DEFAULT, EDIT, READ_ONLY, - ; +} - fun isDefault() = this == DEFAULT +fun QuestionnaireConfig.isDefault() = + QuestionnaireType.valueOf(this.type) == QuestionnaireType.DEFAULT - fun isEditable() = this == EDIT +fun QuestionnaireConfig.isEditable() = + QuestionnaireType.valueOf(this.type) == QuestionnaireType.EDIT - fun isReadOnly() = this == READ_ONLY -} +fun QuestionnaireConfig.isReadOnly() = + QuestionnaireType.valueOf(this.type) == QuestionnaireType.READ_ONLY diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/QuestionnaireConfigTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/QuestionnaireConfigTest.kt index abf8b039b9..d40ecc1efb 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/QuestionnaireConfigTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/configuration/QuestionnaireConfigTest.kt @@ -21,7 +21,6 @@ import org.hl7.fhir.r4.model.ResourceType import org.junit.Assert import org.junit.Test import org.smartregister.fhircore.engine.configuration.event.EventWorkflow -import org.smartregister.fhircore.engine.domain.model.QuestionnaireType import org.smartregister.fhircore.engine.robolectric.RobolectricTest @HiltAndroidTest @@ -49,7 +48,7 @@ class QuestionnaireConfigTest : RobolectricTest() { QuestionnaireConfig( id = "@{id}", title = "@{title}", - type = QuestionnaireType.EDIT, + type = "@{type}", resourceIdentifier = "@{resourceIdentifier}", confirmationDialog = ConfirmationDialog( @@ -85,6 +84,7 @@ class QuestionnaireConfigTest : RobolectricTest() { "planDef1" to "97c5f33b-389c-4ecb-abd3-46c5a3ac4026", "linkId1" to "1", "linkId2" to "2", + "type" to "EDIT", ) val interpolatedConfig = questionnaireConfig.interpolate(map) @@ -103,6 +103,7 @@ class QuestionnaireConfigTest : RobolectricTest() { ) Assert.assertEquals("1", interpolatedConfig.readOnlyLinkIds!![0]) Assert.assertEquals("2", interpolatedConfig.readOnlyLinkIds!![1]) + Assert.assertEquals("EDIT", interpolatedConfig.type) } @Test diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/QuestionnaireTypeTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/QuestionnaireTypeTest.kt index 47d620b228..d84ba25c9c 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/QuestionnaireTypeTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/domain/model/QuestionnaireTypeTest.kt @@ -18,27 +18,28 @@ package org.smartregister.fhircore.engine.domain.model import org.junit.Assert import org.junit.Test +import org.smartregister.fhircore.engine.configuration.QuestionnaireConfig class QuestionnaireTypeTest { @Test fun testDefault() { - Assert.assertTrue(QuestionnaireType.DEFAULT.isDefault()) - Assert.assertFalse(QuestionnaireType.EDIT.isDefault()) - Assert.assertFalse(QuestionnaireType.READ_ONLY.isDefault()) + Assert.assertTrue(QuestionnaireConfig("id", type = "DEFAULT").isDefault()) + Assert.assertFalse(QuestionnaireConfig("id", type = "EDIT").isDefault()) + Assert.assertFalse(QuestionnaireConfig("id", type = "READ_ONLY").isDefault()) } @Test fun testEdit() { - Assert.assertFalse(QuestionnaireType.DEFAULT.isEditable()) - Assert.assertTrue(QuestionnaireType.EDIT.isEditable()) - Assert.assertFalse(QuestionnaireType.READ_ONLY.isEditable()) + Assert.assertFalse(QuestionnaireConfig("id", type = "DEFAULT").isEditable()) + Assert.assertTrue(QuestionnaireConfig("id", type = "EDIT").isEditable()) + Assert.assertFalse(QuestionnaireConfig("id", type = "READ_ONLY").isEditable()) } @Test fun testReadOnly() { - Assert.assertFalse(QuestionnaireType.DEFAULT.isReadOnly()) - Assert.assertFalse(QuestionnaireType.EDIT.isReadOnly()) - Assert.assertTrue(QuestionnaireType.READ_ONLY.isReadOnly()) + Assert.assertFalse(QuestionnaireConfig("id", type = "DEFAULT").isReadOnly()) + Assert.assertFalse(QuestionnaireConfig("id", type = "EDIT").isReadOnly()) + Assert.assertTrue(QuestionnaireConfig("id", type = "READ_ONLY").isReadOnly()) } } diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireActivity.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireActivity.kt index 0831bf6692..32d958cea6 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireActivity.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireActivity.kt @@ -40,6 +40,8 @@ import org.hl7.fhir.r4.model.ResourceType import org.smartregister.fhircore.engine.configuration.QuestionnaireConfig import org.smartregister.fhircore.engine.domain.model.ActionParameter import org.smartregister.fhircore.engine.domain.model.ActionParameterType +import org.smartregister.fhircore.engine.domain.model.isEditable +import org.smartregister.fhircore.engine.domain.model.isReadOnly import org.smartregister.fhircore.engine.ui.base.AlertDialogue import org.smartregister.fhircore.engine.ui.base.BaseMultiLanguageActivity import org.smartregister.fhircore.engine.util.extension.encodeResourceToString @@ -191,7 +193,7 @@ class QuestionnaireActivity : BaseMultiLanguageActivity() { } // Populate questionnaire with latest QuestionnaireResponse - if (questionnaireConfig.type.isEditable()) { + if (questionnaireConfig.isEditable()) { val latestQuestionnaireResponse = viewModel.searchLatestQuestionnaireResponse( resourceId = resourceIdentifier, @@ -222,7 +224,7 @@ class QuestionnaireActivity : BaseMultiLanguageActivity() { val questionnaireResponse = retrieveQuestionnaireResponse() // Close questionnaire if opened in read only mode or if experimental - if (questionnaireConfig.type.isReadOnly() || questionnaire?.experimental == true) { + if (questionnaireConfig.isReadOnly() || questionnaire?.experimental == true) { finish() } if (questionnaireResponse != null && questionnaire != null) { @@ -254,7 +256,7 @@ class QuestionnaireActivity : BaseMultiLanguageActivity() { } private fun handleBackPress() { - if (questionnaireConfig.type.isReadOnly()) { + if (questionnaireConfig.isReadOnly()) { finish() } else if (questionnaireConfig.saveDraft) { AlertDialogue.showCancelAlert( diff --git a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModel.kt b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModel.kt index 4533f2d7c2..c085058176 100644 --- a/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModel.kt +++ b/android/quest/src/main/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModel.kt @@ -57,6 +57,8 @@ import org.smartregister.fhircore.engine.configuration.QuestionnaireConfig import org.smartregister.fhircore.engine.data.local.DefaultRepository import org.smartregister.fhircore.engine.domain.model.ActionParameter import org.smartregister.fhircore.engine.domain.model.ActionParameterType +import org.smartregister.fhircore.engine.domain.model.isEditable +import org.smartregister.fhircore.engine.domain.model.isReadOnly import org.smartregister.fhircore.engine.rulesengine.ResourceDataRulesExecutor import org.smartregister.fhircore.engine.task.FhirCarePlanGenerator import org.smartregister.fhircore.engine.util.DispatcherProvider @@ -135,9 +137,9 @@ constructor( val questionnaire = defaultRepository.loadResource(questionnaireConfig.id)?.apply { - if (questionnaireConfig.type.isReadOnly() || questionnaireConfig.type.isEditable()) { + if (questionnaireConfig.isReadOnly() || questionnaireConfig.isEditable()) { item.prepareQuestionsForReadingOrEditing( - readOnly = questionnaireConfig.type.isReadOnly(), + readOnly = questionnaireConfig.isReadOnly(), readOnlyLinkIds = questionnaireConfig.readOnlyLinkIds, ) } @@ -227,7 +229,7 @@ constructor( val subject = loadResource(ResourceType.valueOf(subjectIdType.resourceType), subjectIdType.idPart) - if (subject != null && !questionnaireConfig.type.isReadOnly()) { + if (subject != null && !questionnaireConfig.isReadOnly()) { val newBundle = bundle.copyBundle(currentQuestionnaireResponse) generateCarePlan( @@ -306,7 +308,7 @@ constructor( ) { currentQuestionnaireResponse.subject = this.logicalId.asReference(subjectType) } - if (questionnaireConfig.type.isEditable()) { + if (questionnaireConfig.isEditable()) { if (resourceType == subjectType) { this.id = currentQuestionnaireResponse.subject.extractId() } else if ( @@ -379,7 +381,7 @@ constructor( ): MutableMap> { val referencedResources = mutableMapOf>() if ( - questionnaireConfig.type.isEditable() && + questionnaireConfig.isEditable() && !questionnaireConfig.resourceIdentifier.isNullOrEmpty() && subjectType != null ) { diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireActivityTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireActivityTest.kt index 2843845c99..ddb4ad0a6f 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireActivityTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireActivityTest.kt @@ -50,7 +50,6 @@ import org.robolectric.shadows.ShadowToast import org.smartregister.fhircore.engine.configuration.QuestionnaireConfig import org.smartregister.fhircore.engine.domain.model.ActionParameter import org.smartregister.fhircore.engine.domain.model.ActionParameterType -import org.smartregister.fhircore.engine.domain.model.QuestionnaireType import org.smartregister.fhircore.engine.domain.model.RuleConfig import org.smartregister.fhircore.engine.util.extension.decodeResourceFromString import org.smartregister.fhircore.quest.R @@ -77,7 +76,7 @@ class QuestionnaireActivityTest : RobolectricTest() { QuestionnaireConfig( id = "754", // Same as ID in sample_patient_registration.json title = "Patient registration", - type = QuestionnaireType.DEFAULT, + type = "DEFAULT", extraParams = listOf( ActionParameter( diff --git a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModelTest.kt b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModelTest.kt index 1e3a710e6d..31a317605a 100644 --- a/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModelTest.kt +++ b/android/quest/src/test/java/org/smartregister/fhircore/quest/ui/questionnaire/QuestionnaireViewModelTest.kt @@ -77,7 +77,6 @@ import org.smartregister.fhircore.engine.configuration.app.ConfigService import org.smartregister.fhircore.engine.data.local.DefaultRepository import org.smartregister.fhircore.engine.domain.model.ActionParameter import org.smartregister.fhircore.engine.domain.model.ActionParameterType -import org.smartregister.fhircore.engine.domain.model.QuestionnaireType import org.smartregister.fhircore.engine.domain.model.RuleConfig import org.smartregister.fhircore.engine.rulesengine.ConfigRulesExecutor import org.smartregister.fhircore.engine.rulesengine.ResourceDataRulesExecutor @@ -167,7 +166,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { QuestionnaireConfig( id = "754", // Same as ID in sample_patient_registration.json title = "Patient registration", - type = QuestionnaireType.DEFAULT, + type = "DEFAULT", ) questionnaireViewModel = @@ -958,7 +957,7 @@ class QuestionnaireViewModelTest : RobolectricTest() { questionnaireConfig.copy( resourceIdentifier = patient.logicalId, saveQuestionnaireResponse = false, - type = QuestionnaireType.EDIT, + type = "EDIT", extractedResourceUniquePropertyExpressions = listOf( ExtractedResourceUniquePropertyExpression(