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:
Alexa Vargas
2025-07-08 15:07:22 +02:00
committed by GitHub
co-authored by Ezequiel Victorero
parent 047349638d
commit e33047bdf1
5 changed files with 249 additions and 8 deletions
+17 -2
View File
@@ -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(")")
}
}