Dashboard: Library Panels - Add ability to search by folder name (#106997)
* Dashboard: Add ability to search by folder name in library panels * restore to main to fix linting issues * restore from main to avoid go linting issues * add logic to the writers.go that search by folder title if folder is not passed * add missing left joing from the folder table * Add extra logic to prevent folder searches without permission * fix go linting issue about memory * Add test when searching by folder name * Refactor tests to include a bit more validation * apply feedback and use SearchFolder from search folder service * clean up comments * Update pkg/services/libraryelements/database.go Co-authored-by: Ezequiel Victorero <ezequiel.victorero@grafana.com> * Fix logic of early return * Extract into a function and remove the left join * Apply feedback to be aligned with idiomatic go * Apply suggestion from @evictorero Co-authored-by: Ezequiel Victorero <ezequiel.victorero@grafana.com> * fix liting --------- Co-authored-by: Ezequiel Victorero <ezequiel.victorero@grafana.com>
This commit is contained in:
co-authored by
Ezequiel Victorero
parent
047349638d
commit
e33047bdf1
@@ -58,13 +58,28 @@ func writeTypeFilterSQL(typeFilter []string, builder *db.SQLBuilder) {
|
||||
}
|
||||
}
|
||||
|
||||
func writeSearchStringSQL(query model.SearchLibraryElementsQuery, sqlStore db.DB, builder *db.SQLBuilder) {
|
||||
func writeSearchStringSQL(query model.SearchLibraryElementsQuery, sqlStore db.DB, builder *db.SQLBuilder, foldersWithMatchingTitles []string) {
|
||||
if len(strings.TrimSpace(query.SearchString)) > 0 {
|
||||
// Search element names across all accessible folders
|
||||
sql, param := sqlStore.GetDialect().LikeOperator("le.name", true, query.SearchString, true)
|
||||
builder.Write(" AND ("+sql, param)
|
||||
|
||||
// Search element descriptions across all accessible folders
|
||||
sql, param = sqlStore.GetDialect().LikeOperator("le.description", true, query.SearchString, true)
|
||||
builder.Write(" OR "+sql+")", param)
|
||||
builder.Write(" OR "+sql, param)
|
||||
|
||||
// Include ALL elements from folders whose titles match the search string
|
||||
hasFolderFilter := len(strings.TrimSpace(query.FolderFilterUIDs)) > 0
|
||||
if !hasFolderFilter && len(foldersWithMatchingTitles) > 0 {
|
||||
folderUIDsSQL := "?" + strings.Repeat(",?", len(foldersWithMatchingTitles)-1)
|
||||
params := make([]any, 0, len(foldersWithMatchingTitles))
|
||||
for _, folderUID := range foldersWithMatchingTitles {
|
||||
params = append(params, folderUID)
|
||||
}
|
||||
builder.Write(" OR le.folder_uid IN ("+folderUIDsSQL+")", params...)
|
||||
}
|
||||
|
||||
builder.Write(")")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user