mirror of
https://github.com/Dokploy/dokploy.git
synced 2026-07-15 10:55:23 +02:00
* feat: update dependencies and enhance UI components in Dokploy - Updated various package versions in pnpm-lock.yaml to improve compatibility and performance, including React and Tailwind CSS. - Modified components.json to change the styling to "radix-nova" and added new properties for icon library and menu color. - Refactored multiple components to use updated class names for better styling consistency and responsiveness. - Removed unused Radix UI components from package.json to streamline dependencies. - Adjusted layout and styling in several dashboard components for improved user experience and visual appeal. - Enhanced tooltip and form item components for better accessibility and usability. * refactor: enhance UI components in HandleCertificate and SidebarLogo - Updated the HandleCertificate component to improve dialog content height and textarea styling for better usability. - Adjusted the SidebarLogo component layout to enhance alignment and spacing, ensuring a more consistent appearance across the sidebar. - Implemented responsive design adjustments to textarea elements, preventing overflow and improving user experience. * refactor: improve UI consistency and styling across dashboard components - Updated Card components in ShowDeployments, ShowSchedules, and ShowVolumeBackups to remove unnecessary border styles for a cleaner look. - Enhanced TabsList components in ShowProviderForm and ShowProviderFormCompose by adding a variant for improved visual distinction. - Adjusted spacing in AdvancedEnvironmentSelector for better layout and readability. - Removed redundant border classes in Service component for a more streamlined design. * [autofix.ci] apply automated fixes * chore: update package dependencies and refactor email rendering - Upgraded React and React DOM to version 19.2.7 across multiple packages for improved performance and compatibility. - Updated TSX to version 4.22.4 in various package.json files. - Refactored email rendering from `renderAsync` to `render` in notification utilities and email templates for consistency. - Adjusted Tailwind configuration usage in email templates to utilize a centralized configuration file. These changes enhance the overall stability and maintainability of the codebase. * refactor: update badge variants across dashboard components - Changed badge variant from "outline-solid" to "outline" in multiple components including columns, show-domains, and various deployment tables for consistency in styling. - Updated button variants in billing and project templates to align with the new badge styling. - Enhanced input components to support password generation and error messaging, improving user experience. These changes streamline the UI and ensure a cohesive design across the application. * refactor: clean up calendar component imports and structure - Removed redundant imports of icons from lucide-react and streamlined the import statements for better readability. - Adjusted the placement of type imports to enhance code organization. These changes improve the maintainability and clarity of the calendar component. * [autofix.ci] apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
125 lines
3.2 KiB
TypeScript
125 lines
3.2 KiB
TypeScript
import { FancyAnsi } from "fancy-ansi";
|
|
import escapeRegExp from "lodash/escapeRegExp";
|
|
import { Badge } from "@/components/ui/badge";
|
|
import {
|
|
Tooltip,
|
|
TooltipContent,
|
|
TooltipProvider,
|
|
TooltipTrigger,
|
|
} from "@/components/ui/tooltip";
|
|
import { cn } from "@/lib/utils";
|
|
import { getLogType, type LogLine } from "./utils";
|
|
|
|
interface LogLineProps {
|
|
log: LogLine;
|
|
noTimestamp?: boolean;
|
|
searchTerm?: string;
|
|
}
|
|
|
|
const fancyAnsi = new FancyAnsi();
|
|
|
|
export function TerminalLine({ log, noTimestamp, searchTerm }: LogLineProps) {
|
|
const { timestamp, message, rawTimestamp } = log;
|
|
const { type, variant, color } = getLogType(message);
|
|
|
|
const formattedTime = timestamp
|
|
? timestamp.toLocaleString([], {
|
|
month: "2-digit",
|
|
day: "2-digit",
|
|
hour: "2-digit",
|
|
minute: "2-digit",
|
|
year: "2-digit",
|
|
second: "2-digit",
|
|
})
|
|
: "--- No time found ---";
|
|
|
|
const highlightMessage = (text: string, term: string) => {
|
|
if (!term) {
|
|
return (
|
|
<span
|
|
className="transition-colors"
|
|
dangerouslySetInnerHTML={{
|
|
__html: fancyAnsi.toHtml(text),
|
|
}}
|
|
/>
|
|
);
|
|
}
|
|
|
|
const htmlContent = fancyAnsi.toHtml(text);
|
|
const searchRegex = new RegExp(`(${escapeRegExp(term)})`, "gi");
|
|
|
|
const modifiedContent = htmlContent.replace(
|
|
searchRegex,
|
|
(match) =>
|
|
`<span class="bg-orange-200/80 dark:bg-orange-900/80 font-bold">${match}</span>`,
|
|
);
|
|
|
|
return (
|
|
<span
|
|
className="transition-colors"
|
|
dangerouslySetInnerHTML={{ __html: modifiedContent }}
|
|
/>
|
|
);
|
|
};
|
|
|
|
const tooltip = (color: string, timestamp: string | null) => {
|
|
const square = (
|
|
<div className={cn("w-2 h-full shrink-0 rounded-[3px]", color)} />
|
|
);
|
|
return timestamp ? (
|
|
<TooltipProvider delayDuration={0} disableHoverableContent>
|
|
<Tooltip>
|
|
<TooltipTrigger asChild>{square}</TooltipTrigger>
|
|
<TooltipContent
|
|
sideOffset={5}
|
|
className="bg-popover border-border z-99999"
|
|
>
|
|
<p className="text text-xs text-muted-foreground break-all max-w-md">
|
|
<pre>{timestamp}</pre>
|
|
</p>
|
|
</TooltipContent>
|
|
</Tooltip>
|
|
</TooltipProvider>
|
|
) : (
|
|
square
|
|
);
|
|
};
|
|
|
|
return (
|
|
<div
|
|
className={cn(
|
|
"font-mono text-xs flex flex-row gap-3 py-2 sm:py-0.5 group",
|
|
type === "error"
|
|
? "bg-red-500/10 hover:bg-red-500/15"
|
|
: type === "warning"
|
|
? "bg-yellow-500/10 hover:bg-yellow-500/15"
|
|
: type === "debug"
|
|
? "bg-orange-500/10 hover:bg-orange-500/15"
|
|
: "hover:bg-gray-200/50 dark:hover:bg-gray-800/50",
|
|
)}
|
|
>
|
|
{" "}
|
|
<div className="flex items-start gap-x-2">
|
|
{/* Icon to expand the log item maybe implement a collapsible later */}
|
|
{/* <Square className="size-4 text-muted-foreground opacity-0 group-hover/logitem:opacity-100 transition-opacity" /> */}
|
|
{tooltip(color, rawTimestamp)}
|
|
{!noTimestamp && (
|
|
<span className="select-none pl-2 text-muted-foreground w-full sm:w-40 shrink-0">
|
|
{formattedTime}
|
|
</span>
|
|
)}
|
|
|
|
<Badge
|
|
variant={variant}
|
|
className="w-14 justify-center text-[10px] px-1 py-0"
|
|
>
|
|
{type}
|
|
</Badge>
|
|
</div>
|
|
<span className="dark:text-gray-200 font-mono text-foreground whitespace-pre-wrap break-all">
|
|
{highlightMessage(message, searchTerm || "")}
|
|
</span>
|
|
</div>
|
|
);
|
|
}
|