From 0e41f4d18e6d72ecb9197f2029e248323cc72377 Mon Sep 17 00:00:00 2001 From: Steven RYDELL Date: Thu, 30 Jul 2026 14:28:43 +0200 Subject: [PATCH] feat(ui): add backend icons to variant selectors --- public/icons/backends/alibaba.svg | 1 + public/icons/backends/aws-light.svg | 1 + public/icons/backends/azure.ico | Bin 0 -> 17174 bytes public/icons/backends/baiducloud-color.svg | 1 + public/icons/backends/bunny.svg | 28 +++++ public/icons/backends/cloudflare.svg | 1 + public/icons/backends/cpanel.svg | 1 + public/icons/backends/digital-ocean.svg | 1 + public/icons/backends/dnsimple.svg | 1 + public/icons/backends/duckdns.svg | 1 + public/icons/backends/foundationdb.svg | 124 +++++++++++++++++++ public/icons/backends/google.svg | 1 + public/icons/backends/ibm.svg | 1 + public/icons/backends/ionos.svg | 1 + public/icons/backends/mysql.svg | 1 + public/icons/backends/ovh.svg | 1 + public/icons/backends/porkbun.png | Bin 0 -> 20844 bytes public/icons/backends/postgresql.svg | 1 + public/icons/backends/quad9.svg | 1 + public/icons/backends/redis.svg | 1 + public/icons/backends/rocksdb.svg | 1 + public/icons/backends/sqlite.svg | 1 + public/icons/backends/tencentcloud-color.svg | 1 + public/icons/backends/valkey.svg | 1 + public/icons/backends/vercel.svg | 1 + public/icons/backends/vultr.svg | 1 + public/icons/backends/yandex.svg | 1 + src/components/common/BackendIcon.tsx | 69 +++++++++++ src/components/forms/DynamicForm.tsx | 16 ++- src/components/forms/FieldWidget.tsx | 15 ++- 30 files changed, 270 insertions(+), 5 deletions(-) create mode 100644 public/icons/backends/alibaba.svg create mode 100644 public/icons/backends/aws-light.svg create mode 100644 public/icons/backends/azure.ico create mode 100644 public/icons/backends/baiducloud-color.svg create mode 100644 public/icons/backends/bunny.svg create mode 100644 public/icons/backends/cloudflare.svg create mode 100644 public/icons/backends/cpanel.svg create mode 100644 public/icons/backends/digital-ocean.svg create mode 100644 public/icons/backends/dnsimple.svg create mode 100644 public/icons/backends/duckdns.svg create mode 100644 public/icons/backends/foundationdb.svg create mode 100644 public/icons/backends/google.svg create mode 100644 public/icons/backends/ibm.svg create mode 100644 public/icons/backends/ionos.svg create mode 100644 public/icons/backends/mysql.svg create mode 100644 public/icons/backends/ovh.svg create mode 100644 public/icons/backends/porkbun.png create mode 100644 public/icons/backends/postgresql.svg create mode 100644 public/icons/backends/quad9.svg create mode 100644 public/icons/backends/redis.svg create mode 100644 public/icons/backends/rocksdb.svg create mode 100644 public/icons/backends/sqlite.svg create mode 100644 public/icons/backends/tencentcloud-color.svg create mode 100644 public/icons/backends/valkey.svg create mode 100644 public/icons/backends/vercel.svg create mode 100644 public/icons/backends/vultr.svg create mode 100644 public/icons/backends/yandex.svg create mode 100644 src/components/common/BackendIcon.tsx diff --git a/public/icons/backends/alibaba.svg b/public/icons/backends/alibaba.svg new file mode 100644 index 0000000..90fa403 --- /dev/null +++ b/public/icons/backends/alibaba.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/aws-light.svg b/public/icons/backends/aws-light.svg new file mode 100644 index 0000000..711a93a --- /dev/null +++ b/public/icons/backends/aws-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/azure.ico b/public/icons/backends/azure.ico new file mode 100644 index 0000000000000000000000000000000000000000..bfe873eb228f98720fe0ed18c638daa13906958f GIT binary patch literal 17174 zcmeHOJ#Q015PgP|sUltJ%A8D-(o!TUkc{NQ1+uPjPZg!4M<`cP($XUeDk>yUiu?k8 z10_|E2qK~~GdH`@9=;55lyHgjMj7wN?OyiY%vw?RV_+}{(X$}` zkiRp}d#2#VM9RE@(KQaI zUnaWs7TXteX8N); ON)^VQz<8Ga>-ryC<7BY_ literal 0 HcmV?d00001 diff --git a/public/icons/backends/baiducloud-color.svg b/public/icons/backends/baiducloud-color.svg new file mode 100644 index 0000000..40565ef --- /dev/null +++ b/public/icons/backends/baiducloud-color.svg @@ -0,0 +1 @@ +BaiduCloud \ No newline at end of file diff --git a/public/icons/backends/bunny.svg b/public/icons/backends/bunny.svg new file mode 100644 index 0000000..2ea31fa --- /dev/null +++ b/public/icons/backends/bunny.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/icons/backends/cloudflare.svg b/public/icons/backends/cloudflare.svg new file mode 100644 index 0000000..66cc020 --- /dev/null +++ b/public/icons/backends/cloudflare.svg @@ -0,0 +1 @@ +Cloudflare \ No newline at end of file diff --git a/public/icons/backends/cpanel.svg b/public/icons/backends/cpanel.svg new file mode 100644 index 0000000..4bfc2ac --- /dev/null +++ b/public/icons/backends/cpanel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/digital-ocean.svg b/public/icons/backends/digital-ocean.svg new file mode 100644 index 0000000..fbc40ee --- /dev/null +++ b/public/icons/backends/digital-ocean.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/dnsimple.svg b/public/icons/backends/dnsimple.svg new file mode 100644 index 0000000..9b30e91 --- /dev/null +++ b/public/icons/backends/dnsimple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/duckdns.svg b/public/icons/backends/duckdns.svg new file mode 100644 index 0000000..925ef6f --- /dev/null +++ b/public/icons/backends/duckdns.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/foundationdb.svg b/public/icons/backends/foundationdb.svg new file mode 100644 index 0000000..c6814a5 --- /dev/null +++ b/public/icons/backends/foundationdb.svg @@ -0,0 +1,124 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icons/backends/google.svg b/public/icons/backends/google.svg new file mode 100644 index 0000000..e9576f7 --- /dev/null +++ b/public/icons/backends/google.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/ibm.svg b/public/icons/backends/ibm.svg new file mode 100644 index 0000000..d97f8d0 --- /dev/null +++ b/public/icons/backends/ibm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/ionos.svg b/public/icons/backends/ionos.svg new file mode 100644 index 0000000..8c429cc --- /dev/null +++ b/public/icons/backends/ionos.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/mysql.svg b/public/icons/backends/mysql.svg new file mode 100644 index 0000000..3245e88 --- /dev/null +++ b/public/icons/backends/mysql.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/ovh.svg b/public/icons/backends/ovh.svg new file mode 100644 index 0000000..9daa905 --- /dev/null +++ b/public/icons/backends/ovh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/porkbun.png b/public/icons/backends/porkbun.png new file mode 100644 index 0000000000000000000000000000000000000000..f34914c7166ca3415e874f8a89846f2c4bf8f64d GIT binary patch literal 20844 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 literal 0 HcmV?d00001 diff --git a/public/icons/backends/postgresql.svg b/public/icons/backends/postgresql.svg new file mode 100644 index 0000000..abacb8f --- /dev/null +++ b/public/icons/backends/postgresql.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/quad9.svg b/public/icons/backends/quad9.svg new file mode 100644 index 0000000..97b1f8c --- /dev/null +++ b/public/icons/backends/quad9.svg @@ -0,0 +1 @@ +Quad9 \ No newline at end of file diff --git a/public/icons/backends/redis.svg b/public/icons/backends/redis.svg new file mode 100644 index 0000000..1981b34 --- /dev/null +++ b/public/icons/backends/redis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/rocksdb.svg b/public/icons/backends/rocksdb.svg new file mode 100644 index 0000000..7fc4e76 --- /dev/null +++ b/public/icons/backends/rocksdb.svg @@ -0,0 +1 @@ +RocksDB \ No newline at end of file diff --git a/public/icons/backends/sqlite.svg b/public/icons/backends/sqlite.svg new file mode 100644 index 0000000..3bfccb8 --- /dev/null +++ b/public/icons/backends/sqlite.svg @@ -0,0 +1 @@ +SQLite \ No newline at end of file diff --git a/public/icons/backends/tencentcloud-color.svg b/public/icons/backends/tencentcloud-color.svg new file mode 100644 index 0000000..4e7d033 --- /dev/null +++ b/public/icons/backends/tencentcloud-color.svg @@ -0,0 +1 @@ +TencentCloud \ No newline at end of file diff --git a/public/icons/backends/valkey.svg b/public/icons/backends/valkey.svg new file mode 100644 index 0000000..81d8d3b --- /dev/null +++ b/public/icons/backends/valkey.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/vercel.svg b/public/icons/backends/vercel.svg new file mode 100644 index 0000000..45ca605 --- /dev/null +++ b/public/icons/backends/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/vultr.svg b/public/icons/backends/vultr.svg new file mode 100644 index 0000000..b1899a2 --- /dev/null +++ b/public/icons/backends/vultr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons/backends/yandex.svg b/public/icons/backends/yandex.svg new file mode 100644 index 0000000..0f3d997 --- /dev/null +++ b/public/icons/backends/yandex.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/common/BackendIcon.tsx b/src/components/common/BackendIcon.tsx new file mode 100644 index 0000000..c6b7dac --- /dev/null +++ b/src/components/common/BackendIcon.tsx @@ -0,0 +1,69 @@ +/* + * SPDX-FileCopyrightText: 2020 Stalwart Labs LLC + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL + */ + +import React from 'react'; + +const BACKEND_ICONS: Record = { + alibaba: { path: '/icons/backends/alibaba.svg' }, + alibabacloud: { path: '/icons/backends/alibaba.svg' }, + aws: { path: '/icons/backends/aws-light.svg' }, + amazonwebservices: { path: '/icons/backends/aws-light.svg' }, + azure: { path: '/icons/backends/azure.ico', isIco: true }, + baidu: { path: '/icons/backends/baiducloud-color.svg' }, + baiducloud: { path: '/icons/backends/baiducloud-color.svg' }, + bunny: { path: '/icons/backends/bunny.svg' }, + bunnynet: { path: '/icons/backends/bunny.svg' }, + cloudflare: { path: '/icons/backends/cloudflare.svg' }, + digitalocean: { path: '/icons/backends/digital-ocean.svg' }, + dnsimple: { path: '/icons/backends/dnsimple.svg' }, + foundationdb: { path: '/icons/backends/foundationdb.svg' }, + google: { path: '/icons/backends/google.svg' }, + googlecloud: { path: '/icons/backends/google.svg' }, + mariadb: { path: '/icons/backends/mysql.svg' }, + mysql: { path: '/icons/backends/mysql.svg' }, + ovh: { path: '/icons/backends/ovh.svg' }, + porkbun: { path: '/icons/backends/porkbun.png' }, + postgres: { path: '/icons/backends/postgresql.svg' }, + postgresql: { path: '/icons/backends/postgresql.svg' }, + quad9: { path: '/icons/backends/quad9.svg' }, + redis: { path: '/icons/backends/redis.svg' }, + rediscluster: { path: '/icons/backends/redis.svg' }, + redissentinel: { path: '/icons/backends/redis.svg' }, + redisvalkey: { path: '/icons/backends/redis.svg' }, + rocksdb: { path: '/icons/backends/rocksdb.svg' }, + sqlite: { path: '/icons/backends/sqlite.svg' }, + valkey: { path: '/icons/backends/valkey.svg' }, + vercel: { path: '/icons/backends/vercel.svg' }, +}; + +interface BackendIconProps { + backend: string | null | undefined; + className?: string; + fallback?: React.ReactNode; +} + +export function BackendIcon({ backend, className, fallback = null }: BackendIconProps): React.ReactElement | null { + if (!backend) return null; + + const key = backend.toLowerCase().replace(/[^a-z0-9]/g, ''); + const icon = BACKEND_ICONS[key] ?? BACKEND_ICONS[backend.toLowerCase()]; + if (!icon) return fallback as React.ReactElement | null; + + return ( + {`${backend} + ); +} + +export function isBackendIconKnown(backend: string | null | undefined): boolean { + if (!backend) return false; + const key = backend.toLowerCase().replace(/[^a-z0-9]/g, ''); + return Boolean(BACKEND_ICONS[key] ?? BACKEND_ICONS[backend.toLowerCase()]); +} diff --git a/src/components/forms/DynamicForm.tsx b/src/components/forms/DynamicForm.tsx index 469425e..ed49f6a 100644 --- a/src/components/forms/DynamicForm.tsx +++ b/src/components/forms/DynamicForm.tsx @@ -11,7 +11,7 @@ import { useTranslation } from 'react-i18next'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Label } from '@/components/ui/label'; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Select, SelectContent, SelectItem, SelectTrigger } from '@/components/ui/select'; import { AlertDialog, AlertDialogAction, @@ -53,6 +53,7 @@ import { SECRET_MASK } from '@/lib/jmapUtils'; import { toast } from '@/hooks/use-toast'; import { logFormChange } from '@/lib/debug'; import { FieldWidget } from '@/components/forms/FieldWidget'; +import { BackendIcon } from '@/components/common/BackendIcon'; import type { Field, Fields, Form, FormField, Schema } from '@/types/schema'; import type { JmapSetResponse, JmapSetError, JmapMethodCall } from '@/types/jmap'; @@ -773,17 +774,26 @@ export function DynamicForm({ viewName, objectId }: DynamicFormProps) { if (!visible) return null; if (formField.name === '@type' && sch.type === 'multiple') { + const selectedVariantLabel = sch.variants.find((v) => v.name === selectedVariant)?.label; return (
- + + + + {selectedVariantLabel || t('form.selectType', 'Select type...')} + + {resolvedSchema.variants.map((v) => ( - {v.label} + + + {v.label} + ))}