отчеты начаты
This commit is contained in:
parent
1921585f6f
commit
989a86b77c
@ -11,7 +11,7 @@ android {
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "com.example.myapplication"
|
||||
minSdk = 24
|
||||
minSdk = 26
|
||||
targetSdk = 33
|
||||
versionCode = 1
|
||||
versionName = "1.0"
|
||||
|
@ -56,6 +56,10 @@ sealed class BottomBarScreen(
|
||||
route = "KPOP",
|
||||
title=""
|
||||
)
|
||||
object Report: BottomBarScreen(
|
||||
route = "REPORT",
|
||||
title=""
|
||||
)
|
||||
object DirectionView: BottomBarScreen(
|
||||
route = "DIRECTIONVIEW",
|
||||
title="",
|
||||
|
@ -18,6 +18,7 @@ import com.example.myapplication.House
|
||||
import com.example.myapplication.Kpop
|
||||
import com.example.myapplication.Profile
|
||||
import com.example.myapplication.Registration
|
||||
import com.example.myapplication.Report
|
||||
import com.example.myapplication.ui.About
|
||||
import com.example.myapplication.ui.AppViewModelProvider
|
||||
import com.example.myapplication.ui.edit.DayDropDownViewModel
|
||||
@ -46,6 +47,7 @@ fun HomeNavGraph(navController: NavHostController, currentUserViewModel: Current
|
||||
composable(route = BottomBarScreen.Contemp.route) { Contemp() }
|
||||
composable(route = BottomBarScreen.BrDance.route) { BrDance() }
|
||||
composable(route = BottomBarScreen.Kpop.route) { Kpop() }
|
||||
composable(route = BottomBarScreen.Report.route) { Report() }
|
||||
composable(
|
||||
BottomBarScreen.LessonEdit.route,
|
||||
arguments = listOf(navArgument("id") { type = NavType.IntType })
|
||||
|
@ -371,8 +371,8 @@ fun Profile(navController: NavController, modifier: Modifier = Modifier, lessonL
|
||||
// modifier = Modifier
|
||||
// .requiredWidth(width = 200.dp)
|
||||
// .requiredHeight(height = 44.dp)
|
||||
// .wrapContentHeight(align = Alignment.CenterVertically)
|
||||
// .clickable { navController.navigate(route = AuthScreen.Enter.route); getUser = null })
|
||||
// .wrapContentHeight(align = Alignment.CenterVertically))
|
||||
// //.clickable { navController.navigate(route = AuthScreen.Enter.route); getUser = null })
|
||||
// }
|
||||
}
|
||||
}
|
||||
@ -459,7 +459,6 @@ fun Profile(navController: NavController, modifier: Modifier = Modifier, lessonL
|
||||
.requiredHeight(height = 80.dp)
|
||||
.clip(shape = RoundedCornerShape(5.dp))
|
||||
.background(color = Color.White)
|
||||
|
||||
)
|
||||
if (getUser?.role == RoleEnum.User) {
|
||||
Text(
|
||||
@ -478,8 +477,8 @@ fun Profile(navController: NavController, modifier: Modifier = Modifier, lessonL
|
||||
}
|
||||
else{
|
||||
Text(
|
||||
text = "К записи",
|
||||
color = Color.White,
|
||||
text = "Получить отчет",
|
||||
color = Color.Black,
|
||||
textAlign = TextAlign.Center,
|
||||
style = TextStyle(
|
||||
fontSize = 17.sp,
|
||||
@ -491,10 +490,8 @@ fun Profile(navController: NavController, modifier: Modifier = Modifier, lessonL
|
||||
.wrapContentHeight(align = Alignment.CenterVertically)
|
||||
.align(Alignment.Center)
|
||||
.clickable(
|
||||
enabled = getUser?.lessonId != null,
|
||||
onClick = {
|
||||
val route = BottomBarScreen.LessonRecord.route.replace("{id}", lessonId.toString())
|
||||
navController.navigate(route)
|
||||
navController.navigate("report")
|
||||
})
|
||||
)
|
||||
}
|
||||
@ -520,7 +517,7 @@ fun Profile(navController: NavController, modifier: Modifier = Modifier, lessonL
|
||||
)
|
||||
)
|
||||
Text(
|
||||
text = "Получить отчет",
|
||||
text = "К записи",
|
||||
color = Color.White,
|
||||
textAlign = TextAlign.Center,
|
||||
style = TextStyle(
|
||||
|
55
app/src/main/java/com/example/myapplication/Report.kt
Normal file
55
app/src/main/java/com/example/myapplication/Report.kt
Normal file
@ -0,0 +1,55 @@
|
||||
package com.example.myapplication
|
||||
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.material3.Button
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.TextField
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Composable
|
||||
fun Report() {
|
||||
var startRecord by remember { mutableStateOf("") }
|
||||
var endRecord by remember { mutableStateOf("") }
|
||||
|
||||
Column(
|
||||
modifier = Modifier.padding(16.dp)
|
||||
) {
|
||||
// Поле ввода для startRecord
|
||||
TextField(
|
||||
value = startRecord,
|
||||
onValueChange = { startRecord = it },
|
||||
label = { Text("Start Record") },
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
)
|
||||
|
||||
// Поле ввода для endRecord
|
||||
TextField(
|
||||
value = endRecord,
|
||||
onValueChange = { endRecord = it },
|
||||
label = { Text("End Record") },
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
)
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
|
||||
// Кнопка "Сформировать"
|
||||
Button(
|
||||
onClick = {
|
||||
},
|
||||
modifier = Modifier.align(Alignment.CenterHorizontally)
|
||||
) {
|
||||
Text(text = "Сформировать")
|
||||
}
|
||||
}
|
||||
}
|
@ -3,6 +3,7 @@ package com.example.myapplication.api
|
||||
import com.example.myapplication.api.model.DayOfWeekRemote
|
||||
import com.example.myapplication.api.model.DirectionRemote
|
||||
import com.example.myapplication.api.model.LessonRemote
|
||||
import com.example.myapplication.api.model.ReportRemote
|
||||
import com.example.myapplication.api.model.UserRemote
|
||||
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
|
||||
import kotlinx.serialization.json.Json
|
||||
@ -19,6 +20,11 @@ import retrofit2.http.Path
|
||||
import retrofit2.http.Query
|
||||
|
||||
interface MyServerService {
|
||||
@GET("report")
|
||||
suspend fun getReport(
|
||||
@Query("startDate") startRecord: Int,
|
||||
@Query("endDate") endRecord: Int
|
||||
): List<ReportRemote>
|
||||
@GET("days")
|
||||
suspend fun getDays(): List<DayOfWeekRemote>
|
||||
|
||||
|
@ -9,7 +9,6 @@ data class LessonRemote(
|
||||
val teacher: String = "",
|
||||
val time: String = "",
|
||||
val classNumber: Int = 0,
|
||||
|
||||
val dayOfWeekId: Int = 0,
|
||||
val directionId: Int = 0,
|
||||
val countRecord: Int = 0
|
||||
|
@ -0,0 +1,12 @@
|
||||
package com.example.myapplication.api.model
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class ReportRemote(
|
||||
val lessonName: String = "",
|
||||
val lessonDay: String = "",
|
||||
val lessonTime: String = "",
|
||||
val countRecords: Int = 0,
|
||||
val countFreeRecords: Int = 0
|
||||
)
|
@ -10,6 +10,7 @@ import com.example.myapplication.api.day.RestDayOfWeekRepository
|
||||
import com.example.myapplication.api.direction.RestDirectionRepository
|
||||
import com.example.myapplication.api.lesson.LessonRemoteMediator
|
||||
import com.example.myapplication.api.lesson.RestLessonRepository
|
||||
import com.example.myapplication.api.model.ReportRemote
|
||||
import com.example.myapplication.api.model.toDayOfWeek
|
||||
import com.example.myapplication.api.model.toLesson
|
||||
import com.example.myapplication.api.model.toLessonRemote
|
||||
@ -50,6 +51,10 @@ class RestUserRepository(
|
||||
|
||||
return existUsers.map { it.value }.sortedBy { it.uid }
|
||||
}
|
||||
override suspend fun getReport(startRecord: Int, endRecord: Int):List<ReportRemote>
|
||||
{
|
||||
return service.getReport(startRecord,endRecord)
|
||||
}
|
||||
|
||||
override suspend fun getUserById(uid: Int?): User? =
|
||||
uid?.let { service.getUserById(it).toUser() }
|
||||
|
@ -4,7 +4,6 @@ import android.content.Context
|
||||
import androidx.room.Database
|
||||
import androidx.room.Room
|
||||
import androidx.room.RoomDatabase
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
import com.example.myapplication.dataBase.dao.DayDao
|
||||
import com.example.myapplication.dataBase.dao.DirectionDao
|
||||
import com.example.myapplication.dataBase.dao.LessonDao
|
||||
@ -16,8 +15,6 @@ import com.example.myapplication.dataBase.model.RoleEnum
|
||||
import com.example.myapplication.dataBase.model.User
|
||||
import com.example.myapplication.dataBase.remotekeys.dao.RemoteKeysDao
|
||||
import com.example.myapplication.dataBase.remotekeys.model.RemoteKeys
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
@Database(entities = [Lesson::class, DayOfWeek::class, Direction::class, User::class, RemoteKeys::class], version = 1, exportSchema = false)
|
||||
@ -29,7 +26,7 @@ abstract class AppDatabase : RoomDatabase() {
|
||||
abstract fun remoteKeysDao(): RemoteKeysDao
|
||||
|
||||
companion object {
|
||||
private const val DB_NAME: String = "bd8"
|
||||
private const val DB_NAME: String = "bd111"
|
||||
|
||||
@Volatile
|
||||
private var INSTANCE: AppDatabase? = null
|
||||
|
@ -10,7 +10,7 @@ import androidx.room.PrimaryKey
|
||||
entity = Lesson::class,
|
||||
parentColumns = ["uid"],
|
||||
childColumns = ["lesson_id"],
|
||||
onDelete = ForeignKey.CASCADE,
|
||||
onDelete = ForeignKey.SET_NULL,
|
||||
onUpdate = ForeignKey.CASCADE
|
||||
)])
|
||||
data class User(
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.example.myapplication.dataBase.repository
|
||||
|
||||
import com.example.myapplication.api.model.ReportRemote
|
||||
import com.example.myapplication.dataBase.dao.UserDao
|
||||
import com.example.myapplication.dataBase.model.User
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
@ -15,4 +16,7 @@ class OfflineUserRepository(private val userDao: UserDao) : UserRepository {
|
||||
override suspend fun getUserById(uid: Int?): User = userDao.getUserById(uid).first()
|
||||
|
||||
override suspend fun getAllUsers(): List<User> = userDao.getAll()
|
||||
override suspend fun getReport(startRecord: Int, endRecord: Int): List<ReportRemote> {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
package com.example.myapplication.dataBase.repository
|
||||
|
||||
import com.example.myapplication.api.model.ReportRemote
|
||||
import com.example.myapplication.dataBase.model.User
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
@ -9,4 +10,5 @@ interface UserRepository {
|
||||
suspend fun deleteUser(user: User)
|
||||
suspend fun getUserById(uid: Int?): User?
|
||||
suspend fun getAllUsers(): List<User>
|
||||
suspend fun getReport(startRecord: Int, endRecord: Int):List<ReportRemote>
|
||||
}
|
@ -55,7 +55,11 @@ import kotlinx.coroutines.launch
|
||||
import androidx.compose.foundation.lazy.items
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.ExperimentalMaterialApi
|
||||
import androidx.compose.material.icons.filled.Delete
|
||||
import androidx.compose.material.pullrefresh.PullRefreshIndicator
|
||||
import androidx.compose.material.pullrefresh.pullRefresh
|
||||
import androidx.compose.material.pullrefresh.rememberPullRefreshState
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
@ -69,6 +73,7 @@ import androidx.compose.ui.zIndex
|
||||
import androidx.navigation.NavHostController
|
||||
import androidx.paging.compose.LazyPagingItems
|
||||
import androidx.paging.compose.collectAsLazyPagingItems
|
||||
import androidx.paging.compose.itemContentType
|
||||
import androidx.paging.compose.itemKey
|
||||
import com.example.myapplication.Enter
|
||||
import com.example.myapplication.Graph.BottomBarScreen
|
||||
@ -189,21 +194,14 @@ private fun SwipeToDelete(
|
||||
)
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
|
||||
@Composable
|
||||
private fun LessonList(
|
||||
modifier: Modifier = Modifier,
|
||||
lessonList: LazyPagingItems<Lesson>,
|
||||
onClick: (uid: Int) -> Unit,
|
||||
onClick: (id: Int) -> Unit,
|
||||
onSwipe: (lesson: Lesson) -> Unit
|
||||
) {
|
||||
val refreshScope = rememberCoroutineScope()
|
||||
var refreshing by remember { mutableStateOf(false) }
|
||||
fun refresh() = refreshScope.launch {
|
||||
refreshing = true
|
||||
lessonList.refresh()
|
||||
refreshing = false
|
||||
}
|
||||
Column(
|
||||
modifier = modifier
|
||||
) {
|
||||
@ -504,6 +502,7 @@ private fun LessonList(
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Composable
|
||||
private fun LessonListItem(
|
||||
lesson: Lesson, modifier: Modifier = Modifier
|
||||
|
@ -14,7 +14,7 @@
|
||||
<string name="lesson_record_button">Записаться</string>
|
||||
<string name="lesson_cancel_button">Отменить запись</string>
|
||||
<string name="student_phone">Телефон</string>
|
||||
<string name="lesson_TimeDate">Время начала и конца</string>
|
||||
<string name="lesson_TimeDate">Время</string>
|
||||
<string name="lesson_DayOfWeek">День недели</string>
|
||||
<string name="student_email">e-mail</string>
|
||||
<string name="lessons_main_title">Расписание</string>
|
||||
|
@ -59,7 +59,7 @@
|
||||
{
|
||||
"id": 1,
|
||||
"teacher": "Анна",
|
||||
"time": "9.00-10.00",
|
||||
"time": "9:00",
|
||||
"classNumber": 2,
|
||||
"dayOfWeekId": 1,
|
||||
"directionId": 1,
|
||||
@ -68,7 +68,7 @@
|
||||
{
|
||||
"id": 3,
|
||||
"teacher": "Мария",
|
||||
"time": "17.00-18.00",
|
||||
"time": "17:00",
|
||||
"classNumber": 3,
|
||||
"dayOfWeekId": 2,
|
||||
"directionId": 3,
|
||||
@ -77,37 +77,11 @@
|
||||
{
|
||||
"id": 4,
|
||||
"teacher": "Алла",
|
||||
"time": "9.00-12.30",
|
||||
"time": "9:30",
|
||||
"classNumber": 6,
|
||||
"dayOfWeekId": 3,
|
||||
"directionId": 3,
|
||||
"dayOfWeekId": 3,
|
||||
"countRecord": 4
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"teacher": "Илона",
|
||||
"time": "8.00-9.00",
|
||||
"classNumber": 6,
|
||||
"dayOfWeekId": 5,
|
||||
"directionId": 1,
|
||||
"countRecord": 5
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"teacher": "Софья Олеговна",
|
||||
"time": "10.00",
|
||||
"classNumber": 6,
|
||||
"dayOfWeekId": 3,
|
||||
"directionId": 6,
|
||||
"countRecord": 5
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"teacher": "Илона",
|
||||
"time": "10.00",
|
||||
"classNumber": 5,
|
||||
"dayOfWeekId": 5,
|
||||
"directionId": 3
|
||||
}
|
||||
],
|
||||
"users": [
|
||||
@ -125,7 +99,7 @@
|
||||
"password": "5678",
|
||||
"fio": "Илья Петрович Мунин",
|
||||
"role": "User",
|
||||
"lessonId": 7
|
||||
"lessonId": null
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
@ -133,7 +107,7 @@
|
||||
"password": "13579",
|
||||
"fio": "Мария Денисовна Амова",
|
||||
"role": "User",
|
||||
"lessonId": 3
|
||||
"lessonId": null
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
@ -141,7 +115,7 @@
|
||||
"password": "user7",
|
||||
"fio": "user7",
|
||||
"role": "User",
|
||||
"lessonId": 7
|
||||
"lessonId": null
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
@ -157,7 +131,7 @@
|
||||
"password": "parol",
|
||||
"fio": "user7",
|
||||
"role": "User",
|
||||
"lessonId": 7
|
||||
"lessonId": null
|
||||
}
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue
Block a user