Added functioning search

This commit is contained in:
2017-06-20 22:54:45 +02:00
parent 1598ebd93b
commit 65d43d2b43
13 changed files with 198 additions and 50 deletions

View File

@ -1,19 +0,0 @@
.popular-title
text-align center
.popular-anime-list
display flex
flex-flow row wrap
justify-content center
.popular-anime
padding 0.5em
display block
.popular-anime-image
width 100px !important
height 141px !important
border-radius 3px
object-fit cover
default-transition
shadow-up

View File

@ -1,29 +1,97 @@
package search
import (
"strings"
"github.com/aerogo/aero"
"github.com/animenotifier/arn"
"github.com/animenotifier/notify.moe/components"
)
const maxUsers = 18
const maxAnime = 18
type AnimeID = string
type UserID = string
var animeSearchIndex = make(map[string]AnimeID)
var userSearchIndex = make(map[string]UserID)
func init() {
updateSearchIndex()
}
func updateSearchIndex() {
updateAnimeIndex()
updateUserIndex()
}
func updateAnimeIndex() {
// Anime
animeStream, err := arn.AllAnime()
if err != nil {
panic(err)
}
for anime := range animeStream {
animeSearchIndex[strings.ToLower(anime.Title.Canonical)] = anime.ID
}
}
func updateUserIndex() {
// Users
userStream, err := arn.AllUsers()
if err != nil {
panic(err)
}
for user := range userStream {
userSearchIndex[strings.ToLower(user.Nick)] = user.ID
}
}
// Get search page.
func Get(ctx *aero.Context) string {
// titleCount := 0
// animeCount := 0
term := strings.ToLower(ctx.Get("term"))
// // let info: any = await bluebird.props({
// // popular: arn.db.get('Cache', 'popularAnime'),
// // stats: arn.db.get('Cache', 'animeStats')
// // })
var users []*arn.User
var animeResults []*arn.Anime
// // return response.render({
// // user,
// // popularAnime: info.popular.anime,
// // animeCount: info.stats.animeCount,
// // titleCount: info.stats.titleCount,
// // anime: null
// // })
aero.Parallel(func() {
for name, id := range userSearchIndex {
if strings.Index(name, term) != -1 {
user, err := arn.GetUser(id)
// popular, _ := arn.GetPopularCache()
if err != nil {
continue
}
// return ctx.HTML(components.Search(popular.Anime, titleCount, animeCount))
return ctx.HTML("Coming soon.")
users = append(users, user)
if len(users) >= maxUsers {
break
}
}
}
}, func() {
for title, id := range animeSearchIndex {
if strings.Index(title, term) != -1 {
anime, err := arn.GetAnime(id)
if err != nil {
continue
}
animeResults = append(animeResults, anime)
if len(animeResults) >= maxAnime {
break
}
}
}
})
return ctx.HTML(components.Search(users, animeResults))
}

View File

@ -1,16 +1,21 @@
component Search(popularAnime []*arn.Anime, titleCount int, animeCount int)
h2 Anime
#search-container
input#search(type="text", placeholder="Search...", onkeyup="$.searchAnime();", onfocus="this.select();", disabled="disabled", data-count=titleCount, data-anime-count=animeCount)
#search-results-container
#search-results
if popularAnime != nil
h3.popular-title Popular
.popular-anime-list
each anime in popularAnime
a.popular-anime.ajax(href="/anime/" + toString(anime.ID), title=anime.Title.Romaji + " (" + arn.Plural(anime.Watching(), "user") + " watching)")
img.anime-image.popular-anime-image(src=anime.Image, alt=anime.Title.Romaji)
component Search(users []*arn.User, animeResults []*arn.Anime)
.widgets
.widget
h3 Users
.user-avatars.user-search
if len(users) == 0
p No users found.
else
each user in users
Avatar(user)
//- a.ajax(href=user.Link())= user.Nick
.widget
h3 Anime
.profile-watching-list.anime-search
if len(animeResults) == 0
p No anime found.
else
each anime in animeResults
a.profile-watching-list-item.ajax(href=anime.Link(), title=anime.Title.Canonical)
img.anime-cover-image.anime-search-result(src=anime.Image.Tiny, alt=anime.Title.Canonical)

View File

@ -1,7 +1,2 @@
// #search-container
// horizontal
// justify-content center
// #search
// width 100%
// max-width 560px
.anime-search-result
width 55px !important