Skip to content

Commit 2bfc9bc

Browse files
authored
Merge pull request #3504 from dhis2/ANDROAPP-5919
feat: [ANDROAPP-5919] multiselection on dataset
2 parents b45565d + dc7f2f4 commit 2bfc9bc

File tree

10 files changed

+92
-105
lines changed

10 files changed

+92
-105
lines changed

app/src/main/java/org/dhis2/usescases/datasets/dataSetTable/dataSetSection/DataValueRepository.kt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -612,13 +612,7 @@ class DataValueRepository(
612612
isNumber = dataElement.valueType()!!.isNumeric
613613
}
614614

615-
val options = dataElement.optionSetUid()?.let {
616-
d2.optionModule().options()
617-
.byOptionSetUid().eq(it)
618-
.orderBySortOrder(RepositoryScope.OrderByDirection.ASC)
619-
.blockingGet()
620-
.map { option -> "${option.code()}_${option.displayName()}" }
621-
} ?: emptyList()
615+
val options = getOptionsForOptionSet(dataElement.optionSetUid())
622616

623617
for (
624618
categoryOptionCombo in categorOptionCombos
@@ -1011,7 +1005,7 @@ class DataValueRepository(
10111005
null,
10121006
dataElement.displayDescription(),
10131007
dataElement.uid(),
1014-
emptyList(),
1008+
getOptionsForOptionSet(dataElement.optionSetUid()),
10151009
"android",
10161010
0,
10171011
0,
@@ -1035,4 +1029,12 @@ class DataValueRepository(
10351029
fun getDataSetInfo(): Triple<String, String, String> {
10361030
return Triple(periodId, orgUnitUid, attributeOptionComboUid)
10371031
}
1032+
1033+
private fun getOptionsForOptionSet(optionSetUid: String?) = optionSetUid?.let {
1034+
d2.optionModule().options()
1035+
.byOptionSetUid().eq(it)
1036+
.orderBySortOrder(RepositoryScope.OrderByDirection.ASC)
1037+
.blockingGet()
1038+
.map { option -> "${option.code()}_${option.displayName()}" }
1039+
} ?: emptyList()
10381040
}

app/src/main/java/org/dhis2/usescases/datasets/dataSetTable/dataSetSection/MapFieldValueToUser.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ class MapFieldValueToUser(
4848
field.value()
4949
}
5050
}
51+
ValueType.MULTI_TEXT -> field.value()?.split(", ")?.map { code ->
52+
field.options().find { it.contains(code) }?.split("_")?.get(1)
53+
}?.joinToString(", ")
5154
else -> field.value()
5255
}
5356
}

app/src/main/java/org/dhis2/usescases/datasets/dataSetTable/dataSetSection/TableDataToTableModelMapper.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import org.dhis2.composetable.model.TableHeaderCell
88
import org.dhis2.composetable.model.TableHeaderRow
99
import org.dhis2.composetable.model.TableModel
1010
import org.dhis2.composetable.model.TableRowModel
11+
import org.hisp.dhis.android.core.common.ValueType
1112
import java.util.SortedMap
1213

1314
class TableDataToTableModelMapper(val mapFieldValueToUser: MapFieldValueToUser) {
@@ -50,6 +51,7 @@ class TableDataToTableModelMapper(val mapFieldValueToUser: MapFieldValueToUser)
5051
mandatory = field.mandatory(),
5152
error = field.error(),
5253
warning = field.warning(),
54+
isMultiText = dataElement.valueType() == ValueType.MULTI_TEXT,
5355
)
5456
}.toMap(),
5557
isLastRow = rowIndex == (tableData.rows()!!.size - 1),

app/src/main/java/org/dhis2/utils/customviews/OptionSetCellPopUp.java

Lines changed: 0 additions & 96 deletions
This file was deleted.

compose-table/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,5 @@ dependencies {
5353
debugImplementation(libs.bundles.table.debugImplementation)
5454
testImplementation(libs.bundles.table.test)
5555
androidTestImplementation(libs.bundles.table.androidTest)
56+
implementation(libs.dhis2.mobile.designsystem)
5657
}

compose-table/src/main/java/org/dhis2/composetable/model/TableCell.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ data class TableCell(
1313
val error: String? = null,
1414
val warning: String? = null,
1515
val legendColor: Int? = null,
16+
val isMultiText: Boolean = false,
1617
) {
1718

1819
fun hasErrorOrWarning() = errorOrWarningMessage() != null

compose-table/src/main/java/org/dhis2/composetable/ui/ItemValues.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ fun ItemValues(
2020
overridenValues: Map<Int, TableCell>,
2121
headerExtraSize: Int,
2222
options: List<String>,
23+
headerLabel: String,
2324
) {
2425
Row(
2526
modifier = Modifier
@@ -42,6 +43,7 @@ fun ItemValues(
4243
maxLines = maxLines,
4344
headerExtraSize = headerExtraSize,
4445
options = options,
46+
headerLabel = headerLabel,
4547
)
4648
}
4749
},
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.dhis2.composetable.ui
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.ui.res.stringResource
5+
import org.dhis2.composetable.R
6+
import org.dhis2.composetable.model.TableCell
7+
import org.hisp.dhis.mobile.ui.designsystem.component.CheckBoxData
8+
import org.hisp.dhis.mobile.ui.designsystem.component.MultiSelectBottomSheet
9+
10+
@Composable
11+
fun MultiOptionSelector(
12+
options: List<String>,
13+
cell: TableCell,
14+
title: String,
15+
onSave: (String, String) -> Unit,
16+
onDismiss: () -> Unit,
17+
) {
18+
MultiSelectBottomSheet(
19+
items = options.map { option ->
20+
val code = option.split("_")[0]
21+
val label = option.split("_")[1]
22+
CheckBoxData(
23+
uid = code,
24+
checked = cell.value?.contains(label) == true,
25+
enabled = cell.editable,
26+
textInput = label,
27+
)
28+
},
29+
title = title,
30+
noResultsFoundString = stringResource(R.string.no_results_found),
31+
doneButtonText = stringResource(id = R.string.done),
32+
onItemsSelected = { checkBoxes ->
33+
val checkedCodes = checkBoxes
34+
.filter { item -> item.checked }
35+
.joinToString(", ") { it.uid }
36+
val checkedValues = checkBoxes
37+
.filter { item -> item.checked }
38+
.joinToString(", ") { it.textInput?.text.orEmpty() }
39+
onSave(checkedCodes, checkedValues)
40+
},
41+
onDismiss = onDismiss,
42+
)
43+
}

compose-table/src/main/java/org/dhis2/composetable/ui/TableCell.kt

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,11 @@ fun TableCell(
5858
maxLines: Int,
5959
headerExtraSize: Int,
6060
options: List<String>,
61+
headerLabel: String,
6162
) {
6263
val localInteraction = LocalInteraction.current
6364
val (dropDownExpanded, setExpanded) = remember { mutableStateOf(false) }
65+
val (showMultiSelector, setShowMultiSelector) = remember { mutableStateOf(false) }
6466

6567
var cellValue by remember {
6668
mutableStateOf<String?>(null)
@@ -138,7 +140,10 @@ fun TableCell(
138140
.fillMaxHeight()
139141
.clickable(cell.editable) {
140142
when {
141-
options.isNotEmpty() -> setExpanded(true)
143+
options.isNotEmpty() -> when {
144+
cell.isMultiText -> setShowMultiSelector(true)
145+
else -> setExpanded(true)
146+
}
142147
else -> {
143148
localInteraction.onSelectionChange(
144149
TableSelection.CellSelection(
@@ -195,6 +200,29 @@ fun TableCell(
195200
cellValue = label
196201
},
197202
)
203+
if (showMultiSelector) {
204+
MultiOptionSelector(
205+
options = options,
206+
cell = cell,
207+
title = headerLabel,
208+
onSave = { codes, values ->
209+
localInteraction.onSelectionChange(
210+
TableSelection.CellSelection(
211+
tableId = tableId,
212+
columnIndex = cell.column,
213+
rowIndex = cell.row ?: -1,
214+
globalIndex = 0,
215+
),
216+
)
217+
cellValue = values
218+
localInteraction.onOptionSelected(cell, codes, values)
219+
setShowMultiSelector(false)
220+
},
221+
onDismiss = {
222+
setShowMultiSelector(false)
223+
},
224+
)
225+
}
198226
}
199227

200228
if (cell.mandatory == true) {

compose-table/src/main/java/org/dhis2/composetable/ui/TableItemRow.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ fun TableItemRow(
7474
tableModel.tableHeaderModel.hasTotals,
7575
),
7676
options = rowModel.dropDownOptions ?: emptyList(),
77+
headerLabel = rowModel.rowHeader.title,
7778
)
7879
}
7980
if (!rowModel.isLastRow) {

0 commit comments

Comments
 (0)