add recente document
This commit is contained in:
@@ -33,6 +33,15 @@ interface FileDao {
|
|||||||
""")
|
""")
|
||||||
fun searchWithFilters(query: String?, category: String?): Flow<List<FileEntity>>
|
fun searchWithFilters(query: String?, category: String?): Flow<List<FileEntity>>
|
||||||
|
|
||||||
|
@Query("""
|
||||||
|
SELECT * FROM files
|
||||||
|
WHERE "exists" = 1
|
||||||
|
AND (:category IS NULL OR category = :category)
|
||||||
|
ORDER BY added_at DESC, name ASC
|
||||||
|
LIMIT :limit
|
||||||
|
""")
|
||||||
|
fun recentFiles(category: String?, limit: Int): Flow<List<FileEntity>>
|
||||||
|
|
||||||
@Upsert
|
@Upsert
|
||||||
suspend fun upsert(file: FileEntity)
|
suspend fun upsert(file: FileEntity)
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,10 @@ class FileRepository @Inject constructor(
|
|||||||
category = category,
|
category = category,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/** Les `limit` fichiers les plus récemment ajoutés, filtrés par catégorie. */
|
||||||
|
fun recentFiles(category: String?, limit: Int = RECENT_LIMIT): Flow<List<FileEntity>> =
|
||||||
|
fileDao.recentFiles(category = category, limit = limit)
|
||||||
|
|
||||||
suspend fun getFile(resourceId: String): FileEntity? =
|
suspend fun getFile(resourceId: String): FileEntity? =
|
||||||
fileDao.getByResourceId(resourceId)
|
fileDao.getByResourceId(resourceId)
|
||||||
|
|
||||||
@@ -122,6 +126,7 @@ class FileRepository @Inject constructor(
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val PAGE_SIZE = 50
|
private const val PAGE_SIZE = 50
|
||||||
|
private const val RECENT_LIMIT = 5
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -164,10 +164,10 @@ private fun SearchResults(
|
|||||||
onOpenDocument: (String) -> Unit,
|
onOpenDocument: (String) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
val hasQueryOrCategory = uiState.query.isNotBlank() || uiState.selectedCategory != null
|
val hasQuery = uiState.query.isNotBlank()
|
||||||
|
|
||||||
when {
|
when {
|
||||||
!hasQueryOrCategory -> Box(
|
!hasQuery && uiState.results.isEmpty() -> Box(
|
||||||
modifier = modifier.fillMaxSize(),
|
modifier = modifier.fillMaxSize(),
|
||||||
contentAlignment = Alignment.Center,
|
contentAlignment = Alignment.Center,
|
||||||
) {
|
) {
|
||||||
@@ -180,7 +180,7 @@ private fun SearchResults(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
uiState.results.isEmpty() -> Box(
|
hasQuery && uiState.results.isEmpty() -> Box(
|
||||||
modifier = modifier.fillMaxSize(),
|
modifier = modifier.fillMaxSize(),
|
||||||
contentAlignment = Alignment.Center,
|
contentAlignment = Alignment.Center,
|
||||||
) {
|
) {
|
||||||
@@ -196,6 +196,16 @@ private fun SearchResults(
|
|||||||
contentPadding = PaddingValues(bottom = 16.dp),
|
contentPadding = PaddingValues(bottom = 16.dp),
|
||||||
verticalArrangement = Arrangement.spacedBy(10.dp),
|
verticalArrangement = Arrangement.spacedBy(10.dp),
|
||||||
) {
|
) {
|
||||||
|
if (!hasQuery) {
|
||||||
|
item(key = "recent-header") {
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.search_recent),
|
||||||
|
style = MaterialTheme.typography.titleMedium,
|
||||||
|
fontWeight = FontWeight.SemiBold,
|
||||||
|
modifier = Modifier.padding(top = 4.dp),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
items(uiState.results, key = { it.resourceId }) { file ->
|
items(uiState.results, key = { it.resourceId }) { file ->
|
||||||
SearchResultCard(file = file, onClick = { onOpenDocument(file.resourceId) })
|
SearchResultCard(file = file, onClick = { onOpenDocument(file.resourceId) })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,13 @@ class SearchViewModel @Inject constructor(
|
|||||||
_selectedCategory,
|
_selectedCategory,
|
||||||
) { query, category -> CategoryQuery(query, category) }
|
) { query, category -> CategoryQuery(query, category) }
|
||||||
.flatMapLatest { (query, category) ->
|
.flatMapLatest { (query, category) ->
|
||||||
fileRepository.searchFiles(query, category)
|
val trimmed = query.trim()
|
||||||
.map { files -> SearchUiState(query, category, files) }
|
val flow = if (trimmed.isEmpty()) {
|
||||||
|
fileRepository.recentFiles(category)
|
||||||
|
} else {
|
||||||
|
fileRepository.searchFiles(trimmed, category)
|
||||||
|
}
|
||||||
|
flow.map { files -> SearchUiState(query, category, files) }
|
||||||
}
|
}
|
||||||
.stateIn(
|
.stateIn(
|
||||||
scope = viewModelScope,
|
scope = viewModelScope,
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
<string name="search">Search</string>
|
<string name="search">Search</string>
|
||||||
<string name="search_hint">Search for a document…</string>
|
<string name="search_hint">Search for a document…</string>
|
||||||
<string name="search_empty">Type a search or pick a category</string>
|
<string name="search_empty">Type a search or pick a category</string>
|
||||||
|
<string name="search_recent">Recent documents</string>
|
||||||
<string name="search_no_results">No results</string>
|
<string name="search_no_results">No results</string>
|
||||||
<string name="category_all">All</string>
|
<string name="category_all">All</string>
|
||||||
<string name="category_pdf">PDF</string>
|
<string name="category_pdf">PDF</string>
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
<string name="search">Recherche</string>
|
<string name="search">Recherche</string>
|
||||||
<string name="search_hint">Rechercher un document…</string>
|
<string name="search_hint">Rechercher un document…</string>
|
||||||
<string name="search_empty">Saisis une recherche ou choisis une catégorie</string>
|
<string name="search_empty">Saisis une recherche ou choisis une catégorie</string>
|
||||||
|
<string name="search_recent">Documents récents</string>
|
||||||
<string name="search_no_results">Aucun résultat</string>
|
<string name="search_no_results">Aucun résultat</string>
|
||||||
<string name="category_all">Tous</string>
|
<string name="category_all">Tous</string>
|
||||||
<string name="category_pdf">PDF</string>
|
<string name="category_pdf">PDF</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user