package view import ( "api-cds-search/cmd/search" "net/http" "code.achtarmig.org/pas/ui/element" "code.achtarmig.org/pas/ui/element/button" "code.achtarmig.org/pas/ui/element/container" "code.achtarmig.org/pas/ui/element/form" "code.achtarmig.org/pas/ui/element/input" "code.achtarmig.org/pas/ui/element/option" "code.achtarmig.org/pas/ui/element/placeholder" "code.achtarmig.org/pas/ui/element/view" "code.achtarmig.org/pas/ui/route" ) func noSearch(v *view.Element) element.ElementInterface { cont := v.GetElement("SearchResultsContainer") cont.DeleteAllChildren() pl := placeholder.New(cont, "", func(p *placeholder.Element) { p.Icon = option.IconLoupe p.Title = "Search CDS-Views" p.Subtitle = "Find CDS-Views from the Business Accelerator Hub" }) return pl } func searchView() { view.New("Search", func(p *view.Element) { route.Register("/search", p) p.Title = "CDS-Search" p.OnRequest = func(v *view.Element, w http.ResponseWriter, r *http.Request) view.ProcessElements { inputQuery := v.GetElement("q").(*input.Element) inputQueryValue, _ := v.GetElement("q").(*input.Element).GetDataString() searchTerm := search.GetSearchTerm(inputQueryValue) if inputQueryValue == "" { noSearch(v) } inputPage := v.GetElement("p").(*input.Element) inputMaxPage := v.GetElement("MaxPage").(*input.Element) currentPage, _ := inputPage.GetDataInt() if inputQuery.GetDataChanged() && inputQueryValue != "" { buf, err := search.GetBuffer(searchTerm) if err != nil { search.BuildBuffer(searchTerm) buf, err = search.GetBuffer(searchTerm) } if err != nil { noResults(v) } else { currentPage, maxPage := search.GetPages(buf, currentPage) m := search.Search(buf, currentPage, maxPage) inputPage.Max = m.MaxPage inputMaxPage.Min = m.MaxPage inputMaxPage.Max = m.MaxPage inputMaxPage.SetData(m.MaxPage) results(v, m) } } return view.ProcessElements{ Partial: []element.ElementInterface{v.GetElement("SearchResultsContainer")}, OOBUpdate: []element.ElementInterface{v.GetElement("pagerForm")}, } } container.New(p, "MainContainer", func(p *container.Element) { p.Justify = option.JustifyCenter form.New(p, "SearchForm", func(p *form.Element) { p.Method = http.MethodGet p.Target = "#SearchResultsContainer>*" p.Swap = "outerHTML" p.URL = "/search" p.PushURL = true p.Params = "q, p" container.New(p, "SearchFormLinked", func(p *container.Element) { p.Justify = option.JustifyCenter p.LinkedHorizontal = true input.New(p, "q", input.TypeText, func(p *input.Element) { p.Parameter = true p.Placeholder = "Search here" p.Shape = option.ShapeRound p.MinWidth = 10 p.MaxWidth = 36 }) button.New(p, "SearchButton", func(p *button.Element) { p.Label = "Search" p.DisplayStyle = option.DisplayStyleSuggestedAction p.Shape = option.ShapeRound p.MaxWidth = 6 }) }) }) }) container.New(p, "CenterPager", func(p *container.Element) { p.Justify = option.JustifyCenter container.New(p, "RightCenterPager", func(p *container.Element) { p.MaxWidth = 42 p.MinWidth = 10 p.Justify = option.JustifyRight form.New(p, "pagerForm", func(p *form.Element) { p.Method = http.MethodGet p.Include = "[name='q'], [name='p']" p.Target = "#SearchResultsContainer>*" p.URL = "/search" p.Swap = "outerHTML" p.Trigger = "change from:#p" p.PushURL = true container.New(p, "LinkPager", func(p *container.Element) { p.LinkedHorizontal = true p.Justify = option.JustifyRight input.New(p, "p", input.TypeNumber, func(p *input.Element) { p.Parameter = true p.Shape = option.ShapeRound p.SetMin = true p.Min = 0 p.SetMax = true p.Max = 0 p.MinWidth = 4 }) input.New(p, "MaxPage", input.TypeNumber, func(p *input.Element) { p.Disabled = true p.Shape = option.ShapeRound p.MinWidth = 4 p.SetMin = true p.SetMax = true }) }) }) }) }) container.New(p, "SearchResultsContainer", func(p *container.Element) { p.Justify = option.JustifyCenter }) }) }