diff --git a/app/build.gradle b/app/build.gradle index fea2827..30d3cc7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,6 +68,7 @@ dependencies { implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' implementation 'androidx.recyclerview:recyclerview:1.2.1' implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" + implementation 'com.afollestad.material-dialogs:bottomsheets:3.3.0' implementation 'com.afollestad.material-dialogs:input:3.3.0' implementation 'com.airbnb.android:lottie:3.7.0' implementation 'com.amitshekhar.android:android-networking:1.0.2' diff --git a/app/src/main/java/com/cyb3rko/techniklogger/fragments/ListingFragment.kt b/app/src/main/java/com/cyb3rko/techniklogger/fragments/ListingFragment.kt index 549d734..bce28fd 100644 --- a/app/src/main/java/com/cyb3rko/techniklogger/fragments/ListingFragment.kt +++ b/app/src/main/java/com/cyb3rko/techniklogger/fragments/ListingFragment.kt @@ -108,11 +108,17 @@ class ListingFragment : Fragment() { val action = ListingFragmentDirections.navigateToPusher() findNavController().navigate(action) } + binding.fab2.setOnClickListener { closeFABMenu() ExportBuilder(myContext, data, binding) } + binding.fab3.setOnClickListener { + closeFABMenu() + findNavController().navigate(R.id.navigation_manage_techniker) + } + binding.fabBgLayout.setOnClickListener { closeFABMenu() } @@ -192,10 +198,12 @@ class ListingFragment : Fragment() { isFABOpen = true binding.fabLayout1.visibility = View.VISIBLE binding.fabLayout2.visibility = View.VISIBLE + binding.fabLayout3.visibility = View.VISIBLE binding.fabBgLayout.visibility = View.VISIBLE binding.fab.animate().rotationBy(180f) binding.fabLayout1.animate().translationY(-resources.getDimension(R.dimen.first_fab)) binding.fabLayout2.animate().translationY(-resources.getDimension(R.dimen.second_fab)) + binding.fabLayout3.animate().translationY(-resources.getDimension(R.dimen.third_fab)) } private fun closeFABMenu() { @@ -204,13 +212,15 @@ class ListingFragment : Fragment() { binding.fab.animate().rotation(0f) binding.fabLayout1.animate().translationY(0f) binding.fabLayout2.animate().translationY(0f) - binding.fabLayout2.animate().translationY(0f).setListener(object: Animator.AnimatorListener { + binding.fabLayout3.animate().translationY(0f) + binding.fabLayout3.animate().translationY(0f).setListener(object: Animator.AnimatorListener { override fun onAnimationStart(animation: Animator?) {} override fun onAnimationEnd(animation: Animator?) { if (!isFABOpen) { binding.fabLayout1.visibility = View.GONE binding.fabLayout2.visibility = View.GONE + binding.fabLayout3.visibility = View.GONE } } diff --git a/app/src/main/java/com/cyb3rko/techniklogger/fragments/ManageTechnikerFragment.kt b/app/src/main/java/com/cyb3rko/techniklogger/fragments/ManageTechnikerFragment.kt new file mode 100644 index 0000000..4252a63 --- /dev/null +++ b/app/src/main/java/com/cyb3rko/techniklogger/fragments/ManageTechnikerFragment.kt @@ -0,0 +1,144 @@ +package com.cyb3rko.techniklogger.fragments + +import android.content.Context +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ArrayAdapter +import android.widget.Toast +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.databinding.FragmentManageTechnikerBinding +import com.google.android.material.switchmaterial.SwitchMaterial +import com.google.android.material.textfield.TextInputEditText +import com.parse.ParseObject +import com.parse.ParseQuery +import es.dmoral.toasty.Toasty +import kotlinx.android.synthetic.main.techniker_dialog.view.* + +class ManageTechnikerFragment : Fragment() { + private var _binding: FragmentManageTechnikerBinding? = null + private lateinit var myContext: Context + + private lateinit var techniker: MutableList + private val technikerNames = mutableListOf() + private val query = ParseQuery.getQuery("Techniker") + + private val binding get() = _binding!! + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + _binding = FragmentManageTechnikerBinding.inflate(inflater, container, false) + val root = binding.root + myContext = requireContext() + + query.whereEqualTo("entlassen", false) + query.limit = 100000 + + fetchTechniker() + + binding.fab.setOnClickListener { + MaterialDialog(myContext, BottomSheet(LayoutMode.WRAP_CONTENT)).show { + title(text = "Techniker hinzufügen") + customView(R.layout.techniker_dialog, horizontalPadding = true) + positiveButton(text = "Hinzufügen") { + val view = it.view + val newName = view.name.text.toString() + val newAdmin = view.admin.isChecked + ParseObject.create("Techniker").apply { + put("name", newName) + put("admin", newAdmin) + saveInBackground { + if (it == null) { + Toast.makeText(myContext, "Hinzugefügt", Toast.LENGTH_SHORT).show() + fetchTechniker() + } else { + Toasty.error(myContext, "Fehler bei Speicherung").show() + Log.e("TechnikLogger.Techniker", it.message.toString()) + } + } + } + } + } + } + + return root + } + + private fun fetchTechniker() { + query.findInBackground { objects, e -> + if (e == null) { + techniker = objects.sortedBy { + it.getString("name")!! + }.toMutableList() + + technikerNames.clear() + objects.forEach { + technikerNames.add(it.getString("name")!!) + } + technikerNames.sort() + + val adapter = ArrayAdapter(myContext, android.R.layout.simple_list_item_1, technikerNames) + binding.list.adapter = adapter + binding.list.setOnItemClickListener { _, _, index, _ -> + val dialogView = layoutInflater.inflate(R.layout.techniker_dialog, null) + dialogView.findViewById(R.id.name).setText(technikerNames[index]) + dialogView.findViewById(R.id.admin).isChecked = techniker[index].getBoolean("admin") + MaterialDialog(myContext, BottomSheet(LayoutMode.WRAP_CONTENT)).show { + title(text = "Techniker-Info") + customView(0, dialogView, horizontalPadding = true) + onDismiss { + val view = it.view + val newName = view.name.text.toString() + val newAdmin = view.admin.isChecked + val parseObject = techniker[index] + if (newName != parseObject.getString("name") || newAdmin != parseObject.getBoolean("admin")) { + parseObject.apply { + put("name", newName) + put("admin", newAdmin) + saveInBackground { + if (it == null) { + Toast.makeText(myContext, "Gespeichert", Toast.LENGTH_SHORT).show() + fetchTechniker() + } else { + Toasty.error(myContext, "Fehler bei Speicherung").show() + Log.e("TechnikLogger.Techniker", it.message.toString()) + } + } + } + } + } + negativeButton(text = "Entlassen") { + val name = technikerNames[index] + MaterialDialog(myContext).show { + title(text = "Entlassung") + message(text = "Soll '$name' wirklich entlassen werden?") + positiveButton(text = "Ja") { + techniker[index].apply { + put("entlassen", true) + saveInBackground { + if (it == null) { + Toast.makeText(myContext, "Gespeichert", Toast.LENGTH_SHORT).show() + fetchTechniker() + } else { + Toasty.error(myContext, "Fehler bei Speicherung").show() + Log.e("TechnikLogger.Techniker", it.message.toString()) + } + } + } + } + negativeButton(text = "Nein") + } + } + } + } + } + } + } +} diff --git a/app/src/main/java/com/cyb3rko/techniklogger/fragments/ProjectFragment.kt b/app/src/main/java/com/cyb3rko/techniklogger/fragments/ProjectFragment.kt index 4b77af9..56f747b 100644 --- a/app/src/main/java/com/cyb3rko/techniklogger/fragments/ProjectFragment.kt +++ b/app/src/main/java/com/cyb3rko/techniklogger/fragments/ProjectFragment.kt @@ -366,6 +366,7 @@ class ProjectFragment : Fragment() { private fun otherAdd() { val query = ParseQuery.getQuery("Techniker") + query.whereEqualTo("entlassen", false) query.findInBackground { objects, e -> if (e == null) { diff --git a/app/src/main/res/layout/fragment_listing.xml b/app/src/main/res/layout/fragment_listing.xml index 71c3dbc..a8b3653 100644 --- a/app/src/main/res/layout/fragment_listing.xml +++ b/app/src/main/res/layout/fragment_listing.xml @@ -63,11 +63,11 @@ android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - android:padding="12dp" + android:padding="8dp" android:clipToPadding="false" - android:layout_marginEnd="23dp" + android:layout_marginEnd="16dp" android:gravity="center_vertical" - android:layout_marginBottom="23dp" + android:layout_marginBottom="16dp" android:layout_gravity="bottom|end" android:visibility="gone"> @@ -94,11 +94,11 @@ android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - android:padding="12dp" + android:padding="8dp" android:clipToPadding="false" - android:layout_marginEnd="23dp" + android:layout_marginEnd="16dp" android:gravity="center_vertical" - android:layout_marginBottom="23dp" + android:layout_marginBottom="16dp" android:layout_gravity="bottom|end" android:visibility="gone"> @@ -118,18 +118,46 @@ + + + + + + + + @@ -137,11 +165,10 @@ android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="bottom|end" android:gravity="center_vertical" android:tint="@color/drawableTint" app:srcCompat="@drawable/_icon_dot_menu" - app:fabSize="normal"/> + app:fabSize="normal" /> diff --git a/app/src/main/res/layout/fragment_manage_techniker.xml b/app/src/main/res/layout/fragment_manage_techniker.xml new file mode 100644 index 0000000..4c20f09 --- /dev/null +++ b/app/src/main/res/layout/fragment_manage_techniker.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/techniker_dialog.xml b/app/src/main/res/layout/techniker_dialog.xml new file mode 100644 index 0000000..7134128 --- /dev/null +++ b/app/src/main/res/layout/techniker_dialog.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 718d569..dc32272 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -66,6 +66,12 @@ android:defaultValue=""/> + + 60dp 120dp + 180dp \ No newline at end of file