feat(backups): replace button with checkbox for server selection in backup settings
Docker images / prepare-release (push) Successful in 11s
Docker images / backend-test (push) Successful in 2m4s
Docker images / frontend-image (push) Successful in 3m10s
Docker images / updater-image (push) Successful in 42s
Docker images / backend-image (push) Successful in 2m29s
Docker images / notify-webhook (push) Skipped
Docker images / publish-release (push) Successful in 10s
Docker images / prepare-release (push) Successful in 11s
Docker images / backend-test (push) Successful in 2m4s
Docker images / frontend-image (push) Successful in 3m10s
Docker images / updater-image (push) Successful in 42s
Docker images / backend-image (push) Successful in 2m29s
Docker images / notify-webhook (push) Skipped
Docker images / publish-release (push) Successful in 10s
Updated the BackupCreateSheet and BackupsSettings components to use checkboxes for selecting servers instead of buttons. This improves user interaction by allowing for easier selection and toggling of server states. The Checkbox component is now integrated for better accessibility and functionality.
This commit is contained in:
@@ -4,6 +4,7 @@ import type { Server } from "@/lib/data"
|
|||||||
import { FormField } from "@/components/form-kit"
|
import { FormField } from "@/components/form-kit"
|
||||||
import { StatusBadge } from "@/components/status-badge"
|
import { StatusBadge } from "@/components/status-badge"
|
||||||
import { Button } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
|
import { Checkbox } from "@/components/ui/checkbox"
|
||||||
import { Input } from "@/components/ui/input"
|
import { Input } from "@/components/ui/input"
|
||||||
import {
|
import {
|
||||||
Sheet,
|
Sheet,
|
||||||
@@ -110,27 +111,18 @@ export function BackupCreateSheet({
|
|||||||
{servers.map((s) => {
|
{servers.map((s) => {
|
||||||
const checked = selected.has(s.id)
|
const checked = selected.has(s.id)
|
||||||
return (
|
return (
|
||||||
<button
|
<label
|
||||||
key={s.id}
|
key={s.id}
|
||||||
type="button"
|
|
||||||
onClick={() => onToggle(s.id)}
|
|
||||||
className={cn(
|
className={cn(
|
||||||
"flex items-center gap-3 rounded-lg border p-3 text-left transition-colors",
|
"flex cursor-pointer items-center gap-3 rounded-lg border p-3 text-left transition-colors",
|
||||||
checked ? "border-primary/40 bg-primary/5" : "border-border hover:bg-muted/40",
|
checked ? "border-primary/40 bg-primary/5" : "border-border hover:bg-muted/40",
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<div
|
<Checkbox
|
||||||
className={cn(
|
checked={checked}
|
||||||
"flex size-4 shrink-0 items-center justify-center rounded border transition-colors",
|
onCheckedChange={() => onToggle(s.id)}
|
||||||
checked ? "bg-primary border-primary" : "border-border",
|
aria-label={`Выбрать ${s.name}`}
|
||||||
)}
|
/>
|
||||||
>
|
|
||||||
{checked && (
|
|
||||||
<svg width="10" height="8" viewBox="0 0 10 8" fill="none" aria-hidden="true">
|
|
||||||
<path d="M1 4l2.5 2.5L9 1" stroke="white" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
|
|
||||||
</svg>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
<div className="flex-1 min-w-0">
|
<div className="flex-1 min-w-0">
|
||||||
<p className="text-sm font-medium">{s.name}</p>
|
<p className="text-sm font-medium">{s.name}</p>
|
||||||
<div className="flex items-center gap-1.5 mt-0.5">
|
<div className="flex items-center gap-1.5 mt-0.5">
|
||||||
@@ -141,7 +133,7 @@ export function BackupCreateSheet({
|
|||||||
{s.status === "offline" && (
|
{s.status === "offline" && (
|
||||||
<span className="text-xs text-muted-foreground">недоступен</span>
|
<span className="text-xs text-muted-foreground">недоступен</span>
|
||||||
)}
|
)}
|
||||||
</button>
|
</label>
|
||||||
)
|
)
|
||||||
})}
|
})}
|
||||||
</StepperContent>
|
</StepperContent>
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { OpsPanel } from "@/components/ops-panel"
|
|||||||
import { FormField, FormToggle, SegmentedControl } from "@/components/form-kit"
|
import { FormField, FormToggle, SegmentedControl } from "@/components/form-kit"
|
||||||
import { StatusBadge } from "@/components/status-badge"
|
import { StatusBadge } from "@/components/status-badge"
|
||||||
import { Button } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
|
import { Checkbox } from "@/components/ui/checkbox"
|
||||||
import { Input } from "@/components/ui/input"
|
import { Input } from "@/components/ui/input"
|
||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
import { LoaderCircleIcon } from "lucide-react"
|
import { LoaderCircleIcon } from "lucide-react"
|
||||||
@@ -377,29 +378,20 @@ export function BackupsSettings({
|
|||||||
{servers.map((s) => {
|
{servers.map((s) => {
|
||||||
const checked = selectedServers.has(s.id)
|
const checked = selectedServers.has(s.id)
|
||||||
return (
|
return (
|
||||||
<button
|
<label
|
||||||
key={s.id}
|
key={s.id}
|
||||||
type="button"
|
|
||||||
onClick={() => onToggleServer(s.id)}
|
|
||||||
className={cn(
|
className={cn(
|
||||||
"flex items-center gap-3 rounded-lg border p-3 text-left transition-colors",
|
"flex cursor-pointer items-center gap-3 rounded-lg border p-3 text-left transition-colors",
|
||||||
checked
|
checked
|
||||||
? "border-primary/40 bg-primary/5"
|
? "border-primary/40 bg-primary/5"
|
||||||
: "border-border hover:border-border/80 hover:bg-muted/40",
|
: "border-border hover:border-border/80 hover:bg-muted/40",
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<div
|
<Checkbox
|
||||||
className={cn(
|
checked={checked}
|
||||||
"flex size-4 shrink-0 items-center justify-center rounded border transition-colors",
|
onCheckedChange={() => onToggleServer(s.id)}
|
||||||
checked ? "bg-primary border-primary" : "border-border",
|
aria-label={`Выбрать ${s.name}`}
|
||||||
)}
|
/>
|
||||||
>
|
|
||||||
{checked && (
|
|
||||||
<svg width="10" height="8" viewBox="0 0 10 8" fill="none" aria-hidden="true">
|
|
||||||
<path d="M1 4l2.5 2.5L9 1" stroke="white" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
|
|
||||||
</svg>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
<div className="flex-1 min-w-0">
|
<div className="flex-1 min-w-0">
|
||||||
<p className="text-sm font-medium truncate">{s.name}</p>
|
<p className="text-sm font-medium truncate">{s.name}</p>
|
||||||
<div className="flex items-center gap-1.5 mt-0.5">
|
<div className="flex items-center gap-1.5 mt-0.5">
|
||||||
@@ -407,7 +399,7 @@ export function BackupsSettings({
|
|||||||
<StatusBadge status={s.status} />
|
<StatusBadge status={s.status} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</label>
|
||||||
)
|
)
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user