From 4cf7c84abef5718cd82d616a44a800f133d6cce7 Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Mon, 21 Aug 2023 15:22:54 +0530 Subject: [PATCH 1/3] feat: responsive settings menu for mobile screens --- .../settings/SettingsNavbar.tsx | 130 +++++++++++++----- .../[environmentId]/settings/layout.tsx | 6 +- 2 files changed, 96 insertions(+), 40 deletions(-) diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/SettingsNavbar.tsx b/apps/web/app/(app)/environments/[environmentId]/settings/SettingsNavbar.tsx index 00364dd54a..9ffa11ec60 100644 --- a/apps/web/app/(app)/environments/[environmentId]/settings/SettingsNavbar.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/settings/SettingsNavbar.tsx @@ -4,6 +4,8 @@ import { useProduct } from "@/lib/products/products"; import { useTeam } from "@/lib/teams/teams"; import { truncate } from "@/lib/utils"; import { IS_FORMBRICKS_CLOUD } from "@formbricks/lib/constants"; +import { Popover, PopoverTrigger, PopoverContent } from "@formbricks/ui"; +import { ChevronDownIcon } from "@heroicons/react/20/solid"; import { AdjustmentsVerticalIcon, BellAlertIcon, @@ -21,12 +23,14 @@ import { import clsx from "clsx"; import Link from "next/link"; import { usePathname } from "next/navigation"; -import { useMemo } from "react"; +import { useMemo, useState } from "react"; export default function SettingsNavbar({ environmentId }: { environmentId: string }) { const pathname = usePathname(); const { team } = useTeam(environmentId); const { product } = useProduct(environmentId); + const [mobileNavMenuOpen, setMobileNavMenuOpen] = useState(false); + interface NavigationLink { name: string; href: string; @@ -181,42 +185,94 @@ export default function SettingsNavbar({ environmentId }: { environmentId: strin if (!navigation) return null; return ( -
- -
+ ))} + + +
+ + setMobileNavMenuOpen(!mobileNavMenuOpen)}> + + Settings + + + +
+ {navigation.map((item) => ( +
+

+ {item.title}{" "} + {item.title === "Product" && product?.name && ( + ({truncate(product?.name, 10)}) + )} + {item.title === "Team" && team?.name && ( + ({truncate(team?.name, 14)}) + )} +

+
+ {item.links + .filter((l) => !l.hidden) + .map((link) => ( + setMobileNavMenuOpen(false)} + className={clsx( + link.current + ? "bg-slate-100 text-slate-900" + : "text-slate-900 hover:bg-slate-50 ", + "group flex items-center whitespace-nowrap rounded-md px-1 py-1 pl-2 text-sm font-medium " + )}> +
+
+ ))} +
+
+
+
+ ); } diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/layout.tsx b/apps/web/app/(app)/environments/[environmentId]/settings/layout.tsx index 00a74101aa..531d736c3c 100644 --- a/apps/web/app/(app)/environments/[environmentId]/settings/layout.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/settings/layout.tsx @@ -8,10 +8,10 @@ export const metadata: Metadata = { export default function SettingsLayout({ children, params }) { return ( <> -
+
-
-
+
+
{children}
From 2b7ec577226563a81572744250df4f8d92d0ed25 Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Mon, 21 Aug 2023 23:11:24 +0530 Subject: [PATCH 2/3] fix: setting pages responsiveness bugs --- .../[environmentId]/settings/SettingsCard.tsx | 2 +- .../settings/SettingsNavbar.tsx | 4 ++-- .../settings/api-keys/EditApiKeys.tsx | 18 +++++++++------- .../settings/members/EditMemberships.tsx | 18 ++++++++-------- .../settings/notifications/EditAlerts.tsx | 21 +++++++++---------- .../notifications/EditWeeklySummary.tsx | 14 ++++++------- 6 files changed, 39 insertions(+), 38 deletions(-) diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/SettingsCard.tsx b/apps/web/app/(app)/environments/[environmentId]/settings/SettingsCard.tsx index a18cc0ac6b..43de8b1f39 100644 --- a/apps/web/app/(app)/environments/[environmentId]/settings/SettingsCard.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/settings/SettingsCard.tsx @@ -18,7 +18,7 @@ export default function SettingsCard({ }) { return (
-
+

{title}

diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/SettingsNavbar.tsx b/apps/web/app/(app)/environments/[environmentId]/settings/SettingsNavbar.tsx index 9ffa11ec60..8efa0395c8 100644 --- a/apps/web/app/(app)/environments/[environmentId]/settings/SettingsNavbar.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/settings/SettingsNavbar.tsx @@ -223,7 +223,7 @@ export default function SettingsNavbar({ environmentId }: { environmentId: strin ))}
-
+
setMobileNavMenuOpen(!mobileNavMenuOpen)}> @@ -235,7 +235,7 @@ export default function SettingsNavbar({ environmentId }: { environmentId: strin
{navigation.map((item) => (
-

+

{item.title}{" "} {item.title === "Product" && product?.name && ( ({truncate(product?.name, 10)}) diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/api-keys/EditApiKeys.tsx b/apps/web/app/(app)/environments/[environmentId]/settings/api-keys/EditApiKeys.tsx index 89ec83521c..9b1bb298f3 100644 --- a/apps/web/app/(app)/environments/[environmentId]/settings/api-keys/EditApiKeys.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/settings/api-keys/EditApiKeys.tsx @@ -60,10 +60,10 @@ export default function EditAPIKeys({

-
Label
-
API Key
-
Last used
-
Created at
+
Label
+
API Key
+
Last used
+
Created at
@@ -77,12 +77,14 @@ export default function EditAPIKeys({
-
{apiKey.label}
-
{apiKey.apiKey || secret}
-
+
{apiKey.label}
+
+ {apiKey.apiKey || secret} +
+
{apiKey.lastUsedAt && timeSince(apiKey.lastUsedAt.toString())}
-
{timeSince(apiKey.createdAt.toString())}
+
{timeSince(apiKey.createdAt.toString())}
+
+ +
+

Preview

+
+

How easy was it for you to do this?

+
+ {[1, 2, 3, 4, 5].map((num) => ( +
+ {num} +
+ ))} +
+
+
+
+ ); }; diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/members/EditMemberships.tsx b/apps/web/app/(app)/environments/[environmentId]/settings/members/EditMemberships.tsx index 56e9d54611..604e04f19f 100644 --- a/apps/web/app/(app)/environments/[environmentId]/settings/members/EditMemberships.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/settings/members/EditMemberships.tsx @@ -2,6 +2,7 @@ import ShareInviteModal from "@/app/(app)/environments/[environmentId]/settings/members/ShareInviteModal"; import TransferOwnershipModal from "@/app/(app)/environments/[environmentId]/settings/members/TransferOwnershipModal"; +import CustomDialog from "@/components/shared/CustomDialog"; import DeleteDialog from "@/components/shared/DeleteDialog"; import LoadingSpinner from "@/components/shared/LoadingSpinner"; import CreateTeamModal from "@/components/team/CreateTeamModal"; @@ -17,6 +18,7 @@ import { updateMemberRole, useMembers, } from "@/lib/members"; +import { useMemberships } from "@/lib/memberships"; import { useProfile } from "@/lib/profile"; import { capitalizeFirstLetter } from "@/lib/utils"; import { @@ -35,12 +37,10 @@ import { } from "@formbricks/ui"; import { ChevronDownIcon } from "@heroicons/react/20/solid"; import { PaperAirplaneIcon, ShareIcon, TrashIcon } from "@heroicons/react/24/outline"; +import { useRouter } from "next/navigation"; import { useState } from "react"; import toast from "react-hot-toast"; import AddMemberModal from "./AddMemberModal"; -import { useRouter } from "next/navigation"; -import { useMemberships } from "@/lib/memberships"; -import CustomDialog from "@/components/shared/CustomDialog"; type EditMembershipsProps = { environmentId: string; @@ -292,7 +292,7 @@ export function EditMemberships({ environmentId }: EditMembershipsProps) {
-
Fullname
+
Fullname
Email
Role
@@ -302,10 +302,12 @@ export function EditMemberships({ environmentId }: EditMembershipsProps) {
-
- +
+
+ +
-
+

{member.name}

@@ -325,7 +327,7 @@ export function EditMemberships({ environmentId }: EditMembershipsProps) { currentUserRole={role} />
-
+
{!member.accepted && (isExpired(member) ? ( diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/setup/EnvironmentNotice.tsx b/apps/web/app/(app)/environments/[environmentId]/settings/setup/EnvironmentNotice.tsx index 5c6a5fdd98..7cf29eb6a9 100644 --- a/apps/web/app/(app)/environments/[environmentId]/settings/setup/EnvironmentNotice.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/settings/setup/EnvironmentNotice.tsx @@ -3,7 +3,7 @@ import LoadingSpinner from "@/components/shared/LoadingSpinner"; import { useEnvironment } from "@/lib/environments/environments"; import { ErrorComponent } from "@formbricks/ui"; -import { ExclamationTriangleIcon } from "@heroicons/react/24/solid"; +import { LightBulbIcon } from "@heroicons/react/24/solid"; import { useRouter } from "next/navigation"; export default function EnvironmentNotice({ environmentId }: { environmentId: string }) { @@ -26,14 +26,14 @@ export default function EnvironmentNotice({ environmentId }: { environmentId: st return (
{environment.type === "production" && !environment.widgetSetupCompleted && ( - diff --git a/apps/web/components/shared/WidgetStatusIndicator.tsx b/apps/web/components/shared/WidgetStatusIndicator.tsx index 3be29c2fb8..87adc83fa2 100644 --- a/apps/web/components/shared/WidgetStatusIndicator.tsx +++ b/apps/web/components/shared/WidgetStatusIndicator.tsx @@ -1,16 +1,15 @@ "use client"; import LoadingSpinner from "@/components/shared/LoadingSpinner"; -import { Confetti } from "@formbricks/ui"; import { useEnvironment } from "@/lib/environments/environments"; import { useEnvironmentMutation } from "@/lib/environments/mutateEnvironments"; import { useEvents } from "@/lib/events/events"; import { timeSince } from "@formbricks/lib/time"; +import { Confetti, ErrorComponent } from "@formbricks/ui"; import { ArrowDownIcon, CheckIcon, ExclamationTriangleIcon } from "@heroicons/react/24/solid"; import clsx from "clsx"; import Link from "next/link"; import { useEffect, useMemo, useState } from "react"; -import { ErrorComponent } from "@formbricks/ui"; interface WidgetStatusIndicatorProps { environmentId: string; @@ -81,7 +80,7 @@ export default function WidgetStatusIndicator({ environmentId, type }: WidgetSta return (
-

{currentStatus.title}

+

{currentStatus.title}

{currentStatus.subtitle}{" "} {status !== "notImplemented" && {timeSince(events[0].createdAt)}}