Skip to content
Snippets Groups Projects
Commit 7c3aa61a authored by rayhanp1402's avatar rayhanp1402
Browse files

feat: Transaction CRUD safety

parent 95720c64
3 merge requests!13Release,!11proper save for gmail,!6Transaction
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application <application
android:name=".ui.transactions.TransactionsApplication" android:name=".ui.transactions.TransactionsApplication"
......
...@@ -6,6 +6,7 @@ import android.view.LayoutInflater ...@@ -6,6 +6,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
import android.widget.Toast
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import com.example.bondoyap.databinding.FragmentAddTransactionsBinding import com.example.bondoyap.databinding.FragmentAddTransactionsBinding
...@@ -52,15 +53,29 @@ class AddTransactionsFragment : Fragment() { ...@@ -52,15 +53,29 @@ class AddTransactionsFragment : Fragment() {
val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()) val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
val currentDate = dateFormat.format(Date()) val currentDate = dateFormat.format(Date())
val judul = if (binding.editTextJudul.text.toString().trim().isNotEmpty()) {
binding.editTextJudul.text.toString()
} else {
"Untitled"
}
val nominal = if (binding.editTextNominal.text.toString().trim().isNotEmpty()) {
binding.editTextNominal.text.toString().toDouble()
} else {
0.0
}
val transaction: Transactions = Transactions( val transaction: Transactions = Transactions(
judul = binding.editTextJudul.text.toString(), judul = judul,
nominal = binding.editTextNominal.text.toString().toDouble(), nominal = nominal,
isPemasukan = isPemasukan, isPemasukan = isPemasukan,
tanggal = currentDate tanggal = currentDate
) )
transactionsViewModel.upsert(transaction) transactionsViewModel.upsert(transaction)
Toast.makeText(requireContext(), "Transaksi berhasil disimpan", Toast.LENGTH_SHORT).show()
binding.editTextJudul.text.clear() binding.editTextJudul.text.clear()
binding.editTextNominal.text.clear() binding.editTextNominal.text.clear()
binding.spinnerKategori.setSelection(0) binding.spinnerKategori.setSelection(0)
......
package com.example.bondoyap.ui.transactions package com.example.bondoyap.ui.transactions
import android.R import android.R
import android.app.AlertDialog
import android.os.Bundle import android.os.Bundle
import android.text.Editable import android.text.Editable
import android.text.Spannable import android.text.Spannable
...@@ -9,6 +10,7 @@ import android.view.LayoutInflater ...@@ -9,6 +10,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
import android.widget.Toast
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
...@@ -57,7 +59,7 @@ class EditTransactionsFragment : Fragment() { ...@@ -57,7 +59,7 @@ class EditTransactionsFragment : Fragment() {
val originalTransaction: Transactions = transactionsViewModel.get(transactionId) val originalTransaction: Transactions = transactionsViewModel.get(transactionId)
binding.editTextJudul.text = SpannableStringBuilder(originalTransaction.judul) binding.editTextJudul.text = SpannableStringBuilder(originalTransaction.judul)
binding.editTextNominal.text = SpannableStringBuilder(originalTransaction.nominal.toString()) binding.editTextNominal.text = SpannableStringBuilder(originalTransaction.nominal.toBigDecimal().toString())
if (originalTransaction.isPemasukan) { if (originalTransaction.isPemasukan) {
binding.spinnerKategori.setSelection(categories.indexOf(pemasukan)) binding.spinnerKategori.setSelection(categories.indexOf(pemasukan))
...@@ -69,29 +71,45 @@ class EditTransactionsFragment : Fragment() { ...@@ -69,29 +71,45 @@ class EditTransactionsFragment : Fragment() {
} }
binding.buttonSimpan.setOnClickListener { binding.buttonUpdate.setOnClickListener {
val isPemasukan: Boolean = when (binding.spinnerKategori.selectedItem.toString()) { val isPemasukan: Boolean = when (binding.spinnerKategori.selectedItem.toString()) {
pemasukan -> true pemasukan -> true
else -> false else -> false
} }
val judul = if (binding.editTextJudul.text.toString().trim().isNotEmpty()) {
binding.editTextJudul.text.toString()
} else {
"Untitled"
}
val nominal = if (binding.editTextNominal.text.toString().trim().isNotEmpty()) {
binding.editTextNominal.text.toString().toDouble()
} else {
0.0
}
val transaction: Transactions = Transactions( val transaction: Transactions = Transactions(
judul = binding.editTextJudul.text.toString(), judul = judul,
nominal = binding.editTextNominal.text.toString().toDouble(), nominal = nominal,
isPemasukan = isPemasukan, isPemasukan = isPemasukan,
tanggal = tanggal, tanggal = tanggal,
id = transactionId id = transactionId
) )
transactionsViewModel.upsert(transaction) showConfirmationDialog("Update", "Apakah Anda yakin ingin memperbarui transaksi ini?") {
transactionsViewModel.upsert(transaction)
binding.editTextJudul.text = SpannableStringBuilder(transaction.judul) binding.editTextJudul.text = SpannableStringBuilder(transaction.judul)
binding.editTextNominal.text = SpannableStringBuilder(transaction.nominal.toString()) binding.editTextNominal.text =
SpannableStringBuilder(transaction.nominal.toBigDecimal().toString())
if (transaction.isPemasukan) { if (transaction.isPemasukan) {
binding.spinnerKategori.setSelection(categories.indexOf(pemasukan)) binding.spinnerKategori.setSelection(categories.indexOf(pemasukan))
} else { } else {
binding.spinnerKategori.setSelection(categories.indexOf(pengeluaran)) binding.spinnerKategori.setSelection(categories.indexOf(pengeluaran))
}
Toast.makeText(requireContext(), "Transaksi berhasil diperbarui", Toast.LENGTH_SHORT).show()
} }
} }
...@@ -104,14 +122,30 @@ class EditTransactionsFragment : Fragment() { ...@@ -104,14 +122,30 @@ class EditTransactionsFragment : Fragment() {
id = transactionId id = transactionId
) )
transactionsViewModel.delete(transaction) showConfirmationDialog("Hapus", "Apakah Anda yakin ingin menghapus transaksi ini?") {
transactionsViewModel.delete(transaction)
findNavController().navigate(com.example.bondoyap.R.id.navigation_transactions) findNavController().navigate(com.example.bondoyap.R.id.navigation_transactions)
Toast.makeText(requireContext(), "Transaksi berhasil dihapus", Toast.LENGTH_SHORT).show()
}
} }
return binding.root return binding.root
} }
private fun showConfirmationDialog(title: String, message: String, action: () -> Unit) {
val builder = AlertDialog.Builder(requireContext())
builder.setTitle(title)
builder.setMessage(message)
builder.setPositiveButton("Ya") { _, _ ->
action.invoke()
}
builder.setNegativeButton("Tidak") { dialog, _ ->
dialog.dismiss()
}
val dialog = builder.create()
dialog.show()
}
override fun onDestroyView() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
_binding = null _binding = null
......
...@@ -35,8 +35,22 @@ class TransactionsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) ...@@ -35,8 +35,22 @@ class TransactionsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
private val transactionDate: TextView = itemView.findViewById(R.id.transactionDate) private val transactionDate: TextView = itemView.findViewById(R.id.transactionDate)
fun bind(transaction: Transactions) { fun bind(transaction: Transactions) {
val amountText = "IDR " + transaction.nominal.toString() val maxAmountLength = 12
transactionTitle.text = transaction.judul val maxTitleLength = 19
val amountText = if (transaction.nominal.toString().length > maxAmountLength) {
"IDR " + transaction.nominal.toBigDecimal().toString().substring(0, maxAmountLength) + "..."
} else {
"IDR " + transaction.nominal.toBigDecimal().toString()
}
val titleText = if (transaction.judul.length > maxTitleLength) {
transaction.judul.substring(0, maxTitleLength) + "..."
} else {
transaction.judul
}
transactionTitle.text = titleText
transactionAmount.text = amountText transactionAmount.text = amountText
transactionCategory.text = when (transaction.isPemasukan) { transactionCategory.text = when (transaction.isPemasukan) {
true -> "Pemasukan" true -> "Pemasukan"
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
android:autofillHints="judul" android:autofillHints="judul"
android:hint="@string/hint_judul" android:hint="@string/hint_judul"
android:inputType="text" android:inputType="text"
android:maxLength="150"
android:layout_marginBottom="16dp" /> android:layout_marginBottom="16dp" />
<TextView <TextView
...@@ -29,6 +30,7 @@ ...@@ -29,6 +30,7 @@
android:autofillHints="nominal" android:autofillHints="nominal"
android:hint="@string/hint_nominal" android:hint="@string/hint_nominal"
android:inputType="numberDecimal" android:inputType="numberDecimal"
android:maxLength="18"
android:layout_marginBottom="16dp" /> android:layout_marginBottom="16dp" />
<TextView <TextView
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
android:autofillHints="judul" android:autofillHints="judul"
android:hint="@string/hint_judul" android:hint="@string/hint_judul"
android:inputType="text" android:inputType="text"
android:maxLength="150"
android:layout_marginBottom="16dp" /> android:layout_marginBottom="16dp" />
<TextView <TextView
...@@ -29,6 +30,7 @@ ...@@ -29,6 +30,7 @@
android:autofillHints="nominal" android:autofillHints="nominal"
android:hint="@string/hint_nominal" android:hint="@string/hint_nominal"
android:inputType="numberDecimal" android:inputType="numberDecimal"
android:maxLength="18"
android:layout_marginBottom="16dp" /> android:layout_marginBottom="16dp" />
<TextView <TextView
...@@ -47,12 +49,12 @@ ...@@ -47,12 +49,12 @@
android:orientation="horizontal"> android:orientation="horizontal">
<Button <Button
android:id="@+id/button_simpan" android:id="@+id/button_update"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:text="@string/button_simpan" /> android:text="@string/button_update" />
<Button <Button
android:id="@+id/button_hapus" android:id="@+id/button_hapus"
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
<string name="textfield_label_lokasi">Lokasi</string> <string name="textfield_label_lokasi">Lokasi</string>
<string name="button_simpan">Simpan</string> <string name="button_simpan">Simpan</string>
<string name="button_hapus">Hapus</string> <string name="button_hapus">Hapus</string>
<string name="button_update">Update</string>
<string name="hint_judul">Enter Judul</string> <string name="hint_judul">Enter Judul</string>
<string name="hint_nominal">Enter Nominal</string> <string name="hint_nominal">Enter Nominal</string>
<string name="hint_kategori">Enter Kategori</string> <string name="hint_kategori">Enter Kategori</string>
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment