Complétion du fragment menu : afficher, créer et cliquer une fiche d’émargement.

This commit is contained in:
biloute02 2024-01-12 15:07:43 +01:00
parent 652b46f4c5
commit 035030ca0f
9 changed files with 138 additions and 48 deletions

View file

@ -5,5 +5,7 @@ import java.io.Serializable
* Data class that captures tokens for logged in users retrieved from LoginRepository
*/
data class Session(
val id: String
val id: Int,
val name: String,
var attendances: List<User>
)

View file

@ -12,35 +12,39 @@ import com.example.palto.domain.Session
/**
* A [ListAdapter] that can display [Session] items.
*/
class MenuAdapter :
class MenuAdapter(private val onClick: (Session) -> Unit) :
ListAdapter<Session, MenuAdapter.ViewHolder>(SessionDiffCallback) {
inner class ViewHolder(binding: FragmentMenuItemBinding) :
RecyclerView.ViewHolder(binding.root) {
private val sessionNameText: TextView = binding.sessionName
private var currentSession: Session? = null
init {
binding.root.setOnClickListener {
currentSession?.let {
onClick(it)
}
}
}
fun bind(session: Session) {
currentSession = session
sessionNameText.text = session.name
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
FragmentMenuItemBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
val binding = FragmentMenuItemBinding
.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = getItem(position)
holder.sessionId.text = item.id
holder.bind(item)
}
inner class ViewHolder(
binding: FragmentMenuItemBinding
) : RecyclerView.ViewHolder(binding.root) {
val sessionId: TextView = binding.sessionId
override fun toString(): String {
return super.toString() + " '" + sessionId.text + "'"
}
}
//override fun getItemCount(): Int = values.size
override fun getItemCount() = currentList.size
}
object SessionDiffCallback : DiffUtil.ItemCallback<Session>() {

View file

@ -4,11 +4,15 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController
import androidx.navigation.navGraphViewModels
import com.example.palto.R
import com.example.palto.databinding.FragmentMenuListBinding
import com.example.palto.domain.Session
import com.example.palto.ui.UserViewModel
/**
* A fragment representing a list of Sessions.
@ -16,11 +20,13 @@ import com.example.palto.databinding.FragmentMenuListBinding
class MenuFragment : Fragment() {
private val menuViewModel: MenuViewModel by
navGraphViewModels(R.id.nav_graph)
navGraphViewModels(R.id.nav_graph) { MenuViewModel.Factory }
private val userViewModel: UserViewModel by
activityViewModels() { UserViewModel.Factory }
private var _binding: FragmentMenuListBinding? = null
// This property is only valid between onCreateView and onDestroyView
private val binding get() = _binding!!
private lateinit var binding: FragmentMenuListBinding
override fun onCreateView(
inflater: LayoutInflater,
@ -41,17 +47,25 @@ class MenuFragment : Fragment() {
}
// Display the list of sessions.
val adapter = MenuAdapter()
// Create a new MenuAdapter (list) with the given function when clicking an item.
val adapter = MenuAdapter { adapterOnClick(it) }
binding.menuList.adapter = adapter
// Link the adapter with the session list in the menuViewMode.
menuViewModel.sessions.observe(viewLifecycleOwner) {
adapter.submitList(it)
}
// Bind the add button.
binding.createSession.setOnClickListener {
menuViewModel.createSession()
findNavController().navigate(R.id.action_menuFragment_to_sessionFragment)
navController.navigate(R.id.action_menuFragment_to_newSessionFragment)
}
return binding.root
}
private fun adapterOnClick(session: Session) {
val bundle = bundleOf("session" to session.id)
findNavController().navigate(R.id.action_menuFragment_to_sessionFragment, bundle)
}
}

View file

@ -4,18 +4,34 @@ import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.example.palto.data.repository.TokenRepository
import com.example.palto.data.repository.UserRepository
import com.example.palto.domain.Session
import com.example.palto.ui.UserViewModel
class MenuViewModel() : ViewModel() {
private var _sessions = MutableLiveData<List<Session>>(emptyList())
val sessions = _sessions as LiveData<List<Session>>
val sessions: LiveData<List<Session>> = _sessions
fun createSession() {
fun createSession(name: String) {
val list = _sessions.value ?: emptyList()
val session = Session(
id = "aahh"
id = list.size,
name = name,
attendances = emptyList()
)
_sessions.value = (_sessions.value ?: emptyList()) + session
Log.d("PALTO", "MenuViewModel: a session has been added into the list.")
_sessions.value = list + session
Log.d("Palto", "MenuViewModel: A session has been added into the list.")
}
companion object {
val Factory: ViewModelProvider.Factory = object : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return MenuViewModel() as T
}
}
}
}

View file

@ -4,11 +4,17 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
<!--<TextView
android:id="@+id/session_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/text_margin"
android:textAppearance="?attr/textAppearanceListItem" />
android:textAppearance="?attr/textAppearanceListItem" />-->
<TextView
android:id="@+id/session_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:textAppearance="?attr/textAppearanceListItem"/>
</LinearLayout>

View file

@ -21,6 +21,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
android:clickable="true"
android:contentDescription="@string/create_session"
app:srcCompat="@android:drawable/ic_input_add" />

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/new_session_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@string/new_session_name_hint"
android:inputType="text"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@+id/new_session_create"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/new_session_create"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/new_session_button_create"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/new_session_name" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -4,27 +4,37 @@
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/menuFragment">
<fragment
android:id="@+id/loginFragment"
android:name="com.example.palto.ui.login.LoginFragment"
android:label="fragment._login"
tools:layout="@layout/fragment_login" />
<fragment
android:id="@+id/sessionFragment"
android:name="com.example.palto.ui.session.SessionFragment"
android:label="fragment_session_list"
tools:layout="@layout/fragment_session_list" />
<fragment
android:id="@+id/menuFragment"
android:name="com.example.palto.ui.menu.MenuFragment"
android:label="fragment_menu_list"
android:label="Menu Palto"
tools:layout="@layout/fragment_menu_list" >
<action
android:id="@+id/action_menuFragment_to_loginFragment"
app:destination="@id/loginFragment" />
<action
android:id="@+id/action_menuFragment_to_sessionFragment"
app:destination="@id/sessionFragment" />
<action
android:id="@+id/action_menuFragment_to_newSessionFragment"
app:destination="@id/newSessionFragment" />
</fragment>
<fragment
android:id="@+id/loginFragment"
android:name="com.example.palto.ui.login.LoginFragment"
android:label="Connexion"
tools:layout="@layout/fragment_login" />
<fragment
android:id="@+id/newSessionFragment"
android:name="com.example.palto.ui.menu.new_session.NewSessionFragment"
android:label="Nouvelle fiche"
tools:layout="@layout/fragment_new_session"/>
<fragment
android:id="@+id/sessionFragment"
android:name="com.example.palto.ui.session.SessionFragment"
android:label="Fiche de présence"
tools:layout="@layout/fragment_session_list" />
</navigation>

View file

@ -15,4 +15,8 @@
<string name="help_message">Identifiants Invalides</string>
<string name="create_session">Créer une session</string>
<string name="create_card">Créer une présence</string>
<string name="nouvelle_fiche">Nouvelle Fiche</string>
<string name="new_session_name_hint">Nom de la fiche</string>
<string name="new_session_button_create">Créer</string>
<string name="menu_item_logout">Déconnexion</string>
</resources>