Автоматизация рутинного копирования в таблице
Существует псевдо-таблица из 6 столбцов и бесконечного (в теории, разумеется) количества строк, куда данные добавляются построчно по нажатию на кнопку. Всё работает, строки добавляются, строки удаляются, данные заполняются прекрасно и восхитительно. Данные схватываются и дальше уходят в базу данных, как должно. Перейду к сути вопроса - речь идёт об автоматизации рутинных вводов данных, которые предстоит повторять с завидным постоянством. Речь идёт о ежедневных ситуациях, когда необходимо открыть моё приложение и вбить туда 5-15 различных поставок, заполнив 6 полей. Первые три реализованы через DropdownMenu и требуют обязательного выбора, текстовые же поля часто могут быть идентичными. Например мне пришёл товар где 10 позиций и всего по 100 штук и дата "годен до" одинакова. Соответственно оператору необходимо набрать цифру 100 десять раз, набрать дату 12.24 десять раз, и скопировать лот 10 раз. А это совсем не круто.
Пример ниже:
Я пытаюсь придумать новый функционал с использованием IconButton (на скрине сверху) для копирования полей из первого введённого при нажатии на кнопку.
Для этого я создал 2 простые Composable функции, где планирую обрабатывать логику.
Пример ниже:
@Composable
fun CopyEditTextFun() {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceAround,
verticalAlignment = Alignment.CenterVertically,
) {
repeat(3){
copyIcon {}
}
copyIcon {}
copyIcon {}
copyIcon {}
}
}
@Composable
fun copyIcon(onClick: () -> Unit){
IconButton(
onClick = onClick
) {
Icon(
painter = painterResource(MR.images.ic_copy),
contentDescription = null
)
}
}
Я вижу это своеобразным переключением состояний с состояния "ячейки" на состояние "столбца", однако не могу собрать мысли в кучу, т.к. Compose для меня в новинку.
У меня уже есть доступ к состоянию поля по всему "столбцу", но сейчас оно работает таким образом, что при редактировании текста в одном поле текст редактируется одновременно во всех полях "столбца". Мне же нужно несколько другое - одноразовое копирование информации из первого заполненного поля в столбце во все остальные.
Разумеется я подготовил урезанный код класса для понимания логики и ясности требуемой задачи:
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun CreateShippingScreen() {
val vm: CreateShippingViewModel by rememberDI { instance() }
val state by vm.state.collectAsState()
val columnScrollState = rememberScrollState()
Box(
modifier = Modifier.fillMaxSize().padding(horizontal = 16.dp, vertical = 8.dp),
contentAlignment = Alignment.Center
) {
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Box(
modifier = Modifier.fillMaxWidth().weight(4f),
contentAlignment = Alignment.TopCenter
) {
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally
) {
if (state.receiptUnits.isNotEmpty()){
CopyEditTextFun()
}
Column(
modifier = Modifier.weight(1f).verticalScroll(columnScrollState)
) {
state.receiptUnits.forEachIndexed { index, receiptUnit ->
var singleManufacturerLot by remember { mutableStateOf<String?>("") }
var singleItemCount by remember { mutableStateOf<Int?>(null) }
var singleExpireDate by remember { mutableStateOf("") }
val focusRequester = remember { FocusRequester() }
Column {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Start,
verticalAlignment = Alignment.CenterVertically,
) {
//Ввод лота производителя
OutlinedTextField(
value = singleManufacturerLot ?: "",
textStyle = MaterialTheme.typography.bodySmall,
onValueChange = {
singleManufacturerLot = it
},
label = {
Text(
text = "Лот производителя",
style = MaterialTheme.typography.bodySmall
)
},
modifier = Modifier.fillMaxWidth().weight(1f).padding(horizontal = 2.dp),
shape = RoundedCornerShape(8.dp)
)
//Ввод количества
OutlinedTextField(
value = singleItemCount?.toString() ?: "",
textStyle = MaterialTheme.typography.bodySmall,
onValueChange = {
singleItemCount = it.filter { it.isDigit() }.ifBlank { null }?.toInt()
},
label = {
Text(
text = "Количество товара",
style = MaterialTheme.typography.bodySmall
)
},
modifier = Modifier.fillMaxWidth().weight(1f).padding(horizontal = 2.dp),
shape = RoundedCornerShape(8.dp)
)
//Ввод даты
OutlinedTextField(
value = TextFieldValue(
singleExpireDate,
selection = TextRange(singleExpireDate.length)
),
textStyle = MaterialTheme.typography.bodySmall,
onValueChange = {
singleExpireDate = it.text.filter { it.isDigit() }.take(4)
focusRequester.requestFocus()
},
label = {
Text(
text = "Годен до (мм:гг)",
style = MaterialTheme.typography.bodySmall
)
},
modifier = Modifier.fillMaxWidth().weight(1f).padding(horizontal = 2.dp)
.focusRequester(focusRequester),
shape = RoundedCornerShape(8.dp),
visualTransformation = DateTransformation()
)
}
}
}
}
}
}
}
}
}