add tooltip

This commit is contained in:
Owen
2025-12-20 15:42:10 -05:00
committed by Owen Schwartz
parent d82535d3e1
commit 662e63317b
2 changed files with 104 additions and 66 deletions

View File

@@ -2386,5 +2386,7 @@
"maintenanceTime": "e.g., 2 hours, Nov 1 at 5:00 PM", "maintenanceTime": "e.g., 2 hours, Nov 1 at 5:00 PM",
"maintenanceEstimatedTimeDescription": "When you expect maintenance to be completed", "maintenanceEstimatedTimeDescription": "When you expect maintenance to be completed",
"editDomain": "Edit Domain", "editDomain": "Edit Domain",
"editDomainDescription": "Select a domain for your resource" "editDomainDescription": "Select a domain for your resource",
"maintenanceModeDisabledTooltip": "This feature requires a valid license to enable."
} }

View File

@@ -51,7 +51,7 @@ import {
CredenzaTitle CredenzaTitle
} from "@app/components/Credenza"; } from "@app/components/Credenza";
import DomainPicker from "@app/components/DomainPicker"; import DomainPicker from "@app/components/DomainPicker";
import { AlertCircle, Globe } from "lucide-react"; import { AlertCircle, Globe, Info } from "lucide-react";
import { build } from "@server/build"; import { build } from "@server/build";
import { finalizeSubdomainSanitize } from "@app/lib/subdomain-utils"; import { finalizeSubdomainSanitize } from "@app/lib/subdomain-utils";
import { DomainRow } from "../../../../../../components/DomainsTable"; import { DomainRow } from "../../../../../../components/DomainsTable";
@@ -61,6 +61,7 @@ import { useSubscriptionStatusContext } from "@app/hooks/useSubscriptionStatusCo
import { useUserContext } from "@app/hooks/useUserContext"; import { useUserContext } from "@app/hooks/useUserContext";
import { Alert, AlertDescription } from "@app/components/ui/alert"; import { Alert, AlertDescription } from "@app/components/ui/alert";
import { RadioGroup, RadioGroupItem } from "@app/components/ui/radio-group"; import { RadioGroup, RadioGroupItem } from "@app/components/ui/radio-group";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@app/components/ui/tooltip";
export default function GeneralForm() { export default function GeneralForm() {
const [formKey, setFormKey] = useState(0); const [formKey, setFormKey] = useState(0);
@@ -70,8 +71,9 @@ export default function GeneralForm() {
const router = useRouter(); const router = useRouter();
const t = useTranslations(); const t = useTranslations();
const [editDomainOpen, setEditDomainOpen] = useState(false); const [editDomainOpen, setEditDomainOpen] = useState(false);
const { licenseStatus } = useLicenseStatusContext();
const subscriptionStatus = useSubscriptionStatusContext(); const subscriptionStatus = useSubscriptionStatusContext();
const { licenseStatus, isUnlocked } = useLicenseStatusContext();
const subscription = useSubscriptionStatusContext();
const { user } = useUserContext(); const { user } = useUserContext();
const { env } = useEnvContext(); const { env } = useEnvContext();
@@ -99,6 +101,14 @@ export default function GeneralForm() {
baseDomain: string; baseDomain: string;
} | null>(null); } | null>(null);
// Check if security features are disabled due to licensing/subscription
const isSecurityFeatureDisabled = () => {
const isEnterpriseNotLicensed = build === "enterprise" && !isUnlocked();
const isSaasNotSubscribed =
build === "saas" && !subscription?.isSubscribed();
return isEnterpriseNotLicensed || isSaasNotSubscribed;
};
const GeneralFormSchema = z const GeneralFormSchema = z
.object({ .object({
enabled: z.boolean(), enabled: z.boolean(),
@@ -511,21 +521,46 @@ export default function GeneralForm() {
<FormField <FormField
control={form.control} control={form.control}
name="maintenanceModeEnabled" name="maintenanceModeEnabled"
render={({ field }) => ( render={({ field }) => {
const isDisabled =
isSecurityFeatureDisabled();
return (
<FormItem> <FormItem>
<div className="flex items-center space-x-2"> <div className="flex items-center space-x-2">
<FormControl> <FormControl>
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<div className="flex items-center gap-2">
<span
className={isDisabled ? "pointer-events-auto" : ""}
>
<SwitchInput <SwitchInput
id="enable-maintenance" id="enable-maintenance"
checked={field.value} checked={field.value}
label={t("enableMaintenanceMode")} label={t("enableMaintenanceMode")}
onCheckedChange={(val) => disabled={isDisabled}
form.setValue( onCheckedChange={(val) => {
"maintenanceModeEnabled", if (!isDisabled) {
val form.setValue("maintenanceModeEnabled", val);
)
} }
}}
/> />
</span>
</div>
</TooltipTrigger>
{isDisabled && (
<TooltipContent className="max-w-xs">
<p>{t("maintenanceModeDisabledTooltip")}</p>
</TooltipContent>
)}
</Tooltip>
</TooltipProvider>
</FormControl> </FormControl>
</div> </div>
<FormDescription> <FormDescription>
@@ -533,7 +568,8 @@ export default function GeneralForm() {
</FormDescription> </FormDescription>
<FormMessage /> <FormMessage />
</FormItem> </FormItem>
)} );
}}
/> />
{isMaintenanceEnabled && ( {isMaintenanceEnabled && (