@@ -268,8 +268,9 @@ func Templates(ctx context.Context, db database.Store, actorID uuid.UUID, query
268
268
// Always lowercase for all searches.
269
269
query = strings .ToLower (query )
270
270
values , errors := searchTerms (query , func (term string , values url.Values ) error {
271
- // Default to the template name
271
+ // Default to the template name and display name
272
272
values .Add ("name" , term )
273
+ values .Add ("display_name" , term )
273
274
return nil
274
275
})
275
276
if len (errors ) > 0 {
@@ -281,7 +282,9 @@ func Templates(ctx context.Context, db database.Store, actorID uuid.UUID, query
281
282
Deleted : parser .Boolean (values , false , "deleted" ),
282
283
OrganizationID : parseOrganization (ctx , db , parser , values , "organization" ),
283
284
ExactName : parser .String (values , "" , "exact_name" ),
285
+ ExactDisplayName : parser .String (values , "" , "exact_display_name" ),
284
286
FuzzyName : parser .String (values , "" , "name" ),
287
+ FuzzyDisplayName : parser .String (values , "" , "display_name" ),
285
288
IDs : parser .UUIDs (values , []uuid.UUID {}, "ids" ),
286
289
Deprecated : parser .NullableBoolean (values , sql.NullBool {}, "deprecated" ),
287
290
HasAITask : parser .NullableBoolean (values , sql.NullBool {}, "has-ai-task" ),
@@ -305,7 +308,8 @@ func searchTerms(query string, defaultKey func(term string, values url.Values) e
305
308
// Because we do this in 2 passes, we want to maintain quotes on the first
306
309
// pass. Further splitting occurs on the second pass and quotes will be
307
310
// dropped.
308
- elements := splitQueryParameterByDelimiter (query , ' ' , true )
311
+ tokens := splitQueryParameterByDelimiter (query , ' ' , true )
312
+ elements := processTokens (tokens )
309
313
for _ , element := range elements {
310
314
if strings .HasPrefix (element , ":" ) || strings .HasSuffix (element , ":" ) {
311
315
return nil , []codersdk.ValidationError {
@@ -385,3 +389,21 @@ func splitQueryParameterByDelimiter(query string, delimiter rune, maintainQuotes
385
389
386
390
return parts
387
391
}
392
+
393
+ // processTokens takes the split tokens and groups them based on a delimiter. Tokens
394
+ // without a delimiter present are joined to support searching with spaces.
395
+ func processTokens (tokens []string ) []string {
396
+ var results []string
397
+ var nonFieldTerms []string
398
+ for _ , token := range tokens {
399
+ if strings .Contains (token , string (':' )) {
400
+ results = append (results , token )
401
+ } else {
402
+ nonFieldTerms = append (nonFieldTerms , token )
403
+ }
404
+ }
405
+ if len (nonFieldTerms ) > 0 {
406
+ results = append (results , strings .Join (nonFieldTerms , " " ))
407
+ }
408
+ return results
409
+ }
0 commit comments