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