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 (
-
+
+ {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