Автоматизация рутинного копирования в таблице

Существует псевдо-таблица из 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()
                                    )
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Ответы (0 шт):