From fbcf15737e48ca04cc735551a2df752fce3e5fcf Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Wed, 21 Aug 2024 14:00:29 +0530 Subject: [PATCH] [WEB-1185] Issue types updates (#887) * chore: admin role validation for issue types settings. * chore: reset `is_required`, if property type is switched to `read_only`. * chore: trim option name and fix cursor behaviour in options. * chore: fix issue property description info icon. * fix: property title overflow. * chore: issue properties UI and UX copy updates. * chore: remove option to disable the property if it's already disabled while deleting. * chore: update lodash import. --- .../[projectId]/settings/issue-types/page.tsx | 10 ++-- .../properties/attributes/options/option.tsx | 12 +++-- .../properties/attributes/text.tsx | 3 ++ .../properties/delete-confirmation-modal.tsx | 27 +++++----- .../properties/dropdowns/property-title.tsx | 6 +-- .../properties/property-list-item.tsx | 1 + .../issue-types/properties/quick-actions.tsx | 3 ++ .../issue-properties-activity/boolean.tsx | 5 +- .../issue-properties-activity/date.tsx | 16 +++--- .../issue-properties-activity/dropdown.tsx | 17 ++++--- .../issue-properties-activity/member.tsx | 12 +++-- .../issue-properties-activity/number.tsx | 18 ++++--- .../issue-properties-activity/text.tsx | 11 ++-- .../issues/worklog/activity/root.tsx | 50 +++++++++---------- web/ee/constants/project/settings/tabs.ts | 2 +- 15 files changed, 115 insertions(+), 78 deletions(-) diff --git a/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/settings/issue-types/page.tsx b/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/settings/issue-types/page.tsx index ec8fd3236a..860c562378 100644 --- a/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/settings/issue-types/page.tsx +++ b/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/settings/issue-types/page.tsx @@ -2,26 +2,30 @@ import { observer } from "mobx-react"; // components +import { NotAuthorizedView } from "@/components/auth-screens"; import { PageHead } from "@/components/core"; // hooks -import { EUserProjectRoles } from "@/constants/project"; import { useProject, useUser } from "@/hooks/store"; import { IssueTypesRoot } from "@/plane-web/components/issue-types"; const IssueTypesSettingsPage = observer(() => { // store hooks const { + canPerformProjectAdminActions, membership: { currentProjectRole }, } = useUser(); const { currentProjectDetails } = useProject(); // derived values - const isAdmin = currentProjectRole === EUserProjectRoles.ADMIN; const pageTitle = currentProjectDetails?.name ? `${currentProjectDetails?.name} - Issue Types` : undefined; + if (currentProjectRole && !canPerformProjectAdminActions) { + return ; + } + return ( <> -
+
diff --git a/web/ee/components/issue-types/properties/attributes/options/option.tsx b/web/ee/components/issue-types/properties/attributes/options/option.tsx index 49a36f3cb6..52f7473ef6 100644 --- a/web/ee/components/issue-types/properties/attributes/options/option.tsx +++ b/web/ee/components/issue-types/properties/attributes/options/option.tsx @@ -1,4 +1,5 @@ import { FC, useEffect, useState } from "react"; +import isEqual from "lodash/isEqual"; import { observer } from "mobx-react"; import { Info } from "lucide-react"; // ui @@ -45,12 +46,17 @@ export const IssuePropertyOptionItem: FC = observer((p // handle create/ update operation const handleCreateUpdate = async () => { + // return if no change in data + if (isEqual(propertyOptionCreateData.name, optionData.name)) return; + // trim option name + const optionDataToUpdate = { ...optionData, name: optionData.name?.trim() }; + setOptionData(optionDataToUpdate); // return if option name is same as previous or empty - if (!optionData.name) return; + if (!optionDataToUpdate.name) return; // check for duplicate option name - if (checkForDuplicate({ identifier: optionData.id ?? key, value: optionData.name })) return; + if (checkForDuplicate({ identifier: optionDataToUpdate.id ?? key, value: optionDataToUpdate.name })) return; // handle option data update - updateOptionData({ key, ...optionData }); + updateOptionData({ key, ...optionDataToUpdate }); }; // handle changes in option local data diff --git a/web/ee/components/issue-types/properties/attributes/text.tsx b/web/ee/components/issue-types/properties/attributes/text.tsx index 432c65b3bb..fce7eb1f4e 100644 --- a/web/ee/components/issue-types/properties/attributes/text.tsx +++ b/web/ee/components/issue-types/properties/attributes/text.tsx @@ -39,6 +39,9 @@ export const TextAttributes = observer((props: TTextAttributesProps) => { onChange={(value) => { onTextDetailChange("settings", value as TIssueProperty["settings"]); onTextDetailChange("default_value", []); + if (value?.display_format === "readonly") { + onTextDetailChange("is_required", false); + } }} isDisabled={!configurations.allowedEditingModes.includes(currentOperationMode) && isAnyIssueAttached} /> diff --git a/web/ee/components/issue-types/properties/delete-confirmation-modal.tsx b/web/ee/components/issue-types/properties/delete-confirmation-modal.tsx index 30570b0acc..d9f9ede8bf 100644 --- a/web/ee/components/issue-types/properties/delete-confirmation-modal.tsx +++ b/web/ee/components/issue-types/properties/delete-confirmation-modal.tsx @@ -8,13 +8,14 @@ import { cn } from "@/helpers/common.helper"; type TProps = { isOpen: boolean; + isDisabledAlready: boolean; onClose: () => void; onDisable: () => Promise; onDelete: () => Promise; }; export const DeleteConfirmationModal: React.FC = observer((props) => { - const { isOpen, onClose, onDisable, onDelete } = props; + const { isOpen, isDisabledAlready, onClose, onDisable, onDelete } = props; // states const [isSubmitting, setIsSubmitting] = useState(false); @@ -50,7 +51,7 @@ export const DeleteConfirmationModal: React.FC = observer((props) => {

Delete this property

Deletion of properties may lead to loss of existing data.

-

Do you want to disable the property instead?

+ {!isDisabledAlready &&

Do you want to disable the property instead?

}
@@ -59,15 +60,17 @@ export const DeleteConfirmationModal: React.FC = observer((props) => { Cancel
- + {!isDisabledAlready && ( + + )}
diff --git a/web/ee/components/issue-types/properties/dropdowns/property-title.tsx b/web/ee/components/issue-types/properties/dropdowns/property-title.tsx index b26c86e7de..aae6888ac9 100644 --- a/web/ee/components/issue-types/properties/dropdowns/property-title.tsx +++ b/web/ee/components/issue-types/properties/dropdowns/property-title.tsx @@ -39,7 +39,7 @@ export const PropertyTitleDropdown = observer((props: TPropertyTitleDropdownProp {propertyDetail.display_name ?? ""} {propertyDetail.description && ( - + )} @@ -58,8 +58,8 @@ export const PropertyTitleDropdown = observer((props: TPropertyTitleDropdownProp )} ref={setReferenceElement} > - {propertyDetail.display_name ?? ""} -