Skip to content

Commit

Permalink
Configurable questionnaire config type (#2914)
Browse files Browse the repository at this point in the history
* Change Questionnaire config type from ENUM to STRING
  • Loading branch information
FikriMilano authored Dec 11, 2023
1 parent 8e48e2c commit f8741d6
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -36,7 +35,7 @@ data class QuestionnaireConfig(
val title: String? = null,
val saveButtonText: String? = null,
val planDefinitions: List<String>? = null,
var type: QuestionnaireType = QuestionnaireType.DEFAULT,
var type: String = "DEFAULT",
val resourceIdentifier: String? = null,
val resourceType: ResourceType? = null,
val removeResource: Boolean? = null,
Expand Down Expand Up @@ -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 =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -49,7 +48,7 @@ class QuestionnaireConfigTest : RobolectricTest() {
QuestionnaireConfig(
id = "@{id}",
title = "@{title}",
type = QuestionnaireType.EDIT,
type = "@{type}",
resourceIdentifier = "@{resourceIdentifier}",
confirmationDialog =
ConfirmationDialog(
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -254,7 +256,7 @@ class QuestionnaireActivity : BaseMultiLanguageActivity() {
}

private fun handleBackPress() {
if (questionnaireConfig.type.isReadOnly()) {
if (questionnaireConfig.isReadOnly()) {
finish()
} else if (questionnaireConfig.saveDraft) {
AlertDialogue.showCancelAlert(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -135,9 +137,9 @@ constructor(

val questionnaire =
defaultRepository.loadResource<Questionnaire>(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,
)
}
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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 (
Expand Down Expand Up @@ -379,7 +381,7 @@ constructor(
): MutableMap<ResourceType, MutableList<Resource>> {
val referencedResources = mutableMapOf<ResourceType, MutableList<Resource>>()
if (
questionnaireConfig.type.isEditable() &&
questionnaireConfig.isEditable() &&
!questionnaireConfig.resourceIdentifier.isNullOrEmpty() &&
subjectType != null
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 =
Expand Down Expand Up @@ -958,7 +957,7 @@ class QuestionnaireViewModelTest : RobolectricTest() {
questionnaireConfig.copy(
resourceIdentifier = patient.logicalId,
saveQuestionnaireResponse = false,
type = QuestionnaireType.EDIT,
type = "EDIT",
extractedResourceUniquePropertyExpressions =
listOf(
ExtractedResourceUniquePropertyExpression(
Expand Down

0 comments on commit f8741d6

Please sign in to comment.