diff --git a/app/src/main/java/net/pokeranalytics/android/model/StatRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/model/StatRepresentable.kt new file mode 100644 index 00000000..0ac311ab --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/model/StatRepresentable.kt @@ -0,0 +1,18 @@ +package net.pokeranalytics.android.model + +import net.pokeranalytics.android.calculus.ComputedStat +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType + + +class StatRepresentable(stat: ComputedStat) : RowRepresentable { + + var computedStat: ComputedStat = stat + + override val viewType: Int + get() = RowViewType.STAT.ordinal + + override val resId: Int? + get() = this.computedStat.stat.resId + +} diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 3831dfb9..510561e1 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -214,7 +214,7 @@ open class Session : RealmObject(), SessionInterface, Savable, /** * Delete the object from realm - * TODO: Cascade delete? + * @TODO: Cascade delete? */ fun delete() { realm.executeTransaction { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/datasource/StatsDataSource.kt b/app/src/main/java/net/pokeranalytics/android/ui/datasource/StatsDataSource.kt deleted file mode 100644 index 0f931df3..00000000 --- a/app/src/main/java/net/pokeranalytics/android/ui/datasource/StatsDataSource.kt +++ /dev/null @@ -1,37 +0,0 @@ -package net.pokeranalytics.android.ui.datasource - -import net.pokeranalytics.android.calculus.ComputedResults -import net.pokeranalytics.android.calculus.ComputedStat -import net.pokeranalytics.android.ui.view.RowRepresentable -import net.pokeranalytics.android.ui.view.RowViewType - - -class StatRepresentable(stat: ComputedStat) : RowRepresentable { - - var computedStat: ComputedStat = stat - - override val viewType: Int - get() = RowViewType.STAT.ordinal - - override val resId: Int? - get() = this.computedStat.stat.resId - -} - -class StatsDataSource(results: List) { - - var results: List = results - var rows: List = listOf() - - init { - - } - - fun numberOfRows(): Int { - return 0 -// return this.results.fold(0) { acc, computedResults -> -// return acc + computedResults.numberOfStats() -// } - } - -} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt index 4b79d865..183c05e8 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/StatsFragment.kt @@ -12,11 +12,11 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.SessionGroup +import net.pokeranalytics.android.model.StatRepresentable import net.pokeranalytics.android.model.extensions.SessionType import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource -import net.pokeranalytics.android.ui.datasource.StatRepresentable import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.view.HeaderRowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable @@ -64,7 +64,7 @@ class StatsFragment : PokerAnalyticsFragment(), RowRepresentableDataSource { val format = stat.computedStat.format() return format.text } - return "nope" + return "shouldn't happen :)" } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt index dba824a8..d4fce7e6 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt @@ -1,10 +1,7 @@ package net.pokeranalytics.android.ui.view import android.content.Context -import net.pokeranalytics.android.R import net.pokeranalytics.android.model.LiveData -import net.pokeranalytics.android.model.extensions.SessionState -import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType /** @@ -76,7 +73,6 @@ interface Displayable : Localizable { return false } - val headerValues: ArrayList get() { return ArrayList() @@ -112,263 +108,5 @@ class HeaderRowRepresentable( } -enum class SessionRow : RowRepresentable { - - PRIZE, - CASHED_OUT, - INITIAL_BUY_IN, - BUY_IN, - POSITION, - PLAYERS, - TIPS, - - GAME, - BLINDS, - LOCATION, - BANKROLL, - TABLE_SIZE, - TOURNAMENT_TYPE, - START_DATE, - END_DATE, - - BREAK_TIME, - COMMENT; - - companion object { - /** - * Return the rows to display for the current session state - */ - fun getRows(type: Int, sessionState: SessionState): ArrayList { - when (type) { - Session.TYPE_TOURNAMENT -> { - return when (sessionState) { - SessionState.PENDING -> { - arrayListOf( - GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE, - START_DATE, END_DATE - ) - } - SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { - arrayListOf( - PRIZE, BUY_IN, POSITION, PLAYERS, TIPS, - GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE, - START_DATE, END_DATE, BREAK_TIME, COMMENT - ) - } - else -> arrayListOf() - } - } - Session.TYPE_GAME -> { - return when (sessionState) { - SessionState.PENDING -> { - arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE) - } - SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { - arrayListOf( - CASHED_OUT, BUY_IN, TIPS, - GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT - ) - } - else -> arrayListOf() - } - } - } - return arrayListOf() - } - } - - override val needSeparator: Boolean - get() { - return when (this) { - SessionRow.TIPS -> true - else -> false - } - } - - override val resId: Int? - get() { - return when (this) { - PRIZE -> R.string.prize - POSITION -> R.string.position - PLAYERS -> R.string.players - CASHED_OUT -> R.string.cashed_out - INITIAL_BUY_IN -> R.string.initial_stack - BUY_IN -> R.string.buyin - TIPS -> R.string.tips - GAME -> R.string.game - BLINDS -> R.string.blinds - LOCATION -> R.string.location - BANKROLL -> R.string.bankroll - TABLE_SIZE -> R.string.table_size - TOURNAMENT_TYPE -> R.string.tournament_type - START_DATE -> R.string.start_date - END_DATE -> R.string.end_date - BREAK_TIME -> R.string.break_time - COMMENT -> R.string.comment - } - } - - override val viewType: Int - get() { - return when (this) { - PRIZE, POSITION, PLAYERS, CASHED_OUT, INITIAL_BUY_IN, BUY_IN, TIPS, - GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT, - TOURNAMENT_TYPE, START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal - } - } - - override val bottomSheetType: BottomSheetType - get() { - return when (this) { - CASHED_OUT, INITIAL_BUY_IN, BREAK_TIME, POSITION, PLAYERS, PRIZE -> BottomSheetType.EDIT_TEXT - BUY_IN, TIPS -> BottomSheetType.SUM - BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT - GAME -> BottomSheetType.LIST_GAME - LOCATION, BANKROLL, TOURNAMENT_TYPE -> BottomSheetType.LIST - TABLE_SIZE -> BottomSheetType.GRID - COMMENT -> BottomSheetType.EDIT_TEXT - else -> BottomSheetType.NONE - } - } - - override var displayHeader: Boolean = false - override var headerValues: ArrayList = ArrayList() -} - -enum class SimpleRow : RowRepresentable { - NAME; - - override val resId: Int? = R.string.name - override val viewType: Int = RowViewType.TITLE_VALUE.ordinal - override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT - override var displayHeader: Boolean = false - override var headerValues: ArrayList = ArrayList() -} - -enum class BankrollRow : RowRepresentable { - LIVE; - - override val resId: Int? - get() { - return when (this) { - LIVE -> R.string.live - } - } - - override val viewType: Int - get() { - return when (this) { - LIVE -> RowViewType.TITLE_SWITCH.ordinal - } - } - - override val bottomSheetType: BottomSheetType - get() { - return when (this) { - LIVE -> BottomSheetType.NONE - } - } - - override var displayHeader: Boolean = false - override var headerValues: ArrayList = ArrayList() -} -enum class GameRow : RowRepresentable { - SHORT_NAME; - override val resId: Int? - get() { - return when (this) { - SHORT_NAME -> R.string.short_name - } - } - - override val viewType: Int - get() { - return when (this) { - SHORT_NAME -> RowViewType.TITLE_VALUE.ordinal - } - } - - override val bottomSheetType: BottomSheetType - get() { - return when (this) { - SHORT_NAME -> BottomSheetType.EDIT_TEXT - } - } - - override var displayHeader: Boolean = false - override var headerValues: ArrayList = ArrayList() -} - -enum class LocationRow : RowRepresentable { - LOCATION_STATUS; - - override val resId: Int? - get() { - return when (this) { - LOCATION_STATUS -> R.string.short_name - } - } - - override val viewType: Int - get() { - return when (this) { - LOCATION_STATUS -> RowViewType.TITLE.ordinal - } - } - - override val bottomSheetType: BottomSheetType - get() { - return when (this) { - LOCATION_STATUS -> BottomSheetType.NONE - } - } - - override var displayHeader: Boolean = false - override var headerValues: ArrayList = ArrayList() -} - -enum class TransactionTypeRow : RowRepresentable { -} - -enum class TournamentFeatureRow : RowRepresentable { -} - -enum class SettingRow : RowRepresentable { - GDPR, - BANKROLL, - GAME, - LOCATION, - TOURNAMENT_FEATURE, - TRANSACTION_TYPE; - - override val resId: Int? - get() { - this.relatedResultsRepresentable?.let { - return it.resId - } ?: run { - return when (this) { - GDPR -> R.string.gdpr - else -> null - } - } - } - - override val viewType: Int = RowViewType.TITLE.ordinal - - override val relatedResultsRepresentable: LiveData? - get() { - return when (this) { - BANKROLL -> LiveData.BANKROLL - GAME -> LiveData.GAME - LOCATION -> LiveData.LOCATION - TOURNAMENT_FEATURE -> LiveData.TOURNAMENT_FEATURE - TRANSACTION_TYPE -> LiveData.TRANSACTION_TYPE - else -> null - } - } - - override var displayHeader: Boolean = false - override var headerValues: ArrayList = ArrayList() -} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/BankrollRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/BankrollRow.kt new file mode 100644 index 00000000..5a60d65a --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/BankrollRow.kt @@ -0,0 +1,35 @@ +package net.pokeranalytics.android.ui.view.rowrepresentable + +import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType + + +enum class BankrollRow : RowRepresentable { + LIVE; + + override val resId: Int? + get() { + return when (this) { + LIVE -> R.string.live + } + } + + override val viewType: Int + get() { + return when (this) { + LIVE -> RowViewType.TITLE_SWITCH.ordinal + } + } + + override val bottomSheetType: BottomSheetType + get() { + return when (this) { + LIVE -> BottomSheetType.NONE + } + } + + override var displayHeader: Boolean = false + override var headerValues: ArrayList = ArrayList() +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GameRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GameRow.kt new file mode 100644 index 00000000..68e70018 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/GameRow.kt @@ -0,0 +1,34 @@ +package net.pokeranalytics.android.ui.view.rowrepresentable + +import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType + +enum class GameRow : RowRepresentable { + SHORT_NAME; + + override val resId: Int? + get() { + return when (this) { + SHORT_NAME -> R.string.short_name + } + } + + override val viewType: Int + get() { + return when (this) { + SHORT_NAME -> RowViewType.TITLE_VALUE.ordinal + } + } + + override val bottomSheetType: BottomSheetType + get() { + return when (this) { + SHORT_NAME -> BottomSheetType.EDIT_TEXT + } + } + + override var displayHeader: Boolean = false + override var headerValues: ArrayList = ArrayList() +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt new file mode 100644 index 00000000..2651073c --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/LocationRow.kt @@ -0,0 +1,35 @@ +package net.pokeranalytics.android.ui.view.rowrepresentable + +import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType + + +enum class LocationRow : RowRepresentable { + LOCATION_STATUS; + + override val resId: Int? + get() { + return when (this) { + LOCATION_STATUS -> R.string.short_name + } + } + + override val viewType: Int + get() { + return when (this) { + LOCATION_STATUS -> RowViewType.TITLE.ordinal + } + } + + override val bottomSheetType: BottomSheetType + get() { + return when (this) { + LOCATION_STATUS -> BottomSheetType.NONE + } + } + + override var displayHeader: Boolean = false + override var headerValues: ArrayList = ArrayList() +} diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt new file mode 100644 index 00000000..12c645f5 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SessionRow.kt @@ -0,0 +1,132 @@ +package net.pokeranalytics.android.ui.view.rowrepresentable + +import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.extensions.SessionState +import net.pokeranalytics.android.model.realm.Session +import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType + + +enum class SessionRow : RowRepresentable { + + PRIZE, + CASHED_OUT, + INITIAL_BUY_IN, + BUY_IN, + POSITION, + PLAYERS, + TIPS, + + GAME, + BLINDS, + LOCATION, + BANKROLL, + TABLE_SIZE, + TOURNAMENT_TYPE, + START_DATE, + END_DATE, + + BREAK_TIME, + COMMENT; + + companion object { + /** + * Return the rows to display for the current session state + */ + fun getRows(type: Int, sessionState: SessionState): ArrayList { + when (type) { + Session.TYPE_TOURNAMENT -> { + return when (sessionState) { + SessionState.PENDING -> { + arrayListOf( + GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE, + START_DATE, END_DATE + ) + } + SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { + arrayListOf( + PRIZE, BUY_IN, POSITION, PLAYERS, TIPS, + GAME, INITIAL_BUY_IN, LOCATION, BANKROLL, TABLE_SIZE, TOURNAMENT_TYPE, + START_DATE, END_DATE, BREAK_TIME, COMMENT + ) + } + else -> arrayListOf() + } + } + Session.TYPE_GAME -> { + return when (sessionState) { + SessionState.PENDING -> { + arrayListOf(GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE) + } + SessionState.STARTED, SessionState.PAUSED, SessionState.FINISHED -> { + arrayListOf( + CASHED_OUT, BUY_IN, TIPS, + GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, START_DATE, END_DATE, BREAK_TIME, COMMENT + ) + } + else -> arrayListOf() + } + } + } + return arrayListOf() + } + } + + override val needSeparator: Boolean + get() { + return when (this) { + SessionRow.TIPS -> true + else -> false + } + } + + override val resId: Int? + get() { + return when (this) { + PRIZE -> R.string.prize + POSITION -> R.string.position + PLAYERS -> R.string.players + CASHED_OUT -> R.string.cashed_out + INITIAL_BUY_IN -> R.string.initial_stack + BUY_IN -> R.string.buyin + TIPS -> R.string.tips + GAME -> R.string.game + BLINDS -> R.string.blinds + LOCATION -> R.string.location + BANKROLL -> R.string.bankroll + TABLE_SIZE -> R.string.table_size + TOURNAMENT_TYPE -> R.string.tournament_type + START_DATE -> R.string.start_date + END_DATE -> R.string.end_date + BREAK_TIME -> R.string.break_time + COMMENT -> R.string.comment + } + } + + override val viewType: Int + get() { + return when (this) { + PRIZE, POSITION, PLAYERS, CASHED_OUT, INITIAL_BUY_IN, BUY_IN, TIPS, + GAME, BLINDS, LOCATION, BANKROLL, TABLE_SIZE, COMMENT, + TOURNAMENT_TYPE, START_DATE, END_DATE, BREAK_TIME -> RowViewType.TITLE_VALUE.ordinal + } + } + + override val bottomSheetType: BottomSheetType + get() { + return when (this) { + CASHED_OUT, INITIAL_BUY_IN, BREAK_TIME, POSITION, PLAYERS, PRIZE -> BottomSheetType.EDIT_TEXT + BUY_IN, TIPS -> BottomSheetType.SUM + BLINDS -> BottomSheetType.DOUBLE_EDIT_TEXT + GAME -> BottomSheetType.LIST_GAME + LOCATION, BANKROLL, TOURNAMENT_TYPE -> BottomSheetType.LIST + TABLE_SIZE -> BottomSheetType.GRID + COMMENT -> BottomSheetType.EDIT_TEXT + else -> BottomSheetType.NONE + } + } + + override var displayHeader: Boolean = false + override var headerValues: ArrayList = ArrayList() +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt new file mode 100644 index 00000000..1d286a6a --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SettingRow.kt @@ -0,0 +1,45 @@ +package net.pokeranalytics.android.ui.view.rowrepresentable + +import net.pokeranalytics.android.R +import net.pokeranalytics.android.model.LiveData +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType + + +enum class SettingRow : RowRepresentable { + GDPR, + BANKROLL, + GAME, + LOCATION, + TOURNAMENT_FEATURE, + TRANSACTION_TYPE; + + override val resId: Int? + get() { + this.relatedResultsRepresentable?.let { + return it.resId + } ?: run { + return when (this) { + GDPR -> R.string.gdpr + else -> null + } + } + } + + override val viewType: Int = RowViewType.TITLE.ordinal + + override val relatedResultsRepresentable: LiveData? + get() { + return when (this) { + BANKROLL -> LiveData.BANKROLL + GAME -> LiveData.GAME + LOCATION -> LiveData.LOCATION + TOURNAMENT_FEATURE -> LiveData.TOURNAMENT_FEATURE + TRANSACTION_TYPE -> LiveData.TRANSACTION_TYPE + else -> null + } + } + + override var displayHeader: Boolean = false + override var headerValues: ArrayList = ArrayList() +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SimpleRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SimpleRow.kt new file mode 100644 index 00000000..fcdf9b6a --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SimpleRow.kt @@ -0,0 +1,17 @@ +package net.pokeranalytics.android.ui.view.rowrepresentable + +import net.pokeranalytics.android.R +import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType +import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowViewType + + +enum class SimpleRow : RowRepresentable { + NAME; + + override val resId: Int? = R.string.name + override val viewType: Int = RowViewType.TITLE_VALUE.ordinal + override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT + override var displayHeader: Boolean = false + override var headerValues: ArrayList = ArrayList() +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TournamentFeatureRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TournamentFeatureRow.kt new file mode 100644 index 00000000..62d2dcfc --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TournamentFeatureRow.kt @@ -0,0 +1,7 @@ +package net.pokeranalytics.android.ui.view.rowrepresentable + +import net.pokeranalytics.android.ui.view.RowRepresentable + + +enum class TournamentFeatureRow : RowRepresentable { +} diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TransactionTypeRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TransactionTypeRow.kt new file mode 100644 index 00000000..d1826f7a --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/TransactionTypeRow.kt @@ -0,0 +1,7 @@ +package net.pokeranalytics.android.ui.view.rowrepresentable + +import net.pokeranalytics.android.ui.view.RowRepresentable + + +enum class TransactionTypeRow : RowRepresentable { +}