From fed5916907621d3c4bc4ea858399cbddea971fcc Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Wed, 3 Apr 2024 18:01:11 +0530 Subject: [PATCH 001/105] [WEB-848] fix: issue with parent child relation not being removed from update issue modal. (#4103) --- web/components/issues/issue-modal/form.tsx | 58 ++++++++++++---------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/web/components/issues/issue-modal/form.tsx b/web/components/issues/issue-modal/form.tsx index 6112a27fea..b581522e6e 100644 --- a/web/components/issues/issue-modal/form.tsx +++ b/web/components/issues/issue-modal/form.tsx @@ -327,32 +327,38 @@ export const IssueFormRoot: FC = observer((props) => { {watch("parent_id") && selectedParentIssue && ( -
-
- - - {selectedParentIssue.project__identifier}-{selectedParentIssue.sequence_id} - - {selectedParentIssue.name.substring(0, 50)} - -
-
+ ( +
+
+ + + {selectedParentIssue.project__identifier}-{selectedParentIssue.sequence_id} + + {selectedParentIssue.name.substring(0, 50)} + +
+
+ )} + /> )}
From 68ebcfd04ee608772d134e806cd6d62fceada080 Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Wed, 3 Apr 2024 18:02:07 +0530 Subject: [PATCH 002/105] [842] chore: disable comments and reactions in archived issues. (#4101) --- .../issue-activity/activity-comment-root.tsx | 4 ++- .../issue-activity/comments/comment-card.tsx | 6 ++-- .../issue-activity/comments/root.tsx | 4 ++- .../issue-detail/issue-activity/root.tsx | 29 +++++++++------- .../issues/issue-detail/main-content.tsx | 2 +- .../issue-detail/reactions/issue-comment.tsx | 33 ++++++++++++------- .../issues/issue-detail/reactions/issue.tsx | 20 +++++++---- .../issues/peek-overview/issue-detail.tsx | 1 + web/components/issues/peek-overview/view.tsx | 14 ++++++-- 9 files changed, 77 insertions(+), 36 deletions(-) diff --git a/web/components/issues/issue-detail/issue-activity/activity-comment-root.tsx b/web/components/issues/issue-detail/issue-activity/activity-comment-root.tsx index c7842a8db4..17794a618a 100644 --- a/web/components/issues/issue-detail/issue-activity/activity-comment-root.tsx +++ b/web/components/issues/issue-detail/issue-activity/activity-comment-root.tsx @@ -13,10 +13,11 @@ type TIssueActivityCommentRoot = { issueId: string; activityOperations: TActivityOperations; showAccessSpecifier?: boolean; + disabled?: boolean; }; export const IssueActivityCommentRoot: FC = observer((props) => { - const { workspaceSlug, issueId, activityOperations, showAccessSpecifier } = props; + const { workspaceSlug, issueId, activityOperations, showAccessSpecifier, disabled } = props; // hooks const { activity: { getActivityCommentByIssueId }, @@ -37,6 +38,7 @@ export const IssueActivityCommentRoot: FC = observer( activityOperations={activityOperations} ends={index === 0 ? "top" : index === activityComments.length - 1 ? "bottom" : undefined} showAccessSpecifier={showAccessSpecifier} + disabled={disabled} /> ) : activityComment.activity_type === "ACTIVITY" ? ( = (props) => { - const { workspaceSlug, commentId, activityOperations, ends, showAccessSpecifier = false } = props; + const { workspaceSlug, commentId, activityOperations, ends, showAccessSpecifier = false, disabled = false } = props; // hooks const { comment: { getCommentById }, @@ -81,7 +82,7 @@ export const IssueCommentCard: FC = (props) => { commentId={commentId} quickActions={ <> - {currentUser?.id === comment.actor && ( + {!disabled && currentUser?.id === comment.actor && ( setIsEditing(true)} className="flex items-center gap-1"> @@ -184,6 +185,7 @@ export const IssueCommentCard: FC = (props) => { projectId={comment?.project_detail?.id} commentId={comment.id} currentUser={currentUser} + disabled={disabled} />
diff --git a/web/components/issues/issue-detail/issue-activity/comments/root.tsx b/web/components/issues/issue-detail/issue-activity/comments/root.tsx index 52a500a16b..d374da8758 100644 --- a/web/components/issues/issue-detail/issue-activity/comments/root.tsx +++ b/web/components/issues/issue-detail/issue-activity/comments/root.tsx @@ -12,10 +12,11 @@ type TIssueCommentRoot = { issueId: string; activityOperations: TActivityOperations; showAccessSpecifier?: boolean; + disabled?: boolean; }; export const IssueCommentRoot: FC = observer((props) => { - const { workspaceSlug, issueId, activityOperations, showAccessSpecifier } = props; + const { workspaceSlug, issueId, activityOperations, showAccessSpecifier, disabled } = props; // hooks const { comment: { getCommentsByIssueId }, @@ -34,6 +35,7 @@ export const IssueCommentRoot: FC = observer((props) => { ends={index === 0 ? "top" : index === commentIds.length - 1 ? "bottom" : undefined} activityOperations={activityOperations} showAccessSpecifier={showAccessSpecifier} + disabled={disabled} /> ))}
diff --git a/web/components/issues/issue-detail/issue-activity/root.tsx b/web/components/issues/issue-detail/issue-activity/root.tsx index 75c8bfd4cf..1056ecf778 100644 --- a/web/components/issues/issue-detail/issue-activity/root.tsx +++ b/web/components/issues/issue-detail/issue-activity/root.tsx @@ -14,6 +14,7 @@ type TIssueActivity = { workspaceSlug: string; projectId: string; issueId: string; + disabled?: boolean; }; type TActivityTabs = "all" | "activity" | "comments"; @@ -43,7 +44,7 @@ export type TActivityOperations = { }; export const IssueActivity: FC = observer((props) => { - const { workspaceSlug, projectId, issueId } = props; + const { workspaceSlug, projectId, issueId, disabled = false } = props; // hooks const { createComment, updateComment, removeComment } = useIssueDetail(); const { getProjectById } = useProject(); @@ -145,12 +146,15 @@ export const IssueActivity: FC = observer((props) => { issueId={issueId} activityOperations={activityOperations} showAccessSpecifier={project.is_deployed} + disabled={disabled} /> - + {!disabled && ( + + )} ) : activityTab === "activity" ? ( @@ -161,12 +165,15 @@ export const IssueActivity: FC = observer((props) => { issueId={issueId} activityOperations={activityOperations} showAccessSpecifier={project.is_deployed} + disabled={disabled} /> - + {!disabled && ( + + )} )} diff --git a/web/components/issues/issue-detail/main-content.tsx b/web/components/issues/issue-detail/main-content.tsx index 50d168dcaf..241c96109a 100644 --- a/web/components/issues/issue-detail/main-content.tsx +++ b/web/components/issues/issue-detail/main-content.tsx @@ -132,7 +132,7 @@ export const IssueMainContent: React.FC = observer((props) => { disabled={!is_editable} /> - + ); }); diff --git a/web/components/issues/issue-detail/reactions/issue-comment.tsx b/web/components/issues/issue-detail/reactions/issue-comment.tsx index 2925a593d2..5461e35c43 100644 --- a/web/components/issues/issue-detail/reactions/issue-comment.tsx +++ b/web/components/issues/issue-detail/reactions/issue-comment.tsx @@ -3,10 +3,12 @@ import { observer } from "mobx-react-lite"; import { IUser } from "@plane/types"; // components import { TOAST_TYPE, Tooltip, setToast } from "@plane/ui"; +// helper +import { cn } from "@/helpers/common.helper"; import { renderEmoji } from "@/helpers/emoji.helper"; import { formatTextList } from "@/helpers/issue.helper"; +// hooks import { useIssueDetail, useMember } from "@/hooks/store"; -// helper // types import { ReactionSelector } from "./reaction-selector"; @@ -15,10 +17,11 @@ export type TIssueCommentReaction = { projectId: string; commentId: string; currentUser: IUser; + disabled?: boolean; }; export const IssueCommentReaction: FC = observer((props) => { - const { workspaceSlug, projectId, commentId, currentUser } = props; + const { workspaceSlug, projectId, commentId, currentUser, disabled = false } = props; // hooks const { @@ -88,12 +91,14 @@ export const IssueCommentReaction: FC = observer((props) return (
- + {!disabled && ( + + )} {reactionIds && Object.keys(reactionIds || {}).map( @@ -103,11 +108,15 @@ export const IssueCommentReaction: FC = observer((props)
diff --git a/web/components/issues/peek-overview/view.tsx b/web/components/issues/peek-overview/view.tsx index 35925d6cd5..0366fbb61d 100644 --- a/web/components/issues/peek-overview/view.tsx +++ b/web/components/issues/peek-overview/view.tsx @@ -177,7 +177,12 @@ export const IssueView: FC = observer((props) => { disabled={disabled || is_archived} /> - + ) : (
@@ -210,7 +215,12 @@ export const IssueView: FC = observer((props) => { workspaceSlug={workspaceSlug} /> - +
Date: Wed, 3 Apr 2024 18:03:16 +0530 Subject: [PATCH 003/105] [WEB-830] chore: project filter dropdown custom date select option improvement (#4069) * chore: project filter dropdown custom date select option improvement * fix: project filter custom date --- web/components/headers/projects.tsx | 1 + .../project/dropdowns/filters/created-at.tsx | 15 ++++++++++++++- web/helpers/date-time.helper.ts | 4 ++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/web/components/headers/projects.tsx b/web/components/headers/projects.tsx index 2f502bce59..64c370d17f 100644 --- a/web/components/headers/projects.tsx +++ b/web/components/headers/projects.tsx @@ -57,6 +57,7 @@ export const ProjectsHeader = observer(() => { if (Array.isArray(value)) value.forEach((val) => { if (!newValues.includes(val)) newValues.push(val); + else newValues.splice(newValues.indexOf(val), 1); }); else { if (filters?.[key]?.includes(value)) newValues.splice(newValues.indexOf(value), 1); diff --git a/web/components/project/dropdowns/filters/created-at.tsx b/web/components/project/dropdowns/filters/created-at.tsx index 5a1b75c00b..8992814216 100644 --- a/web/components/project/dropdowns/filters/created-at.tsx +++ b/web/components/project/dropdowns/filters/created-at.tsx @@ -5,6 +5,8 @@ import { DateFilterModal } from "@/components/core"; import { FilterHeader, FilterOption } from "@/components/issues"; // constants import { DATE_BEFORE_FILTER_OPTIONS } from "@/constants/filters"; +// helpers +import { isDate } from "@/helpers/date-time.helper"; type Props = { appliedFilters: string[] | null; @@ -24,6 +26,17 @@ export const FilterCreatedDate: React.FC = observer((props) => { d.name.toLowerCase().includes(searchQuery.toLowerCase()) ); + const isCustomDateSelected = () => { + const isValidDateSelected = appliedFilters?.filter((f) => isDate(f.split(";")[0])) || []; + return isValidDateSelected.length > 0 ? true : false; + }; + const handleCustomDate = () => { + if (isCustomDateSelected()) { + const updateAppliedFilters = appliedFilters?.filter((f) => f.includes("-")) || []; + handleUpdate(updateAppliedFilters); + } else setIsDateFilterModalOpen(true); + }; + return ( <> {isDateFilterModalOpen && ( @@ -52,7 +65,7 @@ export const FilterCreatedDate: React.FC = observer((props) => { multiple /> ))} - setIsDateFilterModalOpen(true)} title="Custom" multiple /> + ) : (

No matches found

diff --git a/web/helpers/date-time.helper.ts b/web/helpers/date-time.helper.ts index 7ca4d49fb1..ba594e6b16 100644 --- a/web/helpers/date-time.helper.ts +++ b/web/helpers/date-time.helper.ts @@ -224,3 +224,7 @@ export const getDate = (date: string | Date | undefined | null): Date | undefine return undefined; } }; +export const isDate = (date: string) => { + const datePattern = /^\d{4}-\d{2}-\d{2}$/; + return datePattern.test(date); +}; From 92fd7b6977d2a70ec1cf3aed487506a0943e2e9d Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Wed, 3 Apr 2024 18:04:35 +0530 Subject: [PATCH 004/105] chore: peek overview remove parent improvement (#4059) --- .../issues/issue-detail/parent-select.tsx | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/web/components/issues/issue-detail/parent-select.tsx b/web/components/issues/issue-detail/parent-select.tsx index b121ddc786..a60131de4b 100644 --- a/web/components/issues/issue-detail/parent-select.tsx +++ b/web/components/issues/issue-detail/parent-select.tsx @@ -4,7 +4,7 @@ import Link from "next/link"; import { Pencil, X } from "lucide-react"; // hooks // components -import { Tooltip } from "@plane/ui"; +import { TOAST_TYPE, Tooltip, setToast } from "@plane/ui"; import { ParentIssuesListModal } from "@/components/issues"; // ui // helpers @@ -30,7 +30,13 @@ export const IssueParentSelect: React.FC = observer((props) const { issue: { getIssueById }, } = useIssueDetail(); - const { isParentIssueModalOpen, toggleParentIssueModal } = useIssueDetail(); + const { + isParentIssueModalOpen, + toggleParentIssueModal, + removeSubIssue, + subIssues: { setSubIssueHelpers }, + } = useIssueDetail(); + // derived values const issue = getIssueById(issueId); const parentIssue = issue?.parent_id ? getIssueById(issue.parent_id) : undefined; @@ -47,6 +53,25 @@ export const IssueParentSelect: React.FC = observer((props) } }; + const handleRemoveSubIssue = async ( + workspaceSlug: string, + projectId: string, + parentIssueId: string, + issueId: string + ) => { + try { + setSubIssueHelpers(parentIssueId, "issue_loader", issueId); + await removeSubIssue(workspaceSlug, projectId, parentIssueId, issueId); + setSubIssueHelpers(parentIssueId, "issue_loader", issueId); + } catch (error) { + setToast({ + type: TOAST_TYPE.ERROR, + title: "Error", + message: "Something went wrong", + }); + } + }; + if (!issue) return <>; return ( @@ -92,7 +117,7 @@ export const IssueParentSelect: React.FC = observer((props) onClick={(e) => { e.preventDefault(); e.stopPropagation(); - handleParentIssue(null); + handleRemoveSubIssue(workspaceSlug, projectId, parentIssue.id, issueId); }} > From d485446ee2079396ba5303d633bbd4f2dd3749e7 Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Wed, 3 Apr 2024 18:06:46 +0530 Subject: [PATCH 005/105] [WEB-652] fix: issue activities alignment in dashboard. (#4106) --- web/components/core/activity.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/components/core/activity.tsx b/web/components/core/activity.tsx index b60152d080..31a796949c 100644 --- a/web/components/core/activity.tsx +++ b/web/components/core/activity.tsx @@ -45,7 +45,7 @@ export const IssueLink = ({ activity }: { activity: IIssueActivity }) => { }`}`} target={activity.issue === null ? "_self" : "_blank"} rel={activity.issue === null ? "" : "noopener noreferrer"} - className="inline-flex items-center gap-1 font-medium text-custom-text-100 hover:underline" + className="font-medium text-custom-text-100 hover:underline" > {`${activity.project_detail.identifier}-${activity.issue_detail.sequence_id}`}{" "} {activity.issue_detail?.name} From 91d85ffed0a0852d666ed5993a1a6c0ddc9703b7 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Wed, 3 Apr 2024 18:07:28 +0530 Subject: [PATCH 006/105] chore: issue block improvement (#4093) --- web/components/issues/issue-layouts/list/block.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/components/issues/issue-layouts/list/block.tsx b/web/components/issues/issue-layouts/list/block.tsx index ce3e07fdb6..7b3c0fdecd 100644 --- a/web/components/issues/issue-layouts/list/block.tsx +++ b/web/components/issues/issue-layouts/list/block.tsx @@ -53,7 +53,7 @@ export const IssueBlock: React.FC = observer((props: IssueBlock } )} > -
+
{displayProperties && displayProperties?.key && (
From 4c97098218d907cffe8d75a75244d57f6e83f455 Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Wed, 3 Apr 2024 18:19:34 +0530 Subject: [PATCH 007/105] chore: archival of modules, cycles and issues enhancement. (#4100) --- .../cycles/archived-cycles/modal.tsx | 2 +- web/components/cycles/quick-actions.tsx | 2 +- web/components/cycles/sidebar.tsx | 2 +- web/components/issues/archive-issue-modal.tsx | 9 ++++- web/components/issues/issue-detail/root.tsx | 10 ----- .../quick-action-dropdowns/archived-issue.tsx | 37 ++++++++++++++----- web/components/issues/peek-overview/root.tsx | 14 +------ .../modules/archived-modules/modal.tsx | 2 +- web/components/modules/quick-actions.tsx | 2 +- web/components/modules/sidebar.tsx | 2 +- .../archives/issues/[archivedIssueId].tsx | 11 ++---- 11 files changed, 47 insertions(+), 46 deletions(-) diff --git a/web/components/cycles/archived-cycles/modal.tsx b/web/components/cycles/archived-cycles/modal.tsx index 6e0ddef35b..b613d0de9d 100644 --- a/web/components/cycles/archived-cycles/modal.tsx +++ b/web/components/cycles/archived-cycles/modal.tsx @@ -41,7 +41,7 @@ export const ArchiveCycleModal: React.FC = (props) => { message: "Your archives can be found in project archives.", }); onClose(); - router.push(`/${workspaceSlug}/projects/${projectId}/archives/cycles?peekCycle=${cycleId}`); + router.push(`/${workspaceSlug}/projects/${projectId}/cycles`); }) .catch(() => setToast({ diff --git a/web/components/cycles/quick-actions.tsx b/web/components/cycles/quick-actions.tsx index 215f07beff..bf9aefc879 100644 --- a/web/components/cycles/quick-actions.tsx +++ b/web/components/cycles/quick-actions.tsx @@ -78,7 +78,7 @@ export const CycleQuickActions: React.FC = observer((props) => { title: "Restore success", message: "Your cycle can be found in project cycles.", }); - router.push(`/${workspaceSlug}/projects/${projectId}/cycles/${cycleId}`); + router.push(`/${workspaceSlug}/projects/${projectId}/archives/cycles`); }) .catch(() => setToast({ diff --git a/web/components/cycles/sidebar.tsx b/web/components/cycles/sidebar.tsx index e333564ee7..b72f9fd0d0 100644 --- a/web/components/cycles/sidebar.tsx +++ b/web/components/cycles/sidebar.tsx @@ -129,7 +129,7 @@ export const CycleDetailsSidebar: React.FC = observer((props) => { title: "Restore success", message: "Your cycle can be found in project cycles.", }); - router.push(`/${workspaceSlug.toString()}/projects/${projectId.toString()}/cycles/${cycleId}`); + router.push(`/${workspaceSlug.toString()}/projects/${projectId.toString()}/archives/cycles`); }) .catch(() => setToast({ diff --git a/web/components/issues/archive-issue-modal.tsx b/web/components/issues/archive-issue-modal.tsx index 8ea747ffc7..92bbdc6778 100644 --- a/web/components/issues/archive-issue-modal.tsx +++ b/web/components/issues/archive-issue-modal.tsx @@ -39,7 +39,14 @@ export const ArchiveIssueModal: React.FC = (props) => { setIsArchiving(true); await onSubmit() - .then(() => onClose()) + .then(() => { + setToast({ + type: TOAST_TYPE.SUCCESS, + title: "Archive success", + message: "Your archives can be found in project archives.", + }); + onClose(); + }) .catch(() => setToast({ type: TOAST_TYPE.ERROR, diff --git a/web/components/issues/issue-detail/root.tsx b/web/components/issues/issue-detail/root.tsx index 53e8d87071..fdd848a2da 100644 --- a/web/components/issues/issue-detail/root.tsx +++ b/web/components/issues/issue-detail/root.tsx @@ -144,22 +144,12 @@ export const IssueDetailRoot: FC = observer((props) => { archive: async (workspaceSlug: string, projectId: string, issueId: string) => { try { await archiveIssue(workspaceSlug, projectId, issueId); - setToast({ - type: TOAST_TYPE.SUCCESS, - title: "Success!", - message: "Issue archived successfully.", - }); captureIssueEvent({ eventName: ISSUE_ARCHIVED, payload: { id: issueId, state: "SUCCESS", element: "Issue details page" }, path: router.asPath, }); } catch (error) { - setToast({ - type: TOAST_TYPE.ERROR, - title: "Error!", - message: "Issue could not be archived. Please try again.", - }); captureIssueEvent({ eventName: ISSUE_ARCHIVED, payload: { id: issueId, state: "FAILED", element: "Issue details page" }, diff --git a/web/components/issues/issue-layouts/quick-action-dropdowns/archived-issue.tsx b/web/components/issues/issue-layouts/quick-action-dropdowns/archived-issue.tsx index d996ee5988..8a49ec9b47 100644 --- a/web/components/issues/issue-layouts/quick-action-dropdowns/archived-issue.tsx +++ b/web/components/issues/issue-layouts/quick-action-dropdowns/archived-issue.tsx @@ -1,22 +1,23 @@ import { useState } from "react"; +import { observer } from "mobx-react"; import { useRouter } from "next/router"; +// icons import { ArchiveRestoreIcon, ExternalLink, Link, Trash2 } from "lucide-react"; -// hooks -import { CustomMenu, TOAST_TYPE, setToast } from "@plane/ui"; - -import { DeleteIssueModal } from "@/components/issues"; // ui +import { CustomMenu, TOAST_TYPE, setToast } from "@plane/ui"; // components +import { DeleteIssueModal } from "@/components/issues"; +// constants import { EIssuesStoreType } from "@/constants/issue"; import { EUserProjectRoles } from "@/constants/project"; +// helpers import { copyUrlToClipboard } from "@/helpers/string.helper"; +// hooks import { useEventTracker, useIssues, useUser } from "@/hooks/store"; -// components -// helpers // types import { IQuickActionProps } from "../list/list-view-types"; -export const ArchivedIssueQuickActions: React.FC = (props) => { +export const ArchivedIssueQuickActions: React.FC = observer((props) => { const { issue, handleDelete, handleRestore, customActionButton, portalElement, readOnly = false } = props; // states const [deleteIssueModal, setDeleteIssueModal] = useState(false); @@ -46,6 +47,24 @@ export const ArchivedIssueQuickActions: React.FC = (props) => message: "Issue link copied to clipboard", }) ); + const handleIssueRestore = async () => { + if (!handleRestore) return; + await handleRestore() + .then(() => { + setToast({ + type: TOAST_TYPE.SUCCESS, + title: "Restore success", + message: "Your issue can be found in project issues.", + }); + }) + .catch(() => { + setToast({ + type: TOAST_TYPE.ERROR, + title: "Error!", + message: "Issue could not be restored. Please try again.", + }); + }); + }; return ( <> @@ -65,7 +84,7 @@ export const ArchivedIssueQuickActions: React.FC = (props) => ellipsis > {isRestoringAllowed && ( - +
Restore @@ -100,4 +119,4 @@ export const ArchivedIssueQuickActions: React.FC = (props) => ); -}; +}); diff --git a/web/components/issues/peek-overview/root.tsx b/web/components/issues/peek-overview/root.tsx index a7f7b23d7a..4d85bd73cd 100644 --- a/web/components/issues/peek-overview/root.tsx +++ b/web/components/issues/peek-overview/root.tsx @@ -135,22 +135,12 @@ export const IssuePeekOverview: FC = observer((props) => { archive: async (workspaceSlug: string, projectId: string, issueId: string) => { try { await archiveIssue(workspaceSlug, projectId, issueId); - setToast({ - type: TOAST_TYPE.SUCCESS, - title: "Success!", - message: "Issue archived successfully.", - }); captureIssueEvent({ eventName: ISSUE_ARCHIVED, payload: { id: issueId, state: "SUCCESS", element: "Issue peek-overview" }, path: router.asPath, }); } catch (error) { - setToast({ - type: TOAST_TYPE.ERROR, - title: "Error!", - message: "Issue could not be archived. Please try again.", - }); captureIssueEvent({ eventName: ISSUE_ARCHIVED, payload: { id: issueId, state: "FAILED", element: "Issue peek-overview" }, @@ -163,8 +153,8 @@ export const IssuePeekOverview: FC = observer((props) => { await restoreIssue(workspaceSlug, projectId, issueId); setToast({ type: TOAST_TYPE.SUCCESS, - title: "Success!", - message: "Issue restored successfully.", + title: "Restore success", + message: "Your issue can be found in project issues.", }); captureIssueEvent({ eventName: ISSUE_RESTORED, diff --git a/web/components/modules/archived-modules/modal.tsx b/web/components/modules/archived-modules/modal.tsx index f922e0ba9c..abfb084f08 100644 --- a/web/components/modules/archived-modules/modal.tsx +++ b/web/components/modules/archived-modules/modal.tsx @@ -41,7 +41,7 @@ export const ArchiveModuleModal: React.FC = (props) => { message: "Your archives can be found in project archives.", }); onClose(); - router.push(`/${workspaceSlug}/projects/${projectId}/archives/modules?peekModule=${moduleId}`); + router.push(`/${workspaceSlug}/projects/${projectId}/modules`); }) .catch(() => setToast({ diff --git a/web/components/modules/quick-actions.tsx b/web/components/modules/quick-actions.tsx index b7972d6124..5decec4ecc 100644 --- a/web/components/modules/quick-actions.tsx +++ b/web/components/modules/quick-actions.tsx @@ -79,7 +79,7 @@ export const ModuleQuickActions: React.FC = observer((props) => { title: "Restore success", message: "Your module can be found in project modules.", }); - router.push(`/${workspaceSlug}/projects/${projectId}/modules/${moduleId}`); + router.push(`/${workspaceSlug}/projects/${projectId}/archives/modules`); }) .catch(() => setToast({ diff --git a/web/components/modules/sidebar.tsx b/web/components/modules/sidebar.tsx index 38618023dc..de6e3d02fd 100644 --- a/web/components/modules/sidebar.tsx +++ b/web/components/modules/sidebar.tsx @@ -227,7 +227,7 @@ export const ModuleDetailsSidebar: React.FC = observer((props) => { title: "Restore success", message: "Your module can be found in project modules.", }); - router.push(`/${workspaceSlug}/projects/${projectId}/modules/${moduleId}`); + router.push(`/${workspaceSlug}/projects/${projectId}/archives/modules`); }) .catch(() => setToast({ diff --git a/web/pages/[workspaceSlug]/projects/[projectId]/archives/issues/[archivedIssueId].tsx b/web/pages/[workspaceSlug]/projects/[projectId]/archives/issues/[archivedIssueId].tsx index 12b0c83917..0ff7d7fc50 100644 --- a/web/pages/[workspaceSlug]/projects/[projectId]/archives/issues/[archivedIssueId].tsx +++ b/web/pages/[workspaceSlug]/projects/[projectId]/archives/issues/[archivedIssueId].tsx @@ -66,13 +66,8 @@ const ArchivedIssueDetailsPage: NextPageWithLayout = observer(() => { .then(() => { setToast({ type: TOAST_TYPE.SUCCESS, - title: "Success", - message: - issue && - `${getProjectById(issue.project_id) - ?.identifier}-${issue?.sequence_id} is restored successfully under the project ${getProjectById( - issue.project_id - )?.name}`, + title: "Restore success", + message: "Your issue can be found in project issues.", }); router.push(`/${workspaceSlug}/projects/${projectId}/issues/${archivedIssueId}`); }) @@ -80,7 +75,7 @@ const ArchivedIssueDetailsPage: NextPageWithLayout = observer(() => { setToast({ type: TOAST_TYPE.ERROR, title: "Error!", - message: "Something went wrong. Please try again.", + message: "Issue could not be restored. Please try again.", }); }) .finally(() => setIsRestoring(false)); From bc0752f7e80ed0b557de81a0426a761d66783e13 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Wed, 3 Apr 2024 20:46:19 +0530 Subject: [PATCH 008/105] [WEB-850] chore: calendar layout add existing issue (#4094) * chore: calendar layout add existing issue added in project issue * chore: code refactor --- .../calendar/quick-add-issue-form.tsx | 51 ++++++++----------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/web/components/issues/issue-layouts/calendar/quick-add-issue-form.tsx b/web/components/issues/issue-layouts/calendar/quick-add-issue-form.tsx index 7e17496d48..7f992d8c98 100644 --- a/web/components/issues/issue-layouts/calendar/quick-add-issue-form.tsx +++ b/web/components/issues/issue-layouts/calendar/quick-add-issue-form.tsx @@ -82,9 +82,11 @@ export const CalendarQuickAddIssueForm: React.FC = observer((props) => { const [isExistingIssueModalOpen, setIsExistingIssueModalOpen] = useState(false); // derived values const projectDetail = projectId ? getProjectById(projectId.toString()) : null; - const ExistingIssuesListModalPayload = moduleId - ? { module: moduleId.toString(), target_date: "none" } - : { cycle: true, target_date: "none" }; + const ExistingIssuesListModalPayload = addIssuesToView + ? moduleId + ? { module: moduleId.toString(), target_date: "none" } + : { cycle: true, target_date: "none" } + : { target_date: "none" }; const { reset, @@ -234,33 +236,22 @@ export const CalendarQuickAddIssueForm: React.FC = observer((props) => { block: isMenuOpen, })} > - {addIssuesToView ? ( - setIsMenuOpen(true)} - onMenuClose={() => setIsMenuOpen(false)} - className="w-full" - customButtonClassName="w-full" - customButton={ -
- - New Issue -
- } - > - New Issue - Add existing issue -
- ) : ( - - )} + setIsMenuOpen(true)} + onMenuClose={() => setIsMenuOpen(false)} + className="w-full" + customButtonClassName="w-full" + customButton={ +
+ + New Issue +
+ } + > + New Issue + Add existing issue +
)} From e9518ced89d360d8599dd51e1449f78115556705 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Wed, 3 Apr 2024 20:49:02 +0530 Subject: [PATCH 009/105] [WEB-756] chore: module and cycle feature toggle validation (#4112) * chore: cycle and module feature issue block validation * chore: cycle and module feature display properties validation * chore: cycle and module feature display filters validation * chore: cycle and module feature project view validation --- web/components/cycles/cycle-mobile-header.tsx | 7 +- web/components/headers/cycle-issues.tsx | 4 ++ web/components/headers/module-issues.tsx | 4 ++ .../headers/project-draft-issues.tsx | 4 ++ web/components/headers/project-issues.tsx | 4 ++ .../headers/project-view-issues.tsx | 4 ++ .../issues/archived-issues-header.tsx | 5 +- .../display-filters-selection.tsx | 23 ++++++- .../display-filters/display-properties.tsx | 47 ++++++++------ .../header/filters/filters-selection.tsx | 17 ++++- .../properties/all-properties.tsx | 64 ++++++++++--------- .../issues/issues-mobile-header.tsx | 4 ++ .../modules/module-mobile-header.tsx | 7 +- web/components/views/form.tsx | 9 ++- 14 files changed, 144 insertions(+), 59 deletions(-) diff --git a/web/components/cycles/cycle-mobile-header.tsx b/web/components/cycles/cycle-mobile-header.tsx index 8c168cbaa0..54a2a31150 100644 --- a/web/components/cycles/cycle-mobile-header.tsx +++ b/web/components/cycles/cycle-mobile-header.tsx @@ -10,7 +10,7 @@ import { CustomMenu } from "@plane/ui"; import { ProjectAnalyticsModal } from "@/components/analytics"; import { DisplayFiltersSelection, FilterSelection, FiltersDropdown } from "@/components/issues"; import { EIssueFilterType, EIssuesStoreType, ISSUE_DISPLAY_FILTERS_BY_LAYOUT, ISSUE_LAYOUTS } from "@/constants/issue"; -import { useIssues, useCycle, useProjectState, useLabel, useMember } from "@/hooks/store"; +import { useIssues, useCycle, useProjectState, useLabel, useMember, useProject } from "@/hooks/store"; export const CycleMobileHeader = () => { const [analyticsModal, setAnalyticsModal] = useState(false); @@ -24,6 +24,7 @@ export const CycleMobileHeader = () => { const { workspaceSlug, projectId, cycleId } = router.query; const cycleDetails = cycleId ? getCycleById(cycleId.toString()) : undefined; // store hooks + const { currentProjectDetails } = useProject(); const { issuesFilter: { issueFilters, updateFilters }, } = useIssues(EIssuesStoreType.CYCLE); @@ -151,6 +152,8 @@ export const CycleMobileHeader = () => { labels={projectLabels} memberIds={projectMemberIds ?? undefined} states={projectStates} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} />
@@ -174,6 +177,8 @@ export const CycleMobileHeader = () => { displayProperties={issueFilters?.displayProperties ?? {}} handleDisplayPropertiesUpdate={handleDisplayProperties} ignoreGroupedFilters={["cycle"]} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} />
diff --git a/web/components/headers/cycle-issues.tsx b/web/components/headers/cycle-issues.tsx index 35a646c1c9..e1113910f6 100644 --- a/web/components/headers/cycle-issues.tsx +++ b/web/components/headers/cycle-issues.tsx @@ -250,6 +250,8 @@ export const CycleIssuesHeader: React.FC = observer(() => { labels={projectLabels} memberIds={projectMemberIds ?? undefined} states={projectStates} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} /> @@ -262,6 +264,8 @@ export const CycleIssuesHeader: React.FC = observer(() => { displayProperties={issueFilters?.displayProperties ?? {}} handleDisplayPropertiesUpdate={handleDisplayProperties} ignoreGroupedFilters={["cycle"]} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} /> diff --git a/web/components/headers/module-issues.tsx b/web/components/headers/module-issues.tsx index 59cc2a4295..56da66d2fd 100644 --- a/web/components/headers/module-issues.tsx +++ b/web/components/headers/module-issues.tsx @@ -252,6 +252,8 @@ export const ModuleIssuesHeader: React.FC = observer(() => { labels={projectLabels} memberIds={projectMemberIds ?? undefined} states={projectStates} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} /> @@ -264,6 +266,8 @@ export const ModuleIssuesHeader: React.FC = observer(() => { displayProperties={issueFilters?.displayProperties ?? {}} handleDisplayPropertiesUpdate={handleDisplayProperties} ignoreGroupedFilters={["module"]} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} />
diff --git a/web/components/headers/project-draft-issues.tsx b/web/components/headers/project-draft-issues.tsx index bdfaebc8de..a9f5a93f74 100644 --- a/web/components/headers/project-draft-issues.tsx +++ b/web/components/headers/project-draft-issues.tsx @@ -141,6 +141,8 @@ export const ProjectDraftIssueHeader: FC = observer(() => { labels={projectLabels} memberIds={projectMemberIds ?? undefined} states={projectStates} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} /> @@ -152,6 +154,8 @@ export const ProjectDraftIssueHeader: FC = observer(() => { handleDisplayFiltersUpdate={handleDisplayFilters} displayProperties={issueFilters?.displayProperties ?? {}} handleDisplayPropertiesUpdate={handleDisplayProperties} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} />
diff --git a/web/components/headers/project-issues.tsx b/web/components/headers/project-issues.tsx index 7c018d5c2f..fd681cc4ad 100644 --- a/web/components/headers/project-issues.tsx +++ b/web/components/headers/project-issues.tsx @@ -192,6 +192,8 @@ export const ProjectIssuesHeader: React.FC = observer(() => { labels={projectLabels} memberIds={projectMemberIds ?? undefined} states={projectStates} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} /> @@ -203,6 +205,8 @@ export const ProjectIssuesHeader: React.FC = observer(() => { handleDisplayFiltersUpdate={handleDisplayFilters} displayProperties={issueFilters?.displayProperties ?? {}} handleDisplayPropertiesUpdate={handleDisplayProperties} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} />
diff --git a/web/components/headers/project-view-issues.tsx b/web/components/headers/project-view-issues.tsx index 6f545f25b1..27c6e5f9dc 100644 --- a/web/components/headers/project-view-issues.tsx +++ b/web/components/headers/project-view-issues.tsx @@ -210,6 +210,8 @@ export const ProjectViewIssuesHeader: React.FC = observer(() => { labels={projectLabels} memberIds={projectMemberIds ?? undefined} states={projectStates} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} /> @@ -221,6 +223,8 @@ export const ProjectViewIssuesHeader: React.FC = observer(() => { handleDisplayFiltersUpdate={handleDisplayFilters} displayProperties={issueFilters?.displayProperties ?? {}} handleDisplayPropertiesUpdate={handleDisplayProperties} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} /> {canUserCreateIssue && ( diff --git a/web/components/issues/archived-issues-header.tsx b/web/components/issues/archived-issues-header.tsx index cd5aca903c..bf8c373323 100644 --- a/web/components/issues/archived-issues-header.tsx +++ b/web/components/issues/archived-issues-header.tsx @@ -9,13 +9,14 @@ import { DisplayFiltersSelection, FilterSelection, FiltersDropdown } from "@/com // constants import { EIssueFilterType, EIssuesStoreType, ISSUE_DISPLAY_FILTERS_BY_LAYOUT } from "@/constants/issue"; // hooks -import { useIssues, useLabel, useMember, useProjectState } from "@/hooks/store"; +import { useIssues, useLabel, useMember, useProject, useProjectState } from "@/hooks/store"; export const ArchivedIssuesHeader: FC = observer(() => { // router const router = useRouter(); const { workspaceSlug, projectId } = router.query; // store hooks + const { currentProjectDetails } = useProject(); const { issuesFilter: { issueFilters, updateFilters }, } = useIssues(EIssuesStoreType.ARCHIVED); @@ -89,6 +90,8 @@ export const ArchivedIssuesHeader: FC = observer(() => { layoutDisplayFiltersOptions={ activeLayout ? ISSUE_DISPLAY_FILTERS_BY_LAYOUT.issues[activeLayout] : undefined } + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} /> diff --git a/web/components/issues/issue-layouts/filters/header/display-filters/display-filters-selection.tsx b/web/components/issues/issue-layouts/filters/header/display-filters/display-filters-selection.tsx index d270d6a1cc..eb2238a4b9 100644 --- a/web/components/issues/issue-layouts/filters/header/display-filters/display-filters-selection.tsx +++ b/web/components/issues/issue-layouts/filters/header/display-filters/display-filters-selection.tsx @@ -21,6 +21,8 @@ type Props = { handleDisplayPropertiesUpdate: (updatedDisplayProperties: Partial) => void; layoutDisplayFiltersOptions: ILayoutDisplayFiltersOptions | undefined; ignoreGroupedFilters?: Partial[]; + cycleViewDisabled?: boolean; + moduleViewDisabled?: boolean; }; export const DisplayFiltersSelection: React.FC = observer((props) => { @@ -31,17 +33,32 @@ export const DisplayFiltersSelection: React.FC = observer((props) => { handleDisplayPropertiesUpdate, layoutDisplayFiltersOptions, ignoreGroupedFilters = [], + cycleViewDisabled = false, + moduleViewDisabled = false, } = props; const isDisplayFilterEnabled = (displayFilter: keyof IIssueDisplayFilterOptions) => Object.keys(layoutDisplayFiltersOptions?.display_filters ?? {}).includes(displayFilter); + const computedIgnoreGroupedFilters: Partial[] = []; + if (cycleViewDisabled) { + ignoreGroupedFilters.push("cycle"); + } + if (moduleViewDisabled) { + ignoreGroupedFilters.push("module"); + } + return (
{/* display properties */} {layoutDisplayFiltersOptions?.display_properties && (
- +
)} @@ -56,7 +73,7 @@ export const DisplayFiltersSelection: React.FC = observer((props) => { group_by: val, }) } - ignoreGroupedFilters={ignoreGroupedFilters} + ignoreGroupedFilters={[...ignoreGroupedFilters, ...computedIgnoreGroupedFilters]} />
)} @@ -74,7 +91,7 @@ export const DisplayFiltersSelection: React.FC = observer((props) => { }) } subGroupByOptions={layoutDisplayFiltersOptions?.display_filters.sub_group_by ?? []} - ignoreGroupedFilters={ignoreGroupedFilters} + ignoreGroupedFilters={[...ignoreGroupedFilters, ...computedIgnoreGroupedFilters]} /> )} diff --git a/web/components/issues/issue-layouts/filters/header/display-filters/display-properties.tsx b/web/components/issues/issue-layouts/filters/header/display-filters/display-properties.tsx index 54cb0a439d..aebb8d5cc1 100644 --- a/web/components/issues/issue-layouts/filters/header/display-filters/display-properties.tsx +++ b/web/components/issues/issue-layouts/filters/header/display-filters/display-properties.tsx @@ -10,13 +10,22 @@ import { FilterHeader } from "../helpers/filter-header"; type Props = { displayProperties: IIssueDisplayProperties; handleUpdate: (updatedDisplayProperties: Partial) => void; + cycleViewDisabled?: boolean; + moduleViewDisabled?: boolean; }; export const FilterDisplayProperties: React.FC = observer((props) => { - const { displayProperties, handleUpdate } = props; + const { displayProperties, handleUpdate, cycleViewDisabled = false, moduleViewDisabled = false } = props; const [previewEnabled, setPreviewEnabled] = React.useState(true); + // Filter out "cycle" and "module" keys if cycleViewDisabled or moduleViewDisabled is true + const filteredDisplayProperties = ISSUE_DISPLAY_PROPERTIES.filter((property) => { + if (cycleViewDisabled && property.key === "cycle") return false; + if (moduleViewDisabled && property.key === "modules") return false; + return true; + }); + return ( <> = observer((props) => { /> {previewEnabled && (
- {ISSUE_DISPLAY_PROPERTIES.map((displayProperty) => ( - + {filteredDisplayProperties.map((displayProperty) => ( + <> + + ))}
)} diff --git a/web/components/issues/issue-layouts/filters/header/filters/filters-selection.tsx b/web/components/issues/issue-layouts/filters/header/filters/filters-selection.tsx index 7e6e44ebf2..9220e9fd31 100644 --- a/web/components/issues/issue-layouts/filters/header/filters/filters-selection.tsx +++ b/web/components/issues/issue-layouts/filters/header/filters/filters-selection.tsx @@ -30,10 +30,21 @@ type Props = { labels?: IIssueLabel[] | undefined; memberIds?: string[] | undefined; states?: IState[] | undefined; + cycleViewDisabled?: boolean; + moduleViewDisabled?: boolean; }; export const FilterSelection: React.FC = observer((props) => { - const { filters, handleFiltersUpdate, layoutDisplayFiltersOptions, labels, memberIds, states } = props; + const { + filters, + handleFiltersUpdate, + layoutDisplayFiltersOptions, + labels, + memberIds, + states, + cycleViewDisabled = false, + moduleViewDisabled = false, + } = props; // hooks const { router: { moduleId, cycleId }, @@ -111,7 +122,7 @@ export const FilterSelection: React.FC = observer((props) => { )} {/* cycle */} - {isFilterEnabled("cycle") && !cycleId && ( + {isFilterEnabled("cycle") && !cycleId && !cycleViewDisabled && (
= observer((props) => { )} {/* module */} - {isFilterEnabled("module") && !moduleId && ( + {isFilterEnabled("module") && !moduleId && !moduleViewDisabled && (
= observer((props) => { const { issue, updateIssue, displayProperties, activeLayout, isReadOnly, className } = props; // store hooks + const { getProjectById } = useProject(); const { labelMap } = useLabel(); const { captureIssueEvent } = useEventTracker(); const { @@ -56,6 +57,7 @@ export const IssueProperties: React.FC = observer((props) => { const { areEstimatesEnabledForCurrentProject } = useEstimate(); const { getStateById } = useProjectState(); const { isMobile } = usePlatformOS(); + const projectDetails = getProjectById(issue.project_id); // router const router = useRouter(); const { workspaceSlug } = router.query; @@ -349,36 +351,40 @@ export const IssueProperties: React.FC = observer((props) => { {/* modules */} - -
- -
-
+ {projectDetails?.module_view && ( + +
+ +
+
+ )} {/* cycles */} - -
- -
-
+ {projectDetails?.cycle_view && ( + +
+ +
+
+ )} {/* estimates */} {areEstimatesEnabledForCurrentProject && ( diff --git a/web/components/issues/issues-mobile-header.tsx b/web/components/issues/issues-mobile-header.tsx index 4bc90b686c..de1c088e04 100644 --- a/web/components/issues/issues-mobile-header.tsx +++ b/web/components/issues/issues-mobile-header.tsx @@ -132,6 +132,8 @@ export const IssuesMobileHeader = observer(() => { labels={projectLabels} memberIds={projectMemberIds ?? undefined} states={projectStates} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} />
@@ -154,6 +156,8 @@ export const IssuesMobileHeader = observer(() => { handleDisplayFiltersUpdate={handleDisplayFilters} displayProperties={issueFilters?.displayProperties ?? {}} handleDisplayPropertiesUpdate={handleDisplayProperties} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} />
diff --git a/web/components/modules/module-mobile-header.tsx b/web/components/modules/module-mobile-header.tsx index 6419b13b08..79486a37cc 100644 --- a/web/components/modules/module-mobile-header.tsx +++ b/web/components/modules/module-mobile-header.tsx @@ -11,12 +11,13 @@ import { ProjectAnalyticsModal } from "@/components/analytics"; import { DisplayFiltersSelection, FilterSelection, FiltersDropdown } from "@/components/issues"; // hooks import { EIssueFilterType, EIssuesStoreType, ISSUE_DISPLAY_FILTERS_BY_LAYOUT, ISSUE_LAYOUTS } from "@/constants/issue"; -import { useIssues, useLabel, useMember, useModule, useProjectState } from "@/hooks/store"; +import { useIssues, useLabel, useMember, useModule, useProject, useProjectState } from "@/hooks/store"; // types // constants export const ModuleMobileHeader = observer(() => { const [analyticsModal, setAnalyticsModal] = useState(false); + const { currentProjectDetails } = useProject(); const { getModuleById } = useModule(); const layouts = [ { key: "list", title: "List", icon: List }, @@ -134,6 +135,8 @@ export const ModuleMobileHeader = observer(() => { labels={projectLabels} memberIds={projectMemberIds ?? undefined} states={projectStates} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} /> @@ -157,6 +160,8 @@ export const ModuleMobileHeader = observer(() => { displayProperties={issueFilters?.displayProperties ?? {}} handleDisplayPropertiesUpdate={handleDisplayProperties} ignoreGroupedFilters={["module"]} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} /> diff --git a/web/components/views/form.tsx b/web/components/views/form.tsx index e758b7938a..a8fa6b87cb 100644 --- a/web/components/views/form.tsx +++ b/web/components/views/form.tsx @@ -6,7 +6,7 @@ import { IProjectView, IIssueFilterOptions } from "@plane/types"; import { Button, Input, TextArea } from "@plane/ui"; import { AppliedFiltersList, FilterSelection, FiltersDropdown } from "@/components/issues"; import { ISSUE_DISPLAY_FILTERS_BY_LAYOUT } from "@/constants/issue"; -import { useLabel, useMember, useProjectState } from "@/hooks/store"; +import { useLabel, useMember, useProject, useProjectState } from "@/hooks/store"; // components // ui // types @@ -27,6 +27,7 @@ const defaultValues: Partial = { export const ProjectViewForm: React.FC = observer((props) => { const { handleFormSubmit, handleClose, data, preLoadedData } = props; // store hooks + const { currentProjectDetails } = useProject(); const { projectStates } = useProjectState(); const { projectLabels } = useLabel(); const { @@ -184,6 +185,8 @@ export const ProjectViewForm: React.FC = observer((props) => { labels={projectLabels ?? undefined} memberIds={projectMemberIds ?? undefined} states={projectStates} + cycleViewDisabled={!currentProjectDetails?.cycle_view} + moduleViewDisabled={!currentProjectDetails?.module_view} /> )} @@ -212,8 +215,8 @@ export const ProjectViewForm: React.FC = observer((props) => { ? "Updating View..." : "Update View" : isSubmitting - ? "Creating View..." - : "Create View"} + ? "Creating View..." + : "Create View"} From 1fb87919418643fe4ac2e05077596445f5765c26 Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Wed, 3 Apr 2024 20:51:22 +0530 Subject: [PATCH 010/105] chore: increase data dropdown close icon size for consitency. (#4115) --- web/components/dropdowns/date.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/components/dropdowns/date.tsx b/web/components/dropdowns/date.tsx index e126ec1bde..8e207796d5 100644 --- a/web/components/dropdowns/date.tsx +++ b/web/components/dropdowns/date.tsx @@ -149,7 +149,7 @@ export const DateDropdown: React.FC = (props) => { )} {isClearable && !disabled && isDateSelected && ( { e.stopPropagation(); onChange(null); From 0ab03c963c28807722f00238f2be656167afecb4 Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Wed, 3 Apr 2024 20:57:44 +0530 Subject: [PATCH 011/105] [WEB-869] chore: fix assignee and parent ui inconsistency in create issue modal. (#4113) --- web/components/issues/issue-modal/form.tsx | 63 ++++++++++------------ 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/web/components/issues/issue-modal/form.tsx b/web/components/issues/issue-modal/form.tsx index b581522e6e..88d6c38778 100644 --- a/web/components/issues/issue-modal/form.tsx +++ b/web/components/issues/issue-modal/form.tsx @@ -541,7 +541,7 @@ export const IssueFormRoot: FC = observer((props) => { handleFormChange(); }} buttonVariant={value?.length > 0 ? "transparent-without-text" : "border-with-text"} - buttonClassName={value?.length > 0 ? "hover:bg-transparent px-0" : ""} + buttonClassName={value?.length > 0 ? "hover:bg-transparent" : ""} placeholder="Assignees" multiple tabIndex={getTabIndex("assignee_ids")} @@ -663,33 +663,23 @@ export const IssueFormRoot: FC = observer((props) => { )} /> )} - - {watch("parent_id") ? ( -
- - - {selectedParentIssue && - `${selectedParentIssue.project__identifier}- - ${selectedParentIssue.sequence_id}`} - -
- ) : ( -
- - Add parent -
- )} - - } - placement="bottom-start" - tabIndex={getTabIndex("parent_id")} - > - {watch("parent_id") ? ( + {watch("parent_id") ? ( + + + + {selectedParentIssue && + `${selectedParentIssue.project__identifier}-${selectedParentIssue.sequence_id}`} + + + } + placement="bottom-start" + tabIndex={getTabIndex("parent_id")} + > <> setParentIssueListModalOpen(true)}> Change parent issue @@ -704,12 +694,17 @@ export const IssueFormRoot: FC = observer((props) => { Remove parent issue - ) : ( - setParentIssueListModalOpen(true)}> - Select parent Issue - - )} - +
+ ) : ( + + )} Date: Wed, 3 Apr 2024 21:05:33 +0530 Subject: [PATCH 012/105] fix: errors that were catched in sentry (#4114) --- apiserver/plane/app/views/cycle/base.py | 7 ++++++ .../plane/bgtasks/email_notification_task.py | 25 ++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/apiserver/plane/app/views/cycle/base.py b/apiserver/plane/app/views/cycle/base.py index d323a0f631..0b1cc94f3d 100644 --- a/apiserver/plane/app/views/cycle/base.py +++ b/apiserver/plane/app/views/cycle/base.py @@ -540,6 +540,13 @@ def retrieve(self, request, slug, project_id, pk): .first() ) queryset = queryset.first() + + if data is None: + return Response( + {"error": "Cycle does not exist"}, + status=status.HTTP_400_BAD_REQUEST, + ) + # Assignee Distribution assignee_distribution = ( Issue.objects.filter( diff --git a/apiserver/plane/bgtasks/email_notification_task.py b/apiserver/plane/bgtasks/email_notification_task.py index 682ccb4a31..050f522c33 100644 --- a/apiserver/plane/bgtasks/email_notification_task.py +++ b/apiserver/plane/bgtasks/email_notification_task.py @@ -1,4 +1,5 @@ import logging +import re from datetime import datetime from bs4 import BeautifulSoup @@ -19,6 +20,12 @@ from plane.utils.exception_logger import log_exception +def remove_unwanted_characters(input_text): + # Keep only alphanumeric characters, spaces, and dashes. + processed_text = re.sub(r"[^a-zA-Z0-9 \-]", "", input_text) + return processed_text + + # acquire and delete redis lock def acquire_lock(lock_id, expire_time=300): redis_client = redis_instance() @@ -175,7 +182,16 @@ def send_email_notification( if acquire_lock(lock_id=lock_id): # get the redis instance ri = redis_instance() - base_api = ri.get(str(issue_id)).decode() + base_api = ( + ri.get(str(issue_id)).decode() + if ri.get(str(issue_id)) + else None + ) + + # Skip if base api is not present + if not base_api: + return + data = create_payload(notification_data=notification_data) # Get email configurations @@ -255,9 +271,7 @@ def send_email_notification( summary = "Updates were made to the issue by" # Send the mail - subject = ( - f"{issue.project.identifier}-{issue.sequence_id} {issue.name}" - ) + subject = f"{issue.project.identifier}-{issue.sequence_id} {remove_unwanted_characters(issue.name)}" context = { "data": template_data, "summary": summary, @@ -321,8 +335,7 @@ def send_email_notification( "Duplicate email received skipping" ) return - except (Issue.DoesNotExist, User.DoesNotExist) as e: - log_exception(e) + except (Issue.DoesNotExist, User.DoesNotExist): release_lock(lock_id=lock_id) return except Exception as e: From 4cba7ff2f5e75ba1bdcf756edb5c3d67d56f8972 Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Thu, 4 Apr 2024 14:24:01 +0530 Subject: [PATCH 013/105] [WEB-848] fix: issue with parent child relation not being removed parent select dropwdown. (#4120) --- web/components/issues/issue-modal/form.tsx | 24 ++++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/web/components/issues/issue-modal/form.tsx b/web/components/issues/issue-modal/form.tsx index 88d6c38778..235d33b5f2 100644 --- a/web/components/issues/issue-modal/form.tsx +++ b/web/components/issues/issue-modal/form.tsx @@ -684,15 +684,21 @@ export const IssueFormRoot: FC = observer((props) => { setParentIssueListModalOpen(true)}> Change parent issue - { - setValue("parent_id", null); - handleFormChange(); - }} - > - Remove parent issue - + ( + { + onChange(null); + handleFormChange(); + }} + > + Remove parent issue + + )} + /> ) : ( From 71b73000d233a0712f0c87706fe7394ca988d946 Mon Sep 17 00:00:00 2001 From: Crsi <47722349+CrsiX@users.noreply.github.com> Date: Thu, 4 Apr 2024 09:07:50 +0000 Subject: [PATCH 014/105] Dropped version info from docker-compose files (#4096) According to the docker issue 11628 (https://github.com/docker/compose/issues/11628) the 'version' field in docker-compose files is outdated. It shows a warning like the following on hosts with a newer Docker version: ``` WARN[0000] /srv/plane/docker-compose.yaml: `version` is obsolete ``` Also, the specs itself state the version was only informative: https://github.com/compose-spec/compose-spec/blob/master/spec.md#version-and-name-top-level-elements > The top-level `version` property is defined by the Compose > Specification for backward compatibility. It is only informative. > Compose doesn't use version to select an exact schema to > validate the Compose file, but prefers the most recent schema > when it's implemented. --- deploy/selfhost/docker-compose.yml | 2 -- docker-compose-local.yml | 2 -- docker-compose.yml | 2 -- 3 files changed, 6 deletions(-) diff --git a/deploy/selfhost/docker-compose.yml b/deploy/selfhost/docker-compose.yml index 522baf63d5..e623909873 100644 --- a/deploy/selfhost/docker-compose.yml +++ b/deploy/selfhost/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3.8" - x-app-env: &app-env environment: - NGINX_PORT=${NGINX_PORT:-80} diff --git a/docker-compose-local.yml b/docker-compose-local.yml index 5f49e48976..a68a045dd6 100644 --- a/docker-compose-local.yml +++ b/docker-compose-local.yml @@ -1,5 +1,3 @@ -version: "3.8" - networks: dev_env: driver: bridge diff --git a/docker-compose.yml b/docker-compose.yml index e39f0d8d26..6efe0e0a1d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3.8" - services: web: container_name: web From b4cc58d5dde89563d5e3acb468550181cef20706 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Thu, 4 Apr 2024 15:49:25 +0530 Subject: [PATCH 015/105] [WEB-756] chore: spreadsheet layout cycle and module feature toggle validation (#4121) * chore: spreadsheet layout cycle and module feature toggle validation added * chore: project analytics cycle and module feature toggle validation added --- .../analytics/custom-analytics/select-bar.tsx | 14 ++++++++++++-- .../analytics/custom-analytics/select/segment.tsx | 10 ++++------ .../analytics/custom-analytics/select/x-axis.tsx | 10 ++++------ .../issue-layouts/roots/all-issue-layout-root.tsx | 1 + .../issues/issue-layouts/spreadsheet/issue-row.tsx | 10 +++++++--- .../spreadsheet/spreadsheet-header.tsx | 8 ++++---- .../spreadsheet/spreadsheet-table.tsx | 4 ++++ .../issue-layouts/spreadsheet/spreadsheet-view.tsx | 12 ++++++++++++ 8 files changed, 48 insertions(+), 21 deletions(-) diff --git a/web/components/analytics/custom-analytics/select-bar.tsx b/web/components/analytics/custom-analytics/select-bar.tsx index dc241d1ee3..1e4286acd5 100644 --- a/web/components/analytics/custom-analytics/select-bar.tsx +++ b/web/components/analytics/custom-analytics/select-bar.tsx @@ -3,6 +3,7 @@ import { Control, Controller, UseFormSetValue } from "react-hook-form"; import { IAnalyticsParams } from "@plane/types"; // hooks import { SelectProject, SelectSegment, SelectXAxis, SelectYAxis } from "@/components/analytics"; +import { ANALYTICS_X_AXIS_VALUES } from "@/constants/analytics"; import { useProject } from "@/hooks/store"; // components // types @@ -18,7 +19,15 @@ type Props = { export const CustomAnalyticsSelectBar: React.FC = observer((props) => { const { control, setValue, params, fullScreen, isProjectLevel } = props; - const { workspaceProjectIds: workspaceProjectIds } = useProject(); + const { workspaceProjectIds: workspaceProjectIds, currentProjectDetails } = useProject(); + + const analyticsOptions = isProjectLevel + ? ANALYTICS_X_AXIS_VALUES.filter((v) => { + if (v.value === "issue_cycle__cycle_id" && !currentProjectDetails?.cycle_view) return false; + if (v.value === "issue_module__module_id" && !currentProjectDetails?.module_view) return false; + return true; + }) + : ANALYTICS_X_AXIS_VALUES; return (
= observer((props) => { onChange(val); }} params={params} + analyticsOptions={analyticsOptions} /> )} /> @@ -74,7 +84,7 @@ export const CustomAnalyticsSelectBar: React.FC = observer((props) => { name="segment" control={control} render={({ field: { value, onChange } }) => ( - + )} />
diff --git a/web/components/analytics/custom-analytics/select/segment.tsx b/web/components/analytics/custom-analytics/select/segment.tsx index 07bbb0e371..f9dedc9654 100644 --- a/web/components/analytics/custom-analytics/select/segment.tsx +++ b/web/components/analytics/custom-analytics/select/segment.tsx @@ -3,17 +3,15 @@ import { IAnalyticsParams, TXAxisValues } from "@plane/types"; // ui import { CustomSelect } from "@plane/ui"; -// types -import { ANALYTICS_X_AXIS_VALUES } from "@/constants/analytics"; -// constants type Props = { value: TXAxisValues | null | undefined; onChange: () => void; params: IAnalyticsParams; + analyticsOptions: { value: TXAxisValues; label: string }[]; }; -export const SelectSegment: React.FC = ({ value, onChange, params }) => { +export const SelectSegment: React.FC = ({ value, onChange, params, analyticsOptions }) => { const router = useRouter(); const { cycleId, moduleId } = router.query; @@ -22,7 +20,7 @@ export const SelectSegment: React.FC = ({ value, onChange, params }) => { value={value} label={ - {ANALYTICS_X_AXIS_VALUES.find((v) => v.value === value)?.label ?? ( + {analyticsOptions.find((v) => v.value === value)?.label ?? ( No value )} @@ -31,7 +29,7 @@ export const SelectSegment: React.FC = ({ value, onChange, params }) => { maxHeight="lg" > No value - {ANALYTICS_X_AXIS_VALUES.map((item) => { + {analyticsOptions.map((item) => { if (params.x_axis === item.value) return null; if (cycleId && item.value === "issue_cycle__cycle_id") return null; if (moduleId && item.value === "issue_module__module_id") return null; diff --git a/web/components/analytics/custom-analytics/select/x-axis.tsx b/web/components/analytics/custom-analytics/select/x-axis.tsx index a0c21b1b67..39a01f0c41 100644 --- a/web/components/analytics/custom-analytics/select/x-axis.tsx +++ b/web/components/analytics/custom-analytics/select/x-axis.tsx @@ -3,18 +3,16 @@ import { IAnalyticsParams, TXAxisValues } from "@plane/types"; // ui import { CustomSelect } from "@plane/ui"; -// types -import { ANALYTICS_X_AXIS_VALUES } from "@/constants/analytics"; -// constants type Props = { value: TXAxisValues; onChange: (val: string) => void; params: IAnalyticsParams; + analyticsOptions: { value: TXAxisValues; label: string }[]; }; export const SelectXAxis: React.FC = (props) => { - const { value, onChange, params } = props; + const { value, onChange, params, analyticsOptions } = props; const router = useRouter(); const { cycleId, moduleId } = router.query; @@ -22,11 +20,11 @@ export const SelectXAxis: React.FC = (props) => { return ( {ANALYTICS_X_AXIS_VALUES.find((v) => v.value === value)?.label}} + label={{analyticsOptions.find((v) => v.value === value)?.label}} onChange={onChange} maxHeight="lg" > - {ANALYTICS_X_AXIS_VALUES.map((item) => { + {analyticsOptions.map((item) => { if (params.segment === item.value) return null; if (cycleId && item.value === "issue_cycle__cycle_id") return null; if (moduleId && item.value === "issue_module__module_id") return null; diff --git a/web/components/issues/issue-layouts/roots/all-issue-layout-root.tsx b/web/components/issues/issue-layouts/roots/all-issue-layout-root.tsx index ef7b02b297..af36b48146 100644 --- a/web/components/issues/issue-layouts/roots/all-issue-layout-root.tsx +++ b/web/components/issues/issue-layouts/roots/all-issue-layout-root.tsx @@ -182,6 +182,7 @@ export const AllIssueLayoutRoot: React.FC = observer(() => { updateIssue={updateIssue} canEditProperties={canEditProperties} viewId={globalViewId} + isWorkspaceLevel /> {/* peek overview */} diff --git a/web/components/issues/issue-layouts/spreadsheet/issue-row.tsx b/web/components/issues/issue-layouts/spreadsheet/issue-row.tsx index fc36fdd867..e883522615 100644 --- a/web/components/issues/issue-layouts/spreadsheet/issue-row.tsx +++ b/web/components/issues/issue-layouts/spreadsheet/issue-row.tsx @@ -8,8 +8,6 @@ import { IIssueDisplayProperties, TIssue } from "@plane/types"; import { ControlLink, Tooltip } from "@plane/ui"; // components import RenderIfVisible from "@/components/core/render-if-visible-HOC"; -// constants -import { SPREADSHEET_PROPERTY_LIST } from "@/constants/spreadsheet"; // helper import { cn } from "@/helpers/common.helper"; // hooks @@ -37,6 +35,7 @@ interface Props { isScrolled: MutableRefObject; containerRef: MutableRefObject; issueIds: string[]; + spreadsheetColumnsList: (keyof IIssueDisplayProperties)[]; } export const SpreadsheetIssueRow = observer((props: Props) => { @@ -52,6 +51,7 @@ export const SpreadsheetIssueRow = observer((props: Props) => { isScrolled, containerRef, issueIds, + spreadsheetColumnsList, } = props; const [isExpanded, setExpanded] = useState(false); @@ -81,6 +81,7 @@ export const SpreadsheetIssueRow = observer((props: Props) => { isScrolled={isScrolled} isExpanded={isExpanded} setExpanded={setExpanded} + spreadsheetColumnsList={spreadsheetColumnsList} /> @@ -101,6 +102,7 @@ export const SpreadsheetIssueRow = observer((props: Props) => { isScrolled={isScrolled} containerRef={containerRef} issueIds={issueIds} + spreadsheetColumnsList={spreadsheetColumnsList} /> ))} @@ -123,6 +125,7 @@ interface IssueRowDetailsProps { isScrolled: MutableRefObject; isExpanded: boolean; setExpanded: Dispatch>; + spreadsheetColumnsList: (keyof IIssueDisplayProperties)[]; } const IssueRowDetails = observer((props: IssueRowDetailsProps) => { @@ -138,6 +141,7 @@ const IssueRowDetails = observer((props: IssueRowDetailsProps) => { isScrolled, isExpanded, setExpanded, + spreadsheetColumnsList, } = props; // router const router = useRouter(); @@ -255,7 +259,7 @@ const IssueRowDetails = observer((props: IssueRowDetailsProps) => { {/* Rest of the columns */} - {SPREADSHEET_PROPERTY_LIST.map((property) => ( + {spreadsheetColumnsList.map((property) => ( ) => void; isEstimateEnabled: boolean; + spreadsheetColumnsList: (keyof IIssueDisplayProperties)[]; } export const SpreadsheetHeader = (props: Props) => { - const { displayProperties, displayFilters, handleDisplayFilterUpdate, isEstimateEnabled } = props; + const { displayProperties, displayFilters, handleDisplayFilterUpdate, isEstimateEnabled, spreadsheetColumnsList } = + props; return ( @@ -36,7 +36,7 @@ export const SpreadsheetHeader = (props: Props) => { - {SPREADSHEET_PROPERTY_LIST.map((property) => ( + {spreadsheetColumnsList.map((property) => ( boolean; portalElement: React.MutableRefObject; containerRef: MutableRefObject; + spreadsheetColumnsList: (keyof IIssueDisplayProperties)[]; }; export const SpreadsheetTable = observer((props: Props) => { @@ -36,6 +37,7 @@ export const SpreadsheetTable = observer((props: Props) => { updateIssue, canEditProperties, containerRef, + spreadsheetColumnsList, } = props; // states @@ -83,6 +85,7 @@ export const SpreadsheetTable = observer((props: Props) => { displayFilters={displayFilters} handleDisplayFilterUpdate={handleDisplayFilterUpdate} isEstimateEnabled={isEstimateEnabled} + spreadsheetColumnsList={spreadsheetColumnsList} /> {issueIds.map((id) => ( @@ -99,6 +102,7 @@ export const SpreadsheetTable = observer((props: Props) => { containerRef={containerRef} isScrolled={isScrolled} issueIds={issueIds} + spreadsheetColumnsList={spreadsheetColumnsList} /> ))} diff --git a/web/components/issues/issue-layouts/spreadsheet/spreadsheet-view.tsx b/web/components/issues/issue-layouts/spreadsheet/spreadsheet-view.tsx index 4459d462ca..5231e427eb 100644 --- a/web/components/issues/issue-layouts/spreadsheet/spreadsheet-view.tsx +++ b/web/components/issues/issue-layouts/spreadsheet/spreadsheet-view.tsx @@ -4,6 +4,7 @@ import { TIssue, IIssueDisplayFilterOptions, IIssueDisplayProperties } from "@pl // components import { Spinner } from "@plane/ui"; import { SpreadsheetQuickAddIssueForm } from "@/components/issues"; +import { SPREADSHEET_PROPERTY_LIST } from "@/constants/spreadsheet"; import { useProject } from "@/hooks/store"; import { SpreadsheetTable } from "./spreadsheet-table"; // types @@ -31,6 +32,7 @@ type Props = { canEditProperties: (projectId: string | undefined) => boolean; enableQuickCreateIssue?: boolean; disableIssueCreation?: boolean; + isWorkspaceLevel?: boolean; }; export const SpreadsheetView: React.FC = observer((props) => { @@ -46,6 +48,7 @@ export const SpreadsheetView: React.FC = observer((props) => { canEditProperties, enableQuickCreateIssue, disableIssueCreation, + isWorkspaceLevel = false, } = props; // refs const containerRef = useRef(null); @@ -55,6 +58,14 @@ export const SpreadsheetView: React.FC = observer((props) => { const isEstimateEnabled: boolean = currentProjectDetails?.estimate !== null; + const spreadsheetColumnsList = isWorkspaceLevel + ? SPREADSHEET_PROPERTY_LIST + : SPREADSHEET_PROPERTY_LIST.filter((property) => { + if (property === "cycle" && !currentProjectDetails?.cycle_view) return false; + if (property === "modules" && !currentProjectDetails?.module_view) return false; + return true; + }); + if (!issueIds || issueIds.length === 0) return (
@@ -77,6 +88,7 @@ export const SpreadsheetView: React.FC = observer((props) => { updateIssue={updateIssue} canEditProperties={canEditProperties} containerRef={containerRef} + spreadsheetColumnsList={spreadsheetColumnsList} />
From 3742ea91bf2cbf8243abd0ba9a38a7c810e5402c Mon Sep 17 00:00:00 2001 From: guru_sainath Date: Thu, 4 Apr 2024 17:24:16 +0530 Subject: [PATCH 016/105] fix: issue description was not rendering in the issue create/edit modal (#4122) --- web/components/issues/issue-modal/form.tsx | 58 +++++++++++---------- web/components/issues/issue-modal/modal.tsx | 1 + 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/web/components/issues/issue-modal/form.tsx b/web/components/issues/issue-modal/form.tsx index 235d33b5f2..ed8a562c31 100644 --- a/web/components/issues/issue-modal/form.tsx +++ b/web/components/issues/issue-modal/form.tsx @@ -461,34 +461,36 @@ export const IssueFormRoot: FC = observer((props) => { /> )}
- ( - { - onChange(description_html); - handleFormChange(); - }} - mentionHighlights={mentionHighlights} - mentionSuggestions={mentionSuggestions} - tabIndex={getTabIndex("description_html")} - /> - )} - /> + {data?.description_html && watch("description_html") && ( + ( + { + onChange(description_html); + handleFormChange(); + }} + mentionHighlights={mentionHighlights} + mentionSuggestions={mentionSuggestions} + tabIndex={getTabIndex("description_html")} + /> + )} + /> + )} )} diff --git a/web/components/issues/issue-modal/modal.tsx b/web/components/issues/issue-modal/modal.tsx index 29633918fc..8bb4e972a3 100644 --- a/web/components/issues/issue-modal/modal.tsx +++ b/web/components/issues/issue-modal/modal.tsx @@ -75,6 +75,7 @@ export const CreateUpdateIssueModal: React.FC = observer((prop const { createIssue, updateIssue } = useIssuesActions(storeType); const fetchIssueDetail = async (issueId: string | undefined) => { + setDescription(undefined); if (!workspaceSlug) return; if (!projectId || issueId === undefined) { From 62dac421dc24225980a3f053be10ccc2efabf481 Mon Sep 17 00:00:00 2001 From: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com> Date: Fri, 5 Apr 2024 19:24:24 +0530 Subject: [PATCH 017/105] chore: archived cycles and mpdules (#4126) --- apiserver/plane/app/views/workspace/cycle.py | 1 + apiserver/plane/app/views/workspace/module.py | 1 + 2 files changed, 2 insertions(+) diff --git a/apiserver/plane/app/views/workspace/cycle.py b/apiserver/plane/app/views/workspace/cycle.py index ea081cf993..e85fa1cefa 100644 --- a/apiserver/plane/app/views/workspace/cycle.py +++ b/apiserver/plane/app/views/workspace/cycle.py @@ -27,6 +27,7 @@ def get(self, request, slug): .select_related("project") .select_related("workspace") .select_related("owned_by") + .filter(archived_at__isnull=False) .annotate( total_issues=Count( "issue_cycle", diff --git a/apiserver/plane/app/views/workspace/module.py b/apiserver/plane/app/views/workspace/module.py index 8dd5e97f48..085787694f 100644 --- a/apiserver/plane/app/views/workspace/module.py +++ b/apiserver/plane/app/views/workspace/module.py @@ -30,6 +30,7 @@ def get(self, request, slug): .select_related("workspace") .select_related("lead") .prefetch_related("members") + .filter(archived_at__isnull=False) .prefetch_related( Prefetch( "link_module", From 90609b306f36909a71a63c288e91aef7f1eeb175 Mon Sep 17 00:00:00 2001 From: rahulramesha <71900764+rahulramesha@users.noreply.github.com> Date: Fri, 5 Apr 2024 20:05:55 +0530 Subject: [PATCH 018/105] [WEB-914]: fix: Exception due to cycles and modules for undefined fields (#4127) * fix cycle types * fix module types --- packages/types/src/cycle/cycle.d.ts | 17 ++++++----- packages/types/src/module/modules.d.ts | 16 +++++------ .../core/sidebar/sidebar-progress-stats.tsx | 16 ++++++----- web/components/cycles/active-cycle/header.tsx | 4 +-- .../upcoming-cycles-list-item.tsx | 2 +- .../cycles/board/cycles-board-card.tsx | 4 +-- web/components/cycles/gantt-chart/blocks.tsx | 28 +++++++++---------- .../cycles/list/cycles-list-item.tsx | 2 +- web/components/cycles/quick-actions.tsx | 2 +- web/components/cycles/sidebar.tsx | 2 +- .../cycles/transfer-issues-modal.tsx | 8 ++++-- web/components/headers/cycle-issues.tsx | 2 +- web/components/headers/module-issues.tsx | 2 +- .../issue-layouts/empty-states/cycle.tsx | 2 +- .../filters/header/filters/cycle.tsx | 3 +- web/components/modules/quick-actions.tsx | 2 +- web/components/modules/sidebar.tsx | 2 +- web/helpers/cycle.helper.ts | 9 +++--- web/helpers/module.helper.ts | 2 +- web/store/cycle.store.ts | 2 +- web/store/module.store.ts | 4 +-- 21 files changed, 68 insertions(+), 63 deletions(-) diff --git a/packages/types/src/cycle/cycle.d.ts b/packages/types/src/cycle/cycle.d.ts index 30724706b4..28be2ec2a4 100644 --- a/packages/types/src/cycle/cycle.d.ts +++ b/packages/types/src/cycle/cycle.d.ts @@ -6,8 +6,8 @@ export interface ICycle { backlog_issues: number; cancelled_issues: number; completed_issues: number; - created_at: Date; - created_by: string; + created_at?: string; + created_by?: string; description: string; distribution?: { assignees: TAssigneesDistribution[]; @@ -16,23 +16,22 @@ export interface ICycle { }; end_date: string | null; id: string; - is_favorite: boolean; - issue: string; + is_favorite?: boolean; name: string; owned_by_id: string; progress_snapshot: TProgressSnapshot; project_id: string; - status: TCycleGroups; + status?: TCycleGroups; sort_order: number; start_date: string | null; started_issues: number; - sub_issues: number; + sub_issues?: number; total_issues: number; unstarted_issues: number; - updated_at: Date; - updated_by: string; + updated_at?: string; + updated_by?: string; archived_at: string | null; - assignee_ids: string[]; + assignee_ids?: string[]; view_props: { filters: IIssueFilterOptions; }; diff --git a/packages/types/src/module/modules.d.ts b/packages/types/src/module/modules.d.ts index 7ba2c3b418..95b084f2f9 100644 --- a/packages/types/src/module/modules.d.ts +++ b/packages/types/src/module/modules.d.ts @@ -12,33 +12,33 @@ export interface IModule { backlog_issues: number; cancelled_issues: number; completed_issues: number; - created_at: Date; - created_by: string; + created_at: string; + created_by?: string; description: string; description_text: any; description_html: any; - distribution: { + distribution?: { assignees: TAssigneesDistribution[]; completion_chart: TCompletionChartDistribution; labels: TLabelsDistribution[]; }; id: string; lead_id: string | null; - link_module: ILinkDetails[]; + link_module?: ILinkDetails[]; member_ids: string[]; is_favorite: boolean; name: string; project_id: string; sort_order: number; - sub_issues: number; + sub_issues?: number; start_date: string | null; started_issues: number; - status: TModuleStatus; + status?: TModuleStatus; target_date: string | null; total_issues: number; unstarted_issues: number; - updated_at: Date; - updated_by: string; + updated_at: string; + updated_by?: string; archived_at: string | null; view_props: { filters: IIssueFilterOptions; diff --git a/web/components/core/sidebar/sidebar-progress-stats.tsx b/web/components/core/sidebar/sidebar-progress-stats.tsx index 21b508e288..528b8aa18d 100644 --- a/web/components/core/sidebar/sidebar-progress-stats.tsx +++ b/web/components/core/sidebar/sidebar-progress-stats.tsx @@ -22,11 +22,13 @@ import emptyMembers from "public/empty-state/empty_members.svg"; // types type Props = { - distribution: { - assignees: TAssigneesDistribution[]; - completion_chart: TCompletionChartDistribution; - labels: TLabelsDistribution[]; - }; + distribution: + | { + assignees: TAssigneesDistribution[]; + completion_chart: TCompletionChartDistribution; + labels: TLabelsDistribution[]; + } + | undefined; groupedIssues: { [key: string]: number; }; @@ -129,7 +131,7 @@ export const SidebarProgressStats: React.FC = ({ as="div" className="flex w-full flex-col gap-1.5 overflow-y-auto pt-3.5 vertical-scrollbar scrollbar-sm" > - {distribution?.assignees.length > 0 ? ( + {distribution && distribution?.assignees.length > 0 ? ( distribution.assignees.map((assignee, index) => { if (assignee.assignee_id) return ( @@ -189,7 +191,7 @@ export const SidebarProgressStats: React.FC = ({ as="div" className="flex w-full flex-col gap-1.5 overflow-y-auto pt-3.5 vertical-scrollbar scrollbar-sm" > - {distribution?.labels.length > 0 ? ( + {distribution && distribution?.labels.length > 0 ? ( distribution.labels.map((label, index) => ( = (props) => { const cycleOwnerDetails = cycle && cycle.owned_by_id ? getUserDetails(cycle.owned_by_id) : undefined; const daysLeft = findHowManyDaysLeft(cycle.end_date) ?? 0; - const currentCycleStatus = cycle.status.toLocaleLowerCase() as TCycleGroups; + const currentCycleStatus = cycle.status?.toLocaleLowerCase() as TCycleGroups | undefined; const cycleAssignee = (cycle.distribution?.assignees ?? []).filter((assignee) => assignee.display_name); return (
- +

{truncateText(cycle.name, 70)}

diff --git a/web/components/cycles/active-cycle/upcoming-cycles-list-item.tsx b/web/components/cycles/active-cycle/upcoming-cycles-list-item.tsx index 2e48a95b4d..303d917524 100644 --- a/web/components/cycles/active-cycle/upcoming-cycles-list-item.tsx +++ b/web/components/cycles/active-cycle/upcoming-cycles-list-item.tsx @@ -99,7 +99,7 @@ export const UpcomingCycleListItem: React.FC = observer((props) => { {renderFormattedDate(cycle.start_date)} - {renderFormattedDate(cycle.end_date)}
)} - {cycle.assignee_ids?.length > 0 ? ( + {cycle.assignee_ids && cycle.assignee_ids?.length > 0 ? ( {cycle.assignee_ids?.map((assigneeId) => { const member = getUserDetails(assigneeId); diff --git a/web/components/cycles/board/cycles-board-card.tsx b/web/components/cycles/board/cycles-board-card.tsx index 34d395db46..b528e780bc 100644 --- a/web/components/cycles/board/cycles-board-card.tsx +++ b/web/components/cycles/board/cycles-board-card.tsx @@ -46,7 +46,7 @@ export const CyclesBoardCard: FC = observer((props) => { if (!cycleDetails) return null; - const cycleStatus = cycleDetails.status.toLocaleLowerCase(); + const cycleStatus = cycleDetails.status?.toLocaleLowerCase(); // const isCompleted = cycleStatus === "completed"; const endDate = getDate(cycleDetails.end_date); const startDate = getDate(cycleDetails.start_date); @@ -189,7 +189,7 @@ export const CyclesBoardCard: FC = observer((props) => { {issueCount}
- {cycleDetails.assignee_ids.length > 0 && ( + {cycleDetails.assignee_ids && cycleDetails.assignee_ids.length > 0 && (
diff --git a/web/components/cycles/gantt-chart/blocks.tsx b/web/components/cycles/gantt-chart/blocks.tsx index acc081b4d5..6cc48aa5d5 100644 --- a/web/components/cycles/gantt-chart/blocks.tsx +++ b/web/components/cycles/gantt-chart/blocks.tsx @@ -25,7 +25,7 @@ export const CycleGanttBlock: React.FC = observer((props) => { // derived values const cycleDetails = getCycleById(cycleId); const { isMobile } = usePlatformOS(); - const cycleStatus = cycleDetails?.status.toLocaleLowerCase(); + const cycleStatus = cycleDetails?.status?.toLocaleLowerCase(); return (
= observer((props) => { cycleStatus === "current" ? "#09a953" : cycleStatus === "upcoming" - ? "#f7ae59" - : cycleStatus === "completed" - ? "#3f76ff" - : cycleStatus === "draft" - ? "rgb(var(--color-text-200))" - : "", + ? "#f7ae59" + : cycleStatus === "completed" + ? "#3f76ff" + : cycleStatus === "draft" + ? "rgb(var(--color-text-200))" + : "", }} onClick={() => router.push(`/${workspaceSlug}/projects/${cycleDetails?.project_id}/cycles/${cycleDetails?.id}`)} > @@ -74,7 +74,7 @@ export const CycleGanttSidebarBlock: React.FC = observer((props) => { // derived values const cycleDetails = getCycleById(cycleId); - const cycleStatus = cycleDetails?.status.toLocaleLowerCase(); + const cycleStatus = cycleDetails?.status?.toLocaleLowerCase(); return ( = observer((props) => { cycleStatus === "current" ? "#09a953" : cycleStatus === "upcoming" - ? "#f7ae59" - : cycleStatus === "completed" - ? "#3f76ff" - : cycleStatus === "draft" - ? "rgb(var(--color-text-200))" - : "" + ? "#f7ae59" + : cycleStatus === "completed" + ? "#3f76ff" + : cycleStatus === "draft" + ? "rgb(var(--color-text-200))" + : "" }`} />
{cycleDetails?.name}
diff --git a/web/components/cycles/list/cycles-list-item.tsx b/web/components/cycles/list/cycles-list-item.tsx index 7ee797bb24..827f91ad82 100644 --- a/web/components/cycles/list/cycles-list-item.tsx +++ b/web/components/cycles/list/cycles-list-item.tsx @@ -216,7 +216,7 @@ export const CyclesListItem: FC = observer((props) => {
- {cycleDetails.assignee_ids?.length > 0 ? ( + {cycleDetails.assignee_ids && cycleDetails.assignee_ids?.length > 0 ? ( {cycleDetails.assignee_ids?.map((assignee_id) => { const member = getUserDetails(assignee_id); diff --git a/web/components/cycles/quick-actions.tsx b/web/components/cycles/quick-actions.tsx index bf9aefc879..33a7df8360 100644 --- a/web/components/cycles/quick-actions.tsx +++ b/web/components/cycles/quick-actions.tsx @@ -37,7 +37,7 @@ export const CycleQuickActions: React.FC = observer((props) => { const { getCycleById, restoreCycle } = useCycle(); // derived values const cycleDetails = getCycleById(cycleId); - const isCompleted = cycleDetails?.status.toLowerCase() === "completed"; + const isCompleted = cycleDetails?.status?.toLowerCase() === "completed"; // auth const isEditingAllowed = !!currentWorkspaceAllProjectsRole && currentWorkspaceAllProjectsRole[projectId] >= EUserProjectRoles.MEMBER; diff --git a/web/components/cycles/sidebar.tsx b/web/components/cycles/sidebar.tsx index b72f9fd0d0..106f3b3e01 100644 --- a/web/components/cycles/sidebar.tsx +++ b/web/components/cycles/sidebar.tsx @@ -211,7 +211,7 @@ export const CycleDetailsSidebar: React.FC = observer((props) => { // [workspaceSlug, projectId, cycleId, issueFilters, updateFilters] // ); - const cycleStatus = cycleDetails?.status.toLocaleLowerCase(); + const cycleStatus = cycleDetails?.status?.toLocaleLowerCase(); const isCompleted = cycleStatus === "completed"; const startDate = getDate(cycleDetails?.start_date); diff --git a/web/components/cycles/transfer-issues-modal.tsx b/web/components/cycles/transfer-issues-modal.tsx index b5e1aa253f..2c950002d3 100644 --- a/web/components/cycles/transfer-issues-modal.tsx +++ b/web/components/cycles/transfer-issues-modal.tsx @@ -134,9 +134,11 @@ export const TransferIssuesModal: React.FC = observer((props) => {
{cycleDetails?.name} - - {cycleDetails.status.toLocaleLowerCase()} - + {cycleDetails.status && ( + + {cycleDetails.status.toLocaleLowerCase()} + + )}
); diff --git a/web/components/headers/cycle-issues.tsx b/web/components/headers/cycle-issues.tsx index e1113910f6..2fd5ffe836 100644 --- a/web/components/headers/cycle-issues.tsx +++ b/web/components/headers/cycle-issues.tsx @@ -146,7 +146,7 @@ export const CycleIssuesHeader: React.FC = observer(() => { currentProjectRole && [EUserProjectRoles.ADMIN, EUserProjectRoles.MEMBER].includes(currentProjectRole); const issueCount = cycleDetails - ? issueFilters?.displayFilters?.sub_issue + ? issueFilters?.displayFilters?.sub_issue && cycleDetails?.sub_issues ? cycleDetails.total_issues + cycleDetails?.sub_issues : cycleDetails.total_issues : undefined; diff --git a/web/components/headers/module-issues.tsx b/web/components/headers/module-issues.tsx index 56da66d2fd..13d81e49b1 100644 --- a/web/components/headers/module-issues.tsx +++ b/web/components/headers/module-issues.tsx @@ -147,7 +147,7 @@ export const ModuleIssuesHeader: React.FC = observer(() => { currentProjectRole && [EUserProjectRoles.ADMIN, EUserProjectRoles.MEMBER].includes(currentProjectRole); const issueCount = moduleDetails - ? issueFilters?.displayFilters?.sub_issue + ? issueFilters?.displayFilters?.sub_issue && moduleDetails.sub_issues ? moduleDetails.total_issues + moduleDetails.sub_issues : moduleDetails.total_issues : undefined; diff --git a/web/components/issues/issue-layouts/empty-states/cycle.tsx b/web/components/issues/issue-layouts/empty-states/cycle.tsx index 0f0b27c0cf..6915600fd8 100644 --- a/web/components/issues/issue-layouts/empty-states/cycle.tsx +++ b/web/components/issues/issue-layouts/empty-states/cycle.tsx @@ -62,7 +62,7 @@ export const CycleEmptyState: React.FC = observer((props) => { const isCompletedCycleSnapshotAvailable = !isEmpty(cycleDetails?.progress_snapshot ?? {}); - const isCompletedAndEmpty = isCompletedCycleSnapshotAvailable || cycleDetails?.status.toLowerCase() === "completed"; + const isCompletedAndEmpty = isCompletedCycleSnapshotAvailable || cycleDetails?.status?.toLowerCase() === "completed"; const emptyStateType = isCompletedAndEmpty ? EmptyStateType.PROJECT_CYCLE_COMPLETED_NO_ISSUES diff --git a/web/components/issues/issue-layouts/filters/header/filters/cycle.tsx b/web/components/issues/issue-layouts/filters/header/filters/cycle.tsx index 4e3fe6fb00..a991bc1f03 100644 --- a/web/components/issues/issue-layouts/filters/header/filters/cycle.tsx +++ b/web/components/issues/issue-layouts/filters/header/filters/cycle.tsx @@ -51,7 +51,8 @@ export const FilterCycle: React.FC = observer((props) => { else setItemsToRender(sortedOptions.length); }; - const cycleStatus = (status: TCycleGroups) => (status ? status.toLocaleLowerCase() : "draft") as TCycleGroups; + const cycleStatus = (status: TCycleGroups | undefined) => + (status ? status.toLocaleLowerCase() : "draft") as TCycleGroups; return ( <> diff --git a/web/components/modules/quick-actions.tsx b/web/components/modules/quick-actions.tsx index 5decec4ecc..a6938c10a9 100644 --- a/web/components/modules/quick-actions.tsx +++ b/web/components/modules/quick-actions.tsx @@ -41,7 +41,7 @@ export const ModuleQuickActions: React.FC = observer((props) => { const isEditingAllowed = !!currentWorkspaceAllProjectsRole && currentWorkspaceAllProjectsRole[projectId] >= EUserProjectRoles.MEMBER; - const moduleState = moduleDetails?.status.toLocaleLowerCase(); + const moduleState = moduleDetails?.status?.toLocaleLowerCase(); const isInArchivableGroup = !!moduleState && ["completed", "cancelled"].includes(moduleState); const handleCopyText = (e: React.MouseEvent) => { diff --git a/web/components/modules/sidebar.tsx b/web/components/modules/sidebar.tsx index de6e3d02fd..f219aeb956 100644 --- a/web/components/modules/sidebar.tsx +++ b/web/components/modules/sidebar.tsx @@ -84,7 +84,7 @@ export const ModuleDetailsSidebar: React.FC = observer((props) => { const { setTrackElement, captureModuleEvent, captureEvent } = useEventTracker(); const moduleDetails = getModuleById(moduleId); - const moduleState = moduleDetails?.status.toLocaleLowerCase(); + const moduleState = moduleDetails?.status?.toLocaleLowerCase(); const isInArchivableGroup = !!moduleState && ["completed", "cancelled"].includes(moduleState); const { reset, control } = useForm({ diff --git a/web/helpers/cycle.helper.ts b/web/helpers/cycle.helper.ts index 1964ed5e3d..8e3506120e 100644 --- a/web/helpers/cycle.helper.ts +++ b/web/helpers/cycle.helper.ts @@ -13,6 +13,7 @@ import { ICycle, TCycleFilters } from "@plane/types"; export const orderCycles = (cycles: ICycle[]): ICycle[] => { if (cycles.length === 0) return []; + const acceptedStatuses = ["current", "upcoming", "draft"]; const STATUS_ORDER: { [key: string]: number; } = { @@ -21,10 +22,10 @@ export const orderCycles = (cycles: ICycle[]): ICycle[] => { draft: 3, }; - let filteredCycles = cycles.filter((c) => c.status.toLowerCase() !== "completed"); + let filteredCycles = cycles.filter((c) => acceptedStatuses.includes(c.status?.toLowerCase() ?? "")); filteredCycles = sortBy(filteredCycles, [ - (c) => STATUS_ORDER[c.status.toLowerCase()], - (c) => (c.status.toLowerCase() === "upcoming" ? c.start_date : c.name.toLowerCase()), + (c) => STATUS_ORDER[c.status?.toLowerCase() ?? ""], + (c) => (c.status?.toLowerCase() === "upcoming" ? c.start_date : c.name.toLowerCase()), ]); return filteredCycles; @@ -41,7 +42,7 @@ export const shouldFilterCycle = (cycle: ICycle, filter: TCycleFilters): boolean Object.keys(filter).forEach((key) => { const filterKey = key as keyof TCycleFilters; if (filterKey === "status" && filter.status && filter.status.length > 0) - fallsInFilters = fallsInFilters && filter.status.includes(cycle.status.toLowerCase()); + fallsInFilters = fallsInFilters && filter.status.includes(cycle.status?.toLowerCase() ?? ""); if (filterKey === "start_date" && filter.start_date && filter.start_date.length > 0) { const startDate = getDate(cycle.start_date); filter.start_date.forEach((dateFilter) => { diff --git a/web/helpers/module.helper.ts b/web/helpers/module.helper.ts index f5cbfe08ab..31cfff0ff5 100644 --- a/web/helpers/module.helper.ts +++ b/web/helpers/module.helper.ts @@ -55,7 +55,7 @@ export const shouldFilterModule = ( Object.keys(filters).forEach((key) => { const filterKey = key as keyof TModuleFilters; if (filterKey === "status" && filters.status && filters.status.length > 0) - fallsInFilters = fallsInFilters && filters.status.includes(module.status.toLowerCase()); + fallsInFilters = fallsInFilters && filters.status.includes(module.status?.toLowerCase() ?? ""); if (filterKey === "lead" && filters.lead && filters.lead.length > 0) fallsInFilters = fallsInFilters && filters.lead.includes(`${module.lead_id}`); if (filterKey === "members" && filters.members && filters.members.length > 0) { diff --git a/web/store/cycle.store.ts b/web/store/cycle.store.ts index ac90f9e5ee..18bc58dc77 100644 --- a/web/store/cycle.store.ts +++ b/web/store/cycle.store.ts @@ -256,7 +256,7 @@ export class CycleStore implements ICycleStore { (c) => c.project_id === projectId && !c.archived_at && - c.status.toLowerCase() === "completed" && + c.status?.toLowerCase() === "completed" && c.name.toLowerCase().includes(searchQuery.toLowerCase()) && shouldFilterCycle(c, filters ?? {}) ); diff --git a/web/store/module.store.ts b/web/store/module.store.ts index 1a2896aa25..fd180545cb 100644 --- a/web/store/module.store.ts +++ b/web/store/module.store.ts @@ -380,7 +380,7 @@ export class ModulesStore implements IModuleStore { ) => { const originalModuleDetails = this.getModuleById(moduleId); try { - const linkModules = originalModuleDetails?.link_module.map((link) => + const linkModules = originalModuleDetails?.link_module?.map((link) => link.id === linkId ? { ...link, ...data } : link ); runInAction(() => { @@ -407,7 +407,7 @@ export class ModulesStore implements IModuleStore { deleteModuleLink = async (workspaceSlug: string, projectId: string, moduleId: string, linkId: string) => await this.moduleService.deleteModuleLink(workspaceSlug, projectId, moduleId, linkId).then(() => { const moduleDetails = this.getModuleById(moduleId); - const linkModules = moduleDetails?.link_module.filter((link) => link.id !== linkId); + const linkModules = moduleDetails?.link_module?.filter((link) => link.id !== linkId); runInAction(() => { set(this.moduleMap, [moduleId, "link_module"], linkModules); }); From 57f2445bb8689583682293d89b5069ea280eb0b7 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Sat, 6 Apr 2024 17:13:24 +0530 Subject: [PATCH 019/105] fix: ingest events --- web/lib/posthog-provider.tsx | 4 ++-- web/next-env.d.ts | 1 + web/next.config.js | 18 +++++++++++++++--- web/tsconfig.json | 23 +++++++++++++++++++---- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/web/lib/posthog-provider.tsx b/web/lib/posthog-provider.tsx index 1f8f6f64ac..dad0edba50 100644 --- a/web/lib/posthog-provider.tsx +++ b/web/lib/posthog-provider.tsx @@ -42,9 +42,9 @@ const PostHogProvider: FC = (props) => { }, [user, workspaceRole, projectRole]); useEffect(() => { - if (posthogAPIKey && posthogHost) { + if (posthogAPIKey && (process.env.NEXT_PUBLIC_POSTHOG_HOST || posthogHost)) { posthog.init(posthogAPIKey, { - api_host: posthogHost || "https://app.posthog.com", + api_host: process.env.NEXT_PUBLIC_POSTHOG_HOST || posthogHost || "https://app.posthog.com", debug: process.env.NEXT_PUBLIC_POSTHOG_DEBUG === "1", // Debug mode based on the environment variable autocapture: false, capture_pageview: false, // Disable automatic pageview capture, as we capture manually diff --git a/web/next-env.d.ts b/web/next-env.d.ts index 4f11a03dc6..fd36f9494e 100644 --- a/web/next-env.d.ts +++ b/web/next-env.d.ts @@ -1,5 +1,6 @@ /// /// +/// // NOTE: This file should not be edited // see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/web/next.config.js b/web/next.config.js index 256183e31a..82405ce456 100644 --- a/web/next.config.js +++ b/web/next.config.js @@ -3,6 +3,9 @@ require("dotenv").config({ path: ".env" }); const { withSentryConfig } = require("@sentry/nextjs"); const nextConfig = { + reactStrictMode: false, + swcMinify: true, + output: "standalone", async headers() { return [ { @@ -11,8 +14,6 @@ const nextConfig = { }, ]; }, - reactStrictMode: false, - swcMinify: true, images: { remotePatterns: [ { @@ -22,7 +23,18 @@ const nextConfig = { ], unoptimized: true, }, - output: "standalone", + async rewrites() { + return [ + { + source: "/ingest/static/:path*", + destination: "https://us-assets.i.posthog.com/static/:path*", + }, + { + source: "/ingest/:path*", + destination: "https://us.i.posthog.com/:path*", + }, + ] + } }; if (parseInt(process.env.NEXT_PUBLIC_ENABLE_SENTRY || "0", 10)) { diff --git a/web/tsconfig.json b/web/tsconfig.json index 8fcf13199f..310d42730d 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -1,13 +1,28 @@ { "extends": "tsconfig/nextjs.json", - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"], + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ], "compilerOptions": { "baseUrl": ".", "jsx": "preserve", "esModuleInterop": true, "paths": { - "@/*": ["*"] - } + "@/*": [ + "*" + ] + }, + "plugins": [ + { + "name": "next" + } + ], + "strictNullChecks": true } } From 2c8c139c6276641a8b9322f848fb28d934416a50 Mon Sep 17 00:00:00 2001 From: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Date: Mon, 8 Apr 2024 14:59:50 +0530 Subject: [PATCH 020/105] [WEB - 898] fix: external webhooks (#4119) * fix: project webhooks * fix: issue and issue comment webhooks * dev: remove module and cycle issue webhooks * fix: linting errors --- apiserver/plane/api/serializers/issue.py | 4 +-- apiserver/plane/api/serializers/user.py | 2 ++ apiserver/plane/api/urls/project.py | 2 +- apiserver/plane/api/views/base.py | 8 ++++- apiserver/plane/api/views/issue.py | 2 -- apiserver/plane/api/views/project.py | 38 ++++++++++++---------- apiserver/plane/app/permissions/project.py | 4 +-- apiserver/plane/bgtasks/webhook_task.py | 13 ++------ 8 files changed, 36 insertions(+), 37 deletions(-) diff --git a/apiserver/plane/api/serializers/issue.py b/apiserver/plane/api/serializers/issue.py index c78b109efd..c40f56ccc3 100644 --- a/apiserver/plane/api/serializers/issue.py +++ b/apiserver/plane/api/serializers/issue.py @@ -79,7 +79,7 @@ def validate(self, data): parsed_str = html.tostring(parsed, encoding="unicode") data["description_html"] = parsed_str - except Exception as e: + except Exception: raise serializers.ValidationError("Invalid HTML passed") # Validate assignees are from project @@ -366,7 +366,7 @@ def validate(self, data): parsed_str = html.tostring(parsed, encoding="unicode") data["comment_html"] = parsed_str - except Exception as e: + except Exception: raise serializers.ValidationError("Invalid HTML passed") return data diff --git a/apiserver/plane/api/serializers/user.py b/apiserver/plane/api/serializers/user.py index fe50021b55..ea50440e02 100644 --- a/apiserver/plane/api/serializers/user.py +++ b/apiserver/plane/api/serializers/user.py @@ -1,5 +1,6 @@ # Module imports from plane.db.models import User + from .base import BaseSerializer @@ -12,5 +13,6 @@ class Meta: "last_name", "avatar", "display_name", + "email", ] read_only_fields = fields diff --git a/apiserver/plane/api/urls/project.py b/apiserver/plane/api/urls/project.py index 490371ccab..5efb85bb03 100644 --- a/apiserver/plane/api/urls/project.py +++ b/apiserver/plane/api/urls/project.py @@ -12,7 +12,7 @@ name="project", ), path( - "workspaces//projects//", + "workspaces//projects//", ProjectAPIEndpoint.as_view(), name="project", ), diff --git a/apiserver/plane/api/views/base.py b/apiserver/plane/api/views/base.py index 0cf5e8731c..13047eb78e 100644 --- a/apiserver/plane/api/views/base.py +++ b/apiserver/plane/api/views/base.py @@ -7,6 +7,7 @@ from django.conf import settings from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.db import IntegrityError +from django.urls import resolve from django.utils import timezone from rest_framework import status from rest_framework.permissions import IsAuthenticated @@ -165,7 +166,12 @@ def workspace_slug(self): @property def project_id(self): - return self.kwargs.get("project_id", None) + project_id = self.kwargs.get("project_id", None) + if project_id: + return project_id + + if resolve(self.request.path_info).url_name == "project": + return self.kwargs.get("pk", None) @property def fields(self): diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index 4b59dc0207..53998c49fc 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -308,8 +308,6 @@ def patch(self, request, slug, project_id, pk=None): actor_id=str(request.user.id), issue_id=str(pk), project_id=str(project_id), - external_id__isnull=False, - external_source__isnull=False, current_instance=current_instance, epoch=int(timezone.now().timestamp()), ) diff --git a/apiserver/plane/api/views/project.py b/apiserver/plane/api/views/project.py index e0bce5514a..885b7dda59 100644 --- a/apiserver/plane/api/views/project.py +++ b/apiserver/plane/api/views/project.py @@ -1,27 +1,29 @@ # Django imports -from django.utils import timezone from django.db import IntegrityError -from django.db.models import Exists, OuterRef, Q, F, Func, Subquery, Prefetch +from django.db.models import Exists, F, Func, OuterRef, Prefetch, Q, Subquery +from django.utils import timezone # Third party imports from rest_framework import status from rest_framework.response import Response from rest_framework.serializers import ValidationError +from plane.api.serializers import ProjectSerializer +from plane.app.permissions import ProjectBasePermission + # Module imports from plane.db.models import ( - Workspace, + Cycle, + Inbox, + IssueProperty, + Module, Project, - ProjectMember, ProjectDeployBoard, + ProjectMember, State, - Cycle, - Module, - IssueProperty, - Inbox, + Workspace, ) -from plane.app.permissions import ProjectBasePermission -from plane.api.serializers import ProjectSerializer + from .base import BaseAPIView, WebhookMixin @@ -103,8 +105,8 @@ def get_queryset(self): .distinct() ) - def get(self, request, slug, project_id=None): - if project_id is None: + def get(self, request, slug, pk=None): + if pk is None: sort_order_query = ProjectMember.objects.filter( member=request.user, project_id=OuterRef("pk"), @@ -135,7 +137,7 @@ def get(self, request, slug, project_id=None): expand=self.expand, ).data, ) - project = self.get_queryset().get(workspace__slug=slug, pk=project_id) + project = self.get_queryset().get(workspace__slug=slug, pk=pk) serializer = ProjectSerializer( project, fields=self.fields, @@ -259,10 +261,10 @@ def post(self, request, slug): status=status.HTTP_410_GONE, ) - def patch(self, request, slug, project_id=None): + def patch(self, request, slug, pk): try: workspace = Workspace.objects.get(slug=slug) - project = Project.objects.get(pk=project_id) + project = Project.objects.get(pk=pk) if project.archived_at: return Response( @@ -291,7 +293,7 @@ def patch(self, request, slug, project_id=None): name="Triage", group="backlog", description="Default state for managing all Inbox Issues", - project_id=project_id, + project_id=pk, color="#ff7700", ) @@ -322,8 +324,8 @@ def patch(self, request, slug, project_id=None): status=status.HTTP_410_GONE, ) - def delete(self, request, slug, project_id): - project = Project.objects.get(pk=project_id, workspace__slug=slug) + def delete(self, request, slug, pk): + project = Project.objects.get(pk=pk, workspace__slug=slug) project.delete() return Response(status=status.HTTP_204_NO_CONTENT) diff --git a/apiserver/plane/app/permissions/project.py b/apiserver/plane/app/permissions/project.py index 80775cbf68..2ba2a1b64a 100644 --- a/apiserver/plane/app/permissions/project.py +++ b/apiserver/plane/app/permissions/project.py @@ -1,8 +1,8 @@ # Third Party imports -from rest_framework.permissions import BasePermission, SAFE_METHODS +from rest_framework.permissions import SAFE_METHODS, BasePermission # Module import -from plane.db.models import WorkspaceMember, ProjectMember +from plane.db.models import ProjectMember, WorkspaceMember # Permission Mappings Admin = 20 diff --git a/apiserver/plane/bgtasks/webhook_task.py b/apiserver/plane/bgtasks/webhook_task.py index 6537e3b21f..5ee0244c72 100644 --- a/apiserver/plane/bgtasks/webhook_task.py +++ b/apiserver/plane/bgtasks/webhook_task.py @@ -202,16 +202,7 @@ def send_webhook(event, payload, kw, action, slug, bulk, current_site): if webhooks: if action in ["POST", "PATCH"]: if bulk and event in ["cycle_issue", "module_issue"]: - event_data = IssueExpandSerializer( - Issue.objects.filter( - pk__in=[ - str(event.get("issue")) for event in payload - ] - ).prefetch_related("issue_cycle", "issue_module"), - many=True, - ).data - event = "issue" - action = "PATCH" + return else: event_data = [ get_model_data( @@ -219,7 +210,7 @@ def send_webhook(event, payload, kw, action, slug, bulk, current_site): event_id=( payload.get("id") if isinstance(payload, dict) - else None + else kw.get("pk") ), many=False, ) From 4f138ac3f900f306ea768a639c47541da1a884de Mon Sep 17 00:00:00 2001 From: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Date: Mon, 8 Apr 2024 15:01:17 +0530 Subject: [PATCH 021/105] [WEB - 908] chore: remove user dependency in dockerfile (#4124) * chore: remove user dependency from api container * dev: remove user assignment from dockerfile * dev: add logging configuration --- Dockerfile | 15 +++++---------- apiserver/Dockerfile.api | 12 +----------- apiserver/Dockerfile.dev | 4 ---- apiserver/plane/settings/production.py | 4 ++-- space/Dockerfile.space | 13 +++---------- web/Dockerfile.web | 16 ++++------------ 6 files changed, 15 insertions(+), 49 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0f4ecfd364..0d5951dee3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,7 +27,7 @@ RUN yarn install COPY --from=builder /app/out/full/ . COPY turbo.json turbo.json COPY replace-env-vars.sh /usr/local/bin/ -USER root + RUN chmod +x /usr/local/bin/replace-env-vars.sh RUN yarn turbo run build @@ -89,21 +89,17 @@ RUN chmod -R 777 /code WORKDIR /app -# Don't run production as root -RUN addgroup --system --gid 1001 plane -RUN adduser --system --uid 1001 captain - COPY --from=installer /app/apps/app/next.config.js . COPY --from=installer /app/apps/app/package.json . COPY --from=installer /app/apps/space/next.config.js . COPY --from=installer /app/apps/space/package.json . -COPY --from=installer --chown=captain:plane /app/apps/app/.next/standalone ./ +COPY --from=installer /app/apps/app/.next/standalone ./ -COPY --from=installer --chown=captain:plane /app/apps/app/.next/static ./apps/app/.next/static +COPY --from=installer /app/apps/app/.next/static ./apps/app/.next/static -COPY --from=installer --chown=captain:plane /app/apps/space/.next/standalone ./ -COPY --from=installer --chown=captain:plane /app/apps/space/.next ./apps/space/.next +COPY --from=installer /app/apps/space/.next/standalone ./ +COPY --from=installer /app/apps/space/.next ./apps/space/.next ENV NEXT_TELEMETRY_DISABLED 1 @@ -118,7 +114,6 @@ ARG NEXT_PUBLIC_API_BASE_URL=http://localhost:8000 ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL \ BUILT_NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL -USER root COPY replace-env-vars.sh /usr/local/bin/ COPY start.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/replace-env-vars.sh diff --git a/apiserver/Dockerfile.api b/apiserver/Dockerfile.api index 34a50334ad..31124c8f5e 100644 --- a/apiserver/Dockerfile.api +++ b/apiserver/Dockerfile.api @@ -32,28 +32,18 @@ RUN apk add --no-cache --virtual .build-deps \ apk del .build-deps -RUN addgroup -S plane && \ - adduser -S captain -G plane - -RUN chown captain.plane /code - -USER captain - # Add in Django deps and generate Django's static files COPY manage.py manage.py COPY plane plane/ COPY templates templates/ COPY package.json package.json -USER root + RUN apk --no-cache add "bash~=5.2" COPY ./bin ./bin/ RUN mkdir -p /code/plane/logs RUN chmod +x ./bin/takeoff ./bin/worker ./bin/beat RUN chmod -R 777 /code -RUN chown -R captain:plane /code - -USER captain # Expose container port and run entry point script EXPOSE 8000 diff --git a/apiserver/Dockerfile.dev b/apiserver/Dockerfile.dev index 06f15231c6..6a225fec30 100644 --- a/apiserver/Dockerfile.dev +++ b/apiserver/Dockerfile.dev @@ -30,17 +30,13 @@ ADD requirements ./requirements # Install the local development settings RUN pip install -r requirements/local.txt --compile --no-cache-dir -RUN addgroup -S plane && \ - adduser -S captain -G plane COPY . . RUN mkdir -p /code/plane/logs -RUN chown -R captain.plane /code RUN chmod -R +x /code/bin RUN chmod -R 777 /code -USER captain # Expose container port and run entry point script EXPOSE 8000 diff --git a/apiserver/plane/settings/production.py b/apiserver/plane/settings/production.py index caf6804a30..c56222c67e 100644 --- a/apiserver/plane/settings/production.py +++ b/apiserver/plane/settings/production.py @@ -6,7 +6,7 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = int(os.environ.get("DEBUG", 0)) == 1 -DEBUG = True + # Honor the 'X-Forwarded-Proto' header for request.is_secure() SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") @@ -25,7 +25,7 @@ if not os.path.exists(LOG_DIR): os.makedirs(LOG_DIR) - +# Logging configuration LOGGING = { "version": 1, "disable_existing_loggers": False, diff --git a/space/Dockerfile.space b/space/Dockerfile.space index 12c3091349..6e2bfd0650 100644 --- a/space/Dockerfile.space +++ b/space/Dockerfile.space @@ -19,7 +19,6 @@ RUN yarn install --network-timeout 500000 COPY --from=builder /app/out/full/ . COPY turbo.json turbo.json -USER root ARG NEXT_PUBLIC_API_BASE_URL="" ARG NEXT_PUBLIC_DEPLOY_WITH_NGINX=1 @@ -32,17 +31,13 @@ RUN yarn turbo run build --filter=space FROM node:18-alpine AS runner WORKDIR /app -RUN addgroup --system --gid 1001 plane -RUN adduser --system --uid 1001 captain -USER captain - COPY --from=installer /app/space/next.config.js . COPY --from=installer /app/space/package.json . -COPY --from=installer --chown=captain:plane /app/space/.next/standalone ./ +COPY --from=installer /app/space/.next/standalone ./ -COPY --from=installer --chown=captain:plane /app/space/.next ./space/.next -COPY --from=installer --chown=captain:plane /app/space/public ./space/public +COPY --from=installer /app/space/.next ./space/.next +COPY --from=installer /app/space/public ./space/public ARG NEXT_PUBLIC_API_BASE_URL="" ARG NEXT_PUBLIC_DEPLOY_WITH_NGINX=1 @@ -50,11 +45,9 @@ ARG NEXT_PUBLIC_DEPLOY_WITH_NGINX=1 ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL ENV NEXT_PUBLIC_DEPLOY_WITH_NGINX=$NEXT_PUBLIC_DEPLOY_WITH_NGINX -USER root COPY start.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/start.sh -USER captain ENV NEXT_TELEMETRY_DISABLED 1 diff --git a/web/Dockerfile.web b/web/Dockerfile.web index e0d525c2c2..5490fb0da6 100644 --- a/web/Dockerfile.web +++ b/web/Dockerfile.web @@ -32,7 +32,7 @@ RUN yarn install --network-timeout 500000 # Build the project COPY --from=builder /app/out/full/ . COPY turbo.json turbo.json -USER root + ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL ENV NEXT_PUBLIC_DEPLOY_URL=$NEXT_PUBLIC_DEPLOY_URL @@ -46,31 +46,23 @@ RUN yarn turbo run build --filter=web FROM node:18-alpine AS runner WORKDIR /app -# Don't run production as root -RUN addgroup --system --gid 1001 plane -RUN adduser --system --uid 1001 captain -USER captain - COPY --from=installer /app/web/next.config.js . COPY --from=installer /app/web/package.json . # Automatically leverage output traces to reduce image size # https://nextjs.org/docs/advanced-features/output-file-tracing -COPY --from=installer --chown=captain:plane /app/web/.next/standalone ./ -COPY --from=installer --chown=captain:plane /app/web/.next ./web/.next -COPY --from=installer --chown=captain:plane /app/web/public ./web/public +COPY --from=installer /app/web/.next/standalone ./ +COPY --from=installer /app/web/.next ./web/.next +COPY --from=installer /app/web/public ./web/public ARG NEXT_PUBLIC_API_BASE_URL="" ARG NEXT_PUBLIC_DEPLOY_URL="" ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL ENV NEXT_PUBLIC_DEPLOY_URL=$NEXT_PUBLIC_DEPLOY_URL -USER root COPY start.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/start.sh -USER captain - ENV NEXT_TELEMETRY_DISABLED 1 EXPOSE 3000 From fd2cacb0cdfd3dc64ca945d741b210349b52390d Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Mon, 8 Apr 2024 18:35:35 +0530 Subject: [PATCH 022/105] [WEB-854] style: update height of sidebar help section and quick add across all layout for consitency. (#4138) --- .../issues/issue-layouts/gantt/quick-add-issue-form.tsx | 2 +- .../issues/issue-layouts/kanban/quick-add-issue-form.tsx | 2 +- web/components/workspace/help-section.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web/components/issues/issue-layouts/gantt/quick-add-issue-form.tsx b/web/components/issues/issue-layouts/gantt/quick-add-issue-form.tsx index d0fb69ab3e..ae4d077e1f 100644 --- a/web/components/issues/issue-layouts/gantt/quick-add-issue-form.tsx +++ b/web/components/issues/issue-layouts/gantt/quick-add-issue-form.tsx @@ -163,7 +163,7 @@ export const GanttQuickAddIssueForm: React.FC = observe ) : (
) : (
setIsOpen(true)} > diff --git a/web/components/workspace/help-section.tsx b/web/components/workspace/help-section.tsx index 03e295cbc7..65500469ea 100644 --- a/web/components/workspace/help-section.tsx +++ b/web/components/workspace/help-section.tsx @@ -61,7 +61,7 @@ export const WorkspaceHelpSection: React.FC = observe return ( <>
From 986f81e3ae1dbec2a855830088bcecf2558aa266 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Mon, 8 Apr 2024 18:38:05 +0530 Subject: [PATCH 023/105] [WEB-905] chore: issue peek overview and kanban layout improvement (#4135) * chore: peek overview and kanban card improvement * chore: peek overview improvement --- .../issue-layouts/calendar/issue-block.tsx | 2 ++ .../issues/issue-layouts/gantt/blocks.tsx | 3 ++ .../issues/issue-layouts/kanban/block.tsx | 10 ++++--- .../issues/issue-layouts/list/block.tsx | 2 ++ .../issue-layouts/spreadsheet/issue-row.tsx | 12 +++++--- web/components/issues/peek-overview/view.tsx | 16 ++++++---- .../issues/sub-issues/issue-list-item.tsx | 3 ++ web/hooks/use-peek-overview-outside-click.tsx | 29 +++++++++++++++++++ 8 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 web/hooks/use-peek-overview-outside-click.tsx diff --git a/web/components/issues/issue-layouts/calendar/issue-block.tsx b/web/components/issues/issue-layouts/calendar/issue-block.tsx index 713049ac39..44ca0c9dfb 100644 --- a/web/components/issues/issue-layouts/calendar/issue-block.tsx +++ b/web/components/issues/issue-layouts/calendar/issue-block.tsx @@ -41,6 +41,7 @@ export const CalendarIssueBlock: React.FC = observer((props) => { issue && issue.project_id && issue.id && + peekIssue?.issueId !== issue.id && setPeekIssue({ workspaceSlug, projectId: issue.project_id, issueId: issue.id }); useOutsideClickDetector(menuActionRef, () => setIsMenuActive(false)); @@ -64,6 +65,7 @@ export const CalendarIssueBlock: React.FC = observer((props) => { return ( handleIssuePeekOverview(issue)} diff --git a/web/components/issues/issue-layouts/gantt/blocks.tsx b/web/components/issues/issue-layouts/gantt/blocks.tsx index aff992b66e..02ed66e5af 100644 --- a/web/components/issues/issue-layouts/gantt/blocks.tsx +++ b/web/components/issues/issue-layouts/gantt/blocks.tsx @@ -20,6 +20,7 @@ export const IssueGanttBlock: React.FC = observer((props) => { const { getProjectStates } = useProjectState(); const { issue: { getIssueById }, + peekIssue, setPeekIssue, } = useIssueDetail(); // derived values @@ -31,11 +32,13 @@ export const IssueGanttBlock: React.FC = observer((props) => { workspaceSlug && issueDetails && !issueDetails.tempId && + peekIssue?.issueId !== issueDetails.id && setPeekIssue({ workspaceSlug, projectId: issueDetails.project_id, issueId: issueDetails.id }); const { isMobile } = usePlatformOS(); return (
= observer((prop const { router: { workspaceSlug }, } = useApplication(); - const { setPeekIssue } = useIssueDetail(); + const { peekIssue, setPeekIssue } = useIssueDetail(); const handleIssuePeekOverview = (issue: TIssue) => workspaceSlug && issue && issue.project_id && issue.id && + peekIssue?.issueId !== issue.id && setPeekIssue({ workspaceSlug, projectId: issue.project_id, issueId: issue.id }); return ( @@ -69,16 +70,17 @@ const KanbanIssueDetailsBlock: React.FC = observer((prop {issue?.is_draft ? ( - {issue.name} + {issue.name} ) : ( handleIssuePeekOverview(issue)} - className="w-full line-clamp-1 cursor-pointer text-sm text-custom-text-100" + className="w-full line-clamp-1 cursor-pointer text-sm text-custom-text-100 pb-1.5" disabled={!!issue?.tempId} > @@ -138,7 +140,7 @@ export const KanbanIssueBlock: React.FC = memo((props) => { >
= observer((props: IssueBlock issue && issue.project_id && issue.id && + peekIssue?.issueId !== issue.id && setPeekIssue({ workspaceSlug, projectId: issue.project_id, issueId: issue.id }); const issue = issuesMap[issueId]; @@ -71,6 +72,7 @@ export const IssueBlock: React.FC = observer((props: IssueBlock ) : ( { const [isMenuActive, setIsMenuActive] = useState(false); const menuActionRef = useRef(null); - const handleIssuePeekOverview = (issue: TIssue) => { - if (workspaceSlug && issue && issue.project_id && issue.id) - setPeekIssue({ workspaceSlug: workspaceSlug.toString(), projectId: issue.project_id, issueId: issue.id }); - }; + const handleIssuePeekOverview = (issue: TIssue) => + workspaceSlug && + issue && + issue.project_id && + issue.id && + peekIssue?.issueId !== issue.id && + setPeekIssue({ workspaceSlug: workspaceSlug.toString(), projectId: issue.project_id, issueId: issue.id }); const { subIssues: subIssuesStore, issue } = useIssueDetail(); @@ -240,6 +243,7 @@ const IssueRowDetails = observer((props: IssueRowDetailsProps) => {
handleIssuePeekOverview(issueDetail)} diff --git a/web/components/issues/peek-overview/view.tsx b/web/components/issues/peek-overview/view.tsx index 0366fbb61d..d5b723f662 100644 --- a/web/components/issues/peek-overview/view.tsx +++ b/web/components/issues/peek-overview/view.tsx @@ -16,7 +16,7 @@ import { // hooks import { useIssueDetail, useUser } from "@/hooks/store"; import useKeypress from "@/hooks/use-keypress"; -import useOutsideClickDetector from "@/hooks/use-outside-click-detector"; +import usePeekOverviewOutsideClickDetector from "@/hooks/use-peek-overview-outside-click"; // store hooks import { IssueActivity } from "../issue-detail/issue-activity"; import { SubIssuesRoot } from "../sub-issues"; @@ -55,11 +55,15 @@ export const IssueView: FC = observer((props) => { setPeekIssue(undefined); }; - useOutsideClickDetector(issuePeekOverviewRef, () => { - if (!isAnyModalOpen) { - removeRoutePeekId(); - } - }); + usePeekOverviewOutsideClickDetector( + issuePeekOverviewRef, + () => { + if (!isAnyModalOpen) { + removeRoutePeekId(); + } + }, + issueId + ); const handleKeyDown = () => { const slashCommandDropdownElement = document.querySelector("#slash-command"); const dropdownElement = document.activeElement?.tagName === "INPUT"; diff --git a/web/components/issues/sub-issues/issue-list-item.tsx b/web/components/issues/sub-issues/issue-list-item.tsx index 27d6ca209c..a2eaad398f 100644 --- a/web/components/issues/sub-issues/issue-list-item.tsx +++ b/web/components/issues/sub-issues/issue-list-item.tsx @@ -42,6 +42,7 @@ export const IssueListItem: React.FC = observer((props) => { } = props; const { + peekIssue, setPeekIssue, issue: { getIssueById }, subIssues: { subIssueHelpersByIssueId, setSubIssueHelpers }, @@ -64,6 +65,7 @@ export const IssueListItem: React.FC = observer((props) => { issue && issue.project_id && issue.id && + peekIssue?.issueId !== issue.id && setPeekIssue({ workspaceSlug, projectId: issue.project_id, issueId: issue.id }); if (!issue) return <>; @@ -117,6 +119,7 @@ export const IssueListItem: React.FC = observer((props) => {
handleIssuePeekOverview(issue)} diff --git a/web/hooks/use-peek-overview-outside-click.tsx b/web/hooks/use-peek-overview-outside-click.tsx new file mode 100644 index 0000000000..22b9badff4 --- /dev/null +++ b/web/hooks/use-peek-overview-outside-click.tsx @@ -0,0 +1,29 @@ +import React, { useEffect } from "react"; + +const usePeekOverviewOutsideClickDetector = ( + ref: React.RefObject, + callback: () => void, + issueId: string +) => { + const handleClick = (event: MouseEvent) => { + if (ref.current && !ref.current.contains(event.target as Node)) { + let targetElement = event.target as HTMLElement | null; + while (targetElement) { + if (targetElement.id === `issue-${issueId}`) { + return; + } + targetElement = targetElement.parentElement; + } + callback(); + } + }; + + useEffect(() => { + document.addEventListener("mousedown", handleClick); + + return () => { + document.removeEventListener("mousedown", handleClick); + }; + }); +}; +export default usePeekOverviewOutsideClickDetector; From 39b5a58ce8541501129d0e68aae255093be0f3d8 Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Mon, 8 Apr 2024 18:38:39 +0530 Subject: [PATCH 024/105] chore: remove placeholder from estimate property if no estimates are selected. (#4125) --- web/components/dropdowns/estimate.tsx | 4 ++-- .../issue-layouts/spreadsheet/columns/estimate-column.tsx | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/web/components/dropdowns/estimate.tsx b/web/components/dropdowns/estimate.tsx index 1219a70110..45f7a9709f 100644 --- a/web/components/dropdowns/estimate.tsx +++ b/web/components/dropdowns/estimate.tsx @@ -48,7 +48,7 @@ export const EstimateDropdown: React.FC = observer((props) => { hideIcon = false, onChange, onClose, - placeholder = "Estimate", + placeholder = "", placement, projectId, showTooltip = false, @@ -197,7 +197,7 @@ export const EstimateDropdown: React.FC = observer((props) => { variant={buttonVariant} > {!hideIcon && } - {BUTTON_VARIANTS_WITH_TEXT.includes(buttonVariant) && ( + {(selectedEstimate || placeholder) && BUTTON_VARIANTS_WITH_TEXT.includes(buttonVariant) && ( {selectedEstimate !== null ? selectedEstimate : placeholder} )} {dropdownArrow && ( diff --git a/web/components/issues/issue-layouts/spreadsheet/columns/estimate-column.tsx b/web/components/issues/issue-layouts/spreadsheet/columns/estimate-column.tsx index 298da4ff93..6acc0f6a5e 100644 --- a/web/components/issues/issue-layouts/spreadsheet/columns/estimate-column.tsx +++ b/web/components/issues/issue-layouts/spreadsheet/columns/estimate-column.tsx @@ -21,6 +21,7 @@ export const SpreadsheetEstimateColumn: React.FC = observer((props: Props onChange={(data) => onChange(issue, { estimate_point: data }, { changed_property: "estimate_point", change_details: data }) } + placeholder="Estimate" projectId={issue.project_id} disabled={disabled} buttonVariant="transparent-with-text" From 8d009187abf6ac2be8c6b00b99e2682f241f1c0f Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Mon, 8 Apr 2024 18:44:04 +0530 Subject: [PATCH 025/105] [WEB-916] fix: description editor missing when using create more button in create issue modal. (#4137) * [WEB-916] fix: description editor missing when using create more button in create issue modal. * chore: handle edge cases. * chore: handle edge cases. --- web/components/issues/issue-modal/form.tsx | 3 ++- web/components/issues/issue-modal/modal.tsx | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/web/components/issues/issue-modal/form.tsx b/web/components/issues/issue-modal/form.tsx index ed8a562c31..a713327f6b 100644 --- a/web/components/issues/issue-modal/form.tsx +++ b/web/components/issues/issue-modal/form.tsx @@ -193,6 +193,7 @@ export const IssueFormRoot: FC = observer((props) => { reset({ ...defaultValues, project_id: getValues("project_id"), + description_html: data?.description_html ?? "

", }); editorRef?.current?.clearEditor(); }; @@ -481,7 +482,7 @@ export const IssueFormRoot: FC = observer((props) => { initialValue={data?.description_html} customClassName="min-h-[7rem] border-custom-border-100" onChange={(description: any, description_html: string) => { - onChange(description_html); + onChange(description_html === "" ? "

" : description_html); handleFormChange(); }} mentionHighlights={mentionHighlights} diff --git a/web/components/issues/issue-modal/modal.tsx b/web/components/issues/issue-modal/modal.tsx index 8bb4e972a3..fc4d7f016a 100644 --- a/web/components/issues/issue-modal/modal.tsx +++ b/web/components/issues/issue-modal/modal.tsx @@ -174,6 +174,7 @@ export const CreateUpdateIssueModal: React.FC = observer((prop !createMore && handleClose(); if (createMore) { issueTitleRef && issueTitleRef?.current?.focus(); + setDescription("

"); setChangesMade(null); } return response; From 9b0949148f47b5fbfdb40ef0b0ba145eea98c395 Mon Sep 17 00:00:00 2001 From: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Date: Mon, 8 Apr 2024 18:46:05 +0530 Subject: [PATCH 026/105] [WEB - 883] fix: external apis (#3975) * fix: external apis * dev: remove descrypt in email password * dev: add email as field in user serializer * dev: fix linting errors * dev: push commit to enable build triggers * fix: formatting errors * dev: remove instance value extraction --- apiserver/plane/api/serializers/base.py | 6 +- apiserver/plane/api/serializers/project.py | 1 + apiserver/plane/api/serializers/user.py | 1 + apiserver/plane/api/views/cycle.py | 245 +++++++++++++++++++-- apiserver/plane/api/views/inbox.py | 17 +- apiserver/plane/api/views/module.py | 27 +-- apiserver/plane/api/views/state.py | 15 +- apiserver/plane/app/views/cycle/base.py | 2 +- apiserver/plane/app/views/issue/base.py | 58 ++--- apiserver/plane/app/views/issue/draft.py | 1 - apiserver/plane/utils/analytics_plot.py | 25 ++- 11 files changed, 316 insertions(+), 82 deletions(-) diff --git a/apiserver/plane/api/serializers/base.py b/apiserver/plane/api/serializers/base.py index da8b969646..5b68a71138 100644 --- a/apiserver/plane/api/serializers/base.py +++ b/apiserver/plane/api/serializers/base.py @@ -66,11 +66,11 @@ def to_representation(self, instance): if expand in self.fields: # Import all the expandable serializers from . import ( - WorkspaceLiteSerializer, + IssueSerializer, ProjectLiteSerializer, - UserLiteSerializer, StateLiteSerializer, - IssueSerializer, + UserLiteSerializer, + WorkspaceLiteSerializer, ) # Expansion mapper diff --git a/apiserver/plane/api/serializers/project.py b/apiserver/plane/api/serializers/project.py index 9dd4c9b85f..ce354ba5f3 100644 --- a/apiserver/plane/api/serializers/project.py +++ b/apiserver/plane/api/serializers/project.py @@ -7,6 +7,7 @@ ProjectIdentifier, WorkspaceMember, ) + from .base import BaseSerializer diff --git a/apiserver/plane/api/serializers/user.py b/apiserver/plane/api/serializers/user.py index ea50440e02..e853b90c29 100644 --- a/apiserver/plane/api/serializers/user.py +++ b/apiserver/plane/api/serializers/user.py @@ -11,6 +11,7 @@ class Meta: "id", "first_name", "last_name", + "email", "avatar", "display_name", "email", diff --git a/apiserver/plane/api/views/cycle.py b/apiserver/plane/api/views/cycle.py index 637d713c31..c2155c15ee 100644 --- a/apiserver/plane/api/views/cycle.py +++ b/apiserver/plane/api/views/cycle.py @@ -2,29 +2,31 @@ import json # Django imports -from django.db.models import Q, Count, Sum, F, OuterRef, Func -from django.utils import timezone from django.core import serializers +from django.db.models import Count, F, Func, OuterRef, Q, Sum +from django.utils import timezone # Third party imports -from rest_framework.response import Response from rest_framework import status +from rest_framework.response import Response # Module imports -from .base import BaseAPIView, WebhookMixin +from plane.api.serializers import ( + CycleIssueSerializer, + CycleSerializer, +) +from plane.app.permissions import ProjectEntityPermission +from plane.bgtasks.issue_activites_task import issue_activity from plane.db.models import ( Cycle, - Issue, CycleIssue, - IssueLink, + Issue, IssueAttachment, + IssueLink, ) -from plane.app.permissions import ProjectEntityPermission -from plane.api.serializers import ( - CycleSerializer, - CycleIssueSerializer, -) -from plane.bgtasks.issue_activites_task import issue_activity +from plane.utils.analytics_plot import burndown_plot + +from .base import BaseAPIView, WebhookMixin class CycleAPIEndpoint(WebhookMixin, BaseAPIView): @@ -551,7 +553,21 @@ def get_queryset(self): .distinct() ) - def get(self, request, slug, project_id, cycle_id): + def get(self, request, slug, project_id, cycle_id, issue_id=None): + # Get + if issue_id: + cycle_issue = CycleIssue.objects.get( + workspace__slug=slug, + project_id=project_id, + cycle_id=cycle_id, + issue_id=issue_id, + ) + serializer = CycleIssueSerializer( + cycle_issue, fields=self.fields, expand=self.expand + ) + return Response(serializer.data, status=status.HTTP_200_OK) + + # List order_by = request.GET.get("order_by", "created_at") issues = ( Issue.issue_objects.filter(issue_cycle__cycle_id=cycle_id) @@ -748,6 +764,209 @@ def post(self, request, slug, project_id, cycle_id): workspace__slug=slug, project_id=project_id, pk=new_cycle_id ) + old_cycle = ( + Cycle.objects.filter( + workspace__slug=slug, project_id=project_id, pk=cycle_id + ) + .annotate( + total_issues=Count( + "issue_cycle", + filter=Q( + issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, + ), + ) + ) + .annotate( + completed_issues=Count( + "issue_cycle__issue__state__group", + filter=Q( + issue_cycle__issue__state__group="completed", + issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, + ), + ) + ) + .annotate( + cancelled_issues=Count( + "issue_cycle__issue__state__group", + filter=Q( + issue_cycle__issue__state__group="cancelled", + issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, + ), + ) + ) + .annotate( + started_issues=Count( + "issue_cycle__issue__state__group", + filter=Q( + issue_cycle__issue__state__group="started", + issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, + ), + ) + ) + .annotate( + unstarted_issues=Count( + "issue_cycle__issue__state__group", + filter=Q( + issue_cycle__issue__state__group="unstarted", + issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, + ), + ) + ) + .annotate( + backlog_issues=Count( + "issue_cycle__issue__state__group", + filter=Q( + issue_cycle__issue__state__group="backlog", + issue_cycle__issue__archived_at__isnull=True, + issue_cycle__issue__is_draft=False, + ), + ) + ) + ) + + # Pass the new_cycle queryset to burndown_plot + completion_chart = burndown_plot( + queryset=old_cycle.first(), + slug=slug, + project_id=project_id, + cycle_id=cycle_id, + ) + + # Get the assignee distribution + assignee_distribution = ( + Issue.objects.filter( + issue_cycle__cycle_id=cycle_id, + workspace__slug=slug, + project_id=project_id, + ) + .annotate(display_name=F("assignees__display_name")) + .annotate(assignee_id=F("assignees__id")) + .annotate(avatar=F("assignees__avatar")) + .values("display_name", "assignee_id", "avatar") + .annotate( + total_issues=Count( + "id", + filter=Q(archived_at__isnull=True, is_draft=False), + ), + ) + .annotate( + completed_issues=Count( + "id", + filter=Q( + completed_at__isnull=False, + archived_at__isnull=True, + is_draft=False, + ), + ) + ) + .annotate( + pending_issues=Count( + "id", + filter=Q( + completed_at__isnull=True, + archived_at__isnull=True, + is_draft=False, + ), + ) + ) + .order_by("display_name") + ) + # assignee distribution serialized + assignee_distribution_data = [ + { + "display_name": item["display_name"], + "assignee_id": ( + str(item["assignee_id"]) if item["assignee_id"] else None + ), + "avatar": item["avatar"], + "total_issues": item["total_issues"], + "completed_issues": item["completed_issues"], + "pending_issues": item["pending_issues"], + } + for item in assignee_distribution + ] + + # Get the label distribution + label_distribution = ( + Issue.objects.filter( + issue_cycle__cycle_id=cycle_id, + workspace__slug=slug, + project_id=project_id, + ) + .annotate(label_name=F("labels__name")) + .annotate(color=F("labels__color")) + .annotate(label_id=F("labels__id")) + .values("label_name", "color", "label_id") + .annotate( + total_issues=Count( + "id", + filter=Q(archived_at__isnull=True, is_draft=False), + ) + ) + .annotate( + completed_issues=Count( + "id", + filter=Q( + completed_at__isnull=False, + archived_at__isnull=True, + is_draft=False, + ), + ) + ) + .annotate( + pending_issues=Count( + "id", + filter=Q( + completed_at__isnull=True, + archived_at__isnull=True, + is_draft=False, + ), + ) + ) + .order_by("label_name") + ) + + # Label distribution serilization + label_distribution_data = [ + { + "label_name": item["label_name"], + "color": item["color"], + "label_id": ( + str(item["label_id"]) if item["label_id"] else None + ), + "total_issues": item["total_issues"], + "completed_issues": item["completed_issues"], + "pending_issues": item["pending_issues"], + } + for item in label_distribution + ] + + current_cycle = Cycle.objects.filter( + workspace__slug=slug, project_id=project_id, pk=cycle_id + ).first() + + if current_cycle: + current_cycle.progress_snapshot = { + "total_issues": old_cycle.first().total_issues, + "completed_issues": old_cycle.first().completed_issues, + "cancelled_issues": old_cycle.first().cancelled_issues, + "started_issues": old_cycle.first().started_issues, + "unstarted_issues": old_cycle.first().unstarted_issues, + "backlog_issues": old_cycle.first().backlog_issues, + "distribution": { + "labels": label_distribution_data, + "assignees": assignee_distribution_data, + "completion_chart": completion_chart, + }, + } + # Save the snapshot of the current cycle + current_cycle.save(update_fields=["progress_snapshot"]) + if ( new_cycle.end_date is not None and new_cycle.end_date < timezone.now().date() diff --git a/apiserver/plane/api/views/inbox.py b/apiserver/plane/api/views/inbox.py index fb36ea2a94..53248a21a1 100644 --- a/apiserver/plane/api/views/inbox.py +++ b/apiserver/plane/api/views/inbox.py @@ -2,27 +2,28 @@ import json # Django improts -from django.utils import timezone -from django.db.models import Q from django.core.serializers.json import DjangoJSONEncoder +from django.db.models import Q +from django.utils import timezone # Third party imports from rest_framework import status from rest_framework.response import Response # Module imports -from .base import BaseAPIView -from plane.app.permissions import ProjectLitePermission from plane.api.serializers import InboxIssueSerializer, IssueSerializer +from plane.app.permissions import ProjectLitePermission +from plane.bgtasks.issue_activites_task import issue_activity from plane.db.models import ( + Inbox, InboxIssue, Issue, - State, - ProjectMember, Project, - Inbox, + ProjectMember, + State, ) -from plane.bgtasks.issue_activites_task import issue_activity + +from .base import BaseAPIView class InboxIssueAPIEndpoint(BaseAPIView): diff --git a/apiserver/plane/api/views/module.py b/apiserver/plane/api/views/module.py index 643221dcab..00bc3f1fef 100644 --- a/apiserver/plane/api/views/module.py +++ b/apiserver/plane/api/views/module.py @@ -2,32 +2,33 @@ import json # Django imports -from django.db.models import Count, Prefetch, Q, F, Func, OuterRef -from django.utils import timezone from django.core import serializers +from django.db.models import Count, F, Func, OuterRef, Prefetch, Q +from django.utils import timezone # Third party imports from rest_framework import status from rest_framework.response import Response # Module imports -from .base import BaseAPIView, WebhookMixin +from plane.api.serializers import ( + IssueSerializer, + ModuleIssueSerializer, + ModuleSerializer, +) from plane.app.permissions import ProjectEntityPermission +from plane.bgtasks.issue_activites_task import issue_activity from plane.db.models import ( - Project, - Module, - ModuleLink, Issue, - ModuleIssue, IssueAttachment, IssueLink, + Module, + ModuleIssue, + ModuleLink, + Project, ) -from plane.api.serializers import ( - ModuleSerializer, - ModuleIssueSerializer, - IssueSerializer, -) -from plane.bgtasks.issue_activites_task import issue_activity + +from .base import BaseAPIView, WebhookMixin class ModuleAPIEndpoint(WebhookMixin, BaseAPIView): diff --git a/apiserver/plane/api/views/state.py b/apiserver/plane/api/views/state.py index 4ee899831f..28181fffb5 100644 --- a/apiserver/plane/api/views/state.py +++ b/apiserver/plane/api/views/state.py @@ -1,16 +1,17 @@ # Django imports from django.db import IntegrityError from django.db.models import Q +from rest_framework import status # Third party imports from rest_framework.response import Response -from rest_framework import status -# Module imports -from .base import BaseAPIView from plane.api.serializers import StateSerializer from plane.app.permissions import ProjectEntityPermission -from plane.db.models import State, Issue +from plane.db.models import Issue, State + +# Module imports +from .base import BaseAPIView class StateAPIEndpoint(BaseAPIView): @@ -86,7 +87,11 @@ def post(self, request, slug, project_id): def get(self, request, slug, project_id, state_id=None): if state_id: - serializer = StateSerializer(self.get_queryset().get(pk=state_id)) + serializer = StateSerializer( + self.get_queryset().get(pk=state_id), + fields=self.fields, + expand=self.expand, + ) return Response(serializer.data, status=status.HTTP_200_OK) return self.paginate( request=request, diff --git a/apiserver/plane/app/views/cycle/base.py b/apiserver/plane/app/views/cycle/base.py index 0b1cc94f3d..b4a6250a00 100644 --- a/apiserver/plane/app/views/cycle/base.py +++ b/apiserver/plane/app/views/cycle/base.py @@ -21,9 +21,9 @@ ) from django.db.models.functions import Coalesce from django.utils import timezone -from rest_framework import status # Third party imports +from rest_framework import status from rest_framework.response import Response from plane.app.permissions import ( diff --git a/apiserver/plane/app/views/issue/base.py b/apiserver/plane/app/views/issue/base.py index a27f52c748..23df585402 100644 --- a/apiserver/plane/app/views/issue/base.py +++ b/apiserver/plane/app/views/issue/base.py @@ -1,57 +1,59 @@ # Python imports import json -# Django imports -from django.utils import timezone +from django.contrib.postgres.aggregates import ArrayAgg +from django.contrib.postgres.fields import ArrayField +from django.core.serializers.json import DjangoJSONEncoder from django.db.models import ( - Prefetch, - OuterRef, - Func, - F, - Q, Case, - Value, CharField, - When, Exists, + F, + Func, Max, + OuterRef, + Prefetch, + Q, + UUIDField, + Value, + When, ) -from django.core.serializers.json import DjangoJSONEncoder +from django.db.models.functions import Coalesce + +# Django imports +from django.utils import timezone from django.utils.decorators import method_decorator from django.views.decorators.gzip import gzip_page -from django.contrib.postgres.aggregates import ArrayAgg -from django.contrib.postgres.fields import ArrayField -from django.db.models import UUIDField -from django.db.models.functions import Coalesce +from rest_framework import status # Third Party imports from rest_framework.response import Response -from rest_framework import status -# Module imports -from .. import BaseViewSet, BaseAPIView, WebhookMixin -from plane.app.serializers import ( - IssuePropertySerializer, - IssueSerializer, - IssueCreateSerializer, - IssueDetailSerializer, -) from plane.app.permissions import ( ProjectEntityPermission, ProjectLitePermission, ) +from plane.app.serializers import ( + IssueCreateSerializer, + IssueDetailSerializer, + IssuePropertySerializer, + IssueSerializer, +) +from plane.bgtasks.issue_activites_task import issue_activity from plane.db.models import ( - Project, Issue, - IssueProperty, - IssueLink, IssueAttachment, - IssueSubscriber, + IssueLink, + IssueProperty, IssueReaction, + IssueSubscriber, + Project, ) -from plane.bgtasks.issue_activites_task import issue_activity from plane.utils.issue_filters import issue_filters +# Module imports +from .. import BaseAPIView, BaseViewSet, WebhookMixin + class IssueListEndpoint(BaseAPIView): diff --git a/apiserver/plane/app/views/issue/draft.py b/apiserver/plane/app/views/issue/draft.py index e1c6962d89..62a0aa25cc 100644 --- a/apiserver/plane/app/views/issue/draft.py +++ b/apiserver/plane/app/views/issue/draft.py @@ -120,7 +120,6 @@ def get_queryset(self): @method_decorator(gzip_page) def list(self, request, slug, project_id): filters = issue_filters(request.query_params, "GET") - # Custom ordering for priority and state priority_order = ["urgent", "high", "medium", "low", "none"] state_order = [ diff --git a/apiserver/plane/utils/analytics_plot.py b/apiserver/plane/utils/analytics_plot.py index 948eb1b916..cd57690c60 100644 --- a/apiserver/plane/utils/analytics_plot.py +++ b/apiserver/plane/utils/analytics_plot.py @@ -1,18 +1,18 @@ # Python imports -from itertools import groupby from datetime import timedelta +from itertools import groupby # Django import from django.db import models -from django.utils import timezone -from django.db.models.functions import TruncDate -from django.db.models import Count, F, Sum, Value, Case, When, CharField +from django.db.models import Case, CharField, Count, F, Sum, Value, When from django.db.models.functions import ( Coalesce, + Concat, ExtractMonth, ExtractYear, - Concat, + TruncDate, ) +from django.utils import timezone # Module imports from plane.db.models import Issue @@ -115,11 +115,16 @@ def burndown_plot(queryset, slug, project_id, cycle_id=None, module_id=None): total_issues = queryset.total_issues if cycle_id: - # Get all dates between the two dates - date_range = [ - queryset.start_date + timedelta(days=x) - for x in range((queryset.end_date - queryset.start_date).days + 1) - ] + if queryset.end_date and queryset.start_date: + # Get all dates between the two dates + date_range = [ + queryset.start_date + timedelta(days=x) + for x in range( + (queryset.end_date - queryset.start_date).days + 1 + ) + ] + else: + date_range = [] chart_data = {str(date): 0 for date in date_range} From ddb07dbe5f38f6b9f2271e05e63f1728fecc5bc6 Mon Sep 17 00:00:00 2001 From: guru_sainath Date: Mon, 8 Apr 2024 19:11:47 +0530 Subject: [PATCH 027/105] [WEB-406] chore: project inbox revamp (#4141) * chore: removed inbox id * fix: inbox changes * chore: resolved merge conflicts * chore: inbox issue response changes * chore: inbox issue filters * fix: inbox implementation revamp * fix: type fixes * fix: pagination implementation * fix: inbox fixes * fix: pagination fixes * fix: inbox Issues pagination fixes * chore: triage state change * fix: inbox fixes * chore: filtering using boolean * chore: total results in the pagination * fix: inbox main content changes * fix: develop pull fixes * chore: resolved build erros in inbox issues * dev: fix migrations * chore: module, labels and assignee in inbox * chore: inbox issue order by * chore: inbox filters * chore: inbox ui revamp * chore: inbox type updated * chore: updated filters * chore: updated filter menmbers and date types in inbox issue filter * chore: inbox issue filter updated * chore: updated date filter in the inbox issue filter * chore: moved the current tab state from local state to store * chore: updated the filter and fetch request in the inbox issues * chore: updated tab change handler * chore: handled isEmpty in the issue filters query params * chore: inbox sidebar updated * chore: enabled create inbox issue in mobx * chore: replaced the key inbox_status to status * chore: inbox sidebar pagination * chore: updated inbox issue services * chore: inbox sidebar total count indicator * chore: create inbox issue updated * chore: updated inbox issue sidebar layout * chore: rendering issue detail in inbox issue * chore: inbox issue content updated * chore: create inbox issue modal description improvement * fix: updated delete functionality in inbox store * chore: updated multiple inbox issue creation * chore: handled loading, empty states and inbox user access permissions * chore: updated rendering issues in the sidebar * chore: inbox sidebar label improvement * chore: handled empty states * chore: disabled inbox empty state added * chore: module, labels and assignee in list endpoint * chore: labels in list endpoint * chore: inboc issue serializer * chore: representation in serializer * chore: super function * chore: inbox empty state updated * chore: implemented applied filters * chore: inbox empty state updated * chore: update date formats in applied filters * chore: inbox skeleton updated * chore: ui changes in the siebar list item * chore: removed the module and cycle ids * chore: inbox sidebar tab * chore: inbox actions * chore: updated inbox issue header actions * chore: updated inbox issue code cleanup * chore: loader improvement * chore: inbox sidebar improvement * chore: inbox sidebar empty state flicker * fix: inbox issue delete operation * chore: inbox issue title and description update indicator added * fix: resolved issue property rendering in initial load * chore: inbox sidebar and detail header improvement * fix: handling selected filter in the issue filters and applied filters * chore: inbox issue detail improvement * chore: inbox issue label updated * chore: inbox issue sidebar improvement * fix: handling issue description update when we move between the issues in inbox * chore: removed inbox issue helpers file * chore: boolean checked * chore: resolved file change requests --------- Co-authored-by: NarayanBavisetti Co-authored-by: sriram veeraghanta Co-authored-by: pablohashescobar Co-authored-by: Anmol Singh Bhatia --- apiserver/plane/api/views/inbox.py | 5 +- apiserver/plane/api/views/project.py | 3 +- apiserver/plane/api/views/state.py | 4 +- apiserver/plane/app/serializers/__init__.py | 2 + apiserver/plane/app/serializers/inbox.py | 53 ++- apiserver/plane/app/serializers/issue.py | 22 +- apiserver/plane/app/urls/inbox.py | 4 +- apiserver/plane/app/views/inbox/base.py | 211 +++++----- apiserver/plane/app/views/project/base.py | 3 +- apiserver/plane/app/views/state/base.py | 4 +- .../0063_state_is_triage_alter_state_group.py | 44 +++ apiserver/plane/db/models/issue.py | 4 +- apiserver/plane/db/models/state.py | 2 + apiserver/plane/utils/issue_filters.py | 153 ++++---- apiserver/plane/utils/paginator.py | 3 +- packages/types/src/common.d.ts | 11 + packages/types/src/inbox.d.ts | 76 ++++ packages/types/src/inbox/inbox-issue.d.ts | 65 ---- packages/types/src/inbox/inbox-types.d.ts | 44 --- packages/types/src/inbox/inbox.d.ts | 27 -- packages/types/src/inbox/root.d.ts | 3 - packages/types/src/index.d.ts | 6 +- web/components/headers/project-inbox.tsx | 17 +- .../inbox/content/inbox-issue-header.tsx | 276 +++++++++++++ web/components/inbox/content/index.ts | 4 + .../content/issue-properties.tsx} | 119 +++--- web/components/inbox/content/issue-root.tsx | 174 +++++++++ web/components/inbox/content/root.tsx | 114 +++--- .../inbox-filter/applied-filters/date.tsx | 66 ++++ .../inbox-filter/applied-filters/index.ts | 6 + .../inbox-filter/applied-filters/label.tsx | 55 +++ .../inbox-filter/applied-filters/member.tsx | 59 +++ .../inbox-filter/applied-filters/priority.tsx | 55 +++ .../inbox-filter/applied-filters/root.tsx | 36 ++ .../inbox-filter/applied-filters/status.tsx | 57 +++ .../inbox/inbox-filter/filters/date.tsx | 97 +++++ .../inbox-filter/filters/filter-selection.tsx | 87 +++++ .../inbox/inbox-filter/filters/index.ts | 6 + .../inbox/inbox-filter/filters/labels.tsx | 88 +++++ .../inbox/inbox-filter/filters/members.tsx | 102 +++++ .../inbox/inbox-filter/filters/priority.tsx | 56 +++ .../inbox/inbox-filter/filters/status.tsx | 68 ++++ web/components/inbox/inbox-filter/index.ts | 4 + web/components/inbox/inbox-filter/root.tsx | 18 + .../inbox/inbox-filter/sorting/index.ts | 1 + .../inbox/inbox-filter/sorting/order-by.tsx | 58 +++ web/components/inbox/inbox-issue-actions.tsx | 364 ------------------ web/components/inbox/inbox-issue-status.tsx | 63 ++- web/components/inbox/index.ts | 16 +- .../inbox/modals/accept-issue-modal.tsx | 7 +- .../inbox/modals/create-issue-modal.tsx | 60 ++- .../inbox/modals/decline-issue-modal.tsx | 5 +- .../inbox/modals/delete-issue-modal.tsx | 9 +- web/components/inbox/modals/index.ts | 1 + .../inbox/modals/snooze-issue-modal.tsx | 78 ++++ web/components/inbox/root.tsx | 68 ++++ .../inbox/sidebar/filter/applied-filters.tsx | 171 -------- .../inbox/sidebar/filter/filter-selection.tsx | 117 ------ .../inbox/sidebar/inbox-list-item.tsx | 130 ++++--- web/components/inbox/sidebar/inbox-list.tsx | 48 +-- web/components/inbox/sidebar/index.ts | 3 + web/components/inbox/sidebar/root.tsx | 156 ++++++-- web/components/issues/index.ts | 3 +- .../issues/issue-detail/inbox/index.ts | 3 - .../issue-detail/inbox/main-content.tsx | 119 ------ .../issues/issue-detail/inbox/root.tsx | 152 -------- web/components/issues/issue-detail/index.ts | 14 +- .../issue-detail/label/create-label.tsx | 11 +- .../issue-detail/label/label-list-item.tsx | 13 +- .../issues/issue-detail/label/label-list.tsx | 16 +- .../issues/issue-detail/label/root.tsx | 11 +- .../label/select/label-select.tsx | 13 +- .../issues/issue-detail/label/select/root.tsx | 11 +- web/components/project/sidebar-list-item.tsx | 38 +- .../project-inbox/inbox-layout-loader.tsx | 19 +- .../project-inbox/inbox-sidebar-loader.tsx | 32 +- web/constants/empty-state.ts | 42 ++ web/constants/inbox.tsx | 91 +++-- web/hooks/store/index.ts | 3 +- web/hooks/store/use-inbox-issues.ts | 12 +- web/hooks/store/use-inbox.ts | 11 - web/hooks/store/use-project-inbox.ts | 11 + web/hooks/use-intersection-observer.tsx | 42 ++ web/layouts/auth-layout/project-wrapper.tsx | 20 +- web/next-env.d.ts | 1 - .../projects/[projectId]/inbox/[inboxId].tsx | 80 ---- .../projects/[projectId]/inbox/index.tsx | 57 +-- .../disabled-feature/inbox-dark.webp | Bin 0 -> 60900 bytes .../disabled-feature/inbox-light.webp | Bin 0 -> 63374 bytes .../empty-state/inbox/filter-issue-dark.webp | Bin 0 -> 39760 bytes .../empty-state/inbox/filter-issue-light.webp | Bin 0 -> 40790 bytes .../empty-state/inbox/inbox-issue-dark.webp | Bin 0 -> 40208 bytes .../empty-state/inbox/inbox-issue-light.webp | Bin 0 -> 41402 bytes .../empty-state/inbox/issue-detail-dark.webp | Bin 0 -> 2170 bytes .../empty-state/inbox/issue-detail-light.webp | Bin 0 -> 2264 bytes web/services/inbox.service.ts | 122 ------ web/services/inbox/inbox-issue.service.ts | 86 ++--- web/services/inbox/inbox.service.ts | 35 -- web/services/inbox/index.ts | 1 - web/store/inbox/inbox-issue.store.ts | 139 +++++++ web/store/inbox/inbox.store.ts | 114 ------ web/store/inbox/inbox_filter.store.ts | 129 ------- web/store/inbox/inbox_issue.store.ts | 267 ------------- web/store/inbox/project-inbox.store.ts | 353 +++++++++++++++++ web/store/inbox/root.store.ts | 26 -- web/store/issue/project/filter.store.ts | 4 +- web/store/root.store.ts | 15 +- 107 files changed, 3124 insertions(+), 2660 deletions(-) create mode 100644 apiserver/plane/db/migrations/0063_state_is_triage_alter_state_group.py create mode 100644 packages/types/src/common.d.ts create mode 100644 packages/types/src/inbox.d.ts delete mode 100644 packages/types/src/inbox/inbox-issue.d.ts delete mode 100644 packages/types/src/inbox/inbox-types.d.ts delete mode 100644 packages/types/src/inbox/inbox.d.ts delete mode 100644 packages/types/src/inbox/root.d.ts create mode 100644 web/components/inbox/content/inbox-issue-header.tsx create mode 100644 web/components/inbox/content/index.ts rename web/components/{issues/issue-detail/inbox/sidebar.tsx => inbox/content/issue-properties.tsx} (60%) create mode 100644 web/components/inbox/content/issue-root.tsx create mode 100644 web/components/inbox/inbox-filter/applied-filters/date.tsx create mode 100644 web/components/inbox/inbox-filter/applied-filters/index.ts create mode 100644 web/components/inbox/inbox-filter/applied-filters/label.tsx create mode 100644 web/components/inbox/inbox-filter/applied-filters/member.tsx create mode 100644 web/components/inbox/inbox-filter/applied-filters/priority.tsx create mode 100644 web/components/inbox/inbox-filter/applied-filters/root.tsx create mode 100644 web/components/inbox/inbox-filter/applied-filters/status.tsx create mode 100644 web/components/inbox/inbox-filter/filters/date.tsx create mode 100644 web/components/inbox/inbox-filter/filters/filter-selection.tsx create mode 100644 web/components/inbox/inbox-filter/filters/index.ts create mode 100644 web/components/inbox/inbox-filter/filters/labels.tsx create mode 100644 web/components/inbox/inbox-filter/filters/members.tsx create mode 100644 web/components/inbox/inbox-filter/filters/priority.tsx create mode 100644 web/components/inbox/inbox-filter/filters/status.tsx create mode 100644 web/components/inbox/inbox-filter/index.ts create mode 100644 web/components/inbox/inbox-filter/root.tsx create mode 100644 web/components/inbox/inbox-filter/sorting/index.ts create mode 100644 web/components/inbox/inbox-filter/sorting/order-by.tsx delete mode 100644 web/components/inbox/inbox-issue-actions.tsx create mode 100644 web/components/inbox/modals/snooze-issue-modal.tsx create mode 100644 web/components/inbox/root.tsx delete mode 100644 web/components/inbox/sidebar/filter/applied-filters.tsx delete mode 100644 web/components/inbox/sidebar/filter/filter-selection.tsx create mode 100644 web/components/inbox/sidebar/index.ts delete mode 100644 web/components/issues/issue-detail/inbox/index.ts delete mode 100644 web/components/issues/issue-detail/inbox/main-content.tsx delete mode 100644 web/components/issues/issue-detail/inbox/root.tsx delete mode 100644 web/hooks/store/use-inbox.ts create mode 100644 web/hooks/store/use-project-inbox.ts create mode 100644 web/hooks/use-intersection-observer.tsx delete mode 100644 web/pages/[workspaceSlug]/projects/[projectId]/inbox/[inboxId].tsx create mode 100644 web/public/empty-state/disabled-feature/inbox-dark.webp create mode 100644 web/public/empty-state/disabled-feature/inbox-light.webp create mode 100644 web/public/empty-state/inbox/filter-issue-dark.webp create mode 100644 web/public/empty-state/inbox/filter-issue-light.webp create mode 100644 web/public/empty-state/inbox/inbox-issue-dark.webp create mode 100644 web/public/empty-state/inbox/inbox-issue-light.webp create mode 100644 web/public/empty-state/inbox/issue-detail-dark.webp create mode 100644 web/public/empty-state/inbox/issue-detail-light.webp delete mode 100644 web/services/inbox.service.ts delete mode 100644 web/services/inbox/inbox.service.ts create mode 100644 web/store/inbox/inbox-issue.store.ts delete mode 100644 web/store/inbox/inbox.store.ts delete mode 100644 web/store/inbox/inbox_filter.store.ts delete mode 100644 web/store/inbox/inbox_issue.store.ts create mode 100644 web/store/inbox/project-inbox.store.ts delete mode 100644 web/store/inbox/root.store.ts diff --git a/apiserver/plane/api/views/inbox.py b/apiserver/plane/api/views/inbox.py index 53248a21a1..209b7b6581 100644 --- a/apiserver/plane/api/views/inbox.py +++ b/apiserver/plane/api/views/inbox.py @@ -135,10 +135,11 @@ def post(self, request, slug, project_id): # Create or get state state, _ = State.objects.get_or_create( name="Triage", - group="backlog", + group="triage", description="Default state for managing all Inbox Issues", project_id=project_id, color="#ff7700", + is_triage=True, ) # create an issue @@ -299,7 +300,7 @@ def patch(self, request, slug, project_id, issue_id): ) # Update the issue state only if it is in triage state - if issue.state.name == "Triage": + if issue.state.is_triage: # Move to default state state = State.objects.filter( workspace__slug=slug, diff --git a/apiserver/plane/api/views/project.py b/apiserver/plane/api/views/project.py index 885b7dda59..fcb0cc4fb9 100644 --- a/apiserver/plane/api/views/project.py +++ b/apiserver/plane/api/views/project.py @@ -291,10 +291,11 @@ def patch(self, request, slug, pk): # Create the triage state in Backlog group State.objects.get_or_create( name="Triage", - group="backlog", + group="triage", description="Default state for managing all Inbox Issues", project_id=pk, color="#ff7700", + is_triage=True, ) project = ( diff --git a/apiserver/plane/api/views/state.py b/apiserver/plane/api/views/state.py index 28181fffb5..966c243e3c 100644 --- a/apiserver/plane/api/views/state.py +++ b/apiserver/plane/api/views/state.py @@ -29,8 +29,8 @@ def get_queryset(self): project__project_projectmember__member=self.request.user, project__project_projectmember__is_active=True, ) + .filter(is_triage=False) .filter(project__archived_at__isnull=True) - .filter(~Q(name="Triage")) .select_related("project") .select_related("workspace") .distinct() @@ -106,7 +106,7 @@ def get(self, request, slug, project_id, state_id=None): def delete(self, request, slug, project_id, state_id): state = State.objects.get( - ~Q(name="Triage"), + is_triage=False, pk=state_id, project_id=project_id, workspace__slug=slug, diff --git a/apiserver/plane/app/serializers/__init__.py b/apiserver/plane/app/serializers/__init__.py index 22673dabce..2f3c944509 100644 --- a/apiserver/plane/app/serializers/__init__.py +++ b/apiserver/plane/app/serializers/__init__.py @@ -59,6 +59,7 @@ IssueFlatSerializer, IssueStateSerializer, IssueLinkSerializer, + IssueInboxSerializer, IssueLiteSerializer, IssueAttachmentSerializer, IssueSubscriberSerializer, @@ -107,6 +108,7 @@ InboxIssueSerializer, IssueStateInboxSerializer, InboxIssueLiteSerializer, + InboxIssueDetailSerializer, ) from .analytic import AnalyticViewSerializer diff --git a/apiserver/plane/app/serializers/inbox.py b/apiserver/plane/app/serializers/inbox.py index 1dc6f1f4ac..25b3c8cb38 100644 --- a/apiserver/plane/app/serializers/inbox.py +++ b/apiserver/plane/app/serializers/inbox.py @@ -3,7 +3,11 @@ # Module imports from .base import BaseSerializer -from .issue import IssueFlatSerializer, LabelLiteSerializer +from .issue import ( + IssueInboxSerializer, + LabelLiteSerializer, + IssueDetailSerializer, +) from .project import ProjectLiteSerializer from .state import StateLiteSerializer from .user import UserLiteSerializer @@ -24,17 +28,58 @@ class Meta: class InboxIssueSerializer(BaseSerializer): - issue_detail = IssueFlatSerializer(source="issue", read_only=True) - project_detail = ProjectLiteSerializer(source="project", read_only=True) + issue = IssueInboxSerializer(read_only=True) class Meta: model = InboxIssue - fields = "__all__" + fields = [ + "id", + "status", + "duplicate_to", + "snoozed_till", + "source", + "issue", + "created_by", + ] + read_only_fields = [ + "project", + "workspace", + ] + + def to_representation(self, instance): + # Pass the annotated fields to the Issue instance if they exist + if hasattr(instance, "label_ids"): + instance.issue.label_ids = instance.label_ids + return super().to_representation(instance) + + +class InboxIssueDetailSerializer(BaseSerializer): + issue = IssueDetailSerializer(read_only=True) + + class Meta: + model = InboxIssue + fields = [ + "id", + "status", + "duplicate_to", + "snoozed_till", + "source", + "issue", + ] read_only_fields = [ "project", "workspace", ] + def to_representation(self, instance): + # Pass the annotated fields to the Issue instance if they exist + if hasattr(instance, "assignee_ids"): + instance.issue.assignee_ids = instance.assignee_ids + if hasattr(instance, "label_ids"): + instance.issue.label_ids = instance.label_ids + + return super().to_representation(instance) + class InboxIssueLiteSerializer(BaseSerializer): class Meta: diff --git a/apiserver/plane/app/serializers/issue.py b/apiserver/plane/app/serializers/issue.py index fc0e6f838c..8c641b7209 100644 --- a/apiserver/plane/app/serializers/issue.py +++ b/apiserver/plane/app/serializers/issue.py @@ -620,6 +620,26 @@ class Meta: fields = "__all__" +class IssueInboxSerializer(DynamicBaseSerializer): + label_ids = serializers.ListField( + child=serializers.UUIDField(), + required=False, + ) + + class Meta: + model = Issue + fields = [ + "id", + "name", + "priority", + "sequence_id", + "project_id", + "created_at", + "label_ids", + ] + read_only_fields = fields + + class IssueSerializer(DynamicBaseSerializer): # ids cycle_id = serializers.PrimaryKeyRelatedField(read_only=True) @@ -688,7 +708,7 @@ class Meta: class IssueDetailSerializer(IssueSerializer): description_html = serializers.CharField() - is_subscribed = serializers.BooleanField() + is_subscribed = serializers.BooleanField(read_only=True) class Meta(IssueSerializer.Meta): fields = IssueSerializer.Meta.fields + [ diff --git a/apiserver/plane/app/urls/inbox.py b/apiserver/plane/app/urls/inbox.py index e9ec4e335a..b6848244ba 100644 --- a/apiserver/plane/app/urls/inbox.py +++ b/apiserver/plane/app/urls/inbox.py @@ -30,7 +30,7 @@ name="inbox", ), path( - "workspaces//projects//inboxes//inbox-issues/", + "workspaces//projects//inbox-issues/", InboxIssueViewSet.as_view( { "get": "list", @@ -40,7 +40,7 @@ name="inbox-issue", ), path( - "workspaces//projects//inboxes//inbox-issues//", + "workspaces//projects//inbox-issues//", InboxIssueViewSet.as_view( { "get": "retrieve", diff --git a/apiserver/plane/app/views/inbox/base.py b/apiserver/plane/app/views/inbox/base.py index 710aa10a22..e486052a38 100644 --- a/apiserver/plane/app/views/inbox/base.py +++ b/apiserver/plane/app/views/inbox/base.py @@ -22,18 +22,17 @@ InboxIssue, Issue, State, + Workspace, IssueLink, IssueAttachment, ProjectMember, - IssueReaction, - IssueSubscriber, ) from plane.app.serializers import ( IssueCreateSerializer, IssueSerializer, InboxSerializer, InboxIssueSerializer, - IssueDetailSerializer, + InboxIssueDetailSerializer, ) from plane.utils.issue_filters import issue_filters from plane.bgtasks.issue_activites_task import issue_activity @@ -64,13 +63,20 @@ def get_queryset(self): .select_related("workspace", "project") ) + def list(self, request, slug, project_id): + inbox = self.get_queryset().first() + return Response( + InboxSerializer(inbox).data, + status=status.HTTP_200_OK, + ) + def perform_create(self, serializer): serializer.save(project_id=self.kwargs.get("project_id")) def destroy(self, request, slug, project_id, pk): - inbox = Inbox.objects.get( + inbox = Inbox.objects.filter( workspace__slug=slug, project_id=project_id, pk=pk - ) + ).first() # Handle default inbox delete if inbox.is_default: return Response( @@ -98,7 +104,6 @@ def get_queryset(self): Issue.objects.filter( project_id=self.kwargs.get("project_id"), workspace__slug=self.kwargs.get("slug"), - issue_inbox__inbox_id=self.kwargs.get("inbox_id"), ) .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") @@ -162,51 +167,50 @@ def get_queryset(self): ) ).distinct() - def list(self, request, slug, project_id, inbox_id): - filters = issue_filters(request.query_params, "GET") - issue_queryset = ( - self.get_queryset() - .filter(**filters) - .order_by("issue_inbox__snoozed_till", "issue_inbox__status") - ) - if self.expand: - issues = IssueSerializer( - issue_queryset, expand=self.expand, many=True - ).data - else: - issues = issue_queryset.values( - "id", - "name", - "state_id", - "sort_order", - "completed_at", - "estimate_point", - "priority", - "start_date", - "target_date", - "sequence_id", - "project_id", - "parent_id", - "cycle_id", - "module_ids", - "label_ids", - "assignee_ids", - "sub_issues_count", - "created_at", - "updated_at", - "created_by", - "updated_by", - "attachment_count", - "link_count", - "is_draft", - "archived_at", + def list(self, request, slug, project_id): + workspace = Workspace.objects.filter(slug=slug).first() + inbox_id = Inbox.objects.filter( + workspace_id=workspace.id, project_id=project_id + ).first() + filters = issue_filters(request.GET, "GET", "issue__") + inbox_issue = ( + InboxIssue.objects.filter( + inbox_id=inbox_id.id, project_id=project_id, **filters ) - return Response( - issues, - status=status.HTTP_200_OK, + .select_related("issue") + .prefetch_related( + "issue__labels", + ) + .annotate( + label_ids=Coalesce( + ArrayAgg( + "issue__labels__id", + distinct=True, + filter=~Q(issue__labels__id__isnull=True), + ), + Value([], output_field=ArrayField(UUIDField())), + ) + ) + ).order_by(request.GET.get("order_by", "-issue__created_at")) + # inbox status filter + inbox_status = [ + item + for item in request.GET.get("status", "-2").split(",") + if item != "null" + ] + if inbox_status: + inbox_issue = inbox_issue.filter(status__in=inbox_status) + + return self.paginate( + request=request, + queryset=(inbox_issue), + on_results=lambda inbox_issues: InboxIssueSerializer( + inbox_issues, + many=True, + ).data, ) - def create(self, request, slug, project_id, inbox_id): + def create(self, request, slug, project_id): if not request.data.get("issue", {}).get("name", False): return Response( {"error": "Name is required"}, @@ -229,10 +233,11 @@ def create(self, request, slug, project_id, inbox_id): # Create or get state state, _ = State.objects.get_or_create( name="Triage", - group="backlog", + group="triage", description="Default state for managing all Inbox Issues", project_id=project_id, color="#ff7700", + is_triage=True, ) # create an issue @@ -259,19 +264,25 @@ def create(self, request, slug, project_id, inbox_id): notification=True, origin=request.META.get("HTTP_ORIGIN"), ) + workspace = Workspace.objects.filter(slug=slug).first() + inbox_id = Inbox.objects.filter( + workspace_id=workspace.id, project_id=project_id + ).first() # create an inbox issue - InboxIssue.objects.create( - inbox_id=inbox_id, + inbox_issue = InboxIssue.objects.create( + inbox_id=inbox_id.id, project_id=project_id, issue=issue, source=request.data.get("source", "in-app"), ) - - issue = self.get_queryset().filter(pk=issue.id).first() - serializer = IssueSerializer(issue, expand=self.expand) + serializer = InboxIssueDetailSerializer(inbox_issue) return Response(serializer.data, status=status.HTTP_200_OK) - def partial_update(self, request, slug, project_id, inbox_id, issue_id): + def partial_update(self, request, slug, project_id, issue_id): + workspace = Workspace.objects.filter(slug=slug).first() + inbox_id = Inbox.objects.filter( + workspace_id=workspace.id, project_id=project_id + ).first() inbox_issue = InboxIssue.objects.get( issue_id=issue_id, workspace__slug=slug, @@ -374,7 +385,7 @@ def partial_update(self, request, slug, project_id, inbox_id, issue_id): ) # Update the issue state only if it is in triage state - if issue.state.name == "Triage": + if issue.state.is_triage: # Move to default state state = State.objects.filter( workspace__slug=slug, @@ -384,60 +395,60 @@ def partial_update(self, request, slug, project_id, inbox_id, issue_id): if state is not None: issue.state = state issue.save() - return Response(status=status.HTTP_204_NO_CONTENT) + + serializer = InboxIssueDetailSerializer(inbox_issue).data + return Response(serializer, status=status.HTTP_200_OK) return Response( serializer.errors, status=status.HTTP_400_BAD_REQUEST ) else: - issue = self.get_queryset().filter(pk=issue_id).first() - serializer = IssueSerializer(issue, expand=self.expand) - return Response(serializer.data, status=status.HTTP_200_OK) - - def retrieve(self, request, slug, project_id, inbox_id, issue_id): - issue = ( - self.get_queryset() - .filter(pk=issue_id) - .prefetch_related( - Prefetch( - "issue_reactions", - queryset=IssueReaction.objects.select_related( - "issue", "actor" - ), - ) - ) - .prefetch_related( - Prefetch( - "issue_attachment", - queryset=IssueAttachment.objects.select_related("issue"), - ) - ) + serializer = InboxIssueDetailSerializer(inbox_issue).data + return Response(serializer, status=status.HTTP_200_OK) + + def retrieve(self, request, slug, project_id, issue_id): + workspace = Workspace.objects.filter(slug=slug).first() + inbox_id = Inbox.objects.filter( + workspace_id=workspace.id, project_id=project_id + ).first() + inbox_issue = ( + InboxIssue.objects.select_related("issue") .prefetch_related( - Prefetch( - "issue_link", - queryset=IssueLink.objects.select_related("created_by"), - ) + "issue__labels", + "issue__assignees", ) .annotate( - is_subscribed=Exists( - IssueSubscriber.objects.filter( - workspace__slug=slug, - project_id=project_id, - issue_id=OuterRef("pk"), - subscriber=request.user, - ) - ) + label_ids=Coalesce( + ArrayAgg( + "issue__labels__id", + distinct=True, + filter=~Q(issue__labels__id__isnull=True), + ), + Value([], output_field=ArrayField(UUIDField())), + ), + assignee_ids=Coalesce( + ArrayAgg( + "issue__assignees__id", + distinct=True, + filter=~Q(issue__assignees__id__isnull=True), + ), + Value([], output_field=ArrayField(UUIDField())), + ), ) - ).first() - if issue is None: - return Response( - {"error": "Requested object was not found"}, - status=status.HTTP_404_NOT_FOUND, + .get( + inbox_id=inbox_id.id, issue_id=issue_id, project_id=project_id ) + ) + issue = InboxIssueDetailSerializer(inbox_issue).data + return Response( + issue, + status=status.HTTP_200_OK, + ) - serializer = IssueDetailSerializer(issue) - return Response(serializer.data, status=status.HTTP_200_OK) - - def destroy(self, request, slug, project_id, inbox_id, issue_id): + def destroy(self, request, slug, project_id, issue_id): + workspace = Workspace.objects.filter(slug=slug).first() + inbox_id = Inbox.objects.filter( + workspace_id=workspace.id, project_id=project_id + ).first() inbox_issue = InboxIssue.objects.get( issue_id=issue_id, workspace__slug=slug, diff --git a/apiserver/plane/app/views/project/base.py b/apiserver/plane/app/views/project/base.py index 1672cd47ca..50435e3a86 100644 --- a/apiserver/plane/app/views/project/base.py +++ b/apiserver/plane/app/views/project/base.py @@ -393,10 +393,11 @@ def partial_update(self, request, slug, pk=None): # Create the triage state in Backlog group State.objects.get_or_create( name="Triage", - group="backlog", + group="triage", description="Default state for managing all Inbox Issues", project_id=pk, color="#ff7700", + is_triage=True, ) project = ( diff --git a/apiserver/plane/app/views/state/base.py b/apiserver/plane/app/views/state/base.py index 7b09044906..6d55b19771 100644 --- a/apiserver/plane/app/views/state/base.py +++ b/apiserver/plane/app/views/state/base.py @@ -35,7 +35,7 @@ def get_queryset(self): project__project_projectmember__is_active=True, project__archived_at__isnull=True, ) - .filter(~Q(name="Triage")) + .filter(is_triage=False) .select_related("project") .select_related("workspace") .distinct() @@ -76,7 +76,7 @@ def mark_as_default(self, request, slug, project_id, pk): @invalidate_cache(path="workspaces/:slug/states/", url_params=True, user=False) def destroy(self, request, slug, project_id, pk): state = State.objects.get( - ~Q(name="Triage"), + is_triage=False, pk=pk, project_id=project_id, workspace__slug=slug, diff --git a/apiserver/plane/db/migrations/0063_state_is_triage_alter_state_group.py b/apiserver/plane/db/migrations/0063_state_is_triage_alter_state_group.py new file mode 100644 index 0000000000..66303dfe69 --- /dev/null +++ b/apiserver/plane/db/migrations/0063_state_is_triage_alter_state_group.py @@ -0,0 +1,44 @@ +# Generated by Django 4.2.10 on 2024-04-02 12:18 + +from django.db import migrations, models + + +def update_project_state_group(apps, schema_editor): + State = apps.get_model("db", "State") + + # Update states in bulk + State.objects.filter(group="backlog", name="Triage").update( + is_triage=True, group="triage" + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ("db", "0062_cycle_archived_at_module_archived_at_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="state", + name="is_triage", + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name="state", + name="group", + field=models.CharField( + choices=[ + ("backlog", "Backlog"), + ("unstarted", "Unstarted"), + ("started", "Started"), + ("completed", "Completed"), + ("cancelled", "Cancelled"), + ("triage", "Triage"), + ], + default="backlog", + max_length=20, + ), + ), + migrations.RunPython(update_project_state_group), + ] diff --git a/apiserver/plane/db/models/issue.py b/apiserver/plane/db/models/issue.py index 0a59acb936..01a43abca7 100644 --- a/apiserver/plane/db/models/issue.py +++ b/apiserver/plane/db/models/issue.py @@ -171,14 +171,14 @@ def save(self, *args, **kwargs): from plane.db.models import State default_state = State.objects.filter( - ~models.Q(name="Triage"), + ~models.Q(is_triage=True), project=self.project, default=True, ).first() # if there is no default state assign any random state if default_state is None: random_state = State.objects.filter( - ~models.Q(name="Triage"), project=self.project + ~models.Q(is_triage=True), project=self.project ).first() self.state = random_state else: diff --git a/apiserver/plane/db/models/state.py b/apiserver/plane/db/models/state.py index ab9b780c8d..28e3b25a11 100644 --- a/apiserver/plane/db/models/state.py +++ b/apiserver/plane/db/models/state.py @@ -21,10 +21,12 @@ class State(ProjectBaseModel): ("started", "Started"), ("completed", "Completed"), ("cancelled", "Cancelled"), + ("triage", "Triage") ), default="backlog", max_length=20, ) + is_triage = models.BooleanField(default=False) default = models.BooleanField(default=False) external_source = models.CharField(max_length=255, null=True, blank=True) external_id = models.CharField(max_length=255, blank=True, null=True) diff --git a/apiserver/plane/utils/issue_filters.py b/apiserver/plane/utils/issue_filters.py index 2c4cbd4717..18ef51937a 100644 --- a/apiserver/plane/utils/issue_filters.py +++ b/apiserver/plane/utils/issue_filters.py @@ -83,25 +83,25 @@ def date_filter(filter, date_term, queries): filter[f"{date_term}__lte"] = date_query[0] -def filter_state(params, filter, method): +def filter_state(params, filter, method, prefix=""): if method == "GET": states = [ item for item in params.get("state").split(",") if item != "null" ] states = filter_valid_uuids(states) if len(states) and "" not in states: - filter["state__in"] = states + filter[f"{prefix}state__in"] = states else: if ( params.get("state", None) and len(params.get("state")) and params.get("state") != "null" ): - filter["state__in"] = params.get("state") + filter[f"{prefix}state__in"] = params.get("state") return filter -def filter_state_group(params, filter, method): +def filter_state_group(params, filter, method, prefix=""): if method == "GET": state_group = [ item @@ -109,18 +109,18 @@ def filter_state_group(params, filter, method): if item != "null" ] if len(state_group) and "" not in state_group: - filter["state__group__in"] = state_group + filter[f"{prefix}state__group__in"] = state_group else: if ( params.get("state_group", None) and len(params.get("state_group")) and params.get("state_group") != "null" ): - filter["state__group__in"] = params.get("state_group") + filter[f"{prefix}state__group__in"] = params.get("state_group") return filter -def filter_estimate_point(params, filter, method): +def filter_estimate_point(params, filter, method, prefix=""): if method == "GET": estimate_points = [ item @@ -128,18 +128,20 @@ def filter_estimate_point(params, filter, method): if item != "null" ] if len(estimate_points) and "" not in estimate_points: - filter["estimate_point__in"] = estimate_points + filter[f"{prefix}estimate_point__in"] = estimate_points else: if ( params.get("estimate_point", None) and len(params.get("estimate_point")) and params.get("estimate_point") != "null" ): - filter["estimate_point__in"] = params.get("estimate_point") + filter[f"{prefix}estimate_point__in"] = params.get( + "estimate_point" + ) return filter -def filter_priority(params, filter, method): +def filter_priority(params, filter, method, prefix=""): if method == "GET": priorities = [ item @@ -147,47 +149,47 @@ def filter_priority(params, filter, method): if item != "null" ] if len(priorities) and "" not in priorities: - filter["priority__in"] = priorities + filter[f"{prefix}priority__in"] = priorities return filter -def filter_parent(params, filter, method): +def filter_parent(params, filter, method, prefix=""): if method == "GET": parents = [ item for item in params.get("parent").split(",") if item != "null" ] parents = filter_valid_uuids(parents) if len(parents) and "" not in parents: - filter["parent__in"] = parents + filter[f"{prefix}parent__in"] = parents else: if ( params.get("parent", None) and len(params.get("parent")) and params.get("parent") != "null" ): - filter["parent__in"] = params.get("parent") + filter[f"{prefix}parent__in"] = params.get("parent") return filter -def filter_labels(params, filter, method): +def filter_labels(params, filter, method, prefix=""): if method == "GET": labels = [ item for item in params.get("labels").split(",") if item != "null" ] labels = filter_valid_uuids(labels) if len(labels) and "" not in labels: - filter["labels__in"] = labels + filter[f"{prefix}labels__in"] = labels else: if ( params.get("labels", None) and len(params.get("labels")) and params.get("labels") != "null" ): - filter["labels__in"] = params.get("labels") + filter[f"{prefix}labels__in"] = params.get("labels") return filter -def filter_assignees(params, filter, method): +def filter_assignees(params, filter, method, prefix=""): if method == "GET": assignees = [ item @@ -196,18 +198,18 @@ def filter_assignees(params, filter, method): ] assignees = filter_valid_uuids(assignees) if len(assignees) and "" not in assignees: - filter["assignees__in"] = assignees + filter[f"{prefix}assignees__in"] = assignees else: if ( params.get("assignees", None) and len(params.get("assignees")) and params.get("assignees") != "null" ): - filter["assignees__in"] = params.get("assignees") + filter[f"{prefix}assignees__in"] = params.get("assignees") return filter -def filter_mentions(params, filter, method): +def filter_mentions(params, filter, method, prefix=""): if method == "GET": mentions = [ item @@ -216,18 +218,20 @@ def filter_mentions(params, filter, method): ] mentions = filter_valid_uuids(mentions) if len(mentions) and "" not in mentions: - filter["issue_mention__mention__id__in"] = mentions + filter[f"{prefix}issue_mention__mention__id__in"] = mentions else: if ( params.get("mentions", None) and len(params.get("mentions")) and params.get("mentions") != "null" ): - filter["issue_mention__mention__id__in"] = params.get("mentions") + filter[f"{prefix}issue_mention__mention__id__in"] = params.get( + "mentions" + ) return filter -def filter_created_by(params, filter, method): +def filter_created_by(params, filter, method, prefix=""): if method == "GET": created_bys = [ item @@ -236,94 +240,98 @@ def filter_created_by(params, filter, method): ] created_bys = filter_valid_uuids(created_bys) if len(created_bys) and "" not in created_bys: - filter["created_by__in"] = created_bys + filter[f"{prefix}created_by__in"] = created_bys else: if ( params.get("created_by", None) and len(params.get("created_by")) and params.get("created_by") != "null" ): - filter["created_by__in"] = params.get("created_by") + filter[f"{prefix}created_by__in"] = params.get("created_by") return filter -def filter_name(params, filter, method): +def filter_name(params, filter, method, prefix=""): if params.get("name", "") != "": - filter["name__icontains"] = params.get("name") + filter[f"{prefix}name__icontains"] = params.get("name") return filter -def filter_created_at(params, filter, method): +def filter_created_at(params, filter, method, prefix=""): if method == "GET": created_ats = params.get("created_at").split(",") if len(created_ats) and "" not in created_ats: date_filter( filter=filter, - date_term="created_at__date", + date_term=f"{prefix}created_at__date", queries=created_ats, ) else: if params.get("created_at", None) and len(params.get("created_at")): date_filter( filter=filter, - date_term="created_at__date", + date_term=f"{prefix}created_at__date", queries=params.get("created_at", []), ) return filter -def filter_updated_at(params, filter, method): +def filter_updated_at(params, filter, method, prefix=""): if method == "GET": updated_ats = params.get("updated_at").split(",") if len(updated_ats) and "" not in updated_ats: date_filter( filter=filter, - date_term="created_at__date", + date_term=f"{prefix}created_at__date", queries=updated_ats, ) else: if params.get("updated_at", None) and len(params.get("updated_at")): date_filter( filter=filter, - date_term="created_at__date", + date_term=f"{prefix}created_at__date", queries=params.get("updated_at", []), ) return filter -def filter_start_date(params, filter, method): +def filter_start_date(params, filter, method, prefix=""): if method == "GET": start_dates = params.get("start_date").split(",") if len(start_dates) and "" not in start_dates: date_filter( - filter=filter, date_term="start_date", queries=start_dates + filter=filter, + date_term=f"{prefix}start_date", + queries=start_dates, ) else: if params.get("start_date", None) and len(params.get("start_date")): - filter["start_date"] = params.get("start_date") + filter[f"{prefix}start_date"] = params.get("start_date") return filter -def filter_target_date(params, filter, method): +def filter_target_date(params, filter, method, prefix=""): if method == "GET": target_dates = params.get("target_date").split(",") if len(target_dates) and "" not in target_dates: date_filter( - filter=filter, date_term="target_date", queries=target_dates + filter=filter, + date_term=f"{prefix}target_date", + queries=target_dates, ) else: if params.get("target_date", None) and len(params.get("target_date")): - filter["target_date"] = params.get("target_date") + filter[f"{prefix}target_date"] = params.get("target_date") return filter -def filter_completed_at(params, filter, method): +def filter_completed_at(params, filter, method, prefix=""): if method == "GET": completed_ats = params.get("completed_at").split(",") if len(completed_ats) and "" not in completed_ats: date_filter( filter=filter, - date_term="completed_at__date", + date_term=f"{prefix}completed_at__date", queries=completed_ats, ) else: @@ -332,13 +340,13 @@ def filter_completed_at(params, filter, method): ): date_filter( filter=filter, - date_term="completed_at__date", + date_term=f"{prefix}completed_at__date", queries=params.get("completed_at", []), ) return filter -def filter_issue_state_type(params, filter, method): +def filter_issue_state_type(params, filter, method, prefix=""): type = params.get("type", "all") group = ["backlog", "unstarted", "started", "completed", "cancelled"] if type == "backlog": @@ -346,65 +354,67 @@ def filter_issue_state_type(params, filter, method): if type == "active": group = ["unstarted", "started"] - filter["state__group__in"] = group + filter[f"{prefix}state__group__in"] = group return filter -def filter_project(params, filter, method): +def filter_project(params, filter, method, prefix=""): if method == "GET": projects = [ item for item in params.get("project").split(",") if item != "null" ] projects = filter_valid_uuids(projects) if len(projects) and "" not in projects: - filter["project__in"] = projects + filter[f"{prefix}project__in"] = projects else: if ( params.get("project", None) and len(params.get("project")) and params.get("project") != "null" ): - filter["project__in"] = params.get("project") + filter[f"{prefix}project__in"] = params.get("project") return filter -def filter_cycle(params, filter, method): +def filter_cycle(params, filter, method, prefix=""): if method == "GET": cycles = [ item for item in params.get("cycle").split(",") if item != "null" ] cycles = filter_valid_uuids(cycles) if len(cycles) and "" not in cycles: - filter["issue_cycle__cycle_id__in"] = cycles + filter[f"{prefix}issue_cycle__cycle_id__in"] = cycles else: if ( params.get("cycle", None) and len(params.get("cycle")) and params.get("cycle") != "null" ): - filter["issue_cycle__cycle_id__in"] = params.get("cycle") + filter[f"{prefix}issue_cycle__cycle_id__in"] = params.get("cycle") return filter -def filter_module(params, filter, method): +def filter_module(params, filter, method, prefix=""): if method == "GET": modules = [ item for item in params.get("module").split(",") if item != "null" ] modules = filter_valid_uuids(modules) if len(modules) and "" not in modules: - filter["issue_module__module_id__in"] = modules + filter[f"{prefix}issue_module__module_id__in"] = modules else: if ( params.get("module", None) and len(params.get("module")) and params.get("module") != "null" ): - filter["issue_module__module_id__in"] = params.get("module") + filter[f"{prefix}issue_module__module_id__in"] = params.get( + "module" + ) return filter -def filter_inbox_status(params, filter, method): +def filter_inbox_status(params, filter, method, prefix=""): if method == "GET": status = [ item @@ -412,30 +422,32 @@ def filter_inbox_status(params, filter, method): if item != "null" ] if len(status) and "" not in status: - filter["issue_inbox__status__in"] = status + filter[f"{prefix}issue_inbox__status__in"] = status else: if ( params.get("inbox_status", None) and len(params.get("inbox_status")) and params.get("inbox_status") != "null" ): - filter["issue_inbox__status__in"] = params.get("inbox_status") + filter[f"{prefix}issue_inbox__status__in"] = params.get( + "inbox_status" + ) return filter -def filter_sub_issue_toggle(params, filter, method): +def filter_sub_issue_toggle(params, filter, method, prefix=""): if method == "GET": sub_issue = params.get("sub_issue", "false") if sub_issue == "false": - filter["parent__isnull"] = True + filter[f"{prefix}parent__isnull"] = True else: sub_issue = params.get("sub_issue", "false") if sub_issue == "false": - filter["parent__isnull"] = True + filter[f"{prefix}parent__isnull"] = True return filter -def filter_subscribed_issues(params, filter, method): +def filter_subscribed_issues(params, filter, method, prefix=""): if method == "GET": subscribers = [ item @@ -444,28 +456,30 @@ def filter_subscribed_issues(params, filter, method): ] subscribers = filter_valid_uuids(subscribers) if len(subscribers) and "" not in subscribers: - filter["issue_subscribers__subscriber_id__in"] = subscribers + filter[f"{prefix}issue_subscribers__subscriber_id__in"] = ( + subscribers + ) else: if ( params.get("subscriber", None) and len(params.get("subscriber")) and params.get("subscriber") != "null" ): - filter["issue_subscribers__subscriber_id__in"] = params.get( - "subscriber" + filter[f"{prefix}issue_subscribers__subscriber_id__in"] = ( + params.get("subscriber") ) return filter -def filter_start_target_date_issues(params, filter, method): +def filter_start_target_date_issues(params, filter, method, prefix=""): start_target_date = params.get("start_target_date", "false") if start_target_date == "true": - filter["target_date__isnull"] = False - filter["start_date__isnull"] = False + filter[f"{prefix}target_date__isnull"] = False + filter[f"{prefix}start_date__isnull"] = False return filter -def issue_filters(query_params, method): +def issue_filters(query_params, method, prefix=""): filter = {} ISSUE_FILTER = { @@ -497,6 +511,5 @@ def issue_filters(query_params, method): for key, value in ISSUE_FILTER.items(): if key in query_params: func = value - func(query_params, filter, method) - + func(query_params, filter, method, prefix) return filter diff --git a/apiserver/plane/utils/paginator.py b/apiserver/plane/utils/paginator.py index db0ede6ad7..8cc8533708 100644 --- a/apiserver/plane/utils/paginator.py +++ b/apiserver/plane/utils/paginator.py @@ -134,7 +134,7 @@ def get_result(self, limit=100, cursor=None): results=results, next=next_cursor, prev=prev_cursor, - hits=None, + hits=count, max_hits=max_hits, ) @@ -217,6 +217,7 @@ def paginate( "prev_page_results": cursor_result.prev.has_results, "count": cursor_result.__len__(), "total_pages": cursor_result.max_hits, + "total_results": cursor_result.hits, "extra_stats": extra_stats, "results": results, } diff --git a/packages/types/src/common.d.ts b/packages/types/src/common.d.ts new file mode 100644 index 0000000000..d347ecef1a --- /dev/null +++ b/packages/types/src/common.d.ts @@ -0,0 +1,11 @@ +export type TPaginationInfo = { + count: number; + extra_stats: string | null; + next_cursor: string; + next_page_results: boolean; + prev_cursor: string; + prev_page_results: boolean; + total_pages: number; + per_page?: number; + total_results: number; +}; diff --git a/packages/types/src/inbox.d.ts b/packages/types/src/inbox.d.ts new file mode 100644 index 0000000000..09c5353fd5 --- /dev/null +++ b/packages/types/src/inbox.d.ts @@ -0,0 +1,76 @@ +import { TPaginationInfo } from "./common"; +import { TIssuePriorities } from "./issues"; +import { TIssue } from "./issues/base"; + +export type TInboxIssueCurrentTab = "open" | "closed"; + +export type TInboxIssueStatus = -2 | -1 | 0 | 1 | 2; + +// filters +export type TInboxIssueFilterMemberKeys = "assignee" | "created_by"; + +export type TInboxIssueFilterDateKeys = "created_at" | "updated_at"; + +export type TInboxIssueFilter = { + [key in TInboxIssueFilterMemberKeys]: string[] | undefined; +} & { + [key in TInboxIssueFilterDateKeys]: string[] | undefined; +} & { + status: TInboxIssueStatus[] | undefined; + priority: TIssuePriorities[] | undefined; + label: string[] | undefined; +}; + +// sorting filters +export type TInboxIssueSortingKeys = "order_by" | "sort_by"; + +export type TInboxIssueSortingOrderByKeys = + | "issue__created_at" + | "issue__updated_at" + | "issue__sequence_id"; + +export type TInboxIssueSortingSortByKeys = "asc" | "desc"; + +export type TInboxIssueSorting = { + order_by: TInboxIssueSortingOrderByKeys | undefined; + sort_by: TInboxIssueSortingSortByKeys | undefined; +}; + +// filtering and sorting types for query params +export type TInboxIssueSortingOrderByQueryParamKeys = + | "issue__created_at" + | "-issue__created_at" + | "issue__updated_at" + | "-issue__updated_at" + | "issue__sequence_id" + | "-issue__sequence_id"; + +export type TInboxIssueSortingOrderByQueryParam = { + order_by: TInboxIssueSortingOrderByQueryParamKeys; +}; + +export type TInboxIssuesQueryParams = { + [key in TInboxIssueFilter]: string; +} & TInboxIssueSortingOrderByQueryParam & { + per_page: number; + cursor: string; + }; + +// inbox issue types +export type TInboxIssue = { + id: string; + status: TInboxIssueStatus; + snoozed_till: Date | null; + duplicate_to: string | null; + source: string; + issue: TIssue; + created_by: string; +}; + +export type TInboxIssuePaginationInfo = TPaginationInfo & { + total_results: number; +}; + +export type TInboxIssueWithPagination = TInboxIssuePaginationInfo & { + results: TInboxIssue[]; +}; diff --git a/packages/types/src/inbox/inbox-issue.d.ts b/packages/types/src/inbox/inbox-issue.d.ts deleted file mode 100644 index c7d33f75b6..0000000000 --- a/packages/types/src/inbox/inbox-issue.d.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { TIssue } from "../issues/base"; - -export enum EInboxStatus { - PENDING = -2, - REJECT = -1, - SNOOZED = 0, - ACCEPTED = 1, - DUPLICATE = 2, -} - -export type TInboxStatus = - | EInboxStatus.PENDING - | EInboxStatus.REJECT - | EInboxStatus.SNOOZED - | EInboxStatus.ACCEPTED - | EInboxStatus.DUPLICATE; - -export type TInboxIssueDetail = { - id?: string; - source: "in-app"; - status: TInboxStatus; - duplicate_to: string | undefined; - snoozed_till: Date | undefined; -}; - -export type TInboxIssueDetailMap = Record< - string, - Record ->; // inbox_id -> issue_id -> TInboxIssueDetail - -export type TInboxIssueDetailIdMap = Record; // inbox_id -> issue_id[] - -export type TInboxIssueExtendedDetail = TIssue & { - issue_inbox: TInboxIssueDetail[]; -}; - -// property type checks -export type TInboxPendingStatus = { - status: EInboxStatus.PENDING; -}; - -export type TInboxRejectStatus = { - status: EInboxStatus.REJECT; -}; - -export type TInboxSnoozedStatus = { - status: EInboxStatus.SNOOZED; - snoozed_till: Date; -}; - -export type TInboxAcceptedStatus = { - status: EInboxStatus.ACCEPTED; -}; - -export type TInboxDuplicateStatus = { - status: EInboxStatus.DUPLICATE; - duplicate_to: string; // issue_id -}; - -export type TInboxDetailedStatus = - | TInboxPendingStatus - | TInboxRejectStatus - | TInboxSnoozedStatus - | TInboxAcceptedStatus - | TInboxDuplicateStatus; diff --git a/packages/types/src/inbox/inbox-types.d.ts b/packages/types/src/inbox/inbox-types.d.ts deleted file mode 100644 index c3ec8461ee..0000000000 --- a/packages/types/src/inbox/inbox-types.d.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { TIssue } from "../issues/base"; -import type { IProjectLite } from "../project"; - -export type TInboxIssueExtended = { - completed_at: string | null; - start_date: string | null; - target_date: string | null; -}; - -export interface IInboxIssue extends TIssue, TInboxIssueExtended { - issue_inbox: { - duplicate_to: string | null; - id: string; - snoozed_till: Date | null; - source: string; - status: -2 | -1 | 0 | 1 | 2; - }[]; -} - -export interface IInbox { - id: string; - project_detail: IProjectLite; - pending_issue_count: number; - created_at: Date; - updated_at: Date; - name: string; - description: string; - is_default: boolean; - created_by: string; - updated_by: string; - project: string; - view_props: { filters: IInboxFilterOptions }; - workspace: string; -} - -export interface IInboxFilterOptions { - priority?: string[] | null; - inbox_status?: number[] | null; -} - -export interface IInboxQueryParams { - priority: string | null; - inbox_status: string | null; -} diff --git a/packages/types/src/inbox/inbox.d.ts b/packages/types/src/inbox/inbox.d.ts deleted file mode 100644 index 1b4e23e0fc..0000000000 --- a/packages/types/src/inbox/inbox.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -export type TInboxIssueFilterOptions = { - priority: string[]; - inbox_status: number[]; -}; - -export type TInboxIssueQueryParams = "priority" | "inbox_status"; - -export type TInboxIssueFilters = { filters: TInboxIssueFilterOptions }; - -export type TInbox = { - id: string; - name: string; - description: string; - workspace: string; - project: string; - is_default: boolean; - view_props: TInboxIssueFilters; - created_by: string; - updated_by: string; - created_at: Date; - updated_at: Date; - pending_issue_count: number; -}; - -export type TInboxDetailMap = Record; // inbox_id -> TInbox - -export type TInboxDetailIdMap = Record; // project_id -> inbox_id[] diff --git a/packages/types/src/inbox/root.d.ts b/packages/types/src/inbox/root.d.ts deleted file mode 100644 index 6fd21a4fe9..0000000000 --- a/packages/types/src/inbox/root.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./inbox-issue"; -export * from "./inbox-types"; -export * from "./inbox"; diff --git a/packages/types/src/index.d.ts b/packages/types/src/index.d.ts index 48d0c14483..52ea3771ed 100644 --- a/packages/types/src/index.d.ts +++ b/packages/types/src/index.d.ts @@ -12,10 +12,7 @@ export * from "./pages"; export * from "./ai"; export * from "./estimate"; export * from "./importer"; - -// FIXME: Remove this after development and the refactor/mobx-store-issue branch is stable -export * from "./inbox/root"; - +export * from "./inbox"; export * from "./analytics"; export * from "./calendar"; export * from "./notifications"; @@ -29,3 +26,4 @@ export * from "./auth"; export * from "./api_token"; export * from "./instance"; export * from "./app"; +export * from "./common"; diff --git a/web/components/headers/project-inbox.tsx b/web/components/headers/project-inbox.tsx index 7ddf923802..b35c7485d0 100644 --- a/web/components/headers/project-inbox.tsx +++ b/web/components/headers/project-inbox.tsx @@ -1,16 +1,15 @@ import { FC, useState } from "react"; import { observer } from "mobx-react-lite"; import { useRouter } from "next/router"; -import { Plus } from "lucide-react"; -// hooks +import { Plus, RefreshCcw } from "lucide-react"; // ui import { Breadcrumbs, Button, LayersIcon } from "@plane/ui"; // components import { BreadcrumbLink } from "@/components/common"; import { CreateInboxIssueModal } from "@/components/inbox"; -// helper import { ProjectLogo } from "@/components/project"; -import { useProject } from "@/hooks/store"; +// hooks +import { useProject, useProjectInbox } from "@/hooks/store"; export const ProjectInboxHeader: FC = observer(() => { // states @@ -20,11 +19,12 @@ export const ProjectInboxHeader: FC = observer(() => { const { workspaceSlug } = router.query; // store hooks const { currentProjectDetails } = useProject(); + const { isLoading } = useProjectInbox(); return (
-
+
{ } /> + + {isLoading === "pagination-loading" && ( +
+ +

Syncing...

+
+ )}
diff --git a/web/components/inbox/content/inbox-issue-header.tsx b/web/components/inbox/content/inbox-issue-header.tsx new file mode 100644 index 0000000000..4b1f7a114b --- /dev/null +++ b/web/components/inbox/content/inbox-issue-header.tsx @@ -0,0 +1,276 @@ +import { FC, useCallback, useEffect, useState } from "react"; +import { observer } from "mobx-react"; +import { useRouter } from "next/router"; +import { ChevronDown, ChevronUp, Clock, ExternalLink, FileStack, Link, Trash2 } from "lucide-react"; +import { Button, ControlLink, CustomMenu, TOAST_TYPE, setToast } from "@plane/ui"; +// components +import { + AcceptIssueModal, + DeclineIssueModal, + DeleteInboxIssueModal, + InboxIssueSnoozeModal, + InboxIssueStatus, + SelectDuplicateInboxIssueModal, +} from "@/components/inbox"; +import { IssueUpdateStatus } from "@/components/issues"; +// constants +import { EUserProjectRoles } from "@/constants/project"; +// helpers +import { copyUrlToClipboard } from "@/helpers/string.helper"; +// hooks +import { useUser, useProjectInbox, useProject } from "@/hooks/store"; +// store types +import type { IInboxIssueStore } from "@/store/inbox/inbox-issue.store"; + +type TInboxIssueActionsHeader = { + workspaceSlug: string; + projectId: string; + inboxIssue: IInboxIssueStore | undefined; + isSubmitting: "submitting" | "submitted" | "saved"; +}; + +export const InboxIssueActionsHeader: FC = observer((props) => { + const { workspaceSlug, projectId, inboxIssue, isSubmitting } = props; + // states + const [isSnoozeDateModalOpen, setIsSnoozeDateModalOpen] = useState(false); + const [selectDuplicateIssue, setSelectDuplicateIssue] = useState(false); + const [acceptIssueModal, setAcceptIssueModal] = useState(false); + const [declineIssueModal, setDeclineIssueModal] = useState(false); + const [deleteIssueModal, setDeleteIssueModal] = useState(false); + // store + const { deleteInboxIssue, inboxIssuesArray } = useProjectInbox(); + const { + currentUser, + membership: { currentProjectRole }, + } = useUser(); + const router = useRouter(); + const { getProjectById } = useProject(); + + const issue = inboxIssue?.issue; + // derived values + const isAllowed = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; + const canMarkAsDuplicate = isAllowed && inboxIssue?.status === -2; + const canMarkAsAccepted = isAllowed && (inboxIssue?.status === 0 || inboxIssue?.status === -2); + const canMarkAsDeclined = isAllowed && inboxIssue?.status === -2; + const canDelete = isAllowed || inboxIssue?.created_by === currentUser?.id; + const isCompleted = inboxIssue?.status === 1; + + const currentInboxIssueId = inboxIssue?.issue?.id; + + const issueLink = `${workspaceSlug}/projects/${issue?.project_id}/issues/${currentInboxIssueId}`; + + const handleInboxIssueAccept = async () => { + inboxIssue?.updateInboxIssueStatus(1); + setAcceptIssueModal(false); + }; + + const handleInboxIssueDecline = async () => { + inboxIssue?.updateInboxIssueStatus(-1); + setDeclineIssueModal(false); + }; + + const handleInboxIssueDuplicate = (issueId: string) => { + inboxIssue?.updateInboxIssueDuplicateTo(issueId); + }; + + const handleInboxSIssueSnooze = async (date: Date) => { + inboxIssue?.updateInboxIssueSnoozeTill(date); + setIsSnoozeDateModalOpen(false); + }; + + const handleInboxIssueDelete = async () => { + if (!inboxIssue || !currentInboxIssueId) return; + deleteInboxIssue(workspaceSlug, projectId, currentInboxIssueId).finally(() => { + router.push(`/${workspaceSlug}/projects/${projectId}/inbox`); + }); + }; + + const handleCopyIssueLink = () => + copyUrlToClipboard(issueLink).then(() => + setToast({ + type: TOAST_TYPE.SUCCESS, + title: "Link copied", + message: "Issue link copied to clipboard", + }) + ); + + const currentIssueIndex = inboxIssuesArray.findIndex((issue) => issue.issue.id === currentInboxIssueId) ?? 0; + + const handleInboxIssueNavigation = useCallback( + (direction: "next" | "prev") => { + if (!inboxIssuesArray || !currentInboxIssueId) return; + const activeElement = document.activeElement as HTMLElement; + if (activeElement && (activeElement.classList.contains("tiptap") || activeElement.id === "title-input")) return; + const nextIssueIndex = + direction === "next" + ? (currentIssueIndex + 1) % inboxIssuesArray.length + : (currentIssueIndex - 1 + inboxIssuesArray.length) % inboxIssuesArray.length; + const nextIssueId = inboxIssuesArray[nextIssueIndex].issue.id; + if (!nextIssueId) return; + router.push(`/${workspaceSlug}/projects/${projectId}/inbox?inboxIssueId=${nextIssueId}`); + }, + [currentInboxIssueId, currentIssueIndex, inboxIssuesArray, projectId, router, workspaceSlug] + ); + + const onKeyDown = useCallback( + (e: KeyboardEvent) => { + if (e.key === "ArrowUp") { + handleInboxIssueNavigation("prev"); + } else if (e.key === "ArrowDown") { + handleInboxIssueNavigation("next"); + } + }, + [handleInboxIssueNavigation] + ); + + useEffect(() => { + document.addEventListener("keydown", onKeyDown); + return () => { + document.removeEventListener("keydown", onKeyDown); + }; + }, [onKeyDown]); + + if (!inboxIssue) return null; + + return ( + <> + <> + setSelectDuplicateIssue(false)} + value={inboxIssue?.duplicate_to} + onSubmit={handleInboxIssueDuplicate} + /> + + setAcceptIssueModal(false)} + onSubmit={handleInboxIssueAccept} + /> + + setDeclineIssueModal(false)} + onSubmit={handleInboxIssueDecline} + /> + + setDeleteIssueModal(false)} + onSubmit={handleInboxIssueDelete} + /> + + setIsSnoozeDateModalOpen(false)} + value={inboxIssue?.snoozed_till} + onConfirm={handleInboxSIssueSnooze} + /> + + +
+
+ {issue?.project_id && issue.sequence_id && ( +

+ {getProjectById(issue.project_id)?.identifier}-{issue.sequence_id} +

+ )} + +
+ +
+
+ +
+
+ + +
+ +
+ {canMarkAsAccepted && ( +
+ +
+ )} + + {canMarkAsDeclined && ( +
+ +
+ )} + + {isCompleted ? ( +
+ + + router.push(`/${workspaceSlug}/projects/${issue?.project_id}/issues/${currentInboxIssueId}`) + } + > + + +
+ ) : ( + + {canMarkAsAccepted && ( + setIsSnoozeDateModalOpen(true)}> +
+ + Snooze +
+
+ )} + {canMarkAsDuplicate && ( + setSelectDuplicateIssue(true)}> +
+ + Mark as duplicate +
+
+ )} + {canDelete && ( + setDeleteIssueModal(true)}> +
+ + Delete +
+
+ )} +
+ )} +
+
+
+ + ); +}); diff --git a/web/components/inbox/content/index.ts b/web/components/inbox/content/index.ts new file mode 100644 index 0000000000..029365f7a0 --- /dev/null +++ b/web/components/inbox/content/index.ts @@ -0,0 +1,4 @@ +export * from "./root"; +export * from "./inbox-issue-header"; +export * from "./issue-properties"; +export * from "./issue-root"; diff --git a/web/components/issues/issue-detail/inbox/sidebar.tsx b/web/components/inbox/content/issue-properties.tsx similarity index 60% rename from web/components/issues/issue-detail/inbox/sidebar.tsx rename to web/components/inbox/content/issue-properties.tsx index 6472eea270..038c734765 100644 --- a/web/components/issues/issue-detail/inbox/sidebar.tsx +++ b/web/components/inbox/content/issue-properties.tsx @@ -1,60 +1,32 @@ import React from "react"; - -import { observer } from "mobx-react-lite"; - +import { observer } from "mobx-react"; import { CalendarCheck2, Signal, Tag } from "lucide-react"; - -// hooks +import { TIssue } from "@plane/types"; +import { DoubleCircleIcon, UserGroupIcon } from "@plane/ui"; // components -import { DoubleCircleIcon, StateGroupIcon, UserGroupIcon } from "@plane/ui"; import { DateDropdown, PriorityDropdown, MemberDropdown, StateDropdown } from "@/components/dropdowns"; import { IssueLabel, TIssueOperations } from "@/components/issues"; -// icons // helper import { getDate, renderFormattedPayloadDate } from "@/helpers/date-time.helper"; -import { useIssueDetail, useProject, useProjectState } from "@/hooks/store"; type Props = { workspaceSlug: string; projectId: string; - issueId: string; + issue: Partial; issueOperations: TIssueOperations; is_editable: boolean; }; -export const InboxIssueDetailsSidebar: React.FC = observer((props) => { - const { workspaceSlug, projectId, issueId, issueOperations, is_editable } = props; - // store hooks - const { getProjectById } = useProject(); - const { projectStates } = useProjectState(); - const { - issue: { getIssueById }, - } = useIssueDetail(); - - const issue = getIssueById(issueId); - if (!issue) return <>; - - const projectDetails = issue ? getProjectById(issue.project_id) : null; +export const InboxIssueProperties: React.FC = observer((props) => { + const { workspaceSlug, projectId, issue, issueOperations, is_editable } = props; const minDate = issue.start_date ? getDate(issue.start_date) : null; minDate?.setDate(minDate.getDate()); - const currentIssueState = projectStates?.find((s) => s.id === issue.state_id); - + if (!issue || !issue?.id) return <>; return ( -
-
-
- {currentIssueState && ( - - )} -

- {projectDetails?.identifier}-{issue?.sequence_id} -

-
-
- -
+
+
Properties
@@ -64,18 +36,22 @@ export const InboxIssueDetailsSidebar: React.FC = observer((props) => { State
- issueOperations.update(workspaceSlug, projectId, issueId, { state_id: val })} - projectId={projectId?.toString() ?? ""} - disabled={!is_editable} - buttonVariant="transparent-with-text" - className="w-3/5 flex-grow group" - buttonContainerClassName="w-full text-left" - buttonClassName="text-sm" - dropdownArrow - dropdownArrowClassName="h-3.5 w-3.5 hidden group-hover:inline" - /> + {issue?.state_id && ( + + issue?.id && issueOperations.update(workspaceSlug, projectId, issue?.id, { state_id: val }) + } + projectId={projectId?.toString() ?? ""} + disabled={!is_editable} + buttonVariant="transparent-with-text" + className="w-3/5 flex-grow group" + buttonContainerClassName="w-full text-left" + buttonClassName="text-sm" + dropdownArrow + dropdownArrowClassName="h-3.5 w-3.5 hidden group-hover:inline" + /> + )}
{/* Assignee */}
@@ -84,17 +60,21 @@ export const InboxIssueDetailsSidebar: React.FC = observer((props) => { Assignees
issueOperations.update(workspaceSlug, projectId, issueId, { assignee_ids: val })} + value={issue?.assignee_ids ?? []} + onChange={(val) => + issue?.id && issueOperations.update(workspaceSlug, projectId, issue?.id, { assignee_ids: val }) + } disabled={!is_editable} projectId={projectId?.toString() ?? ""} placeholder="Add assignees" multiple - buttonVariant={issue?.assignee_ids?.length > 0 ? "transparent-without-text" : "transparent-with-text"} + buttonVariant={ + (issue?.assignee_ids || [])?.length > 0 ? "transparent-without-text" : "transparent-with-text" + } className="w-3/5 flex-grow group" buttonContainerClassName="w-full text-left" buttonClassName={`text-sm justify-between ${ - issue?.assignee_ids.length > 0 ? "" : "text-custom-text-400" + (issue?.assignee_ids || [])?.length > 0 ? "" : "text-custom-text-400" }`} hideIcon={issue.assignee_ids?.length === 0} dropdownArrow @@ -108,8 +88,10 @@ export const InboxIssueDetailsSidebar: React.FC = observer((props) => { Priority
issueOperations.update(workspaceSlug, projectId, issueId, { priority: val })} + value={issue?.priority || "none"} + onChange={(val) => + issue?.id && issueOperations.update(workspaceSlug, projectId, issue?.id, { priority: val }) + } disabled={!is_editable} buttonVariant="border-with-text" className="w-3/5 flex-grow rounded px-2 hover:bg-custom-background-80" @@ -129,9 +111,10 @@ export const InboxIssueDetailsSidebar: React.FC = observer((props) => {
- issueOperations.update(workspaceSlug, projectId, issueId, { + issue?.id && + issueOperations.update(workspaceSlug, projectId, issue?.id, { target_date: val ? renderFormattedPayloadDate(val) : null, }) } @@ -152,16 +135,18 @@ export const InboxIssueDetailsSidebar: React.FC = observer((props) => { Labels
- - issueOperations.update(workspaceSlug, projectId, issueId, { label_ids: val }) - } - /> + {issue?.id && ( + + issue?.id && issueOperations.update(workspaceSlug, projectId, issue?.id, { label_ids: val }) + } + /> + )}
diff --git a/web/components/inbox/content/issue-root.tsx b/web/components/inbox/content/issue-root.tsx new file mode 100644 index 0000000000..b493b573bf --- /dev/null +++ b/web/components/inbox/content/issue-root.tsx @@ -0,0 +1,174 @@ +import { Dispatch, SetStateAction, useEffect, useMemo } from "react"; +import { observer } from "mobx-react"; +import { useRouter } from "next/router"; +import { TIssue } from "@plane/types"; +import { Loader, TOAST_TYPE, setToast } from "@plane/ui"; +// components +import { InboxIssueProperties } from "@/components/inbox/content"; +import { + IssueDescriptionInput, + IssueTitleInput, + IssueActivity, + IssueReaction, + TIssueOperations, +} from "@/components/issues"; +// hooks +import { useEventTracker, useProjectInbox, useUser } from "@/hooks/store"; +import useReloadConfirmations from "@/hooks/use-reload-confirmation"; +// store types +import { IInboxIssueStore } from "@/store/inbox/inbox-issue.store"; + +type Props = { + workspaceSlug: string; + projectId: string; + inboxIssue: IInboxIssueStore; + is_editable: boolean; + isSubmitting: "submitting" | "submitted" | "saved"; + setIsSubmitting: Dispatch>; +}; + +export const InboxIssueMainContent: React.FC = observer((props) => { + const router = useRouter(); + const { workspaceSlug, projectId, inboxIssue, is_editable, isSubmitting, setIsSubmitting } = props; + // hooks + const { currentUser } = useUser(); + const { isLoading } = useProjectInbox(); + const { setShowAlert } = useReloadConfirmations(isSubmitting === "submitting"); + const { captureIssueEvent } = useEventTracker(); + + useEffect(() => { + if (isSubmitting === "submitted") { + setShowAlert(false); + setTimeout(async () => { + setIsSubmitting("saved"); + }, 3000); + } else if (isSubmitting === "submitting") { + setShowAlert(true); + } + }, [isSubmitting, setShowAlert, setIsSubmitting]); + + const issue = inboxIssue.issue; + if (!issue) return <>; + + const issueDescription = + issue.description_html !== undefined || issue.description_html !== null + ? issue.description_html != "" + ? issue.description_html + : "

" + : undefined; + + const issueOperations: TIssueOperations = useMemo( + () => ({ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + fetch: async (workspaceSlug: string, projectId: string, issueId: string) => { + try { + return; + } catch (error) { + setToast({ + title: "Issue fetch failed", + type: TOAST_TYPE.ERROR, + message: "Issue fetch failed", + }); + } + }, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + remove: async (workspaceSlug: string, projectId: string, issueId: string) => { + try { + return; + } catch (error) { + setToast({ + title: "Issue remove failed", + type: TOAST_TYPE.ERROR, + message: "Issue remove failed", + }); + } + }, + update: async (workspaceSlug: string, projectId: string, issueId: string, data: Partial) => { + try { + await inboxIssue.updateIssue(data); + captureIssueEvent({ + eventName: "Inbox issue updated", + payload: { ...data, state: "SUCCESS", element: "Inbox" }, + updates: { + changed_property: Object.keys(data).join(","), + change_details: Object.values(data).join(","), + }, + path: router.asPath, + }); + } catch (error) { + setToast({ + title: "Issue update failed", + type: TOAST_TYPE.ERROR, + message: "Issue update failed", + }); + captureIssueEvent({ + eventName: "Inbox issue updated", + payload: { state: "SUCCESS", element: "Inbox" }, + updates: { + changed_property: Object.keys(data).join(","), + change_details: Object.values(data).join(","), + }, + path: router.asPath, + }); + } + }, + }), + [inboxIssue] + ); + + if (!issue?.project_id || !issue?.id) return <>; + return ( + <> +
+ setIsSubmitting(value)} + issueOperations={issueOperations} + disabled={!is_editable} + value={issue.name} + /> + + {isLoading ? ( + + + + ) : ( + setIsSubmitting(value)} + /> + )} + + {currentUser && ( + + )} +
+ + + +
+ +
+ + ); +}); diff --git a/web/components/inbox/content/root.tsx b/web/components/inbox/content/root.tsx index 3898768127..12cfb836d8 100644 --- a/web/components/inbox/content/root.tsx +++ b/web/components/inbox/content/root.tsx @@ -1,86 +1,62 @@ -import { FC } from "react"; +import { FC, useState } from "react"; import { observer } from "mobx-react"; -import { Inbox } from "lucide-react"; -// hooks -import { Loader } from "@plane/ui"; -import { InboxIssueActionsHeader } from "@/components/inbox"; -import { InboxIssueDetailRoot } from "@/components/issues/issue-detail/inbox"; -import { useInboxIssues } from "@/hooks/store"; -// components -// ui +import useSWR from "swr"; +import { InboxIssueActionsHeader, InboxIssueMainContent } from "@/components/inbox"; +import { EUserProjectRoles } from "@/constants/project"; +import { useProjectInbox, useUser } from "@/hooks/store"; type TInboxContentRoot = { workspaceSlug: string; projectId: string; - inboxId: string; - inboxIssueId: string | undefined; + inboxIssueId: string; }; export const InboxContentRoot: FC = observer((props) => { - const { workspaceSlug, projectId, inboxId, inboxIssueId } = props; + const { workspaceSlug, projectId, inboxIssueId } = props; + // states + const [isSubmitting, setIsSubmitting] = useState<"submitting" | "submitted" | "saved">("saved"); // hooks + const { fetchInboxIssueById, getIssueInboxByIssueId } = useProjectInbox(); + const inboxIssue = getIssueInboxByIssueId(inboxIssueId); const { - issues: { loader, getInboxIssuesByInboxId }, - } = useInboxIssues(); + membership: { currentProjectRole }, + } = useUser(); - const inboxIssuesList = inboxId ? getInboxIssuesByInboxId(inboxId) : undefined; + useSWR( + workspaceSlug && projectId && inboxIssueId + ? `PROJECT_INBOX_ISSUE_DETAIL_${workspaceSlug}_${projectId}_${inboxIssueId}` + : null, + () => { + workspaceSlug && projectId && inboxIssueId && fetchInboxIssueById(workspaceSlug, projectId, inboxIssueId); + }, + { revalidateOnFocus: false } + ); + + const is_editable = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; + if (!inboxIssue) return <>; return ( <> - {loader === "init-loader" ? ( - -
- - - - -
-
- - - - -
-
- ) : ( - <> - {!inboxIssueId ? ( -
-
-
- - {inboxIssuesList && inboxIssuesList.length > 0 ? ( - - {inboxIssuesList?.length} issues found. Select an issue from the sidebar to view its details. - - ) : ( - No issues found - )} -
-
-
- ) : ( -
-
- -
-
- -
-
- )} - - )} +
+
+ +
+
+ +
+
); }); diff --git a/web/components/inbox/inbox-filter/applied-filters/date.tsx b/web/components/inbox/inbox-filter/applied-filters/date.tsx new file mode 100644 index 0000000000..bce7a04872 --- /dev/null +++ b/web/components/inbox/inbox-filter/applied-filters/date.tsx @@ -0,0 +1,66 @@ +import { FC } from "react"; +import { observer } from "mobx-react"; +import { X } from "lucide-react"; +import { TInboxIssueFilterDateKeys } from "@plane/types"; +// constants +import { DATE_BEFORE_FILTER_OPTIONS } from "@/constants/filters"; +// helpers +import { renderFormattedDate } from "@/helpers/date-time.helper"; +// hooks +import { useProjectInbox } from "@/hooks/store"; + +type InboxIssueAppliedFiltersDate = { + filterKey: TInboxIssueFilterDateKeys; + label: string; +}; + +export const InboxIssueAppliedFiltersDate: FC = observer((props) => { + const { filterKey, label } = props; + // hooks + const { inboxFilters, handleInboxIssueFilters } = useProjectInbox(); + // derived values + const filteredValues = inboxFilters?.[filterKey] || []; + const currentOptionDetail = (date: string) => { + const currentDate = DATE_BEFORE_FILTER_OPTIONS.find((d) => d.value === date); + if (currentDate) return currentDate; + const dateSplit = date.split(";"); + return { + name: `${dateSplit[1].charAt(0).toUpperCase() + dateSplit[1].slice(1)} ${renderFormattedDate(dateSplit[0])}`, + value: date, + }; + }; + + const handleFilterValue = (value: string): string[] => + filteredValues?.includes(value) ? filteredValues.filter((v) => v !== value) : [...filteredValues, value]; + + const clearFilter = () => handleInboxIssueFilters(filterKey, undefined); + + if (filteredValues.length === 0) return <>; + return ( +
+
{label}
+ {filteredValues.map((value) => { + const optionDetail = currentOptionDetail(value); + if (!optionDetail) return <>; + return ( +
+
{optionDetail?.name}
+
handleInboxIssueFilters(filterKey, handleFilterValue(optionDetail?.value))} + > + +
+
+ ); + })} + +
+ +
+
+ ); +}); diff --git a/web/components/inbox/inbox-filter/applied-filters/index.ts b/web/components/inbox/inbox-filter/applied-filters/index.ts new file mode 100644 index 0000000000..35f0bc2617 --- /dev/null +++ b/web/components/inbox/inbox-filter/applied-filters/index.ts @@ -0,0 +1,6 @@ +export * from "./root"; +export * from "./status"; +export * from "./priority"; +export * from "./member"; +export * from "./label"; +export * from "./date"; diff --git a/web/components/inbox/inbox-filter/applied-filters/label.tsx b/web/components/inbox/inbox-filter/applied-filters/label.tsx new file mode 100644 index 0000000000..b028a1773b --- /dev/null +++ b/web/components/inbox/inbox-filter/applied-filters/label.tsx @@ -0,0 +1,55 @@ +import { FC } from "react"; +import { observer } from "mobx-react"; +import { X } from "lucide-react"; +// hooks +import { useLabel, useProjectInbox } from "@/hooks/store"; + +const LabelIcons = ({ color }: { color: string }) => ( + +); + +export const InboxIssueAppliedFiltersLabel: FC = observer(() => { + // hooks + const { inboxFilters, handleInboxIssueFilters } = useProjectInbox(); + const { getLabelById } = useLabel(); + // derived values + const filteredValues = inboxFilters?.label || []; + const currentOptionDetail = (labelId: string) => getLabelById(labelId) || undefined; + + const handleFilterValue = (value: string): string[] => + filteredValues?.includes(value) ? filteredValues.filter((v) => v !== value) : [...filteredValues, value]; + + const clearFilter = () => handleInboxIssueFilters("label", undefined); + + if (filteredValues.length === 0) return <>; + return ( +
+
Label
+ {filteredValues.map((value) => { + const optionDetail = currentOptionDetail(value); + if (!optionDetail) return <>; + return ( +
+
+ +
+
{optionDetail?.name}
+
handleInboxIssueFilters("label", handleFilterValue(value))} + > + +
+
+ ); + })} + +
+ +
+
+ ); +}); diff --git a/web/components/inbox/inbox-filter/applied-filters/member.tsx b/web/components/inbox/inbox-filter/applied-filters/member.tsx new file mode 100644 index 0000000000..5d488a23c4 --- /dev/null +++ b/web/components/inbox/inbox-filter/applied-filters/member.tsx @@ -0,0 +1,59 @@ +import { FC } from "react"; +import { observer } from "mobx-react"; +import { X } from "lucide-react"; +import { TInboxIssueFilterMemberKeys } from "@plane/types"; +import { Avatar } from "@plane/ui"; +// hooks +import { useMember, useProjectInbox } from "@/hooks/store"; + +type InboxIssueAppliedFiltersMember = { + filterKey: TInboxIssueFilterMemberKeys; + label: string; +}; + +export const InboxIssueAppliedFiltersMember: FC = observer((props) => { + const { filterKey, label } = props; + // hooks + const { inboxFilters, handleInboxIssueFilters } = useProjectInbox(); + const { getUserDetails } = useMember(); + // derived values + const filteredValues = inboxFilters?.[filterKey] || []; + const currentOptionDetail = (memberId: string) => getUserDetails(memberId) || undefined; + + const handleFilterValue = (value: string): string[] => + filteredValues?.includes(value) ? filteredValues.filter((v) => v !== value) : [...filteredValues, value]; + + const clearFilter = () => handleInboxIssueFilters(filterKey, undefined); + + if (filteredValues.length === 0) return <>; + return ( +
+
{label}
+ {filteredValues.map((value) => { + const optionDetail = currentOptionDetail(value); + if (!optionDetail) return <>; + return ( +
+
+ +
+
{optionDetail?.display_name}
+
handleInboxIssueFilters(filterKey, handleFilterValue(value))} + > + +
+
+ ); + })} + +
+ +
+
+ ); +}); diff --git a/web/components/inbox/inbox-filter/applied-filters/priority.tsx b/web/components/inbox/inbox-filter/applied-filters/priority.tsx new file mode 100644 index 0000000000..e5a51d188d --- /dev/null +++ b/web/components/inbox/inbox-filter/applied-filters/priority.tsx @@ -0,0 +1,55 @@ +import { FC } from "react"; +import { observer } from "mobx-react"; +import { X } from "lucide-react"; +import { TIssuePriorities } from "@plane/types"; +import { PriorityIcon } from "@plane/ui"; +// constants +import { ISSUE_PRIORITIES } from "@/constants/issue"; +// hooks +import { useProjectInbox } from "@/hooks/store"; + +export const InboxIssueAppliedFiltersPriority: FC = observer(() => { + // hooks + const { inboxFilters, handleInboxIssueFilters } = useProjectInbox(); + // derived values + const filteredValues = inboxFilters?.priority || []; + const currentOptionDetail = (priority: TIssuePriorities) => + ISSUE_PRIORITIES.find((p) => p.key === priority) || undefined; + + const handleFilterValue = (value: TIssuePriorities): TIssuePriorities[] => + filteredValues?.includes(value) ? filteredValues.filter((v) => v !== value) : [...filteredValues, value]; + + const clearFilter = () => handleInboxIssueFilters("priority", undefined); + + if (filteredValues.length === 0) return <>; + return ( +
+
Priority
+ {filteredValues.map((value) => { + const optionDetail = currentOptionDetail(value); + if (!optionDetail) return <>; + return ( +
+
+ +
+
{optionDetail?.title}
+
handleInboxIssueFilters("priority", handleFilterValue(optionDetail?.key))} + > + +
+
+ ); + })} + +
+ +
+
+ ); +}); diff --git a/web/components/inbox/inbox-filter/applied-filters/root.tsx b/web/components/inbox/inbox-filter/applied-filters/root.tsx new file mode 100644 index 0000000000..8baf86df26 --- /dev/null +++ b/web/components/inbox/inbox-filter/applied-filters/root.tsx @@ -0,0 +1,36 @@ +import { FC } from "react"; +import { observer } from "mobx-react"; +// components +import { + InboxIssueAppliedFiltersStatus, + InboxIssueAppliedFiltersPriority, + InboxIssueAppliedFiltersMember, + InboxIssueAppliedFiltersLabel, + InboxIssueAppliedFiltersDate, +} from "@/components/inbox"; +// hooks +import { useProjectInbox } from "@/hooks/store"; + +export const InboxIssueAppliedFilters: FC = observer(() => { + const { getAppliedFiltersCount } = useProjectInbox(); + + if (getAppliedFiltersCount === 0) return <>; + return ( +
+ {/* status */} + + {/* priority */} + + {/* assignees */} + + {/* created_by */} + + {/* label */} + + {/* created_at */} + + {/* updated_at */} + +
+ ); +}); diff --git a/web/components/inbox/inbox-filter/applied-filters/status.tsx b/web/components/inbox/inbox-filter/applied-filters/status.tsx new file mode 100644 index 0000000000..a4ec1a37e5 --- /dev/null +++ b/web/components/inbox/inbox-filter/applied-filters/status.tsx @@ -0,0 +1,57 @@ +import { FC } from "react"; +import { observer } from "mobx-react"; +import { X } from "lucide-react"; +import { TInboxIssueStatus } from "@plane/types"; +// constants +import { INBOX_STATUS } from "@/constants/inbox"; +// hooks +import { useProjectInbox } from "@/hooks/store"; + +export const InboxIssueAppliedFiltersStatus: FC = observer(() => { + // hooks + const { currentTab, inboxFilters, handleInboxIssueFilters } = useProjectInbox(); + // derived values + const filteredValues = inboxFilters?.status || []; + const currentOptionDetail = (status: TInboxIssueStatus) => INBOX_STATUS.find((s) => s.status === status) || undefined; + + const handleFilterValue = (value: TInboxIssueStatus): TInboxIssueStatus[] => + filteredValues?.includes(value) ? filteredValues.filter((v) => v !== value) : [...filteredValues, value]; + + const clearFilter = () => handleInboxIssueFilters("status", undefined); + + if (filteredValues.length === 0) return <>; + return ( +
+
Status
+ {filteredValues.map((value) => { + const optionDetail = currentOptionDetail(value); + if (!optionDetail) return <>; + return ( +
+
+ +
+
{optionDetail?.title}
+ {currentTab === "closed" && handleFilterValue(optionDetail?.status).length >= 1 && ( +
handleInboxIssueFilters("status", handleFilterValue(optionDetail?.status))} + > + +
+ )} +
+ ); + })} + + {currentTab === "closed" && filteredValues.length > 1 && ( +
+ +
+ )} +
+ ); +}); diff --git a/web/components/inbox/inbox-filter/filters/date.tsx b/web/components/inbox/inbox-filter/filters/date.tsx new file mode 100644 index 0000000000..12aba01ef2 --- /dev/null +++ b/web/components/inbox/inbox-filter/filters/date.tsx @@ -0,0 +1,97 @@ +import { FC, useState } from "react"; +import concat from "lodash/concat"; +import pull from "lodash/pull"; +import uniq from "lodash/uniq"; +import { observer } from "mobx-react"; +import { TInboxIssueFilterDateKeys } from "@plane/types"; +// components +import { DateFilterModal } from "@/components/core"; +import { FilterHeader, FilterOption } from "@/components/issues"; +// constants +import { DATE_BEFORE_FILTER_OPTIONS } from "@/constants/filters"; +// hooks +import { useProjectInbox } from "@/hooks/store"; + +type Props = { + filterKey: TInboxIssueFilterDateKeys; + label?: string; + searchQuery: string; +}; + +const isDate = (date: string) => { + const datePattern = /^\d{4}-\d{2}-\d{2}$/; + return datePattern.test(date); +}; + +export const FilterDate: FC = observer((props) => { + const { filterKey, label, searchQuery } = props; + // hooks + const { inboxFilters, handleInboxIssueFilters } = useProjectInbox(); + // state + const [previewEnabled, setPreviewEnabled] = useState(true); + const [isDateFilterModalOpen, setIsDateFilterModalOpen] = useState(false); + // derived values + const filterValue: string[] = inboxFilters?.[filterKey] || []; + const appliedFiltersCount = filterValue?.length ?? 0; + const filteredOptions = DATE_BEFORE_FILTER_OPTIONS.filter((d) => + d.name.toLowerCase().includes(searchQuery.toLowerCase()) + ); + + const handleFilterValue = (value: string): string[] => + filterValue?.includes(value) ? pull(filterValue, value) : uniq(concat(filterValue, value)); + + const handleCustomFilterValue = (value: string[]): string[] => { + const finalOptions: string[] = [...filterValue]; + value.forEach((v) => (finalOptions?.includes(v) ? pull(finalOptions, v) : finalOptions.push(v))); + return uniq(finalOptions); + }; + + const isCustomDateSelected = () => { + const isValidDateSelected = filterValue?.filter((f) => isDate(f.split(";")[0])) || []; + return isValidDateSelected.length > 0 ? true : false; + }; + + const handleCustomDate = () => { + if (isCustomDateSelected()) { + const updateAppliedFilters = filterValue?.filter((f) => isDate(f.split(";")[0])) || []; + handleInboxIssueFilters(filterKey, handleCustomFilterValue(updateAppliedFilters)); + } else setIsDateFilterModalOpen(true); + }; + return ( + <> + {isDateFilterModalOpen && ( + setIsDateFilterModalOpen(false)} + isOpen={isDateFilterModalOpen} + onSelect={(val) => handleInboxIssueFilters(filterKey, handleCustomFilterValue(val))} + title="Created date" + /> + )} + 0 ? ` (${appliedFiltersCount})` : ""}`} + isPreviewEnabled={previewEnabled} + handleIsPreviewEnabled={() => setPreviewEnabled(!previewEnabled)} + /> + {previewEnabled && ( +
+ {filteredOptions.length > 0 ? ( + <> + {filteredOptions.map((option) => ( + handleInboxIssueFilters(filterKey, handleFilterValue(option.value))} + title={option.name} + multiple + /> + ))} + + + ) : ( +

No matches found

+ )} +
+ )} + + ); +}); diff --git a/web/components/inbox/inbox-filter/filters/filter-selection.tsx b/web/components/inbox/inbox-filter/filters/filter-selection.tsx new file mode 100644 index 0000000000..46f959a2d0 --- /dev/null +++ b/web/components/inbox/inbox-filter/filters/filter-selection.tsx @@ -0,0 +1,87 @@ +import { FC, useState } from "react"; +import { observer } from "mobx-react"; +import { Search, X } from "lucide-react"; +// components +import { + FilterStatus, + FilterPriority, + FilterMember, + FilterDate, + FilterLabels, +} from "@/components/inbox/inbox-filter/filters"; +// hooks +import { useMember, useLabel } from "@/hooks/store"; + +export const InboxIssueFilterSelection: FC = observer(() => { + // hooks + const { + project: { projectMemberIds }, + } = useMember(); + const { projectLabels } = useLabel(); + // states + const [filtersSearchQuery, setFiltersSearchQuery] = useState(""); + + return ( +
+
+
+ + setFiltersSearchQuery(e.target.value)} + autoFocus + /> + {filtersSearchQuery !== "" && ( + + )} +
+
+ +
+ {/* status */} +
+ +
+ {/* Priority */} +
+ +
+ {/* assignees */} +
+ +
+ {/* Created By */} +
+ +
+ {/* Labels */} +
+ +
+ {/* Created at */} +
+ +
+ {/* Updated at */} +
+ +
+
+
+ ); +}); diff --git a/web/components/inbox/inbox-filter/filters/index.ts b/web/components/inbox/inbox-filter/filters/index.ts new file mode 100644 index 0000000000..a389dda9d2 --- /dev/null +++ b/web/components/inbox/inbox-filter/filters/index.ts @@ -0,0 +1,6 @@ +export * from "./filter-selection"; +export * from "./status"; +export * from "./priority"; +export * from "./labels"; +export * from "./members"; +export * from "./date"; diff --git a/web/components/inbox/inbox-filter/filters/labels.tsx b/web/components/inbox/inbox-filter/filters/labels.tsx new file mode 100644 index 0000000000..cf55623c8a --- /dev/null +++ b/web/components/inbox/inbox-filter/filters/labels.tsx @@ -0,0 +1,88 @@ +import { FC, useState } from "react"; +import { observer } from "mobx-react"; +import { IIssueLabel } from "@plane/types"; +import { Loader } from "@plane/ui"; +// components +import { FilterHeader, FilterOption } from "@/components/issues"; +// hooks +import { useProjectInbox } from "@/hooks/store"; + +const LabelIcons = ({ color }: { color: string }) => ( + +); + +type Props = { + labels: IIssueLabel[] | undefined; + searchQuery: string; +}; + +export const FilterLabels: FC = observer((props) => { + const { labels, searchQuery } = props; + + const [itemsToRender, setItemsToRender] = useState(5); + const [previewEnabled, setPreviewEnabled] = useState(true); + + const { inboxFilters, handleInboxIssueFilters } = useProjectInbox(); + + const filterValue = inboxFilters?.label || []; + + const appliedFiltersCount = filterValue?.length ?? 0; + + const filteredOptions = labels?.filter((label) => label.name.toLowerCase().includes(searchQuery.toLowerCase())); + + const handleViewToggle = () => { + if (!filteredOptions) return; + + if (itemsToRender === filteredOptions.length) setItemsToRender(5); + else setItemsToRender(filteredOptions.length); + }; + + const handleFilterValue = (value: string): string[] => + filterValue?.includes(value) ? filterValue.filter((v) => v !== value) : [...filterValue, value]; + + return ( + <> + 0 ? ` (${appliedFiltersCount})` : ""}`} + isPreviewEnabled={previewEnabled} + handleIsPreviewEnabled={() => setPreviewEnabled(!previewEnabled)} + /> + {previewEnabled && ( +
+ {filteredOptions ? ( + filteredOptions.length > 0 ? ( + <> + {filteredOptions.slice(0, itemsToRender).map((label) => ( + handleInboxIssueFilters("label", handleFilterValue(label.id))} + icon={} + title={label.name} + /> + ))} + {filteredOptions.length > 5 && ( + + )} + + ) : ( +

No matches found

+ ) + ) : ( + + + + + + )} +
+ )} + + ); +}); diff --git a/web/components/inbox/inbox-filter/filters/members.tsx b/web/components/inbox/inbox-filter/filters/members.tsx new file mode 100644 index 0000000000..f2776104bd --- /dev/null +++ b/web/components/inbox/inbox-filter/filters/members.tsx @@ -0,0 +1,102 @@ +import { FC, useMemo, useState } from "react"; +import sortBy from "lodash/sortBy"; +import { observer } from "mobx-react"; +import { TInboxIssueFilterMemberKeys } from "@plane/types"; +import { Avatar, Loader } from "@plane/ui"; +// components +import { FilterHeader, FilterOption } from "@/components/issues"; +// hooks +import { useMember, useProjectInbox } from "@/hooks/store"; + +type Props = { + filterKey: TInboxIssueFilterMemberKeys; + label?: string; + memberIds: string[] | undefined; + searchQuery: string; +}; + +export const FilterMember: FC = observer((props: Props) => { + const { filterKey, label = "Members", memberIds, searchQuery } = props; + // hooks + const { inboxFilters, handleInboxIssueFilters } = useProjectInbox(); + const { getUserDetails } = useMember(); + // states + const [itemsToRender, setItemsToRender] = useState(5); + const [previewEnabled, setPreviewEnabled] = useState(true); + // derived values + const filterValue = inboxFilters?.[filterKey] || []; + const appliedFiltersCount = filterValue?.length ?? 0; + + const sortedOptions = useMemo(() => { + const filteredOptions = (memberIds || []).filter((memberId) => + getUserDetails(memberId)?.display_name.toLowerCase().includes(searchQuery.toLowerCase()) + ); + + return sortBy(filteredOptions, [ + (memberId) => !filterValue.includes(memberId), + (memberId) => getUserDetails(memberId)?.display_name.toLowerCase(), + ]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [searchQuery]); + + const handleViewToggle = () => { + if (!sortedOptions) return; + + if (itemsToRender === sortedOptions.length) setItemsToRender(5); + else setItemsToRender(sortedOptions.length); + }; + + const handleFilterValue = (value: string): string[] => + filterValue?.includes(value) ? filterValue.filter((v) => v !== value) : [...filterValue, value]; + + return ( + <> + 0 ? ` (${appliedFiltersCount})` : ""}`} + isPreviewEnabled={previewEnabled} + handleIsPreviewEnabled={() => setPreviewEnabled(!previewEnabled)} + /> + {previewEnabled && ( +
+ {sortedOptions ? ( + sortedOptions.length > 0 ? ( + <> + {sortedOptions.slice(0, itemsToRender).map((memberId) => { + const member = getUserDetails(memberId); + + if (!member) return null; + return ( + handleInboxIssueFilters(filterKey, handleFilterValue(member.id))} + icon={} + title={member.display_name} + /> + ); + })} + {sortedOptions.length > 5 && ( + + )} + + ) : ( +

No matches found

+ ) + ) : ( + + + + + + )} +
+ )} + + ); +}); diff --git a/web/components/inbox/inbox-filter/filters/priority.tsx b/web/components/inbox/inbox-filter/filters/priority.tsx new file mode 100644 index 0000000000..0639623e42 --- /dev/null +++ b/web/components/inbox/inbox-filter/filters/priority.tsx @@ -0,0 +1,56 @@ +import { FC, useState } from "react"; +import { observer } from "mobx-react"; +import { TIssuePriorities } from "@plane/types"; +import { PriorityIcon } from "@plane/ui"; +// components +import { FilterHeader, FilterOption } from "@/components/issues"; +// constants +import { ISSUE_PRIORITIES } from "@/constants/issue"; +// hooks +import { useProjectInbox } from "@/hooks/store/use-project-inbox"; + +type Props = { + searchQuery: string; +}; + +export const FilterPriority: FC = observer((props) => { + const { searchQuery } = props; + // hooks + const { inboxFilters, handleInboxIssueFilters } = useProjectInbox(); + // states + const [previewEnabled, setPreviewEnabled] = useState(true); + // derived values + const filterValue = inboxFilters?.priority || []; + const appliedFiltersCount = filterValue?.length ?? 0; + const filteredOptions = ISSUE_PRIORITIES.filter((p) => p.key.includes(searchQuery.toLowerCase())); + + const handleFilterValue = (value: TIssuePriorities): TIssuePriorities[] => + filterValue?.includes(value) ? filterValue.filter((v) => v !== value) : [...filterValue, value]; + + return ( + <> + 0 ? ` (${appliedFiltersCount})` : ""}`} + isPreviewEnabled={previewEnabled} + handleIsPreviewEnabled={() => setPreviewEnabled(!previewEnabled)} + /> + {previewEnabled && ( +
+ {filteredOptions.length > 0 ? ( + filteredOptions.map((priority) => ( + handleInboxIssueFilters("priority", handleFilterValue(priority.key))} + icon={} + title={priority.title} + /> + )) + ) : ( +

No matches found

+ )} +
+ )} + + ); +}); diff --git a/web/components/inbox/inbox-filter/filters/status.tsx b/web/components/inbox/inbox-filter/filters/status.tsx new file mode 100644 index 0000000000..ca79d882ff --- /dev/null +++ b/web/components/inbox/inbox-filter/filters/status.tsx @@ -0,0 +1,68 @@ +import { FC, useState } from "react"; +import { observer } from "mobx-react"; +// types +import { TInboxIssueStatus } from "@plane/types"; +// components +import { FilterHeader, FilterOption } from "@/components/issues"; +// constants +import { INBOX_STATUS } from "@/constants/inbox"; +// hooks +import { useProjectInbox } from "@/hooks/store/use-project-inbox"; + +type Props = { + searchQuery: string; +}; + +export const FilterStatus: FC = observer((props) => { + const { searchQuery } = props; + // hooks + const { currentTab, inboxFilters, handleInboxIssueFilters } = useProjectInbox(); + // states + const [previewEnabled, setPreviewEnabled] = useState(true); + // derived values + const filterValue = inboxFilters?.status || []; + const appliedFiltersCount = filterValue?.length ?? 0; + const filteredOptions = INBOX_STATUS.filter( + (s) => + ((currentTab === "open" && [-2].includes(s.status)) || + (currentTab === "closed" && [-1, 0, 1, 2].includes(s.status))) && + s.key.includes(searchQuery.toLowerCase()) + ); + + const handleFilterValue = (value: TInboxIssueStatus): TInboxIssueStatus[] => + filterValue?.includes(value) ? filterValue.filter((v) => v !== value) : [...filterValue, value]; + + const handleStatusFilterSelect = (status: TInboxIssueStatus) => { + if (currentTab === "closed") { + const selectedStatus = handleFilterValue(status); + if (selectedStatus.length >= 1) handleInboxIssueFilters("status", selectedStatus); + } + }; + + return ( + <> + 0 ? ` (${appliedFiltersCount})` : ""}`} + isPreviewEnabled={previewEnabled} + handleIsPreviewEnabled={() => setPreviewEnabled(!previewEnabled)} + /> + {previewEnabled && ( +
+ {filteredOptions.length > 0 ? ( + filteredOptions.map((status) => ( + handleStatusFilterSelect(status.status)} + icon={} + title={status.title} + /> + )) + ) : ( +

No matches found

+ )} +
+ )} + + ); +}); diff --git a/web/components/inbox/inbox-filter/index.ts b/web/components/inbox/inbox-filter/index.ts new file mode 100644 index 0000000000..20ec09a357 --- /dev/null +++ b/web/components/inbox/inbox-filter/index.ts @@ -0,0 +1,4 @@ +export * from "./root"; +export * from "./filters"; +export * from "./sorting"; +export * from "./applied-filters"; diff --git a/web/components/inbox/inbox-filter/root.tsx b/web/components/inbox/inbox-filter/root.tsx new file mode 100644 index 0000000000..b3a2dc2c40 --- /dev/null +++ b/web/components/inbox/inbox-filter/root.tsx @@ -0,0 +1,18 @@ +import { FC } from "react"; +import { ListFilter } from "lucide-react"; +// components +import { InboxIssueFilterSelection, InboxIssueOrderByDropdown } from "@/components/inbox/inbox-filter"; +import { FiltersDropdown } from "@/components/issues"; + +export const FiltersRoot: FC = () => ( +
+
+ } title="Filters" placement="bottom-end"> + + +
+
+ +
+
+); diff --git a/web/components/inbox/inbox-filter/sorting/index.ts b/web/components/inbox/inbox-filter/sorting/index.ts new file mode 100644 index 0000000000..d6db844ce3 --- /dev/null +++ b/web/components/inbox/inbox-filter/sorting/index.ts @@ -0,0 +1 @@ +export * from "./order-by"; diff --git a/web/components/inbox/inbox-filter/sorting/order-by.tsx b/web/components/inbox/inbox-filter/sorting/order-by.tsx new file mode 100644 index 0000000000..c01c9977ea --- /dev/null +++ b/web/components/inbox/inbox-filter/sorting/order-by.tsx @@ -0,0 +1,58 @@ +import { FC } from "react"; +import { observer } from "mobx-react"; +import { ArrowDownWideNarrow, ArrowUpWideNarrow, Check, ChevronDown } from "lucide-react"; +import { CustomMenu, getButtonStyling } from "@plane/ui"; +// constants +import { INBOX_ISSUE_ORDER_BY_OPTIONS, INBOX_ISSUE_SORT_BY_OPTIONS } from "@/constants/inbox"; +// helpers +import { cn } from "@/helpers/common.helper"; +// hooks +import { useProjectInbox } from "@/hooks/store"; + +export const InboxIssueOrderByDropdown: FC = observer(() => { + // hooks + const { inboxSorting, handleInboxIssueSorting } = useProjectInbox(); + const orderByDetails = + INBOX_ISSUE_ORDER_BY_OPTIONS.find((option) => inboxSorting?.order_by?.includes(option.key)) || undefined; + + return ( + + {inboxSorting?.sort_by === "asc" ? ( + + ) : ( + + )} + {orderByDetails?.label || "Order By"} + +
+ } + placement="bottom-end" + maxHeight="lg" + closeOnSelect + > + {INBOX_ISSUE_ORDER_BY_OPTIONS.map((option) => ( + handleInboxIssueSorting("order_by", option.key)} + > + {option.label} + {inboxSorting?.order_by?.includes(option.key) && } + + ))} +
+ {INBOX_ISSUE_SORT_BY_OPTIONS.map((option) => ( + handleInboxIssueSorting("sort_by", option.key)} + > + {option.label} + {inboxSorting?.sort_by?.includes(option.key) && } + + ))} + + ); +}); diff --git a/web/components/inbox/inbox-issue-actions.tsx b/web/components/inbox/inbox-issue-actions.tsx deleted file mode 100644 index 4c8a21592d..0000000000 --- a/web/components/inbox/inbox-issue-actions.tsx +++ /dev/null @@ -1,364 +0,0 @@ -import { FC, useCallback, useEffect, useMemo, useState } from "react"; -import { observer } from "mobx-react-lite"; -import { useRouter } from "next/router"; -import { DayPicker } from "react-day-picker"; -import { CheckCircle2, ChevronDown, ChevronUp, Clock, FileStack, Trash2, XCircle } from "lucide-react"; -import { Popover } from "@headlessui/react"; -// icons -import type { TInboxDetailedStatus } from "@plane/types"; -// ui -import { Button, TOAST_TYPE, setToast } from "@plane/ui"; -// components -import { - AcceptIssueModal, - DeclineIssueModal, - DeleteInboxIssueModal, - SelectDuplicateInboxIssueModal, -} from "@/components/inbox"; -import { ISSUE_DELETED } from "@/constants/event-tracker"; -import { EUserProjectRoles } from "@/constants/project"; -// hooks -import { getDate } from "@/helpers/date-time.helper"; -import { useUser, useInboxIssues, useIssueDetail, useWorkspace, useEventTracker } from "@/hooks/store"; -// types -//helpers - -type TInboxIssueActionsHeader = { - workspaceSlug: string; - projectId: string; - inboxId: string; - inboxIssueId: string | undefined; -}; - -type TInboxIssueOperations = { - updateInboxIssueStatus: (data: TInboxDetailedStatus) => Promise; - removeInboxIssue: () => Promise; -}; - -export const InboxIssueActionsHeader: FC = observer((props) => { - const { workspaceSlug, projectId, inboxId, inboxIssueId } = props; - // router - const router = useRouter(); - // hooks - const { captureIssueEvent } = useEventTracker(); - const { currentWorkspace } = useWorkspace(); - const { - issues: { getInboxIssuesByInboxId, getInboxIssueByIssueId, updateInboxIssueStatus, removeInboxIssue }, - } = useInboxIssues(); - const { - issue: { getIssueById }, - } = useIssueDetail(); - const { - currentUser, - membership: { currentProjectRole }, - } = useUser(); - - // states - const [date, setDate] = useState(new Date()); - const [selectDuplicateIssue, setSelectDuplicateIssue] = useState(false); - const [acceptIssueModal, setAcceptIssueModal] = useState(false); - const [declineIssueModal, setDeclineIssueModal] = useState(false); - const [deleteIssueModal, setDeleteIssueModal] = useState(false); - - // derived values - const inboxIssues = getInboxIssuesByInboxId(inboxId); - const issueStatus = (inboxIssueId && inboxId && getInboxIssueByIssueId(inboxId, inboxIssueId)) || undefined; - const issue = (inboxIssueId && getIssueById(inboxIssueId)) || undefined; - - const currentIssueIndex = inboxIssues?.findIndex((issue) => issue === inboxIssueId) ?? 0; - - const inboxIssueOperations: TInboxIssueOperations = useMemo( - () => ({ - updateInboxIssueStatus: async (data: TInboxDetailedStatus) => { - try { - if (!workspaceSlug || !projectId || !inboxId || !inboxIssueId) throw new Error("Missing required parameters"); - await updateInboxIssueStatus(workspaceSlug, projectId, inboxId, inboxIssueId, data); - } catch (error) { - setToast({ - type: TOAST_TYPE.ERROR, - title: "Error!", - message: "Something went wrong while updating inbox status. Please try again.", - }); - } - }, - removeInboxIssue: async () => { - try { - if (!workspaceSlug || !projectId || !inboxId || !inboxIssueId || !currentWorkspace) - throw new Error("Missing required parameters"); - await removeInboxIssue(workspaceSlug, projectId, inboxId, inboxIssueId); - captureIssueEvent({ - eventName: ISSUE_DELETED, - payload: { - id: inboxIssueId, - state: "SUCCESS", - element: "Inbox page", - }, - }); - router.push({ - pathname: `/${workspaceSlug}/projects/${projectId}/inbox/${inboxId}`, - }); - } catch (error) { - setToast({ - type: TOAST_TYPE.ERROR, - title: "Error!", - message: "Something went wrong while deleting inbox issue. Please try again.", - }); - captureIssueEvent({ - eventName: ISSUE_DELETED, - payload: { - id: inboxIssueId, - state: "FAILED", - element: "Inbox page", - }, - }); - } - }, - }), - [ - currentWorkspace, - workspaceSlug, - projectId, - inboxId, - inboxIssueId, - updateInboxIssueStatus, - removeInboxIssue, - captureIssueEvent, - router, - ] - ); - - const handleInboxIssueNavigation = useCallback( - (direction: "next" | "prev") => { - if (!inboxIssues || !inboxIssueId) return; - const activeElement = document.activeElement as HTMLElement; - if (activeElement && (activeElement.classList.contains("tiptap") || activeElement.id === "title-input")) return; - const nextIssueIndex = - direction === "next" - ? (currentIssueIndex + 1) % inboxIssues.length - : (currentIssueIndex - 1 + inboxIssues.length) % inboxIssues.length; - const nextIssueId = inboxIssues[nextIssueIndex]; - if (!nextIssueId) return; - router.push({ - pathname: `/${workspaceSlug}/projects/${projectId}/inbox/${inboxId}`, - query: { - inboxIssueId: nextIssueId, - }, - }); - }, - [workspaceSlug, projectId, inboxId, inboxIssues, inboxIssueId, currentIssueIndex, router] - ); - - const onKeyDown = useCallback( - (e: KeyboardEvent) => { - if (e.key === "ArrowUp") { - handleInboxIssueNavigation("prev"); - } else if (e.key === "ArrowDown") { - handleInboxIssueNavigation("next"); - } - }, - [handleInboxIssueNavigation] - ); - - useEffect(() => { - document.addEventListener("keydown", onKeyDown); - - return () => { - document.removeEventListener("keydown", onKeyDown); - }; - }, [onKeyDown]); - - const isAllowed = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; - - const today = new Date(); - const tomorrow = getDate(today); - tomorrow?.setDate(today.getDate() + 1); - useEffect(() => { - if (!issueStatus || !issueStatus.snoozed_till) return; - setDate(issueStatus.snoozed_till); - }, [issueStatus]); - - if (!issueStatus || !issue || !inboxIssues) return <>; - return ( - <> - {issue && ( - <> - setSelectDuplicateIssue(false)} - value={issueStatus.duplicate_to} - onSubmit={(dupIssueId) => { - inboxIssueOperations - .updateInboxIssueStatus({ - status: 2, - duplicate_to: dupIssueId, - }) - .finally(() => setSelectDuplicateIssue(false)); - }} - /> - - setAcceptIssueModal(false)} - onSubmit={async () => { - await inboxIssueOperations - .updateInboxIssueStatus({ - status: 1, - }) - .finally(() => setAcceptIssueModal(false)); - }} - /> - - setDeclineIssueModal(false)} - onSubmit={async () => { - await inboxIssueOperations - .updateInboxIssueStatus({ - status: -1, - }) - .finally(() => setDeclineIssueModal(false)); - }} - /> - - setDeleteIssueModal(false)} - onSubmit={async () => { - await inboxIssueOperations.removeInboxIssue().finally(() => setDeclineIssueModal(false)); - }} - /> - - )} - - {inboxIssueId && ( -
-
- - -
- {currentIssueIndex + 1}/{inboxIssues?.length ?? 0} -
-
- -
- {isAllowed && (issueStatus.status === 0 || issueStatus.status === -2) && ( -
- - - - - - {({ close }) => ( -
- { - if (!date) return; - setDate(date); - }} - mode="single" - className="border border-custom-border-200 rounded-md p-3" - disabled={ - tomorrow - ? [ - { - before: tomorrow, - }, - ] - : undefined - } - /> - -
- )} -
-
-
- )} - - {isAllowed && issueStatus.status === -2 && ( -
- -
- )} - - {isAllowed && (issueStatus.status === 0 || issueStatus.status === -2) && ( -
- -
- )} - - {isAllowed && issueStatus.status === -2 && ( -
- -
- )} - - {(isAllowed || currentUser?.id === issue?.created_by) && ( -
- -
- )} -
-
- )} - - ); -}); diff --git a/web/components/inbox/inbox-issue-status.tsx b/web/components/inbox/inbox-issue-status.tsx index 701feff6ba..e230b02d55 100644 --- a/web/components/inbox/inbox-issue-status.tsx +++ b/web/components/inbox/inbox-issue-status.tsx @@ -1,56 +1,45 @@ import React from "react"; import { observer } from "mobx-react"; -// hooks -import { INBOX_STATUS } from "@/constants/inbox"; -import { useInboxIssues } from "@/hooks/store"; // constants +import { INBOX_STATUS } from "@/constants/inbox"; +// helpers +import { cn } from "@/helpers/common.helper"; +// store +import { IInboxIssueStore } from "@/store/inbox/inbox-issue.store"; type Props = { - workspaceSlug: string; - projectId: string; - inboxId: string; - issueId: string; + inboxIssue: IInboxIssueStore; iconSize?: number; showDescription?: boolean; }; export const InboxIssueStatus: React.FC = observer((props) => { - const { workspaceSlug, projectId, inboxId, issueId, iconSize = 18, showDescription = false } = props; - // hooks - const { - issues: { getInboxIssueByIssueId }, - } = useInboxIssues(); - - const inboxIssueDetail = getInboxIssueByIssueId(inboxId, issueId); - if (!inboxIssueDetail) return <>; - - const inboxIssueStatusDetail = INBOX_STATUS.find((s) => s.status === inboxIssueDetail.status); + const { inboxIssue, iconSize = 16, showDescription = false } = props; + // derived values + const inboxIssueStatusDetail = INBOX_STATUS.find((s) => s.status === inboxIssue.status); if (!inboxIssueStatusDetail) return <>; - const isSnoozedDatePassed = - inboxIssueDetail.status === 0 && !!inboxIssueDetail.snoozed_till && inboxIssueDetail.snoozed_till < new Date(); + const isSnoozedDatePassed = inboxIssue.status === 0 && new Date(inboxIssue.snoozed_till ?? "") < new Date(); + + const description = inboxIssueStatusDetail.description(new Date(inboxIssue.snoozed_till ?? "")); return (
- - {showDescription ? ( - inboxIssueStatusDetail.description( - workspaceSlug, - projectId, - inboxIssueDetail.duplicate_to ?? "", - inboxIssueDetail.snoozed_till - ) - ) : ( - {inboxIssueStatusDetail.title} + className={cn( + `relative flex flex-col gap-1 p-1.5 py-0.5 rounded ${inboxIssueStatusDetail.textColor( + isSnoozedDatePassed + )} ${inboxIssueStatusDetail.bgColor(isSnoozedDatePassed)}` )} + > +
+ +
+ {inboxIssue?.status === 0 && inboxIssue?.snoozed_till + ? inboxIssueStatusDetail.description(inboxIssue?.snoozed_till) + : inboxIssueStatusDetail.title} +
+
+ {showDescription &&
{description}
}
); }); diff --git a/web/components/inbox/index.ts b/web/components/inbox/index.ts index bc8be5506f..8b05b565ff 100644 --- a/web/components/inbox/index.ts +++ b/web/components/inbox/index.ts @@ -1,14 +1,6 @@ +export * from "./root"; export * from "./modals"; - -export * from "./inbox-issue-actions"; +export * from "./sidebar"; +export * from "./inbox-filter"; +export * from "./content"; export * from "./inbox-issue-status"; - -export * from "./content/root"; - -export * from "./sidebar/root"; - -export * from "./sidebar/filter/filter-selection"; -export * from "./sidebar/filter/applied-filters"; - -export * from "./sidebar/inbox-list"; -export * from "./sidebar/inbox-list-item"; diff --git a/web/components/inbox/modals/accept-issue-modal.tsx b/web/components/inbox/modals/accept-issue-modal.tsx index d8ccb68b62..080563505f 100644 --- a/web/components/inbox/modals/accept-issue-modal.tsx +++ b/web/components/inbox/modals/accept-issue-modal.tsx @@ -5,11 +5,11 @@ import type { TIssue } from "@plane/types"; // icons // ui import { Button } from "@plane/ui"; -// types +// hooks import { useProject } from "@/hooks/store"; type Props = { - data: TIssue; + data: Partial; isOpen: boolean; onClose: () => void; onSubmit: () => Promise; @@ -70,7 +70,8 @@ export const AcceptIssueModal: React.FC = ({ isOpen, onClose, data, onSub

Are you sure you want to accept issue{" "} - {getProjectById(data?.project_id)?.identifier}-{data?.sequence_id} + {(data && data?.project_id && getProjectById(data?.project_id)?.identifier) || ""}- + {data?.sequence_id} {""}? Once accepted, this issue will be added to the project issues list.

diff --git a/web/components/inbox/modals/create-issue-modal.tsx b/web/components/inbox/modals/create-issue-modal.tsx index c32bcf8f4b..4c22f83480 100644 --- a/web/components/inbox/modals/create-issue-modal.tsx +++ b/web/components/inbox/modals/create-issue-modal.tsx @@ -1,24 +1,24 @@ import { Fragment, useRef, useState } from "react"; -import { observer } from "mobx-react-lite"; +import { observer } from "mobx-react"; import { useRouter } from "next/router"; import { Controller, useForm } from "react-hook-form"; import { Sparkle } from "lucide-react"; -import { Dialog, Transition } from "@headlessui/react"; +import { Transition, Dialog } from "@headlessui/react"; import { RichTextEditorWithRef } from "@plane/rich-text-editor"; +// types import { TIssue } from "@plane/types"; -// hooks +// ui import { Button, Input, ToggleSwitch, TOAST_TYPE, setToast } from "@plane/ui"; +// components import { GptAssistantPopover } from "@/components/core"; import { PriorityDropdown } from "@/components/dropdowns"; +// constants import { ISSUE_CREATED } from "@/constants/event-tracker"; -import { useApplication, useEventTracker, useWorkspace, useInboxIssues, useMention } from "@/hooks/store"; +// hooks +import { useApplication, useEventTracker, useWorkspace, useMention, useProjectInbox } from "@/hooks/store"; // services import { AIService } from "@/services/ai.service"; import { FileService } from "@/services/file.service"; -// components -// ui -// types -// constants type Props = { isOpen: boolean; @@ -26,10 +26,8 @@ type Props = { }; const defaultValues: Partial = { - project_id: "", name: "", description_html: "

", - parent_id: null, priority: "none", }; @@ -39,33 +37,27 @@ const fileService = new FileService(); export const CreateInboxIssueModal: React.FC = observer((props) => { const { isOpen, onClose } = props; + // router + const router = useRouter(); + const { workspaceSlug, projectId } = router.query; + if (!workspaceSlug || !projectId) return null; // states const [createMore, setCreateMore] = useState(false); const [gptAssistantModal, setGptAssistantModal] = useState(false); const [iAmFeelingLucky, setIAmFeelingLucky] = useState(false); // refs const editorRef = useRef(null); - // router - const router = useRouter(); - const { workspaceSlug, projectId, inboxId } = router.query as { - workspaceSlug: string; - projectId: string; - inboxId: string; - }; // hooks const { mentionHighlights, mentionSuggestions } = useMention(); const workspaceStore = useWorkspace(); const workspaceId = workspaceStore.getWorkspaceBySlug(workspaceSlug as string)?.id as string; - // store hooks - const { - issues: { createInboxIssue }, - } = useInboxIssues(); + const { createInboxIssue } = useProjectInbox(); const { config: { envConfig }, } = useApplication(); const { captureIssueEvent } = useEventTracker(); - + // form info const { control, formState: { errors, isSubmitting }, @@ -73,24 +65,26 @@ export const CreateInboxIssueModal: React.FC = observer((props) => { reset, watch, getValues, - } = useForm({ defaultValues }); + } = useForm>({ defaultValues }); + const issueName = watch("name"); const handleClose = () => { onClose(); reset(defaultValues); + editorRef?.current?.clearEditor(); }; - const issueName = watch("name"); - const handleFormSubmit = async (formData: Partial) => { - if (!workspaceSlug || !projectId || !inboxId) return; - - await createInboxIssue(workspaceSlug.toString(), projectId.toString(), inboxId.toString(), formData) + if (!workspaceSlug || !projectId) return; + await createInboxIssue(workspaceSlug.toString(), projectId.toString(), formData) .then((res) => { if (!createMore) { - router.push(`/${workspaceSlug}/projects/${projectId}/inbox/${inboxId}?inboxIssueId=${res.id}`); + router.push(`/${workspaceSlug}/projects/${projectId}/inbox/?inboxIssueId=${res?.issue?.id}`); handleClose(); - } else reset(defaultValues); + } else { + reset(defaultValues); + editorRef?.current?.clearEditor(); + } captureIssueEvent({ eventName: ISSUE_CREATED, payload: { @@ -117,11 +111,11 @@ export const CreateInboxIssueModal: React.FC = observer((props) => { const handleAiAssistance = async (response: string) => { if (!workspaceSlug || !projectId) return; - editorRef.current?.setEditorValueAtCursorPosition(response); }; const handleAutoGenerateDescription = async () => { + const issueName = getValues("name"); if (!workspaceSlug || !projectId || !issueName) return; setIAmFeelingLucky(true); @@ -220,7 +214,7 @@ export const CreateInboxIssueModal: React.FC = observer((props) => {
- {issueName && issueName !== "" && ( + {watch("name") && issueName !== "" && ( +
+ + +
+
+ + + ); +}; diff --git a/web/components/inbox/root.tsx b/web/components/inbox/root.tsx new file mode 100644 index 0000000000..f74fd5780f --- /dev/null +++ b/web/components/inbox/root.tsx @@ -0,0 +1,68 @@ +import { FC } from "react"; +import { observer } from "mobx-react"; +import useSWR from "swr"; +import { Inbox } from "lucide-react"; +// components +import { EmptyState } from "@/components/empty-state"; +import { InboxSidebar, InboxContentRoot } from "@/components/inbox"; +import { InboxLayoutLoader } from "@/components/ui"; +// constants +import { EmptyStateType } from "@/constants/empty-state"; +// hooks +import { useProjectInbox } from "@/hooks/store"; + +type TInboxIssueRoot = { + workspaceSlug: string; + projectId: string; + inboxIssueId: string | undefined; + inboxAccessible: boolean; +}; + +export const InboxIssueRoot: FC = observer((props) => { + const { workspaceSlug, projectId, inboxIssueId, inboxAccessible } = props; + // hooks + const { isLoading, error, fetchInboxIssues } = useProjectInbox(); + + useSWR( + inboxAccessible && workspaceSlug && projectId ? `PROJECT_INBOX_ISSUES_${workspaceSlug}_${projectId}` : null, + () => { + inboxAccessible && workspaceSlug && projectId && fetchInboxIssues(workspaceSlug.toString(), projectId.toString()); + }, + { revalidateOnFocus: false } + ); + + // loader + if (isLoading === "init-loading") + return ( +
+ +
+ ); + + // error + if (error && error?.status === "init-error") + return ( +
+ +
{error?.message}
+
+ ); + + return ( +
+ + + {inboxIssueId ? ( + + ) : ( +
+ +
+ )} +
+ ); +}); diff --git a/web/components/inbox/sidebar/filter/applied-filters.tsx b/web/components/inbox/sidebar/filter/applied-filters.tsx deleted file mode 100644 index 4569cf5777..0000000000 --- a/web/components/inbox/sidebar/filter/applied-filters.tsx +++ /dev/null @@ -1,171 +0,0 @@ -import { FC } from "react"; -import { observer } from "mobx-react-lite"; -// mobx store -// icons -import { X } from "lucide-react"; -import { TInboxIssueFilterOptions, TIssuePriorities } from "@plane/types"; -import { PriorityIcon } from "@plane/ui"; -// helpers -import { INBOX_STATUS } from "@/constants/inbox"; -import { replaceUnderscoreIfSnakeCase } from "@/helpers/string.helper"; -// types -import { useInboxIssues } from "@/hooks/store"; -// constants - -type TInboxIssueAppliedFilter = { workspaceSlug: string; projectId: string; inboxId: string }; - -export const IssueStatusLabel = ({ status }: { status: number }) => { - const issueStatusDetail = INBOX_STATUS.find((s) => s.status === status); - - if (!issueStatusDetail) return <>; - - return ( -
-
- -
-
{issueStatusDetail.title}
-
- ); -}; - -export const InboxIssueAppliedFilter: FC = observer((props) => { - const { workspaceSlug, projectId, inboxId } = props; - // hooks - const { - filters: { inboxFilters, updateInboxFilters }, - } = useInboxIssues(); - - const filters = inboxFilters?.filters; - - const handleUpdateFilter = (filter: Partial) => { - if (!workspaceSlug || !projectId || !inboxId) return; - updateInboxFilters(workspaceSlug.toString(), projectId.toString(), inboxId.toString(), filter); - }; - - const handleClearAllFilters = () => { - const newFilters: TInboxIssueFilterOptions = { priority: [], inbox_status: [] }; - updateInboxFilters(workspaceSlug.toString(), projectId.toString(), inboxId.toString(), newFilters); - }; - - let filtersLength = 0; - Object.keys(filters ?? {}).forEach((key) => { - const filterKey = key as keyof TInboxIssueFilterOptions; - if (filters?.[filterKey] && Array.isArray(filters[filterKey])) filtersLength += (filters[filterKey] ?? []).length; - }); - - if (!filters || filtersLength <= 0) return <>; - return ( -
- {Object.keys(filters).map((key) => { - const filterKey = key as keyof TInboxIssueFilterOptions; - - if (filters[filterKey].length > 0) - return ( -
- {replaceUnderscoreIfSnakeCase(key)}: - {filters[filterKey]?.length < 0 ? ( - None - ) : ( -
- {filterKey === "priority" ? ( -
- {filters.priority?.map((priority) => ( -
-
-
- -
-
{priority}
-
- -
- ))} - -
- ) : filterKey === "inbox_status" ? ( -
- {filters.inbox_status?.map((status) => ( -
- - -
- ))} - -
- ) : ( - (filters[filterKey] as any)?.join(", ") - )} -
- )} -
- ); - })} - -
- ); -}); diff --git a/web/components/inbox/sidebar/filter/filter-selection.tsx b/web/components/inbox/sidebar/filter/filter-selection.tsx deleted file mode 100644 index fc9dc20eb6..0000000000 --- a/web/components/inbox/sidebar/filter/filter-selection.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import { FC } from "react"; -import { observer } from "mobx-react-lite"; -import { useRouter } from "next/router"; -import { TInboxIssueFilterOptions } from "@plane/types"; -// mobx store -// ui -// icons -import { PriorityIcon } from "@plane/ui"; -import { MultiLevelDropdown } from "@/components/ui"; -// types -// constants -import { INBOX_STATUS } from "@/constants/inbox"; -import { ISSUE_PRIORITIES } from "@/constants/issue"; -import { useInboxIssues } from "@/hooks/store"; - -type TInboxIssueFilterSelection = { workspaceSlug: string; projectId: string; inboxId: string }; - -export const InboxIssueFilterSelection: FC = observer((props) => { - const { workspaceSlug, projectId, inboxId } = props; - // router - const router = useRouter(); - const { inboxIssueId } = router.query; - // hooks - const { - filters: { inboxFilters, updateInboxFilters }, - } = useInboxIssues(); - - const filters = inboxFilters?.filters; - - let filtersLength = 0; - Object.keys(filters ?? {}).forEach((key) => { - const filterKey = key as keyof TInboxIssueFilterOptions; - if (filters?.[filterKey] && Array.isArray(filters[filterKey])) filtersLength += (filters[filterKey] ?? []).length; - }); - - return ( -
- { - if (!workspaceSlug || !projectId || !inboxId) return; - - const key = option.key as keyof TInboxIssueFilterOptions; - const currentValue: any[] = filters?.[key] ?? []; - - const valueExists = currentValue.includes(option.value); - - if (valueExists) - updateInboxFilters(workspaceSlug.toString(), projectId.toString(), inboxId.toString(), { - [option.key]: currentValue.filter((val) => val !== option.value), - }); - else - updateInboxFilters(workspaceSlug.toString(), projectId.toString(), inboxId.toString(), { - [option.key]: [...currentValue, option.value], - }); - - if (inboxIssueId) { - router.push({ - pathname: `/${workspaceSlug}/projects/${projectId}/inbox/${inboxId}`, - }); - } - }} - direction="right" - height="rg" - options={[ - { - id: "priority", - label: "Priority", - value: ISSUE_PRIORITIES.map((p) => p.key), - hasChildren: true, - children: ISSUE_PRIORITIES.map((priority) => ({ - id: priority.key, - label: ( -
- {priority.title ?? "None"} -
- ), - value: { - key: "priority", - value: priority.key, - }, - selected: filters?.priority?.includes(priority.key), - })), - }, - { - id: "inbox_status", - label: "Status", - value: INBOX_STATUS.map((status) => status.status), - hasChildren: true, - children: INBOX_STATUS.map((status) => ({ - id: status.status.toString(), - label: ( -
-
- -
-
{status.title}
-
- ), - value: { - key: "inbox_status", - value: status.status, - }, - selected: filters?.inbox_status?.includes(status.status), - })), - }, - ]} - /> - - {filtersLength > 0 && ( -
- {filtersLength} -
- )} -
- ); -}); diff --git a/web/components/inbox/sidebar/inbox-list-item.tsx b/web/components/inbox/sidebar/inbox-list-item.tsx index 792ade8608..262d1e6c09 100644 --- a/web/components/inbox/sidebar/inbox-list-item.tsx +++ b/web/components/inbox/sidebar/inbox-list-item.tsx @@ -1,49 +1,40 @@ -import { FC, useEffect } from "react"; +import { FC, MouseEvent, useEffect } from "react"; import { observer } from "mobx-react"; import Link from "next/link"; import { useRouter } from "next/router"; -// icons -import { CalendarDays } from "lucide-react"; -// hooks -// ui import { Tooltip, PriorityIcon } from "@plane/ui"; +// components +import { InboxIssueStatus } from "@/components/inbox"; // helpers -import { InboxIssueStatus } from "@/components/inbox/inbox-issue-status"; +import { cn } from "@/helpers/common.helper"; import { renderFormattedDate } from "@/helpers/date-time.helper"; -// components -import { useInboxIssues, useIssueDetail, useProject } from "@/hooks/store"; +// hooks +import { useLabel } from "@/hooks/store"; import { usePlatformOS } from "@/hooks/use-platform-os"; +// store +import { IInboxIssueStore } from "@/store/inbox/inbox-issue.store"; -type TInboxIssueListItem = { +type InboxIssueListItemProps = { workspaceSlug: string; projectId: string; - inboxId: string; - issueId: string; + projectIdentifier?: string; + inboxIssue: IInboxIssueStore; }; -export const InboxIssueListItem: FC = observer((props) => { - const { workspaceSlug, projectId, inboxId, issueId } = props; +export const InboxIssueListItem: FC = observer((props) => { + const { workspaceSlug, projectId, inboxIssue, projectIdentifier } = props; // router const router = useRouter(); const { inboxIssueId } = router.query; - // hooks - const { getProjectById } = useProject(); - const { - issues: { getInboxIssueByIssueId }, - } = useInboxIssues(); - const { - issue: { getIssueById }, - } = useIssueDetail(); + // store + const { projectLabels } = useLabel(); const { isMobile } = usePlatformOS(); - const inboxIssueDetail = getInboxIssueByIssueId(inboxId, issueId); - const issue = getIssueById(issueId); - - if (!issue || !inboxIssueDetail) return <>; + const issue = inboxIssue.issue; useEffect(() => { - if (issueId === inboxIssueId) { + if (issue.id === inboxIssueId) { setTimeout(() => { - const issueItemCard = document.getElementById(`inbox-issue-list-item-${issueId}`); + const issueItemCard = document.getElementById(`inbox-issue-list-item-${issue.id}`); if (issueItemCard) issueItemCard.scrollIntoView({ behavior: "smooth", @@ -51,52 +42,81 @@ export const InboxIssueListItem: FC = observer((props) => { }); }, 200); } - }, [issueId, inboxIssueId]); + }, [inboxIssueId, issue.id]); + + const handleIssueRedirection = (event: MouseEvent, currentIssueId: string | undefined) => { + if (inboxIssueId === currentIssueId) event.preventDefault(); + }; + if (!issue) return <>; return ( <> handleIssueRedirection(e, issue.id)} >
-
-
-

- {getProjectById(issue.project_id)?.identifier}-{issue.sequence_id} -

-
{issue.name}
-
-
- +
+
+
+ {projectIdentifier}-{issue.sequence_id} +
+ {inboxIssue.status !== -2 && }
+

{issue.name}

- - - -
- - {renderFormattedDate(issue.created_at ?? "")} -
+
{renderFormattedDate(issue.created_at ?? "")}
+ +
+ + {issue.priority && ( + + + + )} + + {issue.label_ids && issue.label_ids.length > 3 ? ( +
+ + {`${issue.label_ids.length} labels`} +
+ ) : ( + <> + {(issue.label_ids ?? []).map((labelId) => { + const labelDetails = projectLabels?.find((l) => l.id === labelId); + if (!labelDetails) return null; + return ( +
+ + {labelDetails.name} +
+ ); + })} + + )}
diff --git a/web/components/inbox/sidebar/inbox-list.tsx b/web/components/inbox/sidebar/inbox-list.tsx index 9d77f6baf0..e6f5362474 100644 --- a/web/components/inbox/sidebar/inbox-list.tsx +++ b/web/components/inbox/sidebar/inbox-list.tsx @@ -1,33 +1,33 @@ -import { FC } from "react"; +import { FC, Fragment } from "react"; import { observer } from "mobx-react"; -// hooks -import { useInboxIssues } from "@/hooks/store"; // components -import { InboxIssueListItem } from "../"; +import { InboxIssueListItem } from "@/components/inbox"; +// store +import { IInboxIssueStore } from "@/store/inbox/inbox-issue.store"; -type TInboxIssueList = { workspaceSlug: string; projectId: string; inboxId: string }; +export type InboxIssueListProps = { + workspaceSlug: string; + projectId: string; + projectIdentifier?: string; + inboxIssues: IInboxIssueStore[]; +}; -export const InboxIssueList: FC = observer((props) => { - const { workspaceSlug, projectId, inboxId } = props; - // hooks - const { - issues: { getInboxIssuesByInboxId }, - } = useInboxIssues(); +export const InboxIssueList: FC = observer((props) => { + const { workspaceSlug, projectId, projectIdentifier, inboxIssues } = props; - const inboxIssueIds = getInboxIssuesByInboxId(inboxId); - - if (!inboxIssueIds) return <>; return ( -
- {inboxIssueIds.map((issueId) => ( - + <> + {inboxIssues.map((inboxIssue) => ( + + + ))} -
+ ); }); diff --git a/web/components/inbox/sidebar/index.ts b/web/components/inbox/sidebar/index.ts new file mode 100644 index 0000000000..8a76734238 --- /dev/null +++ b/web/components/inbox/sidebar/index.ts @@ -0,0 +1,3 @@ +export * from "./root"; +export * from "./inbox-list"; +export * from "./inbox-list-item"; diff --git a/web/components/inbox/sidebar/root.tsx b/web/components/inbox/sidebar/root.tsx index cedddba25a..d1d08f017d 100644 --- a/web/components/inbox/sidebar/root.tsx +++ b/web/components/inbox/sidebar/root.tsx @@ -1,49 +1,143 @@ -import { FC } from "react"; +import { FC, useCallback, useRef } from "react"; import { observer } from "mobx-react"; -import { Inbox } from "lucide-react"; -// hooks -import { InboxSidebarLoader } from "@/components/ui"; -import { useInboxIssues } from "@/hooks/store"; -// ui +import { useRouter } from "next/router"; +import { TInboxIssueCurrentTab } from "@plane/types"; +import { Loader } from "@plane/ui"; // components -import { InboxIssueList, InboxIssueFilterSelection, InboxIssueAppliedFilter } from "../"; +import { EmptyState } from "@/components/empty-state"; +import { FiltersRoot, InboxIssueAppliedFilters, InboxIssueList } from "@/components/inbox"; +import { InboxSidebarLoader } from "@/components/ui"; +// constants +import { EmptyStateType } from "@/constants/empty-state"; +// helpers +import { cn } from "@/helpers/common.helper"; +// hooks +import { useProject, useProjectInbox } from "@/hooks/store"; +import { useIntersectionObserver } from "@/hooks/use-intersection-observer"; -type TInboxSidebarRoot = { +type IInboxSidebarProps = { workspaceSlug: string; projectId: string; - inboxId: string; }; -export const InboxSidebarRoot: FC = observer((props) => { - const { workspaceSlug, projectId, inboxId } = props; - // store hooks +const tabNavigationOptions: { key: TInboxIssueCurrentTab; label: string }[] = [ + { + key: "open", + label: "Open", + }, + { + key: "closed", + label: "Closed", + }, +]; + +export const InboxSidebar: FC = observer((props) => { + const { workspaceSlug, projectId } = props; + // ref + const containerRef = useRef(null); + const elementRef = useRef(null); + // store + const { currentProjectDetails } = useProject(); const { - issues: { loader }, - } = useInboxIssues(); + currentTab, + handleCurrentTab, + isLoading, + inboxIssuesArray, + inboxIssuePaginationInfo, + fetchInboxPaginationIssues, + getAppliedFiltersCount, + } = useProjectInbox(); + + const router = useRouter(); - if (loader === "init-loader") { - return ; - } + const fetchNextPages = useCallback(() => { + if (!workspaceSlug || !projectId) return; + fetchInboxPaginationIssues(workspaceSlug.toString(), projectId.toString()); + }, [workspaceSlug, projectId, fetchInboxPaginationIssues]); + // page observer + useIntersectionObserver({ + containerRef, + elementRef, + callback: fetchNextPages, + rootMargin: "20%", + }); return ( -
-
-
-
- +
+
+
+ {tabNavigationOptions.map((option) => ( +
{ + if (currentTab != option?.key) handleCurrentTab(option?.key); + router.push(`/${workspaceSlug}/projects/${projectId}/inbox`); + }} + > +
{option?.label}
+ {option?.key === "open" && currentTab === option?.key && ( +
+ {inboxIssuePaginationInfo?.total_results || 0} +
+ )} +
+
+ ))} +
+
-
- -
-
-
- -
+ -
- + {isLoading && !inboxIssuePaginationInfo?.next_page_results ? ( + + ) : ( +
+ {inboxIssuesArray.length > 0 ? ( + + ) : ( +
+ 0 + ? EmptyStateType.INBOX_SIDEBAR_FILTER_EMPTY_STATE + : currentTab === "open" + ? EmptyStateType.INBOX_SIDEBAR_OPEN_TAB + : EmptyStateType.INBOX_SIDEBAR_CLOSED_TAB + } + layout="screen-simple" + /> +
+ )} + +
+ {inboxIssuePaginationInfo?.next_page_results && ( + + + + + )} +
+
+ )}
); diff --git a/web/components/issues/index.ts b/web/components/issues/index.ts index d1695b7228..96136ccfe8 100644 --- a/web/components/issues/index.ts +++ b/web/components/issues/index.ts @@ -3,7 +3,8 @@ export * from "./issue-modal"; export * from "./delete-issue-modal"; export * from "./description-form"; export * from "./issue-layouts"; - +export * from "./description-input"; +export * from "./title-input"; export * from "./parent-issues-list-modal"; export * from "./label"; export * from "./confirm-issue-discard"; diff --git a/web/components/issues/issue-detail/inbox/index.ts b/web/components/issues/issue-detail/inbox/index.ts deleted file mode 100644 index 0c4adc7d0f..0000000000 --- a/web/components/issues/issue-detail/inbox/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./root"; -export * from "./main-content"; -export * from "./sidebar"; diff --git a/web/components/issues/issue-detail/inbox/main-content.tsx b/web/components/issues/issue-detail/inbox/main-content.tsx deleted file mode 100644 index 2bea576c41..0000000000 --- a/web/components/issues/issue-detail/inbox/main-content.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import { useEffect, useState } from "react"; -import { observer } from "mobx-react-lite"; -// hooks -import { StateGroupIcon } from "@plane/ui"; -import { IssueUpdateStatus, TIssueOperations } from "@/components/issues"; -import { useIssueDetail, useProjectState, useUser } from "@/hooks/store"; -import useReloadConfirmations from "@/hooks/use-reload-confirmation"; -// components -import { InboxIssueStatus } from "../../../inbox/inbox-issue-status"; -import { IssueDescriptionInput } from "../../description-input"; -import { IssueTitleInput } from "../../title-input"; -import { IssueActivity } from "../issue-activity"; -import { IssueReaction } from "../reactions"; -// ui - -type Props = { - workspaceSlug: string; - projectId: string; - inboxId: string; - issueId: string; - issueOperations: TIssueOperations; - is_editable: boolean; -}; - -export const InboxIssueMainContent: React.FC = observer((props) => { - const { workspaceSlug, projectId, inboxId, issueId, issueOperations, is_editable } = props; - // states - const [isSubmitting, setIsSubmitting] = useState<"submitting" | "submitted" | "saved">("saved"); - // hooks - const { currentUser } = useUser(); - const { projectStates } = useProjectState(); - const { - issue: { getIssueById }, - } = useIssueDetail(); - const { setShowAlert } = useReloadConfirmations(isSubmitting === "submitting"); - - useEffect(() => { - if (isSubmitting === "submitted") { - setShowAlert(false); - setTimeout(async () => { - setIsSubmitting("saved"); - }, 3000); - } else if (isSubmitting === "submitting") { - setShowAlert(true); - } - }, [isSubmitting, setShowAlert, setIsSubmitting]); - - const issue = issueId ? getIssueById(issueId) : undefined; - if (!issue) return <>; - - const currentIssueState = projectStates?.find((s) => s.id === issue.state_id); - - const issueDescription = - issue.description_html !== undefined || issue.description_html !== null - ? issue.description_html != "" - ? issue.description_html - : "

" - : undefined; - - return ( - <> -
- - -
- {currentIssueState && ( - - )} - -
- - setIsSubmitting(value)} - issueOperations={issueOperations} - disabled={!is_editable} - value={issue.name} - /> - - setIsSubmitting(value)} - /> - - {currentUser && ( - - )} -
- -
- -
- - ); -}); diff --git a/web/components/issues/issue-detail/inbox/root.tsx b/web/components/issues/issue-detail/inbox/root.tsx deleted file mode 100644 index bab406d1fc..0000000000 --- a/web/components/issues/issue-detail/inbox/root.tsx +++ /dev/null @@ -1,152 +0,0 @@ -import { FC, useMemo } from "react"; -import { useRouter } from "next/router"; -import useSWR from "swr"; -import { TIssue } from "@plane/types"; -// components -import { TOAST_TYPE, setToast } from "@plane/ui"; -import { EUserProjectRoles } from "@/constants/project"; -import { useEventTracker, useInboxIssues, useIssueDetail, useUser } from "@/hooks/store"; -// ui -// types -import { TIssueOperations } from "../root"; -import { InboxIssueMainContent } from "./main-content"; -import { InboxIssueDetailsSidebar } from "./sidebar"; -// constants - -export type TInboxIssueDetailRoot = { - workspaceSlug: string; - projectId: string; - inboxId: string; - issueId: string; -}; - -export const InboxIssueDetailRoot: FC = (props) => { - const { workspaceSlug, projectId, inboxId, issueId } = props; - // router - const router = useRouter(); - // hooks - const { - issues: { fetchInboxIssueById, updateInboxIssue, removeInboxIssue }, - } = useInboxIssues(); - const { - issue: { getIssueById }, - fetchActivities, - fetchComments, - } = useIssueDetail(); - const { captureIssueEvent } = useEventTracker(); - const { - membership: { currentProjectRole }, - } = useUser(); - - const issueOperations: TIssueOperations = useMemo( - () => ({ - fetch: async (workspaceSlug: string, projectId: string, issueId: string) => { - try { - await fetchInboxIssueById(workspaceSlug, projectId, inboxId, issueId); - } catch (error) { - console.error("Error fetching the parent issue"); - } - }, - update: async (workspaceSlug: string, projectId: string, issueId: string, data: Partial) => { - try { - await updateInboxIssue(workspaceSlug, projectId, inboxId, issueId, data); - captureIssueEvent({ - eventName: "Inbox issue updated", - payload: { ...data, state: "SUCCESS", element: "Inbox" }, - updates: { - changed_property: Object.keys(data).join(","), - change_details: Object.values(data).join(","), - }, - path: router.asPath, - }); - } catch (error) { - setToast({ - title: "Issue update failed", - type: TOAST_TYPE.ERROR, - message: "Issue update failed", - }); - captureIssueEvent({ - eventName: "Inbox issue updated", - payload: { state: "SUCCESS", element: "Inbox" }, - updates: { - changed_property: Object.keys(data).join(","), - change_details: Object.values(data).join(","), - }, - path: router.asPath, - }); - } - }, - remove: async (workspaceSlug: string, projectId: string, issueId: string) => { - try { - await removeInboxIssue(workspaceSlug, projectId, inboxId, issueId); - setToast({ - title: "Issue deleted successfully", - type: TOAST_TYPE.SUCCESS, - message: "Issue deleted successfully", - }); - captureIssueEvent({ - eventName: "Inbox issue deleted", - payload: { id: issueId, state: "SUCCESS", element: "Inbox" }, - path: router.asPath, - }); - } catch (error) { - captureIssueEvent({ - eventName: "Inbox issue deleted", - payload: { id: issueId, state: "FAILED", element: "Inbox" }, - path: router.asPath, - }); - setToast({ - title: "Issue delete failed", - type: TOAST_TYPE.ERROR, - message: "Issue delete failed", - }); - } - }, - }), - [inboxId, fetchInboxIssueById, updateInboxIssue, removeInboxIssue] - ); - - useSWR( - workspaceSlug && projectId && inboxId && issueId - ? `INBOX_ISSUE_DETAIL_${workspaceSlug}_${projectId}_${inboxId}_${issueId}` - : null, - async () => { - if (workspaceSlug && projectId && inboxId && issueId) { - await issueOperations.fetch(workspaceSlug, projectId, issueId); - await fetchActivities(workspaceSlug, projectId, issueId); - await fetchComments(workspaceSlug, projectId, issueId); - } - } - ); - - // checking if issue is editable, based on user role - const is_editable = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; - - // issue details - const issue = getIssueById(issueId); - - if (!issue) return <>; - return ( -
-
- -
-
- -
-
- ); -}; diff --git a/web/components/issues/issue-detail/index.ts b/web/components/issues/issue-detail/index.ts index 63ef560a1b..dc36d97ab9 100644 --- a/web/components/issues/issue-detail/index.ts +++ b/web/components/issues/issue-detail/index.ts @@ -1,14 +1,14 @@ export * from "./root"; - export * from "./main-content"; export * from "./sidebar"; - -// select -export * from "./cycle-select"; -export * from "./module-select"; -export * from "./parent-select"; -export * from "./relation-select"; export * from "./parent"; export * from "./label"; export * from "./subscription"; export * from "./links"; +export * from "./issue-activity"; +export * from "./reactions"; +// select components +export * from "./cycle-select"; +export * from "./module-select"; +export * from "./parent-select"; +export * from "./relation-select"; diff --git a/web/components/issues/issue-detail/label/create-label.tsx b/web/components/issues/issue-detail/label/create-label.tsx index de376ce799..cbdb441e44 100644 --- a/web/components/issues/issue-detail/label/create-label.tsx +++ b/web/components/issues/issue-detail/label/create-label.tsx @@ -7,7 +7,6 @@ import { Popover } from "@headlessui/react"; import { IIssueLabel } from "@plane/types"; // hooks import { Input, TOAST_TYPE, setToast } from "@plane/ui"; -import { useIssueDetail } from "@/hooks/store"; // ui // types import { TLabelOperations } from "./root"; @@ -16,6 +15,7 @@ type ILabelCreate = { workspaceSlug: string; projectId: string; issueId: string; + values: string[]; labelOperations: TLabelOperations; disabled?: boolean; }; @@ -26,11 +26,7 @@ const defaultValues: Partial = { }; export const LabelCreate: FC = (props) => { - const { workspaceSlug, projectId, issueId, labelOperations, disabled = false } = props; - // hooks - const { - issue: { getIssueById }, - } = useIssueDetail(); + const { workspaceSlug, projectId, issueId, values, labelOperations, disabled = false } = props; // state const [isCreateToggle, setIsCreateToggle] = useState(false); const handleIsCreateToggle = () => setIsCreateToggle(!isCreateToggle); @@ -70,9 +66,8 @@ export const LabelCreate: FC = (props) => { if (!workspaceSlug || !projectId || isSubmitting) return; try { - const issue = getIssueById(issueId); const labelResponse = await labelOperations.createLabel(workspaceSlug, projectId, formData); - const currentLabels = [...(issue?.label_ids || []), labelResponse.id]; + const currentLabels = [...(values || []), labelResponse.id]; await labelOperations.updateIssue(workspaceSlug, projectId, issueId, { label_ids: currentLabels }); reset(defaultValues); } catch (error) { diff --git a/web/components/issues/issue-detail/label/label-list-item.tsx b/web/components/issues/issue-detail/label/label-list-item.tsx index 2bb6d30d1f..8dbd980c5b 100644 --- a/web/components/issues/issue-detail/label/label-list-item.tsx +++ b/web/components/issues/issue-detail/label/label-list-item.tsx @@ -1,7 +1,7 @@ import { FC } from "react"; import { X } from "lucide-react"; // types -import { useIssueDetail, useLabel } from "@/hooks/store"; +import { useLabel } from "@/hooks/store"; import { TLabelOperations } from "./root"; type TLabelListItem = { @@ -9,24 +9,21 @@ type TLabelListItem = { projectId: string; issueId: string; labelId: string; + values: string[]; labelOperations: TLabelOperations; disabled: boolean; }; export const LabelListItem: FC = (props) => { - const { workspaceSlug, projectId, issueId, labelId, labelOperations, disabled } = props; + const { workspaceSlug, projectId, issueId, labelId, values, labelOperations, disabled } = props; // hooks - const { - issue: { getIssueById }, - } = useIssueDetail(); const { getLabelById } = useLabel(); - const issue = getIssueById(issueId); const label = getLabelById(labelId); const handleLabel = async () => { - if (issue && !disabled) { - const currentLabels = issue.label_ids.filter((_labelId) => _labelId !== labelId); + if (values && !disabled) { + const currentLabels = values.filter((_labelId) => _labelId !== labelId); await labelOperations.updateIssue(workspaceSlug, projectId, issueId, { label_ids: currentLabels }); } }; diff --git a/web/components/issues/issue-detail/label/label-list.tsx b/web/components/issues/issue-detail/label/label-list.tsx index 07ba727668..e6ec6e05c8 100644 --- a/web/components/issues/issue-detail/label/label-list.tsx +++ b/web/components/issues/issue-detail/label/label-list.tsx @@ -1,9 +1,7 @@ import { FC } from "react"; import { observer } from "mobx-react"; // components -import { useIssueDetail } from "@/hooks/store"; import { LabelListItem } from "./label-list-item"; -// hooks // types import { TLabelOperations } from "./root"; @@ -11,21 +9,16 @@ type TLabelList = { workspaceSlug: string; projectId: string; issueId: string; + values: string[]; labelOperations: TLabelOperations; disabled: boolean; }; export const LabelList: FC = observer((props) => { - const { workspaceSlug, projectId, issueId, labelOperations, disabled } = props; - // hooks - const { - issue: { getIssueById }, - } = useIssueDetail(); + const { workspaceSlug, projectId, issueId, values, labelOperations, disabled } = props; + const issueLabels = values || undefined; - const issue = getIssueById(issueId); - const issueLabels = issue?.label_ids || undefined; - - if (!issue || !issueLabels) return <>; + if (!issueId || !issueLabels) return <>; return ( <> {issueLabels.map((labelId) => ( @@ -35,6 +28,7 @@ export const LabelList: FC = observer((props) => { projectId={projectId} issueId={issueId} labelId={labelId} + values={issueLabels} labelOperations={labelOperations} disabled={disabled} /> diff --git a/web/components/issues/issue-detail/label/root.tsx b/web/components/issues/issue-detail/label/root.tsx index 6309ada642..31030555ae 100644 --- a/web/components/issues/issue-detail/label/root.tsx +++ b/web/components/issues/issue-detail/label/root.tsx @@ -4,7 +4,7 @@ import { IIssueLabel, TIssue } from "@plane/types"; // components import { TOAST_TYPE, setToast } from "@plane/ui"; // hooks -import { useIssueDetail, useLabel } from "@/hooks/store"; +import { useIssueDetail, useLabel, useProjectInbox } from "@/hooks/store"; // ui // types import { LabelList, LabelCreate, IssueLabelSelectRoot } from "./"; @@ -28,6 +28,12 @@ export const IssueLabel: FC = observer((props) => { // hooks const { updateIssue } = useIssueDetail(); const { createLabel } = useLabel(); + const { + issue: { getIssueById }, + } = useIssueDetail(); + const { getIssueInboxByIssueId } = useProjectInbox(); + + const issue = isInboxIssue ? getIssueInboxByIssueId(issueId)?.issue : getIssueById(issueId); const labelOperations: TLabelOperations = useMemo( () => ({ @@ -72,6 +78,7 @@ export const IssueLabel: FC = observer((props) => { workspaceSlug={workspaceSlug} projectId={projectId} issueId={issueId} + values={issue?.label_ids || []} labelOperations={labelOperations} disabled={disabled} /> @@ -81,6 +88,7 @@ export const IssueLabel: FC = observer((props) => { workspaceSlug={workspaceSlug} projectId={projectId} issueId={issueId} + values={issue?.label_ids || []} labelOperations={labelOperations} /> )} @@ -90,6 +98,7 @@ export const IssueLabel: FC = observer((props) => { workspaceSlug={workspaceSlug} projectId={projectId} issueId={issueId} + values={issue?.label_ids || []} labelOperations={labelOperations} /> )} diff --git a/web/components/issues/issue-detail/label/select/label-select.tsx b/web/components/issues/issue-detail/label/select/label-select.tsx index 2882a1e0e7..814758ebc8 100644 --- a/web/components/issues/issue-detail/label/select/label-select.tsx +++ b/web/components/issues/issue-detail/label/select/label-select.tsx @@ -4,22 +4,20 @@ import { usePopper } from "react-popper"; import { Check, Search, Tag } from "lucide-react"; import { Combobox } from "@headlessui/react"; // hooks -import { useIssueDetail, useLabel } from "@/hooks/store"; +import { useLabel } from "@/hooks/store"; // components export interface IIssueLabelSelect { workspaceSlug: string; projectId: string; issueId: string; + values: string[]; onSelect: (_labelIds: string[]) => void; } export const IssueLabelSelect: React.FC = observer((props) => { - const { workspaceSlug, projectId, issueId, onSelect } = props; + const { workspaceSlug, projectId, issueId, values, onSelect } = props; // store hooks - const { - issue: { getIssueById }, - } = useIssueDetail(); const { fetchProjectLabels, getProjectLabels } = useLabel(); // states const [referenceElement, setReferenceElement] = useState(null); @@ -27,7 +25,6 @@ export const IssueLabelSelect: React.FC = observer((props) => const [isLoading, setIsLoading] = useState(false); const [query, setQuery] = useState(""); - const issue = getIssueById(issueId); const projectLabels = getProjectLabels(projectId); const fetchLabels = () => { @@ -67,7 +64,7 @@ export const IssueLabelSelect: React.FC = observer((props) => ], }); - const issueLabels = issue?.label_ids ?? []; + const issueLabels = values ?? []; const label = (
= observer((props) => } }; - if (!issue) return <>; + if (!issueId || !values) return <>; return ( <> diff --git a/web/components/issues/issue-detail/label/select/root.tsx b/web/components/issues/issue-detail/label/select/root.tsx index de0bcca908..00f96522b1 100644 --- a/web/components/issues/issue-detail/label/select/root.tsx +++ b/web/components/issues/issue-detail/label/select/root.tsx @@ -8,17 +8,24 @@ type TIssueLabelSelectRoot = { workspaceSlug: string; projectId: string; issueId: string; + values: string[]; labelOperations: TLabelOperations; }; export const IssueLabelSelectRoot: FC = (props) => { - const { workspaceSlug, projectId, issueId, labelOperations } = props; + const { workspaceSlug, projectId, issueId, values, labelOperations } = props; const handleLabel = async (_labelIds: string[]) => { await labelOperations.updateIssue(workspaceSlug, projectId, issueId, { label_ids: _labelIds }); }; return ( - + ); }; diff --git a/web/components/project/sidebar-list-item.tsx b/web/components/project/sidebar-list-item.tsx index bb1d6ad17a..5041e81c3e 100644 --- a/web/components/project/sidebar-list-item.tsx +++ b/web/components/project/sidebar-list-item.tsx @@ -32,9 +32,8 @@ import { import { LeaveProjectModal, ProjectLogo, PublishProjectModal } from "@/components/project"; import { EUserProjectRoles } from "@/constants/project"; import { cn } from "@/helpers/common.helper"; -import { getNumberCount } from "@/helpers/string.helper"; // hooks -import { useApplication, useEventTracker, useInbox, useProject } from "@/hooks/store"; +import { useApplication, useEventTracker, useProject } from "@/hooks/store"; import useOutsideClickDetector from "@/hooks/use-outside-click-detector"; import { usePlatformOS } from "@/hooks/use-platform-os"; // helpers @@ -95,7 +94,6 @@ export const ProjectSidebarListItem: React.FC = observer((props) => { const { theme: themeStore } = useApplication(); const { setTrackElement } = useEventTracker(); const { addProjectToFavorites, removeProjectFromFavorites, getProjectById } = useProject(); - const { getInboxesByProjectId, getInboxById } = useInbox(); const { isMobile } = usePlatformOS(); // states const [leaveProjectModalOpen, setLeaveProjectModal] = useState(false); @@ -109,8 +107,6 @@ export const ProjectSidebarListItem: React.FC = observer((props) => { // derived values const project = getProjectById(projectId); const isCollapsed = themeStore.sidebarCollapsed; - const inboxesMap = project?.inbox_view ? getInboxesByProjectId(projectId) : undefined; - const inboxDetails = inboxesMap && inboxesMap.length > 0 ? getInboxById(inboxesMap[0]) : undefined; // auth const isAdmin = project?.member_role === EUserProjectRoles.ADMIN; const isViewerOrGuest = @@ -375,36 +371,8 @@ export const ProjectSidebarListItem: React.FC = observer((props) => { : "text-custom-sidebar-text-300 hover:bg-custom-sidebar-background-80 focus:bg-custom-sidebar-background-80" } ${isCollapsed ? "justify-center" : ""}`} > - {item.name === "Inbox" && inboxDetails ? ( - <> -
- {inboxDetails?.pending_issue_count > 0 && ( - = 100, - }, - { - "border-none bg-custom-primary-300 text-white": router.asPath.includes( - item.href - ), - } - )} - > - {getNumberCount(inboxDetails?.pending_issue_count)} - - )} - -
- {!isCollapsed && item.name} - - ) : ( - <> - - {!isCollapsed && item.name} - - )} + + {!isCollapsed && item.name}
diff --git a/web/components/ui/loader/layouts/project-inbox/inbox-layout-loader.tsx b/web/components/ui/loader/layouts/project-inbox/inbox-layout-loader.tsx index 3456e43ab5..095c0d5430 100644 --- a/web/components/ui/loader/layouts/project-inbox/inbox-layout-loader.tsx +++ b/web/components/ui/loader/layouts/project-inbox/inbox-layout-loader.tsx @@ -4,22 +4,19 @@ import { Loader } from "@plane/ui"; import { InboxSidebarLoader } from "./inbox-sidebar-loader"; export const InboxLayoutLoader = () => ( -
- -
- -
+
+
+ +
+
+ +
-
- - - - -
+
diff --git a/web/components/ui/loader/layouts/project-inbox/inbox-sidebar-loader.tsx b/web/components/ui/loader/layouts/project-inbox/inbox-sidebar-loader.tsx index 204c2fff60..01da38f6a6 100644 --- a/web/components/ui/loader/layouts/project-inbox/inbox-sidebar-loader.tsx +++ b/web/components/ui/loader/layouts/project-inbox/inbox-sidebar-loader.tsx @@ -1,24 +1,20 @@ import React from "react"; export const InboxSidebarLoader = () => ( -
-
- - -
-
- {[...Array(6)].map((i) => ( -
-
- - -
-
- - -
+
+ {[...Array(6)].map((i, index) => ( +
+
+ +
- ))} -
+
+ + + + +
+
+ ))}
); diff --git a/web/constants/empty-state.ts b/web/constants/empty-state.ts index 363147775d..808b5470dc 100644 --- a/web/constants/empty-state.ts +++ b/web/constants/empty-state.ts @@ -90,6 +90,13 @@ export enum EmptyStateType { ACTIVE_CYCLE_PRIORITY_ISSUE_EMPTY_STATE = "active-cycle-priority-issue-empty-state", ACTIVE_CYCLE_ASSIGNEE_EMPTY_STATE = "active-cycle-assignee-empty-state", ACTIVE_CYCLE_LABEL_EMPTY_STATE = "active-cycle-label-empty-state", + + DISABLED_PROJECT_INBOX = "disabled-project-inbox", + + INBOX_SIDEBAR_OPEN_TAB = "inbox-sidebar-open-tab", + INBOX_SIDEBAR_CLOSED_TAB = "inbox-sidebar-closed-tab", + INBOX_SIDEBAR_FILTER_EMPTY_STATE = "inbox-sidebar-filter-empty-state", + INBOX_DETAIL_EMPTY_STATE = "inbox-detail-empty-state", } const emptyStateDetails = { @@ -615,6 +622,41 @@ const emptyStateDetails = { title: "Add labels to issues to see the \n breakdown of work by labels.", path: "/empty-state/active-cycle/label", }, + [EmptyStateType.DISABLED_PROJECT_INBOX]: { + key: EmptyStateType.DISABLED_PROJECT_INBOX, + title: "Inbox is not enabled for the project.", + description: + "Inbox helps you manage incoming requests to your project and add them as issues in your workflow. Enable inbox \n from project settings to manage requests.", + accessType: "project", + access: EUserProjectRoles.ADMIN, + path: "/empty-state/disabled-feature/inbox", + primaryButton: { + text: "Manage features", + }, + }, + [EmptyStateType.INBOX_SIDEBAR_OPEN_TAB]: { + key: EmptyStateType.INBOX_SIDEBAR_OPEN_TAB, + title: "No open issues", + description: "Find open issues here. Create new issue.", + path: "/empty-state/inbox/inbox-issue", + }, + [EmptyStateType.INBOX_SIDEBAR_CLOSED_TAB]: { + key: EmptyStateType.INBOX_SIDEBAR_CLOSED_TAB, + title: "No closed issues", + description: "All the issues whether accepted or \n declined can be found here.", + path: "/empty-state/inbox/inbox-issue", + }, + [EmptyStateType.INBOX_SIDEBAR_FILTER_EMPTY_STATE]: { + key: EmptyStateType.INBOX_SIDEBAR_FILTER_EMPTY_STATE, + title: "No matching issues", + description: "No issue matches filter applied in inbox. \n Create a new issue.", + path: "/empty-state/inbox/filter-issue", + }, + [EmptyStateType.INBOX_DETAIL_EMPTY_STATE]: { + key: EmptyStateType.INBOX_DETAIL_EMPTY_STATE, + title: "Select an issue to view its details.", + path: "/empty-state/inbox/issue-detail", + }, } as const; export const EMPTY_STATE_DETAILS: Record = emptyStateDetails; diff --git a/web/constants/inbox.tsx b/web/constants/inbox.tsx index b511b529e4..6be3ad3fa3 100644 --- a/web/constants/inbox.tsx +++ b/web/constants/inbox.tsx @@ -1,91 +1,90 @@ // icons -import { AlertTriangle, CheckCircle2, Clock, Copy, ExternalLink, LucideIcon, XCircle } from "lucide-react"; +import { AlertTriangle, CheckCircle2, Clock, Copy, LucideIcon, XCircle } from "lucide-react"; +// types +import { TInboxIssueSortingOrderByKeys, TInboxIssueSortingSortByKeys, TInboxIssueStatus } from "@plane/types"; // helpers -import { renderFormattedDate } from "@/helpers/date-time.helper"; +import { findHowManyDaysLeft } from "@/helpers/date-time.helper"; export const INBOX_STATUS: { key: string; - status: number; + status: TInboxIssueStatus; icon: LucideIcon; title: string; - description: ( - workspaceSlug: string, - projectId: string, - issueId: string, - snoozedTillDate: Date | undefined - ) => JSX.Element; + description: (snoozedTillDate: Date) => string; textColor: (snoozeDatePassed: boolean) => string; bgColor: (snoozeDatePassed: boolean) => string; - borderColor: (snoozeDatePassed: boolean) => string; }[] = [ { key: "pending", status: -2, icon: AlertTriangle, title: "Pending", - description: () =>

This issue is still pending.

, - textColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "text-yellow-500"), - bgColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "bg-yellow-500/10"), - borderColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "border-yellow-500"), + description: () => `Pending`, + textColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "text-[#AB6400]"), + bgColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "bg-[#FFF7C2]"), }, { key: "declined", status: -1, icon: XCircle, title: "Declined", - description: () =>

This issue has been declined.

, - textColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "text-red-500"), - bgColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "bg-red-500/10"), - borderColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "border-red-500"), + description: () => `Declined`, + textColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "text-[#CE2C31]"), + bgColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "bg-[#FEEBEC]"), }, { key: "snoozed", status: 0, icon: Clock, title: "Snoozed", - description: (workspaceSlug: string, projectId: string, issueId: string, snoozedTillDate: Date = new Date()) => - snoozedTillDate < new Date() ? ( -

This issue was snoozed till {renderFormattedDate(snoozedTillDate)}.

- ) : ( -

This issue has been snoozed till {renderFormattedDate(snoozedTillDate)}.

- ), - textColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "text-red-500" : "text-custom-text-200"), - bgColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "bg-red-500/10" : "bg-gray-500/10"), - borderColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "border-red-500" : "border-gray-500"), + description: (snoozedTillDate: Date = new Date()) => `${findHowManyDaysLeft(snoozedTillDate)} days to go`, + textColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "text-red-500" : "text-custom-text-400"), + bgColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "bg-red-500/10" : "bg-[#E0E1E6]"), }, { key: "accepted", status: 1, icon: CheckCircle2, title: "Accepted", - description: () =>

This issue has been accepted.

, - textColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "text-green-500"), - bgColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "bg-green-500/10"), - borderColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "border-green-500"), + description: () => `Accepted`, + textColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "text-[#3E9B4F]"), + bgColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "bg-[#E9F6E9]"), }, { key: "duplicate", status: 2, icon: Copy, title: "Duplicate", - description: (workspaceSlug: string, projectId: string, issueId: string) => ( -

- This issue has been marked as a duplicate of - - this issue - - . -

- ), + description: () => `Duplicate`, textColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "text-custom-text-200"), bgColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "bg-gray-500/10"), - borderColor: (snoozeDatePassed: boolean = false) => (snoozeDatePassed ? "" : "border-gray-500"), }, ]; export const INBOX_ISSUE_SOURCE = "in-app"; + +export const INBOX_ISSUE_ORDER_BY_OPTIONS: { key: TInboxIssueSortingOrderByKeys; label: string }[] = [ + { + key: "issue__created_at", + label: "Date created", + }, + { + key: "issue__updated_at", + label: "Date updated", + }, + { + key: "issue__sequence_id", + label: "ID", + }, +]; + +export const INBOX_ISSUE_SORT_BY_OPTIONS: { key: TInboxIssueSortingSortByKeys; label: string }[] = [ + { + key: "asc", + label: "Ascending", + }, + { + key: "desc", + label: "Descending", + }, +]; diff --git a/web/hooks/store/index.ts b/web/hooks/store/index.ts index 906b473ff3..950ae00f12 100644 --- a/web/hooks/store/index.ts +++ b/web/hooks/store/index.ts @@ -23,5 +23,6 @@ export * from "./use-workspace"; export * from "./use-issues"; export * from "./use-kanban-view"; export * from "./use-issue-detail"; -export * from "./use-inbox"; +// project inbox +export * from "./use-project-inbox"; export * from "./use-inbox-issues"; diff --git a/web/hooks/store/use-inbox-issues.ts b/web/hooks/store/use-inbox-issues.ts index 000539e2c7..f1afe751d8 100644 --- a/web/hooks/store/use-inbox-issues.ts +++ b/web/hooks/store/use-inbox-issues.ts @@ -1,15 +1,9 @@ import { useContext } from "react"; // mobx store -import { StoreContext } from "@/contexts/store-context"; -// types -import { IInboxFilter } from "@/store/inbox/inbox_filter.store"; -import { IInboxIssue } from "@/store/inbox/inbox_issue.store"; +import { StoreContext } from "contexts/store-context"; -export const useInboxIssues = (): { - issues: IInboxIssue; - filters: IInboxFilter; -} => { +export const useInboxIssues = (inboxIssueId: string) => { const context = useContext(StoreContext); if (context === undefined) throw new Error("useInboxIssues must be used within StoreProvider"); - return { issues: context.inbox.inboxIssue, filters: context.inbox.inboxFilter }; + return context.projectInbox.getIssueInboxByIssueId(inboxIssueId) || {}; }; diff --git a/web/hooks/store/use-inbox.ts b/web/hooks/store/use-inbox.ts deleted file mode 100644 index d2a0698344..0000000000 --- a/web/hooks/store/use-inbox.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { useContext } from "react"; -// mobx store -import { StoreContext } from "@/contexts/store-context"; -// types -import { IInbox } from "@/store/inbox/inbox.store"; - -export const useInbox = (): IInbox => { - const context = useContext(StoreContext); - if (context === undefined) throw new Error("useInbox must be used within StoreProvider"); - return context.inbox.inbox; -}; diff --git a/web/hooks/store/use-project-inbox.ts b/web/hooks/store/use-project-inbox.ts new file mode 100644 index 0000000000..5da2c8161c --- /dev/null +++ b/web/hooks/store/use-project-inbox.ts @@ -0,0 +1,11 @@ +import { useContext } from "react"; +// mobx store +import { StoreContext } from "contexts/store-context"; +// types +import { IProjectInboxStore } from "@/store/inbox/project-inbox.store"; + +export const useProjectInbox = (): IProjectInboxStore => { + const context = useContext(StoreContext); + if (context === undefined) throw new Error("useProjectInbox must be used within StoreProvider"); + return context.projectInbox; +}; diff --git a/web/hooks/use-intersection-observer.tsx b/web/hooks/use-intersection-observer.tsx new file mode 100644 index 0000000000..eb57e58af5 --- /dev/null +++ b/web/hooks/use-intersection-observer.tsx @@ -0,0 +1,42 @@ +import { RefObject, useState, useEffect } from "react"; + +export type UseIntersectionObserverProps = { + containerRef: RefObject; + elementRef: RefObject; + callback: () => void; + rootMargin?: string; +}; + +export const useIntersectionObserver = (props: UseIntersectionObserverProps) => { + const { containerRef, elementRef, callback, rootMargin = "0px" } = props; + const [isVisible, setVisibility] = useState(false); + + useEffect(() => { + if (elementRef.current) { + const observer = new IntersectionObserver( + ([entry]) => { + if (entry.isIntersecting) { + callback(); + } + setVisibility(entry.isIntersecting); + }, + { + root: containerRef.current, + rootMargin, + } + ); + observer.observe(elementRef.current); + return () => { + if (elementRef.current) { + // eslint-disable-next-line react-hooks/exhaustive-deps + observer.unobserve(elementRef.current); + } + }; + } + // while removing the current from the refs, the observer is not not working as expected + // fix this eslint warning with caution + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [rootMargin, callback, elementRef.current, containerRef.current]); + + return isVisible; +}; diff --git a/web/layouts/auth-layout/project-wrapper.tsx b/web/layouts/auth-layout/project-wrapper.tsx index 58084b0d4b..5f45733608 100644 --- a/web/layouts/auth-layout/project-wrapper.tsx +++ b/web/layouts/auth-layout/project-wrapper.tsx @@ -19,7 +19,7 @@ import { useProjectState, useProjectView, useUser, - useInbox, + // useInbox, } from "@/hooks/store"; // images import emptyProject from "public/empty-state/project.svg"; @@ -31,7 +31,7 @@ interface IProjectAuthWrapper { export const ProjectAuthWrapper: FC = observer((props) => { const { children } = props; // store - const { fetchInboxes } = useInbox(); + // const { fetchInboxes } = useInbox(); const { commandPalette: { toggleCreateProjectModal }, } = useApplication(); @@ -39,7 +39,7 @@ export const ProjectAuthWrapper: FC = observer((props) => { const { membership: { fetchUserProjectInfo, projectMemberInfo, hasPermissionToProject }, } = useUser(); - const { getProjectById, fetchProjectDetails, currentProjectDetails } = useProject(); + const { getProjectById, fetchProjectDetails } = useProject(); const { fetchAllCycles } = useCycle(); const { fetchModules } = useModule(); const { fetchViews } = useProjectView(); @@ -105,20 +105,6 @@ export const ProjectAuthWrapper: FC = observer((props) => { workspaceSlug && projectId ? () => fetchViews(workspaceSlug.toString(), projectId.toString()) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); - // fetching project inboxes if inbox is enabled in project settings - useSWR( - workspaceSlug && projectId && currentProjectDetails && currentProjectDetails.inbox_view - ? `PROJECT_INBOXES_${workspaceSlug}_${projectId}` - : null, - workspaceSlug && projectId && currentProjectDetails && currentProjectDetails.inbox_view - ? () => fetchInboxes(workspaceSlug.toString(), projectId.toString()) - : null, - { - revalidateOnFocus: false, - revalidateOnReconnect: false, - } - ); - const projectExists = projectId ? getProjectById(projectId.toString()) : null; // check if the project member apis is loading diff --git a/web/next-env.d.ts b/web/next-env.d.ts index fd36f9494e..4f11a03dc6 100644 --- a/web/next-env.d.ts +++ b/web/next-env.d.ts @@ -1,6 +1,5 @@ /// /// -/// // NOTE: This file should not be edited // see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/web/pages/[workspaceSlug]/projects/[projectId]/inbox/[inboxId].tsx b/web/pages/[workspaceSlug]/projects/[projectId]/inbox/[inboxId].tsx deleted file mode 100644 index 03b1cc9635..0000000000 --- a/web/pages/[workspaceSlug]/projects/[projectId]/inbox/[inboxId].tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { ReactElement } from "react"; -import { observer } from "mobx-react"; -import { useRouter } from "next/router"; -import useSWR from "swr"; -// hooks -import { PageHead } from "@/components/core"; -import { ProjectInboxHeader } from "@/components/headers"; -import { InboxSidebarRoot, InboxContentRoot } from "@/components/inbox"; -import { InboxLayoutLoader } from "@/components/ui"; -import { useProject, useInboxIssues } from "@/hooks/store"; -// layouts -import { AppLayout } from "@/layouts/app-layout"; -// components -// types -import { NextPageWithLayout } from "@/lib/types"; - -const ProjectInboxPage: NextPageWithLayout = observer(() => { - const router = useRouter(); - const { workspaceSlug, projectId, inboxId, inboxIssueId } = router.query; - // store hooks - const { currentProjectDetails } = useProject(); - const { - filters: { fetchInboxFilters }, - issues: { fetchInboxIssues }, - } = useInboxIssues(); - // fetching the Inbox filters and issues - const { isLoading } = useSWR( - workspaceSlug && projectId && currentProjectDetails && currentProjectDetails?.inbox_view - ? `INBOX_ISSUES_${workspaceSlug.toString()}_${projectId.toString()}` - : null, - async () => { - if (workspaceSlug && projectId && inboxId && currentProjectDetails && currentProjectDetails?.inbox_view) { - await fetchInboxFilters(workspaceSlug.toString(), projectId.toString(), inboxId.toString()); - await fetchInboxIssues(workspaceSlug.toString(), projectId.toString(), inboxId.toString()); - } - } - ); - // derived values - const pageTitle = currentProjectDetails?.name ? `${currentProjectDetails?.name} - Inbox` : undefined; - - if (!workspaceSlug || !projectId || !inboxId || !currentProjectDetails?.inbox_view || isLoading) - return ( -
- -
- ); - - return ( - <> - -
-
- -
-
- -
-
- - ); -}); - -ProjectInboxPage.getLayout = function getLayout(page: ReactElement) { - return ( - } withProjectWrapper> - {page} - - ); -}; - -export default ProjectInboxPage; diff --git a/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx b/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx index 6f8bdda93e..84205776f2 100644 --- a/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx +++ b/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx @@ -1,41 +1,54 @@ import { ReactElement } from "react"; import { observer } from "mobx-react"; import { useRouter } from "next/router"; -import useSWR from "swr"; -// hooks +// components +import { PageHead } from "@/components/core"; +import { EmptyState } from "@/components/empty-state"; import { ProjectInboxHeader } from "@/components/headers"; -import { InboxLayoutLoader } from "@/components/ui"; -import { useInbox, useProject } from "@/hooks/store"; +import { InboxIssueRoot } from "@/components/inbox"; +// constants +import { EmptyStateType } from "@/constants/empty-state"; +// hooks +import { useProject } from "@/hooks/store"; // layouts import { AppLayout } from "@/layouts/app-layout"; -// ui -// components // types import { NextPageWithLayout } from "@/lib/types"; const ProjectInboxPage: NextPageWithLayout = observer(() => { + /// router const router = useRouter(); - const { workspaceSlug, projectId } = router.query; - + const { workspaceSlug, projectId, inboxIssueId } = router.query; + // hooks const { currentProjectDetails } = useProject(); - const { fetchInboxes } = useInbox(); - useSWR( - workspaceSlug && projectId && currentProjectDetails && currentProjectDetails?.inbox_view - ? `INBOX_${workspaceSlug.toString()}_${projectId.toString()}` - : null, - async () => { - if (workspaceSlug && projectId && currentProjectDetails && currentProjectDetails?.inbox_view) { - const inboxes = await fetchInboxes(workspaceSlug.toString(), projectId.toString()); - if (inboxes && inboxes.length > 0) - router.push(`/${workspaceSlug}/projects/${projectId}/inbox/${inboxes[0].id}`); - } - } - ); + if (!workspaceSlug || !projectId) return <>; + + // No access to inbox + if (currentProjectDetails?.inbox_view === false) + return ( +
+ +
+ ); + + // derived values + const pageTitle = currentProjectDetails?.name ? `${currentProjectDetails?.name} - Inbox` : "Plane - Inbox"; return (
- {currentProjectDetails?.inbox_view ? :
You don{"'"}t have access to inbox
} + +
+ +
); }); diff --git a/web/public/empty-state/disabled-feature/inbox-dark.webp b/web/public/empty-state/disabled-feature/inbox-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..d0e1055191029bc9d822e49b2e507fbb0c441a44 GIT binary patch literal 60900 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�C-ZC0x}lGc9u- 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
I^@0OT63lqX6wxp}?tgMynrS)s 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 A+yDRo literal 0 HcmV?d00001 diff --git a/web/public/empty-state/inbox/filter-issue-light.webp b/web/public/empty-state/inbox/filter-issue-light.webp new file mode 100644 index 0000000000000000000000000000000000000000..ba27009a69ff3651f09b9e0b77ea9b7345f07d7f GIT binary patch literal 40790 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 literal 0 HcmV?d00001 diff --git a/web/public/empty-state/inbox/inbox-issue-dark.webp b/web/public/empty-state/inbox/inbox-issue-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..4c15f9cdd0c89e93a8b975e44878c456cde3de2c GIT binary patch literal 40208 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≀l#s0wP2|gYD4Ed<{;UN3JeKou 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 literal 0 HcmV?d00001 diff --git a/web/public/empty-state/inbox/issue-detail-dark.webp b/web/public/empty-state/inbox/issue-detail-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..2a2c7063b259baa28e574ef2a858af2934a3cb9d GIT binary patch literal 2170 zcmV-=2!;1jNk&F;2mk`Ayw>fflPcj3q5~OAdRR3GkQo!3`@xG_5Fj&3 zzCH|W<~KkYg>4V=;&JjJv=ro>%WOvBHpTkQflYp?u3mkHq!R5huNg(y8>w&TkL%Mf zQA5q)>_aB``)Z%kuL6}CY!0s-?~s}05+(0z&v*G~wo8<3HlUP`bfrd2i7dzEqq#3p zYctF1S87VgT)&gxMJakXAd}*S6MkNfuDF9tnvk_LVh9hid*OKNz7 z3{R3JYmnh;&lY4jQ^7Z6W}Lp}1Tua$m#_nwjD$Pwv1%9$rVqJ?3~>aRtX#jFfy3kV zKSv-Fx=OGk-}T&8nz#JOI=&#|PPy(5=VXb}>P9>{=TnK}(~8%+B;6?GCv1LT4KgVl zpW0E4y7YqF+d9ehSwF4lqTX>g@shM%--YxJuaG$}qBQlAq}FxbAag84giN{@VI5nG zEWOPdWP+(8=6D55(qWS~$m|O_ILkT}WX2VBWz;SsJtSfEFl22KElF3+-Sq@JY|(~t?KpIdVW`;f7xetr(`kO`f=^lnE^ z>?*}OWLifwNAV7sxyGjjWJa$7kU)k%-7x~0(DB#}&Ix3C!{YU`2bsK`rRLG$1u~w+ z>;Gf|8PW|{kRfXHq>#z<_%$J9@;xSmOs*x%2_cj3{Zx?2x{664lX>Y0Ad`Q|7eE4c|Q zLgtZ`?(ky0Vi7WKrmxMSjGd3(aR?bZPyHW1p~?jQAamp=DcZ9K8E@F3P}Q-QQPdoL ziT2E86g5kwFwa^>;WucNkL<}}RXz%aubyJZRQbquj`$iZm5)NVC(fed2QuOL`rNhC z^8=Zlzjk_tAj99_2QvJrW(P9-$<}Z{CPDu$4v_IOiDP<)1Z2*OBn}vmIhNxcJRoDG z9OqyHnav^gwdsw6C8MzCCeHEDWE8t!O@sqaMzMQp1f#nHGI zVO2gN^30Tv^4#*NCoUglSk-Ro@==!eQY zsb4k0?Fpvv{mDx5gjRS0EdKhhPh1gJP&god0ssIoFaVtaDl!2w0X~sHoJgglBOxrk z*g&un32AQOXMRKeAA|$+1L-b7dI9(W`aqsmRPTU4fPMgde)sq?VJ zvlp{hi$MLwzc4zl#6IBx9 zAG@rS)VjxHn;Hb@e)W>o7APJB-_Lo=yb-Mg4Q;2J)Wj!J)g`W$RBaCZ%!xEll_J|B8l>$UQxDN4ne;%P_7ZXcfonn;_SRNUs)As zre5-TE_^1ss6;%c+_eip@4exOH(4kg3E3=JuWKpge(a_OlD|~s@rWKJsgwo9S_dh9 zUlFHs`;8i)Ow+@QXEWA5XC11fsIdMg#<-R($s-8<@8xwc$7>eJ;0P`4YsCO-6E3{- z9!RrQmMXSJi8B5bj7t5A|Jh|g+{yMatz}n{ktrsK6k!eJPtPiTc_^#!`x2REddoA` zS)Q`Y^_FL-zySUsUywB7m=&!6iD51h6RqZ>;eES>>5Qd}*U#3>qrPE;3qe4TFu~$x znY0zsul|So3jh4)1n_FkLSS0-aUjeteoO4NBrLWlzA%>xpTvwV_s!fwhdLAed zp!4NvrSl-d%A_Ir^yVl2=VT|{q-*QaRcnwI0{Ocu_Voj1l{k-~_dRHR_!A8jDB){z zLe4VW5$20@TAg5k-XXjK56=IRfB(P+@@`IZQPGm;g&{+KrahJ7Y3K+u+X&7n94Ho# weB#XrhTKgw@Fs^<5X!1kSKb(!fKr|`Ayw>fflPcj3q5~OAdRR3GkQo!3`@xG_5Fj&3 zzCH|W<~KkYg>4V=;&JjJv=ro>%WOvBHpTkQflYp?u3mkHq!R5huNg(y8>w&TkL%Mf zQA5q)>_aB``)Z%kuL6}CY!0s-?~s}05+(0z&v*G~wo8<3HlUP`bfrd2i7dzEqq#3p zYctF1S87VgT)&gxMJakXAd}*S6MkNfuDF9tnvk_LVh9hid*OKNz7 z3{R3JYmnh;&lY4jQ^7Z6W}Lp}1Tua$m#_nwjD$Pwv1%9$rVqJ?3~>aRtX#jFfy3kV zKSv-Fx=OGk-}T&8nz#JOI=&#|PPy(5=VXb}>P9>{=TnK}(~8%+B;6?GCv1LT4KgVl zpW0E4y7YqF+d9ehSwF4lqTX>g@shM%--YxJuaG$}qBQlAq}FxbAag84giN{@VI5nG zEWOPdWP+(8=6D55(qWS~$m|O_ILkT}WX2VBWz;SsJtSfEFl22KElF3+-Sq@JY|(~t?KpIdVW`;f7xetr(`kO`f=^lnE^ z>?*}OWLifwNAV7sxyGjjWJa$7kU)k%-7x~0(DB#}&Ix3C!{YU`2bsK`rRLG$1u~w+ z>;Gf|8PW|{kRfXHq>#z<_%$J9@;xSmOs*x%2_cj3{Zx?2x{664lX>Y0Ad`Q|7eE4c|Q zLgtZ`?(ky0Vi7WKrmxMSjGd3(aR?bZPyHW1p~?jQAamp=DcZ9K8E@F3P}Q-QQPdoL ziT2E86g5kwFwa^>;WucNkL<}}RXz%aubyJZRQbquj`$iZm5)NVC(fed2QuOL`rNhC z^8=Zlzjk_tAj99_2QvJrW(P9-$<}Z{CPDu$4v_IOiDP<)1Z2*OBn}vmIhNxcJRoDG z9OqyHnav^gwdsw6C8MzCCeHEDWE8t!O@sqaMzMQp1f#nHGI zVO2gN^30Tv^4#*NCoUglSk-Ro@==!eQY zsb4k0?Fpvv{mDx5gjRS0EdKhhPh1gJP&gpm0ssIIG60Q?aK6L&q;-DG!Z@?d*AHW_U{Q&#`{Q&*|onb`c0*>Yu3nY?<-%GpIZH)Pn{1*pbFk-Uv1z)T{Q*=f(-~iA~j83n( zvoVRx6>chmBQOAHCdMb0=`4{f-P1#vpIlP(Pi+**5p+LGYV}lcOVK^5TldA*2lqt2 zWjC<;Fc0QqVRHWK7`<55IqftpHG}b6Hp!a6qTg>6KhX;_86v7_ca%kEFYa}0&7(!+ z-^(x$RU&tO*ldi7sLo{0hjd={y92COU5dJVovvZ1={dU~=51pd)=EbfZNBIe?Ryya z`Q=;A(zFa@$jOApOeQj6F_Q_5m`qs!0RDIx!T>isHy#ER4@nvTNN8rE{5>Q9W@c=q zX^bPi$9&nh{kR{wcg5T&rZr!#ek`$~EQ~nqFhG;Re$Nq1SjW`85i)1$X8|Oudos7m z>hPP4?3a=Zb}yO3*l6+~dd_chkY=PRSz<{vsrKtc7me z#3COxy9ZiK4~&-$8w;a9Jq#|wNSL!+%{0a_54{S{%xay)?}sJ8eSRG4?>%y1 zSK}}k;T8~C$-wRyc7aSWm~uOtq+#AZmSh=kZgIPGBaiZtqhj%_Slz&@IFe)mD#YhO m*KmK}AM!X#z!(+HeC$%?#KE_5t}W5XJ^2Ar000000002?TrArF literal 0 HcmV?d00001 diff --git a/web/services/inbox.service.ts b/web/services/inbox.service.ts deleted file mode 100644 index b55c028707..0000000000 --- a/web/services/inbox.service.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { API_BASE_URL } from "@/helpers/common.helper"; -import { APIService } from "@/services/api.service"; -// helpers -// types -import type { IInboxIssue, IInbox, TInboxStatus, IInboxQueryParams } from "@plane/types"; - -export class InboxService extends APIService { - constructor() { - super(API_BASE_URL); - } - - async getInboxes(workspaceSlug: string, projectId: string): Promise { - return this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/`) - .then((response) => response?.data) - .catch((error) => { - throw error?.response?.data; - }); - } - - async getInboxById(workspaceSlug: string, projectId: string, inboxId: string): Promise { - return this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/`) - .then((response) => response?.data) - .catch((error) => { - throw error?.response?.data; - }); - } - - async patchInbox(workspaceSlug: string, projectId: string, inboxId: string, data: Partial): Promise { - return this.patch(`/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/`, data) - .then((response) => response?.data) - .catch((error) => { - throw error?.response?.data; - }); - } - - async getInboxIssues( - workspaceSlug: string, - projectId: string, - inboxId: string, - params?: IInboxQueryParams - ): Promise { - return this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/inbox-issues/`, { - params, - }) - .then((response) => response?.data) - .catch((error) => { - throw error?.response?.data; - }); - } - - async getInboxIssueById( - workspaceSlug: string, - projectId: string, - inboxId: string, - inboxIssueId: string - ): Promise { - return this.get( - `/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/inbox-issues/${inboxIssueId}/` - ) - .then((response) => response?.data) - .catch((error) => { - throw error?.response?.data; - }); - } - - async deleteInboxIssue( - workspaceSlug: string, - projectId: string, - inboxId: string, - inboxIssueId: string - ): Promise { - return this.delete( - `/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/inbox-issues/${inboxIssueId}/` - ) - .then((response) => response?.data) - .catch((error) => { - throw error?.response?.data; - }); - } - - async markInboxStatus( - workspaceSlug: string, - projectId: string, - inboxId: string, - inboxIssueId: string, - data: TInboxStatus - ): Promise { - return this.patch( - `/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/inbox-issues/${inboxIssueId}/`, - data - ) - .then((response) => response?.data) - .catch((error) => { - throw error?.response?.data; - }); - } - - async patchInboxIssue( - workspaceSlug: string, - projectId: string, - inboxId: string, - inboxIssueId: string, - data: { issue: Partial } - ): Promise { - return this.patch( - `/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/inbox-issues/${inboxIssueId}/`, - data - ) - .then((response) => response?.data) - .catch((error) => { - throw error?.response?.data; - }); - } - - async createInboxIssue(workspaceSlug: string, projectId: string, inboxId: string, data: any): Promise { - return this.post(`/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/inbox-issues/`, data) - .then((response) => response?.data) - .catch((error) => { - throw error?.response?.data; - }); - } -} diff --git a/web/services/inbox/inbox-issue.service.ts b/web/services/inbox/inbox-issue.service.ts index 6bedf1256f..f8fcf72c4e 100644 --- a/web/services/inbox/inbox-issue.service.ts +++ b/web/services/inbox/inbox-issue.service.ts @@ -1,40 +1,27 @@ +// types +import type { TInboxIssue, TIssue, TInboxIssueWithPagination } from "@plane/types"; import { API_BASE_URL } from "@/helpers/common.helper"; import { APIService } from "@/services/api.service"; // helpers -// types -import type { TInboxIssueFilterOptions, TInboxIssueExtendedDetail, TIssue, TInboxDetailedStatus } from "@plane/types"; export class InboxIssueService extends APIService { constructor() { super(API_BASE_URL); } - async fetchInboxIssues( - workspaceSlug: string, - projectId: string, - inboxId: string, - params?: TInboxIssueFilterOptions | {} - ): Promise { - return this.get( - `/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/inbox-issues/?expand=issue_inbox`, - { - params, - } - ) + async list(workspaceSlug: string, projectId: string, params = {}): Promise { + return this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/inbox-issues/`, { + params, + }) .then((response) => response?.data) .catch((error) => { throw error?.response?.data; }); } - async fetchInboxIssueById( - workspaceSlug: string, - projectId: string, - inboxId: string, - inboxIssueId: string - ): Promise { + async retrieve(workspaceSlug: string, projectId: string, inboxIssueId: string): Promise { return this.get( - `/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/inbox-issues/${inboxIssueId}/?expand=issue_inbox` + `/api/workspaces/${workspaceSlug}/projects/${projectId}/inbox-issues/${inboxIssueId}/?expand=issue_inbox` ) .then((response) => response?.data) .catch((error) => { @@ -42,68 +29,47 @@ export class InboxIssueService extends APIService { }); } - async createInboxIssue( - workspaceSlug: string, - projectId: string, - inboxId: string, - data: { - source: string; - issue: Partial; - } - ): Promise { - return this.post( - `/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/inbox-issues/?expand=issue_inbox`, - data - ) + async create(workspaceSlug: string, projectId: string, data: Partial): Promise { + return this.post(`/api/workspaces/${workspaceSlug}/projects/${projectId}/inbox-issues/`, { + source: "IN_APP", + issue: data, + }) .then((response) => response?.data) .catch((error) => { throw error?.response?.data; }); } - async updateInboxIssue( + async update( workspaceSlug: string, projectId: string, - inboxId: string, inboxIssueId: string, - data: { issue: Partial } - ): Promise { - return this.patch( - `/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/inbox-issues/${inboxIssueId}/?expand=issue_inbox`, - data - ) + data: Partial + ): Promise { + return this.patch(`/api/workspaces/${workspaceSlug}/projects/${projectId}/inbox-issues/${inboxIssueId}/`, data) .then((response) => response?.data) .catch((error) => { throw error?.response?.data; }); } - async removeInboxIssue( + async updateIssue( workspaceSlug: string, projectId: string, - inboxId: string, - inboxIssueId: string - ): Promise { - return this.delete( - `/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/inbox-issues/${inboxIssueId}/` - ) + inboxIssueId: string, + data: Partial + ): Promise { + return this.patch(`/api/workspaces/${workspaceSlug}/projects/${projectId}/inbox-issues/${inboxIssueId}/`, { + issue: data, + }) .then((response) => response?.data) .catch((error) => { throw error?.response?.data; }); } - async updateInboxIssueStatus( - workspaceSlug: string, - projectId: string, - inboxId: string, - inboxIssueId: string, - data: TInboxDetailedStatus - ): Promise { - return this.patch( - `/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/inbox-issues/${inboxIssueId}/?expand=issue_inbox`, - data - ) + async destroy(workspaceSlug: string, projectId: string, inboxIssueId: string): Promise { + return this.delete(`/api/workspaces/${workspaceSlug}/projects/${projectId}/inbox-issues/${inboxIssueId}/`) .then((response) => response?.data) .catch((error) => { throw error?.response?.data; diff --git a/web/services/inbox/inbox.service.ts b/web/services/inbox/inbox.service.ts deleted file mode 100644 index b14fcae213..0000000000 --- a/web/services/inbox/inbox.service.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { API_BASE_URL } from "@/helpers/common.helper"; -import { APIService } from "@/services/api.service"; -// helpers -// types -import type { TInbox } from "@plane/types"; - -export class InboxService extends APIService { - constructor() { - super(API_BASE_URL); - } - - async fetchInboxes(workspaceSlug: string, projectId: string): Promise { - return this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/`) - .then((response) => response?.data) - .catch((error) => { - throw error?.response?.data; - }); - } - - async fetchInboxById(workspaceSlug: string, projectId: string, inboxId: string): Promise { - return this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/`) - .then((response) => response?.data) - .catch((error) => { - throw error?.response?.data; - }); - } - - async updateInbox(workspaceSlug: string, projectId: string, inboxId: string, data: Partial): Promise { - return this.patch(`/api/workspaces/${workspaceSlug}/projects/${projectId}/inboxes/${inboxId}/`, data) - .then((response) => response?.data) - .catch((error) => { - throw error?.response?.data; - }); - } -} diff --git a/web/services/inbox/index.ts b/web/services/inbox/index.ts index fe3f30fce4..f4a25e3613 100644 --- a/web/services/inbox/index.ts +++ b/web/services/inbox/index.ts @@ -1,2 +1 @@ -export * from "./inbox.service"; export * from "./inbox-issue.service"; diff --git a/web/store/inbox/inbox-issue.store.ts b/web/store/inbox/inbox-issue.store.ts new file mode 100644 index 0000000000..1807645dbc --- /dev/null +++ b/web/store/inbox/inbox-issue.store.ts @@ -0,0 +1,139 @@ +import set from "lodash/set"; +import { makeObservable, observable, runInAction, action } from "mobx"; +// services +// types +import { TIssue, TInboxIssue, TInboxIssueStatus } from "@plane/types"; +import { InboxIssueService } from "@/services/inbox"; + +export interface IInboxIssueStore { + isLoading: boolean; + id: string; + status: TInboxIssueStatus; + issue: Partial; + snoozed_till: Date | undefined; + duplicate_to: string | undefined; + created_by: string | undefined; + // actions + updateInboxIssueStatus: (status: TInboxIssueStatus) => Promise; // accept, decline + updateInboxIssueDuplicateTo: (issueId: string) => Promise; // connecting the inbox issue to the project existing issue + updateInboxIssueSnoozeTill: (date: Date) => Promise; // snooze the issue + updateIssue: (issue: Partial) => Promise; // updating the issue +} + +export class InboxIssueStore implements IInboxIssueStore { + // observables + isLoading: boolean = false; + id: string; + status: TInboxIssueStatus = -2; + issue: Partial = {}; + snoozed_till: Date | undefined; + duplicate_to: string | undefined; + created_by: string | undefined; + workspaceSlug: string; + projectId: string; + // services + inboxIssueService; + + constructor(workspaceSlug: string, projectId: string, data: TInboxIssue) { + this.id = data.id; + this.status = data.status; + this.issue = data?.issue; + this.snoozed_till = data?.snoozed_till ? new Date(data.snoozed_till) : undefined; + this.duplicate_to = data?.duplicate_to || undefined; + this.created_by = data?.created_by || undefined; + this.workspaceSlug = workspaceSlug; + this.projectId = projectId; + // services + this.inboxIssueService = new InboxIssueService(); + // observable variables should be defined after the initialization of the values + makeObservable(this, { + id: observable, + status: observable, + issue: observable, + snoozed_till: observable, + duplicate_to: observable, + created_by: observable, + // actions + updateInboxIssueStatus: action, + updateInboxIssueDuplicateTo: action, + updateInboxIssueSnoozeTill: action, + updateIssue: action, + }); + } + + updateInboxIssueStatus = async (status: TInboxIssueStatus) => { + const previousData: Partial = { + status: this.status, + }; + try { + if (!this.issue.id) return; + set(this, "status", status); + await this.inboxIssueService.update(this.workspaceSlug, this.projectId, this.issue.id, { + status: status, + }); + } catch { + runInAction(() => set(this, "status", previousData.status)); + } + }; + + updateInboxIssueDuplicateTo = async (issueId: string) => { + const inboxStatus = 2; + const previousData: Partial = { + status: this.status, + duplicate_to: this.duplicate_to, + }; + try { + if (!this.issue.id) return; + set(this, "status", inboxStatus); + set(this, "duplicate_to", issueId); + await this.inboxIssueService.update(this.workspaceSlug, this.projectId, this.issue.id, { + status: inboxStatus, + duplicate_to: issueId, + }); + } catch { + runInAction(() => { + set(this, "status", previousData.status); + set(this, "duplicate_to", previousData.duplicate_to); + }); + } + }; + + updateInboxIssueSnoozeTill = async (date: Date) => { + const inboxStatus = 0; + const previousData: Partial = { + status: this.status, + snoozed_till: this.snoozed_till, + }; + try { + if (!this.issue.id) return; + set(this, "status", inboxStatus); + set(this, "snoozed_till", date); + await this.inboxIssueService.update(this.workspaceSlug, this.projectId, this.issue.id, { + status: inboxStatus, + snoozed_till: new Date(date), + }); + } catch { + runInAction(() => { + set(this, "status", previousData.status); + set(this, "snoozed_till", previousData.snoozed_till); + }); + } + }; + + updateIssue = async (issue: Partial) => { + const inboxIssue = this.issue; + try { + if (!this.issue.id) return; + Object.keys(issue).forEach((key) => { + const issueKey = key as keyof TIssue; + set(inboxIssue, issueKey, issue[issueKey]); + }); + await this.inboxIssueService.updateIssue(this.workspaceSlug, this.projectId, this.issue.id, issue); + } catch { + Object.keys(issue).forEach((key) => { + const issueKey = key as keyof TIssue; + set(inboxIssue, issueKey, inboxIssue[issueKey]); + }); + } + }; +} diff --git a/web/store/inbox/inbox.store.ts b/web/store/inbox/inbox.store.ts deleted file mode 100644 index 5d90b6d470..0000000000 --- a/web/store/inbox/inbox.store.ts +++ /dev/null @@ -1,114 +0,0 @@ -import concat from "lodash/concat"; -import set from "lodash/set"; -import uniq from "lodash/uniq"; -import update from "lodash/update"; -import { observable, action, makeObservable, runInAction } from "mobx"; -import { computedFn } from "mobx-utils"; -// services -import { InboxService } from "@/services/inbox/inbox.service"; -// types -import { RootStore } from "@/store/root.store"; -import { TInboxDetailMap, TInboxDetailIdMap, TInbox } from "@plane/types"; - -export interface IInbox { - // observables - inboxes: TInboxDetailIdMap; - inboxMap: TInboxDetailMap; - // helper methods - getInboxesByProjectId: (projectId: string) => string[] | undefined; - getInboxById: (inboxId: string) => TInbox | undefined; - // fetch actions - fetchInboxes: (workspaceSlug: string, projectId: string) => Promise; - fetchInboxById: (workspaceSlug: string, projectId: string, inboxId: string) => Promise; - updateInbox: (workspaceSlug: string, projectId: string, inboxId: string, data: Partial) => Promise; -} - -export class Inbox implements IInbox { - // observables - inboxes: TInboxDetailIdMap = {}; - inboxMap: TInboxDetailMap = {}; - // root store - rootStore; - // services - inboxService; - - constructor(_rootStore: RootStore) { - makeObservable(this, { - // observables - inboxMap: observable, - inboxes: observable, - // actions - fetchInboxes: action, - fetchInboxById: action, - updateInbox: action, - }); - // root store - this.rootStore = _rootStore; - // services - this.inboxService = new InboxService(); - } - - // helper methods - getInboxesByProjectId = computedFn((projectId: string) => { - if (!projectId) return undefined; - return this.inboxes?.[projectId] ?? undefined; - }); - - getInboxById = computedFn((inboxId: string) => { - if (!inboxId) return undefined; - return this.inboxMap[inboxId] ?? undefined; - }); - - // actions - fetchInboxes = async (workspaceSlug: string, projectId: string) => { - try { - const response = await this.inboxService.fetchInboxes(workspaceSlug, projectId); - - const _inboxIds = response.map((inbox) => inbox.id); - runInAction(() => { - response.forEach((inbox) => { - set(this.inboxMap, inbox.id, inbox); - }); - set(this.inboxes, projectId, _inboxIds); - }); - - return response; - } catch (error) { - throw error; - } - }; - - fetchInboxById = async (workspaceSlug: string, projectId: string, inboxId: string) => { - try { - const response = await this.inboxService.fetchInboxById(workspaceSlug, projectId, inboxId); - - runInAction(() => { - set(this.inboxMap, inboxId, response); - update(this.inboxes, projectId, (inboxIds: string[] = []) => { - if (inboxIds.includes(inboxId)) return inboxIds; - return uniq(concat(inboxIds, inboxId)); - }); - }); - - return response; - } catch (error) { - throw error; - } - }; - - updateInbox = async (workspaceSlug: string, projectId: string, inboxId: string, data: Partial) => { - try { - const response = await this.inboxService.updateInbox(workspaceSlug, projectId, inboxId, data); - - runInAction(() => { - Object.keys(response).forEach((key) => { - set(this.inboxMap, [inboxId, key], response[key as keyof TInbox]); - }); - }); - - return response; - } catch (error) { - throw error; - } - }; -} diff --git a/web/store/inbox/inbox_filter.store.ts b/web/store/inbox/inbox_filter.store.ts deleted file mode 100644 index 603c75f9b5..0000000000 --- a/web/store/inbox/inbox_filter.store.ts +++ /dev/null @@ -1,129 +0,0 @@ -import isEmpty from "lodash/isEmpty"; -import set from "lodash/set"; -import { observable, action, makeObservable, runInAction, computed } from "mobx"; -// services -import { InboxService } from "@/services/inbox.service"; -// types -import { RootStore } from "@/store/root.store"; -import { TInboxIssueFilterOptions, TInboxIssueFilters, TInboxIssueQueryParams, TInbox } from "@plane/types"; - -export interface IInboxFilter { - // observables - filters: Record; // inbox_id -> TInboxIssueFilters - // computed - inboxFilters: TInboxIssueFilters | undefined; - inboxAppliedFilters: Partial> | undefined; - // actions - fetchInboxFilters: (workspaceSlug: string, projectId: string, inboxId: string) => Promise; - updateInboxFilters: ( - workspaceSlug: string, - projectId: string, - inboxId: string, - filters: Partial - ) => Promise; -} - -export class InboxFilter implements IInboxFilter { - // observables - filters: Record = {}; - // root store - rootStore; - // services - inboxService; - - constructor(_rootStore: RootStore) { - makeObservable(this, { - // observables - filters: observable, - // computed - inboxFilters: computed, - inboxAppliedFilters: computed, - // actions - fetchInboxFilters: action, - updateInboxFilters: action, - }); - // root store - this.rootStore = _rootStore; - // services - this.inboxService = new InboxService(); - } - - get inboxFilters() { - const inboxId = this.rootStore.app.router.inboxId; - if (!inboxId) return undefined; - - const displayFilters = this.filters[inboxId] || undefined; - if (isEmpty(displayFilters)) return undefined; - - const _filters: TInboxIssueFilters = { - filters: { - priority: isEmpty(displayFilters?.filters?.priority) ? [] : displayFilters?.filters?.priority, - inbox_status: isEmpty(displayFilters?.filters?.inbox_status) ? [] : displayFilters?.filters?.inbox_status, - }, - }; - return _filters; - } - - get inboxAppliedFilters() { - const userFilters = this.inboxFilters; - if (!userFilters) return undefined; - - const filteredParams = { - priority: userFilters?.filters?.priority?.join(",") || undefined, - inbox_status: userFilters?.filters?.inbox_status?.join(",") || undefined, - }; - return filteredParams; - } - - fetchInboxFilters = async (workspaceSlug: string, projectId: string, inboxId: string) => { - try { - const response = await this.rootStore.inbox.inbox.fetchInboxById(workspaceSlug, projectId, inboxId); - - const filters: TInboxIssueFilterOptions = { - priority: response?.view_props?.filters?.priority || [], - inbox_status: response?.view_props?.filters?.inbox_status || [], - }; - - runInAction(() => { - set(this.filters, [inboxId], { filters: filters }); - }); - - return response; - } catch (error) { - throw error; - } - }; - - updateInboxFilters = async ( - workspaceSlug: string, - projectId: string, - inboxId: string, - filters: Partial - ) => { - try { - runInAction(() => { - Object.keys(filters).forEach((_key) => { - const _filterKey = _key as keyof TInboxIssueFilterOptions; - set(this.filters, [inboxId, "filters", _key], filters[_filterKey]); - }); - }); - - const inboxFilters = this.inboxFilters; - let _filters: TInboxIssueFilterOptions = { - priority: inboxFilters?.filters?.priority || [], - inbox_status: inboxFilters?.filters?.inbox_status || [], - }; - _filters = { ..._filters, ...filters }; - - this.rootStore.inbox.inboxIssue.fetchInboxIssues(workspaceSlug, projectId, inboxId, "mutation"); - - const response = await this.rootStore.inbox.inbox.updateInbox(workspaceSlug, projectId, inboxId, { - view_props: { filters: _filters }, - }); - - return response; - } catch (error) { - throw error; - } - }; -} diff --git a/web/store/inbox/inbox_issue.store.ts b/web/store/inbox/inbox_issue.store.ts deleted file mode 100644 index 6e5eb94f0b..0000000000 --- a/web/store/inbox/inbox_issue.store.ts +++ /dev/null @@ -1,267 +0,0 @@ -import concat from "lodash/concat"; -import pull from "lodash/pull"; -import set from "lodash/set"; -import uniq from "lodash/uniq"; -import update from "lodash/update"; -import { observable, action, makeObservable, runInAction } from "mobx"; -import { computedFn } from "mobx-utils"; -// services -import { InboxIssueService } from "@/services/inbox/inbox-issue.service"; -// types -import { RootStore } from "@/store/root.store"; -import type { - TInboxIssueDetailIdMap, - TInboxIssueDetailMap, - TInboxIssueDetail, - TInboxIssueExtendedDetail, - TInboxDetailedStatus, - TIssue, -} from "@plane/types"; - -type TLoader = "init-loader" | "mutation" | undefined; - -export interface IInboxIssue { - // observables - loader: TLoader; - inboxIssues: TInboxIssueDetailIdMap; - inboxIssueMap: TInboxIssueDetailMap; - // helper methods - getInboxIssuesByInboxId: (inboxId: string) => string[] | undefined; - getInboxIssueByIssueId: (inboxId: string, issueId: string) => TInboxIssueDetail | undefined; - // actions - fetchInboxIssues: ( - workspaceSlug: string, - projectId: string, - inboxId: string, - loaderType?: TLoader - ) => Promise; - fetchInboxIssueById: ( - workspaceSlug: string, - projectId: string, - inboxId: string, - inboxIssueId: string - ) => Promise; - createInboxIssue: ( - workspaceSlug: string, - projectId: string, - inboxId: string, - data: Partial - ) => Promise; - updateInboxIssue: ( - workspaceSlug: string, - projectId: string, - inboxId: string, - inboxIssueId: string, - data: Partial - ) => Promise; - removeInboxIssue: (workspaceSlug: string, projectId: string, inboxId: string, issueId: string) => Promise; - updateInboxIssueStatus: ( - workspaceSlug: string, - projectId: string, - inboxId: string, - inboxIssueId: string, - data: TInboxDetailedStatus - ) => Promise; -} - -export class InboxIssue implements IInboxIssue { - // observables - loader: TLoader = "init-loader"; - inboxIssues: TInboxIssueDetailIdMap = {}; - inboxIssueMap: TInboxIssueDetailMap = {}; - // root store - rootStore; - // services - inboxIssueService; - - constructor(_rootStore: RootStore) { - makeObservable(this, { - // observables - loader: observable.ref, - inboxIssues: observable, - inboxIssueMap: observable, - // actions - fetchInboxIssues: action, - fetchInboxIssueById: action, - createInboxIssue: action, - updateInboxIssue: action, - removeInboxIssue: action, - updateInboxIssueStatus: action, - }); - - // root store - this.rootStore = _rootStore; - // services - this.inboxIssueService = new InboxIssueService(); - } - - // helper methods - getInboxIssuesByInboxId = computedFn((inboxId: string) => { - if (!inboxId) return undefined; - return this.inboxIssues?.[inboxId] ?? undefined; - }); - - getInboxIssueByIssueId = computedFn((inboxId: string, issueId: string) => { - if (!inboxId) return undefined; - return this.inboxIssueMap?.[inboxId]?.[issueId] ?? undefined; - }); - - // actions - fetchInboxIssues = async ( - workspaceSlug: string, - projectId: string, - inboxId: string, - loaderType: TLoader = "init-loader" - ) => { - try { - this.loader = loaderType; - const queryParams = this.rootStore.inbox.inboxFilter.inboxAppliedFilters ?? {}; - - const response = await this.inboxIssueService.fetchInboxIssues(workspaceSlug, projectId, inboxId, queryParams); - - runInAction(() => { - response.forEach((_inboxIssue) => { - const { ["issue_inbox"]: issueInboxDetail, ...issue } = _inboxIssue; - this.rootStore.inbox.rootStore.issue.issues.addIssue([issue]); - const { ["id"]: omittedId, ...inboxIssue } = issueInboxDetail[0]; - set(this.inboxIssueMap, [inboxId, _inboxIssue.id], inboxIssue); - }); - }); - - const _inboxIssueIds = response.map((inboxIssue) => inboxIssue.id); - runInAction(() => { - set(this.inboxIssues, inboxId, _inboxIssueIds); - this.loader = undefined; - }); - - return response; - } catch (error) { - this.loader = undefined; - throw error; - } - }; - - fetchInboxIssueById = async (workspaceSlug: string, projectId: string, inboxId: string, inboxIssueId: string) => { - try { - const response = await this.inboxIssueService.fetchInboxIssueById( - workspaceSlug, - projectId, - inboxId, - inboxIssueId - ); - - runInAction(() => { - const { ["issue_inbox"]: issueInboxDetail, ...issue } = response; - this.rootStore.inbox.rootStore.issue.issues.updateIssue(issue.id, issue); - const { ["id"]: omittedId, ...inboxIssue } = issueInboxDetail[0]; - set(this.inboxIssueMap, [inboxId, response.id], inboxIssue); - }); - - runInAction(() => { - update(this.inboxIssues, inboxId, (inboxIssueIds: string[] = []) => { - if (inboxIssueIds.includes(response.id)) return inboxIssueIds; - return uniq(concat(inboxIssueIds, response.id)); - }); - }); - - // fetching issue activity - await this.rootStore.issue.issueDetail.fetchActivities(workspaceSlug, projectId, inboxIssueId); - // fetching issue reaction - await this.rootStore.issue.issueDetail.fetchReactions(workspaceSlug, projectId, inboxIssueId); - return response as any; - } catch (error) { - throw error; - } - }; - - createInboxIssue = async (workspaceSlug: string, projectId: string, inboxId: string, data: Partial) => { - try { - const response = await this.inboxIssueService.createInboxIssue(workspaceSlug, projectId, inboxId, { - source: "in-app", - issue: data, - }); - - runInAction(() => { - const { ["issue_inbox"]: issueInboxDetail, ...issue } = response; - this.rootStore.inbox.rootStore.issue.issues.addIssue([issue]); - const { ["id"]: omittedId, ...inboxIssue } = issueInboxDetail[0]; - set(this.inboxIssueMap, [inboxId, response.id], inboxIssue); - update(this.rootStore.inbox.inbox.inboxMap, [inboxId, "pending_issue_count"], (count: number = 0) => count + 1); - }); - - runInAction(() => { - update(this.inboxIssues, inboxId, (inboxIssueIds: string[] = []) => { - if (inboxIssueIds.includes(response.id)) return inboxIssueIds; - return uniq(concat(inboxIssueIds, response.id)); - }); - }); - - await this.rootStore.issue.issueDetail.fetchActivities(workspaceSlug, projectId, response.id); - return response; - } catch (error) { - throw error; - } - }; - - updateInboxIssue = async ( - workspaceSlug: string, - projectId: string, - inboxId: string, - inboxIssueId: string, - data: Partial - ) => { - try { - const response = await this.inboxIssueService.updateInboxIssue(workspaceSlug, projectId, inboxId, inboxIssueId, { - issue: data, - }); - - this.rootStore.inbox.rootStore.issue.issues.updateIssue(inboxIssueId, data); - - await this.rootStore.issue.issueDetail.fetchActivities(workspaceSlug, projectId, inboxIssueId); - } catch (error) { - throw error; - } - }; - - removeInboxIssue = async (workspaceSlug: string, projectId: string, inboxId: string, inboxIssueId: string) => { - try { - await this.inboxIssueService.removeInboxIssue(workspaceSlug, projectId, inboxId, inboxIssueId); - - runInAction(() => { - pull(this.inboxIssues[inboxId], inboxIssueId); - delete this.inboxIssueMap[inboxId][inboxIssueId]; - this.rootStore.inbox.rootStore.issue.issues.removeIssue(inboxIssueId); - update(this.rootStore.inbox.inbox.inboxMap, [inboxId, "pending_issue_count"], (count: number = 0) => count - 1); - }); - - await this.rootStore.issue.issueDetail.fetchActivities(workspaceSlug, projectId, inboxIssueId); - } catch (error) { - throw error; - } - }; - - updateInboxIssueStatus = async ( - workspaceSlug: string, - projectId: string, - inboxId: string, - inboxIssueId: string, - data: TInboxDetailedStatus - ) => { - try { - await this.inboxIssueService.updateInboxIssueStatus(workspaceSlug, projectId, inboxId, inboxIssueId, data); - - const pendingStatus = -2; - runInAction(() => { - set(this.inboxIssueMap, [inboxId, inboxIssueId, "status"], data.status); - - update(this.rootStore.inbox.inbox.inboxMap, [inboxId, "pending_issue_count"], (count: number = 0) => - data.status === pendingStatus ? count + 1 : count - 1 - ); - }); - - await this.rootStore.issue.issueDetail.fetchActivities(workspaceSlug, projectId, inboxIssueId); - } catch (error) { - throw error; - } - }; -} diff --git a/web/store/inbox/project-inbox.store.ts b/web/store/inbox/project-inbox.store.ts new file mode 100644 index 0000000000..b871ccb98d --- /dev/null +++ b/web/store/inbox/project-inbox.store.ts @@ -0,0 +1,353 @@ +import isEmpty from "lodash/isEmpty"; +import omit from "lodash/omit"; +import set from "lodash/set"; +import { action, computed, makeObservable, observable, runInAction } from "mobx"; +import { computedFn } from "mobx-utils"; +// types +import { + TInboxIssue, + TInboxIssueCurrentTab, + TInboxIssueFilter, + TInboxIssueSorting, + TInboxIssuePaginationInfo, + TInboxIssueSortingOrderByQueryParam, +} from "@plane/types"; +// services +import { InboxIssueService } from "@/services/inbox"; +// root store +import { IInboxIssueStore, InboxIssueStore } from "@/store/inbox/inbox-issue.store"; +import { RootStore } from "@/store/root.store"; + +type TLoader = "init-loading" | "filter-loading" | "pagination-loading" | "issue-loading" | undefined; + +export interface IProjectInboxStore { + currentTab: TInboxIssueCurrentTab; + isLoading: TLoader; + error: { message: string; status: "init-error" | "pagination-error" } | undefined; + inboxFilters: Partial; + inboxSorting: Partial; + inboxIssuePaginationInfo: TInboxIssuePaginationInfo | undefined; + inboxIssues: Record; + // computed + getAppliedFiltersCount: number; + inboxIssuesArray: IInboxIssueStore[]; + // helper actions + getIssueInboxByIssueId: (issueId: string) => IInboxIssueStore | undefined; + inboxIssueQueryParams: ( + inboxFilters: Partial, + inboxSorting: Partial, + pagePerCount: number, + paginationCursor: string + ) => Partial>; + // actions + handleCurrentTab: (tab: TInboxIssueCurrentTab) => void; + handleInboxIssueFilters: (key: T, value: TInboxIssueFilter[T]) => void; // if user sends me undefined, I will remove the value from the filter key + handleInboxIssueSorting: (key: T, value: TInboxIssueSorting[T]) => void; // if user sends me undefined, I will remove the value from the filter key + fetchInboxIssues: (workspaceSlug: string, projectId: string, loadingType?: TLoader) => Promise; + fetchInboxPaginationIssues: (workspaceSlug: string, projectId: string) => Promise; + fetchInboxIssueById: (workspaceSlug: string, projectId: string, inboxIssueId: string) => Promise; + createInboxIssue: ( + workspaceSlug: string, + projectId: string, + data: Partial + ) => Promise; + deleteInboxIssue: (workspaceSlug: string, projectId: string, inboxIssueId: string) => Promise; +} + +export class ProjectInboxStore implements IProjectInboxStore { + // constants + PER_PAGE_COUNT = 10; + // observables + currentTab: TInboxIssueCurrentTab = "open"; + isLoading: TLoader = undefined; + error: { message: string; status: "init-error" | "pagination-error" } | undefined = undefined; + inboxFilters: Partial = { + status: [-2], + }; + inboxSorting: Partial = { + order_by: "issue__created_at", + sort_by: "desc", + }; + inboxIssuePaginationInfo: TInboxIssuePaginationInfo | undefined = undefined; + inboxIssues: Record = {}; + // services + inboxIssueService; + + constructor(private store: RootStore) { + makeObservable(this, { + currentTab: observable.ref, + isLoading: observable.ref, + inboxFilters: observable, + inboxSorting: observable, + inboxIssuePaginationInfo: observable, + inboxIssues: observable, + // computed + getAppliedFiltersCount: computed, + inboxIssuesArray: computed, + // actions + handleInboxIssueFilters: action, + handleInboxIssueSorting: action, + fetchInboxIssues: action, + fetchInboxPaginationIssues: action, + fetchInboxIssueById: action, + createInboxIssue: action, + deleteInboxIssue: action, + }); + this.inboxIssueService = new InboxIssueService(); + } + + // computed + get getAppliedFiltersCount() { + let count = 0; + this.inboxFilters != undefined && + Object.keys(this.inboxFilters).forEach((key) => { + const filterKey = key as keyof TInboxIssueFilter; + if (this.inboxFilters[filterKey] && this.inboxFilters?.[filterKey]) + count = count + (this.inboxFilters?.[filterKey]?.length ?? 0); + }); + return count; + } + + get inboxIssuesArray() { + return Object.values(this.inboxIssues || {}).filter((inbox) => + (this.currentTab === "open" ? [-2] : [-1, 0, 1, 2]).includes(inbox.status) + ); + } + + getIssueInboxByIssueId = computedFn((issueId: string) => this.inboxIssues?.[issueId] || undefined); + + inboxIssueQueryParams = ( + inboxFilters: Partial, + inboxSorting: Partial, + pagePerCount: number, + paginationCursor: string + ) => { + const filters: Partial> = {}; + !isEmpty(inboxFilters) && + Object.keys(inboxFilters).forEach((key) => { + const filterKey = key as keyof TInboxIssueFilter; + if (inboxFilters[filterKey] && inboxFilters[filterKey]?.length) + filters[filterKey] = inboxFilters[filterKey]?.join(","); + }); + + const sorting: TInboxIssueSortingOrderByQueryParam = { + order_by: "-issue__created_at", + }; + if (inboxSorting?.order_by && inboxSorting?.sort_by) { + switch (inboxSorting.order_by) { + case "issue__created_at": + if (inboxSorting.sort_by === "desc") sorting.order_by = `-issue__created_at`; + else sorting.order_by = "issue__created_at"; + break; + case "issue__updated_at": + if (inboxSorting.sort_by === "desc") sorting.order_by = `-issue__updated_at`; + else sorting.order_by = "issue__updated_at"; + break; + case "issue__sequence_id": + if (inboxSorting.sort_by === "desc") sorting.order_by = `-issue__sequence_id`; + else sorting.order_by = "issue__sequence_id"; + break; + default: + sorting.order_by = "-issue__created_at"; + break; + } + } + + return { + ...filters, + ...sorting, + per_page: pagePerCount, + cursor: paginationCursor, + }; + }; + + // actions + handleCurrentTab = (tab: TInboxIssueCurrentTab) => { + set(this, "currentTab", tab); + set(this, "inboxFilters", undefined); + set(this, ["inboxSorting", "order_by"], "issue__created_at"); + set(this, ["inboxSorting", "sort_by"], "desc"); + if (tab === "closed") set(this, ["inboxFilters", "status"], [-1, 0, 1, 2]); + else set(this, ["inboxFilters", "status"], [-2]); + const { workspaceSlug, projectId } = this.store.app.router; + if (workspaceSlug && projectId) this.fetchInboxIssues(workspaceSlug, projectId, "filter-loading"); + }; + + handleInboxIssueFilters = (key: T, value: TInboxIssueFilter[T]) => { + set(this.inboxFilters, key, value); + const { workspaceSlug, projectId } = this.store.app.router; + if (workspaceSlug && projectId) this.fetchInboxIssues(workspaceSlug, projectId, "filter-loading"); + }; + + handleInboxIssueSorting = (key: T, value: TInboxIssueSorting[T]) => { + set(this.inboxSorting, key, value); + const { workspaceSlug, projectId } = this.store.app.router; + if (workspaceSlug && projectId) this.fetchInboxIssues(workspaceSlug, projectId, "filter-loading"); + }; + + /** + * @description fetch inbox issues with paginated data + * @param workspaceSlug + * @param projectId + */ + fetchInboxIssues = async (workspaceSlug: string, projectId: string, loadingType: TLoader = undefined) => { + try { + if (loadingType) this.isLoading = loadingType; + else this.isLoading = "init-loading"; + this.inboxIssuePaginationInfo = undefined; + this.inboxIssues = {}; + + const queryParams = this.inboxIssueQueryParams( + this.inboxFilters, + this.inboxSorting, + this.PER_PAGE_COUNT, + `${this.PER_PAGE_COUNT}:0:0` + ); + const { results, ...paginationInfo } = await this.inboxIssueService.list(workspaceSlug, projectId, queryParams); + + runInAction(() => { + this.isLoading = undefined; + set(this, "inboxIssuePaginationInfo", paginationInfo); + if (results && results.length > 0) + results.forEach((value: TInboxIssue) => { + if (this.getIssueInboxByIssueId(value?.issue?.id) === undefined) + set(this.inboxIssues, value?.issue?.id, new InboxIssueStore(workspaceSlug, projectId, value)); + }); + }); + } catch (error) { + console.error("Error fetching the inbox issues", error); + this.isLoading = undefined; + this.error = { + message: "Error fetching the inbox issues please try again later.", + status: "init-error", + }; + throw error; + } + }; + + /** + * @description fetch inbox issues with paginated data + * @param workspaceSlug + * @param projectId + */ + fetchInboxPaginationIssues = async (workspaceSlug: string, projectId: string) => { + try { + if ( + !this.inboxIssuePaginationInfo?.total_results || + (this.inboxIssuePaginationInfo?.total_results && + this.inboxIssuesArray.length < this.inboxIssuePaginationInfo?.total_results) + ) { + this.isLoading = "pagination-loading"; + + const queryParams = this.inboxIssueQueryParams( + this.inboxFilters, + this.inboxSorting, + this.PER_PAGE_COUNT, + this.inboxIssuePaginationInfo?.next_cursor || `${this.PER_PAGE_COUNT}:0:0` + ); + const { results, ...paginationInfo } = await this.inboxIssueService.list(workspaceSlug, projectId, queryParams); + + runInAction(() => { + this.isLoading = undefined; + set(this, "inboxIssuePaginationInfo", paginationInfo); + if (results && results.length > 0) + results.forEach((value: TInboxIssue) => { + if (this.getIssueInboxByIssueId(value?.issue?.id) === undefined) + set(this.inboxIssues, value?.issue?.id, new InboxIssueStore(workspaceSlug, projectId, value)); + }); + }); + } else set(this, ["inboxIssuePaginationInfo", "next_page_results"], false); + } catch (error) { + console.error("Error fetching the inbox issues", error); + this.isLoading = undefined; + this.error = { + message: "Error fetching the paginated inbox issues please try again later.", + status: "pagination-error", + }; + throw error; + } + }; + + /** + * @description fetch inbox issue with issue id + * @param workspaceSlug + * @param projectId + * @param inboxIssueId + */ + fetchInboxIssueById = async (workspaceSlug: string, projectId: string, inboxIssueId: string) => { + try { + this.isLoading = "issue-loading"; + const inboxIssue = await this.inboxIssueService.retrieve(workspaceSlug, projectId, inboxIssueId); + const issueId = inboxIssue?.issue?.id || undefined; + + if (inboxIssue && issueId) { + // fetching reactions + await this.store.issue.issueDetail.fetchReactions(workspaceSlug, projectId, issueId); + // fetching activity + await this.store.issue.issueDetail.fetchReactions(workspaceSlug, projectId, issueId); + // fetching comments + await this.store.issue.issueDetail.fetchReactions(workspaceSlug, projectId, issueId); + runInAction(() => { + set(this.inboxIssues, issueId, new InboxIssueStore(workspaceSlug, projectId, inboxIssue)); + }); + this.isLoading = undefined; + } + } catch { + console.error("Error fetching the inbox issue with inbox issue id"); + this.isLoading = undefined; + } + }; + + /** + * @description create inbox issue + * @param workspaceSlug + * @param projectId + * @param data + */ + createInboxIssue = async (workspaceSlug: string, projectId: string, data: Partial) => { + try { + const inboxIssueResponse = await this.inboxIssueService.create(workspaceSlug, projectId, data); + if (inboxIssueResponse) + runInAction(() => { + set( + this.inboxIssues, + inboxIssueResponse?.issue?.id, + new InboxIssueStore(workspaceSlug, projectId, inboxIssueResponse) + ); + set( + this, + ["inboxIssuePaginationInfo", "total_results"], + (this.inboxIssuePaginationInfo?.total_results || 0) + 1 + ); + }); + return inboxIssueResponse; + } catch { + console.error("Error creating the inbox issue"); + } + }; + + /** + * @description delete inbox issue + * @param workspaceSlug + * @param projectId + * @param inboxIssueId + */ + deleteInboxIssue = async (workspaceSlug: string, projectId: string, inboxIssueId: string) => { + const currentIssue = this.inboxIssues?.[inboxIssueId]; + try { + if (!currentIssue) return; + runInAction(() => { + set( + this, + ["inboxIssuePaginationInfo", "total_results"], + (this.inboxIssuePaginationInfo?.total_results || 0) - 1 + ); + set(this, "inboxIssues", omit(this.inboxIssues, inboxIssueId)); + }); + await this.inboxIssueService.destroy(workspaceSlug, projectId, inboxIssueId); + } catch { + console.error("Error removing the inbox issue"); + set(this.inboxIssues, [inboxIssueId], currentIssue); + } + }; +} diff --git a/web/store/inbox/root.store.ts b/web/store/inbox/root.store.ts deleted file mode 100644 index 0628e28ab4..0000000000 --- a/web/store/inbox/root.store.ts +++ /dev/null @@ -1,26 +0,0 @@ -// types -import { RootStore } from "@/store/root.store"; -import { IInbox, Inbox } from "./inbox.store"; -import { IInboxFilter, InboxFilter } from "./inbox_filter.store"; -import { IInboxIssue, InboxIssue } from "./inbox_issue.store"; - -export interface IInboxRootStore { - rootStore: RootStore; - inbox: IInbox; - inboxIssue: IInboxIssue; - inboxFilter: IInboxFilter; -} - -export class InboxRootStore implements IInboxRootStore { - rootStore: RootStore; - inbox: IInbox; - inboxIssue: IInboxIssue; - inboxFilter: IInboxFilter; - - constructor(_rootStore: RootStore) { - this.rootStore = _rootStore; - this.inbox = new Inbox(_rootStore); - this.inboxIssue = new InboxIssue(_rootStore); - this.inboxFilter = new InboxFilter(_rootStore); - } -} diff --git a/web/store/issue/project/filter.store.ts b/web/store/issue/project/filter.store.ts index 707f8e7057..66ce98344e 100644 --- a/web/store/issue/project/filter.store.ts +++ b/web/store/issue/project/filter.store.ts @@ -71,9 +71,7 @@ export class ProjectIssuesFilter extends IssueFilterHelperStore implements IProj const displayFilters = this.filters[projectId] || undefined; if (isEmpty(displayFilters)) return undefined; - const _filters: IIssueFilters = this.computedIssueFilters(displayFilters); - - return _filters; + return this.computedIssueFilters(displayFilters); } get appliedFilters() { diff --git a/web/store/root.store.ts b/web/store/root.store.ts index 5dc3c25749..d0be5b452c 100644 --- a/web/store/root.store.ts +++ b/web/store/root.store.ts @@ -1,25 +1,25 @@ import { enableStaticRendering } from "mobx-react-lite"; // root stores +import { ProjectInboxStore, IProjectInboxStore } from "@/store/inbox/project-inbox.store"; import { AppRootStore, IAppRootStore } from "./application"; import { CycleStore, ICycleStore } from "./cycle.store"; +import { CycleFilterStore, ICycleFilterStore } from "./cycle_filter.store"; import { DashboardStore, IDashboardStore } from "./dashboard.store"; import { IEstimateStore, EstimateStore } from "./estimate.store"; import { EventTrackerStore, IEventTrackerStore } from "./event-tracker.store"; import { GlobalViewStore, IGlobalViewStore } from "./global-view.store"; -import { IInboxRootStore, InboxRootStore } from "./inbox/root.store"; import { IssueRootStore, IIssueRootStore } from "./issue/root.store"; import { ILabelStore, LabelStore } from "./label.store"; import { IMemberRootStore, MemberRootStore } from "./member"; import { IMentionStore, MentionStore } from "./mention.store"; import { IModuleStore, ModulesStore } from "./module.store"; +import { IModuleFilterStore, ModuleFilterStore } from "./module_filter.store"; import { IProjectRootStore, ProjectRootStore } from "./project"; +import { IProjectPageStore, ProjectPageStore } from "./project-page.store"; import { IProjectViewStore, ProjectViewStore } from "./project-view.store"; import { IStateStore, StateStore } from "./state.store"; import { IUserRootStore, UserRootStore } from "./user"; import { IWorkspaceRootStore, WorkspaceRootStore } from "./workspace"; -import { IProjectPageStore, ProjectPageStore } from "./project-page.store"; -import { CycleFilterStore, ICycleFilterStore } from "./cycle_filter.store"; -import { IModuleFilterStore, ModuleFilterStore } from "./module_filter.store"; enableStaticRendering(typeof window === "undefined"); @@ -37,13 +37,13 @@ export class RootStore { projectView: IProjectViewStore; globalView: IGlobalViewStore; issue: IIssueRootStore; - inbox: IInboxRootStore; state: IStateStore; label: ILabelStore; estimate: IEstimateStore; mention: IMentionStore; dashboard: IDashboardStore; projectPages: IProjectPageStore; + projectInbox: IProjectInboxStore; constructor() { this.app = new AppRootStore(this); @@ -60,12 +60,13 @@ export class RootStore { this.projectView = new ProjectViewStore(this); this.globalView = new GlobalViewStore(this); this.issue = new IssueRootStore(this); - this.inbox = new InboxRootStore(this); this.state = new StateStore(this); this.label = new LabelStore(this); this.estimate = new EstimateStore(this); this.mention = new MentionStore(this); this.dashboard = new DashboardStore(this); + // inbox + this.projectInbox = new ProjectInboxStore(this); this.projectPages = new ProjectPageStore(this); } @@ -81,12 +82,12 @@ export class RootStore { this.projectView = new ProjectViewStore(this); this.globalView = new GlobalViewStore(this); this.issue = new IssueRootStore(this); - this.inbox = new InboxRootStore(this); this.state = new StateStore(this); this.label = new LabelStore(this); this.estimate = new EstimateStore(this); this.mention = new MentionStore(this); this.dashboard = new DashboardStore(this); + this.projectInbox = new ProjectInboxStore(this); this.projectPages = new ProjectPageStore(this); } } From 7bec244a6788bc55e4edb7742c735900d476d3c6 Mon Sep 17 00:00:00 2001 From: /dev/paul Date: Mon, 8 Apr 2024 15:59:05 +0200 Subject: [PATCH 028/105] Added fonts loaded from Google Fonts locally (#4140) * Added all fonts locally * Included LICENSEs * Changed code to match linter-rules --- web/styles/fonts/Inter/LICENSE | 1 + .../fonts/Inter/inter-v13-latin-200.woff2 | Bin 0 -> 22440 bytes .../fonts/Inter/inter-v13-latin-300.woff2 | Bin 0 -> 22444 bytes .../fonts/Inter/inter-v13-latin-500.woff2 | Bin 0 -> 22760 bytes .../fonts/Inter/inter-v13-latin-600.woff2 | Bin 0 -> 22820 bytes .../fonts/Inter/inter-v13-latin-700.woff2 | Bin 0 -> 22904 bytes .../fonts/Inter/inter-v13-latin-800.woff2 | Bin 0 -> 22792 bytes .../fonts/Inter/inter-v13-latin-regular.woff2 | Bin 0 -> 21564 bytes .../fonts/Material-Symbols-Rounded/LICENSE | 1 + ...l-symbols-rounded-v168-latin-regular.woff2 | Bin 0 -> 282660 bytes web/styles/fonts/main.css | 78 ++++++++++++++++++ web/styles/globals.css | 3 +- 12 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 web/styles/fonts/Inter/LICENSE create mode 100644 web/styles/fonts/Inter/inter-v13-latin-200.woff2 create mode 100644 web/styles/fonts/Inter/inter-v13-latin-300.woff2 create mode 100644 web/styles/fonts/Inter/inter-v13-latin-500.woff2 create mode 100644 web/styles/fonts/Inter/inter-v13-latin-600.woff2 create mode 100644 web/styles/fonts/Inter/inter-v13-latin-700.woff2 create mode 100644 web/styles/fonts/Inter/inter-v13-latin-800.woff2 create mode 100644 web/styles/fonts/Inter/inter-v13-latin-regular.woff2 create mode 100644 web/styles/fonts/Material-Symbols-Rounded/LICENSE create mode 100644 web/styles/fonts/Material-Symbols-Rounded/material-symbols-rounded-v168-latin-regular.woff2 create mode 100644 web/styles/fonts/main.css diff --git a/web/styles/fonts/Inter/LICENSE b/web/styles/fonts/Inter/LICENSE new file mode 100644 index 0000000000..46d45c6a1b --- /dev/null +++ b/web/styles/fonts/Inter/LICENSE @@ -0,0 +1 @@ +Inter[slnt,wght].ttf: Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter) \ No newline at end of file diff --git a/web/styles/fonts/Inter/inter-v13-latin-200.woff2 b/web/styles/fonts/Inter/inter-v13-latin-200.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c59d2397ed7263176e0aa85e9a96ac2e8398094d GIT binary patch literal 22440 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§Mt#1X?;&M(!Vawl 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 Ri}|76S?|90zhJ^y003`caj*aY literal 0 HcmV?d00001 diff --git a/web/styles/fonts/Inter/inter-v13-latin-500.woff2 b/web/styles/fonts/Inter/inter-v13-latin-500.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..21db79416d8d50282a37c2a564aef73d4f80fe64 GIT binary patch literal 22760 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� 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 R7(LY+?A`bNhw0%N006DJ9@+o^ literal 0 HcmV?d00001 diff --git a/web/styles/fonts/Inter/inter-v13-latin-700.woff2 b/web/styles/fonts/Inter/inter-v13-latin-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..775f7575e653614760dba82fd9dffaddb939770f GIT binary patch literal 22904 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

u=Kr!NRfWj{m3 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%0DkT5F6V&+ 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

cJ`;26guwpxx zG8fg-Cb6#;LzZMhxALw7nvf(i8sZ6Nk)uQ~9P$v%pROmEznQLyo8Icf{YUm#n1;3e zu3$g?B7`9Ik{|`!a_jBx1D(#huVAWb$FL0seQwfE#`*DHRS=8<1Qn5*XJ*L@@#3qUxT6)bbZ)6`Sv>aLG zYY!(5DPNMHS^q{83^R#Rqu_1oa(q*F0@_#kur7y$)lfn6j@bIrjDI^0sHhw$;#;q- z$I1>#pSb2)wRSbd=9q1Ep?{!KmAgzG1eu+Za)o(?AN@vUV*WcHm6t2DIR)iS4V-g- z6kTh!Z1#J=Gq71I!To_yg;yqZ_D8Drn%0h?>_j}~&dPnr$qXrtA`Kji{4;;VO}x}p zbd)gfpF-hn>s7WY8``4&e7)Gofm6{`a@_M>(swRBxE!VsUo(THLvIA(Z%v?1K=nQe zShU3ll67frZ)xZp8K3z_naU9zh-YtGsrE~&kPYY8vf%0w8~c~u+kuzo8_)-m>}KQd zCgY%tAPM;L1udMG;x1Z$wNwg0;CcG5{8mYzbW8Dxar-Vr{_+2?Y@F3{y5JfHQBPnWVIqLnkVrxqOMm(r#UvLKq|F|E z?+q7oW%&+$yfXp?u)0;y5l7o^y6kc4 zLLPZ{xH-k1ItxnuSqrjUuA1`XdQnh3UgQIL7iY~7I&FEghx+l}Do9#8bLI>^Ib@aX zj%3P7Q+5*N3?sSx41?p<$zeH^9>EFm$4;%N_()1_RR$?(qoa2}R$WYYYmiWeII#pO?vRr|u~%_awgyy}hg8Xt7mqlP*<#(>vw7n1rzd{ zcS###b8A)6u3UpesU{b1+DBjLZM6Blh*bQlqBo`Fei^fDa zdwOBajAF6kT=m}`9QzVYD7XEzMzY#ZX?AMsz9idl!5Yo=Q@lMq@>@WafG>ir;%dsx zEYBr%7g6#rZzd3;?+t=VI$#~i+?sDLrwNS-*P zDY)rEC!0J-o{FQUJn)@P8oTt{#b0)q8zX-|xLIcO@6UH~$xq-jYC_3~9(_|AsrfQGx2kWXJ2KNm`W2-q&={uk8KzFZ8Q$I5kA^@~4H zbdHMn+PcR*@%s1x#J83_hH$&5R~e^bRE2MN1ep}1P%8|`ti~Ej=p5uErLIpgj?_un zFigWL3guo-4kq;CUxt?x9+9EuO2#TkbdF!t zl<>4fuLZJEn4?E5f3u7bVd1wEqOVD8UA$EI5Z8n04Ut%~aqZyl@H&$ipM&y2Mm+6{ama3 zI3-u~p20jyy;#n_q&!_YEx`y6A5W%|$-t?MPlF1RL2~`8!XBd~=7J*qph@Y8i6?C{ z(!YeleZu!Z}}^a7yOWSLAW7R4JNIimoLSYFE&lea2q}R9V*?{=x@MScG|U z$8thm`*>jASWy1^P~Q5im5`mOTvpjxRI0-w71Ga`L!}aKPp-&q^4QI!?thY2|J%_h zOr%07c)*eee?=y@)Nsx{S(C{Jb4*POp8S=DN|FUkZ+hw*?jY9p_-jAAA71^5IRx#Im)kb4qteb<*6yY-%?%gS{K`Wh zehr6=A4Z_%V==wC+|4@2Q3zNyIkplHR4d-2u@@$fzNo9WA-9{}bi7Tdi#pK=>3_`{ z7y|Ka8kjP+{K)ZA6to$FTAlJeFI1bPh8Q}Qrts_(F}*)|d9lm-F{$}uT>~Ciw_uHK zz5R?-1+TH|Vv-+f{Tg5Ro|le_@#=kz0LA9boj~XEHEN>=#fuE-BKm?CmJlSt0j-WF z`I3wxet!c^U_4GKVHhld=Qd=;iB3|rf=v0-H(PG)$P7ffSLN$;02BzUT~+lvsY_0` zPpgtZ2rPdVj0*KmoefPimFtbh*NSNULI2|7{r)lftT%aOVdezm*@%k#!OJ7HCa!X! zP$L%vd9i3-%;Lu0P-0&M9{1t4Bx3)8Y=K%K6si@1Ab%R|UuN_Ej;*cxJMst!Hy@pv z#>QvbuQ1-MWtT>3FLK%fR@E42h2GukS?@23uOo4r-$urWn>*VA6RG*jN^?CVNW=uv ztF|m9rMgU)7E_<)sy^nBePwWNfA6REMdTpDtEy1r=67`4b!BK<4t7E=q)(KK7z7Cy z?A2{-0XDC8MFhT~3y;5>Q$_CDnd(29Jw|1#m^wkjM@Q;M{Q62`mDu<7ng^JW zuC{E%AQCxBSnw-AX2!y^u0W;^bpr(KzCX>81El3WG@7cDI7oe-JL z+ini?;7`=P#ewcN!72=Vs`(q>c{K+U+62wkI@qyLIK2ePKzyk+O0$S}4G#8kS@ejq zFHl-=P&$W$NpsC*0$y?`l8Nt+a~5e~Yy;nnP(@QxpQ^FLUe#L8%^x=F7AorFi;o+O zc=wbQ-Q_ax!VBn%`qh<-E{wZB$~c+{>h6{#{P~TiJa)30!}xZ|fwN3MYHwHjOm?bQboZSoy}477J82p?-WSEC z4mex_A{G7O1Ukl*kx!Nw$_(d0mF41k+COheKwd0SRe&$9P;kYK#{re??aZt_3l9gQgAG^ z>i#4s3mDkuBa6fuR0GoX_9E0=>bqAk<|}?}J&PTvylPQ> z?xcaiAke9o7zYV#P?pczzlTe^?r}qYbZ^5J?}NP0U(bFUvh`l6QhY=H;1GdsrNmIq zM$!~~wuA0#N-x7RO!nmGY%K&tL-f+X)VADsho~(lHE?OsN(ABczWWUx(jCX17=ET? z9O-cKKZXz5m5elOGV|eCM3Tj1O)mgvvYI9rR(rTbZ=+pmu`R=6eI+D!xBN=YCEjPT zT|dl`N2^=HCSgUUnv+=gbPOzQkH#Px+Fzf`XXn9mEEPD<88XL>J!M4&? zWo4-m7^R)|AssguJUfeJXJG!F$GJ>1oeK(7s@L}!slLWrS(9GDN9H)=<2vQ(N?+wE|A<+Ze`$iP~lQe#t-QQ8bjU}<3GG7SGEPdM>|&w!ak z=9pkhN8x6-!sezYZUxga6klYS|7$2>9uaW#GLp=XjOtVh^3r@EyAIfB<99b7mR zp9+}xw&u+Y5`M>F+71pp8_rLAV(E^BA({qNdhwStnDPaabWX3>lUv^>sPNde;h`(j zPuK7;%PQMpjBYyzhAs2k@B}S{XHd_g6s$U9bA41XC2d5m+3hOuNqd*hb)uO$=(O>8 z2}@5Hv79m!Ywbhb5c!a{hr2d)_q2TSS47ZJrC+`!KY2>`*~MUH(LTZJ764an-HazC0-kRFYa1dBexHF3F!(=~lWzvy?C<{=iT$1+i*3H8^z-?Li)uJUd(4M&R3?SOB>ugQM~Hi&n}S&3 zHo@!fgoyH>{9?phQpR^G=}d4YblhiJ3oAc5*0vwJ84X!~ehk~%s)wv1c1M7dz;BZV z>&C|Lgx|7XXbRsR0rc-bg3}~g#EmZwRQScxNP7L}XyghvlH`~3mb6hmQgTCoP@qXB z)~_dRLt|bk;thI@^*mFzCud-LaxGpoyz=wE#VfamjIq1obwbF!PM5XQY%MS3`#R5NB(QFtOP;p_<-c@mB0 zgg#14!9rm%TUC|Wk}KvdhYN`jTc6z zMyBlm{$_%my2V+^%R+OL2a3%*bp@hcQm(*g_U7hXbBoKR6?th(m(ojAVw-a0uev%` zqE`$xS(K3D$~9#>1cM}yQC8jlxw;?I|GBDN$DP%Av}_2o{ZvUO3uKh3c%6TouC4y{ zng_@zGxWOicS&+b7ziK*PHLB#bjzc%RRj51Tl4~=dZB{w?DS8f_Pa;sQ3^d-{Z|_s z+8&jy2puFG?A+wJ4DBPhp$Rg|LPPnXc?ZHpd=cn3%7J%iwSONoaK4%2h^k1TuT6Ie zb>SqW7lhS95yCp(Jb}n0UmdwRAf?fsG^#%J&qR|R6OH%R&t}Y~sk!glK<4S_+IcUK zT2}CylH=m}n$mJ0=r55=*0Z1f&woa_82tq@$|56VF80oW2cp6fUDV%$nr6qom7j&q zel2^f|6AoKH2SkspU;4_Yy@hOmJifTl#N2o(o&F71~ai>)50TRkw^%qhg-0M18Cs^ zZjVVoM&D+q1E8iEf5WC6ld>-u%2M{_m^N(U8`kR%Sc5FRAp37+@bq2hs~Vt&%hl!G z=eO;Ec3iIfVsHLVMe!J9ltB@rF}BLp(M6{z(WmVN61m(YPBHkx`nwpZm^K_G#OZt^vtS& zMyzUH{rg~B-a;riK69B@iLO5y)HHKnp_P^@v!`|Bbo8IjXlgi-)mxI)ktVfQr4DI< zPwSmNktq7huG+<+I{vSiQzyW!dRI?Gtd`v;zpq6$Zi{T2ym-58_-7}=HzTF;bNi7X zoGkS8idcRm+cPR|OLUxDclJup2)D69@F_}5t27M*Tnt0Q+GivHaf4>*BVIDahiVT! zK$j`HG93`j`rdZ8MQnV3pr`j;Yis1z)y_W8WhV;S3hc)+`YK1Wn+w{G7l782tIe4Q z!wDzAJ41zGG_#x=d_9;{?5V}7_KFTvM6z51T^$T*j__fUZFCnXV#Ku(PyrZozJw)L|A}jjJZR#w8A~6o!YJBU_0ru4<*4-0gjK*0Jj?YFV*v zVSayUxCmV=U{w>d2fume-6#`3JHv`|&P0`E$z&$Dlf4E9u1@Ry&xRB0JLG_ z&s;n7`1yaT6md{c3py>W2^|!~rTD-2{MiG_QfX{H&!7KI3+t4PG!@GtN%x*VPw)Y6 z*t7grENB_`3jOk!GDKnXg z@y-@{Sk`71hyJ*>q`}~mWZDrF^Dlh8vzP*ng#qA11J6Vrsa}2`<+J5?#N~{&egFU; z-5vmYGLL=n|F^4W^aucpLb_Ee@PAv0f};I#wg3T_q~+3eecr@+wt*uWWWU6ajyp0i zk41u`a#}obTiTLtyx~^(srG19OsDDDktz-oo_kGX#`vM+GIQ@33RTYrnho8 zEyu?g)@B(~r@0vgtyEzaz0Q=uI4`=lXV0GjLdTOy=f0kpn1`{x0BG<91g6R%zGx91 z`b>Pe3sDERHgPZG7{l~NjWkQOA33zJ63c4F@EBQNL)+$@C#_Pbf|UxVw9b{Hu6gYM zgRAM6<-DcbXKi7tOUk^aNV?Pi(y?M&!sO+WsEjxCWRM-3_S>h?b?mPFFJl}U5@<3F zP*2Q_Fx|?0tnPm5hEr!At7ZYOPMgO2YgA>-z&t4@4!c(48t@z@=+>fUzl@!1Hcv3v z^o)z!j{{$Mlz_1=>pW#zm}{yebWZJ`R0r{al{a&}7vW9xq4cRUY7-3(YTBNoN@k z8)IskW0UOXk|hH$fRqURst{^EhW=nEfP1LQyC;q|a-gK%V} zt{$?!hm66Jt7u1`;bc2YKIdhXC#$nKH87;ql|xpuiATnbnla}yDqoY-JRn-Y&~A3P z7)`nb`;SGN8AMHYO;iPqB@<&T!IVeZR1=*r#&SevSWH;(>y{~#tjwf+h*>*NA)Wo% zYn7F$NJg$Vx#yd#{758AFZxmbqd&ZjU8ZSA!DFH;NGUBwrCOXdj=&wsx7~FpqB~Tc zto&Ni68Ee~7VnZa9kRvj6J!U}17N#TFZ+ix&k!x~8Af=Yj5k>Ywtk3i&nt=N9c3LdEkbHIMm z>Y&ZX;7I-j_29J+H8m?&^tg|SwA$&c`DLr3vl}%Ma@oOCbfkLBik4yb%L*8mzxmAd z{3QOokw1RMOv2Ry#SlVaBZb%TUNk#u6Yc@gp#pJqb)sT(BU2^QoWOUAB^G3JwIKra zl48bxvlDX1_(G*3uGZHNe+fTW%>d&EkMR!%}5P9AMXBN zw&>j+hgm6}Z>Esn{%EM_ukhz;I=}_-DJuvCwLug$H&S_zSGsR`lzwtzIzqYggIBJh zIIz8ZSs`I9@;BB~36&_KJ`)ANz8x;(+2hUCoJt%^n!HMrBUpCTVR7u|z(dmUOr>s2 zy~xg*{6qN{TJ0bi#cDO_izca72AwZ=n9#L0o9k;?s-n&uaeVg#8y3WZ7D~t|(+EVm z_DoxzyglUZ5yQJ@ccd@%=cG6$WT?Shzt@X_pfPqFkL!5sX7O~TYILG}RqTA*7i(yd>~ zR#ws4F0}Yb4+rzmvGJ}jqzLN5M_LAdk10AxG-jxbYL^=nH{Hp=&%9rn#l<>;e-?qcB@^? zzgRMK6k5^1OidN#`GxB%8M3kI>rOl?=8(z}fVi}B#WV*?d@w@xJ=(OG5C1e= z;)pFCflClfgOQON3+clEy@3?+UOWfu7h1JB{P2@PA;JVfLJ!2Mc`F=L(ZZDTwTXy@ zUq=S3QLVqs;B7>j`yx+!DSdD$IjdS{jgmi5#0A9WTmH*i@pK})P(6npv;OzazS$62 zkm|p2!evfOb`+@_f7N0SIfR!~xBEv97(E(3-`g%z8Xo=jlj?M?shxqEq+D&0OWiFU zY6H=7FRfNswdy2gj*+52`dWx?^h%^0Ort7|(ea6L5x`PXHERAU5ucXVDK*utjwMj} ze^vi81RPBS%5jWE3XW7c6iP@~K^DmcXqQc`KYvy1d(KD{1B*K4vtQ`cr2UE_8M0q9 z$*=n(2HCgYP-^{tOCQ>Paf@ThyhXs%EA1B&I_y{EIQun$@_kn)X|~b3RuQT;{mX#* zgLN9!C|2z-AFN8Ng!=`n7eM~+Y8J`VZiO(MJVCW1U#_+$3bYA~ws!mF zVdn7D+K)>X!S5-AASqNDoxxX!XqN1qGMv?;u8{+l2cOC z(lau%vU76t@(T)!ic3n%$}1|Xs%vWN>KhuHnp;}i+U*E^mwE>T1_g(NhJ{B&-mYB~ z{iHNUMX5}fiK7^YqmHasEG#T6tPjtOy=)@j?eZQC|a+qP}nwr$(CZJlj`Ox{i%y*!C@hH$UI_q@peC2W$&Fr1u%;_|$nVq4fXaEpE zLV5J;K;eRhb?n^!;)F_N%$$Ma299mqJ^bVa)Q?3*4#A4WD`w6fei<_XYh7axp2Ke{>kQf{5 za{57aMIgu32`HDH2Ai%j4?TR~MeP$z+!a)v7hOK-Wgi-BJimPG0ATkKI7i5il5*-D zeF$g=OXpR*vbm*f8#X^`+UPE$O)9s~pWg!a&A8KNP9l#jy4P<2-~$kl2O%BA=AkFA z{|4G2%OzBmZD{nOt38<5qrB<${S`nTmdH33(O8z*d>Uk*ei>DQC(!`3R0-_R*KBFD z=i!4WWS3~{BBu(vv|dc8DYZg(eK#*z=`T2mXE_-x@db=GLRML{b_rcPes-JP1F9_u zGOB`4w)ioBp8hZM$`12RAM{f9pKI5?eCzq)i`&9h!HnT>a1s$-?u{W#hOaOw?(_@LKS-cvBPmERy}I9%V`&I zKlrHsa1>U2F&7bhpFD?HL!r6RhoRFUkbqLB z%2I|^V!Y{p;S_l9+pCaOq@kO%lEG`=w!=zu{xc}kzBTvcJ#@6xv{>XDZsdLRboFI+ zH*?vK_!p=O(?4oyd*2C6n_rC(l5h|?C}QCZnl$oyWdHv4r}U`fCytEI7 zt?DnRGyLkwN%P5@6dsRDm&S=iwL>=9J0fZk_&%BR|HDgLX07Z0FDGqg@q!B75{yKa zXWoX}GT0_vv}fT4$YmF(T>+LAz2U4jYVbzPd-!q!$j71ZRh+ub*Wn|-p8KCZ@T304 zA@DV=GEyBm4f$p)a63NYuvCM(nbMgkD4nGayT@%FIuHIQ$3`R;$bbL{&;=N>@LiFo>$Y-M zLmp2(?uf@DDzcvp{Ec&lFgDxsw`W%!_ zV*T4A6&f8urtfXq|2GQ%Glc(!pn4_d63k*lcJ$?c?uS6zHZ#SE$9S-9Q;w+_7L_Ho zieYtj&Ef{}6?i{|4;;RJV6~U0Z;l-yp+w z0b2?`PkVmhV-F`1Q&qUE(2Xp2Y5WgHpLfVVSn1PT&a-Kg^;no0`FA|)7(U(e1pgb^ znG~J-K^kj|8>glGDjxk}0~8e<9U&tvE$NrxiMM|KSKVx2vnhsM@LJ#vHYtmHXZ`QR zBewN8Xqu7g+{u?i_wQX6nHfvYrvDI2#kj#+WZ{3tPle5T74DFk?y?2%^a+d~LR21_ zYz#+)iMsU^Za{%s;wJ`1FRA};ex;>cTm9!wB=0P4 z0j1J*3@pdPns->&X8;g>wJizfc#<0gA)efSBQ z_7A0`_z09jdC89|>|*~zJN`F`{6E|ZId&8HCun~-=zoIf^I_Kx07O4T#6C!Sp;^fB z^M?R?1ldo~URUWwRk}C+4@U2Y>2YaES%_xY8K}~;V^b3|=82i9dh+VbTPi|80Pr9o z{Q7nvh`}Sj?cIRlg-hhkoxt*P{~=o_1I@Kj$tjGGsMDbz55$S0RS9im+J(FLV$!WH ziyCb$HJ?S~KAa;Ui4i~_3+EIuu{>=A^TJ@t|P>09#B3+y5Wh6ZJEL8Wb_h0eAOCOklp^mOZpJ4 z`x|6Z4xoQvvlY;@hrl4-dCJ{5=W#(3Z$bQ8p4UF~^h7ASR`xx`zfU6gWI~TOUFeig zj5Fs6Nma>@jsM#KJiwm+TXiJyfg|=g9_%vp?0eQ~nZ8i9RFQZLm)DzA!uSEH0wu9s z6_5IFD{32Q7aJVG=Lj{8KO?<*PE8@)#HWNlBM~i<5^EPihc~Z|W{5Bix~%Z4yX{ti z0r%NCsZ^c*nY{JD-tEHvZjiv4I}%-3lxC|>41f@ll=}mdjtdGLMHoF0xeUmPIcP(l z%h>RHX=OSE(0W!Fe;w(;E5toVJ{)*NLo=N?tG=H$66o2Bup#~iQijAz{<|>9S#}%n z$LB=uMXl1OeMN3*2lS3^rIOc{5dSHW4TM^v4L>-K*wTp7b2z~j>>{~G0@k1>rzGUg zP#kGqEYhd`L%O6ShyRkcnh=twxZDeSYSu*-!QQf;Ya!e)8rcG#udWx2FczL^uUx8MDf!1k$^3Y?14PMwj!yWn~|Ffd$^Q`fsyQ03=Q*TtJ<0rJcmU zo)POYVSR%<^u(8V@=*B(YmSO};Q|Y1vWCwlq&CQZqr~y$nGuUVKYZ!(F5|r0yL*kO z+k-h<3$1)u40+TD2}DBmnu`l*u*oPEIN&VSMC@B1kI0SN45WjF>Z1x6it~G+e%dyW zuy5d3SF#lFK%Vy!b3_{(L{}hpuch`)ySF;-wYlPwvj-Q>BO~p==EWixH|9cT+IuR> zB@85LUCr-OFpV7;=!GTYXeP!cID8zi2N$u%m?X^UI5Luqw^GKJYzJ7Nps|nR3Ab16 zbMDh*nJ)xwky}f^eZl06hmTx%BQRtRlony_mgc48rMmcQy}S+9MEl0mPgmBYO$|XS znHn&^q7JV)Vf%2(z~#)D(&W?{;Hg~; zQVspnTcg2T&wr6d<}-D*Zx8_Hf-%_~5~@-n9>^n@V#Ijdha)}#TvA{Epj441Y@t{& zZbojfSI^%{vx`(6R}Rn=!r`_8G~zddajC%;qmtk2`_2T}y` zM&R2Z@H`U++qJn)T`dHHKlKwW<$~LeBE7@NVUI(1P)oQU2pwmthpc%ruOce zs^5HI12>2kt*4|t2Gzd;hJmU<$+Lqg#E$R?Ql?yBko=%EiRS|()>9psRAA~_RQ@6Pzjn5Sc#Fv!qF@TEgl4G%o%HUSAzH6JfjHZD(@G<;~gCgAj}uc zKSvwAqJYgD{k7sXp5hlblYID=DR(9g!F=D$n->%E)?GTLE&i+03mg95{v8kZ{QTfw`xSkTgWbh9ax(@SR zOcx2eAEYzma?m=Mit!sqLdhX_u+tW&H{=`i456J{J3i|HK%+_W>Or9m_Xwi>F_PGz zF@iu~KgfeYQ_!CemcOp_mWDBvZm%oKN1_4%K%@KPKm;9!9kSU@$SB)G%i7P?fOo>f z=jGk=t>n8B`wllx+B?H#aP#y$9PH|I-;eh(u6Mb60Uofuc;2yv0V|4>Xkwz%ela5B zdgJkDF0oX1@{*!v^76A;Mk|b?#y--M`#?jtv5P(D<0NwTa}n=r(D$v@K8;K+hub}) zRhFasjqR2ONZ0PE7mQwDZWWc34zcfOI16n>5AP(pV7u(emRu2E#xD-7a96ba?=$2U z^Qr=Lp#AeIyGIw#Cx+b5c|nqW@DnBLT(ZAVoI5TwQwX=84%h;Zgh1rK^RQ)?o&WxN zt)@M}J)SsU4lI!a^9O+mX=aROa?phqcn@(>1<+cuq!eJBnUoY&X&?MH8?{Y(Aq4!; z<=24h<3x>-L|>Bl+T-fL$R2=oz`CKEOmmQdrGF-l$+At2$57QP!c3%Ntc+o&0Qfq1 zyVvE9MD0)6Fe%K%Rl#H~M# zsU96P?R-~bzAYodh?zYlzDRYat+g0}s@(v)O_{O49_AhC`~**KbrbXE_tuk>?*O!PGcr$fT>se{doLSL`G7wTHw>yVQU#n6!!SL|R zTr@#nA=_dyrX}4w%nIIp0YM(oFWxvT?y2pn0YUT*stRAl+4s>y8acesSc|jgv%|=v z@`h$7YCWas74+gjcW7Xs3!p@)R|`?RTXSz(FLm_QUh-CvZPAEl$12S#HfnyFBMzA2^kAHJtbpJV16dYj zqh`;Eh-qMX1>gb+L70Jlh)5(FWBAzl!^VffhIKq4Rxvg-9qIL? zssvgjqi9UHA#X7)4wd^Hm?NT3KkXq?6D>)vmOyIw-1t4&EW=t;Yw&>5dnCmWu}~kh zA$cS_VK1auHMhah#%<@T@YJb75YbegHcN7*U|Nd9B1USM$8LFEu$u zvzY$~S;wI9JB2nBu@7Qp^L`fq$2u>1EV0D^Dv<^b%?ThAW60#i&DQnBpfBL?ZrfDz z^;xE6Ze>IPE9j7ZkiKVP%nKOlIiQ=SD+f1} zB9YW=sZ_ubIS&x6s(4#JpBKufo70z7$@U-m101@`sv+(C~!2UzZzuhxwXID%)<^W2#XD(rki7JxHGc6A@^q^ zmSdzSmF9(ew%)J9(E?{A|H^)|1y$q)ojJZ}0Eo1xP{CqR#kx{`etUg>Q5N`tjIOuI(O1mv$Crsr z`I(W*RlLh6X;4Jx0av6k4UA&bbc$+$#%)uNXBe&p)V}x_nC|+~$WVWB!2xN8wfUkk zn!IuF7}3%3DpT?iKzA(ZkJJ?AB{a?QGY3`o5p5#dUwE2WJHgHP{)lWRI@<(~SavN^ zmWQ{P4=&4~*po94&WvB8Ev~FbkP1%2F%In%qMpkmj^(988JES^Fc!%pfXU?B%HpzU$-1j2h+7ke25JZ093}LK|qS& zQj{)PRF`VhPv@5LqI`?7;p)tTR01axwc%Em>=3)Y6LiA{BA#uY!Txq?3{0#t_l}57 zFzX0&^*1JNc;b{ZUGa$~q|7zzP@Ziy@h%p^R7?2xtH4guje_}0NG5P7?Q3>j^|Hdu zW3_f-fNj_|id|%(k`JHZu)Cqwy3IX_$6HolAjEqyOeeRbm zbm9OtaAE8qVa)NH%}Nz^OG)^JJ+nWE-J0Fbn!pp+L#|huj0v%L2p*!*z7?25b>;6d z1eD1cW=mNT<7SsnM*W3&x)nCvU4zrn#K$jtek|DiO=mJHhM2*jFevZx?jCm4*pjfJ z{L?V1)(-T0twQBOhvR*1F3->7T+;SIlvFMUI^*(EtkLS5n+cQh4}p=HuSygN+(7B& zA_Vh1!+eO@$l7`Om?b&3zhAa{Vlb%ld*o|kyC)JBV*{Zktr9)zEZbjEk4+H$l|*0A zEUGHGrX`O7$F2eRAR`xVP0k~w3x+Edk#y1Vr9+(WpnulQi8}R#e}SB zj)}_yRCW@Qj?gYgNx)n0hSCmf5yV9XA&^#WX+W|p#6&W6q<)bxH zuMzQ(C@vzbq_|5QG!>-d6#k)Qn1d#r8M`F8UNShw&ve+$Gc>a$k}!rpxkk8$wRqY9 z4h;&N0H0Xx2MV-J%6qIj>B!bQQ)Cv+l!`jr3&8s1DF5;@BA1ZsQ#SOSN;>u+t1ocG z={Oq4g1YI)Cg|^>m1I@vSW|cfN}sSdG=5M{V}ZgJ;@+SIK64T-=30OmTL`nQeS~WRqxnymG&UDokiWxMLH|Ia#On@M`FR3zuu=vCd zJ+_It1EL7N|BNL{!~rc~pwdrJ((aNI_jTXLKE9+^4^e`wM;0x2YBl(6BSuF3TaG~x zp|2>ZYZzhVYBe+iSBrDA9{TaGYDkg-7Rch&W{%C-V|3NCScJ=_@dCdumtb{tC%n9r z#Rfs$H6;i|t3DvmzCICEjdsqFOWGqPfgDia1cs$~k*9J)g|&mwR~FZS)E|@gNE#fM zD7lxI8dvs17oUB|JDeWMWPb-&vnjPih-S}0<2rO*4dfsLqmUOI)|dy!@-BlNF|P?W zZwYvjBp{b8(@^DXkowH!gJfDu*-%?uGw%;2Ysp=eHrCzX1Yj9)o)Jk9%)|OGEu3NE z8k~xO*I_98G>GGCV1606O3UxR9~6$p6q~%~2*z@`1g!2j{J_>3g@n}%4K_^6-1XAZ zI&h1{{6B2n$Q`X7BlxHT9`ZRNxf>iR+oh}q=RH5|jp#833@0L^F)xQS>Ru<&BB*GL+z zpk)3r__Biy9;BzNEab9=4K`aJs3V*ir~Wf2M!Q7L2<)1d45c!xS*e*Z5i;!1m@8Tu z99s(a2#>DQDR>&+qeI@~jzE|) z;bErW4Y9kbGcx`&Iv$OcFK;CLl{~Svf3EKQx|Y5dH+f!GRDid z>m1p#ssf1 zP4EvsplxVHCYDsv62bF-?Bl#|0K(e28^Rd}~Dw?Ix-Sp+r2g|OLP z^*M3tL+Cxdh5w58FY&Yc)1EN1I)for?U-;U-?Z2#6w~36Nz`qwX#Qe>-#RpyWH9|) z_hCAqAFy4L;_8=A%pW(i1Q;}tBng+_XQLql1sWE_E9^sI;8)amSAn(VlYX78rW>o%XhT0jFX31s`hR!+4 z0&D>m*alxM@?jBNBd`$LWE@Jrj2td9zMsrM!yF51%w1Pgd3d|q+Sy*l=6 z931bCsYbfzlBV}_H|4UBD%3oP2AK7rnafI1#E<8b?nG-0Ky+bXg{+iI-atOe?qezP zyKK*bF@Y>WM7p3d$7LP0N^R z1f`4^i@cGK&|0&#J-D;bqoSQWAHhB0FXvlqSYp2~^sU7AHx{diDrI4=V<_RYw$7jH zr`Lwbfd6)v_vwYHFdBG$v%7FS*Pohlb&Zmsqx-ONqFM;<%fXOvCwQN6&?-_KX3BjO z@f#Z9==KW^+m~IR>gn;ZX5U;-($>Q1al5X)$B=nteKdaR^L&gFCGaU@tY+GG)7f8)H~zvWX($ zvBWenFW<5j#P+k`qNm!EYaC71#@$^qlUn4X_Wqkb6d}DA5lPMYalEZzt~P&x(O&5( zJmV_SlIZ6bo@BqD%%_Sjk>J^F<`0ywhbpFt?sA8ic5 zV&b!P>%LT`q(@)~VRQfBV*PTgg?wr2vfJ%ZIX=8S!X22a$Jg8Q^m(ac@PRBn+evd@ z^0z4r&8H^GPw1X8AqfP?fvO>E=n8NOdThdJSXhWk`{f2@90O^(B_i2UC=8QhM1hgT zK`qbM!k@HNo~N53EZp46Hh*cWCAodkS-U0nJW+kWTRiT1JDt1~nk)FC-Xs~Bvff_I z?r7N<&rG|r(3L=lBfc)2eD~b@S6PcVyl0Vt&0zA#%g$Lu2I&q}PefCFteCin4JYqBZm3sWhFXI9DcLraok*)4*0y@6Vq!ze?{3AO zjDzFH>TLt$EJf5D;@et)CUglJ#W>+SAtK5YD^>Kl1Z-p0M!1Q67FnUQC}Yhmf=M#p zcL&VZ2~N{iz121&6)nH;UUk5AB)(^0&B-Kba-;A1ffWR-5mkzV>O=u)8dYxWeL)Xn z&F>B@nLJK&vTvjHE(a~{W6bn#@5U`g_CJ4o;cB{a9tppVVjvE`Fvrh*QQQG=%w4pO zrhaZVZ@I(C`H1%_asz>hk{C*53%lnFurnpkyQ8Pj$fHq-OaNrdIR~<}z!b=0_T6+< z7Ky2v8Q8+kFTgMIzH7_5jbKGgRf%awHB$|x7u1ftGB*?`#0082N~@M z^|rW<3d47}{v3z+I`Vh0%3XB5L)h{4 z_`dz+!#2eSsgV8L`}@7Ev$B<8na#tU!@^jiMcmF7{fpV%I$}G6Fk#7NMI^X*SB)qB z+^A+vhhSw$uw+pMmo)zJy7oD~58Yt@t)@wohQnx4nx zGGQnP<$&fcu&cWC4tG2VgVD=&xSg)WwQAhBY zsuV452yeUzJ<|)dK=&)(SfUmrh_pz$3auyzgRgqq)a?>w!+AF-p4kRce9~l0 zqD|}N7>d%Rd{DN z$sVbnAJ*A!p%eE#P7TIgJn@TB6c_J6oGH>x0|*^Q^MWG+#JAo7f_ugJ%9E1$eV-al zvSK(qoM@jzl(V#MZd}u(qqR=ff#Xd&Orqa`S}Z#ETRD^7zqO6+BB5xcKf3d)Xy3GE z6pC%(7RS^9f&}h`oA{X6>}i6~&zpRz2nUPzI!~R(H@fXK05Hq@bOq-&>VB&%SED`W;w zsr@y9(}CZHS6HrFmQ&^9|I6@m0F|A&vzfGb-IPqrP5L9zO|oAE&u#%E+iUmLPWIJ( z;2koxx%CdMDTTsA?!i7Ix73|)dU(fRl$qf~T)?BZGrgMQ?KKnh3Fk3J5+zb+YRfdX zER8Ki>jlT-XyM`QitWPDhK9Fwwu+bTX9qk!h?k_EsU<|kfqHWNNq)&O%T#Y6Hau!M z9t2i$fKvx6f5zV9mc5!59umjO=ugkxY2xV>=FqT4yPaL2t5^1h*}BZ%{{U36VJa#Q zT3zE%mbRj`!C=cjUmn%*EuT3y5G_e%Y?^gzbfS2!F+4EQZzT~Wz=A)JjW{z8+)K+H7qjztIRYITc&F_!=DkTE z|7vN&o!Tvy&e6KhF%FIDwNmA*l?CjC%yc9+v`72a$tEP4E?D`)j{ei*Cuc|?}pd==o<^7)rzgS@MqCHA`<8M^BG|bJOel_~pj$5t1xS)DRug9SU-#RE=T? z=D+9K7rq9d0^}%4L4??n;81vb(z%G#vecmWM0Zr<@P>MEqku#ide@<$spr0EBfks& z(jg4Pjq2@wRdyB)m_tieSx)*pQC1Ot%v@Eg))a2?xtkkvXXJBNe%%NiVn;!*LpM5H~85cfY)yCTn$hD z{G^>7j$P(ccPP>?77Z#Pw@@9>6 zWr=w~W!;B&C|3>U89U*4Va(%|tb}u09?sZ9piWX2IZ_PuF8HKDH9gT#d0LIa1Vzw_ zud1cFtTDZ$wJaFC451^JZDuHMB=A)cVsLv#zv=>q`HFf^7QjU1x?1 zk^6N}Px8*YZOQlhoae(0PJY#Q^p)o?-JR_&PKU%gnWiWlJ2eS%=7L4^{h3om*&c!= z;S7X7MorgeeA{eF4-Ndd7OaE0*KU2`Wo^2QZkN5F0yLRIvMWTVnHMpPRGHtgqn3ze zO3wj)xqL)9u!3|R2@Mnd@Y2ju$;}oC#pcr5MTTB2!L{>CCs%)YH?7{>4aoiF?4^U+ zWst8dVu7n$hfSpwLH3pZ$RJ}MiNZ#%>CNNc4Qb{;-(NaCuTINYUTsgQa-PAlq=yGO z&!!_<0Z%ZuG&)F-*VdZHS>D>Ik@sH6@>7)`e=B%-eKRGVUaIni5ARS}9~?4k&z-rD zyk{1f=P!l^9{|EeTxtKrX;iSccWRVB)M?(uxVzm0g+}o%Nfs{e2|>T-94o_m#gxWT z)l43L3f~?Jzq=sn$u<-#tu{;YEnB*C4ey;gV8&aRoNe{2uhMWZD~lXQC@sm8;G&J& zLe@-NGcD<;;Ww-1gx3I&Y;B*hy>Vc8XKhV=gFJ)0EsAx??el4M6<6~rB<=WWLY+x> zIQ!;eM{z}Ynp_G?6(^i%>6+rVZXAa#|1>}4-&C35sIwj<3EThLl?&gipFMF0NUn0H zgMB#*v3xyb!9CG3UElue3tc>Q>P0d`kem!`Cl-2PGs#+HS%E9oMpDcY|FV&+Y}l1N zHC7_I-=rDLNlgy+yBLH|Sp>V+v4UYs()_M*!m$s9$iB!)DH#LVx233F6@BqJzyp_5 z2C%(iO^w6_U8@*C28k0s_GDW7W$gew9t5J)c|)(c4BitJEWJ#Bm|ZUY>TI%8rc6=b zOSZrhC6S5`Y}{eM~{a#E|HMbhQA74GV2P4wtNom zU9)!GH`s6FTii(*1$Pt%vJ@gUg=kv-_6b!dYqXpQ3dOp3xlgEyU�pq{U-Zop;9pDMG4!o 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 literal 0 HcmV?d00001 diff --git a/web/styles/fonts/main.css b/web/styles/fonts/main.css new file mode 100644 index 0000000000..7263a01a92 --- /dev/null +++ b/web/styles/fonts/main.css @@ -0,0 +1,78 @@ +/* inter-200 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: Inter; + font-style: normal; + font-weight: 200; + src: url("fonts/Inter/inter-v13-latin-200.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} + +/* inter-300 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: Inter; + font-style: normal; + font-weight: 300; + src: url("fonts/Inter/inter-v13-latin-300.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} + +/* inter-regular - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: Inter; + font-style: normal; + font-weight: 405; + src: url("fonts/Inter/inter-v13-latin-regular.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} + +/* inter-500 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: Inter; + font-style: normal; + font-weight: 500; + src: url("fonts/Inter/inter-v13-latin-500.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} + +/* inter-700 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: Inter; + font-style: normal; + font-weight: 700; + src: url("fonts/Inter/inter-v13-latin-700.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} + +/* inter-800 - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: Inter; + font-style: normal; + font-weight: 800; + src: url("fonts/Inter/inter-v13-latin-800.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} + +/* material-symbols-rounded-regular - latin */ +@font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Material Symbols Rounded"; + font-style: normal; + font-weight: 400; + src: url("fonts/Material-Symbols-Rounded/material-symbols-rounded-v168-latin-regular.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ +} + +.material-symbols-rounded { + font-family: "Material Symbols Rounded"; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + font-feature-settings: "liga"; + -webkit-font-smoothing: antialiased; +} diff --git a/web/styles/globals.css b/web/styles/globals.css index 5b24abc080..b687bca93c 100644 --- a/web/styles/globals.css +++ b/web/styles/globals.css @@ -1,5 +1,4 @@ -@import url("https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700;800&display=swap"); -@import url("https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@48,400,0,0&display=swap"); +@import url("fonts/main.css"); @tailwind base; @tailwind components; From 2ea6d70fac25b0c0f644c3f8cf87883b51cd5fc6 Mon Sep 17 00:00:00 2001 From: /dev/paul Date: Mon, 8 Apr 2024 16:07:06 +0200 Subject: [PATCH 029/105] Changed the crips-wrapper to only use crisp when env is set (#4139) --- web/lib/wrappers/crisp-wrapper.tsx | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/web/lib/wrappers/crisp-wrapper.tsx b/web/lib/wrappers/crisp-wrapper.tsx index d2771abd84..85f62ba3cb 100644 --- a/web/lib/wrappers/crisp-wrapper.tsx +++ b/web/lib/wrappers/crisp-wrapper.tsx @@ -21,16 +21,18 @@ const CrispWrapper: FC = (props) => { if (typeof window && user?.email) { window.$crisp = []; window.CRISP_WEBSITE_ID = process.env.NEXT_PUBLIC_CRISP_ID; - (function () { - const d = document; - const s = d.createElement("script"); - s.src = "https://client.crisp.chat/l.js"; - s.async = true; - d.getElementsByTagName("head")[0].appendChild(s); - window.$crisp.push(["set", "user:email", [user.email]]); - window.$crisp.push(["do", "chat:hide"]); - window.$crisp.push(["do", "chat:close"]); - })(); + if (window.CRISP_WEBSITE_ID != null) { + (function () { + const d = document; + const s = d.createElement("script"); + s.src = "https://client.crisp.chat/l.js"; + s.async = true; + d.getElementsByTagName("head")[0].appendChild(s); + window.$crisp.push(["set", "user:email", [user.email]]); + window.$crisp.push(["do", "chat:hide"]); + window.$crisp.push(["do", "chat:close"]); + })(); + } } }, [user?.email]); From c843a1757f24f1a9b5b4bd1a63d925340f088da4 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Mon, 8 Apr 2024 19:39:43 +0530 Subject: [PATCH 030/105] fix: chat with us key handling --- web/components/workspace/help-section.tsx | 22 +++++++++++---------- web/lib/wrappers/crisp-wrapper.tsx | 24 +++++++++++------------ 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/web/components/workspace/help-section.tsx b/web/components/workspace/help-section.tsx index 65500469ea..680fd910b6 100644 --- a/web/components/workspace/help-section.tsx +++ b/web/components/workspace/help-section.tsx @@ -142,16 +142,18 @@ export const WorkspaceHelpSection: React.FC = observe ))} - + {process.env.NEXT_PUBLIC_CRISP_ID && ( + + )}

p9mvRq3FeHt~X*bZJ9} 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 J`~QD_kKOs6|ET}~ literal 0 HcmV?d00001 diff --git a/web/styles/fonts/Inter/inter-v13-latin-800.woff2 b/web/styles/fonts/Inter/inter-v13-latin-800.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..39b9673d88bcda84d6cc19b883c7273cba0ca3d6 GIT binary patch literal 22792 zcmY(pV~j3N@Fo0=J$GjA*tTukwr$(CZQH(M+qP|+`}^3r=a<1GNnrMv8q+3{NyozpBY=~KI zzV{ICu%u?C#_&fV_^D1)hD0Uytx8j?wwF#agMX!>E_4{!Ww2n1H~sJxh)Xs`o%us~ zh1tCbva*=nn8m?qVN?Tr%j^1>;vrbhoBy3J(C&a^q?#7^5S8mVfC=`tKQ z8nGr$AAzG1+}dc!AFN&ht1Tu54xNEetQa3@p-vbhW{isb1K6;;TpdU>3B2d`LGI_^ zl&9&JhTtzfLfnA6bV#)rGfIcxCaKK7lk9rOg)46Q;2sK+l70`8({Tt4Aec?;itZt` zp>NXkZL3e#^~=P+4#LHSoRscNNhU!OCYcplcN4~|3BTP#QyPgpVkxV&UnK3nB0$B9 z`y_2BH+<~3kS2Qur_OJ`W;Naaq9m1|RHzZ53#11Yn1@d0R2ntTvf(Lgfq&V4zkz6N z&cW)T)rut)Dx51Q{h?Kh0jgMrDnQENY(wB(b3EH$*%G9w5h@t;Bm28{a64JjCnQ{t z4WI)r%82Mf*31)>3K4>;&u^F-B5ha*>uZ`_LTFf-t7URf(sM&t&YQT-vxZ}QEdQ1o zkW(Qeh>T@^{(i2{UXg`MfUCL(1=P7bnq*Jp0QNNvsIH+S0e4w9-?~uOAacB}KM1Wk^A4`pEktuZcKdkM={HA)*0; zY{qmG?Pm$Swf6!Yw;h?VIJQjGhYrB(;b~eugD)h!wBRAyZEnsOFola_ds7;gM1)A1 zyE#Z4WQYbTQsl@J-Ti()`LU8+u0~DxJy~j>5FpQ#C_KE(1`|96f=gwGbk=u#6r7~(gmw?6w?+fx5ubd)2gUlaOOqLs30mSpwLSGtL6H9 zwz7PDv;}cH=F8AKkjdGsP=Y{S8(0Q{S%k(=!}nn9=-__3_Az@EOw&7HjAhTQS8tKX z>y=PTu2pq7c))J4urFmJBDwp$Wh_~_*mal~yP=0`U@=)Y|8dJIlTp&->T*I$1)%c_ z>4&Fl;c=s(!Bub>OY}Gk*)hJo3Y*`aHfO`3bf#aZs4U$U*Zq1?%ANXnp0|iv6}5yT zkvtR%N0>K^WWL_p>{iF&Yt2j3)raP-rQsP(-fn1OVMP?Bl+?W_@tF0g#SyYd)lfe} zxZd-Q?XmI$7&l?()6{`D%4?RqhW^sImr!jNsYM8Yb2S@5A+|eGC<<0MvRazP@xpTm zbSFGX94h3v>{IQ$@dN{emqH1}_&`C3*?O|j#ODC{XaN4BkGfr$BR{@QT>s=mEuzCQ z^%Ero2!kvjAE$j~9lMV9?isL{n{E2vw`T)cYfc!8Ak9~XA)PBlc31s7T2MRvqZi^@@1u3QwpjRSNlp9aC)ds?5d%fLhR3Rdg= zI6S)vV|W)Tvf2;&z_J2sd*DTu9NwGrFwxD*aU;sn>|jq9gL8H;zU7CT6v0~K%%bp- zGhI${LcJq#ubiK~p|J^QnI%fvvUqIoY4c8utu?nO){L@sfkR zB&e82&b2-zrJ#MEc$}4oAv!Y5Gh3LM|1?A4<><)1XmA=(k2?) zkqaRvjp~U=!D4*Eeo9eO+yE-_)DTvUQ^1%gJe*$pLyQAmj-NRnsHyjnbb0Fladm|G z)!p%!Q&j^_Z>07ItHt>}@$U? z)EMo?^x0K>NL!W)ny@(Xj4C1Ffc zUq6p$I)V&{VNpq?$HkS@YhswpoEkp60qZ7OH62pJslDL=EqOIN(0|}Gb9&Z5W2rS# zwcsY5=hKGDKUHLRep{KUMf;0Y|F9f;gIOLQy@s8!w#nfnrUkT$Nn_+DJnt}$;V93> zrVQgtK{&6P#2r~CfN&ZX%b+WBeRb9~X+5Mxq&2_ZfFaU}^Qw?N=Onp#E}XzddBRew zT&c_~BzNv^1;#=l7Cw|UXqoNz>-c4VQ!XSsFjqeJ4p4AOTw1fhl2X~L*&x-+Y1NEe zBJDXFM~n>Nc9cT%@%qDpmDrkNElDwnZBV59;G>zgrpYDYB${9|gVSw^1*=3PYO^M@ z7JnW4B!kdS_uke}X|X{9MZL^3O!SiZ&tw(hOzU}U?T^)jn5hS7qxWJZCSet?85^-| z^ekC~k&`uzC0#`nL)xV3!@b9lDi4XixKr!`^tZaDg~$6%OzmJN@_bJHCBzqJq3#qh zXHN;X0S!+2?NoD^=#^4~u`-W&lE->nsaJGtBD7%pt3u4qm|w$=2&>DEYLFAVn8|N< zLxWQ#6Y$rHqpbl{ljt%NgOiBo$(Cj&o73uvwTWISoXD=Xc465PP!={)(BOvw`c##jC}WAQmW^Qk)5`S7ljq3uIy^5!Qq%=uQNGNR<)fJP=`+o zzsp10ah{!<<4tZ`tjIKy(z>b4A$fIa?osS5^eY8_>Y~YWMRQf#9Hcs<&4LSMch+N_ zRz}`seCci^Jg~j#%7YCx-*=m9eS(6fVFLd{y9>?}Fo=hA-O7=VaBWe%(o2WoS=^;S zj*KzWPz#kSP<%V>KF6)NV#pB;k9W_&yCbDN(Pff(N&BfB1Q2f&76}5&uK3_s}rJ!awiJk!O*E;Z^po;0B~i^kHv z*k6VWi4j8!R$45Jg?yTXVHsNYiNVQ6?r5ZzE|v@AqrMb0+YObZDKG2FkjrBx!c@X5 z`r;3MMn~pPwvFh~XtL*Ev^;J--;W1002uVe8R#bhjIE$ZVk{%#G;yv3X@dU5Y@Q`& zhA>lj$>g4S07i8V5Lp}aL*K+B52<+ZSK`JQbWPk8r>z^6(g=N`UV7&d`R zGHm6Ncd;rC#IvkmS+-bvK9s}cbrjc){p$ByfY=rHNz>fl*>L7hkg{bi!CRk$;%U9) zjc=*)rsW^1eA{rld|YGCzlETc<^ufD`uf%UY5aRh^7#`Q&$A*GPA#EWZ0_7QTRCJC zR4qR9bL@Pgi<@QWsW4LvHTl*s0^=|(I6U1jVqhla>28SN$MgC@WTEJec?DgIsBn3u zh+l_MBI~TO@21MW!x~21jZBCn6uLt@B>6`&s;x2&RHc!Q5$Zia#`}AQQ@=jmqX6l+}1*F#q0T1u0drtnM;D z*4b_|vDRIcloE5@SCUL;rA+Bitywn(H_rGS=qa?JDQ0xZe5GG1ZKYX4Zjz) z-hm>$QE$WCm~Mn(hx{&gbbS(uM1Y3Mb;qYbS^GEj#$FhTL+ftjItPTZX?Q1Cva~`# zjG!Ne!m4f%q%vz7%vtZMzwO^5R2n7-$XIt6#f8~w7^UGSb75OsX*Ps`Cd+mhzzL|ihZaI|Ef7iqc$~^_R?H%?J1!s`#ozcIw0m&YsoCP(p z!#HM-e)4$w|6yEu(y~Zo=fT-4(tITAthp*UWL$1zRi!zzBU(bIXth$C)OKg38^zgETu%@u`MZ- zB=|F-W;3eJY01?^sw=W(w~NfVt)s^4rW-9_EozQ`)xY8G%j5HKn-%vYX3h2TG_kwy z3HnR86T|iI-Dg6d_j-cI(TyGlYrDtf7CPr_rSNIS4Ol z8x>EJ^g&L~oZdPHQY0K`jC?J+nzXx0D^Kg=S6|L7&{vuiDy>{R_&7DoB568NWsPXq zmu%W$MZ<%(!?=R$M(d=(EVBD)K~B@>p~+RR1`fem3Yuaq7duj43=(-r2DDts;;upbaG7y&dYAu<#On2PX_tUmE0D%p-KwKX*4y6!G&BA_c+-La9L* zw(AhXXij)ig)8L@A{N_z7YwP6^EjVv`*m#RJ^1|!*Q9E-X46fT-SMYYq97>_=ejz* z$V3vfC=_AM>vqUQl6c<%X|GgAuBf7da3k`-l&)#)cnX^0@mL~} zTmT^nVdxF`veb4D@*NaubB3b}jciG;(U86~%)>O&UJ4QTUZyZUA#$lM&vhs{^Ow zBG=hlW0Y}O-myhmb5Yv#Hhh*8OOC<$XI4!3)Ce{B1n0KzPT%DM#q#;;v<3`Jn_-kX z=HQ61%YgW{tHpu|!Z6lejazDsdW-3{+U~?FU2&M1%+Y~mZGV#5C@Cz2_n%OO6AHOi zHgaQaMj;BqWJ;NiXhP0h7ySx*FuwfiCkcvR#S)1$1>w;~UCfCvhiGNty<&WsP->0` zWOBv8d}%Pp*2*=8XmMOgg6Jy-j{jXx^~lo`m?w(ddPiGo?jiJwWyKO{^TOSsh2)Wi z<|I4(cHNIV5O_Wh>y0Q?E7hMDTJJxh)%V)$F;6E7YgySR9#G|pBq8#a%!w=(t!h!K zHXANy)DYkY5}~364C=tx1c+FMt;AQM1ZF65luEUNC6vpSSBh0Lw$CX>`GxDcG@30I zs|8AFeAi8Sak@SZ`2JjS_t4s`CL7UIraCUuE^J%OXphNWH?v=u5WTxG{z))8z02j8O%f zXJacI!7yV?LAS-kjNFWZ5@N{UrS8=uxpI|a6`2#sRq_>*Ets84qDBXq%$rprRjk*X z&YTEpF3!^~e|RY4c7b?E5{e;CC;u@lQ0C@^;0@29HG#OS7qQg*yUC$TrPgY&obIUW zNx5Z%qArK3?4hI4qkABV{o53hSlZN{tdY`PsYnkMW4=xZ&wY`vg6ptEyBXjjD;N$k zfJ_Pn1r-4WRh3O$X6Xq=p(&p*n-&IB0v9URsy(b0t<%FvN^e3+C5b_Th4HFG2@l?_ zAq`~{&6QE_gnfKbfJQ$4S##fM6AdrdE?JD(8S=MNB70CRtG9}bRI~9jd6ng#X)k84 zNy(C-&Q7rzaXWPv^m&tCr@a+z>O6%C%Irn5t!Z(>@>0LdKk|z5L-J+!SMC(YhwH!a zw$qw^^)_uUWOGW~k6SQwH0n_mgSnABS^FS*h;=^?hFuznFXzK;PhmE^`-*6qV@@q3pQ!7}aO9~IQf;wlCAsg( z@C(Tp&a5=&B*fM%Cwt=FR{Q;gpw6fyBM3&&2LUYy_g#bLwL_*YCGE{-gKL7yn1d>L-*F?e_w<=&t+epYWb#UO)P`89kgc zysr_L3U18)@IbZ;n^tvfM22yy11=P7at^1MEH9BB-@MWTf$7ORpO$~hDgS*RZf~l$ zlDO7ucTla#IzqrA=cmm&Z6IpKkfv_!4zzz-O<$&MJA>D~cfL$&W*_f@XH`4XYC>$A zGTH(<=@N+mUys3 GPuIFio%^Tsdb$N^?hGTPy@$ODJ{G#nv9gilsSqkQZa1j5 zt1#?;#Tz~UV|c1V~*#g^YB48 zHfVrp6+$fjAg0NR3*zYf74DW~>BtfUNsP+Iu`x5AU>8SC!~|vAV2=Y z1PTc(zL>!Vm57c_dhI_{1Ph0^?V=chguDdHW$*_xesneRb^4LCj@Et3Zn_v_cx%XGIKb;a@L*c|76ZXV?sF@eNGMtD+k5{C5!d`=~ z68p^2JTDwCek>37tH_8EeyoV@uc#PM&;UbOY!H($Id&0Y5)XY}gh%G`7Lj&Pl<0>) zRRYbCz+XUrSG^AIU30ql>S#$xZri8wsWK%P0D=N)tEoKAX~+T5AbiNsFoykkA&MM^ zYM&tw{XEf=@F6IYmo!GzUK2S1i4rSb*=%VK9MMRPr21IK+71B=1|VY2zJh)@M3c_w zDL_K(%C1=sMg&ek!rsat`8+sXE{LYi%g2bmyDb70Su&h%2DL<60JnlwG-_AeU4?|c zDAuk!EZO7*?4UB_ep2~HmjaMvWyfu^>&$V`WdjuEOyO(R?FIR3Zt3)QvRE9-3$6Bw zKa{S7@2Vn*@aguxBA<;{3`BeUW0Ly0o($;uMnvFLW>yW8N?NhQab%Wy^t~m921p7@ zBrXN*JuEeZua%~0;leh7@=q@$#2RqBpi?vN)b!WG zQg6?rGE0XvQMP1AM3h4?*!ehYZa7FFt%y*jC_v+99S6!HGas%5TJltIyOT_-=4)#5dnqH5Wp`&I1h?XG0DWDU2}Z=gr>(J!7!C;>gzC&|As zpPTo0s_&8KT53jw#J&p*X7XUa8DIi+3-h#9vqCCW?+^b4IfqTdQv+ofib9#@7YaZy z^1`tA5R&d1qdPK_LfpO<>TwYyr{i{xnKJ0KY0;F3s#cCz_#Q>4mIkVBS!wlUs{xDTyC*UAYMo zQfp(=OzD_g%V2($!%T#eJA|x;gecgj_}oiPkI8f9u@un!*OS~KZVrK!2I)STbb3sw zd=E68t_G@PtN9ITYb#c5u=VYDLTbeCI7b?Bt!pQ>W;=0u=g7q7D3sQBTkT(_i_SZ% z>@U`ecjGF2)^+RjgNM?nb?1HNq#RDu6)%?!L)Il{iNHVB7|s?*GcXXEOEoxf!c5QR zsyGbMwi%nv(i-jVpP%*78`sAE!sFK7MH@SZ=VMfj>&jIRlSwGglSglKrjjJ4{qgL{ zYEm4tqXJW&!HPJh2l*u2UWJ%JaZqMf>$HvKO4IFS6qa&b2$h0q%?d&jDjkYU!XiUt zf*fYY6m3FOOk!y@Zx8#E>6rH1%4n@o*6FH=^ykCzkkUi+VgMU!GM0<&iSp5o?oi7>#z*IWloz zOmHj!+P9&ul_7K+`@}DC(R{*XLMaSNeCgNwLBNVaLny$k@Lvvq|Ng%eQq0a_!2q8s z!GK_bk1?uJNQ)wx5a)g zOA69HqMW}l^r#4ZiM%TKfItNAJq3JHV(tc|EL6Gem9yrg(CfwOP<7G(cjo^3t&qFJ z@r-PAi?dW4gE&GNH=2c^C#O5Me?v(1PJc1@MX6mc?`B|Lb&O0L)azI~Q^rY#5M!eI zlpyiA!59*Q+&OtPxm~o1!12(q{vt+2k5i+49bSTv@8^T=ErKEzhDR5dXWl$>6&EnO zHO1qcg2%@KQ0dE&`yI(or7IcL#p`|1476xh&f z0f56EHYSXkB%vZgf%Y1Z8_Z1S*1yIAwhyXz+6p_fmr`y7yM{!a2AgkO9%*OFZD*rp zQ$Wnq%%;!ydn?fZm6Rx2yN!+a7`+%ty4oVut9C&;2k_D8T-S3CZ$atkcD?kfMKxk@ zcE4UZoziT+pL=M@(%}OU30qjPZB>gE8;jAIS;HUO{HX)?KGZJ^oi1r5l7P2S4*~?^ zRR0H(bvfy<$Rq#SB>{!yY`BO5#Mj++bX7pdvhUf?=B^?=J8M+%g&HG7BljTqrmF(} zA&;T?N23CQ{U6-(7u@r^anG7{4Y+aBVRa3c(8@_bh3BvR&)F!7TxYQ}q4F;?-f@x}H*;x1Z5 z_c2h7+pafxz6fD966SUD&*4_hEsEwYXK9ZDo09f1CzJLep&D+bD%xAe*uLVXWMYH+b z<0KgbgSqXv3L?jB^{kuan#07A^@!c77_*UT1fqpUml_KW!hcV37h9A+S`F&D046(o z<)GQZTsRYA5|4=n=u_{~+-`RA#I(O>;IDT|1GBetQ`&8W&w?_A?6nE;#he1a3%Vx6 z@{?WakNlmj{7M4|=b5qhsR03^Kmgnf)Vsj(e8jU!>S z{I?JQP(YjKJ8M$SP-UK2_f)j@iKloov zy-xTbtgd{Ab8VsCx32LZZ2Q2;2Uv0Pk?h%1w>j$X4~V$AS}flI(zToyB@z+ z?)SfR-|OqSpT4%HVyW&XuWMRa-4eB6bnVa?XZ;zxr2U?oMwaU_KjL6jh2{Z?T_A5e z`kOm%s(yf1I$XDiLp6Bt`--xnW)b@n!&rND*3c&UK)y(NWlv?qAecXT=m)o9-y zX|NPy@LWfb-)uR*!1?yp&&T595lsJ~Xzwqj1fu8`$@_&xC`P5mO~qsP%SL=u3YH{I zD5~pwzbO>|mI=ae9Qgk=(RLnGO3|{mi`I3$j5y)+yl)E2w4k3QH_@V>4(O{xnt1~N zKQMsuTOeGBms22aJV3Y}_*N1CfDQoV+1$W`&rSxh_wlSuX&b8`wq#M&%iTYV&f3Rb z154a!nj&`sPpCT>!6{bI2lW|KSD{&eohY^So~ZC%mVHDKQuBJ|Sh>);f-Jy9=*Pw; z2xnuSQ4iTizVbhqE>suCx(S&E9VyfY?ts)a*A6whfuoR404r{dR*Cgr z&m4O(nM`)kRFmc9mwXxg=dt{B&A1E_vqD?L)P`ijtQtS+4f>BhRssu?;;poxQn%|C z=px5*8Z&zynW%s0Kum+%Fp*cWkg_6e=?*PM!-5;G^%qK~jze3W6~CQ<#FgPsnt(qX zO*`-I*dQ>P)i%_;k%bO}^qLWtKG+rYgsq|*Z!u&h3If(AP@TPHPNKLK{XXAhyMYY* z9_Q6J_Z0miy6K^EfRv(B$9XD#yI6}(jm~+22A?{pR-fI*vltG=WLWYc>lmqHmR-WE zg8#_`!(Ybv;hqtNi)hq%Sh{C;_l2+y^zHS(qQl-gVK-v|xXTS`AK$-b+LG*dZu`2t z)#OLvf_68}%R8fCGZYoUGNA~AeZ)en8i^)GQ@afr;$=OdLHP!%GRqxh?yR=Oo0P4Z z83fA(rnRxW=PTke?!c~gwu57@4HcArOUg|bfwn0OUUB`xaOwJj*EaPV zl>`FQ``bqnCcjfT4K?=g{eRgV16+M3Nr{u}cl@k4rupw?2DYxxh@;1J#?L+XF`VqgM*i zFYh~K85FQv_&OLl69EOzO^1IwkB6YKn&8*%a{IyLJtiYPd@!bErYBmKmZNRMoiDV@ zj04>e%80C33nT+M#gp`;S3}ahkCE1Xh8IB$sS{CXs|qP47Rc>VsPDO5ULwmiV8SK- zJrxm%iY)H+j8{))*3~`|pzib7im3EaXFZvdE`G}y5WyEf6W1{F%5`VM+JhjV#N#xj z^M!2lsyt;Qb}#uQU4N>_=VQ7YEyZ~sohPq8qb@HEC0BFNyVooU1du-`o6VxaQEfLY z|Hm9nS~B=G7DG?Xvs99(hiJAF8d_OpfLbt1T^>dgFlfFm$6oV?Y!HRw;Zg{WZCRwp zWuauS^yUCVgUHTGQI-qAO=*_nKJzow=)RjL-_9;>W}v0td`;JTf0PN*glmL!l6kg`#q8AG_~9#&g&F_C2Fu|pY(;);5-cUaxI^*4 z9-N4_gDSNBZ!tQ+p^%5oIqyW?W7qHp-u?pRKA_F3kC^ldLsE^h2{KjpTCssVJd^qD zuK@?Ur?NJm0|#-l8n7}B@arOY1W7DJh&PzG`bs&9ipS`T3sfNh)8f=BwyqMfjolye zs}_WDWy+(LD6~Ns?*Pr7{dOpTj6#pr7dATV7U=r=q0D8ncm2%Ty>$p~L?r&_L&74( zkyfJWm)fwIub9#(UE4940Cl2jHtUGm$%H8__Xj4>Pl+Q&h`a@JH8(c#KJN(pA2I@E zX{jjqG^3GAwmXhdi2ya6}X07)!2V z{zZ`625_iyeGXnzV#G|?;=m-Ctq+jTv5AUqQ`%s88d z4!v6FmMmNuipHy`ZQS!Y`fMBYk$}u4O?Sk?~|t{|Cf08 zIO9V5$#{?0?C{99&62Te@g;j26cl{I7OB^d=~-g9>OVaUQ23FMo3(hQ{3N5k@+>!3 z{AcJ9`z0-hUWWnWY3>9sb$W`L=A-%%>45{NQALvGv8dEZ7H_W zJRDta=AQNbs?$~O6ZP5p8Ap?+F+%wGHOA~+#PW2;gnJF*jAT2}9*-t@#VXX0kAm%7 z6;oPGr|M6ZYCV}=8pFW>N_LvwF!ywlk4!Kty*JcXZU>j>lugM5_SEl4g$1>}`m8cB z8bsHt&$|l~yiuCK*9|(;URDLyFf%=S@96?-sIXXi)E9X4caYmOx;Jn`=VHhA5m6BX zXoj9i8UK}ji6QX;17Dgh>F#LwRPF^{vA__7ggs1EyLVGm8Eis4nh4FW^1OvA+(c>Bt+Qw&ICwR8xg@Q_|t=ls%<65;? zabYvurO=$FsA;XY;*|o0-ec=1{aa%DC+L%sPpPE-6@)s28(5i(qVoO9cPW=oZkjAq z9KgCIo|Y;yhK4FSmXe})7A1vZo*6ZRxY2slu$e5XV#RW&#C|g;Qc0#{$x`_bk!&au z)XR&&&(s`#Z`v=Ee;f~*u%J2iS)6SoF1mTK5kOseyVW9jHNjet)j5zmxYvRD#&ee- z5{oC9WNBqAsXa&ODc?h1e4)t0!JMt5jE0P2h_7ZLY5$}|l+wPh2?`3X(3^+cz2;vn z{R&YWj)IZMwpSg2%=g1HY)dCg%n`JbY`GlxfL}~FRn!qG-eJ^@c}(r^tG{q+I$vuj z=jDh-N0-~*t9NMZ>P~IlU(acnCSM=RZ6p2byR>NS_p;eX<20sNzrYsJps}&ga)G8U zE@oedzJ4To|A!|vB~_v$ac9^9=3-I$T^-8Ln#}5K{F5hH6g$#Ewpnuh+aS+`jpGXC z=}$NumBZ$?o@DZ26lwZ?Eo84{&ejqIA!@0id|UJNR_UbY3&0xmWvzc5i7kT)$LUSLs-% zfsf(#q9*^9xrm5WwxXd=jT`IcMmhLzBZtkUP>(BCf0Q+sp!P3CvWB2!V!$j{>0X3jXN0S;a> z)r>(Q6+;#SY47r5(BhK&Timcg5TAD#!JA8%prV>BNYmH~m9}jX6zv+X354u%x?0tK zXR%LBF~wL&6dKFlEdIj$@7SoL1*MF)^abBtV$~WUd?5`Wv7N)*LN2?iJ=-ei+r6n6 znXm8L-XT}LEkXxeW6A|AFxI(r(8lpwcl>br0J^^P9$#@*puVmcz=+Qvw}NJ7?r8&@T{7q9rg;_<_wtH+@k9`? z9lS6~B?pS>=BI%e%vsuU#YM&om#Ds%R=&CZMX{{fV3nCAiyY6_xqX}3LgU7UBlEOp zF8or6C@Z+`uMr981uM-^nzqH?#klVb=Rppkf+5r1ME}-Qf(P;h2SVtDUnE7J)xD&e z5VouyquJzoQb(5BU7>UYn0E-Ascu2&Zs3rB7$6?@;@(7X)dY(O()=J$0+$!jn`3gdUx(CCRARePT}~;+!4yKgd2aLD&~Z(xuY4W%1cLcS!`|JuMb1 zEqIGW6}%HSixqs^WfQrXh}Jn{a5Jq+g$w`q5?axA zV8~Y|?TbaQ6OG&L8X>tdp65Y01#ovJDQpKw(C|o4ovq+-A_XR%X6HCv=@0q!HFr$8 z9fdmB^4OKe3dKCGM<8Ok2rL`6`C-m}3+17)ldnEV=eeK{v1vo$i@?D#5(czjhf zloe-Ss3M2sR8;n7QHMhf+G%?P-{&;eBZ@w1b?jvx^G_OpLSY}~oNEelvxSb54MDOC zx4icDmcbWL@-p4%=Lqt2`yP0b^v;|*=woqJ>i;@%^6h>~^TJ@S+GM~! zz8SxV&0^?eCrqD)U+v?Q6xrADAp z7wJ|EYU%_5F;0Y)&WrJK`$ukR>6`rax;!lnyD zf!+oLg?W;9cF2AHd8NIkO$sD(+bI)LaPT2z7=%cI$iauXeMgOdQ-YFFahUQUw#TYU zcj$57wW^DL`L+=lfG!f(8>Bzw%Do(sxtMk-E0Qg*j{q84lOepn-Q40WQ2>tPX`P-L zQZI7S^WMO<)vONR+D6pdIcd`O|B75<+-H&J)0^k~!?=2Qj0YUuZGM)|4T zl0tz}amMO&SOhO9Vs0PoAzjT;Jj6EwSw|nxWKA$+q>ao{Uj$3yLU63hLxz4?N^o2} z_r>v~F1Fn4QrJE>Cik-q&Ei3*Q<=S*q zF;!m;<@AI_)htjN&b?(ITjORq`L%E9UC!)={;mFGmYHS?nZQN7eg=6r{tUEtM|Fow zfB(f)#rfLvH-V3DHBGWIDVa~azz-Ze>krN*zwf6PZhRoj#a#o#7PcZ}0k=ozl-;ga zx-iZ@X&LtMO}O9}M8&KBFR?XjQbFHPP%4`^wZd5$NcZ&#jcDE4xol|}P5hWs#dGvq7y}mfmZZY)j zXP$2+7iSxL7iI&dh3NvAhsmcQ*TY2sV}oCk{67Azz}pJJQs`ImV{(qk3?y&L`Rz<5 z`%fK{%<%QXgH_`9>g52hSxg<@m#Lm(q209Q5B4N%?|U|$5{4N1xYR4JZbMRcQ}(%& zaB>u%&J1`6gZuAg@P35R`Ry_i_$_=>c+2MCiv=7`4A6gwf#eb=CvwLmdH?U#_N9dU zl~V_G==7{?BW{rKo>uO(q>O0_lecI;10+A_cRnO#hS5kc{Fo4*2!$QQs~^JlmG1+|2q!UtAlniR zvu1#a9^d47rpv_=_mOL=(8F#pB8z99+H z3hh@k-PBp{H{o!zU5;E<31i#+eC2;Ffph#G42!00`P>W23(8W7TA~V??N(xDr^}je zMaEKzft!JWha0czU$p4FV}~o~?{8;e&*(AfU)Nnz1_sJXKE^=GK0ME2{w5%t>i3r_ z>94QRKUZ>TK>aG!7uYR&e*hWSGx2FLvTIqB$qv5nwdaIvDz9C@YHMc5De&3U$G(}; zUoX;oC~^x+z{E!)6vDC`EUZ6oHDJa7NO4adkcB$%gsJE2awzGHa z4vccj``_P3OSwUx{QUJZC*B_|&15LF8jVv<%&BY039mf)lbVA6?x{ld2ZQ5ez|IPV zxV7c(Z-*ul6sQ6?Jg%glTql>^5}9**rzX;y4Q)30V50g#)H<4tp7lKU5F>DkoCd3F3^rxp4P(8)dQrgq2qv!{R-)m^~q3ZeL! zH4yF_i*sOoi3KS{P93zP;M^bAL~V538`ilPFj0z1&7sOxSfoH0DZf#uTltkyVM*i1*np2a95F}ikEj_fef=-4NpP+QRKLEH zcTNg9*K^MF0YT+$g@%35q;Q#!TpEm5ilj(Nfo!%Bq=48}SByNX%FR#nAQ80-JB%4e zc>hL*d#Gf`$2ZM%z=ycO5f{`{=tfGa=_6R|AYA`SFReGySVojz*&)mElzSU=&G7y2 zPfBWM*U@>Y!sNd4RTdeqC#j@sSW~41tr#&(o9ic4(a^Y!LBXeznPmwfYsD8eXM2}KuE3=nT($6zixL2mkM^jVi2KBv+ z@%znE|_ZM+ia@)VXhM?LLxFhU8 zNf!wFF1U@lL1ExXOk_==-r9;ZAm1}--QcGQwVMqi_rnzC6or$o#ZupY$RE<+FPe{& zQYytJ5>Fhj*sxElkBO-mz+%zQ*2rbmR3&IFE>3VY`Tae;x^8kC>8F8{Sl&K$hC$qS zd>QAF3mDXf$PZ>Mf<4K-yXv2Ab>naVKPN6?sq|)Bw2gXPUG4u4qz7NSBM`H44_>iP zoUBjMfyb28u+9Yc#5eBKR_>zU7zeT9v3v5@m_=Yu(c?%=fLbNkp5Qh-`==PqFH7=i zPE1XMnW!zedXJw{j3}P%6urC>^Se_Z7B?uxEp5`eyTao`M$JB8I5j~Vibyb2?b{O! z`MZ+iiFbRGv`^}HS-pd}G8>heoa?S_A~}!phKRvA*FNX|mNdRQrkP#p+Ev8yVJ0H1 z2e*iRirSMn0a;kDG<7bUmBv(C1dDQtD6a!e&s}wGP}?Z~>+{KGYf7wUUJX0`~1g?#|-N3VIFnT);bG2v9mPc$zFB^Y}-O+VZX;N9EQy>DZ zkhCP_*^x#ppn&Z>>-EKMH@Syjw5M!MpU!z#uU2c7r9DdvJ>kZ2i+#KWQ57+_^YyqZ zbB$8>zXGBdUFR|zuc?S5lzl{GA}-Yjn~KL_(^9cGVk%kL$6ZCd_S(zL%Jweo9Kgt~ z@=;-*kx_pEJc6h9q%B4TeUBbTV+@V@pie3~RY`k(^3RPY{#XO`i9b)D+u+yl{=uJ^ z;BUa{-5K<_8VV4n40WF$8N4%e=ZN0(J1=g$Xy-wO1617TKI}4BHwY$sjdm?oR4mr) zVwCu=Cs|Jx;<76L(Mu*uu5CX07@ds#lxGgx|@4ib8jR}wD;Cy~aYu86-#uv{| z9CubO()IcOqk6LEO!v*av?zC{5KOphCOXvLNW1qB>|kEw!O??t?aO`NK|HmMSD*9r zX+i621@-&9-J-{j^V{Dlp*B2td3oIhxmn$LyzK13g52CeklhLxB1W<70G`h#;CWm^ zAdf>J@YtZ&DiRSf?xQMOXkA><{>hu;7l{=Sp^=0@Mm&%Qn}uE3i_U}HMrX&mjhu%U z-^o=0aF7b}08`3;4Jk50qfN-_Bx?&-9MvkYpqrV6NfBUrmC_W#BRPq7I+O@v)C6Sp zbidas9J#o4SMSe*!w{5BNs(R6L?bNRd_t`@=XdRSf|l&vf9U^UCdkwWiRaxC=Wm#^dtfsMT=?6pDHn>mN z#$cwkboUE8Aj(uuYCrSG2@MQz9$X+jiw<*hWx4tXMtS2lpOBiqa&zrQGZ|Z5o1f@W zMNzua3Bh(vk0WySO2*jxF)Z+*Ne(uaEVsDESB-(uPF5D7P6ThZwUevA_@SqLUhefWbU^w^CVP;Znsa169tg0GGayyl_g`y=mv*EJuow`+JFl3y2{*wnyB$TO6MrQs36$}7au;%TC=G9o;^G+J4n zr@VI^FFL>OamemP7ov{P*kz}0pnd43`#T&Wog!wvNw#R)U?;3!ppz|{XbZ+PHD=Vd zIfp*iJy-jCIiu;)#s$qvOCy@0OLBfGPYLba>C42=WPPA<$suC9ov*n&JDluFG4U)u znZ}2!GBBbz_PpaH#X^lu1@6_`xgwhbUgn+?oHy4 zsXszbM=!OiEAs-uxKU?L99UMOb)I)0gQ_g| zMDiZYX%&l0aX{K478DBR|0!;1za>t*JKM&epDS){TYWTf-t)Zx<0%S@a7*(Q_&R4s zQoS<6DX#_MpbTbYO*$$GZSV9@QH{SR(T{!{DUmXJJfiK`=}c7xy* zYeAxl`+L@AXtxlc{D6+ftKbxKiu-%;)fl(-{=f3adntF>j-G@p%?CDgnvEz*T=`|M zhm|P<%R+#2B}V^5e!~gSsf5)hs}TE!He_E=X!UcJ{t!=!ZY3p?v?WaOCU0I3#SmT| zO;Uo@Fm7Wtli5_A@PgbL$jA43Q#ExPiQlw3brQ1CMM6Xzw9TfiStke}dv8BBg6#y2 zL!X*70-t+K47_6{)?RI!d}as>-CKW10&ED{Gy2S1eH~5W_sr5U!O}M~j-Co)wiL}9 z*C@L!anE%gUkrRM^^!G@I_bND_H?-HI0kKUTdSZwc5Zg3C|Tn7w{Hu?;A*iqq)B{R zN2JNF_Jn*QZ8JSou4^(t+Se4tt-54FX%M=Cmj!0~kK>KwmVCCKGLQ*g|3aY~rFH2y z`?h-az_=P)+7{OVi}@xuY~SR||FqUe7v?aeJ0zM)sVA^;%#h+9OHr ziB6qVpcQ0LC>*EJ@&pn6J~^n+Pd&Il{xJG|xz`)^0XCIMi%Mq#7W_o9bXsa`gdgAn z#!|}1l`mkEsazWck^$ygT4h z<7jkI9N++#&WwsoVMYWgEkRFZ0=|+OLyt;}fvtv`CoSkx6?y(h(MNWhQ zv!E@(BgH()%*`0>`(g*+g-kkK)aXYzJtm5l8WVv7d`CVs^8q&}9plPd*@1lXIBsPo z7q)ToLB#W0ba;eDj$eO!{u`)Yf0yn{2T3&q00j7({mjYkxtcZyS!KV-Iy$9=Py9A7 z0n(bforaPSge_af2M1dfW=L19$_KK86HWmYmw__1XQ5Ob3WlTS5KvDJuRR>svH?xq zf&=l#DFf;s=3PjuCUZj?9CzwD=m1YyWt**qF7?vHNOSDe+9*un!+(s^09RkW1Z36q zY@zN7?t<6&eeT~q5vf})AL53Y;&^3^64KBj;jW?8Enb3BeKtH$eRxp|cmo4Z^achc zz+hW%(K=Y%#O83-)Wvf6SECGw3NI=!mZHqAoMfFzoyC|Kub(^qEC2D4{7G|xL7Und z`EmB}2Q>iBnxkVIL;W_UsIdtFw>9BJZ_-L}Sf_^3MpGAe^oAzV;voP@T+I;&S!E+- z9mlxVywKF^Z7}K<4ujuj2_XNFnp<<5>+7G?7mYuC>&;5Ee?zC;fF>`!Yx$Wg1_2gK zRr_*>tQu;r9Smr8tkndinYBT$*<_M)k`@|eHJ3N6X#+`#ct_bt&;q&F5?ZyY78J`W zHn}?JnAP^3VzK()g&R@{I!kYavh^&-DrvDbw#t2Vtu$tj)ujk5r8It@>Yhf24Ui}l!5ufpQ21*PuA>xJm6xlTF2Mdb~F;CiB!Lr%RY zg+4-x*8y;r%QGHo-6Uq&ujcRsoz%;zBd@Ii{;``cj(Pn5=bcHG9uq*Zcj~vNlC_ou z4YHnwUKLl928^CqCl%2P30iqdIIkWIx+-epMnOdvpr8wwN*AC%X%txO|G;Psw!|>p zvQ_40?w0H@`f-`mZTukE{MdUC$YcD(iJ8JqO>d6DYu@4@(5vTMQe*Q;YQ}YHhJl(9 zNX@uR&4|-hX_&Q@1q0sKYwVqq)s`-+TxhLXIch7=ulb1D&FUP^(yL*{RsRYH)(Yv4 zxIFZwb`-zvRFpbLKG%x+fGZlcr;3TCidC<^0DR7;67mcyf+F9>@u*k{5uo$nX^;!K zk{j{l{!G=+&Cw5iEx}D^7pq`c$Y!@;(IBt3h$2r#I14AjeYkx|+H6R7ZGc0D?zLn? zq>uDDypiEI&v@BzKN;}DXKKm)XamBovqvx@fRm#N$nFk+l%ck9Oh3*qq|12nM!%h_ zKLvosu&H)&%^aX-sAXI2g2*A4AIW1W`7EP=!i{ZSg+xNaL0U^+N1#s&R-|fG^9iVpp z%po8W;0CT#SDjfYEd#iro(DxCyje^Wy<8A8Q@(TRYjWwy7rZEE)PCg&IkULA9AE>_ zc2Y`}%rY3YzY<9Z^pIdVe3~@0dUg&u%61|`NAP6aOQE65x zRcBU8%RsqNyH}hQA~vJSSM@wtTh3rCQoEt8xL<;z1m)tSexnvcQ_ns62}@XklT@x| zQaVyfl}u$?8Qkbb8R=@P&OB2)Nb*3ima3U%B}wy# zeI6hs#H#*eIornFUZve@0+({Izys_&LKp(`R`vme z6Do7BV#Xb!;|>MbftZ!7h~Wz1ENxd*d$6?6Y3v7>MwEIU)EQiQ-%MROn+0HU3!o8T z?^rAL^egqKZ9X9IE`Y1BPe_|X$*$Zj0DF*a64#wt0b*O3Zf>=2I1E}a(&C_sh82UaR8H#zFHP zN|pswoO>N;%a$bz*S$&?rjcK0omm=6&{Y=kgMjg>^%CzOHbUdYm>6^I4tM-9gks8y zCBkeCViJLag@GA%OfZVMz(yMjUL~6w=bxU4%7h`=ICgjIc<(~kdf9vZSd3vn#O8y> zyNE9%!2#5Zknj`fDK+$#MtcO-MEseHu>e@`h*_vim0}!LFDW=thgDZ%%%~3c@W)Uo zrW8OTvjt)jfhA{Ph8+`(VlJ@J#)4OFBOq)bfHY}LP&9vcyw5?p&|_u(H;g@TiEElE z`p=t5We@c+;yXi9;4qZKdGnx4!FLr|S8-2agmlo51^o+fXG_1n^D*xVy2am~JH2}k z2mloQ{0FUyI}BvRADq($0D$ISPd(}Y!1Gr_@BIXxhR4!w5CC9-00002h$>GSfXnAy z*4JiZBw(wI9ouR;o+sQ=e7+{^Tqb8Moil1W`BD@K23 z=fYNT{_GCvH)faZOJTDTvB?wNOA{2ugr(tb74slHLaDmvPfkC|Lsboo^kPCZ%rT3g zJibqJhNxGddVUiL^ zovLq?S8C9WO;UNQ&NQseAsUEj#dkkFaoB1ers?{HauQnZ$NHZE;=-Q7~x1LZbJ zkyTTlD94_uv77R}wrBzop)8#1r{jQ|>Bs7!Jev7?W{h72|4@&mm`zp&4m6%M#?NMd zKWV01he*;n8yc-TuaYsz-1yf7I*USRI2A(B-hJEKD_&s*}A*Oi+$v%|qh{1ntR-;je#qW}* zj!_(*HS{~uXdF{HP`_c>3Fy_GNYj`~P-mhe)D#(X5i82zaOTj4Rdhgn1$^V>;u&*JeEaoej{HM2vJW=zsBCb}-bP(&Y~H0~SyPrn=`_VFxpirI^ee z~r1dbjdT3E-eHRYZNu5>f9SK9WZAcT`u={*?;qlB?5C6!6Cif&ISBGBy72N{Z$ z&NNhLBE_4bmLxd6A%zbG8sg`hDQQiGQg2d25H3MLka>|_&Y2-Z9x)3TnTLP zMeLk49zyJz6^oc4*!%@c*uCI5@B}4xWGTzTgCvQiWWHAo2_^t7L4-4q+3?7~5-l@v zAP6mC{2w+XFNyI`AbKfoS%7RMAgZ@8jW;_(<{L|exn@IPb$`V{e#EZ>JSxHzkF<5%7`CfRQDP-OPiOa3_lS`c* zUuVU$WG>6)jdLLlvmBPR<*)3hD66_@yZ$Tn#B|BGkLowif(Z3uzGVL54m}L(-ot`|u2o|fXiqM4XLGO>}>-~j$-~GRT({}wZPV=&E`vHJo?58no z&%E%3eVXlDP@W%zQJkb%UX)ecv|T@pB}u@-w(`T`abEZHem{T+6Uw-dN*n7uKM12D zU;b@AjMKcV+kTwa{k$KssKFzvXYWUJfRw|{usnG3;>{1geE5S16Uw-dhH2T3>-j+# z#YvjwMOoEN+x5dZ&C9y&$9dh)`=J<4kQB|Z950BHtf-o9n3nCho*#r!oTOP^lvRDX z-tLd*>;3uu{!QEU!#K^$y6p!5LNJ12I6+c0!*aYJO0uGAx?x(j<9dD&Msbp6c~Mq% z({}wZPV=&E`*B|P^L{^o2ouVQ%NosD0H4;}c zFMX(}Q)nvc>M0#Wj)o8(+Ip~CX0$xvJ>$T&`y8kcm>Wqdgpl_|k_uew`&cxUdR?9` zQ&G{8;5_%s8V4X*#qK>&tjQU0*NtE(GrDldG>)ZGU+e^lG)756R>dLpnP?M9(Kg)= zTa`7!$EL@Dm9AE~E{|zQH)PQd0iZe(PSl;u`%flvkSE_?5MuhcwCiw7B(gNr4cs$hj zV)sXAF92J}2IfH*0t^ro!wJqJb;ouEKu`=PIHal#au`#iJi6dm7VGGH_lfsP-%=j^ z-?IKdPRZB6*86Kg!ZTKQHB83Rf~UDNm-!uw%6C94rX8puJFRi;)w13OJY9#Uu6cph zQ;+~A^triwYHXq*hf5l$*Ehb}8Is*!Paza@>Kz+UlB!eGF{dKKwLJ$u0DRhFp+~KE zKe`pnW8eO`uaf}L;p`rjXa|NP6}D bS$uc68gm^o-)w%W_rG`F`yb@S761SM^5o(x literal 0 HcmV?d00001 diff --git a/web/styles/fonts/Inter/inter-v13-latin-regular.woff2 b/web/styles/fonts/Inter/inter-v13-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d228a4af2fcc51e12c8a744e6c35d2363bd4b98a GIT binary patch literal 21564 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 literal 0 HcmV?d00001 diff --git a/web/styles/fonts/Material-Symbols-Rounded/LICENSE b/web/styles/fonts/Material-Symbols-Rounded/LICENSE new file mode 100644 index 0000000000..c86ff014ad --- /dev/null +++ b/web/styles/fonts/Material-Symbols-Rounded/LICENSE @@ -0,0 +1 @@ +MaterialSymbolsRounded[FILL,GRAD,opsz,wght].ttf: Copyright 2022, 2022 Google LLC. All Rights Reserved. diff --git a/web/styles/fonts/Material-Symbols-Rounded/material-symbols-rounded-v168-latin-regular.woff2 b/web/styles/fonts/Material-Symbols-Rounded/material-symbols-rounded-v168-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..03d95f1b04bae5332a4a0abbb4df9d9688d64d7d GIT binary patch literal 282660 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 z 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

Version: v{packageJson.version}
diff --git a/web/lib/wrappers/crisp-wrapper.tsx b/web/lib/wrappers/crisp-wrapper.tsx index 85f62ba3cb..5ada037614 100644 --- a/web/lib/wrappers/crisp-wrapper.tsx +++ b/web/lib/wrappers/crisp-wrapper.tsx @@ -18,21 +18,19 @@ const CrispWrapper: FC = (props) => { const { children, user } = props; useEffect(() => { - if (typeof window && user?.email) { + if (typeof window && user?.email && process.env.NEXT_PUBLIC_CRISP_ID) { window.$crisp = []; window.CRISP_WEBSITE_ID = process.env.NEXT_PUBLIC_CRISP_ID; - if (window.CRISP_WEBSITE_ID != null) { - (function () { - const d = document; - const s = d.createElement("script"); - s.src = "https://client.crisp.chat/l.js"; - s.async = true; - d.getElementsByTagName("head")[0].appendChild(s); - window.$crisp.push(["set", "user:email", [user.email]]); - window.$crisp.push(["do", "chat:hide"]); - window.$crisp.push(["do", "chat:close"]); - })(); - } + (function () { + const d = document; + const s = d.createElement("script"); + s.src = "https://client.crisp.chat/l.js"; + s.async = true; + d.getElementsByTagName("head")[0].appendChild(s); + window.$crisp.push(["set", "user:email", [user.email]]); + window.$crisp.push(["do", "chat:hide"]); + window.$crisp.push(["do", "chat:close"]); + })(); } }, [user?.email]); From 03df410b5258c6a2d4e48d8935373c25a9fdc290 Mon Sep 17 00:00:00 2001 From: guru_sainath Date: Mon, 8 Apr 2024 20:23:16 +0530 Subject: [PATCH 031/105] fix: updated issue description rendering when we switch between two issues via sub-issue (#4143) --- .../issues/issue-detail/main-content.tsx | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/web/components/issues/issue-detail/main-content.tsx b/web/components/issues/issue-detail/main-content.tsx index 241c96109a..8026ec1d74 100644 --- a/web/components/issues/issue-detail/main-content.tsx +++ b/web/components/issues/issue-detail/main-content.tsx @@ -28,6 +28,7 @@ export const IssueMainContent: React.FC = observer((props) => { const { workspaceSlug, projectId, issueId, issueOperations, is_editable } = props; // states const [isSubmitting, setIsSubmitting] = useState<"submitting" | "submitted" | "saved">("saved"); + const [issueDescription, setIssueDescription] = useState(undefined); // hooks const { currentUser } = useUser(); const { projectStates } = useProjectState(); @@ -52,12 +53,16 @@ export const IssueMainContent: React.FC = observer((props) => { const currentIssueState = projectStates?.find((s) => s.id === issue.state_id); - const issueDescription = - issue.description_html !== undefined || issue.description_html !== null - ? issue.description_html != "" - ? issue.description_html - : "

" - : undefined; + useEffect(() => { + setIssueDescription( + issue.description_html !== undefined || issue.description_html !== null + ? issue.description_html != "" + ? issue.description_html + : "

" + : undefined + ); + return () => setIssueDescription(undefined); + }, [issue.description_html]); return ( <> @@ -94,16 +99,18 @@ export const IssueMainContent: React.FC = observer((props) => { value={issue.name} /> - setIsSubmitting(value)} - /> + {issue?.description_html === issueDescription && ( + setIsSubmitting(value)} + /> + )} {currentUser && ( Date: Tue, 9 Apr 2024 13:12:14 +0530 Subject: [PATCH 032/105] [WEB-881] fix: Sentry errors from previous build (#4142) * Sentry Fix for "Non-Error promise rejection captured with value: Route change to url was aborted" * Sentry fix for "undefined is not an object (evaluating 'n.response')" * Possible Sentry Fix for "TypeError Function.entries()" * Possible Sentry fix for "null is not an object (evaluating 'e.type')" --- .../src/ui/extensions/table/table/table-view.tsx | 2 +- .../filters/applied-filters/filters-list.tsx | 2 +- .../display-filters/display-filters-selection.tsx | 14 +++++++------- .../filters/header/display-filters/group-by.tsx | 12 ++++++++---- web/components/project/applied-filters/root.tsx | 2 +- web/components/project/create-project-form.tsx | 8 ++++---- web/components/project/form.tsx | 8 ++++---- web/constants/fetch-keys.ts | 6 +++--- web/helpers/string.helper.ts | 2 ++ web/hooks/use-reload-confirmation.tsx | 1 - web/pages/installations/[provider]/index.tsx | 2 +- 11 files changed, 32 insertions(+), 27 deletions(-) diff --git a/packages/editor/core/src/ui/extensions/table/table/table-view.tsx b/packages/editor/core/src/ui/extensions/table/table/table-view.tsx index 2941179c7c..75b6bcb127 100644 --- a/packages/editor/core/src/ui/extensions/table/table/table-view.tsx +++ b/packages/editor/core/src/ui/extensions/table/table/table-view.tsx @@ -189,7 +189,7 @@ function createToolbox({ tippyOptions, onSelectColor, onClickItem, - colors, + colors = {}, }: { triggerButton: Element | null; items: ToolboxItem[]; diff --git a/space/components/issues/filters/applied-filters/filters-list.tsx b/space/components/issues/filters/applied-filters/filters-list.tsx index a036cfedff..e0d41341b5 100644 --- a/space/components/issues/filters/applied-filters/filters-list.tsx +++ b/space/components/issues/filters/applied-filters/filters-list.tsx @@ -19,7 +19,7 @@ type Props = { export const replaceUnderscoreIfSnakeCase = (str: string) => str.replace(/_/g, " "); export const AppliedFiltersList: React.FC = (props) => { - const { appliedFilters, handleRemoveAllFilters, handleRemoveFilter, states } = props; + const { appliedFilters = {}, handleRemoveAllFilters, handleRemoveFilter, states } = props; return (
diff --git a/web/components/issues/issue-layouts/filters/header/display-filters/display-filters-selection.tsx b/web/components/issues/issue-layouts/filters/header/display-filters/display-filters-selection.tsx index eb2238a4b9..0f7b87546c 100644 --- a/web/components/issues/issue-layouts/filters/header/display-filters/display-filters-selection.tsx +++ b/web/components/issues/issue-layouts/filters/header/display-filters/display-filters-selection.tsx @@ -15,7 +15,7 @@ import { import { ILayoutDisplayFiltersOptions } from "@/constants/issue"; type Props = { - displayFilters: IIssueDisplayFilterOptions; + displayFilters: IIssueDisplayFilterOptions | undefined; displayProperties: IIssueDisplayProperties; handleDisplayFiltersUpdate: (updatedDisplayFilter: Partial) => void; handleDisplayPropertiesUpdate: (updatedDisplayProperties: Partial) => void; @@ -80,8 +80,8 @@ export const DisplayFiltersSelection: React.FC = observer((props) => { {/* sub-group by */} {isDisplayFilterEnabled("sub_group_by") && - displayFilters.group_by !== null && - displayFilters.layout === "kanban" && ( + displayFilters?.group_by !== null && + displayFilters?.layout === "kanban" && (
= observer((props) => { {isDisplayFilterEnabled("order_by") && (
handleDisplayFiltersUpdate({ order_by: val, @@ -115,7 +115,7 @@ export const DisplayFiltersSelection: React.FC = observer((props) => { {isDisplayFilterEnabled("type") && (
handleDisplayFiltersUpdate({ type: val, @@ -130,8 +130,8 @@ export const DisplayFiltersSelection: React.FC = observer((props) => {
handleDisplayFiltersUpdate({ diff --git a/web/components/issues/issue-layouts/filters/header/display-filters/group-by.tsx b/web/components/issues/issue-layouts/filters/header/display-filters/group-by.tsx index f05452f218..f103e55a60 100644 --- a/web/components/issues/issue-layouts/filters/header/display-filters/group-by.tsx +++ b/web/components/issues/issue-layouts/filters/header/display-filters/group-by.tsx @@ -8,7 +8,7 @@ import { ISSUE_GROUP_BY_OPTIONS } from "@/constants/issue"; // constants type Props = { - displayFilters: IIssueDisplayFilterOptions; + displayFilters: IIssueDisplayFilterOptions | undefined; groupByOptions: TIssueGroupByOptions[]; handleUpdate: (val: TIssueGroupByOptions) => void; ignoreGroupedFilters: Partial[]; @@ -19,8 +19,8 @@ export const FilterGroupBy: React.FC = observer((props) => { const [previewEnabled, setPreviewEnabled] = useState(true); - const selectedGroupBy = displayFilters.group_by ?? null; - const selectedSubGroupBy = displayFilters.sub_group_by ?? null; + const selectedGroupBy = displayFilters?.group_by ?? null; + const selectedSubGroupBy = displayFilters?.sub_group_by ?? null; return ( <> @@ -32,7 +32,11 @@ export const FilterGroupBy: React.FC = observer((props) => { {previewEnabled && (
{ISSUE_GROUP_BY_OPTIONS.filter((option) => groupByOptions.includes(option.key)).map((groupBy) => { - if (displayFilters.layout === "kanban" && selectedSubGroupBy !== null && groupBy.key === selectedSubGroupBy) + if ( + displayFilters?.layout === "kanban" && + selectedSubGroupBy !== null && + groupBy.key === selectedSubGroupBy + ) return null; if (ignoreGroupedFilters.includes(groupBy?.key)) return null; diff --git a/web/components/project/applied-filters/root.tsx b/web/components/project/applied-filters/root.tsx index 7c4381989a..83eaf5defe 100644 --- a/web/components/project/applied-filters/root.tsx +++ b/web/components/project/applied-filters/root.tsx @@ -48,7 +48,7 @@ export const ProjectAppliedFiltersList: React.FC = (props) => {
{/* Applied filters */} - {Object.entries(appliedFilters).map(([key, value]) => { + {Object.entries(appliedFilters ?? {}).map(([key, value]) => { const filterKey = key as keyof TProjectFilters; if (!value) return; diff --git a/web/components/project/create-project-form.tsx b/web/components/project/create-project-form.tsx index 27a19d7f83..8fa1b390f6 100644 --- a/web/components/project/create-project-form.tsx +++ b/web/components/project/create-project-form.tsx @@ -197,16 +197,16 @@ export const CreateProjectForm: FC = observer((props) => { onChange={(val: any) => { let logoValue = {}; - if (val.type === "emoji") + if (val?.type === "emoji") logoValue = { value: convertHexEmojiToDecimal(val.value.unified), url: val.value.imageUrl, }; - else if (val.type === "icon") logoValue = val.value; + else if (val?.type === "icon") logoValue = val.value; onChange({ - in_use: val.type, - [val.type]: logoValue, + in_use: val?.type, + [val?.type]: logoValue, }); }} defaultIconColor={value.in_use && value.in_use === "icon" ? value.icon?.color : undefined} diff --git a/web/components/project/form.tsx b/web/components/project/form.tsx index 98a3e8d02a..f2a87a173d 100644 --- a/web/components/project/form.tsx +++ b/web/components/project/form.tsx @@ -157,16 +157,16 @@ export const ProjectDetailsForm: FC = (props) => { onChange={(val) => { let logoValue = {}; - if (val.type === "emoji") + if (val?.type === "emoji") logoValue = { value: convertHexEmojiToDecimal(val.value.unified), url: val.value.imageUrl, }; - else if (val.type === "icon") logoValue = val.value; + else if (val?.type === "icon") logoValue = val.value; onChange({ - in_use: val.type, - [val.type]: logoValue, + in_use: val?.type, + [val?.type]: logoValue, }); }} defaultIconColor={value?.in_use && value.in_use === "icon" ? value?.icon?.color : undefined} diff --git a/web/constants/fetch-keys.ts b/web/constants/fetch-keys.ts index 2a4e1827d8..d5112a8517 100644 --- a/web/constants/fetch-keys.ts +++ b/web/constants/fetch-keys.ts @@ -59,9 +59,9 @@ const myIssuesParamsToKey = (params: any) => { let labelsKey = labels ? labels.split(",") : []; const startDateKey = start_date ?? ""; const targetDateKey = target_date ?? ""; - const type = params.type ? params.type.toUpperCase() : "NULL"; - const groupBy = params.group_by ? params.group_by.toUpperCase() : "NULL"; - const orderBy = params.order_by ? params.order_by.toUpperCase() : "NULL"; + const type = params?.type ? params.type.toUpperCase() : "NULL"; + const groupBy = params?.group_by ? params.group_by.toUpperCase() : "NULL"; + const orderBy = params?.order_by ? params.order_by.toUpperCase() : "NULL"; // sorting each keys in ascending order assigneesKey = assigneesKey.sort().join("_"); diff --git a/web/helpers/string.helper.ts b/web/helpers/string.helper.ts index 03233a9181..558c888834 100644 --- a/web/helpers/string.helper.ts +++ b/web/helpers/string.helper.ts @@ -152,6 +152,8 @@ export const getNumberCount = (number: number): string => { export const objToQueryParams = (obj: any) => { const params = new URLSearchParams(); + if (!obj) return params.toString(); + for (const [key, value] of Object.entries(obj)) { if (value !== undefined && value !== null) params.append(key, value as string); } diff --git a/web/hooks/use-reload-confirmation.tsx b/web/hooks/use-reload-confirmation.tsx index 8343ea78df..6cf6d3e88b 100644 --- a/web/hooks/use-reload-confirmation.tsx +++ b/web/hooks/use-reload-confirmation.tsx @@ -21,7 +21,6 @@ const useReloadConfirmations = (isActive = true) => { const leave = confirm("Are you sure you want to leave? Changes you made may not be saved."); if (!leave) { router.events.emit("routeChangeError"); - throw `Route change to "${url}" was aborted (this error can be safely ignored).`; } }, [isActive, showAlert, router.events] diff --git a/web/pages/installations/[provider]/index.tsx b/web/pages/installations/[provider]/index.tsx index c66d7d7c56..0ce6f9eca5 100644 --- a/web/pages/installations/[provider]/index.tsx +++ b/web/pages/installations/[provider]/index.tsx @@ -55,7 +55,7 @@ const AppPostInstallation: NextPageWithLayout = () => { window.close(); }) .catch((err) => { - throw err.response; + throw err?.response; }); } } From 7e0520d1cf0ca0d3c675d86d80c8b2a2ff712bb9 Mon Sep 17 00:00:00 2001 From: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Date: Tue, 9 Apr 2024 13:36:08 +0530 Subject: [PATCH 033/105] [WEB - 922]dev: fix workspace member caching (#4147) * dev: fix workspace member caching * fix: caching on debug --- apiserver/plane/app/views/workspace/invite.py | 34 ++++++----- apiserver/plane/app/views/workspace/member.py | 21 ++++++- apiserver/plane/utils/cache.py | 56 +++++++++++-------- 3 files changed, 70 insertions(+), 41 deletions(-) diff --git a/apiserver/plane/app/views/workspace/invite.py b/apiserver/plane/app/views/workspace/invite.py index 807c060ad2..0b6f03e8af 100644 --- a/apiserver/plane/app/views/workspace/invite.py +++ b/apiserver/plane/app/views/workspace/invite.py @@ -1,36 +1,39 @@ # Python imports -import jwt from datetime import datetime +import jwt + # Django imports from django.conf import settings -from django.utils import timezone -from django.db.models import Count from django.core.exceptions import ValidationError from django.core.validators import validate_email +from django.db.models import Count +from django.utils import timezone # Third party modules from rest_framework import status -from rest_framework.response import Response from rest_framework.permissions import AllowAny +from rest_framework.response import Response # Module imports +from plane.app.permissions import WorkSpaceAdminPermission from plane.app.serializers import ( - WorkSpaceMemberSerializer, WorkSpaceMemberInviteSerializer, + WorkSpaceMemberSerializer, ) from plane.app.views.base import BaseAPIView -from .. import BaseViewSet +from plane.bgtasks.event_tracking_task import workspace_invite_event +from plane.bgtasks.workspace_invitation_task import workspace_invitation from plane.db.models import ( User, Workspace, - WorkspaceMemberInvite, WorkspaceMember, + WorkspaceMemberInvite, ) -from plane.app.permissions import WorkSpaceAdminPermission -from plane.bgtasks.workspace_invitation_task import workspace_invitation -from plane.bgtasks.event_tracking_task import workspace_invite_event -from plane.utils.cache import invalidate_cache +from plane.utils.cache import invalidate_cache, invalidate_cache_directly + +from .. import BaseViewSet + class WorkspaceInvitationsViewset(BaseViewSet): """Endpoint for creating, listing and deleting workspaces""" @@ -265,9 +268,6 @@ def get_queryset(self): @invalidate_cache(path="/api/workspaces/", user=False) @invalidate_cache(path="/api/users/me/workspaces/") - @invalidate_cache( - path="/api/workspaces/:slug/members/", url_params=True, user=False - ) def create(self, request): invitations = request.data.get("invitations", []) workspace_invitations = WorkspaceMemberInvite.objects.filter( @@ -276,6 +276,12 @@ def create(self, request): # If the user is already a member of workspace and was deactivated then activate the user for invitation in workspace_invitations: + invalidate_cache_directly( + path=f"/api/workspaces/{invitation.workspace.slug}/members/", + user=False, + request=request, + multiple=True, + ) # Update the WorkspaceMember for this specific invitation WorkspaceMember.objects.filter( workspace_id=invitation.workspace_id, member=request.user diff --git a/apiserver/plane/app/views/workspace/member.py b/apiserver/plane/app/views/workspace/member.py index 5afe371442..6ea2b3f208 100644 --- a/apiserver/plane/app/views/workspace/member.py +++ b/apiserver/plane/app/views/workspace/member.py @@ -102,7 +102,10 @@ def list(self, request, slug): return Response(serializer.data, status=status.HTTP_200_OK) @invalidate_cache( - path="/api/workspaces/:slug/members/", url_params=True, user=False + path="/api/workspaces/:slug/members/", + url_params=True, + user=False, + multiple=True, ) def partial_update(self, request, slug, pk): workspace_member = WorkspaceMember.objects.get( @@ -147,9 +150,15 @@ def partial_update(self, request, slug, pk): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) @invalidate_cache( - path="/api/workspaces/:slug/members/", url_params=True, user=False + path="/api/workspaces/:slug/members/", + url_params=True, + user=False, + multiple=True, ) @invalidate_cache(path="/api/users/me/settings/") + @invalidate_cache( + path="/api/users/me/workspaces/", user=False, multiple=True + ) def destroy(self, request, slug, pk): # Check the user role who is deleting the user workspace_member = WorkspaceMember.objects.get( @@ -215,9 +224,15 @@ def destroy(self, request, slug, pk): return Response(status=status.HTTP_204_NO_CONTENT) @invalidate_cache( - path="/api/workspaces/:slug/members/", url_params=True, user=False + path="/api/workspaces/:slug/members/", + url_params=True, + user=False, + multiple=True, ) @invalidate_cache(path="/api/users/me/settings/") + @invalidate_cache( + path="api/users/me/workspaces/", user=False, multiple=True + ) def leave(self, request, slug): workspace_member = WorkspaceMember.objects.get( workspace__slug=slug, diff --git a/apiserver/plane/utils/cache.py b/apiserver/plane/utils/cache.py index aece1d644f..0710511296 100644 --- a/apiserver/plane/utils/cache.py +++ b/apiserver/plane/utils/cache.py @@ -33,12 +33,12 @@ def _wrapped_view(instance, request, *args, **kwargs): custom_path = path if path is not None else request.get_full_path() key = generate_cache_key(custom_path, auth_header) cached_result = cache.get(key) + if cached_result is not None: return Response( cached_result["data"], status=cached_result["status"] ) response = view_func(instance, request, *args, **kwargs) - if response.status_code == 200 and not settings.DEBUG: cache.set( key, @@ -53,34 +53,42 @@ def _wrapped_view(instance, request, *args, **kwargs): return decorator -def invalidate_cache(path=None, url_params=False, user=True): - """invalidate cache per user""" +def invalidate_cache_directly( + path=None, url_params=False, user=True, request=None, multiple=False +): + if url_params and path: + path_with_values = path + # Assuming `kwargs` could be passed directly if needed, otherwise, skip this part + for key, value in request.resolver_match.kwargs.items(): + path_with_values = path_with_values.replace(f":{key}", str(value)) + custom_path = path_with_values + else: + custom_path = path if path is not None else request.get_full_path() + auth_header = ( + None + if request.user.is_anonymous + else str(request.user.id) if user else None + ) + key = generate_cache_key(custom_path, auth_header) + + if multiple: + cache.delete_many(keys=cache.keys(f"*{key}*")) + else: + cache.delete(key) + +def invalidate_cache(path=None, url_params=False, user=True, multiple=False): def decorator(view_func): @wraps(view_func) def _wrapped_view(instance, request, *args, **kwargs): - # Invalidate cache before executing the view function - if url_params: - path_with_values = path - for key, value in kwargs.items(): - path_with_values = path_with_values.replace( - f":{key}", str(value) - ) - - custom_path = path_with_values - else: - custom_path = ( - path if path is not None else request.get_full_path() - ) - - auth_header = ( - None - if request.user.is_anonymous - else str(request.user.id) if user else None + # invalidate the cache + invalidate_cache_directly( + path=path, + url_params=url_params, + user=user, + request=request, + multiple=multiple, ) - key = generate_cache_key(custom_path, auth_header) - cache.delete(key) - # Execute the view function return view_func(instance, request, *args, **kwargs) return _wrapped_view From e86397b64930882eaf792a43c48da331c0ca40cf Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Tue, 9 Apr 2024 13:37:18 +0530 Subject: [PATCH 034/105] [WEB-917] style: update urgent priority icon design. (#4146) --- packages/ui/src/icons/priority-icon.tsx | 7 ++++--- web/components/dropdowns/priority.tsx | 12 ++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/ui/src/icons/priority-icon.tsx b/packages/ui/src/icons/priority-icon.tsx index 0b98b3e6b6..031b769f18 100644 --- a/packages/ui/src/icons/priority-icon.tsx +++ b/packages/ui/src/icons/priority-icon.tsx @@ -16,7 +16,7 @@ export const PriorityIcon: React.FC = (props) => { const { priority, className = "", containerClassName = "", size = 14, withContainer = false } = props; const priorityClasses = { - urgent: "bg-red-500 text-red-500 border-red-500", + urgent: "bg-red-600 text-red-500 border-red-600", high: "bg-orange-500/20 text-orange-500 border-orange-500", medium: "bg-yellow-500/20 text-yellow-500 border-yellow-500", low: "bg-custom-primary-100/20 text-custom-primary-100 border-custom-primary-100", @@ -40,7 +40,7 @@ export const PriorityIcon: React.FC = (props) => { {withContainer ? (
= (props) => { { // compact the icons if text is hidden "px-0.5": hideText, // highlight the whole button if text is hidden and priority is urgent - "bg-red-500 border-red-500": priority === "urgent" && hideText && highlightUrgent, + "bg-red-600 border-red-600": priority === "urgent" && hideText && highlightUrgent, }, className )} @@ -88,7 +88,7 @@ const BorderButton = (props: ButtonProps) => {
{ // compact the icons if text is hidden "px-0.5": hideText, // highlight the whole button if text is hidden and priority is urgent - "bg-red-500 border-red-500": priority === "urgent" && hideText && highlightUrgent, + "bg-red-600 border-red-600": priority === "urgent" && hideText && highlightUrgent, }, className )} @@ -164,7 +164,7 @@ const BackgroundButton = (props: ButtonProps) => {
{ // compact the icons if text is hidden "px-0.5": hideText, // highlight the whole button if text is hidden and priority is urgent - "bg-red-500 border-red-500": priority === "urgent" && hideText && highlightUrgent, + "bg-red-600 border-red-600": priority === "urgent" && hideText && highlightUrgent, "bg-custom-background-80": isActive, }, className @@ -242,7 +242,7 @@ const TransparentButton = (props: ButtonProps) => {
Date: Tue, 9 Apr 2024 13:38:07 +0530 Subject: [PATCH 035/105] [WEB-904] chore: feature validation empty state (#4145) * chore: disable feature empty state added * chore: disable feature empty state updated --- web/constants/empty-state.ts | 52 ++++++++++++++++++ .../projects/[projectId]/cycles/index.tsx | 15 ++++- .../projects/[projectId]/modules/index.tsx | 19 ++++++- .../projects/[projectId]/pages/index.tsx | 15 ++++- .../projects/[projectId]/views/index.tsx | 20 ++++++- .../disabled-feature/cycles-dark.webp | Bin 0 -> 71882 bytes .../disabled-feature/cycles-light.webp | Bin 0 -> 74068 bytes .../disabled-feature/modules-dark.webp | Bin 0 -> 64292 bytes .../disabled-feature/modules-light.webp | Bin 0 -> 67546 bytes .../disabled-feature/pages-dark.webp | Bin 0 -> 83862 bytes .../disabled-feature/pages-light.webp | Bin 0 -> 74942 bytes .../disabled-feature/views-dark.webp | Bin 0 -> 53812 bytes .../disabled-feature/views-light.webp | Bin 0 -> 53994 bytes 13 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 web/public/empty-state/disabled-feature/cycles-dark.webp create mode 100644 web/public/empty-state/disabled-feature/cycles-light.webp create mode 100644 web/public/empty-state/disabled-feature/modules-dark.webp create mode 100644 web/public/empty-state/disabled-feature/modules-light.webp create mode 100644 web/public/empty-state/disabled-feature/pages-dark.webp create mode 100644 web/public/empty-state/disabled-feature/pages-light.webp create mode 100644 web/public/empty-state/disabled-feature/views-dark.webp create mode 100644 web/public/empty-state/disabled-feature/views-light.webp diff --git a/web/constants/empty-state.ts b/web/constants/empty-state.ts index 808b5470dc..20589db002 100644 --- a/web/constants/empty-state.ts +++ b/web/constants/empty-state.ts @@ -92,6 +92,10 @@ export enum EmptyStateType { ACTIVE_CYCLE_LABEL_EMPTY_STATE = "active-cycle-label-empty-state", DISABLED_PROJECT_INBOX = "disabled-project-inbox", + DISABLED_PROJECT_CYCLE = "disabled-project-cycle", + DISABLED_PROJECT_MODULE = "disabled-project-module", + DISABLED_PROJECT_VIEW = "disabled-project-view", + DISABLED_PROJECT_PAGE = "disabled-project-page", INBOX_SIDEBAR_OPEN_TAB = "inbox-sidebar-open-tab", INBOX_SIDEBAR_CLOSED_TAB = "inbox-sidebar-closed-tab", @@ -634,6 +638,54 @@ const emptyStateDetails = { text: "Manage features", }, }, + [EmptyStateType.DISABLED_PROJECT_CYCLE]: { + key: EmptyStateType.DISABLED_PROJECT_CYCLE, + title: "Cycles is not enabled for this project.", + description: + "Break work down by timeboxed chunks, work backwards from your project deadline to set dates, and make tangible progress as a team. Enable the cycles feature for your project to start using them.", + accessType: "project", + access: EUserProjectRoles.ADMIN, + path: "/empty-state/disabled-feature/cycles", + primaryButton: { + text: "Manage features", + }, + }, + [EmptyStateType.DISABLED_PROJECT_MODULE]: { + key: EmptyStateType.DISABLED_PROJECT_MODULE, + title: "Modules are not enabled for the project.", + description: + "A group of issues that belong to a logical, hierarchical parent form a module. Think of them as a way to track work by project milestones. Enable modules from project settings.", + accessType: "project", + access: EUserProjectRoles.ADMIN, + path: "/empty-state/disabled-feature/modules", + primaryButton: { + text: "Manage features", + }, + }, + [EmptyStateType.DISABLED_PROJECT_PAGE]: { + key: EmptyStateType.DISABLED_PROJECT_PAGE, + title: "Pages are not enabled for the project.", + description: + "Pages are thought spotting space in Plane. Take down meeting notes, format them easily, embed issues, lay them out using a library of components, and keep them all in your project’s context. Enable the pages feature to start creating them in your project.", + accessType: "project", + access: EUserProjectRoles.ADMIN, + path: "/empty-state/disabled-feature/pages", + primaryButton: { + text: "Manage features", + }, + }, + [EmptyStateType.DISABLED_PROJECT_VIEW]: { + key: EmptyStateType.DISABLED_PROJECT_VIEW, + title: "Views is not enabled for this project.", + description: + "Views are a set of saved filters that you use frequently or want easy access to. All your colleagues in a project can see everyone’s views and choose whichever suits their needs best. Enable views in the project settings to start using them.", + accessType: "project", + access: EUserProjectRoles.ADMIN, + path: "/empty-state/disabled-feature/views", + primaryButton: { + text: "Manage features", + }, + }, [EmptyStateType.INBOX_SIDEBAR_OPEN_TAB]: { key: EmptyStateType.INBOX_SIDEBAR_OPEN_TAB, title: "No open issues", diff --git a/web/pages/[workspaceSlug]/projects/[projectId]/cycles/index.tsx b/web/pages/[workspaceSlug]/projects/[projectId]/cycles/index.tsx index 5fd59d871a..fdf3cb6d76 100644 --- a/web/pages/[workspaceSlug]/projects/[projectId]/cycles/index.tsx +++ b/web/pages/[workspaceSlug]/projects/[projectId]/cycles/index.tsx @@ -35,7 +35,7 @@ const ProjectCyclesPage: NextPageWithLayout = observer(() => { // store hooks const { setTrackElement } = useEventTracker(); const { currentProjectCycleIds, loader } = useCycle(); - const { getProjectById } = useProject(); + const { getProjectById, currentProjectDetails } = useProject(); // router const router = useRouter(); const { workspaceSlug, projectId, peekCycle } = router.query; @@ -60,7 +60,18 @@ const ProjectCyclesPage: NextPageWithLayout = observer(() => { updateFilters(projectId.toString(), { [key]: newValues }); }; - if (!workspaceSlug || !projectId) return null; + if (!workspaceSlug || !projectId) return <>; + + // No access to cycle + if (currentProjectDetails?.cycle_view === false) + return ( +
+ +
+ ); if (loader) return ( diff --git a/web/pages/[workspaceSlug]/projects/[projectId]/modules/index.tsx b/web/pages/[workspaceSlug]/projects/[projectId]/modules/index.tsx index 8f626bfdf3..22973347f6 100644 --- a/web/pages/[workspaceSlug]/projects/[projectId]/modules/index.tsx +++ b/web/pages/[workspaceSlug]/projects/[projectId]/modules/index.tsx @@ -5,11 +5,13 @@ import { TModuleFilters } from "@plane/types"; // layouts // components import { PageHead } from "@/components/core"; +import { EmptyState } from "@/components/empty-state"; import { ModulesListHeader } from "@/components/headers"; import { ModuleAppliedFiltersList, ModulesListView } from "@/components/modules"; // types // hooks import ModulesListMobileHeader from "@/components/modules/moduels-list-mobile-header"; +import { EmptyStateType } from "@/constants/empty-state"; import { calculateTotalFilters } from "@/helpers/filter.helper"; import { useModuleFilter, useProject } from "@/hooks/store"; import { AppLayout } from "@/layouts/app-layout"; @@ -17,9 +19,9 @@ import { NextPageWithLayout } from "@/lib/types"; const ProjectModulesPage: NextPageWithLayout = observer(() => { const router = useRouter(); - const { projectId } = router.query; + const { workspaceSlug, projectId } = router.query; // store - const { getProjectById } = useProject(); + const { getProjectById, currentProjectDetails } = useProject(); const { currentProjectFilters, clearAllFilters, updateFilters } = useModuleFilter(); // derived values const project = projectId ? getProjectById(projectId.toString()) : undefined; @@ -38,6 +40,19 @@ const ProjectModulesPage: NextPageWithLayout = observer(() => { [currentProjectFilters, projectId, updateFilters] ); + if (!workspaceSlug || !projectId) return <>; + + // No access to + if (currentProjectDetails?.module_view === false) + return ( +
+ +
+ ); + return ( <> diff --git a/web/pages/[workspaceSlug]/projects/[projectId]/pages/index.tsx b/web/pages/[workspaceSlug]/projects/[projectId]/pages/index.tsx index 1912565a79..e7e7a3e2bd 100644 --- a/web/pages/[workspaceSlug]/projects/[projectId]/pages/index.tsx +++ b/web/pages/[workspaceSlug]/projects/[projectId]/pages/index.tsx @@ -56,7 +56,7 @@ const ProjectPagesPage: NextPageWithLayout = observer(() => { commandPalette: { toggleCreatePageModal }, } = useApplication(); const { setTrackElement } = useEventTracker(); - const { getProjectById } = useProject(); + const { getProjectById, currentProjectDetails } = useProject(); const { fetchProjectPages, fetchArchivedProjectPages, loader, archivedPageLoader, projectPageIds, archivedPageIds } = useProjectPages(); // hooks @@ -75,6 +75,19 @@ const ProjectPagesPage: NextPageWithLayout = observer(() => { workspaceSlug && projectId ? () => fetchArchivedProjectPages(workspaceSlug.toString(), projectId.toString()) : null ); + if (!workspaceSlug || !projectId) return <>; + + // No access to + if (currentProjectDetails?.page_view === false) + return ( +
+ +
+ ); + const currentTabValue = (tab: string | null) => { switch (tab) { case "Recent": diff --git a/web/pages/[workspaceSlug]/projects/[projectId]/views/index.tsx b/web/pages/[workspaceSlug]/projects/[projectId]/views/index.tsx index 59c7aa2153..dbdc0f192e 100644 --- a/web/pages/[workspaceSlug]/projects/[projectId]/views/index.tsx +++ b/web/pages/[workspaceSlug]/projects/[projectId]/views/index.tsx @@ -3,8 +3,11 @@ import { observer } from "mobx-react"; import { useRouter } from "next/router"; // components import { PageHead } from "@/components/core"; +import { EmptyState } from "@/components/empty-state"; import { ProjectViewsHeader } from "@/components/headers"; import { ProjectViewsList } from "@/components/views"; +// constants +import { EmptyStateType } from "@/constants/empty-state"; // hooks import { useProject } from "@/hooks/store"; // layouts @@ -15,13 +18,26 @@ import { NextPageWithLayout } from "@/lib/types"; const ProjectViewsPage: NextPageWithLayout = observer(() => { // router const router = useRouter(); - const { projectId } = router.query; + const { workspaceSlug, projectId } = router.query; // store - const { getProjectById } = useProject(); + const { getProjectById, currentProjectDetails } = useProject(); // derived values const project = projectId ? getProjectById(projectId.toString()) : undefined; const pageTitle = project?.name ? `${project?.name} - Views` : undefined; + if (!workspaceSlug || !projectId) return <>; + + // No access to + if (currentProjectDetails?.issue_views_view === false) + return ( +
+ +
+ ); + return ( <> diff --git a/web/public/empty-state/disabled-feature/cycles-dark.webp b/web/public/empty-state/disabled-feature/cycles-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..5b2234984da76842eaa4b1693e80665490659c5f GIT binary patch literal 71882 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Ñ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 L0000000000*Vb)| literal 0 HcmV?d00001 diff --git a/web/public/empty-state/disabled-feature/modules-dark.webp b/web/public/empty-state/disabled-feature/modules-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..8e198ed3340052ec505311597980a102efa7a5a4 GIT binary patch literal 64292 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

68#rj)!&c@R_?zj!w>px2)8CSsYx>N7E7t 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 z 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 literal 0 HcmV?d00001 diff --git a/web/public/empty-state/disabled-feature/pages-dark.webp b/web/public/empty-state/disabled-feature/pages-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..19263a0cb322c2ec3ebc4411cb4cc9b75f726bcf GIT binary patch literal 83862 zcmeFYWprIhwlpY~#mp8nvn*z2W{V|@nVFfvVrHH~r1O zndRlHT<2Wfn|X5Yh}f}H@?yfmks^QqDnk6S%CfAgkN^Mx@bCYHApt5t0Qe+jMdxq< z004=;TM&_7^1hnTV!smT0pZmPKIg&!8|=orrB142mHVk{_cNZm4n?(*XkAJmU!sj$Rgy zB@%n2v;b8!++O7&U?DK*s>l2UjQ~{DbX00sT7P-;t=?j#UTJBl&Jh_;mtBWVl~oNf z+8g*QkTru10BiwpfnUX{t$2Q9-`XP~0TExdQo~GL`1+ymsHr_)WZIqDM5x75eR^8m ztg^TN5gsc5X%+w!D<0w|5o~8yf;IN==Q<-?eG4tG+}Pk~kU_^~7Hw7TRqfy@KRgEH zZ_Db{<+$2oFRHlZFBdPK7B_Vs$Nl0qTxS{=(=V#D<&z;iPgQ!FPa4XJPgSOxxM-_9 zkq%p~nz1j4ws$sV*mEnmC#qcK_c}}M?qyt@CeGKO+d@lKzM4y87l_rC-?$Q^>l%)# z0yXFEgbY^N(PD1ys)Eb*+JnoKwqIGbUK8J5pUygdzP$Z-yIk{nd%64h;`N~Y$Mudk z+P5EnT>tIn|Nrv)Q~LkfgLsdMwHLHM7XP;6<#DI|j4P=W?D-YzV^*A9inmd@f2N$$ zA)Vt}fD0!!EaXj|KZQ#dfi-27!HBGiGY7=Is3L>EUhY1K=qAf6Q(B9-oyy(vXE^^K zGN#YYjS&_(XL9qGl;nVTMnd>01WhHOFreC@0U1CP1gvGYUnav5ys3jw0#OySrQJbU z`uAYJ?aoC!r{mFoEIE^h2NOb}kst;hG@g(*7Ix`jz>RB!CfTQ>ZcgU`yx|<#lcs_= zOYO^w=8^2O&N9Ytjot1l?|xxVk>+NU$P+dJH*Dg-lR$RmD8ix8zHaj|B?!l*eg(ER{OkhgE@o z=#L*zJUE9(Xi7kXx(tqcBRuW$DL$fJ<&pxXNb|1G7CtSTyu5KnseBa&B10D#C92La zpd(FT1w!(bjAjNQ|M1)!K$R*&Plhsv!G<7t-?T*We3%X8YjFk`1Dcv7A1uUH#E<$3 zfK!(Q^|D`-lo~U5--EQO&l22si9F@ju3<)h7M}y|m8d+lCIuvvxILXNVDp76JMH_V z9;G#hkYsP5h;6)@J3DJYtzr=1n5 zZ!FW7_1j#hG&t(G79)ivbzB7*n8od(oL{LGHKwavf?%ee*CpsDF+B9859RJF(`q@i zV5O#NW-SGxEc=1SiJ1j)XDp-YZEhH)j+BIOmSFwz?f25{*}@A}LtCYuAe(5zagP-& zyd-y!yD2Yea4{J~Gu<*=%_U5E*Jo<>rcvES(C#xY_FJ4i+_qyLbPW|@xR+jzICx9) zuw&uEaxHdA*IqJV7%pd+Z`vI%&u{fblx}!iv8GKiJ2PHoOVSB%*~O8r>}OALB1=En zfh&3NTg{G=_hBa#xL<&ljN(N5k@DX}80?QMQNtu}-ArJ(!6^LLfNA|&@V(~??y0RS z`ZcekmnMI$Xt#?@j%mo9WH@s*(oG-Ro0Zlmo)+7n#wB6?&=AJ6ha>z!FPTk7+Ep36y>)=DGJan0MRn?H@{GK6iRGSHT&pq|`LEGVKT zl-!ydJ`ZPty`$FM+P5D^O--1=IiWmV27q?B<}3E5KdZcb$xNscVt)xb1e#mY?o?m*AOK5n(9Y8<$tj=4dqwOP-G%sl9i^ zCVsqeCzm>@yx)Ww`NM@OFMB&8ldi5W{Q|YXIPNS^9?dN_@~XULgDQ6gS_`*D!OjX} z0;(ytWN(G|j3OM1mrot6RY%_L0C-s@LZ0}J27)z(yBxF;?S+?O0r-NZF^r67zso7n zTzF=>1@(LaKvSIKhL=;k1+8;1ZZDimw2v^Ob@pl+&AD8HE?52bn~03U3pHtm=kN+M zHInOFe$1q6h?B+vz`};u1iqK`5m`S@@FzXr+CUFy%3??P<-x5U6ADkdcDCjt#Pr+< zF0+CHJ9d*#aNlKwxLT#;ul%hqkVTes*@QzrnVePXs|#=(`qqY<9$QS82t2ThCeWg^ z85KLa?xZ#7f_e>SV3}XMN*Si$zGdMrLe52zX>ei1DTw8I^~t-o{*imeF$=hTY=b|<7|uE8E=!wdd9!;W zAe$nHH_5O5sD`buWu<^Fm%=LNZUZgKGaNB_O#Vsqlgl)ShM3YdzjS3C(+yU6Oy+XW zB4~Ad;UXi`wH_XGBY1;uNi`Z-NkF@`D9W98E4@`elZ}sL4V?WO`|=K4cNd3vPV9n{u`LsyJ^%9+`YOuY#1AI^9_W$9n>f?E z2N%o0wh|VrCWPGz`nw@aC(o%38m0qWk8k&d&l(Z12hpuXg4jW;*#t9o{7prNj!t3# zGxu|wtL|K455Aj+#U?41t7&at0*>h%y1_T7qpe^VXJ&QfWoTt8Ag#e`wEIn{++@Qj z3O^$yAX!<+S7r>9N7(|gyFH-|Opf1*)J@^I1e+boWwZ*Y$?I>9PCqQ$$$fs(S3UKy zAO$7Ab9VZ2090GY=2+-}!#inwVE{ghQ_C6{oU(MX8|!LFG!j&?iZJ(hk8KUaoY*?I z=d6A<*qSQtfMFHoM>KN^fa7EwW|HV;y+j2=ZkS;qy@u8=sbJ>^XGyDpu8NBkWaUMr z!C^3^s1Mhh>KY#F3h!A}%bhZLU3POc;kU$yF9vhXcXDftrNT2+s}&Pe-=jm$wJMj` zV|)nHCg%3EmD)N+;dk4wD2>l~`4tWZBX5jL11iyXr>^MxKY$H}mM2it^&Sy11YQT#k|w@XeJhmd1)k5zMW zDM^Jjj(66YZOI%(he)n9j?(0(MNB(kw6YGj-XA#;O00+ktX3^e20m6qjn12;sWZIC zmx(E-`|SozVbBDuf#FM8H1$;$i(Fl=8_9Rfg^b1{cP77O|H|?hYDwrF|3?kv4KCxk+6AU?O_wS)1;?)^|19Y@=G`Ys{q8JPmpagz(c(=4cJ!hS}h8D`!ippY{?QiHjb$Uf749NVJ^`M@XCMJ<>8) zah#<92g!oIm^G}umm^a03sG)nOS}!+F>{3Xuw)DBW|@A^y?Og~14XZU#<&|Kt=kGd zjWzl4d+q5nt6=vPszYrVTkbh44XAT_bZ=oS32rXkVwNL^m+0H|oELcnq2{=WEJNux zBdz5?C6lKt-AA!!^?MUUnYB@HEX{kxLtJ;(?Bg0g=58ObtTebg8|J6Tf4sQQPKNAN zYSlenH1vGDU79^SdVGDE7f}QgZE^axz93Gtkg45Z_GDF2cS*BGdn;k$EG?UIjtG%z z^ICT+sx{YKzOz=pyR!Zj2&}!cuSP^?kFDQwZTl+{{I<u{EvRjUdEo;;Xb@g^{n21}7KZe=FIcDg zjtL`ZZ6?I_$~^pOj_izk*yIw9H4l9U(k!C9I!;U4ZMSHuO+_D4xK04_fuP8jGuQLbXp0@uuA9%*&Om}0+nV63|4^MeB{qpbc{tpcrGU$hM5$b8`A_ zJqA1I@r_#HxbtdqbQGyKfOa`_PJsq!zXM+=Wup(Msl+d6w%82n^2zh~RLzmGr+srITE6!y&K+Pa%h_I*bNyj?@vp8`o?w&6hze1&r!xj?siT`4MFm`Ug ztVaU1uPrxL3cV#uC;%7K4FbE?Mb_eRFgzm`qB0x<+mwZkZHC{;iYum)`mi4a8YnV> ztz?iE74^yatG9Bb8g>NUq~iX9lsy~`V^UD{qUc2{G3PPqPQ+QKSHo$MMQhcRaM5nm zOFkW0SqOOD0H8U6?TR_a~gl%Wd6JOWt2&IJg_X?8~@iudF zn!4oGQa2o>IZlppP=gi4(*bc(qb0~GKMc2m;a+m(DI?05IlF!>91?7}OeIGOe9y1E zV&cKmG-ODgizQ?;X&@}C!<4(gIkq)XocIgkNfq>^=l!biDhI`56ONDu*T8J_+r_Qo2)E!BKAl5cjwjGTU&oT4;=#gH~`(0hZWv z2?`zEWycpV|59O0g7tkSzf*pxv>4t1l1c#`yHagQcLhAQl(}rXR({pPDN=RF(0YhL zL=4bfm2kWUx-_Rc$C@h{m@#5fcsI!F!j?7sfG?5kmS7m9Sq_^ajpHJ{spJR(Ls`U) zZzHmrli1p1eOob2{8qt~ORZis&ZB{g_M&(T&85Q6kf)$3kMnB!>x2!-ab)#QjaAoy z2qcQ1>fXSQi*<%;lQ*C={h0X%Ut`dNlDM~+3Ebq4+`ts8bdkdKby86Y9}-X5;XaYu zB|8E*s#eT;9BS~BV$)bt&N(TOp{eE!X!B{Y28H-~Tc$F;-G?PRcb((5S)pVw4AhcO zBJ%V7>zOpv32oU_v6Vx)K{)uaL$4DZ$lsf-^kKOgPBoER_=M&kowIlalc_(}hEtm2 zjmI7zkH_jQ9NIV9$OVFR=2+(rCJOchJ14}$WSvzJZubTNyg9`S@si8q2=#X$2ll4R z3e7KveBrTJ%to5f0~@(oQFIytf0j9zxba(-le#w31WE$dctPjd3+l#;WSwM9=taWe z<69Ge3=sy*%iu zUHlpOax2G{XQ8FmoLP8^1z}x^tJ9Ci5)}XuB1UBy-*xV4QOPG#UmD+ZOdYpd0Z6o> zH_G+2P}nZE)!%L4%hc;PSnLHo9LS!X(bls|RJ0{EOB}DQY`RAvJj_S=aYXT+=5%xF z4im!jypO83@W!om)$oyRYdvt{pYE7ujF6+GGORde%kC(>wSmgX!VHQHw%_g&yR*g{ z2r51-S>nUQMMZRb@UUj4366HcZNDQgzPl!Z5m2GjnBU_^oR5?H>7LA1$85k(?QohO z*Q@4f9O(JD>9pBtiu*Hy#{J=o9z-W>&v60pY>mjz4?pdk0PEX3AAHnK=BnaaZ!MK2 zZpuCmk*JclVI!*fX7=R+D8kc660+M@iFGx~Cxz6JQ#mz}wN6&XO!v&@Jx^OFO8!YX zKB$4NN_EY~<3}XgmbkAgEL_!dul+%KkQAo}B3ws-)%-<#ldwW-E%D}XwpM47%MYJo z62ZP}@k(vaXu<4fOP8pasXuO?i{TCt&q(cK+)G5Ce4a&(KL1_^TQOpSBTju~>*1#% zeQBR)GYoJemC}Mkz!UiVG{{eB&cd_hedCFD>OKhgJ@;%>O^acyv_6!VG@?7NW1>Cm zcE+?r8xZ8dX-0o+3O)d&X~9mJP@3i|LrTd6x{29oNF&FzOjV01=a_q>9?$K0;)=}L z4mEN1V2p4(PM~a8>TGc?Y_7~cOtZYm&H7=;D`3kDj%#+u7Rhx(pvDlVh7@!W!Fq7> z)dH=|=u*ZM?YTE*i9o?#x&%neW2IkY)(oyaKf9X!3E|329{Xcw-mFOEX%=Ht0U0pB3*qhkOZ96#ZCB1jTMVX6 z8PNV|e9hm-gHwP3k3dB%!-c(i?}l1!be$xg_iKs0%TCeP3mp3Vbtw0JO&kY*ViR_kdF5zI(uiHwm0D8mc;@hr_US7nH zs2FY69zgh+9DwuKUP0$9hWKiz_3=bw0bJVI`9mY^;+E<9oZr)6d=xeRIyvCX*|`B0 zJ^xaQImKD+#VnlB75G|aPiR(~*cuQ)HqsujLxbX;B?c8#o?_m39gaXPUwy&R=Vb5$ z_ZN+1rZVjbb?op|Wub%MfyS(|bz?)+M}&-w)gkAK2)IqD;pwysPgx||kt0I{#A>x4 z?$;Y_d&Sfu#cGCi`kzMrX_E9wNF8YN96p9+}kox#rl zA_Ir*B_PxxrM|~QND6(g9SV99#k({|SvajLLwmG{+K<6J09@+wDw@E(YszkxDl`Li zEc7VpFkrO8;!$mR3U95$0D;-ZOHel4yDAf$Ulq4bY>S$fs|%sHK%HF z!TE0YY!KXPEB&w=)S;#U3^^WCW00`XPYL?U>;8R9?Jh2H-5dc}1vC$#Ji{I(=k~3X zKs$9D8`*wG!|wLV4b!T;?;KHgEgg6hZC4}-=>}nPO{PE>klA4&PL0|j&E7Vcd5LBX za-H4(t-i1dKJ3o>oORftwYN5J=Ce!y^jo-K7HqG%nC$l2lC+X5SS$qN{%N^o>hzT5 z{RtFT#levsyr~D$V%Hus?&obTre#_EZ#$&MvX4|RMW^3;J$UxU3bkDu2xx``-6`&e zRz=_Kh;rZCE{l>MY96D2T*8`O&)8SWlw$4dQuF$MjsY@)oxCdm0XP>ZyoO z4sjOedB9y3F*m=I=?{to1sblR9=ka5>UoBI*l9!r;O%YrQM((%Y`~y&NwPS6kf=hU5c$2_ z*}tCTWx2!Mwed%;K%Ib-97h(LPZTAudUWR+za5vF+|<;xk#L=d z2dX8DziybpDyI+{JcFkf%-uCRS9GR|PSujA0e(5$*-D@G!vLXQUSAc8ih;~NL@GO8 zXt`$6{`g6g`bkGqr256%=yCbv1<|RdvEUZC5PQG#Y2VZ8`}3@WgatV#rn=v35h!GQ zgtpWK4x4{P0}Y&V02R6agWMFLW(X6zt(|CGt%}Pg9^CyNTN9ZRA7h!A4k!YkyReD!C_bz)+@%A8Es;IVky1L$ui3VdK$3L?cOoO%15wy*Ip2bdVth15~u#lH$?C zS#ufF9LH^t6t|&Y5O7e$1jQiPClTsk3ho$=I9(_R4S+$ufF(7FZkD79M!>ztWv{m@ zPp+LGq?byh8D9$57|vMd&ygG5hP7bkl{<*w}8I^ft}SvCGCfeaDj$xk;zLazD-Vs(YJ5m8dVw(@*5V0->FS zy2k}&8~Q>{)|AyO$E#bb9#5!6rcQDQzqsTPqsx!R@N%g{))D^_M??=#>_Y|^VJN@X zZ)a4=z(yYnUAG%Om#oI$6(XZF?LTe~q7z!o=zjY4dbIk&ZR@cQw;K&`4Y(L_n3I#g z6X~jz?^CT&eN66RPRY6t(gjT>16$AS;qpd`bAFh~TO4<2(+wHJ7Em2x-9=CmopnRr zxg(dlr2{YRXY?$)JHW1@TPaAK*WHB6QCzV49yG6|FW6`r{pGqGtP-LwfX}&|l~zSo z2~N}H7mYx!p-F*8Kh%8)IXK~LQ=DA2B%%; z-m8OK;yBe>&;oex_~S*B0s>Uxfu#ddh(K0?aK{K{Nap8~)Zp8*9_k=Mm{>lGt2u@@ z9FS;@?OlBp9x5|u^Hd>J?ihB-WLM5EMd0no=DEPh!qMS5d5n5pcte{8KLIa2%hEn= z&%#}N>vSD`TfRkly?LXZ2fpQ)^1HKIS9nr+pZSb3_rley?P>S%X0yI&jOv3Xs1m3fi5<9U5M@g#m5etp<{o9qaF3wc#| zsi^80cu)5DY^gw%Fx;?w~+UywhoN@Pkm3pptR=Ksh z(mwZUb1!=N^1^eCd;YXlr+v$F$20T<^mucvefzf3G5B`>rm&yb4H|Fn9a* zjJxeMhzjIJ zzt`XRfANP-C(#9VsZ%8B^NOx!YMkws@mPrzmOVI#DV{M5U=|aY_c$gn?|(G}oKZf! zpXMDW+|AB4!-fKQgIh;QB2>8alo@>BA>Dq?jQj6~Uj??&{ov~zPY1MD8%565cr!Gk z^`QBJ>A~=N-*5bPL*(i`W4u26{`3wg_({3~i2See|EKeeyQT2{vig`oG@n-(!R-An>>CAmitfDz0NGm|jd(FtzyahBg!k zMLzG5?L$ZvCye)h65+tSX7aJcym_QN;m$f#tALVg2POVYgmS>VS{4esUsccjn0@W; z`+IPq-RaN&`ybe`o~uk2ZYZ4JXu1k`^Z3}F^_%^7TYb?@;K9^L!g+N-Uzdjs{&g)@ zd`Q3L*$>VCyYvNmXts#3dI~M%33sQEfd8TOo}he03m7eD--T-wr3 zu{&5DU#fLqpG#U>vMTo<^P=E>VvNi_U%%lj<%Rl4C2Q6|xU*YpADDX9*i5d6!TBgUsv7p+Lr_2khAm_6RQb1=nVB+tueKT`F5}M>UApTNq|lESok}Zc4;z(7BCU z6Ep-7j*h~O3G1Mp3!Fc~5N)2&7;PK&y@Bnq5_mt+)-B2=%G}iBci%p;>rr|&tA^jb zg*OjeV!D#K@;yREaO-|6*8l8^v4VK2IsCUc7kmKipQpi12&5F>b;^xhw%K^w8HviE z>LghZ7xZE^Pg*s%GdV#zrCmn3|K|F08Kw&GM}G-e#z$`8$8o-3$6DAtUR~1K=gi*w ze{A~y$hQrd_Zy~&p&8qYedg~tzr(}x^NHQG$T)qr3jdq%#98mL`A5uB!u+p8_iUg9 zepS&cNHp-}ee#JS@=5RX0TNy8T1svD<-C&-kzuTH?|(^35Pr-} z8V1YnpJs(KrH=~Knf-g%{5MEn2f;*S{X`xG_zxHo>iMRYgE@OkuR{g8+?nww#p!JE z&m1v=4`_&c44KeKT74V-i9XbjHDB|EPeA@NUqSoIR=C}1CrStwoe>^wshjI{s(L;A z!kk_3W5l_0GwM%I0ikCA!Nkx(d|nSxGtmIg^U4VF zTxW}ME(1G%`C`snf0${I6XTx1aUd1bz?XS)P>BY&UYE{*(w}<7_wV^PkdHX;dVH)8 z)%TsJ>CU--BkE=VRVcvs$K_r5z7@()%aOpuR9y@KmJOh!mL(C(Ngm4*?EaqDO`K(i zsxtOzK;#iSwXr?6s9~a>bBpD?jsPJo8efA;hMu=1bT1 zS|3OlIb9D{ru{6|hM|$ZsKE|@#?yTnH4;x3bD$_wO1Y#?9cv(X)xJY7%B2p@#{(kM zj=H4Y&8#EwrzOI6iwQbrLer^P_YJVc8kGmrSgK1plke3 z^r6+D2^s$S8}dWOcK%$fY#HM(SOB4Q<}0_9W_xMB1Dyv9xl1eY$O0!aL1ra{R6D#;htuYyVlm z4G=^2{HhxDiopI|+796e{yBj^Gx5*2-*(CT4l099pGdZsGr(X3|0#BP5~28zQetx9 z{Z#}q#$)Y*?X!FWg&d*M!Y90ai#0P>(}HaXP94j7457s`EMvv(Ujk8j9$OX=*!H2+ zP=91&t<cyu#vvg|P#b12hrnD%%?L+m`jLA&}mA?mLo#lm|5I-EvKKuNGQ>&m26@KAlG`@2{TwFpkrqMfoOpz9?iL3YJ2 zvk;I>*pk}=M$e$Ujph;q-bo@J<`sBCP=l%`Lp1VmwodKU=(URM!sB*x{NW7IRdu`q zYlJtUfChqNhcWx0vus)UpE_XFdb~3gv*tHCtra{MyQS8N#qOL-EAx`l=Wa3_0Hpf)==8(9>iHJsfgW$dWNBKXI*L&h5$2sgqFT-t!WDg9uzp)At-lOX@(lz%szJ^sC#_`L}2 zll`SW>3rb6>N~k0DO&6l5?{Y24QxA^C-*YF_(qg)R4!IfY8dhC^8pXhw0do@2JWfq z*@WgKi#E;-Uj)$ekOl;bxtUC@gd0c)DN|2N&FLe$%?4I57#<&R!S)4mt1}-2aM<2` z8)wp|IfS%JOR0ar&u{YP-wnOgZ6try!ZBaP-jVYURU4$9oNevU*$2)yu)B&j2VU>^ zQ-J)&sQ+&Dzfo=#F<9=eHPjNb-~W)@Io9F7e(~Q&=g+H>7~g__Exjl1eu}H#zrWOT zuZr1@RVfV2Wv%ZFy*##VXE}spTZL_fcr2-Ap4Ac6Sp|L>Yp^>q;0?q>q*B*H1&SdH z$k4^;EUpnxzuE!5>O^gi!OHI|z?^L(%oISD^;?>J_Q!ljf?>a^cJZ_I!YchRWqK{ElqLNO*IL@r1swg84CeW*UQO@{&lT0-jau zV_v)L_Y}tcQ1dXLd{-l$EPjEg*A>B^jBzcIkZ=~oRZ zMHR?B`bq74ahS_Idc1Cn64-Xq4NTiU3-|1GR?X$Y&ZeDSXT)yQo+2k0hv^PWs$FSK z`uO>;hk7=N_dM4Efj+i{nexsL)Yb#~H|k-#-`MB6k`2D-z}~r~LxvP;y9`h+*le`B<)oq2`;#E5Jm}r+}J-$ix zq&3iroGEseOuaDUkrO>qUcu`DKUEdMz}>|NLgZR+=h;V{Ja zvu{7}#;h06!_-hMqB((JO`i*wdQ{6-D);IWVu2<1Th&TXNjWkwu4mHSm|DIW`Np!L ziGuYvuYVT!NPf+r6X<`WR-HFsN;}59IPfkQrhc7?o9r)Z{NqLqvd4ViFNpD%>P1@* zv}vtQ*FU^;%&vo1(nE6;o1j`cEtwf3!H$4>j&B$ zkk&-!ApcBza+=OcOrvZxsRd$!y3+DH~sB}qY2e+aVQ zoYM5>Ut#e7nHgD%fcqEhcA_Kw(;rQ;lM?26ijQ6nDK*tX=c~z){iZWperV1vk>q3a ziSFBJK*Lw2w(K22ex#VMzvz0%!-vKh)V1drCvfvT-=GpHB$ETIP)|4P+oOrlCE-hWJ}U zrJSx>gJ1P_?Oh3NdS!Hetj?aufBf8s`88{EZi?8DEvRaMX&}9twWq0R73W$L3mhyS8#xtKkfxq;;E0uo& z^?NZk_igs=S9$cCulvVN(AK}wMq4%V)17bh!$KJ><79U|O-FFT86;nBlz@a>dcczC z)8`LKO#(eJZ)FF3FMNW!EayV<@1jm~R+h20;^QqQBCJ~dac%B?@0ogjUNo(2#1Rqw zp^C97lPlVvO6Wr;T|giLp8eFvz;>O{atP%Vn+nA+DO6 zRZ1qzGpNQhk*C!NHF0!G0RL+42OtDec3}o>LrU+71AQu<(-BZE{OkjxZUI}6M&MLD zy_R0qtq@~6eN>5Gs!-kq`(d^4`CdFOT&wW2Ii=nE`}xzGyR^Y(S9A=Mqk@ zhV(bNg%xlSE*X;UqhjK{!zA%S4*FiqTU?yTj6?z*hNcEIYR2bspxvZ_ViXJck2Dy_I4i z#GW9q0(+odR%P3As$DixC#xFK+8Y)o>obmZJz;mnp1EUgO1;Z#hMp#`*{k)}YDqF` zKBRO{?fNB={o;l-Y;Zx43|@r1dA(-?Ub6LGWZc%u4)<@|N-H7tAGqaQRj8n8oB?rW z1Z5uMZ;oTXxzljp>#$hwDqr*pEl?ghW5ck@g81_tQ&+Il-(CcLk@xsy6DID~wqRdk zu0ntZ^l)#Z)^?QOcmq*m{UI2^cE?>k*;mxPl_O=)bCq9;Vx*F*i1=%-9|0z9)=t3` zU|4yUgL~KH2Zp>NcZTZv5Cv7j>QgdY5}CkTpZXqdH7j%Ic5qC{^-nqW7d(s1pH_fp z0#i!cMj;z)%;o>u1Su1I=O0hamf2F!;$8M)xeYKgke%Z=>!Y6n%?D^ns$gEmoYLSr zqr2z!=f4JxpTLOc>%Qd)-XLSCyaNY|MsJ0gtWvzO{N*_~5$FNX4^AUA^T-Op(yJOc zScZ|uuyVz-Q^3aoDb)GHtKkQ|B?5h6HUHp2{7QIt`i>>fqJbZkWOy>XAFnqYNbvN4 z{A=8y?}Na|1$1Y{&JTaJY%YI~DDK~prLi>h_h z#nj&v1DLg1tg1Y8x*cyF&2h71&UQBf^3c7K#cvkPy!;s?B|41_XDx248B>2 zJnULc4akEQ>?aK1k6+vohh=R#tW6I^jC51<@tBM-tGXNw15@nvSb!8&o)L-Gll0U_ zUWtbxez86OI;@9ud3SYF zYM!B0a8%L8&R1>m8$?L`#@M~=$d`@mOSWauDcK` z4~dMOWB^^tQos{0?%hOKW(EJk!9Po>(ki$!3~`S_+znxCL#%|d#|R&LAEJlZ7RhHK zM*6j{)h4?8b20ha2E!G?!c;)Q9QW^b{I3G#ul>l-DukcaQN?!5Cz2ho+e^pwh(E2T zKgz8oz_k+9=Vnpb^aQSubLPZ9g}`57^*2Y$9Qm?-u!-4-U}3TAy)*Q`YYuaro^@R~ z10DY%0{>Z1{;FsG!KJ!ON&iwS{Y`xdaGzLhsaf!^q4J07`uQ86CS*TpVdF{6v|1`J zKo|?L;)_wJ_j!eGd`bDMJmN(;HC-x;3<%`b3zct+S7`SxITavmd<^3CaSW%VE3NUG zSTv?O^9ltK87&^P(&BXPLNMf?lKp)pnLohz5`uAiwx4vFgR+95;FWHWFmd%_eyjzT zTdZ9rT95&Zd6qXorDy#Wf&O8e{4NrTv<`eYGvf%;LN%p<&M?@>#j=N@0*_*^!dlWt zDt2y^)_rm|9&`~ZdK9Z%d_w^W+`N2fRn1_5yZ6hmnCeq6SP2+5tU1pR*i}ETG?Mp@ z70Rb2h+S<%rcIVAvXVj`XvxZ>>Wu^lNa`_mBx`Y6ep5DiLT=e50A!e;AS#>5)Q6EV zGdEAVqEi^v4N;40vb~%Ok*X<06i3m`PuQ42SR=z9x}AruBkvpRo01e_E-?-p zG3+#2z01|BG7-Ik1;Oo9e(JH11yV`cn4 zp)y?lKZ@}Tlk=)~jcaK{E4w9psAOSx<&i}P7@J2@xoFP_aup*M_=5W{VLAlnYfQ@s zk%bZS%csX_w@dbcg#Ti={3DrVbLje<31wgG5G>9A06e<&zqc|d-e55Ac3JPuodf)H zl~E(aiogdAJ3xkCKYK+tkxV3YVf)1(&xJ{v3-BnZiA+|}35GI^kiRYlaZO|n?%Q>` zj3uw$Ese}vxAz4H`D5qh6^9rS?~v|aC+{pa7KZsSzaUtM5r(K{1@~hwS~R5G_b>94 zAih{cT@ZWxm`U9H?0{d|QqTP+OU#|B{sH-{&!3VSL4SSbM@!eKAU=|J6umx3T9fVw zeka#plu<=pmn2upS4~l&X2g3jw=HL!!|6Mok-*k}e zDHV}DF$?OR9;*?!urFkHBvgeqf7FK`ef;tO>3!-A3woj-YLoj(BOueu$erH)0Gfe& z0O7cMJUEdLM03SfEo}oayJK`uBv-i+b6kIN5-czwi%FFg#R~%5kKkD{iK>^Bm%-KT{0G|GzQJu2UGiU| zvQIVmsVWRm<#omYIHwt3C!qPs(#xZPr+q1N&0_5RPrB}w?4C}VUT&9Pf4c$OyA=G{ z2<6LWR;+5+XN3GO5YL42xyr}4yF;g=S0550GI@Q4ZtY^nkBI5RM;%QWM_`^l$t5># zBD&!;@=@XCyHXoKy~7=gzj~*jxet-Uaxb%!O(bGWA%wOV6!n)c-}Gf$kW-g^ zL*wR@_bQv^3e47DnX|K8m>bjj(RdNQBc{{zW}tWa;(&;JIOJLrVO}9E^e@ z=Dt!nL2??ZUV^0bc6x61uSYXd);|e@yqJ`rb+PFIdwPunX@h`r&#SC=vwHZ)r!MP# zQ0ptUAEr9rvgckxC)oj7cNqS91ZCg3OJ_!ACp(a&TZNrkC{hpo$i(#i_dx1hp-`gn zhsv&jh}P!TJSa_FQ}xf+!KgHygO|_l^*EDYVe3Q)$qw?EZh%_Dx}tF4%`jRYYOw1q z@I!LB_DPO?PE10WqD8Spe`Yr-s+; zVGN{nH^F_IX82=Q1wp{FI00kr4yN^}*0R{L!ye#^qt+nhJyex9szWN^&zc2=zgX0; zsEeNW4uIQ%Pp*msTg*0Issbq^TLQ=;0xl@zyo>zn0s!m#!{YV((^NAUW4*u2f@KG11@KzGi&2_{yE=N}Y$mJdp@6t%2*v!oL z@0_CCWpR~+cJ)-sg6KVaK;*L}pEUJ^&~* z2p;hv{4H1W4Eo~NmN2{kW<@b&XPI7PH#-jXkFT^?9}bepbq9U#D;JiOJCN<`P=@|f`US_35v|9o}0h;2Jhz#>hb*G1()@Ni2CWBPCID6 zhWu8E{NJ6qW5b z;o3nLsp^Sx`lvX(7o89B2UpiBsB=Z!a8$jPh+hw4{Jv=I48nEvTLGA#hb;ceN`Eb9 zQfg;7&X1##{z1`zQu_?q^8l-H0_7>ql`26M3*3QSv7+bwsj^L z%zWWdP8`)5slh0^3~m#*E^q@+XN|T+w5aR<#h3eYc<&Dwg5gzahf-Q$x_XE+(9HRU zvLw{QI0bb*HUarj}Fv~yPL?|Qy}w7Fg?6^52bwvVi#h8mIX zvvs9+sgWyS6?zmbq+qD5eRX`qUmV0mtr7h(P|}L=$uR@iq!pt7w#%Q=lzthTE2nY{_p+{Ueis!;Q zT@F1=XjRidI_&MS&djE_I#*E$?^(yo;#N*w2?@@h(ws~WdXl%n?sGY8$Yr%JRc|{2 zpj_&uKk}vk%!M2^&RBWHt-uIsg?=HMR~I!Bmg_PSV0z{v#F?QI09Ae3v|r?%e7Ujq zCUte}{03jTpNu@G=Y?YDiGZj%gq2mle@d2l5Ol_plVG(6_j*2=WU=~Zs4X= z@A9*o5=9HLOB>Cj9O4OC@0{5i!_wx)4pw9&J)M&nkxXUu@YxU-P!|?2MjU$1^!YX* zD0paWLvt$RQOwYm%Gbv2Wir6Ve~n@2nJb(Wt-hOJ_ph@d4FoAndH_4t+j2p~NM@c; z(DN{g7Rv~(Hc;g!lz|9RZ#C!5QUI8mq#-sEg`l7YXPSJgAoN8bpXJl`K2W}r$!-4? z?tU$8e{b!j68PhxrQI8)l8cf;)*5XB8l#?E64_3aBy=BcSr(o%PmGa!WDqV(EXgHS zM;ob{LjO^l{IkDViKj_aiHan4e$UT!4#c}zKw{L)lyv~G=Q_>c43WB8i8jdHmtNr65W=!Vi|A&zX*e-KlkODtBGkGFR?(W!0|DUY{`RzHvL>#*;N-9?$WKC<6s}0g`_5IHjAoH8>e>0$=c~<`a zGz*BK|IGkl0&lpc7##Wj|2;}bY`|UvVdwv+0}C93BoziV&qDaeaMt$yxAf=Ms63{a z&;36gz@tmUw>W$LKNaQUzY)N?%^I&4uvwUVl`#y7n2@Pq-sdgR3+%xEzn9t%8d@;Fp+1b#MN#c#ML+M z#?05t`#elTgH@BeX(wgC1gJf9YZ;7;sFM(boq{1*R&l)lJOrKQRdeo#LKh+^`ZQ(NDws3&o4QIP|lPF-@A0H zFcPF7jn;f?xH9jwDg`*B0Y9bp>089B=F_md}hjYi|V>|7*9_fka;8XCMNB6KWV>we8qG-x$dILPX>d z-G~IyrZtmG-~A*qJkeq@ijIkR)_6~a8siY;m$4000aPQ}$<3Q?YBJEw=upgU$)Y<< zTf4PQRb2RL_@6jEXZnzO8%8c$8WnI4xFqI*i4tSi>!aV5tp$?0MM6kYTPkNB6AQ)knzInhSbI|QT5>mUl}MI zI9A2zJr<*dc`?q}R_otW4`J#_m8=^bmT~a}mNLb>n082MzkVv~I{rV+gWE=0%n{iFl&v;!c(0yq3UPK|tW{b&t-)g+<&Ep3qi{2;D(m zo>t%F-DAL;dytD7I+vjD-PSZVMD7jG%=n8ybH!@=*5AMqWuT8&im)!?Kd`hrwV3k( zDZc^<2U$ai`5=j1BJp*iia7@qK4`Jq9T|YzT71f|zo$Z{^*uJT`Bs(^yS;1c#){Mt zkDg(q;=uumqs?pk!%vI(2naTW0{s9+OjxK6V5DylD3hvwMpD0)b(Vcl?pc}Ec1sIJ z@CIh%Ed;Q6ZiNXBMVHz2nTF`zj!A6F;{aeSd^8lVSo>Q)ja833>D894z_Cjd8WG;t<~EoLXWs$JJ@V8#4v@7ZH- z4f{0cK8K^|Um-Tt_Lep;X3(mJ!Ff9C4!T^-I~lG$!WVBr)vQWDv_3=FY?i=Xv?O)Y zQpxy=yA2e7x{BegP^pSeMq6~mWJ$W>IKF-QgVh=--oPCj<9fD>`HYTk5UO4TakNGv z(3+EJlLYKl25^Tu07ldPP)5ry>%D1L#Oat?r+W0g$*WNYM^-fTKK=pD?*aFcTLFu_ zpDtvFqE7Ef7}v%V+Fwt{fRfgSC^diSCvm+iUK-gYLdt3x&kN9sQLMQ@SLkEK$V?M1 z6YE&Iut$#}^;HrOoGdUAOcm@8(xM^*uDq1id{Wnl%u7RHXGCphmSsS1N3Mh3D$mJL zt`KlA=31ComoEuSFBRocUm!U_lUE*KyX7nnWst>|TkEFRy3nLm`jO@lzvMml2&-yI z)+`HgN&Qaf?Mj|9<1oTJpsKy!ZLqT!3?)jo=jv^#%2!%^j<^iVIww=8-El>$QDj#8 z!M&a%z*!qO%!@_3tM}|`VD461>;3xTdp&<=vs4RgrEG7${miOPk0>&4AN2g_fWlt< z5RnMB#(nqX#K?9pmjNb1x08}^j!e_4g#Yz$E3Y3)hdr+d=AG#nH$eJK}Jl*X*X&{|SQ&q#U#eT&45dv6!(vb9j- zQfRH24!|J}q#Wk0A@Ra{>u0>5W4oEBRlL!1!wb(F(EJull4A6-XX(kj7qK79^nIqC z%%A0+ech!4T(*PANQ!qQ9kBowUfG^is4R@@%@=8jp)n=r4xmC&3_mwtAXwg*IX~`3 z`6w{-4IiF76j5Z5#m%$LaPY_s&dI$ZqG|(pY8gz1OS|qxC9uMG7=}Nnx!UX|jztokd)BOMGvl^4^DOCzoo%C8YW8sU(5TnI zk)W=avt3=>;u7nPTbFfQzj5{1(=K*kB-nYIEl?z9_p4QM8o4f<<8#ho6b|`mg7w1( zG|qJXT}cy+wZJTxrEg9L9oh$*S=^?<98PLE3)?M8FfvyR+@rGji&PVc_bagA?Js}E z2#sajJp2AL&^B-2rE&gJ=s?4fwxF` z{p?2Wq@AZzSZUx~N4h&4294Pd(?bV2mvbh0f*HN|a@y6vfrpR`^Dvja-fXO|L@z8k zg5``Wr6CsKG%stH?e(|=a#C{0;P=*O%U^U#Crmu}953Lrg*ni}MFBGzM|Qt+0^U@J ziac!c8+d|gZa_+M0PC}jLu{B?Nu9iUv(i2QfW`LU3CK?PAZ8vKYL;4lnuMI1w|Qn5yCj7`^@;5`z2{zrkx!F zOQSI^q0QCNe2Da47~|jj{h5VhfRPLUz#;mV*f^6m8c5X4Hb9-)Z~=FKFFR~^5o>nc zSgBDa>P>N!oi!0Iy*Nufh-(?PrXySwHt|THN!pNVCs&_{HXQKUl>-NKmGuwK`eTT~ z182|yxFud$GrK^S!;im^O9T!uE@*F+R?`zNw}01(XrBC!2oJmBP^Ne*B+b6&rNOD^ zwrtK%ypN$kM*ZC`ZJ{dPGpT~b>9E3@ch-XSeZ4|4%(07ZB9wx zexn!9oxG3meH7X*y}3~xI_7|bElD&Vtx}WtU!P=_!3f44?~8#1@UJpki$*PXT;xA> zc7LTlB~}srbzv!S&rdYy&b4Lr3n`zU^q2t|~cSLeJ8>+3jNK zFU41-(Z}deRYbcU5vQsa1XV!pBCR&?J=yVwKuKnv?^7a(l1KXIM)4B{j@yv|DQajs z$0sv!ev~=yT3lgFHC3Tg5vpkw_?DZ)Y(7l(Jw-0@?`l^+$`8BRY8b%GoQsQVMbviE z>NNglH|ExtL%FGo0H34lSQq=H1uI010e#0Kzh##U8skbaLT7J+zlUUU7YOlSe5;3M zK5-nwV0&Q}h3u81E>kf=rGr4!N`+u(S0K>#8nF9ep^&eb@X`+C9T5lcX0t8&u7%K% z+7ra_G*I2!)V@t;L1dM;0!GL)bm@+gwt?47NbSPwm5haFm}djBBg3q7wGd7%`Cs4) zfI7;5rOWQB?XR=;h|qy{bj(g1(ht&@@Hd3Of9=}<8$jfu2ZPq9g?2AYv@{bz>wE1%wt7;Q zb1LZr(J<)db&(-G6K%$6`Ao^9&9|rj7;Bhb0T$0+We?OS#)q@BFJKeDJnO0aKE%;b z(3`Z2MizQn4&-SO@bOU4f2sBfZezuzrkLzRiYi(4t(IMhC0IILUE9HNUS`ghFF}k& zj>O+wMPj5nRy%-mZr@k6D}BtGi^ND^ci#@fxtYIR{kYpn2OCPF#C$Y#{Hif^ue*bm zv(Fa-P?n;G_f)f}oc8R7+E=2|vHBZMe5=sRoVfCn(FX?(rr}Xu56YwMw%s@(VvKdI zo1)6oYpS#Gq_`FY&3~WuHW=EL%LJUCw3NvasE^LDk?2w912EM1BQ0P4Fd=|mKnQEx zSnYVDpvd#&Qa!rXn>F0#M)g?S8~T_I>d!_QwkDct)`Z4|DuF8C()o?bXraflzDSW> z^`CildM=zcsx8xHH2q_OC?}coA0(S_BBYwZ@#HP(R43kN?d_n-MU!73C7Ep^ts@X$ zsdVUGex{U~k{d(hoB9Gu>EUu5`LPGz-7_AWH*o0s#8{e0DPh~3U}^W&x6UeK#xj}X zz_nhgJ1n>(QC~5_ng)KOzJ0c61@vo!a|ehdp6oNh-UiS=w_eNF9w%~!w5fkw!$Y%? zV-!j-2|-MpU-}$&9-^BtV&I_w{mot%Sovi^kDWX*6$2BD3FCBuw7-OJDr{b201tT* zRtSP?8Qwnn5PF9Ns*do7W_fw;+aXspVPX9!g&va4e#$N@(dH<2rey%y%ULIdkLWdy z4MMi5mRNdZnDIP@@U>N83Ffa^GgcAcFV3Wqx3E6N_j@mDU2$tf!w2GJUF%$bqEExN(IWkKlGeH(YpeNtv1X4* zc<4K(b>aVNd$IT4!}e+LOt7UCZt%AqVs6Wnt=m^jmkq zTK=qDN(tjho{8`SeopqtbAW^}KcyFpZ6XSsy>coFt~|?Wbm@&#k_+hSLzp zAL*76%fZtYF1={{ki`hT?EN9hfNfXCBE;{46Nob>PX6`msR7 z{DZq}%+UJK89Wm)O1H1#=$a>2ipPZl?q zZ`y<*62qMu+T7VrF2&xmDKA<9U)=DVhaaHr?MUkM{APJFcuv^CRn%XIEx#P681Z`R zFSsM`($c9&ox9ZX<=chnD9e>{eQ3bPa4gu`$e#ms=ZUnYxw^1KN|eDP+6AqlCRxX| z!90B4*-_|Yekj)7RPvU`E#ts__1?f>rAfAUd$sXHf)c04^!;9nd6Op#%123&fy&eSz#O-r4MbwaHul$SZvJfi)*Wi~;WgYF;bt|8B5-4;5%HbGD~`$PUZeusW7OYlhi%8Cng$;&Ba^Q0>tv6>q>OkJ3V9o6dU}%bBRJ6SW z&oWDvHMxSGvy8ZoPAzBP1tYwRh&S+UhdPV;BMzTCuz3F}OV0f3uJWlp7*8Nb;{s-V zLnWMMR7Lo}8ULP?6<<1nh&VjUQ6<-*a|vqzeziM!v#pL8OWtNMOtCDNx7+p1W>*ot z{843w9|nwRZkx_mP+GL^(AYOO)HjZD!-XD7bTy$;l~^Pn+}_zZW(w6V;lEn>w(bLI zRcZY(GW~L4>-nqOvVKEX)p>3H$l&qAUV-C%R3V!7mSQ$m60rw$!xe?Dt!heAYA!Jw z$8u2Q22B$VrPfYG8s{a4rEV9G!*}a9P{BBriFCwo5VISV8{x&3kaw?)zDccsEjn8B zK59|bmW7puTO$BXk#;=$F7S{|6T`ekL+V)8GMG6LqD%9STlLKvmudbE(?w5|lgm>R zdYfYC^Taj?ewQ~DZ264+Eb`bp_l2{=>rCKQAmr$e=Tf2hE7%@%-PKxW&kM`=Wt^^O zH?LHyV_?xaR$dTb?zUMj5{c%QXGbE;p|WYQyYjnCTG9(zmi z6zXlX{fo_6boWzUgb);K8@9_VFIE&m&l0v+_>lj+wws(>d-vcFQ-S}J?cWT|p5*0K z^Ng(!Nl4+;GZX%WtRS5{e=Ab;WL1>dliPzXMy2}` z0BkVTm0xM>S+i&(MN;(P@)pCi3@P8eN3UC#IbGNhle*G!Tb;4VOza!w>DgJi;jg+F zCv3n>rb{N9^*?h^>%Y9=Stqk@G~RFh{%%ejWt0G|=y0=ommuzB%T-me!8&9RNu&*8 z-pdfK7-rviyhdR}FV#eE?m6vS@czz>-kt;6w{YYCha&*suA5HkD#}kZ-NQBuk2m+2 zxk;`tAtEKj2)lTIprRSqwyp9Ildm00R^Gp35wycSZmNmM4anmp$=}LjMGzXBv1t&8 z0-|fV#XtNRJ{yqKWeP>;E=L>Ee0$R3rR}$TZwM5Kegy$`QCa z&$G-5r12WAEP0i*BrOhNgR~%~^XCjPqnayUr3l14{G1t+84(*64Vtwx(8XQ^l2ChA z3K(8)7+oRa(s%93)Z6syPwD<8C_v z+BhaJ)e@>zDR%L}mK1J+wgE8lnAn$(<>oD1g7AA?q5B66Hd-z}<_Ou}Js(@COo&vq z*<}bgp$c4UBnuHX#+O<*ZNo^Ry}vbaSr|m%Y6PKb^g`o5{iCe7{GkP(MB^QLz?I2s zIGDcLJFEu@>S2=a$RGeo>{t_`&n=9)q5z<32N~ByFhPfNd!=s{3;Bu}Dz6sMsEah!fMWHv%u= zv0YJaG9#=4g+&G|JYOv6mzw^ z%@8zuOe=MoUZt~eTJoCuai~x@s~Rr#dJd4bh^{jExy)XI5g1wMTMn*`M+}chF-D!* z!=1g_TL{5GL^Wb4{f!3c0VUPFGs>e3DKNQ5yUY)HNl-`R-Z~P7iC2@@U~d~-EUke7 z*RBs%VfX5SGgXQ-%j14%=wBm{*$Fzx*~WJ+nM;2)iF3rI0?WoA@+m8;?iMSFNND_# zDx^eeBChYavdX}Zh+NTGMJ+WUYvO`TYSoHv$&_{HT& z%xEC^EM~7NM#hv~8n!iVV=R`NCv%e=X(L8P1WKVZ@qY*bak~D8h{jgHE-N6^Zg2{% zSW|}G?XaKKHa`2RgD5If9mm1dO>a#)&EuSjiMX}}xslGhY>v@G-K5&wHYOpbv18(b zBzxtYYIz(qAD-h)1F9-EFZ60^ld*T9R0n!GWpzSTd-ROuk-~q$r{&Aac?YI5U32xq z+8AF$JC{#zZI$cSux`D|P6^>44E z+OnJ$RRf)xR>@RiKk>bI3rUxV962TO&phr+<4QK-i^Y{V#}yTe$;@(yub{!G=rzsX zxYx&8K=)a?8M`vAXD0BIXMHoeurITcczLqM6Lz|!^t^C?GjzE`(P|J*7b_dJW6 zK-6`4;0<`c&k^uMrOEEQwQo)0FkIu z3O@JUTCbtguJX1M&G}Gz0M*FRz&2Lx_d$lJDfi^k-L6aQ@RmJN=B#HtVzT<Q`c@F08+ z?iC@&F~yHc78*JMq5XniCx%|pTTigm3>HX+S>9-&EiUiAsIFrq;M!eVJ|!?UK7y*J z!NJ*&zV3nB6{_&d>F{e^N0d$ciDZA#MamogwzCTrC=1ORniJS5`9t9DKJtbs=XAQM zodpEehIiKGy=++DsnkgET3by?7})ghzM~W+7TTv<<>7sYX_6~Mykyx0;;u6E!v{a? zX{Vm|UL;a8H&uvWnl(u5yg1neM%)_fLn=_`z2?8SpjR4Vev>}(Us&RLa=gNh^lMLHO_i1-4{ zvRBH@<)o00BKFM?%=)q?pYk?&6q(Z5EUYOjgByAqy?(0mg=~M3jY+DA@tlCN2luvR zRfFQE2?3PYfTIOC5N>GE_a8@}MX&!5R^UOu6Ch~7w&8uBtafSHRa4^i>jMcC0^OAl z1s0Nzv?rXkBaz~Fia~7&ZVLMB^~O5%Fyf|m@sU|!HpeRh&=#w)k~>{eIue}jQ7Bcl zP>c{RJgv>0nbfkM1f%&?1=fYledT+s5Z>LEB0}_N*RIW&Zpuoc=3bD-46I4a2~XdZ zpQVopFvzHbOkJeKd(`J0SkPlN#NJ3gg*muUy4QSxKG;qvvxQGZ=TPKYc_qCm!ImO! zE3(V0*ZdBQP-1v9wXXDkhkisEYNc^sYgVgNr*UEb0MY{ZM%L|mis%ZMBm1! zsjW+sP^h*Y5PZ`YhKccESf=nM>H4-dL#pJ*bmVU}^=2Bt%@DUazjg3&Vcmay_;#25 zz>)QKED~0lnz0J81S3i9N(Ph%xXMwy{tj4^nxiDu_YAt=T65$>@38bE3Wh|@vdNxj(JAZOIlT>%k!+4^znE_4DZk&7tf!a1tgB~6~Oy( zhFyC}(nB%&eP?fj^!n~9q_)TSoZdw&$ytX@)S`_S)7Bow>h8VF3yhNxvgYs3%MT=2 zd`QE=moVk(toNv<-ny zFh?l}&Mm;Y-x^3UG=x~Lw+W zt(5bMTh;X^P|PD(nX*m^^Tv}z+&D1Vm3^DlNuXm+KvI^_AW8J41S3W-yf5_u$ryM? z(?V@K!W6<8Ak=Z)00v*%vCoo{ybMgeLD`YLhoALZ#VVT92IoeS?@Q)76Fh zdmnk%06o0;RdnhEfq;YC^5KG4oBgQg;{Tiq<~jxUL{5_Wx0x(rGG1dOP*iyp1Xb2C z;D3nO?5BNQ5r}ewfiNHLi^?0pq6tEO&n8}{C8u5O9sRZGhbAleLoJ2YR$M5D_=W|<5yHT z6?l9gS?Qwe!3-fGX1FUyl@qXe2VOemkyiBI|6-)=@B zzWwx%G}_hIE0MdBMO59+AS=lGK*0NT9G%bx3w*Vz>W7U$J z&8ftt5Xy^#4VZs5-dEL2+p;NvC)`E4COIkU-;9i%_TpQc2! zF|)th2jW2^GHSDxb*gRLG|u0XKU@V;mb6nfeYK3r0NC;FKw#$UfnDOZu231rE?qva zO%FI5&2=wftq7Gs#R^FXPA}rP?oaz%GN=4HrR&v;A7&$3 z5Xw&TdGo42Ud$Dzg+_~+REl}R1)N#E8x~2@rk53I^y+_Bt$ojxQcSQlEm!zy9xNxtOh6hxKbigHhsd)5b$2_ zhcHvHZjw>AeP9C?$e%J#cx-B=q1jte_D1|!yKZ-<{my&9zAP*$vRQMV@X8&XJ=Ig) z92S~O)bns0^)2{*#zNZMOrEgADmy~nj1Z4|PZCVB0g&1?=xt2r=)Bu3LN$`4o*p9s#oV3yoN6c2UXnYz z5TnyaY@0B_nWbQZce{J+;Y2B|F^M{pql3%B&`1=iYqV!m!9S@%kIYwrWzpO2mIpj8 z*mftFIuO!kcw(#KcEcQ)p9e;nIu!#@LVIuW?(Od?)PPj#$}+6c20TuDZw;x08btk* zg%ye=-V}D;A2SSWH58*jHPg)|G8Y~b8)2XTDux3NWOn}gXO!e%$mhOV9;R`S{tSjk z;T(%KRq0p38AN^Z{SgC)C4ss^2iyuP!Vz{sYyLJ+n}Y5i_qrFyV|L3Srnh#)liIli zYgdUT{PC-l)gUOTZY_|yQ#nG=T!$edegW*d+#DId1VoHyPX>vkU4G^cJZm_+=Ok}> z08$<_w0ND!oDQ@Q%EB!e3DxBsLy(MAXyfnp@ys9w<8%_Qrmp-!d&cfRIxKK3%8i6$ zSmUFy0|=?^w^J^ns0fgaYDTN=f`7Ffz4z?J-jBJD0bXZ$Dr$Ounm!OjRl9P|=QJeT zi>i+)oO4*_Zm4;z;T7?G**F-HmsQ=^3MLF}Em41*+4bE7k12x)CnY&L@Zj1LPO7ea z7tX!(Am`rp{yVNmrst*kf@ZYAY%62tJLMDrC6LEvhR8OX4`E>;QNhCHRa71r(N5JX3%^QEE;ac+90wJPP%W)px*K47)w$ zE#-Y>K;Gf@GS9P(pF8{pMFD#^QK?%2ufmtH?kn7nr5x%H2Xij51*kOE?zAMtr8Dds zUyjG}((iL$6K%c=|1agE3I!$aerL|X#OW)O{FhBsXII6=0?8sfx9il zA|mY!mSZW<7l-0zwcn%c%F0C_2w=*@ii0hwOnyMk$ig&Ijtcma>q;!(kYZlC;G;+21hHCrxBMsn^OLB}s3@^D)E zL_B_!`4K~~SzP^2qbDaK@N=qm-8uB9A@jsnf4A(Wsy&6|A1rkxJ8&VaoJCUv?+z4-}CQC$=fw zK)>9NaNCQzHC_{Ml5K!r?&``}EWqTn?1JCp{5cDWX1KHGA4O+pA^`rwX+hN@co3Bf z65kKzQ%nhf`y*t#jNDS*`pBEwJuNK&re&&1wS+)Vd;*ir&C^hB=VE9o`%yV4vcRG) z{Z|LDH+m?2=bC+19iTx@B(>d8S*n)Iz(Vm)R|JCbIN`9fMh+BH`i@VJyeid@Kn&%oPitWp^MS!q#L9okf%wOvr_=W4Of&%=n3 zt8UCA`5QAv)ZA3QTpltE&9X93t(9mg2#<##LjDmiHnCG3wTw#e^`c|f=3;6~Ak)z> zd!PmmUNj#tFk}djZJVYu@>$LNsSl)w)aN`hpEjiIB4r&}3aPXtELv}biLIqJ;_fFT z;tVY>hkf3!b5w-|DK&q=&`bklqx`fO)AgGQbt~}H9fd3}mjW1$`dhV+^@*txmOlYbR5cg?4rK2t>AU4Vj>|Q2e*^5yY&W>nI0i z{Yq|o_)A1QvYcihto0?7y7CJ7r<qzSXE1E%S@6Y z#4aIh;A{hyKOvllkx`XE9x%295tDx+ZRT}@6db9NssG-6LE8`y8iR+jI1`4?SglF( z-&U2QujbZRduKEpf)5+0tqcsg=7vty@_p+yU%;2rl8EG4QdNIpd8FrgtYK@A)S?LZ~x;o@Og~B&d zonWn2)e)=;D!Z2C*(bB(@{lO~R|fboGHS%#g7jB(tyjYZGnBWRs7}atDI!Hr(r;w{ zdS1S-fTR6+iZN5F4fFY9P_7I@Z81gDdJrRPFAG2+2aTY@u_)%%$$V@Rja1z zBRnDXTPe15oWmbqxsgk`RK&3VQ@tQca0IoQ8;;q&e~M~#squR*Y=q@R##No=m3QOIA)-5)(;3l632$@||{`@aInm;aHilIfj~yu9QB9(Xu% zD!JK1NgO8kRF=*!Ew$t-C*K!NxBRaWvilTEzlrvMGeW(gJ&FZ)L3YShrv9m(pUB5o z%F$uI-tm>^AhqR51eg!Atxo-*O1YRV@t!lCfYm7m^$_vYN-ue5HwB5vgL1#5oG6D< z$kIsR%x@}RuKghx=VTQLuc5ek0&_YpkRGZ`;$DKill;3Iw-0+i8m}tyta2Qd=Arotzac3X$Pds)+S{=m(XkagwR0=4%g;&D$rS|tPJ znB?};IGp88ba#%P)rVZk<{kV>vAdDX@=?7tE7LvGQF(I<~*etIG z?Cci>&d|=r%(YM0gFzh5!;E4e=!gfVAkEs9HvDan973Casxfn5n>LTV5Fv>8Mr+oF zQew4J#y-0)W*iC$KFZesvo#I{u2MG0-D>zjeH|<3Bd^ev2#@OaUjd(ZIz)yDi^1if z<$k(u%ep#E=nr~nRVJIO7V;rRi@InqCR{ucA!*<86y)C3;a(UD=+aoDM597R8eb7K zT$ZF%o?kH#2s$>RfY>PtN#1}PVO+xc>IfW~y-_!Th{UH^c z9%k_>iRpSs8jKkXq3i57KTRea>+z_{iaIG&OoCxG-{3vQ0iAqC(Kq1#mRy!ECD*~n zUYizbuDrttfoj7ErJQGS$E=PGF&Ez3Hf>{OHr3pAhC=>pud`^Ed|o-~)?W9eFA1|K zn4xvdU>@s5RTdm8^6-%_EK5FBG93Q=yCu4%t&+FEw~dBe#&W-q$_u|ryPm^MBE&uB zh}Fh^Q}+}@peavXwlu&L7<%&>pp!+(py*LZkK1CwwgA8`zrhBrhV#>R*4o8W|A5Ht z&MmaaX32>xi#n;wRLSQX?46;nNYcgcQU-qLIVmWFI;7K7z&(mT(XXDrKB?$|I8+9ksi zsOHDcnMaVv8uS&<8f$3%mP?AR;{x#QiJ5Mgfm-i;mbUFH@+gl8*1FshmZQE@iZQ+S zpKa{iMKiq-D}IDKo05kdp!L@~J56nwJVrQPgTKt;=`pKjdV zwuuY~>!&pWl#MTTj8WW%%T1{mIxtlp7j0wqg{eQvw%xKa^5|Ad6GYmSr(^G=2@6Gg#v5d9lpu4knqp56az zM#t3f5-rn#&qSOdoqStz=@3ZyxlHJmtxJ054C4e9%1KcJ`^)h*$~VOhkWiTs2S}~( zn2Nk-E{fjx%-4qWC~edv#_4{g5wrIt$=)8;7gqq3sT}Fg!~~zY8*<^E&?@-nPE31& zNHC2Ld2BO!s_C0YoWzjee$2;^<>Kt(<771WJU?6yQs_WU zoV6Us(IBn-o6oumN_0+3_fbo{Ydo$)LtSY@*F^%b`96sCHt3@3nX$(;HAC%;edM%( z5d>;y)VcjCYUKK^6spcSb zOO=H?x>E^_!DWV;Z5un{Dk|m{&HuHn22>;|Y4Wj`W z4k$|rOIKH#W=ROo)!{uFM@Czgku4bD@tk3jZOa8*SrG7#1Lhw!`JX%LAPJyxLXKAF0NK6@4&|tfX)OI6Q_{j_RH#gHtN#--%4YF8O zQSj;;v_5NWJeyXbLA}?U<^}+dV*W|6s2oY`P9nR~<42>|^|Ylnw<2eyP-sve4g^_y z5e+Jq552!ap3suXb6a5{=Qss(5e8@bHOPtA0>gI;u1U0sfpU?dWLdR@x*KwCwPm#{)(1D;E^b{u@1SIu9%bJ4g-COr`B#DJYl`_W0pE&3pHQ&ac{rs9|@-$3u6W5p3i zp%EId-!%96==NMQE`KtNo^Agg`+s+GeHnwGM9AsE4}MsSSlbuC_bjwBO1TJtrtenz z$;rA<{Zk^|t)X*0oxE8<;@m1OfoT{_D~P^M$yTDS{3*a@m5|__P>Jx|%_r}wr{@OL zCxlP9%Sb=iMefeF+=3zsPx5vVdRSK$*C80&IFzqK_*I~BrJ z@qyzHdyn5bW8NY7P4{0`f2jKv+N9rAntnl`A1+fk$&RzOFyOeZ0(pOxd)^&ELdU*RJg9(B2}I^Pz7A)h zgJaSMblw8~fJ?E%4OA!y+#lT)qjaVMZ?P^89G=a;R(HV=GvZULTVQcp{F46v0Bk^$ zzovjXpwUefU}dnb;4~G#+N)!Vz!>2WTi#$4v;{}PHj3@KC}V-qO>b zPdr4hznjp7HwDi=}Il!Ev;Wmi&mZ5t&@*(33;tdDr?~3u@CHJZE}Lmyt#!u_#ac>1p8f3mtD zBG*QR=%MBuc?|jSih)(3Y`B9!onf`$1hT(*v&;6b-W1QNPA{gA()!q>?hn0~)wouK z*+r~=Lz&>&RDK8-q8e2(1nXe*3?edR+1D$wU-(Ay)w}>^n!^2=p8gA(v)H`Y>p5~4 zYid5-SmM!0adVS@%c7*pz;!M0N8u`obc&03#lMo5UTqBbfk3mpo1-v<>S0S2IdaqV zdom?*K%Bn%dj7LDYL_p2tTXmW(;o*7kmR90-+oCA>;y7+Wl^fc{;x;mWL8FtlGZC$ zE_GyEP|eSHy-o|nP~rwUliFZQ;JdWUMNg=bPMD5IO;fBxT(%+Mo5EHhY)WXH8D9D@ zugAOGVi3j5Hmmofpl(3Ctbm-FoF|mXN~9e0&Xo*L5oTr9V8rpfXtb7^CQ5b*^iPn` z4CJqQ=)}w9%13jP*-WO$!2Ps1#15FsTn~7vGRLI5R4;ui@h`^4rKMzXpa>|qu7L4% zEypHuf&wR)m3c!2SJR3{hG}XZFCgzmCWp|a(4zo9NBD2-AQ!8v;9*ad=+bOYH`HlE z3)^FxBCS>TM0HXgch^JpDcs%XO&(8)m(n#F02sth=BwX`e|t%81B^&exIHbS@qZd2 zEp=S2*Fqpq29W-@pN3v;TuB6P7wAkFeh-D#o`!t}@h7;x2|AXpfw|UEner#9@q~l1*_rhvG+xv7UGuHP#8{0* z$5|l*_#NgM9_6)IMPmNGU!H%jT@un>Yc~cm?~M9t*5I#Iu)@hI)YKbSR#^iH%EA%Vq{@g%R0b(N=wn@g($GWzmI4!{ zQWN1r%2>j7P|O(bvOrx-wgx>1n?aB3IuYlHp~04CNtXD|hrCfz$l3*-_GAkSqgO#Z zVn>w1E}by9*E3B(_Y?Zm=qtaEw2AdkgMnJCZ-~vx;(Z>*B(evCOalj0!}UDFI4N!b zRatc!rV~e-)NObNllPCTUtodGI)QgkYwR=TfIzumG7{?D9GL{R%3<D~bT! zPPOXPj73C}kf6vt^75LQVOzuP9p0iZWZ0zGrd&%mUxNf4+oS#22?%95WaQvvv1 zlDN_o2Lu#Zu)Fv>G`P1V5;C648tg0sekFQbEgtd56Y&%%1V6gQRML98=-oqtY@ny+ zXW!*!*?ny|JvQDbt~OE%Yv%C(rPqZYy_SzBp9qV3w#M|FhOMY0sPhM&_0q=LkF>JY z&}8>1Rcz5z@K6R;YDdCnfSG=6|8SvSaLPUmjB(j3lEmB9&p1MCvm?9;Y<^YL=Bjg0+1 za(gFl5eQ9w)a+F?luDw{Tcji?KKyFfWfg!?ZXq)K2;1TO-)hDi*a zC0~AjgksN$K9u~;d@K3NdtCKjp-N8`b0Lo6V2n+Nb>t_JU*D=4W;5!i60x#ninQoD zvx4A#uVHoQ-nPE?>@UNBTIRopgt@$PDh`j69lRD=S_=t;VgWq857h?kZ&`lT`FHh#7HS#C}m6 z*Qfo^IKipBuUU2MXSlgFL-A*;>`mpllk`(7QVxfmQt>3D!S+Afj7UqnnwKOsCr2w9 zp8K7>?LXV6lgO$3BD&KJF8f`zn0QR@O_R;@1jAb7E_5 zv4I6{ryf=Q=OS&8nr;jm@jh9J%%MH1ru!1Ow&C^%MQ;&95}<_txXRWZ>d8Br7Wa{0 zyie62G0x3tgb#CfHcSMRuX3_kD&@V6b7ol_t-CxX`NWUge z!a?O*BwKa2{dJ5@8tdV~lPi4J^thlN7To{iaMV_92st-!s!0XR(>eQs3q=m&0{_ErQyC5=;7m>-x3v4MF$I(UQB&6?>7OaHj?d0UI-Nmo zS;YKi1FQ`R5Ugf(=}KOP=!Ho#0006W+j$_Nq3cqgDWh%m*fEGxMJW*iHg=~EZ|FdD-{WlLp!^OIgNO3fRhWs<=lOZrqi$njx z09%U8PhQY2$lY5`WaFbjc*^cC~GJ zdIOW42@^|4XL&-tcN*%Rl)Bac_qYk;;Fl4?P*wIcJ#w#p=x2BY$x1`zz&)vYs`8-*W4f}W zxXeJM&AnIUQ+G3J+BZ{E&b4k_qS`{nWH&;C;mupbGd^GI;Nvr6G6iNY9|!V!`nBN3UteoNYgsOLn^2AN*(rh;#uSZF7+#>SN!MkX)}<6X%GPBq_A4NI zr$8sgQUUxp-BTb?cD{je9g}<&wHz{9o)kQQy9ws^sFNetCh*}ffo3XgVSLl7H7MTX zjC;Y}${t-V))7By<+e(Y?@-iEZ4vJw7%d2AI_}))#YeFl&uD|gH0^6fc%c;ysRW0o-TR7xgR603* zm9t&vri~MvG#Xr1#oK4lHy6~e!XB8mRAU5QvO?q{p#R#)#eu)Fl8#avUb;Ow9YMfH zq-NBlPp3Jky%I%1nfYq#m7b%M6`1SpkzTCdxp?~)_ZpobH*K4`ue2KD*^?~yMvnO3 zn$=Z|@#1cB&u<`T$>=b5QsQ$U_H!tXIOR=Ed5`Lnbaw^JNxSqXtIVfXd< zfXkYxJAcK8vxwjfS*$ao{tjPJ^+m~h)iT9^I?%`}EZpq#-x)|K*&)RxL=@i6tz%&IcLpqhO_P{(SuqdZWG znm2w!Q^bG*odWgWBzt2lg{DUvNU-gV4@@F<=&}fWfkp`0! zro5rC2l<6CDdx>mOm#3FQaRe4LJn4q$dp>x0 zW@$1yRknd@hgvU;VIdM(B!>>58VcEt6VJ?8AP+H^XLo)>k>p1n7WluFw@6G@vol#o z1lk)locMxN*%56uf;10CHj@&+M+i^?G`x!_1GbUoICEenaG8pBAjf14k77f~fB*#hwBd55`4#N*n*qh%m!%jUBZ_0DHcF&t z^0*{H)*=uipKaXqgDv~IA9HisZ2&_2IlA+#!O~nQ9_pdt0jvggEi_@?^;UuQdI!qc z8}N4)p#-;~%t2PuqX*aN)(8+n++N+ei&CS$;VwRq1%<~PHn8P{ zK$oEi&J<#n%0ILTJl6xhY{b`gq55(ZgD`t8%z$!w0SKO1w|}8y_6^-3&30wUT}~Va zPj4A$yiPx8`IJ+F>0S;j4;a@;INuwL#C<};-A3tIvr$dgpzV~BzHW*- zpYdm7YR@^FBzLQQUnKcnNJ)-ZU4(wU3gB7TWcpP1T6(N?b@wFp?Z=J+lXx3SL`EEy z?bUb9f`#6N0000000000000000000000000000d>TvDE~4H#Z6lDv4d(8Y`AyjZEy z0BADQt||1T&mcEE*7s@8FW`i90csVM~%cJY`GbD3&AzPGTt}WhjjfEw$ z_3R3mrQ$}ot8_nbKq(rC3Lz&o!!Jn590RJ2>RGW`$&NwJFI9Q)yzvh6wR&qZoV(D2 z_O6uml6Bh+e2HwJs(9Nz1#*v3P!%V(a5yH6w+_!L*tAZoV&z3Sv!(L zz3pOY)6(FIakwPY(8fFF5n~09`gqeefKY`V-i6UJmf#(e(9`GNzX9&O*i094tS#9z zTMYq4&EEDGuL~CQ9Erb=5tQ8Jzo@Gb?9O+Q4xHj;{4!v$UCjf}qaE+5HW5uJjrU9h zeY?oKv|PYf!~1@+_;KSaxJ8+TQ8?84mPq+$)8b*}@D=$6KN7aA-{_62)XJ{ELUh0AgjASIH2TpYD8~OpZuvV4 zbS0gnbQ2b za<@@H#lW|ZkC$A9JIKaJOFnkh3Sczf;dDJW-HW44BuJAR(i1P2kR%1_UG9_1)Fo4) zc-j?O#C`G`xqf0HkKmN(UTzG-aCA<0)yAAPpTLo-()TL2Fw7(RBN}bH=QN1MBRk?j z`X2-EJSVs+%#vFhD|aH!9Meb2G%@xStN0Wz(PcJzWI9bxPUHU(a#PByMek6j{d-?X z{g`K!99U$|A8L_@01D<`=EyZq-2qHosx6CuxwP}N@|E#WZQ5?CAzo)|wVhqhzc@Bb z<|9FUZg5t@c|$JVsoGTV*u^<6XVQyhX42ChxBnV!s%vW^az-8y?>9Yx6NO4|n3@7R znJ+HCfo%G;(+wla*EFe}B=vX$s)%k?xNj$?xcmj%jpv-Hm(r?!}>enFSq%MQ>S;d|oF3AEN@fY%7F#$@xyb&5fN{>5B zaxYyp$+b>~SVb|n3K(G{`1M)<0m2+N!-X6yHYr0J!*Bh+#efYN#3Rw%FIYNja!Tl= ziqZ75q*k??ZjM^MA~+>B>qSl|l1(?-hyBH;HabcO8PGk>j(;hA1~B3NiVlt0%?)o@ zuONb&ci|CyxD3>Xv${N+&dUgrx`l&=RrfSZh$sS~lH_@wlg?&RkK6&5bIdb}J}weIc*vCLGb()h)yiL{0_E`e2W``;%b;hP5y&$fiiHNLRMmx&hy)PJjeU6kefd z4NohB189}_o2Szc6o^}&L{1$T_`hsaRDzFhs%lbwu>O)@4Rg3K8Lpb24G!#fB6rNS z_L=E+TR+zGM%z}0bBUj9+cafZI~;`^=^%-_N7B1IipzK@RXDad&1w1vs*z+g#dm~! zscl_YOEEKHw4GLot+L~dm%GCs<~J_V^C<{)$D$a$pDfih)Rr|DKKTWF9HIIhyh*klw&4?XJYpiw6=~q2?Qc1O>T#ARGlxug$Sso4aIaBd zgZnUoaAEAuP@y2;=f-RWX8Z^eMZyXFKeOP*0!$uWo(iFIDzZ5zGnkyR&1H1QXsHrV ztqd{Zxu*3&B*t8qZp08XRS`@<`Rg5iTRiu0V9&^}((u|Nq-00mtz?gVU)Y zQ~w;J54=MRHeRNCNp|5?_h1}XMDf}n&C&ToL{YIDGHP!mg=*xv)O9hpqfP>$jn|4) z$;hej4-hW#CFfBEGrLw@Fs|@Y=`SvI?H{)ANz|9Ftvo=`VF0b1h+wtH0v`i(Ydr0Q z(Hy#?xt6XGjR%^B5ZR(gyQJTCi`ToKhKIkAVo*tG=_(~om} zZASG|*|$LHUWjqZY5nz5b|&oMbRAOQd7)>Cyp$1N8X##i7TWrP3CiE3b=untD^~*4(^X(pKvueerY1^{$zuod(_) zr?aD$pJtQ8*p=k|Rv)4?9d{&~#&g2Qwqa$!?MG+x2icll)6qged3yxP;A3Ac|Jo~A zKH`SK$!vl)Yy?>Kf*@#iU&-Q4;E-ghK5pY(dB?oc3Zx3CzD8qwXE}0NnpWn+{AW)1 zdZFfTJ#tBKmUINELgRS&j`d%$H9Hz{5Vycmwiz2ONwV=wVnxGhg_uThD)(#v000us z1q}K+I7S6QZbd?m3k`D)FWcfw)c}G!(!=%O5sqa-%Cplv+gzxE(ZWt(a9c1Dz}>~a zJv_pmKCQY?z2`HgZpGpP8uW`$05;jv1IdnlM>(;IlMplr9g$}-VJALI9svhviCG$alo3bat9LLH}lR0^_6Wj$sA<{<=;$AMc)zFV(Z3)}M-8|u7~ z+3!2ySmv33G#XjglPzfveL9_th{RK)wf7IP5sX^Qg<5dB**@(AQqcv=o3ag`%S?TP z<%{}xbZ@4A##>d=SK&E>tsLDQ0*y(s8#cEj56sjr7jCpgso{r#Fz+YEUK?MkrOC|c z10E1)2#ZD0-*GjGl1rG>V<=0lEc#_9kCJ!j@C~)HI!}o|?@JuS!Jn}_Um%gl>@I}! zb-&m1wd|0dFI751SjSI%!rNuzW}0LC>DqfanfYb{>pc719fG(6%lCwEDx$g!WLGT3q2!Fuge}PSi_(8_33*>-9zW#Lq>(7I3W8VmTM*z z6f!F7V3+eu9fxfyvzM#H4+3gEQ1H$J?zy%6k3Ey0<(Lyz@Zld*W6fx6Z?H-c?(>cn z12X~+rOU3o2y^|G<7~4N=*9GCX$9-BCpfx^2Jx6!*_yz}A`FuTKmT)7y}(kjOY0;g zwSC6G7FtV{rJ8%Iw0Ir_5LzLdD&G0h?;rpO`gQk+wphj<`D!@ijK;*PeDd<(7RSbo zCf*(3Qr!v9btfP%X(tMR+@{A0zAsGCwdWd3!Td-1^dZU9{Xt%t$6V{XuHOXruE^8- z6@g*(8Q=`pX&L}j0D8XT`-&)qpNk;9sLRC&PFsi-+ zYh$BYppTZqX7j&L8zC;HpX0T{Rzd&(5k!h=QKIU~10vbPAeK;w!=G&Enp^vXCW7}} zF7Pzp?<`=+e z5IMkAb$4!wJ1r9R`i%fTX6V{)S5g= zC|t&S?{F;x)j9CLse4JKJ0yadk{rs!WU(uY$sp(Z{!H{cxLZx$ePUQh?&W`}K46hH^qyjCTi)SsSIkuy zXxJ>-_!*En&|%&%m#-iDd3nlMFf!{fSfId~NvN9RCpU7*g7e@5YyVRMVult~5aSD*ZlRht#XvAsF|&v}=vvj9yW)-QetQ`m8y0Bg*o^ z`ZbPegvkv=M1a7&rlb%JC0Er+6Wp|vHk5@EY`A%-DMYEVzvmI=+?aB!nHcKlzZ&7n zrtw%n947SL%IsGwUY)|Z&>ydFMK|!^9g}R}n9La^iFh9+4ihyuBV)s9r2vQQJV+(9 zpLWO;6?;BA3m$kST+_zStgV8eTDXNq+YEb_mhH#kX%ynIkx5i_asRN^VGXkAa}+gk zr@ZsIB>G=L;~f}-hz09(sd+}aU|4ovfBy z5uzROuxQtMa!z%blfJ_dfSH~sa5SyL`Rh)1M%F6CfnF{Uq#cKR!B_jyR`-svTMPhN zO@Cj3M-XVSAygfLNgb*dY3bOm;{dty)zph~s-X7gLLkLr?4-@9S>y;9o!|Y|x-xV? zfw9oQI+qt^mr0G~4`GvlO%ZWO8>rhE9ceY^!hkqW9`_)Y;6zdNUFjCTrlRhvd$wNl zmL$+*l9tP+Iw?~=fU)}2eXml_?b!f;?9AWL@;n1L!xKa3X2No6`B^ir6*EO@W|d~I z;9F?aeV5$bJqItb?a?eik~5CT4;SYhJqsu)7_Hmgc-^ZgrDQ9{*!UvRB5negGmXCw$mM=#8 zueI~zc*S2J_jDn}U4{~G$RwV58OXFoiKN_KaHKgM-(<9Td4P9(IzkL++S@QnnQ=D3 z6N>5<0>I#(Kt*1YwXJXeS?$z30qhmt>2m2FiO#CjB;8bY@i`-YRRu-#0Yj5^`NNcM zchE?*9$}ECclbn=RAF96WZ!m>#I1n!H$HrB@-UH&C!QuF-sqk=>nfk7Uo8UvnFUpA z8-Sj-iU9m)LMCi~m}5unaXqsa`w${U#_6cDF|}mlUWtXxSK77%jSd=T6$B^hACDxiXSMZzBW8n4fAO&*Kibg{tHHIGDrrYyJgF-u6VLP{byL zFRYpP{sY1|<+n+%ThX|2(o_ywgscxk)DLc0+!(N)NO#|UW<2U{FWyhe{9Ea^)5 zuNi$s6CDlwZd##)VEr3#H9gYs@@9ZlCGoH|X?0j-@p#~umQ*T0q@m{r5XhEou>((B zP6ngw9vxtAuTlu?Aes!4)VrwngdBYqO)IO+xmIzk0{{RVQQc;hWo}Npu=Ez>^!xQ_ zsgCm@{*@Q+T{(NnbVkPfz+|K81!yv*@SmWxfCAx%H?}!#`y6({CgrgK%w8!auN4;l z$7McW*zBjv`yG`A>xf57_12I88$Dp%a-SejV)fT4?-Bpm-`BzpUhHhXAK2pqvszXY zmTm5_|D{?&;%vR)3UH42R3vG|PCN~9Uf5Okg?3Y-6N;Df93juUWO(QG2YI}qYpWKd zlCm_sNAhODy*G|*>jR~gt2d0j9V(5BXIcU|Y1-BKI`^%y9raVUr?G_|eO)Qw#i^G` z+KHr-san@FqKE@ko+kdSzyeOoS+78r61i_Ze z5kNbI`Y{fYtJeZDjb;rIty|bieIkG+89xL(jNC(!fSbQ&Fb$1-`eUM86lU~+KkBhj zvt3^Ls>CP*@{sd~#3RDvY3>Lz?By&baLvIvZFrK2nfm>Rg;bqA5>PRzAWrkUj*;|n zdPEg96SNCwM*vbpGXa!>u>kt=rYt`8m~|ZNrN@FlLIi{JyXB#Pfr(Lo#BI<5;^HRl zMpRTp9U68b&dVbi*wcPsFgMl(C-EtGpen7iVa0;|nvA`xzoN zYO3OY6Z`WZe>t7WN)g-7zILNa@3#xSy$VV7dp3N+8jGcusBZ*vZQ}NCn-}?6iz@Y+ ze42h*ddJ$hvbqcanN0|-X0=ar*XrEn*ddQr38Lf)_a91#{q3=yj$s^giBtz+JOUlV zwseUVj* zC?QcP5~d6=pm?D=yHM*nM~bj7@w=?TQ$x)}Syh}vvP$#YTnF8@mT$oWELudoOiAkI zbxrUKNlAqA7bZEOa=sHppZJPK;4e_B{=#VWmK!LncZmajWFP~v&`%!$E=KJqUX840qA#bWVl&^K1AkWP454d`RVdf_^>~_s zj$qqv`EvK2A^G*61%8&u$|sMG=EYnYA6Ems0f@MKjSmI#u2}i=o9q=C1nT@m%nmU) zijL{Kvltljb$sNnck+Vqj|8s5_#qwEw7wskd0)HHb7x*$yu2a&LjB__#436xUw;90 zz+l$QIJ9kRsH0>O56m$-R66`64E6CH98^)$_dIga%W!Y>)>JbkDKdHHXYD*bu?!9y ztuwYTaSfl4JYNN$x=s-aQrwt2=s2ot?F+C#$CZW#(s1uunWKl_Tc=0Jj@jyN;ag8~ z{531chIj_Nyik$u1QIzNFDDu+T)QVO)liy9o@4MAR#=lzAyMc(D*g>INQ`YlO6T~M zto19g(U(r$w`lVm-SsK`PX}7)UXN}-Vx@n>g?YBRb*EmE84Pypmfy?-p+#xmYo-o9 zZoThl&=l#s9L(&sH1OlQ6^H@=`dU2pv>DOD`XHJ72tdI^A*2;jK|BI~7>ALRwBY#b zjvnE`{*8TovvOjn2Y^O$e@+!xr<+p{75B3AjrJyiRSRYk7;i)9YW*bau{qiR!L#6| z(NITq{EZy5X}3P#|H$|&&$>M)P%8iV#oosh`c)T#2V*v z^rMN#QOKZr&TMPyO--`!g{kqO8z{Pv@t*9O2BhJe>JjtV0oZOoCHkx=(dY<)^vYit z;prNotO%p8CtoVF?p%Z3b)X-Dn`9wOY6~9u_SjjBwbwELzB!Byx_uEfQm?=N-oI@@ zenP7F&oL-%s2;S92E(?h*^nH3fivFP?vR8{@H{f7 z<{^7i93wI{HTG)V_2#?;jh|KmbYl+Sj2e_F>=hne>-sXg!*10Hh;h)jJ(LkVdUE(B zJ>xPvYfCHs0}-o5kC^J@@_WV}d7vtJyo4R8^7!~-!1NvOc6u|_orJ&}<>w-HWY0Qi z&HDm8g4dagXU5#QzWKLzXLHy*1gxG~-9g+@DtE6q4d1?kl8qS7&cD9qqSd7hi;5SxXRe5nR=1mvFy0R?~t z>g^A^d=W!iQ518{NmbXvsLYyAX!cjAv7Cx74FIMSdD6L%`QV3SyIwKKMniKlKU4O- zIyEEdgsl&(iP>YgPw3C0*#2AZ3fF6>)vaTwzjc+SWuu;bqDW;!pr)sM-nz`!>oq2Q z>RUMg*8lY&oa81^r{bk`htp@C6ADdfiI%^GF^IWaN}@%8_5cpqEMZnAsKT=;@goDi zNcPtL@bFDd%iRMs=D0P)7W*j=>?ABwXFprbYZ{KixTfn@KN*;R;rlr-D{fHp-vZbN zcCCtudcGPpMk(QJLdA;GjETJ%Dt@$5kEadddUtd@#o+y1_NpQR?dY%!sJ?lcbBGE_KE&3{sCq#J{$QP?$3wQ}LTJ)zT zkujph-?i{`Krt>@gF|w@gW})k$;b!7`nb!vI4FPt(EW0SqK?UsOyFeXu$om5*TMJ5 zq?L;~yugA);m=)i>Z0RwFa&fnwn>vEJtn*lm65}XL4UtTOuFXaVF%?9HEwCqklRlL z3b}?MVG9YGqjss)q7^$J>WW}+t|z$!kuR)xUe{g(&A2A%WN-M^32jDBKFOGD=~@-9 zdt9DYpX>k4uj?TLN}cV74HirQ7UH!|y}&oQ-@&=_)a&)z&-#Ef3SD&X$0FshPkuvz zS5&RVX)iriCD&d>w}4U977zQ(>Cv431V*XDqbN@u4d(3%a>g;R`=86oV=>QNj3CC< zR77Hlkpi<3O|!4*I0PoU!)e)rM+$p}{115GYSjc$r%?RYdRBS(a+H>ms#A^gPQ+G> zWf7e@@3@ z*Q4%z=+$qZ@ky&jZRopNXQVR_MG0rCJqIBXlC`=cMqhmS6D@fOP-K}RmCD9e`F*YZ z593vdv-?dJ4s7pvVg5rkb*~i|W0uVo2(+~3jHff#vt6*^LA;dyu5i{ulIHQ=@u)@u zLVJ}NC0o=` zwo((HC%5TqW`(MrIMSd+^2fQveZZg1&eqa;o^%+JVZ}&Q90$ohRy{-Xz~F4oLUUbt2rBW(B&9xpG}k***~D^IGT9XYBtHtJm=8 zhL0!w`1jAUc(ZhT=bz#kI_(`5{N&mPP;h*66bMai{PW<~2?bV$0-mN3xwp{Vb$9=J zAD6M;Rd#%ILmw6cw#bA-#wtGcZ!aJ)I~NM5eACn-qlZ~ny;=Lav~)_8Mvq`sO6Nt> zEwG=4Gg4FWt41*T&k6}(=)c|G*#|kEkt|62Vsw%RudEOM?Aj<90l~Jb0QadPnBjaB ziZWU9APhwDPxe}s%d~(V7HhU^k00M#>~OmYrT zusmm>!$!zjX{dRU91*>TST=oGNN;CGe&g@ik$921$z49#6LTn}T;%nTHnh`b6- zNjNR7yt}cH?_W9{;w%M5rtmLRgeC?!_JedhlyU;xxyUD|f&}?x9m~@^GEu;(%D2>e z5+Mcl2tb(PlfVFXh$IpN%R3nmjzV?75C8xGL$Ao&x6j4^p0slUFop$4fRlpAFFno6 zU8EzVLFAJ6>qU#Ol-AnP8WE|0xN@K*liu08RpA)Ej24U4p=%aQV1mMDf>uZbufNg- zEz{hHL;$-&BinbwAlIv}%J4-9c^m#wF>RYHWdrds^>oOO7(X1al8!~V1ThfbFAoR1 z2M1kfXyW6f1T#2llK_jUm=InjCzZ7vc4xP8W4y$soSk1x>33w@yEG(Pa7==^R4<8C zf-njD&);8E!*aXN7!?#ku_H$y%wfN32SR^%zqTtpS@GOes+@*uUKBEG%?lh!gKEiP z<5(l@IQ`dZ&ab?{8Ho$IA2_RslU3;w0ZltDv@EST9 z6`4g2?OWx{{syz_2}`(Ud|n+(Mo?ChpL@j_^8Zr6ic(P^fr9RL6oKxiy8 zPN>yE_{%_qERSD z8$!!f@ZL$i#znY&p>>Nd~uatqy6<_pXq;%si5GfBJ) z$GUF1^vj_wJ*Iq1uNOw6=aeRN%p?*3Y3vLuS5?s1LIPTeNAk)CRcIdN^@aElKf=l3 z5Ha)AFMDHTu&N*)y~Sb=#7_L&tqA&)C>U~SfirJ3FZ(?=iT^Ldh+=lJWg%#WMD-ok z;bUNn--+LTcopNHfQglx%E#1TC$E}&pDrY#N!{J$*pCR5Rb<+qehg5e zzR~(Y5&W4ZeF9ZF!kVN0mP<}t7@Il;2+(VfTL844Y&`C_q&Q2B=W*(uJt5!H*C-;A z0#L`d%6XZQt*7yi;O&UQ;K3WpLm*xZeWJg^JP30zj6)o6WexxU>TfFSK6{%#8MlN= zQyoP~`q*ji+gVEJaLoqT15!e@r$)AK~p$#J(jyG#{n3sx;s^JzUOz3!M3_AX}l}1uW=J|Q_ z;wiOmPYc05@UVRLh&TX}R!;Aw=KtWCaAZGXW6^7W1=ZNRJFZ*na}YUQmyOX$^5PB% z;Q8{AJ^M`F1h-VH{aN5h!Vn`f1!37iwLN6&G1ob{&Ih?-0nsJO&!)ct9DxCava}1` zFBM7Qx$8m)Qe@kgQH$@krAKPNhuc;;Mt0U#0|Uym7w5=FxMr_Xq3^PXzj{3@-aX@!?A*yK^S!;DfV&w*$0RL{vh(tM?s zUL5!Y{xNo@bCQ~m%ak)-gJ^$z>(qi}9^v^GN3M~Kx@Wn!y|Nw8G>)<@sWzpmqDp9-;4X7wfR7O zv;U$@!B5%jEriSp(Pb((PoLDZ<7sUTiX5@KQR1M%5wVxKsgE-OnX zm<-5;_n`V>N^&{u;SQfQhiPwH5zMHTj^?RkE>9%L5&k8=(`+r#7gMy%iaK>lJ)#K? zw)P*)lbuC51Xygj6w#4+Q4INe_e>W_SJLva@xQO#+k7vF3zpDZfcj=G`~lJT3A|>T z>|uZKUW(^PNv54svDwqrx5;L4g21qv*o|skK$8Jb4C(qmP!2v9mi2fqC1%xXc2&^! zmPu~AlMQYBe5C>@WZ<@jDO;;-h#N?{9oJ~?#3v9sA7)%8v22o`B{iaX0AE$i=;#G1 zy_M8bA;g5sek^;E?zqZDexl4%7TXbPTbi>m6;(*tcf{Gkt5*(T!rx3FA?$YDtfLX) zWB$>FvX6urd@gsgW#_&)Kj9t8%)gkAJ!z73!IC)L#L-P|iexIbAc{PR_yx~C*?@Vq zbur=vk?aPu>d_pT5v8twq>kQe2Q0!Lx)GXSkE*aYNdnrNRu} znwPhF*Hddwki^L-xnsq+G9;{M@oTFndAKQ#8xF9_pT`|?WM>8uyzk=8Hkq!bUm)tS z*biZ3K=%POtdZM9Rl7XHe;qj+<=M2QNkTl4ZgyO9YXtlzz(OqqI>Y6V(-Iu}t> zkdo9_QBjRt|26bhianU zmBo@v-f4S?+AuL@2%>L2a+@?LFcEQt*L_CRfP1)tt|bZK;-uZII5=AC(ab9q_d+Gi zmBv}4>+ls7qafCX(!HxJcK>gD0Kic-o1bPJjsbyu`SHf71_>#n<7&T`*P>hr(2#E5 zIjiEn5yFgr)BsyRq`&hy1e%5lV6c}%Bw@x_{iklr2G8ib<$NOgSnaMW3TO?Gc428c z$6Eg;@Lu7WiK?qfA7rS=(YfzNaw5flSD+|4<@ksP&&B*@NgdJ}ncVD1fs)L7SN}yX zpIH?XCFJikT)3j$uSO*2#-93+bO0KUu1v)%u`$-1b3(y=fh1%vcS-HFL_ozCt5&KP z1Y}myM!@KEFTs^Gm>&UxhOvvwgwx?5$rHba(TpJgPH&907`;)ft|Sc98ADhlLe|$i zC{)Wz$?cjU-q0#>(*@0T#lFgc-PS&4%EKGlK_?DOLSFhe-(8q=Ik2+I9IGXiS4~*r z$lDw9U^jKYr|E@Z>rsgv-zTO*1@&2{r4noa047j{`OY5!(`vB24efucp3BKe9538K zxN&4cbHv$-j=GGP6(R$4{)HAQ3)O0g%3GnpeU6XeBxkoQoJtNs`cmp~{@%L#>#k?E z6|;tLwgf~yRc=VE&;-Psm>=UO5}7kIA*LZ~Jy+Mz8q%d)o=+_QtjT2nBoHv|n3cbh zoGp%Pv!nF>#NH(j5-Kf2r0Fa*JM0qsFs$jR9uwBQkD%07&Tc`v!*jb(I)`1^@Z#a3 z!C3)k10mw{FD?};bE^6HJgY5h$QMYgJ$rXXMJE;WO}K;%mVqLz+RUL)LRByO&V;ur zFp~-fi(a59-yNJo8B3~$3Af)jNz9SEXJ7;G+k(CeWL^#w;Dd?_(^d zS%Wum!V+cbQB(l}-Wa!Js}uzeZr+ona(iO7Oba+{yB()-W)%h=1dhudDUYOrw$J|h zQAyz(tnfwG$hwX3r(ytCt2b8ru?#F{wcWf{*@vT%F^6y>-EQd|!I{{)9Ump_fAd=y zW_1DWt_1|&J=o_!F0AIGM3Q~%QuU326G#Hsga6CYrXl;<8Ul%(vkt9et~sa8x5^1% z00C_r821>Rz=x#Sk@Vh19T)^m8N+Q`EkzNe8;mqKBO@I<0EB0w$tG#LQ>-($ zrW=2NwP|F*>e?po7lAZnE#7^LBn*;8VeM(b}G0=ocVC7Bnb0=dZn*C5lM4$%@m=J$ZnRSjKso?FKVnlbh$00P?- z2mk{74uFphMF0QZ$>vpo)AW`&=p`Y8|Nmkya6jO$C zP-`*gyhdQFT4u?^uv;B{g)>{dO5=>nk#_>z(hzeumPrv(@WF8q&4L zyzSL%@g-9;!}&`$wj{|<12bmy1{ge8K=5w$z_=;NTk+xoYS_keh zo115+LERhA<||2Me&;@+r)pLyeJjX_Ple^d^e$HN$hNTc?N56pBJ1og_H5vp7X5P* zX+ndn^dchO41FkeRyW*&l{9k;=|{WmAjJ83b9NcNLqe>mw)-SW6W1PvL=r3}fM>!9 z#3}MdZFA>i(iaf8L8P$sAtgTu$66X7ocmxr1V?NK-#^#|wf+={JwZ8vy;hC;GTTHpFFK|)Dh6>UqQ}7Q|rzO@Yl1+4*(JjM*YT~$@0nj1o-9& z+>f=(t zaUmyI%8jU__^AHXVv+ERfow~o^ygeP0gzD?mfsiSAH~Z;!U^UC`cL)smj7SXZUu_> zCRcfHSmg>`q4wB@gexZsslhxh_~Pp)5S3F<)wP`{u@*@W>0RlAPJsXyedao%nwNqM z_3nBtakn)FGhhG!4AKR{O7r;&y_g!tXzWSwsBuP`jE5nwT^M9o$2t*shD)kOFEk{D zT(=5m+C)C6!N0>Z0nzQjQl0H699`hl#HL4CnwQ`+Vs66CUMu+I*)i0FIB9M2vHiZA zF7(2PGQT~lfg~aA56?7>94C!`P&BL z{ITH$%fG-Rt5L2ZDO%SNrmHrJn>iX)(<+`5H>&$V)URHwQKy`8glzZWkiIOKbA+FzJGidvuS@@#nf!&*b6r(Cz6RQ-MH6go(PU#Q8rH8@RMVBk=KEOdGOWVTlee$09 ziBMBw4AQ4l!xt;UjPXMdy3rBFQkB$v6WG-FLwuL6q*vz8t7kESvGrRb&P1{fRvP_% z3LSQqd8Jd)p&KovbI+ae*Y$A$L4KWnWh&Vxub$H(as@z=!G7?gCDAeM^|JA{pC%nb z&KJ{?oPkY&0GLH=L%Q|#Y_M53U3(lpHjnM!NX&9EiQZP+wlraOMJi0-^#$L4PKhyx zOaPs2yG(eXBb$PE$`K&**>swsHF`#NSP@YxiTHY40xU(Dt|0B;ic3i@i-(`$(z3O@ zxfyC+$qEn~0uHd*1{y=^FQ+Dsw1EJLd4PZFlKXPoCtuX8PN%qPL(H5olxGLlw%2mq zeu>F{xOLN|+zfc9)OWF26P8EqGQwx`b}&Zb)NSmGHA<#uH?(q7$eP7GE4~SDIU@&b zU0k~xw`u|~T^>LWa+&U|il)ISkf(g|LfBi%Y`m9^!K;jMfZOC_kNqPqXNxurSbB8w z&R^>p`B;1q&eBvxlDdZ@;-T!j4Dx#p>iOS{J#+e^UYoz8C$7BDql%768O>;d#mtTcYV zEa6j_;18IM*6_{m8v6L)#HM&t`h>WxmFD0u8IvE-dYDwIO5HQBj_Q(q(P^PGf-vv_TIef>(z?NBRgImJTYXG$21 z=I`hQ$VhtJDHCR}ow{KBMD5JcfoNR-!1ELZ=Vh9=k%DNpDCcR3fYKUEEi9rZ*NMAg z;E=OmymQ~@$Rl7YOP`Mc_Qv#QIIHdwCd+$#l8>TH!{tho_A56L0WnUFi76*$mg0!! zRaHv>s|K#(R;f=4MN<3MkZ>>{g(W zRisWeJ;St&$N?^r!yKpyx{3|!SQ+T>oo%?9GtAOKibY!XPuQLkJ^;0g> z(+p30thUuHWd8u$2#1^syePPrl>mV>fcHy%P%Ir|Ecl)}meP;rV@y5roJeIB?P&3{ z@ect#T!-R0^n~~M!5Le#5_rakT=C1<`E6v9anC{HgvJ0&F4K3Yz`CuJ5)0eqEX0TF zcXXRW_Xw#rThV1P0#=96RpMr_s*MWXi{uj+(!apbjZ=l{`FQm9Uzo9~4TCf&Rh3`) zXirDxsmsaD+1~!AqW@iiCVZI@70tEd`gzn?&5=jZ{t&Lip9xU5iijj8B)y?xaDXHJ zMJU(h)_5JKsOiNLq0$-yQZrw@lgVnt{n^sHn`}q`^-eX8D?Rq?_6A;=(40FnWV*_3 z0pWd4&Y#AjKo1`?yEI$u#;RVPXZAiZRUTjLCKXj(fv|SD+>-#~>!i(Ntue)ri1F7Q zkbW{}Z@WMjeBAWq7CueUhUlb$Sh51N)PYDjVu}(BXZjoAWJCzZ&y~(kdmmIjmFh~k z#d}g>Rh;7)!H2KLvkr1HJ?t;pw5FY{*~@u;BpCAkf81ur&`~_^z_L%ROugDS4?``^9 zm42?J8TA;OswI$FgX&F3*K?FH49QH?^}LaJ1<|BIwvuk3m5eGpmwE^q_D`#^ar~MG8N=+{9-Dqnm4zNuFe07rq6NH)!cDeV zv4lsz`XB%Rp&HEWbl^{8w)SiXjfkrH-~a#s02whqfP@<~L`z&|u6F+BW7XKyf!9Uw zv?;?I1e~eD`4t2PrJF7(HJ*ZRR(o8}C&`AE=-8yTN+vK+{>^lw%;jd9k@T1-Wn3gr z-YdK0iNh)U0tosOrGXzg6K|0bJK`DiWWtBK^6ELB|3Sowx0li|6RKQTdI8oY1fIcjwHNb00LhK~5&)Bdds5{xqYHX$R@} z8mLgJQ9HnV1z7#mA9&6ROrjU(%2$ALo7FDPJ0shv`}JQ}EITj8IgE`z^hV7ME(R(uZCLpWCmhUrZz|H zQft2X25G!)!wsZ0q_fLb+;TiQ#eRcr(NhM(=LE;@u6|4EdDE|~{zf0XC6t4u7rKu0 zzui`dpy!iTGW#8;A4q+nt93L{>Ya`=Ph8^EaDF0S?>->y(!*{o5PJ!fk~w)~q^|rr znb7R4;zu7&z?Yy5o)EPBI(bmK!Z`934oglouhBj=g&0efrndbpv9^UAcB0#0>APaU zGN>5`cmjAi-FG$xF!%ULvzaDY;Bm#yirxvcraOToBIDmH%a91ew(UNfOgMY@@=Al0G`K&RinXeSff~y3g1Zi1(ICe|b&utQn5hG5PKhS@Y}mYv0T=X-EzyaE>RZ9lJ}w*@w-=i2t8^}tJ5sOa&HkJIh}GHJnJ zC)O`)?%QRzSn@;IPFp)~?>?yQXymx!q+8MgaMfQM-M= zXeVJDa{X_s^nY9>ZA!vrQu>qHx22i$G4#2rlY7NiD+d?4qHQ+E+A|LCl-auF#fw5X zbm75*9Wf+?`79_TUl6qd5mbq)#V%fQq?#ueW+;mDCq<#o3c z8#bely&P1%3d`$tcJIq1I1zNHyK9NQGc90_{sbBu`U-wk#B>KV^xK^Z4aS40MnK#} zxZFVTmD`wW4`~whfVKtf0aaQVXdtrzMzc#cay`e;Tkso~kjg}Ry=Ecl5(;qw#o6o= zv(f>tm9&)l_S5JQxju$L(Y(ud*7mZk5d5r|w6(f@0|WvD>{$(pSXei3zH_Fd!a+|f ze1ugf89t1)KpsR+I5)mJ6uR*MJJ}J8B2+Dp2W9lCYOZSLiH`4b(77_B3TMc$cpsZEDPDGm_Dy!i`LRBK&Hg{rJCc1LFnS52T}8iukoHr4 z0pnd21{YVcEa)h$!F4dq?R}RI*xJJaEk+)H-rA9bw9d$hmC)@#fy^1YKlb8)jZSRr z{fV~N7?=?xfQ8gWlp%z+b0B~XuaZPU>s0UQ1ex1MpBN$ls7B>gOvG4VoNB`Jff4P^ zZN&=fFJ|N{F5eBu%tci)nxIb{CGSz#Vvj|?34i$}Q9C!b&+=GDvr)ym{Dm4mAY7e% zJ5MqFQVFG3DG5I*)>V8+q8TaMOP~-ZV#tqX_jYW?e+0s%K%G7c?0Lo^4xi~(MHeoc zWfu*r^*%m|2o4nbD|vQxPRf3mQ$TF8tmhCFdG=Dkj%LN^uSA#+i>X4D7z0CVWK?^W z|Lz0Zl%KLBqE)&r=qn@P2Mbg*;7ogn2n{Qx%n|!e&^7C2O(VSiO!OP?GHjNAfS6wO z#cz(Eq>AsX+26)8fOT7P;;H1XmfLcOKy9341;<}HzNcT4lK*V7$_B2m@mv$BXeh^> z7=}Mzd>wI0hHJ`6ZF$|rX#pWp4%X*Br|h?N;p~H6HSH<8MF|{zHPgcl(30hZx=zyL z!)775O5;-XDg}pFKO6Y-$bwRy3JoY}Jfh>RnaMPH)?v@TUSJVyqI22NOw%<}A7cf^ zVbPaX;d3%HX?i@bM$x%^X60G3S{R6O7>U3DFq%m8R|UeCU1tHX#afe!7RG9$=i67| zvnxl>wy(oxR*#=;Uxv)BA3oZ@4VhX#eYJiYGPHdAYWzTX!wu6r?~=mHPxOAj3R!!8 ztqP`P;+l`g1s>oCr1;*m1;+kWV~)WD_P8n%jEgGDG$S>K5>9f$3!wtX?05 zc9)Bt>QZl3hr-j=>9s3eB!}z;20>i$4#;tgq@7a{qV-+!ysN82!!NidW*Zt(+9_ub zi33-;>$?jo?yuY9I61u*%a&{4*R=>n>l+q3EoiPxJ_&D~;ZE@0Q*WZ1y-FIXRghxB zPGcoRamAIVe(2Ld!hVV>p5eLe!OCCGhpO^Zlh75T`ozjB9{c-@Iy09ykl&3#*v7`a zQ|=Y;7{);;QWp~TmVgU@OWE`!!rV#6nFD~B{s$l#UzB0KU&d!p7<%|D6ltq4Co4DZ zC?8KBRIlfntYy<8c*2XBlts~WZ1mZ%^VqpgVGcoAty5RTJ-PaT3 z7C;ECWo$QsQ_7GH`-K;x6?_!AAMwei)Gcy(mKv8SLKjUAaWaVWbL&(+3ER~F2m-Q; zEC|%h5?wCSfG7urj=Obh{r^z;;fFpDLzlNp0vA~|!3)<4`lhvH*xYhvUZ!3oo_P~y z!tLr!=&a*k!~rw6k$>P=oYa|A_ISu7T;_E>w~(draUw~mUNOwBA6b$=5HZLUG46!z zv-DBpDK7|o+ONni@T0bPB~PxC2N?bqL~*-BAKtHByj=|{drCzaTwoK3VQ)??yznjz zav&G{TQI|f3)$|0unUxd`@8eftXlz}fQ!)krKH;<%6`T{29DD9iZ$GcD`Z}f*HLYP zLYE*{70h2yh?O+9P7is}WJgPwC-S6$(rusu_GHM`AhJWkS0Y^U?8MjuSc{KDPWxC( zf9Rn3<{{ot>=x7S1|%>FS%sf5Ub(6jvb347cT5x`3dgVR_QLbxpV?~=L3Z6 z@^04R*~U^avrzaPiSFAmcttFo{W<+6>{qjX_Sum-X-{k;VbB&et)~a8cSu@LvyPR| zGMHwn3V2b+qrCtAizRtcVej>g?cQ(~)SaUvD)QiS8Xa-d%^#^5#CWtR=CJM5FCk_o zZ#~!;7g;go51}^!`Gj!qg3%H7$n2MxLRtouxX3D*NXcBsV9Tm&nsbB*4{}0DdxjY` zcHoJDkrx7^rnd;8py)J&4%Jfwj6PREFZwMSO5%97EHFr(e2Dgamu0WlE|q@G$ojHq z1fKqwJ`cc-T`lDR_*ZEoXk(bF-B&Xa_gi$yVC6hUgg7|(c#0?>tC#RmWGk{ zZLEBcdFg#8(oIgn>-O48w3Df>6P036YNF`ewavu41{DU+t`FiixqvnVGKy_cOC2m0 zh~}QLE3lLNAF(qU-RcCK!DkyHd=DG}ivrEYI0KERDEETACJu=SX;0RxaPwlXnFc?f zKcHX~$pCfi--1IJnx{m^=3_%goGR)ie#35FF?^nwrE_I)$dwrHgFpWD*hW6=NRgK~bZ4Dk zxPl3w0=bsM=6Mu(&Tvl}U7hFD40+lV4orvT+qGl1aRzuz4D)cUBr8J8&hx5f%jIB# zlLcJ8QYwET6)m!9pRM>|yIsG9m}>Er;)ynXS`hZD7hkc|_`E>^m#+Bg&vuQ_rPDY7 z2_eZBN92i7FXJdYrRr;Xz{*NwxYv$EqeP|J!w+Uo*S)BvWgNENim;0^85Efq@V*+? z<~b|B;YjoMJw%OAQNNeW!%9n#T+&P^2UJ?`7|e2AdHzWNs&0lVKAxtl=a)W3c;GZ+ ztF_{$SH6|u-8NJt9RH$y+Kqb@P)1)u*BnhR_{P|$b1 zwlx6x0ZPTx-2YPa3sNBI``UEEq*8*f%M4yYO^{t75!7m=IFeH{dfpiHPf2<1y0h17 zKipR=&4JG{qyi-D6uY{4fp&9JDVpr`H`KYB63)v*lK?mXk@@{wEMAnIZ&dhDh&UhDb zlHx(bgAh342~_2k5gzd@0@!iSO;D5sb$p<~&5hICmi_ZmXJk0GNTCNLQisLCH4^Yr zmYIQ=?`nO1tZp)sAfsjFe92b}qwOE~FO#0V_#v+FxHi2=oCNNR2CLxz!l;-l1^0D9_ zhG;ZRmnseg=Suz}4}Dl8)RUQBu<5WHxaN=%SZCUwLLH-DpwIu%KSVnQ+kcX z^Y!v|dG*w3cE0J7>H@pa6Ywd_iQ~e|N}`=j^0JZutt61SOBMFTJ$P z7gK~kt#=Gp;q(GDn3zW!U;i;0^760p`6uk&*#zM#28ex99Ow9xD+hF|=?Z=tbT$x6 z{>JE3waM;F^Tdh8z0MvTDXjPI{Z(_37sz-hK?2=as;35Theinb5WcRv7jk`tD+&RX zq{YscW-8@#s%m+M)mqwLx*`iRitfB8@bJ^gU5i&vBF$I#C9{d(@~v}Uxe9M zSXW2>G_L>q@>mbo*w=%sg(ih+A4EEq|4!MgWWyrWnBzCIN?=7js5b9yY6WbeVh})O zKjBwun#Ip0{;O;0(Orf}938;YJs;lIduN|IKk=n|a}Z(!y!ZPpi{Psukj1Rcv}eb4 zep3_gk`qaD6N{Xd4YgwJ8jYuJDE9HkvimT^TKdpx{7&XseCR45OUp$&w>F>@bPTdyL{`|>GU#~ zfe$gF>i@#RV!j1)04~|E{xGRc^fqZW%Im|Nzw$4w6_Si`DaUoR9OIS|o$s0s(< z@Q>y-2j&r@W#bExa;R=NYkp2oJ7|!j1B`|R&%i`usvi2M{eoE295FW)UX&*s(i6YI zTzR&s@I-TfOCRWpo(fGqgR|{-+QHJ|NiJ)lhlTROKbg>u5HJT=vZUPz#v|of7VLR+ z8`(}>)dK!QtU8!y2O8CGcd!aaS`_uL*7*lz23p9N^p);swCy@l7Gj?(!H96gsTh@CXQn`uyW-n6?{vjIR62t5Z1?2cGI2 z8uCs7Nw}XyPk5_A*obn*=B8u6)b{}nBlqpOwJU$P{Eg0q*%)*3CjfnAHk$W}Vk5XH znvj03bp6<5+Nv#59T0Dkm4VbjAo1-K;aGJM0v6ud&|q%Dg@H^a28S3jV&_ZTf$(wb zNA5NUt+crSIHr2p@Ry%#DN`4Ntz*JG2leBv#5C8cLikbZhPQQk&=TnDiu18zeB&4!DnAo8G(1C?otY>g+SDF(bO z5Emnwq34S<({u?t2z5-Fk0*L10i8KvqoWoMI9|70enyDDDIC#NuMm`sqo~>n3~m zV02x0mbv{Y-)npfsJ5hwnlT333OpPFp$RpC zj2XRcHqi!laMz7EvCR!mEvlLRyl8d}5^kxu1bYE*&5;|>XLZ@f zK=WI(AF1YN0af|@dCRK@>Sl|VUBQ2A8<3e@0&aK+8T{1VFJ7v95uIM5>52W=z-U>( zxB(uRMZ05g$GxTree0{({`Rb&zZRIH3tm+%B)Ten?nNdtKL5RhU5u~;+cO4C0CT*taLV(^vQQ{mw=l8j4`m9&=V8QUVj-vj!hzpn- zujTrC+d3t|ep4@eh@-J=JtSSh;0FmkUVEqfVpFcUJIGR}k?kK^+}Q2*gIK2tk$SLT zNO8BNFIcfd?P5UI0Lz<0f7h~B>q@}jb}#1rbDeo!bFjp0Yi^2?SDjbGzM>tevnOwK zje^^_XLL^c5M0i7u)v7Wn`H+nkpl=C7{tbDyqjXhNjEo{)*rfcRlqzln-36jz}SY6M{ zlC536%~)!{ue}A+Fc8y_IY96Y%i)^t>@^O~B=h8}OE(~gMW+eVYnY&kzhoF`nuP$q zzn#4KPE^|Z{Yqj!3XXsYTiZQ55JVKWA@x?(hI$+m-Ge9AJCS*KqXNPt8xmSGOVMXO zS@E{j{wgQfw{{U3G3kvwaLzE*U~8W1VD|aTzXrh*mQ9tU59);@?m?w){NHebR0sOY z3`29`zs!unm6NP4oapL1K?on`DJFNe$luF$_sj0Pr?c&?usKF94IjFbli;WJdz8#d z_K@cZgm@v;QCd_ZY)<|ridnomIMvBe!W-W6RzI$2Q%1qwGkRoL*{#7R`9oBLvhe|( zqJvRVE$z8Sbk}Lr(rU1ikyt0B)Lmo5qxEggnIBObuwSRwT_DqlVF17V{4qt|vLO_? zV^+Y7t`pZyVH)xMZI&$yQ=dCOVdl@>|)U6VEn38gTJd!j$C;rc=SacOlyt4bm)<8XJ8a z%*J1P0{rxDqmpz2y2$kzYN}Yl!5`Qzk8}qYla3%%RhMbCcNDjIuDc6~?Z0~{!|@;v zeh7rF);sEHs!~jKcKg4RohM9i{Fe3Pay`<~nF+e1keWwe;Qv5lC*lL4b+HAdj11de^Jh*%A99)O`#` zJq&@zfgTH6KT9n%wW%L00}KsN8{4a@hc5To^zDmDmPg11M~P%UYYuUCfP-&7XMVp{ z8wpS5y|xB;DK6i*A<^RsB76ew%_#qhd4}|a@@Z(^$a79JXmNdEMTPtg zv=!6uln(L5Wxva4huPkV02kl)*J8 zz4inv-u5vra%t(NIy^XI$_ld&u!vnW>ILG8S=p=&pzLEqv15zt{ZMLv58%wO75lMH z|NhE8v?d$se#d1viDMs;-3rxJsspS3@%||ndRK&*UmXb&?alS^?Nhl(Ry*Uly9@&N zWr|Lv+rHw+8ckKl0#O`lrj~486dt#ja{JyRLxS=oaX57q65i5s=K;Pc{gEcJYwMf_ z-PcW@CQcLO!Gz=Ho(hp;N;q_DG`nVLxwI0veHEkyNLO zl$=NawQy)RSiFC)^W!?8?B@m&WM^G+NH#~V_5(XrJgN`~u1GO3w-D2wgcg9E)kn@l!&)Jo zx*sY>&w%U1RN;zU#ct-aHIC|6{Ff4o=JL5aZy zwD+$xkSM!;1uSmp8#%CW1Riq6O#O9Hz*!IpY58c{pP&()FdA0WpL>dCt(^hH+wMsEM~&l(`1CowTN@R`mZJMoRGr0 z7_z|mW%W7LHh!6%uE32eEwOl1wqQ(e`Y|JMrMFjldnL+46Vh%hy~aiO>B1{A;i2Lm z^GHEz0hBHpRO{znhqfeOva23-NxPE+87aGQfd?>eS17>NIw3*V8H+7y@51 z;^zv%V2(~aQe3Imdmgi}#y7bcpwNV=Wpv(JsVca_X+rtMY<%Y(0Y1TVnVK22 zuIA6|j5^#9G-;!iM*vCHzvR@e&Psn8CEa5=$Rah9uJ})>8AGaatsb4q8qkj-Y9yk( zS-^wJSsVZk;on#(B~}R@WCI9@-9`;zUT(#tHLdWoh2?V8KknsQ65ce?31%2w4e$s> z4tvNGGW=G-6mTYFzm=Ds6$bpJ4ut|P1cb(}60uo^OX-5cYTr3YFX5$q6zWMgvH+7Ymg?F=KVG_eHkl`CLIJoc-q! z?r6MI)F%N4_T=NQ2D#kg87plGVu9VX-}?!l7pnkr)l^C_oY(@sQcJLng5|BJ zS%oUtyT1HeGQapII7!VeA&Okn^Aw(}GA_TZ2A-e3v`gG7<=U9`MFWY_ey5PC1F574 z!Ckb*6aHNNQpvGEV55!Z~6BKPw`0T0#6&Ky0s-=PKU@`zijHK zWQF31yc$`ehn95vez#9u@AWNX2wAGZ=Zoy+kQvmotTs z`hr8T&VZlnbQ|ZBRw9Ckm%g`*Kg2n~5mP=7gx!`YAV>r_gc^#K(NI!4viu6aLo*e)hAyUSFIXG%;{uu1eQ*pB7qHQ5cV-Bf55(m`v;3YBXXr z19^2BzVaSBf4Sz5w8h^ed##}f$`qbbkL(@yBkoyOZcIQFR1z*lks*mOb}Ok!AS6w; z^a`oV8PtPWcFk~eg(I}SQ@+q=5QEZOtBq+tU5x|b{Mnayt*N)#8<*0)f~FT-NjXhW zL1fW{9uaH4qn-|9^&t!2hVMxT3b8^o6O)8^N8+*RB^r}rHoyZglKZd-5ntG{nduo6 zajEm?!QWS}B00xq)&GsxZsCi{UlAF735#`;iA0OLDAx1uvv_HO8eCI2Fh{)sQAmANh`xq8{7zhRGE8*V&8lVrpP#mPv#HGDZ7x^Biq>3V?ugpm|7-wc(fpJHl zR0H^!p@pHIMS0I~JZ&G1ttP24rauiA0bLu`giPakwAk)D&F2{+dtgXnrvL=N|0W36^5p$9S3m$})R@{WG`KL; ztJ*=e%WF?Ph)B>d0o9QGhw_-&4G!%dhRiG9%{oW|ztMph*Y!{U07e3=001Exl3bq5{;0kvk=dM#1pf2KRVx}}ox*F?_3L5!KI2Vr^fGuHm$O`WmVRO_Zvzg9 zjzxpzp>b+$cd5tWi4%wG(lF`Ef;JX=1aUN{E&A(anreQ)3brOw26n3k>;6*FeeS(Q zB0cv>ywz*0jwFMKy-kBUmYpEz(`=V;Y0G;?4J#yoj~l@wu7xIZ6EO}hdJvyZx@ba< zcVPnVAv`SJ~dr1(g9Nv!;XR+Ywp3Wt)&1+J@eDf3-mrT0dwv$_^; z+Q$Ut<2RFEj}lL1@MHpb0<$oc2|UTtIb%hi*Ge{M`THWfP3^EB{1j~ zjnd69-eed_tvyHhNTTaK&_R8h8gcj z1|A5gYDf|;b*~5o_CH5oGsC}G#DpTqGjtNrnLne3L^_Y-1$t$j#a~q}awEtPJ%M$= z8;{5Vw3g+`!j?An-rX>(Ips$Q)qTjsC2^0A?~a)!RR~Z#^yo8(qQ>~=8EO;Ip^m>L zx#O=l1(8lU^4+)y<-6AKy={nAmbNy@cofZPE1i%)J+@T1$Vga`zx|b`@S z;%+1mc^dl3wGEam+002nZxyBEhfy%mV5zUNq)j{oVK(KtEN(A)GemQ@yc5xxrdokI zTruqGDZo-iefKu>KrM5R&rJD;+d=WX-#m3&nPZSX=*BQW6bu+kKQBgCjipOGKWTSc zI19A4#M+(X@Hr50k3Ak%vXdT{`#nrNqqWbyQ|Oe(98po68V4pYY5z1UyG{Y80CeKhJ74+&$xQ+4J+Xc^w1c@|9e7z4v^#U013xRj{z0X{@?-l&~+vW zxO{n1R?C(L{5~&_$3Kzo4-AAXt&~Svh`-egpalv;%Ff9r-wSR z7OpeBO;c4$fSbUqxN}?MO{0Cz+DJe+uMGHaL(-+o$w=6Dub#AqcO6YbH~h}Hrf#*9 zR%R%b^!pL&nnJSVcla0f*gJ*vdoyC=b+}OrE>n2ypS`Altw7k|c0+yM=ThYSGZ<6X z*^Gd`0CqlOLI1PhU;o67uVQ{yfR+{{7Iv35aS!9|v$#%*9)Iqy%Uy-H3;Vwy~oS6{d|edZbeNhyhj&#;4E0 zC9#AMs@H6bF$r^?e#8o0o&VXy2tPyYZ$w1^$4bwgw`HqtvTAey*p-!u1}YjvK$BeE z!C2dJb+Nieo5KD247LNFnl?X5mEXQD->H$;Di9E<|6Nwc)Aa-o{YCTkYXvyk=Hpsr zQ-U`P73ZAu9r*f6B{%z|U=+*WDF4SDAl<=XpZn%UQx*rNl|;Ho*8M$?4DVHrYW3M| zFp?_yP^xP|oqQ5PY2I&A;w$I;)Y z9>ujHQ&Gi@`rR`GHIs+aEo6KLZhlTExnO|2HW!Zurh}Q73;;i<7Dg!BqdUseQXigv zsO|s+F`;_G$c;=EYN2^vY@f`eX%_yLeD{q}5vp01^{ojUEH>121?FARqu$3P6PRn-`!1-}8)+s;8>8T$3@N zhFJw=2utygA@FClXT6g1Q;?hli#vunE&1F3QbGT*O8PD-!)yM1JmpQ!gh8MXbW^r) zGvY{<+VUc`C19g=AgIPml0^m6i4I;s+t!S2*mC@|o!9S-qz}1XT^CK8w{#0km#wi= z`%M7=5}BEtDnptnHEz6AL90b9X)r8)h`IoO<7a5z($kJb*2G?o?-n45n0&Mq3Ph>? zTDP`C+Dv$sZEPO_+rU1$IdxDWD;~!Uy70gM6i)eRKGF}_m)JbFt(b~m>|7pXqaAg- zMnN~6eZtzt4VT2W;5pFlX0Y3l1apF;YBQH0N6{R);$iUtw?PSK!;=8Co62YS#Z(Tm z{GKV30<73eLU%(r$H~I+7tu_O!d{VY!+tE(H#Xd0he27Y!+dyOnqI}2{2ttHsj>CX z9R|NO01$I@`+ev*VLx|Nt%X2K9c&j)dBn4je+{|^N-Xxyrs}iIUMO+f1Uxe z_Z{FShtUt@sK=sP=T2I6GyniBokOV1O^pCpILNkUb!?1?Cx`iBS)!^B1OnHN5Wc;>GYvL$ zeXA2o5AyRv<7wjBPXN1Y!&$5USK$Fh5sS&U%)j71jL-zBvJo2k@i^91EHrnAyy2hX zIn2gC_~nt_&X&MSwgWJtq1g9FiTQPIw)$yHa^`thZ!Dobe+Q+Hu3wSk?D1y04m%~Ljjt`McikIB44CR?wo81xPtbd9 z8Z^|@Fv#J0;_#*neaGnGT|pzds6)}jx3-5tim@^XotWiNu#-wd)~*krNx~zcwtSL! zir*(so*T-NRvyi@wQ`bxeopg&@A&d@$$3 zZ69i)7C|5XLA}-;U?b4rvuo1bWec(%$@3sb$dwSSo0&fM#b^r1zYwOhUVvdF{bfKJ znpvLX2zBPbD10&gfgS=Vw-&w7XO?=AD-xp;Sc()AiORJPc?uW*iznQ+Faplkxd3Xv zYCSS9;~y-VVHmcq(!5DNq*$-6GfJ#~-x*6H?=J#K3v1awJ3+pp` z6ELC*@<@kS9_c{X6+2l{W?%*M=>UTB=+V`jM}}0xupqD}V#H&#h7mP52Hp0vddXWn z-WeyvuYyPx+bZnPgVfq!N83s_sMkp1G&)T0ZcMl~b6^oF%fFVKyMZs*-sbX3sl)J{ zkfKMyMUWx9_|P;6*dTO8MHjaEi$Kx->sQmX_q&klg=i-hKT8$mA8HMbq>kK&=lo-H z{`E9nB#1ZW^2GYZCS)oP$ch1agiQODA-Q3!T8v=cMLw+052VoxAU_r5eSaKf;IF;E zC_E$KV+-Zgj1&rVzDTZg(kNKA^P6|3(&=I#H;WVS1s*S3^G8a;s#k&0V&$eo=~cKE ziAaQ2%!uH1^r#P)ulQGd*th9Srsr=5Oye_zNH zs-3CQeEzBcwi9OuFU_PLhT=;z0cTvBM|eiwZ;kYpHIxAdsZWeqYWnMsla zFtdeD`?}!%KRa>FXs;&Pq7oFOkA8=}U?6yJZMHGdA^ZMdp1lu_DVmqv5l+@=Rut#0 zY^D*5ju6@-kq3E@06@3R6Cs%417;{=pm!&O+^r}Ad$iMB@fvrX$N9>Gm!zU*8^Seh z5;&M`eo{2ESfYnaalq6p<&mdeHn=eHzJcN#+CRY7IFVu8DbWt5b-q@dNP~v+O5^N+B{t40&FNFb|H7zpa>A_7n zmxTe4Zu_rWe@(AcRMFxtrx**k1o{&~9MtQ%eazKrkpGX+11N0xLrZBp#uy-ZK+4IK zkux3!W9w%TG#{ zRY|nra~{c+V}zZ80aGkPwNfqja~i3WjT&akNIBbB?d@&xtF9jO(dk9jgDjC5L2hy? z9_QI#BEKc^%(8X9e{}!Wj|(@gvBk#&L@q_LR>-l2yx);jZK;8}h8zaJ004Nf|DrPs zydJDIE5^gaNJ>E})o1xv3YjULcqV9fCGm7@2@2z)+_Ol$h}e~-VgdpQ8Le?5rxIE} ziX8^k!Nqi}y^wh*cK9=cQ~aN&7#jJRHKVd?taTsyDodH91eH-tA$s*>lrX}P1G-sI zG*KeV_`kh`t{6NTHp6Xy65)Gu<`&=`9ecX$&%$b^L_nzwiElxwcBiKMD2XcxHb~_X zT$~gZ92u6B{do{EVt)Nh$n8|Y6jb-rR;N1uP;z2&NM>0$L9Muw0Z$;lQf73Fsv93z zkSaEeycxM8agS~->d3VYq8zpB=0_1gbh1>Wo?3CJVhmoBg^D74c?6c_X<6a8I{{chZm#*#DY5RwG zyC^bd`G;wIH(3C8@U5Zcx&o_p$j^h+lIn$zcm!hmNwfQ=Sz9?1k^CD`U1Ymn66>b? zTz7e`Sf~^Iml@#}axo#N7U}w@S4R_Nkf81xO?P`}Tnh^}|GBfeL^P1tRMUM2PS`z1 z`FdBU8uA#5jb3`~S+`uZC3Qke;QA3*{(OfBjGlY%zGJ##OBAL3(_O|hEh*?sIgYMx ztX@|XUb&#{kG-HgwOA+w0n%}hTp+3~Q9h~O&DT4B;;3!pE39NR!g?jWle*HqDxRi& zJwcD%oK}BIcaiq#g47m&S3eLnmN)e@ILf3BV~|ZHB@xhnb6N2DX!b7k|7yV?W4rJG zpd~#&*za(hj*y04tMl6%{X{V>RUH6WnV4;D`J(lICU?j%)m~=-Lue~M3?+|HH(WN*;$Z!-gdj=FmfBEcDkSS06Tw&Q?U8Q^&Z#EnRT zAz5eSi##UH{r(fDw_w8OFSGl_jJ$YroCfWci3jWz`wR(;SH2D)QC2~+0O_2-4czOr zU^t{L8;!es8V|%EN}Zv7Skiq^zrVm;-wjhxj)%1nB#V7EZ`~V(3l8UOF=$?^pLQ`< zP56Q+&hC?P@FV(?b-}i5(U@A^)|qku;-f_vR;P3@dV==GkPUG)E}IeZ^N)Z)a{2W{ zijA&zZ3hkjs;oXPDOrvmjE(sY$yN7yk-SDTa9nt{QSafVa z{_s)DvkW)H?)}i)l={84lH*0W7zY4aw)qQf!pVW(26lXPeOlsu1%bM%3n7mMBnSX+ zSD?R{#RUn7cWyZ6`S>U>#eA3vBgcmL+2W+QLEG7{` z?tw;e*3aDg=<-W7F54}&c4>E^BPEDhk5A8W^epVD(DP69a?&8ZSIC^5YS*Z_Bk_}F z_KB)c)kH>deD3u8xQ2Z}O@S%k2Up43dH{0kq9vQ9C4axr`}6cHNkQ~|tj66yhe7*lgo2m@W{lkm zN}K4U4xAbP%rV%Vyemh8z6tv|UqznkIU)DoiZdwJ^GZB6Am7B{QFu=AfG6R=L9E86 z9Wl&w3i{3b1?7cKv7H>5b0{hWg|^o7q8n;PsU;#&d2><`doOkJj9hD47LSP;logn+9Sbsmwr1fHW^Dgs~Cv%-94?#pjEqd+Qbb%bE<{!at4%TsVqg7 z(~3REa&KjYOPVvzno^@)Yt#pYCQPZLPgQHDT-!nynh9rs@=FT|&?hlP6*V-23e_iCp>~hb|vDTiw4j0OSVS2#EpBs^d`kt^}43=O(-{rx;0yw`B zT4?SLyEZ+WL(AWcc~HB6h$YIE0aF~0oA-2k{hw&}lcY<&RIrm}Gpj6l?RYXtV8M5u zwx53=1;Smnz+U2nhXa`cwqOV!hY^T?Es(~Mm<<@{KFYWnw! zVE$7Tx1E^VHpR?0^{o}a)JRGla;eENaJ8+Eu-7BBtUdTVc^F3PlcM+Xv~@5Z(RmO= z%vDwu@U5|M6GE4cB=OoEXotUnx0 z%)JI?uUq{ZWHYm36Q(>)99cbGkhZ~X6~k`)Y#BaO3@K$em4Kh%;~m+_TeMV)9;Sz~ zF8^N7O$F{=YJEn7w^9er$^DGlgb2lTEal^qKyDSB&#a#7Z~HvQ-nu-WlMqu7a0U(x z78mVSSQ-Q?G7?o%&>hmEoEwcR_uDw)Woty1mYUUS&iRRtf`zRtGjZ8;Q|1e>uUBSA zISa`8_5KR1ZR;YHE}l>wq(1gvGi@a@2CJ`!CkL*B-5<;KxMe!-@{(z;b|nJn(Y53m z6=`@mxJ-Jr4*&ze43i1W^@tPNNTxvb+<66=@UbHDK!qxt&R=ASrTz0nXRjeIt^5VJoMmz_l zkRm2dE}q8H80&(dP1tbI46N=Y_abXy>73BhDx)_iQ=8X6#5%Q z1O^#5;jdH3AxFYA6GNpuV@eELcMd%ZXY3e_pNLTj!`yfSmUg|&_kltnZRG>R1^k5B zVv8kJRsRi-l)*sV++a8i+-J2*lzuD3fA`Qo8D3%e;jAJ6bggW~+_Cs-I0>Kjosw!T zdvkeb$0y?WQB;e+0Ast!80Drcp~Hkk&X#H{+hPbpe^g`WN-ZM)^z^B$cZHF+QW>LO zrhE#~V&=}jCUkTd$)8WRyOy(r-Ku%4yy-46(S2p4Sjr6FXd_iU+WQBfsY1;dEcJ~x z&M;jCNnLVyAMzQj@CUwQT?m)l5zG}s*%BM1Cr_| zUBfMV7pAGTjM;s}BJ#|*o|{L7SEDgSP- zObRzuL|HO*hb-L(k$m|@zs_NXyZ7>O=ZZ}(IG-wSarI0<2-Sc~hvJCvBGQaHK|(+F zkAzj&yZL>BznIA!LV(|G4#5_dSqLwuKZ_Z*K7?g;3e*W+eKE!;oJjZR{@b5 zf~({Z#Szb%Agg1ZPO6x33%Q%346c=g~`t8<;g=4M(pIn90B4^TM^6z43>(cncERBs1? zZ)mvB9j1*oUh`=giU9;`6kxvr6{KML{L~gPzw9DuT6v&sA@!OC{ru@IX7_oGHGsK? z;V*dnPQSB502>#-z!a#p;Eou`ygu7h`c?4(S`5vM{$wDdA9K|fK~m@BihC8ikZZGa zJ;E%`N-`svp+-bRcln;imKnid&*i^S2rZa1Ti@|!6wXntU_R+@-ZMyrlf1Vo_NOkw zb_6dhMg1StvJ=H8+*)kmQF?yC zhgngf4d!&7u4su)J*}z;_Y5}@znM81=OrTqO66zG7#D2sxE^J;iA5$KG5VS<{L&g5S;U zt!;HNrur!~3xC^gsDa;^Xz=BbgwWMqU(%&V#KR#p+jc3&7@Acs_d79ZAzFeOh1)9BzBigTj?ag!s;_-eDM>7~H#wyh zg9^(!j@@jwrjf|Kpj6dAN)r96F~lJKxXem8uU@RN=H_$zw$4cTmz84xLk-ArQW$aw zKOk#)F}yt(RmPBQ%^^tc?xysvDv*LxjpQdaHOTQ*y`jY0wF)!$j^ za(ScIlFd7QE}1)Qxgg@m>z+RA%z)&3H;bs1khgH&eM)N<~jiCh}%8~W(f)QWd$fyeOk$W27Y4{ zgbZ%@4mU9|4x1sUnyFB1EnNmVeCRoN4)l*daP;x`Z=Wbm$#Hf?;BLGrB6%j3-Qm4} z4eHnN`1)BB>P<%DG2cHun*Utn-LnrP&>UEwGBD%daeG9|Z@^$yyTX#28g7l`+z z9R&;F!8LaL`$Y5fj^K^lLxlFLKK8E7Hy#G#60R`#r*=zrE;`36s8LKyBbRBlCJR{= zatFrw(mn;>I7_*jgt2>^YAqPWz6cX1%{#lAZKWA|S!0*?Ee!jT;(C4Y&q1tpXKkt4 zeN1xi?+1bO-*U?R#PW310*PvC#oL{Syzh}jM>X{rt-NxJ5-apq_EskWq%ah+fMZAR z4w>>!3vD18>#n%=zr&Ne{zBg`T%7#iSY>E990(3(LW4|No11KM;TR~J*5gM{i}yI= zx8}_|C-4V;U{9nv(+M@k8b8!Q|FEr!rpW!pP6u;WYG!=1RP-ijf!(?T!N|%B1YXh{ zufquo_sEW?4LFcXp*b{3D77b&kT>Z(U!yS zmNnkZ9fS$LgeF@QVSu#Oi*otzO?2r}0^alX>J{@_@#mI@F8wB49am*-NQqni@d7GC zgrPE5w#Ije;EXcA*vK&5WTBMr^T-Ee`yvv-xhsxIEs$uuXIEzj{}js*WbxEb6pC~r~S#) zN7blQrsCbcI>JbN8Qm52c89nxU4=G3O4)wmvm2)S*wsC3$teBMTO%jdVo){Fe@NBP z)^?NuS~Lz z=CG7J)1zq2t8uhi3xB*dwbi{<=>6LktHbO`*|>s(NkPUz;FXM#TCYJmH6-Tvsphtp z42p*N0rMQXVvIqtrYY;$+9KcoXxY`5FwH5U)RP~Jz7}feQ91Ixl@_Qrsq1F6>hmgz zLgRy(uv)<^UWIxcUIM(BH3YxQEWp0HRcKfj@a=STsh>?RC7+z|&UUhSTNNE`Ad*mK zIAHI&5`3PmK(;h+(X}$U>EaxCH^wtKyBHZ6M9J_l!lK0jV4IB9BDYY|Ihh$mX{=>X zOY0McPn9k&z`(RY*cFrGC=IE&lsrzN+|*gbW$r3q)F+!VHr=Ei0l<$qxh@}A%7%URdfw)12fXrsh|xa@9o`4 z!#@lxQ<}UiZOo&`5!lZ6l}=LWu~r zT~23Yflz5I=V<>LTQ^&8g{%*S|FELUS9Vld$#}Dn`c&5xi~^~uX)v}XhPWQ@i??Ys z+$Jo6%S&NG?z9Ylp5{1z>rA9lPb_d8?eqAMhGnVeae8yZm^8mp0fokvHVx5(ljzI>*m9eI9?rkzM49>dde!yy(G2A_jU+Xm$lHo--@FZjV@8_O+~8}(;Gs2RiFHc*9>?%128keOMq6%ih8drL+4>dN}I2F(yMUfh|`y+fPc}=t>SW@rQuBdqS z+QJcgcEF_I9q@rc7HaGD`B-m^0C-wCwQ_G%dg0cgD{E*`pi#NhQ7^h zNSPr!*!69b6d+(D^^I$`?D{3!X1Rq*d?Q?v%^3si(y61Vy>OmH-VNqFhgvG0$~S zD&onJXfw55Y{qop0ldm5Fwp;Zi-_MO1G0^4QmK=p;5h}*` zO;|Nep7jwIQ*jA4j^Y@z_KJ{NZ0ik2KV(j-jcxZn=-ql69bHQX*>rrlb7lA%rCsXu ziAZ4xs~fqsa_$&)hgZm~OWJIudo>$ZRd*|SyU*zF!kN5xp6&es;RnL$&H8Mxq^>Fy zuHZ=fZ5ijk`Esw9Jn2QmK8w;Fi(Ka`Oqxs995@NnuT!{<-^MAc4Xn$~Mf&>)AL$vB zd-QhPH$_C#l=kQP3p88J+3?~)1wtHoODqusAS%pIC2|!|m5Pto@5pg2ockhrVf4PX zE0~#n`AC3%TwfoRf^vW>LnGB(GX-Q(qoKmr3dwtYlRIxO)_eg17)pP()f{civXMDq zP*slU6_d-I;&PD;1sKAkIHcZ|_up**9@rY-aLieovw^2%@YIC+4UNoS^}wk;H&?jd z8JU?`e<194(%lGN;3n$v>kGS^SI-q&K@}C^byi%_gE4_SoroR5KP@fUQRy5Ub_kBh zUV>Pab?aA15>yWu5~4XHu%2uqn&NEO&Z^A>%;#3kkufq$b7Msl$!+acLeJo69$EmY zNSW@KnI@#~WD_o7h{J?SelS9ffA1}F*umS2!S=>|%_t83%H$Q6PqhK+2XOi`r#o~b z#QxO|Wq4crQf>%l;d#}w-fE`FJIBCZvGoHtK?@wE7lGjW5LLzQ*e?sH4bV;py9tvq z^Y{5=QrjtM?EyfWxeEc~WiUp|P^2oqRF+1~Z6NLvaN8+heGA)l>j@qI3ehCxemV*d$(m){^(VJmm$e^v49iTFREdVtNvY{wMH1#6Fq zV>d0|^O2w$m8p1uy)`OCI^euy$wSb%2MkTxuSTP_3s1|snTv`xIMK*_?{yENUEev z?Q3+nA8Hpqrn&QWt#9FBRG+3A`^wjil64olZOq`AdNNtJoi^>BMtFMpctSSzy}52P z6pA%`cM2y^QB}>wB6N-yjx(kPgL%XhGSJsNE2BVM!4rqx!i_d|zb(L(c3J@!2E0~a zrTChN$Z8S)WFz3#`rNSRtmjwFjLIQcJtNBw%X^+v&{**e?3`KwuJ0UZ#U%uoNO>EDxRhse3tM^;!uy_0pi`Ezg#2sR(K7sKNM1%hghR zngw@F?(;XU4yk{JsU!IC5-2tg!B7q!*mocQixuP+Athci`A669vLEM`8e<~>i@CNX zjPMG#oajJreVMrNj$`Fi z*F(jmT+0Fvz$>v5RD>%8rx03dvtP0Ih0ww;3lGxOv%qwF34|zR7A7{?`uy|<*k)Q| zRppj=qkB`On)fZ%VO{W{FeuktExo^!ZF^OBE^}q$M@*9PLKCal+yTH%FF)u;qN-k7 zkc={V3Ar-=Ggxa9khied8x;|Eh9lxMWyHb-=ai}22tlFhQ!};-Rh$wHgILOeZ&At7 zjHA??seBGcaWBt7PhSCq5WVLgeiWgS_dBOg48QmSz1fxFuT>(_9~(v{HmDR&$1&QP zZAx3^A<41oOZfh(T{5Py0zV+H_$VEW`Dy6!>JJd$<~Rvv)5OA%B_!#Qp7GXh$NhUs zYb46tFx%{y!ELIj8upZ}qym$sd@FlmzKG029c#!J`IWXIo?y@Tiwhxqn~H|S1KEPi z_rro1fO^e;Qh_30UG9}cD;DvaN?_O_(@_aeM6f-~u+!$f)NfaT7?j<>$}OAyc+^V# zNMEgKWV*u?6dnf%ZagOlPe+6;GT`rufJx$YQ*xvyA5!J^*`kDP>aN|e(IbM(5 z;`ek?#MgSF{%r!8L`!2tW;@V%OsQt-6&)2=?9zCR6t>Z#Xts5{5cJ@`)r+Rn;zcQu z!+n>$daWY*{htIly@rS0e4Rri5y+wRv{_f9@cQLij|#m>zIbiOBvZ}K$p=$^K+M4c zsYMgKpM(3&Y$t4klmBLk?@}H}Z{vH}Ed7|KqlK$gw{<%N-8A&S#Vlb1(~pJykeJwO z#=GJ71&Cb#el{@5P7Am|xYB4%RN^*y-S6Db((eNJ$fLypa-7>1-8Bu^2>YRHwp_+y zuMt6St3vnObDE2pg@I@Cmfpo{3EPEfgMR+&#r?iT+y{l7ftOIt)59lkh_ss-BKoli zd$6-kp=ymk(oARlodUlz?X>Ep7Q;}%LlB{BsKj<9XIX%5>sOR3pern>@wIn=&s7W{ zO(FZi`v6~J&&CrJ&$<0BgWiXIwO$_LBd`qom}gR;A{0S?WN01o&(r|ia!zn66H|4v z1W|P$+-xx9B;m!Jh8 z!y$eKr$&Og>m#ZIGdO{FstQ(_;e*4$sXWD;zP~pLtNDa3<{lL4Ri9@QIyj?bNd}P~ z#)u_51|qd&vCo!#IqD%-YOfUXC{0LOaxHDyLdFV>P5Y+-@P&}vCcXX_QCm2hSp7(@ z%MkX0&EsqlJ!4Xq23IPGm|w>)P+{<#kYb{={e0ux%E3QV;d+zI(`fW;7pbEE6yQ5K9Mh6;&XrRx=!E>@Hsb$B!v(VIBNJIa`j*Onx;IM%uMQ zluv2Ovkq>H%!QZoGn zrQO$hTvbT~ToHa8d;V4058(eor&nZ&)n{fCI0*^#1d%!b+;*P%2mq-|bRYLz^U1}_ zhGQ%&UaRLj+R?|jzVRANJOExK`0U)EK!X#(n+B!rHdJJ)j4@xt z^GK)i^wL(?Tv%LHE!iE=oUHT81Xgj=$%ywy3B%;e2mzS-O^;eo4pKxbcZhOm z7I3?G!)M9kHpb6iA7o{cA4}ZZfgQ>bHWSwsgEbmPmDwkf6i4karR%i_>hyda_sAR~ ztj}%m#>0t0L!gV-RVL73Ok|y`Ma3rfsek4%*TTvmT)K@5#E{#TTEt~=G?GuLD4e;a zTCX#90Aq@?^(%yW>1G|O*5mRwPHZ0QRDv`8e91nG6R#A+D5*^^ASAO<&?`4(n_iV_ zWyQltd#J`oOmFLcuL&}GEG>8Vwh^VTOv!Z&fls(RR+a_m;(ie1^yJ#P&&Ko0AVN~w zMkF|L?y31oFirS>Uw_M0;c$&38yW6~>vx!s=I8Y_blXn|7n-~P*S@}!lce#?b|m?( zt^OR*X8cHG#b@xvM+o$7A1{8AB*Q1dZ!4(&nJX*Ux8sXf^X;Lm7YE6w_=|eR#MRyH z_)}<J@=>6 zLkK|YtysQgXKmKfrLRW|@QkadPOS0BApFC?U`Uwn%nmU%{etTfYwqN}ziS<4yKgMe zPL|mOoFTMEBzR~xy`qUU6|Tf0*Gn;P!Ho0rec&K7TI9$klPBpDpEmH+1)YQvIVI83 zWkZ^>8vG4Bo3()*qV2ukPO!gS4gMi@pyJD}zc8*Bt(XMzQ?Jnw0y}226bp(ZvEnmA zH0n46kn1bcwzTse>e_>&%xna_gGYcQph2o@iNHvoTOW|V=py+{6h#J(p4hu$S7m*a z_}O?&j|S|z^S_n6s%bYJr0iM9{}e_{vNf^ogsmI?b)vTP)wN#!Yuzd`S#x-Ct%9K_ zO3sbC#{O7&TVe@xzwT`#3}|S9vA$Sq;;d zB@i)SVlH5KN=AL#HO z!+Tj~vo$aD)@SKR+cGZP-^@QRWaJWE^ zgf+iR4swVJQtoFmr3MsF8^jq7AS^p^I8^MGPvJmdugETcuf;Nw7UpV2YVDH z0T&yRhjWITgk_T&RBvIy`A^=zOSwQUy$0KZ@Gi|Pzo~aa(Gc6KEgl(7qcGAZ92gk5 z$zrV1uZ{=lnS|gS>34CYn0qX)aH;K*q;E!a9Lto&h4a8m{L)Uz$OW*dOc=h4_H=dSm>4(LuP8jX+w>k@HGRJKrVMFF^<1cm!-E zi7}C83L(<3Kls2+?S~4$0#aOKt4r0GH5ZxK)Y!MX%Req=a4p^G^2+FZB1?;(KRsIw zbmOx7!$++=AYzUIzr~$KmOxSL-Uo3Cn%-zbm|n*>iXRue>N=*J;2h;`$S?MpPs7;j z0(qhoPR4BUX*@8Y`7`E@9^re7j_|jLHuY_p1Nc7IVgIg#45@6yPQ+s$Dl)7d;MqN4 z+3}qfV;@t#Tv5~R-#3qP!js|eni?8zn9vfyqe%Z{+AzjqZn;6r@6$XgvE!n^l(a9$=DgiqAb5JviJQ!y$Elm7*Yxi-_mbiU6>CqawY z9D;~|Sf{_y^qM!mZ*#)Nx%5tk^te#DwpsyennT0vX6E!vT<>h~?9XC#5&6sCqsqkq=TfCHY7RkP#%r zj*BTmqfUk^aG<3rNBfl3wriJjAY_zwzkCPj(jUvRlkFRv*Tx!EiK%hQK}qc1act84 z_p$hx0X>5K!KYEHrEhy+?=SjVOt!9-{+-e+l`dbvcZlJaqhT)>^J2t^2@*Qj3r9Hz zU|Gkx%d1hL;yx;{@4;{YXHpB3nZK*}-4D_3RR23C0^a*F()STe`V6IH%fWs0_98Y7 zF3M&I%jV@Gl=!0S1nTN>&1mSk7_DqE;MC5<*FXQL(8QMEb)&`iS7;Gpt`0ODnSDlp z+S)pm*XoBCej)FdIVvQGOa9u~VXUP9gW z0&Do-IWI9?P?Vgj=c%VndL@v3%xVy*J`;&lb7nV~v|8*9V^#hdrB9%n;-c zRS|)zON2+Ju)YumtR3IeGKJFy&Kz>Yj=>~us4RKFM3*7wlhd%1#7uP99+hwg%lF(> z*}(Bgx1XTdF@6Iiw$CBq{g|+2mC(ol0Wq$6(J=Q_J=Nz6qpRGpyD#S6-W9wYJ3BkV zvv@Qz;6IgLc~tD9stUbvFI0HuH3z!hb+33&mOz5oh5^Ri;5bRVn>cri0c`VI%D~(K zLvUp1KcDY2rmlkz#|QJ77&&Sd78x$GGw{y6KDgmk|AVm(BZ-pqJdDdg?O`SF>J-$- z_k5rfaq5^B*xfE-?}ipx%Nx)%8;v3T4Xin934ci9;+&GYDdNwhnMo%iOqI)7>pRJ= z{6{Kt3c{X7UC`WN#?f8nLW2-OW=p*p=XL){Kd^70P^~s&1>W-{uIzH}EE3&&(p#&! z6Sbh7AYUJPyBSz)qoGy%$4b=q`3fEd@hM}7BqK0< z@u*^b@ZNQA#rwqjL*9m+!>UOcDr{1Dt}SIHAgT)A5|f`BIf-aCn#tK{aRUL{ zIOPoqIzu_G|JXcQPyNnUmrNglF$mpIkj^jhwJ!m@cfM$;HRj_h{qk*d6* zyX)_>d4S=(?Ow-$kK9mDRj%1E|J=r>`RMpKy13FdX0*Yv((rK9|5a79U)x>e&h+bD zr*dM0-DIPu;pK%54d#45ln(E>|K>xFdliT zU-|M1E#B(=rsP22>U`AYor4<;yUwN~4Z-|Ed~^*h;qJ?o*VFB)7vTBFQ^rdq;N|hO z{l^nv8gTyG@n^3G-rtV@a`OLs`qwP|ziT3RpK*UPl<`;d0PF+qeleEzDXeFkT!b=D z$@2C_Wb5usP<(J99|nDAx8>qOZ^Vz}y?s(^bof1rCsJK&Z-q+{LYqu&n_pBY$eOO) zq)C<5tJN8z!ceIF>4rcwHiF2`?J=ZMqkOKo0HCoh5vQCrs{VjaOk`LOQk{;OAMsma z4%iu^JPB(Za4E78s_^y8zR0KJ^PdDGi};tNY(LUaxyqmR)AvxB(Q8@{b8o2<&&GID zYi8|b``h`pkw9W6>|T5b$yr^T>8OVYP-{CK+HjsJCgqi9O7g+X%8s08|aHkbjMo z#&FRSDMj8Gr{btyU~f{YUIAcq@(Ftwcy6aD z4GIV1#+C8F;!o6~r6><^6@tN!y}G+q$RLdMSFNmriJ#1%O_PPCdWvXc>9w3#1$ zXQt+q&+%?Qni?+nWj6&CXvWIV>z+?wg~)?gTgR(Q zLhv}me`kZCJbwE=CdX9C_JB$@9hOkEs)WrIlpK<~fOAzMv>3|8483=K4#DwM-Ki6X z;>tNWRDb`fcH5r2uj3mjX2>RX-b{{$Gx)tb+I&H;T+?wkn(KhvCD!FfYbfL#Rbxf< zP?Pd3wtnzc3$l=A?-bPbW+aEj9O0GgalIOQ?6i&?@~amc?6iDnii`4KVOshdzMZ_e z*zXo$2-I^d;~HX!R=LaCqiJ$R_~#E_?LsKeFTC=7k5L~jvAKcOGPGF8$e^S#yZo~%m@@$-db=6o>Je06Gq@D1Mi{~ z7@t-4qYH~VU4c+*MbclrZ6S#JHv2A{3Enk+2}N}NdWHI$pb0Il0fA?5+M(4X!Hw3C zJZXN($(uysEyo9?vjantqRBl?eGm zJSP~RFctWT7ngJ4nLvv3o7ge0lOd@NZk&b&nuDg5wf*5vIi_NE*Lor_ZymeWVJ~2+ zGvo!YUBb*=M4x z0%qfh_KZX8x*K6hVRbp!CsKRSkuOfgKo@KHDDsyMF{4l;a(UYaD+Tn_X${qKy>DQ< z(-np&pVQ+9E@P19*D>q$#zD!oEM_>RkmV(~xPs&CU+k`IrKm+G9l>PhnWEj$6Z*BB z@*um}wmulL!=${94Y^P++JqBEvMFMWY;!HV)F)JqiP0?Zi#0vu^@C9~(xoro+J4P= zN##7+$8iI{CY;8m z5MbZjt5}CFnkq`VrHE-tEU;XZN4+c6lejeJTN7S>TNY%vxgLfsXQYNmTPrvkKIK9Q z#if3&{Q4TW%xRxf1px^LXa`~s86V?x-7qe40gavqBR9%OD7;iANjI9+keoL-YQw=x z=K&K%lny0zPBS?sE*g#>vCDnkd^Y@e7fVR`Or;)f5Uq2&Y#w0X0N(77A#*$KpU%M{0}TSMd$l=@pGojSJnTH?Z` z{I%NrK#C-X#nP9=jLfn(-Uli;iWj-?uPrZjY;O8%Bhy(^Nt$`4!JO=~A5?E_$ZQ~u z>Rt3XbsE{fTxtzWDp)%o2;jIR5AXnxv?6VKVA5LkMB)sn+!SqCX>(`=sQ*+N#-oKkN+?VcQ~MvrR5=ohQ(9Vfm# zI&T!9=0dudJ|GwF^k6DEV5iMsN=^xtd`+D3J&-78d4*26$7!k16d=-1EY&Bm5X;z$<@tLzoaKD z;^ke#wQjM0cm*Diw{1?E^UWn5b1yG8FLqK|TQ$cK^2t7@_`7AL1BczO=9e65;!627 zLMEcAW1dz_;$fQ*=^JiKqFoV;BI;=&xmn1>Wj4|vD}%7Cmj3vvoZ(8w=<;Ax?u>&= zpqBY6UvdLn&fy*x;e{`oLvU+{Q{*8%j%92B@ygY%iDW#2YqRndMgOu!h@8Ubba+K3 zp1hv4OP>|)WO3mW7ZHj$XOJQ!*OgX3CRwQ5J;kxFf_5PGqIwz5HX#$!CXKl}%ET(x zL2{Y9ZuK0+R7lP^F56wUQ{)0**OuYw_3RY!^npb#}gyBRgxO{UV?OD?g9Y^A|v zH=Z!8-tvt-_*}B9)Dw3~>SCI$JR_t)4atR8i)Ap@!ZVDLuVnEuvKlh;2GA`Y)mdyS zauVE4{!UTjfi@oMSb5W{_>nlaGhF>G-@Xa-lEtIP&21!Ekd2*p-eQDo(5&tBp3(?w z-Izu@J=-l%X^E1anL@UDX^Iw*`-QYv=ub+9aYwlnF%#cn|sups`xJ7QHz3L_grWjUwuuT#NGM-$hcfhU|k{)k!-i6-FuSW|y<R|tV_1+Ea= zcC7QI(-IAAiMFz_*E(I6r_BzXbfH}T!lgCu=J@qiAU?*W%mZ9(TIe9J|8+NyQ$(cq zPG6%qk~J-@U1r* zx&Qg>8gRNZs!%iG&LF2eTc5MLsOOU_f(6n_|AOn&dG3rwZ)|lqeZ>3Ia1JiYS}lqF zc4Oge5Th=PX~93J;>mV=~NjL5^u^*38CR7zyu11lm| zXg1cxEqT@rI$GRW?%qhQ)D;mU@#wtOet4j}(e#tpIYje#Zk_!;+{oo!+#DHQaePPf zgisQ4R24q8XGcmIS*mP ziugCO;uG=?_qNhDFZODDH~?Q=4)^$q8xw4<=061}?$3<4A&YB`DAZdPLAlS-<+(89 zT`5o6#J-nX6L0=bQ7mOaIK%Z-mNV~CIo@?VKrVhv!zFa(n6-&jW`2@Bl8kv=q8yw1 z85%y{_}qQTGipqOJOlOB7se!%D_Q@bT4$Cj;3}`K5XzA)wQd!ofM%npJMxvz^gFo# z>rja7$CsOlRyg2?U~}qeW4!V?ZPtX^Z>M)k*6`By6q`?}%Z z)f6|E;U2!BkkI0QalQ=+nF`Y4S=i15BWJ zp+To~Ok+^nG?qmFwAYtuvXk}xr4n3vkUJ&&%3$`>$yNk!m#mP@oil=a(TfpTn^qvt z%?>ZXnCzv6H_d)(Z-PZp16b?xgFYF~DsP^j#+JW_7hVW2 z&+z?c=d#D|&rZVU+q+*vK5CY14n9QEhHRYMr1nX(J@{kt0NlCoj+f@aV-LsoSVhn8 zRDA~2(!EUgHi608o*K(@5f>#ldU-%5oA zxKYw1@;wEip9>~E%O07CGp5(MVdXnO12^l43p#bnId9G=fk1z9^_~x9rAfD@N z-rT-m@-yt3!Au;sHAwd2$}Zb@uy^y+U&);K(dLLMecu5idalYX<3>ha;_G6m%4}zh zxd%&vq)L6r!`R*_1e5C}wKZV~i>d^R!cufj7e?sQZOeab1KfXbczj+YOp@hdCvXOz zEECWe@V?=|0wonO?apoPne`t>L|r`<2A8;4rWc!5yE{qz+IGqdxcTJpcw7;VeG3&B zLn_M2&UfSyTJj7b>He>@z|Q6;43X{^N^B8%0H51US&W zMv|X7sWlYPf`&kVV{>Y57tcDh?>nquDe(iiG!jMAuP30lqE=ugnDqU(&yVxq72jTW zG@FfxI&iU~|K^@c_5oc`up))@O%Nh!%LgAmNoSU~l;@utWZbn7MvkZ5Rx>23^Y5R( zMS5*I@d*O!u9NZmYs5fD-+bxV8MjlrZ#JaZ56wn{kdGDMTbS@^L-x+!>wvv|tRLC- z0Njtad$}am!2rGLfq2Pqz(8j(Z_|J~9cd7?$qrHFHiva=W$+364<%sxKJINrn* z-B>-L9Qmz(+@ZFg8EYs3;43aBFlFs)C1r>`bG?*3Cp`Aw@t*KvwDI1r-dLaLZ1IkH zxjd)dte&?gdTu|rKY2aUp6Jv8;Bi*~anG}t&3ih1Ui|>Z7uZT{Z7x9bS3+5y5>qo%Kv#Qt7qyBl)T>FaG z5Pdl-~Qcm-NPTi`Z5a;ebRZzcxgZIdhP3R;`K3lp>s?5`WgwqrEITT1pxNE z?m%invA=)n(~&GocBMEoE*jfBBQeiMB5gJ&Ho2U^E?P{m;Ee1@IgE9wRazTWNb6sd zz8>OQ`mO21HjWjtGo#|J%^jkLZ6r%b3wp6#;}b;NSJ4zrT` zPk2GB%jI?^Rs5J`oN#?u=gBTjOFEMa{?A_^?-4mCb@hd^iUgCRTISu@?S{D)IZVP( zlUSV1GUN58r6x64Ube!DN6yadSgnNHc&+==*STO>mz&5G6^=>rQ=Z97^Idgf?%gFG zE6qcpf|f_o(ULUN*xL-#`#QTag!Ic}T$b|BXeFUza&1qxL-%nD%QTkI1 zK_mYkdUg19V3WnGP)JC!iTs=NsTA5aZzxupm_O!iLiB`Rz>o|$ zU-b8{^%(OZpP6N~ke{BF7U6EaP|=YENn4tJ`9JnLNxq+Q?E)f8!ShDz3?Msf82$*{|M+%azm9RAsjEADdVw0StOs!nbV&P=#SR_*al7b z;$VNZ+sURlSYV;MpAGVV(VwZCaM0>(W=E&6`PbP18;YLqqyOIE|7rhxF0BAG<(4Wp zPMc|0_3_d6h+a=w$x%=+vJ4nprkYwjGrj!(A49-@fH8ct@NJ>AQ*23WeLDx!ho4o+ zh7etOVk}MYR*;lS(o9H?kGn!ezUH3$+OzAXW4iM;#4T|G_Eq-&}9RSx`5ZL_sP`ex`Su=TW+%Prjls}$0zt{KEGV<~Lca{+Ptsp7udoXk%g*$iky#8g! zQwNF51{r9F9~g4+=9LPh5pFrWj@SIViuS|LDy!FBl&25t$hXg*LLOflg*^b81Z{wS z+`tkgb;#AI- zZ!2mtz+YWr6shuC$e*X@KXH`Dz+%nD`9Jla3wky zU6|(fW6&m=Hyj3<*K2|JuitT&#S;JX;JRgx%V5H@IDfml{}C(CT}NaScz6xB*6df} zYc3N5LVfDm^A{5Ze{2A=yPqeuio>4IFm@%s&y2$!BaC`IAQcKn^xBpMbYU;p#pxsT zRS&%>cBUYKWHdJ80spQd=W?hnyp${t#S*K^Cn1KhN@$`S++J?Zd4BdP+0-R>Sm!xA zh*4b2S$C>;VFaHWAjcGXLRGg~dbW~DRA@qVg2R!+TdDcoX2Q?x)jiskSQOv#lC9sJ z{2g0KVRoujO~fZS=@CTrLo;SO{yHg`=KI4T%Xa@pVt(9{WrJ4_eCNcekXzh)QElk? zNbcJDQbT-00+|>r!H-4+ZZKq`{CA>Xu5;2Cs^^J}ud6(JO#9rhW;-6;GnEu0!-%~x z`SW%VO=w|_A_c+tcd>Qc5WTdC3t^)vDe;rN(L~`3xBJWxR0`eJmOkLGkTu@`kyGibcz2VX`?{)reZMSXDDe+_`HjoL zD1{3!@3^totkWLk;G(aiLL5kY=irvnJ9Qk-}%*%tBERbg=GN>4~q8vs@Vs;DDu;4TCbqS(} zl3zYIQN0!>dOA!{1ChF}1t8xp$|33Fg1LoW+vXT#kSFl(UK-q;AX)@h5Z({!ZIH zG(%hKzDz@6hJ!E151BMxAq0BT-(TqabyVkffAm-MIEwU?foL2c_Y*x1{r)$+vD|vs zJ^OFC6kf(V)`N>*>GZF=YYSrbCy>QT%1(n{F1R#4PZNe$Xt6lh_s0bVJ5osKs(Kf^ z?3}S~?hp||MnFvN@1byLwc>`PfxF&S2U}Vx3Mx8c%OD{mp#p}>@B87#X^6D@uVBFT z?ev=ioV}lzuiAvZ`5(c+7~55r7-kpylCpC~Kn_>i3xT*PE)`2k8Cr~Vqb~MJ!Fw7R zf`l7>>jBu40Qn^(L$3BLCFD+!iQNaU93T6YPX1N~*wbPPV<)YblL-Cc>XFm~tzbX< zOT5z26i{PvBS$132lWmx`kkXUWQaspiC@N4EGSG$5Xm`=z2hj9^SXuAn(3Uiu7Qw) zKu}J}LP7YK4KK}8kZ1%1Jt-e)gtYKzzDnn1r(#5%v5bbB@nJ7EURr3FS1X0jyT%${ z+oWchjlHql&^)b~5Z#Xxm}JVCMu*9pen)(J6PA$ziX)Q!t%Tq)D}?H6oIzhkKJ+!E zz=0a&Ag_D^=eCsYVYwv(K{3dns=PC4KTFsdZ1O}2l5M_?WqxJC@|b-UfDb>np)^l7 z{1e-Pyle0c5}2>KWw_1siHPgbB^fY+I4!&Jaa15|_?qW%L*oV#OQxFx)?WrxM{0~^ ziB=*%J1#Q;E9!rRS`OKYP!Lvps0reuz9MaP1{a%ltKA zog_St7^U_($s`Jp{KAaZ8y=xc0>VG{1g9yboikAalUM;YbKvp)U^Rac)Fp$bn@4c} z>^w^XB>tZG1vmedQT=Agk0Zg1_dka}7%QCHzlU$5EF|>(B%01Bs)O&SbYBTLwrbrU z9OP#|_FqDsWdZ%H8w4WLuy!bNz{1uJB9a_T>?)?Y@^rt|Nc1d9yXr1GG?6$l{rY3Cd4YWj>2DwM^&+b&>luRv%)t+8Xmj89he#imh0pXzuDt`*~@nlM&e}n@65&-O3p}e{G)N2X8gO)m8 z+TR&|=lSXW{`Us)iwv=>i`@IO$^50I{yOBew;!iUaUmgpLN;HA_&*pBvF+fQ$rV{& zE&i0c;^pzz(mrE>udFRe^(BFzYn?I2k`Ad@oSJGgKlZ}3+(8*?8aKi{SnQi9ft?&> z7W!}e|8gR~IRaNx9G7CYtDghoKk??-4y+H4mwP~HJaJ<#=gY^%8X(ny=bc#&HVWKPEsIVPn0V}u$ZN$07J0y26ZkdL_xsUtxS3HoC`9BWnXFUafJ7!K-nVk zv>IqKN_egssR%-7{}gZ9$38dL!J0ZpWDxL*(u!o85Iv24S#asihGMP515B^rh1>V z`hY$n-z8w8RjYnkhE}9)un55A=32*73WWqWshMHSPi6)|&#oL8tFA7U6~asKw$hrmdvCD6 zwMkJj;cV`Soo@13w-~L!Efr_Mm*&xXNi7eDWKz2h@6bgmRdxuK+6B!?f}~TE~3Ava|HVhpM6m!3sRe6LOx!~aX!L$W&Qwq zCx#GClOz*l2DZjMPGxEmKNA7p$mS$cb6P2b3q!(zEiLoGBt(>G<*1g9pE!?qnqa5m`Z)noy z3cbbyR*w0#VLOe00$HUsUI~dA0fa?-^C@Mc%7=NDuvPV!$c+b&y4rbXNi0)iJ3_Mysa)!NN|L8|v zD4D6_M_$N2NXmA!7W!G`f>7Q|aR;Ek6Q#7tIv1bXzC>FL;8X-UK+_iE*R_goM(vO_ zf}>$Ss+>9tSMehovxA}CooDYVJ>k&*EuAE)07K6@Pjav=j^Krghq3A%DKYVtDS3-| zQl=DQsr$WG$nzoj%BF8gt!hAo09M$IY?j?(mz;Y73me98mzJWO<^A4RA0{<#&(5yx za_p`D5T&I5so)cXX37Dd>;YbJ#;6U4f)LI(cxW+Q9ARf4HT$LREng6y1XAqhrsO=S2*SWe%W`SfL4UHZB4Fi~ipMO=Xquc^Pvos)N5)k>Ddl-zHqXQEnhll0 zrG;(^jrY@F+P^7F%yKWrugGr*I8`3U<6)03Fi0>WK(MA_G2bQ@u>)1inJJ!-+0IWX zqGbmmpDhAX)TJbG3r%W#_jD^)-%lADZTf3s_GXHAk2?=z>N1;DxP{|dUy2^_Pbu)~ zUaj_{{S5ai>~G9`u3x3O;-e{}D&%r^S(iJ-SGH>g_3kOBEBO37Wv9l){BzH1%IGJK zA8|>lL^N9Vo?YXO{^>@%hg*y;&|)Gaf>x*Rlh+{z?nAAm2l_{TGHH{&IAklq8jpmzB@A{2>e5N-zd36G8C#EO&s7 zG8VFTh?2Ohe`E2>gm0$@Cb`J=6$c*!TA9zl=Wu1EIbcfZ1ov>z|F&>u*^fB*0TVsS zt=?W;zQTO2(8eb20>pi_pl&H&XPWApvinEw?4h*Aiy{@?PAT7(Nf3Ej*?IjGTK^JB z{X`h^U@Gy@yUk49#GG>M_J*pUUxV3X&pug~l2HhjQA30x@n-Tdxg4DlcEKw|p zxF2qX%`1-M3*FxP0saGZ-%uaVn~$FPZz8)_P1aqz25|?x%Qx8D+k{5%f6VwUR5958 z6bJsMZ2noy=-hvw7jZ8D^U&O|e4>J_YA+O^%{dOo!{np|L*bB$*R}HYz{*N0xtX<6 zU~`Gm=eNM`*KOY$KvqVv2|e#<<%(t~NRS{JjOo!|0XrG+MbY?wND$!66T2A;CM=1h;k zf{bm|q3COE%;U3@jCsWD^HBZt5}cIVjoFil7))bTO4>Qae@0U-(Z72&pu0ufn^GI2 zmms2pn@jx;GK5aMf9+x@c%;@j7s&vyPE)O;?%bV_$of80RLtwG*yI~N;$S^TK^MLFq>qqu z+u2}-i0ayl4Q&k(5`GBV$dbQQlwdyxL6ghpM`r*$+;5VJ(x0GecvoYxitUnkc zFwhvLbILZl+BWjvWMGO{lg=p0tKtVGFzn*XYdk&Lnj|U}=r9HD`fvtN2j^D6goc1n z8wG@?--1o?kgXZ&8yz>|f`T{D$%(B^vPryiJ4FjllA7bCg5H6+uLSa z$BI{KM}l1`;$2I?glDbkR7zl@^kdgkW>df+U(oF?zpzji0jYG9$`pN82q6q#vWM97 z>9tbPSwfemA~RRy2|D3{E8r0!G>gH40`sj}P=7RlL5Y}nGG$&?5>p#AbtW~Bs_kU~ z7CTSDOceOYLRJX-=aLRQD>|O6laN`RZ&WYwA1R#P<~o%B!<{>(0iVr7KhTFIQ&@NB zHTZ>6WDgH4qf1S@-v0Keg71!7jr`&}tfzMjm$w{ChU5A%ei5)B6E^XeVd;TK2Yv#u z0S1WR`C}kRTLGYG(>RTex2$tMX%k`?pR)Pzb>wxODa>=k))aul%Zj*Y+?ohCBKv(` z4Aeh1#&EL;q3V^JeE<*Y^TvyDP_AVIwXk3;ZUilVFXOclQUJ9I{O652fGGuA=$2jg ziei6?>;6r32MURdyzml_nSL0m!|uEb;6$TxgU5;BGi@mNXzFzmaRAGue@@q7i} z>k{}$Gsre(KEH8)$7q1&ct>&_V$V;!UpHB2YM75J`ex@Er!o!=xcZY4e)=~Z|GVD2 zk}U$1G3)!{tDq|rb@Nyf6_#Sn4)_c2R*xHEaNWnBfIeAKwb%9mZ2YvriM3Z4n@+er znOK>JGN@OGB7YMxOp1%UY&fJmhoD8u-(lv(&<`QrU$M;@d}1e#AY~{3;!1dW|5zchr%BqQj`(o}c7*FQ-VSIqV?qNeK zrp;2yORNmP;1+g&)46X7Q4?9)7Q0=I%@ax)-f{uI^d-@9t(qCh;fVZ+h)COLzH!>7 z3_NF{n9bw5B*skn+}VW4?Aq_17QYFag(nIb+ZJJJFO^@f7j+O^5GzyYJ8nt}%(9U= zHNr51y(b|9v|UVsb(FiKvzC`PArVECY7c2D5M0nA*cQnq^1FxtAT|Y^$_e8w5Lg|$ z$4k7`53siprnEH+3YF(QXO+-9bB-Rmr?vTi!tCE|X8SskUP{zAYue2eA6^4OZ~VG9 z@l6Aj{KFliH1Irb1tdt6`x`5yA@@XBFXNnP<0`BwJ_VO&VBd$@D8kdGw?KR>Y6Vo^ z{nlGy?R?3Y&dhvkN!)Cqxd0Y?WXqxT!*F~U(6CSfLKZ#L6rcDE>?_mpqRX=^fVBCt zcE$SXi=Tc&vQdYUr<7v)^SB6^>;!5fXiNChn~E z&1u>Yu!d-l8k=E{;;e!GZn*NO6D-4(0Xy05vu_F>nT4uqVt!J0NeuTnn>YtZ3!`0d zs^=98tF{sfnu{+`$=h1-vso}^^J#2A-CPsHqPvLO38hEQ5Hh=jof zjs<6Vfb!;QTrK^DQ)2BAK$Fhsq6!r62Vt!aV#teiYo=`{wmBQ;A4!f~@6+GzQS2^( z+&4R0GTwfsFY3ZW1?Jy%4T`qZd&*RnJu2ZFg+mp)UTsr>o2*GPiz)n>HM|z6sMH&> zd*pO(?kC!%q%nydYQ6CO!zu+WB&8c)_s)PC-PJn?q)oB)Pp!xjCawt0J6MOpwCr9+ zujD7*@}(SS4Q&wD$_B2@W>7u{B1(EX?j9~UJC1zW8v--UQkvO6i-?=N#L1^4CG%;| zh)0kTw~kNTZ#siWcn^1tRP(3@c*)@DeO*)J#@NT;BOI7hrc*xdC8?s)2uA^+wYSC;zonT59W3(mLjFaaqoa4ORt^5}F%B%{!%8=( zHZPpULF-GV29-B0|B@Rdxd!I4t~nu)Vu|`2e0#2ODTqtuSydecjkmCWRURqWIM=@w zr&<5bb#^MC!j!y;R>{J`$A8^;f?)0@=Y1ApSWa^e`{{>Lwyjp56NsydnV+)9f0c*3 zG%ml1I#4~0#be#GT4_zeC8JANwfrdo^Bb{wO+V=|5LJ-1Ta%$zNd5Jk{Z8k82#NhW z`*|{P7r|b@tTu&~#sARt&%Z05v5QuINdKFh+>Z)TUZl^Mk+Cg>P`5$40$tVB+`pE` z4$cxW`Gv^+2h~18-pqp7jy5ZKD*v!rh!t-O+btjP<=APon9}R8;)Q%-o@X1V zZ0V}oY{W2IV4Oqd$UISpIYWRGoKY6KusQp_L*+!^TNdbJm()j@pA~^$ipz-k5I=Pz zf0Da;i!Usa4IPi!Y>W&)IP(}3z0jWNt9ee%yINXu+U2 z_ext9`c~~x^hw@|R`C$&JD~3USQkh`J4DU7?R2r%BbVNR2(B-GpCPIXG# zemL{Fh-t6xh^g&Wmz@~aA<1vD-*?sE%#9q_%4j#Ir)>#~#@_x9S>#_y>cmaRIYt`2 z6pMywT_i}RT*qJWwW6Nl_vWo{yZql4d7k8n6pZunV!99gOb7mbRkr>`r!T>p zJylI{g`1p26vO^huOR%fFa_TZaGA+2-ScLaQO2vZDOzr!c0WQe%w*NrLWmqjIYg;6 z;92}Xgw3@QhCo2iOIX*@V!^1!%uT*EH9#-`Z&UFQj9-0^PX5`>Isw5X2j9VQ#W#It-B#EpD2sv z*7%8*kS6rA1^Uf-9>d<5W?u0m^LSDsDV+OYoP z5Z~&3O{&sHY&J7pqvBP$84ZFhTbvN@9E*I5rI5Wky0!%z#0g{D0dkMG)gLY2+=)4l zmc9Of%YXR;O{?^S_+pj~eZe5ns=oPgM?kE{m94qLn{+$lP?Te$z% zD??xcMlQAue9z$+7w9bVCidcbroR7riW){}SomISh6d`4$ekm)NGD1olK}rS?@q-SlL~lv`(iZq(doNw0xzG?7!vmX> zwI~@=_0p;QQ;>Zm7rH@@!U(bL&I5Si_-F55TFcQ)TIm#$pW7Gm`%Oxo^RYXK*RS8@ zVFrtKUn#|wGptUlnRpx+H)&qD817J;VQ&@)!cv}|RwAi0_MlbfqPg$%J zWV~Ez+?(tkM^m<^Ggd5DX;NPW0_@w78}dVuVK9$z_g!S?`zfT@cUe|p zTuh7=wiK!iQ3q~leL&>L@bk2#AmS7VleV2nTVv9!LlS3%K;NcF9kvxn;u^@aICK7Jz&?(sxu(cDL(8WvR&B=_QrcyHm?)A z(x+Fc?rC|Zm)Xf*AW2>l?tB1pKy~<54f`+#u~zYE5VIg8L@bLfSrfGtUR5Yssb!bkGTXaz7dc)(Vfzc@WU4auJFKb^VWnmDBi7q~jb9dg?$4iItd*mMR zD0*7`O@)x8C@(pF3JUl8ZH75}yZ)x$^ecvdu%O{}-vUh8 z?zoA379wN5)S`yK1wrsQS`MRf;+ojcTj<+7lye6Ms?XT$9C@FP!#@e_9_>)!KOQ5xppitbn37c>dm)3I%JSsk_m$_i4>%sURI@HKFx{w1dOhm&p z`)g3f_IFG(*DX+vXXd2tx2fHEOIJE@Fz-Omjc0_8l!#5rWO-<8$^p2t!p^p!^)$buF^m5sr`l0!Bd+ zRS@<*q2uz&IJnZbgCr?Rp!pT?2RL*A4J55xE+URM=u>Acwu)RajyZflS0CQBew82R zTXKpEz3j`R(2#^%oH{uI;$x}{=#c3*fTmZ!xlv>pPnj;DsZJ#MK0ciDwcYw9!_SZ$ zrV8^JDCR-T{Y`?nv@dTcH?=HMGyKM55oRQWo*u)lsLiL3R4BWCJnoL}`22A3rUpst zVFqBo#b1Mb~&IK z=6zIH2@+VgSt^oV&W1Q~3+s2J?tk4?#x}z* z<>NUpkuSIwVNM$PjzC^rhS6#-9OLPH?m!6Dzc}WJ0h~(!Ovsnd6~=jYSUko8H+Kdf zNhEYV022Pq@`^m@aXXz?djY27vs3){WfiTb+~w_)i-m#stm_Z*p}Iy5f;wEt+@~Hs z9nrId^lkK<0`M*JBI%Yh-Ip!-HW^*>f`uTyV44&1H7zGA8rNL$WLOSkEcRY06-)G>M%pJu1jwAg-Q*fR`)kw1R&25I4-O+CXS?g9RxS-%_+E_@ zsSe6?)Kaz5>(lf6OeqJjN&I9eP&(IE=n@$=%LVc2*R_jR zNKL`s`csv~2^tn)Y6e+l0ttOqi5Ng}4{1!^OBM0zv{;HggDwHI!NZ)`m@*VF`({chWZ>)qTxu+>C9MrPYdY> zI%C>DD|Zz^ok~1IFMqSsdxMV^j~s{KY%V>x@h&MaZB)Pnyo!iu&7V4AneHGK+=&a; z4D{MST^OQF(N)z0j#xmIBfl92cc{@uE!Cx*A`Q!jHOe!$0WazjnHxq&DAkbq4Me0C zfhsI<<=&iY@fZg*>satZlagEo#IXPB0>9`v0d^<%!4>k9-O92DrijqN3IlWde#%7? zO{Jlw(dGNTY*nAC=a@QZzk(DUIT9QihQT=4CYe?|JE5g0&bn-;bET9FOp$LcC)iQG zJ)ncBpCv?r(jml03y;9p&xE|rUNM@};RK_l;mj?G+Xmtae_x*_PC|L$WcSPiVa4i@3Nt7`8bAMwy! zztFA_zokbft6X21_yD_1)Xx$^_gSDmG#elHHilwgLeBAIdoOA&nX`+1A?o!K=ux+T z)R7Y*Zd2a!j568sj7mzP@!@fz6#=}JPs88rFwtz2#^&4C9jskGI5Q#jBkpkPMd~AC zcyN%xwlL@-V1nntU{lyZ9eW=(qjQHA4l&B}a#l_Sq>miZONt)JhB27v+^3WVnM+;u z_^2i;muu1;mytdbUWW(^Iv2OKx5kiGWoieL@V?s=v`O;t-6gT-xzDUIoaVluSyYH5 zBEs8NTU%ejGZ%9c7-XFXky4!|GL>NRl8--?sU3kqZqxLI57?@A*^|A`bN+t-UO=J0 z0o6*g<|DXXN4TF*$DttxhzF#lOT>d3zBlNO;h;l?hCj=`RyK*$t(3(WX2F{FiLqt8j~%1N{pE0^_i-90yRs8q!h}I&e4c zxaLC}ze!L6^!|_5OTl3!>Em-sBbiC%ECNHjQzK&k2FTO`xo8b35<9Cp&+TqHa936P z5>u=v$P^t5-QM6;_(lt+n?cRFQWq!Bh%l}uprG7#Dm=9eO_9JJ=dq)7bG)MvUo?8* ztv2{bV2lni<%`1TLl(I(D_T*O_uq`PbP&jBc}G#n!N@HyG55jt$40J54N5_|G zS1svtqW~Sj<^z>%loA98fT3LFU7i!(nXku?aDICC}xm9FY>G3y`yVXy-C_Ge-uU@ z#DlYvPgF`B3Mu%pYf}&$krnuF7c*79eV0!fXNCK5i0D#rS=Ng)yO>1v;4j_*<$BE? zCt>L0GxyRG0XhSqUbb8Aj~t;k#dcmLtMMyZe~L+cq%p3E%86x{0K@X!u3BANDT^~i zTeN=?Ser`I8r3jvZh1Cbvmg4X!LbUp!{28Y_GdcMSdbPdc#l-@qPoO_iI`FfS>-a} z&?nS4C{pzA!2ynb7k1h~Q^ITBC!b;vSSHYIp*&_FZo*(9hrS76a`e?sg=ss*zk0i-zSWFVLJGp{loGS==3}~fDo|9`Qnk#|C$N&I5 zweA|5*ht%kQ{j5%%PE`y*dlQV{?JiS(RWfQSYMJ)Lo3qTb>B;X$gYTLSczi>=!$`g zn+`=eXTy=g97~n&oFPB4Zfl-qyVwWo4?ZJkC>>9=z$*(wR}*Z|*DgP3V~O}_izZ=Y z;T!>3`~?;^a4MnI)Pr`53acPe&Y}xZ)wXo^N3g)<=Fu_>XSRJbL0LtwSN-uW zHT_!7vIHnIE84!^p6@CuPqzaqW(|-{Bn#&Vy8r!UOXeF>X*4n)E3OR21W9Rjlp?5$ zrQuBILdV!liIT{-PD2_%qQp#T3guAhWum51>^sx(R!B`T+mIDyfJ53JbDg~XJIant z*iX*zdn?p0w1RqenjUbQ-bXj<{UFQ0jHDP4*4$y94n}44d&2G0^ztQ-%_5V8eQ$*xH`{Gjo1ZuSZ;gW#ms*Q;TeQna28+i9S zX6u;w`zUzN3EjSoTp}pwweWf+7$cp8FB@6P4q z^t|gL3$SLhZ+fu!>9K0`Z{bnKh=us&JK@(?-tmQ@aDB~OZ9dNVsLAp;;FLujym=ll z0d^35I7JaevDBgTUGC?Y6;TN_Fiv89KfSi|aTaeyoo(^b7$t3OLk-=%i1iFHzcPHG z4P)WP8x&jp(tj?k9WM zMkOa-H}9ixtA6U^W;0_rQS6xLRtd%9i9iOi#i6B)`{;5O;%1mj)X0gmZ!pX0DZM z6y^;pH;^t-;PqMgCuybca^VE*G$qFXGzhyQoJ|YlD;04I>u+=YExa(29@ zqf}ae6^@R_`UN7?UkTC-b;RC9_}DE0OJ+F%gwdbO$1hm%hO6G+;X8msJHz&jYbZep zSDeR&{Pw@&kcC;rd##J(W-6b$0W&DM_H5+T-&!oOg>1Pi=$O(67adQ zkAsEa?u$#xpUW?DSo`o)UU5TJ0I8Hab(F$DWb7T=n5jK2m`(o5rmQbcfiZwt%Gy#*J1^X-k*@&msSx>RsbLquboqY9T{I{h4) zKOTmm@`_=W%ZYraTJyF`l=AvFzt`xWTl2xZ*cwwfiajS|T=HMJUA@CAn zj{oFANwOIeVILSE3xDQCi;hT$I^)B$n*jl{AvsvVo4d7Ff$54ZrTPzQdwf3P&QZo& zy=3G5640rueof9U8_zF+e0MS~g|}n9GC?n{1n{otW8A!_jOB{z!@;|+3@I1FQz~CG z7gb?sBq{9++Sf3uq(oTiF>wMFhvDe{BSF_Wdo%v6@m6T}m3cj?Ooof*2xSbVSlv)m zUima3MnGgaAmJ4vU{|dmy8w6zPmvUnPzWd}001xb?ixc94oj_9jw_!den$L_`5W># zBUfUJP?q;z?sI8G_}8{V`d3 zytGx~_AQIS2pwCSQZM%BG@B8Q#HeYg%WL*U>*?ZvX@j}k`SE2#2*R-6dJzN z(m%AU?2aS4BCaPF3YUw6$<#mviK;J$7rqqVCA64n4+@PK{t?u)X$`S>;excQ4;ARp8a&;hu@R+p8lRoRZ*;% zy`(3O?{MB%Ul$n0h$?kXJ*_YCUP5R%b>9s+ymKjyE@Ry)p@C_`=y^-rdCpdrst8b+r*jBDf4Km+{4rrR${}~z^OKtvSKN|1*IDO~1l?lfuHUp#bcmTq#UGnq>zdZcs4G>eN3Zgy08f8d4h~;4D`14vSWLL=kqLEdO+3Pg zX1wEggAf7QtQAKdChoA}+gnZTlgR5P$HklCj&52r{PXL_y?t4H07XYw)m*|r3s5Yzgy5WZiZMs#J`J7iB ziZ%i|YkIn9ACc(UrcYZhzlv;a6^sL)3Sd{De!yX|&W=u{c;IBG#vqTb3Kd$ZJCt1o zsz$C}hE3bIG;@dpz(ybWeL2YX7slv|fop(vZGL9_D68N=j3$!huUtD4Xe*`8sk3^O z-b-RB+jQ>8vgWCFzOLO{%e%T617ivv=LM*vjCAhj=Ch_KWs&KRj7NUiQwx$#i|uAB zwWJ49Y6862rxVp~J?fEtm%foGT+gfy-@PsjnacE@$6YF=EWta#&SOS`54`S98}0MUP?s&ZlDjXPQsfCcx8oJYxzW> z2ak24mi8RaC7T1ur4#&_h zWeA8s000009$NPeYc4hf8VLx)zI}Ko5!ljiEA-P*pC+#rstS5r#VH}b93BaAg%hZ4miQe~8rN|7 z^eW8A$qr`HwbdnXg9vVrt85IwqPL5XYQP@2kSG4$bqNi$3!{ml*}g%Tl*qn>{Lfv3 zF!u@A6V*5Ev41+McadJzdpya1k&)8BCyT>gxW<=gSVfi`pc)f9+yXA`GT?_z*EQUS z1*f#1K4Y7fsNG6D7ng`i6pAQUxpm&jF>B*nsJSOUL+sFYZg5ARlm=j9f(Z~ zb*%)rl}c%6W}y3>D0{cYme?A;c8Z(3?~Y*kY~FM8>Xow(Wiy)R5DVd53!XsaY*=Hv}kO^O2Rd~8J`a=i!(Bchf{;kbGLQiu<~ z{$%5B9&^kx_a}(W3kEy=8`9@*r1#tN<21PfXye;n4n8>^d10E>wDQP&p%86tO_(Ag zTR-)Df#TqtW}TXRf{!~m^Tz)glVsjsvx8nltvbpSOw>nD=Ewbl49q@e0n@coUQAY6 zNQCVUl|O-XKRL?sxZ##-PTWFbiE#Ca`Ga|9-ZEedXL7Cjjc9Og7kCScFPy)m57jrE zvH;l0#Z_V`S8S8kIa7t~VL2F0t2hIM&);v`q?KFj^rb*wMy4La)1XF&DYT_%jbM<8 zta@B$Qz{^04>M;u+h<*^&yN#r7cFh*gazB;i;G#9shsg0Drk3zbNpE62`;5rax;A!HsDw6VUb+{Z|2Jwg8ekQ<1Ms66 zAI+{9J_Z!?CGnYFo!Fin=*bE)Hdg+(7(FBywHJyJq${E{7^jJ6cAn9A-Ij%knk9U7 zKO#N=P!5$I^-O4bXAc-Rz*1U7}xV#!Vv&0DHdwZ>C>nd*l9@?9nupkA*Tgn-Kb<`ukM6pXOVkdhN%X+lQJQ&GY+J{*zGJHT*=s zj)FLZ^a*opdN@P6smIalx{)OEd`%x4HP3y$AD1RX&||lI#zTk&_&8f`uV10f|2{jM z4$zR4C#NiyE0v)O=qLknce`dJH85qC$mp#`M5s!>+>R3ogx4zmv04GSwgFV2Yi|ty ztGTaObMINI%;NQ5zGux+k-u*fCfncK)g$mSp{X?%*W7rQxau+>H;?K5=W1m_jX3kG z`X!Q&KG3LS4)!_-!91#-_x23)Xty2EYUAQ(NEg}bx^!;cBl)lLI>T*~N}5nT_~T#q z<}Ps~nk?yTO)_O6rnY*Xe1`r-*)t@XUAvycv-sK{2UPz+Kl*Z>7safbN}(bbRgZ+% zs+T6Fu9WC+J>aAzQlwKZH-I%8*FiM-Gtc_%6#~$AVU;};5eR0Of5cP+Ykr>|Yt14B z<>rGgZo_DV&IaHe-MHhKQ`0D~edLLf+VSAw^u{W8g7&%>k?->*LZqK|bBR+A)1=TkLfEhiNEB6&)9wyx~dkRXQdNNZ|ok^(Q-r2M%mIN^by1x9ui%}Bz*)T%j?Vi3O>s%ZS zwfZz)!Z9rqwewNB6-$=P4ivSK%~3wR`r8)u1=_K=vGht1#se0lFyJO@y0R!tOEF?x zW!>dILK&4?gZ>$T)#dqvIp|=JsGe(3s7SL`%l{yNCO~jn&%X>!w?lNI=#Jo_gaH5$CGo=9gQkP|Ug1-@vZ!p|`pRAeWKLfh11^W|FMVvyP1ze`A z?c`eo4mXmJj~mor@thI_e8~_mK7qMRU02)Vgc{7@Nrqs{3oHgQ`VSrhO@dpjRVVjzXLXj-a$R!!80v2sGxYgD+>P3phc4&HsQ{^S zEs5BL9xX@3pIu!8aYu$Fmg4rj8PeFp4=e*B=^SU66Wru8Tb{UE zG(NY3x#d;+*BLMqj5fkvlm8nhpLoo0s9!TRyo&d-ABU$nCufI~*E5;)n=KV4L+pH88vUdY@gs05FxvcCuq5?1 z+uz(a#JM@5R*Ri7xEPGKaxIF)cXiz{Dj#1cxQt5P&eFZm$InJGKZNbLQXdxR+c7b| z`}E7{0USN!ZHP_7#Erni`dZWH1zuSMc2}z1$-+8j{HPZ5c5jf%Qu)1sh@5&0xL@vm zIp7j)qJjNgs5CR@H-jUH8s$G_Zmz@<5Q7TI1={_L)<2j^?Ey0u(LM;>g4y%nb^CiZ zSVDf0*+02t2G+2eDE_ZAsgpCFR0NI@ z`tPJbkGU^O+y2un5a^zFya1+=BO507Wuk0{zh>wgLH2hM?+G$%K-X~;^4OiFPO2JPds&EH&%!o}9{zo~kO&TNwKN4rCQ0z+Cc5X=}x`@xGDck5Cec!TP%g zy$s-R!*INU)y0pugqBsGKAB4s&$JV;U&Gw-AC+dmrhICsuNgaQw())P8&IC3lY-1- zD_{0~fL{J)eSx{&wT`MLw1F@~bG5m8U`@%iASkRq@z8oDj>vd(lLd2Z`bi3L!6Xd; z05di28rx6kK}t9mEJ-{NKU`mSXz~ZTa{d%zwh$ZBT)|l<+Lj+G$E;x>HQfW(Dk2Hs zq$mSu{70FZwOec6(Z?bxP@Smx*$g-{E!qtHmAh$!f`mXfiid9TdwcwS#2X}kl;UC~ zoP*1X>WbuZa+kq_68$JY;!Q?g*+C<@k0A!7OSpln&akg?r=%-tBG4_J0I$(NfDfTx zMU8NL&!bh8TttEBn)&hQE$K>$AqNb9c9Xs89U*oVL5d2XO+UBIL!>UktTy33y$ApR z3Z@>U!V~%sKtccj0000Pn)eNDr}Q9)K+99F(Nl$uIoYwDo10QE^`X=HuOcluxtWr9 z7XkEwhT5*H9vKmNOc$5_4IRVHF>S(mwjNrNJ7Q|#^(VC)`=a@goO}QP00FtLaML1x zLJHx+o{e9snyF??xKL zO0ED3Ve(v2L?r>}S*AhL2(TPxS>}oBLv+ArNdp~|GtqsO#0ATSmsA!uf_yTA;+zO@ z10H6+2q5$uCFT#L##p2^u<`{x7VX-@!BpG8`J$XN%TCmIeaGUe)nreQM6*D}EEA}9 zD|uW`IWi7GoWsQS40~nV9HOk(4|UvE!sO<76r7>l8)Qrsxa_(ELE%TVW?vd=a&m*N zrgf!#1`PI9{m;-S=~;KDq`>J`$3BzQB8hH&f?XE$JTLVAw$~SjO?g@I2v{2&=i&}< z7~D>)2clEpMIHQTHYFrF?7ty`zSbp8bl|h58n%~7y~(Wete`i*=BFV$nN9u25m)5c z`2;2ThuYg>ZqQX3s@fysM4EB9qGxHK_`=GHb#J2^tlCO~s*w1V59^I>McvnqmvVxd zi=|jAM+E7z8y4^TY&zHJ>E^6anbt&iS_#|QAzgNWQ;nrAa|BdJE{W5=@N*q3ybAW> z7wQU}MFa(6dd4zp)jjjfUnz4GRZ#QEJGQx;__LT5_BA37)*!HXsJZ;pAw-x?&nZd$ z+rIjK??rMl`UL@_eNsw5=a#xdFqpvJCQISsX}p+qS2PonXqH-*YkB27>(f{Ea4oP_ zLsrt-8)(#?m>RoFV2(@O95r?V|*l^COs!oAm?~ybML=U0Dig3A^oWO6JA#@au;U}My7;i z-5Q{Bq*0;PIr&a5{`;lIk252lB_HwiIWo>efGRJCrHw>;kHm&$J#MlL`FC3E<6sF1#Qn%69F``Zys)>ngl|Qm# z0me6;b?w~y9*=56bkp_rl{9?9i@>n}6EcNs956!gQK|wicGibxUKW%8)4cdJA_vnu z91=9c-A^DoGQuAHY_m5+9U{f!p-)DFUu+~t!Z0^=B<)@D)mgcqGwl3SRwDYv>%RVY)>`s9KD^_v}8-IVq0->!w|z@tWz{n(>x`0O@JO z14fqu!i5I2z53SM%Av}M2!ir^6rRkZy4&Z zRLXqS4F6Swr{8s>bf1U2Oq>7!00C^n)SC+b!3L>9ESF6|&y=aX3{dLX2051qb~${? zk?GHh$(bZcRE1n!m;}yWQdkj2RG$y%T{J9ooD&`N8OeTwS)NOaDi#F8lRXxap!%?X zq0Mb#syOmidk`Vu>kFPkT5x+FQ>jdNQyaUZ?N80&ZL-=#UgjZaE_Wp)suxYWAGZdb z;S2cK_#p%&99!-FwX8WWr3Ag0G8PJ#K%T7911bL?-(JEfEhWfZhw)(j6H-*fj6Hvf z{sf3%UDlY8L19Yn&+AM~b5_KJ4mswoD466_pzB>-VpQI+0Q8#fTF^L)30XOa8iaEv zEIY_r_F9h1m1Pdi*6xtX$L+FO;kG2n-id5JLVym;yhzY)RN-Dh_3 zsZ-JsIo5Xwru8A9?($$5<55+2Sn$XlTgh<($+O81qai3?N#mCUe7I42TV5HyP5lCXm*o2%g< zfe4jx4UtfeUlo@%!i?XA15rt?e?$w_kg?ajgW3^6O1n4}!t<)cm;~mDeTMMP4wACi z?$GjA(j4b_G{UlxQ{3X2Eg}}RB-=mh#{GpcVH4poYHUzzB;|uLl9ENd*r#|~y6Fel zwW&*_|8@+*NDF2`iJ++5+^zeSx2>*%3amHTd+Zqck?5aH^SVI9aaCTKH7jj7PDgsy8!Z5X?9S(|aJ11eK^mbr*ODgZf@x@C8Vc3@T?k&Ns-+5i*SumGrjwcowo2n!CkTUqb2 z8m)dNk68Ljrxxo^4F~ZLAu95-^;+@=%=+*boBGyxPr0?I*`g=4@anZyN8|iz>0~)G z>MNcu*dEdaf*ZiLU5r|?x6Y9~t8p<;kk{EFTQtA&u3YmcJVveNPl;@8zuE0009sUg52@{)7hZ$MJ+#jn zdI_>eUQv8zYngdpS*>-1Uehuw} z6eFBV;@3QhhU=slx2$gukEIu?P1!?Clusb& zPsOW~+C!4p<%CkTse?x*DcxPr3@+0aZe9mvB}jI^w5Q{`jE*LUl~`QX3OJ<&q>cqp z6E^`N-xK%4e#IV~gN~6zL5s6RBbLekA`)_>AeJZEl>yh_pS`~AlY~VJU1oXQ9hF(E zh9&I>A)4>NjFZuM>BT)o7TBr}L;wIC8utxtr}QAD93YhdxWXj{Ms%ZR=foS2^j0TU zFC&mZkUoJDu-czO?(1S{P*TUSOnw+YOoiLG%VKs#j8olx6FK7*`*h;K5+ z96KGb1m>CTS@JVjnxLca-HVvXWx+sToW0vY%c(>xX23`aQ!a2R<|M_IM-akgl8>># zhz$Q*!|Of$7*mlVvq{I#+pYlR=m?eNoQ|DNm+%@^lJK^rOVmgbBzk#TiKDR^q=zkA z5GL?>mzJIy#DH#{`wMGq%l}B8H#i=dt#B5)j#*PjRm;rWioRq)2A@MNtT*fpJ{S@8 zBaMeLKx1Ns!zaTj@{#?Ocj=jJ&UyzzeHpNj%?@?#{PS6b=&uhbT@%A{O}A$57njh8 zB|J(w&9s^&eNH|^fL-(J#P75iQsPR4-ze!gnem}!{>IKv1Zmt)+S%n>l!Et(KgU8QtITq?aC-94<0m-zlO@$j|>8>zBi8VdTK3v_P4AxywDm zB2IGiF7jggdWdmL6Z!$tJ8kWV)nn6wd=#L8%&eA(nw$`iT;nAd;UeVzKdHioc+?#e zq;5;+KBD8)ELQw|oZqlcks(^)1$kZ}9%C>#28cCEWzXZ>#{Kt>44RXuf<)otolsp{ zrX`)Iu)+plbGhBEq4E*zg!P^S4z! zq$_mRAv(~vR$YrTt{C7jU?dRTrqHh8P;^Dt5|YFbNW5L7Xt56Sr?sY@G;sXdqLLMV zlzM9uHV>Ow4iG|$*EZLH$XsxQLW9Ls(RqWIgRS>I6~`onB8)eqPn}d-%~&kCXnC!G z#iG>CFgbP;x@+I4y;@r^p2J;CtqXad_HTBo9im3z4h&YgS;mFu;Z~Y%?Ym@F-{5A& zCw!&KjCP1b%6Ozy1nTnWK6JVf*o5k3(S$#GK9m&P^)gD+*x@g6Klv&qC;NjDa?N_5 zK6=SbpBIL$akR55gxKgE|1&W6rZ>|e?$)09!l=Bo`+*+A#Lcn-B|k`fHR}UUi1t7c z#j_v4nev1!(c-Bm8gBR(y`2C?{jJ05d?a%n_I3Q3aSc`hw@TO%t;Sy7}N-%S(Z5R-Z(@06Y%78KZbRDMco5-!78SW zG{bwN@vDiqzvQgm#He?U(MI@Ti`XEVaL=6xt)_ullHEqOxK%AVW{Eg%Dcqn%nZh(B zo+q~(8dz#dM2!6sB6&TF6#o|A-5wu*dN<@r?zBCVTO;(6=Ue=hiG>chCr+2-ps zEo_*_ZUOjF8V-qzVflZiy@YmF&$F&PA@eZYcg`Q)nk_e4nch z!%oz_I7JHJNcmt__dfZyPhofp1XMlpcSX%W)r8MIUiejEFu{8elowkUI%<99Wxnjy@4cM2ZH+i9{+ z8NHN(Yipho`v)ZU2%;Q07nL+~5|*YajnVLxR1TyOZWJ`aYG)HLutRvhbw7${FJjFC zu^>)Q+$p*Z(7alDA_L_Q>p;8i44sq}eGFl<U&;I2~TrMAk_ldJbvq2F{c5Ja_ylJB9MdHXeH|U9AE_Ze#)@S6<-W)(NF-}W9uQu zcox`ewhc2YNC2-U!=sxVz_8PHiODQ8d576_T#_jhhBgg(Y)E5Zf&j!+CIm@7c5Qb! zoa&UzuIC5N>C8U}*SS&ye!3z0<1`@hwQJmYSN5k~Kl8Y37f~P>Tp(E4>`;n0Tu=iS z7pof^8Olp_@w68@=Rw-^K56kO9p2C~xExQdx+0!tchk-;TKBN8Xj4z+8_w`aYt&FqGy-Z$bQ)&A5x9D@h*y$TP(W z+#zrqy6x&^VrUa)4C?($juYyLGuLlbj;3Z4iYGd-Lt=IX6#o{m{EI~+ z^9}1Na*s|r;JG_mcO5=*USboIE~HQxh4r*p$4!}DC07KSRkNT0jtFXsley?c_((y1PzcrVuM)#Du; zs6+0{0{HF8qM&2G2{7HJs8alhT25hkx#nYgb(>EH8RsMcnF5~YhqY>>=p`MGa1CgZ zsc(_E1Hd%Ha1az-obq+*6hw}9UK~JzA{sbmpfZh|bOZJ5;v83EN^BsYUd7tJ03pBU zJ^N-{{?6_quNYnhobD^LH!oqhv$t>OZwYmgl4YuFvUn>``j{Pz1_V z8sJ(Saq(}`np=a?rf4015$PafR@dsbq}O97SHz_HSun96a(6>()fsY2vz8iKV(j$o z%)syQS0^LjL{C}(7g2h7T!%0N0t!g!iLk!z_fwcrpnL-ddXB(aFv%>|V+6+CBB9qw zgd`nSqP>#yGSw-|9k&(&3vJio54}XajXa9EHA3k&Yj=M{1ZK3$6pw9`0Xeph&I;P* z&F`WUOBQS7CbH+4o+#B$Osdqo{|#bW+GfL_W;o{s$|5+_BG>@B?lhTEpWqWWP>S#iAf>|1`F~4%9+kRy>niX?7 zbP&75NlyO4B_fm^+pLQX6LyF1qmMBVqmpkRoa+IU)ne3x4|`=C+GX!b{rNjVcyz^X z@JKcxQq&7>Q@6X;-gwa0Yu1h4$$_$0?%(w}{-uSTYEf=K?f)5+zau}e%ZY55#k-s0 zNn~D8!DPcv*wBTLR6ohfTFw;Qy*m+hR>b+qSGRLY`+k4SoDFdp12M!Tli$+RxU+N4 z%*mueEi!cb(0V6Kj?VYBrq<$rj~yS3CboO%9@J`(?7~nI@AZ@>IS(WvN}np}O@73q z0(At8gkxd9DSN!*xOs9&n^wiz8@S z93;NZn83J0h0>}9w9O_9KXrGY^Oe*xJ;^}bqE6s;B;kg9dP6Jg5*#jyfK(O4Z6t_q z%^d2nM(JQ&b5-8--FwO)_k4<$G^X_m-lc59(6jIyU8s_GET?|b(6r{ijM>EMx>z}9 zCu}`6ciRrZiGrq^xmqGx>>_<^Rz=D5MXlQ87FjlfJYiWirsf)^O08;~9(cM zs7K*5pHpB^s%n9)Ztbmgp6MJk{Ww1e*Mx=4$nV{o;(sg*@=&lj37!%3)o5=dSsR!e zIOHU03YpUWi>2U1yWzRcXovRJy&1vt(RJ7Rq4|qO`;T`9nry*j;YG#CNb^;U`R?D@ z;|%Fhxvu3bBgS;@4qymX3YHIUo1@JwUoB5SWrC7TkXAO5X6@G=pO2U*H4y05ndE0F z=g2i1hJUJUVMcO^Mc05qErj@F;8V>c!a{#cEKUP4sM}{dfQ!+XF9=AeA2Fp;UTZOu z=(_SOx;gnFfhlT{b&Z+dcJzSu&ms>YLP0iX^Lq|*VmdCkws#_g6ODOPAwL04AmbQW z(wA{&u~fn}QWR=F*tL+hR9cf;KUxp0*+l%a+CCwU9Lb-kZ9b}oq;Bzdk`P2zOoi=y z?xFRcxUp;f)TirGsz8EKciwo;JTAwKGZ;tLzowa{-a@1-%_%UuI`fvdA&<6{YgNa= zr2boI+9RVl8E8KR;ufXphKl+&EG5{NOEnL=1_EMvIFi(0IPK`Z4Gzwp0A?zZtsUHR zI+}8WgmkCth!=Zv+%a5H8o8JXogCbC-{^9U6$}#pHP=Kk5XT`cl}W#pz!;4V{Z+LS z5}6`}R9jUiR8u$eZ`b==VT=X`yAR6+PHYdKFi`LR6dWUVtAyJHjooT#^MPQ*_JZ)`A}eSa2M-eLK}h24DFC4VdQ zevUr>XFUl_HsNN0W27pQ7t?fId=S7J;*gp!U^`PTQ{V%tb~(}AW{BG5n)^ai@6!E~ zyYrxO5rBTdM`7vu1<+5zLf-+9!y%v;iPpt`oRm3%N!Cd6t6Rx-L|ss|9$4OP!$V|2 zc-{b;3m&FjuJ6DVifrV_=CZU=3~lpfYQfPgPxlHFyq7R;=o|#`;uyHU6NRbx5o+@E zIvdUXJpMib;>y|-id%^JCBAl5*r@Q4*ts-Pw-ALOz$ZJSXvTitG7|R5Cq6__$(GOK zDR}>@RFT4KjT`wun%A+Z?Ji1N82fQ2Sk#uO3UWZ92DXnQ;pQ63tv(;eq&!Xf@SYnS zZ71(#M@8*?lYgmnl3{pGawVURIVHhwY3as!0$Y`~8^%-R;7?~_niLgKkng149LJLt zzOnW*KNq5BaJ5p9G2Ap)^B!zp(CG5zbI{Ic>6!|yyAgm7GObYo!?~sD(8T7#Bgg?%mzSx!-iC?VkcCuu3aHybr?U$X9E!XyA@IHzgz&Tyjd{WA^?M`Hrnm{{o zC1FBVRzlsNBRKbNQhnc@a|GdrU-r+sW^~SXa_MxpydWpp2(gLF_l?WolLxu+cjDZBZ}=dD=0N$%on;!^-->|JdcUSlW4U4&H<< z^uCO9Lfbs{OSyyv{pAqT(T?5l4c=!?y%LZzRWx`td`75cgDxTEPu#VR3Fz z#Rrj_1YS=6u@oL`D<``3kz`pYiaCbKm=SP70cm}}V4Xmv62Y3JS$^lS3=b2d;+|9 zoBR^od|c_yCWgRl7u8APZ0@0AWM&q#(o5vBjI0g%nCiQIt65;v*)Nl-s7melvX{6;7x6vp72bR6VTWS3WA<#$@fLNC~k#IW)q2uot zs{DSpLEM2w$(xpjnN<~0DDr5v_;Wwu8)OsY3c9vAz zarc6u`#7gkF+>>Z*k~SjHI)p{lwj!L;p&nhgjo?Hkcr`zTu(uP^9*yU#68o=HJxyR znA;dg=}`~qwLt!$s4s>Zr~5&!9|H}>z!_FCLLT3md>ztiDkJcG637E?K8aif!!s?{ zn7#RSTl2WHw$_)8`9}!G_n2aIZyF#aVKKQo;Diz_AEn6OGU%}*Euu-%;^C2sYl*BlmNqz%wwOODkJ)T4>}6nkCRv*wSh!oA0=7Qdz9zv558)9%xmfg znfEe{c>D+$r_=fDh$yVP0srsp(UsZh$T0ySwju6`)Oi6+@S^D^Ij$k;=vHt$_CdA? zZR!L-0aJThfkhN`mA+#cccO{A^z1Ummnz~LVn|gJC!OiR=irG*?W5M`%g14RhJ~9Y zas8%2ym_zy2}}=0v0FDigD7^$vbbg*t++T(w_~-wKt1ab9naMJt67L`vp>4Yi?0~_ZRF!eW&6#otgQe$yv|IsqzmZF zUO^|nKc5_B0#}-xL2^Oss_~A&r&w9}Nl5;5klR<$Z6U zy~Rw;uL@GFK1RUCCQO4G000003uYdq!V~%sR}K)S)h$>kmVS2%sN2I{QCM!N;+=P# z1wu!+bjmo$2^!ybcJz6U1i?EG%LvPk}6g^MhM?p(CePbx|S zvo6r=Bx_yf#$^w(qe~XEoU@()Kw8u#5(m4NKJ9O@H6FjqV5%d-HCaH{d-pXWd6U_F zfw-!6n#Y5SA!zXExvEV3qDY`9+z{d4pGViF;|jWH4h*WX4&5(e%S^gl2ZUZPXFO;J-^c0oahvlk*D&;+qAj;Y957&$>AS z9VhZLPu)v}4v#wMz94GRy@JdP+cTtN^I1nx8msVYk1Nc=a0^zh0C~dtiI>KpYRvI6{z1AiE8h+efCHcLf$Oos6&o#)s z(L4-dry8?F8V9Xz$Y=Yr6=u^(e}&{@f&2jX9Y56lih0YM9UXGqmU_@aKDjVURQ(Rj zbx_%6=?mjqYITF&vQf>09`CPoB=KO3>(=Y9EgDg-A0<0dit6@OT*obhqxKJ|CVCW@FlqJ~)xzE6;=f;n&11ZyI{qz4x~FP;2yfjWmH zwY6{q?nuKEX;3rlUemF?<^4o%ppW^s7T~!GJFz9dzhx#5b&5GDkUOkC{ zO2T=pl_KGx(*VI7YIh|FKra@sX^FbpRR6A5k(RzoZkfg5ue!o$f9k1h<482})CsET z2{!7UP8lOC2_AA$*iqOG#15ZQo-qFUJA(E1=EJz2exixwqvU2-)BGdm6pG6;v-Ak@ z1bpZDnu+ja@Tvrcpfq%(tWn36n>yFw0EV+x zsP}{W@OUTVT=2NXo7-REBzcD`FzKf6XErao=Z5b79VC~F3s60(#iHx0_8@I&L!j$% z6kYmKY_|-gTd9F&dQ7Vw+Dh4qB%6(gsdW@Rq6)0~naol%;V7UqsbJP(qaXGip3C~ zhUNmlE%92%yy14qXCQ3hQ$4>K<2X{K+Nu=bbS8Do<|j^o#@f7sJIVjeH|Nphc;3`S zg9;&fYoY1DsoJTf`Mt5SG5pP}Pwg<=SqBt@wV@NyjY(pn2Wr}~s#D|uPYAC^^zM@X zbBL(s?D7dF{RfYtuer5P5{t`WWHT@gUjN`5H1&@+c(MhfKIUP6M7Jm$A{YCW)%^*N zrhDrUn>L)OT@QS{ZJ)7XmkH2IJEsp?*dm-!Lyrdl+HTpNSZ%Y#OIPz;n_>^K z#~D;5F{m2kg*v16S3imHZ1A6!#UREaU_=`v%b5wK468)@SG!NCLax|)*0q`<^Y-#N zP@&^^Jtr#H(#b59D`qiMDuh^9rhgqQg~#UDTmH*bJT{ohl-{C20EFZ`Gml*ilvZZ@ z)F4w`N9MDJ%0zVKr_}?={b?#R(SYTPz5HABj1+7ECQG{wFZ6nI9|rS=&|k@$n2V_H z!E-pOQTub3lIh+mk{u4Q3Biow$xrFjVf8*VdLI33t#B<3X>?5Z6z>pfgucm*Shde-6s)ED&R;W_7^ zmtnW?w!jHZkyIis{$p)h=|8u2`lBBzYR9vWPJ#P&#Gu&JIi)oS5v5ks*oM5JIwfY0pUrsUta7FdbmIXXE`|c1qZ7uDFq0fXXKGSzp1W7- zJkr`hh_edJF)1@=TMT`QbRIGjyFJuN_F5b^O5qX6Sp;(I2Rzg{)hZyQQ<5QN%f{8zQ*ULUfRdJL>(Ehl5i8!0|`N?!)o z14+H%zst~Pg=sK&&rX_Cp*0GT6-MZUDoc63|F{_sH}3C6UKKZV_+y08VD!QV=wx%I zK&tX0t;r#a9(Z6Hz4@vx`W8-yeMIgZ{+znm!gGAankF3WVYktqvhlFueO1I+pN@t!=(gtG1uaM^NptMIt*Z>kp`ENwW= zt6+|=DC3TS-XP(s=m`1Kx=AYGo467LO9ke4E?b)!b2lt+za7}o`Zgztb8l!}7fbJe zMpXBto10Qvyc|4j*pLJ2c_h~kNwR|{dtA+K(|ZL->HgE{a|T3OcM6t_P#V>kN+24w zo!M8TJym&C-MCJP?avLee`IF=3$ViU1rB1<9Mb#+sUAnuhNM17&8k1O&d!hc#0>2% zJO=lTJ>+owLm`BzQ*7t(rpOLnDRnsju#yfd;Q2|HhX8D+{Vch#=_#2LDg(UcX(iV6 zcgfiOe)8Mly8|(o8)Y~i*sEZnXDCFO<35_yhl9VA{{39;wJozkIBU2g+vTmq3rBk2*0&=8Glm28)+^%$- zSeE=xkK5$HIN!KAk16{@L5hqgz2D~F;1)g8tJ0yJG{}39B zb;dg5f_M%m0o;wnJ@uw??Ia#A?IfE~f{LgLKIttzlIA1(xN1Q%W7Bu!FJewv~ z<*v!tCDaHeA1>NoaJid*rqna$j9jg&OTY3BYtMwk^#qYN3n}RN#N4=Qr5u*6D`1{R zK3wV#?>`yU9F9q@mK_2HPy|#w)k-fT)*d&!V*|$gp|#eQ9H>|}$uje~gmDF(sY$sn z?%gwf>m6Qfef^&dj63D@|G@Omz4%pDTa~Zt3E=8D-}_^i)0pqZo>&s=X${O@mcu2W zl5C^!u4w5{I>+B7KJ8C_YWla_v`Q@tmPhgAgK8Sfo3>@|BZ|ZH33@)LM&7tvhEApc zi&O)pVcb4!A$!Gz)&<}e$WGvQ+VmNyxI}u<>n3NnRZG3LZXLEFF6Ln%o8)KWZq_-P zM`ci1C}hC9Z0h)tZCZOjeIOfCInGQB%tl#7hC>e#6OBhdji2Qm^@SJr?KOlEa60k7 zk*}6+(tCNjJFVb!Ir)-|vJ8rj4nbMgUmq2Yg@^rrI5CA?nKT%l0MbmrGF8{9g`Z38JJA{=t#)d!tamggb|avAKgLrBuNcc? z9IC*uR9?^ZVeU_&-(bpw$h63S2nv6gvDK0Su4&8F)-51_zm9uxk&y|vt6VA&O}9Ec zF{XY_KT33NllFl4xumD%3TFMqf^_m9CKaky0ulJu>2&C1h@OZ#Ofb-cjv^#TOLF>7 zdoY1UTAbct_W_I(*)Uaw19r(8bqV;9{v`i?%MASi087q3;7Hxw3G(Kz1+R~=Pr$uK z=(!3UKwKX?E1;uUY`1>uOImycMSF~JfpR9G)=HqN3*iVu^ncFcefK@z5RmRFoNFzm z>?V$|m8%zjfvFKlYi^Eco6GoCp+_U8#`mc3sMmD%@Boaw2Q0lfDohJA?Z`@xW$ zD#aGCJ3|;oGI`NvhRDw2BIy)c$=`5%2f2zBBtel>RYj5s0Xl^ zp%`KNQ{80jAfa|LZ_CTp{f^nk>s0|>x0{``?9~|@7%#Cp4>w5B{kcFMfV4|mNL6J@ z%hi$_2TU{`6`R){aVC3>(O*HSNC*SHqW@|8{NwZ-#W>oeMAnXQxz}qL_cJSHM^a|< zN0p4A&V5~;tIxDIAAm&9Yr7Bs|<_aP*e1b0z~5<2octxgPdJ8Qg?-KMKTWo zCpdyFnL0_xsB*g#qu+{3IOGz_?f-^A%g7+QCjH1X$8tRF>jA0KNgXw^4Ft9@d{x0{ zP_*F?3G?g0Kqf5ib)QO}7mx0@FP-Y?TXhNLgrz!g*L&fRrp?os+JrU^dANr=#(4^Q=p7=B$sF1)tTlp^?iI8LSEL2f8ex~`ewjGm}5MPC$Ko>P4J^PEAe2Hi*FyH;Lo0_s=Q5Vch3of8n z`dU)EXnJsR8b){Im2IBpOJE-(@v{K(#HY>=zDran)_%}CA^b5e4f0GDCyUo!Wwkiv z6{M4-zas;S4sh?}R*4T|RXS>g^SOzlC3N|znlTL0zh3*{u3)GDeSXp`c^Q`@cs7Rm zJGOJ7Jf=rwg=WPkZzxy*z0e5MGMS(Mxk@7d`KT5$WSz@#k@JIizZM|sMOIy?4jOZ^ zjG(XKsRGh{ydC-SUC=Dk)nAvasqv~TcXZ>0Xw&~I60_VH&vdPyZJ$*2m-kGE<)@p` zt_J?ytt)>e+)-OKr69R%PW>C#6rr>l3CCzql_ZEQ0JXb?YxH9NTsIZNk|lM;PVTDY zjGzSByCCq=`>nfI!|md@BQQP}iNC=)J}CGl{?k0ec;peD^%Cr))KqGW5l==l^{3LS zCvef4LO1szyW`Mb(Fx*gSI(W(M`&@(;gJ!RLq*mR}@spY42xMn!EH)SUe{f~) zHQEq)qc&-pKk*}R{@Loy{ z0f}Mw5hHcL6mb^-_cS3a_l{IK?tcp>i4D}{vnYH(>5VdgCi{c!Gj2y?;EFCZxYDHn zga|*@{Lx{1B|Y`kVB^Y`%KB6ziK*TQ?8<@NQmj6Gw&lsJ1U@rQ*jzMXS-qBwcE3a= zGh)~VpZHTZo`4mBQOHeIv5Cb^=m))s5Dx1Q7t`nVfdtm;T1fSb( zTFUP4mUOy$zuN?)6 z1hS=-#l!c50#?GdbML!t zz<6|7vJ3ggYQ99=%}95ctR;BKvI^YsK7>y@Oyjbucq=-Xzr-~=l01+`q0G>vFQx$O z2ID7Yol}T!V==Vew^6rmCCS{0gL0WoVm>y$>aZ&(?CPr=>B?Crcbr;50pb-_t+J*6 z+u{-xZSkW;^S)<)|DRR?WryZBB&R5b5!?=)t7D!3{(U@lMB$KOE#qY|ag;o+Ft@W>1@|nPMx3-> zQeA}kc*I5lx$5;l_473uPjw`-J!w#>ihjW;dNXGzX_|_`6b?NL4xO&z17~VEB^*7Z z(93Cwoto3U0j(pX%KOYoN-aiMnMnJx z;4x-cZdHKgcKgKZt`&%*k6Fm}g-tD|Uf}0d2=3=b9boIqbmJ?g0>Dz^ds^L9MLo{v5yJfbQT4ARBqTu?WM^{hl5cy>+!3jf5=0#3-|MK;%TF zyIA}zEW((}uq~`YE7CY3VxR*@(1iAzcFKNs){fveMLBBvuc?m^Eg^@APoN}2k}~y^ zOgpSq3)5}lK(`HpfDUu7y0M&l@Yp@&RAXB_h5p1#;{waAU2>W#PXGL#jzTf=hAXl9 zoubFoupztvILNa1t8Z}Dk5eUkK8c*=KAgh6*`d$BlNkHfSZ;Oqzge-FF5RU0g`2z0 zwdQ$e#X-hsif(zqVVZ*zSQ>kE<-DP_5}C&>09;b7gvlVnjr@5oNEK$}!jZ_)`9=KT zF`AFg1O@vNx}1AdF%T2BldTtkL_IQ6oJI0tv?x$ z$okgWlFg`k>;5~4BpQvH>mdR=)uH@n1i8E}%psL}_lyj=)=5@B#*ko&q(1b^P&G?b z6Ez4mF;pTBY*oxH?ig=1u;J16^j{@-nzJk69iK%{qj@X)2JeLJ%r*eN%LZ}s-;G&% zrwZ}=hDN;Vg9&W-tDCOcO8uk=t3#+=SNaozpIb7;v8D)?fBVk2J}^pM=p*{yKEveb zp7FFK;p_#Xms~7E1^ybS;#VQik)d^5rcZ&@ROn`m_Uzuw_;ugVd`NEhAs|qy`s@GS zv`V@FLWYQ8Ve*aL>$qYzV6Tpwy17K zg-wdn=M**tAw~Z!4`&Xo)-h@e!YQ!}_QyE>q?m})??|_y2E&k{V+ZT~IYW(ZQ+M=JcS(gn(~5yhv=h@v*xF0Gzs~-R6{wHchEZt53l-#o=g6ik zzk%LlbB=jyej#huTc+gx+T9aTcSa^K7q%o*DmCyIZ7KXrIG3^A_5m?^poHv)+y~Y7^#ths?}2Ol*L_8tq8ax;;W& zdo+P}fHJ`Mpvs;UA z?hmUj>~Oa%AV2=*2UVC^QE2I>12YD~xax7%Lc$?S_6d436od7u;Fgi@AP20O zrISi6w*_s8XWfszCAp8_h=`RWTR?a&RVZrsD`W&z6*$ljD7zX_)ma%n9B^@`V>(TY zJdF})0u?AEu*qbkuO1UkmVn?#)h25cgf#@RrUFx`)(5~aFV@*MoS5?b#}jhV(2MQG zXTf)XS`;oM%h6c_iDmwWJr0MI1}S`Xd^0wXUjzdtJNJO;=h8`H3rSLIE zLsNYKFT8b9w@alcl|YUe=?=0f*i)jBy$asQL(Id<=$~PhQ;s!2jA^4&Cq+TTd3E-< z(+emJvNVJy8Q(p$1)*ps73kN&Ts3LGo4HkJ(JK@rrtphN7t}+6?Tg~*dK^j6pBQkRY+B-p4flaose=T8&Fo+!rfJKVD7LaY zrWR!dek>25N@J9NHh6ak6UufQHE#iBrkKKh#`bs@Hxb5^cwu?{DDd1bdMOw0Cl3)> zSB*No^-JJlIp^&o%jBmCd>gHK59p_aFmAr0`K%&tDq1qgFch=D6ffV+mD0#?$Y1o2 za;HUv6F6a3BN6o~OORErloJj>!8fMOtsUyd+U-OHTA-J4ru}>2m$Ee>xEX=`)I!r@ z0P1~UzX`(N$wT2Bs^|8Z!BS6Cm*v*^2r@eaR|INO`>08Hu}wbhn({F!)6ya&0GkfN z(Ajw~kPR`qVccJ2Ms@i(_iPEq43y-?RNo#(T0&^@ng5M4o?*sX3-!Qfrai|cPY=Rv ziwe99q!}-xYCOZi*A-R4*p|8aZsZ|wM91BV9kWF%v)Qrx#-r7J5`>j5+d^w)L{~GV zQIt?^_V|6s#QUi0kU&R<3HIY~xL7h!cHhtGGvHv2QZ!_G{80k0n}@)K-O_nuhEQ{b zFEngsiQxQPj_7507K_Tu5723*iw{|aaO?4a4`{VvxNXe-%J`is$^oetrb2;{-JOg% zGy-3mH$+*KmS}=Fi)HFTm^O2DcZz#NROH2+aWZy$(I4u|La>spp@=$I$|V5WDwdtB zmv->5*KkE)^hG_>RgAKinI}hb%BB*Fr?n7(oOhX;bJ%Wdp|oig>NwFao3}GITBM;t z4g}tYTwD7WJ>e~8moK|oqb?e>&6qTY>1bTedPUfOB;R%fo(l~u%q{BqlQYUvEj7rOb}#XZcNEej{jPLv=zMMa8F&!v|tS&1p{lLe;s zpk8NPlpWyEK`rfug@akXz0WVr86H8t6=~{dfVk|$JZRrytygoc91&L5QsyN`)VWJI zs9@tf>M3N_%%jIeniU%BcYbX$^%jw5IUsTF&01ByX?aUu(9Cr2I?kMKuo66f+pVZ9 zk6=a|R~)E1+()FT3n%Z{LPq_H(W`BW(=?COuV_Nid6xDv_ZiYXrf%PPo7n;*9{nWu zV*9(Fv@$xIotqRk32A4f|I*6ArUg~NPhV3bgZNho=o!Q=MScfBLHtK|>JP;dkUY!e zOlHOkDKv=>#D1QC*3_8(gz5d0MVb=y&oE0bJq&d+V=G7Vqb*Jy=Sv|~mzrr*R$oNa z>k#aa63@Yh+E8lp!bXal5rD37rNfdC>8Nt|5#I#*646sVyx;eTMUUMVCN7a0Yo|OA4bzb(~J6H+nhVm zQTQKpXUYg?R9Ql=#Cf)Q0HQHJ3#HIK4C>zE#)-nIJM)n4x}&uxsP^h!vZeMbp=eN9 zN4+Ec@NVyy0x9!`e)csF062Q?_(6k{L>aOrW3nOAM&1Hg+I63#>AHGf559#&TLtp$?%B#e@enV&*4M52gOBG`Z#&uU^J%|+VPJ8HKvdkzL?Xvyo=t!F{N+RMy2g+p{68Y$aB z&VANQmq>Q?*CbOkdvA#bT(LZP%%YR{wQJKO0N#Gy`d#evj(tkSNMB_5G)NC((HmW8hXGwjo?!rue$EeYY0p@Q$tlgq)Z^&K;8!-+0yx+I0nivC@wxp< z59-Zc0y$+0Q3D~ZjFb&{#L~-FuoRHndNNNE-GP$QgeU;hUv z{P7c|N6L4QlzIqPMdBFTNp!wh=_xE(o?IL9batf3j02NnT`|J*-_%kz`CHo!J|!+H z$1^pHSO6T3>(+2}RmQgN(F3q7(QE&yrFR7Yly zg}ty%^!Ap_LKiDV14C$B6?V8kgG(4~-xl&8-H8A3wLF0y= zgq!La+-7TS4Y_&g2wm>$9^@2Xp7=$1;8FYjF4k_mNi#MGX4qYYAf(iYpJ-FqokQD- zCcugQv2spF_m1LIek1xY#u9h*tl9+S2z{cIqvsmh2ji|Kkbr9^n z*#c=EZXrVyhu*ouTGI|{@6y|Bn!wT#bekrHy}0TBjEt8gMu+ndKzmcBH`0Le=(lA3 ztB9g=H>D@Y=XO7UJVO44CC{XPrI1BQ&>dH+QPf=pKH8QikLFt)FLm9vRtig$6>QYw zK+J+uGt_s}zk=rVT}WPgsR{h#DDoA7nMV?5f@CyK`RZ z1;&Sl%sci%Fm=bZ?o6poGHzU@4^@p=copl@;BkTv>R>O2b!iJ5w3||r=}uL?$8Vjb zAnA%6iDi96(`}Z3i)BYF1*X=P??y=2owDclr|#0z3k#P}iVmWMR*wh+GjPuE>IF=t z$;1wdpoCXpD3PH5O{dS$6Jh)P@*j|cOnX9-2W2VOgR5Nx2_6S&Xs=E9BL1Q-wJuCq6t^bJT+)UJAJxpEcRv>J zrc8Z9!3t5X(Rf{F2*;Q4evr{P|Ik8E;`sprt9e?edhrYuQJB+H1@s*&1)IYXziWR8 zHl1zqhBgZ@ZBW8{vSVD}5H_pcA75QxG_=APx*_+jN4&^&oG|1r&G#FE^R_iPkfsSD zN~*m_^fg1o3z)&po~Q1OY?^}`1#bghFIX?-7lM0!zrcbRD)>K@17Eszkie#WK~Lvk zPSdFvV=73|K)9w*Z`*)#d>n4E7{n=SL~1{g*zun4&d|{$9nSi3r3FN=^}Cn&Qxe7P zC2sdYO5ob0jC*2Db-tOagH11W)eNTz3hQ%(T3BZiicqzw#m*d-dQQ$DD!I*)WQ8TR zK%SII!(`xn9zpVBuFJaKCxU{Yr1qe}1QJ1+rM)AaAoiUudo2aWF+b79!Eg5T-u=h5 zB&KBlw(Iw{PFV@Qtuf>C-$Tc+8xtzQ!}>TQ(`sd=kr(=Vp-Z+Yi{U7gt9l>!V2a1N z2BX)?%Z4UUjD+H{DF1!ERn%3_yV0TwMBH+lp+e6naOXWV{*BI;0^~p|h8?EHlQrQU zG7X?nFFI^~1prREv{2EQS8uuKJSmG|{rFo7=d`5t-!Qnh8g{<_2CB3J8;9GsYoUyh zXG7Aj3&?q`;J7IA)~zTLM(~5{8y^Oa0X_GH-xzp2Lstsd`g)Dh2kViu92zIs4hHQ8OR3; zz^gv3p$Po5^~3_Hhp8}x{*rakpT%2VnR-~BDj^=TQ}nAk<`Clu#CR00000 z00000H~>gOJ^|bdv7S#?IgfFN4D64s4Z;}zt~#T}!x1l+$fUleBxJ)g>IB}ikavCE zY^P&iJ#X2P3qa8hGk&nmnQWf?+tbVvsDuGv^3e}CVzGrS#%?{r(t{#!E;!3x(3w*t zCt^II1jD!3%3q0*bSWa*VYbw#j`h)w4QmntH`)Q$0!Wy}?qV?4&gQM`noI-^^P(3q zkb#p|qa2Yp!Yie-&<9^SM|*q&^4kv%`T>7XNoyX&#|1PCZaF6y*!Y?)y1<*w1{!Z@ zfjv`wil{(A14W7I;QW)%Uh;$ynnuQ-bQX@9aeP9>a9`nd=ZN9XuS&za9eWz5@w zjM^UO*4+kpqJvb-kA3CN8~)(@$lE?X((;fw4{?ajwx7Meh&Qmc zpbFJa*xrbnT@W$#UHzoM#ENnP2HwsZX&S=%`7Wwwe-R1>wX3YXmTHSa&uc*{V67acPKa z4jD1*3?8f}u{hc=9_Ha=6uSCVi?G01@pNg&_F79ZoTc8$p)*^cnnHQEZe!N^4*m{& zn_-QzH#U~+$LcX|Xw*IcmF}Ia-0b@hE9Ylx+se$=>TH=O=D!9x7kZ)js_=VLZTcx< zw3QvdWg5!%bssaf#PdBl4{PUFfbr~YFhv=Mkw}bkGLqg59H>*%!P8}#?rIyQr9Xi0 zUFYIu<(xh>YyQYUef<64X`FfoCKE|w<%08Oy< zCJ>*~U8z$d7B07;#saokk#Re!ShS%y>kowJY?m3b!YF4pzej)gWevkTWw3D~ems zXs-Wc;XFs(IPKvH3`{?sNNb|V1VM|c@0{U8yUcw6b>M^gYAibc zL5+QQua-{WD5`3lnHG9o;KdfHtUPg3oL$vREZp;+Q(_tM-KY~8{zk{}evQ(7wq2D% zn4RRv?GB{{2m|=+ojBpGdp}^@7I|$w*Yd0Ze>g)sEwH*a1dBLHcg>M1Z6s2mmN!+Q zRLso}^#K+n;tK0I?YfR~O`e#$M+udqLCS?e{o=n%xj6?NAj}Ehb3<3Rp?{Wb_(YpJ ztmAPIzcZoSY+QXG4XV0_TqHhpsm_4%B~jdUd~$2{O%g)5vOL~2Q-{lYkadd0Rt|hf zdW&D6wa9~ec}=-q>TnLq6~^TM2jVgY5n)S--jjsFt{u1S>8}qj`b3J$(>rr#KWs$}9VJq$gyALKE{#cd{*sEmvmgGN zm*28Ire9SXJJzsuRN_TamF`Bws(xV4;Ac@qlst*xf|8K{=^MDN8m!pPB?~C`FP-XdBfPc^nK}I6y`t0^JEZ#+8{6L@ zkw+nzmyM9Sh;;)ZAAjejf3-vL%f<=E+&zdR56y_sIraEmmkYS-7ezh5)wJ(UDccS> z`OoY`Eqw0y8Bv>MW|j|^Z($Uvk-7dJr|aj-v(N+;$@J#QNll+Fns@1k9Z5($UXkV( zefK;~61qJLMJzmxaoxHwQPkG-^?rIW;PoNfDqCs zDLqC=4BC)THeu17TW2FX4+0TTzgsEyi^0B;Z$r_sZbkUKD^&>iTofI1>GZgxag)IM zCxjMtA6&yv@c_5>!L|k*3PBpDwRq;=_*SWy{V&DzG!OJW&2BRcMomMHFZigsB%U6_NMyEP8Ya8`_R2Ao^WU(TvCJu{(O&H zsOaV3@>ys}8`cG|i$x|*P+8N1IVJb2Al<0OrTFF!V2Uf zZeg}guovgiMvE~`w5Nl~QyEIMg)rPV^dLTNs6ZS00i6(@!STSWYNUD4Aqnd?6()+L z@QeEh;m|ELXiCWN>O@bM(^$1iQqWOnUHCWIuq!%mfnYdP#f0KV!-AyiV0GF)1FO!c z{yv4|`AMqNE=WZQrJ5TISwgp+(ks?$1nZULd?;_>;P~M00QI6$$!$RbspSC~`w5-H z#%FK$cg||}J7Zrj1(2OEKS2z}AMnzI*qtUk{pGMgh8p{<>RH@il1VGG)POz$ZIroA z^AHI4KR3Il%^p)19O0a{pXp-b;m7R^TBeIxjH@Ar*b$nGq4R^I&R}2{J{izE*+QJS%;MXZphNt~5AFE@o1X3~_>76)!&Z>ZVV5L3UNi67xbZI3MSQSS6y4OD3Qs5L*9=MQ* zTOASsTstMGfcN|%ZqFIpdR6tdipajzx;Jo1CH!K(U9juNJ@n{H&GUDTbt5L|$}x0# zWc{J?X@YH<6u(xWhm@Kq8aPaf6|Q%b2BaA$vo#ap%yo*CPMw>vy>pf9aWD)ZuH zcL{6q0Mg_y?>XogRP$m(QNWzL?~U!!Q=**}{Ts0(tMHyiN^o(qO=lw^Wn(00(Fe*z znz9-kPHE_X3?)ZddTD?J@&}0KrgSsK8Qm31BCp)Fk0HFlu&Uy2`S~8HBeD)EQQ~_! zjk?4X_Hu56e+d}MWJ?;W7@hzCBN%#<4k@Q*mF;e6_mvdMS8>>lm8nSwpvyGY&L~aX8PoX=Ly*64I^iLlsD1U^|;8@;blC$d&a=By(De) zk@j6ZlmR`EXHDSajl`Th6~GZ2Z+riYKW9$182~R>6FM;JOlF{+$fpg8e6BFd288RR zXF)8&fGM;rBmtV*T}}+v7~Pkyrz5j=*On_L|2F|X1n%Zg;%mlGymUcwLt|d%+3v3+ zuCB*LwjpJJO}hpFw7j}#WCI}rXNP0Jej5PsY@vRdP10w9%9ghIPK9&n47_ zC0DS06sQ=@wr>Q}2t>?h8rK$zrg_b1#t)T}m4cq7RT{0EErt{BZuy;{TxP!GkAOMl z@uNRN$-mBOleP&U=MfN4)ugGKBujHaI!--}&7_&+=B4zRIOl}wUaJp19)GF<$%T-T zmCSPub?Fb!(zOKL2gIVeqxu2qsc+rAnXmvoM2%ocoI$eELH>%b)78q{THVKPl!llT zjHX8pB0x+iVSRVzFYv5-u1-RKa|-49;r-y2!V(TZy*!2i;ltTTRtvXQ#x|8(xUXatc~|=|ukK@Eo8NU> zH_?<_+4HHJ%Jm&@(f1s1Dh6~^@Jlhu+dJ7~NOqUO#S9ZwgeJ-!0p>bMTQ6yux3qL% zAou0dDL61>r-}JBOz#oK3r8DHAay1X@L#{EG__2&Fvt5ci zVY5_*pv#dG`=IzGO2!3F#Ey{8lmPL%=S%M%){`6ZM#-7~mD6U0`Vg;j(~zNoShN>o zL|&D+u&oHp3qK{5Dg-vJTR+#tx|ALH@TQ`+Asp6b(iUBHM1B*rN3tFy&^g3aS*(eb?&0QW0?ibzCx*w-S zz8CFXN34-}`iB`|d z!y|s~nRW3C@ihR6=3u8J>Akp%;)UBYnJ64X2nmwqKr&C2=Spw@0P@$kX^}ssw(e^Q z00013{4gK@0T{#7n+pHPrHDI1^QkHiK_?tDoPyTM000468|f5)001xb?iyrI>6zOX zEC2ut<-kAy12bOXt+f7{?r4wz!lQcfk7kc%&IrCVtVt`TFU+r9XpLch%DI>Vz6bq5 zaZVqU6i66MI4drVwI$jl(F7EXq>)L*J)qI+pI+ zMi&BF1ezqN|7x0PdMz0b?bK@?7kqP!;D5E4 z{wR)`*Q^|aZXgfl*zhnh?aen^d9Bx#CaN^Vf&U82dZ@bOUjhs}TU615!gx(32t1wV zd!^;GOzKnykJ6sE8Zktev0?T&*CCPX1Pm_mO}+UKTEb-yHcf?OqdCi*Je9 z7cEI?HZi@FRJpRnjw*2UfwLFt;AJEf(9x#20MZPctB^6dEalB576$-HL7nFbocStQEAPq3p7`(+{mpXl&Pey3QZ} znx<%>T=T|-kBmtg6@G0i3W#QAA~4V(ngC%yp1+Si`y?oX(3!{b{A|l8;-Tr~08&r% zwe&$&LQ37~{W*jF=Ie{TzJhnE0iubei1BI>v7q>znHDG+gsV(z$UQ0I`@?6y29D}?NRCfbxMspoEA&;%oa#FTha;yBG}%L*>aQse~i zwXIAJ#M?^jH&_4QY7O|bM{iGu<{byAg%OF|v}vvMEmnS&3UN~7>iL@l9_f&ci@?C2fyrRbpA%Fepd^VjuM&C`???UiSNV%f0kTt>6- zmQh63rEd`xGI=Qi!}0X#i$qzt6L6|g+8?vGs~qp`KoT7NoO6mYT`*x@dni(zh>4?a zqtrhHpb`(PtYHQX<(64biz$Ck27mE}v~GY-n!4cY42cG>Qf?&mI=Er`LkQG9`D>t&=w)#>8@0KuDh#BJvMAhR$$oZZARk3p za_A6EFlN(^m|Y->Myj8MxQ4K6ko*Nudd}4xZN`c0e`T909T8LKHoj?LY573W8{~7w zmJ2@Zd`^h$>t)`spRyW_@YcQQ`N|j#MzZ6CL?+MxYn-7aW=v_v` zv&=lqyAQQh{*%FoRMwLd7SL!AWOPl|B zt{Y0&)_TFBuPl(9FKjjHVNI*VfSbgcn;VmnWFlR+E)(H2acO3Ku|=4WZKtMHp9E2jK|`aWFxGYcdo*q=X5_!(-Oi0WJ%;MQ zlz1)u2vIT4JNQ`*Lw#$5TeU|!QKjnRJMOoRhXazsog_GS+2q}=%eV_BHQb@w$=0g3 zfF!@ZB4w{xv)!UUi)_nN9N@cTDjl2~R3cpm13mAlzf5b1Y?z}~v?d}1fg0+Y~ zEfUv}^aodGlc_=9pg!R)(P%FS8fWm~ovr*dR^s~befzZ!og6<}6lMWL4g4DNroXxO zX}ZAw^_U}$80&+MaB7J5e%BTK(Iz1jzUaJXgUx~5!{K$?UBg16>}?{3Vk+X1RtLY( zn~Uc{CBybW_ZvKx(@V;88D@zUhMIY!$07_Fw%8X$)v72OfqNROZTbTLy4ZREW-uq= zO4GB1oZS~CRBBwQ+XIr|{%S9x&}D>O0*~k3@n-ta)IezZ#l*R5e4tWm8sg;Oq(3TZ zxn}}3X^E6Y>IabZ_|Q{8EXXmq{jFIR=l%5vBF3=-=D*;GG#Q2n`1I4|pV2fQBBGWI z6LKdV^d>dj(y6jUe*?HINVdqlE1h6mS<$(g@0a4uXwX8E2Z~SZdTvl#3xNPNRzHpM zL-v3I$Fj8Tjh+gN)*r2y0QoUZdMClhke0W$4W4S0w6Tefq zNK zZqg6IeduMO-nqnrU!k)p^FxicYth~3XUpw#t>n`$=dA;F9{ijSD;;+HbUC4VUyUIsm zP9Kgos}A0!m{I<&_Z>bVVs_#i@lRoqiDH- z&vKnAXW-BG0+|7e8m($ro_1v}(`_O3M_Ata-iBy1h|r}ao6MWWiPK|NAu1xrA*NPm zfqfjZO#T1`yeFq?%ynoeqoSWxq)H^rtiWV36IrK-`&1%oa3we5c8RBG*>{6S&BOO! zDijWDwV8X$>=y}E%`L|0zHh%-BEz-fzdH+PtEjD=!ArhyViSRJ>k!Vj*G%B}wgUL( z;jwFKYa1o3|JK=Y^YjVCitq}ht20Div7E){y~cs+?P9Qzr(B1YeX7F2{7xx(k(1KY zAjVQSihSpkkXoCZIACOx|xLf zJF1}V$m*+f^+A3uB-?gpqlx=Bu+Csm>f*p=+axvs1iWnPbo+m$Iod^Fy$n#dW%MHx`)<=27%axnDf7r?s228=#lD{t zH3UG+L=(1@<^h+u8x5RZcc>l?omFTl>n%6#&1#n#G!yT1C~h}@a;^394~^hk7;1@+ zdV(3R$UD%Mr2>7N0NzmGHm~Z4j%>%Q9xy`V+5k2%mC1-qergS@DT)x8FGa;AnmT{) z70ro!9rs}WRj%sSvjL5>y5xFl11RaF8-xIil`=l;`-(g9i}|GD0BH}Pe5GpOwLUDu zTj@+gQ8x{SQB7Lv{ed9HW9_+hP(FdNgX)B|^f(?yX{bZQ%CVM7@ zd%9NKE(Zde7*R}Xs@p5C6eH0`YPfmb>uJZI6<}Wb*>=V!;O_gPbDU2WY|y zqj0Iaai#Wq0X*@B;kS=jyADoB4er>thZ5hd^^dgl+DzZ)5=&F6`gn5Nbd9nCQjg`~>j`z}Jr%(8f zK+R-8B{#B-4n8-b_VCDD#Js9Qgwq0*o@b8-kst)cylSldVE8FPXT4qaflU-T)irM~ zKfEy#8U0;w1-t=Oa$Uf6TkxsV1YkC1Rat?6C)S2b3%;p(r{o#Wo|n1&i}1*|zPT=6 zqd@I6ZQ#S;E7@+z*YI$Y)KrCc_eNxlsK3B80dvS~f+hSnS{c_E?eqRxV2jhxH=6wD zo*?xXS+48F4#-%olDSqo=R~ z1*cPx9-LV0E_REYLsQ6)mIbN4yNaOfvapn5vm5pCsH%^p@6Ds-ZpHjE*)c0P3*~vH5Z45Wff=JrBUd;+C)j zC7XnnL3oUxrCsMLlAF-SPkYd_HP^@yzX{;}3BU?res=90bsz0@(#V(@gRs(XpfC2; zSH+SS>kWS*xvX}wbeHZbt@4sYOIM2V5T>Clb3@b==)bE$pa>IwanhJ|LM z0#qfv|L(5JM9=P3Tx^)nRyhlgtFNVdH5 zi5gc_aO)mh0m@c2_+jZnwEKP-Gg#qaN-5MO?e&)ibT0H4yADMKOKTHk6)ns! zWPQuLu$Kb}Hbu28J;HpxmRFQ@)CiDb#hAikmHr(%> zs1B004FPK{;vNDXcu#3-*p*c~J|zwrXT!uQhP7M?JY&Q|PrwG9)xkvI7Ss2fQYWcy z>dAT{U6{xW3!X1-@c+A^I}Od^ zCd`|wozf=aQVlCi^@BdEq^Vin}>|nMrDQ8j>j^n9BU$$_Kk*Hc3)D7MgZ88;PB8H?HQyp>=OI7(3ciDnjt?6u5 ziEDcze1aU-Cj{i}S;(BJ*0@H+4 z^V|m66Q%lSCiWfP<-!gV+N!J#QQO-}tYyRk%T}xGANXUDf9hd*SIM zhKB)Q!4*4zcSl0Arl|v;hf86)f@o%kr_64y_j^ygj(vGHchjf8Y}PlnZBr+WM_z=# zkYM_gG*n;brGHv_Xgi{TmDJ2z+!nQP)4EO~P&W4Za$0Q@9qu-+=eJk#CIZzaX)V@tCaKynK}zU3o%P4JJteBnm!#b$#K+^ zil@2XRxBpZQjNF;MDz>n1oCC&H-Yf*YIJbKUQgAD7vjwF8#{Oam0{{lg@5EK6DJ_o zuCUprL_1!KQM33E0A9!k?g?w`P}h)G&?Vu1caV^{dJKfBZMCL_w5sg*t{XC%@6KEnPW&7CFf8D|9~5% zf2gigl5j4RSJbUQHM=hNrs4hP$SIi;1GdARy*<&h zO(a%?^OQ@{yk2LIdnI2con&iFV2@q+J0p4b-xjbQOB7xJwd;OJ-qY=rctf?tvf+}7 z6)VAxN$5(vFTKC}fbr=%;ake(aDgBiRgy;3jtiLvbN~p&TYdcWIX0aCZUF14Y1E~5 zm`ca^*V`10#uB#!|Axop^Y#Pz(WvCa?B{H7t>UgVgetupOTVX9)b|J9yLFY=z2SCI z-~MT`r@^~gxx0@G+0CJU$ut3P39on}+#qPn5Dp`#YVld?YSh8N-z)M0RK?p zy~1aqwy!=bWwi2uP0Uqz9U^MSqI_FEpOZnvwCT-tKY%0iJ7KE&2f^D@XjDkvO~Bly zi^6&6cWv%)Xt3k)x0SoP*mt|>KfO<<*4mODh24;nxc2JFAZ$ji*0NAwPbktAi}|)K z`hZ3do52rdrh(8ZbYgI6qHfoEjV-9ygBD z0N}<=>iDkhKx;gO06}fO|5CgiItj=8ofXymKaWN!@S&Uxs;s*MNuttW4b`{KcDB4e zt2Y*kQ;R;lL?=U&pvOa$nxPN}XWxnwd~CAq1PUr$h*rrcz;FFJMH7@nO%x11n`Ke9 zt>X0E{p$qIyk`JrHbbvI*w(UdDN_j(flhKfe-dmJBVfDBAiUtrB2DwK(2Vo zftk&NDv~Yp=S*n&L6zcy?^Oj#REgj)=4-Vd`lR{*W)d1XM;{%BCd)YgFR~c zwcn>F={~c6ryZ-1UKk781xfyRfH>JY9S5LXh@sX{(%0r;&TGm7DU&U9tA~I6v5XKs zs>D8;V{pZSQGkT0(jy|Mrd62dWRl$lWh0PSCy7UaP%S5O2Id3wBdQN8KCT{=Z&1#8 zUjXbm8Ihm|lo1EB%JGQxrQvWcHRq-(5{*Ivj(A{$R<~ZLbJhVH?B$W1^YbDCPbfHf zpuqQc7m%c|f#|vwcc@akEe{>6zO02Hp6qGZkQyV%2Ddi(y$EC%f9fw%Ev0RO`Y+xk z0+oWb!S$ub)qB!DYQy05kVk)V{^sk$EHe%$7-n`sZnb;yNv7{SAwfuL2gzp*G$G;&SNrIJ0@-);XNLnc;TS03y-8z52VBlz^5Xyio?+@tAwQjo(YC-5kOzX9A0EF)KFCt+*6Oeu4yG?`AYBD4Rimll-p1OuNh&*R`GO%>SI# zJBXbQb-4Kpt_VFQUyOvlq5(3))SC+b$W+ib#F%san~~XjeYhZ_J{d)wKMMHa%iA&* zB-yOo5`#alpk2me6tI@1f5UvqCzr5kXq!McYy0K{FhMy#_+S4wIk}H7JAu6{$6$UY z($)e!@E*L0-gmsd1|_zs2B@=OUXWGAo$pwB0=2B^I$}etqo*Qf1K>_SShj3 zVvUfe7tHzM+hQwZ-n?pwh~8R#XA#kBYvC{frA%}dt5 z{w)x>?ld`}L|3C_wFri$nz~_gsQQ0c`~(8({U(C{;=c7YUWdh1-C|um8WD2j#bdB*Bok|!cku% z7zkgT9Aeq{xM|Adt3nhyHx<@MZ}Tiwft1sg`04GP7r-bM5-1%BI8Q@bxj+m2ykt#l zGwNS$b3tv6SBA&UCml$v-K-1;0Zr9?KnE|8KGMXy?-tv$=Zs-a&5t*0N;|0SLZiREPXmc9< zE}+i906ip0KR>CKfW<_=Wfu;GK0vdH0B0&DcZ)T+zn-+i{yJ!Dp8yk5BG`-@MR95K zJp%jl2nAqXuv9!ax0Ndqnh=MA^6Tu9kOOhuW-z+3*&|cvThy@)bl*UsZw|W@spgH< z+JbU?D#o(8TlH%+&#r9TlD^WGtSj~4#592wr+)Ylaqg?|-nOMrau63q-4BoVL&}Q% z+2W@}j}pC@X7NrKs$yvb8Ld27h~TgPw6H@6A!_CPV@p+5k<{q&(yt4I>`GhzJ$n&b z{pj?+lhcg%BC-#T(c;>%rsrKP^CT}6^F5tGEo_46DOC7fo4}g%9%vMG=AX)^Gd}%( zziG1OSvz@pY~QvwF0fmJZ9uRypL=On=%7cm9N84^@UpK7uH%TMc9Ce-7l~lN;|#6H zY#)~^r?bXf9y0LHPgy51AjuKYV>ng0Y=camVdH)cmYuGsXF-fd%`XWG$8BO=yegZl zFRF?k2L1*EsGO6g=jDOo8+uc(H8hL7;PTd5oPj}Lw3WBIr&WjiOUGCZ54{4Eh(7SU zXN(4|lc#Mqi~Xfg4&7EWVboaS$YdLjbTZ8Jj8d^0+8$@)UwxGfZaMqw(0YSj#t8Hy z=tesAT*?#{z*vhINZRPa#Hu~pwxz$28q~hjuier4hHJ2wrVtttO@(T`whbl9x&Zz? zQrV^A`wRk-x zG9f^AY-U*XPF{2k_x|l`D$#~x@_s~}(lCUgl)yT9|8UTLpDRZfHSvp{VWr~xp?=kq zcSp~KT6Mto;KwM8C@M5S=5_zl>9Xd{VSv(?dp(J<69&Rt1z2MFcWl=k$m^TGK8mQg zMtc1Z>L*L(=>UP!>Ba#(?3($ITEp$ilv}y(`z4StYhial$Z~cc!&?KNJHXSbU&`E- zLQjA}>4W^FOVZB^(D$YoPB%@@Eb0Eux4(>(7W@8-Au;mwTe}h5C9czR#~+(IvwFXLdQY9niuvLI8ufvK6u~%>?qyqU+{p|anQ7fnqJul-f?GUrT2tT3et^J}Np+Tj z=Q7G2LaQ&0r!eKDw9k9QofML_aqlZ_O4)(sYYK${Gv8ea;CWZf%})O=jYSDRcKC0u++#B{-Jks7~1GJfrqhm1n6gYy@^=;Ds;@#w?a zXR34mjHZ>oDSm0SGSH}iaXB@f*M1Sxh9uE;zF75fygndFxNe9=vp$2m){5sXY*OZhdB}D#2F&wHj zml{sR)Gvbv%w7fw%1c{63HSZ1(&&RscNNHMauoANP+cxw`+42zsO0})IiY_B0z_HM zq$aKa$|ONR)Ufwg@`#dkoc;iUm7OnPlo&h=h!x4KFt5?$!K~+Y%b=+qVb|B!vhkzFA7*(l;}SrW)z1m=1VF@ilf4T6H*ulb?D=?JPV>Ed?U2Qn)V>`v*Wn4P3b%2fSSd^E^+O<- z(V4Oa$Z>zrpqE({X7RN#3Pr8Pne7T{*}@!N!LcqVGgH!#Mf zsRoP!F$hYok3gVNlT>XnA<9wsP>(xjpSt4mA63|i!&fs&Lj5le+)kMBW@iwH1e&<^ zdG8k-S=fLR8x8LZ8ePP;$c>pQwTH!EZy%}DyU)tnyTa>Cvzbl2%U>#diLQ#%);W&0 zx{+-}B$S{ecbO{G^fSE@Ecr8;%LjcZ$huv5KgHLL6`5FXj?-5f&xM%YOvru0Z_)J^ z#PoeN7bk)-)Z~5KVEU+QDhmZb+1YhXI8S8^$ z&vriULsT5bPkC%dbqG>fT7g0SA5S)F(|6YW9(}AQQ@=hMFyNH2#6zM+2 zV_%sDFP^hWaiHrFTlT1A4^>1_!_5Vp?*NIX>^?T=OM%))a6o5I1n; zuX8?Inq6}7Y?sLGGFBb94qW5QqSk=t#W&U2*Y6FP##Za=63t1xPBOv#Z6Kh3j~@Fm z36W69p*DAqAHlDgLJdVXeI!Lp&lA~}ZDd55gnA=BVnLP+fUC8NHWdD7BovjCbs-`S#579Lotx%3y@0WLt>mWodNqB-ZNdc#lLAZ6uvddq7$=0TqHAOoV0* zWOZZjqtM$4Of%-G12cusd@#!gIr#!0`46tf_poejDSUt-R`D0a)Q$Dohp1ga5ei}W zHvO8aK-boj#_9E&>-5{X3*WcAR=d+!&LnEk(@@vCd*iA9Q_f_3JcHTzVSOe8+~+}# zc$hb4)`P96%FYG&Da!oIa0`(<+*Xz8~#NsPlVgt(Wnt>uVPgRn(`B!IM3SGY^MEy~t zPnqprE(MxLvBu$B0L6tl%JWcO1KT7U3D@UnHRJ>#%+{Ip_6 z!$fJ#u+o5l<){?_>fo5zd;fC|thou~hc4cuY<>F#F)%kvudz#eZK1u=1j^&?VEh zHuT%2g$`r#&4bxO2CNW$b!|2`j6q^`1gOJ2-?z{gDFWO$t8=;3&SIP+EoRJ25G*V} zSpyikC{AT9z$LTc+aa1F^}7C-SZ=INw8UurC0RI_c}w7C3xfmhTFowQU-5XLxoHBD zLU8@jk_Sf$@-wjaqqHH~aw7F3xL&h7lCS?RS`?h6s0 zIzrF7JT~)|tiA=JxjY?iOQ5A{cpxX17I4||8c{3Xph!o%Rb>>EeT)Z}bp!>g+s)sU z8gZYP0`dU9zd|j&CGZZmjQ3F8$W!Kf1IqdEI7ut}ZUo}}ut{v^6#5PZ$)0k&9kI;) zi%tsZl|7sFmc%i(EQT0iHWVh?_`1KgTf3AXJVR)Pfww zEP-2kvQ{q`2@`$Fn43hlezyrKCoXIXkx=dh8Sv^cZ*O%v%Qc^X!H}ZfUx=)g5!AIc zEsadIL}4lZ(V}Jqz_2Lke#Z=q@|-vRmTWt7`qw-+2X&|+ohDv)!U^4sQi9wnlBzpT zLwy#D)~gCD9WvWXIXgu;U7~>^ZM#hR|Bxm-p!n>8ZxRK~3?3z~D=&xBGYiGcAeq|u z#_mSGmswkIM6@KNYHjGZSSX&PH!?d->>aP_lD(3DXrWg>OZsm)>3BTl5H6lSJ*t4& z8FSpP_I*F(ZrV%TRe78XjA@_F2+W?9e*bQXStv^!V*JO4bLi1y+;hT8wEh+rYO-x} zja&~#N2(VV4Qp1q#FcT} zX3Zxu+P}T{Il~_Zk-Dr=msE1%eh{MzGMzkGyBcLRI`uvm`LrZ);+Dhr!5{vcZ7FC$ zP0N>l_)w(B0Mb$f7OK$U^ij)b9S%)tmzn@B@x0#RK&1or>&82)*L~CRazQ&$9FUsy zK>op@V&n`c{|H8QXq%TH4g*jXDHCrk{%FycJzTm4XH&P87@F9S4h;0v^BunR9%7e` z(UEIw4QBp{m3g-1&*h!giA{u7kho6Y5a9^G#fqWDu(|*ZjuF5$I)uv|vmFX5@`Acl6gZ=nq*%#N+8%{Ua{oI4j;Ffrs zKzx2h_%)e-3_$yp%$QQwi6U49ovkB;_)HXaP4KHuyMEsH1q&Vwb_I_#mtyc9nlNAN z)$>D>F9=EJQCDtmt4$NxdIvXR4-W>7@triyJ#}tftLt}=vARbx5?%A zfCP&VQeg@GHQYfbe)2)S;;9eZMBU|`5J?a%RVm7sxsa3%sodFg0~|~OUV9%-c*LF} z|5lj_2&Y)=37WCI4%~Ih9J2^AW_L*SiVU2)ev${It&9}Awbs1Nb^e9Lhk1L%L{sLJ zi@pvn3mMt6vzjf>NjmyKp)P^b5*5kOJTp2IcLxl2G5mF+2PHECqywZrpx0LN29>Xd zbg=3#AX}O_2vGX^*cgjcC8lTN>2FHe5iXi@TwHEIn|&Ux$2`<=PUTX+= z$NneCFNNFCFGpQH?|t!xjx#L@9jz0z4mhfowflhl`X^Y}&qmeQw&6_RMa} zQ1>a6J|2zc>T}(t3JKQe(FP_4_~Oj>Go8{X=cA*I1&4hw@OEls7Ry+vZT5 zwf>XyhDb_OrB3NOshr{TrCCr6P-H?(3OGf!1LSsBT#jA8^iX9lH$P6 zVT&xz2s+6eJ@R&7vF)L(UEOLQU>R{Qg*vvyr_k(`DY;&M_UiuE0qKQs{!4P<8FcDC z@I4CGC-l@o@MC88&1=&*{OHN0Z|fFLjMY+6G0Uh3yG_|Miq=8v+6(9ghH%n#M+rGp z9bxoX%g;9B7s!Fefmw&$$&5BSunRH?QNvt?2DRf;NE+o~x<`e2+RjhP+0J2F*5O@bL%0z%=PyosJ z0dgjD?D`&_FVyV3P%~Y#k|1PssZD#uFS(GaXD>g|ML({`OEJ_|fB5$orB=gdqSWYm z%t!M62rxFo7?}TI=F8t^hwCC;Xth+zQp%if{^k2%^Na6X{GQ2i4j@PcA%IE#iRuouqfrIX!yOCJ z@0Y}+R3%s2&j=qv{&@W`eguZbDk%q#!-tD9M63BcE3@(0E_fCW;K(!pW?Z6Bhwsts zSRAz4m8tl>CSO5if_Do(=j1|wEvkk#=&r}#GdT_ET|d`Q87zMj$t!m;lOnOp9)a1r zRj;=i=J0Gn{C>Nscrgk;@#rNt?pu-dakeF3?E}QqG$_je4y6Hpz=3G(8_3G)=OC~y z>>x5A=Xox#=E;*2njUG75t7T{V0a2I zSLh-4?&Ab=MjW4;iyC7&j@pKN`0FFS`X_1hjPct2Knz@?&0)=o{#sf<@%f>$&8u`a zGUyfaEQ-lV~djZ1gd=xPS!-9ka=v z8{gv1UvC=u=6ya}TNuI$49!5~h!Xgo9}<+{iPCZ2BgY=cF<@6h*cJ&#JXIt^u#qal zQYwynCZn-~CQZ;_5JTY}6NAvX!->z_qz7e0jo0kQd^Y%p;EESug)u908X?OqrHEdg3N~-e*}F!EzJYe(`1QWAD1%FE*uPzBUVgE zX7hP=Y&IV*ZU4XG<&+8Q+FjFEsT{GUBva1Dbgqv`Fgb0fZ%`%{y|Y9$s~{(1Fc1tq zNwBZ{g`Y1C8~^|TjXk602;N84?G1h@po%5EHr^KlcQ&!?(5T!6O?7#KU}BR(FZH(vy)C&+8K{V`ciW`m|8wV<{> z`R<$uXskHxVokBneb%eV(-NhaCWHQ=Ddv@n99`&Ynn_`yYyhTNvD;YDn9oryKDz;O z+j{%>cA+?}r{Oa>cz5rjF0SXJXB|?96}9unuy4WHg+!d%Vcr0OxoT)vV+ZGCx+F+q zWOOpZ_)4FS{o(i?hM*gI6V1F*?lHaA!xN&SN#_-Y%<)w>_lNM;SGa~951hDT1;%r2 zPgP3ITMkrT{ZvIM7)!}E8!NDak=C~U0)pcKJ|cRpof;NMNIxB^{lyGmjis>KU0>MR zpV|{xG;jg?8%v;%O#0DiJXPBjmAC}@nv+-^U3Z|qY;g#_3vUGv5Z9W$b#ho(In%iE z&4a0FkWrZ8WfYt3_7P!5A8ysD*wg|b1jmci084x`(4#7{@wK`cLzy$FY0Kl|4S#nyOR@MzG!T9SJ_8y_?6@(xSCM)*M^Vuj)ybH4em>5pk2H|&T($*no zwBmEGi%-s@3%;)HzT34_i1sc`vnq~r3AQ?IZtJ{>>%W^36AqZ`Gi2}(t4b)R>3dw* z3Q|~l&6{J!G;~&55qUl`1h70&El4pyBO|{|nn_WE=1Mi;Z*e2Z$t*#OKNElHQTsH9 zv+$aLz&XzTZqCf|Ys!TT)Fi{)Y0}rv>p}W)U#t~?!lLlZ3&fCV|NAOfgp4WuhP><1 zm~w9!wlIDYT8hr_^Uad1s51=(?m-t?7X~mcqO1v{^Oi!G&&?Q;rDZkNpflAB5{f=U z3P*2eZWqmj1)xZpyW6Hmy1D_NLkZyuXS34n3uL7+)d!p|OO2b&buVhG9<%qtTgUKJ z_h-a+RzvzA47+SBLnOMyt^pv)YyZ`R;Mw{E-fs^(7U_*6>1lbjG8($i6~a0^FiceI z&ZNf~kg(3{RvTP?n-MAmw)xF3VMBt3w}q?w`>kaMbIq-fNVA9wr8xtVD5l%-eCM$y9lC5VriW#s(KYp|>4S}zikL(_^=SXi;1K8x8W#wnLM%8B-0t`O z&YqTo@t^CkwR>{z=`G2x;*&`mN)IwP)R42wQE~aCoVjIKNax z+#82WgBb||5<@u&g5)>AaxAY3bWx@`*)8E(l#TA#sZdRUNMhIUWG zuW#slsTvz`rN5q-4mQ;@V0Z3kg${yXhVvv>b@lyTN?Gmh{jkyIB$LCWO0`{jU0Nli zyh7z@kny(+9VNobOCqu>K%^8K7bG9qS9qP^3l6vPG4ror$>vNw|KmnQ32UyR#D`yrl{+BP+V+x%tRJks|gWX+h5i2WnR9PRkoK&ARHTyTHu# zMu`}&EEOE;v7z(eTAT+N?w%A}flZ-;z@r)O>n&ZD62M*B_pDR=bZp3Nn^!+gay1Dl zA{!7v{F*zc(!yc;DW1mbwPPk3Xs~qAOiK2D%o2{N*U`M95QaB<@@7;q*BV@w0DHcE zmrVWQH}2eXcV*OHNQTl}w!sErNp9Saqt`0zv`z~VDga_{jc{+-no1^ad9g(!3;bGc z5F5n?o3cllyx;$~5wVc6?+qq_)S!K$Ct@&uwBu6ZEvxICOgS+X*w(AmS1;q1O@0ba zDM=(sT_wg}pw}a&s%jKj|0y~w6DM3u;W0Az(r_ty15JvzLom9a$Yc)Q{bm3-tiRj> zqaoU8b@Okki?#8tWA^N9gq-@F$NRDpAux_z*4xxT=W=bt7z*p$m`xA`mhT7C3Gd{- zTEt#z6@DiS(J)3PxCzy9VSBY&6w9ngc;X1=0>w1k%HL3J{uNJ^pu(JMjrae|8C{>h zx^Itv$z`-kz$RZ5d{?j>v|Q(~df8XR?!UR5x5WeakCXUHdX~lQ7{-yMIPuT0(3t;K zj_|G}Yv!b-cpVr0ac&rOM=$8|c1fiCG!^=p;n(atbS{Q9X1@Xf_p4`F>+x5{JmCAFUwVqneHKdTv+J=o_MiXW1N;L` z!J4;Q;DaD_8tKAwopmn`3^e;9dU%25QsH$3_=oc^E;2kOpz6=Z{0ZGbPd~t#VV|mR z19$sMa`SzKgE!uPana_t(+>Rbv4)i~ZARsp23p`&UbdVwHsZDd=B)^h=N~2hw|T9L z6w_ERss0n#-g}Tm)`f#K7qTOPY;|fP$$oz@kzl(#Q@_d#9QKwhtM{VFkDQC3sndS zfrpHiTbysY5ZNn-#Hej-Je4mpijaIL0(tRU;x@iU)jJWDiaK;ACt!y_w4|0svxcuD zUo_PwgNQ|I>|0s3p-kxpumocdQeg@GHN~QbWvWCRi?_pJr}yVH-~a$xeEge58#v@y z+-wA=MxAy$uA)!~bNLsrVO)bAA#UJn64k9`dO5z8ewVm~y3-E#6!1F1z!EBvbRuOD z6tsY5ft0=B%eQzla0=%te;c6;B#CvtF*Q;hTR}w#kf5ni`n(f8M-g@8CW|E_jYO>= zyL$yhx2&JB_DvpZODd0`hTa zv1MWY@mqN(#=BhkV)ET7=WkqtUUdctS`;|I<31h2?b=Gj+ZGNo)__tu&HIPn*L?x~ z7B8>k2+Ut%Zm~sL!#e-vQ=GwK3o?bmaA0nDO!LKGd5Pf1rSjw}o92PC{l!8Md}DEb zeUc6X6I1*xcTndeGf2c}{V^s~xzd2%*l6Ny(1lwZ=&za`L|n&PJ#5YoXG;RPTW|eU zWc*q!4_MP8fY{aCsLuJZaV0IZyk&yqDsM3f((9oz`wxst`T=S=ZWP){6R*CLqS{sXa^I;_@(04X^rwX$>)5YoMWO;_GvEDZDrI= zhmaCL>FL=^xWO6z&`yhgP%&=3Gx(uZsaZ@hyEKpjfMR7{vS9p3T89;i(+d-Rl#G7oPGs`o1eX-+TlQ2y# zD#TXw*f`*-fL!^-N z`ay2(n4oeITW~yC2S9Ot@tJAg{S6%7vx4ruqAz^3s9Wqd-l{f4t6Ugx%?<&MdUWk% zo?#Qvw6+Lm=|^zuJ!5duperShXO2+y{u9NkrqAw^{~&2@S!;32-$&yu9jSc zUSH{>XF`6EC1%msQpU zhMFroB+X1GQ0V6-=Z9axC3MW|;{`ZNSfXC30{eAhDno6W8C;b=;|cwewql_@#FMx- z@JuEu8IHjEH$FHCN+ilgdexkdB|=bdCC1D6MXB~hA#|%GySQa6 zOdeg{Xn2tTLcTkOe!h_FUUxE7Uw57nPytapS?|nW;T+^{UD>Rwc=2M^d1L1n$Uw*# zHv@4bE9TX@$$N`OHA;JZzNW5(E*jU{T>!!A9g%lP4LQNj-}LkP332xhQSsqD1*2+I z&rQy+*fs^7GPZ2dLov?E#7>0dpS>wlQ?heoWHS#9Y`*t;s^)a)U^=0 z#PM?&-#@!5Q=5$cE_^p5JntgPMXjBTKGStgj(gv|{wu@n-N#SZj4(5{hO`nNDpkVj zDCuUJ8cm%SWLX>OfiwV4pu}Am}ObX zpoA!kOWJmq;a+11N68TLz4iBb{C%?k0Z7Btn+pHPS`Du{&^RS1`F5%LAU*&90T!Nu zPO^Xi0XDMl3QQUgD98&1?AHKO%-!Jx4U>4Oaz#4HeiZswE#|8}mZ zVcH~qE_zF_8ON1offI*GYhT>udM^RQ>?j5xo(~X6^-Q1>IagfJq^qDT$Y>b-8n-jQ zF73{xg5gIKIuZtpP1CfXn(x^Ne!HVWX*|k6(5O2DZ^1KYWZXd_3_ee^=4O%e=d2&b zb(b6$P-Ixo_vI#jFRde~gtbH!k?p>z*MwUE6A|q0m{*O`8RzH-R>lR)>dagGqpbz& zF$_?=vW7HRY(X$TcJ@?&w5l{6C(i)2K;nhpV7#91ni_45uiud`XVmpg_(Qs!)AAiE z#*eIl@9|)DVlC=qux@Y?xiMi*3LJ7M`E?v{H-B3wd? z60()Ayi1R-*~%uC>Z2HpkD@q8Ji@r+h;5f-GS!mfTq?P_0?gJ|#1*xUdf^g`_o_Z* zhknjiKjF7Vw*As1!xr_rJdpgWtB;tWK8ziN+-I9+l1U0MHG`D}$kcVexDbh8000a` zC=emU^STC-pUx85=47#-+nZ+XNX;>Kf-~T^MC_!DrnuM;Cc#>Cx0ylBIyab$wU~S# zgBoVX>(BNn30t!*J60OLW*Jq6OHlJK{=_2xBQmg0Q67XAs~?EtL#g^iT7HjgL<@KG zhli3mRUqWi9g4I2L;#XG5)C6PQu0Oz+nb%oX9Me6%IWMW%8+<(AafD2$FC~SSac?J z%;qMF){5GYY#?Q&yR-v<*Mji<>n57s9LSsWJ8wo?=VVI=8e0#;4L2ST1g?ZDiPL6s zEF_#B(>I*Qus4Yc*>(e8JetglwWYQwpoKDsqX>l99Q)o|LOkmiVklo0LhE>FE`B^{ zO~GfQY}D2+PL!XI?+|@6`B@`==198N2|2zBCfq>}d_P{~7#vkN$|-Szb4RxEbHVv7 z--8_U4WZk=JW0}s%$d8KDFAhNel{)X?MIu@m_fQ(B84959XO~xIOkjy<|T;zAG^Qj zIg5q=iD+mgkjF=#$!=Q9@Ik2r>oF1n000W69;Db;{z8%cw%sj%1!)(?xGV*SF!-&a z$|i?*Fd|hL0UsWWBc`%gl6cOnZiy-$^lg-K)9t*WeO(aLJ;YDrEQUFae{_~flbo$` z?noKz_@5Xmmb9Td5H+E@Y%h*M2APY9cU!4$vn_i||A+xp)6Z|&j7HWZrTNBCyq*44 z`vCQ`AQ)G2_8cMveZvQP-oC1~TSG667zr>*R2)WhLK#Vi%DRkr4CTs-97j95w5I@p zd@+~-VDF>x`sNDaWS~}cbPSKfq_%VWhJ=DDB>=^Ncr(KxuG9waYWpxFw)z`_t)j#D zOqf8wUD9y(X;S=9iTOnhLx&t0I986S_ zU5`_GVgcElTYQp4-6C{*yf&nMMa>`5mA?yQ;trAE^ z|K|Ai(gZpM{gaSJI1iP{8`3Cx(F`J!TGe;d)5g`lz8G^Gfg&1JVBjt2cm+6+5j6Kl zK?=H3VAN9#UlEoF&KSLSfT)t<0004O!_=5Ue@$%m{GCvz*cALA002sl zs=ZgD>6gF&0G?s$O$0puR&kV7f7Hi5yu-fNagXH&h0NF5*bFXB251@-Z zMgRZ+0h-`#kzR-Z04kVzf|hh?JqWBOp^*t+MRX~}tTFeHcE6$$g&@RC6QpyBOAHO} z5u662SXZuwc4!3c5KaDC0vmn-5ZQ5l%$z)k3zFRv3*E1kgR?i}Z^+!Bh|Y2QkC(HH zJ%u3`XU?n|jhn!aV-tQr004=43|Sd3K}NH%+HCy)0003Uhgs26EEtGNf91ES{Kj=) zmBXXcf5f<4Hp!h;NPmFO3>tg9ZQL}=E|?n0vM|YU}qGT*+2~{ZD2%Y73Klae;4+)m*G5T5D7i?7*3W2<{uTb zr|EhBeT&M?!S$b0gUu|???VP(UL$h+T*RXy)yl<|Oy{`$KsC0^WaUFiasx{tWf|US zo_2c$CSzG1{JKcOM3&~0MbQO#AYQ%HEj^^obFGoMxRM{$sjqJR7}~pgwLB}0bKlm= zvr5&=hc*{xjy(X6zP`t&7R>>vem)kj;T8+hlu7zD0+HRP>m#f3lBmC+rK#%YF z%iH!x^U}XJJ1-vD3m)p0#Oc9SNsx!iqit&11f@|zznGwtuc{n_wz8Dl-^Z|YMzH1% zr^~e!ezgULTYa@-#zN^Az>$kXh_O$5520kEm8xuY*_k;G#>y*6Sc02hGJR7HotR&Tlcqs~TBi zHbOs-$9|b2OPT2zv(O)aH_2&qJ4cwjxCQz$TE|YT10%j_4>c9t|zk_t*rS$xn0~Fu!X;JrKU4r8wOfh>yTenpB@`|-InH$ zH7eeC#R#lNYuA5RG|wBPz6?Mfh^H+Ub<;{ES$03#(iP5cF|PSJtl(TUwj&@7 zszXV#iEN1FHmE-!WO2bVAstXzg3@Qpz(=^^Lp6%yiE&o5_C6BCFJ*ZUdnh!aw)W?S zdNJvV8q;6GWZ)@Cy0XI*PW%tPqnnPeqH9ZGzFd}^z?cbErr9n<$6mmrM7qc+sROVk<^@59C03+yusRp*R56+#@y3A|yRNZOlub01ws~ty zb!9&1S5CIYhz4UWD>0mHaGk7QY&m!d2k0Oa8O0~gq;zbFB1NL;CPjly9)E@+EN1PY zM8;t{xe>EdS$LAR2%@se35>TdcW(;`nwCZc;`ont^1zUmCdyvTv$1!UBMDRqd--Fj zkSLsXy#8M^{aq@w9_Iak8oqLF_HR>vdK&C~9w$Ln(I6#2@IoL!)HR!ZC$8~ZJHb|! z755H{Y7d0qP{JAyJ60$av9GF?#xNuhR@LY}xI-ORlwLQYw{cp4Ds3gAMBm&wrfAbg zj_w7{P=?6|%=ayVEHy&+GRvBeuM}=@FxU;g{YxaIfjw%#nxnZK&OuljbPK6KeTobm z_zmKDl+@fyI(EnlR@<|0**k_r4V71j6zb(Pr~F6gU1}a%N3>1HarWi$Gzwc5%^=i_emc@Eqw=k!C5)mRHQR)nb#jQ# zOgu3OL7f<2P5yv@{N?<+FP$}FjtK@zQ6BH_8_t<$K4EOnUo9InUXW})8yM+bKF%4% z!AJz`vsK0BE(+kSFZ%~xc$gA-z=Tdu2~o3e-vetu64CQzPyXZ4J-c6^V@`ba8yzio<%=nux)akE#dd}^6gAW230tt1hc}kORRb^`e}HT zwpwJ$HtMLgRldMbyLU?yUYrWB4*NHI{YK3vbP&VXEP{u9^C#Y01dw}a(&oW&=x)XE z!46_vNdz#2dF+F=WdQRDfNLa#LK`c90001D%Y_1(g8NALtS|ro0_p$&03mt@@8Kl6 zQ8A*P2qs1N`E3%{yATcD-@001ch$4>#~=j#I5V)JG=in6@?H$XrDBj|D@E2X*< zk+CVIxa3WdQwEsfUM)xqCnCm0v@vZATSFP6su=q%3*+ud@>O*Ys6y2?uH(^|ULKeZ={F-uNk-Zcwqn);=EUi@m?#( z*>M_q5V9d;Ldb=Y3nCUoEQnbUx5`CM1_lVO!4=pdy98HYitG_xf-_CD9nlK$UMt0T zuNC6FSBKzVPJZP$us1lyU3GPr>u;A_%+=9EiyITmsf(Jry4G`Sj-J$9h>7MRP z|K^+N`F{7GyVlKG)T#5oy$0adU7 zAz1~X5%>4E4{EJ$EU&2ypaK1{f;VS7sxt||%;?Dc&`-()Z)$YjR$I^6 zvYIJV5sk51E3`2YyL#<(xuD$#P=I~3# zm?1A9?!6~8-0G1)SV+#gcpSCV?hQDb#^;^pJLcAsVk2=_n(6wl^+V`Fp6{1M=I7lI z1-WHs6N}B}9OrCm4@kM6LWg$D4(;w#=^7|t3<{d)y`*QG7FGx%hkptq^uk{Yld9^h z#i2Zv*F;QoI?wu92=z`NB_FA)hY2&@SOmN2#gy>b{aN&!dj^+ncJkTx)Z*-=y_40J z*3A>8VS)Ge%Tw<2T;41Cx_hx}_dGYBb)!jGcE-N;Am~o5_1v&_9{}FX1J^DQ-{~AS z1jnp-a98!joOyDG5GRlL_nvGWkiR1q)0w*10Us}UgCDLQKfG@R?tgxH{Ky8O|K5DH z1TF@D{YR%iI{Y@~|G)i1O8*~|(C*Jo}k8?CYmH~WME7FTHxFJq|e~h&9iWAa$55j=P$0bYvjs$ z0t=QgbF$IO5VScgxP+Ae2GzLu!ZKaBGR0I@()2E>iTw|&h_JH!(_U&;3D{rMkG(V% zlf=uIiU?5ggsmQ6zr0e!XAX?T4ha?6E(PA$>3#{6eq)8S7Z==mL^^a(c@ie$EvQHO zvI13$PYjy623f383yHso>WzwP8LLMlxb0QCAwf50#bKee@&&r*QsLYFGTV^Da7DL^ zWHP#W6kD~Xfaz^9sSjccKhD1P#Z3LqX=NOV>BDkQTVtPK z!zVql6nD}hD$XNlFBkJU4md7%a9MxwxxonRC?Vl|MU$y2Xn55mD5j$$0X4`>7^fqw zSFcO$MD`QPxpu)t1=wru3@q#Ps-C8#mP$~?7csh=fYulpqiibbu3o(|DNOGbzR@LX zh>y5LwHwQJvm(M;hN*9Z3b?Ax(_+;^Eim9s9ubBF6vE~5#`&l4p+X})k8LE1Xv$M};u38HD$jO>nT+s%?h2sBG{ zXzx_M;};MBdb^mAF`S4L{D`}>nBy}A9rKa8L*7;dH|IX&9>G^`TP!AKx>nsP3m9(! zbA9y}5Le|0yqp}@fmz*cnFNlw#oTOWhmJ`qN}{7rQ&<0rD`$3-hac@bFL`%^78sB8sW)OYpqcyL%Vtce|uKzPfi- zEsc(hGWWds!`zlb<@T#13&p)3`7Dcg5$~NTBYAy)gqvZzA5y?0@S7K8kQRQ!^=#h2 z%lDg^qL4ez=%Q)uuCtL$E|h_=QMhGbMvp5Dq_?lhRAtxWHip+26+n$=CNs%Cy#g+W zOy8t4?j4GU%iiK1wC5XfZ1}hq=T?OmMM;~X z9ApO5b4gA-pJw^k_SZsb0zEpH7>!W#8Z~Q-i;(@;&%VRH*&5EthMn@^_2>AO&E6J- zh6VP5Y{7J#-w`s^YxM6`3pt~bM+lJa-a*nCy{6CSTfNuYPL8NPK{Un#o;ROZBedHZ zwR>Ewz?NY%n>V-#qK52o)igT?gwJQDQ|B!2{lq-RjWb&2hBNu1uWjil$1x!5W-nsU z9o_J{tXdJlq>{O84(Gf-Z;UtlQU4U@+I<6<@#A*vkQ_XJGtNKj1@#%bL`{McG~YO$ zx&|4W5%>u{;jXuHfj1QF493-PK1^`4iq2nvJ{&Yh-OY4G3Qpzq=D6U3bj`9RraIjd z+@Eh`+hDfa0w&M1fL}nawzoX>%I zOKlFOV_}bq<)EjkYk@S6pq1*v8LR;_;J?nwH~OP|$>fb*33~>)Ae5F1JuXKu4}FNU z`)E`<{HV8b>r^N%hkUb=5Sipmi8UIstX9m=uqim+_qu=@9ZZefnIa*o9Vxhm>B%2W zYJz`rw~@{31V3A30BZE0Luy;`uJMiJb#fPY`T#a2)qqI(>QV_6vQXOikNRLPuR4l{ z`OtCkjbQQZ<#mSHDyX{)`i2y7yrVx3yQwcZg+*?$Mog zcV-GXgz`JVxPS(2wf7`_+jSZpirGqCL5=aIavIc91VnLp*_J z<30u=!c_P%T^NHEU{(+P9LDutBCnIGG7p{)uNNAmGq#ybBpxQjDG&K>*UTP`j*fnn z#NBXnxS$Z$0Z?41x6`Kgh4FhfLjYCB}amc}rXy1dba3E6Vb|^RDgfy%& z(JdxE9&n5rGCO}yGr~MWZHB-I7i9Z2w%(@dkXFtI#af8@pIRMsK5Ej8taBt&z-)!i=c%^j0D<# z`h=eV+4PQl+K@KH(PZ)3%~&}Z0|Xs&{G*}P8}B%*RTWq&#YL6*|-&IOvQ$2))U=SVZ>;szJ)vH=9AEirN$X>GvbrYuw@@+Lk zAxa7c8i#_TB?L1aex#|bb!9_p^6{&kXOh(q(7@ppMYkhwYI8>P=X&?(Ba*|9xFzn=jZds~YG0=s8v zqqg*qAP*eVy`2Aix4g|4Ek)udKmR3DGM3FWiS5l$-_B<`761ha{-G=~k<17_#5i+Xv)$-oAy7V) z&)|%A@(AvopC}z6aI*Ds5dd+BoEfKQ5ZmjkIs1$Z(Qb>zCCwv>@XAzUK~SW$rc4!% z?+8M(Uc>Jvd|?W+1c6TVf5%LDYIS4Owezh}%*ZvFu14V%+xx{NIP*mJgNJ ztK?%gN2-(gMQs2sKlVR|Jrb6T`gu_Zf^O4wyjmX4kvpM_tjhK8@+NzP14s1CN2KvT zx8$T}|9%JcXrZ}Sbf+39E=OdIw)b}-O!GH25a=ho_zXYK%?_bA_XIndVUT{gHlW7w zt=dG|`FW_r`p@M=%)vQr=vh`hOEm)!w^lq^U&vz5yhYwm(6j-OxL;us+X=`K^?9dw7i>>hSlX|9P zx%;wOj1#xjJ)Xr@)|tIe8TAM2H`8NawM~0JmnwxGW4D0KCz_0k2( zm}aqLH#~paV44)A;obi7P$zbgX8WBE$my(!RN%D}9Bh4g2pjnt;o`U}pkjms)O>UQ znf-o0{0jc)^@1%r*;3vDiKE;P9Vi1-40o+l2AOh4N%|-pnU``x$_e(Fa5a-afpqz$ z^QR{y1LCF*g}IAoy$#l`4g1!0Pn^*bzAv-n)@kv+YqP+37l9!=J}OCp>fLKJr>ioT zw9EL6qft3#?X0M85VV=fxuuPND>i9(|AN3KqloYVDsP&ZVn`Uq;SKgz`kmT(TMMl8 zy14C==T@&x!UeY$symu{VnX6)KH~1p*RSNL_CrCXP&>0WDd28!kQ~-JP|6Td-BXDu zySGl`b_$?BoaC>OAln))P%DfiI@=S;eMrs38Y4s-9hYVInlZM1!ANb7(-?k)d_NAA`Fo!clit4>a2=2mWDCOXFZTyAud)i_u4=18J#G-0FUXFN!H2UJ>; z!1u@SM~hT+PbRRPFu9DR8L2v&2z(RbRr12TC}%^Mg}KuMQ)V?o2~fU;)xc#W`g62D zzhfx8TU%S-db?O@v|a6j-YPy%fGACYAtWaukr{Z*$peZ`>07-y>p&TVns zEgM~WmaC;}vQ4cZ8-GRIl!}DANc@Reu*RX0qjI7&0S#cr?5$Pvee7*9c-A4kKI>-r z$)Xn}-PLd+yN=5HQAQC8D!5K>SrN52p}<|Q7K|P<&e}vtYs8~4b#79d&s#g*3_&v| zQ9*filLz`&dF*@!#{Rh-OacCBnUUVdN^Yp90{Pk#eQMbf`e|Wg*FH%u*RyAQr~!*RQiSMM)|`Fd zL{&7zAmql-Z47!N9#Q;sU>fR_m9Q7fGmb!{hb);+c~7wcUZjpd(i%0RB%0)4&FbPZ zrCXFBV+`87@TJ!H=X-C&$Gdy$1xNP>sD8+5MBgu-qH%0T*BH6w3uFj}ut=trTH}fb zmYRvmC&&~;W*ufSO^eOVAKI`m18ycnvyr|sTmPDZ+9T_ph407}PpZO$a{Qk5D2HWRHY*tE zF0?l&lrFosC^sK`o7|bR*k5Bb!?E@*aO(+)TpyVmy6Y6~Vq9)RHcE9qI_1j14VefW zLKuO$z^iKd(1=CXr>O2kDim!M`rliyx+gTl5!&WY539FXE)#VIMi=TP^W~MTF=F;) zeP29zm_9>(Zk42sfq>t9cpMB^QuH$|8A9g}IO!lcS`LaFYsC?d!JpI=FgEq~gOLKW zVnaqG>M%ygFrLNyxZ-5uoSvC<%s4EX>^p+aPE;4al3C?q+vuco-`y<7$94qrqAV0( zG&#}|hit=G&(cUJrZTCAkb7mpjyFP?6lZ^jBHo(Rk~)_ipBTX%NjUVx^Xe zU`}OZa5?99_X0te!z#pLk75=Xk#HfMQLX39&m(UD;(`I3*d(8ESR?3_s8ndmZ-chc z9j23_|pJ7x4kV$-;^eg zPm9CITzep=ajKJ3>$GcT#`%CP<0nbYZ2*{ctj#tcI1r`ew9WepA6Wk+$z=SN>mshkP#YIy0sHjm`C+-%bHOC!1ATxL2+LKq+RXxv&@ z8?H|k0`#^J5O6YtQ0_WP0&3m1i?cj@h}JR5FVl_XwZG|6u6nIUlR><;-PTC+iuJJn zoRI{@m4solhkM&!oQ?LBG`x>sJat@a|D! z^LaQ;@{|#&jFq11h`!cV{n~b2_~QHKI@T!P=^R8hm6p7YcBL+^R{R;XU!O;TzK{8; zB@><&GP1vvndB!;@<|FDP77w;uluZh{q@G1BqGU0U*xU!A_XFU#zChOP~#=7)q^t$ z`a|y-bcDiwJ0iU!{`o&-- zzolBJpTPRkjfaD@J|j(9KXpJ9u4oK?zZgz()EUW-UK`$6RI0`Lwq5Ey30>BQ$OQPp zbzzxX?Uz?kFxVR9sDV09_p&6sVU7sHb6QO8&ho0n)zk>4A_4f=$S}TNFk?e0H*;HM zig|8~Spq3+7*O$z@8{FA$dSL&GcM>fXUA!j)h1F1%ZcjbTD!f)oApv`An=yDY)bvg zq90&4!seX@iH>h|y2Ffb6P!oJw6$J~BWA2x^p?a8?b2afkLv@JV3NW)74*zGZMq*~ z@>;(~i)1^t$Z%$MM%>ye3zaIRH~F@tHMM%3^u}8V z_mGbC*4p3YNP2)`MkYff)#jX;qN&myTD}!6^@A%%nz^4jNrL=a5f_$$x*(JBBc`mY zK?wcmd2St8(Xsk*_DRJiFkn#qg8eC@eyfEr6SfFU`3QRIut76rOd$73|3`#H4%aJc z7ZZHs%RGy{@(~C17(ON6*w55P3;`LH!aQ=XpY$X>u`~^))4psKNaYX!dRA|dAU9+x z5x;wiwG<4+i+x5yijrDUmx50VFKt}3vB$R1^kgpG(73JVJDoeviRMVN%JNrQE(6l^ z{pa7CG%*gYnH!#4+`yCtSEN^qYrU)=mq%xVWsR?!3pka=S9ZMbYB+Mk*9K1tiw08__MneKkI?B6oG~ z&j@91VkjFns-zAf%>2d*Y}U^59CSEJ<3FNQZ1yW{y43K{rq3ZJ{r+Kfd6^@fLg>6zxhtA# zKTCCa9OGwENA`G_l&{fSE?Umk-|xo(8lP5F%r!14EDi%;>7QsHR@B(pJAO-iqqfw) zmiNK@`fE?ESPolzLyH4vD^ysa9f37JHMX5Q3)>#ELugX3&pv9L7Lk)awPgbJNA08$%N zbL!-YzH94fzIw64%kq%XxIxX_rP7525R`-sl@%>6ucxb&p^}q#!MOHRy%asR!OCKM zzZgx_GH&9WbVwP)9zEuRalad9E-cMN%9E=8R-T~{txWw?_uDkN-u$jFzk^~y~lERE}zONqVvV%1??v8rk67(HImDD z=NRSH(yxdSOOjrVNY0s+V2CY#5@Eo+u*{~Yh5x!)t#d+WLnpm6E%E96i1!q44q20i z*E!4NC2U>96?K_VaV~THu}11sxVR8lwV8stG*x+XM@6u^XtO33&+3y1O(N<$feS_n zPF>i1SpV3i7z~ls@ll4!7eECLv4zk6Q){sqruWAv6CS|OY>9iJK?aY3X5Ia8#+Q~4 zegYAiK%Wi(=V++d3qV@r`(17)3@-YZC`yIH^VgsA)^ycx7J7oc6^*-QG@v5~-fM4q zv9y2gVkr`bM+hXZq!c)6+aT=CaVIX-Y*}|ie&c6^>887V2b9s;N6L4Dj%zLBn2rh` z6s61$3J+59Wf~EZDnF;k_o6WElI0*#V}GD>BBsR-l%0HoE!a<)>8LRF2Byfr;3bV; z7+TN{Aq5RBepe%3xhGM^T53fE5N_NPR&>BBTLDS0%?+|MPZibyOS0KR%c z5lOkl@z@Kq>+&k9i*hl2?uTP)Op$Pn4)SL2$~PG6yI*=sMJrZ&R|#p|ypU8Zq+Fps zIoDeF*0Y^I*m@k{I_6q{6a7BeXaTSYh(fwV{Dt8}kj3y-$gx#I(|-KO#tmY;^E@NN zJi!5#Hpyeu|2PYI84LwPh7%0i?kemw$BnVfy~dR7%tFdl3>FXUcMfa=6BrLMqkw;? z=wAd&@9M^OLIG%58S}%971>WxOv=mNEJipmm5$hN9g|TkXTWrwjwUmUOFd7?6YXW{ zGo;6umuJvXuXcwTUIhf)mPIH`rFJ^{u6*FnJpwP+I>E}-kZ@9XexK__-xcr)IFFz~ zMlVdYGm+QQoKX+NjPT8AISma@a8e@$tye5dnF=IMYu4-Ghj|OyTH8TaQ&TC_2U?B3_Dw*A5~a+`!jXvo7Wo0%;L9w3 zBE?7M!#i)DSJ?-sU-a-r?GHv23!9*)zh%7qLK8d@hLOGshm$myFNiCI71LpG7&Us; zzAy`|{6hu02I21P3bA!PtQy)EP(q9X=n{c>C}as#`~L=(>6M6( zwI)`vQfXahZK=xYz0mXB%olAz%K?C-(ruoK6PguR%4_(L>Og!0u|zobCL?1gYQ(_r zU!sg%b(>!HWih-_#N-uP0xwrgx-tYW@_T~WXtLRG{LD;{MN7F@75j7c759gZIs}a(Fg5!5Bst;L1fVO|?=5xT;-^=m zoM-Yg+vpH9N2oU);mvw7L@*Md4<@Q5lCqvCp{SXEdv!3NYH&%~HDNra!n!ppdYWF^ zaqi}G`iZQ@f4~ScxUl;pmb#Hb30Al;LwL)kDu%xJGq;C8@RTaA;1XEf<6SHh0NofqO;J;3Z#!gy-?`hOW+H+c^pKgx6g)+HRat(i7`rt zxp-$-a7hAjaWnIhWS#*I!HM%!7y-t#&EW#}ms2!ruVEladcg@bzK`t_kF-lo)!1ku zG;tETK%s{D@*`Xfss*tr4bp%hh-&EyeE)9gG6X55uRgNJRl87q_d5%$jtw%#4UF@15ZaE~+x-JOrF~D1C!4T8;H5C1Puci9W1+#02}NaX1cXo- zD#mRnDGt3xH{>1AU5h$=4|)(8oK4jq1cbu}V#QPozP)i8LFJGIM#SWnd46!a^+ zI4+@-x0V!E!NfVsxq7$)zqf($alaSJN-RQnPf@)POWu&UxtE5SL}M@(BSfi8gB_?J zq9j?|Q9WZ}-`(_`&-dahAYl;kYcA$`$}$&TTDaIeYhQxj)}}0wCkOv}$YBUOL>0 zJn&j1d9k##w0Lxe=1SC4cyj`JIn378BcYg6Ci%LXSlFXT=!T4cX~_fQw$)(nl&BNd zpPgL4Ewc5r`FQ9(UXt5$j|-QBTe1p}yvEBe@F|Sgsa`r$b|Fsh>#FnY_WS#Tg_A=p zXukqPV_)-84arPZt0gNuJ>)KA0Ob8Pa=~%{z-|XN6N*s+`6KM>SkX+`!h9;qoU@Y8 zAF+_kZNLL&?S2o?&m=nfLzytW(ta;c z4_Xsw@ov08c|f^uIBaM>y04led$%;#Dkx9@F1yGEH|(>4SU>_`u-(WElGfidq4w{+J9I3Jeo zOmDI;1?B~8K{NuLptIGzad0Bo1C&2;v<|jt=Y80^p8}Dcc(b*efH@zg?vM6u^97PY z^uPs zbI*A_VkjUBx&ouz3vA#`qn{q_EggHegOu(kLD^u5+a;Q+Ztom$G)VqTWFO@Qe5HH0 zwA?=Ue$I;(tOgFg2j5oBM_YU6fz!cXLH-ZX2g%a{XXty`$KVd{yoX{iN>7A_{CCQ<-(2TxcAQT#mw75U=-pZ*tGuS?{^<2e zrYswWc=~l(;iP;RniZLx(r)oL1erG`aDk9-T?%(eIzOLy=n0bLml@(IV>ZM=*4gP04|@u zp6EaB@YkivEzzJpx-TD|?_aP6muy+cyu55c)3{q79FyDe&>`5*6IwwF**U#Ps-t5oT7|| z3f1WqkqWtE(sNYceC=fsrh$b|2`O0-Gk{VFZneqG%f<{p4_Bo7h{Wdafru_>`_n79 z_I|8C`pFL0X#7vNNPWY!_tQ}V)~pwMf$<(c_6baX^Al4#b@6L%g)q+}M#{Dav>V^ZlRf{TC_xONVi6$R+6lZuWg?skp)s zvp-oNDb6&6yKIsJrh`1k$yf}68g{pT^J;EqcBT6wyEp5Ql-7&a0oLA3Z5r@Yw| zl&~cY$SI67uMVi1*luzjlkob0i~LV6`k%J^XkJ=58lj%RrnO9`9-h4@rzzsS59}-Z z-%g=f3oV^Ej~9jG{JoA7>n3V#d&bqL3^f+Bkvk$&c|-N16r3o};8|_g-xX5qcYo9{ zS;(~gssZe;Pf<4z?`R--$R?{)NxS9j&HbC;GA=d6^4a{1NXR?m;24cOF&KfBRg`Y* zbg|Nnz;Mcn=<6zJtj)ANRMLvx$Klp8Kv`&XnJ43XowCuZ;z-5?F44>_{K@Ax59UMD ze%?dM!1*akS*DfOd1xeNjLBY$>53Xoo~W{w{bv$MCcd8}xrx^N!!`6a*9O#iMf_pX zZGyP-0>ilnGw$g6Iyl4V;o-8wvY4e(Vh%|-^{^K7J{rB5{-TAXs4w`eWLZ5~?@k%@ z9H2lE_VA&&tk_InP6Xy}0cdCGTN?CO~2P23rS?FQC8CeB`Qpl98fC~_q$eQ?lYhI9Bu5XlUzGe7SzuOW zRDn+pb5KVeFuo7tFa4`X_HRAmUxdrTQ#)tp4VUlC*nZ6M9*^Fm;wsa*#W%j9y5Rx% zOZfWR2dU05Dq;UekRAlx+t72na(Hq*fj!s0&1>Dv6}d_HH7x$!c~i6N{dIni_8;xW zRoGthe&b18kOaxjb;EZf8LaQIR`j(Yw!ZizU1VbzN}*nRylQmqQtg?OZ^{^%GMj~9 zfm@HZY86se`+c|*nZ*3Z6IVA9gMJ?Byr->`2pB|v3+=N$;rizoYq;_1(8?Qk!S5f< zL)89{I4^a*!%IMgY&Cn{q@PTIz6vch&LWNaw65qL%OcEVM@cLJUWtKc-=NeSD?dB; zqdn_6!Ab!}cQaa~(nHgY4>J_Yf1nV5$|@GCR$BBz=O=&t zAvRO}5An;%y;RP#elA|-R+}J>`2EBaBX%-pBPnzl=B902a{3Daof*w@@sSN5G4E_c zfJjnd%;jsjp&LJqS9(eM);2!Wp~!vcncSqlqC!Z!zLd(FFuuC)g;x!OqqZwv{JF{> zQv53$)WI3Y=_2(O?6(+JQ{MQqn~X0SfxI8!NgO0DrS*TZN~ukE^!N|l?w^YppdlzCoe(}=e1!G zrZDH!-}VqnB4BxGijq<@7c$(eSb#u8e26iJ&*mjs=3)%kKsw}K{&oVOmmig{G2iUu z&hFTd)AqweRxLA#PV9{#H??DsD7oE6NZ-&iu8$)#*MCxf9Zc+n>g~fgw0F=_53t6< zTtH6ME+fh#qv-~`KJ6AnS@md-PIXvrXWHC{(yWGOt}x*!*C1u-p5D-WJly*(UO1-6 z_-QvdqfR|OvSvj6@B*}w(pxmcO(3(Zp_qM^4(V}-CCi$4Lhi+f=PyX0w?f7&fAR1? zo$4={SXlEITGeH29x}syK-y&#MLZJ|1(72h&(?6IJRog0zQJOKkYx2S4f_pWCb+Ph zGgZ5W2V|CAInC}~iCNkA(#YD%LYrpxKSbfKj@gs*o??*EZZ^Rt zn=)!5oZ#>cgztFi^~N_<;RRj*ah(R7o^Q;R*Os4w8P!py@uXa~yRz+i`(zmRo1`qg za(YWpNIz%&F@JBHtlP~cp?| zI{StcT=f3TL?OBG#5gYUw&L}-pQ-i#J%oIJe)v@jdHA39>dKw@-{jr@6i~d4yOu`e zcsu`OAe|qt|1ajN??6ub!>Cq$lPTkE=^q+U7frtWXkRlI^hc?)zrS4>MPJqW@bTqw zaG>3K|KBJT{Jv$IY)E1gLOd;yG`E}aC(WSdeb@cWNoz`mpXCX%@eEjyOrC}`OH8LP zx1u~!2_ZQDh2rXP_P`WpFBBh$ll&tNcHDR&pjYuF6TV4gAd)eKFA%65OeXlLi)Gb9 zz%vOUVs-6UZ~e}nM@pL69_sG`spZ1={g<&NLefG?`l-&5Pd4%L(-BUi{@Ke=?mcAA z0{v>qx<2il>AB&CP9QoHnB>dPPGAIuM%)RHX}-vYmKJb$Lzr)zCR7pjDV*;XOHVJ> zKgk$>HPF51-D`tCo%Y`pUp$l_kS(eU5q-~ms#!~5$kPN7`#YfMh*mzU)?EyI_W$i$v7{mv#t7>yZsVXt3RfFACvoTM)Z`6KM` z6|fnM8|VA^CRd1$7P2vf1IwOc(ymaFPp(JjiDirn-+h9=%UEJpHm+i|ckznqp-BG4 z!~acInl@xpviq(}sBY&2{F4e*5(l+j(4T(qyqfU%ibV>l`I8ojW?SILblUVnx9>W? zob}%nta|GM3ZoIPb9Nlxk92gwm-`<^P~%z3UWI%edsiuKR&W=sJ2#+|#vl-;g#Sgn zk%vBxGT2=>IwHQVD8ll!dK|gfd$HHe^y;|A#MM-#(S#ovqi*n)g`xwmS6zv2i*wZL=Gm{tCEe&u`Y8jwSEP z2OhL}mG>%ly_|eLV)t{u&1g&8COMHj$tY>AnEYQNQ3DlPamMj-;G}N!#HduP&;@&_ zN)Gy3dYC1!#i%s|^m+EvVZIXrQ5d1p{ri&Oh+_gPr-jw z5dR6u{^<3KTn&N8N^%yda=Dt&#Xr2@;!op@Z=_i7LwDYwO$vVgrG6)sE5UtKjPWnl z{AIR(;-D6!{xCbGv5|~ejUNjigJ{@`GDn3!SRHej5yx;7y#Z>`pKR)XD1{b%tq8)C zYAp|7*1GxzL%1ckBsF*_l*y#^s@V&W`QZjH#a$Z@TlUeznbp?W}+Wp5dfy&MSd{kJ*;h z#K>6l#){Fux@A}smUw3@OD>V&>DozG3F9vXV5Hu%$k9@l){x=e6C*0;a85F0BG_KAw$b7ir@pd!Y zl~wI_zhpi;-3u5`WdDxT|G`0b#2Tco5hQ?n!60vCNVVvzFG8T%PU@aN$dDI*9P2v^~n$_Y% zJYSX|ZmPZUiX6xz5Dv3=5`6tM=YD*DhF`4mkLMr1O7D*cD4GiA_y}*#i_+w%r;j-~ zm6t}$nM6Nz)K|807y!$Cb0e1pzToyq2N5QsL8JSq=xm7Ku)fu~qDKl+atvgX+j9%b zQ}Kzjg;j#mLR)Js$xWLHM-}xU8t0(GdWN}c#HD|VF^OldK`i4ONc-9)&_bhEizf<-==f38*i13C^rTkYU{ zI$rzL^h@P%vPV#rD%lMov78x&X+uN-zK~tXn@{7SPpVnxq+4#J9fOAVKQHp?_o_sd zs#BBv7akrLW&b0Ids2D}f#;XHmcZ(tk=sI9jPC5)qx1dnfCTbCZzm$UqA%8$Uj>h) zJMw$zt_uH=kNjaC{{v}|r4;HwDQhRIoakE`{sa(Bm3uRQ@PV8IEd%R!{+d;xUq(kr zH}~I1IlwL?evata^?By4pq+MiozX;W;xH@Yrg}>cUhoG?vYIA2wQuDA&~2r6bn%=X z^jl)>G?slY8I-D!o)dWC4sSMf3Z~@t89r$$h*yXTL3TA%kM~l#(6@8~l9yX-p1zd^ zocH)yT}fBP8+es$c%L7^FB75_E}uJrs0`}VOOOo7{NGJLp*4JkX(!I z(m1ijQ`<~{0;K6mKnXl@BmrRb!7s=`|i zuv+!8RW1n}R)SR>Ljfq%6UUkqI-cKmrv?8^w|;wi`!CV!(L6if z91s?nni1q+=WD{ROnaV~{TAeYk30m%AlF*LdA^sQoj49lp58^liY#9B$b{~UE?s~Rz5HJh+5dr5)>>E+R+~9>bQg(p zRig=xqMGJl@gq8SBECdYr81K64kd|5G@E-6{cxB1QHzy#m}z$qFt$dfT~K8zI@FK; z)~9GGNw^4uedJu#Siu778_oQdXbYO!D;i=|b4MJZGu3oPu3?m`Dzk0!;KK37HhG#& zU45DDhZNlukHuXDO5y7Rr^dk0r5lTwh*@sjXt#Pt^}81@SGJ?D>okvqYl21@***;)pQrxOLIR7lnAuVmFu zC`T_YZYL#4yk$Pd*<5m`y<>2a&UFLvt{i5JaG1fRF7$Wr7TRgp+^iR=y09g5-Y4b~ z9C3Lw&vFa>maP4P@qh5GpFsy=pg)7oPkS}%{w?TS{`8E3pVaVouQ8n+7k|Z&_j~U5 zkLh@P5`T<6S3Y$D!mmskZl&z{l5mR!!rqD##z|8I=(#dnx-Fx7Eu{OtY*ft>to1^a zJ`wZqsFI8~TM&uIP$&(uwx(K?_pA@(4&cWR)91`qb{pi0PPN4OE+WwW+91HvH>nJ`1l4#}8t!>{(?PP+7kf4Sl%b>nGf%Wie`hl`E;-yP`x2+EM@=wT## z(Y)%=y6{O8J;b|1{jGe@x{oQ)$|en;ky%PT*UJS=BM{3cBoqj~2RaTR&At3xa3c_e zDTTnmPqD^|DCKtlB)P!qHOKL1_!4?I0IItH3}4Bt+A?SuI`-%aydi(30knS6D@PqdT2FuRs^Np(_ zB01Zel<)1n;#W1g4$8_%?$bI8X%Q~yP%d!3ddBC3UankUflK+Hu~P%_2) zMUk%#^>socyB%1&oU~KqT&FG+P4{umzc#$Au{9>9$g86s}*!$3HLAf`;-b&5TQpt&O$)repTAIk1t5qz)YP$&k!A6av%*Kler^Nl{W*c*{3PlRvsptc=hk3%fvc{( zu;CC!m;9{eu|Wd!+VyCbvQ)2|HUXhoLr&k<^2e}U4d0CW5bZU=d4#nv1;E#L7Eo|} z=Ij(DHJiUAwg2Z^O@E1ttN;Kg`BiBAHLi!^0Ri%7ub6ydc){ti(feEIAoLDVeOJ~< zw2H!1Gsyoe2Y_L1%JNb8DyTuHhmG)&lMZoPhxT)T&bml1u7sxoc|l)8MC0ovf%J2R zr5*Cuf{#N0+67|L4xOaoKW_kOM)vi02(1x@IVBQ2vfaNm;vNgrV{*ucHXhvfBfI|A z2EA^zE}lDp8!q_s9{c{cX8R+9zAukop`^v@aD3l;*$3)~4!nQ`pa*>cpzzJlg$5{b**par` zW=gv#+{y_*8{qu)7p6w4>?aigaUtGZ#GeLQfF3yUqBX?uSmG(ZKpiuUaQcIc7FSHc z$No8{8!9+e1OUE7!W;qD{%c2aNMjI539ku4;l3C~aX1keBnEVdSri6@M9QpnX3eVYOED%L;iTAY!&tUL}1Mjb@4XaaTR6iEXs>}_7 zL=gt?-Uc;j-_MhMrjK1Fi`DE&Iv2W625G4n4)Of8Zy2xnleXT~fAwLencSf;Qh_eK*YV zX$UE0@Wfi$E-mA`)b)8UiJ6hONeBg8Lg!*5=iQi?3cl0qkrwWCO0t^EJw^4>s@hRN*TwIJEDcd9*A= zU#{PlUkqiKz_40{l8<0e1X&vf@>si#o}Z5wK&5yEi>1C;8^f)NeKq<6J($$`OYNX6 z&i_NyHwK5&MBB!;?c~I^Z6_zTZQC|ZY}>YN+qRv&eD~FTZ~d5>SyR(9UDLH2d-dL0 zob^Gg9@NjAKL{l=2*a!7YZ=1qKKF@r*OO4?ZyY)|ELANC1u+@~F}*;WeY1=m@AtL+ z&rmAl4{#nUtIzHCG#wwh%;$eME@aUu4ugrPRZ*Ui^A8Gw#GvcmGJ5oBX8S_t_>YhZ zYxXNha76ZvIHsA4^QDK;JWj`?fl^#D$T+QDa4bW!hAXS|lB|9JOaoXK8}HtHES96! z!))rw*@?DWnB!2}DA7|RP#1ik&fB)+nL2TcMNejkS zUwZWMz~E8e7c2<-Nq%f;s!@#huaQA0jWveb(ePY%P)kE#c-frmqG~B|<}6Fp`dl=Cy zf-ZKevfxhj$#=wYL7K&Z;&ZhDZqS!I+?eLlpp-Q8ZBQTeE9Ca(hD=lz*^v1!^LO~} z(R|mzdgeK9l}y}2GO(#CG#XmHK=f^%!J=uTZRQUyJmx^zny$kF=|=>0tubhXd>h$N zCz4Y;oZ5=cp0cY$CvuF)N$j@Uz|bedi55Vj#~PWvxgckeeZTIyeCZ*$-m9gUE{mykwKJWoYJz7f9f<~`xlOn8?thW_x|&I zZ}za1#2k#%#*rC?HE?f$)VU&AAoCwMu>XEuMff9YJE1=WbTLg={4YR~C<22Xs48Z9k-7 z!cr7%4AMIZS!eT9wh1EJfu(;X7sR;Nm-`t%nkH%$lRLeDp6K@^p;n6J?svz@j{AqR zUIPDwivz_D3Gh8%+cg0HtH}bhcqkVSfl}gTQ-6>|LZ3jhr2l3sM^wk>-~sPG-QwJI32j*LsLJA`6}eMY34u25^=fEoY-D6^hB0Z;L3)kj<||3zz{3Y zw$ZQZr(Cc)yz$GJBm~_$r0vPxCIuX_YJlwRvIfm5vc)gQniknEWAjB(WD7kn-FLY9 z=W|l-&Tj^SA~-Rv-ALv8RZcJg%Fv72aUkt~v;ogOX6HGDycN2WJ!E;i^+uAT4tvC- zxaX_dE%@<2*PVQ5?Vz#w5I-P?)Khsdn3t`)kCiWMTl4!wMLJ!GNcX1JkkHu&WmT>L~RTIG+aTtddQU0KYJTj}Y4SY`I zzK{`*bwG@FeT%gN@b|VuWU30wv8TADgymJ*+YU^jIzD{elucg;4KV3P*b>-vurgE@ zxjfWDSgmQOMeX4wWR+hYT;X9l&FE;=*bW8)T>-*vk#;t3))E{9r>61)@jLcOt^Z1q z8LH^Vrn9!TVFLIM#9LYmIz>HL5e~r<48mXK(;!`xq}C3_y!X^l)cn~ehnjW4FUH4u zrk8|CM-d<|q{@Nyxz`Uvdtu&DPY<;~fNwR5oK%5Ge#gDl;T01%GgW_1{%R`?#a4)@+Mg1^PSQE;{n?+tmUHGMj@>ac{v@r$K8rOc!3w(42f)i5yN6+aeRuP zY&2K`4+^qaT>gS(CV*^CuF5HL$cbkM#7kG_I>Z~Zo{AzQ?aS^6h#xB#VHw?7jYTDpUP9M(`}T?+k6ql&px z9}XJDK-@ev5E;RVmjWR-@gJ32MW}=SSo}`=XmZ1Ze+()RYsU2C zxlK&LI9|HFN#aZ}pmVR*XEWCb-7~YjPF1_MENba?W9L8u9tI&EJXaiXAaR}*;YMCL ze~_h-d$}o7uylR5kg?%V25@g{fo3t{fMm*th1{=nl6fLdIuNIKdG%bgwED7Dxd9QZ zV3j@B;OeVzb@PJa2(G>&oqLwfUU2h_L_Irh)M9l^jDgP>$c_7w?UT7db&Y&tNcu74 zkRfV}`0L!MD3QIAk>AFcMw^eKxA*mlhRxzJ|H?s1p)I-U&oPIsZU$A@3a;9|_F5z3 z>o_Q?SOEO$+r;^nB=(uEX_DA&fGzc_xv9boH8Q)X(6%4xzK_^#ebpZPjI6Tr)5?Gpz9ZEtTvtEO`$Z!vyG#ne?`>+;CE&hxFsc#+sF~wI=9EsPsz2%O9r76 zi=~I+(_%k_&XMl21X!z^!@?z2Wq}rxy1r>Ib`B^(#ts!VKf|W#99xv@Z<>p)b#rW+ z@ld;ZT@G%)y27I@IdEt=pcprXgoVY2R0==0{uRse0gRuPp5`=!pt#p)88}@d0-mWt z#723ueL^$zUMVE=1Y5_5OQhD+@`Iy4^xJJU_fkC~kJ|uhi9pNJ3F63jh^2ETVER|n zpL&T4G*=U=CvD|+?7EsI)C6`sL1!Pe&4~edyy$mG35fgtXrRL@tgQk)ZSL3)r!#nC zCl&u!z~N|o`^i`eX~~FvX>MyW^FA`Ss2kD%_d<2k`J>S%eAglwXe--6o7eJiM0W~R z6A?miN{DM9Lf~^Hu$=64D4?%VrfHUNTVh9|cf)t&FB^}kReCbz33@1c3xYE!*^t_N zNFHX>w^UF3;{~doUqA9U=3ms!L_5~48)^P#TB8V7Z4q+AY1F(0>+hagbYJJVU)uy> zErOJWdHhC<&59Nq_G}+I5Q>w_VkSd#rL1jw0R}$*ZHl1P+)^|gB~!6dBJ8NBIJ*RE zDSJynF&VNlFgEz?Fdob4XZ^v(r;hvw&E?)*%LrEZEPQYsi*Tv%(4P7??&M|ctxI~s z@~%7nO?RxFr8AMkuHKLl7QqX#r^3$F?swG0DDCqXLk}|wu9Q!$<&8##( zQcwzkw?zo?-QOiUT2+xD4I9&~4WDLMw-HosP*pEN5x|ei|2P(cPDT*BL@s>cQlf#Fl4)87} zh``>Ne9zbp5&eWW|I|xys5P+Wv?Abmcr_?2`me9+(+F;ry8;UEm6&j&|;cS%J=@_%+E2<`FF;`5z(O>DoO2m;_ zYkLL((&XF#o2H6*&gWe2lF4*y(y=C5rWS1%V)fg?7d-UHh8SB97CeC@$#0<}^Z1@* zv-@)hboS*?G$Eig6851ybwIAw87^37@~ZSPm~8`NhoQ^q2|(azs#3QxO~FFP4t&a|TO)|aKKBis>{ z-;U4Ccn(yb-%A<)hHx1uT_!2|16a%k4RlX@T+ZNyt7NU&J`kq-YkNaYu`;t!RMel! zc7#k$0R$Tc#-lZUp1nWgrwulHghZona4xS3Qov z@3VI#_dJ?#O*koVc2~Y(6l|(LVWvc*dH&HLm##nwr5wQS3!3WW4kMN0Cy?r|UaoZN zfT4~#=qcD^@E{4as^bKrvRUy&LgY5?qs~DV#~D~LFZsfx`{4Y0ijEwf^XhD?QoV@j zq_!M9H52c8NegHfV7521)_=usi10AT>%9v%I4bwmT96AN9%fum!*)wifIf?YdYSP3 z+7V16m?c4}Fq0u|CC5;aqcsVr=WU4~bPATQ;*9E6UUZ8766)S*Kt$f{&m6W(!qU$# zC46x?s!M+e#Lq;+`S9uu$JAD(Qs5MmpL+9VB}*%aL4yB%^|6mXM}7G=pK&vys1|hN zcq-gQvmisz0$s2t!8T`16)6X!Q4B z>lGTa2cIOSVJ6=Rx4d|9nY16KdSdIOd_B@E?C!~ADZw)dv%P^>Ml=^;a9q$Rd#Z-i zHbmm57#Qz+QPIeuU#?ct&{3UC@g7(m3$VY?sqfFfwzJVg#YbkygR(u>jR+D;#qXc-q3q5|k}m^XBHVxptk7=ICb6%(}(ws-J5f%_leQW~CKmEM2KDDcC}ulAXxt zJo2iTpbq%7qq`Kxw+#G|Ha^jrO@^p%iJ~-h?oI_Ks5^rh*?2Om7kcEH<_<`Mgr+QA zw3FDdek4qDfV?KZ%Svv#?O#~3hEx9%zZg%cS9t}uz`?X< zN}Sf_TnS*(3v}insQ>n~#T@^$d2yFbGCP(!RrEciooegMk~nV5rUD;B+Go9BH%y0i zg?axY8zx0)gFucFR!&4q0e8m4z<Bp<^h}baDq71d_ z_~PWxxb3jr_G0M&bC<2tAZ4%sjZ|V*B$$p!R%ZK5F71o94a|Hy;|IW>G=xT1fXtze z*HP|I8}ODBSC*JOjN$OUMy%@3yQ}^JWS|Y~V=OX7vz_^j{lo4}8Z&J1#7;o z?$F#Jd|Yx>o3nC!DzZF?rK?BAP6H-SmUB-SBB1EZc|T3Ui{QQiwEAYTGzJwT9l@g` ziig5;g?`>qqF#j^)C9PotLy;YDG?9lDCGcNcEwhF+OjDf^&oK0^RdaNInH2O}_X>k^!lz#nAf zArTResl{x~t5T#iR1eJglGKn#VK$4E!z`A5_V8zls(nI+QaI&L*&SUYic6hI$v=M& z^7E7g%z4cI0_w`l4D+u}%IbP_Y6^lxdQW;}$7iM$ zjc#WIzrEVXi$=hC$}z=IPhnQD)`do7O{?7m4BkMh7>r|ChIj;V&Z$r87%ettl^mHM z&hB{`;8eKmLlmu_mV0ZMmJJH!F3FmKnkza$FijcaKqB@>D@{I{dcg{*~*{*IJs*Pg$gEm<4Tuzz1bR z!LnP^b|K0UnSMy8FTLM(h;{4td;A4ZhPZIxmEV7-I3LL~ssEk)KRg!sA&O=nMx4;+ z{SOC7$5dJ{Gzm|gG9-PE@D=V50+=JU)2u#^Kn09WFYkL43~??BI#2Ve(mP35yGp~# z!V^(3y}199{ZAh~;WJw-tUUet=d_lX!=lH(tkr%PK0H{8b)Q?wPieuI>Lh@nDv{LOQyQ?H0Pdy8=4XlHZ^hM9=vW5T0bC*oj|sH zyz1L2{Q7@rjI|rO5d4uas`h}OAqRxzYUz>R^{?+e=%8>!a+9gS&I$`qM&(dO&H9F0 z3dhP9Y86b>NugLmxy=zm>@`aoLkb=agi$G^*k&7adjc_{54s6{i8~_tviu%Yp=$DG8-ZM|nhAl>PZpXZl%rFOvv>oL4FdmEnzN(#6S{R&;OIP5x6>dr|DilO zY!x@M@M+1^%_iAg0`KyZ@PsQ`hFId^&=9${zuW0 zyFE8ci#4G`t!AR*cx-l^IJ^IxIn?Ez4UGutIhCO?)W@d<69Rgio{rKTHm;f}cTC)P z@=}NYO|nHU;RJDN|J+IQxHht^J2JLs8!SvR9wQiwR>qZ>XHIwZUSUc52gXx4_Bah6 zjFrT$nPaP@0Aj5qdOn;(<4FGcPm}oNZ1*u!OxWqNmG_An3r>4c0ci0wiL6H$z7RaR zW&H|YD_D22WJn4+w4N?gAeVDTfr8^aLuCP35@-;^%8O0^@#O(=Id4&gYZeW#qLg2} zG$B{5tgKxHUQt6*NIk|bNeF<740G_?LI(+B@NQKWpeVCEOGdq_N% z9A%${7ZY4pttpT_V+yYK$~`o9pdMZj7u=VCGOQM?(DgD@1HN|U{ks0c|qpB0HLu!_swL{Fc&@` zH}MVSkIPW0VHt)*4}?S= zj(Kz6W^-%Csygr}V9PiYl#^qxscZ~)=3oZD=8^V$ImtHcmG|F&1Hh3;H7k3}DNgdQ zhj77`&u=%ck)-SdTUnG1SJnLUt~mwT%Ct1ke4}WPL9=uATjZRh6aW5U@>*|}+;_G! z0XvI_`pDdzu0s?o zM;~!NVQUaqO2mfJ;W8fZJhC~}i+1ha;8M!xs7XAN-x2iOev~q}3SAigNjg6IsoxcI z1$5L~tVXq{oRQ*Jy9igsTZYYtOd1>n@~yCBfj+i*iR!f^>oWx^;7H`3uxV_|O=O{= z`cNx_caHZnp=9FCHt&u{=1;}^FUR)fr0MWBf4Sw@l+}kkDg9XZ-89IPFLk?{HdPD3 z)Mg%JCyO14FYA*gf|>5Eu&&XM*d#N+@-DrKU0bAk>R?_4s zw;>U6pPql6oAi@A(<@@jxz_~Hwr*}XOP@NU#lmq!)jJrlq-l{|O!+65c*U<&g7 zgfr#i-u1uH;&Tlbwx9&cUj$(U&?tD>p?85;=ap)c!j0#9NQL1;>osN}rZbNcK`)fL zM)z(>XG9=&}ad9s5f!X2NspY-Gv03-}qhHO^fO9bM{-VVNgFDU}n{M&OVh%#+!1OfNA^iM=8c$x)& zts)O+t0!WmVe+b1iM#b5G)*pT{?o*!85o3%a%Eo02^bPTq=$t0c(~~8C0Z9<%94}l zJFP>}RxeVc0#^Sj5mbtP3f+>RrI1sMr~P)UAN12vGNpshW55TaD3yxnyS-i?iZHen zJ+lI=dsd1I%b+S`EC(owK_m`v*H$1vMK#5`eUiQk9~RC6t*HRR8y*!x`b!W=N^r&y zk5^!VTT5=GmR7>&B1|l&kQO2WUy!G^R6JWSo4HB&k;f;0@39~U`P^^dB(3pbGG^!7 zqx~po;I~9ZycAg)0Vfh93HzN;L^;z;q5UB7e+ESF!b*IZX`IriKrCdPLtjBaW;Zk)uWz4gB+ptQysh0 zZy{3^fpfLVuvtiQ08z4`l7^`(q4U1fR3S^T;Ey*vBQ)>Rue#w9tudfsMIQa8WM|e! z;W*JopsNRqFjH|pim~mV=0)3*u888e&p+ByG()(O^RkAQ;PdEX-cIg;Q=~K-4W~u$ zSydiEH2@Mhw8WN2eX4?2psb}xU+RWwI8r}Lcc!`T0J;G61FPaPP`ZP$xHCoPZ_IR4Tz8*-5ik} z9YN=2{32!@_hTof2(j9j%jvg?{>+gah8T!jl$z88*#<0ojnoUkRa{!CEc%&i z&)%gUWq81+T}G2f2Doa&AuG%t38*0tGiCk&y(_TQ>Xa@Ta~C7uX6W`|xw`vsB)4lF zE@<^X{f=!2#Z>W^%ODqG0+Pt3g9td*CRGj@ZGpq|{u}uGFHqWdGPb%YE-j|`|D(vT z%T*oUXaNXv|GWBM05)(zpViFP)AX7{UlbfvWAqpN5WPngJ13?LS!#CmrCv`MjcnRm1hon(y zw`d>0JH$oEO#qc!nYrGacMSG^w(5?=sI?0fUeLQ0_s%yUlTJrs%vg^2Yo(CVk>$p> zwmpOZcGo1b8E@IuJZ;vZjc`gsp?@m~j(-eh2LL8kw;ZZ#vkQA<=7k?J?EB=uW5O%W zP#4WfF{7*#vkU3sE#HYAhw0)FGidLVDLQ%Y5kz;&c8>R58NczZ3NMaw^GDbEi3_V? z431x@SvnMZf^p!(c0tXqgRDDEs`MX`4#t=N+*pk>(zk?>JQOzC!o4- zm6)@qjzln6wzw-`UD^Xq6q(|;>$rKkXzD8TQizwq(N|0?hag3D(?Z`-olA+_9=t^3 z)TdHMvL75Ygw1yWlY}Rp|FUQjMKofm-&9w@SXm!_t)}KB`BQx9s?i6sM?T5gb2e;& zlGC14Nfqvh+{()B^$ipBYyIA~My;g5)^Y*!PhdszwoT7h44H(Pegi|DF2O6NbG0MP z8x}bODXf(d>3MUay>G{sx}SlA!Y&}^)l5R$;_V=B=p{xe@oXWdZ)}ZpHiQk#S;dZd z2qh`bzYXQS>8c4gySW5#k*M;0YfG!zmo=ZH*6UUAjwoX56#<-;P9}vrlQkW7PMIz< zdcI=AJ}=R20B~-rv`6S>1033rrtJGIEH zM^Yna`vCtxv$#$km_f*#EAsrGDzKCaV1XBDIi1qSPw0(`Z@|PBchuw^MB`lCJ`|Af zNmy0Mz?3Vabw6n8ySm|G3=~QdAS;UYurINK1{E%Uah$%*Ci}7^8~xkty9Ck}Ad5s$ zPu1p2twl=sF)OsSQ5Ly9Mss*c2+pS& zTA#)jB|QYETv9AvDJ+XWaFyolr004++V6w1Qz;xg&jXT2qd<>SBa)+=6kvlZr! zcr|U8(EB@?!!u5VDikn@uy_O85g7zG6p2RW4{`MV>1KI6?IIu%|NIYCHk@m?tMB`Cs+$85dVtWivWTz z$NRTfH(^vS(28c5N0|e(1gVxN!DrrcY@~(}je4L`w*sA--w2MGy3oVawSk`&Ah79S z<{$xc$)4;ve3>0a!W zV;7P2L0^T({)txl?Dk9vA#GS!5gSj^fnVrkV9GkS^F6^hY+PDyJs+<*zC%ak$P4Wz zh|M9@0sdgOQhbIBG#mU+qG>^r<_r$oclphzSgI{LHzX!S$pyc&p7WI%91Bpo8qh-g z+Nb(Xko<$dfOi93A$LPt7U9Y80^kkc8f~mPAgiNq0rD3w*LV9034cghvUe8F9C^X9 z9Cz?L6RFfkOe=Y678xxGHVXS7Ty8jihyfHd&G@i4XK+{kf^W0t;_>ttJ05rgt}qfK zSdGTtMGS=HRs3XJ*{mZ*94Qt{q)ZuAsX0pn7fD*T(O@ahv8H6==1VjW@S*h&26I36{;jkpQS#|l%8%JnX)we7>x2-Sz` zg{o-;pycGJ{cL$e;R67)EgYiHc8r67(I|rqd$fVWgE|lKC3nULvn0F?dqM5>{+kn} zz5F1gM&;tC#MPj2ALtfCe~fG8v8v6)ITWY_p1HW4uG7OMo^>LJy0a*Fo*IJ@Ej7_% zJHkgNUsAIY(TEJ zkfwA5DuqbZv(^jm)7=fG)K>{7=d4tDt*q95y4KQJrTFu5IQImHm#VDT5@ZnEiqx$d z1P7TVnz8u`SA$AbYKyETIaaZGCRn+Rot3wEm}$V+HEOKhxv)&2gv;E#19NkJCiJoy zOz|VjW#9oQle)@%i~!I5#=S-zu+L0?&#hzB+l-Nrb+mxZ-FSiTD*As7x0mu7gk|Kx zgHEw46<}n8{7Ox4BB5?hvyc8cit#G?q-4Jy@<_Q%7`aeem@GeD2r{aPj_)#vDow=? zQtD_$%HpDm)m4J&nurB&h(2hQkhn1)AsQ4*P-~LUY1O4yZ)bxvOP-?&1nk<%=0a+& z6culnnJ{Ae%*r+%eTFU%nCl#45yIe*jlosMK!|CLD2a>DY}f7k6(q>dU7k| z`*D3)nTu)od75z*W&Tc88I;>j4B@U;g%D>%n&kk+6x!=+#(k=gsoD= zte0I&)mSFb>>u2%X4VK(0_+GarN^QOqN8ku^P&};T=j@<4Q$`*$VeJeINCv3Zw z779u>zbN7`cX6l8nQ?@{LZ6^a5n7yk3_G(${_hqUg2Z+F0u{~h4-!qv?As9H1pUv0 zG+cMvqG|h@H6wD!F5c*W&Mt&y+SX7+DNEc}fE@P=OFr9X01hqN%*tOz%@R>|LjAJp zeWlmt>^i!Xc_ke^R=mk+itW#$*tXc;Hw)P*{wTu#P?uJq-dxrZ^DpUIpST}?rcfdw zpCZKM9I-DMN4DLTw~(PL_Z#tdwJadDEDXKcJ;c49XrZmgV(-W`qTUb-C0O(kHNwmG z)-uSB%IeBY6HTCR5)7mEgVC$V)oLay&vLi9TnX(v;8i_j!s<}Ac8Ud|R4xPG0mMx) zGBewmOXN1r?~We1VA9>{V!S@6Pm9`#ek|FdBW9qB(<9MJCKD*`KqipQjNrM(o6PYc zO3DiC%78qgNp>h>ad>U0iZjtFXZs-e#xIas1(c7eJHvJ>48nK=f*UWEX$Lv*mF6 zrA>!Iv~>GGztK<#x-q`KdNHSo_T0@TCSgQY>&U4ULO(GKpH-)JlFFFXm4`y+L(-Zp z5Mr?|pa5hM~mV?5F?dRQROTAu5bdlURf4LQ+2srDu78rJ<;dV zv%u&v5I=G6g7X}nXwO*k)|f(Gbo~N9_R%~P$!R$5x8Azf$mLGhmjr{;iayB+x;cip zWg|)E{uMDKtV>X0rgot|VfAc+V`O6#3ClW?ti4NoP)LWM=m_T&9(ON3!@J>vn5~G{ zf6_!iLBNj~g4XJ|E9Hz6fT^$8c_i!JU;h6hkcS<|4}h~rh5_i~Y6ph${y!S*XWiuV z2v!CO_7>q^?2)_)`V5nzlbtSBKbDI(+zc&|3Qg$ZbB>70;T1eEEiHgH6BA$z4VMOrGA-2sy4VG2M6{k`&^_z z1gv7q3!U30AXOA7{>U`5)-8B%Xz$^vwUWk{DgwX#!eO=!^=0w9$A|T<2QqTcN0Y#% zFSu!U%fqaDb%1wv8I zsG>BIInA<B|fVsI<@kC@sLq`>GII2l)P7h4>$whf*IZO`z zbS4XE5;{>sE9v~01-pMsu)=xvO-%>eY64QRgFVKexgERf>KVzkIm8y4$wX!G7&__<=99Plg1cb{NoP+T?lHK z?#1ic)`HmRFuwwlGt5U-EBEe`l;9)}uo%jd^Qpb6k6j}BlJmc(=7y6cyM%UIj3D$A z;?55W(#J+uG}7*;HS z@J7vSfBSks#9U8WZ2{T)duekElD)C}KIiIGqc6%2P0iWl#K*5jqNC1YP)q0yvu8|1 z>F|lU0~6p@@4^B0UDec|SZH%724LTI;6|o2TsMoF<&Z^Y968v9v-z)CyyE9AAO;bQ zP~b?0HtizvS)TMct6hBOIg;4;PG_0wo?>}e`w#vB&0qB@v29`)V6C(=5CH*RQu8*{ zlM8>xGADaLrU~L`xbYD@x$(VN#c=KhxQi9*9qZ=~8QD`iM!6Yvs1uceM5v$?aHh>V z!Z)cu8vz_oD-@+Rl=~-Lu6n=aL91P1oX400?YZ9mfF={$k%#iHRL!%VAE40e%4$v1 zO2-l_X?0v1i1CWGrl8zC^Y074ueVkorf8_Yh%wV=B+xXyRGxkQss5_mA27iLGze?L zQPj6izd3^TOm>wKZK-ubt=JC+WSm4$;FH5J8M^SBg$g_p1G`&*!4zyU8LTW^-g%pC zcEI+UJJ|+4dns5L=*U~r7LumT)jy#0g?cFU?%ntz@}~zVYQ+>z5=kt5-EU`tZ4yE2 z7n~0?4C}wyL+zR4*X^ud-5u%f*`QB|SO#cm?}a>Ek;;<$?EW){r1T#Cqwh;EOG6q@ zS=)du)1FOidTmP`Pdo?bUud9b1Yl93%?3QqQo7_{ZJsbZ2$a0nk#DkLgw=(MhYoOK zm-KhZ3l)?f{v<}O>O^jsOhKE3bt$v>{5LQE(lcrRqJQ_np!26~>4A|Nh8qO~FuoO& zg-!p{ON1ZAU(q5y!rFm{;y5VdY3$rOi)y8!LungB`=dY}Biw}int zENJuL0BkfF@a~+zmBh48g1?SZAV`PcR5SfKl)mB?*AZ$O3*~|r0E)2I8!?I#e~Sds z>;|Ia$X{hp|F}+b^XAp2@I+S~H@mFIz`)3(HJxyV<;?J%>YZt--BB_kvM>D4NB{qk z`~L{CAs8rD_iGyIQQDHd{aec4j|B*mNJ%$>Y|o94wF6ego?c+u@ip93?~*hmX=vai zNfO@OKF!)15IuMK7M(HL16a7Q{ZcXOA}#%i5y1T(?|uPX?qyM~ceIxY0O!{I$0(Ys zt^4TvTP~ntA)x*Q{%PW(8-tC;b1~J@(gudzXt?S;GN?oldzls&y=4oRM^@=YNE-Y0uh#nk*3W$>M0 z)W|<-a;Cx}P%= z@9?ltKUvK#EbAe4wQJgmN0%fs@IGBj3%2jYDsKwM8I-1_j|G=-B!bTte{(!q6eAH` zwnU_pb2J`tXTT!x5l8W#e7+E&F(ReAgJG$a?&f;`tH_o?w~^X19RN!EVCdIcliu_t za4hg}4iImg;Dbt%_gvwW3VN_%PmES(xk zHYNgjtMkv|LWmT#T646*0StVPceO+$sME2^!RIiQj@`l18|9jO9zdn=d#Jl=EiHS}1zG8Z;SXPN_XI`!7`QUbdzWi{x9KYY@+u^1Ui0 zj{-fV=CjXckV_QHK+aG?(P~>mvlg3pTga{v@$_P1qh{_MjrVz}ZaZcyVvr zfv71{Wn*`x=`e1@D&}{#ZG{L>8#9CM>E*sZUG^N$5lfzaq|XfM++=_|kF2c?%ZwI163(Yn*Qg7ny>tDfMiFpn-(UTmAT(HtP1Rb3IkquMR>u zW15P*l7#Y+XFUCbcMi4dwJEULTg z9lGA#S<&`>q{GwA0*5Nc`~lu-3ijtNg!?-bnXD<>{Ph%+aiAvLSV20;o#Z+%yT` zGgT#_fV{4IrAo>Zzzq1H=Bq&K$7qtS*l#KWPZ&`tG}&1y_4+xV76 zX%Z&z@R?G5q9uI1Z+Gk#1cc3r?H~x~`j9AJ$Na`+zzd{7LZkCO4Awqhrxzu~A1LeT z#Skn7tI`+M?xuOSF_RaE-*^dpVoJ>CkMC-R7I6FNQQ`E6h4Pm2Ui~FwjX&6E;-g15 zQPBhD#To=F4*}2^R?@{Wc7pe_!?rC0dgesx*V)lWacSXGEf#Yo2}lD7>S8^-Y8yf$ ziQaT_iZ2$Wx%LZvkG}m5EKd5Z#wN-+HkyhX&mfCO_nKVYlcOMVd>eT2vAK%ePexx@ z<)y+uQNB@w=_PW|G#cuMc)YuhUck7WT}Vi^xLc+}T1&kL$azV_anQ>X!(?7XhM9Ct@z0#*eiF!Yt9qd!fQGQC65r;jT^>lM~yDh*!s{<|GWe zEe=*ITr$-!JGG+JZqo~r0UWm%q-|cud+HmfV?zV=UK5tH(~y*f&Y*4sT0`3xw=j9XIfcMpPV#1y(J z39*4pj1IA56FlH7-3Zr0RPEx?RBAeqk+E+(@ixThKCYXd?^y2(c-={UKl+bMV~Zo< zBe6H9J>?g3KAWRrGjSBo*JrmspjPSQ`&UQWssh$rDA=<0s$bMb+@*nISG6mRC>T_thwyfuUkqx-yr6R8Rz(~TMJLKGutW(U;<-SBA z5sZFxK|CZNCWrwIp?1p1viws01x`9qYdc;_)B3Y|2$z2gS=UtmKFTZifpV>njKyT3Cd?ug$K(QH;ne>B87ocF9FD8arCCC^>`l2@T zlf|TVCO;ijj>1l-z8k*~+$PJlBjnGay*$*wJ5c}3-2lD!KnTt`T_3Z2^}tobBMzxm znbBVWpDdg~U1OA$fAs~LGV^IxZybSUR3dHr$BLiH?XXLm&56!<8Rg>|G$c5;CZ>K9 zMDDRQo85Yd>Xa4|?VA8`8v9|P6Pb(?dc`M}z@$q|{kfe;?E`;l8r{z>k2<#2`O)y+ zCL89xg4oML=X_`n0ST_SK5frof|VhCfqOLmKeb&`wYN+qP}nwr$&I z+qP}bx$`pj4@`AG^r~K+u7_GlzEtw%+@bRX5`s{CfDw)EU-J>r->I5Y;PD5QxlZB1vS@>jd=FoX}AS+r;8=h+c zWTP@1>9>SO`cZJSx9X-rX1S8w;$sf>M*5xPFxrP9uy1_a$G2o@=10%gvAAQm-tROk z&!m({O+u~57fl_S97bJ@oS1SwYeP5}Aikh+P($;?c`Dp#F3a zMigH&^Ffan4{o4}MjQ7rVzQZC>^=0PwqgKrr$EMS?5)rA-+zbsY+_TB(tjx{Td(!n za3|WPinkJpOO(YM5L1lNrzV;}mn{iqg!OU;Ow7|-Y1mH(*cdmmnJGRjyiKsAPB*#v zU9k7uKG%P*qJ|`pZYu;Z)i7?JD>m7RDyc35#14;lOYOaVCMSjMkf^ zPOdlX$o7dn{ofo(dj&&TaZlu$VfjAT2jOsH%Br7Vsq-JmqDMy9(gMD3zX{LVl-b_Y zMwn7WLtHtOFqu08wr{d}?z+I~`Vo4xd*F^dRn;x{YuW2Z7AY+karRQI;8 z@u}U>$LB?oA#JCvWZ>t*HQ|a`jst*oG(^WvVk4pN>HqoppeP-{)L@FNw9%0PrACe@ z7lVfSSd6eZ!wDr7xuwWT>3tn&eZQGoxpd`vmjY#3;#02uG#?T(DF0HQzjM1q`{I4F z`;9PwVI`+A+=zZM{4*J}{{S%yV=sb6=>L-s+3xozAAm&(j6n#2z}8&1HKH)J7L3rG z7vbMaKzymPOh)46L26-Xe}|UZ)`l{ZPR^i4nfa!wh!$$*iwi85f8c1yM@LAuwxCQ+ zezB_DVg+VV4fgrpbZ2PJf6p&3F<&5ZC*J^hL!L@pj#)`IsbqO#{QC>|5jQ@+jhDE7 zDN*%)C3|@~Bn3EX@;D@m{53?K2hx~y;ydM*8{up*eHeg@HizKe$Wiha13C#Wl&O%LUnUls8H1<@G~{bQ z_blR9DEO{(NF;P2@wY8P6Wv?hNZDWl1f?1A)u2jHbetYdfgHs3vV_YSbsgcDi)U&! zdAtUw>GS7(O#00sU)e*7%%JC2P0-v=YoCDhTa{^gfWnw3ap=zTDXv?(h{2a=5&1#A zeHygSZ$mb5Gaw@`F-i~CVF9DG|A;DqZ4mgN2hNOm`%t4r$M@N3Ua(MQk%aan)0=eNBi3(q^@EoGN~(+V{Yr)w6G>?M)*8ZUHuGIWleJP z*mwTVljy~%bevTqbP9cym`U<~*8e+huazd;b?M=T`y5w?g7r3R>XVM1A+Oy3+uAuO zfxDCP#mB--S&~qA^_7Mz1jWnS^-yvR9;i4&fN~gTS)vH0Q_(S!LxWRr+m1ChRXv4h>bqNsN69mILS@ z2GLgVxSsXR;?E0Y9C9@J(!zSHa8EiEDO881QQ~DlI=;+yuZ0)bl~G07md>KgTi$Yj z#tN}$XZGNr|I-6<>FC+y~?P6Zxv!2MAJ39G~J3d6F0V-#q3m;%bmMgXW~vAh0I835v7D~Y9$vic1!edR|juo#{;c*P--G#pz^q#MGo z{`wU9(o?|!HA+SE6Rlo;P2=T{4sIQ-%KDbKYxhIr@(3?zjc83v6(M@mWrffhg+1Ic zueE$*E|@;gvsF4DBFgr{kM-4Dm0r5%6Ao`#Tzhb~(=Y-78ym*2LMZ!(gdc4IXI?;$ zQQ=RCI>e-v5h4=ABVCU?ov8oQWl#?xe}E)hJXeZWCCj!|eH z&K0pC8o$2M81f-jHOOE6LJE}EX1u`+F;Kwpaod`P@+&u&h9FIZY53CRBM?+CwhRv@ z;KTbY=^KauOvTHZ3M9ngRWZC(lI{708;5Qw#8?5m`;%0 zHBc3EK}PAeh^U6AoXGRY9FF2MBtEE1P;HIDQG&gSn)CZCk*F-_qS{m9sG;PYT-NwQ zKF(f?@C;#!>yN4At7JWKDH!=P9t2OKtFf3Sl_QV?8CaV*f0HN(gj*E|D=$eQh70!G ztoVA^`?xQcT=TmwfmVJsP5p|+q=EDu6e)lB_{+683^Ek64pq-3{(niEk$c~#P=~V+Hxl=J~QTA{4P=6CyEVo z9BsnQEWAS&KT!J4)x@KugGLX@v9argWS!vt#hThs-LiSM6eD zCazB51_Z>0CqL-awF9MR9Li#1$&-kQ90RSlC5~dM}djzup4bIlNCYmE;*Z-&I zfm(`Ojq%nOSBtVyO8XhR>2_dB(9&fUML(=KRCj~S7$BlkCf!(%I~1#~lDrD+gA?Uw zYI{yV!osW3iniDDqMx9|d(@>bSFjeu+As%c;e3!&Sl;7W7lUnOfyTuVk2zE&Dq+`H zHAe@}v-Ab#N0#L5t|?p8ti=Jj0KLukrvq%2f>mC7x0((dJjkytu-y&4(d6xQCmg=; zFP-Kc#O_cpk-24`Je$f}_d;@!lsB@VGZz-X5Ml|5KH5S6DOH8_eyA6$#R{KN-nLnr z)l&2AMLJb^Bjn)?!2xOoCRWgZn)|U-@HNdB?IoMzK6$1Y?!fiY$*JKZ4XueKdKuft zUsUIg3dcHlY4ATdvGG@GGD5%mk7S&K$^d*u;jk()7sz9hF3H=b3^(*-Z}QlMb*eaL z@gFiQ>hUy6&flj5^XLt?J`B#7tvY(W1q= zg)0yp)*C{cxOD~zrGpLjUO(fU+0PAa8Qr1_IDv#|<2$Oo5Gw)d(Xerc;x(#0D*$u} zd)t_p*;2AX^Y0tqf*zAUNx9n$1l*?304do6mQ_nyg2DEa?zva3=vSI-oj38|qVZ1J ziQQ>@&ig+*)*8+F4gPd^EY#BQ)vtmH93D+uohZW?OmPuqlKGZdbygh8?jJ3|2|I>& z1XVrRy2WD8LLHT;>!1Q;Xbd&og&nR*<&$4#*!MZ=+Aaukkx6YMb&Fw!Oiv(-ctqmU zHS44&04>-4BwHpt7~6bf3a6d*xxc%2df`I*PEXe9zqEXfJ%K{pqWzJf#*aCL6E@hh z2~FQIh~=%UiyuM z+G33mSxoT4He{~UBUTCAMUYSF>^Z;qnm(;wL%FYHI4Qc&rO)s`YJzKP@y1u;3}&%*{44<kLCxvU^kw1o6M-c(+k_oGCEizoeeSW1A1Q}u)`-|LZ$%Rd(Is>7805m9=Z(tmO z%8B7V1;;(L7*`PfK8K1)k3CjQ@zt)nHQ&r9F71DXkvj3G=r2@ZO5c2X&avgYm=;KY z$pUtkmlDrirES>1?$x2|@s80a3U_Yle%vup6>+Tq`C}k0M*T7DF$JwZC)?bjw&dZ<=DOp&)c)qsBG zFvZPGKT!qd$w8i~-$RHESe`bbHZ>xPpe{>ABhaCNJnnP57{91ANtEX4)!YZb6{O^( z%5-vn-WDw{tz|mQV2sBLuNFL zivHvOqE+xiI-voO{2ll%^h?&Cbl6>%?@yn_jbCX zLtV}6Hxki{*M&XzVrhuo1NkR|AYfohm~zNP7;%ghCF4qZRH-6t#`BC}Nry75IYPRCSwG zT=Rc#Qm0S-LIU44DnN{}M#1?;0jj(WTO&|W^#y_hw!k2nr6m`Gf5HH;0F|4V(W7*` z%!)D3uEkGjwt@KJVR3#-!R=&vg$Gx34}0i;-bmlZy8IOF4p$D*I$*WG)Vudw4h^RB z8d-uh66oQvc0dHwhQ}9!vR6?`DZ<>;M?`Ai?#%%qWC38VrQjIk#HPFqwGuKnHs&s& zz70yR0)?MOP8kJ27o7^f5=lt@EdxG@C=Ks+k{m1_C(hGZ>K{kKXr=9&s2s3sdv}BA z2ef0LF1eb>W-|6=V{sO)Z*R9_K37W6)OiA2RX@0JvLP zK{k1Q3tdEEm$7a5D$1o9-I5G9Ep&zoYSMXck7Wdz@BCV^p$)#U5gGeR<`wLmRTO_2 z#Xw$7=d01DcA!@$UIxA~rR@hL_M&zK$W9>T+R)<*FpC>)Df6I`S- zZKV#>?>=5^k|cDgj_dTqca?O5DkCT*HM+HipmnfR`qkt)nQ$W}ExQk0cNW}`W;Jq0LxYMjsI3dDv zDly*}W*9uZfn!QhEWt%h*1$@`r#%e+_rr4S-@foN0azQpa;^bzZOwx*zj+0##(AOi4 zgb16vP5l|H6DM3k7I(sj1DzNCt8+KS3#z>Zx?%9?*jcl1sHhYv*6p1Q;NNFjWXntu zryz6NzYCYwp+SF{t|+J#M-3oMVoF*>r~V_#%t8+%ow7lodip$`;*-TCNB_isRhmp? zt=?WnU_$t(NmF3uLkZAkrd_-wU{aXmlgtmV6}?C`CYSxmDLCgCi>j-V3LU7Jt}Adi z-WbQ^jNiw|PD08S534`Dqwn2bJ#_?ndaP-})UvejA!;m5sTkrH&s`q@$gOU;;Y*0B zxEJIvw09Hlh1ExEbPv&w*E-*u?)|I#xqIuJX4B>aSW45;5)j*c0XC7gzVp&6s-oOP z@22l>ZQAfrlcR?bM+X;)$f07}>pdiyX_PEq*7wIS6&Ej0@hGM%Kck5P>YOiP2Ml#)PvtS%f_y%B`MX^G ztvFt7%*GNV-mIB>E0`uLx%NB>?4yTX&MbO(Gt1nzWynEWdN`j)%W1_D&@i z&Ws>P+X95MlBmm@)VNoXt;Nh$F6tcM=T|(&;Q}airQI1}Q^@t-++e@7zptuyME>vD zo>9F-q4RwKtcU%9>}H&WpSv74ZYQl~9S014>Y)$?jC^oz^k|fmGtG*5UnrQgv5m{(wk(R>)zBi6=>weLglQ<^eQ!YEsljDWIbmqf= z3LemCETyK~!xitNiiR5XxIntB?4_&Zk`{+ewx38umPwgY9>0%pKdRujG6>s%G-l*& z(D%a0aA@FN6Klt@mQt@LZH3$Kkqp`l&H>zFq45Wrus~d1AMux>6sBolkbrpdVN=BQ z3o5^#y(_>pA&4~n^Wp%_2&9z@5+p_5fPfAV(g3QXoTgTzP(`9~%1fN$bS7Bc6^5m) zf$^l=^8XaHA_g3JR5V~Cs!m4f(t-WmI69|Db>G&dYV|6iF=a6F12crU4}-P=i<;h7 zBB=*BijjCRT&xn00~Kl$&RZiU#O%TkeNdG(;qwF} zws!WlsKmF-5*@EgKT}U`?g~{KsSabihqD3?**9J#sqeDE`?FNSo;wQLDznbZ=v#ho z3nKCpD~y{eJ0g-$cw3*?xO42hk4@F&8(GjfJR93h^lP8q=&H_NGmM!!qMwcR{~~ zRxQnM37GlB6V8Hyf!j$;Ut@66f90J?egk&pk&2S;;UL;27OXd%fN|}9 zcNiWxAt>E`(IhQ~mt)lEt;rv^%Inn)cAqw)-)HtjFXaV#THsUwl>Kwn2=#U|S1F9n! z1}U->$4G!{KXZAIf5YcMyDthHjKQW$f{Y~#EntR0mOR^yyxO8w z6*@q9zMXca*}Dt!3+Ak{(_^N+qE*J@Ko$S)x#>rQWfuT5V)7&MmlIyPr_E-V5fc)8K&%Ay65O#8gDlH|dL$q86jAjc8Np_IorB zIJc-3S`Uh~WPczot}b=G7WlT%ToC^iicWI~`XHL6BrKIu&q$~dcb*;! z+~f8%$x(0w9QIyvKf&|?uhn|~)|7h8Ca?Q+I1GM$A6lcd)tBIt$DB6U-( z1sgG$+5Beu$ur6FHN=YLOVsX&gi1;djDuearCr()pi;ja8g>AyQPSmN>Y>Yf&JfBB zE9=P-rw;he4ij~Sb=DGA)f3Dkb|GXN*%yms(tuY?C1qHh%eFRkCetB@M+bg+eTV? zsWF&xY-d7n;1<2rV|`!i7~PTF2T_n` zN7hh#Z8HzEVyysHiKOc9$lO+PGNU@-u^+@|l8*=`0z2p*f)~4_lMk;gpV^r~C z(Hy*M4N;H2k1@-CM~oWmpCxr;WzXoU@x2aHecE>s%E9oABQ}LzGAQ$Cz-bT^@F0-? zETYRo^g+0NNXwGY8J@o3L}s-*@NRHr!|}^|6$ISvc(4iNdr{v)xh3B69PO{)!X$11 zMomn%k8$wFM?!l4LqQ`;1YWYAx`mdSS>P!J7W+~zzb=3 z!*AT1F~%V zrE{apAQp8UhBumbso9&NfRW9Ayf)WCCu?-LYd3mK*GPLFVleAj5+tK} zo!pi~Vtw#ey?*{B_*8CF0}kK+GdKc=)|ELdG*`_Di;LKvFTd&cAlPk|cJ2TSQ2iV` ziZ<;5$Whc7&%*911D`tit$j^CllXq-AKCc zuSwxA$pfiAHuBSu+`NJgh%zIPkj|8j4B7|B{g%up8_7TQN51{r=o1l238L1m} zR+v{NEP?zJclE8ZUu0dv_?!A)=EaGmxIAQvusfy&1b5ib)svd4*qrF8I>#s2y724O zP;%HCM<^q=gF{X;T4Og~6q9{kGz|5fNdPX=nd$J8QIu6#kQ&Bl@UeEAzAC%$=O6{< zG0f==xgx#hIGWImbUCps51Fv4is@y^>E*odC!1i21#9`P_g(ujT00js{ci(Bf|}jv zLRqEyTbc0%%eh%jo!5o_`5R+5Kjoa_wRzbO&(VPITuX+h(PH)?RcPyBEDKTj7Klqb;^oe>=+3}myezja(|uCS;$2_fDsgmz9Zcj}@NNAZRxs}c)vj?TQ zx4l^)p;DjuQyVGn9&#}W`t`yKT`LMUiQ;MkS{vOZK(MjoGfw%JFQ3TMx>CG_`aHcC zBvOEGR-pRIniQI@C0(REqWr8zhqB0MrL)PNfArBKi#(4Z4zi6^E;guvn4cWea;LvV z!?>DcDXXyR>h`6W&m1p2Z5(>)@yW%mxv7gp4hIWIt#bSO2^)Ytg0B_cH6{H3OSyg0 zh(_x6Rz$esED%P$-60iH&Jfy?KyzR<_RSq^Zk}3Cx-+9B^$X6CCkoW9+FTXjgK)Cl zniuvP#?fK*u{G40D*`2Dw;;>WdCzrB9*ihVI6wk&$D;gM1T@7rBRS=$TJ$DQxn&M6 zg0sk8I$=kZV`uH&_zMX<&AD?~cV*%iVf_h+95ec#W4Ur%s&YRJ1e=5H3m5a7dCYYS z_tv-Qx_SLrGKl@)W5LeWf-@rJh-Zjo4xUZwf%~MWh@FpbEIB2@fOxQu$D` z2m(dZbny=yKDIV5+)9mm>+D#2fS4$v;tNodM0OwVxjy)jb2z^ygr)O;6F#4rx|3!x z1@J3h1?{0XeM9KE361yNK)`zgTA!Pa_bv7-$gWDWt$2?*fSC_RZp@jp(^_qfm1P$z zrj>50fO+6kmwxi-w#%(Voq<#ZP9eixAiTm`i3k}`-H3o$-k)26m$pRj9YTRHc17;w z;wUJ=1`!L(FN1xyS2hCAw#2kE2Y zx8DQv^U0|l9PB@>ycHwzNH>TUl~Wd4)8TVK6IzQ*swJy&xyHe9D>^Wk3DM;MfAGc4$5#5Y-%CHO!pLp zzTyP}xkb-nf>Xeyg_f)k-W4iTVZ`S}pW^e2CUA-*D2*>``i*(ZIoWx08Krb>S)xr& z50kT(>ea_;SRd+}M+UFA%c+=94yZl^jfV=Kk63sC{h{GM-X};%^sHR#jtX+Op(R=* zCs%#|g!Q68H0%!U>HKg9zdda;gY_M3pAy`Zs<3@AkFogY_>VU|M zZjs;fsSdw$fWwX=2~6CU&4u51WvL^HGsE6xsP#1L*FenBmr&_RK@$XJT+Hrj&^e|T z?%|!ya#ZS2{1Z=(W>Uv$Uau*cO*U5BMDB1iGfqgyqPxXKa)DUOE;0~8nu|Fh-ZNqZ zxjnog8wJ6t&VqO_Ak3Q|r`74OW6jOi#Imj%FrVX`^|DCGufcx0=C3{_B+9k&b9y*< zRk@gJs9XMlJ5n?|DZGGxJ(!>Shk(c(A019=^zh3VrZ`>D&!ipuPrxU8>AG#~4;&k^ zLdu;C$k)?0MK&s_Z579L9=-N;2qCGP1dY@1h+&!>hMn`evSI}IdI5Ef;@6oQUjEb3 z>mh+VTuep6LK{%e3-e2C&Evi*O4EFPH{%Sb@P-fLf!*35(y4O#hce_ks5XO$*#nSk z`rBQ>3J+^XpefTV^Yoxu>7-H{xDv)M->KcQl)4CB%3AYLvW%f*hZ|_UpdqpH7$8D} zgdSuqc8KHJap+A4aTi_4Dm91eN=Zt8Ae0NHh_w)AtK*I{(D4iEi?LiNq4F%eJ1A@e zV{`uZy?j(`nf%d!46K4t?@abP@=^M+AnoiMU)fDox?{o=2{PX|L& z!?G0xK6-MHUrDh^-edx^{%V-V>1cXJphS`CH@ma3LEhYq<}~W~Hyj@qOCVuE0#kXU ziIitZ?j@&!2a$yS?~Z0;S;CKXEg!}O3xngZZXn+47A89hWOL7Z+r<9)65~&8t`Fy& zHm^XiC)a;f_<4UC5cEB5nlI;axsFwdTLy>Pi9h3H%!KU)DZ6JeVSJ>#&%PiAuDC$5 z4>_+84}XQ)#IiZy;|X#a;$*VxoHNRs7j{dTpQJ@c!5wfKz0wfhHrdL@bz0xqRvq`c ze25|HyNQ=1tCiCtu?$O;Jthv(jtPF_eUj{E|9-#BMVHc!#~mV>MuIVEKzga!7azso#MHaaE4_ z5FskTpfc8Y=t2WF@(YrVoh2Tn-(i!DJ4rWo$znNbcb4}(r?*4yogJPs+5idt{OPo6 z>}N^xmsvzNRQ&3c-9qnuz_-2iilXM>q_%Hx<{GuqtwQEc3a9biAtgPI+}Xu z!e9`n>orgdZ`&*Dt!3=~P|lDB5{A)PO4E1haprH?G{409cy}Ruy(aScm1C9DU;%(3FRHx)iZxq`4|fUk=qhUxLJ5?DMi;tgNBm+LM7t z!4O>#qADYCcmPJ&{#WA{J=*`zpg_>5D5fvaY(0Ur-+LDU{Q`r;Wv9+@*+VznjUkyB zU<{|J>~oJ8%yk2Pf{VQvlI!E3UpD2sD7MK4%R{MBZzBi6Pi%0mMocH^VWk0guk7-W zISKzeEaBVq*!M+*-2&R_YcQX<_j@2e14N9JsFLgA4S6UCy^M9`Z2U4!iqJlqnneXL z#y>r-4o-IeGa@(|;zTb+u0gk=el%!GU%OF5h3B6jB0Ny8_`xx6vqq5aiYsofVx*&p z8w!x?6Fr(z5s^xS>R3B{&V)~!iC}>S7z7b9$CJn-P|B%&v3w((+r5HABs*HwFRij; zyrAEBn%v)ZI=G^)R;(kPblX_PH;_}Ne}vsy3uNVNv~7i0-|Z-0;t2mWTB*VJ4(1-d z_9WXBEA&FtKK%~oDWO*bK0H>bg!Pe3!u!rh60SeeJ$- zKk-S~;6*MS;QOPeYIRBwGKj)EcPp0N1LuGMJh`itbV?bb*xFNDcwr!PeOlnB*gn<+ zk{J2;F1J?vNChS!@mNkhTuBjNl*z-^u_C*b+b-l!VYti7E=F4>z_VSX*BS8xJX>!N znTGbWA@K^IC)R68irgqB=vv%7nQ$K1Gzk`FJwf*46O@g=oDG?T)8OoG3eDs@U=T&m zqAHw*M>~k$$18N2{U_TwtaebHH2vY{0MBPN^?;`J8!8dKXLW zUBudznFA7`)$cnZE}6b9nkrj~Au2Dw?p?G)8EXKYO|}JDlr5Lo)1Il3_hTsB(!~jf zK)SCGhgi33^nks|)B8YR~k1p+5T zj>?NeH&TLA+-}Y5hpbb~lwo!-0BDNE3`?T^DI0(($}aE$7tmll$HU#;6?QkaVeXW| zasafU0;L@lbXl*l`M!xvuEygBhLy%2dU33gS~jeypErznM^}B1*$i!M3U3vIQChi*`6H-j7=F@5_ypbknGa8_cjVz9 zNiG`nB;)ol8X701bP5hxbe?2e0-1F5P3b87Ru z(8pSxH5V$UFU44gUJlMyT76~!wx@C|EavQgyT`-$qBJf zWFYEamiL^iR?RL%7bFJnDS#$~f9-j3H9LJj$j#vCBiWXpeft$8GoUvLas3||hR0=3 zmgwXyR)s~~$7MfDMct-%rS3JiUG$jIZhq%{E4qFFnK9KbV6SF>W@BG!zA-xi&7HQ& z2qE9amAbv8;93{WrQLGS=;a(#PuPAmr~$My`J?x^E#Wk$wIu2NeA1s^mN;=s#Lkgy z5BA1f2tGA88(8XmO-kb85>Gy~u=MtadhF>U4f@pO=e^TY?w_glKZ>ZlClxSjiTLm2MCQxjSbUQe_$Acl4LBq3p`e_ z(4mg4AeF8aXlJxMeP+JKZFKc(~Ml4=E;h6(V!}Ox`gpWp(umb6T}B~&p{9x zUzq$6n+GFim7Kf7h0h(p8_x%DhR$fcw|S*Cv&eMo5l(4vX`MvKf~|{CCRFHs2SFUF-`5UFFa2=(mBJ#2 zph^ET9RSg+XQX;u*69Z4?S5;R5Q1KhJc}@w>MP*qlFe1X8|ISA7a^*WyJ#P8IVx|b@^2J!&ItPnZ6559`C4M%+CnD??qb#su9qgx>m>+a_h8mB zjwi5nZD&=MA+7*(%nF+o_}m-bKURCHpJ?^*VI;-Yb;mIM~D~n|-@;x+O4` z(($OJR*sYOWhWWBZ|0xH;>3G(RDA}2yDp(2(dE@w+L`kFVw4@11T@P{Yab6!f{;3# zG+~A+`nDa;{*(CJ?MkLi8n~xXOBPunUxN9ohwpg3O6P&;62!Mjle*uIx z8n+g1gR6&vg-x-`7&=6qd~7y$qP^`07J{l{&R284+Gl75pG9%J-(rh&_JczJ-8u?x zM2eURtLif)es7dYg2X_tT*RB zq+|ClC`5()z+}&7r^o6^7IOU@U^c{TwAX4?YH*Q0ipCGs7{~jA_k8QR>gsK_+af(e<*-g_J zi)_K9O`1Xl=1OAn9#}OQ5vG~WM)LvA=9+jE95HjWFf+2QSzm~Z{XTgvou1D|;B}Uk znxH-QA-&;|YLeu(ZF;skA;$b-G%A7jI_~nM5a*6N-fnK~;#k;F?CfQ>UxpU>AcQ9oz@0p$0Fid-C6x+I3gPP)2s*Z;%f@ z0Z_L)07hXZ_NvZg*xnnbNC4h$BY@ly>0}jAaH=f5I;v+Nnp85V0Y)c^P1l)TthnS3YbC4u?e(j@?srJdE4Gn^1QUu@_ z+CnVM;K&g!2wa0&Bg+^bT|riBIoA?bNnk9a-1>TVEsg)(nuh77x}I*>r+(Ty2p7Zr z=@XRj@kcpGUA$fH;xHAC7fV;pGCmQ^$4=hCC--M0!3E#XVtR%Q>bb?DO~GwtO;Lgs zLHCqpf{sII?u6Ch&C8K_L-S1sX<#tsjWe*2p0L(WI<61-$KrJCn&nwo+!fHm`{VU> zo!S)?U2T@aNXkz25+`m!FP_CrjKt?|0eU4LW7l#NSJB75C1U<7jXmLJQp7e^+Iww4 zL=p0f1b?S}u8by_u&#w+?pN?kCgqjEKXUZ>8=wS<+n3<;uVlo-Xhw#hq zLAcPXNy0tfZ@$gp$r0e5%ptw+X}-1VKsx27jx`%D5>c^jy*cQM;q}6GBBHpb&aAJ$W@zB|6q+nB!Y-??I^{L27S?lAgn zRY-U^Ma?!Z=cd`LwbF)?lX%V)uK23DVD0o#ju_b|x0~l3U2m!5gJDFmxi98@}(gQmN_dy2XwO(0U ztlLQ6U-6Yt?r9>Yg^c;LeFwWozL=sQI0qgL zMj9H{Y>-C$lTW670*%xK(r{|I-<9%!-uoGYRCBt~tnGRZ7psK)lok+4c78ce6PBZL z+q#1v93$>skh1M);=ag#rz>qsBV;V#fMv-Y^l-`pKqf%*($i1YE{*@5k0Uy@S1XGjH2H6O9q?&D zqHM$^Q8{i}3=lMDjOBGUB^qnDxT6Z`U=?~G%c008p`#sBBkE2rx@Mhr{}<80%vs$JpUA>mquYr zWkiJB+9f*Bb!ukwtMZ^2|2^@Y2K(IaQKl`UpeNs^Q4##H^h{`k9IDkf+{{)SlcSiVEIx`3 zrBGcMEYX;Uc=hwd zV*9q428R@JtBQPuo1gDoCH>;-4L|^-8G|-#J*dgCHcn3?AY8^+CDvhj0WqF)m!z%{ z9vky~#}~}xBlUl}(t4Ef9Zib z3<2QMZv#_)ZXdW^f6&hpx?&p^J=KbOxa3l>GZ>P@$b+yU$|o?6d1BMq`C-m87XNXb zsqeOGqXWVtkoyayWF0B(@;Garuq^wUn+(B1Kf~B5#mOW%RVuMjP22a@otLgtNDZ$* z7!P}b@KFn_3=#3$V@K!|AtNRINy-ik?)k@#C+52l+~OHw4J3!_$|ltNO1>I7w`7wE zFr!!gXzVS#5sMX!zSZN8Oue5$gCU>Jf*tJ5k}z8x0loSxR;q7Hn<7n#zjK$al=tie z#`Yp~l$CsS9d^>eNW6hpYt?yLiCE*TD!Y}*AT61JAFGUBe4(o6sLd%E=iMnfn6YR6 zxjH6P=BJuWMAsQMVxf|7r&#h0%Q%X6bwj?ain4p2-&Y9S8_Rv*`pfft`kI5C>DJ0| zRCz;N9{w;pLYJALq%BNZlrpmHf|=Wz<*vTzgC0`1=pn zz6Z0&HUcnYcMp2wtW;}dzPZ=EIQC1^mIeLCg#!)f$zNtakvg zxy!%p;f)*~%LMM24k$%N9mEq_Z7WAL6vj!E=`*r8LS|UG1rw-w;O7Rf6H#sv{Y9j{ z?QEi!1&D;(q6MUTgg8gtDhaLK{HFFX;##G>3A+S0W&`YBb#vz5Uw=!IHII@hXlhLK z4pBHEtm6#oYz%&tG8LDOz@p#Ki9TUM(oi~OgdCC ml9D4Sg{*cusQtWuvSRwmQQ1cH1M~lF@x(%k{{X&!<9`5)WU#*g literal 0 HcmV?d00001 diff --git a/web/public/empty-state/disabled-feature/views-light.webp b/web/public/empty-state/disabled-feature/views-light.webp new file mode 100644 index 0000000000000000000000000000000000000000..145bc8c2438e4d3414b5b2b7dc6ffc5a6ac98cc1 GIT binary patch literal 53994 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 O1f8G*a)1B;0002(HGQW5 literal 0 HcmV?d00001 From 9b918b727aa4e10267fc6d61c85990f0e16e0ab3 Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Tue, 9 Apr 2024 13:39:01 +0530 Subject: [PATCH 036/105] [WEB-918] style: update size of `state` dropdown button for consistency. (#4144) --- web/components/modules/select/status.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/components/modules/select/status.tsx b/web/components/modules/select/status.tsx index 7db3167f56..6173331473 100644 --- a/web/components/modules/select/status.tsx +++ b/web/components/modules/select/status.tsx @@ -24,7 +24,7 @@ export const ModuleStatusSelect: React.FC = ({ control, error, tabIndex } +

{value ? ( ) : ( From 2d4547601d944c6d4b1142c1918eeabdc7943cbe Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Tue, 9 Apr 2024 15:03:49 +0530 Subject: [PATCH 037/105] [WEB-903] fix: issue subscription button mutation. (#4149) --- web/store/issue/issue-details/subscription.store.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/store/issue/issue-details/subscription.store.ts b/web/store/issue/issue-details/subscription.store.ts index 418842a095..1326d705ee 100644 --- a/web/store/issue/issue-details/subscription.store.ts +++ b/web/store/issue/issue-details/subscription.store.ts @@ -82,7 +82,7 @@ export class IssueSubscriptionStore implements IIssueSubscriptionStore { if (!currentUserId) throw new Error("user id not available"); runInAction(() => { - set(this.subscriptionMap, [issueId, currentUserId], { subscribed: true }); + set(this.subscriptionMap, [issueId, currentUserId], true); }); await this.notificationService.subscribeToIssueNotifications(workspaceSlug, projectId, issueId); @@ -98,7 +98,7 @@ export class IssueSubscriptionStore implements IIssueSubscriptionStore { if (!currentUserId) throw new Error("user id not available"); runInAction(() => { - set(this.subscriptionMap, [issueId, currentUserId], { subscribed: false }); + set(this.subscriptionMap, [issueId, currentUserId], false); }); await this.notificationService.unsubscribeFromIssueNotifications(workspaceSlug, projectId, issueId); From 699017014ee292bf7b884b2aa62cc11b5647cbc5 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Tue, 9 Apr 2024 15:04:16 +0530 Subject: [PATCH 038/105] fix: workspace invite empty state flicker (#4150) --- web/layouts/auth-layout/workspace-wrapper.tsx | 4 ++-- web/store/workspace/index.ts | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/web/layouts/auth-layout/workspace-wrapper.tsx b/web/layouts/auth-layout/workspace-wrapper.tsx index 8b40597b2c..8787a36dc3 100644 --- a/web/layouts/auth-layout/workspace-wrapper.tsx +++ b/web/layouts/auth-layout/workspace-wrapper.tsx @@ -32,7 +32,7 @@ export const WorkspaceAuthWrapper: FC = observer((props) const { workspace: { fetchWorkspaceMembers }, } = useMember(); - const { workspaces } = useWorkspace(); + const { workspaces, loader } = useWorkspace(); const { isMobile } = usePlatformOS(); const planeLogo = resolvedTheme === "dark" ? PlaneWhiteLogo : PlaneBlackLogo; @@ -84,7 +84,7 @@ export const WorkspaceAuthWrapper: FC = observer((props) }; // if list of workspaces are not there then we have to render the spinner - if (allWorkspaces === undefined) { + if (allWorkspaces === undefined || loader) { return (
diff --git a/web/store/workspace/index.ts b/web/store/workspace/index.ts index 096e11f0dd..ce4da598ed 100644 --- a/web/store/workspace/index.ts +++ b/web/store/workspace/index.ts @@ -1,7 +1,7 @@ import set from "lodash/set"; import { action, computed, observable, makeObservable, runInAction } from "mobx"; -import { WorkspaceService } from "@/services/workspace.service"; import { IWorkspace } from "@plane/types"; +import { WorkspaceService } from "@/services/workspace.service"; import { RootStore } from "../root.store"; // types // services @@ -10,6 +10,7 @@ import { ApiTokenStore, IApiTokenStore } from "./api-token.store"; import { IWebhookStore, WebhookStore } from "./webhook.store"; export interface IWorkspaceRootStore { + loader: boolean; // observables workspaces: Record; // computed @@ -30,6 +31,7 @@ export interface IWorkspaceRootStore { } export class WorkspaceRootStore implements IWorkspaceRootStore { + loader: boolean = false; // observables workspaces: Record = {}; // services @@ -43,6 +45,7 @@ export class WorkspaceRootStore implements IWorkspaceRootStore { constructor(_rootStore: RootStore) { makeObservable(this, { + loader: observable.ref, // observables workspaces: observable, // computed @@ -106,12 +109,14 @@ export class WorkspaceRootStore implements IWorkspaceRootStore { * fetch user workspaces from API */ fetchWorkspaces = async () => { + this.loader = true; const workspaceResponse = await this.workspaceService.userWorkspaces(); runInAction(() => { workspaceResponse.forEach((workspace) => { set(this.workspaces, [workspace.id], workspace); }); }); + this.loader = false; return workspaceResponse; }; From b349de556a68d6be07282cd9ddfb7edcef729ded Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Tue, 9 Apr 2024 17:53:09 +0530 Subject: [PATCH 039/105] chore: security policy updated --- SECURITY.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..36cdb982c3 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,44 @@ +# Security Policy + +This document outlines security procedures and vulnerabilities reporting for the Plane project. + +At Plane, we safeguarding the security of our systems with top priority. Despite our efforts, vulnerabilities may still exist. We greatly appreciate your assistance in identifying and reporting any such vulnerabilities to help us maintain the integrity of our systems and protect our clients. + +To report a security vulnerability, please email us directly at security@plane.so with a detailed description of the vulnerability and steps to reproduce it. Please refrain from disclosing the vulnerability publicly until we have had an opportunity to review and address it. + +## Out of Scope Vulnerabilities + +We appreciate your help in identifying vulnerabilities. However, please note that the following types of vulnerabilities are considered out of scope: + +- Attacks requiring MITM or physical access to a user's device. +- Content spoofing and text injection issues without demonstrating an attack vector or ability to modify HTML/CSS. +- Email spoofing. +- Missing DNSSEC, CAA, CSP headers. +- Lack of Secure or HTTP only flag on non-sensitive cookies. + +## Reporting Process + +If you discover a vulnerability, please adhere to the following reporting process: + +1. Email your findings to security@plane.so. +2. Refrain from running automated scanners on our infrastructure or dashboard without prior consent. Contact us to set up a sandbox environment if necessary. +3. Do not exploit the vulnerability for malicious purposes, such as downloading excessive data or altering user data. +4. Maintain confidentiality and refrain from disclosing the vulnerability until it has been resolved. +5. Avoid using physical security attacks, social engineering, distributed denial of service, spam, or third-party applications. + +When reporting a vulnerability, please provide sufficient information to allow us to reproduce and address the issue promptly. Include the IP address or URL of the affected system, along with a detailed description of the vulnerability. + +## Our Commitment + +We are committed to promptly addressing reported vulnerabilities and maintaining open communication throughout the resolution process. Here's what you can expect from us: + +- **Response Time:** We will acknowledge receipt of your report within three business days and provide an expected resolution date. +- **Legal Protection:** We will not pursue legal action against you for reporting vulnerabilities, provided you adhere to the reporting guidelines. +- **Confidentiality:** Your report will be treated with strict confidentiality. We will not disclose your personal information to third parties without your consent. +- **Progress Updates:** We will keep you informed of our progress in resolving the reported vulnerability. +- **Recognition:** With your permission, we will publicly acknowledge you as the discoverer of the vulnerability. +- **Timely Resolution:** We strive to resolve all reported vulnerabilities promptly and will actively participate in the publication process once the issue is resolved. + +We appreciate your cooperation in helping us maintain the security of our systems and protecting our clients. Thank you for your contributions to our security efforts. + +reference: https://supabase.com/.well-known/security.txt From f805acbcef6f5c8593696e4fa3dc0e55fd855be3 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Tue, 9 Apr 2024 19:18:43 +0530 Subject: [PATCH 040/105] chore: workspace invite loader improvement (#4152) --- web/layouts/auth-layout/workspace-wrapper.tsx | 4 ++-- web/pages/invitations/index.tsx | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/web/layouts/auth-layout/workspace-wrapper.tsx b/web/layouts/auth-layout/workspace-wrapper.tsx index 8787a36dc3..8b40597b2c 100644 --- a/web/layouts/auth-layout/workspace-wrapper.tsx +++ b/web/layouts/auth-layout/workspace-wrapper.tsx @@ -32,7 +32,7 @@ export const WorkspaceAuthWrapper: FC = observer((props) const { workspace: { fetchWorkspaceMembers }, } = useMember(); - const { workspaces, loader } = useWorkspace(); + const { workspaces } = useWorkspace(); const { isMobile } = usePlatformOS(); const planeLogo = resolvedTheme === "dark" ? PlaneWhiteLogo : PlaneBlackLogo; @@ -84,7 +84,7 @@ export const WorkspaceAuthWrapper: FC = observer((props) }; // if list of workspaces are not there then we have to render the spinner - if (allWorkspaces === undefined || loader) { + if (allWorkspaces === undefined) { return (
diff --git a/web/pages/invitations/index.tsx b/web/pages/invitations/index.tsx index 5d22ab5875..b9b24694b7 100644 --- a/web/pages/invitations/index.tsx +++ b/web/pages/invitations/index.tsx @@ -15,7 +15,7 @@ import { MEMBER_ACCEPTED } from "@/constants/event-tracker"; import { ROLE } from "@/constants/workspace"; import { truncateText } from "@/helpers/string.helper"; import { getUserRole } from "@/helpers/user.helper"; -import { useEventTracker, useUser } from "@/hooks/store"; +import { useEventTracker, useUser, useWorkspace } from "@/hooks/store"; import { UserAuthWrapper } from "@/layouts/auth-layout"; import DefaultLayout from "@/layouts/default-layout"; import { NextPageWithLayout } from "@/lib/types"; @@ -43,6 +43,7 @@ const UserInvitationsPage: NextPageWithLayout = observer(() => { // store hooks const { captureEvent, joinWorkspaceMetricGroup } = useEventTracker(); const { currentUser, currentUserSettings } = useUser(); + const { fetchWorkspaces } = useWorkspace(); // router const router = useRouter(); // next-themes @@ -96,7 +97,9 @@ const UserInvitationsPage: NextPageWithLayout = observer(() => { .updateUser({ last_workspace_id: redirectWorkspace?.id }) .then(() => { setIsJoiningWorkspaces(false); - router.push(`/${redirectWorkspace?.slug}`); + fetchWorkspaces().then(() => { + router.push(`/${redirectWorkspace?.slug}`); + }); }) .catch(() => { setToast({ From 3c2b2e3ed6d8bb7546dbad15807875bda830d7ae Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Wed, 10 Apr 2024 13:02:56 +0530 Subject: [PATCH 041/105] [WEB-924] chore: remove `Add Issues` button from completed cycles header. (#4153) * [WEB-924] chore: remove `Add Issues` button from completed cycles header. * fix: analytics button. --- web/components/headers/cycle-issues.tsx | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/web/components/headers/cycle-issues.tsx b/web/components/headers/cycle-issues.tsx index 2fd5ffe836..ac59287e3c 100644 --- a/web/components/headers/cycle-issues.tsx +++ b/web/components/headers/cycle-issues.tsx @@ -142,6 +142,7 @@ export const CycleIssuesHeader: React.FC = observer(() => { // derived values const cycleDetails = cycleId ? getCycleById(cycleId.toString()) : undefined; + const isCompletedCycle = cycleDetails?.status?.toLocaleLowerCase() === "completed"; const canUserCreateIssue = currentProjectRole && [EUserProjectRoles.ADMIN, EUserProjectRoles.MEMBER].includes(currentProjectRole); @@ -274,16 +275,18 @@ export const CycleIssuesHeader: React.FC = observer(() => { - + {!isCompletedCycle && ( + + )} )}
+ + {/* duplicate to*/} + {duplicateIssueDetails && ( +
+
+ + Duplicate of +
+ + { + router.push(`/${workspaceSlug}/projects/${projectId}/issues/${duplicateIssueDetails?.id}`); + }} + > + + + {`${currentProjectDetails?.identifier}-${duplicateIssueDetails?.sequence_id}`} + + + +
+ )}
diff --git a/web/components/inbox/content/issue-root.tsx b/web/components/inbox/content/issue-root.tsx index b493b573bf..7a55195f18 100644 --- a/web/components/inbox/content/issue-root.tsx +++ b/web/components/inbox/content/issue-root.tsx @@ -164,6 +164,7 @@ export const InboxIssueMainContent: React.FC = observer((props) => { issue={issue} issueOperations={issueOperations} is_editable={is_editable} + duplicateIssueDetails={inboxIssue?.duplicate_issue_detail} />
diff --git a/web/components/inbox/content/root.tsx b/web/components/inbox/content/root.tsx index 12cfb836d8..c15bf0863d 100644 --- a/web/components/inbox/content/root.tsx +++ b/web/components/inbox/content/root.tsx @@ -35,6 +35,9 @@ export const InboxContentRoot: FC = observer((props) => { const is_editable = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; if (!inboxIssue) return <>; + + const isIssueAcceptedOrDeclined = [-1, 1].includes(inboxIssue.status); + return ( <>
@@ -51,7 +54,7 @@ export const InboxContentRoot: FC = observer((props) => { workspaceSlug={workspaceSlug} projectId={projectId} inboxIssue={inboxIssue} - is_editable={is_editable} + is_editable={is_editable && !isIssueAcceptedOrDeclined} isSubmitting={isSubmitting} setIsSubmitting={setIsSubmitting} /> diff --git a/web/components/inbox/inbox-filter/applied-filters/date.tsx b/web/components/inbox/inbox-filter/applied-filters/date.tsx index bce7a04872..dcac855b40 100644 --- a/web/components/inbox/inbox-filter/applied-filters/date.tsx +++ b/web/components/inbox/inbox-filter/applied-filters/date.tsx @@ -2,10 +2,10 @@ import { FC } from "react"; import { observer } from "mobx-react"; import { X } from "lucide-react"; import { TInboxIssueFilterDateKeys } from "@plane/types"; -// constants -import { DATE_BEFORE_FILTER_OPTIONS } from "@/constants/filters"; // helpers import { renderFormattedDate } from "@/helpers/date-time.helper"; +// constants +import { PAST_DURATION_FILTER_OPTIONS } from "@/helpers/inbox.helper"; // hooks import { useProjectInbox } from "@/hooks/store"; @@ -21,7 +21,7 @@ export const InboxIssueAppliedFiltersDate: FC = ob // derived values const filteredValues = inboxFilters?.[filterKey] || []; const currentOptionDetail = (date: string) => { - const currentDate = DATE_BEFORE_FILTER_OPTIONS.find((d) => d.value === date); + const currentDate = PAST_DURATION_FILTER_OPTIONS.find((d) => d.value === date); if (currentDate) return currentDate; const dateSplit = date.split(";"); return { diff --git a/web/components/inbox/inbox-filter/applied-filters/label.tsx b/web/components/inbox/inbox-filter/applied-filters/label.tsx index b028a1773b..af121718ce 100644 --- a/web/components/inbox/inbox-filter/applied-filters/label.tsx +++ b/web/components/inbox/inbox-filter/applied-filters/label.tsx @@ -13,13 +13,13 @@ export const InboxIssueAppliedFiltersLabel: FC = observer(() => { const { inboxFilters, handleInboxIssueFilters } = useProjectInbox(); const { getLabelById } = useLabel(); // derived values - const filteredValues = inboxFilters?.label || []; + const filteredValues = inboxFilters?.labels || []; const currentOptionDetail = (labelId: string) => getLabelById(labelId) || undefined; const handleFilterValue = (value: string): string[] => filteredValues?.includes(value) ? filteredValues.filter((v) => v !== value) : [...filteredValues, value]; - const clearFilter = () => handleInboxIssueFilters("label", undefined); + const clearFilter = () => handleInboxIssueFilters("labels", undefined); if (filteredValues.length === 0) return <>; return ( @@ -36,7 +36,7 @@ export const InboxIssueAppliedFiltersLabel: FC = observer(() => {
{optionDetail?.name}
handleInboxIssueFilters("label", handleFilterValue(value))} + onClick={() => handleInboxIssueFilters("labels", handleFilterValue(value))} >
diff --git a/web/components/inbox/inbox-filter/applied-filters/root.tsx b/web/components/inbox/inbox-filter/applied-filters/root.tsx index 8baf86df26..7aa50b0eb5 100644 --- a/web/components/inbox/inbox-filter/applied-filters/root.tsx +++ b/web/components/inbox/inbox-filter/applied-filters/root.tsx @@ -28,9 +28,9 @@ export const InboxIssueAppliedFilters: FC = observer(() => { {/* label */} {/* created_at */} - + {/* updated_at */} - +
); }); diff --git a/web/components/inbox/inbox-filter/applied-filters/status.tsx b/web/components/inbox/inbox-filter/applied-filters/status.tsx index a4ec1a37e5..23351352d6 100644 --- a/web/components/inbox/inbox-filter/applied-filters/status.tsx +++ b/web/components/inbox/inbox-filter/applied-filters/status.tsx @@ -9,7 +9,7 @@ import { useProjectInbox } from "@/hooks/store"; export const InboxIssueAppliedFiltersStatus: FC = observer(() => { // hooks - const { currentTab, inboxFilters, handleInboxIssueFilters } = useProjectInbox(); + const { inboxFilters, handleInboxIssueFilters } = useProjectInbox(); // derived values const filteredValues = inboxFilters?.status || []; const currentOptionDetail = (status: TInboxIssueStatus) => INBOX_STATUS.find((s) => s.status === status) || undefined; @@ -17,8 +17,6 @@ export const InboxIssueAppliedFiltersStatus: FC = observer(() => { const handleFilterValue = (value: TInboxIssueStatus): TInboxIssueStatus[] => filteredValues?.includes(value) ? filteredValues.filter((v) => v !== value) : [...filteredValues, value]; - const clearFilter = () => handleInboxIssueFilters("status", undefined); - if (filteredValues.length === 0) return <>; return (
@@ -32,7 +30,7 @@ export const InboxIssueAppliedFiltersStatus: FC = observer(() => {
{optionDetail?.title}
- {currentTab === "closed" && handleFilterValue(optionDetail?.status).length >= 1 && ( + {handleFilterValue(optionDetail?.status).length >= 1 && (
handleInboxIssueFilters("status", handleFilterValue(optionDetail?.status))} @@ -43,15 +41,6 @@ export const InboxIssueAppliedFiltersStatus: FC = observer(() => {
); })} - - {currentTab === "closed" && filteredValues.length > 1 && ( -
- -
- )}
); }); diff --git a/web/components/inbox/inbox-filter/filters/date.tsx b/web/components/inbox/inbox-filter/filters/date.tsx index 12aba01ef2..50e9b71b02 100644 --- a/web/components/inbox/inbox-filter/filters/date.tsx +++ b/web/components/inbox/inbox-filter/filters/date.tsx @@ -1,6 +1,5 @@ import { FC, useState } from "react"; import concat from "lodash/concat"; -import pull from "lodash/pull"; import uniq from "lodash/uniq"; import { observer } from "mobx-react"; import { TInboxIssueFilterDateKeys } from "@plane/types"; @@ -8,7 +7,7 @@ import { TInboxIssueFilterDateKeys } from "@plane/types"; import { DateFilterModal } from "@/components/core"; import { FilterHeader, FilterOption } from "@/components/issues"; // constants -import { DATE_BEFORE_FILTER_OPTIONS } from "@/constants/filters"; +import { PAST_DURATION_FILTER_OPTIONS } from "@/helpers/inbox.helper"; // hooks import { useProjectInbox } from "@/hooks/store"; @@ -33,16 +32,15 @@ export const FilterDate: FC = observer((props) => { // derived values const filterValue: string[] = inboxFilters?.[filterKey] || []; const appliedFiltersCount = filterValue?.length ?? 0; - const filteredOptions = DATE_BEFORE_FILTER_OPTIONS.filter((d) => + const filteredOptions = PAST_DURATION_FILTER_OPTIONS.filter((d) => d.name.toLowerCase().includes(searchQuery.toLowerCase()) ); - const handleFilterValue = (value: string): string[] => - filterValue?.includes(value) ? pull(filterValue, value) : uniq(concat(filterValue, value)); + const handleFilterValue = (value: string): string[] => (filterValue?.includes(value) ? [] : uniq(concat(value))); const handleCustomFilterValue = (value: string[]): string[] => { const finalOptions: string[] = [...filterValue]; - value.forEach((v) => (finalOptions?.includes(v) ? pull(finalOptions, v) : finalOptions.push(v))); + value.forEach((v) => (finalOptions?.includes(v) ? [] : finalOptions.push(v))); return uniq(finalOptions); }; @@ -53,10 +51,13 @@ export const FilterDate: FC = observer((props) => { const handleCustomDate = () => { if (isCustomDateSelected()) { - const updateAppliedFilters = filterValue?.filter((f) => isDate(f.split(";")[0])) || []; - handleInboxIssueFilters(filterKey, handleCustomFilterValue(updateAppliedFilters)); - } else setIsDateFilterModalOpen(true); + const updateAppliedFilters = filterValue?.filter((f) => !isDate(f.split(";")[0])) || []; + handleInboxIssueFilters(filterKey, updateAppliedFilters); + } else { + setIsDateFilterModalOpen(true); + } }; + return ( <> {isDateFilterModalOpen && ( @@ -82,10 +83,15 @@ export const FilterDate: FC = observer((props) => { isChecked={filterValue?.includes(option.value) ? true : false} onClick={() => handleInboxIssueFilters(filterKey, handleFilterValue(option.value))} title={option.name} - multiple + multiple={false} /> ))} - + ) : (

No matches found

diff --git a/web/components/inbox/inbox-filter/filters/filter-selection.tsx b/web/components/inbox/inbox-filter/filters/filter-selection.tsx index 46f959a2d0..d7bebdc11f 100644 --- a/web/components/inbox/inbox-filter/filters/filter-selection.tsx +++ b/web/components/inbox/inbox-filter/filters/filter-selection.tsx @@ -75,11 +75,11 @@ export const InboxIssueFilterSelection: FC = observer(() => {
{/* Created at */}
- +
{/* Updated at */}
- +
diff --git a/web/components/inbox/inbox-filter/filters/labels.tsx b/web/components/inbox/inbox-filter/filters/labels.tsx index cf55623c8a..8f6b765b5d 100644 --- a/web/components/inbox/inbox-filter/filters/labels.tsx +++ b/web/components/inbox/inbox-filter/filters/labels.tsx @@ -24,7 +24,7 @@ export const FilterLabels: FC = observer((props) => { const { inboxFilters, handleInboxIssueFilters } = useProjectInbox(); - const filterValue = inboxFilters?.label || []; + const filterValue = inboxFilters?.labels || []; const appliedFiltersCount = filterValue?.length ?? 0; @@ -56,7 +56,7 @@ export const FilterLabels: FC = observer((props) => { handleInboxIssueFilters("label", handleFilterValue(label.id))} + onClick={() => handleInboxIssueFilters("labels", handleFilterValue(label.id))} icon={} title={label.name} /> diff --git a/web/components/inbox/inbox-filter/filters/status.tsx b/web/components/inbox/inbox-filter/filters/status.tsx index ca79d882ff..b27f360da1 100644 --- a/web/components/inbox/inbox-filter/filters/status.tsx +++ b/web/components/inbox/inbox-filter/filters/status.tsx @@ -24,8 +24,8 @@ export const FilterStatus: FC = observer((props) => { const appliedFiltersCount = filterValue?.length ?? 0; const filteredOptions = INBOX_STATUS.filter( (s) => - ((currentTab === "open" && [-2].includes(s.status)) || - (currentTab === "closed" && [-1, 0, 1, 2].includes(s.status))) && + ((currentTab === "open" && [-2, 0].includes(s.status)) || + (currentTab === "closed" && [-1, 1, 2].includes(s.status))) && s.key.includes(searchQuery.toLowerCase()) ); @@ -33,10 +33,8 @@ export const FilterStatus: FC = observer((props) => { filterValue?.includes(value) ? filterValue.filter((v) => v !== value) : [...filterValue, value]; const handleStatusFilterSelect = (status: TInboxIssueStatus) => { - if (currentTab === "closed") { - const selectedStatus = handleFilterValue(status); - if (selectedStatus.length >= 1) handleInboxIssueFilters("status", selectedStatus); - } + const selectedStatus = handleFilterValue(status); + if (selectedStatus.length >= 1) handleInboxIssueFilters("status", selectedStatus); }; return ( diff --git a/web/components/inbox/inbox-issue-status.tsx b/web/components/inbox/inbox-issue-status.tsx index e230b02d55..4077ba24ca 100644 --- a/web/components/inbox/inbox-issue-status.tsx +++ b/web/components/inbox/inbox-issue-status.tsx @@ -32,14 +32,14 @@ export const InboxIssueStatus: React.FC = observer((props) => { )} >
- -
+ +
{inboxIssue?.status === 0 && inboxIssue?.snoozed_till ? inboxIssueStatusDetail.description(inboxIssue?.snoozed_till) : inboxIssueStatusDetail.title}
- {showDescription &&
{description}
} + {showDescription &&
{description}
}
); }); diff --git a/web/components/inbox/root.tsx b/web/components/inbox/root.tsx index f74fd5780f..505729b2e5 100644 --- a/web/components/inbox/root.tsx +++ b/web/components/inbox/root.tsx @@ -28,7 +28,7 @@ export const InboxIssueRoot: FC = observer((props) => { () => { inboxAccessible && workspaceSlug && projectId && fetchInboxIssues(workspaceSlug.toString(), projectId.toString()); }, - { revalidateOnFocus: false } + { revalidateOnFocus: false, revalidateIfStale: false } ); // loader diff --git a/web/components/inbox/sidebar/root.tsx b/web/components/inbox/sidebar/root.tsx index d1d08f017d..109241bb02 100644 --- a/web/components/inbox/sidebar/root.tsx +++ b/web/components/inbox/sidebar/root.tsx @@ -99,7 +99,7 @@ export const InboxSidebar: FC = observer((props) => { - {isLoading && !inboxIssuePaginationInfo?.next_page_results ? ( + {isLoading === "filter-loading" && !inboxIssuePaginationInfo?.next_page_results ? ( ) : (
= (props) => { const labelResponse = await labelOperations.createLabel(workspaceSlug, projectId, formData); const currentLabels = [...(values || []), labelResponse.id]; await labelOperations.updateIssue(workspaceSlug, projectId, issueId, { label_ids: currentLabels }); + handleIsCreateToggle(); reset(defaultValues); } catch (error) { setToast({ diff --git a/web/helpers/inbox.helper.ts b/web/helpers/inbox.helper.ts new file mode 100644 index 0000000000..9b2ac28e77 --- /dev/null +++ b/web/helpers/inbox.helper.ts @@ -0,0 +1,56 @@ +import { subDays } from "date-fns"; +import { renderFormattedPayloadDate } from "./date-time.helper"; + +export enum EPastDurationFilters { + TODAY = "today", + YESTERDAY = "yesterday", + LAST_7_DAYS = "last_7_days", + LAST_30_DAYS = "last_30_days", +} + +export const getCustomDates = (duration: EPastDurationFilters): string => { + const today = new Date(); + let firstDay, lastDay; + + switch (duration) { + case EPastDurationFilters.TODAY: + firstDay = renderFormattedPayloadDate(today); + lastDay = renderFormattedPayloadDate(today); + return `${firstDay};after,${lastDay};before`; + case EPastDurationFilters.YESTERDAY: + const yesterday = subDays(today, 1); + firstDay = renderFormattedPayloadDate(yesterday); + lastDay = renderFormattedPayloadDate(yesterday); + return `${firstDay};after,${lastDay};before`; + case EPastDurationFilters.LAST_7_DAYS: + firstDay = renderFormattedPayloadDate(subDays(today, 7)); + lastDay = renderFormattedPayloadDate(today); + return `${firstDay};after,${lastDay};before`; + case EPastDurationFilters.LAST_30_DAYS: + firstDay = renderFormattedPayloadDate(subDays(today, 30)); + lastDay = renderFormattedPayloadDate(today); + return `${firstDay};after,${lastDay};before`; + } +}; + +export const PAST_DURATION_FILTER_OPTIONS: { + name: string; + value: string; +}[] = [ + { + name: "Today", + value: EPastDurationFilters.TODAY, + }, + { + name: "Yesterday", + value: EPastDurationFilters.YESTERDAY, + }, + { + name: "Last 7 days", + value: EPastDurationFilters.LAST_7_DAYS, + }, + { + name: "Last 30 days", + value: EPastDurationFilters.LAST_30_DAYS, + }, +]; diff --git a/web/store/inbox/inbox-issue.store.ts b/web/store/inbox/inbox-issue.store.ts index 1807645dbc..2e9a952660 100644 --- a/web/store/inbox/inbox-issue.store.ts +++ b/web/store/inbox/inbox-issue.store.ts @@ -2,7 +2,7 @@ import set from "lodash/set"; import { makeObservable, observable, runInAction, action } from "mobx"; // services // types -import { TIssue, TInboxIssue, TInboxIssueStatus } from "@plane/types"; +import { TIssue, TInboxIssue, TInboxIssueStatus, TInboxDuplicateIssueDetails } from "@plane/types"; import { InboxIssueService } from "@/services/inbox"; export interface IInboxIssueStore { @@ -13,6 +13,7 @@ export interface IInboxIssueStore { snoozed_till: Date | undefined; duplicate_to: string | undefined; created_by: string | undefined; + duplicate_issue_detail: TInboxDuplicateIssueDetails | undefined; // actions updateInboxIssueStatus: (status: TInboxIssueStatus) => Promise; // accept, decline updateInboxIssueDuplicateTo: (issueId: string) => Promise; // connecting the inbox issue to the project existing issue @@ -29,6 +30,7 @@ export class InboxIssueStore implements IInboxIssueStore { snoozed_till: Date | undefined; duplicate_to: string | undefined; created_by: string | undefined; + duplicate_issue_detail: TInboxDuplicateIssueDetails | undefined = undefined; workspaceSlug: string; projectId: string; // services @@ -41,6 +43,7 @@ export class InboxIssueStore implements IInboxIssueStore { this.snoozed_till = data?.snoozed_till ? new Date(data.snoozed_till) : undefined; this.duplicate_to = data?.duplicate_to || undefined; this.created_by = data?.created_by || undefined; + this.duplicate_issue_detail = data?.duplicate_issue_detail || undefined; this.workspaceSlug = workspaceSlug; this.projectId = projectId; // services @@ -52,6 +55,7 @@ export class InboxIssueStore implements IInboxIssueStore { issue: observable, snoozed_till: observable, duplicate_to: observable, + duplicate_issue_detail: observable, created_by: observable, // actions updateInboxIssueStatus: action, diff --git a/web/store/inbox/project-inbox.store.ts b/web/store/inbox/project-inbox.store.ts index b871ccb98d..43a1a229a9 100644 --- a/web/store/inbox/project-inbox.store.ts +++ b/web/store/inbox/project-inbox.store.ts @@ -12,6 +12,8 @@ import { TInboxIssuePaginationInfo, TInboxIssueSortingOrderByQueryParam, } from "@plane/types"; +// helpers +import { EPastDurationFilters, getCustomDates } from "@/helpers/inbox.helper"; // services import { InboxIssueService } from "@/services/inbox"; // root store @@ -110,7 +112,7 @@ export class ProjectInboxStore implements IProjectInboxStore { get inboxIssuesArray() { return Object.values(this.inboxIssues || {}).filter((inbox) => - (this.currentTab === "open" ? [-2] : [-1, 0, 1, 2]).includes(inbox.status) + (this.currentTab === "open" ? [-2, 0] : [-1, 1, 2]).includes(inbox.status) ); } @@ -126,8 +128,16 @@ export class ProjectInboxStore implements IProjectInboxStore { !isEmpty(inboxFilters) && Object.keys(inboxFilters).forEach((key) => { const filterKey = key as keyof TInboxIssueFilter; - if (inboxFilters[filterKey] && inboxFilters[filterKey]?.length) - filters[filterKey] = inboxFilters[filterKey]?.join(","); + if (inboxFilters[filterKey] && inboxFilters[filterKey]?.length) { + if (["created_at", "updated_at"].includes(filterKey) && (inboxFilters[filterKey] || [])?.length > 0) { + const appliedDateFilters: string[] = []; + inboxFilters[filterKey]?.forEach((value) => { + const dateValue = value as EPastDurationFilters; + appliedDateFilters.push(getCustomDates(dateValue)); + }); + filters[filterKey] = appliedDateFilters?.join(","); + } else filters[filterKey] = inboxFilters[filterKey]?.join(","); + } }); const sorting: TInboxIssueSortingOrderByQueryParam = { @@ -167,7 +177,9 @@ export class ProjectInboxStore implements IProjectInboxStore { set(this, "inboxFilters", undefined); set(this, ["inboxSorting", "order_by"], "issue__created_at"); set(this, ["inboxSorting", "sort_by"], "desc"); - if (tab === "closed") set(this, ["inboxFilters", "status"], [-1, 0, 1, 2]); + set(this, ["inboxIssues"], {}); + set(this, ["inboxIssuePaginationInfo"], undefined); + if (tab === "closed") set(this, ["inboxFilters", "status"], [-1, 1, 2]); else set(this, ["inboxFilters", "status"], [-2]); const { workspaceSlug, projectId } = this.store.app.router; if (workspaceSlug && projectId) this.fetchInboxIssues(workspaceSlug, projectId, "filter-loading"); @@ -175,12 +187,16 @@ export class ProjectInboxStore implements IProjectInboxStore { handleInboxIssueFilters = (key: T, value: TInboxIssueFilter[T]) => { set(this.inboxFilters, key, value); + set(this, ["inboxIssues"], {}); + set(this, ["inboxIssuePaginationInfo"], undefined); const { workspaceSlug, projectId } = this.store.app.router; if (workspaceSlug && projectId) this.fetchInboxIssues(workspaceSlug, projectId, "filter-loading"); }; handleInboxIssueSorting = (key: T, value: TInboxIssueSorting[T]) => { set(this.inboxSorting, key, value); + set(this, ["inboxIssues"], {}); + set(this, ["inboxIssuePaginationInfo"], undefined); const { workspaceSlug, projectId } = this.store.app.router; if (workspaceSlug && projectId) this.fetchInboxIssues(workspaceSlug, projectId, "filter-loading"); }; @@ -193,9 +209,7 @@ export class ProjectInboxStore implements IProjectInboxStore { fetchInboxIssues = async (workspaceSlug: string, projectId: string, loadingType: TLoader = undefined) => { try { if (loadingType) this.isLoading = loadingType; - else this.isLoading = "init-loading"; - this.inboxIssuePaginationInfo = undefined; - this.inboxIssues = {}; + else if (Object.keys(this.inboxIssues).length === 0) this.isLoading = "init-loading"; const queryParams = this.inboxIssueQueryParams( this.inboxFilters, @@ -284,9 +298,9 @@ export class ProjectInboxStore implements IProjectInboxStore { // fetching reactions await this.store.issue.issueDetail.fetchReactions(workspaceSlug, projectId, issueId); // fetching activity - await this.store.issue.issueDetail.fetchReactions(workspaceSlug, projectId, issueId); + await this.store.issue.issueDetail.fetchActivities(workspaceSlug, projectId, issueId); // fetching comments - await this.store.issue.issueDetail.fetchReactions(workspaceSlug, projectId, issueId); + await this.store.issue.issueDetail.fetchComments(workspaceSlug, projectId, issueId); runInAction(() => { set(this.inboxIssues, issueId, new InboxIssueStore(workspaceSlug, projectId, inboxIssue)); }); From 549790ee8a8a41386f4190512385cc8cf6313110 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Wed, 10 Apr 2024 14:03:22 +0530 Subject: [PATCH 043/105] [WEB-905] chore: kanban card icon color improvement (#4156) * chore: kanban card icon color improvement * chore: kanban card clickable area improvement --- web/components/dropdowns/date.tsx | 1 + .../issues/issue-layouts/kanban/block.tsx | 109 +++++++++--------- .../properties/all-properties.tsx | 55 ++++++--- .../issue-layouts/properties/labels.tsx | 6 +- 4 files changed, 97 insertions(+), 74 deletions(-) diff --git a/web/components/dropdowns/date.tsx b/web/components/dropdowns/date.tsx index 8e207796d5..e50379fc94 100644 --- a/web/components/dropdowns/date.tsx +++ b/web/components/dropdowns/date.tsx @@ -152,6 +152,7 @@ export const DateDropdown: React.FC = (props) => { className={cn("h-2.5 w-2.5 flex-shrink-0", clearIconClassName)} onClick={(e) => { e.stopPropagation(); + e.preventDefault(); onChange(null); }} /> diff --git a/web/components/issues/issue-layouts/kanban/block.tsx b/web/components/issues/issue-layouts/kanban/block.tsx index 1e7bbcb6cc..1c7cc72299 100644 --- a/web/components/issues/issue-layouts/kanban/block.tsx +++ b/web/components/issues/issue-layouts/kanban/block.tsx @@ -3,7 +3,7 @@ import { Draggable, DraggableProvided, DraggableStateSnapshot } from "@hello-pan import { observer } from "mobx-react-lite"; import { TIssue, IIssueDisplayProperties, IIssueMap } from "@plane/types"; // hooks -import { Tooltip, ControlLink } from "@plane/ui"; +import { ControlLink, Tooltip } from "@plane/ui"; import RenderIfVisible from "@/components/core/render-if-visible-HOC"; import { cn } from "@/helpers/common.helper"; import { useApplication, useIssueDetail, useProject } from "@/hooks/store"; @@ -44,23 +44,16 @@ const KanbanIssueDetailsBlock: React.FC = observer((prop // hooks const { isMobile } = usePlatformOS(); const { getProjectIdentifierById } = useProject(); - const { - router: { workspaceSlug }, - } = useApplication(); - const { peekIssue, setPeekIssue } = useIssueDetail(); - const handleIssuePeekOverview = (issue: TIssue) => - workspaceSlug && - issue && - issue.project_id && - issue.id && - peekIssue?.issueId !== issue.id && - setPeekIssue({ workspaceSlug, projectId: issue.project_id, issueId: issue.id }); + const handleEventPropagation = (e: React.MouseEvent) => { + e.stopPropagation(); + e.preventDefault(); + }; return ( <> -
+
{getProjectIdentifierById(issue.project_id)}-{issue.sequence_id}
@@ -73,24 +66,13 @@ const KanbanIssueDetailsBlock: React.FC = observer((prop {issue.name} ) : ( - handleIssuePeekOverview(issue)} - className="w-full line-clamp-1 cursor-pointer text-sm text-custom-text-100 pb-1.5" - disabled={!!issue?.tempId} - > - - {issue.name} - - + + {issue.name} + )} = memo((props) => { issueIds, } = props; + const { + router: { workspaceSlug }, + } = useApplication(); + const { peekIssue, setPeekIssue } = useIssueDetail(); + + const handleIssuePeekOverview = (issue: TIssue) => + workspaceSlug && + issue && + issue.project_id && + issue.id && + peekIssue?.issueId !== issue.id && + setPeekIssue({ workspaceSlug, projectId: issue.project_id, issueId: issue.id }); + const issue = issuesMap[issueId]; if (!issue) return null; @@ -138,32 +133,42 @@ export const KanbanIssueBlock: React.FC = memo((props) => { {...provided.dragHandleProps} ref={provided.innerRef} > -
handleIssuePeekOverview(issue)} + disabled={!!issue?.tempId} > - - - -
+ + + +
+
)} diff --git a/web/components/issues/issue-layouts/properties/all-properties.tsx b/web/components/issues/issue-layouts/properties/all-properties.tsx index ab1cad738b..0904d144a9 100644 --- a/web/components/issues/issue-layouts/properties/all-properties.tsx +++ b/web/components/issues/issue-layouts/properties/all-properties.tsx @@ -254,12 +254,17 @@ export const IssueProperties: React.FC = observer((props) => { const maxDate = getDate(issue.target_date); maxDate?.setDate(maxDate.getDate()); + const handleEventPropagation = (e: React.MouseEvent) => { + e.stopPropagation(); + e.preventDefault(); + }; + return (
{/* basic properties */} {/* state */} -
+
= observer((props) => { {/* priority */} -
+
= observer((props) => { {/* label */} - +
+ +
{/* start date */} -
+
= observer((props) => { {/* target/due date */} -
+
= observer((props) => { {/* assignee */} -
+
= observer((props) => { {/* modules */} {projectDetails?.module_view && ( -
+
= observer((props) => { {/* cycles */} {projectDetails?.cycle_view && ( -
+
= observer((props) => { {/* estimates */} {areEstimatesEnabledForCurrentProject && ( -
+
= observer((props) => { >
{}} + onClick={(e) => { + e.stopPropagation(); + e.preventDefault(); + if (issue.sub_issues_count) redirectToIssueDetail(); + }} className={cn( "flex h-5 flex-shrink-0 items-center justify-center gap-2 overflow-hidden rounded border-[0.5px] border-custom-border-300 px-2.5 py-1", { @@ -432,7 +443,10 @@ export const IssueProperties: React.FC = observer((props) => { shouldRenderProperty={(properties) => !!properties.attachment_count && !!issue.attachment_count} > -
+
{issue.attachment_count}
@@ -446,7 +460,10 @@ export const IssueProperties: React.FC = observer((props) => { shouldRenderProperty={(properties) => !!properties.link && !!issue.link_count} > -
+
{issue.link_count}
diff --git a/web/components/issues/issue-layouts/properties/labels.tsx b/web/components/issues/issue-layouts/properties/labels.tsx index 5530e6a017..e2212d0c7f 100644 --- a/web/components/issues/issue-layouts/properties/labels.tsx +++ b/web/components/issues/issue-layouts/properties/labels.tsx @@ -143,7 +143,7 @@ export const IssuePropertyLabels: React.FC = observer((pro query === "" ? options : options?.filter((option) => option.query.toLowerCase().includes(query.toLowerCase())); const label = ( -
+
{value.length > 0 ? ( value.length <= maxRender ? ( <> @@ -232,8 +232,8 @@ export const IssuePropertyLabels: React.FC = observer((pro disabled ? "cursor-not-allowed text-custom-text-200" : value.length <= maxRender - ? "cursor-pointer" - : "cursor-pointer hover:bg-custom-background-80" + ? "cursor-pointer" + : "cursor-pointer hover:bg-custom-background-80" } ${buttonClassName}`} onClick={handleOnClick} > From d0cb00f28a9703e34b4856510df822d9c7c4aad3 Mon Sep 17 00:00:00 2001 From: guru_sainath Date: Wed, 10 Apr 2024 14:58:46 +0530 Subject: [PATCH 044/105] [WEB-926] fix: issue description component update handled in peek overview, issue detail, and inbox issues (#4159) * fix: issue description mutation * fix: implemented same issue description logic for issue detail and inbox issue description * fix: fixed parent issue title dissapearing while loading the issue detail page * chore: code cleanup * chore: handled exception when issue in not available in issue detail in issue store --------- Co-authored-by: sriram veeraghanta --- web/components/inbox/content/issue-root.tsx | 31 ++++++--------- web/components/issues/description-input.tsx | 11 +++++- .../issues/issue-detail/main-content.tsx | 39 ++++++++----------- .../issues/issue-detail/parent/root.tsx | 5 ++- web/store/issue/issue-details/issue.store.ts | 21 +++++----- 5 files changed, 51 insertions(+), 56 deletions(-) diff --git a/web/components/inbox/content/issue-root.tsx b/web/components/inbox/content/issue-root.tsx index 7a55195f18..ec56048178 100644 --- a/web/components/inbox/content/issue-root.tsx +++ b/web/components/inbox/content/issue-root.tsx @@ -2,7 +2,7 @@ import { Dispatch, SetStateAction, useEffect, useMemo } from "react"; import { observer } from "mobx-react"; import { useRouter } from "next/router"; import { TIssue } from "@plane/types"; -import { Loader, TOAST_TYPE, setToast } from "@plane/ui"; +import { TOAST_TYPE, setToast } from "@plane/ui"; // components import { InboxIssueProperties } from "@/components/inbox/content"; import { @@ -13,7 +13,7 @@ import { TIssueOperations, } from "@/components/issues"; // hooks -import { useEventTracker, useProjectInbox, useUser } from "@/hooks/store"; +import { useEventTracker, useUser } from "@/hooks/store"; import useReloadConfirmations from "@/hooks/use-reload-confirmation"; // store types import { IInboxIssueStore } from "@/store/inbox/inbox-issue.store"; @@ -32,7 +32,6 @@ export const InboxIssueMainContent: React.FC = observer((props) => { const { workspaceSlug, projectId, inboxIssue, is_editable, isSubmitting, setIsSubmitting } = props; // hooks const { currentUser } = useUser(); - const { isLoading } = useProjectInbox(); const { setShowAlert } = useReloadConfirmations(isSubmitting === "submitting"); const { captureIssueEvent } = useEventTracker(); @@ -131,22 +130,16 @@ export const InboxIssueMainContent: React.FC = observer((props) => { value={issue.name} /> - {isLoading ? ( - - - - ) : ( - setIsSubmitting(value)} - /> - )} + setIsSubmitting(value)} + /> {currentUser && ( = (props) => { const { workspaceSlug, projectId, issueId, value, initialValue, disabled, issueOperations, setIsSubmitting } = props; // states + const [localIssueId, setLocalIssueId] = useState(issueId); const [descriptionHTML, setDescriptionHTML] = useState(value); // store hooks const { mentionHighlights, mentionSuggestions } = useMention(); @@ -35,8 +36,14 @@ export const IssueDescriptionInput: FC = (props) => const workspaceId = getWorkspaceBySlug(workspaceSlug)?.id as string; useEffect(() => { - setDescriptionHTML(value); - }, [value]); + if (issueId !== localIssueId) { + setDescriptionHTML(undefined); + setLocalIssueId(issueId); + } else { + setDescriptionHTML(value); + } + return () => setDescriptionHTML(undefined); + }, [issueId, localIssueId, value]); useEffect(() => { if (debouncedValue && debouncedValue !== value) { diff --git a/web/components/issues/issue-detail/main-content.tsx b/web/components/issues/issue-detail/main-content.tsx index 8026ec1d74..241c96109a 100644 --- a/web/components/issues/issue-detail/main-content.tsx +++ b/web/components/issues/issue-detail/main-content.tsx @@ -28,7 +28,6 @@ export const IssueMainContent: React.FC = observer((props) => { const { workspaceSlug, projectId, issueId, issueOperations, is_editable } = props; // states const [isSubmitting, setIsSubmitting] = useState<"submitting" | "submitted" | "saved">("saved"); - const [issueDescription, setIssueDescription] = useState(undefined); // hooks const { currentUser } = useUser(); const { projectStates } = useProjectState(); @@ -53,16 +52,12 @@ export const IssueMainContent: React.FC = observer((props) => { const currentIssueState = projectStates?.find((s) => s.id === issue.state_id); - useEffect(() => { - setIssueDescription( - issue.description_html !== undefined || issue.description_html !== null - ? issue.description_html != "" - ? issue.description_html - : "

" - : undefined - ); - return () => setIssueDescription(undefined); - }, [issue.description_html]); + const issueDescription = + issue.description_html !== undefined || issue.description_html !== null + ? issue.description_html != "" + ? issue.description_html + : "

" + : undefined; return ( <> @@ -99,18 +94,16 @@ export const IssueMainContent: React.FC = observer((props) => { value={issue.name} /> - {issue?.description_html === issueDescription && ( - setIsSubmitting(value)} - /> - )} + setIsSubmitting(value)} + /> {currentUser && ( = (props) => { +export const IssueParentDetail: FC = observer((props) => { const { workspaceSlug, projectId, issueId, issue, issueOperations } = props; // hooks const { issueMap } = useIssues(); @@ -68,4 +69,4 @@ export const IssueParentDetail: FC = (props) => {
); -}; +}); diff --git a/web/store/issue/issue-details/issue.store.ts b/web/store/issue/issue-details/issue.store.ts index d7b4335d62..fe28557c7d 100644 --- a/web/store/issue/issue-details/issue.store.ts +++ b/web/store/issue/issue-details/issue.store.ts @@ -66,7 +66,6 @@ export class IssueStore implements IIssueStore { }; let issue: TIssue; - let issuePayload: TIssue; if (issueType === "ARCHIVED") issue = await this.issueArchiveService.retrieveArchivedIssue(workspaceSlug, projectId, issueId, query); @@ -76,7 +75,7 @@ export class IssueStore implements IIssueStore { if (!issue) throw new Error("Issue not found"); - issuePayload = { + const issuePayload: TIssue = { id: issue?.id, sequence_id: issue?.sequence_id, name: issue?.name, @@ -110,8 +109,10 @@ export class IssueStore implements IIssueStore { // store handlers from issue detail // parent - if (issue && issue?.parent && issue?.parent?.id) - this.rootIssueDetailStore.rootIssueStore.issues.addIssue([issue.parent]); + if (issue && issue?.parent && issue?.parent?.id) { + const parentIssue = await this.issueService.retrieve(workspaceSlug, projectId, issue?.parent?.id); + this.rootIssueDetailStore.rootIssueStore.issues.addIssue([parentIssue]); + } // assignees // labels // state @@ -184,7 +185,7 @@ export class IssueStore implements IIssueStore { }; addModulesToIssue = async (workspaceSlug: string, projectId: string, issueId: string, moduleIds: string[]) => { - const _module = await this.rootIssueDetailStore.rootIssueStore.moduleIssues.addModulesToIssue( + const currentModule = await this.rootIssueDetailStore.rootIssueStore.moduleIssues.addModulesToIssue( workspaceSlug, projectId, issueId, @@ -192,28 +193,28 @@ export class IssueStore implements IIssueStore { ); if (moduleIds && moduleIds.length > 0) await this.rootIssueDetailStore.activity.fetchActivities(workspaceSlug, projectId, issueId); - return _module; + return currentModule; }; removeModulesFromIssue = async (workspaceSlug: string, projectId: string, issueId: string, moduleIds: string[]) => { - const _module = await this.rootIssueDetailStore.rootIssueStore.moduleIssues.removeModulesFromIssue( + const currentModule = await this.rootIssueDetailStore.rootIssueStore.moduleIssues.removeModulesFromIssue( workspaceSlug, projectId, issueId, moduleIds ); await this.rootIssueDetailStore.activity.fetchActivities(workspaceSlug, projectId, issueId); - return _module; + return currentModule; }; removeIssueFromModule = async (workspaceSlug: string, projectId: string, moduleId: string, issueId: string) => { - const _module = await this.rootIssueDetailStore.rootIssueStore.moduleIssues.removeIssueFromModule( + const currentModule = await this.rootIssueDetailStore.rootIssueStore.moduleIssues.removeIssueFromModule( workspaceSlug, projectId, moduleId, issueId ); await this.rootIssueDetailStore.activity.fetchActivities(workspaceSlug, projectId, issueId); - return _module; + return currentModule; }; } From f45c2d12fd6dd3ed18e733c0a5e141fb847350cb Mon Sep 17 00:00:00 2001 From: guru_sainath Date: Wed, 10 Apr 2024 16:08:31 +0530 Subject: [PATCH 045/105] [WEB-927, WEB-928] fix: inbox issue bug fixes and improvement (#4160) * chore: inbox duplicate issue modal improvement * chore: handled tab navigation in inbox issues and handled cross project inbox issues * chore: fetch inbox issue activity once the issue is updated in inbox issue * chore: disable duplicate inbox issue actions * chore: duplicate issue mutation in the inbox issue * chore: inbox create modal sidebar tab change updated * chore: multiple date selection in the inbox issue filters * chore: code refactor * chore: removed project dependancy on the inbox store structure --------- Co-authored-by: Anmol Singh Bhatia --- .../inbox/content/issue-properties.tsx | 18 ++++----- web/components/inbox/content/issue-root.tsx | 10 ++--- web/components/inbox/content/root.tsx | 6 +-- .../inbox/inbox-filter/filters/date.tsx | 8 +--- .../inbox/modals/create-issue-modal.tsx | 5 ++- .../inbox/modals/select-duplicate.tsx | 32 ++------------- .../inbox/sidebar/inbox-list-item.tsx | 5 ++- web/components/inbox/sidebar/root.tsx | 2 +- .../issues/issue-detail/main-content.tsx | 14 +++---- web/components/issues/issue-detail/root.tsx | 6 +-- .../issues/issue-detail/sidebar.tsx | 40 +++++++++---------- web/components/issues/peek-overview/root.tsx | 4 +- .../projects/[projectId]/inbox/index.tsx | 11 +++-- web/store/inbox/inbox-issue.store.ts | 15 +++++-- web/store/inbox/project-inbox.store.ts | 28 +++++++------ 15 files changed, 96 insertions(+), 108 deletions(-) diff --git a/web/components/inbox/content/issue-properties.tsx b/web/components/inbox/content/issue-properties.tsx index e80ec9fd27..670b7b1b80 100644 --- a/web/components/inbox/content/issue-properties.tsx +++ b/web/components/inbox/content/issue-properties.tsx @@ -17,12 +17,12 @@ type Props = { projectId: string; issue: Partial; issueOperations: TIssueOperations; - is_editable: boolean; + isEditable: boolean; duplicateIssueDetails: TInboxDuplicateIssueDetails | undefined; }; export const InboxIssueProperties: React.FC = observer((props) => { - const { workspaceSlug, projectId, issue, issueOperations, is_editable, duplicateIssueDetails } = props; + const { workspaceSlug, projectId, issue, issueOperations, isEditable, duplicateIssueDetails } = props; const router = useRouter(); // store hooks @@ -35,7 +35,7 @@ export const InboxIssueProperties: React.FC = observer((props) => {
Properties
-
+
{/* State */}
@@ -50,7 +50,7 @@ export const InboxIssueProperties: React.FC = observer((props) => { issue?.id && issueOperations.update(workspaceSlug, projectId, issue?.id, { state_id: val }) } projectId={projectId?.toString() ?? ""} - disabled={!is_editable} + disabled={!isEditable} buttonVariant="transparent-with-text" className="w-3/5 flex-grow group" buttonContainerClassName="w-full text-left" @@ -71,7 +71,7 @@ export const InboxIssueProperties: React.FC = observer((props) => { onChange={(val) => issue?.id && issueOperations.update(workspaceSlug, projectId, issue?.id, { assignee_ids: val }) } - disabled={!is_editable} + disabled={!isEditable} projectId={projectId?.toString() ?? ""} placeholder="Add assignees" multiple @@ -99,7 +99,7 @@ export const InboxIssueProperties: React.FC = observer((props) => { onChange={(val) => issue?.id && issueOperations.update(workspaceSlug, projectId, issue?.id, { priority: val }) } - disabled={!is_editable} + disabled={!isEditable} buttonVariant="border-with-text" className="w-3/5 flex-grow rounded px-2 hover:bg-custom-background-80" buttonContainerClassName="w-full text-left" @@ -108,7 +108,7 @@ export const InboxIssueProperties: React.FC = observer((props) => {
-
+
{/* Due Date */}
@@ -126,7 +126,7 @@ export const InboxIssueProperties: React.FC = observer((props) => { }) } minDate={minDate ?? undefined} - disabled={!is_editable} + disabled={!isEditable} buttonVariant="transparent-with-text" className="w-3/5 flex-grow group" buttonContainerClassName="w-full text-left" @@ -147,7 +147,7 @@ export const InboxIssueProperties: React.FC = observer((props) => { workspaceSlug={workspaceSlug} projectId={projectId} issueId={issue?.id} - disabled={!is_editable} + disabled={!isEditable} isInboxIssue onLabelUpdate={(val: string[]) => issue?.id && issueOperations.update(workspaceSlug, projectId, issue?.id, { label_ids: val }) diff --git a/web/components/inbox/content/issue-root.tsx b/web/components/inbox/content/issue-root.tsx index ec56048178..7edcc26446 100644 --- a/web/components/inbox/content/issue-root.tsx +++ b/web/components/inbox/content/issue-root.tsx @@ -22,14 +22,14 @@ type Props = { workspaceSlug: string; projectId: string; inboxIssue: IInboxIssueStore; - is_editable: boolean; + isEditable: boolean; isSubmitting: "submitting" | "submitted" | "saved"; setIsSubmitting: Dispatch>; }; export const InboxIssueMainContent: React.FC = observer((props) => { const router = useRouter(); - const { workspaceSlug, projectId, inboxIssue, is_editable, isSubmitting, setIsSubmitting } = props; + const { workspaceSlug, projectId, inboxIssue, isEditable, isSubmitting, setIsSubmitting } = props; // hooks const { currentUser } = useUser(); const { setShowAlert } = useReloadConfirmations(isSubmitting === "submitting"); @@ -126,7 +126,7 @@ export const InboxIssueMainContent: React.FC = observer((props) => { isSubmitting={isSubmitting} setIsSubmitting={(value) => setIsSubmitting(value)} issueOperations={issueOperations} - disabled={!is_editable} + disabled={!isEditable} value={issue.name} /> @@ -136,7 +136,7 @@ export const InboxIssueMainContent: React.FC = observer((props) => { issueId={issue.id} value={issueDescription} initialValue={issueDescription} - disabled={!is_editable} + disabled={!isEditable} issueOperations={issueOperations} setIsSubmitting={(value) => setIsSubmitting(value)} /> @@ -156,7 +156,7 @@ export const InboxIssueMainContent: React.FC = observer((props) => { projectId={projectId} issue={issue} issueOperations={issueOperations} - is_editable={is_editable} + isEditable={isEditable} duplicateIssueDetails={inboxIssue?.duplicate_issue_detail} /> diff --git a/web/components/inbox/content/root.tsx b/web/components/inbox/content/root.tsx index c15bf0863d..9b5f94a48d 100644 --- a/web/components/inbox/content/root.tsx +++ b/web/components/inbox/content/root.tsx @@ -32,11 +32,11 @@ export const InboxContentRoot: FC = observer((props) => { { revalidateOnFocus: false } ); - const is_editable = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; + const isEditable = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; if (!inboxIssue) return <>; - const isIssueAcceptedOrDeclined = [-1, 1].includes(inboxIssue.status); + const isIssueDisabled = [-1, 1, 2].includes(inboxIssue.status); return ( <> @@ -54,7 +54,7 @@ export const InboxContentRoot: FC = observer((props) => { workspaceSlug={workspaceSlug} projectId={projectId} inboxIssue={inboxIssue} - is_editable={is_editable && !isIssueAcceptedOrDeclined} + isEditable={isEditable && !isIssueDisabled} isSubmitting={isSubmitting} setIsSubmitting={setIsSubmitting} /> diff --git a/web/components/inbox/inbox-filter/filters/date.tsx b/web/components/inbox/inbox-filter/filters/date.tsx index 50e9b71b02..aee188be8d 100644 --- a/web/components/inbox/inbox-filter/filters/date.tsx +++ b/web/components/inbox/inbox-filter/filters/date.tsx @@ -38,12 +38,6 @@ export const FilterDate: FC = observer((props) => { const handleFilterValue = (value: string): string[] => (filterValue?.includes(value) ? [] : uniq(concat(value))); - const handleCustomFilterValue = (value: string[]): string[] => { - const finalOptions: string[] = [...filterValue]; - value.forEach((v) => (finalOptions?.includes(v) ? [] : finalOptions.push(v))); - return uniq(finalOptions); - }; - const isCustomDateSelected = () => { const isValidDateSelected = filterValue?.filter((f) => isDate(f.split(";")[0])) || []; return isValidDateSelected.length > 0 ? true : false; @@ -64,7 +58,7 @@ export const FilterDate: FC = observer((props) => { setIsDateFilterModalOpen(false)} isOpen={isDateFilterModalOpen} - onSelect={(val) => handleInboxIssueFilters(filterKey, handleCustomFilterValue(val))} + onSelect={(val) => handleInboxIssueFilters(filterKey, val)} title="Created date" /> )} diff --git a/web/components/inbox/modals/create-issue-modal.tsx b/web/components/inbox/modals/create-issue-modal.tsx index 4c22f83480..9ec5cba1ef 100644 --- a/web/components/inbox/modals/create-issue-modal.tsx +++ b/web/components/inbox/modals/create-issue-modal.tsx @@ -52,7 +52,7 @@ export const CreateInboxIssueModal: React.FC = observer((props) => { const workspaceStore = useWorkspace(); const workspaceId = workspaceStore.getWorkspaceBySlug(workspaceSlug as string)?.id as string; // store hooks - const { createInboxIssue } = useProjectInbox(); + const { createInboxIssue, handleCurrentTab } = useProjectInbox(); const { config: { envConfig }, } = useApplication(); @@ -79,7 +79,8 @@ export const CreateInboxIssueModal: React.FC = observer((props) => { await createInboxIssue(workspaceSlug.toString(), projectId.toString(), formData) .then((res) => { if (!createMore) { - router.push(`/${workspaceSlug}/projects/${projectId}/inbox/?inboxIssueId=${res?.issue?.id}`); + router.push(`/${workspaceSlug}/projects/${projectId}/inbox/?currentTab=open&inboxIssueId=${res?.issue?.id}`); + handleCurrentTab("open"); handleClose(); } else { reset(defaultValues); diff --git a/web/components/inbox/modals/select-duplicate.tsx b/web/components/inbox/modals/select-duplicate.tsx index 2df720dd8b..34418bdd3f 100644 --- a/web/components/inbox/modals/select-duplicate.tsx +++ b/web/components/inbox/modals/select-duplicate.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; import { useRouter } from "next/router"; import useSWR from "swr"; import { Search } from "lucide-react"; @@ -7,7 +7,7 @@ import { Combobox, Dialog, Transition } from "@headlessui/react"; // icons // components // ui -import { Button, TOAST_TYPE, setToast } from "@plane/ui"; +import { TOAST_TYPE, setToast } from "@plane/ui"; import { EmptyState } from "@/components/empty-state"; // services // constants @@ -29,7 +29,6 @@ export const SelectDuplicateInboxIssueModal: React.FC = (props) => { const { isOpen, onClose, onSubmit, value } = props; const [query, setQuery] = useState(""); - const [selectedItem, setSelectedItem] = useState(""); const router = useRouter(); const { workspaceSlug, projectId, issueId } = router.query; @@ -48,18 +47,11 @@ export const SelectDuplicateInboxIssueModal: React.FC = (props) => { : null ); - useEffect(() => { - if (!value) { - setSelectedItem(""); - return; - } else setSelectedItem(value); - }, [value]); - const handleClose = () => { onClose(); }; - const handleSubmit = () => { + const handleSubmit = (selectedItem: string) => { if (!selectedItem || selectedItem.length === 0) return setToast({ title: "Error", @@ -99,12 +91,7 @@ export const SelectDuplicateInboxIssueModal: React.FC = (props) => { leaveTo="opacity-0 scale-95" > - { - setSelectedItem(value); - }} - > +
= (props) => { )} - - {filteredIssues.length > 0 && ( -
- - -
- )}
diff --git a/web/components/inbox/sidebar/inbox-list-item.tsx b/web/components/inbox/sidebar/inbox-list-item.tsx index 262d1e6c09..837a6992f6 100644 --- a/web/components/inbox/sidebar/inbox-list-item.tsx +++ b/web/components/inbox/sidebar/inbox-list-item.tsx @@ -9,7 +9,7 @@ import { InboxIssueStatus } from "@/components/inbox"; import { cn } from "@/helpers/common.helper"; import { renderFormattedDate } from "@/helpers/date-time.helper"; // hooks -import { useLabel } from "@/hooks/store"; +import { useLabel, useProjectInbox } from "@/hooks/store"; import { usePlatformOS } from "@/hooks/use-platform-os"; // store import { IInboxIssueStore } from "@/store/inbox/inbox-issue.store"; @@ -27,6 +27,7 @@ export const InboxIssueListItem: FC = observer((props) const router = useRouter(); const { inboxIssueId } = router.query; // store + const { currentTab } = useProjectInbox(); const { projectLabels } = useLabel(); const { isMobile } = usePlatformOS(); const issue = inboxIssue.issue; @@ -54,7 +55,7 @@ export const InboxIssueListItem: FC = observer((props) handleIssueRedirection(e, issue.id)} >
= observer((props) => { )} onClick={() => { if (currentTab != option?.key) handleCurrentTab(option?.key); - router.push(`/${workspaceSlug}/projects/${projectId}/inbox`); + router.push(`/${workspaceSlug}/projects/${projectId}/inbox?currentTab=${option?.key}`); }} >
{option?.label}
diff --git a/web/components/issues/issue-detail/main-content.tsx b/web/components/issues/issue-detail/main-content.tsx index 241c96109a..28e01fd1e3 100644 --- a/web/components/issues/issue-detail/main-content.tsx +++ b/web/components/issues/issue-detail/main-content.tsx @@ -21,11 +21,11 @@ type Props = { projectId: string; issueId: string; issueOperations: TIssueOperations; - is_editable: boolean; + isEditable: boolean; }; export const IssueMainContent: React.FC = observer((props) => { - const { workspaceSlug, projectId, issueId, issueOperations, is_editable } = props; + const { workspaceSlug, projectId, issueId, issueOperations, isEditable } = props; // states const [isSubmitting, setIsSubmitting] = useState<"submitting" | "submitted" | "saved">("saved"); // hooks @@ -90,7 +90,7 @@ export const IssueMainContent: React.FC = observer((props) => { isSubmitting={isSubmitting} setIsSubmitting={(value) => setIsSubmitting(value)} issueOperations={issueOperations} - disabled={!is_editable} + disabled={!isEditable} value={issue.name} /> @@ -100,7 +100,7 @@ export const IssueMainContent: React.FC = observer((props) => { issueId={issue.id} value={issueDescription} initialValue={issueDescription} - disabled={!is_editable} + disabled={!isEditable} issueOperations={issueOperations} setIsSubmitting={(value) => setIsSubmitting(value)} /> @@ -120,7 +120,7 @@ export const IssueMainContent: React.FC = observer((props) => { projectId={projectId} parentIssueId={issueId} currentUser={currentUser} - disabled={!is_editable} + disabled={!isEditable} /> )}
@@ -129,10 +129,10 @@ export const IssueMainContent: React.FC = observer((props) => { workspaceSlug={workspaceSlug} projectId={projectId} issueId={issueId} - disabled={!is_editable} + disabled={!isEditable} /> - + ); }); diff --git a/web/components/issues/issue-detail/root.tsx b/web/components/issues/issue-detail/root.tsx index fdd848a2da..46f5dd1452 100644 --- a/web/components/issues/issue-detail/root.tsx +++ b/web/components/issues/issue-detail/root.tsx @@ -340,7 +340,7 @@ export const IssueDetailRoot: FC = observer((props) => { // issue details const issue = getIssueById(issueId); // checking if issue is editable, based on user role - const is_editable = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; + const isEditable = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; return ( <> @@ -362,7 +362,7 @@ export const IssueDetailRoot: FC = observer((props) => { projectId={projectId} issueId={issueId} issueOperations={issueOperations} - is_editable={!is_archived && is_editable} + isEditable={!is_archived && isEditable} />
= observer((props) => { issueId={issueId} issueOperations={issueOperations} is_archived={is_archived} - is_editable={!is_archived && is_editable} + isEditable={!is_archived && isEditable} />
diff --git a/web/components/issues/issue-detail/sidebar.tsx b/web/components/issues/issue-detail/sidebar.tsx index ce5b54770e..80259dadad 100644 --- a/web/components/issues/issue-detail/sidebar.tsx +++ b/web/components/issues/issue-detail/sidebar.tsx @@ -69,11 +69,11 @@ type Props = { issueId: string; issueOperations: TIssueOperations; is_archived: boolean; - is_editable: boolean; + isEditable: boolean; }; export const IssueDetailsSidebar: React.FC = observer((props) => { - const { workspaceSlug, projectId, issueId, issueOperations, is_archived, is_editable } = props; + const { workspaceSlug, projectId, issueId, issueOperations, is_archived, isEditable } = props; // states const [deleteIssueModal, setDeleteIssueModal] = useState(false); const [archiveIssueModal, setArchiveIssueModal] = useState(false); @@ -116,7 +116,7 @@ export const IssueDetailsSidebar: React.FC = observer((props) => { const projectDetails = getProjectById(issue.project_id); const stateDetails = getStateById(issue.state_id); // auth - const isArchivingAllowed = !is_archived && issueOperations.archive && is_editable; + const isArchivingAllowed = !is_archived && issueOperations.archive && isEditable; const isInArchivableGroup = !!stateDetails && [STATE_GROUPS.completed.key, STATE_GROUPS.cancelled.key].includes(stateDetails?.group); @@ -179,7 +179,7 @@ export const IssueDetailsSidebar: React.FC = observer((props) => { )} - {is_editable && ( + {isEditable && (
@@ -440,7 +440,7 @@ export const IssueDetailsSidebar: React.FC = observer((props) => { projectId={projectId} issueId={issueId} relationKey="duplicate" - disabled={!is_editable} + disabled={!isEditable} />
@@ -454,7 +454,7 @@ export const IssueDetailsSidebar: React.FC = observer((props) => { workspaceSlug={workspaceSlug} projectId={projectId} issueId={issueId} - disabled={!is_editable} + disabled={!isEditable} />
@@ -464,7 +464,7 @@ export const IssueDetailsSidebar: React.FC = observer((props) => { workspaceSlug={workspaceSlug} projectId={projectId} issueId={issueId} - disabled={!is_editable} + disabled={!isEditable} />
diff --git a/web/components/issues/peek-overview/root.tsx b/web/components/issues/peek-overview/root.tsx index 4d85bd73cd..2ddc923a00 100644 --- a/web/components/issues/peek-overview/root.tsx +++ b/web/components/issues/peek-overview/root.tsx @@ -372,7 +372,7 @@ export const IssuePeekOverview: FC = observer((props) => { const currentProjectRole = currentWorkspaceAllProjectsRole?.[peekIssue?.projectId]; // Check if issue is editable, based on user role - const is_editable = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; + const isEditable = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; const isLoading = !issue || loader ? true : false; return ( @@ -382,7 +382,7 @@ export const IssuePeekOverview: FC = observer((props) => { issueId={peekIssue.issueId} isLoading={isLoading} is_archived={is_archived} - disabled={!is_editable} + disabled={!isEditable} issueOperations={issueOperations} /> ); diff --git a/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx b/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx index 84205776f2..89e5c10226 100644 --- a/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx +++ b/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx @@ -1,4 +1,4 @@ -import { ReactElement } from "react"; +import { ReactElement, useEffect } from "react"; import { observer } from "mobx-react"; import { useRouter } from "next/router"; // components @@ -9,7 +9,7 @@ import { InboxIssueRoot } from "@/components/inbox"; // constants import { EmptyStateType } from "@/constants/empty-state"; // hooks -import { useProject } from "@/hooks/store"; +import { useProject, useProjectInbox } from "@/hooks/store"; // layouts import { AppLayout } from "@/layouts/app-layout"; // types @@ -18,9 +18,10 @@ import { NextPageWithLayout } from "@/lib/types"; const ProjectInboxPage: NextPageWithLayout = observer(() => { /// router const router = useRouter(); - const { workspaceSlug, projectId, inboxIssueId } = router.query; + const { workspaceSlug, projectId, currentTab: navigationTab, inboxIssueId } = router.query; // hooks const { currentProjectDetails } = useProject(); + const { currentTab, handleCurrentTab } = useProjectInbox(); if (!workspaceSlug || !projectId) return <>; @@ -38,6 +39,10 @@ const ProjectInboxPage: NextPageWithLayout = observer(() => { // derived values const pageTitle = currentProjectDetails?.name ? `${currentProjectDetails?.name} - Inbox` : "Plane - Inbox"; + useEffect(() => { + if (navigationTab && currentTab != navigationTab) handleCurrentTab(navigationTab === "open" ? "open" : "closed"); + }, [currentTab, navigationTab, handleCurrentTab]); + return (
diff --git a/web/store/inbox/inbox-issue.store.ts b/web/store/inbox/inbox-issue.store.ts index 2e9a952660..c42740cc11 100644 --- a/web/store/inbox/inbox-issue.store.ts +++ b/web/store/inbox/inbox-issue.store.ts @@ -1,9 +1,10 @@ import set from "lodash/set"; import { makeObservable, observable, runInAction, action } from "mobx"; -// services -// types import { TIssue, TInboxIssue, TInboxIssueStatus, TInboxDuplicateIssueDetails } from "@plane/types"; +// services import { InboxIssueService } from "@/services/inbox"; +// root store +import { RootStore } from "@/store/root.store"; export interface IInboxIssueStore { isLoading: boolean; @@ -36,7 +37,7 @@ export class InboxIssueStore implements IInboxIssueStore { // services inboxIssueService; - constructor(workspaceSlug: string, projectId: string, data: TInboxIssue) { + constructor(workspaceSlug: string, projectId: string, data: TInboxIssue, private store: RootStore) { this.id = data.id; this.status = data.status; this.issue = data?.issue; @@ -90,10 +91,14 @@ export class InboxIssueStore implements IInboxIssueStore { if (!this.issue.id) return; set(this, "status", inboxStatus); set(this, "duplicate_to", issueId); - await this.inboxIssueService.update(this.workspaceSlug, this.projectId, this.issue.id, { + const issueResponse = await this.inboxIssueService.update(this.workspaceSlug, this.projectId, this.issue.id, { status: inboxStatus, duplicate_to: issueId, }); + runInAction(() => { + this.duplicate_to = issueResponse.duplicate_to; + this.duplicate_issue_detail = issueResponse.duplicate_issue_detail; + }); } catch { runInAction(() => { set(this, "status", previousData.status); @@ -133,6 +138,8 @@ export class InboxIssueStore implements IInboxIssueStore { set(inboxIssue, issueKey, issue[issueKey]); }); await this.inboxIssueService.updateIssue(this.workspaceSlug, this.projectId, this.issue.id, issue); + // fetching activity + await this.store.issue.issueDetail.fetchActivities(this.workspaceSlug, this.projectId, this.issue.id); } catch { Object.keys(issue).forEach((key) => { const issueKey = key as keyof TIssue; diff --git a/web/store/inbox/project-inbox.store.ts b/web/store/inbox/project-inbox.store.ts index 43a1a229a9..3ac10acd8b 100644 --- a/web/store/inbox/project-inbox.store.ts +++ b/web/store/inbox/project-inbox.store.ts @@ -29,7 +29,7 @@ export interface IProjectInboxStore { inboxFilters: Partial; inboxSorting: Partial; inboxIssuePaginationInfo: TInboxIssuePaginationInfo | undefined; - inboxIssues: Record; + inboxIssues: Record; // issue_id -> IInboxIssueStore // computed getAppliedFiltersCount: number; inboxIssuesArray: IInboxIssueStore[]; @@ -177,8 +177,6 @@ export class ProjectInboxStore implements IProjectInboxStore { set(this, "inboxFilters", undefined); set(this, ["inboxSorting", "order_by"], "issue__created_at"); set(this, ["inboxSorting", "sort_by"], "desc"); - set(this, ["inboxIssues"], {}); - set(this, ["inboxIssuePaginationInfo"], undefined); if (tab === "closed") set(this, ["inboxFilters", "status"], [-1, 1, 2]); else set(this, ["inboxFilters", "status"], [-2]); const { workspaceSlug, projectId } = this.store.app.router; @@ -187,16 +185,12 @@ export class ProjectInboxStore implements IProjectInboxStore { handleInboxIssueFilters = (key: T, value: TInboxIssueFilter[T]) => { set(this.inboxFilters, key, value); - set(this, ["inboxIssues"], {}); - set(this, ["inboxIssuePaginationInfo"], undefined); const { workspaceSlug, projectId } = this.store.app.router; if (workspaceSlug && projectId) this.fetchInboxIssues(workspaceSlug, projectId, "filter-loading"); }; handleInboxIssueSorting = (key: T, value: TInboxIssueSorting[T]) => { set(this.inboxSorting, key, value); - set(this, ["inboxIssues"], {}); - set(this, ["inboxIssuePaginationInfo"], undefined); const { workspaceSlug, projectId } = this.store.app.router; if (workspaceSlug && projectId) this.fetchInboxIssues(workspaceSlug, projectId, "filter-loading"); }; @@ -210,6 +204,8 @@ export class ProjectInboxStore implements IProjectInboxStore { try { if (loadingType) this.isLoading = loadingType; else if (Object.keys(this.inboxIssues).length === 0) this.isLoading = "init-loading"; + set(this, ["inboxIssues"], {}); + set(this, ["inboxIssuePaginationInfo"], undefined); const queryParams = this.inboxIssueQueryParams( this.inboxFilters, @@ -225,7 +221,11 @@ export class ProjectInboxStore implements IProjectInboxStore { if (results && results.length > 0) results.forEach((value: TInboxIssue) => { if (this.getIssueInboxByIssueId(value?.issue?.id) === undefined) - set(this.inboxIssues, value?.issue?.id, new InboxIssueStore(workspaceSlug, projectId, value)); + set( + this.inboxIssues, + [value?.issue?.id], + new InboxIssueStore(workspaceSlug, projectId, value, this.store) + ); }); }); } catch (error) { @@ -267,7 +267,11 @@ export class ProjectInboxStore implements IProjectInboxStore { if (results && results.length > 0) results.forEach((value: TInboxIssue) => { if (this.getIssueInboxByIssueId(value?.issue?.id) === undefined) - set(this.inboxIssues, value?.issue?.id, new InboxIssueStore(workspaceSlug, projectId, value)); + set( + this.inboxIssues, + [value?.issue?.id], + new InboxIssueStore(workspaceSlug, projectId, value, this.store) + ); }); }); } else set(this, ["inboxIssuePaginationInfo", "next_page_results"], false); @@ -302,7 +306,7 @@ export class ProjectInboxStore implements IProjectInboxStore { // fetching comments await this.store.issue.issueDetail.fetchComments(workspaceSlug, projectId, issueId); runInAction(() => { - set(this.inboxIssues, issueId, new InboxIssueStore(workspaceSlug, projectId, inboxIssue)); + set(this.inboxIssues, [issueId], new InboxIssueStore(workspaceSlug, projectId, inboxIssue, this.store)); }); this.isLoading = undefined; } @@ -325,8 +329,8 @@ export class ProjectInboxStore implements IProjectInboxStore { runInAction(() => { set( this.inboxIssues, - inboxIssueResponse?.issue?.id, - new InboxIssueStore(workspaceSlug, projectId, inboxIssueResponse) + [inboxIssueResponse?.issue?.id], + new InboxIssueStore(workspaceSlug, projectId, inboxIssueResponse, this.store) ); set( this, From 91ed27837e57a75a6e090ae0e4704bc9b61eef3a Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Wed, 10 Apr 2024 19:51:13 +0530 Subject: [PATCH 046/105] chore: kanban card padding improvement (#4162) --- web/components/issues/issue-layouts/kanban/block.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/components/issues/issue-layouts/kanban/block.tsx b/web/components/issues/issue-layouts/kanban/block.tsx index 1c7cc72299..066cd60913 100644 --- a/web/components/issues/issue-layouts/kanban/block.tsx +++ b/web/components/issues/issue-layouts/kanban/block.tsx @@ -63,16 +63,16 @@ const KanbanIssueDetailsBlock: React.FC = observer((prop {issue?.is_draft ? ( - {issue.name} + {issue.name} ) : ( - {issue.name} + {issue.name} )} Date: Wed, 10 Apr 2024 19:52:10 +0530 Subject: [PATCH 047/105] chore: issue comment mention user improvement (#4163) --- .../issue-detail/issue-activity/comments/comment-create.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/components/issues/issue-detail/issue-activity/comments/comment-create.tsx b/web/components/issues/issue-detail/issue-activity/comments/comment-create.tsx index e0a6044255..04fb1e0b42 100644 --- a/web/components/issues/issue-detail/issue-activity/comments/comment-create.tsx +++ b/web/components/issues/issue-detail/issue-activity/comments/comment-create.tsx @@ -69,7 +69,7 @@ export const IssueCommentCreate: FC = (props) => { watch("comment_html") === "" || watch("comment_html")?.trim() === "" || watch("comment_html") === "

" || - isEmptyHtmlString(watch("comment_html") ?? ""); + (isEmptyHtmlString(watch("comment_html") ?? "") && !watch("comment_html")?.includes("mention-component")); return (
Date: Wed, 10 Apr 2024 19:55:16 +0530 Subject: [PATCH 048/105] chore: optimised issue loaders and added enum for issue status and current tab (#4164) --- packages/types/src/inbox.d.ts | 19 ++++- .../inbox/content/inbox-issue-header.tsx | 13 +-- .../inbox/modals/create-issue-modal.tsx | 3 +- web/components/inbox/root.tsx | 7 +- .../inbox/sidebar/inbox-list-item.tsx | 15 +--- web/components/inbox/sidebar/inbox-list.tsx | 1 - web/components/inbox/sidebar/root.tsx | 9 +- web/constants/inbox.tsx | 11 +-- web/helpers/inbox.helper.ts | 13 +++ .../projects/[projectId]/inbox/index.tsx | 5 +- web/store/inbox/inbox-issue.store.ts | 10 ++- web/store/inbox/project-inbox.store.ts | 83 +++++++++++++++---- 12 files changed, 132 insertions(+), 57 deletions(-) diff --git a/packages/types/src/inbox.d.ts b/packages/types/src/inbox.d.ts index cab9a2f29e..68e62f7bfc 100644 --- a/packages/types/src/inbox.d.ts +++ b/packages/types/src/inbox.d.ts @@ -2,9 +2,22 @@ import { TPaginationInfo } from "./common"; import { TIssuePriorities } from "./issues"; import { TIssue } from "./issues/base"; -export type TInboxIssueCurrentTab = "open" | "closed"; - -export type TInboxIssueStatus = -2 | -1 | 0 | 1 | 2; +enum EInboxIssueCurrentTab { + OPEN = "open", + CLOSED = "closed", +} + +enum EInboxIssueStatus { + PENDING = -2, + DECLINED = -1, + SNOOZED = 0, + ACCEPTED = 1, + DUPLICATE = 2, +} + +export type TInboxIssueCurrentTab = EInboxIssueCurrentTab; + +export type TInboxIssueStatus = EInboxIssueStatus; // filters export type TInboxIssueFilterMemberKeys = "assignee" | "created_by"; diff --git a/web/components/inbox/content/inbox-issue-header.tsx b/web/components/inbox/content/inbox-issue-header.tsx index 1e0aaf16fb..9310414008 100644 --- a/web/components/inbox/content/inbox-issue-header.tsx +++ b/web/components/inbox/content/inbox-issue-header.tsx @@ -16,6 +16,7 @@ import { IssueUpdateStatus } from "@/components/issues"; // constants import { EUserProjectRoles } from "@/constants/project"; // helpers +import { EInboxIssueStatus } from "@/helpers/inbox.helper"; import { copyUrlToClipboard } from "@/helpers/string.helper"; // hooks import { useUser, useProjectInbox, useProject } from "@/hooks/store"; @@ -60,27 +61,27 @@ export const InboxIssueActionsHeader: FC = observer((p const issueLink = `${workspaceSlug}/projects/${issue?.project_id}/issues/${currentInboxIssueId}`; const handleInboxIssueAccept = async () => { - inboxIssue?.updateInboxIssueStatus(1); + await inboxIssue?.updateInboxIssueStatus(EInboxIssueStatus.ACCEPTED); setAcceptIssueModal(false); }; const handleInboxIssueDecline = async () => { - inboxIssue?.updateInboxIssueStatus(-1); + await inboxIssue?.updateInboxIssueStatus(EInboxIssueStatus.DECLINED); setDeclineIssueModal(false); }; - const handleInboxIssueDuplicate = (issueId: string) => { - inboxIssue?.updateInboxIssueDuplicateTo(issueId); + const handleInboxIssueDuplicate = async (issueId: string) => { + await inboxIssue?.updateInboxIssueDuplicateTo(issueId); }; const handleInboxSIssueSnooze = async (date: Date) => { - inboxIssue?.updateInboxIssueSnoozeTill(date); + await inboxIssue?.updateInboxIssueSnoozeTill(date); setIsSnoozeDateModalOpen(false); }; const handleInboxIssueDelete = async () => { if (!inboxIssue || !currentInboxIssueId) return; - deleteInboxIssue(workspaceSlug, projectId, currentInboxIssueId).finally(() => { + await deleteInboxIssue(workspaceSlug, projectId, currentInboxIssueId).finally(() => { router.push(`/${workspaceSlug}/projects/${projectId}/inbox`); }); }; diff --git a/web/components/inbox/modals/create-issue-modal.tsx b/web/components/inbox/modals/create-issue-modal.tsx index 9ec5cba1ef..9336613c6c 100644 --- a/web/components/inbox/modals/create-issue-modal.tsx +++ b/web/components/inbox/modals/create-issue-modal.tsx @@ -52,7 +52,7 @@ export const CreateInboxIssueModal: React.FC = observer((props) => { const workspaceStore = useWorkspace(); const workspaceId = workspaceStore.getWorkspaceBySlug(workspaceSlug as string)?.id as string; // store hooks - const { createInboxIssue, handleCurrentTab } = useProjectInbox(); + const { createInboxIssue } = useProjectInbox(); const { config: { envConfig }, } = useApplication(); @@ -80,7 +80,6 @@ export const CreateInboxIssueModal: React.FC = observer((props) => { .then((res) => { if (!createMore) { router.push(`/${workspaceSlug}/projects/${projectId}/inbox/?currentTab=open&inboxIssueId=${res?.issue?.id}`); - handleCurrentTab("open"); handleClose(); } else { reset(defaultValues); diff --git a/web/components/inbox/root.tsx b/web/components/inbox/root.tsx index 505729b2e5..29a59308db 100644 --- a/web/components/inbox/root.tsx +++ b/web/components/inbox/root.tsx @@ -25,8 +25,11 @@ export const InboxIssueRoot: FC = observer((props) => { useSWR( inboxAccessible && workspaceSlug && projectId ? `PROJECT_INBOX_ISSUES_${workspaceSlug}_${projectId}` : null, - () => { - inboxAccessible && workspaceSlug && projectId && fetchInboxIssues(workspaceSlug.toString(), projectId.toString()); + async () => { + inboxAccessible && + workspaceSlug && + projectId && + (await fetchInboxIssues(workspaceSlug.toString(), projectId.toString())); }, { revalidateOnFocus: false, revalidateIfStale: false } ); diff --git a/web/components/inbox/sidebar/inbox-list-item.tsx b/web/components/inbox/sidebar/inbox-list-item.tsx index 837a6992f6..e407f0b3c8 100644 --- a/web/components/inbox/sidebar/inbox-list-item.tsx +++ b/web/components/inbox/sidebar/inbox-list-item.tsx @@ -1,4 +1,4 @@ -import { FC, MouseEvent, useEffect } from "react"; +import { FC, MouseEvent } from "react"; import { observer } from "mobx-react"; import Link from "next/link"; import { useRouter } from "next/router"; @@ -32,19 +32,6 @@ export const InboxIssueListItem: FC = observer((props) const { isMobile } = usePlatformOS(); const issue = inboxIssue.issue; - useEffect(() => { - if (issue.id === inboxIssueId) { - setTimeout(() => { - const issueItemCard = document.getElementById(`inbox-issue-list-item-${issue.id}`); - if (issueItemCard) - issueItemCard.scrollIntoView({ - behavior: "smooth", - block: "center", - }); - }, 200); - } - }, [inboxIssueId, issue.id]); - const handleIssueRedirection = (event: MouseEvent, currentIssueId: string | undefined) => { if (inboxIssueId === currentIssueId) event.preventDefault(); }; diff --git a/web/components/inbox/sidebar/inbox-list.tsx b/web/components/inbox/sidebar/inbox-list.tsx index e6f5362474..4bde1c43e1 100644 --- a/web/components/inbox/sidebar/inbox-list.tsx +++ b/web/components/inbox/sidebar/inbox-list.tsx @@ -20,7 +20,6 @@ export const InboxIssueList: FC = observer((props) => { {inboxIssues.map((inboxIssue) => ( = observer((props) => { - {isLoading === "filter-loading" && !inboxIssuePaginationInfo?.next_page_results ? ( + {isLoading != undefined && isLoading === "filter-loading" && !inboxIssuePaginationInfo?.next_page_results ? ( ) : (
= observer((props) => { type={ getAppliedFiltersCount > 0 ? EmptyStateType.INBOX_SIDEBAR_FILTER_EMPTY_STATE - : currentTab === "open" + : currentTab === EInboxIssueCurrentTab.OPEN ? EmptyStateType.INBOX_SIDEBAR_OPEN_TAB : EmptyStateType.INBOX_SIDEBAR_CLOSED_TAB } diff --git a/web/constants/inbox.tsx b/web/constants/inbox.tsx index 6be3ad3fa3..4a88b56cf7 100644 --- a/web/constants/inbox.tsx +++ b/web/constants/inbox.tsx @@ -4,6 +4,7 @@ import { AlertTriangle, CheckCircle2, Clock, Copy, LucideIcon, XCircle } from "l import { TInboxIssueSortingOrderByKeys, TInboxIssueSortingSortByKeys, TInboxIssueStatus } from "@plane/types"; // helpers import { findHowManyDaysLeft } from "@/helpers/date-time.helper"; +import { EInboxIssueStatus } from "@/helpers/inbox.helper"; export const INBOX_STATUS: { key: string; @@ -16,7 +17,7 @@ export const INBOX_STATUS: { }[] = [ { key: "pending", - status: -2, + status: EInboxIssueStatus.PENDING, icon: AlertTriangle, title: "Pending", description: () => `Pending`, @@ -25,7 +26,7 @@ export const INBOX_STATUS: { }, { key: "declined", - status: -1, + status: EInboxIssueStatus.DECLINED, icon: XCircle, title: "Declined", description: () => `Declined`, @@ -34,7 +35,7 @@ export const INBOX_STATUS: { }, { key: "snoozed", - status: 0, + status: EInboxIssueStatus.SNOOZED, icon: Clock, title: "Snoozed", description: (snoozedTillDate: Date = new Date()) => `${findHowManyDaysLeft(snoozedTillDate)} days to go`, @@ -43,7 +44,7 @@ export const INBOX_STATUS: { }, { key: "accepted", - status: 1, + status: EInboxIssueStatus.ACCEPTED, icon: CheckCircle2, title: "Accepted", description: () => `Accepted`, @@ -52,7 +53,7 @@ export const INBOX_STATUS: { }, { key: "duplicate", - status: 2, + status: EInboxIssueStatus.DUPLICATE, icon: Copy, title: "Duplicate", description: () => `Duplicate`, diff --git a/web/helpers/inbox.helper.ts b/web/helpers/inbox.helper.ts index 9b2ac28e77..8a495cbd8d 100644 --- a/web/helpers/inbox.helper.ts +++ b/web/helpers/inbox.helper.ts @@ -1,6 +1,19 @@ import { subDays } from "date-fns"; import { renderFormattedPayloadDate } from "./date-time.helper"; +export enum EInboxIssueCurrentTab { + OPEN = "open", + CLOSED = "closed", +} + +export enum EInboxIssueStatus { + PENDING = -2, + DECLINED = -1, + SNOOZED = 0, + ACCEPTED = 1, + DUPLICATE = 2, +} + export enum EPastDurationFilters { TODAY = "today", YESTERDAY = "yesterday", diff --git a/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx b/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx index 89e5c10226..3bc636ba9c 100644 --- a/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx +++ b/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx @@ -8,6 +8,8 @@ import { ProjectInboxHeader } from "@/components/headers"; import { InboxIssueRoot } from "@/components/inbox"; // constants import { EmptyStateType } from "@/constants/empty-state"; +// helpers +import { EInboxIssueCurrentTab } from "@/helpers/inbox.helper"; // hooks import { useProject, useProjectInbox } from "@/hooks/store"; // layouts @@ -40,7 +42,8 @@ const ProjectInboxPage: NextPageWithLayout = observer(() => { const pageTitle = currentProjectDetails?.name ? `${currentProjectDetails?.name} - Inbox` : "Plane - Inbox"; useEffect(() => { - if (navigationTab && currentTab != navigationTab) handleCurrentTab(navigationTab === "open" ? "open" : "closed"); + if (navigationTab && currentTab != navigationTab) + handleCurrentTab(navigationTab === "open" ? EInboxIssueCurrentTab.OPEN : EInboxIssueCurrentTab.CLOSED); }, [currentTab, navigationTab, handleCurrentTab]); return ( diff --git a/web/store/inbox/inbox-issue.store.ts b/web/store/inbox/inbox-issue.store.ts index c42740cc11..3f8689d6b9 100644 --- a/web/store/inbox/inbox-issue.store.ts +++ b/web/store/inbox/inbox-issue.store.ts @@ -1,6 +1,8 @@ import set from "lodash/set"; import { makeObservable, observable, runInAction, action } from "mobx"; import { TIssue, TInboxIssue, TInboxIssueStatus, TInboxDuplicateIssueDetails } from "@plane/types"; +// helpers +import { EInboxIssueStatus } from "@/helpers/inbox.helper"; // services import { InboxIssueService } from "@/services/inbox"; // root store @@ -26,7 +28,7 @@ export class InboxIssueStore implements IInboxIssueStore { // observables isLoading: boolean = false; id: string; - status: TInboxIssueStatus = -2; + status: TInboxIssueStatus = EInboxIssueStatus.PENDING; issue: Partial = {}; snoozed_till: Date | undefined; duplicate_to: string | undefined; @@ -82,7 +84,8 @@ export class InboxIssueStore implements IInboxIssueStore { }; updateInboxIssueDuplicateTo = async (issueId: string) => { - const inboxStatus = 2; + const inboxStatus = EInboxIssueStatus.DUPLICATE; + const previousData: Partial = { status: this.status, duplicate_to: this.duplicate_to, @@ -108,7 +111,8 @@ export class InboxIssueStore implements IInboxIssueStore { }; updateInboxIssueSnoozeTill = async (date: Date) => { - const inboxStatus = 0; + const inboxStatus = EInboxIssueStatus.SNOOZED; + const previousData: Partial = { status: this.status, snoozed_till: this.snoozed_till, diff --git a/web/store/inbox/project-inbox.store.ts b/web/store/inbox/project-inbox.store.ts index 3ac10acd8b..e9c55489ac 100644 --- a/web/store/inbox/project-inbox.store.ts +++ b/web/store/inbox/project-inbox.store.ts @@ -1,5 +1,7 @@ import isEmpty from "lodash/isEmpty"; import omit from "lodash/omit"; +import orderBy from "lodash/orderBy"; +import reverse from "lodash/reverse"; import set from "lodash/set"; import { action, computed, makeObservable, observable, runInAction } from "mobx"; import { computedFn } from "mobx-utils"; @@ -13,19 +15,26 @@ import { TInboxIssueSortingOrderByQueryParam, } from "@plane/types"; // helpers -import { EPastDurationFilters, getCustomDates } from "@/helpers/inbox.helper"; +import { EInboxIssueCurrentTab, EInboxIssueStatus, EPastDurationFilters, getCustomDates } from "@/helpers/inbox.helper"; // services import { InboxIssueService } from "@/services/inbox"; // root store import { IInboxIssueStore, InboxIssueStore } from "@/store/inbox/inbox-issue.store"; import { RootStore } from "@/store/root.store"; -type TLoader = "init-loading" | "filter-loading" | "pagination-loading" | "issue-loading" | undefined; +type TLoader = + | "init-loading" + | "mutation-loading" + | "filter-loading" + | "pagination-loading" + | "issue-loading" + | undefined; export interface IProjectInboxStore { currentTab: TInboxIssueCurrentTab; isLoading: TLoader; error: { message: string; status: "init-error" | "pagination-error" } | undefined; + currentInboxProjectId: string; inboxFilters: Partial; inboxSorting: Partial; inboxIssuePaginationInfo: TInboxIssuePaginationInfo | undefined; @@ -35,6 +44,7 @@ export interface IProjectInboxStore { inboxIssuesArray: IInboxIssueStore[]; // helper actions getIssueInboxByIssueId: (issueId: string) => IInboxIssueStore | undefined; + inboxIssueSorting: (issues: IInboxIssueStore[]) => IInboxIssueStore[]; inboxIssueQueryParams: ( inboxFilters: Partial, inboxSorting: Partial, @@ -60,11 +70,12 @@ export class ProjectInboxStore implements IProjectInboxStore { // constants PER_PAGE_COUNT = 10; // observables - currentTab: TInboxIssueCurrentTab = "open"; - isLoading: TLoader = undefined; + currentTab: TInboxIssueCurrentTab = EInboxIssueCurrentTab.OPEN; + isLoading: TLoader = "init-loading"; error: { message: string; status: "init-error" | "pagination-error" } | undefined = undefined; + currentInboxProjectId: string = ""; inboxFilters: Partial = { - status: [-2], + status: [EInboxIssueStatus.PENDING], }; inboxSorting: Partial = { order_by: "issue__created_at", @@ -79,6 +90,8 @@ export class ProjectInboxStore implements IProjectInboxStore { makeObservable(this, { currentTab: observable.ref, isLoading: observable.ref, + error: observable, + currentInboxProjectId: observable.ref, inboxFilters: observable, inboxSorting: observable, inboxIssuePaginationInfo: observable, @@ -111,13 +124,40 @@ export class ProjectInboxStore implements IProjectInboxStore { } get inboxIssuesArray() { - return Object.values(this.inboxIssues || {}).filter((inbox) => - (this.currentTab === "open" ? [-2, 0] : [-1, 1, 2]).includes(inbox.status) + return this.inboxIssueSorting( + Object.values(this.inboxIssues || {}).filter((inbox) => + (this.currentTab === EInboxIssueCurrentTab.OPEN + ? [EInboxIssueStatus.PENDING, EInboxIssueStatus.SNOOZED] + : [EInboxIssueStatus.ACCEPTED, EInboxIssueStatus.DECLINED, EInboxIssueStatus.DUPLICATE] + ).includes(inbox.status) + ) ); } getIssueInboxByIssueId = computedFn((issueId: string) => this.inboxIssues?.[issueId] || undefined); + // helpers + inboxIssueSorting = (issues: IInboxIssueStore[]) => { + console.log("issues", issues); + let inboxIssues: IInboxIssueStore[] = []; + if (this.inboxSorting?.order_by && this.inboxSorting?.sort_by) { + switch (this.inboxSorting.order_by) { + case "issue__created_at": + if (this.inboxSorting.sort_by === "desc") inboxIssues = orderBy(issues, ["issue", "created_at"]); + else inboxIssues = reverse(orderBy(issues, ["issue", "created_at"])); + case "issue__updated_at": + if (this.inboxSorting.sort_by === "desc") inboxIssues = orderBy(issues, ["issue", "updated_at"]); + else inboxIssues = reverse(orderBy(issues, ["issue", "updated_at"])); + case "issue__sequence_id": + if (this.inboxSorting.sort_by === "desc") inboxIssues = orderBy(issues, ["issue", "sequence_id"]); + else inboxIssues = reverse(orderBy(issues, ["issue", "sequence_id"])); + default: + inboxIssues = orderBy(issues, ["issue", "created_at"]); + } + } + return inboxIssues; + }; + inboxIssueQueryParams = ( inboxFilters: Partial, inboxSorting: Partial, @@ -177,6 +217,8 @@ export class ProjectInboxStore implements IProjectInboxStore { set(this, "inboxFilters", undefined); set(this, ["inboxSorting", "order_by"], "issue__created_at"); set(this, ["inboxSorting", "sort_by"], "desc"); + set(this, ["inboxIssues"], {}); + set(this, ["inboxIssuePaginationInfo"], undefined); if (tab === "closed") set(this, ["inboxFilters", "status"], [-1, 1, 2]); else set(this, ["inboxFilters", "status"], [-2]); const { workspaceSlug, projectId } = this.store.app.router; @@ -185,12 +227,16 @@ export class ProjectInboxStore implements IProjectInboxStore { handleInboxIssueFilters = (key: T, value: TInboxIssueFilter[T]) => { set(this.inboxFilters, key, value); + set(this, ["inboxIssues"], {}); + set(this, ["inboxIssuePaginationInfo"], undefined); const { workspaceSlug, projectId } = this.store.app.router; if (workspaceSlug && projectId) this.fetchInboxIssues(workspaceSlug, projectId, "filter-loading"); }; handleInboxIssueSorting = (key: T, value: TInboxIssueSorting[T]) => { set(this.inboxSorting, key, value); + set(this, ["inboxIssues"], {}); + set(this, ["inboxIssuePaginationInfo"], undefined); const { workspaceSlug, projectId } = this.store.app.router; if (workspaceSlug && projectId) this.fetchInboxIssues(workspaceSlug, projectId, "filter-loading"); }; @@ -202,10 +248,14 @@ export class ProjectInboxStore implements IProjectInboxStore { */ fetchInboxIssues = async (workspaceSlug: string, projectId: string, loadingType: TLoader = undefined) => { try { + if (this.currentInboxProjectId != projectId) { + set(this, ["currentInboxProjectId"], projectId); + set(this, ["inboxIssues"], {}); + set(this, ["inboxIssuePaginationInfo"], undefined); + } + if (Object.keys(this.inboxIssues).length === 0) this.isLoading = "init-loading"; + else this.isLoading = "mutation-loading"; if (loadingType) this.isLoading = loadingType; - else if (Object.keys(this.inboxIssues).length === 0) this.isLoading = "init-loading"; - set(this, ["inboxIssues"], {}); - set(this, ["inboxIssuePaginationInfo"], undefined); const queryParams = this.inboxIssueQueryParams( this.inboxFilters, @@ -247,9 +297,10 @@ export class ProjectInboxStore implements IProjectInboxStore { fetchInboxPaginationIssues = async (workspaceSlug: string, projectId: string) => { try { if ( - !this.inboxIssuePaginationInfo?.total_results || - (this.inboxIssuePaginationInfo?.total_results && - this.inboxIssuesArray.length < this.inboxIssuePaginationInfo?.total_results) + this.inboxIssuePaginationInfo && + (!this.inboxIssuePaginationInfo?.total_results || + (this.inboxIssuePaginationInfo?.total_results && + this.inboxIssuesArray.length < this.inboxIssuePaginationInfo?.total_results)) ) { this.isLoading = "pagination-loading"; @@ -299,15 +350,15 @@ export class ProjectInboxStore implements IProjectInboxStore { const issueId = inboxIssue?.issue?.id || undefined; if (inboxIssue && issueId) { + runInAction(() => { + set(this.inboxIssues, [issueId], new InboxIssueStore(workspaceSlug, projectId, inboxIssue, this.store)); + }); // fetching reactions await this.store.issue.issueDetail.fetchReactions(workspaceSlug, projectId, issueId); // fetching activity await this.store.issue.issueDetail.fetchActivities(workspaceSlug, projectId, issueId); // fetching comments await this.store.issue.issueDetail.fetchComments(workspaceSlug, projectId, issueId); - runInAction(() => { - set(this.inboxIssues, [issueId], new InboxIssueStore(workspaceSlug, projectId, inboxIssue, this.store)); - }); this.isLoading = undefined; } } catch { From 43534dcaed311ff4ccebeed3b12571603b51be93 Mon Sep 17 00:00:00 2001 From: Nico Franke Date: Wed, 10 Apr 2024 16:31:22 +0200 Subject: [PATCH 049/105] fix: email ssl setting not getting saved (#4161) --- .../plane/license/management/commands/configure_instance.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apiserver/plane/license/management/commands/configure_instance.py b/apiserver/plane/license/management/commands/configure_instance.py index 9365f07c54..1bb1031138 100644 --- a/apiserver/plane/license/management/commands/configure_instance.py +++ b/apiserver/plane/license/management/commands/configure_instance.py @@ -88,6 +88,12 @@ def handle(self, *args, **options): "category": "SMTP", "is_encrypted": False, }, + { + "key": "EMAIL_USE_SSL", + "value": os.environ.get("EMAIL_USE_SSL", "0"), + "category": "SMTP", + "is_encrypted": False, + }, { "key": "OPENAI_API_KEY", "value": os.environ.get("OPENAI_API_KEY"), From 4f15c03f911d73fe41ca8451f0f444f1df2115ca Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Wed, 10 Apr 2024 21:27:22 +0530 Subject: [PATCH 050/105] fix: api token expiry time (#4165) --- web/components/api-token/modal/form.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web/components/api-token/modal/form.tsx b/web/components/api-token/modal/form.tsx index b2b3f64dcb..93a92c9ef7 100644 --- a/web/components/api-token/modal/form.tsx +++ b/web/components/api-token/modal/form.tsx @@ -95,7 +95,7 @@ export const CreateApiTokenForm: React.FC = (props) => { else { const expiryDate = getExpiryDate(data.expired_at ?? ""); - if (expiryDate) payload.expired_at = renderFormattedPayloadDate(expiryDate); + if (expiryDate) payload.expired_at = renderFormattedPayloadDate(new Date(expiryDate)); } await onSubmit(payload).then(() => { @@ -170,8 +170,8 @@ export const CreateApiTokenForm: React.FC = (props) => { {value === "custom" ? "Custom date" : selectedOption - ? selectedOption.label - : "Set expiration date"} + ? selectedOption.label + : "Set expiration date"}
} value={value} @@ -207,8 +207,8 @@ export const CreateApiTokenForm: React.FC = (props) => { ? `Expires ${renderFormattedDate(customDate)}` : null : watch("expired_at") - ? `Expires ${getExpiryDate(watch("expired_at") ?? "")}` - : null} + ? `Expires ${getExpiryDate(watch("expired_at") ?? "")}` + : null} )}
From 5c6170507ede43e6974d275d50783092e98b00c3 Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Date: Wed, 10 Apr 2024 21:28:06 +0530 Subject: [PATCH 051/105] fix: drag handle position in the peek overview (#4167) --- web/components/issues/peek-overview/view.tsx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/web/components/issues/peek-overview/view.tsx b/web/components/issues/peek-overview/view.tsx index d5b723f662..37f92134d7 100644 --- a/web/components/issues/peek-overview/view.tsx +++ b/web/components/issues/peek-overview/view.tsx @@ -13,6 +13,8 @@ import { ArchiveIssueModal, PeekOverviewIssueAttachments, } from "@/components/issues"; +// helpers +import { cn } from "@/helpers/common.helper"; // hooks import { useIssueDetail, useUser } from "@/hooks/store"; import useKeypress from "@/hooks/use-keypress"; @@ -110,11 +112,14 @@ export const IssueView: FC = observer((props) => { {issueId && (
Date: Wed, 10 Apr 2024 21:28:48 +0530 Subject: [PATCH 052/105] [WEB-937] fix: inbox issue hook render issue and code refactor (#4168) * fix: inbox issue hook render issue and code refactor * fix: inbox issue hook render issue and code refactor --- .../[workspaceSlug]/projects/[projectId]/inbox/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx b/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx index 3bc636ba9c..350f51f336 100644 --- a/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx +++ b/web/pages/[workspaceSlug]/projects/[projectId]/inbox/index.tsx @@ -25,8 +25,6 @@ const ProjectInboxPage: NextPageWithLayout = observer(() => { const { currentProjectDetails } = useProject(); const { currentTab, handleCurrentTab } = useProjectInbox(); - if (!workspaceSlug || !projectId) return <>; - // No access to inbox if (currentProjectDetails?.inbox_view === false) return ( @@ -46,6 +44,8 @@ const ProjectInboxPage: NextPageWithLayout = observer(() => { handleCurrentTab(navigationTab === "open" ? EInboxIssueCurrentTab.OPEN : EInboxIssueCurrentTab.CLOSED); }, [currentTab, navigationTab, handleCurrentTab]); + if (!workspaceSlug || !projectId) return <>; + return (
From 9e3fedd0dfd16d3038603b9fecfa65e576212878 Mon Sep 17 00:00:00 2001 From: guru_sainath Date: Wed, 10 Apr 2024 21:29:21 +0530 Subject: [PATCH 053/105] chore: Handled inbox issue sorting locally in inbox store (#4169) --- web/store/inbox/project-inbox.store.ts | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/web/store/inbox/project-inbox.store.ts b/web/store/inbox/project-inbox.store.ts index e9c55489ac..289187cc9c 100644 --- a/web/store/inbox/project-inbox.store.ts +++ b/web/store/inbox/project-inbox.store.ts @@ -1,7 +1,6 @@ import isEmpty from "lodash/isEmpty"; import omit from "lodash/omit"; import orderBy from "lodash/orderBy"; -import reverse from "lodash/reverse"; import set from "lodash/set"; import { action, computed, makeObservable, observable, runInAction } from "mobx"; import { computedFn } from "mobx-utils"; @@ -138,21 +137,21 @@ export class ProjectInboxStore implements IProjectInboxStore { // helpers inboxIssueSorting = (issues: IInboxIssueStore[]) => { - console.log("issues", issues); - let inboxIssues: IInboxIssueStore[] = []; + let inboxIssues: IInboxIssueStore[] = issues; + inboxIssues = orderBy(inboxIssues, "issue.sequence_id", "desc"); if (this.inboxSorting?.order_by && this.inboxSorting?.sort_by) { switch (this.inboxSorting.order_by) { case "issue__created_at": - if (this.inboxSorting.sort_by === "desc") inboxIssues = orderBy(issues, ["issue", "created_at"]); - else inboxIssues = reverse(orderBy(issues, ["issue", "created_at"])); + if (this.inboxSorting.sort_by === "desc") inboxIssues = orderBy(inboxIssues, "issue.created_at", "desc"); + else inboxIssues = orderBy(inboxIssues, "issue.created_at", "asc"); case "issue__updated_at": - if (this.inboxSorting.sort_by === "desc") inboxIssues = orderBy(issues, ["issue", "updated_at"]); - else inboxIssues = reverse(orderBy(issues, ["issue", "updated_at"])); + if (this.inboxSorting.sort_by === "desc") inboxIssues = orderBy(inboxIssues, "issue.updated_at", "desc"); + else inboxIssues = orderBy(inboxIssues, "issue.updated_at", "asc"); case "issue__sequence_id": - if (this.inboxSorting.sort_by === "desc") inboxIssues = orderBy(issues, ["issue", "sequence_id"]); - else inboxIssues = reverse(orderBy(issues, ["issue", "sequence_id"])); + if (this.inboxSorting.sort_by === "desc") inboxIssues = orderBy(inboxIssues, "issue.sequence_id", "desc"); + else inboxIssues = orderBy(inboxIssues, "issue.sequence_id", "asc"); default: - inboxIssues = orderBy(issues, ["issue", "created_at"]); + inboxIssues = inboxIssues; } } return inboxIssues; From cd395fa3d22a2dd9260ea831c693e87084caff4e Mon Sep 17 00:00:00 2001 From: rahulramesha <71900764+rahulramesha@users.noreply.github.com> Date: Thu, 11 Apr 2024 20:21:03 +0530 Subject: [PATCH 054/105] [WEB-905] fix: make entire Kanban issue block clickable (#4175) * make entire block clickable * left align title tooltip on kanban block * fix minor issue with kanban issue title * disable click inside the quick actions --- .../issues/issue-layouts/kanban/block.tsx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/web/components/issues/issue-layouts/kanban/block.tsx b/web/components/issues/issue-layouts/kanban/block.tsx index 066cd60913..e437f1241b 100644 --- a/web/components/issues/issue-layouts/kanban/block.tsx +++ b/web/components/issues/issue-layouts/kanban/block.tsx @@ -53,11 +53,16 @@ const KanbanIssueDetailsBlock: React.FC = observer((prop return ( <> -
+
{getProjectIdentifierById(issue.project_id)}-{issue.sequence_id}
-
{quickActions(issue)}
+
+ {quickActions(issue)} +
@@ -66,9 +71,11 @@ const KanbanIssueDetailsBlock: React.FC = observer((prop {issue.name} ) : ( - - {issue.name} - +
+ + {issue.name} + +
)} Date: Thu, 11 Apr 2024 20:26:23 +0530 Subject: [PATCH 055/105] [WEB-943] chore: inbox cancelled issue header action improvement (#4172) * chore: inbox cancelled issue header action improvement * chore: code refactor --- web/components/inbox/content/inbox-issue-header.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/components/inbox/content/inbox-issue-header.tsx b/web/components/inbox/content/inbox-issue-header.tsx index 9310414008..f494c2b76c 100644 --- a/web/components/inbox/content/inbox-issue-header.tsx +++ b/web/components/inbox/content/inbox-issue-header.tsx @@ -54,7 +54,7 @@ export const InboxIssueActionsHeader: FC = observer((p const canMarkAsAccepted = isAllowed && (inboxIssue?.status === 0 || inboxIssue?.status === -2); const canMarkAsDeclined = isAllowed && inboxIssue?.status === -2; const canDelete = isAllowed || inboxIssue?.created_by === currentUser?.id; - const isCompleted = inboxIssue?.status === 1; + const isAcceptedOrDeclined = inboxIssue?.status ? [-1, 1].includes(inboxIssue.status) : undefined; const currentInboxIssueId = inboxIssue?.issue?.id; @@ -220,7 +220,7 @@ export const InboxIssueActionsHeader: FC = observer((p
)} - {isCompleted ? ( + {isAcceptedOrDeclined ? (
+ +
+        
+      
+ + ); +}; diff --git a/packages/editor/core/src/ui/extensions/code/index.tsx b/packages/editor/core/src/ui/extensions/code/index.tsx index 64a1740cb2..d2851d3025 100644 --- a/packages/editor/core/src/ui/extensions/code/index.tsx +++ b/packages/editor/core/src/ui/extensions/code/index.tsx @@ -7,8 +7,14 @@ const lowlight = createLowlight(common); lowlight.register("ts", ts); import { Selection } from "@tiptap/pm/state"; +import { ReactNodeViewRenderer } from "@tiptap/react"; +import { CodeBlockComponent } from "./code-block-node-view"; export const CustomCodeBlockExtension = CodeBlockLowlight.extend({ + addNodeView() { + return ReactNodeViewRenderer(CodeBlockComponent); + }, + addKeyboardShortcuts() { return { Tab: ({ editor }) => { diff --git a/packages/editor/core/src/ui/extensions/custom-code-inline/inline-code-plugin.ts b/packages/editor/core/src/ui/extensions/custom-code-inline/inline-code-plugin.ts new file mode 100644 index 0000000000..3b3cfaab1e --- /dev/null +++ b/packages/editor/core/src/ui/extensions/custom-code-inline/inline-code-plugin.ts @@ -0,0 +1,9 @@ +import { Extension } from "@tiptap/core"; +import codemark from "prosemirror-codemark"; + +export const CustomCodeMarkPlugin = Extension.create({ + name: "codemarkPlugin", + addProseMirrorPlugins() { + return codemark({ markType: this.editor.schema.marks.code }); + }, +}); diff --git a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers.ts b/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers.ts new file mode 100644 index 0000000000..330ebbc12c --- /dev/null +++ b/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers.ts @@ -0,0 +1,363 @@ +import { EditorState } from "@tiptap/pm/state"; +import { Editor, getNodeType, getNodeAtPosition, isAtEndOfNode, isAtStartOfNode, isNodeActive } from "@tiptap/core"; +import { Node, NodeType } from "@tiptap/pm/model"; + +const findListItemPos = (typeOrName: string | NodeType, state: EditorState) => { + const { $from } = state.selection; + const nodeType = getNodeType(typeOrName, state.schema); + + let currentNode = null; + let currentDepth = $from.depth; + let currentPos = $from.pos; + let targetDepth: number | null = null; + + while (currentDepth > 0 && targetDepth === null) { + currentNode = $from.node(currentDepth); + + if (currentNode.type === nodeType) { + targetDepth = currentDepth; + } else { + currentDepth -= 1; + currentPos -= 1; + } + } + + if (targetDepth === null) { + return null; + } + + return { $pos: state.doc.resolve(currentPos), depth: targetDepth }; +}; + +const nextListIsDeeper = (typeOrName: string, state: EditorState) => { + const listDepth = getNextListDepth(typeOrName, state); + const listItemPos = findListItemPos(typeOrName, state); + + if (!listItemPos || !listDepth) { + return false; + } + + if (listDepth > listItemPos.depth) { + return true; + } + + return false; +}; + +const getNextListDepth = (typeOrName: string, state: EditorState) => { + const listItemPos = findListItemPos(typeOrName, state); + + if (!listItemPos) { + return false; + } + + const [, depth] = getNodeAtPosition(state, typeOrName, listItemPos.$pos.pos + 4); + + return depth; +}; + +const getPrevListDepth = (typeOrName: string, state: EditorState) => { + const listItemPos = findListItemPos(typeOrName, state); + + if (!listItemPos) { + return false; + } + + let depth = 0; + const pos = listItemPos.$pos; + + // Adjust the position to ensure we're within the list item, especially for edge cases + const resolvedPos = state.doc.resolve(Math.max(pos.pos - 1, 0)); + + // Traverse up the document structure from the adjusted position + for (let d = resolvedPos.depth; d > 0; d--) { + const node = resolvedPos.node(d); + if (node.type.name === "bulletList" || node.type.name === "orderedList") { + // Increment depth for each list ancestor found + depth++; + } + } + + // Subtract 1 from the calculated depth to get the parent list's depth + // This adjustment is necessary because the depth calculation includes the current list + // By subtracting 1, we aim to get the depth of the parent list, which helps in identifying if the current list is a sublist + depth = depth > 0 ? depth - 1 : 0; + + // Double the depth value to get results as 2, 4, 6, 8, etc. + depth = depth * 2; + + return depth; +}; + +export const handleBackspace = (editor: Editor, name: string, parentListTypes: string[]) => { + // this is required to still handle the undo handling + if (editor.commands.undoInputRule()) { + return true; + } + // Check if a node range is selected, and if so, fall back to default backspace functionality + const { from, to } = editor.state.selection; + if (from !== to) { + // A range is selected, not just a cursor position; fall back to default behavior + return false; // Let the editor handle backspace by default + } + + // if the current item is NOT inside a list item & + // the previous item is a list (orderedList or bulletList) + // move the cursor into the list and delete the current item + if (!isNodeActive(editor.state, name) && hasListBefore(editor.state, name, parentListTypes)) { + const { $anchor } = editor.state.selection; + + const $listPos = editor.state.doc.resolve($anchor.before() - 1); + + const listDescendants: Array<{ node: Node; pos: number }> = []; + + $listPos.node().descendants((node, pos) => { + if (node.type.name === name) { + listDescendants.push({ node, pos }); + } + }); + + const lastItem = listDescendants.at(-1); + + if (!lastItem) { + return false; + } + + const $lastItemPos = editor.state.doc.resolve($listPos.start() + lastItem.pos + 1); + + // Check if positions are within the valid range + const startPos = $anchor.start() - 1; + const endPos = $anchor.end() + 1; + if (startPos < 0 || endPos > editor.state.doc.content.size) { + return false; // Invalid position, abort operation + } + + return editor.chain().cut({ from: startPos, to: endPos }, $lastItemPos.end()).joinForward().run(); + } + + // if the cursor is not inside the current node type + // do nothing and proceed + if (!isNodeActive(editor.state, name)) { + return false; + } + + // if the cursor is not at the start of a node + // do nothing and proceed + if (!isAtStartOfNode(editor.state)) { + return false; + } + const isParaSibling = isCurrentParagraphASibling(editor.state); + const isCurrentListItemSublist = prevListIsHigher(name, editor.state); + const listItemPos = findListItemPos(name, editor.state); + const nextListItemIsSibling = nextListIsSibling(name, editor.state); + + if (!listItemPos) { + return false; + } + + const currentNode = listItemPos.$pos.node(listItemPos.depth); + const currentListItemHasSubList = listItemHasSubList(name, editor.state, currentNode); + + if (currentListItemHasSubList && isCurrentListItemSublist && isParaSibling) { + return false; + } + + if (currentListItemHasSubList && isCurrentListItemSublist) { + editor.chain().liftListItem(name).run(); + return editor.commands.joinItemBackward(); + } + + if (isCurrentListItemSublist && nextListItemIsSibling) { + return false; + } + + if (isCurrentListItemSublist) { + return false; + } + + if (currentListItemHasSubList) { + return false; + } + + if (hasListItemBefore(name, editor.state)) { + return editor.chain().liftListItem(name).run(); + } + + if (!currentListItemHasSubList) { + return false; + } + + // otherwise in the end, a backspace should + // always just lift the list item if + // joining / merging is not possible + return editor.chain().liftListItem(name).run(); +}; + +export const handleDelete = (editor: Editor, name: string) => { + // if the cursor is not inside the current node type + // do nothing and proceed + if (!isNodeActive(editor.state, name)) { + return false; + } + + // if the cursor is not at the end of a node + // do nothing and proceed + if (!isAtEndOfNode(editor.state, name)) { + return false; + } + + // check if the next node is a list with a deeper depth + if (nextListIsDeeper(name, editor.state)) { + return editor + .chain() + .focus(editor.state.selection.from + 4) + .lift(name) + .joinBackward() + .run(); + } + + if (nextListIsHigher(name, editor.state)) { + return editor.chain().joinForward().joinBackward().run(); + } + + return editor.commands.joinItemForward(); +}; + +const hasListBefore = (editorState: EditorState, name: string, parentListTypes: string[]) => { + const { $anchor } = editorState.selection; + + const previousNodePos = Math.max(0, $anchor.pos - 2); + + const previousNode = editorState.doc.resolve(previousNodePos).node(); + + if (!previousNode || !parentListTypes.includes(previousNode.type.name)) { + return false; + } + + return true; +}; + +const prevListIsHigher = (typeOrName: string, state: EditorState) => { + const listDepth = getPrevListDepth(typeOrName, state); + const listItemPos = findListItemPos(typeOrName, state); + + if (!listItemPos || !listDepth) { + return false; + } + + if (listDepth < listItemPos.depth) { + return true; + } + + return false; +}; + +const nextListIsSibling = (typeOrName: string, state: EditorState) => { + const listDepth = getNextListDepth(typeOrName, state); + const listItemPos = findListItemPos(typeOrName, state); + + if (!listItemPos || !listDepth) { + return false; + } + + if (listDepth === listItemPos.depth) { + return true; + } + + return false; +}; + +export const nextListIsHigher = (typeOrName: string, state: EditorState) => { + const listDepth = getNextListDepth(typeOrName, state); + const listItemPos = findListItemPos(typeOrName, state); + + if (!listItemPos || !listDepth) { + return false; + } + + if (listDepth < listItemPos.depth) { + return true; + } + + return false; +}; + +const listItemHasSubList = (typeOrName: string, state: EditorState, node?: Node) => { + if (!node) { + return false; + } + + const nodeType = getNodeType(typeOrName, state.schema); + + let hasSubList = false; + + node.descendants((child) => { + if (child.type === nodeType) { + hasSubList = true; + } + }); + + return hasSubList; +}; + +const isCurrentParagraphASibling = (state: EditorState): boolean => { + const { $from } = state.selection; + const listItemNode = $from.node(-1); // Get the parent node of the current selection, assuming it's a list item. + const currentParagraphNode = $from.parent; // Get the current node where the selection is. + + // Ensure we're in a paragraph and the parent is a list item. + if (currentParagraphNode.type.name === "paragraph" && listItemNode.type.name === "listItem") { + let paragraphNodesCount = 0; + listItemNode.forEach((child) => { + if (child.type.name === "paragraph") { + paragraphNodesCount++; + } + }); + + // If there are more than one paragraph nodes, the current paragraph is a sibling. + return paragraphNodesCount > 1; + } + + return false; +}; + +export function isCursorInSubList(editor: Editor) { + const { selection } = editor.state; + const { $from } = selection; + + // Check if the current node is a list item + const listItem = editor.schema.nodes.listItem; + + // Traverse up the document tree from the current position + for (let depth = $from.depth; depth > 0; depth--) { + const node = $from.node(depth); + if (node.type === listItem) { + // If the parent of the list item is also a list, it's a sub-list + const parent = $from.node(depth - 1); + if ( + parent && + (parent.type === editor.schema.nodes.bulletList || parent.type === editor.schema.nodes.orderedList) + ) { + return true; + } + } + } + + return false; +} + +const hasListItemBefore = (typeOrName: string, state: EditorState): boolean => { + const { $anchor } = state.selection; + + const $targetPos = state.doc.resolve($anchor.pos - 2); + + if ($targetPos.index() === 0) { + return false; + } + + if ($targetPos.nodeBefore?.type.name !== typeOrName) { + return false; + } + + return true; +}; diff --git a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/find-list-item-pos.ts b/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/find-list-item-pos.ts deleted file mode 100644 index 3bbfd9c937..0000000000 --- a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/find-list-item-pos.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { getNodeType } from "@tiptap/core"; -import { NodeType } from "@tiptap/pm/model"; -import { EditorState } from "@tiptap/pm/state"; - -export const findListItemPos = (typeOrName: string | NodeType, state: EditorState) => { - const { $from } = state.selection; - const nodeType = getNodeType(typeOrName, state.schema); - - let currentNode = null; - let currentDepth = $from.depth; - let currentPos = $from.pos; - let targetDepth: number | null = null; - - while (currentDepth > 0 && targetDepth === null) { - currentNode = $from.node(currentDepth); - - if (currentNode.type === nodeType) { - targetDepth = currentDepth; - } else { - currentDepth -= 1; - currentPos -= 1; - } - } - - if (targetDepth === null) { - return null; - } - - return { $pos: state.doc.resolve(currentPos), depth: targetDepth }; -}; diff --git a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/get-next-list-depth.ts b/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/get-next-list-depth.ts deleted file mode 100644 index 2e4f5fbaa5..0000000000 --- a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/get-next-list-depth.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { getNodeAtPosition } from "@tiptap/core"; -import { EditorState } from "@tiptap/pm/state"; - -import { findListItemPos } from "src/ui/extensions/custom-list-keymap/list-helpers/find-list-item-pos"; - -export const getNextListDepth = (typeOrName: string, state: EditorState) => { - const listItemPos = findListItemPos(typeOrName, state); - - if (!listItemPos) { - return false; - } - - const [, depth] = getNodeAtPosition(state, typeOrName, listItemPos.$pos.pos + 4); - - return depth; -}; diff --git a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/handle-backspace.ts b/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/handle-backspace.ts deleted file mode 100644 index a4f2d5db94..0000000000 --- a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/handle-backspace.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Editor, isAtStartOfNode, isNodeActive } from "@tiptap/core"; -import { Node } from "@tiptap/pm/model"; - -import { findListItemPos } from "src/ui/extensions/custom-list-keymap/list-helpers/find-list-item-pos"; -import { hasListBefore } from "src/ui/extensions/custom-list-keymap/list-helpers/has-list-before"; - -export const handleBackspace = (editor: Editor, name: string, parentListTypes: string[]) => { - // this is required to still handle the undo handling - if (editor.commands.undoInputRule()) { - return true; - } - - // if the cursor is not at the start of a node - // do nothing and proceed - if (!isAtStartOfNode(editor.state)) { - return false; - } - - // if the current item is NOT inside a list item & - // the previous item is a list (orderedList or bulletList) - // move the cursor into the list and delete the current item - if (!isNodeActive(editor.state, name) && hasListBefore(editor.state, name, parentListTypes)) { - const { $anchor } = editor.state.selection; - - const $listPos = editor.state.doc.resolve($anchor.before() - 1); - - const listDescendants: Array<{ node: Node; pos: number }> = []; - - $listPos.node().descendants((node, pos) => { - if (node.type.name === name) { - listDescendants.push({ node, pos }); - } - }); - - const lastItem = listDescendants.at(-1); - - if (!lastItem) { - return false; - } - - const $lastItemPos = editor.state.doc.resolve($listPos.start() + lastItem.pos + 1); - - return editor - .chain() - .cut({ from: $anchor.start() - 1, to: $anchor.end() + 1 }, $lastItemPos.end()) - .joinForward() - .run(); - } - - // if the cursor is not inside the current node type - // do nothing and proceed - if (!isNodeActive(editor.state, name)) { - return false; - } - - const listItemPos = findListItemPos(name, editor.state); - - if (!listItemPos) { - return false; - } - - // if current node is a list item and cursor it at start of a list node, - // simply lift the list item i.e. remove it as a list item (task/bullet/ordered) - // irrespective of above node being a list or not - return editor.chain().liftListItem(name).run(); -}; diff --git a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/handle-delete.ts b/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/handle-delete.ts deleted file mode 100644 index 9179e0f201..0000000000 --- a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/handle-delete.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Editor, isAtEndOfNode, isNodeActive } from "@tiptap/core"; - -import { nextListIsDeeper } from "src/ui/extensions/custom-list-keymap/list-helpers/next-list-is-deeper"; -import { nextListIsHigher } from "src/ui/extensions/custom-list-keymap/list-helpers/next-list-is-higher"; - -export const handleDelete = (editor: Editor, name: string) => { - // if the cursor is not inside the current node type - // do nothing and proceed - if (!isNodeActive(editor.state, name)) { - return false; - } - - // if the cursor is not at the end of a node - // do nothing and proceed - if (!isAtEndOfNode(editor.state, name)) { - return false; - } - - // check if the next node is a list with a deeper depth - if (nextListIsDeeper(name, editor.state)) { - return editor - .chain() - .focus(editor.state.selection.from + 4) - .lift(name) - .joinBackward() - .run(); - } - - if (nextListIsHigher(name, editor.state)) { - return editor.chain().joinForward().joinBackward().run(); - } - - return editor.commands.joinItemForward(); -}; diff --git a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/has-list-before.ts b/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/has-list-before.ts deleted file mode 100644 index fb6b95b6a7..0000000000 --- a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/has-list-before.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { EditorState } from "@tiptap/pm/state"; - -export const hasListBefore = (editorState: EditorState, name: string, parentListTypes: string[]) => { - const { $anchor } = editorState.selection; - - const previousNodePos = Math.max(0, $anchor.pos - 2); - - const previousNode = editorState.doc.resolve(previousNodePos).node(); - - if (!previousNode || !parentListTypes.includes(previousNode.type.name)) { - return false; - } - - return true; -}; diff --git a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/has-list-item-after.ts b/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/has-list-item-after.ts deleted file mode 100644 index 4e538ac47f..0000000000 --- a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/has-list-item-after.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { EditorState } from "@tiptap/pm/state"; - -export const hasListItemAfter = (typeOrName: string, state: EditorState): boolean => { - const { $anchor } = state.selection; - - const $targetPos = state.doc.resolve($anchor.pos - $anchor.parentOffset - 2); - - if ($targetPos.index() === $targetPos.parent.childCount - 1) { - return false; - } - - if ($targetPos.nodeAfter?.type.name !== typeOrName) { - return false; - } - - return true; -}; diff --git a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/has-list-item-before.ts b/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/has-list-item-before.ts deleted file mode 100644 index 91fda9bf4c..0000000000 --- a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/has-list-item-before.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { EditorState } from "@tiptap/pm/state"; - -export const hasListItemBefore = (typeOrName: string, state: EditorState): boolean => { - const { $anchor } = state.selection; - - const $targetPos = state.doc.resolve($anchor.pos - 2); - - if ($targetPos.index() === 0) { - return false; - } - - if ($targetPos.nodeBefore?.type.name !== typeOrName) { - return false; - } - - return true; -}; diff --git a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/index.ts b/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/index.ts deleted file mode 100644 index 644953b92b..0000000000 --- a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from "./find-list-item-pos"; -export * from "./get-next-list-depth"; -export * from "./handle-backspace"; -export * from "./handle-delete"; -export * from "./has-list-before"; -export * from "./has-list-item-after"; -export * from "./has-list-item-before"; -export * from "./next-list-is-deeper"; -export * from "./next-list-is-higher"; diff --git a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/next-list-is-deeper.ts b/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/next-list-is-deeper.ts deleted file mode 100644 index 7cd1a63f7e..0000000000 --- a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/next-list-is-deeper.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { EditorState } from "@tiptap/pm/state"; - -import { findListItemPos } from "src/ui/extensions/custom-list-keymap/list-helpers/find-list-item-pos"; -import { getNextListDepth } from "src/ui/extensions/custom-list-keymap/list-helpers/get-next-list-depth"; - -export const nextListIsDeeper = (typeOrName: string, state: EditorState) => { - const listDepth = getNextListDepth(typeOrName, state); - const listItemPos = findListItemPos(typeOrName, state); - - if (!listItemPos || !listDepth) { - return false; - } - - if (listDepth > listItemPos.depth) { - return true; - } - - return false; -}; diff --git a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/next-list-is-higher.ts b/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/next-list-is-higher.ts deleted file mode 100644 index 3364c3b87c..0000000000 --- a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-helpers/next-list-is-higher.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { EditorState } from "@tiptap/pm/state"; - -import { findListItemPos } from "src/ui/extensions/custom-list-keymap/list-helpers/find-list-item-pos"; -import { getNextListDepth } from "src/ui/extensions/custom-list-keymap/list-helpers/get-next-list-depth"; - -export const nextListIsHigher = (typeOrName: string, state: EditorState) => { - const listDepth = getNextListDepth(typeOrName, state); - const listItemPos = findListItemPos(typeOrName, state); - - if (!listItemPos || !listDepth) { - return false; - } - - if (listDepth < listItemPos.depth) { - return true; - } - - return false; -}; diff --git a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-keymap.ts b/packages/editor/core/src/ui/extensions/custom-list-keymap/list-keymap.ts index aabd836d2e..dba6b1f46c 100644 --- a/packages/editor/core/src/ui/extensions/custom-list-keymap/list-keymap.ts +++ b/packages/editor/core/src/ui/extensions/custom-list-keymap/list-keymap.ts @@ -29,6 +29,22 @@ export const ListKeymap = Extension.create({ addKeyboardShortcuts() { return { + Tab: () => { + if (this.editor.commands.sinkListItem("listItem")) { + return true; + } else if (this.editor.commands.sinkListItem("taskItem")) { + return true; + } + return true; + }, + "Shift-Tab": () => { + if (this.editor.commands.liftListItem("listItem")) { + return true; + } else if (this.editor.commands.liftListItem("taskItem")) { + return true; + } + return true; + }, Delete: ({ editor }) => { let handled = false; diff --git a/packages/editor/core/src/ui/extensions/image/image-resize.tsx b/packages/editor/core/src/ui/extensions/image/image-resize.tsx index 400938785b..7f61cc9cbd 100644 --- a/packages/editor/core/src/ui/extensions/image/image-resize.tsx +++ b/packages/editor/core/src/ui/extensions/image/image-resize.tsx @@ -7,10 +7,19 @@ export const ImageResizer = ({ editor }: { editor: Editor }) => { const imageInfo = document.querySelector(".ProseMirror-selectednode") as HTMLImageElement; if (imageInfo) { const selection = editor.state.selection; + + // Use the style width/height if available, otherwise fall back to the element's natural width/height + const width = imageInfo.style.width + ? Number(imageInfo.style.width.replace("px", "")) + : imageInfo.getAttribute("width"); + const height = imageInfo.style.height + ? Number(imageInfo.style.height.replace("px", "")) + : imageInfo.getAttribute("height"); + editor.commands.setImage({ src: imageInfo.src, - width: Number(imageInfo.style.width.replace("px", "")), - height: Number(imageInfo.style.height.replace("px", "")), + width: width, + height: height, } as any); editor.commands.setNodeSelection(selection.from); } @@ -21,7 +30,7 @@ export const ImageResizer = ({ editor }: { editor: Editor }) => { return ( <> { setAspectRatio(originalWidth / originalHeight); } }} - onResize={({ target, width, height, delta }: any) => { - if (delta[0]) { - const newWidth = Math.max(width, 100); - const newHeight = newWidth / aspectRatio; - target!.style.width = `${newWidth}px`; - target!.style.height = `${newHeight}px`; - } - if (delta[1]) { - const newHeight = Math.max(height, 100); - const newWidth = newHeight * aspectRatio; - target!.style.height = `${newHeight}px`; - target!.style.width = `${newWidth}px`; + onResize={({ target, width, height, delta }) => { + if (delta[0] || delta[1]) { + let newWidth, newHeight; + if (delta[0]) { + // Width change detected + newWidth = Math.max(width, 100); + newHeight = newWidth / aspectRatio; + } else if (delta[1]) { + // Height change detected + newHeight = Math.max(height, 100); + newWidth = newHeight * aspectRatio; + } + target.style.width = `${newWidth}px`; + target.style.height = `${newHeight}px`; } }} onResizeEnd={() => { updateMediaSize(); }} scalable - renderDirections={["w", "e"]} - onScale={({ target, transform }: any) => { - target!.style.transform = transform; + renderDirections={["se"]} + onScale={({ target, transform }) => { + target.style.transform = transform; }} /> diff --git a/packages/editor/core/src/ui/extensions/index.tsx b/packages/editor/core/src/ui/extensions/index.tsx index 1a932d6d51..1a68ee46ee 100644 --- a/packages/editor/core/src/ui/extensions/index.tsx +++ b/packages/editor/core/src/ui/extensions/index.tsx @@ -1,4 +1,3 @@ -import { Color } from "@tiptap/extension-color"; import TaskItem from "@tiptap/extension-task-item"; import TaskList from "@tiptap/extension-task-list"; import TextStyle from "@tiptap/extension-text-style"; @@ -22,17 +21,18 @@ import { CustomKeymap } from "src/ui/extensions/keymap"; import { CustomQuoteExtension } from "src/ui/extensions/quote"; import { DeleteImage } from "src/types/delete-image"; -import { IMentionSuggestion } from "src/types/mention-suggestion"; +import { IMentionHighlight, IMentionSuggestion } from "src/types/mention-suggestion"; import { RestoreImage } from "src/types/restore-image"; import { CustomLinkExtension } from "src/ui/extensions/custom-link"; import { CustomCodeInlineExtension } from "src/ui/extensions/code-inline"; import { CustomTypographyExtension } from "src/ui/extensions/typography"; import { CustomHorizontalRule } from "src/ui/extensions/horizontal-rule/horizontal-rule"; +import { CustomCodeMarkPlugin } from "./custom-code-inline/inline-code-plugin"; export const CoreEditorExtensions = ( mentionConfig: { - mentionSuggestions: IMentionSuggestion[]; - mentionHighlights: string[]; + mentionSuggestions?: () => Promise; + mentionHighlights?: () => Promise; }, deleteFile: DeleteImage, restoreFile: RestoreImage, @@ -41,17 +41,17 @@ export const CoreEditorExtensions = ( StarterKit.configure({ bulletList: { HTMLAttributes: { - class: "list-disc list-outside leading-3 -mt-2", + class: "list-disc pl-7 space-y-2", }, }, orderedList: { HTMLAttributes: { - class: "list-decimal list-outside leading-3 -mt-2", + class: "list-decimal pl-7 space-y-2", }, }, listItem: { HTMLAttributes: { - class: "leading-normal -mb-2", + class: "not-prose space-y-2", }, }, code: false, @@ -60,14 +60,17 @@ export const CoreEditorExtensions = ( blockquote: false, dropcursor: { color: "rgba(var(--color-text-100))", - width: 2, + width: 1, }, }), - CustomQuoteExtension.configure({ - HTMLAttributes: { className: "border-l-4 border-custom-border-300" }, - }), + // BulletList, + // OrderedList, + // ListItem, + CustomQuoteExtension, CustomHorizontalRule.configure({ - HTMLAttributes: { class: "mt-4 mb-4" }, + HTMLAttributes: { + class: "my-4", + }, }), CustomKeymap, ListKeymap, @@ -85,33 +88,40 @@ export const CoreEditorExtensions = ( CustomTypographyExtension, ImageExtension(deleteFile, restoreFile, cancelUploadImage).configure({ HTMLAttributes: { - class: "rounded-lg border border-custom-border-300", + class: "rounded-md", }, }), TiptapUnderline, TextStyle, - Color, TaskList.configure({ HTMLAttributes: { - class: "not-prose pl-2", + class: "not-prose pl-2 space-y-2", }, }), TaskItem.configure({ HTMLAttributes: { - class: "flex items-start my-4", + class: "flex", }, nested: true, }), - CustomCodeBlockExtension, + CustomCodeBlockExtension.configure({ + HTMLAttributes: { + class: "", + }, + }), + CustomCodeMarkPlugin, CustomCodeInlineExtension, Markdown.configure({ html: true, - transformCopiedText: true, transformPastedText: true, }), Table, TableHeader, TableCell, TableRow, - Mentions(mentionConfig.mentionSuggestions, mentionConfig.mentionHighlights, false), + Mentions({ + mentionSuggestions: mentionConfig.mentionSuggestions, + mentionHighlights: mentionConfig.mentionHighlights, + readonly: false, + }), ]; diff --git a/packages/editor/core/src/ui/extensions/keymap.tsx b/packages/editor/core/src/ui/extensions/keymap.tsx index 0caa194cd4..2e0bdd1fe9 100644 --- a/packages/editor/core/src/ui/extensions/keymap.tsx +++ b/packages/editor/core/src/ui/extensions/keymap.tsx @@ -1,4 +1,7 @@ import { Extension } from "@tiptap/core"; +import { Plugin, PluginKey, Transaction } from "@tiptap/pm/state"; +import { canJoin } from "@tiptap/pm/transform"; +import { NodeType } from "@tiptap/pm/model"; declare module "@tiptap/core" { // eslint-disable-next-line no-unused-vars @@ -12,6 +15,51 @@ declare module "@tiptap/core" { } } +function autoJoin(tr: Transaction, newTr: Transaction, nodeType: NodeType) { + if (!tr.isGeneric) return false; + + // Find all ranges where we might want to join. + const ranges: Array = []; + for (let i = 0; i < tr.mapping.maps.length; i++) { + const map = tr.mapping.maps[i]; + for (let j = 0; j < ranges.length; j++) ranges[j] = map.map(ranges[j]); + map.forEach((_s, _e, from, to) => ranges.push(from, to)); + } + + // Figure out which joinable points exist inside those ranges, + // by checking all node boundaries in their parent nodes. + const joinable = []; + for (let i = 0; i < ranges.length; i += 2) { + const from = ranges[i], + to = ranges[i + 1]; + const $from = tr.doc.resolve(from), + depth = $from.sharedDepth(to), + parent = $from.node(depth); + for (let index = $from.indexAfter(depth), pos = $from.after(depth + 1); pos <= to; ++index) { + const after = parent.maybeChild(index); + if (!after) break; + if (index && joinable.indexOf(pos) == -1) { + const before = parent.child(index - 1); + if (before.type == after.type && before.type === nodeType) joinable.push(pos); + } + pos += after.nodeSize; + } + } + + let joined = false; + + // Join the joinable points + joinable.sort((a, b) => a - b); + for (let i = joinable.length - 1; i >= 0; i--) { + if (canJoin(tr.doc, joinable[i])) { + newTr.join(joinable[i]); + joined = true; + } + } + + return joined; +} + export const CustomKeymap = Extension.create({ name: "CustomKeymap", @@ -32,6 +80,42 @@ export const CustomKeymap = Extension.create({ }; }, + addProseMirrorPlugins() { + return [ + new Plugin({ + key: new PluginKey("ordered-list-merging"), + appendTransaction(transactions, oldState, newState) { + // Create a new transaction. + const newTr = newState.tr; + + let joined = false; + for (const transaction of transactions) { + const anotherJoin = autoJoin(transaction, newTr, newState.schema.nodes["orderedList"]); + joined = anotherJoin || joined; + } + if (joined) { + return newTr; + } + }, + }), + new Plugin({ + key: new PluginKey("unordered-list-merging"), + appendTransaction(transactions, oldState, newState) { + // Create a new transaction. + const newTr = newState.tr; + + let joined = false; + for (const transaction of transactions) { + const anotherJoin = autoJoin(transaction, newTr, newState.schema.nodes["bulletList"]); + joined = anotherJoin || joined; + } + if (joined) { + return newTr; + } + }, + }), + ]; + }, addKeyboardShortcuts() { return { "Mod-a": ({ editor }) => { diff --git a/packages/editor/core/src/ui/extensions/table/table/icons.ts b/packages/editor/core/src/ui/extensions/table/table/icons.ts index f73c55c09f..51c7784113 100644 --- a/packages/editor/core/src/ui/extensions/table/table/icons.ts +++ b/packages/editor/core/src/ui/extensions/table/table/icons.ts @@ -1,10 +1,10 @@ export const icons = { colorPicker: ``, - deleteColumn: ``, - deleteRow: ``, + deleteColumn: ``, + deleteRow: ``, insertLeftTableIcon: ` `, - toggleColumnHeader: ``, - toggleRowHeader: ``, + toggleColumnHeader: ``, + toggleRowHeader: ``, insertBottomTableIcon: ` { const pluginState = key.getState(view.state); - if (!(event.target as HTMLElement).closest(".tableWrapper") && pluginState.values.hoveredTable) { + if (!(event.target as HTMLElement).closest(".table-wrapper") && pluginState.values.hoveredTable) { return view.dispatch( view.state.tr.setMeta(key, { setHoveredTable: null, @@ -34,7 +34,7 @@ export function tableControls() { top: event.clientY, }); - if (!pos) return; + if (!pos || pos.pos < 0 || pos.pos > view.state.doc.content.size) return; const table = findParentNode((node) => node.type.name === "table")( TextSelection.create(view.state.doc, pos.pos) diff --git a/packages/editor/core/src/ui/extensions/table/table/table-view.tsx b/packages/editor/core/src/ui/extensions/table/table/table-view.tsx index 75b6bcb127..d4dfcf5c7c 100644 --- a/packages/editor/core/src/ui/extensions/table/table/table-view.tsx +++ b/packages/editor/core/src/ui/extensions/table/table/table-view.tsx @@ -177,7 +177,7 @@ const rowsToolboxItems: ToolboxItem[] = [ action: (args: any) => {}, // Placeholder action; actual color picking is handled in `createToolbox` }, { - label: "Delete Row", + label: "Delete row", icon: icons.deleteRow, action: ({ editor }: { editor: Editor }) => editor.chain().focus().deleteRow().run(), }, @@ -189,7 +189,7 @@ function createToolbox({ tippyOptions, onSelectColor, onClickItem, - colors = {}, + colors, }: { triggerButton: Element | null; items: ToolboxItem[]; @@ -202,38 +202,44 @@ function createToolbox({ const toolbox = tippy(triggerButton, { content: h( "div", - { className: "tableToolbox" }, - items.map((item, index) => { + { + className: + "rounded-md border-[0.5px] border-custom-border-300 bg-custom-background-100 px-2 py-2.5 text-xs shadow-custom-shadow-rg min-w-[12rem] whitespace-nowrap", + }, + items.map((item) => { if (item.label === "Pick color") { return h("div", { className: "flex flex-col" }, [ - h("div", { className: "divider" }), - h("div", { className: "colorPickerLabel" }, item.label), + h("hr", { className: "my-2 border-custom-border-200" }), + h("div", { className: "text-custom-text-200 text-sm" }, item.label), h( "div", - { className: "colorPicker grid" }, + { className: "grid grid-cols-6 gap-x-1 gap-y-2.5 mt-2" }, Object.entries(colors).map(([colorName, colorValue]) => h("div", { - className: "colorPickerItem flex items-center justify-center", - style: `background-color: ${colorValue.backgroundColor}; - color: ${colorValue.textColor || "inherit"};`, + className: "grid place-items-center size-6 rounded cursor-pointer", + style: `background-color: ${colorValue.backgroundColor};color: ${colorValue.textColor || "inherit"};`, innerHTML: colorValue.icon ?? `A`, onClick: () => onSelectColor(colorValue), }) ) ), - h("div", { className: "divider" }), + h("hr", { className: "my-2 border-custom-border-200" }), ]); } else { return h( "div", { - className: "toolboxItem", + className: + "flex items-center gap-2 px-1 py-1.5 bg-custom-background-100 hover:bg-custom-background-80 text-sm text-custom-text-200 rounded cursor-pointer", itemType: "div", onClick: () => onClickItem(item), }, [ - h("div", { className: "iconContainer", innerHTML: item.icon }), + h("span", { + className: "h-3 w-3 flex-shrink-0", + innerHTML: item.icon, + }), h("div", { className: "label" }, item.label), ] ); @@ -290,27 +296,27 @@ export class TableView implements NodeView { if (editor.isEditable) { this.rowsControl = h( "div", - { className: "rowsControl" }, + { className: "rows-control" }, h("div", { itemType: "button", - className: "rowsControlDiv", + className: "rows-control-div", onClick: () => this.selectRow(), }) ); this.columnsControl = h( "div", - { className: "columnsControl" }, + { className: "columns-control" }, h("div", { itemType: "button", - className: "columnsControlDiv", + className: "columns-control-div", onClick: () => this.selectColumn(), }) ); this.controls = h( "div", - { className: "tableControls", contentEditable: "false" }, + { className: "table-controls", contentEditable: "false" }, this.rowsControl, this.columnsControl ); @@ -331,7 +337,7 @@ export class TableView implements NodeView { }; this.columnsToolbox = createToolbox({ - triggerButton: this.columnsControl.querySelector(".columnsControlDiv"), + triggerButton: this.columnsControl.querySelector(".columns-control-div"), items: columnsToolboxItems, colors: columnColors, onSelectColor: (color) => setCellsBackgroundColor(this.editor, color), @@ -380,7 +386,7 @@ export class TableView implements NodeView { this.root = h( "div", { - className: "tableWrapper controls--disabled", + className: "table-wrapper horizontal-scrollbar scrollbar-md controls--disabled", }, this.controls, this.table diff --git a/packages/editor/core/src/ui/mentions/custom.tsx b/packages/editor/core/src/ui/mentions/custom.tsx index e723ca0d7f..8bab796667 100644 --- a/packages/editor/core/src/ui/mentions/custom.tsx +++ b/packages/editor/core/src/ui/mentions/custom.tsx @@ -5,7 +5,7 @@ import { MentionNodeView } from "src/ui/mentions/mention-node-view"; import { IMentionHighlight } from "src/types/mention-suggestion"; export interface CustomMentionOptions extends MentionOptions { - mentionHighlights: IMentionHighlight[]; + mentionHighlights: () => Promise; readonly?: boolean; } @@ -32,6 +32,12 @@ export const CustomMention = Mention.extend({ redirect_uri: { default: "/", }, + entity_identifier: { + default: null, + }, + entity_name: { + default: null, + }, }; }, @@ -43,17 +49,6 @@ export const CustomMention = Mention.extend({ return [ { tag: "mention-component", - getAttrs: (node: string | HTMLElement) => { - if (typeof node === "string") { - return null; - } - return { - id: node.getAttribute("data-mention-id") || "", - target: node.getAttribute("data-mention-target") || "", - label: node.innerText.slice(1) || "", - redirect_uri: node.getAttribute("redirect_uri"), - }; - }, }, ]; }, diff --git a/packages/editor/core/src/ui/mentions/index.tsx b/packages/editor/core/src/ui/mentions/index.tsx index f6d3e5b1fc..838622cbba 100644 --- a/packages/editor/core/src/ui/mentions/index.tsx +++ b/packages/editor/core/src/ui/mentions/index.tsx @@ -1,15 +1,90 @@ -// @ts-nocheck - -import { Suggestion } from "src/ui/mentions/suggestion"; import { CustomMention } from "src/ui/mentions/custom"; -import { IMentionHighlight } from "src/types/mention-suggestion"; +import { IMentionHighlight, IMentionSuggestion } from "src/types/mention-suggestion"; +import { ReactRenderer } from "@tiptap/react"; +import { Editor } from "@tiptap/core"; +import tippy from "tippy.js"; + +import { MentionList } from "src/ui/mentions/mention-list"; -export const Mentions = (mentionSuggestions: IMentionSuggestion[], mentionHighlights: IMentionHighlight[], readonly) => +export const Mentions = ({ + mentionHighlights, + mentionSuggestions, + readonly, +}: { + mentionSuggestions?: () => Promise; + mentionHighlights?: () => Promise; + readonly: boolean; +}) => CustomMention.configure({ HTMLAttributes: { class: "mention", }, readonly: readonly, mentionHighlights: mentionHighlights, - suggestion: Suggestion(mentionSuggestions), + suggestion: { + // @ts-expect-error - Tiptap types are incorrect + render: () => { + if (!mentionSuggestions) return; + let component: ReactRenderer | null = null; + let popup: any | null = null; + + return { + onStart: (props: { editor: Editor; clientRect: DOMRect }) => { + if (!props.clientRect) { + return; + } + component = new ReactRenderer(MentionList, { + props: { ...props, mentionSuggestions }, + editor: props.editor, + }); + props.editor.storage.mentionsOpen = true; + // @ts-expect-error - Tippy types are incorrect + popup = tippy("body", { + getReferenceClientRect: props.clientRect, + appendTo: () => document.querySelector(".active-editor") ?? document.querySelector("#editor-container"), + content: component.element, + showOnCreate: true, + interactive: true, + trigger: "manual", + placement: "bottom-start", + }); + }, + onUpdate: (props: { editor: Editor; clientRect: DOMRect }) => { + component?.updateProps(props); + + if (!props.clientRect) { + return; + } + + popup && + popup[0].setProps({ + getReferenceClientRect: props.clientRect, + }); + }, + + onKeyDown: (props: { event: KeyboardEvent }) => { + if (props.event.key === "Escape") { + popup?.[0].hide(); + + return true; + } + + const navigationKeys = ["ArrowUp", "ArrowDown", "Enter"]; + + if (navigationKeys.includes(props.event.key)) { + // @ts-expect-error - Tippy types are incorrect + component?.ref?.onKeyDown(props); + event?.stopPropagation(); + return true; + } + return false; + }, + onExit: (props: { editor: Editor; event: KeyboardEvent }) => { + props.editor.storage.mentionsOpen = false; + popup?.[0].destroy(); + component?.destroy(); + }, + }; + }, + }, }); diff --git a/packages/editor/core/src/ui/mentions/mention-list.tsx b/packages/editor/core/src/ui/mentions/mention-list.tsx index afbf109702..cd0bf83547 100644 --- a/packages/editor/core/src/ui/mentions/mention-list.tsx +++ b/packages/editor/core/src/ui/mentions/mention-list.tsx @@ -1,36 +1,106 @@ import { Editor } from "@tiptap/react"; -import { forwardRef, useEffect, useImperativeHandle, useState } from "react"; +import { forwardRef, useEffect, useImperativeHandle, useLayoutEffect, useRef, useState } from "react"; +import { cn } from "src/lib/utils"; import { IMentionSuggestion } from "src/types/mention-suggestion"; +import { v4 as uuidv4 } from "uuid"; +import { Avatar } from "@plane/ui"; interface MentionListProps { - items: IMentionSuggestion[]; - command: (item: { id: string; label: string; target: string; redirect_uri: string }) => void; + command: (item: { + id: string; + label: string; + entity_name: string; + entity_identifier: string; + target: string; + redirect_uri: string; + }) => void; + query: string; editor: Editor; + mentionSuggestions: () => Promise; } -// eslint-disable-next-line react/display-name export const MentionList = forwardRef((props: MentionListProps, ref) => { + const { query, mentionSuggestions } = props; + const [items, setItems] = useState([]); const [selectedIndex, setSelectedIndex] = useState(0); + const [isLoading, setIsLoading] = useState(false); + + useEffect(() => { + const fetchSuggestions = async () => { + setIsLoading(true); + try { + const suggestions = await mentionSuggestions(); + const mappedSuggestions: IMentionSuggestion[] = suggestions.map((suggestion): IMentionSuggestion => { + const transactionId = uuidv4(); + return { + ...suggestion, + id: transactionId, + }; + }); + + const filteredSuggestions = mappedSuggestions.filter((suggestion) => + suggestion.title.toLowerCase().startsWith(query.toLowerCase()) + ); + + setItems(filteredSuggestions); + } catch (error) { + console.error("Failed to fetch suggestions:", error); + } finally { + setIsLoading(false); + } + }; + + fetchSuggestions(); + }, [query, mentionSuggestions]); const selectItem = (index: number) => { - const item = props.items[index]; - - if (item) { - props.command({ - id: item.id, - label: item.title, - target: "users", - redirect_uri: item.redirect_uri, - }); + try { + const item = items[index]; + + if (item) { + props.command({ + id: item.id, + label: item.title, + entity_identifier: item.entity_identifier, + entity_name: item.entity_name, + target: "users", + redirect_uri: item.redirect_uri, + }); + } + } catch (error) { + console.error("Error selecting item:", error); } }; + const commandListContainer = useRef(null); + + useLayoutEffect(() => { + const container = commandListContainer?.current; + + const item = container?.children[selectedIndex] as HTMLElement; + + if (item && container) updateScrollView(container, item); + }, [selectedIndex]); + + const updateScrollView = (container: HTMLElement, item: HTMLElement) => { + const containerHeight = container.offsetHeight; + const itemHeight = item ? item.offsetHeight : 0; + + const top = item.offsetTop; + const bottom = top + itemHeight; + + if (top < container.scrollTop) { + container.scrollTop -= container.scrollTop - top + 5; + } else if (bottom > containerHeight + container.scrollTop) { + container.scrollTop += bottom - containerHeight - container.scrollTop + 5; + } + }; const upHandler = () => { - setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length); + setSelectedIndex((selectedIndex + items.length - 1) % items.length); }; const downHandler = () => { - setSelectedIndex((selectedIndex + 1) % props.items.length); + setSelectedIndex((selectedIndex + 1) % items.length); }; const enterHandler = () => { @@ -39,7 +109,7 @@ export const MentionList = forwardRef((props: MentionListProps, ref) => { useEffect(() => { setSelectedIndex(0); - }, [props.items]); + }, [items]); useImperativeHandle(ref, () => ({ onKeyDown: ({ event }: { event: KeyboardEvent }) => { @@ -62,38 +132,33 @@ export const MentionList = forwardRef((props: MentionListProps, ref) => { }, })); - return props.items && props.items.length !== 0 ? ( -
- {props.items.length ? ( - props.items.map((item, index) => ( + return ( +
+ {isLoading ? ( +
Loading...
+ ) : items.length ? ( + items.map((item, index) => (
selectItem(index)} > -
- {item.avatar && item.avatar.trim() !== "" ? ( - {item.title} - ) : ( -
- {item.title[0]} -
- )} -
-
-

{item.title}

- {/*

{item.subtitle}

*/} -
+ + {item.title}
)) ) : ( -
No result
+
No results
)}
- ) : ( - <> ); }); diff --git a/packages/editor/core/src/ui/mentions/mention-node-view.tsx b/packages/editor/core/src/ui/mentions/mention-node-view.tsx index 1c3755f6c6..0a1f1b5e0c 100644 --- a/packages/editor/core/src/ui/mentions/mention-node-view.tsx +++ b/packages/editor/core/src/ui/mentions/mention-node-view.tsx @@ -4,11 +4,21 @@ import { NodeViewWrapper } from "@tiptap/react"; import { cn } from "src/lib/utils"; import { useRouter } from "next/router"; import { IMentionHighlight } from "src/types/mention-suggestion"; +import { useEffect, useState } from "react"; // eslint-disable-next-line import/no-anonymous-default-export export const MentionNodeView = (props) => { const router = useRouter(); - const highlights = props.extension.options.mentionHighlights as IMentionHighlight[]; + const [highlightsState, setHighlightsState] = useState(); + + useEffect(() => { + if (!props.extension.options.mentionHighlights) return; + const hightlights = async () => { + const userId = await props.extension.options.mentionHighlights(); + setHighlightsState(userId); + }; + hightlights(); + }, [props.extension.options]); const handleClick = () => { if (!props.extension.options.readonly) { @@ -20,13 +30,12 @@ export const MentionNodeView = (props) => { @{props.node.attrs.label} diff --git a/packages/editor/core/src/ui/mentions/suggestion.ts b/packages/editor/core/src/ui/mentions/suggestion.ts index 3f1b8eeecc..8eaf0982f4 100644 --- a/packages/editor/core/src/ui/mentions/suggestion.ts +++ b/packages/editor/core/src/ui/mentions/suggestion.ts @@ -1,66 +1,17 @@ -import { ReactRenderer } from "@tiptap/react"; -import { Editor } from "@tiptap/core"; -import tippy from "tippy.js"; - -import { MentionList } from "src/ui/mentions/mention-list"; +import { v4 as uuidv4 } from "uuid"; import { IMentionSuggestion } from "src/types/mention-suggestion"; -export const Suggestion = (suggestions: IMentionSuggestion[]) => ({ - items: ({ query }: { query: string }) => - suggestions.filter((suggestion) => suggestion.title.toLowerCase().startsWith(query.toLowerCase())).slice(0, 5), - render: () => { - let reactRenderer: ReactRenderer | null = null; - let popup: any | null = null; - - return { - onStart: (props: { editor: Editor; clientRect: DOMRect }) => { - props.editor.storage.mentionsOpen = true; - reactRenderer = new ReactRenderer(MentionList, { - props, - editor: props.editor, - }); - // @ts-ignore - popup = tippy("body", { - getReferenceClientRect: props.clientRect, - appendTo: () => document.querySelector(".active-editor") ?? document.querySelector("#editor-container"), - content: reactRenderer.element, - showOnCreate: true, - interactive: true, - trigger: "manual", - placement: "bottom-start", - }); - }, - - onUpdate: (props: { editor: Editor; clientRect: DOMRect }) => { - reactRenderer?.updateProps(props); - - popup && - popup[0].setProps({ - getReferenceClientRect: props.clientRect, - }); - }, - onKeyDown: (props: { event: KeyboardEvent }) => { - if (props.event.key === "Escape") { - popup?.[0].hide(); - - return true; - } - - const navigationKeys = ["ArrowUp", "ArrowDown", "Enter"]; - - if (navigationKeys.includes(props.event.key)) { - // @ts-ignore - reactRenderer?.ref?.onKeyDown(props); - event?.stopPropagation(); - return true; - } - return false; - }, - onExit: (props: { editor: Editor; event: KeyboardEvent }) => { - props.editor.storage.mentionsOpen = false; - popup?.[0].destroy(); - reactRenderer?.destroy(); - }, - }; - }, -}); +export const getSuggestionItems = + (suggestions: IMentionSuggestion[]) => + ({ query }: { query: string }) => { + const mappedSuggestions: IMentionSuggestion[] = suggestions.map((suggestion): IMentionSuggestion => { + const transactionId = uuidv4(); + return { + ...suggestion, + id: transactionId, + }; + }); + return mappedSuggestions + .filter((suggestion) => suggestion.title.toLowerCase().startsWith(query.toLowerCase())) + .slice(0, 5); + }; diff --git a/packages/editor/core/src/ui/menus/menu-items/index.tsx b/packages/editor/core/src/ui/menus/menu-items/index.tsx index f60febc59d..66736e0ea7 100644 --- a/packages/editor/core/src/ui/menus/menu-items/index.tsx +++ b/packages/editor/core/src/ui/menus/menu-items/index.tsx @@ -33,6 +33,7 @@ import { } from "src/lib/editor-commands"; import { LucideIconType } from "src/types/lucide-icon"; import { UploadImage } from "src/types/upload-image"; +import { Selection } from "@tiptap/pm/state"; export interface EditorMenuItem { name: string; @@ -41,104 +42,142 @@ export interface EditorMenuItem { icon: LucideIconType; } -export const HeadingOneItem = (editor: Editor): EditorMenuItem => ({ - name: "H1", - isActive: () => editor.isActive("heading", { level: 1 }), - command: () => toggleHeadingOne(editor), - icon: Heading1, -}); - -export const HeadingTwoItem = (editor: Editor): EditorMenuItem => ({ - name: "H2", - isActive: () => editor.isActive("heading", { level: 2 }), - command: () => toggleHeadingTwo(editor), - icon: Heading2, -}); - -export const HeadingThreeItem = (editor: Editor): EditorMenuItem => ({ - name: "H3", - isActive: () => editor.isActive("heading", { level: 3 }), - command: () => toggleHeadingThree(editor), - icon: Heading3, -}); - -export const BoldItem = (editor: Editor): EditorMenuItem => ({ - name: "bold", - isActive: () => editor?.isActive("bold"), - command: () => toggleBold(editor), - icon: BoldIcon, -}); - -export const ItalicItem = (editor: Editor): EditorMenuItem => ({ - name: "italic", - isActive: () => editor?.isActive("italic"), - command: () => toggleItalic(editor), - icon: ItalicIcon, -}); - -export const UnderLineItem = (editor: Editor): EditorMenuItem => ({ - name: "underline", - isActive: () => editor?.isActive("underline"), - command: () => toggleUnderline(editor), - icon: UnderlineIcon, -}); - -export const StrikeThroughItem = (editor: Editor): EditorMenuItem => ({ - name: "strike", - isActive: () => editor?.isActive("strike"), - command: () => toggleStrike(editor), - icon: StrikethroughIcon, -}); - -export const BulletListItem = (editor: Editor): EditorMenuItem => ({ - name: "bullet-list", - isActive: () => editor?.isActive("bulletList"), - command: () => toggleBulletList(editor), - icon: ListIcon, -}); - -export const TodoListItem = (editor: Editor): EditorMenuItem => ({ - name: "To-do List", - isActive: () => editor.isActive("taskItem"), - command: () => toggleTaskList(editor), - icon: CheckSquare, -}); - -export const CodeItem = (editor: Editor): EditorMenuItem => ({ - name: "code", - isActive: () => editor?.isActive("code") || editor?.isActive("codeBlock"), - command: () => toggleCodeBlock(editor), - icon: CodeIcon, -}); - -export const NumberedListItem = (editor: Editor): EditorMenuItem => ({ - name: "ordered-list", - isActive: () => editor?.isActive("orderedList"), - command: () => toggleOrderedList(editor), - icon: ListOrderedIcon, -}); - -export const QuoteItem = (editor: Editor): EditorMenuItem => ({ - name: "quote", - isActive: () => editor?.isActive("blockquote"), - command: () => toggleBlockquote(editor), - icon: QuoteIcon, -}); - -export const TableItem = (editor: Editor): EditorMenuItem => ({ - name: "table", - isActive: () => editor?.isActive("table"), - command: () => insertTableCommand(editor), - icon: TableIcon, -}); - -export const ImageItem = ( - editor: Editor, - uploadFile: UploadImage, - setIsSubmitting?: (isSubmitting: "submitting" | "submitted" | "saved") => void -): EditorMenuItem => ({ - name: "image", - isActive: () => editor?.isActive("image"), - command: () => insertImageCommand(editor, uploadFile, setIsSubmitting), - icon: ImageIcon, -}); +export const HeadingOneItem = (editor: Editor) => + ({ + name: "H1", + isActive: () => editor.isActive("heading", { level: 1 }), + command: () => toggleHeadingOne(editor), + icon: Heading1, + }) as const satisfies EditorMenuItem; + +export const HeadingTwoItem = (editor: Editor) => + ({ + name: "H2", + isActive: () => editor.isActive("heading", { level: 2 }), + command: () => toggleHeadingTwo(editor), + icon: Heading2, + }) as const satisfies EditorMenuItem; + +export const HeadingThreeItem = (editor: Editor) => + ({ + name: "H3", + isActive: () => editor.isActive("heading", { level: 3 }), + command: () => toggleHeadingThree(editor), + icon: Heading3, + }) as const satisfies EditorMenuItem; + +export const BoldItem = (editor: Editor) => + ({ + name: "bold", + isActive: () => editor?.isActive("bold"), + command: () => toggleBold(editor), + icon: BoldIcon, + }) as const satisfies EditorMenuItem; + +export const ItalicItem = (editor: Editor) => + ({ + name: "italic", + isActive: () => editor?.isActive("italic"), + command: () => toggleItalic(editor), + icon: ItalicIcon, + }) as const satisfies EditorMenuItem; + +export const UnderLineItem = (editor: Editor) => + ({ + name: "underline", + isActive: () => editor?.isActive("underline"), + command: () => toggleUnderline(editor), + icon: UnderlineIcon, + }) as const satisfies EditorMenuItem; + +export const StrikeThroughItem = (editor: Editor) => + ({ + name: "strike", + isActive: () => editor?.isActive("strike"), + command: () => toggleStrike(editor), + icon: StrikethroughIcon, + }) as const satisfies EditorMenuItem; + +export const BulletListItem = (editor: Editor) => + ({ + name: "bullet-list", + isActive: () => editor?.isActive("bulletList"), + command: () => toggleBulletList(editor), + icon: ListIcon, + }) as const satisfies EditorMenuItem; + +export const TodoListItem = (editor: Editor) => + ({ + name: "To-do List", + isActive: () => editor.isActive("taskItem"), + command: () => toggleTaskList(editor), + icon: CheckSquare, + }) as const satisfies EditorMenuItem; + +export const CodeItem = (editor: Editor) => + ({ + name: "code", + isActive: () => editor?.isActive("code") || editor?.isActive("codeBlock"), + command: () => toggleCodeBlock(editor), + icon: CodeIcon, + }) as const satisfies EditorMenuItem; + +export const NumberedListItem = (editor: Editor) => + ({ + name: "ordered-list", + isActive: () => editor?.isActive("orderedList"), + command: () => toggleOrderedList(editor), + icon: ListOrderedIcon, + }) as const satisfies EditorMenuItem; + +export const QuoteItem = (editor: Editor) => + ({ + name: "quote", + isActive: () => editor?.isActive("blockquote"), + command: () => toggleBlockquote(editor), + icon: QuoteIcon, + }) as const satisfies EditorMenuItem; + +export const TableItem = (editor: Editor) => + ({ + name: "table", + isActive: () => editor?.isActive("table"), + command: () => insertTableCommand(editor), + icon: TableIcon, + }) as const satisfies EditorMenuItem; + +export const ImageItem = (editor: Editor, uploadFile: UploadImage) => + ({ + name: "image", + isActive: () => editor?.isActive("image"), + command: (savedSelection: Selection | null) => insertImageCommand(editor, uploadFile, savedSelection), + icon: ImageIcon, + }) as const; + +export function getEditorMenuItems(editor: Editor | null, uploadFile: UploadImage) { + if (!editor) { + return []; + } + return [ + HeadingOneItem(editor), + HeadingTwoItem(editor), + HeadingThreeItem(editor), + BoldItem(editor), + ItalicItem(editor), + UnderLineItem(editor), + StrikeThroughItem(editor), + BulletListItem(editor), + TodoListItem(editor), + CodeItem(editor), + NumberedListItem(editor), + QuoteItem(editor), + TableItem(editor), + ImageItem(editor, uploadFile), + ]; +} + +export type EditorMenuItemNames = ReturnType extends (infer U)[] + ? U extends { name: infer N } + ? N + : never + : never; diff --git a/packages/editor/core/src/ui/plugins/delete-image.tsx b/packages/editor/core/src/ui/plugins/delete-image.tsx index afe13730ae..03b4dbd10f 100644 --- a/packages/editor/core/src/ui/plugins/delete-image.tsx +++ b/packages/editor/core/src/ui/plugins/delete-image.tsx @@ -57,10 +57,7 @@ export const TrackImageDeletionPlugin = (deleteImage: DeleteImage): Plugin => export async function onNodeDeleted(src: string, deleteImage: DeleteImage): Promise { try { const assetUrlWithWorkspaceId = new URL(src).pathname.substring(1); - const resStatus = await deleteImage(assetUrlWithWorkspaceId); - if (resStatus === 204) { - console.log("Image deleted successfully"); - } + await deleteImage(assetUrlWithWorkspaceId); } catch (error) { console.error("Error deleting image: ", error); } @@ -69,10 +66,7 @@ export async function onNodeDeleted(src: string, deleteImage: DeleteImage): Prom export async function onNodeRestored(src: string, restoreImage: RestoreImage): Promise { try { const assetUrlWithWorkspaceId = new URL(src).pathname.substring(1); - const resStatus = await restoreImage(assetUrlWithWorkspaceId); - if (resStatus === 204) { - console.log("Image restored successfully"); - } + await restoreImage(assetUrlWithWorkspaceId); } catch (error) { console.error("Error restoring image: ", error); } diff --git a/packages/editor/core/src/ui/plugins/upload-image.tsx b/packages/editor/core/src/ui/plugins/upload-image.tsx index 738653d713..3f6a40bf99 100644 --- a/packages/editor/core/src/ui/plugins/upload-image.tsx +++ b/packages/editor/core/src/ui/plugins/upload-image.tsx @@ -21,7 +21,7 @@ export const UploadImagesPlugin = (cancelUploadImage?: () => any) => const placeholder = document.createElement("div"); placeholder.setAttribute("class", "img-placeholder"); const image = document.createElement("img"); - image.setAttribute("class", "opacity-10 rounded-lg border border-custom-border-300"); + image.setAttribute("class", "opacity-60 rounded-lg border border-custom-border-300"); image.src = src; placeholder.appendChild(image); @@ -73,13 +73,7 @@ const removePlaceholder = (view: EditorView, id: {}) => { view.dispatch(removePlaceholderTr); }; -export async function startImageUpload( - file: File, - view: EditorView, - pos: number, - uploadFile: UploadImage, - setIsSubmitting?: (isSubmitting: "submitting" | "submitted" | "saved") => void -) { +export async function startImageUpload(file: File, view: EditorView, pos: number, uploadFile: UploadImage) { if (!file) { alert("No file selected. Please select a file to upload."); return; @@ -120,7 +114,7 @@ export async function startImageUpload( return; }; - setIsSubmitting?.("submitting"); + // setIsSubmitting?.("submitting"); try { const src = await UploadImageHandler(file, uploadFile); @@ -134,6 +128,7 @@ export async function startImageUpload( const transaction = view.state.tr.insert(pos - 1, node).setMeta(uploadKey, { remove: { id } }); view.dispatch(transaction); + view.focus(); } catch (error) { console.error("Upload error: ", error); removePlaceholder(view, id); diff --git a/packages/editor/core/src/ui/props.tsx b/packages/editor/core/src/ui/props.tsx index 1846efe475..aa88fa042e 100644 --- a/packages/editor/core/src/ui/props.tsx +++ b/packages/editor/core/src/ui/props.tsx @@ -1,15 +1,15 @@ import { EditorProps } from "@tiptap/pm/view"; -import { findTableAncestor } from "src/lib/utils"; +import { cn, findTableAncestor } from "src/lib/utils"; import { UploadImage } from "src/types/upload-image"; import { startImageUpload } from "src/ui/plugins/upload-image"; -export function CoreEditorProps( - uploadFile: UploadImage, - setIsSubmitting?: (isSubmitting: "submitting" | "submitted" | "saved") => void -): EditorProps { +export function CoreEditorProps(uploadFile: UploadImage, editorClassName: string): EditorProps { return { attributes: { - class: `prose prose-brand max-w-full prose-headings:font-display font-default focus:outline-none`, + class: cn( + "prose prose-brand max-w-full prose-headings:font-display font-default focus:outline-none", + editorClassName + ), }, handleDOMEvents: { keydown: (_view, event) => { @@ -36,7 +36,7 @@ export function CoreEditorProps( event.preventDefault(); const file = event.clipboardData.files[0]; const pos = view.state.selection.from; - startImageUpload(file, view, pos, uploadFile, setIsSubmitting); + startImageUpload(file, view, pos, uploadFile); return true; } return false; @@ -50,7 +50,7 @@ export function CoreEditorProps( top: event.clientY, }); if (coordinates) { - startImageUpload(file, view, coordinates.pos - 1, uploadFile, setIsSubmitting); + startImageUpload(file, view, coordinates.pos - 1, uploadFile); } return true; } diff --git a/packages/editor/core/src/ui/read-only/extensions.tsx b/packages/editor/core/src/ui/read-only/extensions.tsx index 93e1b38872..cf12880f8d 100644 --- a/packages/editor/core/src/ui/read-only/extensions.tsx +++ b/packages/editor/core/src/ui/read-only/extensions.tsx @@ -14,7 +14,7 @@ import { TableRow } from "src/ui/extensions/table/table-row/table-row"; import { ReadOnlyImageExtension } from "src/ui/extensions/image/read-only-image"; import { isValidHttpUrl } from "src/lib/utils"; import { Mentions } from "src/ui/mentions"; -import { IMentionSuggestion } from "src/types/mention-suggestion"; +import { IMentionHighlight } from "src/types/mention-suggestion"; import { CustomLinkExtension } from "src/ui/extensions/custom-link"; import { CustomHorizontalRule } from "src/ui/extensions/horizontal-rule/horizontal-rule"; import { CustomQuoteExtension } from "src/ui/extensions/quote"; @@ -23,23 +23,22 @@ import { CustomCodeBlockExtension } from "src/ui/extensions/code"; import { CustomCodeInlineExtension } from "src/ui/extensions/code-inline"; export const CoreReadOnlyEditorExtensions = (mentionConfig: { - mentionSuggestions: IMentionSuggestion[]; - mentionHighlights: string[]; + mentionHighlights?: () => Promise; }) => [ StarterKit.configure({ bulletList: { HTMLAttributes: { - class: "list-disc list-outside leading-3 -mt-2", + class: "list-disc pl-7 space-y-2", }, }, orderedList: { HTMLAttributes: { - class: "list-decimal list-outside leading-3 -mt-2", + class: "list-decimal pl-7 space-y-2", }, }, listItem: { HTMLAttributes: { - class: "leading-normal -mb-2", + class: "not-prose space-y-2", }, }, code: false, @@ -49,11 +48,9 @@ export const CoreReadOnlyEditorExtensions = (mentionConfig: { dropcursor: false, gapcursor: false, }), - CustomQuoteExtension.configure({ - HTMLAttributes: { className: "border-l-4 border-custom-border-300" }, - }), + CustomQuoteExtension, CustomHorizontalRule.configure({ - HTMLAttributes: { class: "mt-4 mb-4" }, + HTMLAttributes: { class: "my-4" }, }), CustomLinkExtension.configure({ openOnClick: true, @@ -69,7 +66,7 @@ export const CoreReadOnlyEditorExtensions = (mentionConfig: { CustomTypographyExtension, ReadOnlyImageExtension.configure({ HTMLAttributes: { - class: "rounded-lg border border-custom-border-300", + class: "rounded-md", }, }), TiptapUnderline, @@ -77,16 +74,20 @@ export const CoreReadOnlyEditorExtensions = (mentionConfig: { Color, TaskList.configure({ HTMLAttributes: { - class: "not-prose pl-2", + class: "not-prose pl-2 space-y-2", }, }), TaskItem.configure({ HTMLAttributes: { - class: "flex items-start my-4", + class: "flex pointer-events-none", }, nested: true, }), - CustomCodeBlockExtension, + CustomCodeBlockExtension.configure({ + HTMLAttributes: { + class: "bg-custom-background-90 text-custom-text-100 rounded-lg p-8 pl-9 pr-4", + }, + }), CustomCodeInlineExtension, Markdown.configure({ html: true, @@ -96,5 +97,8 @@ export const CoreReadOnlyEditorExtensions = (mentionConfig: { TableHeader, TableCell, TableRow, - Mentions(mentionConfig.mentionSuggestions, mentionConfig.mentionHighlights, true), + Mentions({ + mentionHighlights: mentionConfig.mentionHighlights, + readonly: true, + }), ]; diff --git a/packages/editor/core/src/ui/read-only/props.tsx b/packages/editor/core/src/ui/read-only/props.tsx index 79f9fcb0db..bd9b6713bd 100644 --- a/packages/editor/core/src/ui/read-only/props.tsx +++ b/packages/editor/core/src/ui/read-only/props.tsx @@ -1,7 +1,11 @@ import { EditorProps } from "@tiptap/pm/view"; +import { cn } from "src/lib/utils"; -export const CoreReadOnlyEditorProps: EditorProps = { +export const CoreReadOnlyEditorProps = (editorClassName: string): EditorProps => ({ attributes: { - class: `prose prose-brand max-w-full prose-headings:font-display font-default focus:outline-none`, + class: cn( + "prose prose-brand max-w-full prose-headings:font-display font-default focus:outline-none", + editorClassName + ), }, -}; +}); diff --git a/packages/editor/document-editor/src/hooks/use-editor-markings.tsx b/packages/editor/document-editor/src/hooks/use-editor-markings.tsx index 1eb72eaab5..88f125a269 100644 --- a/packages/editor/document-editor/src/hooks/use-editor-markings.tsx +++ b/packages/editor/document-editor/src/hooks/use-editor-markings.tsx @@ -1,33 +1,30 @@ -import { useState } from "react"; +import { useCallback, useState } from "react"; import { IMarking } from "src/types/editor-types"; export const useEditorMarkings = () => { const [markings, setMarkings] = useState([]); - const updateMarkings = (json: any) => { - const nodes = json.content as any[]; + const updateMarkings = useCallback((html: string) => { + const parser = new DOMParser(); + const doc = parser.parseFromString(html, "text/html"); + const headings = doc.querySelectorAll("h1, h2, h3"); const tempMarkings: IMarking[] = []; let h1Sequence: number = 0; let h2Sequence: number = 0; let h3Sequence: number = 0; - if (nodes) { - nodes.forEach((node) => { - if ( - node.type === "heading" && - (node.attrs.level === 1 || node.attrs.level === 2 || node.attrs.level === 3) && - node.content - ) { - tempMarkings.push({ - type: "heading", - level: node.attrs.level, - text: node.content[0].text, - sequence: node.attrs.level === 1 ? ++h1Sequence : node.attrs.level === 2 ? ++h2Sequence : ++h3Sequence, - }); - } + + headings.forEach((heading) => { + const level = parseInt(heading.tagName[1]); // Extract the number from h1, h2, h3 + tempMarkings.push({ + type: "heading", + level: level, + text: heading.textContent || "", + sequence: level === 1 ? ++h1Sequence : level === 2 ? ++h2Sequence : ++h3Sequence, }); - } + }); + setMarkings(tempMarkings); - }; + }, []); return { updateMarkings, diff --git a/packages/editor/document-editor/src/index.ts b/packages/editor/document-editor/src/index.ts index c074009f49..f8eea14ce7 100644 --- a/packages/editor/document-editor/src/index.ts +++ b/packages/editor/document-editor/src/index.ts @@ -1,3 +1,9 @@ export { DocumentEditor, DocumentEditorWithRef } from "src/ui"; export { DocumentReadOnlyEditor, DocumentReadOnlyEditorWithRef } from "src/ui/readonly"; -export { FixedMenu } from "src/ui/menu/fixed-menu"; + +// hooks +export { useEditorMarkings } from "src/hooks/use-editor-markings"; + +export type { EditorRefApi, EditorReadOnlyRefApi, EditorMenuItem, EditorMenuItemNames } from "@plane/editor-core"; + +export type { IMarking } from "src/types/editor-types"; diff --git a/packages/editor/document-editor/src/types/editor-types.ts b/packages/editor/document-editor/src/types/editor-types.ts index 5a28daf9e2..476642103c 100644 --- a/packages/editor/document-editor/src/types/editor-types.ts +++ b/packages/editor/document-editor/src/types/editor-types.ts @@ -1,10 +1,3 @@ -export interface DocumentDetails { - title: string; - created_by: string; - created_on: Date; - last_updated_by: string; - last_updated_at: Date; -} export interface IMarking { type: "heading"; level: number; diff --git a/packages/editor/document-editor/src/ui/components/alert-label.tsx b/packages/editor/document-editor/src/ui/components/alert-label.tsx deleted file mode 100644 index 69b6dd02d0..0000000000 --- a/packages/editor/document-editor/src/ui/components/alert-label.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { LucideIconType } from "@plane/editor-core"; - -interface IAlertLabelProps { - Icon?: LucideIconType; - backgroundColor: string; - textColor?: string; - label: string; -} -export const AlertLabel = (props: IAlertLabelProps) => { - const { Icon, backgroundColor, textColor, label } = props; - - return ( -
- {Icon && } - {label} -
- ); -}; diff --git a/packages/editor/document-editor/src/ui/components/content-browser.tsx b/packages/editor/document-editor/src/ui/components/content-browser.tsx deleted file mode 100644 index 926d9a53de..0000000000 --- a/packages/editor/document-editor/src/ui/components/content-browser.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { HeadingComp, HeadingThreeComp, SubheadingComp } from "src/ui/components/heading-component"; -import { IMarking } from "src/types/editor-types"; -import { Editor } from "@tiptap/react"; -import { scrollSummary } from "src/utils/editor-summary-utils"; - -interface ContentBrowserProps { - editor: Editor; - markings: IMarking[]; - setSidePeekVisible?: (sidePeekState: boolean) => void; -} - -export const ContentBrowser = (props: ContentBrowserProps) => { - const { editor, markings, setSidePeekVisible } = props; - - const handleOnClick = (marking: IMarking) => { - scrollSummary(editor, marking); - if (setSidePeekVisible) setSidePeekVisible(false); - }; - - return ( -
-

Outline

-
- {markings.length !== 0 ? ( - markings.map((marking) => - marking.level === 1 ? ( - handleOnClick(marking)} heading={marking.text} /> - ) : marking.level === 2 ? ( - handleOnClick(marking)} subHeading={marking.text} /> - ) : ( - handleOnClick(marking)} /> - ) - ) - ) : ( -

Headings will be displayed here for navigation

- )} -
-
- ); -}; diff --git a/packages/editor/document-editor/src/ui/components/editor-header.tsx b/packages/editor/document-editor/src/ui/components/editor-header.tsx deleted file mode 100644 index 33ac4a0dc6..0000000000 --- a/packages/editor/document-editor/src/ui/components/editor-header.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import { Editor } from "@tiptap/react"; -import { Archive, RefreshCw, Lock } from "lucide-react"; -import { IMarking, DocumentDetails } from "src/types/editor-types"; -import { FixedMenu } from "src/ui/menu"; -import { UploadImage } from "@plane/editor-core"; -import { AlertLabel } from "src/ui/components/alert-label"; -import { IVerticalDropdownItemProps, VerticalDropdownMenu } from "src/ui/components/vertical-dropdown-menu"; -import { SummaryPopover } from "src/ui/components/summary-popover"; -import { InfoPopover } from "src/ui/components/info-popover"; -import { getDate } from "src/utils/date-utils"; - -interface IEditorHeader { - editor: Editor; - KanbanMenuOptions: IVerticalDropdownItemProps[]; - sidePeekVisible: boolean; - setSidePeekVisible: (sidePeekState: boolean) => void; - markings: IMarking[]; - isLocked: boolean; - isArchived: boolean; - archivedAt?: Date; - readonly: boolean; - uploadFile?: UploadImage; - setIsSubmitting?: (isSubmitting: "submitting" | "submitted" | "saved") => void; - documentDetails: DocumentDetails; - isSubmitting?: "submitting" | "submitted" | "saved"; -} - -export const EditorHeader = (props: IEditorHeader) => { - const { - documentDetails, - archivedAt, - editor, - sidePeekVisible, - readonly, - setSidePeekVisible, - markings, - uploadFile, - setIsSubmitting, - KanbanMenuOptions, - isArchived, - isLocked, - isSubmitting, - } = props; - - return ( -
-
- -
- -
- {!readonly && uploadFile && ( - - )} -
- -
- {isLocked && ( - - )} - {isArchived && archivedAt && ( - - )} - - {!isLocked && !isArchived ? ( -
- {isSubmitting !== "submitted" && isSubmitting !== "saved" && ( - - )} - - {isSubmitting === "submitting" ? "Saving..." : "Saved"} - -
- ) : null} - {!isArchived && } - -
-
- ); -}; diff --git a/packages/editor/document-editor/src/ui/components/heading-component.tsx b/packages/editor/document-editor/src/ui/components/heading-component.tsx deleted file mode 100644 index ce3489418f..0000000000 --- a/packages/editor/document-editor/src/ui/components/heading-component.tsx +++ /dev/null @@ -1,47 +0,0 @@ -export const HeadingComp = ({ - heading, - onClick, -}: { - heading: string; - onClick: (event: React.MouseEvent) => void; -}) => ( -

- {heading} -

-); - -export const SubheadingComp = ({ - subHeading, - onClick, -}: { - subHeading: string; - onClick: (event: React.MouseEvent) => void; -}) => ( -

- {subHeading} -

-); - -export const HeadingThreeComp = ({ - heading, - onClick, -}: { - heading: string; - onClick: (event: React.MouseEvent) => void; -}) => ( -

- {heading} -

-); diff --git a/packages/editor/document-editor/src/ui/components/index.ts b/packages/editor/document-editor/src/ui/components/index.ts index 1496a3cf4f..4d2d76baac 100644 --- a/packages/editor/document-editor/src/ui/components/index.ts +++ b/packages/editor/document-editor/src/ui/components/index.ts @@ -1,9 +1 @@ -export * from "./alert-label"; -export * from "./content-browser"; -export * from "./editor-header"; -export * from "./heading-component"; -export * from "./info-popover"; export * from "./page-renderer"; -export * from "./summary-popover"; -export * from "./summary-side-bar"; -export * from "./vertical-dropdown-menu"; diff --git a/packages/editor/document-editor/src/ui/components/links/link-edit-view.tsx b/packages/editor/document-editor/src/ui/components/links/link-edit-view.tsx index 9719154399..0cee059dfe 100644 --- a/packages/editor/document-editor/src/ui/components/links/link-edit-view.tsx +++ b/packages/editor/document-editor/src/ui/components/links/link-edit-view.tsx @@ -115,11 +115,6 @@ export const LinkEditView = ({ const removeLink = () => { editor.view.dispatch(editor.state.tr.removeMark(from, to, editor.schema.marks.link)); linkRemoved.current = true; - viewProps.onActionCompleteHandler({ - title: "Link successfully removed", - message: "The link was removed from the text.", - type: "success", - }); viewProps.closeLinkView(); }; diff --git a/packages/editor/document-editor/src/ui/components/links/link-preview.tsx b/packages/editor/document-editor/src/ui/components/links/link-preview.tsx index ff3fd0263b..0bb719d93a 100644 --- a/packages/editor/document-editor/src/ui/components/links/link-preview.tsx +++ b/packages/editor/document-editor/src/ui/components/links/link-preview.tsx @@ -12,21 +12,11 @@ export const LinkPreview = ({ const removeLink = () => { editor.view.dispatch(editor.state.tr.removeMark(from, to, editor.schema.marks.link)); - viewProps.onActionCompleteHandler({ - title: "Link successfully removed", - message: "The link was removed from the text.", - type: "success", - }); viewProps.closeLinkView(); }; const copyLinkToClipboard = () => { navigator.clipboard.writeText(url); - viewProps.onActionCompleteHandler({ - title: "Link successfully copied", - message: "The link was copied to the clipboard.", - type: "success", - }); viewProps.closeLinkView(); }; diff --git a/packages/editor/document-editor/src/ui/components/links/link-view.tsx b/packages/editor/document-editor/src/ui/components/links/link-view.tsx index f1d22a68e2..9befc514cf 100644 --- a/packages/editor/document-editor/src/ui/components/links/link-view.tsx +++ b/packages/editor/document-editor/src/ui/components/links/link-view.tsx @@ -11,11 +11,6 @@ export interface LinkViewProps { to: number; url: string; closeLinkView: () => void; - onActionCompleteHandler: (action: { - title: string; - message: string; - type: "success" | "error" | "warning" | "info"; - }) => void; } export const LinkView = (props: LinkViewProps & { style: CSSProperties }) => { diff --git a/packages/editor/document-editor/src/ui/components/page-renderer.tsx b/packages/editor/document-editor/src/ui/components/page-renderer.tsx index 7c2717e807..a6b5eb5e8a 100644 --- a/packages/editor/document-editor/src/ui/components/page-renderer.tsx +++ b/packages/editor/document-editor/src/ui/components/page-renderer.tsx @@ -1,9 +1,8 @@ +import { useCallback, useRef, useState } from "react"; import { EditorContainer, EditorContentWrapper } from "@plane/editor-core"; import { Node } from "@tiptap/pm/model"; import { EditorView } from "@tiptap/pm/view"; import { Editor, ReactRenderer } from "@tiptap/react"; -import { useCallback, useRef, useState } from "react"; -import { DocumentDetails } from "src/types/editor-types"; import { LinkView, LinkViewProps } from "./links/link-view"; import { autoUpdate, @@ -15,40 +14,22 @@ import { useFloating, useInteractions, } from "@floating-ui/react"; +import BlockMenu from "../menu//block-menu"; type IPageRenderer = { - documentDetails: DocumentDetails; - updatePageTitle: (title: string) => void; editor: Editor; - onActionCompleteHandler: (action: { - title: string; - message: string; - type: "success" | "error" | "warning" | "info"; - }) => void; - editorClassNames: string; - editorContentCustomClassNames?: string; + editorContainerClassName: string; hideDragHandle?: () => void; - readonly: boolean; tabIndex?: number; }; export const PageRenderer = (props: IPageRenderer) => { - const { - documentDetails, - tabIndex, - editor, - editorClassNames, - editorContentCustomClassNames, - updatePageTitle, - readonly, - hideDragHandle, - } = props; - - const [pageTitle, setPagetitle] = useState(documentDetails.title); - + const { tabIndex, editor, hideDragHandle, editorContainerClassName } = props; + // states const [linkViewProps, setLinkViewProps] = useState(); const [isOpen, setIsOpen] = useState(false); const [coordinates, setCoordinates] = useState<{ x: number; y: number }>(); + const [cleanup, setCleanup] = useState(() => () => {}); const { refs, floatingStyles, context } = useFloating({ open: isOpen, @@ -63,18 +44,9 @@ export const PageRenderer = (props: IPageRenderer) => { const { getFloatingProps } = useInteractions([dismiss]); - const handlePageTitleChange = (title: string) => { - setPagetitle(title); - updatePageTitle(title); - }; - - const [cleanup, setcleanup] = useState(() => () => {}); - const floatingElementRef = useRef(null); - const closeLinkView = () => { - setIsOpen(false); - }; + const closeLinkView = () => setIsOpen(false); const handleLinkHover = useCallback( (event: React.MouseEvent) => { @@ -137,7 +109,6 @@ export const PageRenderer = (props: IPageRenderer) => { setCoordinates({ x: x - 300, y: y - 50 }); setIsOpen(true); setLinkViewProps({ - onActionCompleteHandler: props.onActionCompleteHandler, closeLinkView: closeLinkView, view: "LinkPreview", url: href, @@ -148,45 +119,32 @@ export const PageRenderer = (props: IPageRenderer) => { }); }); - setcleanup(cleanupFunc); + setCleanup(cleanupFunc); }, [editor, cleanup] ); return ( -
- {!readonly ? ( - handlePageTitleChange(e.target.value)} - className="-mt-2 w-full break-words border-none bg-custom-background pr-5 text-4xl font-bold outline-none" - value={pageTitle} - /> - ) : ( - handlePageTitleChange(e.target.value)} - className="-mt-2 w-full overflow-x-clip break-words border-none bg-custom-background pr-5 text-4xl font-bold outline-none" - value={pageTitle} - disabled - /> - )} -
- - + <> +
+ + + {editor && editor.isEditable && }
{isOpen && linkViewProps && coordinates && (
)} -
+ ); }; diff --git a/packages/editor/document-editor/src/ui/components/summary-side-bar.tsx b/packages/editor/document-editor/src/ui/components/summary-side-bar.tsx deleted file mode 100644 index 44ede3e8d5..0000000000 --- a/packages/editor/document-editor/src/ui/components/summary-side-bar.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Editor } from "@tiptap/react"; -import { IMarking } from "src/types/editor-types"; -import { ContentBrowser } from "src/ui/components/content-browser"; - -interface ISummarySideBarProps { - editor: Editor; - markings: IMarking[]; - sidePeekVisible: boolean; -} - -export const SummarySideBar = ({ editor, markings, sidePeekVisible }: ISummarySideBarProps) => ( -
- -
-); diff --git a/packages/editor/document-editor/src/ui/components/vertical-dropdown-menu.tsx b/packages/editor/document-editor/src/ui/components/vertical-dropdown-menu.tsx deleted file mode 100644 index 43843e5071..0000000000 --- a/packages/editor/document-editor/src/ui/components/vertical-dropdown-menu.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { LucideIconType } from "@plane/editor-core"; -import { CustomMenu } from "@plane/ui"; -import { MoreVertical } from "lucide-react"; - -type TMenuItems = - | "archive_page" - | "unarchive_page" - | "lock_page" - | "unlock_page" - | "copy_markdown" - | "close_page" - | "copy_page_link" - | "duplicate_page"; - -export interface IVerticalDropdownItemProps { - key: number; - type: TMenuItems; - Icon: LucideIconType; - label: string; - action: () => Promise | void; -} - -export interface IVerticalDropdownMenuProps { - items: IVerticalDropdownItemProps[]; -} - -const VerticalDropdownItem = ({ Icon, label, action }: IVerticalDropdownItemProps) => ( - - -
{label}
-
-); - -export const VerticalDropdownMenu = ({ items }: IVerticalDropdownMenuProps) => ( - } - > - {items.map((item) => ( - - ))} - -); diff --git a/packages/editor/document-editor/src/ui/extensions/index.tsx b/packages/editor/document-editor/src/ui/extensions/index.tsx index cedc3ed809..6c106176b7 100644 --- a/packages/editor/document-editor/src/ui/extensions/index.tsx +++ b/packages/editor/document-editor/src/ui/extensions/index.tsx @@ -6,17 +6,17 @@ import { UploadImage } from "@plane/editor-core"; export const DocumentEditorExtensions = ( uploadFile: UploadImage, - setHideDragHandle?: (hideDragHandlerFromDragDrop: () => void) => void, - setIsSubmitting?: (isSubmitting: "submitting" | "submitted" | "saved") => void + setHideDragHandle?: (hideDragHandlerFromDragDrop: () => void) => void ) => [ - SlashCommand(uploadFile, setIsSubmitting), + SlashCommand(uploadFile), DragAndDrop(setHideDragHandle), Placeholder.configure({ - placeholder: ({ node }) => { + placeholder: ({ editor, node }) => { if (node.type.name === "heading") { return `Heading ${node.attrs.level}`; } - if (node.type.name === "image" || node.type.name === "table") { + + if (editor.isActive("table") || editor.isActive("codeBlock") || editor.isActive("image")) { return ""; } diff --git a/packages/editor/document-editor/src/ui/index.tsx b/packages/editor/document-editor/src/ui/index.tsx index eb54a204bd..24e712d67b 100644 --- a/packages/editor/document-editor/src/ui/index.tsx +++ b/packages/editor/document-editor/src/ui/index.tsx @@ -1,187 +1,97 @@ -"use client"; import React, { useState } from "react"; -import { UploadImage, DeleteImage, RestoreImage, getEditorClassNames, useEditor } from "@plane/editor-core"; +import { + UploadImage, + DeleteImage, + RestoreImage, + getEditorClassNames, + useEditor, + EditorRefApi, + IMentionHighlight, + IMentionSuggestion, +} from "@plane/editor-core"; import { DocumentEditorExtensions } from "src/ui/extensions"; -import { IDuplicationConfig, IPageArchiveConfig, IPageLockConfig } from "src/types/menu-actions"; -import { EditorHeader } from "src/ui/components/editor-header"; -import { useEditorMarkings } from "src/hooks/use-editor-markings"; -import { SummarySideBar } from "src/ui/components/summary-side-bar"; -import { DocumentDetails } from "src/types/editor-types"; import { PageRenderer } from "src/ui/components/page-renderer"; -import { getMenuOptions } from "src/utils/menu-options"; -import { useRouter } from "next/router"; -import { FixedMenu } from "src"; interface IDocumentEditor { - // document info - documentDetails: DocumentDetails; - value: string; - rerenderOnPropsChange?: { - id: string; - description_html: string; + initialValue: string; + value?: string; + fileHandler: { + cancel: () => void; + delete: DeleteImage; + upload: UploadImage; + restore: RestoreImage; + }; + handleEditorReady?: (value: boolean) => void; + containerClassName?: string; + editorClassName?: string; + onChange: (json: object, html: string) => void; + forwardedRef?: React.MutableRefObject; + mentionHandler: { + highlights: () => Promise; + suggestions: () => Promise; }; - - // file operations - uploadFile: UploadImage; - deleteFile: DeleteImage; - restoreFile: RestoreImage; - cancelUploadImage: () => any; - - // editor state managers - onActionCompleteHandler: (action: { - title: string; - message: string; - type: "success" | "error" | "warning" | "info"; - }) => void; - customClassName?: string; - editorContentCustomClassNames?: string; - onChange: (json: any, html: string) => void; - setIsSubmitting?: (isSubmitting: "submitting" | "submitted" | "saved") => void; - setShouldShowAlert?: (showAlert: boolean) => void; - forwardedRef?: any; - updatePageTitle: (title: string) => void; - debouncedUpdatesEnabled?: boolean; - isSubmitting: "submitting" | "submitted" | "saved"; - - // embed configuration - duplicationConfig?: IDuplicationConfig; - pageLockConfig?: IPageLockConfig; - pageArchiveConfig?: IPageArchiveConfig; - tabIndex?: number; } -interface DocumentEditorProps extends IDocumentEditor { - forwardedRef?: React.Ref; -} - -interface EditorHandle { - clearEditor: () => void; - setEditorValue: (content: string) => void; - setEditorValueAtCursorPosition: (content: string) => void; -} -const DocumentEditor = ({ - documentDetails, - onChange, - debouncedUpdatesEnabled, - setIsSubmitting, - setShouldShowAlert, - editorContentCustomClassNames, - value, - uploadFile, - deleteFile, - restoreFile, - isSubmitting, - customClassName, - forwardedRef, - duplicationConfig, - pageLockConfig, - pageArchiveConfig, - updatePageTitle, - cancelUploadImage, - onActionCompleteHandler, - rerenderOnPropsChange, - tabIndex, -}: IDocumentEditor) => { - const { markings, updateMarkings } = useEditorMarkings(); - const [sidePeekVisible, setSidePeekVisible] = useState(true); - const router = useRouter(); - - const [hideDragHandleOnMouseLeave, setHideDragHandleOnMouseLeave] = React.useState<() => void>(() => {}); +const DocumentEditor = (props: IDocumentEditor) => { + const { + onChange, + initialValue, + value, + fileHandler, + containerClassName, + editorClassName = "", + mentionHandler, + handleEditorReady, + forwardedRef, + tabIndex, + } = props; + // states + const [hideDragHandleOnMouseLeave, setHideDragHandleOnMouseLeave] = useState<() => void>(() => {}); // this essentially sets the hideDragHandle function from the DragAndDrop extension as the Plugin // loads such that we can invoke it from react when the cursor leaves the container const setHideDragHandleFunction = (hideDragHandlerFromDragDrop: () => void) => { setHideDragHandleOnMouseLeave(() => hideDragHandlerFromDragDrop); }; - + // use editor const editor = useEditor({ onChange(json, html) { - updateMarkings(json); onChange(json, html); }, - onStart(json) { - updateMarkings(json); - }, - debouncedUpdatesEnabled, - restoreFile, - setIsSubmitting, - setShouldShowAlert, + editorClassName, + restoreFile: fileHandler.restore, + uploadFile: fileHandler.upload, + deleteFile: fileHandler.delete, + cancelUploadImage: fileHandler.cancel, + initialValue, value, - uploadFile, - deleteFile, - cancelUploadImage, - rerenderOnPropsChange, + handleEditorReady, forwardedRef, - extensions: DocumentEditorExtensions(uploadFile, setHideDragHandleFunction, setIsSubmitting), - }); - - if (!editor) { - return null; - } - - const KanbanMenuOptions = getMenuOptions({ - editor: editor, - router: router, - duplicationConfig: duplicationConfig, - pageLockConfig: pageLockConfig, - pageArchiveConfig: pageArchiveConfig, - onActionCompleteHandler, + mentionHandler, + extensions: DocumentEditorExtensions(fileHandler.upload, setHideDragHandleFunction), }); - const editorClassNames = getEditorClassNames({ + const editorContainerClassNames = getEditorClassNames({ noBorder: true, borderOnFocus: false, - customClassName, + containerClassName, }); if (!editor) return null; return ( -
- setSidePeekVisible(val)} - markings={markings} - uploadFile={uploadFile} - setIsSubmitting={setIsSubmitting} - isLocked={!pageLockConfig ? false : pageLockConfig.is_locked} - isArchived={!pageArchiveConfig ? false : pageArchiveConfig.is_archived} - archivedAt={pageArchiveConfig && pageArchiveConfig.archived_at} - documentDetails={documentDetails} - isSubmitting={isSubmitting} - /> -
- {uploadFile && } -
-
-
- -
-
- -
-
-
-
+ ); }; -const DocumentEditorWithRef = React.forwardRef((props, ref) => ( - +const DocumentEditorWithRef = React.forwardRef((props, ref) => ( + } /> )); DocumentEditorWithRef.displayName = "DocumentEditorWithRef"; diff --git a/packages/editor/document-editor/src/ui/menu/block-menu.tsx b/packages/editor/document-editor/src/ui/menu/block-menu.tsx new file mode 100644 index 0000000000..9703113f77 --- /dev/null +++ b/packages/editor/document-editor/src/ui/menu/block-menu.tsx @@ -0,0 +1,149 @@ +import { useCallback, useEffect, useRef } from "react"; +import tippy, { Instance } from "tippy.js"; +import { Copy, LucideIcon, Trash2 } from "lucide-react"; +import { Editor } from "@tiptap/react"; + +interface BlockMenuProps { + editor: Editor; +} + +export default function BlockMenu(props: BlockMenuProps) { + const { editor } = props; + const menuRef = useRef(null); + const popup = useRef(null); + + const handleClickDragHandle = useCallback((event: MouseEvent) => { + const target = event.target as HTMLElement; + if (target.matches(".drag-handle-dots") || target.matches(".drag-handle-dot")) { + event.preventDefault(); + + popup.current?.setProps({ + getReferenceClientRect: () => target.getBoundingClientRect(), + }); + + popup.current?.show(); + return; + } + + popup.current?.hide(); + return; + }, []); + + useEffect(() => { + if (menuRef.current) { + menuRef.current.remove(); + menuRef.current.style.visibility = "visible"; + + // @ts-expect-error - tippy types are incorrect + popup.current = tippy(document.body, { + getReferenceClientRect: null, + content: menuRef.current, + appendTo: () => document.querySelector(".frame-renderer"), + trigger: "manual", + interactive: true, + arrow: false, + placement: "left-start", + animation: "shift-away", + maxWidth: 500, + hideOnClick: true, + onShown: () => { + menuRef.current?.focus(); + }, + }); + } + + return () => { + popup.current?.destroy(); + popup.current = null; + }; + }, []); + + useEffect(() => { + const handleKeyDown = () => { + popup.current?.hide(); + }; + + const handleScroll = () => { + popup.current?.hide(); + }; + document.addEventListener("click", handleClickDragHandle); + document.addEventListener("keydown", handleKeyDown); + document.addEventListener("scroll", handleScroll, true); // Using capture phase + + return () => { + document.removeEventListener("click", handleClickDragHandle); + document.removeEventListener("keydown", handleKeyDown); + document.removeEventListener("scroll", handleScroll, true); + }; + }, [handleClickDragHandle]); + + const MENU_ITEMS: { + icon: LucideIcon; + key: string; + label: string; + onClick: (e: React.MouseEvent) => void; + isDisabled?: boolean; + }[] = [ + { + icon: Trash2, + key: "delete", + label: "Delete", + onClick: (e) => { + editor.chain().deleteSelection().focus().run(); + popup.current?.hide(); + e.preventDefault(); + e.stopPropagation(); + }, + }, + { + icon: Copy, + key: "duplicate", + label: "Duplicate", + isDisabled: editor.state.selection.content().content.firstChild?.type.name === "image", + onClick: (e) => { + const { view } = editor; + const { state } = view; + const { selection } = state; + + editor + .chain() + .insertContentAt(selection.to, selection.content().content.firstChild!.toJSON(), { + updateSelection: true, + }) + .focus(selection.to + 1, { scrollIntoView: false }) + .run(); + + popup.current?.hide(); + e.preventDefault(); + e.stopPropagation(); + }, + }, + ]; + + return ( +
+ {MENU_ITEMS.map((item) => { + // Skip rendering the button if it should be disabled + if (item.isDisabled && item.key === "duplicate") { + return null; + } + + return ( + + ); + })} +
+ ); +} diff --git a/packages/editor/document-editor/src/ui/menu/fixed-menu.tsx b/packages/editor/document-editor/src/ui/menu/fixed-menu.tsx deleted file mode 100644 index 397e8c576d..0000000000 --- a/packages/editor/document-editor/src/ui/menu/fixed-menu.tsx +++ /dev/null @@ -1,141 +0,0 @@ -import { Editor } from "@tiptap/react"; -import { - BoldItem, - BulletListItem, - isCellSelection, - cn, - CodeItem, - ImageItem, - ItalicItem, - NumberedListItem, - QuoteItem, - StrikeThroughItem, - TableItem, - UnderLineItem, - HeadingOneItem, - HeadingTwoItem, - HeadingThreeItem, - findTableAncestor, - EditorMenuItem, - UploadImage, -} from "@plane/editor-core"; - -export type BubbleMenuItem = EditorMenuItem; - -type EditorBubbleMenuProps = { - editor: Editor; - uploadFile: UploadImage; - setIsSubmitting?: (isSubmitting: "submitting" | "submitted" | "saved") => void; -}; - -export const FixedMenu = (props: EditorBubbleMenuProps) => { - const { editor, uploadFile, setIsSubmitting } = props; - - const basicMarkItems: BubbleMenuItem[] = [ - HeadingOneItem(editor), - HeadingTwoItem(editor), - HeadingThreeItem(editor), - BoldItem(editor), - ItalicItem(editor), - UnderLineItem(editor), - StrikeThroughItem(editor), - ]; - - const listItems: BubbleMenuItem[] = [BulletListItem(editor), NumberedListItem(editor)]; - - const userActionItems: BubbleMenuItem[] = [QuoteItem(editor), CodeItem(editor)]; - - function getComplexItems(): BubbleMenuItem[] { - const items: BubbleMenuItem[] = [TableItem(editor)]; - - items.push(ImageItem(editor, uploadFile, setIsSubmitting)); - return items; - } - - const complexItems: BubbleMenuItem[] = getComplexItems(); - - return ( -
-
- {basicMarkItems.map((item) => ( - - ))} -
-
- {listItems.map((item) => ( - - ))} -
-
- {userActionItems.map((item) => ( - - ))} -
-
- {complexItems.map((item) => ( - - ))} -
-
- ); -}; diff --git a/packages/editor/document-editor/src/ui/menu/index.tsx b/packages/editor/document-editor/src/ui/menu/index.tsx deleted file mode 100644 index 1c411fabfe..0000000000 --- a/packages/editor/document-editor/src/ui/menu/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { FixedMenu } from "./fixed-menu"; diff --git a/packages/editor/document-editor/src/ui/readonly/index.tsx b/packages/editor/document-editor/src/ui/readonly/index.tsx index 22099281ec..0e75c2db49 100644 --- a/packages/editor/document-editor/src/ui/readonly/index.tsx +++ b/packages/editor/document-editor/src/ui/readonly/index.tsx @@ -1,132 +1,53 @@ -import { getEditorClassNames, useReadOnlyEditor } from "@plane/editor-core"; -import { useRouter } from "next/router"; -import { useState, forwardRef, useEffect } from "react"; -import { EditorHeader } from "src/ui/components/editor-header"; +import { forwardRef, MutableRefObject } from "react"; +import { EditorReadOnlyRefApi, getEditorClassNames, IMentionHighlight, useReadOnlyEditor } from "@plane/editor-core"; +// components import { PageRenderer } from "src/ui/components/page-renderer"; -import { SummarySideBar } from "src/ui/components/summary-side-bar"; -import { useEditorMarkings } from "src/hooks/use-editor-markings"; -import { DocumentDetails } from "src/types/editor-types"; -import { IPageArchiveConfig, IPageLockConfig, IDuplicationConfig } from "src/types/menu-actions"; -import { getMenuOptions } from "src/utils/menu-options"; import { IssueWidgetPlaceholder } from "../extensions/widgets/issue-embed-widget"; interface IDocumentReadOnlyEditor { - value: string; - rerenderOnPropsChange?: { - id: string; - description_html: string; - }; - noBorder: boolean; - borderOnFocus: boolean; - customClassName: string; - documentDetails: DocumentDetails; - pageLockConfig?: IPageLockConfig; - pageArchiveConfig?: IPageArchiveConfig; - pageDuplicationConfig?: IDuplicationConfig; - onActionCompleteHandler: (action: { - title: string; - message: string; - type: "success" | "error" | "warning" | "info"; - }) => void; + initialValue: string; + containerClassName: string; + editorClassName?: string; tabIndex?: number; + handleEditorReady?: (value: boolean) => void; + mentionHandler: { + highlights: () => Promise; + }; + forwardedRef?: React.MutableRefObject; } -interface DocumentReadOnlyEditorProps extends IDocumentReadOnlyEditor { - forwardedRef?: React.Ref; -} - -interface EditorHandle { - clearEditor: () => void; - setEditorValue: (content: string) => void; -} - -const DocumentReadOnlyEditor = ({ - noBorder, - borderOnFocus, - customClassName, - value, - documentDetails, - forwardedRef, - pageDuplicationConfig, - pageLockConfig, - pageArchiveConfig, - rerenderOnPropsChange, - onActionCompleteHandler, - tabIndex, -}: DocumentReadOnlyEditorProps) => { - const router = useRouter(); - const [sidePeekVisible, setSidePeekVisible] = useState(true); - const { markings, updateMarkings } = useEditorMarkings(); - +const DocumentReadOnlyEditor = (props: IDocumentReadOnlyEditor) => { + const { + containerClassName, + editorClassName = "", + initialValue, + forwardedRef, + tabIndex, + handleEditorReady, + mentionHandler, + } = props; const editor = useReadOnlyEditor({ - value, + initialValue, + editorClassName, + mentionHandler, forwardedRef, - rerenderOnPropsChange, + handleEditorReady, extensions: [IssueWidgetPlaceholder()], }); - useEffect(() => { - if (editor) { - updateMarkings(editor.getJSON()); - } - }, [editor]); - if (!editor) { return null; } - const editorClassNames = getEditorClassNames({ - noBorder, - borderOnFocus, - customClassName, - }); - - const KanbanMenuOptions = getMenuOptions({ - editor: editor, - router: router, - pageArchiveConfig: pageArchiveConfig, - pageLockConfig: pageLockConfig, - duplicationConfig: pageDuplicationConfig, - onActionCompleteHandler, + const editorContainerClassName = getEditorClassNames({ + containerClassName, }); - return ( -
- -
-
- -
-
- Promise.resolve()} - readonly - editor={editor} - editorClassNames={editorClassNames} - documentDetails={documentDetails} - /> -
-
-
-
- ); + return ; }; -const DocumentReadOnlyEditorWithRef = forwardRef((props, ref) => ( - +const DocumentReadOnlyEditorWithRef = forwardRef((props, ref) => ( + } /> )); DocumentReadOnlyEditorWithRef.displayName = "DocumentReadOnlyEditorWithRef"; diff --git a/packages/editor/document-editor/src/utils/menu-actions.ts b/packages/editor/document-editor/src/utils/menu-actions.ts deleted file mode 100644 index 24eda5a057..0000000000 --- a/packages/editor/document-editor/src/utils/menu-actions.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Editor } from "@tiptap/core"; - -export const copyMarkdownToClipboard = (editor: Editor | null) => { - const markdownOutput = editor?.storage.markdown.getMarkdown(); - navigator.clipboard.writeText(markdownOutput); -}; - -export const CopyPageLink = () => { - if (window) { - navigator.clipboard.writeText(window.location.toString()); - } -}; diff --git a/packages/editor/document-editor/src/utils/menu-options.ts b/packages/editor/document-editor/src/utils/menu-options.ts deleted file mode 100644 index befed424db..0000000000 --- a/packages/editor/document-editor/src/utils/menu-options.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { Editor } from "@tiptap/react"; -import { Archive, ArchiveRestoreIcon, ClipboardIcon, Copy, Link, Lock, Unlock } from "lucide-react"; -import { NextRouter } from "next/router"; -import { IVerticalDropdownItemProps } from "src/ui/components/vertical-dropdown-menu"; -import { IDuplicationConfig, IPageArchiveConfig, IPageLockConfig } from "src/types/menu-actions"; -import { copyMarkdownToClipboard, CopyPageLink } from "src/utils/menu-actions"; - -export interface MenuOptionsProps { - editor: Editor; - router: NextRouter; - duplicationConfig?: IDuplicationConfig; - pageLockConfig?: IPageLockConfig; - pageArchiveConfig?: IPageArchiveConfig; - onActionCompleteHandler: (action: { - title: string; - message: string; - type: "success" | "error" | "warning" | "info"; - }) => void; -} - -export const getMenuOptions = ({ - editor, - router, - duplicationConfig, - pageLockConfig, - pageArchiveConfig, - onActionCompleteHandler, -}: MenuOptionsProps) => { - const KanbanMenuOptions: IVerticalDropdownItemProps[] = [ - { - key: 1, - type: "copy_markdown", - Icon: ClipboardIcon, - action: () => { - onActionCompleteHandler({ - title: "Markdown Copied", - message: "Page Copied as Markdown", - type: "success", - }); - copyMarkdownToClipboard(editor); - }, - label: "Copy markdown", - }, - // { - // key: 2, - // type: "close_page", - // Icon: XCircle, - // action: () => router.back(), - // label: "Close page", - // }, - { - key: 3, - type: "copy_page_link", - Icon: Link, - action: () => { - onActionCompleteHandler({ - title: "Link Copied", - message: "Link to the page has been copied to clipboard", - type: "success", - }); - CopyPageLink(); - }, - label: "Copy page link", - }, - ]; - - // If duplicateConfig is given, page duplication will be allowed - if (duplicationConfig) { - KanbanMenuOptions.push({ - key: KanbanMenuOptions.length++, - type: "duplicate_page", - Icon: Copy, - action: () => { - duplicationConfig - .action() - .then(() => { - onActionCompleteHandler({ - title: "Page Copied", - message: "Page has been copied as 'Copy of' followed by page title", - type: "success", - }); - }) - .catch(() => { - onActionCompleteHandler({ - title: "Copy Failed", - message: "Sorry, page cannot be copied, please try again later.", - type: "error", - }); - }); - }, - label: "Make a copy", - }); - } - // If Lock Configuration is given then, lock page option will be available in the kanban menu - if (pageLockConfig) { - KanbanMenuOptions.push({ - key: KanbanMenuOptions.length++, - type: pageLockConfig.is_locked ? "unlock_page" : "lock_page", - Icon: pageLockConfig.is_locked ? Unlock : Lock, - label: pageLockConfig.is_locked ? "Unlock page" : "Lock page", - action: () => { - const state = pageLockConfig.is_locked ? "Unlocked" : "Locked"; - pageLockConfig - .action() - .then(() => { - onActionCompleteHandler({ - title: `Page ${state}`, - message: `Page has been ${state}, no one will be able to change the state of lock except you.`, - type: "success", - }); - }) - .catch(() => { - onActionCompleteHandler({ - title: `Page cannot be ${state}`, - message: `Sorry, page cannot be ${state}, please try again later`, - type: "error", - }); - }); - }, - }); - } - - // Archiving will be visible in the menu bar config once the pageArchiveConfig is given. - if (pageArchiveConfig) { - KanbanMenuOptions.push({ - key: KanbanMenuOptions.length++, - type: pageArchiveConfig.is_archived ? "unarchive_page" : "archive_page", - Icon: pageArchiveConfig.is_archived ? ArchiveRestoreIcon : Archive, - label: pageArchiveConfig.is_archived ? "Restore page" : "Archive page", - action: () => { - const state = pageArchiveConfig.is_archived ? "Unarchived" : "Archived"; - pageArchiveConfig - .action() - .then(() => { - onActionCompleteHandler({ - title: `Page ${state}`, - message: `Page has been ${state}, you can checkout all archived tab and can restore the page later.`, - type: "success", - }); - }) - .catch(() => { - onActionCompleteHandler({ - title: `Page cannot be ${state}`, - message: `Sorry, page cannot be ${state}, please try again later.`, - type: "success", - }); - }); - }, - }); - } - - return KanbanMenuOptions; -}; diff --git a/packages/editor/extensions/package.json b/packages/editor/extensions/package.json index 711ab8a969..a57e4f78bf 100644 --- a/packages/editor/extensions/package.json +++ b/packages/editor/extensions/package.json @@ -29,6 +29,7 @@ }, "dependencies": { "@plane/editor-core": "*", + "@plane/ui": "*", "@tiptap/core": "^2.1.13", "@tiptap/pm": "^2.1.13", "@tiptap/react": "^2.1.13", diff --git a/packages/editor/extensions/src/extensions/drag-drop.tsx b/packages/editor/extensions/src/extensions/drag-drop.tsx index ce4088413c..1c24274185 100644 --- a/packages/editor/extensions/src/extensions/drag-drop.tsx +++ b/packages/editor/extensions/src/extensions/drag-drop.tsx @@ -1,9 +1,18 @@ import { Extension } from "@tiptap/core"; -import { PluginKey, NodeSelection, Plugin } from "@tiptap/pm/state"; -// @ts-ignore +import { NodeSelection, Plugin, PluginKey, TextSelection } from "@tiptap/pm/state"; +import { Fragment, Slice, Node } from "@tiptap/pm/model"; +// @ts-expect-error __serializeForClipboard's is not exported import { __serializeForClipboard, EditorView } from "@tiptap/pm/view"; -import React from "react"; + +export interface DragHandleOptions { + dragHandleWidth: number; + setHideDragHandle?: (hideDragHandlerFromDragDrop: () => void) => void; + scrollThreshold: { + up: number; + down: number; + }; +} function createDragHandleElement(): HTMLElement { const dragHandleElement = document.createElement("div"); @@ -29,13 +38,8 @@ function createDragHandleElement(): HTMLElement { return dragHandleElement; } -export interface DragHandleOptions { - dragHandleWidth: number; - setHideDragHandle?: (hideDragHandlerFromDragDrop: () => void) => void; -} - function absoluteRect(node: Element) { - const data = node?.getBoundingClientRect(); + const data = node.getBoundingClientRect(); return { top: data.top, @@ -57,55 +61,77 @@ function nodeDOMAtCoords(coords: { x: number; y: number }) { "pre", "blockquote", "h1, h2, h3", + ".table-wrapper", "[data-type=horizontalRule]", - ".tableWrapper", ].join(", ") ) ); } -function nodePosAtDOM(node: Element, view: EditorView) { - const boundingRect = node?.getBoundingClientRect(); - - if (node.nodeName === "IMG") { - return view.posAtCoords({ - left: boundingRect.left + 1, - top: boundingRect.top + 1, - })?.pos; - } - - if (node.nodeName === "PRE") { - return ( - view.posAtCoords({ - left: boundingRect.left + 1, - top: boundingRect.top + 1, - })?.pos! - 1 - ); - } +function nodePosAtDOM(node: Element, view: EditorView, options: DragHandleOptions) { + const boundingRect = node.getBoundingClientRect(); return view.posAtCoords({ - left: boundingRect.left + 1, + left: boundingRect.left + 50 + options.dragHandleWidth, top: boundingRect.top + 1, })?.inside; } +function calcNodePos(pos: number, view: EditorView) { + const $pos = view.state.doc.resolve(pos); + if ($pos.depth > 1) return $pos.before($pos.depth); + return pos; +} + function DragHandle(options: DragHandleOptions) { + let listType = ""; function handleDragStart(event: DragEvent, view: EditorView) { view.focus(); if (!event.dataTransfer) return; const node = nodeDOMAtCoords({ - x: event.clientX + options.dragHandleWidth + 50, + x: event.clientX + 50 + options.dragHandleWidth, y: event.clientY, }); if (!(node instanceof Element)) return; - const nodePos = nodePosAtDOM(node, view); - if (nodePos === null || nodePos === undefined || nodePos < 0) return; + let draggedNodePos = nodePosAtDOM(node, view, options); + if (draggedNodePos == null || draggedNodePos < 0) return; + draggedNodePos = calcNodePos(draggedNodePos, view); + + const { from, to } = view.state.selection; + const diff = from - to; + + const fromSelectionPos = calcNodePos(from, view); + let differentNodeSelected = false; + + const nodePos = view.state.doc.resolve(fromSelectionPos); + + // Check if nodePos points to the top level node + if (nodePos.node().type.name === "doc") differentNodeSelected = true; + else { + const nodeSelection = NodeSelection.create(view.state.doc, nodePos.before()); + // Check if the node where the drag event started is part of the current selection + differentNodeSelected = !( + draggedNodePos + 1 >= nodeSelection.$from.pos && draggedNodePos <= nodeSelection.$to.pos + ); + } + + if (!differentNodeSelected && diff !== 0 && !(view.state.selection instanceof NodeSelection)) { + const endSelection = NodeSelection.create(view.state.doc, to - 1); + const multiNodeSelection = TextSelection.create(view.state.doc, draggedNodePos, endSelection.$to.pos); + view.dispatch(view.state.tr.setSelection(multiNodeSelection)); + } else { + const nodeSelection = NodeSelection.create(view.state.doc, draggedNodePos); + view.dispatch(view.state.tr.setSelection(nodeSelection)); + } - view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, nodePos))); + // If the selected node is a list item, we need to save the type of the wrapping list e.g. OL or UL + if (view.state.selection instanceof NodeSelection && view.state.selection.node.type.name === "listItem") { + listType = node.parentElement!.tagName; + } const slice = view.state.selection.content(); const { dom, text } = __serializeForClipboard(view, slice); @@ -123,8 +149,6 @@ function DragHandle(options: DragHandleOptions) { function handleClick(event: MouseEvent, view: EditorView) { view.focus(); - view.dom.classList.remove("dragging"); - const node = nodeDOMAtCoords({ x: event.clientX + 50 + options.dragHandleWidth, y: event.clientY, @@ -132,11 +156,18 @@ function DragHandle(options: DragHandleOptions) { if (!(node instanceof Element)) return; - const nodePos = nodePosAtDOM(node, view); + let nodePos = nodePosAtDOM(node, view, options); + + if (nodePos === null || nodePos === undefined) return; - if (nodePos === null || nodePos === undefined || nodePos < 0) return; + // Adjust the nodePos to point to the start of the node, ensuring NodeSelection can be applied + nodePos = calcNodePos(nodePos, view); - view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, nodePos))); + // Use NodeSelection to select the node at the calculated position + const nodeSelection = NodeSelection.create(view.state.doc, nodePos); + + // Dispatch the transaction to update the selection + view.dispatch(view.state.tr.setSelection(nodeSelection)); } let dragHandleElement: HTMLElement | null = null; @@ -166,11 +197,15 @@ function DragHandle(options: DragHandleOptions) { handleClick(e, view); }); - dragHandleElement.addEventListener("dragstart", (e) => { - handleDragStart(e, view); - }); - dragHandleElement.addEventListener("click", (e) => { - handleClick(e, view); + dragHandleElement.addEventListener("drag", (e) => { + hideDragHandle(); + const a = document.querySelector(".frame-renderer"); + if (!a) return; + if (e.clientY < options.scrollThreshold.up) { + a.scrollBy({ top: -70, behavior: "smooth" }); + } else if (window.innerHeight - e.clientY < options.scrollThreshold.down) { + a.scrollBy({ top: 70, behavior: "smooth" }); + } }); hideDragHandle(); @@ -192,11 +227,11 @@ function DragHandle(options: DragHandleOptions) { } const node = nodeDOMAtCoords({ - x: event.clientX + options.dragHandleWidth, + x: event.clientX + 50 + options.dragHandleWidth, y: event.clientY, }); - if (!(node instanceof Element)) { + if (!(node instanceof Element) || node.matches("ul, ol")) { hideDragHandle(); return; } @@ -207,32 +242,74 @@ function DragHandle(options: DragHandleOptions) { const rect = absoluteRect(node); - rect.top += (lineHeight - 24) / 2; + rect.top += (lineHeight - 20) / 2; rect.top += paddingTop; // Li markers if (node.matches("ul:not([data-type=taskList]) li, ol li")) { - rect.left -= options.dragHandleWidth; + rect.top += 4; + rect.left -= 18; } rect.width = options.dragHandleWidth; if (!dragHandleElement) return; dragHandleElement.style.left = `${rect.left - rect.width}px`; - dragHandleElement.style.top = `${rect.top + 3}px`; + dragHandleElement.style.top = `${rect.top}px`; showDragHandle(); }, keydown: () => { hideDragHandle(); }, - wheel: () => { + mousewheel: () => { hideDragHandle(); }, - // dragging className is used for CSS - dragstart: (view) => { + dragenter: (view) => { view.dom.classList.add("dragging"); + hideDragHandle(); }, - drop: (view) => { + drop: (view, event) => { view.dom.classList.remove("dragging"); + hideDragHandle(); + let droppedNode: Node | null = null; + const dropPos = view.posAtCoords({ + left: event.clientX, + top: event.clientY, + }); + + if (!dropPos) return; + + if (view.state.selection instanceof NodeSelection) { + droppedNode = view.state.selection.node; + } + if (!droppedNode) return; + + const resolvedPos = view.state.doc.resolve(dropPos.pos); + let isDroppedInsideList = false; + + // Traverse up the document tree to find if we're inside a list item + for (let i = resolvedPos.depth; i > 0; i--) { + if (resolvedPos.node(i).type.name === "listItem") { + isDroppedInsideList = true; + break; + } + } + + // If the selected node is a list item and is not dropped inside a list, we need to wrap it inside
    tag otherwise ol list items will be transformed into ul list item when dropped + if ( + view.state.selection instanceof NodeSelection && + view.state.selection.node.type.name === "listItem" && + !isDroppedInsideList && + listType == "OL" + ) { + const text = droppedNode.textContent; + if (!text) return; + const paragraph = view.state.schema.nodes.paragraph?.createAndFill({}, view.state.schema.text(text)); + const listItem = view.state.schema.nodes.listItem?.createAndFill({}, paragraph); + + const newList = view.state.schema.nodes.orderedList?.createAndFill(null, listItem); + const slice = new Slice(Fragment.from(newList), 0, 0); + view.dragging = { slice, move: event.ctrlKey }; + } }, dragend: (view) => { view.dom.classList.remove("dragging"); @@ -250,6 +327,7 @@ export const DragAndDrop = (setHideDragHandle?: (hideDragHandlerFromDragDrop: () return [ DragHandle({ dragHandleWidth: 24, + scrollThreshold: { up: 300, down: 100 }, setHideDragHandle, }), ]; diff --git a/packages/editor/extensions/src/extensions/index.ts b/packages/editor/extensions/src/extensions/index.ts new file mode 100644 index 0000000000..9ceeb64936 --- /dev/null +++ b/packages/editor/extensions/src/extensions/index.ts @@ -0,0 +1,2 @@ +export * from "./drag-drop"; +export * from "./slash-commands"; diff --git a/packages/editor/extensions/src/extensions/slash-commands.tsx b/packages/editor/extensions/src/extensions/slash-commands.tsx index c52178b818..049accb278 100644 --- a/packages/editor/extensions/src/extensions/slash-commands.tsx +++ b/packages/editor/extensions/src/extensions/slash-commands.tsx @@ -54,7 +54,20 @@ const Command = Extension.create({ props.command({ editor, range }); }, allow({ editor }: { editor: Editor }) { - return !editor.isActive("table"); + const { selection } = editor.state; + + const parentNode = selection.$from.node(selection.$from.depth); + const blockType = parentNode.type.name; + + if (blockType === "codeBlock") { + return false; + } + + if (editor.isActive("table")) { + return false; + } + + return true; }, allowSpaces: true, }, @@ -71,11 +84,7 @@ const Command = Extension.create({ }); const getSuggestionItems = - ( - uploadFile: UploadImage, - setIsSubmitting?: (isSubmitting: "submitting" | "submitted" | "saved") => void, - additionalOptions?: Array - ) => + (uploadFile: UploadImage, additionalOptions?: Array) => ({ query }: { query: string }) => { let slashCommands: ISlashCommandItem[] = [ { @@ -186,7 +195,7 @@ const getSuggestionItems = searchTerms: ["img", "photo", "picture", "media"], icon: , command: ({ editor, range }: CommandProps) => { - insertImageCommand(editor, uploadFile, setIsSubmitting, range); + insertImageCommand(editor, uploadFile, null, range); }, }, { @@ -300,9 +309,9 @@ const CommandList = ({ items, command }: { items: CommandItemProps[]; command: a - - ))} -
- )} -
-
-
- {basicTextFormattingItems.map((item) => ( - {item.name}}> - - - ))} -
-
- {listFormattingItems.map((item) => ( - {item.name}}> - - - ))} -
-
- {userActionItems.map((item) => ( - {item.name}}> - - - ))} -
-
- {complexItems.map((item) => ( - {item.name}}> - - - ))} -
-
-
{props.submitButton}
-
-
- ); -}; diff --git a/packages/editor/lite-text-editor/src/ui/read-only/index.tsx b/packages/editor/lite-text-editor/src/ui/read-only/index.tsx index 9f81ba5d13..5ceb6956ec 100644 --- a/packages/editor/lite-text-editor/src/ui/read-only/index.tsx +++ b/packages/editor/lite-text-editor/src/ui/read-only/index.tsx @@ -1,66 +1,59 @@ import * as React from "react"; -import { EditorContainer, EditorContentWrapper, getEditorClassNames, useReadOnlyEditor } from "@plane/editor-core"; - -interface ICoreReadOnlyEditor { - value: string; - editorContentCustomClassNames?: string; - noBorder?: boolean; +import { + EditorContainer, + EditorContentWrapper, + EditorReadOnlyRefApi, + getEditorClassNames, + IMentionHighlight, + useReadOnlyEditor, +} from "@plane/editor-core"; + +export interface ILiteTextReadOnlyEditor { + initialValue: string; borderOnFocus?: boolean; - customClassName?: string; - mentionHighlights: string[]; + containerClassName?: string; + editorClassName?: string; + forwardedRef?: React.MutableRefObject; + mentionHandler: { + highlights: () => Promise; + }; tabIndex?: number; } -interface EditorCoreProps extends ICoreReadOnlyEditor { - forwardedRef?: React.Ref; -} - -interface EditorHandle { - clearEditor: () => void; - setEditorValue: (content: string) => void; -} - -const LiteReadOnlyEditor = ({ - editorContentCustomClassNames, - noBorder, - borderOnFocus, - customClassName, - value, +const LiteTextReadOnlyEditor = ({ + containerClassName, + editorClassName = "", + initialValue, forwardedRef, - mentionHighlights, + mentionHandler, tabIndex, -}: EditorCoreProps) => { +}: ILiteTextReadOnlyEditor) => { const editor = useReadOnlyEditor({ - value, + initialValue, + editorClassName, forwardedRef, - mentionHighlights, + mentionHandler, }); - const editorClassNames = getEditorClassNames({ - noBorder, - borderOnFocus, - customClassName, + const editorContainerClassName = getEditorClassNames({ + containerClassName, }); if (!editor) return null; return ( - +
- +
); }; -const LiteReadOnlyEditorWithRef = React.forwardRef((props, ref) => ( - +const LiteTextReadOnlyEditorWithRef = React.forwardRef((props, ref) => ( + } /> )); -LiteReadOnlyEditorWithRef.displayName = "LiteReadOnlyEditorWithRef"; +LiteTextReadOnlyEditorWithRef.displayName = "LiteReadOnlyEditorWithRef"; -export { LiteReadOnlyEditor, LiteReadOnlyEditorWithRef }; +export { LiteTextReadOnlyEditor, LiteTextReadOnlyEditorWithRef }; diff --git a/packages/editor/rich-text-editor/src/index.ts b/packages/editor/rich-text-editor/src/index.ts index eb745c45bc..ad6f043a19 100644 --- a/packages/editor/rich-text-editor/src/index.ts +++ b/packages/editor/rich-text-editor/src/index.ts @@ -1,4 +1,8 @@ export { RichTextEditor, RichTextEditorWithRef } from "src/ui"; -export { RichReadOnlyEditor, RichReadOnlyEditorWithRef } from "src/ui/read-only"; -export type { RichTextEditorProps, IRichTextEditor } from "src/ui"; -export type { IMentionHighlight, IMentionSuggestion } from "@plane/editor-core"; +export { RichTextReadOnlyEditor, RichTextReadOnlyEditorWithRef } from "src/ui/read-only"; + +export type { IRichTextEditor } from "src/ui"; + +export type { IRichTextReadOnlyEditor } from "src/ui/read-only"; +export type { IMentionSuggestion, IMentionHighlight } from "@plane/editor-core"; +export type { EditorRefApi, EditorReadOnlyRefApi } from "@plane/editor-core"; diff --git a/packages/editor/rich-text-editor/src/ui/extensions/index.tsx b/packages/editor/rich-text-editor/src/ui/extensions/index.tsx index 3d1da6cdab..57d2e0d41b 100644 --- a/packages/editor/rich-text-editor/src/ui/extensions/index.tsx +++ b/packages/editor/rich-text-editor/src/ui/extensions/index.tsx @@ -4,23 +4,21 @@ import Placeholder from "@tiptap/extension-placeholder"; export const RichTextEditorExtensions = ( uploadFile: UploadImage, - setIsSubmitting?: (isSubmitting: "submitting" | "submitted" | "saved") => void, dragDropEnabled?: boolean, setHideDragHandle?: (hideDragHandlerFromDragDrop: () => void) => void ) => [ - SlashCommand(uploadFile, setIsSubmitting), + SlashCommand(uploadFile), dragDropEnabled === true && DragAndDrop(setHideDragHandle), Placeholder.configure({ - placeholder: ({ node }) => { + placeholder: ({ editor, node }) => { if (node.type.name === "heading") { return `Heading ${node.attrs.level}`; } - if (node.type.name === "image" || node.type.name === "table") { + + if (editor.isActive("table") || editor.isActive("codeBlock") || editor.isActive("image")) { return ""; } - if (node.type.name === "codeBlock") { - return "Type in your code here..."; - } + return "Press '/' for commands..."; }, includeChildren: true, diff --git a/packages/editor/rich-text-editor/src/ui/index.tsx b/packages/editor/rich-text-editor/src/ui/index.tsx index 366fa471f0..33c14327ed 100644 --- a/packages/editor/rich-text-editor/src/ui/index.tsx +++ b/packages/editor/rich-text-editor/src/ui/index.tsx @@ -4,73 +4,56 @@ import { EditorContainer, EditorContentWrapper, getEditorClassNames, + IMentionHighlight, IMentionSuggestion, RestoreImage, UploadImage, useEditor, + EditorRefApi, } from "@plane/editor-core"; import * as React from "react"; import { RichTextEditorExtensions } from "src/ui/extensions"; import { EditorBubbleMenu } from "src/ui/menus/bubble-menu"; export type IRichTextEditor = { - value: string; - initialValue?: string; + initialValue: string; + value?: string | null; dragDropEnabled?: boolean; - uploadFile: UploadImage; - restoreFile: RestoreImage; - deleteFile: DeleteImage; - noBorder?: boolean; - borderOnFocus?: boolean; - cancelUploadImage?: () => any; - rerenderOnPropsChange?: { - id: string; - description_html: string; + fileHandler: { + cancel: () => void; + delete: DeleteImage; + upload: UploadImage; + restore: RestoreImage; }; - customClassName?: string; - editorContentCustomClassNames?: string; - onChange?: (json: any, html: string) => void; - setIsSubmitting?: (isSubmitting: "submitting" | "submitted" | "saved") => void; - setShouldShowAlert?: (showAlert: boolean) => void; - forwardedRef?: any; + id?: string; + containerClassName?: string; + editorClassName?: string; + onChange?: (json: object, html: string) => void; + forwardedRef?: React.MutableRefObject; debouncedUpdatesEnabled?: boolean; - mentionHighlights?: string[]; - mentionSuggestions?: IMentionSuggestion[]; + mentionHandler: { + highlights: () => Promise; + suggestions: () => Promise; + }; tabIndex?: number; }; -export interface RichTextEditorProps extends IRichTextEditor { - forwardedRef?: React.Ref; -} - -interface EditorHandle { - clearEditor: () => void; - setEditorValue: (content: string) => void; - setEditorValueAtCursorPosition: (content: string) => void; -} +const RichTextEditor = (props: IRichTextEditor) => { + const { + onChange, + dragDropEnabled, + initialValue, + value, + fileHandler, + containerClassName, + editorClassName = "", + forwardedRef, + // rerenderOnPropsChange, + id = "", + tabIndex, + mentionHandler, + } = props; -const RichTextEditor = ({ - onChange, - dragDropEnabled, - debouncedUpdatesEnabled, - setIsSubmitting, - setShouldShowAlert, - editorContentCustomClassNames, - value, - initialValue, - uploadFile, - deleteFile, - noBorder, - cancelUploadImage, - borderOnFocus, - customClassName, - restoreFile, - forwardedRef, - mentionHighlights, - rerenderOnPropsChange, - mentionSuggestions, - tabIndex, -}: RichTextEditorProps) => { const [hideDragHandleOnMouseLeave, setHideDragHandleOnMouseLeave] = React.useState<() => void>(() => {}); // this essentially sets the hideDragHandle function from the DragAndDrop extension as the Plugin @@ -80,50 +63,45 @@ const RichTextEditor = ({ }; const editor = useEditor({ + id, + editorClassName, + restoreFile: fileHandler.restore, + uploadFile: fileHandler.upload, + deleteFile: fileHandler.delete, + cancelUploadImage: fileHandler.cancel, onChange, - debouncedUpdatesEnabled, - setIsSubmitting, - setShouldShowAlert, + initialValue, value, - uploadFile, - cancelUploadImage, - deleteFile, - restoreFile, forwardedRef, - rerenderOnPropsChange, - extensions: RichTextEditorExtensions(uploadFile, setIsSubmitting, dragDropEnabled, setHideDragHandleFunction), - mentionHighlights, - mentionSuggestions, + // rerenderOnPropsChange, + extensions: RichTextEditorExtensions(fileHandler.upload, dragDropEnabled, setHideDragHandleFunction), + mentionHandler, }); - const editorClassNames = getEditorClassNames({ - noBorder, - borderOnFocus, - customClassName, + const editorContainerClassName = getEditorClassNames({ + noBorder: true, + borderOnFocus: false, + containerClassName, }); - // React.useEffect(() => { - // if (editor && initialValue && editor.getHTML() != initialValue) editor.commands.setContent(initialValue); - // }, [editor, initialValue]); - // if (!editor) return null; return ( - + {editor && }
- +
); }; -const RichTextEditorWithRef = React.forwardRef((props, ref) => ( - +const RichTextEditorWithRef = React.forwardRef((props, ref) => ( + } /> )); RichTextEditorWithRef.displayName = "RichTextEditorWithRef"; diff --git a/packages/editor/rich-text-editor/src/ui/read-only/index.tsx b/packages/editor/rich-text-editor/src/ui/read-only/index.tsx index 9aa3087315..3220c477ed 100644 --- a/packages/editor/rich-text-editor/src/ui/read-only/index.tsx +++ b/packages/editor/rich-text-editor/src/ui/read-only/index.tsx @@ -1,62 +1,54 @@ "use client"; -import { EditorContainer, EditorContentWrapper, getEditorClassNames, useReadOnlyEditor } from "@plane/editor-core"; +import { + EditorReadOnlyRefApi, + EditorContainer, + EditorContentWrapper, + getEditorClassNames, + IMentionHighlight, + useReadOnlyEditor, +} from "@plane/editor-core"; import * as React from "react"; -interface IRichTextReadOnlyEditor { - value: string; - editorContentCustomClassNames?: string; - noBorder?: boolean; - borderOnFocus?: boolean; - customClassName?: string; - mentionHighlights?: string[]; +export interface IRichTextReadOnlyEditor { + initialValue: string; + containerClassName?: string; + editorClassName?: string; tabIndex?: number; + forwardedRef?: React.MutableRefObject; + mentionHandler: { + highlights: () => Promise; + }; } -interface RichTextReadOnlyEditorProps extends IRichTextReadOnlyEditor { - forwardedRef?: React.Ref; -} - -interface EditorHandle { - clearEditor: () => void; - setEditorValue: (content: string) => void; -} +const RichTextReadOnlyEditor = (props: IRichTextReadOnlyEditor) => { + const { containerClassName, editorClassName = "", initialValue, forwardedRef, mentionHandler } = props; -const RichReadOnlyEditor = ({ - editorContentCustomClassNames, - noBorder, - borderOnFocus, - customClassName, - value, - forwardedRef, - mentionHighlights, -}: RichTextReadOnlyEditorProps) => { const editor = useReadOnlyEditor({ - value, + initialValue, + editorClassName, forwardedRef, - mentionHighlights, + mentionHandler, }); - const editorClassNames = getEditorClassNames({ - noBorder, - borderOnFocus, - customClassName, + const editorContainerClassName = getEditorClassNames({ + containerClassName, }); if (!editor) return null; return ( - +
- +
); }; -const RichReadOnlyEditorWithRef = React.forwardRef((props, ref) => ( - +const RichTextReadOnlyEditorWithRef = React.forwardRef((props, ref) => ( + } /> )); -RichReadOnlyEditorWithRef.displayName = "RichReadOnlyEditorWithRef"; +RichTextReadOnlyEditorWithRef.displayName = "RichReadOnlyEditorWithRef"; -export { RichReadOnlyEditor, RichReadOnlyEditorWithRef }; +export { RichTextReadOnlyEditor, RichTextReadOnlyEditorWithRef }; diff --git a/packages/types/src/cycle/cycle.d.ts b/packages/types/src/cycle/cycle.d.ts index 28be2ec2a4..e93d6e4443 100644 --- a/packages/types/src/cycle/cycle.d.ts +++ b/packages/types/src/cycle/cycle.d.ts @@ -97,10 +97,6 @@ export type SelectCycleType = | (ICycle & { actionType: "edit" | "delete" | "create-issue" }) | undefined; -export type SelectIssue = - | (TIssue & { actionType: "edit" | "delete" | "create" }) - | null; - export type CycleDateCheckData = { start_date: string; end_date: string; diff --git a/packages/types/src/cycle/index.ts b/packages/types/src/cycle/index.d.ts similarity index 100% rename from packages/types/src/cycle/index.ts rename to packages/types/src/cycle/index.d.ts diff --git a/packages/types/src/dashboard.ts b/packages/types/src/dashboard.d.ts similarity index 96% rename from packages/types/src/dashboard.ts rename to packages/types/src/dashboard.d.ts index be7d7b3be7..9abd1bf22c 100644 --- a/packages/types/src/dashboard.ts +++ b/packages/types/src/dashboard.d.ts @@ -1,17 +1,9 @@ +import { EDurationFilters } from "./enums"; import { IIssueActivity, TIssuePriorities } from "./issues"; import { TIssue } from "./issues/issue"; import { TIssueRelationTypes } from "./issues/issue_relation"; import { TStateGroups } from "./state"; -enum EDurationFilters { - NONE = "none", - TODAY = "today", - THIS_WEEK = "this_week", - THIS_MONTH = "this_month", - THIS_YEAR = "this_year", - CUSTOM = "custom", -} - export type TWidgetKeys = | "overview_stats" | "assigned_issues" diff --git a/packages/types/src/enums.ts b/packages/types/src/enums.ts index 259f13e9bc..a4d098506e 100644 --- a/packages/types/src/enums.ts +++ b/packages/types/src/enums.ts @@ -4,3 +4,23 @@ export enum EUserProjectRoles { MEMBER = 15, ADMIN = 20, } + +// project pages +export enum EPageAccess { + PUBLIC = 0, + PRIVATE = 1, +} + +export enum EDurationFilters { + NONE = "none", + TODAY = "today", + THIS_WEEK = "this_week", + THIS_MONTH = "this_month", + THIS_YEAR = "this_year", + CUSTOM = "custom", +} + +export enum EIssueCommentAccessSpecifier { + EXTERNAL = "EXTERNAL", + INTERNAL = "INTERNAL", +} diff --git a/packages/types/src/issues/activity/issue_comment.d.ts b/packages/types/src/issues/activity/issue_comment.d.ts index 45d34be082..f361ea7201 100644 --- a/packages/types/src/issues/activity/issue_comment.d.ts +++ b/packages/types/src/issues/activity/issue_comment.d.ts @@ -4,6 +4,7 @@ import { TIssueActivityIssueDetail, TIssueActivityUserDetail, } from "./base"; +import { EIssueCommentAccessSpecifier } from "../../enums"; export type TIssueComment = { id: string; @@ -20,14 +21,13 @@ export type TIssueComment = { created_by: string | undefined; updated_by: string | undefined; attachments: any[]; - comment_reactions: any[]; comment_stripped: string; comment_html: string; comment_json: object; external_id: string | undefined; external_source: string | undefined; - access: "EXTERNAL" | "INTERNAL"; + access: EIssueCommentAccessSpecifier; }; export type TIssueCommentMap = { diff --git a/packages/types/src/module/index.ts b/packages/types/src/module/index.d.ts similarity index 100% rename from packages/types/src/module/index.ts rename to packages/types/src/module/index.d.ts diff --git a/packages/types/src/module/modules.d.ts b/packages/types/src/module/modules.d.ts index 95b084f2f9..0019781bad 100644 --- a/packages/types/src/module/modules.d.ts +++ b/packages/types/src/module/modules.d.ts @@ -1,4 +1,11 @@ -import type { TIssue, IIssueFilterOptions, ILinkDetails } from "@plane/types"; +import type { + TIssue, + IIssueFilterOptions, + ILinkDetails, + TAssigneesDistribution, + TCompletionChartDistribution, + TLabelsDistribution, +} from "@plane/types"; export type TModuleStatus = | "backlog" @@ -69,7 +76,3 @@ export type ModuleLink = { export type SelectModuleType = | (IModule & { actionType: "edit" | "delete" | "create-issue" }) | undefined; - -export type SelectIssue = - | (TIssue & { actionType: "edit" | "delete" | "create" }) - | undefined; diff --git a/packages/types/src/notifications.d.ts b/packages/types/src/notifications.d.ts index 652e2776f5..571b757655 100644 --- a/packages/types/src/notifications.d.ts +++ b/packages/types/src/notifications.d.ts @@ -36,7 +36,7 @@ export interface IUserNotification { } export interface Data { - issue: IIssueLite; + issue: INotificationIssueLite; issue_activity: { actor: string; field: string; @@ -48,7 +48,7 @@ export interface Data { }; } -export interface IIssueLite { +export interface INotificationIssueLite { id: string; name: string; identifier: string; diff --git a/packages/types/src/pages.d.ts b/packages/types/src/pages.d.ts index 6e1e78be52..a1df4527ea 100644 --- a/packages/types/src/pages.d.ts +++ b/packages/types/src/pages.d.ts @@ -1,64 +1,50 @@ -// types -import { - TIssue, - IIssueLabel, - IWorkspaceLite, - IProjectLite, -} from "@plane/types"; +import { EPageAccess } from "./enums"; -export interface IPage { - access: number; - archived_at: string | null; - blocks: IPageBlock[]; - color: string; - created_at: string | null; - created_by: string; - description: string; - description_html: string; - description_stripped: string | null; - id: string; +export type TPage = { + access: EPageAccess | undefined; + archived_at: string | null | undefined; + color: string | undefined; + created_at: Date | undefined; + created_by: string | undefined; + description_html: string | undefined; + id: string | undefined; is_favorite: boolean; is_locked: boolean; - label_details: IIssueLabel[]; - labels: string[]; - name: string; - owned_by: string; - project: string; - project_detail: IProjectLite; - updated_at: string | null; - updated_by: string; - workspace: string; - workspace_detail: IWorkspaceLite; -} + labels: string[] | undefined; + name: string | undefined; + owned_by: string | undefined; + project: string | undefined; + updated_at: Date | undefined; + updated_by: string | undefined; + view_props: TPageViewProps | undefined; + workspace: string | undefined; +}; -export interface IRecentPages { - today: string[]; - yesterday: string[]; - this_week: string[]; - older: string[]; - [key: string]: string[]; -} +export type TPageViewProps = { + full_width?: boolean; +}; -export interface IPageBlock { - completed_at: Date | null; - created_at: Date; - created_by: string; - description: any; - description_html: any; - description_stripped: any; - id: string; - issue: string | null; - issue_detail: TIssue | null; - name: string; - page: string; - project: string; - project_detail: IProjectLite; - sort_order: number; - sync: boolean; - updated_at: Date; - updated_by: string; - workspace: string; - workspace_detail: IWorkspaceLite; -} +// page filters +export type TPageNavigationTabs = "public" | "private" | "archived"; -export type TPageViewProps = "list" | "detailed" | "masonry"; +export type TPageFiltersSortKey = + | "name" + | "created_at" + | "updated_at" + | "opened_at"; + +export type TPageFiltersSortBy = "asc" | "desc"; + +export type TPageFilterProps = { + created_at?: string[] | null; + created_by?: string[] | null; + favorites?: boolean; + labels?: string[] | null; +}; + +export type TPageFilters = { + searchQuery: string; + sortKey: TPageFiltersSortKey; + sortBy: TPageFiltersSortBy; + filters?: TPageFilterProps; +}; diff --git a/packages/ui/src/form-fields/textarea.tsx b/packages/ui/src/form-fields/textarea.tsx index b93c1aba8c..271b76d83a 100644 --- a/packages/ui/src/form-fields/textarea.tsx +++ b/packages/ui/src/form-fields/textarea.tsx @@ -1,4 +1,6 @@ import * as React from "react"; +// helpers +import { cn } from "../../helpers"; export interface TextAreaProps extends React.TextareaHTMLAttributes { mode?: "primary" | "transparent"; @@ -46,13 +48,17 @@ const TextArea = React.forwardRef((props, re value={value} rows={rows} cols={cols} - className={`no-scrollbar w-full bg-transparent px-3 py-2 placeholder-custom-text-400 outline-none ${ - mode === "primary" - ? "rounded-md border-[0.5px] border-custom-border-200" - : mode === "transparent" - ? "focus:ring-theme rounded border-none bg-transparent ring-0 transition-all focus:ring-1" - : "" - } ${hasError ? "border-red-500" : ""} ${hasError && mode === "primary" ? "bg-red-100" : ""} ${className}`} + className={cn( + "no-scrollbar w-full bg-transparent px-3 py-2 placeholder-custom-text-400 outline-none", + { + "rounded-md border-[0.5px] border-custom-border-200": mode === "primary", + "focus:ring-theme rounded border-none bg-transparent ring-0 transition-all focus:ring-1": + mode === "transparent", + "border-red-500": hasError, + "bg-red-100": hasError && mode === "primary", + }, + className + )} {...rest} /> ); diff --git a/space/components/editor/index.ts b/space/components/editor/index.ts new file mode 100644 index 0000000000..4ec0141e20 --- /dev/null +++ b/space/components/editor/index.ts @@ -0,0 +1,4 @@ +export * from "./lite-text-editor"; +export * from "./lite-text-read-only-editor"; +export * from "./rich-text-read-only-editor"; +export * from "./toolbar"; diff --git a/space/components/editor/lite-text-editor.tsx b/space/components/editor/lite-text-editor.tsx new file mode 100644 index 0000000000..677a342571 --- /dev/null +++ b/space/components/editor/lite-text-editor.tsx @@ -0,0 +1,76 @@ +import React from "react"; +// editor +import { EditorRefApi, ILiteTextEditor, LiteTextEditorWithRef } from "@plane/lite-text-editor"; +// components +import { IssueCommentToolbar } from "@/components/editor"; +// helpers +import { cn } from "@/helpers/common.helper"; +import { isEmptyHtmlString } from "@/helpers/string.helper"; +// hooks +import { useMention } from "@/hooks/use-mention"; +// services +import fileService from "@/services/file.service"; + +interface LiteTextEditorWrapperProps extends Omit { + workspaceSlug: string; + workspaceId: string; + isSubmitting?: boolean; + showSubmitButton?: boolean; +} + +export const LiteTextEditor = React.forwardRef((props, ref) => { + const { + containerClassName, + workspaceSlug, + workspaceId, + isSubmitting = false, + showSubmitButton = true, + ...rest + } = props; + // use-mention + const { mentionHighlights } = useMention(); + + function isMutableRefObject(ref: React.ForwardedRef): ref is React.MutableRefObject { + return !!ref && typeof ref === "object" && "current" in ref; + } + const isEmpty = + props.initialValue === "" || + props.initialValue?.trim() === "" || + props.initialValue === "

" || + isEmptyHtmlString(props.initialValue ?? ""); + + return ( +
+ + { + if (isMutableRefObject(ref)) { + ref.current?.executeMenuItemCommand(key); + } + }} + isSubmitting={isSubmitting} + showSubmitButton={showSubmitButton} + handleSubmit={(e) => rest.onEnterKeyPress?.(e)} + isCommentEmpty={isEmpty} + editorRef={isMutableRefObject(ref) ? ref : null} + /> +
+ ); +}); + +LiteTextEditor.displayName = "LiteTextEditor"; diff --git a/space/components/editor/lite-text-read-only-editor.tsx b/space/components/editor/lite-text-read-only-editor.tsx new file mode 100644 index 0000000000..6b16a0b074 --- /dev/null +++ b/space/components/editor/lite-text-read-only-editor.tsx @@ -0,0 +1,29 @@ +import React from "react"; +// editor +import { EditorReadOnlyRefApi, ILiteTextReadOnlyEditor, LiteTextReadOnlyEditorWithRef } from "@plane/lite-text-editor"; +// helpers +import { cn } from "@/helpers/common.helper"; +// hooks +import { useMention } from "@/hooks/use-mention"; + +interface LiteTextReadOnlyEditorWrapperProps extends Omit {} + +export const LiteTextReadOnlyEditor = React.forwardRef( + ({ ...props }, ref) => { + const { mentionHighlights } = useMention(); + + return ( + + ); + } +); + +LiteTextReadOnlyEditor.displayName = "LiteTextReadOnlyEditor"; diff --git a/space/components/editor/rich-text-read-only-editor.tsx b/space/components/editor/rich-text-read-only-editor.tsx new file mode 100644 index 0000000000..562e635814 --- /dev/null +++ b/space/components/editor/rich-text-read-only-editor.tsx @@ -0,0 +1,27 @@ +import React from "react"; +// editor +import { EditorReadOnlyRefApi, IRichTextReadOnlyEditor, RichTextReadOnlyEditorWithRef } from "@plane/rich-text-editor"; +// helpers +import { cn } from "@/helpers/common.helper"; +// hooks +import { useMention } from "@/hooks/use-mention"; + +interface RichTextReadOnlyEditorWrapperProps extends Omit {} + +export const RichTextReadOnlyEditor = React.forwardRef( + ({ ...props }, ref) => { + const { mentionHighlights } = useMention(); + + return ( + + ); + } +); + +RichTextReadOnlyEditor.displayName = "RichTextReadOnlyEditor"; diff --git a/space/components/editor/toolbar.tsx b/space/components/editor/toolbar.tsx new file mode 100644 index 0000000000..19bbdab9a7 --- /dev/null +++ b/space/components/editor/toolbar.tsx @@ -0,0 +1,110 @@ +import React, { useEffect, useState, useCallback } from "react"; +// editor +import { EditorMenuItemNames, EditorRefApi } from "@plane/lite-text-editor"; +// ui +import { Button, Tooltip } from "@plane/ui"; +// constants +import { TOOLBAR_ITEMS } from "@/constants/editor"; +// helpers +import { cn } from "@/helpers/common.helper"; + +type Props = { + executeCommand: (commandName: EditorMenuItemNames) => void; + handleSubmit: (event: React.MouseEvent) => void; + isCommentEmpty: boolean; + isSubmitting: boolean; + showSubmitButton: boolean; + editorRef: React.MutableRefObject | null; +}; + +const toolbarItems = TOOLBAR_ITEMS.lite; + +export const IssueCommentToolbar: React.FC = (props) => { + const { executeCommand, handleSubmit, isCommentEmpty, editorRef, isSubmitting, showSubmitButton } = props; + // states + const [activeStates, setActiveStates] = useState>({}); + + // Function to update active states + const updateActiveStates = useCallback(() => { + if (editorRef?.current) { + const newActiveStates: Record = {}; + Object.values(toolbarItems) + .flat() + .forEach((item) => { + // Assert that editorRef.current is not null + newActiveStates[item.key] = (editorRef.current as EditorRefApi).isMenuItemActive(item.key); + }); + setActiveStates(newActiveStates); + } + }, [editorRef]); + + // useEffect to call updateActiveStates when isActive prop changes + useEffect(() => { + if (!editorRef?.current) return; + const unsubscribe = editorRef.current.onStateChange(updateActiveStates); + updateActiveStates(); + return () => unsubscribe(); + }, [editorRef, updateActiveStates]); + + return ( +
+
+
+ {Object.keys(toolbarItems).map((key, index) => ( +
+ {toolbarItems[key].map((item) => ( + + {item.name} + {item.shortcut && {item.shortcut.join(" + ")}} +

+ } + > + +
+ ))} +
+ ))} +
+ {showSubmitButton && ( +
+ +
+ )} +
+
+ ); +}; diff --git a/space/components/issues/peek-overview/comment/add-comment.tsx b/space/components/issues/peek-overview/comment/add-comment.tsx index 6df72e2a87..8ec5b125a7 100644 --- a/space/components/issues/peek-overview/comment/add-comment.tsx +++ b/space/components/issues/peek-overview/comment/add-comment.tsx @@ -2,19 +2,15 @@ import React, { useRef } from "react"; import { observer } from "mobx-react-lite"; import { useRouter } from "next/router"; import { useForm, Controller } from "react-hook-form"; +// components +import { EditorRefApi } from "@plane/lite-text-editor"; +import { LiteTextEditor } from "@/components/editor/lite-text-editor"; +// hooks +import useToast from "@/hooks/use-toast"; // lib -import { LiteTextEditorWithRef } from "@plane/lite-text-editor"; -import { Button } from "@plane/ui"; import { useMobxStore } from "@/lib/mobx/store-provider"; -// hooks -import fileService from "@/services/file.service"; -import { RootStore } from "@/store/root"; -import useToast from "hooks/use-toast"; -// ui // types -import { Comment } from "types/issue"; -// components -// service +import { Comment } from "@/types/issue"; const defaultValues: Partial = { comment_html: "", @@ -24,9 +20,20 @@ type Props = { disabled?: boolean; }; -export const AddComment: React.FC = observer((props) => { - const { disabled = false } = props; - +export const AddComment: React.FC = observer(() => { + // const { disabled = false } = props; + // refs + const editorRef = useRef(null); + // router + const router = useRouter(); + const { workspace_slug, project_slug } = router.query; + // store hooks + const { project } = useMobxStore(); + const { user: userStore, issueDetails: issueDetailStore } = useMobxStore(); + // derived values + const workspaceId = project.workspace?.id; + const issueId = issueDetailStore.peekId; + // form info const { handleSubmit, control, @@ -34,37 +41,25 @@ export const AddComment: React.FC = observer((props) => { formState: { isSubmitting }, reset, } = useForm({ defaultValues }); - - const router = useRouter(); - const { project }: RootStore = useMobxStore(); - const workspaceId = project.workspace?.id; - - const { workspace_slug, project_slug } = router.query as { workspace_slug: string; project_slug: string }; - - const { user: userStore, issueDetails: issueDetailStore } = useMobxStore(); - - const issueId = issueDetailStore.peekId; - - const editorRef = useRef(null); - + // toast alert const { setToastAlert } = useToast(); const onSubmit = async (formData: Comment) => { if (!workspace_slug || !project_slug || !issueId || isSubmitting || !formData.comment_html) return; await issueDetailStore - .addIssueComment(workspace_slug, project_slug, issueId, formData) + .addIssueComment(workspace_slug.toString(), project_slug.toString(), issueId, formData) .then(() => { reset(defaultValues); editorRef.current?.clearEditor(); }) - .catch(() => { + .catch(() => setToastAlert({ type: "error", title: "Error!", message: "Comment could not be posted. Please try again.", - }); - }); + }) + ); }; return ( @@ -74,43 +69,18 @@ export const AddComment: React.FC = observer((props) => { name="comment_html" control={control} render={({ field: { value, onChange } }) => ( - { - userStore.requiredLogin(() => { - handleSubmit(onSubmit)(e); - }); - }} - cancelUploadImage={fileService.cancelUpload} - uploadFile={fileService.getUploadFileFunction(workspace_slug as string)} - deleteFile={fileService.getDeleteImageFunction(workspaceId as string)} - restoreFile={fileService.getRestoreImageFunction(workspaceId as string)} + userStore.requiredLogin(() => handleSubmit(onSubmit)(e))} + workspaceId={workspaceId as string} + workspaceSlug={workspace_slug as string} ref={editorRef} - value={ + initialValue={ !value || value === "" || (typeof value === "object" && Object.keys(value).length === 0) ? watch("comment_html") : value } - customClassName="p-2" - editorContentCustomClassNames="min-h-[35px]" - debouncedUpdatesEnabled={false} - onChange={(comment_json: unknown, comment_html: string) => { - onChange(comment_html); - }} - submitButton={ - - } + onChange={(comment_json, comment_html) => onChange(comment_html)} + isSubmitting={isSubmitting} /> )} /> diff --git a/space/components/issues/peek-overview/comment/comment-detail-card.tsx b/space/components/issues/peek-overview/comment/comment-detail-card.tsx index 3db64bbd1d..e1a1394135 100644 --- a/space/components/issues/peek-overview/comment/comment-detail-card.tsx +++ b/space/components/issues/peek-overview/comment/comment-detail-card.tsx @@ -1,23 +1,21 @@ -import React, { useState } from "react"; +import React, { useRef, useState } from "react"; import { observer } from "mobx-react-lite"; import { Controller, useForm } from "react-hook-form"; import { Check, MessageSquare, MoreVertical, X } from "lucide-react"; import { Menu, Transition } from "@headlessui/react"; -// mobx store // components -import { LiteReadOnlyEditorWithRef, LiteTextEditorWithRef } from "@plane/lite-text-editor"; - +import { EditorRefApi } from "@plane/lite-text-editor"; +import { LiteTextEditor, LiteTextReadOnlyEditor } from "@/components/editor"; import { CommentReactions } from "@/components/issues/peek-overview"; // helpers import { timeAgo } from "@/helpers/date-time.helper"; +// mobx store import { useMobxStore } from "@/lib/mobx/store-provider"; -// types -// services -import fileService from "@/services/file.service"; +// store import { RootStore } from "@/store/root"; -import useEditorSuggestions from "hooks/use-editor-suggestions"; +// types +import { Comment } from "@/types/issue"; -import { Comment } from "types/issue"; type Props = { workspaceSlug: string; comment: Comment; @@ -32,12 +30,10 @@ export const CommentCard: React.FC = observer((props) => { const { user: userStore, issueDetails: issueDetailStore } = useMobxStore(); // states const [isEditing, setIsEditing] = useState(false); - - const mentionsConfig = useEditorSuggestions(); - - const editorRef = React.useRef(null); - - const showEditorRef = React.useRef(null); + // refs + const editorRef = useRef(null); + const showEditorRef = useRef(null); + // form info const { control, formState: { isSubmitting }, @@ -105,19 +101,16 @@ export const CommentCard: React.FC = observer((props) => { control={control} name="comment_html" render={({ field: { onChange, value } }) => ( - { - onChange(comment_html); - }} + initialValue={value} + value={null} + onChange={(comment_json, comment_html) => onChange(comment_html)} + isSubmitting={isSubmitting} + showSubmitButton={false} /> )} /> @@ -140,12 +133,7 @@ export const CommentCard: React.FC = observer((props) => {
- +
diff --git a/space/components/issues/peek-overview/full-screen-peek-view.tsx b/space/components/issues/peek-overview/full-screen-peek-view.tsx index 32b850b128..5ab4dffd71 100644 --- a/space/components/issues/peek-overview/full-screen-peek-view.tsx +++ b/space/components/issues/peek-overview/full-screen-peek-view.tsx @@ -8,11 +8,12 @@ import { PeekOverviewIssueProperties, } from "@/components/issues/peek-overview"; // types -import { IIssue } from "types/issue"; +import { IIssue } from "@/types/issue"; type Props = { handleClose: () => void; issueDetails: IIssue | undefined; + workspace_slug: string; }; export const FullScreenPeekView: React.FC = observer((props) => { diff --git a/space/components/issues/peek-overview/issue-details.tsx b/space/components/issues/peek-overview/issue-details.tsx index dfc1be430f..5fe73f67a4 100644 --- a/space/components/issues/peek-overview/issue-details.tsx +++ b/space/components/issues/peek-overview/issue-details.tsx @@ -1,37 +1,30 @@ -import { RichReadOnlyEditor } from "@plane/rich-text-editor"; +// components +import { RichTextReadOnlyEditor } from "@/components/editor"; import { IssueReactions } from "@/components/issues/peek-overview"; // types -import useEditorSuggestions from "hooks/use-editor-suggestions"; -import { IIssue } from "types/issue"; +import { IIssue } from "@/types/issue"; type Props = { issueDetails: IIssue; }; -export const PeekOverviewIssueDetails: React.FC = ({ issueDetails }) => { - const mentionConfig = useEditorSuggestions(); - - return ( -
-
- {issueDetails.project_detail.identifier}-{issueDetails.sequence_id} -
-

{issueDetails.name}

- {issueDetails.description_html !== "" && issueDetails.description_html !== "

" && ( -

" - : issueDetails.description_html - } - customClassName="p-3 min-h-[50px] shadow-sm" - mentionHighlights={mentionConfig.mentionHighlights} - /> - )} - -
- ); -}; +export const PeekOverviewIssueDetails: React.FC = ({ issueDetails }) => ( +
+
+ {issueDetails.project_detail.identifier}-{issueDetails.sequence_id} +
+

{issueDetails.name}

+ {issueDetails.description_html !== "" && issueDetails.description_html !== "

" && ( +

" + : issueDetails.description_html + } + /> + )} + +
+); diff --git a/space/components/issues/peek-overview/layout.tsx b/space/components/issues/peek-overview/layout.tsx index b76da13f43..6662288cea 100644 --- a/space/components/issues/peek-overview/layout.tsx +++ b/space/components/issues/peek-overview/layout.tsx @@ -117,7 +117,11 @@ export const IssuePeekOverview: React.FC = observer(() => { )} {issueDetailStore.peekMode === "full" && ( - + )}
diff --git a/space/constants/editor.ts b/space/constants/editor.ts new file mode 100644 index 0000000000..bdd07f0c52 --- /dev/null +++ b/space/constants/editor.ts @@ -0,0 +1,98 @@ +import { + Bold, + Code2, + Heading1, + Heading2, + Heading3, + Image, + Italic, + List, + ListOrdered, + ListTodo, + LucideIcon, + Quote, + Strikethrough, + Table, + Underline, +} from "lucide-react"; +// editor +import { EditorMenuItemNames } from "@plane/lite-text-editor"; + +type TEditorTypes = "lite" | "document"; + +export type ToolbarMenuItem = { + key: EditorMenuItemNames; + name: string; + icon: LucideIcon; + shortcut?: string[]; + editors: TEditorTypes[]; +}; + +export const BASIC_MARK_ITEMS: ToolbarMenuItem[] = [ + { key: "H1", name: "Heading 1", icon: Heading1, editors: ["document"] }, + { key: "H2", name: "Heading 2", icon: Heading2, editors: ["document"] }, + { key: "H3", name: "Heading 3", icon: Heading3, editors: ["document"] }, + { key: "bold", name: "Bold", icon: Bold, shortcut: ["Cmd", "B"], editors: ["lite", "document"] }, + { key: "italic", name: "Italic", icon: Italic, shortcut: ["Cmd", "I"], editors: ["lite", "document"] }, + { key: "underline", name: "Underline", icon: Underline, shortcut: ["Cmd", "U"], editors: ["lite", "document"] }, + { + key: "strike", + name: "Strikethrough", + icon: Strikethrough, + shortcut: ["Cmd", "Shift", "S"], + editors: ["lite", "document"], + }, +]; + +export const LIST_ITEMS: ToolbarMenuItem[] = [ + { + key: "bullet-list", + name: "Bulleted list", + icon: List, + shortcut: ["Cmd", "Shift", "7"], + editors: ["lite", "document"], + }, + { + key: "ordered-list", + name: "Numbered list", + icon: ListOrdered, + shortcut: ["Cmd", "Shift", "8"], + editors: ["lite", "document"], + }, + { + key: "To-do List", + name: "To-do list", + icon: ListTodo, + shortcut: ["Cmd", "Shift", "9"], + editors: ["lite", "document"], + }, +]; + +export const USER_ACTION_ITEMS: ToolbarMenuItem[] = [ + { key: "quote", name: "Quote", icon: Quote, editors: ["lite", "document"] }, + { key: "code", name: "Code", icon: Code2, editors: ["lite", "document"] }, +]; + +export const COMPLEX_ITEMS: ToolbarMenuItem[] = [ + { key: "table", name: "Table", icon: Table, editors: ["document"] }, + { key: "image", name: "Image", icon: Image, editors: ["lite", "document"] }, +]; + +export const TOOLBAR_ITEMS: { + [editorType in TEditorTypes]: { + [key: string]: ToolbarMenuItem[]; + }; +} = { + lite: { + basic: BASIC_MARK_ITEMS.filter((item) => item.editors.includes("lite")), + list: LIST_ITEMS.filter((item) => item.editors.includes("lite")), + userAction: USER_ACTION_ITEMS.filter((item) => item.editors.includes("lite")), + complex: COMPLEX_ITEMS.filter((item) => item.editors.includes("lite")), + }, + document: { + basic: BASIC_MARK_ITEMS.filter((item) => item.editors.includes("document")), + list: LIST_ITEMS.filter((item) => item.editors.includes("document")), + userAction: USER_ACTION_ITEMS.filter((item) => item.editors.includes("document")), + complex: COMPLEX_ITEMS.filter((item) => item.editors.includes("document")), + }, +}; diff --git a/space/helpers/string.helper.ts b/space/helpers/string.helper.ts index 4a265ba4ea..b44974d250 100644 --- a/space/helpers/string.helper.ts +++ b/space/helpers/string.helper.ts @@ -1,3 +1,5 @@ +import DOMPurify from "dompurify"; + export const addSpaceIfCamelCase = (str: string) => str.replace(/([a-z])([A-Z])/g, "$1 $2"); const fallbackCopyTextToClipboard = (text: string) => { @@ -47,3 +49,10 @@ export const checkEmailValidity = (email: string): boolean => { return isEmailValid; }; + +export const isEmptyHtmlString = (htmlString: string) => { + // Remove HTML tags using regex + const cleanText = DOMPurify.sanitize(htmlString, { ALLOWED_TAGS: [] }); + // Trim the string and check if it's empty + return cleanText.trim() === ""; +}; diff --git a/space/hooks/use-mention.tsx b/space/hooks/use-mention.tsx new file mode 100644 index 0000000000..9f540cf58d --- /dev/null +++ b/space/hooks/use-mention.tsx @@ -0,0 +1,43 @@ +import { useRef, useEffect } from "react"; +import { UserService } from "services/user.service"; +import useSWR from "swr"; +import { IUser } from "@plane/types"; + +export const useMention = () => { + const userService = new UserService(); + const { data: user, isLoading: userDataLoading } = useSWR("currentUser", async () => userService.currentUser()); + + const userRef = useRef(); + + useEffect(() => { + if (userRef) { + // @ts-expect-error mismatch in types + userRef.current = user; + } + }, [user]); + + const waitForUserDate = async () => + new Promise((resolve) => { + const checkData = () => { + if (userRef.current) { + resolve(userRef.current); + } else { + setTimeout(checkData, 100); + } + }; + checkData(); + }); + + const mentionHighlights = async () => { + if (!userDataLoading && userRef.current) { + return [userRef.current.id]; + } else { + const user = await waitForUserDate(); + return [user.id]; + } + }; + + return { + mentionHighlights, + }; +}; diff --git a/space/package.json b/space/package.json index 6e736f9b07..ca811a645d 100644 --- a/space/package.json +++ b/space/package.json @@ -25,6 +25,7 @@ "@sentry/nextjs": "^7.108.0", "axios": "^1.3.4", "clsx": "^2.0.0", + "dompurify": "^3.0.11", "dotenv": "^16.3.1", "js-cookie": "^3.0.1", "lowlight": "^2.9.0", @@ -43,6 +44,7 @@ "uuid": "^9.0.0" }, "devDependencies": { + "@types/dompurify": "^3.0.5", "@types/js-cookie": "^3.0.3", "@types/node": "18.14.1", "@types/nprogress": "^0.2.0", diff --git a/space/services/project-member.service.ts b/space/services/project-member.service.ts new file mode 100644 index 0000000000..c1c2c27325 --- /dev/null +++ b/space/services/project-member.service.ts @@ -0,0 +1,27 @@ +// types +import type { IProjectMember, IProjectMembership } from "@plane/types"; +import { API_BASE_URL } from "@/helpers/common.helper"; +// services +import APIService from "@/services/api.service"; + +export class ProjectMemberService extends APIService { + constructor() { + super(API_BASE_URL); + } + + async fetchProjectMembers(workspaceSlug: string, projectId: string): Promise { + return this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/members/`) + .then((response) => response?.data) + .catch((error) => { + throw error?.response?.data; + }); + } + + async getProjectMember(workspaceSlug: string, projectId: string, memberId: string): Promise { + return this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/members/${memberId}/`) + .then((response) => response?.data) + .catch((error) => { + throw error?.response?.data; + }); + } +} diff --git a/space/styles/globals.css b/space/styles/globals.css index 92980b0d7d..2220225fb3 100644 --- a/space/styles/globals.css +++ b/space/styles/globals.css @@ -33,8 +33,8 @@ --color-primary-900: 13, 24, 51; --color-background-100: 255, 255, 255; /* primary bg */ - --color-background-90: 250, 250, 250; /* secondary bg */ - --color-background-80: 245, 245, 245; /* tertiary bg */ + --color-background-90: 247, 247, 247; /* secondary bg */ + --color-background-80: 232, 232, 232; /* tertiary bg */ --color-text-100: 23, 23, 23; /* primary text */ --color-text-200: 58, 58, 58; /* secondary text */ @@ -97,8 +97,8 @@ color-scheme: light !important; --color-background-100: 255, 255, 255; /* primary bg */ - --color-background-90: 250, 250, 250; /* secondary bg */ - --color-background-80: 245, 245, 245; /* tertiary bg */ + --color-background-90: 247, 247, 247; /* secondary bg */ + --color-background-80: 232, 232, 232; /* tertiary bg */ /* onboarding colors */ --gradient-onboarding-100: linear-gradient(106deg, #f2f6ff 29.8%, #e1eaff 99.34%); @@ -151,9 +151,9 @@ [data-theme="dark-contrast"] { color-scheme: dark !important; - --color-background-100: 7, 7, 7; /* primary bg */ - --color-background-90: 11, 11, 11; /* secondary bg */ - --color-background-80: 23, 23, 23; /* tertiary bg */ + --color-background-100: 25, 25, 25; /* primary bg */ + --color-background-90: 32, 32, 32; /* secondary bg */ + --color-background-80: 44, 44, 44; /* tertiary bg */ --color-shadow-2xs: 0px 0px 1px 0px rgba(0, 0, 0, 0.15), 0px 1px 3px 0px rgba(0, 0, 0, 0.5); --color-shadow-xs: 0px 0px 2px 0px rgba(0, 0, 0, 0.2), 0px 2px 4px 0px rgba(0, 0, 0, 0.5); diff --git a/web/components/command-palette/command-palette.tsx b/web/components/command-palette/command-palette.tsx index 490d392e2c..00de628b7d 100644 --- a/web/components/command-palette/command-palette.tsx +++ b/web/components/command-palette/command-palette.tsx @@ -12,7 +12,7 @@ import { BulkDeleteIssuesModal } from "@/components/core"; import { CycleCreateUpdateModal } from "@/components/cycles"; import { CreateUpdateIssueModal, DeleteIssueModal } from "@/components/issues"; import { CreateUpdateModuleModal } from "@/components/modules"; -import { CreateUpdatePageModal } from "@/components/pages"; +import { CreatePageModal } from "@/components/pages"; import { CreateProjectModal } from "@/components/project"; import { CreateUpdateProjectViewModal } from "@/components/views"; // helpers @@ -294,10 +294,12 @@ export const CommandPalette: FC = observer(() => { workspaceSlug={workspaceSlug.toString()} projectId={projectId.toString()} /> - toggleCreatePageModal(false)} + toggleCreatePageModal(false)} + redirectionEnabled /> )} diff --git a/web/components/core/modals/gpt-assistant-popover.tsx b/web/components/core/modals/gpt-assistant-popover.tsx index 3348272d69..a67b13f7ef 100644 --- a/web/components/core/modals/gpt-assistant-popover.tsx +++ b/web/components/core/modals/gpt-assistant-popover.tsx @@ -6,8 +6,8 @@ import { usePopper } from "react-popper"; // ui import { AlertCircle } from "lucide-react"; import { Popover, Transition } from "@headlessui/react"; -import { RichReadOnlyEditorWithRef } from "@plane/rich-text-editor"; import { Button, Input, TOAST_TYPE, setToast } from "@plane/ui"; +import { RichTextReadOnlyEditor } from "@/components/editor/rich-text-editor/rich-text-read-only-editor"; // icons // components // hooks @@ -173,8 +173,8 @@ export const GptAssistantPopover: React.FC = (props) => { const generateResponseButtonText = isSubmitting ? "Generating response..." : response === "" - ? "Generate response" - : "Generate again"; + ? "Generate response" + : "Generate again"; return ( @@ -202,23 +202,15 @@ export const GptAssistantPopover: React.FC = (props) => { {prompt && (
Content: - +
)} {response !== "" && (
Response: - ${response}

`} - customClassName={response ? "-mx-3 -my-3" : ""} - noBorder - borderOnFocus={false} + ${response}

`} + containerClassName={response ? "-mx-3 -my-3" : ""} ref={responseRef} />
@@ -245,6 +237,7 @@ export const GptAssistantPopover: React.FC = (props) => { prompt && prompt !== "" ? "Tell AI what action to perform on this content..." : "Ask AI anything..." }`} className="w-full" + autoFocus /> )} /> @@ -253,7 +246,7 @@ export const GptAssistantPopover: React.FC = (props) => { <>{responseActionButton} ) : ( <> -
+

By using this feature, you consent to sharing the message with a 3rd party service.

diff --git a/web/components/editor/index.ts b/web/components/editor/index.ts new file mode 100644 index 0000000000..72e92a6a8a --- /dev/null +++ b/web/components/editor/index.ts @@ -0,0 +1,2 @@ +export * from "./lite-text-editor"; +export * from "./rich-text-editor"; diff --git a/web/components/editor/lite-text-editor/index.ts b/web/components/editor/lite-text-editor/index.ts new file mode 100644 index 0000000000..661c8e7554 --- /dev/null +++ b/web/components/editor/lite-text-editor/index.ts @@ -0,0 +1,3 @@ +export * from "./lite-text-editor"; +export * from "./lite-text-read-only-editor"; +export * from "./toolbar"; diff --git a/web/components/editor/lite-text-editor/lite-text-editor.tsx b/web/components/editor/lite-text-editor/lite-text-editor.tsx new file mode 100644 index 0000000000..1be78a54e2 --- /dev/null +++ b/web/components/editor/lite-text-editor/lite-text-editor.tsx @@ -0,0 +1,107 @@ +import React from "react"; +// editor +import { EditorRefApi, ILiteTextEditor, LiteTextEditorWithRef } from "@plane/lite-text-editor"; +// types +import { IUserLite } from "@plane/types"; +// components +import { IssueCommentToolbar } from "@/components/editor"; +// constants +import { EIssueCommentAccessSpecifier } from "@/constants/issue"; +// helpers +import { cn } from "@/helpers/common.helper"; +import { isEmptyHtmlString } from "@/helpers/string.helper"; +// hooks +import { useMember, useMention, useUser } from "@/hooks/store"; +// services +import { FileService } from "@/services/file.service"; + +interface LiteTextEditorWrapperProps extends Omit { + workspaceSlug: string; + workspaceId: string; + projectId: string; + accessSpecifier?: EIssueCommentAccessSpecifier; + handleAccessChange?: (accessKey: EIssueCommentAccessSpecifier) => void; + showAccessSpecifier?: boolean; + showSubmitButton?: boolean; + isSubmitting?: boolean; +} + +const fileService = new FileService(); + +export const LiteTextEditor = React.forwardRef((props, ref) => { + const { + containerClassName, + workspaceSlug, + workspaceId, + projectId, + accessSpecifier, + handleAccessChange, + showAccessSpecifier = false, + showSubmitButton = true, + isSubmitting = false, + ...rest + } = props; + // store hooks + const { currentUser } = useUser(); + const { + getUserDetails, + project: { getProjectMemberIds }, + } = useMember(); + // derived values + const projectMemberIds = getProjectMemberIds(projectId); + const projectMemberDetails = projectMemberIds?.map((id) => getUserDetails(id) as IUserLite); + // use-mention + const { mentionHighlights, mentionSuggestions } = useMention({ + workspaceSlug, + projectId, + members: projectMemberDetails, + user: currentUser ?? undefined, + }); + + const isEmpty = + props.initialValue === "" || + props.initialValue?.trim() === "" || + props.initialValue === "

" || + isEmptyHtmlString(props.initialValue ?? ""); + + function isMutableRefObject(ref: React.ForwardedRef): ref is React.MutableRefObject { + return !!ref && typeof ref === "object" && "current" in ref; + } + + return ( +
+ + { + if (isMutableRefObject(ref)) { + ref.current?.executeMenuItemCommand(key); + } + }} + handleAccessChange={handleAccessChange} + handleSubmit={(e) => rest.onEnterKeyPress?.(e)} + isCommentEmpty={isEmpty} + isSubmitting={isSubmitting} + showAccessSpecifier={showAccessSpecifier} + editorRef={isMutableRefObject(ref) ? ref : null} + showSubmitButton={showSubmitButton} + /> +
+ ); +}); + +LiteTextEditor.displayName = "LiteTextEditor"; diff --git a/web/components/editor/lite-text-editor/lite-text-read-only-editor.tsx b/web/components/editor/lite-text-editor/lite-text-read-only-editor.tsx new file mode 100644 index 0000000000..8ee95b5854 --- /dev/null +++ b/web/components/editor/lite-text-editor/lite-text-read-only-editor.tsx @@ -0,0 +1,29 @@ +import React from "react"; +// editor +import { EditorReadOnlyRefApi, ILiteTextReadOnlyEditor, LiteTextReadOnlyEditorWithRef } from "@plane/lite-text-editor"; +// helpers +import { cn } from "@/helpers/common.helper"; +// hooks +import { useMention } from "@/hooks/store"; + +interface LiteTextReadOnlyEditorWrapperProps extends Omit {} + +export const LiteTextReadOnlyEditor = React.forwardRef( + ({ ...props }, ref) => { + const { mentionHighlights } = useMention({}); + + return ( + + ); + } +); + +LiteTextReadOnlyEditor.displayName = "LiteTextReadOnlyEditor"; diff --git a/web/components/editor/lite-text-editor/toolbar.tsx b/web/components/editor/lite-text-editor/toolbar.tsx new file mode 100644 index 0000000000..d80db9ccd7 --- /dev/null +++ b/web/components/editor/lite-text-editor/toolbar.tsx @@ -0,0 +1,172 @@ +import React, { useEffect, useState, useCallback } from "react"; +import { Globe2, Lock, LucideIcon } from "lucide-react"; +// editor +import { EditorMenuItemNames } from "@plane/document-editor"; +import { EditorRefApi } from "@plane/lite-text-editor"; +// ui +import { Button, Tooltip } from "@plane/ui"; +// constants +import { TOOLBAR_ITEMS } from "@/constants/editor"; +import { EIssueCommentAccessSpecifier } from "@/constants/issue"; +// helpers +import { cn } from "@/helpers/common.helper"; + +type Props = { + accessSpecifier?: EIssueCommentAccessSpecifier; + executeCommand: (commandName: EditorMenuItemNames) => void; + handleAccessChange?: (accessKey: EIssueCommentAccessSpecifier) => void; + handleSubmit: (event: React.MouseEvent) => void; + isCommentEmpty: boolean; + isSubmitting: boolean; + showAccessSpecifier: boolean; + showSubmitButton: boolean; + editorRef: React.MutableRefObject | null; +}; + +type TCommentAccessType = { + icon: LucideIcon; + key: EIssueCommentAccessSpecifier; + label: "Private" | "Public"; +}; + +const COMMENT_ACCESS_SPECIFIERS: TCommentAccessType[] = [ + { + icon: Lock, + key: EIssueCommentAccessSpecifier.INTERNAL, + label: "Private", + }, + { + icon: Globe2, + key: EIssueCommentAccessSpecifier.EXTERNAL, + label: "Public", + }, +]; + +const toolbarItems = TOOLBAR_ITEMS.lite; + +export const IssueCommentToolbar: React.FC = (props) => { + const { + accessSpecifier, + executeCommand, + handleAccessChange, + handleSubmit, + isCommentEmpty, + isSubmitting, + showAccessSpecifier, + showSubmitButton, + editorRef, + } = props; + + // State to manage active states of toolbar items + const [activeStates, setActiveStates] = useState>({}); + + // Function to update active states + const updateActiveStates = useCallback(() => { + if (editorRef?.current) { + const newActiveStates: Record = {}; + Object.values(toolbarItems) + .flat() + .forEach((item) => { + // Assert that editorRef.current is not null + newActiveStates[item.key] = (editorRef.current as EditorRefApi).isMenuItemActive(item.key); + }); + setActiveStates(newActiveStates); + } + }, [editorRef]); + + // useEffect to call updateActiveStates when isActive prop changes + useEffect(() => { + if (!editorRef?.current) return; + const unsubscribe = editorRef.current.onStateChange(updateActiveStates); + updateActiveStates(); + return () => unsubscribe(); + }, [editorRef, updateActiveStates]); + + return ( +
+ {showAccessSpecifier && ( +
+ {COMMENT_ACCESS_SPECIFIERS.map((access) => { + const isAccessActive = accessSpecifier === access.key; + + return ( + + + + ); + })} +
+ )} +
+
+ {Object.keys(toolbarItems).map((key, index) => ( +
+ {toolbarItems[key].map((item) => ( + + {item.name} + {item.shortcut && {item.shortcut.join(" + ")}} +

+ } + > + +
+ ))} +
+ ))} +
+ {showSubmitButton && ( +
+ +
+ )} +
+
+ ); +}; diff --git a/web/components/editor/rich-text-editor/index.ts b/web/components/editor/rich-text-editor/index.ts new file mode 100644 index 0000000000..f185d0054e --- /dev/null +++ b/web/components/editor/rich-text-editor/index.ts @@ -0,0 +1,2 @@ +export * from "./rich-text-editor"; +export * from "./rich-text-read-only-editor"; diff --git a/web/components/editor/rich-text-editor/rich-text-editor.tsx b/web/components/editor/rich-text-editor/rich-text-editor.tsx new file mode 100644 index 0000000000..e2173445d4 --- /dev/null +++ b/web/components/editor/rich-text-editor/rich-text-editor.tsx @@ -0,0 +1,59 @@ +import React, { forwardRef } from "react"; +// editor +import { EditorRefApi, IRichTextEditor, RichTextEditorWithRef } from "@plane/rich-text-editor"; +// types +import { IUserLite } from "@plane/types"; +// helpers +import { cn } from "@/helpers/common.helper"; +// hooks +import { useMember, useMention, useUser } from "@/hooks/store"; +// services +import { FileService } from "@/services/file.service"; + +interface RichTextEditorWrapperProps extends Omit { + workspaceSlug: string; + workspaceId: string; + projectId: string; +} + +const fileService = new FileService(); + +export const RichTextEditor = forwardRef((props, ref) => { + const { containerClassName, workspaceSlug, workspaceId, projectId, ...rest } = props; + // store hooks + const { currentUser } = useUser(); + const { + getUserDetails, + project: { getProjectMemberIds }, + } = useMember(); + // derived values + const projectMemberIds = getProjectMemberIds(projectId); + const projectMemberDetails = projectMemberIds?.map((id) => getUserDetails(id) as IUserLite); + // use-mention + const { mentionHighlights, mentionSuggestions } = useMention({ + workspaceSlug, + projectId, + members: projectMemberDetails, + user: currentUser ?? undefined, + }); + + return ( + + ); +}); + +RichTextEditor.displayName = "RichTextEditor"; diff --git a/web/components/editor/rich-text-editor/rich-text-read-only-editor.tsx b/web/components/editor/rich-text-editor/rich-text-read-only-editor.tsx new file mode 100644 index 0000000000..1415bc098a --- /dev/null +++ b/web/components/editor/rich-text-editor/rich-text-read-only-editor.tsx @@ -0,0 +1,29 @@ +import React from "react"; +// editor +import { EditorReadOnlyRefApi, IRichTextReadOnlyEditor, RichTextReadOnlyEditorWithRef } from "@plane/rich-text-editor"; +// helpers +import { cn } from "@/helpers/common.helper"; +// hooks +import { useMention } from "@/hooks/store"; + +interface RichTextReadOnlyEditorWrapperProps extends Omit {} + +export const RichTextReadOnlyEditor = React.forwardRef( + ({ ...props }, ref) => { + const { mentionHighlights } = useMention({}); + + return ( + + ); + } +); + +RichTextReadOnlyEditor.displayName = "RichTextReadOnlyEditor"; diff --git a/web/components/headers/index.ts b/web/components/headers/index.ts index b57b91534c..b50074c8e7 100644 --- a/web/components/headers/index.ts +++ b/web/components/headers/index.ts @@ -14,6 +14,7 @@ export * from "./cycles"; export * from "./modules-list"; export * from "./project-settings"; export * from "./workspace-settings"; +export * from "./page-details"; export * from "./pages"; export * from "./project-draft-issues"; export * from "./project-archived-issue-details"; diff --git a/web/components/headers/page-details.tsx b/web/components/headers/page-details.tsx index 4130dffcef..9a595bf1ce 100644 --- a/web/components/headers/page-details.tsx +++ b/web/components/headers/page-details.tsx @@ -24,7 +24,7 @@ export const PageDetailsHeader: FC = observer((props) => { const { commandPalette: commandPaletteStore } = useApplication(); const { currentProjectDetails } = useProject(); - const pageDetails = usePage(pageId as string); + const { name } = usePage(pageId?.toString() ?? ""); return (
@@ -71,10 +71,7 @@ export const PageDetailsHeader: FC = observer((props) => { } - /> + } /> } /> diff --git a/web/components/inbox/content/issue-root.tsx b/web/components/inbox/content/issue-root.tsx index 7edcc26446..627c86c455 100644 --- a/web/components/inbox/content/issue-root.tsx +++ b/web/components/inbox/content/issue-root.tsx @@ -25,11 +25,13 @@ type Props = { isEditable: boolean; isSubmitting: "submitting" | "submitted" | "saved"; setIsSubmitting: Dispatch>; + swrIssueDescription: string | undefined; }; export const InboxIssueMainContent: React.FC = observer((props) => { const router = useRouter(); - const { workspaceSlug, projectId, inboxIssue, isEditable, isSubmitting, setIsSubmitting } = props; + const { workspaceSlug, projectId, inboxIssue, isEditable, isSubmitting, setIsSubmitting, swrIssueDescription } = + props; // hooks const { currentUser } = useUser(); const { setShowAlert } = useReloadConfirmations(isSubmitting === "submitting"); @@ -49,13 +51,6 @@ export const InboxIssueMainContent: React.FC = observer((props) => { const issue = inboxIssue.issue; if (!issue) return <>; - const issueDescription = - issue.description_html !== undefined || issue.description_html !== null - ? issue.description_html != "" - ? issue.description_html - : "

" - : undefined; - const issueOperations: TIssueOperations = useMemo( () => ({ // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -116,6 +111,7 @@ export const InboxIssueMainContent: React.FC = observer((props) => { ); if (!issue?.project_id || !issue?.id) return <>; + return ( <>
@@ -134,8 +130,8 @@ export const InboxIssueMainContent: React.FC = observer((props) => { workspaceSlug={workspaceSlug} projectId={issue.project_id} issueId={issue.id} - value={issueDescription} - initialValue={issueDescription} + swrIssueDescription={swrIssueDescription} + initialValue={issue.description_html ?? "

"} disabled={!isEditable} issueOperations={issueOperations} setIsSubmitting={(value) => setIsSubmitting(value)} diff --git a/web/components/inbox/content/root.tsx b/web/components/inbox/content/root.tsx index 9b5f94a48d..9af3da0bc6 100644 --- a/web/components/inbox/content/root.tsx +++ b/web/components/inbox/content/root.tsx @@ -22,14 +22,14 @@ export const InboxContentRoot: FC = observer((props) => { membership: { currentProjectRole }, } = useUser(); - useSWR( + const { data: swrIssueDetails } = useSWR( workspaceSlug && projectId && inboxIssueId ? `PROJECT_INBOX_ISSUE_DETAIL_${workspaceSlug}_${projectId}_${inboxIssueId}` : null, - () => { - workspaceSlug && projectId && inboxIssueId && fetchInboxIssueById(workspaceSlug, projectId, inboxIssueId); - }, - { revalidateOnFocus: false } + workspaceSlug && projectId && inboxIssueId + ? () => fetchInboxIssueById(workspaceSlug, projectId, inboxIssueId) + : null, + { revalidateOnFocus: true } ); const isEditable = !!currentProjectRole && currentProjectRole >= EUserProjectRoles.MEMBER; @@ -57,6 +57,7 @@ export const InboxContentRoot: FC = observer((props) => { isEditable={isEditable && !isIssueDisabled} isSubmitting={isSubmitting} setIsSubmitting={setIsSubmitting} + swrIssueDescription={swrIssueDetails?.issue.description_html} />
diff --git a/web/components/inbox/modals/create-issue-modal.tsx b/web/components/inbox/modals/create-issue-modal.tsx index 9336613c6c..3cc642be89 100644 --- a/web/components/inbox/modals/create-issue-modal.tsx +++ b/web/components/inbox/modals/create-issue-modal.tsx @@ -4,7 +4,7 @@ import { useRouter } from "next/router"; import { Controller, useForm } from "react-hook-form"; import { Sparkle } from "lucide-react"; import { Transition, Dialog } from "@headlessui/react"; -import { RichTextEditorWithRef } from "@plane/rich-text-editor"; +import { EditorRefApi } from "@plane/rich-text-editor"; // types import { TIssue } from "@plane/types"; // ui @@ -12,13 +12,15 @@ import { Button, Input, ToggleSwitch, TOAST_TYPE, setToast } from "@plane/ui"; // components import { GptAssistantPopover } from "@/components/core"; import { PriorityDropdown } from "@/components/dropdowns"; -// constants +import { RichTextEditor } from "@/components/editor/rich-text-editor/rich-text-editor"; import { ISSUE_CREATED } from "@/constants/event-tracker"; -// hooks -import { useApplication, useEventTracker, useWorkspace, useMention, useProjectInbox } from "@/hooks/store"; +import { useApplication, useEventTracker, useWorkspace, useProjectInbox } from "@/hooks/store"; // services import { AIService } from "@/services/ai.service"; -import { FileService } from "@/services/file.service"; +// components +// ui +// types +// constants type Props = { isOpen: boolean; @@ -33,7 +35,6 @@ const defaultValues: Partial = { // services const aiService = new AIService(); -const fileService = new FileService(); export const CreateInboxIssueModal: React.FC = observer((props) => { const { isOpen, onClose } = props; @@ -46,11 +47,11 @@ export const CreateInboxIssueModal: React.FC = observer((props) => { const [gptAssistantModal, setGptAssistantModal] = useState(false); const [iAmFeelingLucky, setIAmFeelingLucky] = useState(false); // refs - const editorRef = useRef(null); + const editorRef = useRef(null); // hooks - const { mentionHighlights, mentionSuggestions } = useMention(); const workspaceStore = useWorkspace(); - const workspaceId = workspaceStore.getWorkspaceBySlug(workspaceSlug as string)?.id as string; + const workspaceId = workspaceStore.getWorkspaceBySlug(workspaceSlug.toString() as string)?.id.toString() as string; + // store hooks const { createInboxIssue } = useProjectInbox(); const { @@ -264,20 +265,16 @@ export const CreateInboxIssueModal: React.FC = observer((props) => { name="description_html" control={control} render={({ field: { value, onChange } }) => ( -

" : value} ref={editorRef} - debouncedUpdatesEnabled={false} - value={!value || value === "" ? "

" : value} - customClassName="min-h-[150px]" - onChange={(description, description_html: string) => { + workspaceSlug={workspaceSlug.toString()} + workspaceId={workspaceId} + projectId={projectId.toString()} + dragDropEnabled={false} + onChange={(_description: object, description_html: string) => { onChange(description_html); }} - mentionSuggestions={mentionSuggestions} - mentionHighlights={mentionHighlights} /> )} /> diff --git a/web/components/issues/description-form.tsx b/web/components/issues/description-form.tsx deleted file mode 100644 index 5af8a418e0..0000000000 --- a/web/components/issues/description-form.tsx +++ /dev/null @@ -1,203 +0,0 @@ -import { ChangeEvent, FC, useCallback, useEffect, useState } from "react"; -import debounce from "lodash/debounce"; -import { observer } from "mobx-react"; -import { Controller, useForm } from "react-hook-form"; -import { RichReadOnlyEditor, RichTextEditor } from "@plane/rich-text-editor"; -import { TIssue } from "@plane/types"; -// hooks -import { Loader, TextArea } from "@plane/ui"; -import { useMention, useWorkspace } from "@/hooks/store"; -import useReloadConfirmations from "@/hooks/use-reload-confirmation"; -// components -// types -import { FileService } from "@/services/file.service"; -import { TIssueOperations } from "./issue-detail"; -// services - -export interface IssueDescriptionFormValues { - name: string; - description_html: string; -} - -export interface IssueDetailsProps { - workspaceSlug: string; - projectId: string; - issueId: string; - issue: { - name: string; - description_html: string; - id: string; - project_id?: string; - }; - issueOperations: TIssueOperations; - disabled: boolean; - isSubmitting: "submitting" | "submitted" | "saved"; - setIsSubmitting: (value: "submitting" | "submitted" | "saved") => void; -} - -const fileService = new FileService(); - -export const IssueDescriptionForm: FC = observer((props) => { - const { workspaceSlug, projectId, issueId, issue, issueOperations, disabled, isSubmitting, setIsSubmitting } = props; - const workspaceStore = useWorkspace(); - const workspaceId = workspaceStore.getWorkspaceBySlug(workspaceSlug)?.id as string; - // states - const [characterLimit, setCharacterLimit] = useState(false); - // hooks - const { setShowAlert } = useReloadConfirmations(); - // store hooks - const { mentionHighlights, mentionSuggestions } = useMention(); - // form info - const { - handleSubmit, - watch, - reset, - control, - formState: { errors }, - } = useForm({ - defaultValues: { - name: issue?.name, - description_html: issue?.description_html, - }, - }); - - const [localTitleValue, setLocalTitleValue] = useState(""); - const [localIssueDescription, setLocalIssueDescription] = useState({ - id: issue.id, - description_html: issue.description_html, - }); - - const handleDescriptionFormSubmit = useCallback( - async (formData: Partial) => { - if (!formData?.name || formData?.name.length === 0 || formData?.name.length > 255) return; - - await issueOperations.update(workspaceSlug, projectId, issueId, { - name: formData.name ?? "", - description_html: formData.description_html ?? "

", - }); - }, - [workspaceSlug, projectId, issueId, issueOperations] - ); - - useEffect(() => { - if (isSubmitting === "submitted") { - setShowAlert(false); - setTimeout(async () => { - setIsSubmitting("saved"); - }, 2000); - } else if (isSubmitting === "submitting") { - setShowAlert(true); - } - }, [isSubmitting, setShowAlert, setIsSubmitting]); - - // reset form values - useEffect(() => { - if (!issue) return; - - reset({ - ...issue, - }); - setLocalIssueDescription({ - id: issue.id, - description_html: issue.description_html === "" ? "

" : issue.description_html, - }); - setLocalTitleValue(issue.name); - }, [issue, issue.description_html, reset]); - - // ADDING handleDescriptionFormSubmit TO DEPENDENCY ARRAY PRODUCES ADVERSE EFFECTS - // TODO: Verify the exhaustive-deps warning - // eslint-disable-next-line react-hooks/exhaustive-deps - const debouncedFormSave = useCallback( - debounce(async () => { - handleSubmit(handleDescriptionFormSubmit)().finally(() => setIsSubmitting("submitted")); - }, 1500), - [handleSubmit] - ); - - return ( -
-
- {!disabled ? ( - ( -