Verbessere Techniker-Verwaltung

master
Niko Diamadis 3 years ago
parent 6fb7c4058e
commit aa7dd38d06
Signed by: niko
GPG Key ID: 9BD0B5E338D1936D

@ -64,7 +64,6 @@ dependencies {
implementation "androidx.navigation:navigation-ui-ktx:$navigation_version" implementation "androidx.navigation:navigation-ui-ktx:$navigation_version"
implementation 'androidx.recyclerview:recyclerview:1.3.1' implementation 'androidx.recyclerview:recyclerview:1.3.1'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
implementation 'com.afollestad.material-dialogs:bottomsheets:3.3.0'
implementation 'com.airbnb.android:lottie:5.2.0' implementation 'com.airbnb.android:lottie:5.2.0'
implementation 'com.amitshekhar.android:android-networking:1.0.2' implementation 'com.amitshekhar.android:android-networking:1.0.2'
implementation 'com.github.GrenderG:Toasty:1.5.2' implementation 'com.github.GrenderG:Toasty:1.5.2'

@ -12,6 +12,9 @@ internal class Member : ParseObject() {
val name val name
get() = getString(COLUMN_NAME)!! get() = getString(COLUMN_NAME)!!
val retired
get() = getBoolean(COLUMN_RETIRED)
fun setAdmin(admin: Boolean) { fun setAdmin(admin: Boolean) {
put(COLUMN_ADMIN, admin) put(COLUMN_ADMIN, admin)
} }
@ -20,10 +23,28 @@ internal class Member : ParseObject() {
put(COLUMN_NAME, name) put(COLUMN_NAME, name)
} }
private fun setRetired(retired: Boolean) {
put(COLUMN_RETIRED, retired)
}
fun retire() { fun retire() {
put(COLUMN_RETIRED, true) put(COLUMN_RETIRED, true)
} }
override fun equals(other: Any?): Boolean {
if (other !is Member) return false
return this.name == other.name && this.admin == other.admin && this.retired == other.retired
}
fun copy(): Member {
val member = Member()
member.objectId = objectId
member.setAdmin(admin)
member.setName(name)
member.setRetired(retired)
return member
}
companion object { companion object {
const val CLASS_NAME = "Techniker" const val CLASS_NAME = "Techniker"

@ -7,20 +7,13 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.afollestad.materialdialogs.LayoutMode
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet
import com.afollestad.materialdialogs.callbacks.onDismiss
import com.afollestad.materialdialogs.customview.customView
import com.cyb3rko.techniklogger.R import com.cyb3rko.techniklogger.R
import com.cyb3rko.techniklogger.data.objects.Member
import com.cyb3rko.techniklogger.data.ParseController import com.cyb3rko.techniklogger.data.ParseController
import com.cyb3rko.techniklogger.databinding.FragmentManageMembersBinding import com.cyb3rko.techniklogger.databinding.FragmentManageMembersBinding
import com.cyb3rko.techniklogger.logE import com.cyb3rko.techniklogger.logE
import com.cyb3rko.techniklogger.modals.MemberBottomSheet
import com.cyb3rko.techniklogger.showErrorToast import com.cyb3rko.techniklogger.showErrorToast
import com.cyb3rko.techniklogger.showSuccessToast import com.cyb3rko.techniklogger.showSuccessToast
import com.google.android.material.switchmaterial.SwitchMaterial
import com.google.android.material.textfield.TextInputEditText
class ManageMembersFragment : Fragment() { class ManageMembersFragment : Fragment() {
private var _binding: FragmentManageMembersBinding? = null private var _binding: FragmentManageMembersBinding? = null
@ -42,31 +35,19 @@ class ManageMembersFragment : Fragment() {
loadMembers() loadMembers()
binding.fab.setOnClickListener { binding.fab.setOnClickListener {
MaterialDialog(myContext, BottomSheet(LayoutMode.WRAP_CONTENT)).show { MemberBottomSheet { member ->
title(text = "Techniker hinzufügen") member?.saveInBackground { exception ->
customView(R.layout.member_dialog, horizontalPadding = true) if (exception == null) {
positiveButton(text = "Hinzufügen") { showSuccessToast("Hinzugefügt")
val view = it.view showAnimation(true)
val newName = view.findViewById<TextInputEditText>(R.id.name).text.toString() loadMembers()
val newAdmin = view.findViewById<SwitchMaterial>(R.id.admin).isChecked } else {
showErrorToast("Fehler beim Hinzufügen")
Member().apply { logE("Fehler beim Hinzufügen des Technikers")
setAdmin(newAdmin) exception.printStackTrace()
setName(newName)
saveInBackground {
if (it == null) {
showSuccessToast("Hinzugefügt")
showAnimation(true)
loadMembers()
} else {
showErrorToast("Fehler beim Hinzufügen")
logE("Fehler beim Hinzufügen des Technikers")
it.printStackTrace()
}
}
} }
} }
} }.show(parentFragmentManager, MemberBottomSheet.TAG)
} }
binding.swipeRefreshLayout.apply { binding.swipeRefreshLayout.apply {
@ -101,65 +82,27 @@ class ManageMembersFragment : Fragment() {
showAnimation(false) showAnimation(false)
binding.list.setOnItemClickListener { _, _, index, _ -> binding.list.setOnItemClickListener { _, _, index, _ ->
val dialogView = layoutInflater.inflate(R.layout.member_dialog, null) val member = members[index]
dialogView.findViewById<TextInputEditText>(R.id.name).setText(memberNames[index]) MemberBottomSheet(members[index]) { editedMember ->
dialogView.findViewById<SwitchMaterial>(R.id.admin).isChecked = members[index].admin if (editedMember == null) {
MaterialDialog(myContext, BottomSheet(LayoutMode.WRAP_CONTENT)).show { showAnimation(true)
title(text = "Techniker-Info") loadMembers()
customView(0, dialogView, horizontalPadding = true) return@MemberBottomSheet
onDismiss { }
val view = it.view if (editedMember != member) {
val newName = view.findViewById<TextInputEditText>(R.id.name).text.toString() editedMember.saveInBackground {
val newAdmin = view.findViewById<SwitchMaterial>(R.id.admin).isChecked if (it == null) {
val member = members[index] showSuccessToast("Gespeichert")
showAnimation(true)
val adminChanged = newAdmin != member.admin loadMembers()
val nameChanged = newName != member.name } else {
if (adminChanged || nameChanged) { showErrorToast("Fehler bei der Speicherung")
member.apply { logE("Fehler bei der Speicherung des neuen Technikers")
setAdmin(newAdmin) it.printStackTrace()
setName(newName)
saveInBackground {
if (it == null) {
showSuccessToast("Gespeichert")
if (nameChanged) {
showAnimation(true)
loadMembers()
}
} else {
showErrorToast("Fehler bei der Speicherung")
logE("Fehler bei der Speicherung des neuen Technikers")
it.printStackTrace()
}
}
} }
} }
} }
negativeButton(text = "Entlassen") { }.show(parentFragmentManager, MemberBottomSheet.TAG)
val name = memberNames[index]
MaterialDialog(myContext).show {
title(text = "Entlassung")
message(text = "Soll '$name' wirklich entlassen werden?")
positiveButton(text = "Ja") {
members[index].apply {
retire()
saveInBackground {
if (it == null) {
showSuccessToast("Techniker entlassen")
showAnimation(true)
loadMembers()
} else {
showErrorToast("Fehler bei der Entlassung")
logE("Fehler bei der Entlassung des Technikers")
it.printStackTrace()
}
}
}
}
negativeButton(text = "Nein")
}
}
}
} }
} else { } else {
showAnimation(true, false) showAnimation(true, false)

@ -0,0 +1,94 @@
package com.cyb3rko.techniklogger.modals
import android.content.DialogInterface
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.cyb3rko.techniklogger.data.objects.Member
import com.cyb3rko.techniklogger.databinding.MemberDialogBinding
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.google.android.material.dialog.MaterialAlertDialogBuilder
internal class MemberBottomSheet(
private val member: Member? = null,
private val action: (member: Member?) -> Unit
): BottomSheetDialogFragment() {
private lateinit var binding: MemberDialogBinding
private var mode = -1
private lateinit var mMember: Member
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = MemberDialogBinding.inflate(layoutInflater)
if (member == null) {
mode = MODE_ADD
} else {
mMember = member.copy()
binding.name.setText(mMember.name)
binding.admin.isChecked = mMember.admin
mode = MODE_EDIT
}
if (mode == MODE_ADD) {
binding.title.text = "Techniker hinzufügen"
binding.button.text = "Hinzufügen"
} else {
binding.title.text = "Techniker-Info"
binding.button.text = "Entlassen"
}
binding.button.setOnClickListener {
val newName = binding.name.text.toString()
val newAdmin = binding.admin.isChecked
if (mode == MODE_ADD) {
Member().apply {
setAdmin(newAdmin)
setName(newName)
action(this)
dismiss()
}
} else {
MaterialAlertDialogBuilder(requireContext())
.setTitle("Entlassung")
.setMessage("Soll '${mMember.name}' wirklich entlassen werden?")
.setPositiveButton("Ja") { _ , _ ->
mMember.apply {
retire()
action(this)
dismiss()
}
}
.setNegativeButton("Nein", null)
.show()
}
}
return binding.root
}
override fun onDismiss(dialog: DialogInterface) {
if (mode == MODE_EDIT && ::binding.isInitialized) {
val newName = binding.name.text.toString()
val newAdmin = binding.admin.isChecked
val adminChanged = newAdmin != mMember.admin
val nameChanged = newName != mMember.name
if (adminChanged || nameChanged) {
mMember.apply {
setAdmin(newAdmin)
setName(newName)
action(this)
}
}
}
}
companion object {
const val TAG = "Member Bottom Sheet"
const val MODE_ADD = 0
const val MODE_EDIT = 1
}
}

@ -4,9 +4,9 @@
android:id="@+id/md_input" android:id="@+id/md_input"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingStart="@dimen/md_dialog_frame_margin_horizontal" android:paddingStart="16dp"
android:paddingEnd="@dimen/md_dialog_frame_margin_horizontal" android:paddingEnd="16dp"
android:paddingTop="@dimen/md_dialog_frame_margin_vertical"> android:paddingTop="16dp">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/md_input_text" android:id="@+id/md_input_text"

@ -3,10 +3,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
android:paddingTop="@dimen/md_dialog_frame_margin_vertical" android:padding="16dp">
android:paddingLeft="@dimen/md_dialog_frame_margin_horizontal"
android:paddingRight="@dimen/md_dialog_frame_margin_horizontal"
android:paddingBottom="@dimen/md_dialog_frame_margin_vertical">
<com.google.android.material.progressindicator.CircularProgressIndicator <com.google.android.material.progressindicator.CircularProgressIndicator
android:layout_width="wrap_content" android:layout_width="wrap_content"

@ -5,11 +5,20 @@
android:orientation="vertical" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingBottom="35dp"> android:padding="16dp">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Techniker hinzufügen"
android:textStyle="bold"
android:textSize="24sp" />
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="12dp"
app:helperTextEnabled="true"> app:helperTextEnabled="true">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
@ -38,4 +47,12 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5dp" /> android:layout_marginTop="5dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginTop="12dp"
tools:text="Hinzufügen" />
</LinearLayout> </LinearLayout>
Loading…
Cancel
Save