Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.

## [1.0.4] - 2026-01-20

### Added
- stop ongoing deployment
- DB tests

### Fixed
- update environment variable issue

### Changed
- switched to gorm

---

## [1.0.3] - 2026-01-12

### Added
Expand Down
67 changes: 67 additions & 0 deletions dash/src/components/applications/app-info.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,73 @@ export const AppInfo = ({ app, latestCommit }: Props) => {
</InfoItem>
)}
</>
) : app.appType === 'compose' ? (
<>
<SectionDivider title="Repository & Configuration" />

{/* Git Repository */}
<InfoItem icon={Github} label="Repository">
{app.gitRepository ? (
<a
href={`https://github.com/${app.gitRepository}`}
target="_blank"
rel="noopener noreferrer"
className="font-mono text-xs text-primary hover:underline flex items-center gap-2 group w-fit"
>
<span className="truncate">{app.gitRepository}</span>
<ExternalLink className="w-3 h-3 opacity-0 group-hover:opacity-100 transition-all group-hover:translate-x-0.5 group-hover:-translate-y-0.5" />
</a>
) : (
<p className="text-muted-foreground text-xs">Not connected</p>
)}
</InfoItem>

{/* Branch */}
<InfoItem icon={GitBranch} label="Branch">
<Badge variant="outline" className="font-mono text-xs px-3 py-1">
{app.gitBranch || "Not specified"}
</Badge>
</InfoItem>

{/* Latest Commit */}
{latestCommit && (
<>
<SectionDivider title="Latest Commit" />

<div className="md:col-span-2">
<InfoItem icon={GitCommit} label="Commit Details">
<div className="space-y-2 p-3 rounded-lg bg-muted/30 border border-border/50">
<div className="flex items-center gap-3 flex-wrap">
<a
href={latestCommit.html_url}
target="_blank"
rel="noopener noreferrer"
className="font-mono text-xs text-primary hover:underline inline-flex items-center gap-1.5 group"
>
<span className="font-semibold">{latestCommit.sha.slice(0, 7)}</span>
<ExternalLink className="w-3 h-3 opacity-0 group-hover:opacity-100 transition-all group-hover:translate-x-0.5 group-hover:-translate-y-0.5" />
</a>
{latestCommit.author && (
<span className="text-xs text-muted-foreground">
by {latestCommit.author}
</span>
)}
{latestCommit.timestamp && (
<span className="flex items-center gap-1 text-xs text-muted-foreground">
<Clock className="w-3 h-3" />
{new Date(latestCommit.timestamp).toLocaleString()}
</span>
)}
</div>
{latestCommit.message && (
<p className="text-xs text-foreground/80 leading-relaxed">{latestCommit.message}</p>
)}
</div>
</InfoItem>
</div>
</>
)}
</>
) : (
<>
{/* Git Configuration Section */}
Expand Down
81 changes: 81 additions & 0 deletions dash/src/components/applications/compose-app-settings.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import { useState } from "react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { Label } from "@/components/ui/label";
import { toast } from "sonner";
import { applicationsService } from "@/services";
import type { App } from "@/types";

interface ComposeAppSettingsProps {
app: App;
onUpdate: () => void;
}

export const ComposeAppSettings = ({ app, onUpdate }: ComposeAppSettingsProps) => {
const [rootDirectory, setRootDirectory] = useState(app.rootDirectory || "");
const [saving, setSaving] = useState(false);

const handleSave = async () => {
try {
setSaving(true);

await applicationsService.update(app.id, {
rootDirectory,
});

toast.success("Settings updated successfully");
onUpdate();
} catch (error) {
toast.error(error instanceof Error ? error.message : "Failed to update settings");
} finally {
setSaving(false);
}
};

return (
<Card>
<CardHeader className="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4">
<div className="flex flex-col gap-2">
<CardTitle>Application Settings</CardTitle>
<CardDescription>
Configure your compose application settings.
</CardDescription>
</div>
<div className="flex justify-start sm:justify-end w-full sm:w-auto">
<Button onClick={handleSave} disabled={saving}>
{saving ? "Saving..." : "Save Settings"}
</Button>
</div>
</CardHeader>
<CardContent className="space-y-6">
<div className="space-y-2">
<Label htmlFor="rootDirectory">Root Directory</Label>
<Input
id="rootDirectory"
placeholder="/"
value={rootDirectory}
onChange={(e) => setRootDirectory(e.target.value)}
/>
<p className="text-sm text-muted-foreground">
The directory containing your docker-compose.yml file
</p>
</div>

<div className="pt-4 border-t">
<h3 className="text-sm font-medium mb-3">Read-only Configuration</h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 text-sm">
<div>
<span className="text-muted-foreground block">Repository</span>
<span className="font-mono">{app.gitRepository || "Not connected"}</span>
</div>
<div>
<span className="text-muted-foreground block">Branch</span>
<span className="font-mono">{app.gitBranch}</span>
</div>
</div>
</div>
</CardContent>
</Card>
);
};
Loading
Loading