|
|
|
@ -8,20 +8,24 @@ import androidx.interpolator.view.animation.FastOutSlowInInterpolator |
|
|
|
import androidx.recyclerview.widget.ItemTouchHelper |
|
|
|
import androidx.recyclerview.widget.ItemTouchHelper |
|
|
|
import androidx.recyclerview.widget.RecyclerView |
|
|
|
import androidx.recyclerview.widget.RecyclerView |
|
|
|
import com.google.android.material.chip.ChipGroup |
|
|
|
import com.google.android.material.chip.ChipGroup |
|
|
|
|
|
|
|
import io.realm.kotlin.where |
|
|
|
import kotlinx.android.synthetic.main.fragment_custom_view.* |
|
|
|
import kotlinx.android.synthetic.main.fragment_custom_view.* |
|
|
|
import net.pokeranalytics.android.R |
|
|
|
import net.pokeranalytics.android.R |
|
|
|
import net.pokeranalytics.android.model.realm.CustomField |
|
|
|
import net.pokeranalytics.android.model.realm.CustomField |
|
|
|
import net.pokeranalytics.android.model.realm.CustomFieldEntry |
|
|
|
import net.pokeranalytics.android.model.realm.CustomFieldEntry |
|
|
|
|
|
|
|
import net.pokeranalytics.android.model.realm.Session |
|
|
|
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource |
|
|
|
import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource |
|
|
|
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource |
|
|
|
import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource |
|
|
|
import net.pokeranalytics.android.ui.extensions.ChipGroupExtension |
|
|
|
import net.pokeranalytics.android.ui.extensions.ChipGroupExtension |
|
|
|
import net.pokeranalytics.android.ui.extensions.px |
|
|
|
import net.pokeranalytics.android.ui.extensions.px |
|
|
|
|
|
|
|
import net.pokeranalytics.android.ui.extensions.showAlertDialog |
|
|
|
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment |
|
|
|
import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment |
|
|
|
import net.pokeranalytics.android.ui.view.RowRepresentable |
|
|
|
import net.pokeranalytics.android.ui.view.RowRepresentable |
|
|
|
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor |
|
|
|
import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor |
|
|
|
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow |
|
|
|
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomFieldRow |
|
|
|
import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow |
|
|
|
import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow |
|
|
|
import net.pokeranalytics.android.util.NULL_TEXT |
|
|
|
import net.pokeranalytics.android.util.NULL_TEXT |
|
|
|
|
|
|
|
import timber.log.Timber |
|
|
|
import java.util.* |
|
|
|
import java.util.* |
|
|
|
import kotlin.collections.ArrayList |
|
|
|
import kotlin.collections.ArrayList |
|
|
|
|
|
|
|
|
|
|
|
@ -36,8 +40,7 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa |
|
|
|
return this.item as CustomField |
|
|
|
return this.item as CustomField |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private val oldRows: ArrayList<RowRepresentable> = ArrayList() |
|
|
|
private val deletedCustomFieldEntries: ArrayList<CustomFieldEntry> = ArrayList() |
|
|
|
private val currentEntriesOrder: ArrayList<CustomFieldEntry> = ArrayList() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() { |
|
|
|
private val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() { |
|
|
|
|
|
|
|
|
|
|
|
@ -74,7 +77,15 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa |
|
|
|
return true |
|
|
|
return true |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
override fun onMoved(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, fromPos: Int, target: RecyclerView.ViewHolder, toPos: Int, x: Int, y: Int) { |
|
|
|
override fun onMoved( |
|
|
|
|
|
|
|
recyclerView: RecyclerView, |
|
|
|
|
|
|
|
viewHolder: RecyclerView.ViewHolder, |
|
|
|
|
|
|
|
fromPos: Int, |
|
|
|
|
|
|
|
target: RecyclerView.ViewHolder, |
|
|
|
|
|
|
|
toPos: Int, |
|
|
|
|
|
|
|
x: Int, |
|
|
|
|
|
|
|
y: Int |
|
|
|
|
|
|
|
) { |
|
|
|
super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y) |
|
|
|
super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y) |
|
|
|
|
|
|
|
|
|
|
|
Collections.swap(customField.entries, fromPos - (CustomFieldRow.values().size + 1), toPos - (CustomFieldRow.values().size + 1)) |
|
|
|
Collections.swap(customField.entries, fromPos - (CustomFieldRow.values().size + 1), toPos - (CustomFieldRow.values().size + 1)) |
|
|
|
@ -157,7 +168,7 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa |
|
|
|
override fun onRowValueChanged(value: Any?, row: RowRepresentable) { |
|
|
|
override fun onRowValueChanged(value: Any?, row: RowRepresentable) { |
|
|
|
when (row) { |
|
|
|
when (row) { |
|
|
|
is CustomFieldEntry -> { |
|
|
|
is CustomFieldEntry -> { |
|
|
|
row.value = value as String? ?: "" |
|
|
|
row.updateValue(value, row) |
|
|
|
customField.updateRowRepresentation() |
|
|
|
customField.updateRowRepresentation() |
|
|
|
rowRepresentableAdapter.notifyDataSetChanged() |
|
|
|
rowRepresentableAdapter.notifyDataSetChanged() |
|
|
|
} |
|
|
|
} |
|
|
|
@ -174,10 +185,24 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa |
|
|
|
super.onRowDeleted(row) |
|
|
|
super.onRowDeleted(row) |
|
|
|
when (row) { |
|
|
|
when (row) { |
|
|
|
is CustomFieldEntry -> { |
|
|
|
is CustomFieldEntry -> { |
|
|
|
|
|
|
|
if (!row.isValidForDelete(getRealm())) { |
|
|
|
|
|
|
|
val status = row.getDeleteStatus(getRealm()) |
|
|
|
|
|
|
|
val message = row.getFailedDeleteMessage(status) |
|
|
|
|
|
|
|
showAlertDialog(requireContext(), R.string.cf_entry_delete_popup_title, message, showCancelButton = true, positiveAction = { |
|
|
|
customField.deleteEntry(row) |
|
|
|
customField.deleteEntry(row) |
|
|
|
rowRepresentableAdapter.notifyDataSetChanged() |
|
|
|
rowRepresentableAdapter.notifyDataSetChanged() |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
customField.deleteEntry(row) |
|
|
|
|
|
|
|
rowRepresentableAdapter.notifyDataSetChanged() |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun onDataSaved() { |
|
|
|
|
|
|
|
super.onDataSaved() |
|
|
|
|
|
|
|
customField.cleanDeletedEntries(getRealm()) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -238,8 +263,18 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa |
|
|
|
onRowSelected(0, it) |
|
|
|
onRowSelected(0, it) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val entries = getRealm().where<CustomFieldEntry>().equalTo("customField.id", customField.id).findAll() |
|
|
|
|
|
|
|
Timber.d("delete customField: entries: ${entries.size}") |
|
|
|
|
|
|
|
entries.forEach { |
|
|
|
|
|
|
|
val sessions = getRealm().where<Session>().contains("customFieldEntries.id", it.id).findAll() |
|
|
|
|
|
|
|
Timber.d("Sessions: ${sessions.size} with entry value: ${it.value}") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Update UI |
|
|
|
* Update UI |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|