Сценарии адаптированы под новую схему API
Этот коммит содержится в:
родитель
829d41a70a
Коммит
6f1ac6f912
@ -102,7 +102,7 @@ fun ScenarioDialog(
|
||||
mutableStateOf(scenarioDialogState.value?.name)
|
||||
}
|
||||
val timeState = remember {
|
||||
mutableStateOf(scenarioDialogState.value?.time)
|
||||
mutableStateOf(scenarioDialogState.value?.startTime)
|
||||
}
|
||||
|
||||
Dialog(
|
||||
@ -393,354 +393,360 @@ fun ScenarioDialog(
|
||||
modifier = Modifier
|
||||
.height(16.dp),
|
||||
)
|
||||
Card(
|
||||
colors = CardDefaults.cardColors(
|
||||
containerColor = MaterialTheme.colorScheme.surfaceContainer,
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
fun MessageCard() {
|
||||
Card(
|
||||
colors = CardDefaults.cardColors(
|
||||
containerColor = MaterialTheme.colorScheme.surfaceContainer,
|
||||
),
|
||||
) {
|
||||
val dropdownMenuState = remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
val messageTypeState = remember {
|
||||
mutableStateOf(MessageType.TEXT)
|
||||
}
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.padding(16.dp),
|
||||
) {
|
||||
Text(
|
||||
text = "Общее",
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
OutlinedTextField(
|
||||
value = "",
|
||||
onValueChange = {},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth(),
|
||||
label = {
|
||||
Text(
|
||||
text = "Название",
|
||||
)
|
||||
},
|
||||
leadingIcon = {
|
||||
Icon(
|
||||
painter = painterResource(Res.drawable.baseline_title_24),
|
||||
contentDescription = null,
|
||||
)
|
||||
},
|
||||
supportingText = {
|
||||
Text(
|
||||
text = "Отображается в списке переходов",
|
||||
)
|
||||
},
|
||||
isError = false,
|
||||
singleLine = true,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
OutlinedTextField(
|
||||
value = "",
|
||||
onValueChange = {},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth(),
|
||||
label = {
|
||||
Text(
|
||||
text = "Время окончания",
|
||||
)
|
||||
},
|
||||
leadingIcon = {
|
||||
Icon(
|
||||
painter = painterResource(Res.drawable.outline_time_auto_24),
|
||||
contentDescription = null,
|
||||
)
|
||||
},
|
||||
supportingText = {
|
||||
Text(
|
||||
text = "Время прекращения обработки событий",
|
||||
)
|
||||
},
|
||||
isError = false,
|
||||
singleLine = true,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
val disableNotificationCheckboxState = remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
TextCheckbox(
|
||||
text = "Не отправлять уведомление",
|
||||
checkboxState = disableNotificationCheckboxState,
|
||||
)
|
||||
val deleteAfterEndCheckboxState = remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
TextCheckbox(
|
||||
text = "Удалить после окончания",
|
||||
checkboxState = deleteAfterEndCheckboxState,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
ExposedDropdownMenuBox(
|
||||
expanded = dropdownMenuState.value,
|
||||
onExpandedChange = { value ->
|
||||
dropdownMenuState.value = value
|
||||
},
|
||||
modifier = Modifier
|
||||
.pointerHoverIcon(
|
||||
icon = PointerIcon.Default,
|
||||
overrideDescendants = true,
|
||||
),
|
||||
) {
|
||||
val dropdownMenuState = remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
val messageTypeState = remember {
|
||||
mutableStateOf(MessageType.TEXT)
|
||||
}
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.padding(16.dp),
|
||||
) {
|
||||
) {
|
||||
OutlinedTextField(
|
||||
value = messageTypeState.value.displayName,
|
||||
onValueChange = {},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.menuAnchor(),
|
||||
label = {
|
||||
Text(
|
||||
text = "Общее",
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
text = "Тип",
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
},
|
||||
readOnly = true,
|
||||
leadingIcon = {
|
||||
Icon(
|
||||
painter = painterResource(messageTypeState.value.icon),
|
||||
contentDescription = null,
|
||||
)
|
||||
OutlinedTextField(
|
||||
value = "",
|
||||
onValueChange = {},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth(),
|
||||
label = {
|
||||
Text(
|
||||
text = "Название",
|
||||
)
|
||||
},
|
||||
leadingIcon = {
|
||||
Icon(
|
||||
painter = painterResource(Res.drawable.baseline_title_24),
|
||||
contentDescription = null,
|
||||
)
|
||||
},
|
||||
supportingText = {
|
||||
Text(
|
||||
text = "Отображается в списке переходов",
|
||||
)
|
||||
},
|
||||
isError = false,
|
||||
singleLine = true,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
OutlinedTextField(
|
||||
value = "",
|
||||
onValueChange = {},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth(),
|
||||
label = {
|
||||
Text(
|
||||
text = "Время окончания",
|
||||
)
|
||||
},
|
||||
leadingIcon = {
|
||||
Icon(
|
||||
painter = painterResource(Res.drawable.outline_time_auto_24),
|
||||
contentDescription = null,
|
||||
)
|
||||
},
|
||||
supportingText = {
|
||||
Text(
|
||||
text = "Время прекращения обработки событий",
|
||||
)
|
||||
},
|
||||
isError = false,
|
||||
singleLine = true,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
val disableNotificationCheckboxState = remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
TextCheckbox(
|
||||
text = "Не отправлять уведомление",
|
||||
checkboxState = disableNotificationCheckboxState,
|
||||
)
|
||||
val deleteAfterEndCheckboxState = remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
TextCheckbox(
|
||||
text = "Удалить после окончания",
|
||||
checkboxState = deleteAfterEndCheckboxState,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
ExposedDropdownMenuBox(
|
||||
},
|
||||
trailingIcon = {
|
||||
ExposedDropdownMenuDefaults.TrailingIcon(
|
||||
expanded = dropdownMenuState.value,
|
||||
onExpandedChange = { value ->
|
||||
dropdownMenuState.value = value
|
||||
)
|
||||
},
|
||||
isError = false,
|
||||
singleLine = true,
|
||||
)
|
||||
ExposedDropdownMenu(
|
||||
expanded = dropdownMenuState.value,
|
||||
onDismissRequest = {
|
||||
dropdownMenuState.value = false
|
||||
},
|
||||
) {
|
||||
MessageType.entries.forEach {
|
||||
DropdownMenuItem(
|
||||
text = {
|
||||
Text(
|
||||
text = it.displayName,
|
||||
)
|
||||
},
|
||||
modifier = Modifier
|
||||
.pointerHoverIcon(
|
||||
icon = PointerIcon.Default,
|
||||
overrideDescendants = true,
|
||||
),
|
||||
) {
|
||||
OutlinedTextField(
|
||||
value = messageTypeState.value.displayName,
|
||||
onValueChange = {},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.menuAnchor(),
|
||||
label = {
|
||||
Text(
|
||||
text = "Тип",
|
||||
)
|
||||
},
|
||||
readOnly = true,
|
||||
leadingIcon = {
|
||||
Icon(
|
||||
painter = painterResource(messageTypeState.value.icon),
|
||||
contentDescription = null,
|
||||
)
|
||||
},
|
||||
trailingIcon = {
|
||||
ExposedDropdownMenuDefaults.TrailingIcon(
|
||||
expanded = dropdownMenuState.value,
|
||||
)
|
||||
},
|
||||
isError = false,
|
||||
singleLine = true,
|
||||
)
|
||||
ExposedDropdownMenu(
|
||||
expanded = dropdownMenuState.value,
|
||||
onDismissRequest = {
|
||||
dropdownMenuState.value = false
|
||||
},
|
||||
) {
|
||||
MessageType.entries.forEach {
|
||||
DropdownMenuItem(
|
||||
text = {
|
||||
Text(
|
||||
text = it.displayName,
|
||||
)
|
||||
},
|
||||
onClick = {
|
||||
messageTypeState.value = it
|
||||
dropdownMenuState.value = false
|
||||
},
|
||||
leadingIcon = {
|
||||
Icon(
|
||||
painter = painterResource(it.icon),
|
||||
contentDescription = null,
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
when {
|
||||
messageTypeState.value != MessageType.DICE -> {
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(16.dp),
|
||||
onClick = {
|
||||
messageTypeState.value = it
|
||||
dropdownMenuState.value = false
|
||||
},
|
||||
leadingIcon = {
|
||||
Icon(
|
||||
painter = painterResource(it.icon),
|
||||
contentDescription = null,
|
||||
)
|
||||
Text(
|
||||
text = messageTypeState.value.displayName,
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
when (messageTypeState.value) {
|
||||
MessageType.TEXT -> {
|
||||
val textState = remember {
|
||||
mutableStateOf("")
|
||||
}
|
||||
OutlinedTextField(
|
||||
value = textState.value,
|
||||
onValueChange = { value ->
|
||||
textState.value = value
|
||||
},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth(),
|
||||
label = {
|
||||
Text(
|
||||
text = "Текст сообщения",
|
||||
)
|
||||
},
|
||||
isError = false,
|
||||
maxLines = 6,
|
||||
)
|
||||
}
|
||||
MessageType.POLL -> {
|
||||
val questionState = remember {
|
||||
mutableStateOf("")
|
||||
}
|
||||
OutlinedTextField(
|
||||
value = questionState.value,
|
||||
onValueChange = { value ->
|
||||
questionState.value = value
|
||||
},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth(),
|
||||
label = {
|
||||
Text(
|
||||
text = "Вопрос",
|
||||
)
|
||||
},
|
||||
isError = false,
|
||||
singleLine = true,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(16.dp),
|
||||
)
|
||||
Text(
|
||||
text = "Варианты ответа",
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
val optionState = remember {
|
||||
mutableStateOf("")
|
||||
}
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
OutlinedTextField(
|
||||
value = optionState.value,
|
||||
onValueChange = { value ->
|
||||
optionState.value = value
|
||||
},
|
||||
modifier = Modifier
|
||||
.weight(1f),
|
||||
label = {},
|
||||
isError = false,
|
||||
singleLine = true,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.width(8.dp),
|
||||
)
|
||||
IconButton(
|
||||
onClick = {},
|
||||
) {
|
||||
Icon(
|
||||
painter = painterResource(Res.drawable.outline_adjust_24),
|
||||
contentDescription = null,
|
||||
)
|
||||
}
|
||||
}
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(16.dp),
|
||||
)
|
||||
Text(
|
||||
text = "Настройки",
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
val anonymousPollCheckboxState = remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
TextCheckbox(
|
||||
text = "Анонимное голосование",
|
||||
checkboxState = anonymousPollCheckboxState,
|
||||
)
|
||||
val multiselectPollCheckboxState = remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
TextCheckbox(
|
||||
text = "Выбор нескольких ответов",
|
||||
checkboxState = multiselectPollCheckboxState,
|
||||
)
|
||||
}
|
||||
MessageType.MEDIA -> {
|
||||
OutlinedButton(
|
||||
onClick = {},
|
||||
) {
|
||||
Icon(
|
||||
painter = painterResource(Res.drawable.baseline_attach_file_24),
|
||||
contentDescription = null,
|
||||
)
|
||||
Text(
|
||||
text = "Прикрепить файл",
|
||||
)
|
||||
}
|
||||
}
|
||||
MessageType.CONTACT -> {
|
||||
val contactPhoneNumberState = remember {
|
||||
mutableStateOf("")
|
||||
}
|
||||
OutlinedTextField(
|
||||
value = contactPhoneNumberState.value,
|
||||
onValueChange = { value ->
|
||||
contactPhoneNumberState.value = value
|
||||
},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth(),
|
||||
label = {
|
||||
Text(
|
||||
text = "Номер телефона",
|
||||
)
|
||||
},
|
||||
isError = false,
|
||||
singleLine = true,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
val contactNameState = remember {
|
||||
mutableStateOf("")
|
||||
}
|
||||
OutlinedTextField(
|
||||
value = contactNameState.value,
|
||||
onValueChange = { value ->
|
||||
contactNameState.value = value
|
||||
},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth(),
|
||||
label = {
|
||||
Text(
|
||||
text = "Имя",
|
||||
)
|
||||
},
|
||||
isError = false,
|
||||
singleLine = true,
|
||||
)
|
||||
}
|
||||
MessageType.DICE -> {}
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
when {
|
||||
messageTypeState.value != MessageType.DICE -> {
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(16.dp),
|
||||
)
|
||||
Text(
|
||||
text = messageTypeState.value.displayName,
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
when (messageTypeState.value) {
|
||||
MessageType.TEXT -> {
|
||||
val textState = remember {
|
||||
mutableStateOf("")
|
||||
}
|
||||
OutlinedTextField(
|
||||
value = textState.value,
|
||||
onValueChange = { value ->
|
||||
textState.value = value
|
||||
},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth(),
|
||||
label = {
|
||||
Text(
|
||||
text = "Текст сообщения",
|
||||
)
|
||||
},
|
||||
isError = false,
|
||||
maxLines = 6,
|
||||
)
|
||||
}
|
||||
MessageType.POLL -> {
|
||||
val questionState = remember {
|
||||
mutableStateOf("")
|
||||
}
|
||||
OutlinedTextField(
|
||||
value = questionState.value,
|
||||
onValueChange = { value ->
|
||||
questionState.value = value
|
||||
},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth(),
|
||||
label = {
|
||||
Text(
|
||||
text = "Вопрос",
|
||||
)
|
||||
},
|
||||
isError = false,
|
||||
singleLine = true,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(16.dp),
|
||||
)
|
||||
Text(
|
||||
text = "Варианты ответа",
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
val optionState = remember {
|
||||
mutableStateOf("")
|
||||
}
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
OutlinedTextField(
|
||||
value = optionState.value,
|
||||
onValueChange = { value ->
|
||||
optionState.value = value
|
||||
},
|
||||
modifier = Modifier
|
||||
.weight(1f),
|
||||
label = {},
|
||||
isError = false,
|
||||
singleLine = true,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.width(8.dp),
|
||||
)
|
||||
IconButton(
|
||||
onClick = {},
|
||||
) {
|
||||
Icon(
|
||||
painter = painterResource(Res.drawable.outline_adjust_24),
|
||||
contentDescription = null,
|
||||
)
|
||||
}
|
||||
}
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(16.dp),
|
||||
)
|
||||
Text(
|
||||
text = "Настройки",
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
val anonymousPollCheckboxState = remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
TextCheckbox(
|
||||
text = "Анонимное голосование",
|
||||
checkboxState = anonymousPollCheckboxState,
|
||||
)
|
||||
val multiselectPollCheckboxState = remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
TextCheckbox(
|
||||
text = "Выбор нескольких ответов",
|
||||
checkboxState = multiselectPollCheckboxState,
|
||||
)
|
||||
}
|
||||
MessageType.MEDIA -> {
|
||||
OutlinedButton(
|
||||
onClick = {},
|
||||
) {
|
||||
Icon(
|
||||
painter = painterResource(Res.drawable.baseline_attach_file_24),
|
||||
contentDescription = null,
|
||||
)
|
||||
Text(
|
||||
text = "Прикрепить файл",
|
||||
)
|
||||
}
|
||||
}
|
||||
MessageType.CONTACT -> {
|
||||
val contactPhoneNumberState = remember {
|
||||
mutableStateOf("")
|
||||
}
|
||||
OutlinedTextField(
|
||||
value = contactPhoneNumberState.value,
|
||||
onValueChange = { value ->
|
||||
contactPhoneNumberState.value = value
|
||||
},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth(),
|
||||
label = {
|
||||
Text(
|
||||
text = "Номер телефона",
|
||||
)
|
||||
},
|
||||
isError = false,
|
||||
singleLine = true,
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier
|
||||
.height(8.dp),
|
||||
)
|
||||
val contactNameState = remember {
|
||||
mutableStateOf("")
|
||||
}
|
||||
OutlinedTextField(
|
||||
value = contactNameState.value,
|
||||
onValueChange = { value ->
|
||||
contactNameState.value = value
|
||||
},
|
||||
modifier = Modifier
|
||||
.fillMaxWidth(),
|
||||
label = {
|
||||
Text(
|
||||
text = "Имя",
|
||||
)
|
||||
},
|
||||
isError = false,
|
||||
singleLine = true,
|
||||
)
|
||||
}
|
||||
MessageType.DICE -> {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -43,12 +43,31 @@ import org.jetbrains.compose.resources.painterResource
|
||||
import ru.csasq.cit_is_bot.ui.components.SwitchButton
|
||||
import ru.csasq.cit_is_bot.ui.dialogs.ScenarioDialog
|
||||
|
||||
@Serializable
|
||||
enum class UserRole(
|
||||
val displayName: String,
|
||||
) {
|
||||
User("Пользователь"),
|
||||
Moderator("Модератор"),
|
||||
Admin("Администратор"),
|
||||
}
|
||||
|
||||
@Serializable
|
||||
data class User(
|
||||
val id: Int,
|
||||
val firstName: String,
|
||||
val lastName: String?,
|
||||
val username: String?,
|
||||
val role: UserRole,
|
||||
)
|
||||
|
||||
@Serializable
|
||||
data class Scenario(
|
||||
val id: Int? = null,
|
||||
val owner: User,
|
||||
var name: String,
|
||||
var time: String,
|
||||
var messageNumber: String,
|
||||
var startTime: String,
|
||||
var messages: List<String>,
|
||||
var isEnabled: Boolean,
|
||||
)
|
||||
|
||||
@ -160,8 +179,15 @@ fun ScenariosScreen(
|
||||
onClick = {
|
||||
scenarioDialogState.value = Scenario(
|
||||
name = "",
|
||||
time = "",
|
||||
messageNumber = "",
|
||||
owner = User(
|
||||
id = 1,
|
||||
firstName = "Глеб",
|
||||
lastName = "Иваницкий",
|
||||
username = "csasq",
|
||||
role = UserRole.Admin,
|
||||
),
|
||||
startTime = "",
|
||||
messages = listOf(),
|
||||
isEnabled = true,
|
||||
)
|
||||
},
|
||||
@ -174,9 +200,9 @@ fun ScenariosScreen(
|
||||
mutableStateOf(it.isEnabled)
|
||||
}
|
||||
val captionAnnotatedString = buildAnnotatedString {
|
||||
append(it.time)
|
||||
append(it.startTime)
|
||||
append(" \u2022 ")
|
||||
append(it.messageNumber)
|
||||
append(it.messages.size.toString())
|
||||
}
|
||||
SwitchButton(
|
||||
title = it.name,
|
||||
|
Загрузка…
Ссылка в новой задаче
Block a user