- Dialog on exit when add/edit shift

- menu buttons only on main fragment
 - title of fragment correct
This commit is contained in:
2023-09-08 21:05:19 +01:00
parent d7f818c5fb
commit 688cea6a29
7 changed files with 136 additions and 61 deletions

View File

@@ -0,0 +1,46 @@
package com.appttude.h_mal.farmr.base
import android.text.Editable
import android.text.TextWatcher
import android.view.ViewGroup
import android.widget.EditText
import androidx.annotation.LayoutRes
import androidx.core.view.children
open class FormFragment<V : BaseViewModel>(@LayoutRes contentLayoutId: Int) : BaseFragment<V>(contentLayoutId) {
private val initialFormData = mutableMapOf<Int, String>()
private val formData = mutableMapOf<Int, String>()
fun applyFormListener(view: ViewGroup) {
view.children.forEach {
if (it is EditText) {
initialFormData[it.id] = it.text.trim().toString()
setDataInMap(it.id, it.text.trim().toString())
it.addCustomTextWatch()
} else if (it is ViewGroup) {
applyFormListener(it)
}
}
}
fun didFormChange(): Boolean {
return !(initialFormData.all { (k, v) ->
formData[k] == v
})
}
private fun EditText.addCustomTextWatch() {
addTextChangedListener(object : TextWatcher{
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { }
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
setDataInMap(id, p0.toString())
}
override fun afterTextChanged(p0: Editable?) { }
})
}
private fun setDataInMap(id: Int, text: String) {
formData[id] = text
}
}

View File

@@ -33,7 +33,6 @@ class FilterDataFragment : BaseFragment<FilterViewModel>(R.layout.fragment_filte
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setTitle(getString(R.string.title_activity_filter_data))
LocationET = view.findViewById(R.id.filterLocationEditText) LocationET = view.findViewById(R.id.filterLocationEditText)
dateFromET = view.findViewById(R.id.fromdateInEditText) dateFromET = view.findViewById(R.id.fromdateInEditText)
@@ -75,6 +74,16 @@ class FilterDataFragment : BaseFragment<FilterViewModel>(R.layout.fragment_filte
submit.setOnClickListener(this) submit.setOnClickListener(this)
} }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(false)
}
override fun onResume() {
super.onResume()
setTitle(getString(R.string.title_activity_filter_data))
}
override fun onItemSelected( override fun onItemSelected(
parentView: AdapterView<*>?, parentView: AdapterView<*>?,
selectedItemView: View?, selectedItemView: View?,

View File

@@ -2,6 +2,7 @@ package com.appttude.h_mal.farmr.ui
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.Button import android.widget.Button
import android.widget.EditText import android.widget.EditText
import android.widget.LinearLayout import android.widget.LinearLayout
@@ -12,7 +13,7 @@ import android.widget.TextView
import androidx.core.widget.doAfterTextChanged import androidx.core.widget.doAfterTextChanged
import com.appttude.h_mal.farmr.R import com.appttude.h_mal.farmr.R
import com.appttude.h_mal.farmr.base.BackPressedListener import com.appttude.h_mal.farmr.base.BackPressedListener
import com.appttude.h_mal.farmr.base.BaseFragment import com.appttude.h_mal.farmr.base.FormFragment
import com.appttude.h_mal.farmr.model.ShiftType import com.appttude.h_mal.farmr.model.ShiftType
import com.appttude.h_mal.farmr.model.Success import com.appttude.h_mal.farmr.model.Success
import com.appttude.h_mal.farmr.utils.ID import com.appttude.h_mal.farmr.utils.ID
@@ -28,7 +29,7 @@ import com.appttude.h_mal.farmr.utils.show
import com.appttude.h_mal.farmr.utils.validateField import com.appttude.h_mal.farmr.utils.validateField
import com.appttude.h_mal.farmr.viewmodel.SubmissionViewModel import com.appttude.h_mal.farmr.viewmodel.SubmissionViewModel
class FragmentAddItem : BaseFragment<SubmissionViewModel>(R.layout.fragment_add_item), class FragmentAddItem : FormFragment<SubmissionViewModel>(R.layout.fragment_add_item),
RadioGroup.OnCheckedChangeListener, BackPressedListener { RadioGroup.OnCheckedChangeListener, BackPressedListener {
private lateinit var mHourlyRadioButton: RadioButton private lateinit var mHourlyRadioButton: RadioButton
@@ -117,61 +118,69 @@ class FragmentAddItem : BaseFragment<SubmissionViewModel>(R.layout.fragment_add_
setupViewAfterViewCreated() setupViewAfterViewCreated()
} }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(false)
}
override fun onResume() {
super.onResume()
val title = when (arguments?.containsKey(ID)) {
true -> getString(R.string.edit_item_title)
else -> getString(R.string.add_item_title)
}
setTitle(title)
}
private fun setupViewAfterViewCreated() { private fun setupViewAfterViewCreated() {
id = arguments?.getLong(ID) id = arguments?.getLong(ID)
wholeView.hide() wholeView.hide()
val title = when (arguments?.containsKey(ID)) { if (arguments?.containsKey(ID) == true) {
true -> { // Since we are editing a shift lets load the shift data into the views
// Since we are editing a shift lets load the shift data into the views viewModel.getCurrentShift(arguments!!.getLong(ID))?.run {
viewModel.getCurrentShift(arguments!!.getLong(ID))?.run { mLocationEditText.setText(description)
mLocationEditText.setText(description) mDateEditText.setText(date)
mDateEditText.setText(date)
// Set types // Set types
mType = ShiftType.getEnumByType(type) mType = ShiftType.getEnumByType(type)
mDescription = description mDescription = description
mDate = date mDate = date
mPayRate = rateOfPay mPayRate = rateOfPay
when (ShiftType.getEnumByType(type)) { when (ShiftType.getEnumByType(type)) {
ShiftType.HOURLY -> { ShiftType.HOURLY -> {
mHourlyRadioButton.isChecked = true mHourlyRadioButton.isChecked = true
mPieceRadioButton.isChecked = false mPieceRadioButton.isChecked = false
mTimeInEditText.setText(timeIn) mTimeInEditText.setText(timeIn)
mTimeOutEditText.setText(timeOut) mTimeOutEditText.setText(timeOut)
mBreakEditText.setText(breakMins.toString()) mBreakEditText.setText(breakMins.toString())
val durationText = "${duration.formatToTwoDpString()} Hours" val durationText = "${duration.formatToTwoDpString()} Hours"
mDurationTextView.text = durationText mDurationTextView.text = durationText
// Set fields // Set fields
mTimeIn = timeIn mTimeIn = timeIn
mTimeOut = timeOut mTimeOut = timeOut
mBreaks = breakMins mBreaks = breakMins
}
ShiftType.PIECE -> {
mHourlyRadioButton.isChecked = false
mPieceRadioButton.isChecked = true
mUnitEditText.setText(units.formatToTwoDpString())
// Set piece rate units
mUnits = units
}
} }
mPayRateEditText.setText(rateOfPay.formatAsCurrencyString())
mTotalPayTextView.text = totalPay.formatAsCurrencyString()
calculateTotalPay() ShiftType.PIECE -> {
mHourlyRadioButton.isChecked = false
mPieceRadioButton.isChecked = true
mUnitEditText.setText(units.formatToTwoDpString())
// Set piece rate units
mUnits = units
}
} }
mPayRateEditText.setText(rateOfPay.formatAsCurrencyString())
mTotalPayTextView.text = totalPay.formatAsCurrencyString()
// Return title calculateTotalPay()
getString(R.string.edit_item_title)
} }
else -> getString(R.string.add_item_title)
} }
setTitle(title)
applyFormListener(view = view as ViewGroup)
} }
override fun onCheckedChanged(radioGroup: RadioGroup, id: Int) { override fun onCheckedChanged(radioGroup: RadioGroup, id: Int) {
@@ -264,6 +273,7 @@ class FragmentAddItem : BaseFragment<SubmissionViewModel>(R.layout.fragment_add_
StringBuilder().append(mDuration).append(" hours").toString() StringBuilder().append(mDuration).append(" hours").toString()
mDuration!! * mPayRate mDuration!! * mPayRate
} }
ShiftType.PIECE -> { ShiftType.PIECE -> {
(mUnits ?: 0f) * mPayRate (mUnits ?: 0f) * mPayRate
} }
@@ -273,9 +283,7 @@ class FragmentAddItem : BaseFragment<SubmissionViewModel>(R.layout.fragment_add_
} }
override fun onBackPressed(): Boolean { override fun onBackPressed(): Boolean {
if (mRadioGroup.checkedRadioButtonId == -1) { if (didFormChange()) {
mActivity?.popBackStack()
} else {
requireContext().createDialog( requireContext().createDialog(
title = "Discard Changes?", title = "Discard Changes?",
message = "Are you sure you want to discard changes?", message = "Are you sure you want to discard changes?",
@@ -284,6 +292,8 @@ class FragmentAddItem : BaseFragment<SubmissionViewModel>(R.layout.fragment_add_
mActivity?.popBackStack() mActivity?.popBackStack()
} }
) )
} else {
mActivity?.popBackStack()
} }
return true return true
} }

View File

@@ -3,6 +3,8 @@ package com.appttude.h_mal.farmr.ui
import android.app.AlertDialog import android.app.AlertDialog
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
@@ -33,11 +35,15 @@ class FragmentMain : BaseFragment<MainViewModel>(R.layout.fragment_main), BackPr
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setTitle("Shift List")
// Inflate the layout for this fragment // Inflate the layout for this fragment
setHasOptionsMenu(true) setHasOptionsMenu(true)
} }
override fun onResume() {
super.onResume()
setTitle("Shift List")
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@@ -59,6 +65,11 @@ class FragmentMain : BaseFragment<MainViewModel>(R.layout.fragment_main), BackPr
viewModel.refreshLiveData() viewModel.refreshLiveData()
} }
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
// Inflate the menu; this adds items to the action bar if it is present.
inflater.inflate(R.menu.menu_main, menu)
}
override fun onSuccess(data: Any?) { override fun onSuccess(data: Any?) {
super.onSuccess(data) super.onSuccess(data)
if (data is List<*>) { if (data is List<*>) {

View File

@@ -35,7 +35,6 @@ class FurtherInfoFragment : BaseFragment<InfoViewModel>(R.layout.fragment_futher
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setTitle(getString(R.string.further_info_title))
progressBarFI = view.findViewById(R.id.progressBar_info) progressBarFI = view.findViewById(R.id.progressBar_info)
wholeView = view.findViewById(R.id.further_info_view) wholeView = view.findViewById(R.id.further_info_view)
@@ -59,6 +58,16 @@ class FurtherInfoFragment : BaseFragment<InfoViewModel>(R.layout.fragment_futher
viewModel.retrieveData(arguments) viewModel.retrieveData(arguments)
} }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(false)
}
override fun onResume() {
super.onResume()
setTitle(getString(R.string.further_info_title))
}
override fun onSuccess(data: Any?) { override fun onSuccess(data: Any?) {
super.onSuccess(data) super.onSuccess(data)
if (data is ShiftObject) data.setupView() if (data is ShiftObject) data.setupView()

View File

@@ -1,12 +1,7 @@
package com.appttude.h_mal.farmr.ui package com.appttude.h_mal.farmr.ui
import android.Manifest
import android.app.Activity
import android.content.pm.PackageManager
import android.os.Bundle import android.os.Bundle
import android.view.Menu
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.core.app.ActivityCompat
import com.appttude.h_mal.farmr.R import com.appttude.h_mal.farmr.R
import com.appttude.h_mal.farmr.base.BackPressedListener import com.appttude.h_mal.farmr.base.BackPressedListener
import com.appttude.h_mal.farmr.base.BaseActivity import com.appttude.h_mal.farmr.base.BaseActivity
@@ -25,12 +20,6 @@ class MainActivity : BaseActivity() {
fragmentTransaction.replace(R.id.container, FragmentMain()).addToBackStack("main").commit() fragmentTransaction.replace(R.id.container, FragmentMain()).addToBackStack("main").commit()
} }
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
override fun onBackPressed() { override fun onBackPressed() {
val currentFragment = supportFragmentManager.findFragmentById(R.id.container) val currentFragment = supportFragmentManager.findFragmentById(R.id.container)
if (currentFragment is BackPressedListener) { if (currentFragment is BackPressedListener) {

View File

@@ -284,6 +284,7 @@ class SubmissionViewModel(
description = description, description = description,
date = date, date = date,
units = units!!, units = units!!,
rateOfPay = rateOfPay, rateOfPay = rateOfPay,
) )
} }