diff --git a/app/src/main/java/org/zotero/android/screens/scanbarcode/ScanBarcodeViewModel.kt b/app/src/main/java/org/zotero/android/screens/scanbarcode/ScanBarcodeViewModel.kt index 5689be06..5bd9ec9d 100644 --- a/app/src/main/java/org/zotero/android/screens/scanbarcode/ScanBarcodeViewModel.kt +++ b/app/src/main/java/org/zotero/android/screens/scanbarcode/ScanBarcodeViewModel.kt @@ -262,7 +262,12 @@ internal class ScanBarcodeViewModel @Inject constructor( title = _title ?: "" } val itemData = - LookupRowItem(type = translationData.response.rawType, title = title) + LookupRowItem( + identifier = lookup.identifier, + key = translationData.response.key, + type = translationData.response.rawType, + title = title + ) rowsList.add(LookupRow.item(itemData)) @@ -339,6 +344,40 @@ internal class ScanBarcodeViewModel @Inject constructor( super.onCleared() } + fun onItemDelete(lookupRow: LookupRow.item) { + val state = viewState.lookupState as State.lookup + val item = state.data.find { + val translatedItem = it.state as IdentifierLookupController.LookupData.State.translated + translatedItem.translatedLookupData.response.key == lookupRow.item.key + }!! + val translatedItem = item.state as IdentifierLookupController.LookupData.State.translated + + identifierLookupController.trashItem( + identifier = lookupRow.item.identifier, + itemKey = translatedItem.translatedLookupData.response.key, + libraryId = translatedItem.translatedLookupData.libraryId + ) + + val itemIndex = viewState.lookupRows.indexOf(lookupRow) + val lookupRowsMutable = viewState.lookupRows.toMutableList() + lookupRowsMutable.remove(lookupRow) + if (lookupRowsMutable.isNotEmpty() && itemIndex < lookupRowsMutable.size && lookupRowsMutable[itemIndex] is LookupRow.attachment) { + lookupRowsMutable.removeAt(itemIndex) + } + + val mutableStateData = state.data.toMutableList() + mutableStateData.remove(item) + val updatedLookupState = State.lookup(mutableStateData) + + updateState { + copy( + lookupRows = lookupRowsMutable, + lookupState = updatedLookupState + ) + } + + } + sealed interface State { data class failed(val error: Exception) : State diff --git a/app/src/main/java/org/zotero/android/screens/scanbarcode/ui/ScanBarcodeScreen.kt b/app/src/main/java/org/zotero/android/screens/scanbarcode/ui/ScanBarcodeScreen.kt index b4895280..7120770a 100644 --- a/app/src/main/java/org/zotero/android/screens/scanbarcode/ui/ScanBarcodeScreen.kt +++ b/app/src/main/java/org/zotero/android/screens/scanbarcode/ui/ScanBarcodeScreen.kt @@ -85,8 +85,10 @@ internal fun ScanBarcodeScreen( } } } else { - scanBarcodeTable(rows = viewState.lookupRows) - if (viewState.lookupState == State.loadingIdentifiers ) { + scanBarcodeTable( + rows = viewState.lookupRows, + onDelete = { viewModel.onItemDelete(it) }) + if (viewState.lookupState == State.loadingIdentifiers) { scanBarcodeLoadingIndicator() } scanBarcodeError( diff --git a/app/src/main/java/org/zotero/android/screens/scanbarcode/ui/ScanBarcodeTable.kt b/app/src/main/java/org/zotero/android/screens/scanbarcode/ui/ScanBarcodeTable.kt index a7363670..1a962344 100644 --- a/app/src/main/java/org/zotero/android/screens/scanbarcode/ui/ScanBarcodeTable.kt +++ b/app/src/main/java/org/zotero/android/screens/scanbarcode/ui/ScanBarcodeTable.kt @@ -33,8 +33,9 @@ import org.zotero.android.uicomponents.attachmentprogress.Style import org.zotero.android.uicomponents.misc.NewDivider import org.zotero.android.uicomponents.theme.CustomPalette import org.zotero.android.uicomponents.theme.CustomTheme +import org.zotero.android.uicomponents.topbar.HeadingTextButton -internal fun LazyListScope.scanBarcodeTable(rows: List) { +internal fun LazyListScope.scanBarcodeTable(rows: List, onDelete: (row: LookupRow.item) -> Unit) { rows.forEach { row -> item { when (row) { @@ -42,7 +43,8 @@ internal fun LazyListScope.scanBarcodeTable(rows: List) { val data = row.item LookupItemRow( title = data.title, - type = data.type + type = data.type, + onDelete = { onDelete(row) } ) } @@ -71,37 +73,50 @@ internal fun LazyListScope.scanBarcodeTable(rows: List) { @Composable internal fun LookupItemRow( - title: String, type: String + title: String, type: String, + onDelete: () -> Unit, ) { val iconSize = 28.dp val modifier = Modifier.size(iconSize) - Row( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 1.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Image( - modifier = modifier, - painter = painterResource(id = ItemTypes.iconName(type, null)), - contentDescription = null, - ) - Column( + Box { + Row( modifier = Modifier - .weight(1f) - .padding(start = 16.dp, top = 8.dp) + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically ) { - Text( - text = HtmlCompat.fromHtml( - title, - HtmlCompat.FROM_HTML_MODE_LEGACY - ).toString(), - color = CustomTheme.colors.primaryContent, - style = CustomTheme.typography.newBody, + Image( + modifier = modifier, + painter = painterResource(id = ItemTypes.iconName(type, null)), + contentDescription = null, + ) + Column( + modifier = Modifier + .weight(1f) + .padding(start = 16.dp) + .padding(vertical = 4.dp) + ) { + Text( + text = HtmlCompat.fromHtml( + title, + HtmlCompat.FROM_HTML_MODE_LEGACY + ).toString(), + color = CustomTheme.colors.primaryContent, + style = CustomTheme.typography.newBody, + ) + } + + HeadingTextButton( + text = stringResource(id = Strings.delete), + contentColor = CustomPalette.ErrorRed, + onClick = onDelete ) - NewDivider(modifier = Modifier.padding(top = 8.dp)) } + + NewDivider( + modifier = Modifier + .align(Alignment.BottomCenter) + ) } } diff --git a/app/src/main/java/org/zotero/android/uicomponents/addbyidentifier/AddByIdentifierViewModel.kt b/app/src/main/java/org/zotero/android/uicomponents/addbyidentifier/AddByIdentifierViewModel.kt index d529b5dc..f1c352bb 100644 --- a/app/src/main/java/org/zotero/android/uicomponents/addbyidentifier/AddByIdentifierViewModel.kt +++ b/app/src/main/java/org/zotero/android/uicomponents/addbyidentifier/AddByIdentifierViewModel.kt @@ -294,7 +294,12 @@ internal class AddByIdentifierViewModel @Inject constructor( title = _title ?: "" } val itemData = - LookupRowItem(type = translationData.response.rawType, title = title) + LookupRowItem( + identifier = lookup.identifier, + key = translationData.response.key, + type = translationData.response.rawType, + title = title + ) rowsList.add(LookupRow.item(itemData)) diff --git a/app/src/main/java/org/zotero/android/uicomponents/addbyidentifier/IdentifierLookupController.kt b/app/src/main/java/org/zotero/android/uicomponents/addbyidentifier/IdentifierLookupController.kt index 3bab4f42..872a3b3c 100644 --- a/app/src/main/java/org/zotero/android/uicomponents/addbyidentifier/IdentifierLookupController.kt +++ b/app/src/main/java/org/zotero/android/uicomponents/addbyidentifier/IdentifierLookupController.kt @@ -630,6 +630,16 @@ class IdentifierLookupController @Inject constructor( cleanupLookup(force = force, completion = completion) } + fun trashItem(identifier: String, itemKey: String, libraryId: LibraryIdentifier) { + lookupData.remove(identifier) + val request = MarkItemsAsTrashedDbRequest( + keys = listOf(itemKey), + libraryId = libraryId, + trashed = true + ) + dbWrapper.realmDbStorage.perform(request) + } + suspend fun lookUp( libraryId: LibraryIdentifier, collectionKeys: Set, diff --git a/app/src/main/java/org/zotero/android/uicomponents/addbyidentifier/data/LookupRow.kt b/app/src/main/java/org/zotero/android/uicomponents/addbyidentifier/data/LookupRow.kt index e34eb33b..ca63cfc6 100644 --- a/app/src/main/java/org/zotero/android/uicomponents/addbyidentifier/data/LookupRow.kt +++ b/app/src/main/java/org/zotero/android/uicomponents/addbyidentifier/data/LookupRow.kt @@ -5,6 +5,8 @@ import org.zotero.android.database.objects.Attachment import org.zotero.android.sync.LibraryIdentifier data class LookupRowItem( + val identifier: String, + val key: String, val type: String, val title: String ) diff --git a/buildSrc/src/main/kotlin/BuildConfig.kt b/buildSrc/src/main/kotlin/BuildConfig.kt index b1a25300..00e0adff 100644 --- a/buildSrc/src/main/kotlin/BuildConfig.kt +++ b/buildSrc/src/main/kotlin/BuildConfig.kt @@ -4,7 +4,7 @@ object BuildConfig { const val compileSdkVersion = 34 const val targetSdk = 33 - val versionCode = 69 // Must be updated on every build + val versionCode = 70 // Must be updated on every build val version = Version( major = 1, minor = 0,