Extract components
This commit is contained in:
@@ -2,8 +2,6 @@ package de.sebse.fuplanner2.ui.details
|
|||||||
|
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.foundation.lazy.items
|
import androidx.compose.foundation.lazy.items
|
||||||
import androidx.compose.material.MaterialTheme
|
|
||||||
import androidx.compose.material.Text
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
@@ -20,6 +18,7 @@ import de.sebse.fuplanner2.database.Course
|
|||||||
import de.sebse.fuplanner2.ui.details.components.AnnouncementItem
|
import de.sebse.fuplanner2.ui.details.components.AnnouncementItem
|
||||||
import de.sebse.fuplanner2.ui.details.components.LecturerItem
|
import de.sebse.fuplanner2.ui.details.components.LecturerItem
|
||||||
import de.sebse.fuplanner2.ui.details.components.QuickLinks
|
import de.sebse.fuplanner2.ui.details.components.QuickLinks
|
||||||
|
import de.sebse.fuplanner2.ui.shared.Heading
|
||||||
import de.sebse.fuplanner2.ui.theme.AppTheme
|
import de.sebse.fuplanner2.ui.theme.AppTheme
|
||||||
import de.sebse.fuplanner2.ui.tools.previews.AnnouncementPreviewProvider
|
import de.sebse.fuplanner2.ui.tools.previews.AnnouncementPreviewProvider
|
||||||
import de.sebse.fuplanner2.ui.tools.previews.CoursePreviewProvider
|
import de.sebse.fuplanner2.ui.tools.previews.CoursePreviewProvider
|
||||||
@@ -49,24 +48,18 @@ fun CourseDetailsScreen(course: Course?, announcement: List<Announcement>?, id:
|
|||||||
LazyColumn {
|
LazyColumn {
|
||||||
item {
|
item {
|
||||||
QuickLinks(courseId = id)
|
QuickLinks(courseId = id)
|
||||||
Text(
|
Heading(stringResource(R.string.lecturers))
|
||||||
text = stringResource(R.string.lecturers),
|
|
||||||
style = MaterialTheme.typography.h5
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
items(course?.lecturers ?: listOf()) {
|
items(course?.lecturers ?: listOf()) {
|
||||||
LecturerItem(lecturer = it, courseTitle = course?.title ?: "")
|
LecturerItem(lecturer = it, courseTitle = course?.title ?: "")
|
||||||
}
|
}
|
||||||
item {
|
item {
|
||||||
Text(
|
Heading(stringResource(R.string.announcements))
|
||||||
text = stringResource(R.string.announcements),
|
|
||||||
style = MaterialTheme.typography.h5
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
items(items = announcements) {
|
items(items = announcements) {
|
||||||
AnnouncementItem(it)
|
AnnouncementItem(it)
|
||||||
}
|
}
|
||||||
// TODO: Add latest announcements, current assignments, upcoming events
|
// TODO: Add current assignments, upcoming events
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +1,15 @@
|
|||||||
package de.sebse.fuplanner2.ui.details.components
|
package de.sebse.fuplanner2.ui.details.components
|
||||||
|
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.Column
|
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
|
||||||
import androidx.compose.foundation.layout.padding
|
|
||||||
import androidx.compose.material.Card
|
|
||||||
import androidx.compose.material.MaterialTheme
|
import androidx.compose.material.MaterialTheme
|
||||||
import androidx.compose.material.Text
|
import androidx.compose.material.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.res.dimensionResource
|
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import de.sebse.fuplanner2.R
|
|
||||||
import de.sebse.fuplanner2.database.Announcement
|
import de.sebse.fuplanner2.database.Announcement
|
||||||
|
import de.sebse.fuplanner2.ui.shared.FuCardColumn
|
||||||
import de.sebse.fuplanner2.ui.theme.AppTheme
|
import de.sebse.fuplanner2.ui.theme.AppTheme
|
||||||
import de.sebse.fuplanner2.ui.tools.previews.AnnouncementPreviewProvider
|
import de.sebse.fuplanner2.ui.tools.previews.AnnouncementPreviewProvider
|
||||||
import de.sebse.fuplanner2.utils.toDateTimeString
|
import de.sebse.fuplanner2.utils.toDateTimeString
|
||||||
@@ -26,26 +21,18 @@ fun AnnouncementItem(announcement: Announcement) {
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun AnnouncementItem(announcement: Announcement, click: () -> Unit) {
|
fun AnnouncementItem(announcement: Announcement, click: () -> Unit) {
|
||||||
Card(
|
FuCardColumn(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.clickable(true, onClick = click)
|
||||||
.padding(dimensionResource(R.dimen.card_view_margin)),
|
|
||||||
elevation = dimensionResource(R.dimen.card_view_elevation)
|
|
||||||
) {
|
) {
|
||||||
Column(
|
Text(
|
||||||
modifier = Modifier
|
text = announcement.title ?: "Title",
|
||||||
.clickable(true, onClick = click)
|
style = MaterialTheme.typography.h6
|
||||||
.padding(dimensionResource(R.dimen.card_view_padding))
|
)
|
||||||
) {
|
Text(
|
||||||
Text(
|
text = announcement.createdOn.toDateTimeString(LocalContext.current) ?: "",
|
||||||
text = announcement.title ?: "Title",
|
style = MaterialTheme.typography.subtitle1
|
||||||
style = MaterialTheme.typography.h6
|
)
|
||||||
)
|
|
||||||
Text(
|
|
||||||
text = announcement.createdOn.toDateTimeString(LocalContext.current) ?: "",
|
|
||||||
style = MaterialTheme.typography.subtitle1
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,24 +5,21 @@ import android.content.Intent
|
|||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.*
|
import androidx.compose.foundation.layout.*
|
||||||
import androidx.compose.material.Card
|
|
||||||
import androidx.compose.material.Icon
|
import androidx.compose.material.Icon
|
||||||
import androidx.compose.material.MaterialTheme
|
import androidx.compose.material.MaterialTheme
|
||||||
import androidx.compose.material.Text
|
import androidx.compose.material.Text
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.Email
|
import androidx.compose.material.icons.filled.Email
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Alignment
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.res.dimensionResource
|
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.style.TextDecoration
|
import androidx.compose.ui.text.style.TextDecoration
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import androidx.compose.ui.unit.dp
|
|
||||||
import de.sebse.fuplanner2.R
|
import de.sebse.fuplanner2.R
|
||||||
import de.sebse.fuplanner2.database.Lecturer
|
import de.sebse.fuplanner2.database.Lecturer
|
||||||
|
import de.sebse.fuplanner2.ui.shared.FuCardRow
|
||||||
import de.sebse.fuplanner2.ui.theme.AppTheme
|
import de.sebse.fuplanner2.ui.theme.AppTheme
|
||||||
import de.sebse.fuplanner2.ui.tools.previews.LecturerPreviewProvider
|
import de.sebse.fuplanner2.ui.tools.previews.LecturerPreviewProvider
|
||||||
|
|
||||||
@@ -38,47 +35,39 @@ fun LecturerItem(lecturer: Lecturer, courseTitle: String) {
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun LecturerItem(lecturer: Lecturer, click: () -> Unit) {
|
fun LecturerItem(lecturer: Lecturer, click: () -> Unit) {
|
||||||
Card(
|
FuCardRow(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.clickable(true, onClick = click)
|
||||||
.padding(dimensionResource(R.dimen.card_view_margin)),
|
.height(IntrinsicSize.Min)
|
||||||
elevation = dimensionResource(R.dimen.card_view_elevation)
|
|
||||||
) {
|
) {
|
||||||
Row(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.clickable(true, onClick = click)
|
.weight(1f)
|
||||||
.padding(dimensionResource(R.dimen.card_view_padding)),
|
|
||||||
verticalAlignment = Alignment.CenterVertically
|
|
||||||
) {
|
) {
|
||||||
Column(
|
val textDecor = if (lecturer.isResponsible) TextDecoration.Underline else null
|
||||||
|
Text(
|
||||||
|
text = stringResource(
|
||||||
|
R.string.full_name,
|
||||||
|
lecturer.firstName,
|
||||||
|
lecturer.lastName
|
||||||
|
),
|
||||||
|
textDecoration = textDecor,
|
||||||
|
style = MaterialTheme.typography.h6
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = lecturer.email,
|
||||||
|
style = MaterialTheme.typography.subtitle1
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Column {
|
||||||
|
Icon(
|
||||||
|
Icons.Filled.Email,
|
||||||
|
contentDescription = stringResource(R.string.mail_icon),
|
||||||
|
tint = MaterialTheme.colors.secondary,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.weight(1f)
|
.fillMaxHeight()
|
||||||
) {
|
.aspectRatio(1f, true)
|
||||||
val textDecor = if (lecturer.isResponsible) TextDecoration.Underline else null
|
)
|
||||||
Text(
|
|
||||||
text = stringResource(
|
|
||||||
R.string.full_name,
|
|
||||||
lecturer.firstName,
|
|
||||||
lecturer.lastName
|
|
||||||
),
|
|
||||||
textDecoration = textDecor,
|
|
||||||
style = MaterialTheme.typography.h6
|
|
||||||
)
|
|
||||||
Text(
|
|
||||||
text = lecturer.email,
|
|
||||||
style = MaterialTheme.typography.subtitle1
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Column {
|
|
||||||
Icon(
|
|
||||||
Icons.Filled.Email,
|
|
||||||
contentDescription = stringResource(R.string.mail_icon),
|
|
||||||
tint = MaterialTheme.colors.secondary,
|
|
||||||
modifier = Modifier
|
|
||||||
.height(70.dp)
|
|
||||||
.aspectRatio(1f, true)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
46
app/src/main/java/de/sebse/fuplanner2/ui/shared/FuCard.kt
Normal file
46
app/src/main/java/de/sebse/fuplanner2/ui/shared/FuCard.kt
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package de.sebse.fuplanner2.ui.shared
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.material.Card
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.res.dimensionResource
|
||||||
|
import de.sebse.fuplanner2.R
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun FuCardColumn(
|
||||||
|
modifier: Modifier,
|
||||||
|
content :@Composable (ColumnScope.() -> Unit)
|
||||||
|
) {
|
||||||
|
Card(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(dimensionResource(R.dimen.card_view_margin)),
|
||||||
|
elevation = dimensionResource(R.dimen.card_view_elevation)
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = modifier
|
||||||
|
.padding(dimensionResource(R.dimen.card_view_padding)),
|
||||||
|
content = content
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun FuCardRow(
|
||||||
|
modifier: Modifier,
|
||||||
|
content :@Composable (RowScope.() -> Unit)
|
||||||
|
) {
|
||||||
|
Card(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(dimensionResource(R.dimen.card_view_margin)),
|
||||||
|
elevation = dimensionResource(R.dimen.card_view_elevation)
|
||||||
|
) {
|
||||||
|
Row (
|
||||||
|
modifier = modifier
|
||||||
|
.padding(dimensionResource(R.dimen.card_view_padding)),
|
||||||
|
content = content
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
13
app/src/main/java/de/sebse/fuplanner2/ui/shared/Heading.kt
Normal file
13
app/src/main/java/de/sebse/fuplanner2/ui/shared/Heading.kt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package de.sebse.fuplanner2.ui.shared
|
||||||
|
|
||||||
|
import androidx.compose.material.MaterialTheme
|
||||||
|
import androidx.compose.material.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun Heading(text: String) {
|
||||||
|
Text(
|
||||||
|
text = text,
|
||||||
|
style = MaterialTheme.typography.h5
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user