forked from graboskyc/AtlasSearchLocalNYC2023
-
Notifications
You must be signed in to change notification settings - Fork 0
/
SearchBarAutocomplete.razor
135 lines (119 loc) · 3.81 KB
/
SearchBarAutocomplete.razor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
@inject NavigationManager NavigationManager
@using AtlasSearchNYC.Datamodels;
@using MongoDB.Bson;
@using MongoDB.Bson.IO;
@using MongoDB.Driver;
<div class="input-group input-group-lg">
<input type="text"
class="form-control"
placeholder="Search Content..."
@bind-value="SearchTerm"
@bind-value:event="oninput"
@onkeydown="@CheckEnterKey">
<img src='/BrandAssets/Icons/Technical_ATLAS_Search10x.png'
width="50" class="btn btn-search"
@onclick="() => RedirectSearch()" />
</div>
@if (suggestions is not null && ShowSuggestions)
{
<ul class="options" @onclick=ToggleSuggestions>
@if (suggestions.Any())
{
@foreach (var s in suggestions.Take(5))
{
<li class="option input-group" @onclick="() => RedirectSearch(s.Title)">
<span class="option-text">@s.Title</span>
</li>
}
}
<li class="option input-group" @onclick="() => RedirectSearch()" >
See Full Results for "@SearchTerm"
</li>
</ul>
}
@code {
private string _searchTerm;
private List<Datamodels.Movie> suggestions;
[Parameter]
public string SearchTerm
{
get => _searchTerm;
set
{
_searchTerm = value;
if(_searchTerm?.Length > 0)
{
GetSuggestions();
}
}
}
[Parameter]
public string Redirect {get; set;}
[Parameter]
public EventCallback<string> OnSearchCallback { get; set; }
[Parameter]
public bool ShowSuggestions {get;set;} = false;
private async Task RedirectSearch(string? newTerm = null) {
if(newTerm != null) {
SearchTerm = newTerm;
}
await OnSearchCallback.InvokeAsync(SearchTerm);
NavigationManager.NavigateTo("/"+Redirect+"/" + SearchTerm);
}
public async void CheckEnterKey(KeyboardEventArgs e) {
if (e.Code == "Enter" || e.Code == "NumpadEnter") {
await RedirectSearch();
}
}
private void ToggleSuggestions()
{
ShowSuggestions = !ShowSuggestions;
}
private async Task GetSuggestions() {
var pipeline = new BsonDocument[]{
new BsonDocument("$search",
new BsonDocument
{
{"index", "autocomplete"},
{
"compound",
new BsonDocument("should",
new BsonArray
{
new BsonDocument("autocomplete",
new BsonDocument
{
{ "query", SearchTerm },
{ "path", "title"}
}),
new BsonDocument("autocomplete",
new BsonDocument
{
{ "query", SearchTerm },
{ "path", "fullplot"}
})
}
)
}
}
),
new BsonDocument("$limit", 10)
};
string MDBCONNSTR = Environment.GetEnvironmentVariable("MDBCONNSTR");
var settings = MongoClientSettings.FromConnectionString(MDBCONNSTR);
settings.ServerApi = new ServerApi(ServerApiVersion.V1);
var client = new MongoClient(settings);
var database = client.GetDatabase("sample_mflix");
var col = database.GetCollection<Datamodels.Movie>("movies");
var result = await col.Aggregate<Movie>(pipeline).ToListAsync();
suggestions = result;
if(suggestions.Count > 0)
{
ShowSuggestions = true;
}
else
{
ShowSuggestions = false;
}
}
}