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 34e8571..d805384 100644 --- a/app/src/main/java/com/cyb3rko/techniklogger/fragments/ListingFragment.kt +++ b/app/src/main/java/com/cyb3rko/techniklogger/fragments/ListingFragment.kt @@ -142,7 +142,6 @@ class ListingFragment : Fragment() { if (techniker.getBoolean("admin")) { adminMode = true sharedPrefEditor.putBoolean("admin", adminMode) - sharedPrefEditor.putString("technikerId", techniker.objectId).apply() binding.floatingActionButton.show() binding.floatingActionButton.setOnClickListener { val action = ListingFragmentDirections.navigateToPusher() @@ -150,9 +149,10 @@ class ListingFragment : Fragment() { } } else { adminMode = false - sharedPrefEditor.putBoolean("admin", adminMode).apply() + sharedPrefEditor.putBoolean("admin", adminMode) binding.floatingActionButton.hide() } + sharedPrefEditor.putString("technikerId", techniker.objectId).apply() } else { binding.floatingActionButton.hide() adminMode = false 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 419beab..bf1df80 100644 --- a/app/src/main/java/com/cyb3rko/techniklogger/fragments/ProjectFragment.kt +++ b/app/src/main/java/com/cyb3rko/techniklogger/fragments/ProjectFragment.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.content.Context import android.content.SharedPreferences import android.os.Bundle +import android.text.Html import android.util.Log import android.view.* import androidx.fragment.app.Fragment @@ -19,6 +20,8 @@ import com.cyb3rko.techniklogger.R import com.cyb3rko.techniklogger.databinding.FragmentProjectBinding import com.cyb3rko.techniklogger.recycler.ProjectTechnikerViewHolder import com.cyb3rko.techniklogger.recycler.ProjectTechnikerViewState +import com.google.android.material.timepicker.MaterialTimePicker +import com.google.android.material.timepicker.TimeFormat import com.parse.ParseObject import com.parse.ParseQuery import es.dmoral.toasty.Toasty @@ -26,6 +29,8 @@ import java.lang.IndexOutOfBoundsException import me.ibrahimyilmaz.kiel.adapter.RecyclerViewAdapter.Companion.adapterOf import me.ibrahimyilmaz.kiel.adapter.RecyclerViewAdapter import me.ibrahimyilmaz.kiel.core.RecyclerViewHolder +import java.sql.Time +import java.text.DecimalFormat @SuppressLint("SetTextI18n") class ProjectFragment : Fragment() { @@ -36,9 +41,11 @@ class ProjectFragment : Fragment() { private lateinit var adapter: RecyclerViewAdapter> private var adminMode = false private var childKey = "" + private var dauer = "" private lateinit var einsatz: ParseObject private lateinit var sharedPref: SharedPreferences private val techniker: MutableList = mutableListOf() + private var time = "" private val binding get() = _binding!! @@ -58,37 +65,124 @@ class ProjectFragment : Fragment() { layoutResource = R.layout.item_recycler_techniker, viewHolder = ::ProjectTechnikerViewHolder, onBindBindViewHolder = { vh, _, clickedTechniker -> - vh.textView.text = clickedTechniker.name + vh.textView.text = "${clickedTechniker.name}, ${clickedTechniker.dauer} h" vh.itemView.setOnClickListener { - if (adminMode) { + if (adminMode || clickedTechniker.name == sharedPref.getString("name", "")) { MaterialDialog(myContext) .show { - message(text = "Möchtest du \'${clickedTechniker.name}\' entfernen?") - positiveButton(text = "Ja") { - techniker.remove(clickedTechniker) - val query = ParseQuery.getQuery("Teilnahme") - query.whereEqualTo("von", ParseObject.createWithoutData("Techniker", clickedTechniker.key)) - query.getFirstInBackground { obj, e -> - if (e == null) { - obj.deleteInBackground() { - if (it == null) { - einsatz.saveInBackground() - adapter.notifyDataSetChanged() - binding.recyclerView.scheduleLayoutAnimation() - binding.technikerView.text = "Techniker: ${techniker.size}" - } else { - Toasty.error(myContext, "Fehler bei Techniker-Löschung").show() - Log.e("TechnikLogger.TechLösch", it.message.toString()) - } + title(text = clickedTechniker.name) + val uhrzeit = if (clickedTechniker.uhrzeit == "0") time else clickedTechniker.uhrzeit + message(text = Html.fromHtml("Arbeitszeit:
$uhrzeit Uhr

Wie möchtest du " + + "diesen Eintrag bearbeiten?")) + positiveButton(text = "Arbeitszeit ändern") { + var tempTime = "" + var time1 = Time(0) + var time2 = Time(0) + val builder = MaterialTimePicker.Builder().setTimeFormat(TimeFormat.CLOCK_24H).setTitleText("Von") + val builder2 = MaterialTimePicker.Builder().setTimeFormat(TimeFormat.CLOCK_24H).setTitleText("Bis") + val picker = builder.build() + val picker2 = builder2.build() + var hour: String + var minute: String + var hoursInMillis: Long + var minutesInMillis: Long + if (clickedTechniker.uhrzeit != "0") { + val times = clickedTechniker.uhrzeit.split(" - ") + builder.setHour(times[0].split(":")[0].toInt()) + .setMinute(times[0].split(":")[1].toInt()) + builder2.setHour(times[1].split(":")[0].toInt()) + .setMinute(times[1].split(":")[1].toInt()) + } + picker.addOnPositiveButtonClickListener { + hour = picker.hour.toString() + hour = if (hour.length != 1) hour else "0$hour" + minute = picker.minute.toString() + minute = if (minute.length != 1) minute else "0$minute" + hoursInMillis = picker.hour.toLong() * 3600000 + minutesInMillis = picker.minute.toLong() * 60000 + time1 = Time(hoursInMillis + minutesInMillis) + tempTime += "${hour}:${minute} - " + activity?.let { it1 -> picker2.show(it1.supportFragmentManager, picker2.tag) } + } + picker2.addOnPositiveButtonClickListener { + hour = picker2.hour.toString() + hour = if (hour.length != 1) hour else "0$hour" + minute = picker2.minute.toString() + minute = if (minute.length != 1) minute else "0$minute" + hoursInMillis = hour.toLong() * 3600000 + minutesInMillis = minute.toLong() * 60000 + time2 = Time(hoursInMillis + minutesInMillis) + tempTime += "${hour}:${minute}" + clickedTechniker.uhrzeit = tempTime + val tempDauer = DecimalFormat("#.#").format((time2.time - time1.time) / 3600 / 1000.toFloat()) + clickedTechniker.dauer = tempDauer.replace(",", ".") + + if (clickedTechniker.teilnahmeKey != "0") { + val dauerFloat = clickedTechniker.dauer.toFloat() + ParseObject.createWithoutData("Teilnahme", clickedTechniker.teilnahmeKey).apply { + put("dauer", dauerFloat) + put("uhrzeit", clickedTechniker.uhrzeit) + saveInBackground() } } else { - Toasty.error(myContext, "Fehler bei Techniker-Abfrage").show() - Log.e("TechnikLogger.TechSuche", e.message.toString()) + val query = ParseQuery.getQuery("Teilnahme") + query.whereEqualTo("von", ParseObject.createWithoutData("Techniker", clickedTechniker.key)) + query.whereEqualTo("an", ParseObject.createWithoutData("Einsatz", childKey)) + query.getFirstInBackground { obj, e -> + if (e == null) { + clickedTechniker.teilnahmeKey = obj.objectId + val dauerFloat = clickedTechniker.dauer.toFloat() + ParseObject.createWithoutData("Teilnahme", clickedTechniker.teilnahmeKey).apply { + put("dauer", dauerFloat) + put("uhrzeit", clickedTechniker.uhrzeit) + saveInBackground() + } + adapter.notifyDataSetChanged() + binding.recyclerView.scheduleLayoutAnimation() + } else { + Toasty.error(myContext, "Fehler bei Techniker-Abfrage").show() + Log.e("TechnikLogger.TechSuche", e.message.toString()) + } + } + } + + adapter.notifyDataSetChanged() + binding.recyclerView.scheduleLayoutAnimation() + } + activity?.let { it1 -> picker.show(it1.supportFragmentManager, picker.tag) } + } + negativeButton(text = "Entfernen") { + techniker.remove(clickedTechniker) + if (clickedTechniker.teilnahmeKey != "0") { + ParseObject.createWithoutData ("Teilnahme", clickedTechniker.teilnahmeKey).deleteInBackground() { + adapter.notifyDataSetChanged() + binding.recyclerView.scheduleLayoutAnimation() + binding.technikerView.text = "Techniker: ${techniker.size}" + } + } else { + val query = ParseQuery.getQuery("Teilnahme") + query.whereEqualTo("von", ParseObject.createWithoutData("Techniker", clickedTechniker.key)) + query.whereEqualTo("an", ParseObject.createWithoutData("Einsatz", childKey)) + query.getFirstInBackground { obj, e -> + if (e == null) { + obj.deleteInBackground() { + if (it == null) { + adapter.notifyDataSetChanged() + binding.recyclerView.scheduleLayoutAnimation() + binding.technikerView.text = "Techniker: ${techniker.size}" + } else { + Toasty.error(myContext, "Fehler bei Techniker-Löschung").show() + Log.e("TechnikLogger.TechLösch", it.message.toString()) + } + } + } else { + Toasty.error(myContext, "Fehler bei Techniker-Abfrage").show() + Log.e("TechnikLogger.TechSuche", e.message.toString()) + } } } if (techniker.size == 0) showDivider(false) } - negativeButton(text = "Abbrechen") } } } @@ -104,7 +198,9 @@ class ProjectFragment : Fragment() { val dates = einsatz["datum"].toString().split(",") val dateParts = dates[0].split(".") val date = "${dateParts[2]}.${dateParts[1]}.${dateParts[0]}" - val time = if (dates.size > 1) ", ${dates[1]}" else ", ${einsatz.getNumber("dauer")} h" + dauer = einsatz.getNumber("dauer")!!.toString() + if (dates.size > 1) time = dates[1] + val time = if (dates.size > 1) ", ${dates[1]}" else ", $dauer h" binding.dateView.text = date + time val query2 = ParseQuery.getQuery("Teilnahme") @@ -115,7 +211,16 @@ class ProjectFragment : Fragment() { if (objects2.isNotEmpty()) { objects2.forEach { val teilnehmenderTechniker = it.getParseObject("von")!! - techniker.add(ProjectTechnikerViewState.ProjectTechniker(teilnehmenderTechniker.getString("name")!!, teilnehmenderTechniker.objectId)) + val dauerEntry = it.getNumber("dauer")!! + val dauer = if (dauerEntry == 0) einsatz.getNumber("dauer")!!.toString() else dauerEntry.toString() + val time = it.getString("uhrzeit")!! + techniker.add(ProjectTechnikerViewState.ProjectTechniker( + teilnehmenderTechniker.getString("name")!!, + teilnehmenderTechniker.objectId, + it.objectId, + dauer, + time + )) } techniker.sortBy { it.name } binding.recyclerView.scheduleLayoutAnimation() @@ -270,7 +375,7 @@ class ProjectFragment : Fragment() { entryObject.put("von", it) entryObject.put("an", project) entryList.add(entryObject) - techniker.add(ProjectTechnikerViewState.ProjectTechniker(it.getString("name")!!, it.objectId)) + techniker.add(ProjectTechnikerViewState.ProjectTechniker(it.getString("name")!!, it.objectId, "0", dauer, time)) } ParseObject.saveAllInBackground(entryList) { if (it == null) { diff --git a/app/src/main/java/com/cyb3rko/techniklogger/recycler/ProjectTechnikerViewState.kt b/app/src/main/java/com/cyb3rko/techniklogger/recycler/ProjectTechnikerViewState.kt index b1a9d2d..7e8d57b 100644 --- a/app/src/main/java/com/cyb3rko/techniklogger/recycler/ProjectTechnikerViewState.kt +++ b/app/src/main/java/com/cyb3rko/techniklogger/recycler/ProjectTechnikerViewState.kt @@ -4,6 +4,9 @@ sealed class ProjectTechnikerViewState { data class ProjectTechniker( val name: String, - val key: String + val key: String, + var teilnahmeKey: String, + var dauer: String, + var uhrzeit: String ) : ProjectTechnikerViewState() }