Skip to content

Commit

Permalink
[ANDROAPP-5309] Line listing in local analytics (#3516)
Browse files Browse the repository at this point in the history
Signed-off-by: Pablo <[email protected]>
Co-authored-by: manu <[email protected]>
  • Loading branch information
Balcan and mmmateos authored Mar 12, 2024
1 parent df52b72 commit 38f34ad
Show file tree
Hide file tree
Showing 49 changed files with 1,811 additions and 407 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,10 @@ class ChartMatchers {
return when (chartType){
ChartType.LINE_CHART -> view is LineChart
ChartType.BAR_CHART -> view is BarChart
ChartType.TABLE -> view is ComposeView
ChartType.TABLE, ChartType.LINE_LISTING -> view is ComposeView
ChartType.SINGLE_VALUE -> view.findViewById<View>(R.id.singleValueTitle) != null
ChartType.NUTRITION -> view is LineChart
ChartType.RADAR -> view is RadarChart
ChartType.RADAR -> view is RadarChart
ChartType.PIE_CHART -> view is PieChart
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,20 @@ import org.hisp.dhis.android.core.organisationunit.OrganisationUnit

interface IndicatorRepository {
fun fetchData(): Flowable<List<AnalyticsModel>>
fun filterByPeriod(chartModel: ChartModel, selectedPeriods: List<RelativePeriod>) {}
fun filterByPeriod(
chartModel: ChartModel,
selectedPeriods: List<RelativePeriod>,
lineListingColumnId: Int?,
) {
}

fun filterByOrgUnit(
chartModel: ChartModel,
selectedOrgUnits: List<OrganisationUnit>,
filterType: OrgUnitFilterType,
) {}
lineListingColumnId: Int?,
) {
}

fun filterLineListing(chartModel: ChartModel, value: String?) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,23 +32,37 @@ class IndicatorsFragment : FragmentGlobalAbstract(), IndicatorsView {
onRelativePeriodCallback = { chartModel: ChartModel,
relativePeriod: RelativePeriod?,
current: RelativePeriod?,
lineListingColumnId: Int?,
->
relativePeriod?.let {
if (it.isNotCurrent()) {
showAlertDialogCurrentPeriod(chartModel, relativePeriod, current)
showAlertDialogCurrentPeriod(
chartModel,
relativePeriod,
current,
lineListingColumnId,
)
} else {
presenter.filterByPeriod(chartModel, mutableListOf(it))
presenter.filterByPeriod(chartModel, mutableListOf(it), lineListingColumnId)
}
}
}
onOrgUnitCallback =
{ chartModel: ChartModel, orgUnitFilterType: OrgUnitFilterType ->
{ chartModel: ChartModel,
orgUnitFilterType: OrgUnitFilterType,
lineListingColumnId: Int?,
->
when (orgUnitFilterType) {
OrgUnitFilterType.SELECTION -> showOUTreeSelector(chartModel)
OrgUnitFilterType.SELECTION -> showOUTreeSelector(
chartModel,
lineListingColumnId,
)

else -> presenter.filterByOrgUnit(
chartModel,
emptyList(),
orgUnitFilterType,
lineListingColumnId,
)
}
}
Expand All @@ -67,7 +81,7 @@ class IndicatorsFragment : FragmentGlobalAbstract(), IndicatorsView {
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View? {
): View {
binding = DataBindingUtil.inflate(
inflater,
R.layout.fragment_indicators,
Expand All @@ -93,7 +107,7 @@ class IndicatorsFragment : FragmentGlobalAbstract(), IndicatorsView {
adapter.submitList(analytics)
binding.spinner.visibility = View.GONE

if (!analytics.isNullOrEmpty()) {
if (analytics.isNotEmpty()) {
binding.emptyIndicators.visibility = View.GONE
} else {
binding.emptyIndicators.visibility = View.VISIBLE
Expand All @@ -104,34 +118,39 @@ class IndicatorsFragment : FragmentGlobalAbstract(), IndicatorsView {
chartModel: ChartModel,
relativePeriod: RelativePeriod?,
current: RelativePeriod?,
lineListingColumnId: Int?,
) {
val periodList = mutableListOf<RelativePeriod>()
AlertBottomDialog.instance
.setTitle(getString(dhis2.org.R.string.include_this_period_title))
.setMessage(getString(dhis2.org.R.string.include_this_period_body))
.setNegativeButton(getString(dhis2.org.R.string.no)) {
relativePeriod?.let { periodList.add(relativePeriod) }
presenter.filterByPeriod(chartModel, periodList)
presenter.filterByPeriod(chartModel, periodList, lineListingColumnId)
}
.setPositiveButton(getString(dhis2.org.R.string.yes)) {
relativePeriod?.let { periodList.add(relativePeriod) }
current?.let { periodList.add(current) }
presenter.filterByPeriod(chartModel, periodList)
presenter.filterByPeriod(chartModel, periodList, lineListingColumnId)
}
.show(parentFragmentManager, AlertBottomDialog::class.java.simpleName)
}

private fun showOUTreeSelector(chartModel: ChartModel) {
private fun showOUTreeSelector(
chartModel: ChartModel,
lineListingColumnId: Int?,
) {
OUTreeFragment.Builder()
.showAsDialog()
.withPreselectedOrgUnits(
chartModel.graph.orgUnitsSelected.toMutableList(),
chartModel.graph.orgUnitsSelected(lineListingColumnId).toMutableList(),
)
.onSelection { selectedOrgUnits ->
presenter.filterByOrgUnit(
chartModel,
selectedOrgUnits,
OrgUnitFilterType.SELECTION,
lineListingColumnId,
)
}
.build()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,31 +31,49 @@ class IndicatorsPresenter(
fun onDettach() = compositeDisposable.clear()

fun displayMessage(message: String) = view.displayMessage(message)
fun filterByPeriod(chartModel: ChartModel, selectedPeriods: List<RelativePeriod>) {
indicatorRepository.filterByPeriod(chartModel, selectedPeriods)
fun filterByPeriod(
chartModel: ChartModel,
selectedPeriods: List<RelativePeriod>,
lineListingColumnId: Int?,
) {
indicatorRepository.filterByPeriod(chartModel, selectedPeriods, lineListingColumnId)
publishProcessor.onNext(Unit)
}

fun filterByOrgUnit(
chartModel: ChartModel,
selectedPeriods: List<OrganisationUnit>,
filterType: OrgUnitFilterType,
lineListingColumnId: Int?,
) {
indicatorRepository.filterByOrgUnit(chartModel, selectedPeriods, filterType)
indicatorRepository.filterByOrgUnit(
chartModel,
selectedPeriods,
filterType,
lineListingColumnId,
)
publishProcessor.onNext(Unit)
}

fun resetFilter(chartModel: ChartModel, filterType: ChartFilter) {
chartModel.graph.visualizationUid?.let { visualizationUid ->
chartModel.graph.visualizationUid?.let { _ ->
when (filterType) {
ChartFilter.PERIOD -> indicatorRepository.filterByPeriod(
chartModel,
emptyList(),
null,
)

ChartFilter.ORG_UNIT -> indicatorRepository.filterByOrgUnit(
chartModel,
emptyList(),
OrgUnitFilterType.NONE,
null,
)

ChartFilter.COLUMN -> indicatorRepository.filterLineListing(
chartModel,
null,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,19 +60,33 @@ class TrackerAnalyticsRepository(
)
}

override fun filterByPeriod(chartModel: ChartModel, selectedPeriods: List<RelativePeriod>) {
override fun filterByPeriod(
chartModel: ChartModel,
selectedPeriods: List<RelativePeriod>,
lineListingColumnId: Int?,
) {
chartModel.graph.visualizationUid?.let { visualizationUid ->
charts?.setVisualizationPeriods(visualizationUid, selectedPeriods)
charts?.setVisualizationPeriods(visualizationUid, lineListingColumnId, selectedPeriods)
}
}

override fun filterByOrgUnit(
chartModel: ChartModel,
selectedOrgUnits: List<OrganisationUnit>,
filterType: OrgUnitFilterType,
lineListingColumnId: Int?,
) {
chartModel.graph.visualizationUid?.let { visualizationUid ->
charts?.setVisualizationOrgUnits(visualizationUid, selectedOrgUnits, filterType)
charts?.setVisualizationOrgUnits(
visualizationUid,
lineListingColumnId,
selectedOrgUnits,
filterType,
)
}
}

override fun filterLineListing(chartModel: ChartModel, value: String?) {
charts?.setLineListingFilter(chartModel.uid, -1, value)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package org.dhis2.composetable.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material.Divider
Expand All @@ -30,7 +30,7 @@ fun HeaderCell(itemHeaderUiState: ItemColumnHeaderUiState, modifier: Modifier =
Box(
modifier = modifier
.width(with(LocalDensity.current) { itemHeaderUiState.headerMeasures.width.toDp() })
.fillMaxHeight()
.height(with(LocalDensity.current) { itemHeaderUiState.headerMeasures.height.toDp() })
.background(itemHeaderUiState.cellStyle.backgroundColor())
.testTag(itemHeaderUiState.testTag)
.semantics {
Expand All @@ -46,7 +46,8 @@ fun HeaderCell(itemHeaderUiState: ItemColumnHeaderUiState, modifier: Modifier =
) {
Text(
modifier = Modifier
.padding(horizontal = 4.dp, vertical = 11.dp)
.padding(horizontal = 4.dp)
.align(Alignment.Center)
.fillMaxWidth()
.align(Alignment.Center),
color = itemHeaderUiState.cellStyle.mainColor(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ data class TableDimensions(
val defaultCellWidth: Int = 160,
val defaultCellHeight: Dp = 36.dp,
val defaultRowHeaderWidth: Int = 275,
val defaultHeaderHeight: Int = 83,
val defaultHeaderHeight: Int = 36,
val defaultLegendCornerSize: Dp = 2.dp,
val defaultLegendBorderWidth: Dp = 8.dp,
val defaultHeaderTextSize: TextUnit = 12.sp,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ fun TableTheme(
tableDimensions: TableDimensions? = LocalTableDimensions.current,
tableConfiguration: TableConfiguration? = LocalTableConfiguration.current,
tableValidator: Validator? = null,
tableResizeActions: TableResizeActions,
tableResizeActions: TableResizeActions? = null,
content: @Composable
() -> Unit,
) {
Expand All @@ -24,7 +24,7 @@ fun TableTheme(
LocalTableDimensions provides (tableDimensions ?: TableDimensions()),
LocalTableConfiguration provides (tableConfiguration ?: TableConfiguration()),
LocalValidator provides (tableValidator ?: DefaultValidator()),
LocalTableResizeActions provides tableResizeActions,
LocalTableResizeActions provides (tableResizeActions ?: object : TableResizeActions {}),
) {
MaterialTheme(
content = content,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,25 @@ interface Charts {

fun getDataSetVisualizations(groupUid: String?, dataSetUid: String): List<Graph>

fun setVisualizationPeriods(visualizationUid: String, periods: List<RelativePeriod>)
fun setVisualizationPeriods(
visualizationUid: String,
lineListingColumnId: Int?,
periods: List<RelativePeriod>,
)

fun setVisualizationOrgUnits(
visualizationUid: String,
lineListingColumnId: Int?,
orgUnits: List<OrganisationUnit>,
orgUnitFilterType: OrgUnitFilterType,
)

fun setLineListingFilter(
trackerVisualizationUid: String,
columnIndex: Int,
filterValue: String?,
)

interface Provider {
fun get(dependencies: Dependencies): Charts
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,22 @@ interface ChartsRepository {
fun getHomeVisualization(groupUid: String?): List<Graph>
fun getVisualizationGroups(uid: String?): List<AnalyticsDhisVisualizationsGroup>
fun getDataSetVisualization(groupUid: String?, dataSetUid: String): List<Graph>
fun setVisualizationPeriods(visualizationUid: String, periods: List<RelativePeriod>)
fun setVisualizationPeriods(
visualizationUid: String,
lineListingColumnId: Int?,
periods: List<RelativePeriod>,
)

fun setVisualizationOrgUnits(
visualizationUid: String,
lineListingColumnId: Int?,
orgUnits: List<OrganisationUnit>,
orgUnitFilterType: OrgUnitFilterType,
)

fun setLineListingFilter(
trackerVisualizationUid: String,
columnIndex: Int,
filterValue: String?,
)
}
Loading

0 comments on commit 38f34ad

Please sign in to comment.