CL3.8 domain actions: suspend/unsuspend subscription from domains table
This commit is contained in:
@@ -31,6 +31,7 @@ type Subscription = {
|
||||
type Domain = {
|
||||
id: string;
|
||||
plesk_instance_id: string;
|
||||
subscription_id: string | null;
|
||||
domain_name: string;
|
||||
status: string | null;
|
||||
hosting_type: string | null;
|
||||
@@ -60,9 +61,27 @@ function getDomainStatusBadge(status: string | null) {
|
||||
return "bg-emerald-100 text-emerald-700";
|
||||
}
|
||||
|
||||
if (normalized.includes("ok")) {
|
||||
return "bg-emerald-100 text-emerald-700";
|
||||
}
|
||||
|
||||
return "bg-slate-100 text-slate-600";
|
||||
}
|
||||
|
||||
function isDomainSuspended(status: string | null) {
|
||||
const normalized = (status ?? "unknown").toLowerCase();
|
||||
return normalized.includes("suspend") || normalized.includes("disabled");
|
||||
}
|
||||
|
||||
function isDomainActive(status: string | null) {
|
||||
const normalized = (status ?? "unknown").toLowerCase();
|
||||
return (
|
||||
normalized.includes("active") ||
|
||||
normalized.includes("ok") ||
|
||||
normalized.includes("enabled")
|
||||
);
|
||||
}
|
||||
|
||||
export function DashboardControls({
|
||||
instances,
|
||||
subscriptions,
|
||||
@@ -209,6 +228,25 @@ export function DashboardControls({
|
||||
}
|
||||
}
|
||||
|
||||
async function onDomainAction(
|
||||
domainId: string,
|
||||
action: "suspend" | "unsuspend",
|
||||
) {
|
||||
setLoading(true);
|
||||
setMessage(null);
|
||||
try {
|
||||
await runRequest(`/api/plesk/domains/${domainId}/action`, { action });
|
||||
setMessage("Domain action completed.");
|
||||
window.location.reload();
|
||||
} catch (error) {
|
||||
setMessage(
|
||||
error instanceof Error ? error.message : "Domain action failed",
|
||||
);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}
|
||||
|
||||
async function onCheckout() {
|
||||
setLoading(true);
|
||||
try {
|
||||
@@ -537,20 +575,26 @@ export function DashboardControls({
|
||||
<th className="px-2 py-2">Created</th>
|
||||
<th className="px-2 py-2">Aliases</th>
|
||||
<th className="px-2 py-2">Last seen</th>
|
||||
<th className="px-2 py-2">Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{filteredDomains.length === 0 ? (
|
||||
<tr>
|
||||
<td className="px-2 py-3 text-slate-500" colSpan={6}>
|
||||
<td className="px-2 py-3 text-slate-500" colSpan={7}>
|
||||
No domains found.
|
||||
</td>
|
||||
</tr>
|
||||
) : (
|
||||
filteredDomains.map((domain) => (
|
||||
<tr key={domain.id} className="border-b border-slate-100">
|
||||
<td className="font-medium text-slate-900">
|
||||
{domain.domain_name}
|
||||
<td className="px-2 py-2 font-medium text-slate-900">
|
||||
<p>{domain.domain_name}</p>
|
||||
{domain.subscription_id ? (
|
||||
<p className="text-xs font-normal text-slate-500">
|
||||
Subscription: {domain.subscription_id}
|
||||
</p>
|
||||
) : null}
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<span
|
||||
@@ -569,6 +613,28 @@ export function DashboardControls({
|
||||
<td className="px-2 py-2">
|
||||
{formatDateTime(domain.updated_at)}
|
||||
</td>
|
||||
<td className="px-2 py-2">
|
||||
<div className="flex gap-2">
|
||||
<button
|
||||
onClick={() => onDomainAction(domain.id, "suspend")}
|
||||
disabled={
|
||||
loading || isDomainSuspended(domain.status)
|
||||
}
|
||||
className="rounded border border-rose-300 px-2 py-1 text-xs text-rose-700 disabled:cursor-not-allowed disabled:opacity-60"
|
||||
>
|
||||
Suspend
|
||||
</button>
|
||||
<button
|
||||
onClick={() =>
|
||||
onDomainAction(domain.id, "unsuspend")
|
||||
}
|
||||
disabled={loading || isDomainActive(domain.status)}
|
||||
className="rounded border border-emerald-300 px-2 py-1 text-xs text-emerald-700 disabled:cursor-not-allowed disabled:opacity-60"
|
||||
>
|
||||
Unsuspend
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user