Compare commits
4 commits
df07435874
...
441d9ac4cc
Author | SHA1 | Date | |
---|---|---|---|
|
441d9ac4cc | ||
|
327eba48c1 | ||
|
9df4969ac5 | ||
|
48b9140952 |
4 changed files with 142 additions and 18 deletions
50
source/src/components/search/Answer.astro
Normal file
50
source/src/components/search/Answer.astro
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
---
|
||||||
|
// Properties
|
||||||
|
const { Image, Link, Title, Description, Table, Sublinks } = Astro.props;
|
||||||
|
|
||||||
|
// Configuration
|
||||||
|
import {DEFAULT_IMAGE_PROXY} from "@utils/GetConfig"
|
||||||
|
|
||||||
|
// Toggle Functions
|
||||||
|
if (Image === null) {
|
||||||
|
var UseImage = false
|
||||||
|
} else {
|
||||||
|
var UseImage = true
|
||||||
|
}
|
||||||
|
---
|
||||||
|
|
||||||
|
<div class="answer-panel">
|
||||||
|
<h2>{Title}</h2>
|
||||||
|
<a href={Link}>{Link}</a>
|
||||||
|
|
||||||
|
<p>{UseImage ? <img src={DEFAULT_IMAGE_PROXY + '/' + Image} style="opacity: 0; transition: 1s opacity;" onload="this.style.opacity = '1'" /> : null} {Description}</p>
|
||||||
|
<slot name="table" />
|
||||||
|
<slot name="sublinks" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.answer-panel {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 6px;
|
||||||
|
background: white;
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 12px;
|
||||||
|
* {
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
border-radius: 6px;
|
||||||
|
border: 2px rgb(170, 170, 170) solid;
|
||||||
|
float: right;
|
||||||
|
width: 44%;
|
||||||
|
margin: 0px 0px 16px 16px;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -3,7 +3,7 @@
|
||||||
const {
|
const {
|
||||||
Title,
|
Title,
|
||||||
Description,
|
Description,
|
||||||
Link
|
Link,
|
||||||
} = Astro.props
|
} = Astro.props
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -13,9 +13,12 @@ const {
|
||||||
<p><u>{Link}</u></p>
|
<p><u>{Link}</u></p>
|
||||||
</a>
|
</a>
|
||||||
<p>{Description}</p>
|
<p>{Description}</p>
|
||||||
|
<div class="search-result-web-sublinks">
|
||||||
|
<slot name="sublinks"/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss" is:global>
|
||||||
.search-result-web {
|
.search-result-web {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
@ -25,6 +28,11 @@ const {
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
padding: 6px 12px;
|
padding: 6px 12px;
|
||||||
box-shadow: 0px 4px 10px 0px #0000000a;
|
box-shadow: 0px 4px 10px 0px #0000000a;
|
||||||
|
transition: 0.3s box-shadow;
|
||||||
|
&:hover {
|
||||||
|
box-shadow: 0px 0px 10px 10px rgba(0, 0, 0, 0.04);
|
||||||
|
transition: 0.3s box-shadow;
|
||||||
|
}
|
||||||
* {
|
* {
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
}
|
}
|
||||||
|
@ -43,5 +51,14 @@ const {
|
||||||
color: rgb(82, 82, 82);
|
color: rgb(82, 82, 82);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.search-result-web-sublinks {
|
||||||
|
display: grid;
|
||||||
|
gap: 6px 12px;
|
||||||
|
grid-template-columns: auto auto;
|
||||||
|
a {
|
||||||
|
font-size: 18px;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
|
@ -25,7 +25,7 @@ import SearchMenu from "@components/global/SearchMenu.astro"
|
||||||
.search-results {
|
.search-results {
|
||||||
margin-top: 16px;
|
margin-top: 16px;
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 70% 30%;
|
grid-template-columns: 64% 34%;
|
||||||
gap: 24px;
|
gap: 24px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
|
@ -4,22 +4,43 @@ import Search from "@layouts/Search.astro";
|
||||||
|
|
||||||
// Configuration
|
// Configuration
|
||||||
import {
|
import {
|
||||||
DEFAULT_API
|
DEFAULT_API,
|
||||||
|
DEFAULT_IMAGE_PROXY
|
||||||
} from "@utils/GetConfig"
|
} from "@utils/GetConfig"
|
||||||
|
|
||||||
// Components
|
// Components
|
||||||
|
import Answer from "@components/search/Answer.astro";
|
||||||
import RelatedSearches from "@components/search/RelatedSearches.astro";
|
import RelatedSearches from "@components/search/RelatedSearches.astro";
|
||||||
import WebLink from "@components/search/WebLink.astro";
|
import WebLink from "@components/search/WebLink.astro";
|
||||||
import WebLinkSkeleton from "@components/search/WebLinkSkeleton.astro";
|
import WebLinkSkeleton from "@components/search/WebLinkSkeleton.astro";
|
||||||
|
import { undefined } from "astro:schema";
|
||||||
|
|
||||||
// Fetch
|
// Fetch
|
||||||
const QueryString = Astro.url.href.split("web?=").pop() // Get user's search query from URL
|
const QueryString = Astro.url.href.split("web?=").pop() // Get user's search query from URL
|
||||||
const QueryText = `${QueryString}`.replaceAll("%20", " ") // Replace "%20" with a space
|
const QueryText = `${QueryString}`.replaceAll("%20", " ") // Replace "%20" with a space
|
||||||
const Query = await fetch(DEFAULT_API + "/api/v1/web?s=" + QueryString).then((response) => response.json()); // Response
|
const Query = await fetch(DEFAULT_API + "/api/v1/web?s=" + QueryString).then((response) => response.json()); // Response
|
||||||
|
|
||||||
|
// Toggle Functions
|
||||||
|
if (Query.answer[0] === undefined) {
|
||||||
|
var ShowAnswer = false
|
||||||
|
} else {
|
||||||
|
var ShowAnswer = true
|
||||||
|
}
|
||||||
|
if (Query.related[0] === undefined) {
|
||||||
|
var ShowRelated = false
|
||||||
|
} else {
|
||||||
|
var ShowRelated = true
|
||||||
|
}
|
||||||
|
console.log(ShowRelated + '' + Query.related[0])
|
||||||
---
|
---
|
||||||
|
|
||||||
<Search QueryText={QueryText} Type="Web">
|
<Search QueryText={QueryText} Type="Web">
|
||||||
<slot slot="search">
|
<slot slot="search">
|
||||||
|
<div class="search-web-with-images">
|
||||||
|
{Query.image.map((img) => (
|
||||||
|
<a href={DEFAULT_IMAGE_PROXY + '/' + img.source[0].url} target="_blank"><img style="opacity: 0; transition: 1s opacity;" src={DEFAULT_IMAGE_PROXY + '/' + img.source[0].url} onload="this.style.opacity = '1'"/></a>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
{Query.web.map((query) => (
|
{Query.web.map((query) => (
|
||||||
<WebLink
|
<WebLink
|
||||||
server:defer
|
server:defer
|
||||||
|
@ -28,24 +49,46 @@ const Query = await fetch(DEFAULT_API + "/api/v1/web?s=" + QueryString).then((re
|
||||||
Link={query.url}
|
Link={query.url}
|
||||||
>
|
>
|
||||||
<WebLinkSkeleton slot="fallback"/>
|
<WebLinkSkeleton slot="fallback"/>
|
||||||
|
<slot slot="sublinks">
|
||||||
|
{query.sublink.map((link) =>
|
||||||
|
<a href={link.url}>
|
||||||
|
<p style="font-size: 18px; text-decoration: none;">{link.title}</p>
|
||||||
|
<p style="font-size: 14px;">{link.url}</p>
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
|
</slot>
|
||||||
</WebLink>
|
</WebLink>
|
||||||
))}
|
))}
|
||||||
</slot>
|
</slot>
|
||||||
<slot slot="rich-panel">
|
<slot slot="rich-panel">
|
||||||
<RelatedSearches server:defer>
|
{ShowAnswer ?
|
||||||
{Query.related.map((related) => (
|
<Answer
|
||||||
<a href={'/web?=' + related}>{related}</a>
|
Image={Query.answer[0].thumb}
|
||||||
))}
|
Link={Query.answer[0].url}
|
||||||
<slot slot="fallback">
|
Title={Query.answer[0].title}
|
||||||
<div class="fade-up small-grid-related">
|
Description={Query.answer[0].description[0].value}
|
||||||
<a class="related-sk"></a>
|
></Answer>
|
||||||
<a class="related-sk"></a>
|
:
|
||||||
<a class="related-sk"></a>
|
null
|
||||||
<a class="related-sk"></a>
|
}
|
||||||
<a class="related-sk"></a>
|
{ShowRelated ?
|
||||||
</div>
|
<RelatedSearches server:defer>
|
||||||
</slot>
|
{Query.related.map((related) => (
|
||||||
</RelatedSearches>
|
<a href={'/web?=' + related}>{related}</a>
|
||||||
|
))}
|
||||||
|
<slot slot="fallback">
|
||||||
|
<div class="fade-up small-grid-related">
|
||||||
|
<a class="related-sk"></a>
|
||||||
|
<a class="related-sk"></a>
|
||||||
|
<a class="related-sk"></a>
|
||||||
|
<a class="related-sk"></a>
|
||||||
|
<a class="related-sk"></a>
|
||||||
|
</div>
|
||||||
|
</slot>
|
||||||
|
</RelatedSearches>
|
||||||
|
:
|
||||||
|
null
|
||||||
|
}
|
||||||
<a style="font-size: 12px;" href={DEFAULT_API + "/api/v1/web?s=" + QueryString} target="_blank">JSON Response</a>
|
<a style="font-size: 12px;" href={DEFAULT_API + "/api/v1/web?s=" + QueryString} target="_blank">JSON Response</a>
|
||||||
</slot>
|
</slot>
|
||||||
</Search>
|
</Search>
|
||||||
|
@ -83,4 +126,18 @@ const Query = await fetch(DEFAULT_API + "/api/v1/web?s=" + QueryString).then((re
|
||||||
margin-bottom: 6px;
|
margin-bottom: 6px;
|
||||||
margin-right: 6px;
|
margin-right: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.search-web-with-images {
|
||||||
|
display: grid;
|
||||||
|
gap: 12px 0px;
|
||||||
|
grid-template-columns: repeat( 4, minmax(100px, 1fr));
|
||||||
|
margin-bottom: 12px;
|
||||||
|
img {
|
||||||
|
width: 182px;
|
||||||
|
height: 80px;
|
||||||
|
object-fit: cover;
|
||||||
|
border-radius: 6px;
|
||||||
|
border: 1px rgb(170,170,170) solid;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
Reference in a new issue