Skip to content

Commit 5786295

Browse files
authored
Merge pull request #3919 from dhis2/optionset_fix
fix: [ANDROAPP-6653] options not hiding/showing with program rules
2 parents 3a43b54 + ba3b8cd commit 5786295

File tree

3 files changed

+76
-10
lines changed

3 files changed

+76
-10
lines changed

form/src/main/java/org/dhis2/form/data/FormRepositoryImpl.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class FormRepositoryImpl(
4848
private var runDataIntegrity: Boolean = false
4949
private var calculationLoop: Int = 0
5050
private var backupList: List<FieldUiModel> = emptyList()
51+
private val fieldsWithOptionEffects = mutableListOf<FieldUiModel>()
5152

5253
private val disableCollapsableSections: Boolean? =
5354
dataEntryRepository.disableCollapsableSections()
@@ -522,9 +523,22 @@ class FormRepositoryImpl(
522523
}
523524
}
524525

526+
fieldsWithOptionEffects.forEach { field ->
527+
field.optionSet?.let { optionSetUid ->
528+
fetchOptions(field.uid, optionSetUid)
529+
}
530+
}
531+
532+
fieldsWithOptionEffects.clear()
533+
525534
ruleEffectsResult?.fieldsWithOptionEffects()?.forEach { fieldWithOptionEffect ->
526-
itemList.find { it.uid == fieldWithOptionEffect }?.let {
527-
it.optionSet?.let { optionSetUid -> fetchOptions(it.uid, optionSetUid) }
535+
val item = itemList.find { it.uid == fieldWithOptionEffect }
536+
537+
item?.let { field ->
538+
field.optionSet?.let { optionSetUid ->
539+
fetchOptions(field.uid, optionSetUid)
540+
}
541+
fieldsWithOptionEffects.add(field)
528542
}
529543
}
530544

form/src/main/java/org/dhis2/form/data/metadata/FormBaseConfiguration.kt

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,28 @@ open class FormBaseConfiguration(private val d2: D2) {
4141
.getPagingData(10)
4242
}.map { pagingData ->
4343
pagingData.filter { option ->
44-
!optionsToHide.contains(option.uid()) &&
45-
!optionGroupsToHide.contains(option.uid()) &&
46-
(
47-
optionGroupsToShow.isEmpty() ||
48-
optionGroupsToShow.contains(option.uid())
49-
)
44+
45+
val optionInGroupToHide = d2.optionModule().optionGroups()
46+
.withOptions()
47+
.byUid().`in`(optionGroupsToHide)
48+
.blockingGet().any { optionGroup ->
49+
optionGroup.options()?.map { it.uid() }?.contains(option.uid()) == true
50+
}
51+
52+
val optionInGroupToShow = d2.optionModule().optionGroups()
53+
.withOptions()
54+
.byUid().`in`(optionGroupsToShow)
55+
.blockingGet().any { optionGroup ->
56+
optionGroup.options()?.map { it.uid() }?.contains(option.uid()) == true
57+
}
58+
59+
val hideOption = if (optionGroupsToShow.isEmpty()) {
60+
optionsToHide.contains(option.uid()) || optionInGroupToHide
61+
} else {
62+
!optionInGroupToShow
63+
}
64+
65+
!hideOption
5066
}
5167
}
5268
}

form/src/test/java/org/dhis2/form/data/FormRepositoryImplTest.kt

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@ package org.dhis2.form.data
22

33
import androidx.databinding.ObservableField
44
import io.reactivex.Flowable
5+
import kotlinx.coroutines.flow.MutableStateFlow
6+
import kotlinx.coroutines.flow.emptyFlow
57
import org.dhis2.commons.prefs.PreferenceProvider
68
import org.dhis2.form.model.ActionType
79
import org.dhis2.form.model.EventCategory
810
import org.dhis2.form.model.FieldUiModel
911
import org.dhis2.form.model.FieldUiModelImpl
12+
import org.dhis2.form.model.OptionSetConfiguration
1013
import org.dhis2.form.model.RowAction
1114
import org.dhis2.form.model.SectionUiModelImpl
1215
import org.dhis2.form.model.StoreResult
@@ -30,6 +33,7 @@ import org.junit.Before
3033
import org.junit.Test
3134
import org.mockito.kotlin.any
3235
import org.mockito.kotlin.anyOrNull
36+
import org.mockito.kotlin.atLeast
3337
import org.mockito.kotlin.doReturn
3438
import org.mockito.kotlin.doReturnConsecutively
3539
import org.mockito.kotlin.mock
@@ -200,6 +204,14 @@ class FormRepositoryImplTest {
200204
mutableMapOf(Pair("field", "uid001")),
201205
),
202206
),
207+
RuleEffect(
208+
"rule2",
209+
RuleAction(
210+
"option1",
211+
ProgramRuleActionType.HIDEOPTION.name,
212+
mutableMapOf(Pair("field", "uid004")),
213+
),
214+
),
203215
)
204216

205217
whenever(dataEntryRepository.isEvent()) doReturn true
@@ -215,12 +227,21 @@ class FormRepositoryImplTest {
215227
fieldsToUpdate = listOf(FieldWithNewValue("uid001", "newValue")),
216228
configurationErrors = emptyList(),
217229
stagesToHide = emptyList(),
218-
optionsToHide = emptyMap(),
230+
optionsToHide = mapOf(
231+
"uid004" to listOf("option1"),
232+
),
219233
optionGroupsToHide = emptyMap(),
220234
optionGroupsToShow = emptyMap(),
221235
)
222236

223-
verify(rulesUtilsProvider, times(1)).applyRuleEffects(
237+
whenever(dataEntryRepository.options(any(), any(), any(), any()))doReturn Pair(
238+
MutableStateFlow(""),
239+
emptyFlow(),
240+
)
241+
242+
repository.composeList()
243+
244+
verify(rulesUtilsProvider, atLeast(1)).applyRuleEffects(
224245
any(),
225246
any(),
226247
any(),
@@ -441,6 +462,21 @@ class FormRepositoryImplTest {
441462
optionSetConfiguration = null,
442463
autocompleteList = null,
443464
),
465+
FieldUiModelImpl(
466+
uid = "uid004",
467+
value = null,
468+
label = "field4",
469+
valueType = ValueType.TEXT,
470+
programStageSection = "section1",
471+
uiEventFactory = null,
472+
optionSet = "optionSetUid",
473+
optionSetConfiguration = OptionSetConfiguration(
474+
MutableStateFlow(""),
475+
{},
476+
emptyFlow(),
477+
),
478+
autocompleteList = null,
479+
),
444480
)
445481

446482
private fun section1() = SectionUiModelImpl(

0 commit comments

Comments
 (0)