From add639509f83ea6e65a93e735f346fb7e01fbe4d Mon Sep 17 00:00:00 2001 From: dakshesh14 Date: Wed, 27 Sep 2023 15:36:22 +0530 Subject: [PATCH 01/11] fix: 24 character limit on first & last name in onboarding page --- web/components/onboarding/user-details.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/web/components/onboarding/user-details.tsx b/web/components/onboarding/user-details.tsx index b2ba931c0dc..2911bbc80f4 100644 --- a/web/components/onboarding/user-details.tsx +++ b/web/components/onboarding/user-details.tsx @@ -121,6 +121,10 @@ export const UserDetails: React.FC = ({ user }) => { register={register} validations={{ required: "First name is required", + maxLength: { + value: 24, + message: "First name cannot exceed the limit of 24 characters", + }, }} error={errors.first_name} /> @@ -135,6 +139,10 @@ export const UserDetails: React.FC = ({ user }) => { placeholder="Enter your last name..." validations={{ required: "Last name is required", + maxLength: { + value: 24, + message: "Last name cannot exceed the limit of 24 characters", + }, }} error={errors.last_name} /> From 9357e1453bb5c0d645018e4abec9035f6632ee6b Mon Sep 17 00:00:00 2001 From: dakshesh14 Date: Wed, 27 Sep 2023 16:46:14 +0530 Subject: [PATCH 02/11] fix: no option: 'Add Issue' in archive issue page --- web/components/core/views/issues-view.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web/components/core/views/issues-view.tsx b/web/components/core/views/issues-view.tsx index c09e7c80b20..62bcd5e58ed 100644 --- a/web/components/core/views/issues-view.tsx +++ b/web/components/core/views/issues-view.tsx @@ -81,7 +81,9 @@ export const IssuesView: React.FC = ({ const router = useRouter(); const { workspaceSlug, projectId, cycleId, moduleId, viewId } = router.query; - const isDraftIssues = router.asPath.includes("draft-issues"); + + const isDraftIssues = router.pathname?.split("/")?.[4] === "draft-issues"; + const isArchivedIssues = router.pathname?.split("/")?.[4] === "archived-issues"; const { user } = useUserAuth(); @@ -625,6 +627,7 @@ export const IssuesView: React.FC = ({ params, properties, }} + disableAddIssueOption={isArchivedIssues} /> ); From 02982486082840d823f49bcbd635b53157bccd14 Mon Sep 17 00:00:00 2001 From: dakshesh14 Date: Wed, 27 Sep 2023 16:50:06 +0530 Subject: [PATCH 03/11] fix: in archive issue directly sending to issue detail page --- web/components/core/views/list-view/single-issue.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/web/components/core/views/list-view/single-issue.tsx b/web/components/core/views/list-view/single-issue.tsx index b0950a684dd..5db2130a005 100644 --- a/web/components/core/views/list-view/single-issue.tsx +++ b/web/components/core/views/list-view/single-issue.tsx @@ -352,6 +352,7 @@ export const SingleListIssue: React.FC = ({ type="button" className="truncate text-[0.825rem] text-custom-text-100" onClick={() => { + if (isArchivedIssues) return router.push(issuePath); if (!isDraftIssues) openPeekOverview(issue); if (isDraftIssues && handleDraftIssueSelect) handleDraftIssueSelect(issue); }} From edc7960fbbbea093e61369dc6df9450cb70e4339 Mon Sep 17 00:00:00 2001 From: dakshesh14 Date: Wed, 27 Sep 2023 17:21:35 +0530 Subject: [PATCH 04/11] fix: issue type showing in archive issue --- .../core/filters/issues-view-filter.tsx | 54 ++++++++++--------- web/hooks/use-issues-view.tsx | 2 +- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/web/components/core/filters/issues-view-filter.tsx b/web/components/core/filters/issues-view-filter.tsx index 02cdf212280..7df759e8a88 100644 --- a/web/components/core/filters/issues-view-filter.tsx +++ b/web/components/core/filters/issues-view-filter.tsx @@ -277,33 +277,35 @@ export const IssuesFilterView: React.FC = () => { )} -
-

Issue type

-
- option.key === displayFilters.type - )?.name ?? "Select" - } - className="!w-full" - buttonClassName="w-full" - > - {FILTER_ISSUE_OPTIONS.map((option) => ( - - setDisplayFilters({ - type: option.key, - }) - } - > - {option.name} - - ))} - + {!isArchivedIssues && ( +
+

Issue type

+
+ option.key === displayFilters.type + )?.name ?? "Select" + } + className="!w-full" + buttonClassName="w-full" + > + {FILTER_ISSUE_OPTIONS.map((option) => ( + + setDisplayFilters({ + type: option.key, + }) + } + > + {option.name} + + ))} + +
-
+ )} {displayFilters.layout !== "calendar" && displayFilters.layout !== "spreadsheet" && ( diff --git a/web/hooks/use-issues-view.tsx b/web/hooks/use-issues-view.tsx index 80cabda21c2..1f15c09f90f 100644 --- a/web/hooks/use-issues-view.tsx +++ b/web/hooks/use-issues-view.tsx @@ -47,7 +47,7 @@ const useIssuesView = () => { assignees: filters?.assignees ? filters?.assignees.join(",") : undefined, state: filters?.state ? filters?.state.join(",") : undefined, priority: filters?.priority ? filters?.priority.join(",") : undefined, - type: displayFilters?.type ? displayFilters?.type : undefined, + type: !isArchivedIssues ? (displayFilters?.type ? displayFilters?.type : undefined) : undefined, labels: filters?.labels ? filters?.labels.join(",") : undefined, created_by: filters?.created_by ? filters?.created_by.join(",") : undefined, start_date: filters?.start_date ? filters?.start_date.join(",") : undefined, From f5d10e93b926aa730a836ce8ce62d2aec22af900 Mon Sep 17 00:00:00 2001 From: dakshesh14 Date: Wed, 27 Sep 2023 18:04:15 +0530 Subject: [PATCH 05/11] fix: custom menu overflowing --- web/components/ui/dropdowns/custom-menu.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/components/ui/dropdowns/custom-menu.tsx b/web/components/ui/dropdowns/custom-menu.tsx index c451d443254..5c23de35e33 100644 --- a/web/components/ui/dropdowns/custom-menu.tsx +++ b/web/components/ui/dropdowns/custom-menu.tsx @@ -72,7 +72,7 @@ const CustomMenu = ({ : "cursor-pointer hover:bg-custom-background-80" } ${buttonClassName}`} > - {label} + {label} {!noChevron && ( Date: Wed, 27 Sep 2023 19:15:25 +0530 Subject: [PATCH 06/11] fix: changing subscriber in filters has no effect --- web/components/core/filters/filters-list.tsx | 4 +++- web/constants/fetch-keys.ts | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/web/components/core/filters/filters-list.tsx b/web/components/core/filters/filters-list.tsx index a2b12b69c8a..50493c64f22 100644 --- a/web/components/core/filters/filters-list.tsx +++ b/web/components/core/filters/filters-list.tsx @@ -200,7 +200,9 @@ export const FiltersList: React.FC = ({ className="cursor-pointer" onClick={() => setFilters({ - assignees: filters.assignees?.filter((p: any) => p !== memberId), + subscriber: filters.subscriber?.filter( + (p: any) => p !== memberId + ), }) } > diff --git a/web/constants/fetch-keys.ts b/web/constants/fetch-keys.ts index 75107a0bba4..a1ead117f76 100644 --- a/web/constants/fetch-keys.ts +++ b/web/constants/fetch-keys.ts @@ -14,6 +14,7 @@ const paramsToKey = (params: any) => { sub_issue, start_target_date, project, + subscriber, } = params; let projectKey = project ? project.split(",") : []; @@ -23,6 +24,7 @@ const paramsToKey = (params: any) => { let assigneesKey = assignees ? assignees.split(",") : []; let createdByKey = created_by ? created_by.split(",") : []; let labelsKey = labels ? labels.split(",") : []; + let subscriberKey = subscriber ? subscriber.split(",") : []; const startTargetDate = start_target_date ? `${start_target_date}`.toUpperCase() : "FALSE"; const startDateKey = start_date ?? ""; const targetDateKey = target_date ?? ""; @@ -38,8 +40,9 @@ const paramsToKey = (params: any) => { assigneesKey = assigneesKey.sort().join("_"); createdByKey = createdByKey.sort().join("_"); labelsKey = labelsKey.sort().join("_"); + subscriberKey = subscriberKey.sort().join("_"); - return `${projectKey}_${stateGroupKey}_${stateKey}_${priorityKey}_${assigneesKey}_${createdByKey}_${type}_${groupBy}_${orderBy}_${labelsKey}_${startDateKey}_${targetDateKey}_${sub_issue}_${startTargetDate}`; + return `${projectKey}_${stateGroupKey}_${stateKey}_${priorityKey}_${assigneesKey}_${createdByKey}_${type}_${groupBy}_${orderBy}_${labelsKey}_${startDateKey}_${targetDateKey}_${sub_issue}_${startTargetDate}_${subscriberKey}`; }; const inboxParamsToKey = (params: any) => { From d9a415264b25d0f0f0842626ba07faafd9e36632 Mon Sep 17 00:00:00 2001 From: dakshesh14 Date: Thu, 28 Sep 2023 10:19:35 +0530 Subject: [PATCH 07/11] style: border in quick-add --- .../core/views/board-view/inline-create-issue-form.tsx | 2 +- .../core/views/gantt-chart-view/inline-create-issue-form.tsx | 2 +- .../core/views/list-view/inline-create-issue-form.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web/components/core/views/board-view/inline-create-issue-form.tsx b/web/components/core/views/board-view/inline-create-issue-form.tsx index 651a0c0c1bc..1d6103d19df 100644 --- a/web/components/core/views/board-view/inline-create-issue-form.tsx +++ b/web/components/core/views/board-view/inline-create-issue-form.tsx @@ -48,7 +48,7 @@ const InlineInput = () => { export const BoardInlineCreateIssueForm: React.FC = (props) => ( <> diff --git a/web/components/core/views/gantt-chart-view/inline-create-issue-form.tsx b/web/components/core/views/gantt-chart-view/inline-create-issue-form.tsx index a5bc85f6ec3..785eb3c5a14 100644 --- a/web/components/core/views/gantt-chart-view/inline-create-issue-form.tsx +++ b/web/components/core/views/gantt-chart-view/inline-create-issue-form.tsx @@ -48,7 +48,7 @@ const InlineInput = () => { export const GanttInlineCreateIssueForm: React.FC = (props) => ( <> diff --git a/web/components/core/views/list-view/inline-create-issue-form.tsx b/web/components/core/views/list-view/inline-create-issue-form.tsx index 2f7e1287e4a..c641b44bbfb 100644 --- a/web/components/core/views/list-view/inline-create-issue-form.tsx +++ b/web/components/core/views/list-view/inline-create-issue-form.tsx @@ -48,7 +48,7 @@ const InlineInput = () => { export const ListInlineCreateIssueForm: React.FC = (props) => ( <> From 4e65d7d736239c52d11a0b7861f93d31cf1e565b Mon Sep 17 00:00:00 2001 From: dakshesh14 Date: Thu, 28 Sep 2023 11:02:31 +0530 Subject: [PATCH 08/11] fix: on onboarding member role overflowing --- web/components/onboarding/invite-members.tsx | 225 +++++++++++++------ 1 file changed, 155 insertions(+), 70 deletions(-) diff --git a/web/components/onboarding/invite-members.tsx b/web/components/onboarding/invite-members.tsx index fee1cb252d0..8f1b1fa4103 100644 --- a/web/components/onboarding/invite-members.tsx +++ b/web/components/onboarding/invite-members.tsx @@ -1,15 +1,27 @@ -import React, { useEffect } from "react"; +import React, { useEffect, useRef, useState } from "react"; +// headless ui +import { Listbox, Transition } from "@headlessui/react"; // react-hook-form -import { Controller, useFieldArray, useForm } from "react-hook-form"; +import { + Control, + Controller, + FieldArrayWithId, + UseFieldArrayRemove, + useFieldArray, + useForm, +} from "react-hook-form"; // services import workspaceService from "services/workspace.service"; // hooks import useToast from "hooks/use-toast"; // ui -import { CustomSelect, Input, PrimaryButton, SecondaryButton } from "components/ui"; +import { Input, PrimaryButton, SecondaryButton } from "components/ui"; +// hooks +import useDynamicDropdownPosition from "hooks/use-dynamic-dropdown"; // icons -import { PlusIcon, XMarkIcon } from "@heroicons/react/24/outline"; +import { ChevronDownIcon } from "@heroicons/react/20/solid"; +import { PlusIcon, XMarkIcon, CheckIcon } from "@heroicons/react/24/outline"; // types import { ICurrentUserResponse, IWorkspace, TOnboardingSteps } from "types"; // constants @@ -31,12 +43,136 @@ type FormValues = { emails: EmailRole[]; }; -export const InviteMembers: React.FC = ({ - finishOnboarding, - stepChange, - user, - workspace, -}) => { +type InviteMemberFormProps = { + index: number; + remove: UseFieldArrayRemove; + control: Control; + field: FieldArrayWithId; + fields: FieldArrayWithId[]; + errors: any; +}; + +const InviteMemberForm: React.FC = (props) => { + const { control, index, fields, remove, errors } = props; + + const buttonRef = useRef(null); + const dropdownRef = useRef(null); + + const [isDropdownOpen, setIsDropdownOpen] = useState(false); + + useDynamicDropdownPosition( + isDropdownOpen, + () => setIsDropdownOpen(false), + buttonRef, + dropdownRef + ); + + return ( +
+
+ ( + <> + + {errors.emails?.[index]?.email && ( + + {errors.emails?.[index]?.email?.message} + + )} + + )} + /> +
+
+ ( + { + onChange(val); + setIsDropdownOpen(false); + }} + className="flex-shrink-0 text-left w-full" + > + setIsDropdownOpen((prev) => !prev)} + className="flex items-center px-2.5 py-2 text-xs justify-between gap-1 w-full rounded-md border border-custom-border-300 shadow-sm duration-300 focus:outline-none" + > + {ROLE[value]} + + + + +
+ {Object.entries(ROLE).map(([key, value]) => ( + + `cursor-pointer select-none truncate rounded px-1 py-1.5 ${ + active || selected ? "bg-custom-background-80" : "" + } ${selected ? "text-custom-text-100" : "text-custom-text-200"}` + } + > + {({ selected }) => ( +
+
{value}
+ {selected && } +
+ )} +
+ ))} +
+
+
+
+ )} + /> +
+ {fields.length > 1 && ( + + )} +
+ ); +}; + +export const InviteMembers: React.FC = (props) => { + const { finishOnboarding, stepChange, user, workspace } = props; + const { setToastAlert } = useToast(); const { @@ -109,66 +245,15 @@ export const InviteMembers: React.FC = ({
{fields.map((field, index) => ( -
-
- ( - <> - - {errors.emails?.[index]?.email && ( - - {errors.emails?.[index]?.email?.message} - - )} - - )} - /> -
-
- ( - {ROLE[value]}} - onChange={onChange} - width="w-full" - input - > - {Object.entries(ROLE).map(([key, value]) => ( - - {value} - - ))} - - )} - /> -
- {fields.length > 1 && ( - - )} -
+ ))}
) : !disableUserActions && @@ -316,11 +316,11 @@ export const SpreadsheetView: React.FC = ({ className="sticky left-0 z-10" customButton={ } position="left" diff --git a/web/components/core/views/spreadsheet-view/start-date-column/start-date-column.tsx b/web/components/core/views/spreadsheet-view/start-date-column/start-date-column.tsx index 3b4b9a0f735..6774ce1b918 100644 --- a/web/components/core/views/spreadsheet-view/start-date-column/start-date-column.tsx +++ b/web/components/core/views/spreadsheet-view/start-date-column/start-date-column.tsx @@ -23,7 +23,7 @@ export const StartDateColumn: React.FC = ({ isNotAllowed, }) => (
- + {properties.due_date && ( = ({ return (
- + {properties.state && ( = ({ isNotAllowed, }) => (
- + {properties.updated_on && (
{renderLongDetailDateFormat(issue.updated_at)} diff --git a/web/components/gantt-chart/chart/index.tsx b/web/components/gantt-chart/chart/index.tsx index c564f69f2d4..61e3078d619 100644 --- a/web/components/gantt-chart/chart/index.tsx +++ b/web/components/gantt-chart/chart/index.tsx @@ -347,7 +347,7 @@ export const ChartViewRoot: FC = ({