summaryrefslogtreecommitdiff
path: root/includes/components/search.inc
diff options
context:
space:
mode:
Diffstat (limited to 'includes/components/search.inc')
-rw-r--r--includes/components/search.inc534
1 files changed, 0 insertions, 534 deletions
diff --git a/includes/components/search.inc b/includes/components/search.inc
deleted file mode 100644
index 278ec41..0000000
--- a/includes/components/search.inc
+++ /dev/null
@@ -1,534 +0,0 @@
-<?php global $lang; global $pages; global $isLowerLoggedIn; global $isLoggedIn; ?>
-
-<div id="global-search-container" style="display: none; position: fixed; z-index: 99999999;background-color: rgba(0, 0, 0, .75); inset: 0; backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); align-items: center; justify-content: center;">
- <div id="global-search-box" style="background: rgba(50, 50, 50, .5); color: white; backdrop-filter: blur(30px); -webkit-backdrop-filter: blur(30px); border-radius: 15px; width: 768px; max-width: 90vw;">
- <div id="global-search-input-container" onclick="document.getElementById('global-search-input').focus();" style="cursor:text;padding: 10px 50px; font-size: 22px; border: 1px solid rgba(100, 100, 100, .5); border-top-left-radius: 15px; border-top-right-radius: 15px; width: 768px; max-width: 90vw;">
- <span onchange="globalSearchPlaceholder(); globalSearch();" onkeyup="globalSearchPlaceholder(); globalSearch();" onkeydown="globalSearchPlaceholder(); globalSearch();" type="text" id="global-search-input" style="vertical-align: middle; display:inline-block; background: transparent; color: white; border: none;" spellcheck="false" contenteditable="true"></span><span id="global-search-placeholder" style="opacity:.5;"><?= $lang["search"]["title"] ?></span><span id="global-search-autocomplete" style="vertical-align: middle; opacity:.5;"></span><span id="global-search-action" style="vertical-align: middle; opacity:.5;font-size:16px;"></span>
- </div>
- <div id="global-search-results" style="border-bottom-left-radius: 15px; border-bottom-right-radius: 15px; border-top-style: none; border-right: 1px solid rgba(100, 100, 100, .5); border-bottom: 1px solid rgba(100, 100, 100, .5); border-left: 1px solid rgba(100, 100, 100, .5); width: 768px; max-width: 90vw; height: 400px; max-height: calc(90vh - 60px);">
- <div id="global-search-intro" style="display: flex; align-items: center; justify-content: center; height: 100%; text-align: center;">
- <div style="opacity: .5;">
- <img src="/assets/logo/newlogo<?= $isLoggedIn || $isLowerLoggedIn ? "3" : "" ?>.png" style="width: 64px; height: 64px; margin-bottom: 10px;">
- <p><?= $lang["search"]["placeholder"] ?></p>
- </div>
- </div>
- <div id="global-search-list" style="overflow: auto; display: flex; align-items: center; justify-content: center; height: 100%; text-align: center;"></div>
- </div>
- </div>
-</div>
-
-<script src="/assets/editor/fuse.js"></script>
-
-<!--suppress JSUnresolvedFunction -->
-<script>
- const pages_list = JSON.parse(atob(`<?php
-
- $base = array_values(array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/pages"), function ($i) {
- return !str_starts_with($i, ".") && $i !== "page.inc" && $i !== "api.inc" && $i !== "demo.inc" && $i !== "logout.inc" && $i !== "edit.inc" && $i !== "metadata.inc" && $i !== "edit-private.inc" && $i !== "app.inc" && !str_ends_with($i, ".bak.php") && !str_ends_with($i, ".old.php") && !str_ends_with($i, "-dev.php") && !str_ends_with($i, ".bak.inc") && !str_ends_with($i, ".old.inc") && !str_ends_with($i, "-dev.inc");
- }));
- $list = array_values(array_filter(array_map(function ($i) use ($lang) {
- global $pages;
- global $isLoggedIn;
- global $isLowerLoggedIn;
-
- if (in_array(substr($i, 0, strlen($i) - 4), array_keys($pages)) && $pages[substr($i, 0, strlen($i) - 4)]["admin"] && !((!$pages[substr($i, 0, strlen($i) - 4)]["limited"] && $isLoggedIn) || ($pages[substr($i, 0, strlen($i) - 4)]["limited"] && $isLowerLoggedIn))) {
- return null;
- } else if (in_array(substr($i, 0, strlen($i) - 4), array_keys($pages))) {
- return [
- 'name' => in_array(substr($i, 0, strlen($i) - 4), array_keys($pages)) ? $pages[substr($i, 0, strlen($i) - 4)]["name"][$lang["_name"]] : substr($i, 0, strlen($i) - 4),
- 'description' => in_array(substr($i, 0, strlen($i) - 4), array_keys($pages)) ? ($pages[substr($i, 0, strlen($i) - 4)]["short"] ?? $pages[substr($i, 0, strlen($i) - 4)]["name"][$lang["_name"]]) : substr($i, 0, strlen($i) - 4),
- 'url' => "/-/" . substr($i, 0, strlen($i) - 4),
- 'icon' => file_exists($_SERVER['DOCUMENT_ROOT'] . "/assets/icons/uncolored/" . substr($i, 0, strlen($i) - 4) . ".svg") ? ("/assets/icons/uncolored/" . (file_exists($_SERVER['DOCUMENT_ROOT'] . "/assets/icons/uncolored/" . substr($i, 0, strlen($i) - 4) . ".svg") ? substr($i, 0, strlen($i) - 4) : "") . ".svg") : ("/assets/icons/" . (file_exists($_SERVER['DOCUMENT_ROOT'] . "/assets/icons/" . substr($i, 0, strlen($i) - 4) . ".svg") ? substr($i, 0, strlen($i) - 4) : "") . ".svg"),
- 'invert' => true
- ];
- } else {
- return null;
- }
- }, $base), function ($i) {
- return isset($i);
- }));
-
- echo(base64_encode(json_encode($list)));
-
- ?>`));
- const pages = new Fuse(pages_list, {
- includeScore: true,
- keys: [
- {
- name: 'name',
- weight: 0.7
- },
- {
- name: 'description',
- weight: 0.5
- },
- {
- name: 'url',
- weight: 0.2
- }
- ]
- })
-
- const ponies_list = JSON.parse(atob(`<?php
-
- $base = array_values(scoreOrderGlobal());
- $list = array_map(function ($i) {
- return [
- 'name' => $i["display_name"] ?? $i["name"],
- 'description' => file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/$i[id].html") ? strip_tags(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/content/$i[id].html")) : "",
- 'url' => '/' . $i["name"],
- 'icon' => getAsset($i["system"], $i["id"], "heads"),
- 'invert' => false
- ];
- }, $base);
-
- echo(base64_encode(json_encode($list)));
-
- ?>`));
- const ponies = new Fuse(ponies_list, {
- includeScore: true,
- keys: [
- {
- name: 'name',
- weight: 1
- },
- {
- name: 'description',
- weight: 0.7
- },
- {
- name: 'url',
- weight: 0.5
- }
- ]
- })
-
- const toys_list = JSON.parse(atob(`<?php
-
- global $isLoggedIn;
-
- if (false && $isLoggedIn) {
- $base = array_values(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/toys/toys.json"), true));
- $list = array_map(function ($i) {
- return [
- 'name' => $i["name"],
- 'description' => $i["description"],
- 'icon' => "/assets/icons/toys.svg",
- 'url' => "/-/toys/$i[id]",
- 'invert' => true
- ];
- }, $base);
-
- echo(base64_encode(json_encode($list)));
- } else {
- echo(base64_encode(json_encode([])));
- }
-
- ?>`));
- const toys = new Fuse(toys_list, {
- includeScore: true,
- keys: [
- {
- name: 'name',
- weight: 1
- },
- {
- name: 'description',
- weight: 0.7
- },
- {
- name: 'url',
- weight: 0.5
- }
- ]
- })
-
- const actions_list = JSON.parse(atob(`<?php
-
- global $isLoggedIn;
-
- if (false && $isLoggedIn) {
- $base = array_values(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/actions/actions.json"), true));
- $list = array_map(function ($i) {
- return [
- 'name' => $i["name"],
- 'description' => $i["description"],
- 'icon' => "/assets/icons/actions.svg",
- 'url' => "/-/actions/$i[id]",
- 'invert' => true
- ];
- }, $base);
-
- echo(base64_encode(json_encode($list)));
- } else {
- echo(base64_encode(json_encode([])));
- }
-
- ?>`));
- const actions = new Fuse(actions_list, {
- includeScore: true,
- keys: [
- {
- name: 'name',
- weight: 1
- },
- {
- name: 'description',
- weight: 0.7
- },
- {
- name: 'url',
- weight: 0.5
- }
- ]
- })
-
- const documents_list = JSON.parse(atob(`<?php
-
- global $isLoggedIn;
-
- if ($isLoggedIn) {
- $base = array_values(array_map(function ($i) {
- return [
- "id" => substr($i, 0, -5),
- ...(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/docs/" . $i), true) ?? [])
- ];
- }, array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/docs"), function ($i) {
- return !str_starts_with($i, ".") && str_ends_with($i, ".json");
- })));
- $list = array_map(function ($i) {
- return [
- 'name' => $i["name"],
- 'content' => strip_tags($i["contents"]),
- 'category' => $i["category"],
- 'icon' => "/assets/icons/docs.svg",
- 'url' => "/-/docs/$i[id]",
- 'invert' => true
- ];
- }, $base);
-
- echo(base64_encode(json_encode($list)));
- } else {
- echo(base64_encode(json_encode([])));
- }
-
- ?>`));
- const documents = new Fuse(documents_list, {
- includeScore: true,
- keys: [
- {
- name: 'name',
- weight: 1
- },
- {
- name: 'category',
- weight: 0.7
- },
- {
- name: 'content',
- weight: 0.4
- },
- {
- name: 'url',
- weight: 0.5
- }
- ]
- })
-
- window.shiftPresses = 0;
- window.searchBoxOpen = false;
- window.lastKnownSearchQuery = null;
-
- function toggleGlobalSearch() {
- window.shiftPresses = 0;
- console.log("Search!");
-
- if (document.getElementById("global-search-container").style.display === "none") {
- document.getElementById("global-search-container").style.display = "flex";
- document.getElementById("global-search-list").style.display = "none";
- document.getElementById("global-search-intro").style.display = "flex";
- document.getElementById("global-search-input").focus();
- document.getElementById("global-search-input").value = "";
- window.searchBoxOpen = true;
- } else if (document.getElementById("global-search-container").style.display === "flex") {
- document.getElementById("global-search-container").style.display = "none";
- window.searchBoxOpen = false;
- }
- }
-
- function globalSearchPlaceholder() {
- if (document.getElementById("global-search-input").innerText === "") {
- document.getElementById("global-search-placeholder").style.display = "";
- document.getElementById("global-search-autocomplete").innerText = "";
- document.getElementById("global-search-action").innerText = "";
- } else {
- document.getElementById("global-search-placeholder").style.display = "none";
- }
- }
-
- function globalSearchAutocomplete(firstResult) {
- let querySearch = document.getElementById("global-search-input").innerText.toLowerCase();
- let firstResultSearch = firstResult.name.toLowerCase();
- let isAutocomplete = true;
-
- if (firstResultSearch.length > querySearch.length) {
- let count = 0;
-
- for (let i = 0; i < querySearch.length; i++) {
- if (querySearch.substring(i, i + 1) === firstResultSearch.substring(i, i + 1)) {
- count++;
- } else {
- isAutocomplete = false;
- }
- }
-
- if (isAutocomplete) {
- document.getElementById("global-search-autocomplete").innerText = firstResult.name.substring(count);
- document.getElementById("global-search-action").innerText = " — <?= $lang["search"]["view"] ?>";
- } else {
- document.getElementById("global-search-autocomplete").innerText = "";
- document.getElementById("global-search-action").innerText = " — " + firstResult.name;
- }
- } else {
- document.getElementById("global-search-autocomplete").innerText = "";
- document.getElementById("global-search-action").innerText = "";
- }
- }
-
- function globalSearch() {
- let query = document.getElementById("global-search-input").innerText.trim();
-
- if (query !== lastKnownSearchQuery) {
- window.lastKnownSearchQuery = query;
- } else {
- return;
- }
-
- let results, scores;
- let categories = [];
- console.log("Query:", query);
-
- if (query.trim() === "") {
- document.getElementById("global-search-list").style.display = "none";
- document.getElementById("global-search-intro").style.display = "flex";
- return;
- } else {
- document.getElementById("global-search-list").style.display = "block";
- document.getElementById("global-search-intro").style.display = "none";
- }
-
- results = ponies.search(query).map((i) => {
- i.item.score = i.score;
- return i.item;
- });
- scores = results.map((i) => { return i.score; });
- let results_ponies = {
- category: {
- name: "<?= $lang["search"]["categories"][0] ?>",
- id: "ponies"
- },
- average: scores.length > 0 ? scores.reduce((a, b) => { return a + b; }) / results.length : 1,
- results
- };
-
- results = pages.search(query).map((i) => {
- i.item.score = i.score;
- return i.item;
- });
- scores = results.map((i) => { return i.score; });
- let results_pages = {
- category: {
- name: "<?= $lang["search"]["categories"][1] ?>",
- id: "pages"
- },
- average: scores.length > 0 ? scores.reduce((a, b) => { return a + b; }) / results.length : 1,
- results
- };
-
- results = actions.search(query).map((i) => {
- i.item.score = i.score;
- return i.item;
- });
- scores = results.map((i) => { return i.score; });
- let results_actions = {
- category: {
- name: "<?= $lang["search"]["categories"][2] ?>",
- id: "actions"
- },
- average: scores.length > 0 ? scores.reduce((a, b) => { return a + b; }) / results.length : 1,
- results
- };
-
- results = documents.search(query).map((i) => {
- i.item.score = i.score;
- return i.item;
- });
- scores = results.map((i) => { return i.score; });
- let results_documents = {
- category: {
- name: "<?= $lang["search"]["categories"][3] ?>",
- id: "docs"
- },
- average: scores.length > 0 ? scores.reduce((a, b) => { return a + b; }) / results.length : 1,
- results
- };
-
- results = toys.search(query).map((i) => {
- i.item.score = i.score;
- return i.item;
- });
- scores = results.map((i) => { return i.score; });
- let results_toys = {
- category: {
- name: "<?= $lang["search"]["categories"][4] ?>",
- id: "toys"
- },
- average: scores.length > 0 ? scores.reduce((a, b) => { return a + b; }) / results.length : 1,
- results
- };
-
- window.allSearchResults = [];
- categories.push(results_ponies, results_pages, results_documents, results_actions, results_toys);
- categories = categories.sort((a, b) => {
- return a.average - b.average;
- }).filter((i) => i.results.length > 0);
-
- console.log(categories);
-
- index = -1;
- document.getElementById("global-search-list").innerHTML = categories.map((i) => `
- <div class="global-search-category">
- <div class="global-search-category-header">${i.category.name}</div>
- <div class="global-search-category-items">
- ${i.results.map((j) => { index++; allSearchResults.push(j); return `
- <a href="${j.url}" class="global-search-item ${index === 0 ? 'selected' : ''}" id="global-search-item-${index}">
- <img src="${j.icon}" class="global-search-item-icon" ${j['invert'] ? 'style="filter:invert(1) brightness(5);"' : ""}>
- <span class="global-search-item-title">${j.name}</span>
- </a>
- ` }).join("")}
- </div>
- </div>
- `).join("");
-
- globalSearchAutocomplete(allSearchResults[0]);
-
- console.log("=================================");
- }
-
- document.onkeydown = (event) => {
- if (window.searchBoxOpen) {
- console.log(event);
-
- if (event.key === "Escape") {
- if (document.getElementById("global-search-input").innerText.trim() === "") {
- toggleGlobalSearch();
- } else {
- document.getElementById("global-search-input").innerText = "";
- globalSearch();
- }
- }
-
- if (event.key === "ArrowDown") {
- let id = parseInt(document.querySelector(".global-search-item.selected").id.split("-")[3]);
-
- if (document.getElementById("global-search-item-" + (id + 1)) !== null) {
- document.getElementById("global-search-item-" + id).classList.remove("selected");
- document.getElementById("global-search-item-" + (id + 1)).classList.add("selected");
- document.getElementById("global-search-item-" + (id + 1)).scrollIntoView({
- block: "center",
- inline: "center"
- });
-
- globalSearchAutocomplete(allSearchResults[id + 1]);
- }
-
- event.preventDefault();
- }
-
- if (event.key === "ArrowUp") {
- let id = parseInt(document.querySelector(".global-search-item.selected").id.split("-")[3]);
-
- if (document.getElementById("global-search-item-" + (id - 1)) !== null) {
- document.getElementById("global-search-item-" + id).classList.remove("selected");
- document.getElementById("global-search-item-" + (id - 1)).classList.add("selected");
- document.getElementById("global-search-item-" + (id - 1)).scrollIntoView({
- block: "center",
- inline: "center"
- });
-
- globalSearchAutocomplete(allSearchResults[id - 1]);
- }
-
- event.preventDefault();
- }
-
- if (event.key === "Enter") {
- document.querySelector(".global-search-item.selected").click();
-
- event.preventDefault();
- }
- }
-
- if (event.key === "Shift") {
- window.shiftPresses++;
- }
-
- if ((event.code === "Space" && event.ctrlKey) || window.shiftPresses === 2 && document.getElementsByClassName("ck-focused").length === 0) {
- toggleGlobalSearch();
- }
- }
-
- document.getElementById("global-search-container").onclick = (event) => {
- if (event.target === document.getElementById("global-search-container")) toggleGlobalSearch();
- }
-
- setInterval(() => {
- window.shiftPresses = 0;
- }, 500);
-</script>
-
-<style>
- .global-search-category {
- text-align: left;
- padding: 10px 20px;
- }
-
- .global-search-category-header {
- font-size: 12px;
- opacity: .5;
- margin-bottom: 5px;
- margin-top: 10px;
- }
-
- .global-search-item-icon {
- vertical-align: middle;
- width: 24px;
- height: 24px;
- margin-right: 5px;
- }
-
- .global-search-item-title {
- vertical-align: middle;
- }
-
- .global-search-item {
- text-decoration: none;
- display: block;
- color: white !important;
- border-radius: 10px;
- padding: 3px 5px;
- height: 32px;
- }
-
- .global-search-item:hover, .global-search-item:focus, .global-search-item.selected {
- background-color: rgba(255, 255, 255, .1);
- }
-
- .global-search-item:active {
- background-color: rgba(255, 255, 255, .2);
- }
-
- #global-search-container * {
- outline: none !important;
- }
-</style> \ No newline at end of file