From d4b731841315c8dbe9bdfb0b1d1c5634658dd31b Mon Sep 17 00:00:00 2001
From: Andras Bacsai <andras.bacsai@gmail.com>
Date: Mon, 10 Oct 2022 15:28:36 +0200
Subject: [PATCH] fix: smart search for new services

---
 .../api/src/lib/services/supportedVersions.ts | 60 ++++++++++++-------
 .../services/[id]/configuration/type.svelte   | 49 ++++++++++++++-
 2 files changed, 86 insertions(+), 23 deletions(-)

diff --git a/apps/api/src/lib/services/supportedVersions.ts b/apps/api/src/lib/services/supportedVersions.ts
index 64f049961..d84d1bd65 100644
--- a/apps/api/src/lib/services/supportedVersions.ts
+++ b/apps/api/src/lib/services/supportedVersions.ts
@@ -29,7 +29,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'stable',
 		ports: {
 			main: 8000
-		}
+		},
+		labels: ['analytics', 'plausible', 'plausible-analytics', 'gdpr', 'no-cookie']
 	},
 	{
 		name: 'nocodb',
@@ -39,7 +40,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 8080
-		}
+		},
+		labels: ['nocodb', 'airtable', 'database']
 	},
 	{
 		name: 'minio',
@@ -49,7 +51,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 9001
-		}
+		},
+		labels: ['minio', 's3', 'storage']
 	},
 	{
 		name: 'vscodeserver',
@@ -59,7 +62,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 8080
-		}
+		},
+		labels: ['vscodeserver', 'vscode', 'code-server', 'ide']
 	},
 	{
 		name: 'wordpress',
@@ -70,7 +74,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 80
-		}
+		},
+		labels: ['wordpress', 'blog', 'cms']
 	},
 	{
 		name: 'vaultwarden',
@@ -80,7 +85,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 80
-		}
+		},
+		labels: ['vaultwarden', 'password-manager', 'passwords']
 	},
 	{
 		name: 'languagetool',
@@ -90,7 +96,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 8010
-		}
+		},
+		labels: ['languagetool', 'grammar', 'spell-checker']
 	},
 	{
 		name: 'n8n',
@@ -100,7 +107,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 5678
-		}
+		},
+		labels: ['n8n', 'workflow', 'automation', 'ifttt', 'zapier', 'nodered']
 	},
 	{
 		name: 'uptimekuma',
@@ -110,7 +118,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 3001
-		}
+		},
+		labels: ['uptimekuma', 'uptime', 'monitoring']
 	},
 	{
 		name: 'ghost',
@@ -121,7 +130,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 2368
-		}
+		},
+		labels: ['ghost', 'blog', 'cms']
 	},
 	{
 		name: 'meilisearch',
@@ -132,7 +142,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 7700
-		}
+		},
+		labels: ['meilisearch', 'search', 'search-engine']
 	},
 	{
 		name: 'umami',
@@ -143,7 +154,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'postgresql-latest',
 		ports: {
 			main: 3000
-		}
+		},
+		labels: ['umami', 'analytics', 'gdpr', 'no-cookie']
 	},
 	{
 		name: 'hasura',
@@ -154,7 +166,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'v2.10.0',
 		ports: {
 			main: 8080
-		}
+		},
+		labels: ['hasura', 'graphql', 'database']
 	},
 	{
 		name: 'fider',
@@ -165,7 +178,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'stable',
 		ports: {
 			main: 3000
-		}
+		},
+		labels: ['fider', 'feedback', 'suggestions']
 	},
 	{
 		name: 'appwrite',
@@ -176,7 +190,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: '1.0',
 		ports: {
 			main: 80
-		}
+		},
+		labels: ['appwrite', 'database', 'storage', 'api', 'serverless']
 	},
 	// {
 	//     name: 'moodle',
@@ -198,7 +213,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 8000
-		}
+		},
+		labels: ['glitchtip', 'error-reporting', 'error', 'sentry', 'bugsnag']
 	},
 	{
 		name: 'searxng',
@@ -209,7 +225,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 8080
-		}
+		},
+		labels: ['searxng', 'search', 'search-engine']
 	},
 	{
 		name: 'weblate',
@@ -220,7 +237,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 8080
-		}
+		},
+		labels: ['weblate', 'translation', 'localization']
 	},
 	// {
 	// 	name: 'taiga',
@@ -242,7 +260,8 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 3000
-		}
+		},
+		labels: ['grafana', 'monitoring', 'metrics', 'dashboard']
 	},
 	{
 		name: 'trilium',
@@ -253,6 +272,7 @@ export const supportedServiceTypesAndVersions = [
 		recommendedVersion: 'latest',
 		ports: {
 			main: 8080
-		}
+		},
+		labels: ['trilium', 'notes', 'note-taking', 'wiki']
 	},
 ];
diff --git a/apps/ui/src/routes/services/[id]/configuration/type.svelte b/apps/ui/src/routes/services/[id]/configuration/type.svelte
index bd4bbd74e..dcc6aee03 100644
--- a/apps/ui/src/routes/services/[id]/configuration/type.svelte
+++ b/apps/ui/src/routes/services/[id]/configuration/type.svelte
@@ -27,10 +27,12 @@
 <script lang="ts">
 	export let types: any;
 
+	let search = '';
+	let filteredTypes = types;
+
 	import { page } from '$app/stores';
 	import { goto } from '$app/navigation';
 	import { get, post } from '$lib/api';
-	import { t } from '$lib/translations';
 	import { errorNotification } from '$lib/common';
 	import ServiceIcons from '$lib/components/svg/services/ServiceIcons.svelte';
 
@@ -45,10 +47,50 @@
 			return errorNotification(error);
 		}
 	}
+	function doSearch() {
+		filteredTypes = types.filter(
+			(type: any) =>
+				type.name.toLowerCase().includes(search.toLowerCase()) ||
+				type.labels.some((label: string) => label.toLowerCase().includes(search.toLowerCase()))
+		);
+	}
+	function cleanupSearch() {
+		search = '';
+		filteredTypes = types;
+	}
 </script>
 
-<div class="flex flex-wrap justify-center">
-	{#each types as type}
+<div class="container lg:mx-auto lg:p-0 px-8 pt-5">
+	<div class="input-group flex w-full">
+		<div class="btn btn-square cursor-default no-animation hover:bg-error" on:click={cleanupSearch}>
+			<svg
+				xmlns="http://www.w3.org/2000/svg"
+				class="w-6 h-6"
+				viewBox="0 0 24 24"
+				stroke-width="1.5"
+				stroke="currentcolor"
+				fill="none"
+				stroke-linecap="round"
+				stroke-linejoin="round"
+			>
+				<path stroke="none" d="M0 0h24v24H0z" fill="none" />
+				<line x1="18" y1="6" x2="6" y2="18" />
+				<line x1="6" y1="6" x2="18" y2="18" />
+			</svg>
+		</div>
+		<input
+			id="search"
+			class="input w-full"
+			type="text"
+			placeholder="Search for services"
+			bind:value={search}
+			on:input={() => doSearch()}
+		/>
+	</div>
+</div>
+<div class="container lg:mx-auto lg:pt-20 lg:p-0 px-8 pt-20">
+<div class="flex flex-wrap justify-center  gap-8">
+	{#each filteredTypes as type}
 		<div class="p-2">
 			<form on:submit|preventDefault={() => handleSubmit(type.name)}>
 				<button type="submit" class="box-selection relative text-xl font-bold hover:bg-pink-600">
@@ -59,3 +101,4 @@
 		</div>
 	{/each}
 </div>
+</div>