From 46fadf9df0a704eab312e8cf596175d82284e51d Mon Sep 17 00:00:00 2001 From: Ashutosh-Bhadauriya Date: Tue, 13 Jun 2023 15:16:57 +0530 Subject: [PATCH 1/2] Feat: Add ability to archive attributes --- .../attributes/AttributeClassesList.tsx | 28 ++++++++++++++++--- .../attributes/AttributeSettingsTab.tsx | 18 +++++++++++- .../people/[personId]/PersonDetails.tsx | 2 +- .../surveys/[surveyId]/edit/WhoToSendCard.tsx | 2 +- .../people/[personId]/index.ts | 1 + .../migration.sql | 2 ++ packages/database/schema.prisma | 1 + 7 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 packages/database/migrations/20230613035154_add_archived_to_attribute_class/migration.sql diff --git a/apps/web/app/environments/[environmentId]/attributes/AttributeClassesList.tsx b/apps/web/app/environments/[environmentId]/attributes/AttributeClassesList.tsx index 41e59c9373..b5706627ea 100644 --- a/apps/web/app/environments/[environmentId]/attributes/AttributeClassesList.tsx +++ b/apps/web/app/environments/[environmentId]/attributes/AttributeClassesList.tsx @@ -2,7 +2,7 @@ import LoadingSpinner from "@/components/shared/LoadingSpinner"; import { useAttributeClasses } from "@/lib/attributeClasses/attributeClasses"; -import { Button, ErrorComponent } from "@formbricks/ui"; +import { Badge, Button, ErrorComponent, Switch } from "@formbricks/ui"; import { QuestionMarkCircleIcon, TagIcon } from "@heroicons/react/24/solid"; import { useState } from "react"; import AttributeDetailModal from "./AttributeDetailModal"; @@ -16,6 +16,7 @@ export default function AttributeClassesList({ environmentId }: { environmentId: const [isAttributeDetailModalOpen, setAttributeDetailModalOpen] = useState(false); const [isUploadCSVModalOpen, setUploadCSVModalOpen] = useState(false); const [activeAttributeClass, setActiveAttributeClass] = useState("" as any); + const [showArchived, setShowArchived] = useState(false); if (isLoadingAttributeClasses) { return ; @@ -30,9 +31,24 @@ export default function AttributeClassesList({ environmentId }: { environmentId: setAttributeDetailModalOpen(true); }; + const toggleShowArchived = () => { + setShowArchived(!showArchived); + }; + + const displayedAttributeClasses = showArchived ? attributeClasses : attributeClasses.filter(ac => !ac.archived); + const hasArchived = attributeClasses.some(ac => ac.archived); + return ( <> -
+
+ {hasArchived &&
+ Show archived + +
}
- {attributeClasses.map((attributeClass) => ( + {displayedAttributeClasses.map((attributeClass) => (
-
{attributeClass.name}
+
{attributeClass.name} + + {attributeClass.archived && } + +
{attributeClass.description}
diff --git a/apps/web/app/environments/[environmentId]/attributes/AttributeSettingsTab.tsx b/apps/web/app/environments/[environmentId]/attributes/AttributeSettingsTab.tsx index 35164d634b..571e60b1a5 100644 --- a/apps/web/app/environments/[environmentId]/attributes/AttributeSettingsTab.tsx +++ b/apps/web/app/environments/[environmentId]/attributes/AttributeSettingsTab.tsx @@ -3,6 +3,7 @@ import { useAttributeClassMutation } from "@/lib/attributeClasses/mutateAttribut import { Button, Input, Label } from "@formbricks/ui"; import type { AttributeClass } from "@prisma/client"; import { useForm } from "react-hook-form"; +import { ArchiveBoxArrowDownIcon, ArchiveBoxXMarkIcon } from "@heroicons/react/24/solid"; interface AttributeSettingsTabProps { environmentId: string; @@ -31,6 +32,12 @@ export default function AttributeSettingsTab({ setOpen(false); }; + const handleArchiveToggle = async () => { + const data = { archived: !attributeClass.archived }; + await triggerAttributeClassMutate(data); + mutateAttributeClasses(); + }; + return (
@@ -67,13 +74,22 @@ export default function AttributeSettingsTab({ ) : null}
-
+
+ {attributeClass.type !== "automatic" && ( + + )}
{attributeClass.type !== "automatic" && (
diff --git a/apps/web/app/environments/[environmentId]/people/[personId]/PersonDetails.tsx b/apps/web/app/environments/[environmentId]/people/[personId]/PersonDetails.tsx index 106a4c2c45..8c7e230443 100644 --- a/apps/web/app/environments/[environmentId]/people/[personId]/PersonDetails.tsx +++ b/apps/web/app/environments/[environmentId]/people/[personId]/PersonDetails.tsx @@ -38,7 +38,7 @@ export default function PersonDetails({ environmentId, personId }: PersonDetails const otherAttributes = useMemo( () => person?.attributes?.filter( - (attribute) => attribute.attributeClass.name !== "email" && attribute.attributeClass.name !== "userId" + (attribute) => attribute.attributeClass.name !== "email" && attribute.attributeClass.name !== "userId" && !attribute.attributeClass.archived ) as any[], [person] ); diff --git a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/WhoToSendCard.tsx b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/WhoToSendCard.tsx index 4dc0f9c2c8..e4d9c0b1eb 100644 --- a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/WhoToSendCard.tsx +++ b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/WhoToSendCard.tsx @@ -158,7 +158,7 @@ export default function WhoToSendCard({ environmentId, localSurvey, setLocalSurv - {attributeClasses.map((attributeClass) => ( + {attributeClasses.filter(attributeClass => !attributeClass.archived).map((attributeClass) => ( {attributeClass.name} ))} diff --git a/apps/web/pages/api/v1/environments/[environmentId]/people/[personId]/index.ts b/apps/web/pages/api/v1/environments/[environmentId]/people/[personId]/index.ts index db04cc1b1d..88a6bb92d8 100644 --- a/apps/web/pages/api/v1/environments/[environmentId]/people/[personId]/index.ts +++ b/apps/web/pages/api/v1/environments/[environmentId]/people/[personId]/index.ts @@ -73,6 +73,7 @@ export default async function handle(req: NextApiRequest, res: NextApiResponse) select: { name: true, description: true, + archived: true, }, }, }, diff --git a/packages/database/migrations/20230613035154_add_archived_to_attribute_class/migration.sql b/packages/database/migrations/20230613035154_add_archived_to_attribute_class/migration.sql new file mode 100644 index 0000000000..b6246f799f --- /dev/null +++ b/packages/database/migrations/20230613035154_add_archived_to_attribute_class/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "AttributeClass" ADD COLUMN "archived" BOOLEAN NOT NULL DEFAULT false; diff --git a/packages/database/schema.prisma b/packages/database/schema.prisma index af24b88df5..bfc020bba8 100644 --- a/packages/database/schema.prisma +++ b/packages/database/schema.prisma @@ -64,6 +64,7 @@ model AttributeClass { updatedAt DateTime @updatedAt @map(name: "updated_at") name String description String? + archived Boolean @default(false) type AttributeType environment Environment @relation(fields: [environmentId], references: [id], onDelete: Cascade) environmentId String From c5be453563bb0090e96e6eefa455706feaefd3ca Mon Sep 17 00:00:00 2001 From: Ashutosh-Bhadauriya Date: Tue, 13 Jun 2023 16:29:02 +0530 Subject: [PATCH 2/2] Increase badge margin and change button variant --- .../[environmentId]/attributes/AttributeClassesList.tsx | 6 +++--- .../[environmentId]/events/EventClassesList.tsx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/web/app/environments/[environmentId]/attributes/AttributeClassesList.tsx b/apps/web/app/environments/[environmentId]/attributes/AttributeClassesList.tsx index b5706627ea..eeded6316f 100644 --- a/apps/web/app/environments/[environmentId]/attributes/AttributeClassesList.tsx +++ b/apps/web/app/environments/[environmentId]/attributes/AttributeClassesList.tsx @@ -78,9 +78,9 @@ export default function AttributeClassesList({ environmentId }: { environmentId:
-
{attributeClass.name} - - {attributeClass.archived && } +
{attributeClass.name} + + {attributeClass.archived && }
{attributeClass.description}
diff --git a/apps/web/app/environments/[environmentId]/events/EventClassesList.tsx b/apps/web/app/environments/[environmentId]/events/EventClassesList.tsx index 06f45b2513..ccf8b6d71e 100644 --- a/apps/web/app/environments/[environmentId]/events/EventClassesList.tsx +++ b/apps/web/app/environments/[environmentId]/events/EventClassesList.tsx @@ -36,7 +36,7 @@ export default function EventClassesList({ environmentId }) { <>