Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3e30246342 | |||
| f296070f3b | |||
| 4d149fd927 | |||
| 5eef9f2467 | |||
| 3fc68adcd2 | |||
| 7018e2eda5 | |||
| 54364d7a88 | |||
| e65daea8dd | |||
| 23e8ac702e | |||
| d777ee9211 | |||
| 01982964bb |
@@ -134,7 +134,8 @@ export function AdminToolsTab() {
|
|||||||
</div>
|
</div>
|
||||||
<Button
|
<Button
|
||||||
size="sm"
|
size="sm"
|
||||||
variant="destructive"
|
variant="outline"
|
||||||
|
className="text-destructive hover:bg-destructive hover:text-destructive-foreground"
|
||||||
disabled={selectedIds.length === 0 || trash.isPending}
|
disabled={selectedIds.length === 0 || trash.isPending}
|
||||||
onClick={() => setConfirmTrash(true)}
|
onClick={() => setConfirmTrash(true)}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ export function CompareBar({
|
|||||||
if (tools.length === 0) return null;
|
if (tools.length === 0) return null;
|
||||||
return (
|
return (
|
||||||
<div className="fixed bottom-4 left-1/2 -translate-x-1/2 z-50 w-[min(96vw,42rem)]">
|
<div className="fixed bottom-4 left-1/2 -translate-x-1/2 z-50 w-[min(96vw,42rem)]">
|
||||||
<div className="rounded-xl border bg-popover/95 backdrop-blur shadow-lg p-3">
|
<div className="neon-glow rounded-xl border bg-popover/95 backdrop-blur shadow-lg p-3">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<Scale className="w-4 h-4 text-muted-foreground shrink-0" />
|
<Scale className="w-4 h-4 text-muted-foreground shrink-0" />
|
||||||
<div className="flex items-center gap-1.5 flex-1 min-w-0 overflow-x-auto">
|
<div className="flex items-center gap-1.5 flex-1 min-w-0 overflow-x-auto">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Link, useLocation } from "wouter";
|
import { Link, useLocation } from "wouter";
|
||||||
import { LayoutDashboard, Wrench, BarChart3, FileText, LogIn, LogOut, ShieldCheck, AlertTriangle, Search } from "lucide-react";
|
import { LayoutDashboard, Wrench, BarChart3, LogIn, LogOut, ShieldCheck, AlertTriangle, Search, Trash2, HelpCircle } from "lucide-react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { useAuth } from "@/hooks/use-auth";
|
import { useAuth } from "@/hooks/use-auth";
|
||||||
import { useGetVersion, getGetVersionQueryKey } from "@workspace/api-client-react";
|
import { useGetVersion, getGetVersionQueryKey } from "@workspace/api-client-react";
|
||||||
@@ -39,12 +39,12 @@ export function Layout({ children }: { children: React.ReactNode }) {
|
|||||||
{ href: "/", label: t("nav.home"), icon: LayoutDashboard },
|
{ href: "/", label: t("nav.home"), icon: LayoutDashboard },
|
||||||
{ href: "/tools", label: t("nav.browseTools"), icon: Wrench },
|
{ href: "/tools", label: t("nav.browseTools"), icon: Wrench },
|
||||||
{ href: "/analytics", label: t("nav.analytics"), icon: BarChart3 },
|
{ href: "/analytics", label: t("nav.analytics"), icon: BarChart3 },
|
||||||
{ href: "/docs", label: t("nav.docs"), icon: FileText },
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const adminLinks = [
|
const adminLinks = [
|
||||||
{ href: "/admin", label: t("nav.admin"), icon: ShieldCheck },
|
{ href: "/admin", label: t("nav.admin"), icon: ShieldCheck },
|
||||||
{ href: "/admin/redundancy", label: t("nav.redundancy"), icon: AlertTriangle },
|
{ href: "/admin/redundancy", label: t("nav.redundancy"), icon: AlertTriangle },
|
||||||
|
{ href: "/trash", label: t("nav.trash"), icon: Trash2 },
|
||||||
];
|
];
|
||||||
|
|
||||||
function isActive(href: string) {
|
function isActive(href: string) {
|
||||||
@@ -109,7 +109,18 @@ export function Layout({ children }: { children: React.ReactNode }) {
|
|||||||
<SidebarFooter className="gap-2">
|
<SidebarFooter className="gap-2">
|
||||||
<UserMenu />
|
<UserMenu />
|
||||||
<div className="border-t pt-2 flex items-center justify-between text-[11px] text-muted-foreground px-2 group-data-[collapsible=icon]:justify-center">
|
<div className="border-t pt-2 flex items-center justify-between text-[11px] text-muted-foreground px-2 group-data-[collapsible=icon]:justify-center">
|
||||||
<span className="font-medium group-data-[collapsible=icon]:hidden">toolr</span>
|
<div className="flex items-center gap-1.5 font-medium group-data-[collapsible=icon]:hidden">
|
||||||
|
<span>toolr</span>
|
||||||
|
<a
|
||||||
|
href="/docs"
|
||||||
|
title={t("nav.docs")}
|
||||||
|
aria-label={t("nav.docs")}
|
||||||
|
data-testid="button-help"
|
||||||
|
className="text-muted-foreground hover:text-primary transition-colors"
|
||||||
|
>
|
||||||
|
<HelpCircle className="w-3.5 h-3.5" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
{version?.commitSha ? (
|
{version?.commitSha ? (
|
||||||
<a
|
<a
|
||||||
href={`https://git.kubebase.de/admin/tool-evaluator/commit/${version.commitSha}`}
|
href={`https://git.kubebase.de/admin/tool-evaluator/commit/${version.commitSha}`}
|
||||||
|
|||||||
@@ -38,9 +38,9 @@ export function MiniBars({
|
|||||||
<span className="text-[10px] uppercase tracking-wide text-muted-foreground w-[3.5rem] shrink-0">
|
<span className="text-[10px] uppercase tracking-wide text-muted-foreground w-[3.5rem] shrink-0">
|
||||||
{label}
|
{label}
|
||||||
</span>
|
</span>
|
||||||
<div className="flex-1 h-1.5 rounded-full bg-muted overflow-hidden">
|
<div className="flex-1 h-1.5 rounded-full bg-foreground/5 overflow-hidden">
|
||||||
<div
|
<div
|
||||||
className="h-full rounded-full bg-primary/70"
|
className="neon-bar h-full rounded-full"
|
||||||
style={{ width: `${pct(value)}%` }}
|
style={{ width: `${pct(value)}%` }}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -67,17 +67,17 @@ export function MiniBarStack({
|
|||||||
const a = num(usability);
|
const a = num(usability);
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={cn("h-1.5 w-16 rounded-full bg-muted overflow-hidden flex", className)}
|
className={cn("h-1.5 w-16 rounded-full bg-foreground/5 overflow-hidden flex", className)}
|
||||||
title={`Usefulness ${u != null ? u.toFixed(1) : "N/A"} / Usability ${
|
title={`Usefulness ${u != null ? u.toFixed(1) : "N/A"} / Usability ${
|
||||||
a != null ? a.toFixed(1) : "N/A"
|
a != null ? a.toFixed(1) : "N/A"
|
||||||
} (of 5)`}
|
} (of 5)`}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
className="h-full bg-primary/80"
|
className="neon-bar h-full"
|
||||||
style={{ width: `${pct(usefulness)}%` }}
|
style={{ width: `${pct(usefulness)}%` }}
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
className="h-full bg-primary/40"
|
className="neon-bar h-full opacity-60"
|
||||||
style={{ width: `${pct(usability)}%` }}
|
style={{ width: `${pct(usability)}%` }}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ export function RatingStars({ value, max = 5, size = "md", interactive = false,
|
|||||||
data-testid={`star-${starValue}`}
|
data-testid={`star-${starValue}`}
|
||||||
>
|
>
|
||||||
<Star
|
<Star
|
||||||
className={`${sizeClasses[size]} ${isFilled ? "fill-primary text-primary" : "text-muted-foreground/30"} transition-colors`}
|
className={`${sizeClasses[size]} ${isFilled ? "fill-primary text-primary [filter:drop-shadow(0_0_4px_hsl(var(--primary)/0.45))]" : "text-muted-foreground/30"} transition-colors group-hover:brightness-110 ${interactive ? "hover:[filter:drop-shadow(0_0_6px_hsl(var(--glow-1)/0.6))]" : ""}`}
|
||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export function ToolCard({
|
|||||||
watchlist?: { watched: boolean; onToggle: () => void };
|
watchlist?: { watched: boolean; onToggle: () => void };
|
||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<Card className="hover-elevate transition-all flex flex-col h-full cursor-pointer hover:border-primary/50">
|
<Card className="hover-elevate transition-all flex flex-col h-full cursor-pointer hover:border-primary/50 hover:neon-glow-primary">
|
||||||
<Link href={`/tools/${tool.id}`} className="flex flex-col h-full p-0 m-0">
|
<Link href={`/tools/${tool.id}`} className="flex flex-col h-full p-0 m-0">
|
||||||
<CardHeader className="pb-3">
|
<CardHeader className="pb-3">
|
||||||
<div className="flex items-start gap-3 mb-2">
|
<div className="flex items-start gap-3 mb-2">
|
||||||
|
|||||||
@@ -12,14 +12,14 @@ const buttonVariants = cva(
|
|||||||
variant: {
|
variant: {
|
||||||
default:
|
default:
|
||||||
// @replit: no hover, and add primary border
|
// @replit: no hover, and add primary border
|
||||||
"bg-primary text-primary-foreground border border-primary-border",
|
"bg-primary text-primary-foreground border border-primary-border neon-glow-primary hover:brightness-105 focus-visible:brightness-105 transition-[box-shadow,filter]",
|
||||||
destructive:
|
destructive:
|
||||||
"bg-destructive text-destructive-foreground shadow-sm border-destructive-border",
|
"bg-destructive text-destructive-foreground shadow-sm border-destructive-border shadow-[0_0_12px_-2px_hsl(var(--destructive)/0.5)] hover:brightness-105 transition-[box-shadow,filter]",
|
||||||
outline:
|
outline:
|
||||||
// @replit Shows the background color of whatever card / sidebar / accent background it is inside of.
|
// @replit Shows the background color of whatever card / sidebar / accent background it is inside of.
|
||||||
// Inherits the current text color. Uses shadow-xs. no shadow on active
|
// Inherits the current text color. Uses shadow-xs. no shadow on active
|
||||||
// No hover state
|
// No hover state
|
||||||
" border [border-color:var(--button-outline)] shadow-xs active:shadow-none ",
|
" border [border-color:var(--button-outline)] shadow-xs active:shadow-none hover:neon-glow focus-visible:neon-glow transition-shadow",
|
||||||
secondary:
|
secondary:
|
||||||
// @replit border, no hover, no shadow, secondary border.
|
// @replit border, no hover, no shadow, secondary border.
|
||||||
"border bg-secondary text-secondary-foreground border border-secondary-border ",
|
"border bg-secondary text-secondary-foreground border border-secondary-border ",
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>(
|
|||||||
<input
|
<input
|
||||||
type={type}
|
type={type}
|
||||||
className={cn(
|
className={cn(
|
||||||
"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
|
"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:shadow-[0_0_0_1px_hsl(var(--ring)/0.2)] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
|
||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
ref={ref}
|
ref={ref}
|
||||||
|
|||||||
@@ -12,13 +12,13 @@ const Progress = React.forwardRef<
|
|||||||
<ProgressPrimitive.Root
|
<ProgressPrimitive.Root
|
||||||
ref={ref}
|
ref={ref}
|
||||||
className={cn(
|
className={cn(
|
||||||
"relative h-2 w-full overflow-hidden rounded-full bg-primary/20",
|
"relative h-2 w-full overflow-hidden rounded-full border border-border/60 bg-foreground/5",
|
||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
{...props}
|
{...props}
|
||||||
>
|
>
|
||||||
<ProgressPrimitive.Indicator
|
<ProgressPrimitive.Indicator
|
||||||
className="h-full w-full flex-1 bg-primary transition-all"
|
className="neon-bar h-full w-full flex-1 transition-all"
|
||||||
style={{ transform: `translateX(-${100 - (value || 0)}%)` }}
|
style={{ transform: `translateX(-${100 - (value || 0)}%)` }}
|
||||||
/>
|
/>
|
||||||
</ProgressPrimitive.Root>
|
</ProgressPrimitive.Root>
|
||||||
|
|||||||
@@ -487,7 +487,7 @@ function SidebarMenuItem({ className, ...props }: React.ComponentProps<"li">) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const sidebarMenuButtonVariants = cva(
|
const sidebarMenuButtonVariants = cva(
|
||||||
"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:w-8! group-data-[collapsible=icon]:h-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
|
"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[active=true]:neon-glow-primary data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:w-8! group-data-[collapsible=icon]:h-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
|
||||||
{
|
{
|
||||||
variants: {
|
variants: {
|
||||||
variant: {
|
variant: {
|
||||||
@@ -530,7 +530,7 @@ function SidebarMenuButton({
|
|||||||
data-sidebar="menu-button"
|
data-sidebar="menu-button"
|
||||||
data-size={size}
|
data-size={size}
|
||||||
data-active={isActive}
|
data-active={isActive}
|
||||||
className={cn(sidebarMenuButtonVariants({ variant, size }), className)}
|
className={cn("neon-sidebar-active", sidebarMenuButtonVariants({ variant, size }), className)}
|
||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ function Skeleton({
|
|||||||
}: React.HTMLAttributes<HTMLDivElement>) {
|
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={cn("animate-pulse rounded-md bg-primary/10", className)}
|
className={cn("loading-gradient rounded-md border border-border/60", className)}
|
||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -7,7 +7,10 @@ function Spinner({ className, ...props }: React.ComponentProps<"svg">) {
|
|||||||
<Loader2Icon
|
<Loader2Icon
|
||||||
role="status"
|
role="status"
|
||||||
aria-label="Loading"
|
aria-label="Loading"
|
||||||
className={cn("size-4 animate-spin", className)}
|
className={cn(
|
||||||
|
"size-4 animate-spin text-primary [filter:drop-shadow(0_0_6px_hsl(var(--glow-1)/0.55))]",
|
||||||
|
className
|
||||||
|
)}
|
||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ const Textarea = React.forwardRef<
|
|||||||
return (
|
return (
|
||||||
<textarea
|
<textarea
|
||||||
className={cn(
|
className={cn(
|
||||||
"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
|
"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:shadow-[0_0_0_1px_hsl(var(--ring)/0.2)] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
|
||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
ref={ref}
|
ref={ref}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ const TooltipContent = React.forwardRef<
|
|||||||
ref={ref}
|
ref={ref}
|
||||||
sideOffset={sideOffset}
|
sideOffset={sideOffset}
|
||||||
className={cn(
|
className={cn(
|
||||||
"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",
|
"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-xs text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",
|
||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
{...props}
|
{...props}
|
||||||
|
|||||||
@@ -99,7 +99,7 @@
|
|||||||
--popover-foreground: 222 47% 11%;
|
--popover-foreground: 222 47% 11%;
|
||||||
--popover-border: 214 32% 91%;
|
--popover-border: 214 32% 91%;
|
||||||
|
|
||||||
--primary: 14 100% 57%; /* Sharp Builder Orange */
|
--primary: 262 83% 58%; /* Violet accent */
|
||||||
--primary-foreground: 0 0% 100%;
|
--primary-foreground: 0 0% 100%;
|
||||||
|
|
||||||
--secondary: 210 40% 96%;
|
--secondary: 210 40% 96%;
|
||||||
@@ -115,14 +115,18 @@
|
|||||||
--destructive-foreground: 0 0% 100%;
|
--destructive-foreground: 0 0% 100%;
|
||||||
|
|
||||||
--input: 214 32% 91%;
|
--input: 214 32% 91%;
|
||||||
--ring: 14 100% 57%;
|
--ring: 262 83% 58%;
|
||||||
|
|
||||||
--chart-1: 14 100% 57%;
|
--chart-1: 262 83% 58%;
|
||||||
--chart-2: 222 47% 11%;
|
--chart-2: 222 47% 11%;
|
||||||
--chart-3: 187 100% 42%;
|
--chart-3: 264 80% 70%;
|
||||||
--chart-4: 43 100% 50%;
|
--chart-4: 43 100% 50%;
|
||||||
--chart-5: 280 80% 50%;
|
--chart-5: 280 80% 50%;
|
||||||
|
|
||||||
|
--glow-1: 262 88% 62%; /* violet (accent) */
|
||||||
|
--glow-2: 285 92% 72%; /* magenta/violet */
|
||||||
|
--glow-3: 214 92% 62%; /* lavender-blue */
|
||||||
|
|
||||||
--app-font-sans: 'Inter', sans-serif;
|
--app-font-sans: 'Inter', sans-serif;
|
||||||
--app-font-serif: Georgia, serif;
|
--app-font-serif: Georgia, serif;
|
||||||
--app-font-mono: 'JetBrains Mono', Menlo, monospace;
|
--app-font-mono: 'JetBrains Mono', Menlo, monospace;
|
||||||
@@ -200,8 +204,8 @@
|
|||||||
--popover-foreground: 210 40% 98%;
|
--popover-foreground: 210 40% 98%;
|
||||||
--popover-border: 217 33% 17%;
|
--popover-border: 217 33% 17%;
|
||||||
|
|
||||||
--primary: 38 92% 50%;
|
--primary: 187 95% 55%;
|
||||||
--primary-foreground: 222 47% 11%;
|
--primary-foreground: 210 40% 5%;
|
||||||
|
|
||||||
--secondary: 217 33% 17%;
|
--secondary: 217 33% 17%;
|
||||||
--secondary-foreground: 210 40% 98%;
|
--secondary-foreground: 210 40% 98%;
|
||||||
@@ -212,17 +216,21 @@
|
|||||||
--accent: 217 33% 17%;
|
--accent: 217 33% 17%;
|
||||||
--accent-foreground: 210 40% 98%;
|
--accent-foreground: 210 40% 98%;
|
||||||
|
|
||||||
--destructive: 0 62.8% 30.6%;
|
--destructive: 0 72% 48%;
|
||||||
--destructive-foreground: 210 40% 98%;
|
--destructive-foreground: 210 40% 98%;
|
||||||
|
|
||||||
--input: 217 33% 17%;
|
--input: 217 33% 17%;
|
||||||
--ring: 38 92% 50%;
|
--ring: 187 95% 55%;
|
||||||
--chart-1: 38 92% 50%;
|
--chart-1: 187 95% 55%;
|
||||||
--chart-2: 210 40% 98%;
|
--chart-2: 210 40% 98%;
|
||||||
--chart-3: 187 100% 42%;
|
--chart-3: 187 100% 42%;
|
||||||
--chart-4: 43 100% 50%;
|
--chart-4: 43 100% 50%;
|
||||||
--chart-5: 280 80% 50%;
|
--chart-5: 280 80% 50%;
|
||||||
|
|
||||||
|
--glow-1: 187 100% 50%; /* cyan */
|
||||||
|
--glow-2: 265 100% 68%; /* violet */
|
||||||
|
--glow-3: 14 100% 57%; /* orange (primary) */
|
||||||
|
|
||||||
--shadow-2xs: 0px 1px 2px 0px rgba(0,0,0,0.5);
|
--shadow-2xs: 0px 1px 2px 0px rgba(0,0,0,0.5);
|
||||||
--shadow-xs: 0px 1px 3px 0px rgba(0,0,0,0.5);
|
--shadow-xs: 0px 1px 3px 0px rgba(0,0,0,0.5);
|
||||||
--shadow-sm: 0px 2px 4px 0px rgba(0,0,0,0.5), 0px 1px 2px -1px rgba(0,0,0,0.5);
|
--shadow-sm: 0px 2px 4px 0px rgba(0,0,0,0.5), 0px 1px 2px -1px rgba(0,0,0,0.5);
|
||||||
@@ -372,4 +380,163 @@
|
|||||||
.border.hover-elevate:not(.no-hover-interaction-elevate)::after {
|
.border.hover-elevate:not(.no-hover-interaction-elevate)::after {
|
||||||
inset: -1px;
|
inset: -1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------ */
|
||||||
|
/* Neon / AI glow system
|
||||||
|
* Dezent: funktioniert in Light + Dark. Animationen respektieren
|
||||||
|
* prefers-reduced-motion.
|
||||||
|
* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
.neon-glow {
|
||||||
|
box-shadow:
|
||||||
|
0 0 0 1px hsl(var(--glow-1) / 0.35),
|
||||||
|
0 0 18px -2px hsl(var(--glow-1) / 0.45),
|
||||||
|
0 0 42px -8px hsl(var(--glow-2) / 0.35);
|
||||||
|
}
|
||||||
|
|
||||||
|
.neon-glow-primary {
|
||||||
|
box-shadow:
|
||||||
|
0 0 0 1px hsl(var(--primary) / 0.4),
|
||||||
|
0 0 16px -2px hsl(var(--primary) / 0.38),
|
||||||
|
0 0 34px -8px hsl(var(--primary) / 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solid neon fill for progress/rating bars — high contrast, cyan → violet */
|
||||||
|
.neon-bar {
|
||||||
|
background-image: linear-gradient(
|
||||||
|
100deg,
|
||||||
|
hsl(var(--glow-1) / 0.95) 0%,
|
||||||
|
hsl(var(--glow-2) / 0.95) 60%,
|
||||||
|
hsl(var(--glow-1) / 0.95) 100%
|
||||||
|
);
|
||||||
|
box-shadow:
|
||||||
|
0 0 8px 0 hsl(var(--glow-1) / 0.45),
|
||||||
|
0 0 18px -2px hsl(var(--glow-2) / 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Animated gradient background for loading states (Google-AI style flow) */
|
||||||
|
.loading-gradient {
|
||||||
|
background-image: linear-gradient(
|
||||||
|
100deg,
|
||||||
|
hsl(var(--glow-3) / 0.14) 0%,
|
||||||
|
hsl(var(--glow-2) / 0.22) 25%,
|
||||||
|
hsl(var(--glow-1) / 0.24) 50%,
|
||||||
|
hsl(var(--glow-2) / 0.22) 75%,
|
||||||
|
hsl(var(--glow-3) / 0.14) 100%
|
||||||
|
);
|
||||||
|
background-size: 300% 100%;
|
||||||
|
animation: neon-loading-sweep 7s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading-gradient-text {
|
||||||
|
background-image: linear-gradient(
|
||||||
|
100deg,
|
||||||
|
hsl(var(--glow-3)) 0%,
|
||||||
|
hsl(var(--glow-1)) 45%,
|
||||||
|
hsl(var(--glow-2)) 75%,
|
||||||
|
hsl(var(--glow-3)) 100%
|
||||||
|
);
|
||||||
|
background-size: 250% 100%;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
background-clip: text;
|
||||||
|
color: transparent;
|
||||||
|
animation: neon-loading-sweep 8s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.neon-pulse {
|
||||||
|
animation: neon-pulse 3.5s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.neon-spin {
|
||||||
|
animation: neon-rotate 1.4s linear infinite;
|
||||||
|
background: linear-gradient(
|
||||||
|
hsl(var(--glow-3)),
|
||||||
|
hsl(var(--glow-1)),
|
||||||
|
hsl(var(--glow-2)),
|
||||||
|
hsl(var(--glow-3))
|
||||||
|
);
|
||||||
|
animation: neon-rotate 1.4s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes neon-loading-sweep {
|
||||||
|
0% { background-position: 0% 50%; }
|
||||||
|
50% { background-position: 100% 50%; }
|
||||||
|
100% { background-position: 0% 50%; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes neon-pulse {
|
||||||
|
0%, 100% { opacity: 0.55; box-shadow: 0 0 6px -1px hsl(var(--glow-1) / 0.25); }
|
||||||
|
50% { opacity: 1; box-shadow: 0 0 16px 0 hsl(var(--glow-1) / 0.5); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes neon-rotate {
|
||||||
|
from { transform: rotate(0deg); }
|
||||||
|
to { transform: rotate(360deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Left neon indicator for the active sidebar item */
|
||||||
|
.neon-sidebar-active {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.neon-sidebar-active[data-active="true"]::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 20%;
|
||||||
|
bottom: 20%;
|
||||||
|
width: 3px;
|
||||||
|
border-radius: 9999px;
|
||||||
|
background-image: linear-gradient(
|
||||||
|
180deg,
|
||||||
|
hsl(var(--glow-1)),
|
||||||
|
hsl(var(--glow-2))
|
||||||
|
);
|
||||||
|
box-shadow: 0 0 10px 1px hsl(var(--glow-1) / 0.6);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.loading-gradient { animation: none; }
|
||||||
|
.loading-gradient-text { animation: none; }
|
||||||
|
.neon-pulse { animation: none; }
|
||||||
|
.neon-spin { animation: none; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------ */
|
||||||
|
/* LIGHT MODE — violet neon tuning
|
||||||
|
* Binds glow highlights so they read clearly on white/light surfaces
|
||||||
|
* instead of washing out to grey. Scoped to light only; dark untouched.
|
||||||
|
* ------------------------------------------------------------------ */
|
||||||
|
:root:not(.dark) .neon-glow {
|
||||||
|
box-shadow:
|
||||||
|
0 0 0 1px hsl(var(--glow-1) / 0.5),
|
||||||
|
0 0 22px -3px hsl(var(--glow-1) / 0.55),
|
||||||
|
0 0 52px -10px hsl(var(--glow-2) / 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
:root:not(.dark) .neon-glow-primary {
|
||||||
|
box-shadow:
|
||||||
|
0 0 0 1px hsl(var(--primary) / 0.55),
|
||||||
|
0 0 20px -2px hsl(var(--primary) / 0.5),
|
||||||
|
0 0 44px -10px hsl(var(--primary) / 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
:root:not(.dark) .neon-bar {
|
||||||
|
box-shadow:
|
||||||
|
0 0 10px 0 hsl(var(--glow-1) / 0.55),
|
||||||
|
0 0 22px -2px hsl(var(--glow-2) / 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pastel ambient wash behind the light page */
|
||||||
|
:root:not(.dark) body {
|
||||||
|
background-image:
|
||||||
|
radial-gradient(1200px 800px at 8% -6%, hsl(var(--glow-1) / 0.09), transparent 60%),
|
||||||
|
radial-gradient(1100px 700px at 100% 0%, hsl(var(--glow-2) / 0.08), transparent 55%),
|
||||||
|
radial-gradient(1000px 800px at 50% 110%, hsl(var(--glow-3) / 0.06), transparent 60%);
|
||||||
|
background-attachment: fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cards get a subtle violet-tinted border for more surface depth */
|
||||||
|
:root:not(.dark) .bg-card {
|
||||||
|
border-color: hsl(var(--glow-1) / 0.18);
|
||||||
}
|
}
|
||||||
@@ -361,7 +361,7 @@ export default function Admin() {
|
|||||||
<Dialog open={createOpen} onOpenChange={setCreateOpen}>
|
<Dialog open={createOpen} onOpenChange={setCreateOpen}>
|
||||||
<DialogContent className="sm:max-w-md">
|
<DialogContent className="sm:max-w-md">
|
||||||
<DialogHeader className="flex flex-row items-center justify-between gap-2">
|
<DialogHeader className="flex flex-row items-center justify-between gap-2">
|
||||||
<DialogTitle>{t("admin.createNewUser")}</DialogTitle>
|
<DialogTitle className="min-w-0 truncate">{t("admin.createNewUser")}</DialogTitle>
|
||||||
<GuideHelp guide="administration" label={t("admin.createNewUser")} />
|
<GuideHelp guide="administration" label={t("admin.createNewUser")} />
|
||||||
</DialogHeader>
|
</DialogHeader>
|
||||||
<div className="space-y-4 py-2">
|
<div className="space-y-4 py-2">
|
||||||
@@ -403,7 +403,7 @@ export default function Admin() {
|
|||||||
</Select>
|
</Select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<DialogFooter>
|
<DialogFooter className="flex-col-reverse sm:flex-row sm:flex-wrap sm:justify-end gap-2">
|
||||||
<Button variant="outline" onClick={() => setCreateOpen(false)}>{t("common.cancel")}</Button>
|
<Button variant="outline" onClick={() => setCreateOpen(false)}>{t("common.cancel")}</Button>
|
||||||
<Button onClick={handleCreateUser} disabled={createUser.isPending || !newUsername || !newPassword}>
|
<Button onClick={handleCreateUser} disabled={createUser.isPending || !newUsername || !newPassword}>
|
||||||
{createUser.isPending ? t("admin.creating") : t("admin.createUser")}
|
{createUser.isPending ? t("admin.creating") : t("admin.createUser")}
|
||||||
@@ -413,9 +413,9 @@ export default function Admin() {
|
|||||||
</Dialog>
|
</Dialog>
|
||||||
|
|
||||||
<Dialog open={!!editUser} onOpenChange={(open) => { if (!open) { setEditUser(null); setEditPassword(""); } }}>
|
<Dialog open={!!editUser} onOpenChange={(open) => { if (!open) { setEditUser(null); setEditPassword(""); } }}>
|
||||||
<DialogContent className="sm:max-w-sm">
|
<DialogContent className="sm:max-w-md">
|
||||||
<DialogHeader className="flex flex-row items-center justify-between gap-2">
|
<DialogHeader className="flex flex-row items-center justify-between gap-2">
|
||||||
<DialogTitle>{t("admin.editUser", { username: editUser?.username })}</DialogTitle>
|
<DialogTitle className="min-w-0 truncate">{t("admin.editUser", { username: editUser?.username })}</DialogTitle>
|
||||||
<GuideHelp guide="administration" label={t("admin.editUser", { username: editUser?.username })} />
|
<GuideHelp guide="administration" label={t("admin.editUser", { username: editUser?.username })} />
|
||||||
</DialogHeader>
|
</DialogHeader>
|
||||||
<div className="space-y-4 py-2">
|
<div className="space-y-4 py-2">
|
||||||
@@ -467,7 +467,7 @@ export default function Admin() {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<DialogFooter className="flex-col sm:flex-row sm:justify-end gap-2">
|
<DialogFooter className="flex-col-reverse sm:flex-row sm:flex-wrap sm:justify-end gap-2">
|
||||||
<Button variant="outline" onClick={() => { setEditUser(null); setEditPassword(""); }}>{t("common.cancel")}</Button>
|
<Button variant="outline" onClick={() => { setEditUser(null); setEditPassword(""); }}>{t("common.cancel")}</Button>
|
||||||
<Button
|
<Button
|
||||||
onClick={handleUpdateUser}
|
onClick={handleUpdateUser}
|
||||||
@@ -498,7 +498,7 @@ export default function Admin() {
|
|||||||
</p>
|
</p>
|
||||||
<DialogFooter>
|
<DialogFooter>
|
||||||
<Button variant="outline" onClick={() => setDeleteConfirm(null)}>{t("common.cancel")}</Button>
|
<Button variant="outline" onClick={() => setDeleteConfirm(null)}>{t("common.cancel")}</Button>
|
||||||
<Button variant="destructive" onClick={handleDeleteUser} disabled={deleteUser.isPending}>
|
<Button variant="outline" className="text-destructive hover:bg-destructive hover:text-destructive-foreground" onClick={handleDeleteUser} disabled={deleteUser.isPending}>
|
||||||
{deleteUser.isPending ? t("detail.deleting") : t("common.delete")}
|
{deleteUser.isPending ? t("detail.deleting") : t("common.delete")}
|
||||||
</Button>
|
</Button>
|
||||||
</DialogFooter>
|
</DialogFooter>
|
||||||
|
|||||||
@@ -127,9 +127,15 @@ export default function Analytics() {
|
|||||||
<YAxis domain={[0, 5]} tickLine={false} axisLine={false} tickFormatter={(v) => `${v}`} tick={{ fill: 'hsl(var(--foreground))', fontSize: 12 }} />
|
<YAxis domain={[0, 5]} tickLine={false} axisLine={false} tickFormatter={(v) => `${v}`} tick={{ fill: 'hsl(var(--foreground))', fontSize: 12 }} />
|
||||||
<RechartsTooltip
|
<RechartsTooltip
|
||||||
cursor={{ fill: 'hsl(var(--muted))' }}
|
cursor={{ fill: 'hsl(var(--muted))' }}
|
||||||
contentStyle={{ borderRadius: '8px', border: '1px solid hsl(var(--border))' }}
|
contentStyle={{ backgroundColor: 'hsl(var(--popover))', borderRadius: '8px', border: '1px solid hsl(var(--border))', color: 'hsl(var(--foreground))' }}
|
||||||
/>
|
/>
|
||||||
<Bar dataKey="score" fill="hsl(var(--primary))" radius={[4, 4, 0, 0]} maxBarSize={50} />
|
<defs>
|
||||||
|
<linearGradient id="neonBarFillA" x1="0" y1="0" x2="1" y2="0">
|
||||||
|
<stop offset="0%" stopColor="hsl(var(--glow-1))" />
|
||||||
|
<stop offset="100%" stopColor="hsl(var(--glow-2))" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<Bar dataKey="score" fill="url(#neonBarFillA)" radius={[4, 4, 0, 0]} maxBarSize={50} />
|
||||||
</BarChart>
|
</BarChart>
|
||||||
</ResponsiveContainer>
|
</ResponsiveContainer>
|
||||||
</div>
|
</div>
|
||||||
@@ -154,7 +160,7 @@ export default function Analytics() {
|
|||||||
<PolarAngleAxis dataKey="category" tick={{ fill: 'hsl(var(--foreground))', fontSize: 12 }} />
|
<PolarAngleAxis dataKey="category" tick={{ fill: 'hsl(var(--foreground))', fontSize: 12 }} />
|
||||||
<PolarRadiusAxis angle={30} domain={[0, 'auto']} tick={false} axisLine={false} />
|
<PolarRadiusAxis angle={30} domain={[0, 'auto']} tick={false} axisLine={false} />
|
||||||
<Radar name={t("analytics.radarTools")} dataKey="tools" stroke="hsl(var(--primary))" fill="hsl(var(--primary))" fillOpacity={0.3} />
|
<Radar name={t("analytics.radarTools")} dataKey="tools" stroke="hsl(var(--primary))" fill="hsl(var(--primary))" fillOpacity={0.3} />
|
||||||
<RechartsTooltip />
|
<RechartsTooltip contentStyle={{ backgroundColor: 'hsl(var(--popover))', borderRadius: '8px', border: '1px solid hsl(var(--border))', color: 'hsl(var(--foreground))' }} />
|
||||||
</RadarChart>
|
</RadarChart>
|
||||||
</ResponsiveContainer>
|
</ResponsiveContainer>
|
||||||
</div>
|
</div>
|
||||||
@@ -181,8 +187,14 @@ export default function Analytics() {
|
|||||||
<CartesianGrid strokeDasharray="3 3" vertical={false} stroke="hsl(var(--border))" />
|
<CartesianGrid strokeDasharray="3 3" vertical={false} stroke="hsl(var(--border))" />
|
||||||
<XAxis dataKey="score" tickLine={false} axisLine={false} tick={{ fill: 'hsl(var(--foreground))', fontSize: 12 }} />
|
<XAxis dataKey="score" tickLine={false} axisLine={false} tick={{ fill: 'hsl(var(--foreground))', fontSize: 12 }} />
|
||||||
<YAxis hide />
|
<YAxis hide />
|
||||||
<RechartsTooltip cursor={{ fill: 'hsl(var(--muted))' }} contentStyle={{ borderRadius: '6px', border: '1px solid hsl(var(--border))' }} />
|
<RechartsTooltip cursor={{ fill: 'hsl(var(--muted))' }} contentStyle={{ backgroundColor: 'hsl(var(--popover))', borderRadius: '6px', border: '1px solid hsl(var(--border))', color: 'hsl(var(--foreground))' }} />
|
||||||
<Bar dataKey="count" fill="hsl(var(--primary))" radius={[4, 4, 0, 0]} maxBarSize={40} />
|
<defs>
|
||||||
|
<linearGradient id="neonBarFillB" x1="0" y1="0" x2="1" y2="0">
|
||||||
|
<stop offset="0%" stopColor="hsl(var(--glow-1))" />
|
||||||
|
<stop offset="100%" stopColor="hsl(var(--glow-2))" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<Bar dataKey="count" fill="url(#neonBarFillB)" radius={[4, 4, 0, 0]} maxBarSize={40} />
|
||||||
</BarChart>
|
</BarChart>
|
||||||
</ResponsiveContainer>
|
</ResponsiveContainer>
|
||||||
</div>
|
</div>
|
||||||
@@ -195,8 +207,14 @@ export default function Analytics() {
|
|||||||
<CartesianGrid strokeDasharray="3 3" vertical={false} stroke="hsl(var(--border))" />
|
<CartesianGrid strokeDasharray="3 3" vertical={false} stroke="hsl(var(--border))" />
|
||||||
<XAxis dataKey="score" tickLine={false} axisLine={false} tick={{ fill: 'hsl(var(--foreground))', fontSize: 12 }} />
|
<XAxis dataKey="score" tickLine={false} axisLine={false} tick={{ fill: 'hsl(var(--foreground))', fontSize: 12 }} />
|
||||||
<YAxis hide />
|
<YAxis hide />
|
||||||
<RechartsTooltip cursor={{ fill: 'hsl(var(--muted))' }} contentStyle={{ borderRadius: '6px', border: '1px solid hsl(var(--border))' }} />
|
<RechartsTooltip cursor={{ fill: 'hsl(var(--muted))' }} contentStyle={{ backgroundColor: 'hsl(var(--popover))', borderRadius: '6px', border: '1px solid hsl(var(--border))', color: 'hsl(var(--foreground))' }} />
|
||||||
<Bar dataKey="count" fill="hsl(var(--chart-3))" radius={[4, 4, 0, 0]} maxBarSize={40} />
|
<defs>
|
||||||
|
<linearGradient id="neonBarFillC" x1="0" y1="0" x2="1" y2="0">
|
||||||
|
<stop offset="0%" stopColor="hsl(var(--glow-1))" />
|
||||||
|
<stop offset="100%" stopColor="hsl(var(--glow-2))" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<Bar dataKey="count" fill="url(#neonBarFillC)" radius={[4, 4, 0, 0]} maxBarSize={40} />
|
||||||
</BarChart>
|
</BarChart>
|
||||||
</ResponsiveContainer>
|
</ResponsiveContainer>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ export default function Home() {
|
|||||||
|
|
||||||
{/* Stats Banner */}
|
{/* Stats Banner */}
|
||||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
||||||
<Card className="bg-primary/5 border-primary/20">
|
<Card className="neon-glow-primary bg-primary/5 border-primary/20">
|
||||||
<CardContent className="p-6 flex items-center gap-4">
|
<CardContent className="p-6 flex items-center gap-4">
|
||||||
<div className="p-3 bg-primary/10 rounded-lg text-primary">
|
<div className="p-3 bg-primary/10 rounded-lg text-primary">
|
||||||
<Wrench className="w-6 h-6" />
|
<Wrench className="w-6 h-6" />
|
||||||
@@ -55,7 +55,7 @@ export default function Home() {
|
|||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<Card className="bg-primary/5 border-primary/20">
|
<Card className="neon-glow-primary bg-primary/5 border-primary/20">
|
||||||
<CardContent className="p-6 flex items-center gap-4">
|
<CardContent className="p-6 flex items-center gap-4">
|
||||||
<div className="p-3 bg-primary/10 rounded-lg text-primary">
|
<div className="p-3 bg-primary/10 rounded-lg text-primary">
|
||||||
<MessageSquare className="w-6 h-6" />
|
<MessageSquare className="w-6 h-6" />
|
||||||
@@ -71,7 +71,7 @@ export default function Home() {
|
|||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<Card className="bg-primary/5 border-primary/20">
|
<Card className="neon-glow-primary bg-primary/5 border-primary/20">
|
||||||
<CardContent className="p-6 flex items-center gap-4">
|
<CardContent className="p-6 flex items-center gap-4">
|
||||||
<div className="p-3 bg-primary/10 rounded-lg text-primary">
|
<div className="p-3 bg-primary/10 rounded-lg text-primary">
|
||||||
<Star className="w-6 h-6" />
|
<Star className="w-6 h-6" />
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ export default function Login() {
|
|||||||
<p className="text-muted-foreground text-sm">{t("auth.loginSubtitle")}</p>
|
<p className="text-muted-foreground text-sm">{t("auth.loginSubtitle")}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Card>
|
<Card className="neon-glow">
|
||||||
<CardHeader className="pb-4">
|
<CardHeader className="pb-4">
|
||||||
<CardTitle className="text-lg">{t("auth.signIn")}</CardTitle>
|
<CardTitle className="text-lg">{t("auth.signIn")}</CardTitle>
|
||||||
<CardDescription>{t("auth.loginDescription")}</CardDescription>
|
<CardDescription>{t("auth.loginDescription")}</CardDescription>
|
||||||
|
|||||||
@@ -717,8 +717,14 @@ export default function ToolDetail() {
|
|||||||
<BarChart data={usefulnessData} layout="vertical" margin={{ top: 0, right: 0, bottom: 0, left: -20 }}>
|
<BarChart data={usefulnessData} layout="vertical" margin={{ top: 0, right: 0, bottom: 0, left: -20 }}>
|
||||||
<XAxis type="number" hide />
|
<XAxis type="number" hide />
|
||||||
<YAxis dataKey="score" type="category" axisLine={false} tickLine={false} tickFormatter={(val) => `${val} ★`} tick={{ fill: 'hsl(var(--foreground))', fontSize: 12 }} />
|
<YAxis dataKey="score" type="category" axisLine={false} tickLine={false} tickFormatter={(val) => `${val} ★`} tick={{ fill: 'hsl(var(--foreground))', fontSize: 12 }} />
|
||||||
<Tooltip cursor={{ fill: 'transparent' }} />
|
<Tooltip cursor={{ fill: 'transparent' }} contentStyle={{ backgroundColor: 'hsl(var(--popover))', border: '1px solid hsl(var(--border))', borderRadius: '8px', color: 'hsl(var(--foreground))' }} />
|
||||||
<Bar dataKey="count" fill="hsl(var(--primary))" radius={[0, 4, 4, 0]} barSize={12} />
|
<defs>
|
||||||
|
<linearGradient id="neonBarFill" x1="0" y1="0" x2="1" y2="0">
|
||||||
|
<stop offset="0%" stopColor="hsl(var(--glow-1))" />
|
||||||
|
<stop offset="100%" stopColor="hsl(var(--glow-2))" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<Bar dataKey="count" fill="url(#neonBarFill)" radius={[0, 4, 4, 0]} barSize={12} />
|
||||||
</BarChart>
|
</BarChart>
|
||||||
</ResponsiveContainer>
|
</ResponsiveContainer>
|
||||||
</div>
|
</div>
|
||||||
@@ -740,7 +746,7 @@ export default function ToolDetail() {
|
|||||||
<CartesianGrid strokeDasharray="3 3" opacity={0.2} />
|
<CartesianGrid strokeDasharray="3 3" opacity={0.2} />
|
||||||
<XAxis dataKey="date" hide />
|
<XAxis dataKey="date" hide />
|
||||||
<YAxis domain={[0, 5]} tick={{ fill: 'hsl(var(--foreground))', fontSize: 12 }} axisLine={false} tickLine={false} />
|
<YAxis domain={[0, 5]} tick={{ fill: 'hsl(var(--foreground))', fontSize: 12 }} axisLine={false} tickLine={false} />
|
||||||
<Tooltip labelFormatter={(_, payload) => (payload?.[0] ? format(new Date(payload[0].payload.date), "dd.MM.yyyy HH:mm") : "")} />
|
<Tooltip labelFormatter={(_, payload) => (payload?.[0] ? format(new Date(payload[0].payload.date), "dd.MM.yyyy HH:mm") : "")} contentStyle={{ backgroundColor: 'hsl(var(--popover))', border: '1px solid hsl(var(--border))', borderRadius: '8px', color: 'hsl(var(--foreground))' }} />
|
||||||
<Legend wrapperStyle={{ fontSize: 12 }} />
|
<Legend wrapperStyle={{ fontSize: 12 }} />
|
||||||
<Line type="monotone" dataKey="combined" name={t("detail.score")} stroke="hsl(var(--primary))" strokeWidth={2} dot={false} />
|
<Line type="monotone" dataKey="combined" name={t("detail.score")} stroke="hsl(var(--primary))" strokeWidth={2} dot={false} />
|
||||||
<Line type="monotone" dataKey="usefulness" name={t("detail.usefulness")} stroke="hsl(var(--success))" strokeWidth={1.5} dot={false} strokeDasharray="4 3" />
|
<Line type="monotone" dataKey="usefulness" name={t("detail.usefulness")} stroke="hsl(var(--success))" strokeWidth={1.5} dot={false} strokeDasharray="4 3" />
|
||||||
|
|||||||
@@ -192,7 +192,8 @@ export default function Trash() {
|
|||||||
<>
|
<>
|
||||||
<Button
|
<Button
|
||||||
size="sm"
|
size="sm"
|
||||||
variant="destructive"
|
variant="outline"
|
||||||
|
className="text-destructive hover:bg-destructive hover:text-destructive-foreground"
|
||||||
disabled={selectedIds.length === 0 || deletePermanent.isPending}
|
disabled={selectedIds.length === 0 || deletePermanent.isPending}
|
||||||
onClick={() => setConfirmDelete(true)}
|
onClick={() => setConfirmDelete(true)}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# v0.9.3 — Release Notes
|
||||||
|
|
||||||
|
**Datum:** 2026-08-06 · **Tag:** [`v0.9.3`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.3)
|
||||||
|
|
||||||
|
## Design: Neon / AI-Look
|
||||||
|
|
||||||
|
Dieses Release modernisiert das Erscheinungsbild in Richtung eines
|
||||||
|
„AI-Interfaces" mit dezenten **Neon-Effekten** — inspiriert von Google AI.
|
||||||
|
|
||||||
|
- **Leuchtende Ränder & Glow:** Primäre Buttons, Fokusringe von Eingabefeldern
|
||||||
|
und Hover-Zustände von Tool-Karten erhalten einen sanften farbigen Schein
|
||||||
|
(Cyan → Violett → Orange). Funktioniert im Light- **und** im Dark-Mode.
|
||||||
|
- **Animierte Ladezustände:** Skeletons, Fortschrittsbalken und Spinner nutzen
|
||||||
|
nun einen fließenden Farbverlauf statt statischem Grau — wie die
|
||||||
|
Ladeanimationen moderner AI-Anwendungen.
|
||||||
|
- **Hervorgehobene Elemente:** Die Statistik-Karten auf der Startseite, der
|
||||||
|
Vergleichs-Leiste (Compare-Bar) und das Anmeldeformular leuchten dezent und
|
||||||
|
lenken den Blick.
|
||||||
|
- **Barrierefreiheit:** Alle Animationen respektieren
|
||||||
|
`prefers-reduced-motion` und werden für Nutzer:innen mit reduzierter
|
||||||
|
Bewegung deaktiviert.
|
||||||
|
|
||||||
|
## API-Änderungen
|
||||||
|
|
||||||
|
- Keine.
|
||||||
|
|
||||||
|
## Betrieb / Upgrade
|
||||||
|
|
||||||
|
- **Migration:** keine. **Breaking Changes:** keine.
|
||||||
|
- **Hinweis:** Nur visuelle / CSS-Änderungen, keine funktionalen.
|
||||||
|
|
||||||
|
## Bekannte Einschränkungen
|
||||||
|
|
||||||
|
- Keine im Rahmen dieses Releases.
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
- Commit: [`0198296`](https://git.kubebase.de/admin/tool-evaluator/commit/0198296)
|
||||||
|
- Tag: [`v0.9.3`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.3)
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# v0.9.3 — Release Notes
|
||||||
|
|
||||||
|
**Date:** 2026-08-06 · **Tag:** [`v0.9.3`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.3)
|
||||||
|
|
||||||
|
## Design: Neon / AI Look
|
||||||
|
|
||||||
|
This release modernizes the look and feel towards an "AI interface" with
|
||||||
|
subtle **neon effects** — inspired by Google AI.
|
||||||
|
|
||||||
|
- **Glowing borders & glow:** Primary buttons, focus rings on input fields and
|
||||||
|
hover states of tool cards now receive a soft colored glow (cyan → violet →
|
||||||
|
orange). Works in both light and dark mode.
|
||||||
|
- **Animated loading states:** Skeletons, progress bars and spinners now use a
|
||||||
|
flowing gradient instead of static gray — like the loading animations of
|
||||||
|
modern AI applications.
|
||||||
|
- **Highlighted elements:** The stat cards on the home page, the compare bar
|
||||||
|
and the login form glow subtly and draw the eye.
|
||||||
|
- **Accessibility:** All animations respect `prefers-reduced-motion` and are
|
||||||
|
disabled for users with reduced motion.
|
||||||
|
|
||||||
|
## API Changes
|
||||||
|
|
||||||
|
- None.
|
||||||
|
|
||||||
|
## Operations / Upgrade
|
||||||
|
|
||||||
|
- **Migration:** none. **Breaking changes:** none.
|
||||||
|
- **Note:** Visual / CSS-only changes, no functional changes.
|
||||||
|
|
||||||
|
## Known limitations
|
||||||
|
|
||||||
|
- None within the scope of this release.
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
- Commit: [`0198296`](https://git.kubebase.de/admin/tool-evaluator/commit/0198296)
|
||||||
|
- Tag: [`v0.9.3`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.3)
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
|
||||||
|
# Administration
|
||||||
|
|
||||||
|
Der Bereich **Admin** (`/admin`) ist ausschließlich für Admins zugänglich.
|
||||||
|
Ohne Admin-Rolle erscheint eine Zugriffsverweigerung.
|
||||||
|
|
||||||
|
> Oben rechts führt die Schaltfläche **Redundanz-Dashboard** zur automatischen
|
||||||
|
> Doppelungs-Erkennung (siehe [Redundanz](/docs/handbook/redundanz)).
|
||||||
|
|
||||||
|
## Tab „Nutzer"
|
||||||
|
|
||||||
|
Verwaltung der lokalen Konten.
|
||||||
|
|
||||||
|
- **Nutzer hinzufügen:** Benutzername (Pflicht), Passwort (mind. 6 Zeichen),
|
||||||
|
E-Mail (optional), **Rolle** (User/Admin), **Tarif** (Free/Premium/Enterprise).
|
||||||
|
- **Nutzer bearbeiten:** Rolle, Tarif und (für lokale Konten) ein neues Passwort
|
||||||
|
setzen. Für OIDC-Konten wird die Passwortverwaltung im Identitätsanbieter
|
||||||
|
(z. B. Keycloak) angeboten.
|
||||||
|
- **Nutzer löschen:** Entfernt das Konto endgültig (nicht für das eigene Konto).
|
||||||
|
|
||||||
|
API-Referenz:
|
||||||
|
[`POST /users`](/docs/reference/endpoints/users#createUser),
|
||||||
|
[`PATCH /users/{id}`](/docs/reference/endpoints/users#updateUser),
|
||||||
|
[`DELETE /users/{id}`](/docs/reference/endpoints/users#deleteUser).
|
||||||
|
|
||||||
|
## Tab „Tools"
|
||||||
|
|
||||||
|
Zentraler Zugriff auf den Tool-Katalog.
|
||||||
|
|
||||||
|
- **Suchen** nach Tools.
|
||||||
|
- Tools einzeln ansehen, bearbeiten oder in den Papierkorb verschieben.
|
||||||
|
- **Massenaktion:** mehrere Tools auswählen und in den Papierkorb verschieben
|
||||||
|
(Bestätigungsdialog; soft gelöschte Tools sind aus allen öffentlichen Ansichten
|
||||||
|
entfernt und können wiederhergestellt oder endgültig gelöscht werden).
|
||||||
|
- **Importieren** (Premium): über die Schaltfläche **Importieren** oben rechts
|
||||||
|
können mehrere Tools gleichzeitig angelegt werden. Das Format wird automatisch
|
||||||
|
erkannt (CSV, JSON oder YAML); für CSV lässt sich der Trenner wählen
|
||||||
|
(automatisch, Komma, Semikolon oder Tabulator). Die Daten lassen sich direkt
|
||||||
|
ins Formular einfügen oder als Datei hochladen.
|
||||||
|
|
||||||
|
Unterstützte Felder: `name` (Pflicht), `description`, `category`, `websiteUrl`,
|
||||||
|
`iconUrl`, `features`, `tags` (`features`/`tags` sind mit `|` getrennte Listen).
|
||||||
|
|
||||||
|
**CSV-Beispiel:**
|
||||||
|
|
||||||
|
```csv
|
||||||
|
name;description;category;features;tags
|
||||||
|
Grafana;Observability- und Dashboard-Plattform;Monitoring;Dashboards|Alerts;devops
|
||||||
|
Prometheus;Zeitreihen-Datenbank;Monitoring;Metrics;devops
|
||||||
|
```
|
||||||
|
|
||||||
|
**JSON-Beispiel:**
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{ "name": "Grafana", "category": "Monitoring", "features": ["Dashboards"] },
|
||||||
|
{ "name": "Prometheus", "category": "Monitoring" }
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**YAML-Beispiel:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- name: Grafana
|
||||||
|
category: Monitoring
|
||||||
|
features:
|
||||||
|
- Dashboards
|
||||||
|
- name: Prometheus
|
||||||
|
category: Monitoring
|
||||||
|
```
|
||||||
|
|
||||||
|
Eine umfangreichere, fertig importierbare Beispieldatei liegt unter
|
||||||
|
`docs/examples/import-tools.yaml` (24 gängige Enterprise-Tools).
|
||||||
|
|
||||||
|
Beim Import werden einzelne fehlerhafte Zeilen übersprungen und mit Zeilennummer
|
||||||
|
aufgelistet; korrekte Zeilen werden trotzdem angelegt. Jeder Import erzeugt
|
||||||
|
Audit-Log-Einträge.
|
||||||
|
|
||||||
|
## Tab „Audit-Log"
|
||||||
|
|
||||||
|
Chronologisches Protokoll aller Anlage-, Änderungs- und Löschvorgänge
|
||||||
|
(max. 100 Einträge): Aktion, Entität + ID, Zeitstempel, ausführende Person und
|
||||||
|
geänderte Felder.
|
||||||
|
|
||||||
|
API-Referenz: [`GET /audit-logs`](/docs/reference/endpoints/audit#listAuditLogs).
|
||||||
|
|
||||||
|
## Tab „System"
|
||||||
|
|
||||||
|
Versionsinformationen der laufenden Instanz:
|
||||||
|
|
||||||
|
- **Version** (z. B. `v0.8.1`),
|
||||||
|
- **Commit** (7-stelliger SHA, verlinkt zum Repository),
|
||||||
|
- **Build-Datum**,
|
||||||
|
- **Papierkorb-Aufbewahrung** („N Tage" oder „Für immer").
|
||||||
|
|
||||||
|
## Tool-Verknüpfungen (Admin)
|
||||||
|
|
||||||
|
Auf der Detailseite eines Tools kannst du als Admin **Verknüpfungen**
|
||||||
|
(eigene/„manual" sowie automatisch erkannte) verwalten:
|
||||||
|
|
||||||
|
- **Tool verknüpfen:** Dialog mit Tool-ID, **Beziehungstyp**
|
||||||
|
(Ähnlich / Ersetzt / Abgelöst durch) und optionalen Notizen.
|
||||||
|
- Beziehungstypen werden als Badges auf der Detailseite angezeigt.
|
||||||
|
- Manuelle Verknüpfungen lassen sich per Papierkorb-Icon wieder entfernen.
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
|
||||||
|
# Administration
|
||||||
|
|
||||||
|
The **Admin** area (`/admin`) is exclusively accessible to admins.
|
||||||
|
Without the admin role, access is denied.
|
||||||
|
|
||||||
|
> At the top right, the **Redundancy dashboard** button leads to the automatic
|
||||||
|
> duplicate detection (see [Redundancy](/docs/handbook/redundanz)).
|
||||||
|
|
||||||
|
## "Users" tab
|
||||||
|
|
||||||
|
Management of local accounts.
|
||||||
|
|
||||||
|
- **Add user:** username (required), password (at least 6 characters),
|
||||||
|
email (optional), **role** (User/Admin), **plan** (Free/Premium/Enterprise).
|
||||||
|
- **Edit user:** set role, plan and (for local accounts) a new password.
|
||||||
|
For OIDC accounts, password management is offered in the identity provider
|
||||||
|
(e.g. Keycloak).
|
||||||
|
- **Delete user:** permanently removes the account (not for your own account).
|
||||||
|
|
||||||
|
API reference:
|
||||||
|
[`POST /users`](/docs/reference/endpoints/users#createUser),
|
||||||
|
[`PATCH /users/{id}`](/docs/reference/endpoints/users#updateUser),
|
||||||
|
[`DELETE /users/{id}`](/docs/reference/endpoints/users#deleteUser).
|
||||||
|
|
||||||
|
## "Tools" tab
|
||||||
|
|
||||||
|
Central access to the tool catalog.
|
||||||
|
|
||||||
|
- **Search** for tools.
|
||||||
|
- View, edit or move individual tools to the trash.
|
||||||
|
- **Bulk action:** select multiple tools and move them to the trash
|
||||||
|
(confirmation dialog; soft-deleted tools are removed from all public views
|
||||||
|
and can be restored or permanently deleted).
|
||||||
|
- **Import** (premium): via the **Import** button at the top right, multiple
|
||||||
|
tools can be created at once. The format is detected automatically (CSV,
|
||||||
|
JSON or YAML); for CSV the delimiter can be chosen (auto-detect, comma,
|
||||||
|
semicolon or tab). Data can be pasted directly into the form or uploaded
|
||||||
|
as a file.
|
||||||
|
|
||||||
|
Supported fields: `name` (required), `description`, `category`, `websiteUrl`,
|
||||||
|
`iconUrl`, `features`, `tags` (`features`/`tags` are `|`-separated lists).
|
||||||
|
|
||||||
|
**CSV example:**
|
||||||
|
|
||||||
|
```csv
|
||||||
|
name;description;category;features;tags
|
||||||
|
Grafana;Observability and dashboard platform;Monitoring;Dashboards|Alerts;devops
|
||||||
|
Prometheus;Time-series database;Monitoring;Metrics;devops
|
||||||
|
```
|
||||||
|
|
||||||
|
**JSON example:**
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{ "name": "Grafana", "category": "Monitoring", "features": ["Dashboards"] },
|
||||||
|
{ "name": "Prometheus", "category": "Monitoring" }
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**YAML example:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- name: Grafana
|
||||||
|
category: Monitoring
|
||||||
|
features:
|
||||||
|
- Dashboards
|
||||||
|
- name: Prometheus
|
||||||
|
category: Monitoring
|
||||||
|
```
|
||||||
|
|
||||||
|
A larger, ready-to-import example file is located at
|
||||||
|
`docs/examples/import-tools.yaml` (24 common enterprise tools).
|
||||||
|
|
||||||
|
During import, individual faulty rows are skipped and listed with their row
|
||||||
|
number; correct rows are still created. Every import produces audit-log
|
||||||
|
entries.
|
||||||
|
|
||||||
|
## "Audit log" tab
|
||||||
|
|
||||||
|
Chronological log of all creation, change and deletion operations
|
||||||
|
(max. 100 entries): action, entity + ID, timestamp, executing person and
|
||||||
|
changed fields.
|
||||||
|
|
||||||
|
API reference: [`GET /audit-logs`](/docs/reference/endpoints/audit#listAuditLogs).
|
||||||
|
|
||||||
|
## "System" tab
|
||||||
|
|
||||||
|
Version information of the running instance:
|
||||||
|
|
||||||
|
- **Version** (e.g. `v0.8.1`),
|
||||||
|
- **Commit** (7-digit SHA, linked to the repository),
|
||||||
|
- **Build date**,
|
||||||
|
- **Trash retention** ("N days" or "Forever").
|
||||||
|
|
||||||
|
## Tool links (Admin)
|
||||||
|
|
||||||
|
On the detail page of a tool you can manage **links** as an admin
|
||||||
|
(own/"manual" as well as automatically detected ones):
|
||||||
|
|
||||||
|
- **Link tool:** dialog with tool ID, **relationship type**
|
||||||
|
(Similar / Replaces / Superseded by) and optional notes.
|
||||||
|
- Relationship types are displayed as badges on the detail page.
|
||||||
|
- Manual links can be removed again via the trash icon.
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
# Analytics
|
||||||
|
|
||||||
|
Der Bereich **Analytics** (`/analytics`) ist ein öffentliches Dashboard mit
|
||||||
|
Kennzahlen und Diagrammen auf Basis aller Tools und Bewertungen.
|
||||||
|
|
||||||
|
## Kennzahlen (KPI-Karten)
|
||||||
|
|
||||||
|
- **Anzahl Tools** — wie viele Tools sind im Katalog erfasst.
|
||||||
|
- **Anzahl Bewertungen** — wie viele Bewertungen wurden insgesamt abgegeben.
|
||||||
|
- **Aktive Kategorien** — wie viele Kategorien existieren.
|
||||||
|
- **Durchschnittliche Bewertung** — globaler kombinierter Wert.
|
||||||
|
|
||||||
|
## Diagramme
|
||||||
|
|
||||||
|
| Diagramm | Inhalt |
|
||||||
|
| --- | --- |
|
||||||
|
| **Top 8 Tools** | Balkendiagramm der Tools mit der höchsten kombinierten Punktzahl (0–5) |
|
||||||
|
| **Tools je Kategorie** | Radar-Diagramm der Tool-Anzahl pro Kategorie |
|
||||||
|
| **Punkteverteilung** | Zwei horizontale Balken-Diagramme (Nützlichkeit & Bedienbarkeit) pro Stern |
|
||||||
|
|
||||||
|
Die Diagramme sind interaktiv (Tooltips beim Überfahren).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`GET /analytics/summary`](/docs/reference/endpoints/analytics#getAnalyticsSummary)
|
||||||
|
- [`GET /analytics/top-tools`](/docs/reference/endpoints/analytics#getTopTools)
|
||||||
|
- [`GET /analytics/by-category`](/docs/reference/endpoints/analytics#getAnalyticsByCategory)
|
||||||
|
- [`GET /analytics/rating-distribution`](/docs/reference/endpoints/analytics#getRatingDistribution)
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
# Analytics
|
||||||
|
|
||||||
|
The **Analytics** area (`/analytics`) is a public dashboard with
|
||||||
|
metrics and charts based on all tools and ratings.
|
||||||
|
|
||||||
|
## Metrics (KPI cards)
|
||||||
|
|
||||||
|
- **Number of tools** — how many tools are recorded in the catalog.
|
||||||
|
- **Number of ratings** — how many ratings were submitted in total.
|
||||||
|
- **Active categories** — how many categories exist.
|
||||||
|
- **Average rating** — global combined value.
|
||||||
|
|
||||||
|
## Charts
|
||||||
|
|
||||||
|
| Chart | Content |
|
||||||
|
| --- | --- |
|
||||||
|
| **Top 8 tools** | Bar chart of the tools with the highest combined score (0–5) |
|
||||||
|
| **Tools per category** | Radar chart of the number of tools per category |
|
||||||
|
| **Score distribution** | Two horizontal bar charts (usefulness & usability) per star |
|
||||||
|
|
||||||
|
The charts are interactive (tooltips on hover).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`GET /analytics/summary`](/docs/reference/endpoints/analytics#getAnalyticsSummary)
|
||||||
|
- [`GET /analytics/top-tools`](/docs/reference/endpoints/analytics#getTopTools)
|
||||||
|
- [`GET /analytics/by-category`](/docs/reference/endpoints/analytics#getAnalyticsByCategory)
|
||||||
|
- [`GET /analytics/rating-distribution`](/docs/reference/endpoints/analytics#getRatingDistribution)
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
# Bewerten
|
||||||
|
|
||||||
|
Auf der Detailseite eines Tools kannst du deine Erfahrung teilen. Klicke auf
|
||||||
|
**Bewertung abgeben** (erfordert ein Konto).
|
||||||
|
|
||||||
|
## Formularfelder
|
||||||
|
|
||||||
|
| Feld | Pflicht | Hinweise |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **Nützlichkeit** | Ja | 1–5 Sterne |
|
||||||
|
| **Bedienbarkeit** | Ja | 1–5 Sterne |
|
||||||
|
| **Kommentar** | Nein | Freitext |
|
||||||
|
| **Name** | Nein | Standard „Anonym" |
|
||||||
|
|
||||||
|
Neben den Feldern führt das **?‑Icon** direkt zur zugehörigen Feldbeschreibung
|
||||||
|
in der [Datenmodell-Referenz](/docs/reference/schemas/ratinginput).
|
||||||
|
|
||||||
|
## Was passiert nach dem Abgeben?
|
||||||
|
|
||||||
|
- Deine Bewertung wird sofort gespeichert und erscheint in der
|
||||||
|
**Bewertungsliste** der Detailseite.
|
||||||
|
- Die **Durchschnittswerte** (Nützlichkeit, Bedienbarkeit, Kombiniert) und die
|
||||||
|
**Punkteverteilung** werden aktualisiert.
|
||||||
|
- Die **Statistiken** im Bereich [Analytics](/docs/handbook/analytics) werden
|
||||||
|
neu berechnet.
|
||||||
|
|
||||||
|
## Statistik-Bereiche auf der Detailseite
|
||||||
|
|
||||||
|
- **Bewertungsübersicht:** Nützlichkeit & Bedienbarkeit als Durchschnitt mit
|
||||||
|
Fortschrittsbalken.
|
||||||
|
- **Punkteverteilung:** Anzahl der Bewertungen pro Stern (1★–5★).
|
||||||
|
- **Verlauf:** Linienchart der kombinierten/Teilwerte über die Zeit
|
||||||
|
(erst ab mehreren Bewertungen sichtbar).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`POST /tools/{id}/ratings`](/docs/reference/endpoints/ratings#createRating) — Bewertung abgeben
|
||||||
|
- [`GET /tools/{id}/ratings`](/docs/reference/endpoints/ratings#listToolRatings) — Bewertungen eines Tools
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
# Rating
|
||||||
|
|
||||||
|
On the detail page of a tool you can share your experience. Click on
|
||||||
|
**Submit a rating** (requires an account).
|
||||||
|
|
||||||
|
## Form fields
|
||||||
|
|
||||||
|
| Field | Required | Notes |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **Usefulness** | Yes | 1–5 stars |
|
||||||
|
| **Usability** | Yes | 1–5 stars |
|
||||||
|
| **Comment** | No | Free text |
|
||||||
|
| **Name** | No | Defaults to "Anonymous" |
|
||||||
|
|
||||||
|
Next to the fields, the **? icon** links directly to the associated field
|
||||||
|
description in the [data model reference](/docs/reference/schemas/ratinginput).
|
||||||
|
|
||||||
|
## What happens after submitting?
|
||||||
|
|
||||||
|
- Your rating is saved immediately and appears in the **rating list** of the
|
||||||
|
detail page.
|
||||||
|
- The **averages** (usefulness, usability, combined) and the **score
|
||||||
|
distribution** are updated.
|
||||||
|
- The **statistics** in the [Analytics](/docs/handbook/analytics) section are
|
||||||
|
recalculated.
|
||||||
|
|
||||||
|
## Statistic sections on the detail page
|
||||||
|
|
||||||
|
- **Rating overview:** usefulness & usability as an average with progress
|
||||||
|
bars.
|
||||||
|
- **Score distribution:** number of ratings per star (1★–5★).
|
||||||
|
- **History:** line chart of combined/individual values over time
|
||||||
|
(only visible once there are several ratings).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`POST /tools/{id}/ratings`](/docs/reference/endpoints/ratings#createRating) — Submit a rating
|
||||||
|
- [`GET /tools/{id}/ratings`](/docs/reference/endpoints/ratings#listToolRatings) — Ratings of a tool
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
|
||||||
|
# Datenmodell
|
||||||
|
|
||||||
|
Dieses Kapitel erklärt die zentralen Datenobjekte von toolr auf Ebene der
|
||||||
|
Anwendung. Die vollständige, automatisch generierte Referenz aller Felder,
|
||||||
|
Typen und Constraints findest du in der
|
||||||
|
[API-Referenz](/docs/reference/schemas/tool).
|
||||||
|
|
||||||
|
## Tool
|
||||||
|
|
||||||
|
Das Herzstück: ein im Katalog erfasstes Werkzeug.
|
||||||
|
|
||||||
|
| Eigenschaft | Beschreibung |
|
||||||
|
| --- | --- |
|
||||||
|
| `id` | Eindeutige Kennung |
|
||||||
|
| `name` | Anzeigename |
|
||||||
|
| `description` | Beschreibung (Was macht das Tool?) |
|
||||||
|
| `category` | Kategorie-Zuordnung |
|
||||||
|
| `websiteUrl` | Offizielle Website (optional) |
|
||||||
|
| `iconUrl` | Logo-/Icon-URL (optional) |
|
||||||
|
| `features` | Liste von Fähigkeiten |
|
||||||
|
| `tags` | Liste von Schlagwörtern |
|
||||||
|
| `createdAt` / `updatedAt` | Zeitstempel |
|
||||||
|
| `createdBy` | Erstellende Person |
|
||||||
|
| `deletedAt` / `deletedBy` | Soft-Löschung (Papierkorb) |
|
||||||
|
|
||||||
|
Eingabe-Formulare verwenden die abgeleiteten Schemas
|
||||||
|
[`ToolInput`](/docs/reference/schemas/toolinput) und
|
||||||
|
[`ToolUpdate`](/docs/reference/schemas/toolupdate).
|
||||||
|
Aggregierte Ansichten liefert [`ToolWithStats`](/docs/reference/schemas/toolwithstats)
|
||||||
|
(z. B. mit Durchschnittsbewertung).
|
||||||
|
|
||||||
|
## Rating (Bewertung)
|
||||||
|
|
||||||
|
Eine einzelne Bewertung zu einem Tool:
|
||||||
|
|
||||||
|
- `usefulness` (Nützlichkeit, 1–5) und `usability` (Bedienbarkeit, 1–5)
|
||||||
|
- optional `comment` und ein Anzeigename (`reviewerName`)
|
||||||
|
- Zeitstempel
|
||||||
|
|
||||||
|
Eingabe-Schema: [`RatingInput`](/docs/reference/schemas/ratinginput).
|
||||||
|
|
||||||
|
## User & Auth
|
||||||
|
|
||||||
|
- [`User`](/docs/reference/schemas/user) — Benutzerkonto mit Rolle (User/Admin)
|
||||||
|
und Tarif (Free/Premium/Enterprise).
|
||||||
|
- [`AuthUser`](/docs/reference/schemas/authuser) — das angemeldete Profil
|
||||||
|
inklusive `entitlements` (verfügbare Features).
|
||||||
|
- [`UserPreferences`](/docs/reference/schemas/userpreferences) — Ansichts- und
|
||||||
|
Dichte-Präferenzen sowie die `watchlist` (Liste von Tool-IDs).
|
||||||
|
|
||||||
|
## Analytics
|
||||||
|
|
||||||
|
Die Statistik-Endpunkte liefern aggregierte Daten:
|
||||||
|
|
||||||
|
- [`AnalyticsSummary`](/docs/reference/schemas/analyticssummary) — globale
|
||||||
|
Kennzahlen (Anzahl Tools/Bewertungen, Kategorien, Durchschnitt).
|
||||||
|
- [`TopToolEntry`](/docs/reference/schemas/TopToolEntry) — ein Eintrag der
|
||||||
|
Top-Tools.- [`CategoryStats`](/docs/reference/schemas/categorystats) — Tool-Anzahl je
|
||||||
|
Kategorie.
|
||||||
|
- [`RatingDistribution`](/docs/reference/schemas/ratingdistribution) —
|
||||||
|
Punkteverteilung (Nützlichkeit & Bedienbarkeit).
|
||||||
|
- [`ScoreBucket`](/docs/reference/schemas/scorebucket) — ein Werte-Bucket.
|
||||||
|
|
||||||
|
## Weitere
|
||||||
|
|
||||||
|
- [`VersionInfo`](/docs/reference/schemas/versioninfo) — Version, Commit-SHA,
|
||||||
|
Build-Datum und Papierkorb-Aufbewahrung der laufenden Instanz.
|
||||||
|
- [`AuditLog`](/docs/reference/schemas/auditlog) — ein Protokolleintrag
|
||||||
|
(Aktion, Entität, Zeitstempel, Akteur, Änderungen).
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
|
||||||
|
# Data model
|
||||||
|
|
||||||
|
This chapter explains the central data objects of toolr at the application
|
||||||
|
level. The complete, automatically generated reference of all fields,
|
||||||
|
types and constraints can be found in the
|
||||||
|
[API reference](/docs/reference/schemas/tool).
|
||||||
|
|
||||||
|
## Tool
|
||||||
|
|
||||||
|
The heart of it all: a tool recorded in the catalog.
|
||||||
|
|
||||||
|
| Property | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| `id` | Unique identifier |
|
||||||
|
| `name` | Display name |
|
||||||
|
| `description` | Description (what does the tool do?) |
|
||||||
|
| `category` | Category assignment |
|
||||||
|
| `websiteUrl` | Official website (optional) |
|
||||||
|
| `iconUrl` | Logo/icon URL (optional) |
|
||||||
|
| `features` | List of capabilities |
|
||||||
|
| `tags` | List of keywords |
|
||||||
|
| `createdAt` / `updatedAt` | Timestamps |
|
||||||
|
| `createdBy` | Person who created it |
|
||||||
|
| `deletedAt` / `deletedBy` | Soft deletion (trash) |
|
||||||
|
|
||||||
|
Input forms use the derived schemas
|
||||||
|
[`ToolInput`](/docs/reference/schemas/toolinput) and
|
||||||
|
[`ToolUpdate`](/docs/reference/schemas/toolupdate).
|
||||||
|
Aggregated views are provided by [`ToolWithStats`](/docs/reference/schemas/toolwithstats)
|
||||||
|
(e.g. with average rating).
|
||||||
|
|
||||||
|
## Rating (Bewertung)
|
||||||
|
|
||||||
|
A single rating for a tool:
|
||||||
|
|
||||||
|
- `usefulness` (Nützlichkeit, 1–5) and `usability` (Bedienbarkeit, 1–5)
|
||||||
|
- optional `comment` and a display name (`reviewerName`)
|
||||||
|
- timestamp
|
||||||
|
|
||||||
|
Input schema: [`RatingInput`](/docs/reference/schemas/ratinginput).
|
||||||
|
|
||||||
|
## User & Auth
|
||||||
|
|
||||||
|
- [`User`](/docs/reference/schemas/user) — user account with role (User/Admin)
|
||||||
|
and plan (Free/Premium/Enterprise).
|
||||||
|
- [`AuthUser`](/docs/reference/schemas/authuser) — the logged-in profile
|
||||||
|
including `entitlements` (available features).
|
||||||
|
- [`UserPreferences`](/docs/reference/schemas/userpreferences) — view and
|
||||||
|
density preferences as well as the `watchlist` (list of tool IDs).
|
||||||
|
|
||||||
|
## Analytics
|
||||||
|
|
||||||
|
The statistics endpoints provide aggregated data:
|
||||||
|
|
||||||
|
- [`AnalyticsSummary`](/docs/reference/schemas/analyticssummary) — global
|
||||||
|
metrics (number of tools/ratings, categories, average).
|
||||||
|
- [`TopToolEntry`](/docs/reference/schemas/TopToolEntry) — an entry of the
|
||||||
|
top tools.- [`CategoryStats`](/docs/reference/schemas/categorystats) — number of tools per
|
||||||
|
category.
|
||||||
|
- [`RatingDistribution`](/docs/reference/schemas/ratingdistribution) —
|
||||||
|
score distribution (usefulness & usability).
|
||||||
|
- [`ScoreBucket`](/docs/reference/schemas/scorebucket) — a value bucket.
|
||||||
|
|
||||||
|
## Additional
|
||||||
|
|
||||||
|
- [`VersionInfo`](/docs/reference/schemas/versioninfo) — version, commit SHA,
|
||||||
|
build date and trash retention of the running instance.
|
||||||
|
- [`AuditLog`](/docs/reference/schemas/auditlog) — a log entry
|
||||||
|
(action, entity, timestamp, actor, changes).
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
# Erste Schritte
|
||||||
|
|
||||||
|
Diese Seite führt dich durch die wichtigsten Abläufe in toolr — vom ersten
|
||||||
|
Besuch bis zum Anlegen und Bewerten eines Tools.
|
||||||
|
|
||||||
|
## 1. Anmelden
|
||||||
|
|
||||||
|
Die meisten Aktionen (Tool anlegen, bewerten, Merkliste, Vergleichen) erfordern
|
||||||
|
ein Konto. Klicke unten links auf **Anmelden**. Je nach Konfiguration der
|
||||||
|
Instanz hast du zwei Möglichkeiten:
|
||||||
|
|
||||||
|
- **Lokale Konten:** Benutzername + Passwort. Der Zugang wird von einem Admin
|
||||||
|
angelegt (siehe [Administration](/docs/handbook/administration)).
|
||||||
|
- **OIDC (SSO):** Anmelden mit dem konfigurierten Identitätsanbieter (z. B.
|
||||||
|
Keycloak).
|
||||||
|
|
||||||
|
Welcher Modus aktiv ist, steht im Endpunkt
|
||||||
|
[`GET /auth/mode`](/docs/reference/endpoints/auth#getAuthMode). Details findest
|
||||||
|
du im Abschnitt [Anmelden & Konto](/docs/handbook/konto).
|
||||||
|
|
||||||
|
## 2. Tools finden
|
||||||
|
|
||||||
|
Öffne den Bereich **Tools durchsuchen**:
|
||||||
|
|
||||||
|
- **Suchen** — Volltextsuche über Name & Beschreibung (Tastenkürzel `/`).
|
||||||
|
- **Filtern** — nach Kategorie, Tags, Features und Mindestbewertung
|
||||||
|
(`minRating`).
|
||||||
|
- **Sortieren** — nach Aktualität, Top-Bewertung, meistbewertet, Name
|
||||||
|
(auf-/absteigend) oder letztem Update.
|
||||||
|
|
||||||
|
Alle Optionen im Detail: [Tools finden & durchsuchen](/docs/handbook/tools-finden).
|
||||||
|
|
||||||
|
## 3. Tool anlegen
|
||||||
|
|
||||||
|
Gehe auf **Tool hinzufügen** und fülle das Formular aus. Details zu jedem Feld
|
||||||
|
findest du im Abschnitt [Tool anlegen](/docs/handbook/tool-anlegen) und in der
|
||||||
|
[Feld-Referenz](/docs/reference/schemas/toolinput).
|
||||||
|
|
||||||
|
## 4. Bewerten
|
||||||
|
|
||||||
|
Auf der Detailseite eines Tools kannst du **Nützlichkeit** und **Bedienbarkeit**
|
||||||
|
(jeweils 1–5) vergeben und optional einen Kommentar hinterlassen. Deine
|
||||||
|
Bewertung fließt sofort in die Statistiken ein.
|
||||||
|
Siehe [Bewerten](/docs/handbook/bewerten).
|
||||||
|
|
||||||
|
## 5. Weiterführend
|
||||||
|
|
||||||
|
- [Tools vergleichen](/docs/handbook/vergleichen)
|
||||||
|
- [Merkliste](/docs/handbook/watchlist)
|
||||||
|
- [Analytics](/docs/handbook/analytics)
|
||||||
|
- [Pläne & Berechtigungen](/docs/handbook/plaene)
|
||||||
|
- [Administration](/docs/handbook/administration)
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
# Getting Started
|
||||||
|
|
||||||
|
This page guides you through the most important workflows in toolr — from your
|
||||||
|
first visit to creating and rating a tool.
|
||||||
|
|
||||||
|
## 1. Sign in
|
||||||
|
|
||||||
|
Most actions (create a tool, rate, watchlist, compare) require
|
||||||
|
an account. Click **Sign in** in the bottom left corner. Depending on the
|
||||||
|
instance configuration you have two options:
|
||||||
|
|
||||||
|
- **Local accounts:** username + password. Access is created by an admin
|
||||||
|
(see [Administration](/docs/handbook/administration)).
|
||||||
|
- **OIDC (SSO):** sign in with the configured identity provider (e.g.
|
||||||
|
Keycloak).
|
||||||
|
|
||||||
|
Which mode is active is shown by the
|
||||||
|
[`GET /auth/mode`](/docs/reference/endpoints/auth#getAuthMode) endpoint. Details
|
||||||
|
can be found in the [Sign in & account](/docs/handbook/konto) section.
|
||||||
|
|
||||||
|
## 2. Find tools
|
||||||
|
|
||||||
|
Open the **Browse tools** section:
|
||||||
|
|
||||||
|
- **Search** — full-text search across name & description (shortcut `/`).
|
||||||
|
- **Filter** — by category, tags, features and minimum rating
|
||||||
|
(`minRating`).
|
||||||
|
- **Sort** — by newest, top-rated, most rated, name
|
||||||
|
(ascending/descending) or last update.
|
||||||
|
|
||||||
|
All options in detail: [Find & browse tools](/docs/handbook/tools-finden).
|
||||||
|
|
||||||
|
## 3. Create a tool
|
||||||
|
|
||||||
|
Go to **Add tool** and fill in the form. Details for each field can be found
|
||||||
|
in the [Create a tool](/docs/handbook/tool-anlegen) section and in the
|
||||||
|
[field reference](/docs/reference/schemas/toolinput).
|
||||||
|
|
||||||
|
## 4. Rate
|
||||||
|
|
||||||
|
On the detail page of a tool you can submit **usefulness** and **usability**
|
||||||
|
(1–5 each) and optionally leave a comment. Your
|
||||||
|
rating is immediately reflected in the statistics.
|
||||||
|
See [Rating](/docs/handbook/bewerten).
|
||||||
|
|
||||||
|
## 5. Further reading
|
||||||
|
|
||||||
|
- [Compare tools](/docs/handbook/vergleichen)
|
||||||
|
- [Watchlist](/docs/handbook/watchlist)
|
||||||
|
- [Analytics](/docs/handbook/analytics)
|
||||||
|
- [Plans & permissions](/docs/handbook/plaene)
|
||||||
|
- [Administration](/docs/handbook/administration)
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
# Willkommen bei toolr
|
||||||
|
|
||||||
|
toolr ist eine Plattform zum **Entdecken, Bewerten und Vergleichen von
|
||||||
|
Entwicklungstools**. Nutzer pflegen einen gemeinsamen Katalog von Tools,
|
||||||
|
vergeben Bewertungen (Nützlichkeit & Bedienbarkeit) und nutzen Statistiken, um
|
||||||
|
die richtige Wahl zu treffen.
|
||||||
|
|
||||||
|
## Was kannst du mit toolr tun?
|
||||||
|
|
||||||
|
| Funktion | Beschreibung | Sichtbarkeit |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **Tools durchsuchen** | Katalog filtern, sortieren und durchsuchen | Alle |
|
||||||
|
| **Tool anlegen** | Neues Tool mit Beschreibung, Kategorie, Features & Tags eintragen | Angemeldet |
|
||||||
|
| **Tool bearbeiten/löschen** | Eigene Tools pflegen (Ersteller oder Admin) | Angemeldet |
|
||||||
|
| **Bewerten** | Nützlichkeit & Bedienbarkeit (1–5) plus Kommentar vergeben | Angemeldet |
|
||||||
|
| **Merkliste** | Tools als Favoriten speichern | Premium |
|
||||||
|
| **Vergleichen** | Tools nebeneinander gegenüberstellen | Premium |
|
||||||
|
| **Kosten erfassen** | Lizenz- und Kostenmodelle je Tool eintragen | Premium |
|
||||||
|
| **Analytics** | Statistiken, Top-Tools, Verteilungen | Alle |
|
||||||
|
| **Papierkorb** | Soft-gelöschte Tools wiederherstellen oder endgültig löschen | Premium |
|
||||||
|
| **Import** | Mehrere Tools per CSV, JSON oder YAML anlegen | Admin (Premium) |
|
||||||
|
| **Admin** | Nutzerverwaltung, Audit-Log, Systeminformationen | Admin |
|
||||||
|
| **Redundanz** | Automatische Doppelungs-Erkennung | Admin |
|
||||||
|
|
||||||
|
## Wie diese Doku aufgebaut ist
|
||||||
|
|
||||||
|
- **User Guide** (diese Seiten): Schritt-für-Schritt-Anleitungen für alle
|
||||||
|
Funktionen — von den [Ersten Schritten](/docs/handbook/getting-started) bis
|
||||||
|
zur [Administration](/docs/handbook/administration).
|
||||||
|
- **API-Referenz**: automatisch aus der OpenAPI-Spezifikation generiert — alle
|
||||||
|
[Endpunkte](/docs/reference/endpoints/tools) und
|
||||||
|
[Datenfelder](/docs/reference/schemas/toolinput) der aktuellen Version.
|
||||||
|
- **Release-Notes**: Was ist in welcher [Version](/docs/releases/v0.8.1) neu.
|
||||||
|
|
||||||
|
## Der Einstieg
|
||||||
|
|
||||||
|
Der schnellste Weg:
|
||||||
|
|
||||||
|
1. **Anmelden** — ohne Konto kannst du nur stöbern
|
||||||
|
(siehe [Erste Schritte](/docs/handbook/getting-started#1-anmelden)).
|
||||||
|
2. **Tools finden** — Suche, Filter und Sortierung im Bereich
|
||||||
|
[Tools durchsuchen](/docs/handbook/tools-finden).
|
||||||
|
3. **Tool anlegen** — über „Tool hinzufügen"
|
||||||
|
([Anleitung](/docs/handbook/tool-anlegen)).
|
||||||
|
4. **Bewerten** — auf der Detailseite eines Tools
|
||||||
|
([Anleitung](/docs/handbook/bewerten)).
|
||||||
|
|
||||||
|
## Kontakt & Quellcode
|
||||||
|
|
||||||
|
Der Quellcode liegt unter
|
||||||
|
[git.kubebase.de/admin/tool-evaluator](https://git.kubebase.de/admin/tool-evaluator) —
|
||||||
|
über das Repository-Icon oben rechts erreichst du ihn jederzeit.
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
# Welcome to toolr
|
||||||
|
|
||||||
|
toolr is a platform for **discovering, rating and comparing development
|
||||||
|
tools**. Users maintain a shared catalog of tools, submit ratings
|
||||||
|
(usefulness & usability) and use statistics to make the right choice.
|
||||||
|
|
||||||
|
## What can you do with toolr?
|
||||||
|
|
||||||
|
| Function | Description | Visibility |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **Browse tools** | Filter, sort and search the catalog | Everyone |
|
||||||
|
| **Create a tool** | Add a new tool with description, category, features & tags | Logged in |
|
||||||
|
| **Edit/delete tools** | Maintain your own tools (creator or admin) | Logged in |
|
||||||
|
| **Rate** | Submit usefulness & usability (1–5) plus a comment | Logged in |
|
||||||
|
| **Watchlist** | Save tools as favorites | Premium |
|
||||||
|
| **Compare** | View tools side by side | Premium |
|
||||||
|
| **Record costs** | Enter license and cost models per tool | Premium |
|
||||||
|
| **Analytics** | Statistics, top tools, distributions | Everyone |
|
||||||
|
| **Trash** | Restore soft-deleted tools or delete them permanently | Premium |
|
||||||
|
| **Import** | Create multiple tools via CSV, JSON or YAML | Admin (premium) |
|
||||||
|
| **Admin** | User management, audit log, system information | Admin |
|
||||||
|
| **Redundancy detection** | Automatic duplicate detection | Admin |
|
||||||
|
|
||||||
|
## How this documentation is organized
|
||||||
|
|
||||||
|
- **User Guide** (these pages): step-by-step instructions for all
|
||||||
|
functions — from the [Getting Started](/docs/handbook/getting-started) to
|
||||||
|
[Administration](/docs/handbook/administration).
|
||||||
|
- **API Reference**: automatically generated from the OpenAPI specification —
|
||||||
|
all [endpoints](/docs/reference/endpoints/tools) and
|
||||||
|
[data fields](/docs/reference/schemas/toolinput) of the current version.
|
||||||
|
- **Release Notes**: what is new in each [version](/docs/releases/v0.8.1).
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
|
||||||
|
The fastest way:
|
||||||
|
|
||||||
|
1. **Sign in** — without an account you can only browse
|
||||||
|
(see [Getting Started](/docs/handbook/getting-started#1-anmelden)).
|
||||||
|
2. **Find tools** — search, filters and sorting in the
|
||||||
|
[Browse tools](/docs/handbook/tools-finden) section.
|
||||||
|
3. **Create a tool** — via "Add tool"
|
||||||
|
([guide](/docs/handbook/tool-anlegen)).
|
||||||
|
4. **Rate** — on the detail page of a tool
|
||||||
|
([guide](/docs/handbook/bewerten)).
|
||||||
|
|
||||||
|
## Contact & source code
|
||||||
|
|
||||||
|
The source code is available at
|
||||||
|
[git.kubebase.de/admin/tool-evaluator](https://git.kubebase.de/admin/tool-evaluator) —
|
||||||
|
you can reach it at any time via the repository icon in the top right corner.
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"slug": "index",
|
||||||
|
"file": "index.de.md",
|
||||||
|
"title": "Überblick",
|
||||||
|
"order": 1,
|
||||||
|
"fileEn": "index.en.md",
|
||||||
|
"titleEn": "Overview"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "getting-started",
|
||||||
|
"file": "getting-started.de.md",
|
||||||
|
"title": "Erste Schritte",
|
||||||
|
"order": 2,
|
||||||
|
"fileEn": "getting-started.en.md",
|
||||||
|
"titleEn": "Getting Started"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "konto",
|
||||||
|
"file": "konto.de.md",
|
||||||
|
"title": "Anmelden & Konto",
|
||||||
|
"order": 3,
|
||||||
|
"fileEn": "konto.en.md",
|
||||||
|
"titleEn": "Login & Account"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "tools-finden",
|
||||||
|
"file": "tools-finden.de.md",
|
||||||
|
"title": "Tools finden & durchsuchen",
|
||||||
|
"order": 4,
|
||||||
|
"fileEn": "tools-finden.en.md",
|
||||||
|
"titleEn": "Find & browse tools"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "tool-anlegen",
|
||||||
|
"file": "tool-anlegen.de.md",
|
||||||
|
"title": "Tool anlegen",
|
||||||
|
"order": 5,
|
||||||
|
"fileEn": "tool-anlegen.en.md",
|
||||||
|
"titleEn": "Create a tool"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "tool-bearbeiten",
|
||||||
|
"file": "tool-bearbeiten.de.md",
|
||||||
|
"title": "Tool bearbeiten & löschen",
|
||||||
|
"order": 6,
|
||||||
|
"fileEn": "tool-bearbeiten.en.md",
|
||||||
|
"titleEn": "Edit & delete tools"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "bewerten",
|
||||||
|
"file": "bewerten.de.md",
|
||||||
|
"title": "Bewerten",
|
||||||
|
"order": 7,
|
||||||
|
"fileEn": "bewerten.en.md",
|
||||||
|
"titleEn": "Rating"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "watchlist",
|
||||||
|
"file": "watchlist.de.md",
|
||||||
|
"title": "Merkliste",
|
||||||
|
"order": 8,
|
||||||
|
"fileEn": "watchlist.en.md",
|
||||||
|
"titleEn": "Watchlist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "vergleichen",
|
||||||
|
"file": "vergleichen.de.md",
|
||||||
|
"title": "Vergleichen",
|
||||||
|
"order": 9,
|
||||||
|
"fileEn": "vergleichen.en.md",
|
||||||
|
"titleEn": "Compare"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "analytics",
|
||||||
|
"file": "analytics.de.md",
|
||||||
|
"title": "Analytics",
|
||||||
|
"order": 10,
|
||||||
|
"fileEn": "analytics.en.md",
|
||||||
|
"titleEn": "Analytics"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "plaene",
|
||||||
|
"file": "plaene.de.md",
|
||||||
|
"title": "Pläne & Berechtigungen",
|
||||||
|
"order": 11,
|
||||||
|
"fileEn": "plaene.en.md",
|
||||||
|
"titleEn": "Plans & Permissions"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "kosten",
|
||||||
|
"file": "kosten.de.md",
|
||||||
|
"title": "Kosten erfassen",
|
||||||
|
"order": 12,
|
||||||
|
"fileEn": "kosten.en.md",
|
||||||
|
"titleEn": "Recording Costs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "administration",
|
||||||
|
"file": "administration.de.md",
|
||||||
|
"title": "Administration",
|
||||||
|
"order": 13,
|
||||||
|
"fileEn": "administration.en.md",
|
||||||
|
"titleEn": "Administration"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "redundanz",
|
||||||
|
"file": "redundanz.de.md",
|
||||||
|
"title": "Redundanz-Dashboard",
|
||||||
|
"order": 14,
|
||||||
|
"fileEn": "redundanz.en.md",
|
||||||
|
"titleEn": "Redundancy dashboard"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "papierkorb",
|
||||||
|
"file": "papierkorb.de.md",
|
||||||
|
"title": "Papierkorb",
|
||||||
|
"order": 15,
|
||||||
|
"fileEn": "papierkorb.en.md",
|
||||||
|
"titleEn": "Trash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "tastatur",
|
||||||
|
"file": "tastatur.de.md",
|
||||||
|
"title": "Tastenkürzel & Kommandopalette",
|
||||||
|
"order": 16,
|
||||||
|
"fileEn": "tastatur.en.md",
|
||||||
|
"titleEn": "Keyboard shortcuts & command palette"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "datenmodell",
|
||||||
|
"file": "datenmodell.de.md",
|
||||||
|
"title": "Datenmodell",
|
||||||
|
"order": 17,
|
||||||
|
"fileEn": "datenmodell.en.md",
|
||||||
|
"titleEn": "Data model"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
# Anmelden & Konto
|
||||||
|
|
||||||
|
## Anmelden
|
||||||
|
|
||||||
|
Klicke unten links in der Seitenleiste auf **Anmelden**. Je nach Konfiguration
|
||||||
|
der Instanz:
|
||||||
|
|
||||||
|
- **Lokale Konten:** Benutzername und Passwort eingeben. Die Konten werden von
|
||||||
|
einem Admin angelegt (siehe [Administration](/docs/handbook/administration)).
|
||||||
|
- **OIDC (SSO):** Du wirst an den konfigurierten Identitätsanbieter
|
||||||
|
weitergeleitet und meldest dich dort an.
|
||||||
|
|
||||||
|
Der aktive Modus steht im Endpunkt
|
||||||
|
[`GET /auth/mode`](/docs/reference/endpoints/auth#getAuthMode).
|
||||||
|
|
||||||
|
> Die Login-Seite erreichst du direkt unter `/login`. Nach erfolgreicher
|
||||||
|
> Anmeldung wirst du zur ursprünglich aufgerufenen Seite zurückgeleitet.
|
||||||
|
|
||||||
|
## Benutzerprofil
|
||||||
|
|
||||||
|
Dein Profil (Avatar, Name, E-Mail, Tarif) siehst du unten links im
|
||||||
|
Benutzermenü. Dort stehen dir folgende Aktionen zur Verfügung:
|
||||||
|
|
||||||
|
- **Merkliste** — deine gespeicherten Tools (nur mit dem entsprechenden Tarif).
|
||||||
|
- **Papierkorb** — wiederherstellbare, gelöschte Tools (Premium/Enterprise).
|
||||||
|
- **Passwort ändern** — für lokale Konten direkt in toolr; für OIDC-Konten wird
|
||||||
|
die Passwortverwaltung im Identitätsanbieter angeboten.
|
||||||
|
- **Abmelden** — beendet deine Sitzung.
|
||||||
|
|
||||||
|
## Passwort ändern (lokales Konto)
|
||||||
|
|
||||||
|
1. Öffne das Benutzermenü unten links.
|
||||||
|
2. Wähle **Passwort ändern**.
|
||||||
|
3. Gib das **aktuelle** sowie ein **neues** Passwort ein (mind. 6 Zeichen) und
|
||||||
|
bestätige es.
|
||||||
|
4. Speichern — das Passwort wird sofort übernommen.
|
||||||
|
|
||||||
|
API-Referenz: [`POST /auth/me/password`](/docs/reference/endpoints/auth#changeMyPassword).
|
||||||
|
|
||||||
|
## Anzeigeeinstellungen
|
||||||
|
|
||||||
|
Über die Schaltflächen oben rechts kannst du:
|
||||||
|
|
||||||
|
- **Sprache** wechseln (Deutsch / Englisch),
|
||||||
|
- **Theme** umschalten (Hell / Dunkel / System),
|
||||||
|
- die **Listenansicht** und **Dichte** im Bereich Tools durchsuchen anpassen
|
||||||
|
(siehe [Tools finden & durchsuchen](/docs/handbook/tools-finden)).
|
||||||
|
|
||||||
|
Deine Präferenzen (inkl. Merkliste) werden im Endpunkt
|
||||||
|
[`GET /auth/me/preferences`](/docs/reference/endpoints/auth#getMePreferences)
|
||||||
|
gespeichert und über [`PUT /auth/me/preferences`](/docs/reference/endpoints/auth#updateMePreferences)
|
||||||
|
aktualisiert.
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
# Login & Account
|
||||||
|
|
||||||
|
## Logging in
|
||||||
|
|
||||||
|
Click **Login** at the bottom left of the sidebar. Depending on the
|
||||||
|
configuration of the instance:
|
||||||
|
|
||||||
|
- **Local accounts:** enter username and password. The accounts are created
|
||||||
|
by an admin (see [Administration](/docs/handbook/administration)).
|
||||||
|
- **OIDC (SSO):** you are redirected to the configured identity provider and
|
||||||
|
log in there.
|
||||||
|
|
||||||
|
The active mode is available at the endpoint
|
||||||
|
[`GET /auth/mode`](/docs/reference/endpoints/auth#getAuthMode).
|
||||||
|
|
||||||
|
> You can reach the login page directly at `/login`. After a successful
|
||||||
|
> login you are redirected back to the page you originally requested.
|
||||||
|
|
||||||
|
## User profile
|
||||||
|
|
||||||
|
You can see your profile (avatar, name, email, plan) at the bottom left in
|
||||||
|
the user menu. There you have the following actions available:
|
||||||
|
|
||||||
|
- **Watchlist** — your saved tools (only with the corresponding plan).
|
||||||
|
- **Trash** — restorable, deleted tools (Premium/Enterprise).
|
||||||
|
- **Change password** — directly in toolr for local accounts; for OIDC
|
||||||
|
accounts, password management is offered in the identity provider.
|
||||||
|
- **Logout** — ends your session.
|
||||||
|
|
||||||
|
## Changing your password (local account)
|
||||||
|
|
||||||
|
1. Open the user menu at the bottom left.
|
||||||
|
2. Select **Change password**.
|
||||||
|
3. Enter the **current** and a **new** password (min. 6 characters) and
|
||||||
|
confirm it.
|
||||||
|
4. Save — the password takes effect immediately.
|
||||||
|
|
||||||
|
API reference: [`POST /auth/me/password`](/docs/reference/endpoints/auth#changeMyPassword).
|
||||||
|
|
||||||
|
## Display settings
|
||||||
|
|
||||||
|
Using the buttons at the top right you can:
|
||||||
|
|
||||||
|
- switch the **language** (German / English),
|
||||||
|
- toggle the **theme** (Light / Dark / System),
|
||||||
|
- adjust the **list view** and **density** in the Browse tools section
|
||||||
|
(see [Finding & browsing tools](/docs/handbook/tools-finden)).
|
||||||
|
|
||||||
|
Your preferences (incl. watchlist) are saved at the endpoint
|
||||||
|
[`GET /auth/me/preferences`](/docs/reference/endpoints/auth#getMePreferences)
|
||||||
|
and updated via [`PUT /auth/me/preferences`](/docs/reference/endpoints/auth#updateMePreferences).
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
# Kosten erfassen
|
||||||
|
|
||||||
|
Auf der Detailseite eines Tools kannst du Kosten- und Lizenzmodelle eintragen,
|
||||||
|
damit die Gesamtkosten je Tool transparent werden.
|
||||||
|
|
||||||
|
> Kosten ist ein **Premium-Feature** (`costs`, Premium/Enterprise). Admins
|
||||||
|
> haben immer Zugriff.
|
||||||
|
|
||||||
|
## Kosten hinzufügen
|
||||||
|
|
||||||
|
Klicke auf **Kosten hinzufügen** im Kosten-Bereich der Detailseite und fülle
|
||||||
|
das Formular aus:
|
||||||
|
|
||||||
|
| Feld | Hinweise |
|
||||||
|
| --- | --- |
|
||||||
|
| **Lizenztyp** | Free / Subscription / One-Time / Usage-Based |
|
||||||
|
| **Abrechnungszeitraum** | Nur für „Subscription": Monatlich / Quartalsweise / Jährlich |
|
||||||
|
| **Kosten** | Betrag als Zahl |
|
||||||
|
| **Währung** | EUR / USD / GBP / CHF |
|
||||||
|
| **Notizen** | Optionaler Freitext |
|
||||||
|
|
||||||
|
Speichern legt den Eintrag an. Jeder Kosten-Eintrag wird als Karte mit
|
||||||
|
Lizenz-Badge, Abrechnungszeitraum, Betrag (`Betrag Währung` bzw. „Free") und
|
||||||
|
Notizen angezeigt.
|
||||||
|
|
||||||
|
## Kosten bearbeiten & löschen
|
||||||
|
|
||||||
|
Beim Überfahren einer Kosten-Karte erscheinen die Aktionen **Bearbeiten**
|
||||||
|
(Bleistift) und **Löschen** (Papierkorb).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
Die Kosten-Daten werden über die Tool-Endpunkte verwaltet
|
||||||
|
(siehe [API-Referenz](/docs/reference/endpoints/tools)).
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
# Recording Costs
|
||||||
|
|
||||||
|
On the detail page of a tool you can enter cost and license models so that
|
||||||
|
the total costs per tool become transparent.
|
||||||
|
|
||||||
|
> Costs is a **premium feature** (`costs`, Premium/Enterprise). Admins always
|
||||||
|
> have access.
|
||||||
|
|
||||||
|
## Adding costs
|
||||||
|
|
||||||
|
Click **Add costs** in the costs section of the detail page and fill out the
|
||||||
|
form:
|
||||||
|
|
||||||
|
| Field | Notes |
|
||||||
|
| --- | --- |
|
||||||
|
| **License type** | Free / Subscription / One-Time / Usage-Based |
|
||||||
|
| **Billing period** | Only for "Subscription": Monthly / Quarterly / Annually |
|
||||||
|
| **Costs** | Amount as a number |
|
||||||
|
| **Currency** | EUR / USD / GBP / CHF |
|
||||||
|
| **Notes** | Optional free text |
|
||||||
|
|
||||||
|
Saving creates the entry. Each cost entry is displayed as a card with
|
||||||
|
license badge, billing period, amount (`Amount Currency` or "Free") and
|
||||||
|
notes.
|
||||||
|
|
||||||
|
## Editing & deleting costs
|
||||||
|
|
||||||
|
Hovering over a cost card shows the **Edit** (pencil) and **Delete** (trash)
|
||||||
|
actions.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
The cost data is managed via the tool endpoints
|
||||||
|
(see [API reference](/docs/reference/endpoints/tools)).
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
|
||||||
|
# Papierkorb
|
||||||
|
|
||||||
|
Der **Papierkorb** (`/trash`) enthält soft gelöschte Tools. Mit Papierkorb-Zugang
|
||||||
|
können sie wiederhergestellt werden; endgültiges Löschen ist Admins vorbehalten.
|
||||||
|
|
||||||
|
> Der Papierkorb ist ein **Premium-Feature** (`trash`, Premium/Enterprise).
|
||||||
|
> Admins haben immer Zugriff.
|
||||||
|
|
||||||
|
## Zugang
|
||||||
|
|
||||||
|
Der Papierkorb ist über das Benutzermenü oder die Seitenleiste erreichbar.
|
||||||
|
Ohne `trash`-Berechtigung erscheint ein Hinweis auf den Tarifwechsel.
|
||||||
|
|
||||||
|
## Wiederherstellen
|
||||||
|
|
||||||
|
- Markiere ein oder mehrere Tools (Checkboxen).
|
||||||
|
- Klicke auf **Wiederherstellen (N)** — die Tools erscheinen wieder in allen
|
||||||
|
öffentlichen Ansichten.
|
||||||
|
|
||||||
|
> Wiederherstellen steht jeder Person mit Papierkorb-Zugang zur Verfügung.
|
||||||
|
|
||||||
|
## Endgültig löschen (nur Admin)
|
||||||
|
|
||||||
|
- **Löschen (N)** entfernt die ausgewählten Tools **endgültig** — inklusive
|
||||||
|
aller Bewertungen, Kosten und Verknüpfungen. Das kann nicht rückgängig
|
||||||
|
gemacht werden.
|
||||||
|
- **Papierkorb leeren** entfernt alle soft gelöschten Tools endgültig.
|
||||||
|
|
||||||
|
## Tabelle
|
||||||
|
|
||||||
|
Der Papierkorb listet: Name, Kategorie, **Gelöscht am** (`tt.MM.jjjj HH:mm`),
|
||||||
|
**Gelöscht von** sowie Aktionen (Wiederherstellen; Löschen nur Admin). Die Suche
|
||||||
|
filtert nach Namen.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`GET /tools/trash`](/docs/reference/endpoints/tools#listTrashedTools) — Liste
|
||||||
|
- [`POST /tools/trash/restore`](/docs/reference/endpoints/tools#restoreTools) — Wiederherstellen
|
||||||
|
- [`DELETE /tools/trash`](/docs/reference/endpoints/tools#deleteTrashedTools) — Endgültig löschen (Admin)
|
||||||
|
- [`POST /tools/trash/empty`](/docs/reference/endpoints/tools#emptyTrash) — Papierkorb leeren (Admin)
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
|
||||||
|
# Trash
|
||||||
|
|
||||||
|
The **trash** (`/trash`) contains soft-deleted tools. With trash access
|
||||||
|
they can be restored; permanent deletion is reserved for admins.
|
||||||
|
|
||||||
|
> The trash is a **premium feature** (`trash`, Premium/Enterprise).
|
||||||
|
> Admins always have access.
|
||||||
|
|
||||||
|
## Access
|
||||||
|
|
||||||
|
The trash can be reached via the user menu or the sidebar.
|
||||||
|
Without the `trash` permission, a hint about changing the plan appears.
|
||||||
|
|
||||||
|
## Restoring
|
||||||
|
|
||||||
|
- Select one or more tools (checkboxes).
|
||||||
|
- Click on **Restore (N)** — the tools appear again in all
|
||||||
|
public views.
|
||||||
|
|
||||||
|
> Restoring is available to anyone with trash access.
|
||||||
|
|
||||||
|
## Permanently delete (admin only)
|
||||||
|
|
||||||
|
- **Delete (N)** **permanently** removes the selected tools — including
|
||||||
|
all ratings, costs and links. This cannot be undone.
|
||||||
|
- **Empty trash** permanently removes all soft-deleted tools.
|
||||||
|
|
||||||
|
## Table
|
||||||
|
|
||||||
|
The trash lists: name, category, **Deleted on** (`tt.MM.jjjj HH:mm`),
|
||||||
|
**Deleted by** as well as actions (Restore; Delete admin only). The search
|
||||||
|
filters by name.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`GET /tools/trash`](/docs/reference/endpoints/tools#listTrashedTools) — list
|
||||||
|
- [`POST /tools/trash/restore`](/docs/reference/endpoints/tools#restoreTools) — restore
|
||||||
|
- [`DELETE /tools/trash`](/docs/reference/endpoints/tools#deleteTrashedTools) — permanently delete (admin)
|
||||||
|
- [`POST /tools/trash/empty`](/docs/reference/endpoints/tools#emptyTrash) — empty trash (admin)
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
# Pläne & Berechtigungen
|
||||||
|
|
||||||
|
toolr unterscheidet **Tarife** (Tier) und **Rollen**. Admins umgehen alle
|
||||||
|
Feature-Beschränkungen.
|
||||||
|
|
||||||
|
## Tarife
|
||||||
|
|
||||||
|
| Tarif | Beschreibung |
|
||||||
|
| --- | --- |
|
||||||
|
| **Free** | Grundfunktionen: suchen, filtern, ansehen, Analytics |
|
||||||
|
| **Premium** | Zusätzlich Merkliste, Vergleichen, Papierkorb, Kosten |
|
||||||
|
| **Enterprise** | Alle Premium-Features + erweiterter Support |
|
||||||
|
|
||||||
|
### Feature-Berechtigungen
|
||||||
|
|
||||||
|
Premium/Enterprise schalten folgende Features frei:
|
||||||
|
|
||||||
|
| Feature | Funktion | Mehr erfahren |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `compare` | Tools vergleichen | [Vergleichen](/docs/handbook/vergleichen) |
|
||||||
|
| `watchlist` | Favoritenliste | [Merkliste](/docs/handbook/watchlist) |
|
||||||
|
| `trash` | Papierkorb (soft gelöschte Tools) | [Papierkorb](/docs/handbook/papierkorb) |
|
||||||
|
| `costs` | Kosten-/Lizenzmodelle erfassen | [Kosten erfassen](/docs/handbook/kosten) |
|
||||||
|
| `tool-import` | Tools per CSV/JSON/YAML importieren (Admin) | [Administration](/docs/handbook/administration) |
|
||||||
|
|
||||||
|
Fehlt dir ein Feature, zeigt die App einen **Upgrade-Hinweis** mit Link zur
|
||||||
|
Tarifverwaltung.
|
||||||
|
|
||||||
|
## Rollen
|
||||||
|
|
||||||
|
| Rolle | Berechtigungen |
|
||||||
|
| --- | --- |
|
||||||
|
| **User** | Standard-Konto: Tools anlegen/bewerten, eigene Tools bearbeiten |
|
||||||
|
| **Admin** | Alle User-Rechte + Verwaltung, Audit-Log, Redundanz, Papierkorb leeren, Tool-Verknüpfungen |
|
||||||
|
|
||||||
|
Admins passieren **alle** Feature-Checks — auch ohne Premium-Tarif.
|
||||||
|
|
||||||
|
## Tarif-/Rollenverwaltung
|
||||||
|
|
||||||
|
Die Zuordnung von Rolle und Tarif wird durch Admins im Bereich
|
||||||
|
[Administration](/docs/handbook/administration) (Tab „Nutzer") verwaltet.
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
# Plans & Permissions
|
||||||
|
|
||||||
|
toolr distinguishes **plans** (tier) and **roles**. Admins bypass all feature
|
||||||
|
restrictions.
|
||||||
|
|
||||||
|
## Plans
|
||||||
|
|
||||||
|
| Plan | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| **Free** | Basic functions: search, filter, view, analytics |
|
||||||
|
| **Premium** | Additionally watchlist, compare, trash, costs |
|
||||||
|
| **Enterprise** | All premium features + extended support |
|
||||||
|
|
||||||
|
### Feature permissions
|
||||||
|
|
||||||
|
Premium/Enterprise unlock the following features:
|
||||||
|
|
||||||
|
| Feature | Function | Learn more |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `compare` | Compare tools | [Compare](/docs/handbook/vergleichen) |
|
||||||
|
| `watchlist` | Favorites list | [Watchlist](/docs/handbook/watchlist) |
|
||||||
|
| `trash` | Trash (soft-deleted tools) | [Trash](/docs/handbook/papierkorb) |
|
||||||
|
| `costs` | Record cost/license models | [Recording costs](/docs/handbook/kosten) |
|
||||||
|
| `tool-import` | Import tools via CSV/JSON/YAML (admin) | [Administration](/docs/handbook/administration) |
|
||||||
|
|
||||||
|
If you are missing a feature, the app shows an **upgrade notice** with a link
|
||||||
|
to the plan management.
|
||||||
|
|
||||||
|
## Roles
|
||||||
|
|
||||||
|
| Role | Permissions |
|
||||||
|
| --- | --- |
|
||||||
|
| **User** | Standard account: create/rate tools, edit your own tools |
|
||||||
|
| **Admin** | All user rights + administration, audit log, redundancy, empty trash, tool links |
|
||||||
|
|
||||||
|
Admins pass **all** feature checks — even without a premium plan.
|
||||||
|
|
||||||
|
## Plan/role management
|
||||||
|
|
||||||
|
The assignment of role and plan is managed by admins in the
|
||||||
|
[Administration](/docs/handbook/administration) section (tab "Users").
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
|
||||||
|
# Redundanz-Dashboard
|
||||||
|
|
||||||
|
Das **Redundanz-Dashboard** (`/admin/redundancy`) ist ein Admin-Werkzeug zur
|
||||||
|
automatischen Erkennung doppelter oder stark überlappender Tools — jeweils
|
||||||
|
pro Kategorie — inklusive Kosten- und Bewertungsvergleich.
|
||||||
|
|
||||||
|
> Der Zugriff ist ausschließlich Admins vorbehalten (die API ist
|
||||||
|
> admin-geschützt).
|
||||||
|
|
||||||
|
## Aufbau
|
||||||
|
|
||||||
|
- **Pro Kategorie** wird eine Gruppe angezeigt: Name der Kategorie,
|
||||||
|
Anzahl Tools und Vergleiche sowie ggf. die **gesamten monatlichen Kosten**
|
||||||
|
(z. B. `€X.XX/mo gesamt`).
|
||||||
|
- Jedes Tool wird als Karte dargestellt: Name, monatliche Kosten, Anzahl der
|
||||||
|
Bewertungen, kombinierte Bewertung, Lizenz-Badges und Feature-Anzahl.
|
||||||
|
|
||||||
|
## Vergleiche & Empfehlungen
|
||||||
|
|
||||||
|
Für jedes Tool-Paar erscheint:
|
||||||
|
|
||||||
|
- Tool A vs. Tool B, jeweils mit Bewertung (`X.X ★`) und monatlichen Kosten.
|
||||||
|
- **Überlappung** in Prozent (Fortschrittsbalken in der Mitte).
|
||||||
|
- Eine **Empfehlung** mit Konfidenz-Farbe:
|
||||||
|
- **hoch** (grün), **mittel** (gelb), **niedrig** (grau)
|
||||||
|
- Das empfohlene, bessere Tool wird mit „Daumen hoch" markiert und begründet.
|
||||||
|
|
||||||
|
## Manuelle Bewertung
|
||||||
|
|
||||||
|
Du kannst ein Paar manuell bewerten: Klicke auf Tool A oder Tool B, um
|
||||||
|
festzuhalten, welches besser ist. Die Auswahl wird gespeichert und die
|
||||||
|
Darstellung aktualisiert.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`GET /api/admin/redundancy`](#) — Daten laden (admin-geschützt)
|
||||||
|
- [`POST /api/admin/redundancy/evaluate`](#) — manuelle Bewertung speichern
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
|
||||||
|
# Redundancy dashboard
|
||||||
|
|
||||||
|
The **Redundancy dashboard** (`/admin/redundancy`) is an admin tool for
|
||||||
|
automatic detection of duplicate or strongly overlapping tools — per
|
||||||
|
category — including cost and rating comparison.
|
||||||
|
|
||||||
|
> Access is reserved exclusively for admins (the API is
|
||||||
|
> admin-protected).
|
||||||
|
|
||||||
|
## Layout
|
||||||
|
|
||||||
|
- **Per category** a group is shown: name of the category,
|
||||||
|
number of tools and comparisons as well as the **total monthly costs**
|
||||||
|
if applicable (e.g. `€X.XX/mo total`).
|
||||||
|
- Each tool is displayed as a card: name, monthly costs, number of
|
||||||
|
ratings, combined rating, license badges and number of features.
|
||||||
|
|
||||||
|
## Comparisons & recommendations
|
||||||
|
|
||||||
|
For each tool pair the following appears:
|
||||||
|
|
||||||
|
- Tool A vs. Tool B, each with rating (`X.X ★`) and monthly costs.
|
||||||
|
- **Overlap** in percent (progress bar in the middle).
|
||||||
|
- A **recommendation** with confidence color:
|
||||||
|
- **high** (green), **medium** (yellow), **low** (gray)
|
||||||
|
- The recommended, better tool is marked with a "thumbs up" and justified.
|
||||||
|
|
||||||
|
## Manual rating
|
||||||
|
|
||||||
|
You can rate a pair manually: click on Tool A or Tool B to
|
||||||
|
record which one is better. The selection is saved and the
|
||||||
|
display is updated.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`GET /api/admin/redundancy`](#) — load data (admin-protected)
|
||||||
|
- [`POST /api/admin/redundancy/evaluate`](#) — save manual rating
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
|
||||||
|
# Tastenkürzel & Kommandopalette
|
||||||
|
|
||||||
|
## Kommandopalette
|
||||||
|
|
||||||
|
Die Kommandopalette ist die zentrale Schnellnavigation:
|
||||||
|
|
||||||
|
- Öffnen mit **`⌘K`** (macOS) bzw. **`Ctrl+K`** (Windows/Linux).
|
||||||
|
- Alternativ über die Suchleiste oben rechts („Tools suchen… ⌘K") oder das
|
||||||
|
Such-Icon auf Mobilgeräten.
|
||||||
|
|
||||||
|
### Leerer Zustand
|
||||||
|
|
||||||
|
Ohne Eingabe zeigt die Palette:
|
||||||
|
|
||||||
|
- **Zuletzt angesehen** — die letzten 5 Tools, die du besucht hast.
|
||||||
|
- **Navigation** — Tools durchsuchen, Tool hinzufügen, Analytics sowie
|
||||||
|
(abhängig von Berechtigungen) Merkliste, Papierkorb und Admin.
|
||||||
|
|
||||||
|
### Suche
|
||||||
|
|
||||||
|
Tippe, um live nach Tools zu suchen (max. 10 Ergebnisse, inkl. Bewertung
|
||||||
|
`X.X★`).
|
||||||
|
|
||||||
|
## Tastenkürzel im Überblick
|
||||||
|
|
||||||
|
| Kürzel | Aktion |
|
||||||
|
| --- | --- |
|
||||||
|
| `⌘K` / `Ctrl+K` | Kommandopalette öffnen |
|
||||||
|
| `/` | Suche im Bereich „Tools durchsuchen" fokussieren |
|
||||||
|
|
||||||
|
## Weitere Hinweise
|
||||||
|
|
||||||
|
- **Zuletzt angesehen** wird lokal im Browser gespeichert (max. 5 Einträge).
|
||||||
|
- Die Seitenleiste (linke Navigation) ist auf Desktop einklappbar; der
|
||||||
|
Breadcrumb oben zeigt deinen aktuellen Ort.
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
|
||||||
|
# Keyboard shortcuts & command palette
|
||||||
|
|
||||||
|
## Command palette
|
||||||
|
|
||||||
|
The command palette is the central quick navigation:
|
||||||
|
|
||||||
|
- Open with **`⌘K`** (macOS) or **`Ctrl+K`** (Windows/Linux).
|
||||||
|
- Alternatively via the search bar at the top right ("Search tools… ⌘K") or the
|
||||||
|
search icon on mobile devices.
|
||||||
|
|
||||||
|
### Empty state
|
||||||
|
|
||||||
|
Without input, the palette shows:
|
||||||
|
|
||||||
|
- **Recently viewed** — the last 5 tools you visited.
|
||||||
|
- **Navigation** — browse tools, add tool, analytics as well as
|
||||||
|
(depending on permissions) watchlist, trash and admin.
|
||||||
|
|
||||||
|
### Search
|
||||||
|
|
||||||
|
Type to search for tools live (max. 10 results, incl. rating
|
||||||
|
`X.X★`).
|
||||||
|
|
||||||
|
## Overview of keyboard shortcuts
|
||||||
|
|
||||||
|
| Shortcut | Action |
|
||||||
|
| --- | --- |
|
||||||
|
| `⌘K` / `Ctrl+K` | Open command palette |
|
||||||
|
| `/` | Focus search in the "Browse tools" area |
|
||||||
|
|
||||||
|
## Additional notes
|
||||||
|
|
||||||
|
- **Recently viewed** is stored locally in the browser (max. 5 entries).
|
||||||
|
- The sidebar (left navigation) can be collapsed on desktop; the
|
||||||
|
breadcrumb at the top shows your current location.
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
# Tool anlegen
|
||||||
|
|
||||||
|
Um ein neues Tool zum Katalog hinzuzufügen, klicke auf **Tool hinzufügen**
|
||||||
|
(`/tools/new`). Das Anlegen erfordert ein Konto — ohne Anmeldung erscheint ein
|
||||||
|
Hinweis mit Login-Button.
|
||||||
|
|
||||||
|
## Formularfelder
|
||||||
|
|
||||||
|
| Feld | Pflicht | Hinweise |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **Name** | Ja | Mind. 2 Zeichen |
|
||||||
|
| **Kategorie** | Ja | Auswahlliste; neue Kategorien lassen sich direkt anlegen |
|
||||||
|
| **Website URL** | Nein | Gültige URL (z. B. `https://...`) |
|
||||||
|
| **Icon / Logo URL** | Nein | Gültige URL; Vorschau wird live angezeigt |
|
||||||
|
| **Beschreibung** | Ja | Mind. 10 Zeichen; beschreibe, was das Tool tut |
|
||||||
|
| **Features** | Nein | Dynamische Liste mit Autovervollständigung (max. 6) |
|
||||||
|
| **Tags** | Nein | Dynamische Liste mit Autovervollständigung |
|
||||||
|
|
||||||
|
Neben jedem Feld führt das **?‑Icon** direkt zur zugehörigen Feldbeschreibung
|
||||||
|
in der [Datenmodell-Referenz](/docs/reference/schemas/toolinput).
|
||||||
|
|
||||||
|
### Kategorie
|
||||||
|
|
||||||
|
- Tippe, um nach bestehenden Kategorien zu suchen.
|
||||||
|
- Wähle **+ Erstelle „..."**, um eine neue Kategorie anzulegen.
|
||||||
|
|
||||||
|
### Features & Tags
|
||||||
|
|
||||||
|
- **Feature hinzufügen** / **Tag hinzufügen** hängt eine neue Zeile an.
|
||||||
|
- Die Eingabefelder schlagen bestehende Features/Tags vor
|
||||||
|
(Autovervollständigung, max. 6 Vorschläge).
|
||||||
|
- Mit dem **×**‑Button entfernst du einzelne Zeilen.
|
||||||
|
- Features und Tags helfen beim Filtern und Wiederfinden.
|
||||||
|
|
||||||
|
## Speichern
|
||||||
|
|
||||||
|
Klicke auf **Tool hinzufügen**. Nach erfolgreicher Anlage wirst du auf die
|
||||||
|
Detailseite des neuen Tools weitergeleitet.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`POST /tools`](/docs/reference/endpoints/tools#createTool) — Tool anlegen
|
||||||
|
- [`GET /categories`](/docs/reference/endpoints/tools#listCategories) — Kategorien
|
||||||
|
- [`GET /features/all`](/docs/reference/endpoints/tools#listAllFeatures) — Features
|
||||||
|
- [`GET /tags/all`](/docs/reference/endpoints/tools#listAllTags) — Tags
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
# Create a tool
|
||||||
|
|
||||||
|
To add a new tool to the catalog, click **Add tool**
|
||||||
|
(`/tools/new`). Creating a tool requires an account — without being signed in
|
||||||
|
a notice with a login button appears.
|
||||||
|
|
||||||
|
## Form fields
|
||||||
|
|
||||||
|
| Field | Required | Notes |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **Name** | Yes | At least 2 characters |
|
||||||
|
| **Category** | Yes | Dropdown; new categories can be created directly |
|
||||||
|
| **Website URL** | No | Valid URL (e.g. `https://...`) |
|
||||||
|
| **Icon / Logo URL** | No | Valid URL; preview is shown live |
|
||||||
|
| **Description** | Yes | At least 10 characters; describe what the tool does |
|
||||||
|
| **Features** | No | Dynamic list with autocomplete (max. 6) |
|
||||||
|
| **Tags** | No | Dynamic list with autocomplete |
|
||||||
|
|
||||||
|
Next to each field, the **? icon** takes you directly to the corresponding
|
||||||
|
field description in the [data model reference](/docs/reference/schemas/toolinput).
|
||||||
|
|
||||||
|
### Category
|
||||||
|
|
||||||
|
- Type to search for existing categories.
|
||||||
|
- Select **+ Create "..."** to create a new category.
|
||||||
|
|
||||||
|
### Features & tags
|
||||||
|
|
||||||
|
- **Add feature** / **Add tag** appends a new row.
|
||||||
|
- The input fields suggest existing features/tags
|
||||||
|
(autocomplete, max. 6 suggestions).
|
||||||
|
- Use the **×** button to remove individual rows.
|
||||||
|
- Features and tags help with filtering and finding tools again.
|
||||||
|
|
||||||
|
## Save
|
||||||
|
|
||||||
|
Click **Add tool**. After successful creation you will be redirected to the
|
||||||
|
detail page of the new tool.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`POST /tools`](/docs/reference/endpoints/tools#createTool) — create a tool
|
||||||
|
- [`GET /categories`](/docs/reference/endpoints/tools#listCategories) — categories
|
||||||
|
- [`GET /features/all`](/docs/reference/endpoints/tools#listAllFeatures) — features
|
||||||
|
- [`GET /tags/all`](/docs/reference/endpoints/tools#listAllTags) — tags
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
|
||||||
|
# Tool bearbeiten & löschen
|
||||||
|
|
||||||
|
## Bearbeiten
|
||||||
|
|
||||||
|
Auf der Detailseite eines Tools findest du die Schaltfläche **Bearbeiten**
|
||||||
|
(nur für die Person, die das Tool angelegt hat, sowie für Admins).
|
||||||
|
|
||||||
|
Die Bearbeitungsseite (`/tools/:id/edit`) enthält dieselben Felder wie beim
|
||||||
|
Anlegen (Name, Kategorie, Website/Icon-URL, Beschreibung, Features, Tags) —
|
||||||
|
bereits mit den aktuellen Werten befüllt.
|
||||||
|
|
||||||
|
- **Speichern** übernimmt die Änderungen.
|
||||||
|
- **Abbrechen** führt zurück zur Detailseite.
|
||||||
|
|
||||||
|
API-Referenz: [`PATCH /tools/{id}`](/docs/reference/endpoints/tools#updateTool).
|
||||||
|
|
||||||
|
## Löschen
|
||||||
|
|
||||||
|
Über **Löschen** auf der Detailseite wird das Tool entfernt. Das Verhalten
|
||||||
|
hängt von deinem Tarif ab:
|
||||||
|
|
||||||
|
- **Mit Papierkorb-Zugang** (Premium/Enterprise oder Admin): Das Tool wird
|
||||||
|
**soft gelöscht** — es verschwindet aus allen öffentlichen Ansichten, kann
|
||||||
|
aber im [Papierkorb](/docs/handbook/papierkorb) wiederhergestellt oder
|
||||||
|
endgültig gelöscht werden.
|
||||||
|
- **Ohne Papierkorb-Zugang:** Das Tool wird **endgültig** gelöscht und kann
|
||||||
|
nicht wiederhergestellt werden.
|
||||||
|
|
||||||
|
Die Löschung ist nur für die Person, die das Tool angelegt hat, sowie für
|
||||||
|
Admins möglich.
|
||||||
|
|
||||||
|
API-Referenz: [`DELETE /tools/{id}`](/docs/reference/endpoints/tools#deleteTool).
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
# Edit & delete tools
|
||||||
|
|
||||||
|
## Editing
|
||||||
|
|
||||||
|
On the detail page of a tool you will find the **Edit** button
|
||||||
|
(only for the person who created the tool, as well as for admins).
|
||||||
|
|
||||||
|
The edit page (`/tools/:id/edit`) contains the same fields as when
|
||||||
|
creating (name, category, website/icon URL, description, features, tags) —
|
||||||
|
already filled with the current values.
|
||||||
|
|
||||||
|
- **Save** applies the changes.
|
||||||
|
- **Cancel** takes you back to the detail page.
|
||||||
|
|
||||||
|
API reference: [`PATCH /tools/{id}`](/docs/reference/endpoints/tools#updateTool).
|
||||||
|
|
||||||
|
## Deleting
|
||||||
|
|
||||||
|
Via **Delete** on the detail page the tool is removed. The behavior
|
||||||
|
depends on your plan:
|
||||||
|
|
||||||
|
- **With trash access** (Premium/Enterprise or Admin): the tool is
|
||||||
|
**soft deleted** — it disappears from all public views, but can
|
||||||
|
be restored or permanently deleted in the [trash](/docs/handbook/papierkorb).
|
||||||
|
- **Without trash access:** the tool is **permanently** deleted and cannot
|
||||||
|
be restored.
|
||||||
|
|
||||||
|
Deletion is only possible for the person who created the tool, as well as
|
||||||
|
for admins.
|
||||||
|
|
||||||
|
API reference: [`DELETE /tools/{id}`](/docs/reference/endpoints/tools#deleteTool).
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
|
||||||
|
# Tools finden & durchsuchen
|
||||||
|
|
||||||
|
Der Bereich **Tools durchsuchen** (`/tools`) ist der Einstieg in den Katalog.
|
||||||
|
Hier kombinierst du Suche, Filter und Sortierung, um genau die Tools zu finden,
|
||||||
|
die dich interessieren.
|
||||||
|
|
||||||
|
## Suche
|
||||||
|
|
||||||
|
- Die **Suchleiste** durchsucht Name und Beschreibung (Volltext).
|
||||||
|
- Tastenkürzel: Drücke **`/`**, um die Suche zu fokussieren.
|
||||||
|
- Die Eingabe ist deaktiviert (Debounce), damit bei jedem Tastendruck sofort
|
||||||
|
nachgefiltert wird.
|
||||||
|
|
||||||
|
## Filtern
|
||||||
|
|
||||||
|
Über die Schaltfläche **Filter** (mit Badge für die Anzahl aktiver Filter)
|
||||||
|
öffnest du den Filter-Popover mit:
|
||||||
|
|
||||||
|
- **Tags** — Auswahl über Checkboxen (scrollbare Liste).
|
||||||
|
- **Features** — Auswahl über Checkboxen.
|
||||||
|
- **Mindestbewertung** — Schieberegler von 0 bis 5 (Schritte von 0,5); zeigt
|
||||||
|
z. B. „3.0+" an.
|
||||||
|
|
||||||
|
Aktive Filter erscheinen als **entfernbare Chips** über der Ergebnisliste.
|
||||||
|
Mit **Filter zurücksetzen** bzw. **Alle entfernen** räumst du sie wieder auf.
|
||||||
|
|
||||||
|
## Sortieren
|
||||||
|
|
||||||
|
Über das Dropdown **Sortieren** stehen folgende Optionen zur Verfügung:
|
||||||
|
|
||||||
|
| Sortierung | Beschreibung |
|
||||||
|
| --- | --- |
|
||||||
|
| Neueste | Neue Tools zuerst |
|
||||||
|
| Top bewertet | Nach kombinierter Bewertung |
|
||||||
|
| Meistbewertet | Nach Anzahl der Bewertungen |
|
||||||
|
| Name (A–Z) | Alphabetisch aufsteigend |
|
||||||
|
| Name (Z–A) | Alphabetisch absteigend |
|
||||||
|
| Zuletzt aktualisiert | Nach letztem Update |
|
||||||
|
|
||||||
|
## Ansicht & Dichte
|
||||||
|
|
||||||
|
- **Ansicht wechseln:** Raster / Tabelle / Zeilen.
|
||||||
|
- **Dichte:** gemütlich / kompakt (Schieberegler).
|
||||||
|
|
||||||
|
Deine Auswahl wird gespeichert — lokal im Browser und für angemeldete Nutzer
|
||||||
|
zusätzlich serverseitig in den Präferenzen. Ansicht, Dichte, Suche, Filter und
|
||||||
|
Sortierung werden dabei in die URL übernommen, sodass du Ergebnisse teilen
|
||||||
|
kannst.
|
||||||
|
|
||||||
|
## Tabellenansicht
|
||||||
|
|
||||||
|
In der Tabellenansicht sind die Spalten **Tool**, **Bewertung** und **Anzahl
|
||||||
|
Bewertungen** sortierbar. Beim Überfahren einer Zeile erscheint eine Vorschau
|
||||||
|
mit Bewertungsdetails, Tags und Mini-Balken.
|
||||||
|
|
||||||
|
## Auswählen für Vergleich & Merkliste
|
||||||
|
|
||||||
|
- Auf jeder Karte/Zeile findest du ein **Vergleichs-Icon**, mit dem du Tools zur
|
||||||
|
[Vergleichsleiste](/docs/handbook/vergleichen) hinzufügst.
|
||||||
|
- Das **Lesezeichen-Icon** speichert Tools in deiner
|
||||||
|
[Merkliste](/docs/handbook/watchlist) (nur mit dem entsprechenden Tarif).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
Alle Such-, Filter- und Sortierparameter entsprechen den Query-Parametern von
|
||||||
|
[`GET /tools`](/docs/reference/endpoints/tools#listTools).
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
|
||||||
|
# Find & browse tools
|
||||||
|
|
||||||
|
The **Browse tools** section (`/tools`) is your entry point to the catalog.
|
||||||
|
Here you combine search, filters and sorting to find exactly the tools
|
||||||
|
you are interested in.
|
||||||
|
|
||||||
|
## Search
|
||||||
|
|
||||||
|
- The **search bar** searches name and description (full text).
|
||||||
|
- Shortcut: Press **`/`** to focus the search.
|
||||||
|
- The input is debounced so that filtering happens immediately with each
|
||||||
|
keystroke.
|
||||||
|
|
||||||
|
## Filter
|
||||||
|
|
||||||
|
Via the **Filter** button (with a badge for the number of active filters)
|
||||||
|
you open the filter popover with:
|
||||||
|
|
||||||
|
- **Tags** — selection via checkboxes (scrollable list).
|
||||||
|
- **Features** — selection via checkboxes.
|
||||||
|
- **Minimum rating** — slider from 0 to 5 (in steps of 0.5); shows
|
||||||
|
e.g. "3.0+".
|
||||||
|
|
||||||
|
Active filters appear as **removable chips** above the result list.
|
||||||
|
Use **Reset filters** or **Remove all** to clear them again.
|
||||||
|
|
||||||
|
## Sort
|
||||||
|
|
||||||
|
The **Sort** dropdown offers the following options:
|
||||||
|
|
||||||
|
| Sort | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| Newest | New tools first |
|
||||||
|
| Top rated | By combined rating |
|
||||||
|
| Most rated | By number of ratings |
|
||||||
|
| Name (A–Z) | Alphabetically ascending |
|
||||||
|
| Name (Z–A) | Alphabetically descending |
|
||||||
|
| Last updated | By last update |
|
||||||
|
|
||||||
|
## View & density
|
||||||
|
|
||||||
|
- **Switch view:** grid / table / rows.
|
||||||
|
- **Density:** comfortable / compact (slider).
|
||||||
|
|
||||||
|
Your selection is saved — locally in the browser and, for logged-in users,
|
||||||
|
additionally on the server in the preferences. View, density, search, filters
|
||||||
|
and sorting are reflected in the URL so you can share results.
|
||||||
|
|
||||||
|
## Table view
|
||||||
|
|
||||||
|
In the table view the columns **Tool**, **Rating** and **Number of
|
||||||
|
ratings** are sortable. Hovering over a row shows a preview
|
||||||
|
with rating details, tags and mini bars.
|
||||||
|
|
||||||
|
## Selecting for comparison & watchlist
|
||||||
|
|
||||||
|
- On every card/row you find a **compare icon** that lets you add tools to the
|
||||||
|
[compare bar](/docs/handbook/vergleichen).
|
||||||
|
- The **bookmark icon** saves tools to your
|
||||||
|
[watchlist](/docs/handbook/watchlist) (only with the corresponding plan).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
All search, filter and sort parameters correspond to the query parameters of
|
||||||
|
[`GET /tools`](/docs/reference/endpoints/tools#listTools).
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
# Vergleichen
|
||||||
|
|
||||||
|
Mit der Vergleichsfunktion stellst du mehrere Tools **nebeneinander** gegenüber —
|
||||||
|
ideal, um eine fundierte Entscheidung zu treffen.
|
||||||
|
|
||||||
|
> Vergleichen ist ein **Premium-Feature** (Premium/Enterprise) und steht Admins
|
||||||
|
> immer zur Verfügung.
|
||||||
|
|
||||||
|
## Tools auswählen
|
||||||
|
|
||||||
|
1. Im Bereich **Tools durchsuchen** klickst du auf jeder Karte/Zeile auf das
|
||||||
|
**Vergleichs-Icon** (Waage).
|
||||||
|
2. Unten erscheint die **Vergleichsleiste** mit den ausgewählten Tools als
|
||||||
|
Chips. Du kannst einzelne Tools entfernen (×) oder die Auswahl leeren.
|
||||||
|
3. Klicke auf **Vergleichen (N)**, um zur Vergleichsansicht zu gelangen.
|
||||||
|
|
||||||
|
> Ohne Premium-Tarif ist der Button gesperrt (Schloss-Icon). Über den
|
||||||
|
> Dialog gelangst du zum Tarifwechsel
|
||||||
|
> (siehe [Pläne & Berechtigungen](/docs/handbook/plaene)).
|
||||||
|
|
||||||
|
## Die Vergleichsansicht
|
||||||
|
|
||||||
|
Die Ansicht zeigt eine Tabelle mit einer Spalte pro Tool. Zeilen:
|
||||||
|
|
||||||
|
| Zeile | Inhalt |
|
||||||
|
| --- | --- |
|
||||||
|
| **Bewertung** | Sterne + Wert (z. B. `4.2/5`) |
|
||||||
|
| **Nützlichkeit** | Wert (X.X/5) |
|
||||||
|
| **Bedienbarkeit** | Wert (X.X/5) |
|
||||||
|
| **Anzahl Bewertungen** | Anzahl |
|
||||||
|
| **Beschreibung** | Text |
|
||||||
|
| **Features** | Badges |
|
||||||
|
| **Tags** | Badges |
|
||||||
|
| **Zuletzt aktualisiert** | Datum |
|
||||||
|
|
||||||
|
Der **beste Wert** pro Zeile wird hervorgehoben (mit Trophäen-Icon).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
Die Vergleichsansicht liest die Daten über
|
||||||
|
[`GET /compare`](/docs/reference/endpoints/tools#listCompareTools).
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
# Compare
|
||||||
|
|
||||||
|
With the compare function you can put several tools **side by side** —
|
||||||
|
ideal for making a well-informed decision.
|
||||||
|
|
||||||
|
> Comparing is a **premium feature** (Premium/Enterprise) and is always
|
||||||
|
> available to admins.
|
||||||
|
|
||||||
|
## Selecting tools
|
||||||
|
|
||||||
|
1. In the **Browse tools** section, click the **compare icon** (scales) on
|
||||||
|
each card/row.
|
||||||
|
2. The **compare bar** appears at the bottom with the selected tools as
|
||||||
|
chips. You can remove individual tools (×) or clear the selection.
|
||||||
|
3. Click **Compare (N)** to go to the compare view.
|
||||||
|
|
||||||
|
> Without a premium plan the button is locked (lock icon). The dialog takes
|
||||||
|
> you to the plan switch
|
||||||
|
> (see [Plans & permissions](/docs/handbook/plaene)).
|
||||||
|
|
||||||
|
## The compare view
|
||||||
|
|
||||||
|
The view shows a table with one column per tool. Rows:
|
||||||
|
|
||||||
|
| Row | Content |
|
||||||
|
| --- | --- |
|
||||||
|
| **Rating** | Stars + value (e.g. `4.2/5`) |
|
||||||
|
| **Usefulness** | Value (X.X/5) |
|
||||||
|
| **Usability** | Value (X.X/5) |
|
||||||
|
| **Number of ratings** | Count |
|
||||||
|
| **Description** | Text |
|
||||||
|
| **Features** | Badges |
|
||||||
|
| **Tags** | Badges |
|
||||||
|
| **Last updated** | Date |
|
||||||
|
|
||||||
|
The **best value** per row is highlighted (with trophy icon).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
The compare view reads the data via
|
||||||
|
[`GET /compare`](/docs/reference/endpoints/tools#listCompareTools).
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
|
||||||
|
# Merkliste
|
||||||
|
|
||||||
|
Die **Merkliste** ist eine persönliche Favoritenliste. Tools darin kannst du
|
||||||
|
jederzeit per Klick wieder aufrufen und vergleichen.
|
||||||
|
|
||||||
|
> Die Merkliste ist ein **Premium-Feature** (Premium/Enterprise) und steht
|
||||||
|
> Admins immer zur Verfügung.
|
||||||
|
|
||||||
|
## Voraussetzung
|
||||||
|
|
||||||
|
Du benötigst einen Tarif mit `watchlist`-Berechtigung. Fehlt diese, erscheint
|
||||||
|
beim Lesezeichen ein Hinweis auf den Tarifwechsel
|
||||||
|
(siehe [Pläne & Berechtigungen](/docs/handbook/plaene)).
|
||||||
|
|
||||||
|
## Tool speichern
|
||||||
|
|
||||||
|
- Auf jeder Karte/Zeile im Bereich **Tools durchsuchen** findest du das
|
||||||
|
**Lesezeichen-Icon**.
|
||||||
|
- Ein Klick speichert das Tool in deiner Merkliste — das Icon wird gefüllt.
|
||||||
|
- Ein erneuter Klick entfernt es wieder.
|
||||||
|
|
||||||
|
## Merkliste ansehen
|
||||||
|
|
||||||
|
Öffne die Merkliste über das Benutzermenü oder die Seitenleiste. Sie zeigt alle
|
||||||
|
gespeicherten Tools als Karten. Das gefüllte Lesezeichen auf einer Karte
|
||||||
|
entfernt das Tool aus der Liste.
|
||||||
|
|
||||||
|
## Wo wird die Merkliste gespeichert?
|
||||||
|
|
||||||
|
Die Merkliste ist eine Liste von Tool-IDs in deinen **Benutzerpräferenzen**.
|
||||||
|
Damit ist sie geräteübergreifend mit deinem Konto verbunden.
|
||||||
|
|
||||||
|
API-Referenz: [`GET /auth/me/watchlist`](/docs/reference/endpoints/auth#getMeMerkliste).
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
|
||||||
|
# Watchlist
|
||||||
|
|
||||||
|
The **watchlist** is a personal favorites list. You can open and compare the
|
||||||
|
tools in it at any time with a click.
|
||||||
|
|
||||||
|
> The watchlist is a **premium feature** (Premium/Enterprise) and is always
|
||||||
|
> available to admins.
|
||||||
|
|
||||||
|
## Prerequisite
|
||||||
|
|
||||||
|
You need a plan with the `watchlist` permission. If it is missing, a note
|
||||||
|
about switching plans appears at the bookmark
|
||||||
|
(see [Plans & permissions](/docs/handbook/plaene)).
|
||||||
|
|
||||||
|
## Saving a tool
|
||||||
|
|
||||||
|
- On every card/row in the **Browse tools** section you will find the
|
||||||
|
**bookmark icon**.
|
||||||
|
- A click saves the tool to your watchlist — the icon becomes filled.
|
||||||
|
- Clicking it again removes it.
|
||||||
|
|
||||||
|
## Viewing the watchlist
|
||||||
|
|
||||||
|
Open the watchlist via the user menu or the sidebar. It shows all saved tools
|
||||||
|
as cards. The filled bookmark on a card removes the tool from the list.
|
||||||
|
|
||||||
|
## Where is the watchlist stored?
|
||||||
|
|
||||||
|
The watchlist is a list of tool IDs in your **user preferences**. This way it
|
||||||
|
is linked to your account across devices.
|
||||||
|
|
||||||
|
API reference: [`GET /auth/me/watchlist`](/docs/reference/endpoints/auth#getMeWatchlist).
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,42 @@
|
|||||||
|
# v0.9.4 — Release Notes
|
||||||
|
|
||||||
|
**Datum:** 2026-08-06 · **Tag:** [`v0.9.4`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.4)
|
||||||
|
|
||||||
|
## Design: Neon-Abschluss (v0.9.3-Feinschliff)
|
||||||
|
|
||||||
|
Feinjustierung des Neon/AI-Looks aus v0.9.3 auf Basis von Nutzerfeedback —
|
||||||
|
dezent, aber deutlich sichtbar.
|
||||||
|
|
||||||
|
- **Bewertungsbalken:** Die Füllung der Bewertungs-/Fortschrittsbalken
|
||||||
|
(z. B. „Bewertungsaufschlüsselung", Karten-Footer) nutzt jetzt einen
|
||||||
|
kräftigen Cyan→Violett-Neon-Verlauf mit hoher Deckkraft. Unterschiede
|
||||||
|
wie **5.0 vs. 4.0** sind dadurch klar erkennbar.
|
||||||
|
- **Fehler-/Destructive-Farben:** Rote Fehlermeldungen, Logout- und
|
||||||
|
Delete-Buttons sind im Dark-Mode deutlich aufgehellt und gut lesbar
|
||||||
|
(kräftiges Rot statt sehr dunkles).
|
||||||
|
- **Buttons:** Primäre Buttons leuchten jetzt dauerhaft dezent (nicht nur
|
||||||
|
beim Hover); destructive Buttons erhalten einen leichten roten Schein.
|
||||||
|
- **Navigation:** Der aktive Menüpunkt in der Seitenleiste wird mit einem
|
||||||
|
Neon-Glow und einem kleinen leuchtenden Balken links hervorgehoben.
|
||||||
|
- **Eingabefelder:** Fokus-Glow verstärkt, damit er auch im Dark-Mode klar
|
||||||
|
sichtbar ist.
|
||||||
|
- **Barrierefreiheit:** Alle Animationen respektieren weiterhin
|
||||||
|
`prefers-reduced-motion`.
|
||||||
|
|
||||||
|
## API-Änderungen
|
||||||
|
|
||||||
|
- Keine.
|
||||||
|
|
||||||
|
## Betrieb / Upgrade
|
||||||
|
|
||||||
|
- **Migration:** keine. **Breaking Changes:** keine.
|
||||||
|
- **Hinweis:** Nur visuelle / CSS-Änderungen, keine funktionalen.
|
||||||
|
|
||||||
|
## Bekannte Einschränkungen
|
||||||
|
|
||||||
|
- Keine im Rahmen dieses Releases.
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
- Commit: [`23e8ac7`](https://git.kubebase.de/admin/tool-evaluator/commit/23e8ac7)
|
||||||
|
- Tag: [`v0.9.4`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.4)
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# v0.9.4 — Release Notes
|
||||||
|
|
||||||
|
**Date:** 2026-08-06 · **Tag:** [`v0.9.4`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.4)
|
||||||
|
|
||||||
|
## Design: Neon polish (v0.9.3 refinement)
|
||||||
|
|
||||||
|
Fine-tuning of the neon/AI look from v0.9.3 based on user feedback — subtle,
|
||||||
|
but clearly visible.
|
||||||
|
|
||||||
|
- **Rating bars:** The fill of rating/progress bars (e.g. "Rating breakdown",
|
||||||
|
card footers) now uses a vivid cyan→violet neon gradient with high opacity.
|
||||||
|
Differences such as **5.0 vs. 4.0** are now easy to tell apart.
|
||||||
|
- **Error/destructive colors:** Red error messages, logout and delete buttons
|
||||||
|
are clearly brightened in dark mode and easy to read (vivid red instead of
|
||||||
|
very dark).
|
||||||
|
- **Buttons:** Primary buttons now glow subtly at all times (not only on
|
||||||
|
hover); destructive buttons get a slight red glow.
|
||||||
|
- **Navigation:** The active menu item in the sidebar is highlighted with a
|
||||||
|
neon glow and a small glowing bar on the left.
|
||||||
|
- **Input fields:** Focus glow is strengthened to be clearly visible in dark
|
||||||
|
mode.
|
||||||
|
- **Accessibility:** All animations still respect `prefers-reduced-motion`.
|
||||||
|
|
||||||
|
## API Changes
|
||||||
|
|
||||||
|
- None.
|
||||||
|
|
||||||
|
## Operations / Upgrade
|
||||||
|
|
||||||
|
- **Migration:** none. **Breaking changes:** none.
|
||||||
|
- **Note:** Visual / CSS-only changes, no functional changes.
|
||||||
|
|
||||||
|
## Known limitations
|
||||||
|
|
||||||
|
- None within the scope of this release.
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
- Commit: [`23e8ac7`](https://git.kubebase.de/admin/tool-evaluator/commit/23e8ac7)
|
||||||
|
- Tag: [`v0.9.4`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.4)
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
|
||||||
|
# Administration
|
||||||
|
|
||||||
|
Der Bereich **Admin** (`/admin`) ist ausschließlich für Admins zugänglich.
|
||||||
|
Ohne Admin-Rolle erscheint eine Zugriffsverweigerung.
|
||||||
|
|
||||||
|
> Oben rechts führt die Schaltfläche **Redundanz-Dashboard** zur automatischen
|
||||||
|
> Doppelungs-Erkennung (siehe [Redundanz](/docs/handbook/redundanz)).
|
||||||
|
|
||||||
|
## Tab „Nutzer"
|
||||||
|
|
||||||
|
Verwaltung der lokalen Konten.
|
||||||
|
|
||||||
|
- **Nutzer hinzufügen:** Benutzername (Pflicht), Passwort (mind. 6 Zeichen),
|
||||||
|
E-Mail (optional), **Rolle** (User/Admin), **Tarif** (Free/Premium/Enterprise).
|
||||||
|
- **Nutzer bearbeiten:** Rolle, Tarif und (für lokale Konten) ein neues Passwort
|
||||||
|
setzen. Für OIDC-Konten wird die Passwortverwaltung im Identitätsanbieter
|
||||||
|
(z. B. Keycloak) angeboten.
|
||||||
|
- **Nutzer löschen:** Entfernt das Konto endgültig (nicht für das eigene Konto).
|
||||||
|
|
||||||
|
API-Referenz:
|
||||||
|
[`POST /users`](/docs/reference/endpoints/users#createUser),
|
||||||
|
[`PATCH /users/{id}`](/docs/reference/endpoints/users#updateUser),
|
||||||
|
[`DELETE /users/{id}`](/docs/reference/endpoints/users#deleteUser).
|
||||||
|
|
||||||
|
## Tab „Tools"
|
||||||
|
|
||||||
|
Zentraler Zugriff auf den Tool-Katalog.
|
||||||
|
|
||||||
|
- **Suchen** nach Tools.
|
||||||
|
- Tools einzeln ansehen, bearbeiten oder in den Papierkorb verschieben.
|
||||||
|
- **Massenaktion:** mehrere Tools auswählen und in den Papierkorb verschieben
|
||||||
|
(Bestätigungsdialog; soft gelöschte Tools sind aus allen öffentlichen Ansichten
|
||||||
|
entfernt und können wiederhergestellt oder endgültig gelöscht werden).
|
||||||
|
- **Importieren** (Premium): über die Schaltfläche **Importieren** oben rechts
|
||||||
|
können mehrere Tools gleichzeitig angelegt werden. Das Format wird automatisch
|
||||||
|
erkannt (CSV, JSON oder YAML); für CSV lässt sich der Trenner wählen
|
||||||
|
(automatisch, Komma, Semikolon oder Tabulator). Die Daten lassen sich direkt
|
||||||
|
ins Formular einfügen oder als Datei hochladen.
|
||||||
|
|
||||||
|
Unterstützte Felder: `name` (Pflicht), `description`, `category`, `websiteUrl`,
|
||||||
|
`iconUrl`, `features`, `tags` (`features`/`tags` sind mit `|` getrennte Listen).
|
||||||
|
|
||||||
|
**CSV-Beispiel:**
|
||||||
|
|
||||||
|
```csv
|
||||||
|
name;description;category;features;tags
|
||||||
|
Grafana;Observability- und Dashboard-Plattform;Monitoring;Dashboards|Alerts;devops
|
||||||
|
Prometheus;Zeitreihen-Datenbank;Monitoring;Metrics;devops
|
||||||
|
```
|
||||||
|
|
||||||
|
**JSON-Beispiel:**
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{ "name": "Grafana", "category": "Monitoring", "features": ["Dashboards"] },
|
||||||
|
{ "name": "Prometheus", "category": "Monitoring" }
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**YAML-Beispiel:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- name: Grafana
|
||||||
|
category: Monitoring
|
||||||
|
features:
|
||||||
|
- Dashboards
|
||||||
|
- name: Prometheus
|
||||||
|
category: Monitoring
|
||||||
|
```
|
||||||
|
|
||||||
|
Eine umfangreichere, fertig importierbare Beispieldatei liegt unter
|
||||||
|
`docs/examples/import-tools.yaml` (24 gängige Enterprise-Tools).
|
||||||
|
|
||||||
|
Beim Import werden einzelne fehlerhafte Zeilen übersprungen und mit Zeilennummer
|
||||||
|
aufgelistet; korrekte Zeilen werden trotzdem angelegt. Jeder Import erzeugt
|
||||||
|
Audit-Log-Einträge.
|
||||||
|
|
||||||
|
## Tab „Audit-Log"
|
||||||
|
|
||||||
|
Chronologisches Protokoll aller Anlage-, Änderungs- und Löschvorgänge
|
||||||
|
(max. 100 Einträge): Aktion, Entität + ID, Zeitstempel, ausführende Person und
|
||||||
|
geänderte Felder.
|
||||||
|
|
||||||
|
API-Referenz: [`GET /audit-logs`](/docs/reference/endpoints/audit#listAuditLogs).
|
||||||
|
|
||||||
|
## Tab „System"
|
||||||
|
|
||||||
|
Versionsinformationen der laufenden Instanz:
|
||||||
|
|
||||||
|
- **Version** (z. B. `v0.8.1`),
|
||||||
|
- **Commit** (7-stelliger SHA, verlinkt zum Repository),
|
||||||
|
- **Build-Datum**,
|
||||||
|
- **Papierkorb-Aufbewahrung** („N Tage" oder „Für immer").
|
||||||
|
|
||||||
|
## Tool-Verknüpfungen (Admin)
|
||||||
|
|
||||||
|
Auf der Detailseite eines Tools kannst du als Admin **Verknüpfungen**
|
||||||
|
(eigene/„manual" sowie automatisch erkannte) verwalten:
|
||||||
|
|
||||||
|
- **Tool verknüpfen:** Dialog mit Tool-ID, **Beziehungstyp**
|
||||||
|
(Ähnlich / Ersetzt / Abgelöst durch) und optionalen Notizen.
|
||||||
|
- Beziehungstypen werden als Badges auf der Detailseite angezeigt.
|
||||||
|
- Manuelle Verknüpfungen lassen sich per Papierkorb-Icon wieder entfernen.
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
|
||||||
|
# Administration
|
||||||
|
|
||||||
|
The **Admin** area (`/admin`) is exclusively accessible to admins.
|
||||||
|
Without the admin role, access is denied.
|
||||||
|
|
||||||
|
> At the top right, the **Redundancy dashboard** button leads to the automatic
|
||||||
|
> duplicate detection (see [Redundancy](/docs/handbook/redundanz)).
|
||||||
|
|
||||||
|
## "Users" tab
|
||||||
|
|
||||||
|
Management of local accounts.
|
||||||
|
|
||||||
|
- **Add user:** username (required), password (at least 6 characters),
|
||||||
|
email (optional), **role** (User/Admin), **plan** (Free/Premium/Enterprise).
|
||||||
|
- **Edit user:** set role, plan and (for local accounts) a new password.
|
||||||
|
For OIDC accounts, password management is offered in the identity provider
|
||||||
|
(e.g. Keycloak).
|
||||||
|
- **Delete user:** permanently removes the account (not for your own account).
|
||||||
|
|
||||||
|
API reference:
|
||||||
|
[`POST /users`](/docs/reference/endpoints/users#createUser),
|
||||||
|
[`PATCH /users/{id}`](/docs/reference/endpoints/users#updateUser),
|
||||||
|
[`DELETE /users/{id}`](/docs/reference/endpoints/users#deleteUser).
|
||||||
|
|
||||||
|
## "Tools" tab
|
||||||
|
|
||||||
|
Central access to the tool catalog.
|
||||||
|
|
||||||
|
- **Search** for tools.
|
||||||
|
- View, edit or move individual tools to the trash.
|
||||||
|
- **Bulk action:** select multiple tools and move them to the trash
|
||||||
|
(confirmation dialog; soft-deleted tools are removed from all public views
|
||||||
|
and can be restored or permanently deleted).
|
||||||
|
- **Import** (premium): via the **Import** button at the top right, multiple
|
||||||
|
tools can be created at once. The format is detected automatically (CSV,
|
||||||
|
JSON or YAML); for CSV the delimiter can be chosen (auto-detect, comma,
|
||||||
|
semicolon or tab). Data can be pasted directly into the form or uploaded
|
||||||
|
as a file.
|
||||||
|
|
||||||
|
Supported fields: `name` (required), `description`, `category`, `websiteUrl`,
|
||||||
|
`iconUrl`, `features`, `tags` (`features`/`tags` are `|`-separated lists).
|
||||||
|
|
||||||
|
**CSV example:**
|
||||||
|
|
||||||
|
```csv
|
||||||
|
name;description;category;features;tags
|
||||||
|
Grafana;Observability and dashboard platform;Monitoring;Dashboards|Alerts;devops
|
||||||
|
Prometheus;Time-series database;Monitoring;Metrics;devops
|
||||||
|
```
|
||||||
|
|
||||||
|
**JSON example:**
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{ "name": "Grafana", "category": "Monitoring", "features": ["Dashboards"] },
|
||||||
|
{ "name": "Prometheus", "category": "Monitoring" }
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**YAML example:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- name: Grafana
|
||||||
|
category: Monitoring
|
||||||
|
features:
|
||||||
|
- Dashboards
|
||||||
|
- name: Prometheus
|
||||||
|
category: Monitoring
|
||||||
|
```
|
||||||
|
|
||||||
|
A larger, ready-to-import example file is located at
|
||||||
|
`docs/examples/import-tools.yaml` (24 common enterprise tools).
|
||||||
|
|
||||||
|
During import, individual faulty rows are skipped and listed with their row
|
||||||
|
number; correct rows are still created. Every import produces audit-log
|
||||||
|
entries.
|
||||||
|
|
||||||
|
## "Audit log" tab
|
||||||
|
|
||||||
|
Chronological log of all creation, change and deletion operations
|
||||||
|
(max. 100 entries): action, entity + ID, timestamp, executing person and
|
||||||
|
changed fields.
|
||||||
|
|
||||||
|
API reference: [`GET /audit-logs`](/docs/reference/endpoints/audit#listAuditLogs).
|
||||||
|
|
||||||
|
## "System" tab
|
||||||
|
|
||||||
|
Version information of the running instance:
|
||||||
|
|
||||||
|
- **Version** (e.g. `v0.8.1`),
|
||||||
|
- **Commit** (7-digit SHA, linked to the repository),
|
||||||
|
- **Build date**,
|
||||||
|
- **Trash retention** ("N days" or "Forever").
|
||||||
|
|
||||||
|
## Tool links (Admin)
|
||||||
|
|
||||||
|
On the detail page of a tool you can manage **links** as an admin
|
||||||
|
(own/"manual" as well as automatically detected ones):
|
||||||
|
|
||||||
|
- **Link tool:** dialog with tool ID, **relationship type**
|
||||||
|
(Similar / Replaces / Superseded by) and optional notes.
|
||||||
|
- Relationship types are displayed as badges on the detail page.
|
||||||
|
- Manual links can be removed again via the trash icon.
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
# Analytics
|
||||||
|
|
||||||
|
Der Bereich **Analytics** (`/analytics`) ist ein öffentliches Dashboard mit
|
||||||
|
Kennzahlen und Diagrammen auf Basis aller Tools und Bewertungen.
|
||||||
|
|
||||||
|
## Kennzahlen (KPI-Karten)
|
||||||
|
|
||||||
|
- **Anzahl Tools** — wie viele Tools sind im Katalog erfasst.
|
||||||
|
- **Anzahl Bewertungen** — wie viele Bewertungen wurden insgesamt abgegeben.
|
||||||
|
- **Aktive Kategorien** — wie viele Kategorien existieren.
|
||||||
|
- **Durchschnittliche Bewertung** — globaler kombinierter Wert.
|
||||||
|
|
||||||
|
## Diagramme
|
||||||
|
|
||||||
|
| Diagramm | Inhalt |
|
||||||
|
| --- | --- |
|
||||||
|
| **Top 8 Tools** | Balkendiagramm der Tools mit der höchsten kombinierten Punktzahl (0–5) |
|
||||||
|
| **Tools je Kategorie** | Radar-Diagramm der Tool-Anzahl pro Kategorie |
|
||||||
|
| **Punkteverteilung** | Zwei horizontale Balken-Diagramme (Nützlichkeit & Bedienbarkeit) pro Stern |
|
||||||
|
|
||||||
|
Die Diagramme sind interaktiv (Tooltips beim Überfahren).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`GET /analytics/summary`](/docs/reference/endpoints/analytics#getAnalyticsSummary)
|
||||||
|
- [`GET /analytics/top-tools`](/docs/reference/endpoints/analytics#getTopTools)
|
||||||
|
- [`GET /analytics/by-category`](/docs/reference/endpoints/analytics#getAnalyticsByCategory)
|
||||||
|
- [`GET /analytics/rating-distribution`](/docs/reference/endpoints/analytics#getRatingDistribution)
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
# Analytics
|
||||||
|
|
||||||
|
The **Analytics** area (`/analytics`) is a public dashboard with
|
||||||
|
metrics and charts based on all tools and ratings.
|
||||||
|
|
||||||
|
## Metrics (KPI cards)
|
||||||
|
|
||||||
|
- **Number of tools** — how many tools are recorded in the catalog.
|
||||||
|
- **Number of ratings** — how many ratings were submitted in total.
|
||||||
|
- **Active categories** — how many categories exist.
|
||||||
|
- **Average rating** — global combined value.
|
||||||
|
|
||||||
|
## Charts
|
||||||
|
|
||||||
|
| Chart | Content |
|
||||||
|
| --- | --- |
|
||||||
|
| **Top 8 tools** | Bar chart of the tools with the highest combined score (0–5) |
|
||||||
|
| **Tools per category** | Radar chart of the number of tools per category |
|
||||||
|
| **Score distribution** | Two horizontal bar charts (usefulness & usability) per star |
|
||||||
|
|
||||||
|
The charts are interactive (tooltips on hover).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`GET /analytics/summary`](/docs/reference/endpoints/analytics#getAnalyticsSummary)
|
||||||
|
- [`GET /analytics/top-tools`](/docs/reference/endpoints/analytics#getTopTools)
|
||||||
|
- [`GET /analytics/by-category`](/docs/reference/endpoints/analytics#getAnalyticsByCategory)
|
||||||
|
- [`GET /analytics/rating-distribution`](/docs/reference/endpoints/analytics#getRatingDistribution)
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
# Bewerten
|
||||||
|
|
||||||
|
Auf der Detailseite eines Tools kannst du deine Erfahrung teilen. Klicke auf
|
||||||
|
**Bewertung abgeben** (erfordert ein Konto).
|
||||||
|
|
||||||
|
## Formularfelder
|
||||||
|
|
||||||
|
| Feld | Pflicht | Hinweise |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **Nützlichkeit** | Ja | 1–5 Sterne |
|
||||||
|
| **Bedienbarkeit** | Ja | 1–5 Sterne |
|
||||||
|
| **Kommentar** | Nein | Freitext |
|
||||||
|
| **Name** | Nein | Standard „Anonym" |
|
||||||
|
|
||||||
|
Neben den Feldern führt das **?‑Icon** direkt zur zugehörigen Feldbeschreibung
|
||||||
|
in der [Datenmodell-Referenz](/docs/reference/schemas/ratinginput).
|
||||||
|
|
||||||
|
## Was passiert nach dem Abgeben?
|
||||||
|
|
||||||
|
- Deine Bewertung wird sofort gespeichert und erscheint in der
|
||||||
|
**Bewertungsliste** der Detailseite.
|
||||||
|
- Die **Durchschnittswerte** (Nützlichkeit, Bedienbarkeit, Kombiniert) und die
|
||||||
|
**Punkteverteilung** werden aktualisiert.
|
||||||
|
- Die **Statistiken** im Bereich [Analytics](/docs/handbook/analytics) werden
|
||||||
|
neu berechnet.
|
||||||
|
|
||||||
|
## Statistik-Bereiche auf der Detailseite
|
||||||
|
|
||||||
|
- **Bewertungsübersicht:** Nützlichkeit & Bedienbarkeit als Durchschnitt mit
|
||||||
|
Fortschrittsbalken.
|
||||||
|
- **Punkteverteilung:** Anzahl der Bewertungen pro Stern (1★–5★).
|
||||||
|
- **Verlauf:** Linienchart der kombinierten/Teilwerte über die Zeit
|
||||||
|
(erst ab mehreren Bewertungen sichtbar).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`POST /tools/{id}/ratings`](/docs/reference/endpoints/ratings#createRating) — Bewertung abgeben
|
||||||
|
- [`GET /tools/{id}/ratings`](/docs/reference/endpoints/ratings#listToolRatings) — Bewertungen eines Tools
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
# Rating
|
||||||
|
|
||||||
|
On the detail page of a tool you can share your experience. Click on
|
||||||
|
**Submit a rating** (requires an account).
|
||||||
|
|
||||||
|
## Form fields
|
||||||
|
|
||||||
|
| Field | Required | Notes |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **Usefulness** | Yes | 1–5 stars |
|
||||||
|
| **Usability** | Yes | 1–5 stars |
|
||||||
|
| **Comment** | No | Free text |
|
||||||
|
| **Name** | No | Defaults to "Anonymous" |
|
||||||
|
|
||||||
|
Next to the fields, the **? icon** links directly to the associated field
|
||||||
|
description in the [data model reference](/docs/reference/schemas/ratinginput).
|
||||||
|
|
||||||
|
## What happens after submitting?
|
||||||
|
|
||||||
|
- Your rating is saved immediately and appears in the **rating list** of the
|
||||||
|
detail page.
|
||||||
|
- The **averages** (usefulness, usability, combined) and the **score
|
||||||
|
distribution** are updated.
|
||||||
|
- The **statistics** in the [Analytics](/docs/handbook/analytics) section are
|
||||||
|
recalculated.
|
||||||
|
|
||||||
|
## Statistic sections on the detail page
|
||||||
|
|
||||||
|
- **Rating overview:** usefulness & usability as an average with progress
|
||||||
|
bars.
|
||||||
|
- **Score distribution:** number of ratings per star (1★–5★).
|
||||||
|
- **History:** line chart of combined/individual values over time
|
||||||
|
(only visible once there are several ratings).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`POST /tools/{id}/ratings`](/docs/reference/endpoints/ratings#createRating) — Submit a rating
|
||||||
|
- [`GET /tools/{id}/ratings`](/docs/reference/endpoints/ratings#listToolRatings) — Ratings of a tool
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
|
||||||
|
# Datenmodell
|
||||||
|
|
||||||
|
Dieses Kapitel erklärt die zentralen Datenobjekte von toolr auf Ebene der
|
||||||
|
Anwendung. Die vollständige, automatisch generierte Referenz aller Felder,
|
||||||
|
Typen und Constraints findest du in der
|
||||||
|
[API-Referenz](/docs/reference/schemas/tool).
|
||||||
|
|
||||||
|
## Tool
|
||||||
|
|
||||||
|
Das Herzstück: ein im Katalog erfasstes Werkzeug.
|
||||||
|
|
||||||
|
| Eigenschaft | Beschreibung |
|
||||||
|
| --- | --- |
|
||||||
|
| `id` | Eindeutige Kennung |
|
||||||
|
| `name` | Anzeigename |
|
||||||
|
| `description` | Beschreibung (Was macht das Tool?) |
|
||||||
|
| `category` | Kategorie-Zuordnung |
|
||||||
|
| `websiteUrl` | Offizielle Website (optional) |
|
||||||
|
| `iconUrl` | Logo-/Icon-URL (optional) |
|
||||||
|
| `features` | Liste von Fähigkeiten |
|
||||||
|
| `tags` | Liste von Schlagwörtern |
|
||||||
|
| `createdAt` / `updatedAt` | Zeitstempel |
|
||||||
|
| `createdBy` | Erstellende Person |
|
||||||
|
| `deletedAt` / `deletedBy` | Soft-Löschung (Papierkorb) |
|
||||||
|
|
||||||
|
Eingabe-Formulare verwenden die abgeleiteten Schemas
|
||||||
|
[`ToolInput`](/docs/reference/schemas/toolinput) und
|
||||||
|
[`ToolUpdate`](/docs/reference/schemas/toolupdate).
|
||||||
|
Aggregierte Ansichten liefert [`ToolWithStats`](/docs/reference/schemas/toolwithstats)
|
||||||
|
(z. B. mit Durchschnittsbewertung).
|
||||||
|
|
||||||
|
## Rating (Bewertung)
|
||||||
|
|
||||||
|
Eine einzelne Bewertung zu einem Tool:
|
||||||
|
|
||||||
|
- `usefulness` (Nützlichkeit, 1–5) und `usability` (Bedienbarkeit, 1–5)
|
||||||
|
- optional `comment` und ein Anzeigename (`reviewerName`)
|
||||||
|
- Zeitstempel
|
||||||
|
|
||||||
|
Eingabe-Schema: [`RatingInput`](/docs/reference/schemas/ratinginput).
|
||||||
|
|
||||||
|
## User & Auth
|
||||||
|
|
||||||
|
- [`User`](/docs/reference/schemas/user) — Benutzerkonto mit Rolle (User/Admin)
|
||||||
|
und Tarif (Free/Premium/Enterprise).
|
||||||
|
- [`AuthUser`](/docs/reference/schemas/authuser) — das angemeldete Profil
|
||||||
|
inklusive `entitlements` (verfügbare Features).
|
||||||
|
- [`UserPreferences`](/docs/reference/schemas/userpreferences) — Ansichts- und
|
||||||
|
Dichte-Präferenzen sowie die `watchlist` (Liste von Tool-IDs).
|
||||||
|
|
||||||
|
## Analytics
|
||||||
|
|
||||||
|
Die Statistik-Endpunkte liefern aggregierte Daten:
|
||||||
|
|
||||||
|
- [`AnalyticsSummary`](/docs/reference/schemas/analyticssummary) — globale
|
||||||
|
Kennzahlen (Anzahl Tools/Bewertungen, Kategorien, Durchschnitt).
|
||||||
|
- [`TopToolEntry`](/docs/reference/schemas/TopToolEntry) — ein Eintrag der
|
||||||
|
Top-Tools.- [`CategoryStats`](/docs/reference/schemas/categorystats) — Tool-Anzahl je
|
||||||
|
Kategorie.
|
||||||
|
- [`RatingDistribution`](/docs/reference/schemas/ratingdistribution) —
|
||||||
|
Punkteverteilung (Nützlichkeit & Bedienbarkeit).
|
||||||
|
- [`ScoreBucket`](/docs/reference/schemas/scorebucket) — ein Werte-Bucket.
|
||||||
|
|
||||||
|
## Weitere
|
||||||
|
|
||||||
|
- [`VersionInfo`](/docs/reference/schemas/versioninfo) — Version, Commit-SHA,
|
||||||
|
Build-Datum und Papierkorb-Aufbewahrung der laufenden Instanz.
|
||||||
|
- [`AuditLog`](/docs/reference/schemas/auditlog) — ein Protokolleintrag
|
||||||
|
(Aktion, Entität, Zeitstempel, Akteur, Änderungen).
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
|
||||||
|
# Data model
|
||||||
|
|
||||||
|
This chapter explains the central data objects of toolr at the application
|
||||||
|
level. The complete, automatically generated reference of all fields,
|
||||||
|
types and constraints can be found in the
|
||||||
|
[API reference](/docs/reference/schemas/tool).
|
||||||
|
|
||||||
|
## Tool
|
||||||
|
|
||||||
|
The heart of it all: a tool recorded in the catalog.
|
||||||
|
|
||||||
|
| Property | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| `id` | Unique identifier |
|
||||||
|
| `name` | Display name |
|
||||||
|
| `description` | Description (what does the tool do?) |
|
||||||
|
| `category` | Category assignment |
|
||||||
|
| `websiteUrl` | Official website (optional) |
|
||||||
|
| `iconUrl` | Logo/icon URL (optional) |
|
||||||
|
| `features` | List of capabilities |
|
||||||
|
| `tags` | List of keywords |
|
||||||
|
| `createdAt` / `updatedAt` | Timestamps |
|
||||||
|
| `createdBy` | Person who created it |
|
||||||
|
| `deletedAt` / `deletedBy` | Soft deletion (trash) |
|
||||||
|
|
||||||
|
Input forms use the derived schemas
|
||||||
|
[`ToolInput`](/docs/reference/schemas/toolinput) and
|
||||||
|
[`ToolUpdate`](/docs/reference/schemas/toolupdate).
|
||||||
|
Aggregated views are provided by [`ToolWithStats`](/docs/reference/schemas/toolwithstats)
|
||||||
|
(e.g. with average rating).
|
||||||
|
|
||||||
|
## Rating (Bewertung)
|
||||||
|
|
||||||
|
A single rating for a tool:
|
||||||
|
|
||||||
|
- `usefulness` (Nützlichkeit, 1–5) and `usability` (Bedienbarkeit, 1–5)
|
||||||
|
- optional `comment` and a display name (`reviewerName`)
|
||||||
|
- timestamp
|
||||||
|
|
||||||
|
Input schema: [`RatingInput`](/docs/reference/schemas/ratinginput).
|
||||||
|
|
||||||
|
## User & Auth
|
||||||
|
|
||||||
|
- [`User`](/docs/reference/schemas/user) — user account with role (User/Admin)
|
||||||
|
and plan (Free/Premium/Enterprise).
|
||||||
|
- [`AuthUser`](/docs/reference/schemas/authuser) — the logged-in profile
|
||||||
|
including `entitlements` (available features).
|
||||||
|
- [`UserPreferences`](/docs/reference/schemas/userpreferences) — view and
|
||||||
|
density preferences as well as the `watchlist` (list of tool IDs).
|
||||||
|
|
||||||
|
## Analytics
|
||||||
|
|
||||||
|
The statistics endpoints provide aggregated data:
|
||||||
|
|
||||||
|
- [`AnalyticsSummary`](/docs/reference/schemas/analyticssummary) — global
|
||||||
|
metrics (number of tools/ratings, categories, average).
|
||||||
|
- [`TopToolEntry`](/docs/reference/schemas/TopToolEntry) — an entry of the
|
||||||
|
top tools.- [`CategoryStats`](/docs/reference/schemas/categorystats) — number of tools per
|
||||||
|
category.
|
||||||
|
- [`RatingDistribution`](/docs/reference/schemas/ratingdistribution) —
|
||||||
|
score distribution (usefulness & usability).
|
||||||
|
- [`ScoreBucket`](/docs/reference/schemas/scorebucket) — a value bucket.
|
||||||
|
|
||||||
|
## Additional
|
||||||
|
|
||||||
|
- [`VersionInfo`](/docs/reference/schemas/versioninfo) — version, commit SHA,
|
||||||
|
build date and trash retention of the running instance.
|
||||||
|
- [`AuditLog`](/docs/reference/schemas/auditlog) — a log entry
|
||||||
|
(action, entity, timestamp, actor, changes).
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
# Erste Schritte
|
||||||
|
|
||||||
|
Diese Seite führt dich durch die wichtigsten Abläufe in toolr — vom ersten
|
||||||
|
Besuch bis zum Anlegen und Bewerten eines Tools.
|
||||||
|
|
||||||
|
## 1. Anmelden
|
||||||
|
|
||||||
|
Die meisten Aktionen (Tool anlegen, bewerten, Merkliste, Vergleichen) erfordern
|
||||||
|
ein Konto. Klicke unten links auf **Anmelden**. Je nach Konfiguration der
|
||||||
|
Instanz hast du zwei Möglichkeiten:
|
||||||
|
|
||||||
|
- **Lokale Konten:** Benutzername + Passwort. Der Zugang wird von einem Admin
|
||||||
|
angelegt (siehe [Administration](/docs/handbook/administration)).
|
||||||
|
- **OIDC (SSO):** Anmelden mit dem konfigurierten Identitätsanbieter (z. B.
|
||||||
|
Keycloak).
|
||||||
|
|
||||||
|
Welcher Modus aktiv ist, steht im Endpunkt
|
||||||
|
[`GET /auth/mode`](/docs/reference/endpoints/auth#getAuthMode). Details findest
|
||||||
|
du im Abschnitt [Anmelden & Konto](/docs/handbook/konto).
|
||||||
|
|
||||||
|
## 2. Tools finden
|
||||||
|
|
||||||
|
Öffne den Bereich **Tools durchsuchen**:
|
||||||
|
|
||||||
|
- **Suchen** — Volltextsuche über Name & Beschreibung (Tastenkürzel `/`).
|
||||||
|
- **Filtern** — nach Kategorie, Tags, Features und Mindestbewertung
|
||||||
|
(`minRating`).
|
||||||
|
- **Sortieren** — nach Aktualität, Top-Bewertung, meistbewertet, Name
|
||||||
|
(auf-/absteigend) oder letztem Update.
|
||||||
|
|
||||||
|
Alle Optionen im Detail: [Tools finden & durchsuchen](/docs/handbook/tools-finden).
|
||||||
|
|
||||||
|
## 3. Tool anlegen
|
||||||
|
|
||||||
|
Gehe auf **Tool hinzufügen** und fülle das Formular aus. Details zu jedem Feld
|
||||||
|
findest du im Abschnitt [Tool anlegen](/docs/handbook/tool-anlegen) und in der
|
||||||
|
[Feld-Referenz](/docs/reference/schemas/toolinput).
|
||||||
|
|
||||||
|
## 4. Bewerten
|
||||||
|
|
||||||
|
Auf der Detailseite eines Tools kannst du **Nützlichkeit** und **Bedienbarkeit**
|
||||||
|
(jeweils 1–5) vergeben und optional einen Kommentar hinterlassen. Deine
|
||||||
|
Bewertung fließt sofort in die Statistiken ein.
|
||||||
|
Siehe [Bewerten](/docs/handbook/bewerten).
|
||||||
|
|
||||||
|
## 5. Weiterführend
|
||||||
|
|
||||||
|
- [Tools vergleichen](/docs/handbook/vergleichen)
|
||||||
|
- [Merkliste](/docs/handbook/watchlist)
|
||||||
|
- [Analytics](/docs/handbook/analytics)
|
||||||
|
- [Pläne & Berechtigungen](/docs/handbook/plaene)
|
||||||
|
- [Administration](/docs/handbook/administration)
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
# Getting Started
|
||||||
|
|
||||||
|
This page guides you through the most important workflows in toolr — from your
|
||||||
|
first visit to creating and rating a tool.
|
||||||
|
|
||||||
|
## 1. Sign in
|
||||||
|
|
||||||
|
Most actions (create a tool, rate, watchlist, compare) require
|
||||||
|
an account. Click **Sign in** in the bottom left corner. Depending on the
|
||||||
|
instance configuration you have two options:
|
||||||
|
|
||||||
|
- **Local accounts:** username + password. Access is created by an admin
|
||||||
|
(see [Administration](/docs/handbook/administration)).
|
||||||
|
- **OIDC (SSO):** sign in with the configured identity provider (e.g.
|
||||||
|
Keycloak).
|
||||||
|
|
||||||
|
Which mode is active is shown by the
|
||||||
|
[`GET /auth/mode`](/docs/reference/endpoints/auth#getAuthMode) endpoint. Details
|
||||||
|
can be found in the [Sign in & account](/docs/handbook/konto) section.
|
||||||
|
|
||||||
|
## 2. Find tools
|
||||||
|
|
||||||
|
Open the **Browse tools** section:
|
||||||
|
|
||||||
|
- **Search** — full-text search across name & description (shortcut `/`).
|
||||||
|
- **Filter** — by category, tags, features and minimum rating
|
||||||
|
(`minRating`).
|
||||||
|
- **Sort** — by newest, top-rated, most rated, name
|
||||||
|
(ascending/descending) or last update.
|
||||||
|
|
||||||
|
All options in detail: [Find & browse tools](/docs/handbook/tools-finden).
|
||||||
|
|
||||||
|
## 3. Create a tool
|
||||||
|
|
||||||
|
Go to **Add tool** and fill in the form. Details for each field can be found
|
||||||
|
in the [Create a tool](/docs/handbook/tool-anlegen) section and in the
|
||||||
|
[field reference](/docs/reference/schemas/toolinput).
|
||||||
|
|
||||||
|
## 4. Rate
|
||||||
|
|
||||||
|
On the detail page of a tool you can submit **usefulness** and **usability**
|
||||||
|
(1–5 each) and optionally leave a comment. Your
|
||||||
|
rating is immediately reflected in the statistics.
|
||||||
|
See [Rating](/docs/handbook/bewerten).
|
||||||
|
|
||||||
|
## 5. Further reading
|
||||||
|
|
||||||
|
- [Compare tools](/docs/handbook/vergleichen)
|
||||||
|
- [Watchlist](/docs/handbook/watchlist)
|
||||||
|
- [Analytics](/docs/handbook/analytics)
|
||||||
|
- [Plans & permissions](/docs/handbook/plaene)
|
||||||
|
- [Administration](/docs/handbook/administration)
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
# Willkommen bei toolr
|
||||||
|
|
||||||
|
toolr ist eine Plattform zum **Entdecken, Bewerten und Vergleichen von
|
||||||
|
Entwicklungstools**. Nutzer pflegen einen gemeinsamen Katalog von Tools,
|
||||||
|
vergeben Bewertungen (Nützlichkeit & Bedienbarkeit) und nutzen Statistiken, um
|
||||||
|
die richtige Wahl zu treffen.
|
||||||
|
|
||||||
|
## Was kannst du mit toolr tun?
|
||||||
|
|
||||||
|
| Funktion | Beschreibung | Sichtbarkeit |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **Tools durchsuchen** | Katalog filtern, sortieren und durchsuchen | Alle |
|
||||||
|
| **Tool anlegen** | Neues Tool mit Beschreibung, Kategorie, Features & Tags eintragen | Angemeldet |
|
||||||
|
| **Tool bearbeiten/löschen** | Eigene Tools pflegen (Ersteller oder Admin) | Angemeldet |
|
||||||
|
| **Bewerten** | Nützlichkeit & Bedienbarkeit (1–5) plus Kommentar vergeben | Angemeldet |
|
||||||
|
| **Merkliste** | Tools als Favoriten speichern | Premium |
|
||||||
|
| **Vergleichen** | Tools nebeneinander gegenüberstellen | Premium |
|
||||||
|
| **Kosten erfassen** | Lizenz- und Kostenmodelle je Tool eintragen | Premium |
|
||||||
|
| **Analytics** | Statistiken, Top-Tools, Verteilungen | Alle |
|
||||||
|
| **Papierkorb** | Soft-gelöschte Tools wiederherstellen oder endgültig löschen | Premium |
|
||||||
|
| **Import** | Mehrere Tools per CSV, JSON oder YAML anlegen | Admin (Premium) |
|
||||||
|
| **Admin** | Nutzerverwaltung, Audit-Log, Systeminformationen | Admin |
|
||||||
|
| **Redundanz** | Automatische Doppelungs-Erkennung | Admin |
|
||||||
|
|
||||||
|
## Wie diese Doku aufgebaut ist
|
||||||
|
|
||||||
|
- **User Guide** (diese Seiten): Schritt-für-Schritt-Anleitungen für alle
|
||||||
|
Funktionen — von den [Ersten Schritten](/docs/handbook/getting-started) bis
|
||||||
|
zur [Administration](/docs/handbook/administration).
|
||||||
|
- **API-Referenz**: automatisch aus der OpenAPI-Spezifikation generiert — alle
|
||||||
|
[Endpunkte](/docs/reference/endpoints/tools) und
|
||||||
|
[Datenfelder](/docs/reference/schemas/toolinput) der aktuellen Version.
|
||||||
|
- **Release-Notes**: Was ist in welcher [Version](/docs/releases/v0.8.1) neu.
|
||||||
|
|
||||||
|
## Der Einstieg
|
||||||
|
|
||||||
|
Der schnellste Weg:
|
||||||
|
|
||||||
|
1. **Anmelden** — ohne Konto kannst du nur stöbern
|
||||||
|
(siehe [Erste Schritte](/docs/handbook/getting-started#1-anmelden)).
|
||||||
|
2. **Tools finden** — Suche, Filter und Sortierung im Bereich
|
||||||
|
[Tools durchsuchen](/docs/handbook/tools-finden).
|
||||||
|
3. **Tool anlegen** — über „Tool hinzufügen"
|
||||||
|
([Anleitung](/docs/handbook/tool-anlegen)).
|
||||||
|
4. **Bewerten** — auf der Detailseite eines Tools
|
||||||
|
([Anleitung](/docs/handbook/bewerten)).
|
||||||
|
|
||||||
|
## Kontakt & Quellcode
|
||||||
|
|
||||||
|
Der Quellcode liegt unter
|
||||||
|
[git.kubebase.de/admin/tool-evaluator](https://git.kubebase.de/admin/tool-evaluator) —
|
||||||
|
über das Repository-Icon oben rechts erreichst du ihn jederzeit.
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
# Welcome to toolr
|
||||||
|
|
||||||
|
toolr is a platform for **discovering, rating and comparing development
|
||||||
|
tools**. Users maintain a shared catalog of tools, submit ratings
|
||||||
|
(usefulness & usability) and use statistics to make the right choice.
|
||||||
|
|
||||||
|
## What can you do with toolr?
|
||||||
|
|
||||||
|
| Function | Description | Visibility |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **Browse tools** | Filter, sort and search the catalog | Everyone |
|
||||||
|
| **Create a tool** | Add a new tool with description, category, features & tags | Logged in |
|
||||||
|
| **Edit/delete tools** | Maintain your own tools (creator or admin) | Logged in |
|
||||||
|
| **Rate** | Submit usefulness & usability (1–5) plus a comment | Logged in |
|
||||||
|
| **Watchlist** | Save tools as favorites | Premium |
|
||||||
|
| **Compare** | View tools side by side | Premium |
|
||||||
|
| **Record costs** | Enter license and cost models per tool | Premium |
|
||||||
|
| **Analytics** | Statistics, top tools, distributions | Everyone |
|
||||||
|
| **Trash** | Restore soft-deleted tools or delete them permanently | Premium |
|
||||||
|
| **Import** | Create multiple tools via CSV, JSON or YAML | Admin (premium) |
|
||||||
|
| **Admin** | User management, audit log, system information | Admin |
|
||||||
|
| **Redundancy detection** | Automatic duplicate detection | Admin |
|
||||||
|
|
||||||
|
## How this documentation is organized
|
||||||
|
|
||||||
|
- **User Guide** (these pages): step-by-step instructions for all
|
||||||
|
functions — from the [Getting Started](/docs/handbook/getting-started) to
|
||||||
|
[Administration](/docs/handbook/administration).
|
||||||
|
- **API Reference**: automatically generated from the OpenAPI specification —
|
||||||
|
all [endpoints](/docs/reference/endpoints/tools) and
|
||||||
|
[data fields](/docs/reference/schemas/toolinput) of the current version.
|
||||||
|
- **Release Notes**: what is new in each [version](/docs/releases/v0.8.1).
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
|
||||||
|
The fastest way:
|
||||||
|
|
||||||
|
1. **Sign in** — without an account you can only browse
|
||||||
|
(see [Getting Started](/docs/handbook/getting-started#1-anmelden)).
|
||||||
|
2. **Find tools** — search, filters and sorting in the
|
||||||
|
[Browse tools](/docs/handbook/tools-finden) section.
|
||||||
|
3. **Create a tool** — via "Add tool"
|
||||||
|
([guide](/docs/handbook/tool-anlegen)).
|
||||||
|
4. **Rate** — on the detail page of a tool
|
||||||
|
([guide](/docs/handbook/bewerten)).
|
||||||
|
|
||||||
|
## Contact & source code
|
||||||
|
|
||||||
|
The source code is available at
|
||||||
|
[git.kubebase.de/admin/tool-evaluator](https://git.kubebase.de/admin/tool-evaluator) —
|
||||||
|
you can reach it at any time via the repository icon in the top right corner.
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"slug": "index",
|
||||||
|
"file": "index.de.md",
|
||||||
|
"title": "Überblick",
|
||||||
|
"order": 1,
|
||||||
|
"fileEn": "index.en.md",
|
||||||
|
"titleEn": "Overview"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "getting-started",
|
||||||
|
"file": "getting-started.de.md",
|
||||||
|
"title": "Erste Schritte",
|
||||||
|
"order": 2,
|
||||||
|
"fileEn": "getting-started.en.md",
|
||||||
|
"titleEn": "Getting Started"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "konto",
|
||||||
|
"file": "konto.de.md",
|
||||||
|
"title": "Anmelden & Konto",
|
||||||
|
"order": 3,
|
||||||
|
"fileEn": "konto.en.md",
|
||||||
|
"titleEn": "Login & Account"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "tools-finden",
|
||||||
|
"file": "tools-finden.de.md",
|
||||||
|
"title": "Tools finden & durchsuchen",
|
||||||
|
"order": 4,
|
||||||
|
"fileEn": "tools-finden.en.md",
|
||||||
|
"titleEn": "Find & browse tools"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "tool-anlegen",
|
||||||
|
"file": "tool-anlegen.de.md",
|
||||||
|
"title": "Tool anlegen",
|
||||||
|
"order": 5,
|
||||||
|
"fileEn": "tool-anlegen.en.md",
|
||||||
|
"titleEn": "Create a tool"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "tool-bearbeiten",
|
||||||
|
"file": "tool-bearbeiten.de.md",
|
||||||
|
"title": "Tool bearbeiten & löschen",
|
||||||
|
"order": 6,
|
||||||
|
"fileEn": "tool-bearbeiten.en.md",
|
||||||
|
"titleEn": "Edit & delete tools"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "bewerten",
|
||||||
|
"file": "bewerten.de.md",
|
||||||
|
"title": "Bewerten",
|
||||||
|
"order": 7,
|
||||||
|
"fileEn": "bewerten.en.md",
|
||||||
|
"titleEn": "Rating"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "watchlist",
|
||||||
|
"file": "watchlist.de.md",
|
||||||
|
"title": "Merkliste",
|
||||||
|
"order": 8,
|
||||||
|
"fileEn": "watchlist.en.md",
|
||||||
|
"titleEn": "Watchlist"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "vergleichen",
|
||||||
|
"file": "vergleichen.de.md",
|
||||||
|
"title": "Vergleichen",
|
||||||
|
"order": 9,
|
||||||
|
"fileEn": "vergleichen.en.md",
|
||||||
|
"titleEn": "Compare"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "analytics",
|
||||||
|
"file": "analytics.de.md",
|
||||||
|
"title": "Analytics",
|
||||||
|
"order": 10,
|
||||||
|
"fileEn": "analytics.en.md",
|
||||||
|
"titleEn": "Analytics"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "plaene",
|
||||||
|
"file": "plaene.de.md",
|
||||||
|
"title": "Pläne & Berechtigungen",
|
||||||
|
"order": 11,
|
||||||
|
"fileEn": "plaene.en.md",
|
||||||
|
"titleEn": "Plans & Permissions"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "kosten",
|
||||||
|
"file": "kosten.de.md",
|
||||||
|
"title": "Kosten erfassen",
|
||||||
|
"order": 12,
|
||||||
|
"fileEn": "kosten.en.md",
|
||||||
|
"titleEn": "Recording Costs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "administration",
|
||||||
|
"file": "administration.de.md",
|
||||||
|
"title": "Administration",
|
||||||
|
"order": 13,
|
||||||
|
"fileEn": "administration.en.md",
|
||||||
|
"titleEn": "Administration"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "redundanz",
|
||||||
|
"file": "redundanz.de.md",
|
||||||
|
"title": "Redundanz-Dashboard",
|
||||||
|
"order": 14,
|
||||||
|
"fileEn": "redundanz.en.md",
|
||||||
|
"titleEn": "Redundancy dashboard"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "papierkorb",
|
||||||
|
"file": "papierkorb.de.md",
|
||||||
|
"title": "Papierkorb",
|
||||||
|
"order": 15,
|
||||||
|
"fileEn": "papierkorb.en.md",
|
||||||
|
"titleEn": "Trash"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "tastatur",
|
||||||
|
"file": "tastatur.de.md",
|
||||||
|
"title": "Tastenkürzel & Kommandopalette",
|
||||||
|
"order": 16,
|
||||||
|
"fileEn": "tastatur.en.md",
|
||||||
|
"titleEn": "Keyboard shortcuts & command palette"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slug": "datenmodell",
|
||||||
|
"file": "datenmodell.de.md",
|
||||||
|
"title": "Datenmodell",
|
||||||
|
"order": 17,
|
||||||
|
"fileEn": "datenmodell.en.md",
|
||||||
|
"titleEn": "Data model"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
# Anmelden & Konto
|
||||||
|
|
||||||
|
## Anmelden
|
||||||
|
|
||||||
|
Klicke unten links in der Seitenleiste auf **Anmelden**. Je nach Konfiguration
|
||||||
|
der Instanz:
|
||||||
|
|
||||||
|
- **Lokale Konten:** Benutzername und Passwort eingeben. Die Konten werden von
|
||||||
|
einem Admin angelegt (siehe [Administration](/docs/handbook/administration)).
|
||||||
|
- **OIDC (SSO):** Du wirst an den konfigurierten Identitätsanbieter
|
||||||
|
weitergeleitet und meldest dich dort an.
|
||||||
|
|
||||||
|
Der aktive Modus steht im Endpunkt
|
||||||
|
[`GET /auth/mode`](/docs/reference/endpoints/auth#getAuthMode).
|
||||||
|
|
||||||
|
> Die Login-Seite erreichst du direkt unter `/login`. Nach erfolgreicher
|
||||||
|
> Anmeldung wirst du zur ursprünglich aufgerufenen Seite zurückgeleitet.
|
||||||
|
|
||||||
|
## Benutzerprofil
|
||||||
|
|
||||||
|
Dein Profil (Avatar, Name, E-Mail, Tarif) siehst du unten links im
|
||||||
|
Benutzermenü. Dort stehen dir folgende Aktionen zur Verfügung:
|
||||||
|
|
||||||
|
- **Merkliste** — deine gespeicherten Tools (nur mit dem entsprechenden Tarif).
|
||||||
|
- **Papierkorb** — wiederherstellbare, gelöschte Tools (Premium/Enterprise).
|
||||||
|
- **Passwort ändern** — für lokale Konten direkt in toolr; für OIDC-Konten wird
|
||||||
|
die Passwortverwaltung im Identitätsanbieter angeboten.
|
||||||
|
- **Abmelden** — beendet deine Sitzung.
|
||||||
|
|
||||||
|
## Passwort ändern (lokales Konto)
|
||||||
|
|
||||||
|
1. Öffne das Benutzermenü unten links.
|
||||||
|
2. Wähle **Passwort ändern**.
|
||||||
|
3. Gib das **aktuelle** sowie ein **neues** Passwort ein (mind. 6 Zeichen) und
|
||||||
|
bestätige es.
|
||||||
|
4. Speichern — das Passwort wird sofort übernommen.
|
||||||
|
|
||||||
|
API-Referenz: [`POST /auth/me/password`](/docs/reference/endpoints/auth#changeMyPassword).
|
||||||
|
|
||||||
|
## Anzeigeeinstellungen
|
||||||
|
|
||||||
|
Über die Schaltflächen oben rechts kannst du:
|
||||||
|
|
||||||
|
- **Sprache** wechseln (Deutsch / Englisch),
|
||||||
|
- **Theme** umschalten (Hell / Dunkel / System),
|
||||||
|
- die **Listenansicht** und **Dichte** im Bereich Tools durchsuchen anpassen
|
||||||
|
(siehe [Tools finden & durchsuchen](/docs/handbook/tools-finden)).
|
||||||
|
|
||||||
|
Deine Präferenzen (inkl. Merkliste) werden im Endpunkt
|
||||||
|
[`GET /auth/me/preferences`](/docs/reference/endpoints/auth#getMePreferences)
|
||||||
|
gespeichert und über [`PUT /auth/me/preferences`](/docs/reference/endpoints/auth#updateMePreferences)
|
||||||
|
aktualisiert.
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
# Login & Account
|
||||||
|
|
||||||
|
## Logging in
|
||||||
|
|
||||||
|
Click **Login** at the bottom left of the sidebar. Depending on the
|
||||||
|
configuration of the instance:
|
||||||
|
|
||||||
|
- **Local accounts:** enter username and password. The accounts are created
|
||||||
|
by an admin (see [Administration](/docs/handbook/administration)).
|
||||||
|
- **OIDC (SSO):** you are redirected to the configured identity provider and
|
||||||
|
log in there.
|
||||||
|
|
||||||
|
The active mode is available at the endpoint
|
||||||
|
[`GET /auth/mode`](/docs/reference/endpoints/auth#getAuthMode).
|
||||||
|
|
||||||
|
> You can reach the login page directly at `/login`. After a successful
|
||||||
|
> login you are redirected back to the page you originally requested.
|
||||||
|
|
||||||
|
## User profile
|
||||||
|
|
||||||
|
You can see your profile (avatar, name, email, plan) at the bottom left in
|
||||||
|
the user menu. There you have the following actions available:
|
||||||
|
|
||||||
|
- **Watchlist** — your saved tools (only with the corresponding plan).
|
||||||
|
- **Trash** — restorable, deleted tools (Premium/Enterprise).
|
||||||
|
- **Change password** — directly in toolr for local accounts; for OIDC
|
||||||
|
accounts, password management is offered in the identity provider.
|
||||||
|
- **Logout** — ends your session.
|
||||||
|
|
||||||
|
## Changing your password (local account)
|
||||||
|
|
||||||
|
1. Open the user menu at the bottom left.
|
||||||
|
2. Select **Change password**.
|
||||||
|
3. Enter the **current** and a **new** password (min. 6 characters) and
|
||||||
|
confirm it.
|
||||||
|
4. Save — the password takes effect immediately.
|
||||||
|
|
||||||
|
API reference: [`POST /auth/me/password`](/docs/reference/endpoints/auth#changeMyPassword).
|
||||||
|
|
||||||
|
## Display settings
|
||||||
|
|
||||||
|
Using the buttons at the top right you can:
|
||||||
|
|
||||||
|
- switch the **language** (German / English),
|
||||||
|
- toggle the **theme** (Light / Dark / System),
|
||||||
|
- adjust the **list view** and **density** in the Browse tools section
|
||||||
|
(see [Finding & browsing tools](/docs/handbook/tools-finden)).
|
||||||
|
|
||||||
|
Your preferences (incl. watchlist) are saved at the endpoint
|
||||||
|
[`GET /auth/me/preferences`](/docs/reference/endpoints/auth#getMePreferences)
|
||||||
|
and updated via [`PUT /auth/me/preferences`](/docs/reference/endpoints/auth#updateMePreferences).
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
# Kosten erfassen
|
||||||
|
|
||||||
|
Auf der Detailseite eines Tools kannst du Kosten- und Lizenzmodelle eintragen,
|
||||||
|
damit die Gesamtkosten je Tool transparent werden.
|
||||||
|
|
||||||
|
> Kosten ist ein **Premium-Feature** (`costs`, Premium/Enterprise). Admins
|
||||||
|
> haben immer Zugriff.
|
||||||
|
|
||||||
|
## Kosten hinzufügen
|
||||||
|
|
||||||
|
Klicke auf **Kosten hinzufügen** im Kosten-Bereich der Detailseite und fülle
|
||||||
|
das Formular aus:
|
||||||
|
|
||||||
|
| Feld | Hinweise |
|
||||||
|
| --- | --- |
|
||||||
|
| **Lizenztyp** | Free / Subscription / One-Time / Usage-Based |
|
||||||
|
| **Abrechnungszeitraum** | Nur für „Subscription": Monatlich / Quartalsweise / Jährlich |
|
||||||
|
| **Kosten** | Betrag als Zahl |
|
||||||
|
| **Währung** | EUR / USD / GBP / CHF |
|
||||||
|
| **Notizen** | Optionaler Freitext |
|
||||||
|
|
||||||
|
Speichern legt den Eintrag an. Jeder Kosten-Eintrag wird als Karte mit
|
||||||
|
Lizenz-Badge, Abrechnungszeitraum, Betrag (`Betrag Währung` bzw. „Free") und
|
||||||
|
Notizen angezeigt.
|
||||||
|
|
||||||
|
## Kosten bearbeiten & löschen
|
||||||
|
|
||||||
|
Beim Überfahren einer Kosten-Karte erscheinen die Aktionen **Bearbeiten**
|
||||||
|
(Bleistift) und **Löschen** (Papierkorb).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
Die Kosten-Daten werden über die Tool-Endpunkte verwaltet
|
||||||
|
(siehe [API-Referenz](/docs/reference/endpoints/tools)).
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
# Recording Costs
|
||||||
|
|
||||||
|
On the detail page of a tool you can enter cost and license models so that
|
||||||
|
the total costs per tool become transparent.
|
||||||
|
|
||||||
|
> Costs is a **premium feature** (`costs`, Premium/Enterprise). Admins always
|
||||||
|
> have access.
|
||||||
|
|
||||||
|
## Adding costs
|
||||||
|
|
||||||
|
Click **Add costs** in the costs section of the detail page and fill out the
|
||||||
|
form:
|
||||||
|
|
||||||
|
| Field | Notes |
|
||||||
|
| --- | --- |
|
||||||
|
| **License type** | Free / Subscription / One-Time / Usage-Based |
|
||||||
|
| **Billing period** | Only for "Subscription": Monthly / Quarterly / Annually |
|
||||||
|
| **Costs** | Amount as a number |
|
||||||
|
| **Currency** | EUR / USD / GBP / CHF |
|
||||||
|
| **Notes** | Optional free text |
|
||||||
|
|
||||||
|
Saving creates the entry. Each cost entry is displayed as a card with
|
||||||
|
license badge, billing period, amount (`Amount Currency` or "Free") and
|
||||||
|
notes.
|
||||||
|
|
||||||
|
## Editing & deleting costs
|
||||||
|
|
||||||
|
Hovering over a cost card shows the **Edit** (pencil) and **Delete** (trash)
|
||||||
|
actions.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
The cost data is managed via the tool endpoints
|
||||||
|
(see [API reference](/docs/reference/endpoints/tools)).
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
|
||||||
|
# Papierkorb
|
||||||
|
|
||||||
|
Der **Papierkorb** (`/trash`) enthält soft gelöschte Tools. Mit Papierkorb-Zugang
|
||||||
|
können sie wiederhergestellt werden; endgültiges Löschen ist Admins vorbehalten.
|
||||||
|
|
||||||
|
> Der Papierkorb ist ein **Premium-Feature** (`trash`, Premium/Enterprise).
|
||||||
|
> Admins haben immer Zugriff.
|
||||||
|
|
||||||
|
## Zugang
|
||||||
|
|
||||||
|
Der Papierkorb ist über das Benutzermenü oder die Seitenleiste erreichbar.
|
||||||
|
Ohne `trash`-Berechtigung erscheint ein Hinweis auf den Tarifwechsel.
|
||||||
|
|
||||||
|
## Wiederherstellen
|
||||||
|
|
||||||
|
- Markiere ein oder mehrere Tools (Checkboxen).
|
||||||
|
- Klicke auf **Wiederherstellen (N)** — die Tools erscheinen wieder in allen
|
||||||
|
öffentlichen Ansichten.
|
||||||
|
|
||||||
|
> Wiederherstellen steht jeder Person mit Papierkorb-Zugang zur Verfügung.
|
||||||
|
|
||||||
|
## Endgültig löschen (nur Admin)
|
||||||
|
|
||||||
|
- **Löschen (N)** entfernt die ausgewählten Tools **endgültig** — inklusive
|
||||||
|
aller Bewertungen, Kosten und Verknüpfungen. Das kann nicht rückgängig
|
||||||
|
gemacht werden.
|
||||||
|
- **Papierkorb leeren** entfernt alle soft gelöschten Tools endgültig.
|
||||||
|
|
||||||
|
## Tabelle
|
||||||
|
|
||||||
|
Der Papierkorb listet: Name, Kategorie, **Gelöscht am** (`tt.MM.jjjj HH:mm`),
|
||||||
|
**Gelöscht von** sowie Aktionen (Wiederherstellen; Löschen nur Admin). Die Suche
|
||||||
|
filtert nach Namen.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`GET /tools/trash`](/docs/reference/endpoints/tools#listTrashedTools) — Liste
|
||||||
|
- [`POST /tools/trash/restore`](/docs/reference/endpoints/tools#restoreTools) — Wiederherstellen
|
||||||
|
- [`DELETE /tools/trash`](/docs/reference/endpoints/tools#deleteTrashedTools) — Endgültig löschen (Admin)
|
||||||
|
- [`POST /tools/trash/empty`](/docs/reference/endpoints/tools#emptyTrash) — Papierkorb leeren (Admin)
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
|
||||||
|
# Trash
|
||||||
|
|
||||||
|
The **trash** (`/trash`) contains soft-deleted tools. With trash access
|
||||||
|
they can be restored; permanent deletion is reserved for admins.
|
||||||
|
|
||||||
|
> The trash is a **premium feature** (`trash`, Premium/Enterprise).
|
||||||
|
> Admins always have access.
|
||||||
|
|
||||||
|
## Access
|
||||||
|
|
||||||
|
The trash can be reached via the user menu or the sidebar.
|
||||||
|
Without the `trash` permission, a hint about changing the plan appears.
|
||||||
|
|
||||||
|
## Restoring
|
||||||
|
|
||||||
|
- Select one or more tools (checkboxes).
|
||||||
|
- Click on **Restore (N)** — the tools appear again in all
|
||||||
|
public views.
|
||||||
|
|
||||||
|
> Restoring is available to anyone with trash access.
|
||||||
|
|
||||||
|
## Permanently delete (admin only)
|
||||||
|
|
||||||
|
- **Delete (N)** **permanently** removes the selected tools — including
|
||||||
|
all ratings, costs and links. This cannot be undone.
|
||||||
|
- **Empty trash** permanently removes all soft-deleted tools.
|
||||||
|
|
||||||
|
## Table
|
||||||
|
|
||||||
|
The trash lists: name, category, **Deleted on** (`tt.MM.jjjj HH:mm`),
|
||||||
|
**Deleted by** as well as actions (Restore; Delete admin only). The search
|
||||||
|
filters by name.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`GET /tools/trash`](/docs/reference/endpoints/tools#listTrashedTools) — list
|
||||||
|
- [`POST /tools/trash/restore`](/docs/reference/endpoints/tools#restoreTools) — restore
|
||||||
|
- [`DELETE /tools/trash`](/docs/reference/endpoints/tools#deleteTrashedTools) — permanently delete (admin)
|
||||||
|
- [`POST /tools/trash/empty`](/docs/reference/endpoints/tools#emptyTrash) — empty trash (admin)
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
# Pläne & Berechtigungen
|
||||||
|
|
||||||
|
toolr unterscheidet **Tarife** (Tier) und **Rollen**. Admins umgehen alle
|
||||||
|
Feature-Beschränkungen.
|
||||||
|
|
||||||
|
## Tarife
|
||||||
|
|
||||||
|
| Tarif | Beschreibung |
|
||||||
|
| --- | --- |
|
||||||
|
| **Free** | Grundfunktionen: suchen, filtern, ansehen, Analytics |
|
||||||
|
| **Premium** | Zusätzlich Merkliste, Vergleichen, Papierkorb, Kosten |
|
||||||
|
| **Enterprise** | Alle Premium-Features + erweiterter Support |
|
||||||
|
|
||||||
|
### Feature-Berechtigungen
|
||||||
|
|
||||||
|
Premium/Enterprise schalten folgende Features frei:
|
||||||
|
|
||||||
|
| Feature | Funktion | Mehr erfahren |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `compare` | Tools vergleichen | [Vergleichen](/docs/handbook/vergleichen) |
|
||||||
|
| `watchlist` | Favoritenliste | [Merkliste](/docs/handbook/watchlist) |
|
||||||
|
| `trash` | Papierkorb (soft gelöschte Tools) | [Papierkorb](/docs/handbook/papierkorb) |
|
||||||
|
| `costs` | Kosten-/Lizenzmodelle erfassen | [Kosten erfassen](/docs/handbook/kosten) |
|
||||||
|
| `tool-import` | Tools per CSV/JSON/YAML importieren (Admin) | [Administration](/docs/handbook/administration) |
|
||||||
|
|
||||||
|
Fehlt dir ein Feature, zeigt die App einen **Upgrade-Hinweis** mit Link zur
|
||||||
|
Tarifverwaltung.
|
||||||
|
|
||||||
|
## Rollen
|
||||||
|
|
||||||
|
| Rolle | Berechtigungen |
|
||||||
|
| --- | --- |
|
||||||
|
| **User** | Standard-Konto: Tools anlegen/bewerten, eigene Tools bearbeiten |
|
||||||
|
| **Admin** | Alle User-Rechte + Verwaltung, Audit-Log, Redundanz, Papierkorb leeren, Tool-Verknüpfungen |
|
||||||
|
|
||||||
|
Admins passieren **alle** Feature-Checks — auch ohne Premium-Tarif.
|
||||||
|
|
||||||
|
## Tarif-/Rollenverwaltung
|
||||||
|
|
||||||
|
Die Zuordnung von Rolle und Tarif wird durch Admins im Bereich
|
||||||
|
[Administration](/docs/handbook/administration) (Tab „Nutzer") verwaltet.
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
# Plans & Permissions
|
||||||
|
|
||||||
|
toolr distinguishes **plans** (tier) and **roles**. Admins bypass all feature
|
||||||
|
restrictions.
|
||||||
|
|
||||||
|
## Plans
|
||||||
|
|
||||||
|
| Plan | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| **Free** | Basic functions: search, filter, view, analytics |
|
||||||
|
| **Premium** | Additionally watchlist, compare, trash, costs |
|
||||||
|
| **Enterprise** | All premium features + extended support |
|
||||||
|
|
||||||
|
### Feature permissions
|
||||||
|
|
||||||
|
Premium/Enterprise unlock the following features:
|
||||||
|
|
||||||
|
| Feature | Function | Learn more |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `compare` | Compare tools | [Compare](/docs/handbook/vergleichen) |
|
||||||
|
| `watchlist` | Favorites list | [Watchlist](/docs/handbook/watchlist) |
|
||||||
|
| `trash` | Trash (soft-deleted tools) | [Trash](/docs/handbook/papierkorb) |
|
||||||
|
| `costs` | Record cost/license models | [Recording costs](/docs/handbook/kosten) |
|
||||||
|
| `tool-import` | Import tools via CSV/JSON/YAML (admin) | [Administration](/docs/handbook/administration) |
|
||||||
|
|
||||||
|
If you are missing a feature, the app shows an **upgrade notice** with a link
|
||||||
|
to the plan management.
|
||||||
|
|
||||||
|
## Roles
|
||||||
|
|
||||||
|
| Role | Permissions |
|
||||||
|
| --- | --- |
|
||||||
|
| **User** | Standard account: create/rate tools, edit your own tools |
|
||||||
|
| **Admin** | All user rights + administration, audit log, redundancy, empty trash, tool links |
|
||||||
|
|
||||||
|
Admins pass **all** feature checks — even without a premium plan.
|
||||||
|
|
||||||
|
## Plan/role management
|
||||||
|
|
||||||
|
The assignment of role and plan is managed by admins in the
|
||||||
|
[Administration](/docs/handbook/administration) section (tab "Users").
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
|
||||||
|
# Redundanz-Dashboard
|
||||||
|
|
||||||
|
Das **Redundanz-Dashboard** (`/admin/redundancy`) ist ein Admin-Werkzeug zur
|
||||||
|
automatischen Erkennung doppelter oder stark überlappender Tools — jeweils
|
||||||
|
pro Kategorie — inklusive Kosten- und Bewertungsvergleich.
|
||||||
|
|
||||||
|
> Der Zugriff ist ausschließlich Admins vorbehalten (die API ist
|
||||||
|
> admin-geschützt).
|
||||||
|
|
||||||
|
## Aufbau
|
||||||
|
|
||||||
|
- **Pro Kategorie** wird eine Gruppe angezeigt: Name der Kategorie,
|
||||||
|
Anzahl Tools und Vergleiche sowie ggf. die **gesamten monatlichen Kosten**
|
||||||
|
(z. B. `€X.XX/mo gesamt`).
|
||||||
|
- Jedes Tool wird als Karte dargestellt: Name, monatliche Kosten, Anzahl der
|
||||||
|
Bewertungen, kombinierte Bewertung, Lizenz-Badges und Feature-Anzahl.
|
||||||
|
|
||||||
|
## Vergleiche & Empfehlungen
|
||||||
|
|
||||||
|
Für jedes Tool-Paar erscheint:
|
||||||
|
|
||||||
|
- Tool A vs. Tool B, jeweils mit Bewertung (`X.X ★`) und monatlichen Kosten.
|
||||||
|
- **Überlappung** in Prozent (Fortschrittsbalken in der Mitte).
|
||||||
|
- Eine **Empfehlung** mit Konfidenz-Farbe:
|
||||||
|
- **hoch** (grün), **mittel** (gelb), **niedrig** (grau)
|
||||||
|
- Das empfohlene, bessere Tool wird mit „Daumen hoch" markiert und begründet.
|
||||||
|
|
||||||
|
## Manuelle Bewertung
|
||||||
|
|
||||||
|
Du kannst ein Paar manuell bewerten: Klicke auf Tool A oder Tool B, um
|
||||||
|
festzuhalten, welches besser ist. Die Auswahl wird gespeichert und die
|
||||||
|
Darstellung aktualisiert.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`GET /api/admin/redundancy`](#) — Daten laden (admin-geschützt)
|
||||||
|
- [`POST /api/admin/redundancy/evaluate`](#) — manuelle Bewertung speichern
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
|
||||||
|
# Redundancy dashboard
|
||||||
|
|
||||||
|
The **Redundancy dashboard** (`/admin/redundancy`) is an admin tool for
|
||||||
|
automatic detection of duplicate or strongly overlapping tools — per
|
||||||
|
category — including cost and rating comparison.
|
||||||
|
|
||||||
|
> Access is reserved exclusively for admins (the API is
|
||||||
|
> admin-protected).
|
||||||
|
|
||||||
|
## Layout
|
||||||
|
|
||||||
|
- **Per category** a group is shown: name of the category,
|
||||||
|
number of tools and comparisons as well as the **total monthly costs**
|
||||||
|
if applicable (e.g. `€X.XX/mo total`).
|
||||||
|
- Each tool is displayed as a card: name, monthly costs, number of
|
||||||
|
ratings, combined rating, license badges and number of features.
|
||||||
|
|
||||||
|
## Comparisons & recommendations
|
||||||
|
|
||||||
|
For each tool pair the following appears:
|
||||||
|
|
||||||
|
- Tool A vs. Tool B, each with rating (`X.X ★`) and monthly costs.
|
||||||
|
- **Overlap** in percent (progress bar in the middle).
|
||||||
|
- A **recommendation** with confidence color:
|
||||||
|
- **high** (green), **medium** (yellow), **low** (gray)
|
||||||
|
- The recommended, better tool is marked with a "thumbs up" and justified.
|
||||||
|
|
||||||
|
## Manual rating
|
||||||
|
|
||||||
|
You can rate a pair manually: click on Tool A or Tool B to
|
||||||
|
record which one is better. The selection is saved and the
|
||||||
|
display is updated.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`GET /api/admin/redundancy`](#) — load data (admin-protected)
|
||||||
|
- [`POST /api/admin/redundancy/evaluate`](#) — save manual rating
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
|
||||||
|
# Tastenkürzel & Kommandopalette
|
||||||
|
|
||||||
|
## Kommandopalette
|
||||||
|
|
||||||
|
Die Kommandopalette ist die zentrale Schnellnavigation:
|
||||||
|
|
||||||
|
- Öffnen mit **`⌘K`** (macOS) bzw. **`Ctrl+K`** (Windows/Linux).
|
||||||
|
- Alternativ über die Suchleiste oben rechts („Tools suchen… ⌘K") oder das
|
||||||
|
Such-Icon auf Mobilgeräten.
|
||||||
|
|
||||||
|
### Leerer Zustand
|
||||||
|
|
||||||
|
Ohne Eingabe zeigt die Palette:
|
||||||
|
|
||||||
|
- **Zuletzt angesehen** — die letzten 5 Tools, die du besucht hast.
|
||||||
|
- **Navigation** — Tools durchsuchen, Tool hinzufügen, Analytics sowie
|
||||||
|
(abhängig von Berechtigungen) Merkliste, Papierkorb und Admin.
|
||||||
|
|
||||||
|
### Suche
|
||||||
|
|
||||||
|
Tippe, um live nach Tools zu suchen (max. 10 Ergebnisse, inkl. Bewertung
|
||||||
|
`X.X★`).
|
||||||
|
|
||||||
|
## Tastenkürzel im Überblick
|
||||||
|
|
||||||
|
| Kürzel | Aktion |
|
||||||
|
| --- | --- |
|
||||||
|
| `⌘K` / `Ctrl+K` | Kommandopalette öffnen |
|
||||||
|
| `/` | Suche im Bereich „Tools durchsuchen" fokussieren |
|
||||||
|
|
||||||
|
## Weitere Hinweise
|
||||||
|
|
||||||
|
- **Zuletzt angesehen** wird lokal im Browser gespeichert (max. 5 Einträge).
|
||||||
|
- Die Seitenleiste (linke Navigation) ist auf Desktop einklappbar; der
|
||||||
|
Breadcrumb oben zeigt deinen aktuellen Ort.
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
|
||||||
|
# Keyboard shortcuts & command palette
|
||||||
|
|
||||||
|
## Command palette
|
||||||
|
|
||||||
|
The command palette is the central quick navigation:
|
||||||
|
|
||||||
|
- Open with **`⌘K`** (macOS) or **`Ctrl+K`** (Windows/Linux).
|
||||||
|
- Alternatively via the search bar at the top right ("Search tools… ⌘K") or the
|
||||||
|
search icon on mobile devices.
|
||||||
|
|
||||||
|
### Empty state
|
||||||
|
|
||||||
|
Without input, the palette shows:
|
||||||
|
|
||||||
|
- **Recently viewed** — the last 5 tools you visited.
|
||||||
|
- **Navigation** — browse tools, add tool, analytics as well as
|
||||||
|
(depending on permissions) watchlist, trash and admin.
|
||||||
|
|
||||||
|
### Search
|
||||||
|
|
||||||
|
Type to search for tools live (max. 10 results, incl. rating
|
||||||
|
`X.X★`).
|
||||||
|
|
||||||
|
## Overview of keyboard shortcuts
|
||||||
|
|
||||||
|
| Shortcut | Action |
|
||||||
|
| --- | --- |
|
||||||
|
| `⌘K` / `Ctrl+K` | Open command palette |
|
||||||
|
| `/` | Focus search in the "Browse tools" area |
|
||||||
|
|
||||||
|
## Additional notes
|
||||||
|
|
||||||
|
- **Recently viewed** is stored locally in the browser (max. 5 entries).
|
||||||
|
- The sidebar (left navigation) can be collapsed on desktop; the
|
||||||
|
breadcrumb at the top shows your current location.
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
# Tool anlegen
|
||||||
|
|
||||||
|
Um ein neues Tool zum Katalog hinzuzufügen, klicke auf **Tool hinzufügen**
|
||||||
|
(`/tools/new`). Das Anlegen erfordert ein Konto — ohne Anmeldung erscheint ein
|
||||||
|
Hinweis mit Login-Button.
|
||||||
|
|
||||||
|
## Formularfelder
|
||||||
|
|
||||||
|
| Feld | Pflicht | Hinweise |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **Name** | Ja | Mind. 2 Zeichen |
|
||||||
|
| **Kategorie** | Ja | Auswahlliste; neue Kategorien lassen sich direkt anlegen |
|
||||||
|
| **Website URL** | Nein | Gültige URL (z. B. `https://...`) |
|
||||||
|
| **Icon / Logo URL** | Nein | Gültige URL; Vorschau wird live angezeigt |
|
||||||
|
| **Beschreibung** | Ja | Mind. 10 Zeichen; beschreibe, was das Tool tut |
|
||||||
|
| **Features** | Nein | Dynamische Liste mit Autovervollständigung (max. 6) |
|
||||||
|
| **Tags** | Nein | Dynamische Liste mit Autovervollständigung |
|
||||||
|
|
||||||
|
Neben jedem Feld führt das **?‑Icon** direkt zur zugehörigen Feldbeschreibung
|
||||||
|
in der [Datenmodell-Referenz](/docs/reference/schemas/toolinput).
|
||||||
|
|
||||||
|
### Kategorie
|
||||||
|
|
||||||
|
- Tippe, um nach bestehenden Kategorien zu suchen.
|
||||||
|
- Wähle **+ Erstelle „..."**, um eine neue Kategorie anzulegen.
|
||||||
|
|
||||||
|
### Features & Tags
|
||||||
|
|
||||||
|
- **Feature hinzufügen** / **Tag hinzufügen** hängt eine neue Zeile an.
|
||||||
|
- Die Eingabefelder schlagen bestehende Features/Tags vor
|
||||||
|
(Autovervollständigung, max. 6 Vorschläge).
|
||||||
|
- Mit dem **×**‑Button entfernst du einzelne Zeilen.
|
||||||
|
- Features und Tags helfen beim Filtern und Wiederfinden.
|
||||||
|
|
||||||
|
## Speichern
|
||||||
|
|
||||||
|
Klicke auf **Tool hinzufügen**. Nach erfolgreicher Anlage wirst du auf die
|
||||||
|
Detailseite des neuen Tools weitergeleitet.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`POST /tools`](/docs/reference/endpoints/tools#createTool) — Tool anlegen
|
||||||
|
- [`GET /categories`](/docs/reference/endpoints/tools#listCategories) — Kategorien
|
||||||
|
- [`GET /features/all`](/docs/reference/endpoints/tools#listAllFeatures) — Features
|
||||||
|
- [`GET /tags/all`](/docs/reference/endpoints/tools#listAllTags) — Tags
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
# Create a tool
|
||||||
|
|
||||||
|
To add a new tool to the catalog, click **Add tool**
|
||||||
|
(`/tools/new`). Creating a tool requires an account — without being signed in
|
||||||
|
a notice with a login button appears.
|
||||||
|
|
||||||
|
## Form fields
|
||||||
|
|
||||||
|
| Field | Required | Notes |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **Name** | Yes | At least 2 characters |
|
||||||
|
| **Category** | Yes | Dropdown; new categories can be created directly |
|
||||||
|
| **Website URL** | No | Valid URL (e.g. `https://...`) |
|
||||||
|
| **Icon / Logo URL** | No | Valid URL; preview is shown live |
|
||||||
|
| **Description** | Yes | At least 10 characters; describe what the tool does |
|
||||||
|
| **Features** | No | Dynamic list with autocomplete (max. 6) |
|
||||||
|
| **Tags** | No | Dynamic list with autocomplete |
|
||||||
|
|
||||||
|
Next to each field, the **? icon** takes you directly to the corresponding
|
||||||
|
field description in the [data model reference](/docs/reference/schemas/toolinput).
|
||||||
|
|
||||||
|
### Category
|
||||||
|
|
||||||
|
- Type to search for existing categories.
|
||||||
|
- Select **+ Create "..."** to create a new category.
|
||||||
|
|
||||||
|
### Features & tags
|
||||||
|
|
||||||
|
- **Add feature** / **Add tag** appends a new row.
|
||||||
|
- The input fields suggest existing features/tags
|
||||||
|
(autocomplete, max. 6 suggestions).
|
||||||
|
- Use the **×** button to remove individual rows.
|
||||||
|
- Features and tags help with filtering and finding tools again.
|
||||||
|
|
||||||
|
## Save
|
||||||
|
|
||||||
|
Click **Add tool**. After successful creation you will be redirected to the
|
||||||
|
detail page of the new tool.
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
- [`POST /tools`](/docs/reference/endpoints/tools#createTool) — create a tool
|
||||||
|
- [`GET /categories`](/docs/reference/endpoints/tools#listCategories) — categories
|
||||||
|
- [`GET /features/all`](/docs/reference/endpoints/tools#listAllFeatures) — features
|
||||||
|
- [`GET /tags/all`](/docs/reference/endpoints/tools#listAllTags) — tags
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
|
||||||
|
# Tool bearbeiten & löschen
|
||||||
|
|
||||||
|
## Bearbeiten
|
||||||
|
|
||||||
|
Auf der Detailseite eines Tools findest du die Schaltfläche **Bearbeiten**
|
||||||
|
(nur für die Person, die das Tool angelegt hat, sowie für Admins).
|
||||||
|
|
||||||
|
Die Bearbeitungsseite (`/tools/:id/edit`) enthält dieselben Felder wie beim
|
||||||
|
Anlegen (Name, Kategorie, Website/Icon-URL, Beschreibung, Features, Tags) —
|
||||||
|
bereits mit den aktuellen Werten befüllt.
|
||||||
|
|
||||||
|
- **Speichern** übernimmt die Änderungen.
|
||||||
|
- **Abbrechen** führt zurück zur Detailseite.
|
||||||
|
|
||||||
|
API-Referenz: [`PATCH /tools/{id}`](/docs/reference/endpoints/tools#updateTool).
|
||||||
|
|
||||||
|
## Löschen
|
||||||
|
|
||||||
|
Über **Löschen** auf der Detailseite wird das Tool entfernt. Das Verhalten
|
||||||
|
hängt von deinem Tarif ab:
|
||||||
|
|
||||||
|
- **Mit Papierkorb-Zugang** (Premium/Enterprise oder Admin): Das Tool wird
|
||||||
|
**soft gelöscht** — es verschwindet aus allen öffentlichen Ansichten, kann
|
||||||
|
aber im [Papierkorb](/docs/handbook/papierkorb) wiederhergestellt oder
|
||||||
|
endgültig gelöscht werden.
|
||||||
|
- **Ohne Papierkorb-Zugang:** Das Tool wird **endgültig** gelöscht und kann
|
||||||
|
nicht wiederhergestellt werden.
|
||||||
|
|
||||||
|
Die Löschung ist nur für die Person, die das Tool angelegt hat, sowie für
|
||||||
|
Admins möglich.
|
||||||
|
|
||||||
|
API-Referenz: [`DELETE /tools/{id}`](/docs/reference/endpoints/tools#deleteTool).
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
# Edit & delete tools
|
||||||
|
|
||||||
|
## Editing
|
||||||
|
|
||||||
|
On the detail page of a tool you will find the **Edit** button
|
||||||
|
(only for the person who created the tool, as well as for admins).
|
||||||
|
|
||||||
|
The edit page (`/tools/:id/edit`) contains the same fields as when
|
||||||
|
creating (name, category, website/icon URL, description, features, tags) —
|
||||||
|
already filled with the current values.
|
||||||
|
|
||||||
|
- **Save** applies the changes.
|
||||||
|
- **Cancel** takes you back to the detail page.
|
||||||
|
|
||||||
|
API reference: [`PATCH /tools/{id}`](/docs/reference/endpoints/tools#updateTool).
|
||||||
|
|
||||||
|
## Deleting
|
||||||
|
|
||||||
|
Via **Delete** on the detail page the tool is removed. The behavior
|
||||||
|
depends on your plan:
|
||||||
|
|
||||||
|
- **With trash access** (Premium/Enterprise or Admin): the tool is
|
||||||
|
**soft deleted** — it disappears from all public views, but can
|
||||||
|
be restored or permanently deleted in the [trash](/docs/handbook/papierkorb).
|
||||||
|
- **Without trash access:** the tool is **permanently** deleted and cannot
|
||||||
|
be restored.
|
||||||
|
|
||||||
|
Deletion is only possible for the person who created the tool, as well as
|
||||||
|
for admins.
|
||||||
|
|
||||||
|
API reference: [`DELETE /tools/{id}`](/docs/reference/endpoints/tools#deleteTool).
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
|
||||||
|
# Tools finden & durchsuchen
|
||||||
|
|
||||||
|
Der Bereich **Tools durchsuchen** (`/tools`) ist der Einstieg in den Katalog.
|
||||||
|
Hier kombinierst du Suche, Filter und Sortierung, um genau die Tools zu finden,
|
||||||
|
die dich interessieren.
|
||||||
|
|
||||||
|
## Suche
|
||||||
|
|
||||||
|
- Die **Suchleiste** durchsucht Name und Beschreibung (Volltext).
|
||||||
|
- Tastenkürzel: Drücke **`/`**, um die Suche zu fokussieren.
|
||||||
|
- Die Eingabe ist deaktiviert (Debounce), damit bei jedem Tastendruck sofort
|
||||||
|
nachgefiltert wird.
|
||||||
|
|
||||||
|
## Filtern
|
||||||
|
|
||||||
|
Über die Schaltfläche **Filter** (mit Badge für die Anzahl aktiver Filter)
|
||||||
|
öffnest du den Filter-Popover mit:
|
||||||
|
|
||||||
|
- **Tags** — Auswahl über Checkboxen (scrollbare Liste).
|
||||||
|
- **Features** — Auswahl über Checkboxen.
|
||||||
|
- **Mindestbewertung** — Schieberegler von 0 bis 5 (Schritte von 0,5); zeigt
|
||||||
|
z. B. „3.0+" an.
|
||||||
|
|
||||||
|
Aktive Filter erscheinen als **entfernbare Chips** über der Ergebnisliste.
|
||||||
|
Mit **Filter zurücksetzen** bzw. **Alle entfernen** räumst du sie wieder auf.
|
||||||
|
|
||||||
|
## Sortieren
|
||||||
|
|
||||||
|
Über das Dropdown **Sortieren** stehen folgende Optionen zur Verfügung:
|
||||||
|
|
||||||
|
| Sortierung | Beschreibung |
|
||||||
|
| --- | --- |
|
||||||
|
| Neueste | Neue Tools zuerst |
|
||||||
|
| Top bewertet | Nach kombinierter Bewertung |
|
||||||
|
| Meistbewertet | Nach Anzahl der Bewertungen |
|
||||||
|
| Name (A–Z) | Alphabetisch aufsteigend |
|
||||||
|
| Name (Z–A) | Alphabetisch absteigend |
|
||||||
|
| Zuletzt aktualisiert | Nach letztem Update |
|
||||||
|
|
||||||
|
## Ansicht & Dichte
|
||||||
|
|
||||||
|
- **Ansicht wechseln:** Raster / Tabelle / Zeilen.
|
||||||
|
- **Dichte:** gemütlich / kompakt (Schieberegler).
|
||||||
|
|
||||||
|
Deine Auswahl wird gespeichert — lokal im Browser und für angemeldete Nutzer
|
||||||
|
zusätzlich serverseitig in den Präferenzen. Ansicht, Dichte, Suche, Filter und
|
||||||
|
Sortierung werden dabei in die URL übernommen, sodass du Ergebnisse teilen
|
||||||
|
kannst.
|
||||||
|
|
||||||
|
## Tabellenansicht
|
||||||
|
|
||||||
|
In der Tabellenansicht sind die Spalten **Tool**, **Bewertung** und **Anzahl
|
||||||
|
Bewertungen** sortierbar. Beim Überfahren einer Zeile erscheint eine Vorschau
|
||||||
|
mit Bewertungsdetails, Tags und Mini-Balken.
|
||||||
|
|
||||||
|
## Auswählen für Vergleich & Merkliste
|
||||||
|
|
||||||
|
- Auf jeder Karte/Zeile findest du ein **Vergleichs-Icon**, mit dem du Tools zur
|
||||||
|
[Vergleichsleiste](/docs/handbook/vergleichen) hinzufügst.
|
||||||
|
- Das **Lesezeichen-Icon** speichert Tools in deiner
|
||||||
|
[Merkliste](/docs/handbook/watchlist) (nur mit dem entsprechenden Tarif).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
Alle Such-, Filter- und Sortierparameter entsprechen den Query-Parametern von
|
||||||
|
[`GET /tools`](/docs/reference/endpoints/tools#listTools).
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
|
||||||
|
# Find & browse tools
|
||||||
|
|
||||||
|
The **Browse tools** section (`/tools`) is your entry point to the catalog.
|
||||||
|
Here you combine search, filters and sorting to find exactly the tools
|
||||||
|
you are interested in.
|
||||||
|
|
||||||
|
## Search
|
||||||
|
|
||||||
|
- The **search bar** searches name and description (full text).
|
||||||
|
- Shortcut: Press **`/`** to focus the search.
|
||||||
|
- The input is debounced so that filtering happens immediately with each
|
||||||
|
keystroke.
|
||||||
|
|
||||||
|
## Filter
|
||||||
|
|
||||||
|
Via the **Filter** button (with a badge for the number of active filters)
|
||||||
|
you open the filter popover with:
|
||||||
|
|
||||||
|
- **Tags** — selection via checkboxes (scrollable list).
|
||||||
|
- **Features** — selection via checkboxes.
|
||||||
|
- **Minimum rating** — slider from 0 to 5 (in steps of 0.5); shows
|
||||||
|
e.g. "3.0+".
|
||||||
|
|
||||||
|
Active filters appear as **removable chips** above the result list.
|
||||||
|
Use **Reset filters** or **Remove all** to clear them again.
|
||||||
|
|
||||||
|
## Sort
|
||||||
|
|
||||||
|
The **Sort** dropdown offers the following options:
|
||||||
|
|
||||||
|
| Sort | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| Newest | New tools first |
|
||||||
|
| Top rated | By combined rating |
|
||||||
|
| Most rated | By number of ratings |
|
||||||
|
| Name (A–Z) | Alphabetically ascending |
|
||||||
|
| Name (Z–A) | Alphabetically descending |
|
||||||
|
| Last updated | By last update |
|
||||||
|
|
||||||
|
## View & density
|
||||||
|
|
||||||
|
- **Switch view:** grid / table / rows.
|
||||||
|
- **Density:** comfortable / compact (slider).
|
||||||
|
|
||||||
|
Your selection is saved — locally in the browser and, for logged-in users,
|
||||||
|
additionally on the server in the preferences. View, density, search, filters
|
||||||
|
and sorting are reflected in the URL so you can share results.
|
||||||
|
|
||||||
|
## Table view
|
||||||
|
|
||||||
|
In the table view the columns **Tool**, **Rating** and **Number of
|
||||||
|
ratings** are sortable. Hovering over a row shows a preview
|
||||||
|
with rating details, tags and mini bars.
|
||||||
|
|
||||||
|
## Selecting for comparison & watchlist
|
||||||
|
|
||||||
|
- On every card/row you find a **compare icon** that lets you add tools to the
|
||||||
|
[compare bar](/docs/handbook/vergleichen).
|
||||||
|
- The **bookmark icon** saves tools to your
|
||||||
|
[watchlist](/docs/handbook/watchlist) (only with the corresponding plan).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
All search, filter and sort parameters correspond to the query parameters of
|
||||||
|
[`GET /tools`](/docs/reference/endpoints/tools#listTools).
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
# Vergleichen
|
||||||
|
|
||||||
|
Mit der Vergleichsfunktion stellst du mehrere Tools **nebeneinander** gegenüber —
|
||||||
|
ideal, um eine fundierte Entscheidung zu treffen.
|
||||||
|
|
||||||
|
> Vergleichen ist ein **Premium-Feature** (Premium/Enterprise) und steht Admins
|
||||||
|
> immer zur Verfügung.
|
||||||
|
|
||||||
|
## Tools auswählen
|
||||||
|
|
||||||
|
1. Im Bereich **Tools durchsuchen** klickst du auf jeder Karte/Zeile auf das
|
||||||
|
**Vergleichs-Icon** (Waage).
|
||||||
|
2. Unten erscheint die **Vergleichsleiste** mit den ausgewählten Tools als
|
||||||
|
Chips. Du kannst einzelne Tools entfernen (×) oder die Auswahl leeren.
|
||||||
|
3. Klicke auf **Vergleichen (N)**, um zur Vergleichsansicht zu gelangen.
|
||||||
|
|
||||||
|
> Ohne Premium-Tarif ist der Button gesperrt (Schloss-Icon). Über den
|
||||||
|
> Dialog gelangst du zum Tarifwechsel
|
||||||
|
> (siehe [Pläne & Berechtigungen](/docs/handbook/plaene)).
|
||||||
|
|
||||||
|
## Die Vergleichsansicht
|
||||||
|
|
||||||
|
Die Ansicht zeigt eine Tabelle mit einer Spalte pro Tool. Zeilen:
|
||||||
|
|
||||||
|
| Zeile | Inhalt |
|
||||||
|
| --- | --- |
|
||||||
|
| **Bewertung** | Sterne + Wert (z. B. `4.2/5`) |
|
||||||
|
| **Nützlichkeit** | Wert (X.X/5) |
|
||||||
|
| **Bedienbarkeit** | Wert (X.X/5) |
|
||||||
|
| **Anzahl Bewertungen** | Anzahl |
|
||||||
|
| **Beschreibung** | Text |
|
||||||
|
| **Features** | Badges |
|
||||||
|
| **Tags** | Badges |
|
||||||
|
| **Zuletzt aktualisiert** | Datum |
|
||||||
|
|
||||||
|
Der **beste Wert** pro Zeile wird hervorgehoben (mit Trophäen-Icon).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
Die Vergleichsansicht liest die Daten über
|
||||||
|
[`GET /compare`](/docs/reference/endpoints/tools#listCompareTools).
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
# Compare
|
||||||
|
|
||||||
|
With the compare function you can put several tools **side by side** —
|
||||||
|
ideal for making a well-informed decision.
|
||||||
|
|
||||||
|
> Comparing is a **premium feature** (Premium/Enterprise) and is always
|
||||||
|
> available to admins.
|
||||||
|
|
||||||
|
## Selecting tools
|
||||||
|
|
||||||
|
1. In the **Browse tools** section, click the **compare icon** (scales) on
|
||||||
|
each card/row.
|
||||||
|
2. The **compare bar** appears at the bottom with the selected tools as
|
||||||
|
chips. You can remove individual tools (×) or clear the selection.
|
||||||
|
3. Click **Compare (N)** to go to the compare view.
|
||||||
|
|
||||||
|
> Without a premium plan the button is locked (lock icon). The dialog takes
|
||||||
|
> you to the plan switch
|
||||||
|
> (see [Plans & permissions](/docs/handbook/plaene)).
|
||||||
|
|
||||||
|
## The compare view
|
||||||
|
|
||||||
|
The view shows a table with one column per tool. Rows:
|
||||||
|
|
||||||
|
| Row | Content |
|
||||||
|
| --- | --- |
|
||||||
|
| **Rating** | Stars + value (e.g. `4.2/5`) |
|
||||||
|
| **Usefulness** | Value (X.X/5) |
|
||||||
|
| **Usability** | Value (X.X/5) |
|
||||||
|
| **Number of ratings** | Count |
|
||||||
|
| **Description** | Text |
|
||||||
|
| **Features** | Badges |
|
||||||
|
| **Tags** | Badges |
|
||||||
|
| **Last updated** | Date |
|
||||||
|
|
||||||
|
The **best value** per row is highlighted (with trophy icon).
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
The compare view reads the data via
|
||||||
|
[`GET /compare`](/docs/reference/endpoints/tools#listCompareTools).
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
|
||||||
|
# Merkliste
|
||||||
|
|
||||||
|
Die **Merkliste** ist eine persönliche Favoritenliste. Tools darin kannst du
|
||||||
|
jederzeit per Klick wieder aufrufen und vergleichen.
|
||||||
|
|
||||||
|
> Die Merkliste ist ein **Premium-Feature** (Premium/Enterprise) und steht
|
||||||
|
> Admins immer zur Verfügung.
|
||||||
|
|
||||||
|
## Voraussetzung
|
||||||
|
|
||||||
|
Du benötigst einen Tarif mit `watchlist`-Berechtigung. Fehlt diese, erscheint
|
||||||
|
beim Lesezeichen ein Hinweis auf den Tarifwechsel
|
||||||
|
(siehe [Pläne & Berechtigungen](/docs/handbook/plaene)).
|
||||||
|
|
||||||
|
## Tool speichern
|
||||||
|
|
||||||
|
- Auf jeder Karte/Zeile im Bereich **Tools durchsuchen** findest du das
|
||||||
|
**Lesezeichen-Icon**.
|
||||||
|
- Ein Klick speichert das Tool in deiner Merkliste — das Icon wird gefüllt.
|
||||||
|
- Ein erneuter Klick entfernt es wieder.
|
||||||
|
|
||||||
|
## Merkliste ansehen
|
||||||
|
|
||||||
|
Öffne die Merkliste über das Benutzermenü oder die Seitenleiste. Sie zeigt alle
|
||||||
|
gespeicherten Tools als Karten. Das gefüllte Lesezeichen auf einer Karte
|
||||||
|
entfernt das Tool aus der Liste.
|
||||||
|
|
||||||
|
## Wo wird die Merkliste gespeichert?
|
||||||
|
|
||||||
|
Die Merkliste ist eine Liste von Tool-IDs in deinen **Benutzerpräferenzen**.
|
||||||
|
Damit ist sie geräteübergreifend mit deinem Konto verbunden.
|
||||||
|
|
||||||
|
API-Referenz: [`GET /auth/me/watchlist`](/docs/reference/endpoints/auth#getMeMerkliste).
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
|
||||||
|
# Watchlist
|
||||||
|
|
||||||
|
The **watchlist** is a personal favorites list. You can open and compare the
|
||||||
|
tools in it at any time with a click.
|
||||||
|
|
||||||
|
> The watchlist is a **premium feature** (Premium/Enterprise) and is always
|
||||||
|
> available to admins.
|
||||||
|
|
||||||
|
## Prerequisite
|
||||||
|
|
||||||
|
You need a plan with the `watchlist` permission. If it is missing, a note
|
||||||
|
about switching plans appears at the bookmark
|
||||||
|
(see [Plans & permissions](/docs/handbook/plaene)).
|
||||||
|
|
||||||
|
## Saving a tool
|
||||||
|
|
||||||
|
- On every card/row in the **Browse tools** section you will find the
|
||||||
|
**bookmark icon**.
|
||||||
|
- A click saves the tool to your watchlist — the icon becomes filled.
|
||||||
|
- Clicking it again removes it.
|
||||||
|
|
||||||
|
## Viewing the watchlist
|
||||||
|
|
||||||
|
Open the watchlist via the user menu or the sidebar. It shows all saved tools
|
||||||
|
as cards. The filled bookmark on a card removes the tool from the list.
|
||||||
|
|
||||||
|
## Where is the watchlist stored?
|
||||||
|
|
||||||
|
The watchlist is a list of tool IDs in your **user preferences**. This way it
|
||||||
|
is linked to your account across devices.
|
||||||
|
|
||||||
|
API reference: [`GET /auth/me/watchlist`](/docs/reference/endpoints/auth#getMeWatchlist).
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,44 @@
|
|||||||
|
# v0.9.5 — Release Notes
|
||||||
|
|
||||||
|
**Datum:** 2026-08-06 · **Tag:** [`v0.9.5`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.5)
|
||||||
|
|
||||||
|
## Design: Neon-Abschluss & Cyan-Akzent
|
||||||
|
|
||||||
|
Fortsetzung des Neon/AI-Looks aus v0.9.3/v0.9.4 — jetzt mit einem
|
||||||
|
frischen **Cyan-Akzent** als Primärfarbe im Dark-Mode.
|
||||||
|
|
||||||
|
## Fixes & Verbesserungen
|
||||||
|
|
||||||
|
- **Cyan-Akzent:** Primärfarbe, Fokus-Ringe und Charts leuchten im Dark-Mode
|
||||||
|
jetzt in Cyan statt Gold/Amber. Das behebt den „gelblich/grellen" Eindruck
|
||||||
|
bei Buttons, Balken, Fokus und Sternen.
|
||||||
|
- **User-Dialoge:** Benutzer-Erstellen/-Bearbeiten ist größer und der Footer
|
||||||
|
bricht um — lange deutsche Labels wie „Passwort festlegen" überlaufen nicht
|
||||||
|
mehr die Box.
|
||||||
|
- **Delete-Buttons vereinheitlicht:** Admin/Papierkorb nutzen denselben Stil
|
||||||
|
wie die Tool-Lösung — gleicher Look ohne Hover-Zustands-Sprünge.
|
||||||
|
- **Eingabefelder:** sanfter Cyan-Fokus statt starkem Neon-Glow.
|
||||||
|
- **Verteilungs-Balken:** Punkte-Verteilung und Charts in Cyan→Violett-Verlauf,
|
||||||
|
klar erkennbar im Dark-Mode.
|
||||||
|
- **Tooltips:** dunkel statt weiß im Dark-Mode.
|
||||||
|
- **Sterne:** gefüllte Sterne mit dezentem Neon-Glow.
|
||||||
|
- **Navigation:** Papierkorb zusätzlich im Admin-Bereich; Hilfe als Icon unten
|
||||||
|
in der Seitenleiste (Netbox-Stil), aus der Haupt-Navigation entfernt.
|
||||||
|
|
||||||
|
## API-Änderungen
|
||||||
|
|
||||||
|
- Keine.
|
||||||
|
|
||||||
|
## Betrieb / Upgrade
|
||||||
|
|
||||||
|
- **Migration:** keine. **Breaking Changes:** keine.
|
||||||
|
- **Hinweis:** Nur visuelle / UI-Änderungen, keine funktionalen.
|
||||||
|
|
||||||
|
## Bekannte Einschränkungen
|
||||||
|
|
||||||
|
- Keine im Rahmen dieses Releases.
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
- Commit: [`54364d7`](https://git.kubebase.de/admin/tool-evaluator/commit/54364d7)
|
||||||
|
- Tag: [`v0.9.5`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.5)
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# v0.9.5 — Release Notes
|
||||||
|
|
||||||
|
**Date:** 2026-08-06 · **Tag:** [`v0.9.5`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.5)
|
||||||
|
|
||||||
|
## Design: Neon polish & cyan accent
|
||||||
|
|
||||||
|
Continuation of the neon/AI look from v0.9.3/v0.9.4 — now with a fresh
|
||||||
|
**cyan accent** as the primary color in dark mode.
|
||||||
|
|
||||||
|
## Fixes & improvements
|
||||||
|
|
||||||
|
- **Cyan accent:** Primary color, focus rings and charts now glow cyan instead
|
||||||
|
of gold/amber in dark mode. Fixes the "yellowish/harsh" feel on buttons,
|
||||||
|
bars, focus and stars.
|
||||||
|
- **User dialogs:** Create/edit user dialogs are wider and the footer wraps —
|
||||||
|
long German labels like "Set Password" no longer overflow the box.
|
||||||
|
- **Delete buttons unified:** Admin/trash use the same style as the tool
|
||||||
|
delete — no hover-state jumps.
|
||||||
|
- **Input fields:** subtle cyan focus instead of a strong neon glow.
|
||||||
|
- **Distribution bars:** score distribution and charts in a cyan→violet
|
||||||
|
gradient, clearly visible in dark mode.
|
||||||
|
- **Tooltips:** dark instead of white in dark mode.
|
||||||
|
- **Stars:** filled stars now have a subtle neon glow.
|
||||||
|
- **Navigation:** trash is also available in the admin area; help is placed as
|
||||||
|
an icon at the bottom of the sidebar (Netbox style) and removed from the main
|
||||||
|
navigation.
|
||||||
|
|
||||||
|
## API Changes
|
||||||
|
|
||||||
|
- None.
|
||||||
|
|
||||||
|
## Operations / Upgrade
|
||||||
|
|
||||||
|
- **Migration:** none. **Breaking changes:** none.
|
||||||
|
- **Note:** Visual / UI-only changes, no functional changes.
|
||||||
|
|
||||||
|
## Known limitations
|
||||||
|
|
||||||
|
- None within the scope of this release.
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
- Commit: [`54364d7`](https://git.kubebase.de/admin/tool-evaluator/commit/54364d7)
|
||||||
|
- Tag: [`v0.9.5`](https://git.kubebase.de/admin/tool-evaluator/releases/tag/v0.9.5)
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
|
||||||
|
# Administration
|
||||||
|
|
||||||
|
Der Bereich **Admin** (`/admin`) ist ausschließlich für Admins zugänglich.
|
||||||
|
Ohne Admin-Rolle erscheint eine Zugriffsverweigerung.
|
||||||
|
|
||||||
|
> Oben rechts führt die Schaltfläche **Redundanz-Dashboard** zur automatischen
|
||||||
|
> Doppelungs-Erkennung (siehe [Redundanz](/docs/handbook/redundanz)).
|
||||||
|
|
||||||
|
## Tab „Nutzer"
|
||||||
|
|
||||||
|
Verwaltung der lokalen Konten.
|
||||||
|
|
||||||
|
- **Nutzer hinzufügen:** Benutzername (Pflicht), Passwort (mind. 6 Zeichen),
|
||||||
|
E-Mail (optional), **Rolle** (User/Admin), **Tarif** (Free/Premium/Enterprise).
|
||||||
|
- **Nutzer bearbeiten:** Rolle, Tarif und (für lokale Konten) ein neues Passwort
|
||||||
|
setzen. Für OIDC-Konten wird die Passwortverwaltung im Identitätsanbieter
|
||||||
|
(z. B. Keycloak) angeboten.
|
||||||
|
- **Nutzer löschen:** Entfernt das Konto endgültig (nicht für das eigene Konto).
|
||||||
|
|
||||||
|
API-Referenz:
|
||||||
|
[`POST /users`](/docs/reference/endpoints/users#createUser),
|
||||||
|
[`PATCH /users/{id}`](/docs/reference/endpoints/users#updateUser),
|
||||||
|
[`DELETE /users/{id}`](/docs/reference/endpoints/users#deleteUser).
|
||||||
|
|
||||||
|
## Tab „Tools"
|
||||||
|
|
||||||
|
Zentraler Zugriff auf den Tool-Katalog.
|
||||||
|
|
||||||
|
- **Suchen** nach Tools.
|
||||||
|
- Tools einzeln ansehen, bearbeiten oder in den Papierkorb verschieben.
|
||||||
|
- **Massenaktion:** mehrere Tools auswählen und in den Papierkorb verschieben
|
||||||
|
(Bestätigungsdialog; soft gelöschte Tools sind aus allen öffentlichen Ansichten
|
||||||
|
entfernt und können wiederhergestellt oder endgültig gelöscht werden).
|
||||||
|
- **Importieren** (Premium): über die Schaltfläche **Importieren** oben rechts
|
||||||
|
können mehrere Tools gleichzeitig angelegt werden. Das Format wird automatisch
|
||||||
|
erkannt (CSV, JSON oder YAML); für CSV lässt sich der Trenner wählen
|
||||||
|
(automatisch, Komma, Semikolon oder Tabulator). Die Daten lassen sich direkt
|
||||||
|
ins Formular einfügen oder als Datei hochladen.
|
||||||
|
|
||||||
|
Unterstützte Felder: `name` (Pflicht), `description`, `category`, `websiteUrl`,
|
||||||
|
`iconUrl`, `features`, `tags` (`features`/`tags` sind mit `|` getrennte Listen).
|
||||||
|
|
||||||
|
**CSV-Beispiel:**
|
||||||
|
|
||||||
|
```csv
|
||||||
|
name;description;category;features;tags
|
||||||
|
Grafana;Observability- und Dashboard-Plattform;Monitoring;Dashboards|Alerts;devops
|
||||||
|
Prometheus;Zeitreihen-Datenbank;Monitoring;Metrics;devops
|
||||||
|
```
|
||||||
|
|
||||||
|
**JSON-Beispiel:**
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{ "name": "Grafana", "category": "Monitoring", "features": ["Dashboards"] },
|
||||||
|
{ "name": "Prometheus", "category": "Monitoring" }
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**YAML-Beispiel:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- name: Grafana
|
||||||
|
category: Monitoring
|
||||||
|
features:
|
||||||
|
- Dashboards
|
||||||
|
- name: Prometheus
|
||||||
|
category: Monitoring
|
||||||
|
```
|
||||||
|
|
||||||
|
Eine umfangreichere, fertig importierbare Beispieldatei liegt unter
|
||||||
|
`docs/examples/import-tools.yaml` (24 gängige Enterprise-Tools).
|
||||||
|
|
||||||
|
Beim Import werden einzelne fehlerhafte Zeilen übersprungen und mit Zeilennummer
|
||||||
|
aufgelistet; korrekte Zeilen werden trotzdem angelegt. Jeder Import erzeugt
|
||||||
|
Audit-Log-Einträge.
|
||||||
|
|
||||||
|
## Tab „Audit-Log"
|
||||||
|
|
||||||
|
Chronologisches Protokoll aller Anlage-, Änderungs- und Löschvorgänge
|
||||||
|
(max. 100 Einträge): Aktion, Entität + ID, Zeitstempel, ausführende Person und
|
||||||
|
geänderte Felder.
|
||||||
|
|
||||||
|
API-Referenz: [`GET /audit-logs`](/docs/reference/endpoints/audit#listAuditLogs).
|
||||||
|
|
||||||
|
## Tab „System"
|
||||||
|
|
||||||
|
Versionsinformationen der laufenden Instanz:
|
||||||
|
|
||||||
|
- **Version** (z. B. `v0.8.1`),
|
||||||
|
- **Commit** (7-stelliger SHA, verlinkt zum Repository),
|
||||||
|
- **Build-Datum**,
|
||||||
|
- **Papierkorb-Aufbewahrung** („N Tage" oder „Für immer").
|
||||||
|
|
||||||
|
## Tool-Verknüpfungen (Admin)
|
||||||
|
|
||||||
|
Auf der Detailseite eines Tools kannst du als Admin **Verknüpfungen**
|
||||||
|
(eigene/„manual" sowie automatisch erkannte) verwalten:
|
||||||
|
|
||||||
|
- **Tool verknüpfen:** Dialog mit Tool-ID, **Beziehungstyp**
|
||||||
|
(Ähnlich / Ersetzt / Abgelöst durch) und optionalen Notizen.
|
||||||
|
- Beziehungstypen werden als Badges auf der Detailseite angezeigt.
|
||||||
|
- Manuelle Verknüpfungen lassen sich per Papierkorb-Icon wieder entfernen.
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user