From 7005ae2b53d34dec3057fc012d544b0fcdf97dd2 Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Date: Fri, 7 Mar 2025 11:31:41 +0530 Subject: [PATCH 1/4] chore: add more translation keys (#6715) --- packages/i18n/src/locales/en/translations.json | 5 +++-- packages/i18n/src/locales/es/translations.json | 3 ++- packages/i18n/src/locales/fr/translations.json | 5 +++-- packages/i18n/src/locales/it/translations.json | 5 +++-- packages/i18n/src/locales/ja/translations.json | 7 ++++--- packages/i18n/src/locales/ru/translations.json | 11 ++++++----- packages/i18n/src/locales/zh-CN/translations.json | 3 ++- web/core/components/issues/issue-modal/base.tsx | 8 ++++---- web/styles/command-pallette.css | 8 +++++--- 9 files changed, 32 insertions(+), 23 deletions(-) diff --git a/packages/i18n/src/locales/en/translations.json b/packages/i18n/src/locales/en/translations.json index b91a729324..601188b9b6 100644 --- a/packages/i18n/src/locales/en/translations.json +++ b/packages/i18n/src/locales/en/translations.json @@ -687,7 +687,7 @@ "you": "You", "upgrade_cta": { "higher_subscription": "Upgrade to higher subscription", - "talk_to_sales": "Talk to sales" + "talk_to_sales": "Talk to Sales" }, "category": "Category", "categories": "Categories", @@ -696,7 +696,8 @@ "delete": "Delete", "deleting": "Deleting", "pending": "Pending", - "invite": "Invite" + "invite": "Invite", + "view": "View" }, "chart": { diff --git a/packages/i18n/src/locales/es/translations.json b/packages/i18n/src/locales/es/translations.json index 9d14398c5d..9d35188f47 100644 --- a/packages/i18n/src/locales/es/translations.json +++ b/packages/i18n/src/locales/es/translations.json @@ -867,7 +867,8 @@ "delete": "Eliminar", "deleting": "Eliminando", "pending": "Pendiente", - "invite": "Invitar" + "invite": "Invitar", + "view": "Ver" }, "chart": { diff --git a/packages/i18n/src/locales/fr/translations.json b/packages/i18n/src/locales/fr/translations.json index 54765d8ba8..485511e8fd 100644 --- a/packages/i18n/src/locales/fr/translations.json +++ b/packages/i18n/src/locales/fr/translations.json @@ -856,7 +856,7 @@ "you": "Vous", "upgrade_cta": { "higher_subscription": "Passer à une abonnement plus élevé", - "talk_to_sales": "Parler à la vente" + "talk_to_sales": "Parler aux ventes" }, "category": "Catégorie", "categories": "Catégories", @@ -865,7 +865,8 @@ "delete": "Supprimer", "deleting": "Suppression", "pending": "En attente", - "invite": "Inviter" + "invite": "Inviter", + "view": "Afficher" }, "chart": { diff --git a/packages/i18n/src/locales/it/translations.json b/packages/i18n/src/locales/it/translations.json index 35ce1af8db..60fbc51d56 100644 --- a/packages/i18n/src/locales/it/translations.json +++ b/packages/i18n/src/locales/it/translations.json @@ -862,7 +862,8 @@ "delete": "Elimina", "deleting": "Eliminazione in corso", "pending": "In sospeso", - "invite": "Invita" + "invite": "Invita", + "view": "Visualizza" }, "chart": { @@ -982,7 +983,7 @@ "created_on": "Creato il", "sub_issue": "Sotto-elemento di lavoro", "work_item_count": "Conteggio degli elementi di lavoro" - }, + }, "extra": { "show_sub_issues": "Mostra sotto-elementi di lavoro", "show_empty_groups": "Mostra gruppi vuoti" diff --git a/packages/i18n/src/locales/ja/translations.json b/packages/i18n/src/locales/ja/translations.json index f30878a5e6..e61d4048cd 100644 --- a/packages/i18n/src/locales/ja/translations.json +++ b/packages/i18n/src/locales/ja/translations.json @@ -856,7 +856,7 @@ "you": "あなた", "upgrade_cta": { "higher_subscription": "高いサブスクリプションにアップグレード", - "talk_to_sales": "セールスに連絡" + "talk_to_sales": "トーク トゥ セールス" }, "category": "カテゴリー", "categories": "カテゴリーズ", @@ -865,7 +865,8 @@ "delete": "デリート", "deleting": "デリーティング", "pending": "保留中", - "invite": "招待" + "invite": "招待", + "view": "ビュー" }, "chart": { @@ -985,7 +986,7 @@ "created_on": "作成日", "sub_issue": "サブ作業項目", "work_item_count": "作業項目数" - }, + }, "extra": { "show_sub_issues": "サブ作業項目を表示", "show_empty_groups": "空のグループを表示" diff --git a/packages/i18n/src/locales/ru/translations.json b/packages/i18n/src/locales/ru/translations.json index f5ac9f0ee6..8f4deae95c 100644 --- a/packages/i18n/src/locales/ru/translations.json +++ b/packages/i18n/src/locales/ru/translations.json @@ -864,7 +864,8 @@ "delete": "Удалить", "deleting": "Удаление", "pending": "Ожидание", - "invite": "Пригласить" + "invite": "Пригласить", + "view": "Просмотр" }, "chart": { @@ -1867,7 +1868,7 @@ } }, "completed_no_issues": { - "title": "Нет рабочих элементов в цикле", + "title": "Нет рабочих элементов в цикле", "description": "Нет рабочих элементов. Рабочие элементы были перенесены или скрыты. Для просмотра измените настройки отображения." }, "active": { @@ -2286,7 +2287,7 @@ "short_description": "Экспорт в csv" }, "excel": { - "title": "Excel", + "title": "Excel", "description": "Экспорт рабочих элементов в файл Excel.", "short_description": "Экспорт в excel" }, @@ -2304,7 +2305,7 @@ "default_global_view": { "all_issues": "Все рабочие элементы", "assigned": "Назначенные", - "created": "Созданные", + "created": "Созданные", "subscribed": "Подписанные" }, @@ -2333,7 +2334,7 @@ "project_modules": { "status": { "backlog": "Бэклог", - "planned": "Запланировано", + "planned": "Запланировано", "in_progress": "В процессе", "paused": "Приостановлено", "completed": "Завершено", diff --git a/packages/i18n/src/locales/zh-CN/translations.json b/packages/i18n/src/locales/zh-CN/translations.json index 4d21ac3b91..8155fa156b 100644 --- a/packages/i18n/src/locales/zh-CN/translations.json +++ b/packages/i18n/src/locales/zh-CN/translations.json @@ -865,7 +865,8 @@ "delete": "删除", "deleting": "删除中", "pending": "待处理", - "invite": "邀请" + "invite": "邀请", + "view": "查看" }, "chart": { diff --git a/web/core/components/issues/issue-modal/base.tsx b/web/core/components/issues/issue-modal/base.tsx index 5151d22861..c2e6421b9f 100644 --- a/web/core/components/issues/issue-modal/base.tsx +++ b/web/core/components/issues/issue-modal/base.tsx @@ -241,11 +241,11 @@ export const CreateUpdateIssueModalBase: React.FC = observer(( setDescription("

"); setChangesMade(null); return response; - } catch (error) { + } catch (error: any) { setToast({ type: TOAST_TYPE.ERROR, title: t("error"), - message: t(is_draft_issue ? "draft_creation_failed" : "issue_creation_failed"), + message: error?.error ?? t(is_draft_issue ? "draft_creation_failed" : "issue_creation_failed"), }); captureIssueEvent({ eventName: ISSUE_CREATED, @@ -299,12 +299,12 @@ export const CreateUpdateIssueModalBase: React.FC = observer(( path: pathname, }); handleClose(); - } catch (error) { + } catch (error: any) { console.error(error); setToast({ type: TOAST_TYPE.ERROR, title: t("error"), - message: t("issue_could_not_be_updated"), + message: error?.error ?? t("issue_could_not_be_updated"), }); captureIssueEvent({ eventName: ISSUE_UPDATED, diff --git a/web/styles/command-pallette.css b/web/styles/command-pallette.css index e8ca3db4b6..133b5299f0 100644 --- a/web/styles/command-pallette.css +++ b/web/styles/command-pallette.css @@ -38,12 +38,14 @@ background-color: rgba(var(--color-background-80)); } -[cmdk-item][aria-disabled="true"], [cmdk-item][data-disabled="true"] { +[cmdk-item][aria-disabled="true"], +[cmdk-item][data-disabled="true"] { cursor: not-allowed; opacity: 0.5; background-color: transparent; } -[cmdk-item][aria-disabled="true"]:hover, [cmdk-item][data-disabled="true"]:hover { - background-color: transparent; +[cmdk-item][aria-disabled="true"]:hover, +[cmdk-item][data-disabled="true"]:hover { + background-color: rgba(var(--color-background-80), 0.7); } From 40c0bbcfb40ad57a391ae8c5dde90522d99f04dc Mon Sep 17 00:00:00 2001 From: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Date: Fri, 7 Mar 2025 13:08:34 +0530 Subject: [PATCH 2/4] fix: assignee validation when updating issues (#6720) * fix: assignee validation * chore: remove prints * fix: remove all assignees --- apiserver/plane/app/serializers/issue.py | 55 ++++++++++++------------ apiserver/plane/app/views/intake/base.py | 6 ++- apiserver/plane/app/views/issue/base.py | 16 +++---- apiserver/plane/space/views/intake.py | 9 +++- 4 files changed, 45 insertions(+), 41 deletions(-) diff --git a/apiserver/plane/app/serializers/issue.py b/apiserver/plane/app/serializers/issue.py index 1b754ea6af..b9306a728b 100644 --- a/apiserver/plane/app/serializers/issue.py +++ b/apiserver/plane/app/serializers/issue.py @@ -111,25 +111,23 @@ class IssueCreateSerializer(BaseSerializer): data["label_ids"] = label_ids if label_ids else [] return data - def validate(self, data): + def validate(self, attrs): if ( - data.get("start_date", None) is not None - and data.get("target_date", None) is not None - and data.get("start_date", None) > data.get("target_date", None) + attrs.get("start_date", None) is not None + and attrs.get("target_date", None) is not None + and attrs.get("start_date", None) > attrs.get("target_date", None) ): raise serializers.ValidationError("Start date cannot exceed target date") - return data - def get_valid_assignees(self, assignees, project_id): - if not assignees: - return [] + if attrs.get("assignee_ids", []): + attrs["assignee_ids"] = ProjectMember.objects.filter( + project_id=self.context["project_id"], + role__gte=15, + is_active=True, + member_id__in=attrs["assignee_ids"], + ).values_list("member_id", flat=True) - return ProjectMember.objects.filter( - project_id=project_id, - role__gte=15, - is_active=True, - member_id__in=assignees - ).values_list('member_id', flat=True) + return attrs def create(self, validated_data): assignees = validated_data.pop("assignee_ids", None) @@ -146,20 +144,19 @@ class IssueCreateSerializer(BaseSerializer): created_by_id = issue.created_by_id updated_by_id = issue.updated_by_id - valid_assignee_ids = self.get_valid_assignees(assignees, project_id) - if valid_assignee_ids is not None and len(valid_assignee_ids): + if assignees is not None and len(assignees): try: IssueAssignee.objects.bulk_create( [ IssueAssignee( - assignee_id=user_id, + assignee_id=assignee_id, issue=issue, project_id=project_id, workspace_id=workspace_id, created_by_id=created_by_id, updated_by_id=updated_by_id, ) - for user_id in valid_assignee_ids + for assignee_id in assignees ], batch_size=10, ) @@ -167,12 +164,15 @@ class IssueCreateSerializer(BaseSerializer): pass else: # Then assign it to default assignee, if it is a valid assignee - if default_assignee_id is not None and ProjectMember.objects.filter( - member_id=default_assignee_id, - project_id=project_id, - role__gte=15, - is_active=True - ).exists(): + if ( + default_assignee_id is not None + and ProjectMember.objects.filter( + member_id=default_assignee_id, + project_id=project_id, + role__gte=15, + is_active=True, + ).exists() + ): try: IssueAssignee.objects.create( assignee_id=default_assignee_id, @@ -216,21 +216,20 @@ class IssueCreateSerializer(BaseSerializer): created_by_id = instance.created_by_id updated_by_id = instance.updated_by_id - valid_assignee_ids = self.get_valid_assignees(assignees, project_id) - if valid_assignee_ids is not None: + if assignees is not None: IssueAssignee.objects.filter(issue=instance).delete() try: IssueAssignee.objects.bulk_create( [ IssueAssignee( - assignee_id=user_id, + assignee_id=assignee_id, issue=instance, project_id=project_id, workspace_id=workspace_id, created_by_id=created_by_id, updated_by_id=updated_by_id, ) - for user_id in valid_assignee_ids + for assignee_id in assignees ], batch_size=10, ignore_conflicts=True, diff --git a/apiserver/plane/app/views/intake/base.py b/apiserver/plane/app/views/intake/base.py index 631fe80da1..fb10bc002c 100644 --- a/apiserver/plane/app/views/intake/base.py +++ b/apiserver/plane/app/views/intake/base.py @@ -178,7 +178,9 @@ class IntakeIssueViewSet(BaseViewSet): workspace__slug=slug, project_id=project_id ).first() if not intake: - return Response({"error": "Intake not found"}, status=status.HTTP_404_NOT_FOUND) + return Response( + {"error": "Intake not found"}, status=status.HTTP_404_NOT_FOUND + ) project = Project.objects.get(pk=project_id) filters = issue_filters(request.GET, "GET", "issue__") @@ -385,7 +387,7 @@ class IntakeIssueViewSet(BaseViewSet): } issue_serializer = IssueCreateSerializer( - issue, data=issue_data, partial=True + issue, data=issue_data, partial=True, context={"project_id": project_id} ) if issue_serializer.is_valid(): diff --git a/apiserver/plane/app/views/issue/base.py b/apiserver/plane/app/views/issue/base.py index 48ea2f6bc3..79ffe35d8b 100644 --- a/apiserver/plane/app/views/issue/base.py +++ b/apiserver/plane/app/views/issue/base.py @@ -635,7 +635,9 @@ class IssueViewSet(BaseViewSet): ) requested_data = json.dumps(self.request.data, cls=DjangoJSONEncoder) - serializer = IssueCreateSerializer(issue, data=request.data, partial=True) + serializer = IssueCreateSerializer( + issue, data=request.data, partial=True, context={"project_id": project_id} + ) if serializer.is_valid(): serializer.save() issue_activity.delay( @@ -1099,7 +1101,6 @@ class IssueBulkUpdateDateEndpoint(BaseAPIView): class IssueMetaEndpoint(BaseAPIView): - @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="PROJECT") def get(self, request, slug, project_id, issue_id): issue = Issue.issue_objects.only("sequence_id", "project__identifier").get( @@ -1115,14 +1116,12 @@ class IssueMetaEndpoint(BaseAPIView): class IssueDetailIdentifierEndpoint(BaseAPIView): - def strict_str_to_int(self, s): - if not s.isdigit() and not (s.startswith('-') and s[1:].isdigit()): + if not s.isdigit() and not (s.startswith("-") and s[1:].isdigit()): raise ValueError("Invalid integer string") return int(s) def get(self, request, slug, project_identifier, issue_identifier): - # Check if the issue identifier is a valid integer try: issue_identifier = self.strict_str_to_int(issue_identifier) @@ -1134,8 +1133,7 @@ class IssueDetailIdentifierEndpoint(BaseAPIView): # Fetch the project project = Project.objects.get( - identifier__iexact=project_identifier, - workspace__slug=slug, + identifier__iexact=project_identifier, workspace__slug=slug ) # Check if the user is a member of the project @@ -1237,8 +1235,8 @@ class IssueDetailIdentifierEndpoint(BaseAPIView): .annotate( is_subscribed=Exists( IssueSubscriber.objects.filter( - workspace__slug=slug, - project_id=project.id, + workspace__slug=slug, + project_id=project.id, issue__sequence_id=issue_identifier, subscriber=request.user, ) diff --git a/apiserver/plane/space/views/intake.py b/apiserver/plane/space/views/intake.py index bfce3a8bbe..644a2de3af 100644 --- a/apiserver/plane/space/views/intake.py +++ b/apiserver/plane/space/views/intake.py @@ -12,7 +12,7 @@ from rest_framework.response import Response # Module imports from .base import BaseViewSet -from plane.db.models import IntakeIssue, Issue, State, IssueLink, FileAsset, DeployBoard +from plane.db.models import IntakeIssue, Issue, IssueLink, FileAsset, DeployBoard from plane.app.serializers import ( IssueSerializer, IntakeIssueSerializer, @@ -202,7 +202,12 @@ class IntakeIssuePublicViewSet(BaseViewSet): "description": issue_data.get("description", issue.description), } - issue_serializer = IssueCreateSerializer(issue, data=issue_data, partial=True) + issue_serializer = IssueCreateSerializer( + issue, + data=issue_data, + partial=True, + context={"project_id": project_deploy_board.project_id}, + ) if issue_serializer.is_valid(): current_instance = issue From cb344ea1f5ded8bc864c577438d46cd5cf4afb41 Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Date: Fri, 7 Mar 2025 13:17:13 +0530 Subject: [PATCH 3/4] refactor: favorites sidebar implementation (#6716) * chore: code separation for favorites * chore: error handling --- web/ce/constants/index.ts | 1 + web/ce/constants/sidebar-favorites.ts | 41 ++++++++++ .../use-additional-favorite-item-details.ts | 26 +++++++ .../favorite-items/common/helper.tsx | 76 +++++++++---------- web/core/hooks/use-favorite-item-details.tsx | 24 +++--- web/ee/constants/index.ts | 1 + web/ee/constants/sidebar-favorites.ts | 1 + .../use-additional-favorite-item-details.ts | 1 + 8 files changed, 121 insertions(+), 50 deletions(-) create mode 100644 web/ce/constants/sidebar-favorites.ts create mode 100644 web/ce/hooks/use-additional-favorite-item-details.ts create mode 100644 web/ee/constants/index.ts create mode 100644 web/ee/constants/sidebar-favorites.ts create mode 100644 web/ee/hooks/use-additional-favorite-item-details.ts diff --git a/web/ce/constants/index.ts b/web/ce/constants/index.ts index 895c18c3db..1a86ad1e24 100644 --- a/web/ce/constants/index.ts +++ b/web/ce/constants/index.ts @@ -2,3 +2,4 @@ export * from "./ai"; export * from "./estimates"; export * from "./gantt-chart"; export * from "./project"; +export * from "./sidebar-favorites"; diff --git a/web/ce/constants/sidebar-favorites.ts b/web/ce/constants/sidebar-favorites.ts new file mode 100644 index 0000000000..9fa80e05f4 --- /dev/null +++ b/web/ce/constants/sidebar-favorites.ts @@ -0,0 +1,41 @@ +import { Briefcase, ContrastIcon, FileText, Layers, LucideIcon } from "lucide-react"; +// plane imports +import { IFavorite } from "@plane/types"; +import { DiceIcon, FavoriteFolderIcon, ISvgIcons } from "@plane/ui"; + +export const FAVORITE_ITEM_ICONS: Record | LucideIcon> = { + page: FileText, + project: Briefcase, + view: Layers, + module: DiceIcon, + cycle: ContrastIcon, + folder: FavoriteFolderIcon, +}; + +export const FAVORITE_ITEM_LINKS: { + [key: string]: { + itemLevel: "project" | "workspace"; + getLink: (favorite: IFavorite) => string; + }; +} = { + project: { + itemLevel: "project", + getLink: () => `issues`, + }, + cycle: { + itemLevel: "project", + getLink: (favorite) => `cycles/${favorite.entity_identifier}`, + }, + module: { + itemLevel: "project", + getLink: (favorite) => `modules/${favorite.entity_identifier}`, + }, + view: { + itemLevel: "project", + getLink: (favorite) => `views/${favorite.entity_identifier}`, + }, + page: { + itemLevel: "project", + getLink: (favorite) => `pages/${favorite.entity_identifier}`, + }, +}; diff --git a/web/ce/hooks/use-additional-favorite-item-details.ts b/web/ce/hooks/use-additional-favorite-item-details.ts new file mode 100644 index 0000000000..412f4a39a2 --- /dev/null +++ b/web/ce/hooks/use-additional-favorite-item-details.ts @@ -0,0 +1,26 @@ +// plane imports +import { IFavorite } from "@plane/types"; +// components +import { getFavoriteItemIcon } from "@/components/workspace/sidebar/favorites/favorite-items/common"; + +export const useAdditionalFavoriteItemDetails = () => { + const getAdditionalFavoriteItemDetails = (_workspaceSlug: string, favorite: IFavorite) => { + const { entity_type: favoriteItemEntityType } = favorite; + const favoriteItemName = favorite?.entity_data?.name || favorite?.name; + + let itemIcon; + let itemTitle; + + switch (favoriteItemEntityType) { + default: + itemTitle = favoriteItemName; + itemIcon = getFavoriteItemIcon(favoriteItemEntityType); + break; + } + return { itemIcon, itemTitle }; + }; + + return { + getAdditionalFavoriteItemDetails, + }; +}; diff --git a/web/core/components/workspace/sidebar/favorites/favorite-items/common/helper.tsx b/web/core/components/workspace/sidebar/favorites/favorite-items/common/helper.tsx index e2f303afe7..670f9ba116 100644 --- a/web/core/components/workspace/sidebar/favorites/favorite-items/common/helper.tsx +++ b/web/core/components/workspace/sidebar/favorites/favorite-items/common/helper.tsx @@ -1,49 +1,45 @@ "use client"; -// lucide -import { Briefcase, FileText, Layers } from "lucide-react"; -// types + +import { FileText } from "lucide-react"; +// plane imports import { IFavorite, TLogoProps } from "@plane/types"; -// ui -import { ContrastIcon, DiceIcon, FavoriteFolderIcon } from "@plane/ui"; +// components import { Logo } from "@/components/common"; +// plane web constants +import { FAVORITE_ITEM_ICONS, FAVORITE_ITEM_LINKS } from "@/plane-web/constants"; -const iconClassName = `flex-shrink-0 size-4 stroke-[1.5] m-auto`; +export const getFavoriteItemIcon = (type: string, logo?: TLogoProps | undefined) => { + const Icon = FAVORITE_ITEM_ICONS[type] || FileText; -export const FAVORITE_ITEM_ICON: Record = { - page: , - project: , - view: , - module: , - cycle: , - folder: , -}; - -export const getFavoriteItemIcon = (type: string, logo?: TLogoProps | undefined) => ( - <> -
- {FAVORITE_ITEM_ICON[type] || } -
-
- {logo?.in_use ? ( - - ) : ( - FAVORITE_ITEM_ICON[type] || - )} -
- -); - -const entityPaths: Record = { - project: "issues", - cycle: "cycles", - module: "modules", - view: "views", - page: "pages", + return ( + <> +
+ +
+
+ {logo?.in_use ? ( + + ) : ( + + )} +
+ + ); }; export const generateFavoriteItemLink = (workspaceSlug: string, favorite: IFavorite) => { - const entityPath = entityPaths[favorite.entity_type]; - return entityPath - ? `/${workspaceSlug}/projects/${favorite.project_id}/${entityPath}/${entityPath === "issues" ? "" : favorite.entity_identifier || ""}` - : `/${workspaceSlug}`; + const entityLinkDetails = FAVORITE_ITEM_LINKS[favorite.entity_type]; + + if (!entityLinkDetails) { + console.error(`Unrecognized favorite entity type: ${favorite.entity_type}`); + return `/${workspaceSlug}`; + } + + if (entityLinkDetails.itemLevel === "workspace") { + return `/${workspaceSlug}/${entityLinkDetails.getLink(favorite)}`; + } else if (entityLinkDetails.itemLevel === "project") { + return `/${workspaceSlug}/projects/${favorite.project_id}/${entityLinkDetails.getLink(favorite)}`; + } else { + return `/${workspaceSlug}`; + } }; diff --git a/web/core/hooks/use-favorite-item-details.tsx b/web/core/hooks/use-favorite-item-details.tsx index b873ad07b5..343e143ed8 100644 --- a/web/core/hooks/use-favorite-item-details.tsx +++ b/web/core/hooks/use-favorite-item-details.tsx @@ -1,4 +1,4 @@ -// plane types +// plane imports import { IFavorite } from "@plane/types"; // components import { @@ -11,19 +11,22 @@ import { getPageName } from "@/helpers/page.helper"; import { useProject, useProjectView, useCycle, useModule } from "@/hooks/store"; // plane web hooks import { EPageStoreType, usePage } from "@/plane-web/hooks/store"; +import { useAdditionalFavoriteItemDetails } from "@/plane-web/hooks/use-additional-favorite-item-details"; export const useFavoriteItemDetails = (workspaceSlug: string, favorite: IFavorite) => { - const favoriteItemId = favorite?.entity_identifier; - const favoriteItemLogoProps = favorite?.entity_data?.logo_props; + const { + entity_identifier: favoriteItemId, + entity_data: { logo_props: favoriteItemLogoProps }, + entity_type: favoriteItemEntityType, + } = favorite; const favoriteItemName = favorite?.entity_data?.name || favorite?.name; - const favoriteItemEntityType = favorite?.entity_type; - // store hooks const { getViewById } = useProjectView(); const { getProjectById } = useProject(); const { getCycleById } = useCycle(); const { getModuleById } = useModule(); - + // additional details + const { getAdditionalFavoriteItemDetails } = useAdditionalFavoriteItemDetails(); // derived values const pageDetail = usePage({ pageId: favoriteItemId ?? "", @@ -32,7 +35,6 @@ export const useFavoriteItemDetails = (workspaceSlug: string, favorite: IFavorit const viewDetails = getViewById(favoriteItemId ?? ""); const cycleDetail = getCycleById(favoriteItemId ?? ""); const moduleDetail = getModuleById(favoriteItemId ?? ""); - const currentProjectDetails = getProjectById(favorite.project_id ?? ""); let itemIcon; @@ -60,10 +62,12 @@ export const useFavoriteItemDetails = (workspaceSlug: string, favorite: IFavorit itemTitle = moduleDetail?.name || favoriteItemName; itemIcon = getFavoriteItemIcon("module"); break; - default: - itemTitle = favoriteItemName; - itemIcon = getFavoriteItemIcon(favoriteItemEntityType); + default: { + const additionalDetails = getAdditionalFavoriteItemDetails(workspaceSlug, favorite); + itemTitle = additionalDetails.itemTitle; + itemIcon = additionalDetails.itemIcon; break; + } } return { itemIcon, itemTitle, itemLink }; diff --git a/web/ee/constants/index.ts b/web/ee/constants/index.ts new file mode 100644 index 0000000000..049f831bdf --- /dev/null +++ b/web/ee/constants/index.ts @@ -0,0 +1 @@ +export * from "./sidebar-favorites"; diff --git a/web/ee/constants/sidebar-favorites.ts b/web/ee/constants/sidebar-favorites.ts new file mode 100644 index 0000000000..540c918e73 --- /dev/null +++ b/web/ee/constants/sidebar-favorites.ts @@ -0,0 +1 @@ +export * from "ce/constants/sidebar-favorites"; diff --git a/web/ee/hooks/use-additional-favorite-item-details.ts b/web/ee/hooks/use-additional-favorite-item-details.ts new file mode 100644 index 0000000000..c3e863cea0 --- /dev/null +++ b/web/ee/hooks/use-additional-favorite-item-details.ts @@ -0,0 +1 @@ +export * from "ce/hooks/use-additional-favorite-item-details"; From a77fe7aa9070b80a8d0f81d8b8d07ce8690f30f7 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Fri, 7 Mar 2025 13:35:54 +0530 Subject: [PATCH 4/4] fix: django version upgrade to fix vulnerability --- apiserver/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apiserver/requirements/base.txt b/apiserver/requirements/base.txt index 41a5e0f131..ff220984d4 100644 --- a/apiserver/requirements/base.txt +++ b/apiserver/requirements/base.txt @@ -1,7 +1,7 @@ # base requirements # django -Django==4.2.18 +Django==4.2.20 # rest framework djangorestframework==3.15.2 # postgres