Zentralisiere Parse-Abfragen im ParseController

master
Niko Diamadis 4 years ago
parent c98d5d0b96
commit 8e6293b53e
Signed by: niko
GPG Key ID: BE53B0B17B1B142E

@ -0,0 +1,157 @@
package com.cyb3rko.techniklogger.data
import com.cyb3rko.techniklogger.*
import com.cyb3rko.techniklogger.COLUMN_EINSATZ_DATUM
import com.cyb3rko.techniklogger.COLUMN_EINSATZ_DAUER
import com.cyb3rko.techniklogger.COLUMN_EINSATZ_JAHR
import com.cyb3rko.techniklogger.COLUMN_EINSATZ_NAME
import com.cyb3rko.techniklogger.COLUMN_EINSATZ_ORT
import com.parse.ParseException
import com.parse.ParseObject
import com.parse.ParseQuery
import java.text.SimpleDateFormat
import java.util.*
object ParseController {
private fun <T : ParseObject>getQuery(
className: String,
allowCache: Boolean = true
): ParseQuery<T> {
return ParseQuery<T>(className).apply {
limit = -1
cachePolicy = if (allowCache) {
ParseQuery.CachePolicy.CACHE_THEN_NETWORK
} else ParseQuery.CachePolicy.NETWORK_ONLY
}
}
internal fun fetchAdminStatus(
userName: String?,
action: (objectId: String?, admin: Boolean?, e: ParseException?) -> Unit
) {
val query = getQuery<ParseObject>("Techniker", false)
query.whereEqualTo("name", userName)
query.getFirstInBackground { techniker, e ->
if (e == null) {
action(techniker.objectId, techniker.getBoolean("admin"), e)
} else {
action(null, null, e)
}
}
}
internal fun fetchYears(action: (entries: List<ParseObject>, e: ParseException?) -> Unit) {
val query = getQuery<ParseObject>("Jahr")
query.orderByDescending(COLUMN_JAHR_NAME)
query.findInBackground { entries, e ->
if (e == null) {
action(entries, null)
} else action(listOf(), e)
}
}
internal fun fetchProjects(
year: String?,
action: (projects: List<ProjectEntry>, e: ParseException?) -> Unit
) {
val query = getQuery<ParseObject>("Einsatz")
query.orderByDescending(COLUMN_EINSATZ_DATUM)
query.whereEqualTo(
COLUMN_EINSATZ_JAHR,
ParseObject.createWithoutData(
"Jahr",
year
)
)
query.findInBackground { objects, e ->
if (e == null) {
val data = mutableListOf<ProjectEntry>()
objects.forEach {
val dates = it.getString(COLUMN_EINSATZ_DATUM)!!.split(",")
val time = if (dates.size > 1) dates[1] else ""
data.add(
ProjectEntry(
SimpleDateFormat("yyyy.MM.dd", Locale.GERMANY).parse(dates[0])!!,
it.getInt(COLUMN_EINSATZ_DAUER).toString(),
it.getString(COLUMN_EINSATZ_ORT)!!,
it.getString(COLUMN_EINSATZ_NAME)!!,
it.objectId,
time
)
)
}
action(data, null)
} else {
action(listOf(), e)
}
}
}
internal fun fetchProject(
objectId: String?,
action: (project: ParseObject?, e: ParseException?) -> Unit
) {
val query = getQuery<ParseObject>(CLASS_EINSATZ)
query.getInBackground(objectId) { entry, e ->
if (e == null) {
action(entry, null)
} else {
action(null, e)
}
}
}
internal fun fetchSingleTeilnahme(
projectId: String,
technikerId: String,
action: (entry: ParseObject?, e: ParseException?) -> Unit
) {
val query = getQuery<ParseObject>(CLASS_TEILNAHME, false)
query.whereEqualTo(COLUMN_TEILNAHME_AN, ParseObject.createWithoutData(CLASS_EINSATZ, projectId))
query.whereEqualTo(COLUMN_TEILNAHME_VON, ParseObject.createWithoutData(CLASS_EINSATZ, technikerId))
query.getFirstInBackground { entry, e ->
if (e == null) {
action(entry, null)
} else action(null, e)
}
}
internal fun fetchTeilnahmen(
projectId: String,
includeTechniker: Boolean,
action: (entries: List<ParseObject>, e: ParseException?) -> Unit
) {
val query = getQuery<ParseObject>(CLASS_TEILNAHME, false)
query.whereEqualTo("an", ParseObject.createWithoutData(CLASS_EINSATZ, projectId))
if (includeTechniker) query.include("von")
query.findInBackground { entries, e ->
if (e == null) {
action(entries, null)
} else action(listOf(), e)
}
}
internal fun fetchTechniker(
action: (
techniker: List<ParseObject>,
technikerNames: List<String>,
e: ParseException?
) -> Unit
) {
val query = getQuery<ParseObject>(CLASS_TECHNIKER, false)
query.whereEqualTo(COLUMN_TECHNIKER_ENTLASSEN, false)
query.orderByAscending(COLUMN_TECHNIKER_NAME)
query.findInBackground { objects, e ->
if (e == null) {
val techniker = mutableListOf<String>()
objects.forEach {
techniker.add(it.getString(COLUMN_TECHNIKER_NAME)!!)
}
action(objects, techniker, null)
} else {
action(listOf(), listOf(), e)
}
}
}
}

@ -1,4 +1,4 @@
package com.cyb3rko.techniklogger.recycler
package com.cyb3rko.techniklogger.data
import java.util.*

@ -1,4 +1,4 @@
package com.cyb3rko.techniklogger.recycler
package com.cyb3rko.techniklogger.data
data class ProjectTechniker(
var dauer: String,

@ -0,0 +1,6 @@
package com.cyb3rko.techniklogger.data
data class Year(
val name: String,
val objectId: String
)

@ -17,13 +17,13 @@ import com.cyb3rko.techniklogger.CLASS_EINSATZ
import com.cyb3rko.techniklogger.COLUMN_EINSATZ_JAHR
import com.cyb3rko.techniklogger.CURRENT_YEAR
import com.cyb3rko.techniklogger.SHARED_PREFERENCE
import com.cyb3rko.techniklogger.data.ParseController
import com.cyb3rko.techniklogger.databinding.FragmentEinsatzPusherBinding
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.dialog.MaterialAlertDialogBuilder
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
import java.sql.Time
import java.text.DecimalFormat
@ -129,11 +129,9 @@ class EinsatzPusherFragment : Fragment() {
.setTitle("Einsatz entfernen")
.setMessage("Möchtest du diesen Einsatz entfernen?")
.setPositiveButton("Ja") { _, _ ->
val query = ParseQuery<ParseObject>(CLASS_TEILNAHME)
query.whereEqualTo("an", ParseObject.createWithoutData(CLASS_EINSATZ, childKey))
query.findInBackground { objects, e ->
ParseController.fetchTeilnahmen(childKey, false) { entries, e ->
if (e == null) {
ParseObject.deleteAllInBackground(objects) {
ParseObject.deleteAllInBackground(entries) {
entry.deleteInBackground {
if (it == null) {
findNavController().navigate(R.id.navigation_listing)

@ -15,13 +15,11 @@ import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.cyb3rko.techniklogger.*
import com.cyb3rko.techniklogger.data.ParseController
import com.cyb3rko.techniklogger.databinding.FragmentListingBinding
import com.cyb3rko.techniklogger.recycler.ProjectEntry
import com.cyb3rko.techniklogger.recycler.ProjectsAdapter
import com.cyb3rko.techniklogger.table.ExportBuilder
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.parse.ParseObject
import com.parse.ParseQuery
import es.dmoral.toasty.Toasty
import java.text.SimpleDateFormat
import java.util.*
@ -146,37 +144,13 @@ class ListingFragment : Fragment() {
}
private fun loadEntries() {
val query = ParseQuery.getQuery<ParseObject>("Einsatz")
query.limit = -1
query.cachePolicy = ParseQuery.CachePolicy.CACHE_THEN_NETWORK
query.orderByDescending(COLUMN_EINSATZ_DATUM)
query.whereEqualTo(
COLUMN_EINSATZ_JAHR,
ParseObject.createWithoutData(
"Jahr",
sharedPref.getString(CURRENT_YEAR, "")
)
)
query.findInBackground { objects, e ->
ParseController.fetchProjects(
sharedPref.getString(CURRENT_YEAR, "")
) { entries, e ->
if (e == null) {
val data = mutableListOf<ProjectEntry>()
objects.forEach {
val dates = it.getString(COLUMN_EINSATZ_DATUM)!!.split(",")
val time = if (dates.size > 1) dates[1] else ""
data.add(ProjectEntry(
SimpleDateFormat("yyyy.MM.dd", Locale.GERMANY).parse(dates[0])!!,
it.getInt(COLUMN_EINSATZ_DAUER).toString(),
it.getString(COLUMN_EINSATZ_ORT)!!,
it.getString(COLUMN_EINSATZ_NAME)!!,
it.objectId,
time
))
}
showAnimation(false)
binding.swipeRefreshLayout.isRefreshing = false
projectsAdapter.submitList(data)
projectsAdapter.submitList(entries)
projectsAdapter.registerAdapterDataObserver(object: RecyclerView.AdapterDataObserver() {
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
@ -204,11 +178,9 @@ class ListingFragment : Fragment() {
}
private fun updateAdminStatus() {
val query = ParseQuery.getQuery<ParseObject>("Techniker")
query.whereEqualTo("name", sharedPref.getString("name", ""))
query.getFirstInBackground { techniker, e ->
ParseController.fetchAdminStatus(sharedPref.getString("name", "")) { objectId, admin, e ->
if (e == null) {
if (techniker.getBoolean("admin")) {
if (admin!!) {
adminMode = true
sharedPrefEditor.putBoolean("admin", adminMode!!)
binding.fabContainer.visibility = View.VISIBLE
@ -217,7 +189,7 @@ class ListingFragment : Fragment() {
sharedPrefEditor.putBoolean("admin", adminMode!!)
binding.fabContainer.visibility = View.INVISIBLE
}
sharedPrefEditor.putString("technikerId", techniker.objectId).apply()
sharedPrefEditor.putString("technikerId", objectId).apply()
} else {
binding.fabContainer.visibility = View.INVISIBLE
adminMode = false

@ -13,25 +13,24 @@ 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.androidnetworking.AndroidNetworking.put
import com.cyb3rko.techniklogger.*
import com.cyb3rko.techniklogger.CLASS_TECHNIKER
import com.cyb3rko.techniklogger.COLUMN_TECHNIKER_ADMIN
import com.cyb3rko.techniklogger.COLUMN_TECHNIKER_ENTLASSEN
import com.cyb3rko.techniklogger.COLUMN_TECHNIKER_NAME
import com.cyb3rko.techniklogger.data.ParseController
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
class ManageTechnikerFragment : Fragment() {
private var _binding: FragmentManageTechnikerBinding? = null
private lateinit var myContext: Context
private lateinit var techniker: MutableList<ParseObject>
private val technikerNames = mutableListOf<String>()
private val query = ParseQuery.getQuery<ParseObject>(CLASS_TECHNIKER)
private val binding get() = _binding!!
@ -44,11 +43,7 @@ class ManageTechnikerFragment : Fragment() {
val root = binding.root
myContext = requireContext()
query.whereEqualTo(COLUMN_TECHNIKER_ENTLASSEN, false)
query.orderByAscending(COLUMN_TECHNIKER_NAME)
query.limit = -1
fetchTechniker()
loadTechniker()
binding.fab.setOnClickListener {
MaterialDialog(myContext, BottomSheet(LayoutMode.WRAP_CONTENT)).show {
@ -65,7 +60,7 @@ class ManageTechnikerFragment : Fragment() {
if (it == null) {
Toasty.success(myContext, "Hinzugefügt").show()
showAnimation(true)
fetchTechniker()
loadTechniker()
} else {
Toasty.error(myContext, "Fehler bei Speicherung").show()
Log.e("TechnikLogger.Techniker", it.message.toString())
@ -82,27 +77,23 @@ class ManageTechnikerFragment : Fragment() {
setOnRefreshListener {
isRefreshing = false
showAnimation(true)
fetchTechniker()
loadTechniker()
}
}
return root
}
private fun fetchTechniker() {
private fun loadTechniker() {
technikerNames.clear()
binding.list.adapter = ArrayAdapter(
myContext,
android.R.layout.simple_list_item_1,
technikerNames
)
query.findInBackground { objects, e ->
if (e == null) {
techniker = objects
objects.forEach {
technikerNames.add(it.getString(COLUMN_TECHNIKER_NAME)!!)
}
ParseController.fetchTechniker { techniker, technikerNames, e ->
if (e == null) {
val adapter = ArrayAdapter(
myContext,
android.R.layout.simple_list_item_1,
@ -133,7 +124,7 @@ class ManageTechnikerFragment : Fragment() {
if (it == null) {
Toasty.success(myContext, "Gespeichert").show()
showAnimation(true)
fetchTechniker()
loadTechniker()
} else {
Toasty.error(myContext, "Fehler bei Speicherung").show()
Log.e("TechnikLogger.Techniker", it.message.toString())
@ -154,7 +145,7 @@ class ManageTechnikerFragment : Fragment() {
if (it == null) {
Toasty.success(myContext, "Gespeichert").show()
showAnimation(true)
fetchTechniker()
loadTechniker()
} else {
Toasty.error(myContext, "Fehler bei Speicherung").show()
Log.e("TechnikLogger.Techniker", it.message.toString())

@ -12,22 +12,19 @@ import android.view.ViewGroup
import android.widget.CheckedTextView
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.core.view.forEach
import androidx.core.view.forEachIndexed
import androidx.core.view.get
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.navArgs
import androidx.recyclerview.widget.LinearLayoutManager
import com.cyb3rko.techniklogger.*
import com.cyb3rko.techniklogger.data.ParseController
import com.cyb3rko.techniklogger.databinding.FragmentProjectBinding
import com.cyb3rko.techniklogger.recycler.ProjectTechniker
import com.cyb3rko.techniklogger.data.ProjectTechniker
import com.cyb3rko.techniklogger.recycler.ProjectTechnikerAdapter
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.dialog.MaterialDialogs
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
import java.sql.Time
import java.text.DecimalFormat
@ -42,7 +39,6 @@ class ProjectFragment : Fragment() {
private var adminMode = false
private var objectId = ""
private var dauer = ""
private lateinit var einsatz: ParseObject
private lateinit var sharedPref: SharedPreferences
private var time = ""
@ -61,7 +57,6 @@ class ProjectFragment : Fragment() {
adminMode = sharedPref.getBoolean(COLUMN_TECHNIKER_ADMIN, false)
objectId = args.objectId
einsatz = ParseObject.createWithoutData(CLASS_EINSATZ, objectId)
technikerAdapter = ProjectTechnikerAdapter {
if (adminMode || it.name == sharedPref.getString(NAME, "")) {
@ -144,12 +139,9 @@ class ProjectFragment : Fragment() {
saveInBackground()
}
} else {
val query = ParseQuery.getQuery<ParseObject>(CLASS_TEILNAHME)
query.whereEqualTo(COLUMN_TEILNAHME_VON, ParseObject.createWithoutData(CLASS_TECHNIKER, it.objectId))
query.whereEqualTo(COLUMN_TEILNAHME_AN, ParseObject.createWithoutData(CLASS_EINSATZ, objectId))
query.getFirstInBackground { obj, e ->
ParseController.fetchSingleTeilnahme(objectId, it.objectId) { entry, e ->
if (e == null) {
it.teilnahmeKey = obj.objectId
it.teilnahmeKey = entry!!.objectId
val dauerFloat = it.dauer.toFloat()
ParseObject.createWithoutData(CLASS_TEILNAHME, it.teilnahmeKey).apply {
put(COLUMN_TEILNAHME_DAUER, dauerFloat)
@ -178,12 +170,9 @@ class ProjectFragment : Fragment() {
if (it.teilnahmeKey != "0") {
ParseObject.createWithoutData(CLASS_TEILNAHME, it.teilnahmeKey).deleteInBackground()
} else {
val query = ParseQuery.getQuery<ParseObject>(CLASS_TEILNAHME)
query.whereEqualTo(COLUMN_TEILNAHME_VON, ParseObject.createWithoutData(CLASS_TECHNIKER, it.objectId))
query.whereEqualTo(COLUMN_TEILNAHME_AN, ParseObject.createWithoutData(CLASS_EINSATZ, objectId))
query.getFirstInBackground { obj, e ->
ParseController.fetchSingleTeilnahme(objectId, it.objectId) { entry, e ->
if (e == null) {
obj.deleteInBackground {
entry!!.deleteInBackground {
if (it != null) {
Toasty.error(myContext, "Fehler bei Techniker-Löschung").show()
Log.e("TechnikLogger.TechLösch", it.message.toString())
@ -224,11 +213,9 @@ class ProjectFragment : Fragment() {
.setTitle("Techniker entfernen")
.setMessage("Möchtest du alle eingetragenen Techniker entfernen?")
.setPositiveButton("Ja") { _, _ ->
val query = ParseQuery<ParseObject>(CLASS_TEILNAHME)
query.whereEqualTo(COLUMN_TEILNAHME_AN, ParseObject.createWithoutData(CLASS_EINSATZ, objectId))
query.findInBackground { objects, e ->
ParseController.fetchTeilnahmen(objectId, false) { entries, e ->
if (e == null) {
ParseObject.deleteAllInBackground(objects)
ParseObject.deleteAllInBackground(entries)
technikerAdapter.submitList(listOf())
showDivider(false)
updateTechnikerCount(0)
@ -260,38 +247,36 @@ class ProjectFragment : Fragment() {
}
private fun loadData() {
val query = ParseQuery.getQuery<ParseObject>(CLASS_EINSATZ)
query.getInBackground(objectId) { einsatz, e ->
ParseController.fetchProject(objectId) { project, e ->
if (e == null) {
binding.titleView.text = einsatz.getString(COLUMN_EINSATZ_NAME)
binding.locationView.text = einsatz.getString(COLUMN_EINSATZ_ORT)
val dates = einsatz.getString(COLUMN_EINSATZ_DATUM)!!.split(",")
binding.titleView.text = project!!.getString(COLUMN_EINSATZ_NAME)
binding.locationView.text = project.getString(COLUMN_EINSATZ_ORT)
val dates = project.getString(COLUMN_EINSATZ_DATUM)!!.split(",")
val dateParts = dates[0].split(".")
val date = "${dateParts[2]}.${dateParts[1]}.${dateParts[0]}"
dauer = einsatz.getNumber(COLUMN_EINSATZ_DAUER)!!.toString()
dauer = project.getNumber(COLUMN_EINSATZ_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<ParseObject>(CLASS_TEILNAHME)
query2.whereEqualTo(COLUMN_TEILNAHME_AN, ParseObject.createWithoutData(CLASS_EINSATZ, objectId))
query2.include(COLUMN_TEILNAHME_VON)
query2.findInBackground { objects2, e2 ->
ParseController.fetchTeilnahmen(objectId, true) { entries, e2 ->
if (e2 == null) {
if (objects2.isNotEmpty()) {
if (entries.isNotEmpty()) {
val techniker = mutableListOf<ProjectTechniker>()
objects2.forEach {
entries.forEach {
val teilnehmenderTechniker = it.getParseObject(COLUMN_TEILNAHME_VON)!!
val dauerEntry = it.getNumber(COLUMN_EINSATZ_DAUER)!!
val dauer = if (dauerEntry == 0) einsatz.getNumber(COLUMN_TEILNAHME_DAUER)!!.toString() else dauerEntry.toString()
val dauer = if (dauerEntry == 0) project.getNumber(COLUMN_TEILNAHME_DAUER)!!.toString() else dauerEntry.toString()
val time = it.getString(COLUMN_EINSATZ_UHRZEIT)!!
techniker.add(ProjectTechniker(
dauer,
teilnehmenderTechniker.getString(COLUMN_EINSATZ_NAME)!!,
teilnehmenderTechniker.objectId,
it.objectId,
time
))
techniker.add(
ProjectTechniker(
dauer,
teilnehmenderTechniker.getString(COLUMN_EINSATZ_NAME)!!,
teilnehmenderTechniker.objectId,
it.objectId,
time
)
)
}
technikerAdapter.submitList(techniker)
updateTechnikerCount(techniker.size)
@ -302,10 +287,15 @@ class ProjectFragment : Fragment() {
Log.e("TechnikLogger.TechSuche", e2.message.toString())
}
}
} else {
Toasty.error(myContext, "Fehler bei Einsatz-Suche").show()
Log.e("TechnikLogger.EinsSuche", e.message.toString())
if (e.message != null) {
if (e.message != "results not cached") {
Toasty.error(myContext, "Fehler bei Einsatz-Suche").show()
Log.e("TechnikLogger.EinsSuche", e.message.toString())
} else {
Log.d("TechnikLogger.EinsSuche", "Empty cache, fetching data immediately.")
}
}
}
binding.swipeRefreshLayout.isRefreshing = false
}
@ -358,18 +348,10 @@ class ProjectFragment : Fragment() {
}
private fun otherAdd() {
val query = ParseQuery.getQuery<ParseObject>(CLASS_TECHNIKER)
query.whereEqualTo(COLUMN_TECHNIKER_ENTLASSEN, false)
query.findInBackground { objects, e ->
ParseController.fetchTechniker { techniker, names, e ->
if (e == null) {
objects.sortBy { it.getString(COLUMN_TECHNIKER_NAME) }
val currentSelection = BooleanArray(objects.size)
val names = mutableListOf<String>()
objects.forEachIndexed { index, obj ->
val name = obj.getString(COLUMN_TECHNIKER_NAME)!!
names.add(name)
val currentSelection = BooleanArray(techniker.size)
names.forEachIndexed { index, name ->
technikerAdapter.currentList.forEach {
if (name == it.name) {
currentSelection[index] = true
@ -403,7 +385,7 @@ class ProjectFragment : Fragment() {
}
.setPositiveButton("Hinzufügen") { _, _ ->
val newNameObjects = mutableListOf<ParseObject>()
objects.forEach {
techniker.forEach {
if (checkedNames.contains(it.getString(COLUMN_TECHNIKER_NAME)!!)) {
newNameObjects.add(it)
}

@ -11,15 +11,15 @@ import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import com.cyb3rko.techniklogger.*
import com.cyb3rko.techniklogger.COLUMN_JAHR_NAME
import com.cyb3rko.techniklogger.CURRENT_YEAR
import com.cyb3rko.techniklogger.CURRENT_YEAR_NAME
import com.cyb3rko.techniklogger.SHARED_PREFERENCE
import com.cyb3rko.techniklogger.data.ParseController
import com.cyb3rko.techniklogger.data.Year
import com.cyb3rko.techniklogger.databinding.FragmentYearsBinding
import com.cyb3rko.techniklogger.recycler.YearAdapter
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.parse.ParseObject
import com.parse.ParseQuery
import es.dmoral.toasty.Toasty
class YearsFragment : Fragment() {
@ -28,7 +28,7 @@ class YearsFragment : Fragment() {
private var adminMode: Boolean? = null
private lateinit var yearAdapter: YearAdapter
private var data: MutableList<ParseObject> = mutableListOf()
private var data: MutableList<Year> = mutableListOf()
private lateinit var sharedPref: SharedPreferences
private lateinit var sharedPrefEditor: SharedPreferences.Editor
@ -54,9 +54,9 @@ class YearsFragment : Fragment() {
binding.loadingAnimation.playAnimation()
yearAdapter = YearAdapter { objectId, name ->
sharedPrefEditor.putString(CURRENT_YEAR, objectId)
sharedPrefEditor.putString(CURRENT_YEAR_NAME, name).commit()
yearAdapter = YearAdapter { year ->
sharedPrefEditor.putString(CURRENT_YEAR, year.objectId)
sharedPrefEditor.putString(CURRENT_YEAR_NAME, year.name).commit()
findNavController().navigate(R.id.navigation_listing)
}
binding.recyclerView.apply {
@ -76,8 +76,8 @@ class YearsFragment : Fragment() {
binding.fab.setOnClickListener {
val current = yearAdapter.currentList[0]
val currentYear = current.getString("name")?.split("/")?.get(1)
val new = "$currentYear/${currentYear!!.toInt() + 1}"
val currentYear = current.name.split("/")[1]
val new = "$currentYear/${currentYear.toInt() + 1}"
MaterialAlertDialogBuilder(myContext)
.setTitle("Neues Schuljahr")
.setMessage("Möchtest du das Schuljahr $new hinzufügen?")
@ -99,18 +99,13 @@ class YearsFragment : Fragment() {
}
private fun loadEntries() {
val query = ParseQuery.getQuery<ParseObject>("Jahr")
query.limit = -1
query.cachePolicy = ParseQuery.CachePolicy.CACHE_THEN_NETWORK
query.orderByDescending(COLUMN_JAHR_NAME)
query.findInBackground { objects, e ->
ParseController.fetchYears { entries, e ->
if (e == null) {
data = objects
entries.forEach { data.add(Year(it.getString("name")!!, it.objectId)) }
showAnimation(false)
binding.swipeRefreshLayout.isRefreshing = false
yearAdapter.submitList(data)
(requireActivity() as MainActivity).setActionBarSubtitle(objects.size.toString())
(requireActivity() as MainActivity).setActionBarSubtitle(entries.size.toString())
} else {
if (e.message != null) {
if (e.message != "results not cached") {
@ -130,11 +125,9 @@ class YearsFragment : Fragment() {
}
private fun updateAdminStatus() {
val query = ParseQuery.getQuery<ParseObject>("Techniker")
query.whereEqualTo("name", sharedPref.getString("name", ""))
query.getFirstInBackground { techniker, e ->
ParseController.fetchAdminStatus(sharedPref.getString("name", "")) { objectId, admin, e ->
if (e == null) {
if (techniker.getBoolean("admin")) {
if (admin!!) {
adminMode = true
sharedPrefEditor.putBoolean("admin", adminMode!!)
binding.fab.visibility = View.VISIBLE
@ -143,7 +136,7 @@ class YearsFragment : Fragment() {
sharedPrefEditor.putBoolean("admin", adminMode!!)
binding.fab.visibility = View.INVISIBLE
}
sharedPrefEditor.putString("technikerId", techniker.objectId).apply()
sharedPrefEditor.putString("technikerId", objectId).apply()
} else {
binding.fab.visibility = View.INVISIBLE
adminMode = false

@ -8,6 +8,7 @@ import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.cyb3rko.techniklogger.R
import com.cyb3rko.techniklogger.data.ProjectTechniker
class ProjectTechnikerAdapter(
val action: (techniker: ProjectTechniker) -> Unit

@ -9,6 +9,7 @@ import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.cyb3rko.techniklogger.R
import com.cyb3rko.techniklogger.data.ProjectEntry
import java.text.SimpleDateFormat
import java.util.*

@ -9,11 +9,11 @@ import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.cyb3rko.techniklogger.R
import com.parse.ParseObject
import com.cyb3rko.techniklogger.data.Year
class YearAdapter(
val action: (objectId: String, year: String) -> Unit
) : ListAdapter<ParseObject, YearAdapter.ViewHolder>(YearDiffCallback) {
val action: (year: Year) -> Unit
) : ListAdapter<Year, YearAdapter.ViewHolder>(YearDiffCallback) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
@ -23,11 +23,10 @@ class YearAdapter(
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val entry = currentList[position]
val name = entry.getString("name")!!
holder.nameView.text = name
val year = currentList[position]
holder.nameView.text = year.name
holder.cardView.setOnClickListener {
action(entry.objectId, name)
action(year)
}
}
@ -38,13 +37,13 @@ class YearAdapter(
val nameView: TextView = view.findViewById(R.id.name_text)
}
object YearDiffCallback : DiffUtil.ItemCallback<ParseObject>() {
override fun areItemsTheSame(oldItem: ParseObject, newItem: ParseObject): Boolean {
object YearDiffCallback : DiffUtil.ItemCallback<Year>() {
override fun areItemsTheSame(oldItem: Year, newItem: Year): Boolean {
return oldItem.objectId == newItem.objectId
}
override fun areContentsTheSame(oldItem: ParseObject, newItem: ParseObject): Boolean {
return oldItem.getString("name") == newItem.getString("name")
override fun areContentsTheSame(oldItem: Year, newItem: Year): Boolean {
return oldItem.name == newItem.name
}
}
}

@ -6,13 +6,13 @@ import android.os.Environment
import android.util.Log
import android.view.View
import androidx.core.content.FileProvider
import com.cyb3rko.techniklogger.data.ParseController
import com.cyb3rko.techniklogger.databinding.FragmentListingBinding
import com.cyb3rko.techniklogger.recycler.ProjectEntry
import com.cyb3rko.techniklogger.data.ProjectEntry
import com.itextpdf.text.*
import com.itextpdf.text.pdf.PdfPTable
import com.itextpdf.text.pdf.PdfWriter
import com.parse.ParseObject
import com.parse.ParseQuery
import es.dmoral.toasty.Toasty
import java.io.File
import java.io.FileNotFoundException
@ -78,14 +78,11 @@ class ExportBuilder(
private fun fetchTechniker(index: Int = 0) {
if (index < data.size) {
val query = ParseQuery.getQuery<ParseObject>("Teilnahme")
query.whereEqualTo("an", ParseObject.createWithoutData("Einsatz", data[index].objectId))
query.include("von")
query.findInBackground { objects, e ->
ParseController.fetchTeilnahmen(data[index].objectId, true) { entries, e ->
if (e == null) {
val tempList = mutableListOf<String>()
var aktuellerTechniker: ParseObject
objects.forEach {
entries.forEach {
aktuellerTechniker = it.getParseObject("von")!!
tempList.add(aktuellerTechniker.getString("name")!!)
}

Loading…
Cancel
Save