forked from github/plane
d80a593520
* chore: kanban refactoring * chore: Implemented new kanaban board UX and implemented draggable using react beautiful dnd * chore: updated yarn lock * chore: updated the store for issues and issue filters * chore: resolved build error * chore: created filters and updated the issue filters, display_filter and display_properties in mobx and components * chore: implemented filters for issues * chore: UI theming updates * chore: handled single and multi select in filter cards * chore: implemented filters and views in kanaban * chore: updating filters, display_filter and display properties * chore: filter, layout, display filters, extra filters and display properties render validation * chore: clean up and resolved import warnings * chore: type check * chore: renamed gantt key to gantt_chart * chore: filter render UI and Functionality implementation * chore: filter empty state handling in issue filter selection * Implementing list view * chore: kanban drag drop logic * filtering * chore: store setup * chore: handled build issues * chore: store setup * user filter * chore: store setup * chore: store fixes and static data setup * chore: store setup for build fixes * fix: merge conflicts (#2231) * chore: dynamic position dropdown (#2138) * chore: dynamic position state dropdown for issue view * style: state select dropdown styling * fix: state icon attribute names * chore: state select dynamic dropdown * chore: member select dynamic dropdown * chore: label select dynamic dropdown * chore: priority select dynamic dropdown * chore: label select dropdown improvement * refactor: state dropdown location * chore: dropdown improvement and code refactor * chore: dynamic dropdown hook type added --------- Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com> * fix: fields not getting selected in the create issue form (#2212) * fix: hydration error and draft issue workflow * fix: build error * fix: properties getting de-selected after create, module & cycle not getting auto-select on the form * fix: display layout, props being updated directly * chore: sub issues count in individual issue (#2221) * fix: service imports * chore: rename csv service file --------- Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Co-authored-by: Dakshesh Jain <65905942+dakshesh14@users.noreply.github.com> Co-authored-by: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com> * chore: store fixes * chore: update issue detail store to handle peek overview (#2237) * chore: dynamic position dropdown (#2138) * chore: dynamic position state dropdown for issue view * style: state select dropdown styling * fix: state icon attribute names * chore: state select dynamic dropdown * chore: member select dynamic dropdown * chore: label select dynamic dropdown * chore: priority select dynamic dropdown * chore: label select dropdown improvement * refactor: state dropdown location * chore: dropdown improvement and code refactor * chore: dynamic dropdown hook type added --------- Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com> * fix: fields not getting selected in the create issue form (#2212) * fix: hydration error and draft issue workflow * fix: build error * fix: properties getting de-selected after create, module & cycle not getting auto-select on the form * fix: display layout, props being updated directly * chore: sub issues count in individual issue (#2221) * Implemented nested issues in the sub issues section in issue detail page (#2233) * feat: subissues infinte level * feat: updated UI for sub issues * feat: subissues new ui and nested sub issues in issue detail * chore: removed repeated code * refactor: product updates modal layout (#2225) * fix: handle no issues in custom analytics (#2226) * fix: activity label color (#2227) * fix: profile issues layout switch (#2228) * chore: update service imports * chore: update issue detail store to handle peek overview --------- Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Co-authored-by: Dakshesh Jain <65905942+dakshesh14@users.noreply.github.com> Co-authored-by: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com> Co-authored-by: guru_sainath <gurusainath007@gmail.com> * chore: minor fixes * workspace project fixes * feat: project issues topbar (#2256) * chore: project issues topbar * style: theming and minor UI fixes * refactor: file structure * chore: layout wise authorization added * style: filter dropdowns * chore: add fetch keys * chore: minor fixes * chore: filters dropdown (#2260) * chore: project issues topbar * style: theming and minor UI fixes * refactor: file structure * chore: layout wise authorization added * style: filter dropdowns * chore: add fetch keys * feat: search option for filters * fix: sticky headers * chore: sub_group_by section added * fix: leave project fixes * refactor: project card component refactor * Implemented swimlanes and kanban view (#2262) * chore: issue store for kanban and calendar * chore: updated ui for kanba and swimlanes * chore: yarn.lock updated * fix: computed filters logic * chore: added sub_group_by in params and handled sub-group-by render error in display filter's * fix: ui package setup and project update form refactor * fix: ui package setup * fix: minor ui fixes * dev: calendar view layout revamp (#2293) * dev: calendar view init * chore: new render logic * chore: implement calendar view * chore: calendar view * refactor: calendar payload * chore: remove active month logic from backend * chore: setup new store for calendar * refactor: issues fetching structure * chore: months dropdown * chore: modify request query params for calendar layout * refactor: remove console logs and add comments * chore: removed demo m-store routes * cycles changes * chore: issues grouped kanban and swimlanes UI and functionality (#2294) * chore: updated the all the group_by and sub_group_by UI and functionality render in kanban * chore: kanban sorting in mobx and ui updates * chore: ui changes and drag and drop functionality changes in kanban * chore: issues count render in kanban default and swimlanes * chore: Added icons to the group_by and sub_group_by in kanban and swimlanes * refactor: filter components, constants and helper functions (#2297) * refactor: filters and display filters to accept handlers as props * refactor: filters and display filters folder structure * refactor: change issue layout options constant structure * chore: display filters validations * chore: view less filters functionality * fix: display filters validation * refactor: wrap functions around useCallback * chore: start and target date filter options added * refactor: query params generator function * fix: query params generator function * dev: gantt chart implementation using MobX (#2302) * dev: fetch project gantt issues using mobx * chore: handle group by options in the kanban layout * dev: spreadsheet layout implementation using MobX (#2306) * dev: implement spreadsheet view using mobx * refactor: remove console logs and props * chore: refactoring cycles list * feat: adding additional ui components * dev: applied filters list implementation using MobX (#2325) * dev: applied filters list UI * fix: filter item height * chore: remove unnecessary classes * fix: params generator * fix: cycles views list and board * fix: cycles list rendering fixes * fix: layout fixes * refactor: filter components (#2359) * fix: calendar layout dividers * refactor: filter selection components * fix: dropdown closing after selection * refactor: filters components * chore: issue properties for list and kanban layouts and implemented estimates in project store (#2363) * chore: issue properties for state, priorit, labels and members * feat: implemented assignee, labels properties * fix: implemented estimates in project store and issue properties * chore: staer_date and due_date and validation properties in kanban * chore: filters import conflict * dev: setup module and module filter store (#2364) * dev: implement module issues using mobx store * dev: module filter store setup * chore: module store crud operations * chore: issue list layout (#2367) * chore: merge develop (#2388) * fix: build erros * chore: cycles, modules store integration, list and kanban layouts and updated kanban logic (#2399) * chore: cycle, cycle-issue, cycle-filters, cycle-kanban, cycle layout setup * chore: cycles kanban and list view store * chore: cycles, modules kanban and list, kanban view store * refactor: change naming convention (#2383) * fix:auth layer revamp * chore: Implemented list and kanban views in project modules (#2402) * chore: updated kanban logic in project cycles and modules * chore: updated list and kanban in module * dev: implement global views using MobX (#2404) * fix: selfhosted fixes (#2154) * fix: selfhosted fixes * fix: updated env example * chore: dynamic position dropdown (#2138) * chore: dynamic position state dropdown for issue view * style: state select dropdown styling * fix: state icon attribute names * chore: state select dynamic dropdown * chore: member select dynamic dropdown * chore: label select dynamic dropdown * chore: priority select dynamic dropdown * chore: label select dropdown improvement * refactor: state dropdown location * chore: dropdown improvement and code refactor * chore: dynamic dropdown hook type added --------- Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com> * fix: fields not getting selected in the create issue form (#2212) * fix: hydration error and draft issue workflow * fix: build error * fix: properties getting de-selected after create, module & cycle not getting auto-select on the form * fix: display layout, props being updated directly * chore: sub issues count in individual issue (#2221) * Implemented nested issues in the sub issues section in issue detail page (#2233) * feat: subissues infinte level * feat: updated UI for sub issues * feat: subissues new ui and nested sub issues in issue detail * chore: removed repeated code * refactor: product updates modal layout (#2225) * fix: handle no issues in custom analytics (#2226) * fix: activity label color (#2227) * fix: profile issues layout switch (#2228) * fix: issues resolved in sub issues (#2238) * fix: aws region name (#2234) * chore: updated docker naming conventions (#2239) * naming convention changes * dev: update docker-compose-hub in consistent with docker-compose * dev: updated docker container name --------- Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com> * chore: added state and priority order in workspace user profile (#2241) * fix: changed priority from None to none (#2229) * fix: cycle and module stats when issues are archived (#2185) * fix: cycle and module stats when issues are archived * fix: added draft filter --------- Co-authored-by: NarayanBavisetti <narayan3119@gmail.com> * feat: quick add (#2240) * feat: quick add * style: made text color muted * chore: added epoch in draft (#2244) * chore: added epoch in draft * chore: removed extra spaces * fix: resolved pending issue graph in analytics, user wishes in dashboard, and typo in projects list (#2247) * style: settings page improvement (#2211) * style: settings page improvement * style: toggle switch styling --------- Co-authored-by: Anmol Singh Bhatia <asb@Anmols-MacBook-Pro.local> * chore: changed priority props in workspace and project (#2253) * fix: bug fix related to fetching dropdown options for the profile issue (#2246) * fix: sub issue state and member select build error (#2254) * rename view to layout (#2255) Co-authored-by: Your Name <you@example.com> * fix: bug fixes and ui improvement (#2250) * dev: remove auto filter endpoint * feat: quick-add placement in spreadsheet and gantt (#2259) * feat: sticking quick-add at the bottom of the screen fix: opening create issue modal instead of quick-add in draft-issues, my-issue and profile page * fix: build error due to dynamic import * fix: draft issue delete not working (#2249) * fix: draft issue not deleting, project can't be changed in draft issue modal * fix: removed mutation for view where draft issues are not shown * fix: inline create issue for draft issue * fix: clearing data from localstorage on discard click * feat: Add peek overview in sub issues and updated UI for empty states. (#2263) * chore: add tooltip to show full time on activity logs (#2235) * fix: issue automation iterable error (#2208) * fix: n+1 queries for cycle list and project member endpoints (#2257) * [fix] nginx continuously rewriting and reloading on index page of spaces app (#2236) * chore: shifted index page to /home route * chore: added rewrite logic, to rewrite index to /home * chore: routed home to login route as login page * chore: updated nginx config to route to login * chore: updated path for home * dev: migration for 0.13 (#2266) * dev: updated migrations * dev: migration for 0.13 * dev: re-split migrations into two different files (#2268) * dev: split issue activity migration separate files * dev: resplit migrations into two different files * dev: changed the batch size * chore: udpate date filters to support dynamic options * fix: bugs in quick-add and draft issues (#2269) * fix: 'Last Drafted Issue' making sidebar look weird on collapsed * feat: scroll to the bottom when issue is created * fix: 'Add Issue' button overlapping issue card in spreadsheet view * fix: wrong placement of quick-add in calender layout * fix: spacing for issue card in spreadsheet view * chore: add instructions to contributing guide (#2270) * chore: add instructions to contributing guide * dev: update contributing.md to use the new configuration --------- Co-authored-by: Nikhil <118773738+pablohashescobar@users.noreply.github.com> * fix: user dashboard greeting timezone (#2267) * chore: user greeting timezone * fix: group by labels not working on workspace level * feat: workspace global view, style: spreadsheet view revamp (#2273) * chore: workspace view types, services and hooks added * style: spreadsheet view revamp and code refactor * feat: workspace view * fix: build fix * chore: sidebar workspace issues redirection updated * style: gantt layout quick-add padding (#2272) * fix: 'Last Drafted Issue' making sidebar look weird on collapsed * feat: scroll to the bottom when issue is created * fix: 'Add Issue' button overlapping issue card in spreadsheet view * fix: wrong placement of quick-add in calender layout * fix: spacing for issue card in spreadsheet view * style: gantt layout quick-add padding style: removed 'State group' from draft issue * style: decrese shadow, quick-add position on calender layout, and 'add issue' sticky * style: button color * fix: block click happening while moving (#2275) * dev: refactor date filters to a single function * chore: handle calendar date range in frontend (#2277) * chore: gantt chart empty state (#2279) * chore: gantt empty state * chore: Add heading to the gantt sidebar * style: calender quick-add same width as single date (#2280) * style: calender quick-add same width as single date * style: margin bottom in quick-add in spreadsheet view * fix: quick add opening in list-layout * style: reduced margin left * chore: updated created at in draft issue (#2278) * chore: make target dates inclusive when filtering (#2276) * chore: sort order and issue props for global views (#2283) * chore: removed project filter (#2284) * fix: inbox issue deletes (#2290) * chore: views (#2288) * chore: global views order by * chore: update permissions for global views --------- Co-authored-by: NarayanBavisetti <narayan3119@gmail.com> * chore: fetch issues from previous and next month in the calendar view (#2282) * fix: issue activity estimate value bug fix (#2281) * fix: issue activity estimate value bug fix * fix: activity typo fix * fix: ui and bugs (#2289) * fix: 24 character limit on first & last name in onboarding page * fix: no option: 'Add Issue' in archive issue page * fix: in archive issue directly sending to issue detail page * fix: issue type showing in archive issue * fix: custom menu overflowing * fix: changing subscriber in filters has no effect * style: border in quick-add * fix: on onboarding member role overflowing * fix: inconsistent icons in issue detail * style: spacing, borders and shadows in quick-add * fix: custom menu truncate * fix: notifications for created by me and assigned to me (#2292) * chore: workspace view display filters and properties , code refactor (#2295) * chore: spreadsheet view context * chore: spreadsheet context provider * chore: spreadsheet view context * chore: display filters and properties added in workspace view and code refactor * fix: build error fix * chore: set sub-issue display option to false for global views --------- Co-authored-by: gurusainath <gurusainath007@gmail.com> * chore: label create error (#2299) * chore: global issues ui improvement and bug fixes (#2300) * chore: workspace view mutation fix ,bug fixes and code refactor (#2301) * chore: workspace view mutation fix ,bug fixes and code refactor * chore: update workspace view toast alert added * chore: workspace view order by removed (#2303) * dev: updated migrations for 0.13-dev (#2305) * chore: epoch migration batch size changed * chore: reoredered the migration files * dev: updated migrations for 0.13-dev * chore: added epoch field * dev: merged the migration files * fix: workspace view filters count fix (#2307) * fix: unsplash api fix (#2310) * fix: workspace view redirection fix, style: spreadsheet view shadow scroll fix (#2314) * fix: workspace view redirection fix * style: spreadsheet view scroll shadow fix * fix: update build workflow for the deploy app (#2315) * fix: workspace view add issue mutation fix (#2317) * dev: create action to sync PR changes to the repo (#2333) * fix: ui package readme added (#2334) * fix: variable name for token (#2336) * dev: update add permissions to the action (#2337) * dev: rename token variables (#2338) * fix: updated readme fixes (#2339) * dev: update sync workflow to run only when the source repo is configured (#2346) * dev: update sync workflow to run only when the source repo is configured * fix: naming convention changes --------- Co-authored-by: sriramveeraghanta <veeraghanta.sriram@gmail.com> * fix: issue relation mutation and draft issue (#2340) * fix: issue relation mutation and draft issue * fix: 'New Issue' in gantt view fix: emoji select going under * fix: profile page typo * fix: sync workflow fixes (#2365) * fix: sync job pr description escaped values fix (#2366) * Update index.tsx (#2343) Fixes #2342 * dev: update apiserver configuration files (#2348) * dev: update apiserver configuration files * dev: add email and minio redirection urls * fix: themening validation in store init. (#2350) * chore: member can change role (#2371) * chore: removed the issue draft log from my profile (#2368) * adding sync info in pr title (#2373) * chore: layout access validation and switch in plane deploy issues route (#2351) * chore: handled route validation and layout access validation in plane deploy issues * chore: impoved validation condition * show current version in the help section dropdown (#2353) * fix: table menu positioning (#2354) * fix: handle cross project issues in the sub-issues. (#2357) * fix: login process validation based on api config (#2361) * dev: configuration endpoint for frontend client (#2355) * dev: configuration endpoint for frontend clients * dev: configuration enable magic and email/password signup * dev: update unsplash keys * dev: add unsplash API and add env for magic login * fix: 404 when redirecting user clicks on Sign In button (#2349) * fix: 404 when redirecting user to login page * fix: next_path redirection not working * fix: authentication workflow update in plane deploy --------- Co-authored-by: gurusainath <gurusainath007@gmail.com> * fix: project setting member role validation (#2369) * fix: project setting member role validation * chore: opacity removed from member setting page * chore: member setting page validation * chore: project covers endpoint (#2370) * chore: project covers endpoint * dev: remove print logs * dev: formatting --------- Co-authored-by: sriramveeraghanta <veeraghanta.sriram@gmail.com> * feat: default project cover images tab on the change cover popover (#2375) * feat: default project cover images tab * chore: remove unnecessary env vars from turbo.json * chore: remove unnecessary OAuth envs (#2378) * chore: remove unnecessary oauth envs * merge conflicts resolved * fix: adding new service --------- Co-authored-by: sriramveeraghanta <veeraghanta.sriram@gmail.com> * fix: added user store variables in mobx store observable (#2380) * fix: state group icons (#2381) * fix: removed default theme setting in the index page (#2382) * fix: removed default theme setting in the index page * fix: empty space * dev: global views and workspace filters store implemented * sync CE Master to EE Develop * refactor: create update view modal * chore: static issue global views * refactor: remove old code * refactor: filters select dropdown * chore: fix calendar layout * chore: mobx store for new applied filters * chore: dded search functionality --------- Co-authored-by: Vamsi Kurama <vamsi.kurama@gmail.com> Co-authored-by: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com> Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Co-authored-by: Dakshesh Jain <65905942+dakshesh14@users.noreply.github.com> Co-authored-by: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com> Co-authored-by: guru_sainath <gurusainath007@gmail.com> Co-authored-by: NarayanBavisetti <narayan3119@gmail.com> Co-authored-by: Anmol Singh Bhatia <asb@Anmols-MacBook-Pro.local> Co-authored-by: Rhea Jain <65884341+rhea0110@users.noreply.github.com> Co-authored-by: Your Name <you@example.com> Co-authored-by: pablohashescobar <nikhilschacko@gmail.com> Co-authored-by: Henit Chobisa <chobisa.henit@gmail.com> Co-authored-by: Thomas <git@thomasync.dev> Co-authored-by: Luis Cruz <55716036+luis-cruzt@users.noreply.github.com> Co-authored-by: Manish Gupta <manish@mgupta.me> * fix: Auth fixes and Layout fixes (#2408) * fix: auth fixes and layout improvements * fix: layout fixes * fix: analytics page fixes * dev: implemented project views using MobX (#2410) * dev: implemented project views list using mobx * style: views list UI * dev: implemented view issues page using mobx * refactor: project view issues fetching * chore: plane ui library component and code refactor (#2406) * chore: swap input component with plane/ui package * chore: swap textarea component with plane/ui package * chore: swap button component with plane/ui package * chore: button component revamp * fix: button type fix * chore: secondary button revamp * chore: button props updated * chore: swap loader component with plane/ui package * fix: build error fix * chore: button component refactor * chore: code refactor * chore: swap toggle switch component with plane/ui package * chore: swap spinner component with plane/ui package * chore: swap progress bar componenet with plan/ui package * chore: code refactor * fix: gitignore fixes * fix: project card fixes * chore: ui component revamp (#2415) * chore: swap tooltip component with plane ui package * chore: swap linear progress component with plane ui package * fix: login button fix * chore: implement new worksapace wrapper for global views (#2412) * chore: implement new worksapace wrapper for global views pages * fix: merge conflicts * fix: merge conflicts * dev: add remaining layouts to cycle (#2413) * fix: workspace auth wrapper changes * chore: project card revamp and refactor (#2416) * removing dist from ui * refactor: analytics (#2419) * refactor: helper functions * chore: updated all the page headers * refactor: custom analytics * refactor: project analytics modal * refactor: folder structure, remove junk code (#2423) * refactor: folder structure * chore: ad order by target date option * refactor: remove old layout components * refactor: inbox folder structure * fix: services fixes * fix: store imports changes * fix: services export fixes * fix: services implementation fixes * fix: build issue fixes * fix: react library fixes * refactor: MobX store folder structure (#2435) * refactor: store folder structure * chore: update import statements * fix: service import errors (#2436) * fix: service imports * chore: update service imports in store * chore: fix remianing service imports * build fixes * editor ts config fixes * fix: turbo and build fixes * fix: Auth screen loading implementation * fix: build issues * fix: turbo settings for ui package --------- Co-authored-by: gurusainath <gurusainath007@gmail.com> Co-authored-by: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Co-authored-by: Dakshesh Jain <65905942+dakshesh14@users.noreply.github.com> Co-authored-by: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com> Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com> Co-authored-by: Vamsi Kurama <vamsi.kurama@gmail.com> Co-authored-by: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Co-authored-by: NarayanBavisetti <narayan3119@gmail.com> Co-authored-by: Anmol Singh Bhatia <asb@Anmols-MacBook-Pro.local> Co-authored-by: Rhea Jain <65884341+rhea0110@users.noreply.github.com> Co-authored-by: Your Name <you@example.com> Co-authored-by: pablohashescobar <nikhilschacko@gmail.com> Co-authored-by: Henit Chobisa <chobisa.henit@gmail.com> Co-authored-by: Thomas <git@thomasync.dev> Co-authored-by: Luis Cruz <55716036+luis-cruzt@users.noreply.github.com> Co-authored-by: Manish Gupta <manish@mgupta.me>
535 lines
23 KiB
TypeScript
535 lines
23 KiB
TypeScript
import React, { useState } from "react";
|
|
import { useRouter } from "next/router";
|
|
import { mutate } from "swr";
|
|
import { Controller, useFormContext } from "react-hook-form";
|
|
// hooks
|
|
import useUser from "hooks/use-user";
|
|
import { useProjectMyMembership } from "contexts/project-member.context";
|
|
import useEstimateOption from "hooks/use-estimate-option";
|
|
// fetch keys
|
|
import { ISSUE_DETAILS, PROJECT_ISSUES_ACTIVITY } from "constants/fetch-keys";
|
|
// icons
|
|
import { PlayIcon, User, X, CalendarDays, LayoutGrid, Users, CopyPlus } from "lucide-react";
|
|
import { RectangleGroupIcon } from "@heroicons/react/24/outline";
|
|
import { BlockedIcon, BlockerIcon, RelatedIcon, ContrastIcon } from "components/icons";
|
|
//services
|
|
import { IssueService } from "services/issue";
|
|
// components
|
|
import { Button } from "@plane/ui";
|
|
import {
|
|
Label,
|
|
StateSelect,
|
|
PrioritySelect,
|
|
AssigneeSelect,
|
|
EstimateSelect,
|
|
ParentSelect,
|
|
BlockerSelect,
|
|
BlockedBySelect,
|
|
RelatesSelect,
|
|
DuplicateSelect,
|
|
ModuleSelect,
|
|
CycleSelect,
|
|
DateSelector,
|
|
} from "components/web-view";
|
|
// types
|
|
import type { IIssue } from "types";
|
|
|
|
type Props = {
|
|
submitChanges: (data: Partial<IIssue>) => Promise<void>;
|
|
};
|
|
|
|
const issueService = new IssueService();
|
|
|
|
export const IssuePropertiesDetail: React.FC<Props> = (props) => {
|
|
const { submitChanges } = props;
|
|
|
|
const { watch, control } = useFormContext<IIssue>();
|
|
|
|
const blockerIssues = watch("issue_relations")?.filter((i) => i.relation_type === "blocked_by") || [];
|
|
|
|
const blockedByIssues = watch("related_issues")?.filter((i) => i.relation_type === "blocked_by");
|
|
|
|
const relatedToIssueRelation = [
|
|
...(watch("related_issues")?.filter((i) => i.relation_type === "relates_to") ?? []),
|
|
...(watch("issue_relations") ?? [])
|
|
?.filter((i) => i.relation_type === "relates_to")
|
|
.map((i) => ({
|
|
...i,
|
|
issue_detail: i.issue_detail,
|
|
related_issue: i.issue_detail?.id,
|
|
})),
|
|
];
|
|
|
|
const duplicateIssuesRelation = [
|
|
...(watch("related_issues")?.filter((i) => i.relation_type === "duplicate") ?? []),
|
|
...(watch("issue_relations") ?? [])
|
|
?.filter((i) => i.relation_type === "duplicate")
|
|
.map((i) => ({
|
|
...i,
|
|
issue_detail: i.issue_detail,
|
|
related_issue: i.issue_detail?.id,
|
|
})),
|
|
];
|
|
|
|
const startDate = watch("start_date");
|
|
|
|
const router = useRouter();
|
|
const { workspaceSlug, projectId, issueId } = router.query;
|
|
|
|
const isArchive = Boolean(router.query.archive);
|
|
|
|
const { memberRole } = useProjectMyMembership();
|
|
|
|
const { user } = useUser();
|
|
|
|
const [isViewAllOpen, setIsViewAllOpen] = useState(false);
|
|
|
|
const { isEstimateActive } = useEstimateOption();
|
|
|
|
return (
|
|
<div className="space-y-[6px]">
|
|
<Label>Details</Label>
|
|
<div>
|
|
<div className="border border-custom-border-200 rounded-[4px] p-2 flex justify-between items-center">
|
|
<div className="flex items-center gap-1">
|
|
<LayoutGrid className="h-4 w-4 flex-shrink-0 text-custom-text-400" />
|
|
<span className="text-sm text-custom-text-400">State</span>
|
|
</div>
|
|
<div>
|
|
<Controller
|
|
control={control}
|
|
name="state"
|
|
render={({ field: { value } }) => (
|
|
<StateSelect
|
|
value={value}
|
|
disabled={isArchive || memberRole.isGuest || memberRole.isViewer}
|
|
onChange={(val: string) => submitChanges({ state: val })}
|
|
/>
|
|
)}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div className="border border-custom-border-200 rounded-[4px] p-2 flex justify-between items-center">
|
|
<div className="flex items-center gap-1 text-custom-text-400">
|
|
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path
|
|
d="M13.5862 14.5239C13.3459 14.5239 13.1416 14.4398 12.9733 14.2715C12.805 14.1032 12.7209 13.8989 12.7209 13.6585V3.76429C12.7209 3.52391 12.805 3.31958 12.9733 3.15132C13.1416 2.98306 13.3459 2.89893 13.5862 2.89893C13.8266 2.89893 14.031 2.98306 14.1992 3.15132C14.3675 3.31958 14.4516 3.52391 14.4516 3.76429V13.6585C14.4516 13.8989 14.3675 14.1032 14.1992 14.2715C14.031 14.4398 13.8266 14.5239 13.5862 14.5239ZM5.1629 14.5239C5.04676 14.5239 4.93557 14.5018 4.82932 14.4576C4.72308 14.4133 4.63006 14.3513 4.55025 14.2715C4.47045 14.1917 4.40843 14.0986 4.36419 13.9922C4.31996 13.8858 4.29785 13.7746 4.29785 13.6585V11.2643C4.29785 11.0239 4.38198 10.8196 4.55025 10.6513C4.71851 10.4831 4.92283 10.3989 5.16322 10.3989C5.40359 10.3989 5.60791 10.4831 5.77618 10.6513C5.94445 10.8196 6.02859 11.0239 6.02859 11.2643V13.6585C6.02859 13.7746 6.00647 13.8858 5.96223 13.9922C5.91801 14.0986 5.85599 14.1917 5.77618 14.2715C5.69638 14.3513 5.60325 14.4133 5.49678 14.4576C5.39033 14.5018 5.27904 14.5239 5.1629 14.5239ZM9.37473 14.5239C9.13436 14.5239 8.93003 14.4398 8.76176 14.2715C8.59349 14.1032 8.50936 13.8989 8.50936 13.6585V7.5143C8.50936 7.27391 8.59349 7.06958 8.76176 6.90132C8.93003 6.73306 9.13436 6.64893 9.37473 6.64893C9.61511 6.64893 9.81943 6.73306 9.98771 6.90132C10.156 7.06958 10.2401 7.27391 10.2401 7.5143V13.6585C10.2401 13.8989 10.156 14.1032 9.98771 14.2715C9.81943 14.4398 9.61511 14.5239 9.37473 14.5239Z"
|
|
fill="currentColor"
|
|
/>
|
|
</svg>
|
|
|
|
<span className="text-sm text-custom-text-400">Priority</span>
|
|
</div>
|
|
<div>
|
|
<Controller
|
|
control={control}
|
|
name="priority"
|
|
render={({ field: { value } }) => (
|
|
<PrioritySelect
|
|
value={value}
|
|
disabled={isArchive || memberRole.isGuest || memberRole.isViewer}
|
|
onChange={(val) => submitChanges({ priority: val })}
|
|
/>
|
|
)}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div className="border border-custom-border-200 rounded-[4px] p-2 flex justify-between items-center">
|
|
<div className="flex items-center gap-1">
|
|
<Users className="h-4 w-4 flex-shrink-0 text-custom-text-400" />
|
|
<span className="text-sm text-custom-text-400">Assignee</span>
|
|
</div>
|
|
<div>
|
|
<Controller
|
|
control={control}
|
|
name="assignees_list"
|
|
render={({ field: { value } }) => (
|
|
<AssigneeSelect
|
|
value={value}
|
|
disabled={isArchive || memberRole.isGuest || memberRole.isViewer}
|
|
onChange={(val: string) => {
|
|
const assignees = value?.includes(val) ? value?.filter((i) => i !== val) : [...(value ?? []), val];
|
|
|
|
submitChanges({ assignees_list: assignees });
|
|
}}
|
|
/>
|
|
)}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{isViewAllOpen && (
|
|
<>
|
|
{isEstimateActive && (
|
|
<div>
|
|
<div className="border border-custom-border-200 rounded-[4px] p-2 flex justify-between items-center">
|
|
<div className="flex items-center gap-1">
|
|
<PlayIcon className="h-4 w-4 flex-shrink-0 -rotate-90 text-custom-text-400" />
|
|
<span className="text-sm text-custom-text-400">Estimate</span>
|
|
</div>
|
|
<div>
|
|
<Controller
|
|
control={control}
|
|
name="estimate_point"
|
|
render={({ field: { value } }) => (
|
|
<EstimateSelect
|
|
value={value}
|
|
disabled={isArchive || memberRole.isGuest || memberRole.isViewer}
|
|
onChange={(val) => submitChanges({ estimate_point: val })}
|
|
/>
|
|
)}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)}
|
|
<div>
|
|
<div className="border border-custom-border-200 rounded-[4px] p-2 flex justify-between items-center">
|
|
<div className="flex items-center gap-1">
|
|
<User className="h-4 w-4 flex-shrink-0 text-custom-text-400" />
|
|
<span className="text-sm text-custom-text-400">Parent</span>
|
|
</div>
|
|
<div>
|
|
<Controller
|
|
control={control}
|
|
name="parent"
|
|
render={({ field: { value } }) => (
|
|
<ParentSelect
|
|
value={value}
|
|
disabled={isArchive || memberRole.isGuest || memberRole.isViewer}
|
|
onChange={(val) => submitChanges({ parent: val })}
|
|
/>
|
|
)}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* blocker to / blocking */}
|
|
<div>
|
|
<div className="border border-custom-border-200 rounded-[4px] p-2">
|
|
<div className="flex justify-between items-center">
|
|
<div className="flex items-center gap-1">
|
|
<BlockerIcon height={16} width={16} />
|
|
<span className="text-sm text-custom-text-400">Blocking</span>
|
|
</div>
|
|
<div>
|
|
<BlockerSelect disabled={isArchive || memberRole.isGuest || memberRole.isViewer} />
|
|
</div>
|
|
</div>
|
|
{blockerIssues &&
|
|
blockerIssues.map((relation) => (
|
|
<div
|
|
key={relation.issue_detail?.id}
|
|
className="group inline-flex mr-1 cursor-pointer items-center gap-1 rounded-2xl border border-custom-border-200 px-1.5 py-0.5 text-xs text-yellow-500 duration-300 hover:border-yellow-500/20 hover:bg-yellow-500/20"
|
|
>
|
|
<span
|
|
onClick={() =>
|
|
console.log(
|
|
"issue",
|
|
JSON.stringify({
|
|
issue_id: relation.issue_detail?.id,
|
|
project_id: relation.issue_detail?.project_detail.id,
|
|
})
|
|
)
|
|
}
|
|
className="flex items-center gap-1"
|
|
>
|
|
<BlockerIcon height={10} width={10} />
|
|
{`${relation.issue_detail?.project_detail.identifier}-${relation.issue_detail?.sequence_id}`}
|
|
</span>
|
|
{!isArchive && (
|
|
<button
|
|
type="button"
|
|
className="duration-300"
|
|
onClick={() => {
|
|
if (memberRole.isGuest || memberRole.isViewer || !user) return;
|
|
|
|
issueService
|
|
.deleteIssueRelation(
|
|
workspaceSlug as string,
|
|
projectId as string,
|
|
relation.issue,
|
|
relation.id,
|
|
user
|
|
)
|
|
.then(() => {
|
|
mutate(ISSUE_DETAILS(issueId as string));
|
|
mutate(PROJECT_ISSUES_ACTIVITY(issueId as string));
|
|
});
|
|
}}
|
|
>
|
|
<X className="h-2 w-2" />
|
|
</button>
|
|
)}
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
|
|
{/* blocked by */}
|
|
<div>
|
|
<div className="border border-custom-border-200 rounded-[4px] p-2">
|
|
<div className="flex justify-between items-center">
|
|
<div className="flex items-center gap-1">
|
|
<BlockedIcon height={16} width={16} />
|
|
<span className="text-sm text-custom-text-400">Blocked by</span>
|
|
</div>
|
|
<div>
|
|
<BlockedBySelect disabled={isArchive || memberRole.isGuest || memberRole.isViewer} />
|
|
</div>
|
|
</div>
|
|
{blockedByIssues &&
|
|
blockedByIssues.map((relation) => (
|
|
<div
|
|
key={relation.issue_detail?.id}
|
|
className="group inline-flex mr-1 cursor-pointer items-center gap-1 rounded-2xl border border-custom-border-200 px-1.5 py-0.5 text-xs text-red-500 duration-300 hover:border-red-500/20 hover:bg-red-500/20"
|
|
>
|
|
<span
|
|
onClick={() =>
|
|
console.log(
|
|
"issue",
|
|
JSON.stringify({
|
|
issue_id: relation.issue_detail?.id,
|
|
project_id: relation.issue_detail?.project_detail.id,
|
|
})
|
|
)
|
|
}
|
|
className="flex items-center gap-1"
|
|
>
|
|
<BlockedIcon height={10} width={10} />
|
|
{`${relation?.issue_detail?.project_detail?.identifier}-${relation?.issue_detail?.sequence_id}`}
|
|
</span>
|
|
{!isArchive && !(memberRole.isGuest || memberRole.isViewer) && (
|
|
<button
|
|
type="button"
|
|
className="duration-300"
|
|
onClick={() => {
|
|
if (memberRole.isGuest || memberRole.isViewer || !user) return;
|
|
|
|
issueService
|
|
.deleteIssueRelation(
|
|
workspaceSlug as string,
|
|
projectId as string,
|
|
issueId as string,
|
|
relation.id,
|
|
user
|
|
)
|
|
.then(() => {
|
|
mutate(ISSUE_DETAILS(issueId as string));
|
|
mutate(PROJECT_ISSUES_ACTIVITY(issueId as string));
|
|
});
|
|
}}
|
|
>
|
|
<X className="h-2 w-2" />
|
|
</button>
|
|
)}
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
|
|
{/* duplicate */}
|
|
<div>
|
|
<div className="border border-custom-border-200 rounded-[4px] p-2">
|
|
<div className="flex justify-between items-center">
|
|
<div className="flex items-center gap-1">
|
|
<CopyPlus height={16} width={16} className="text-custom-text-400" />
|
|
<span className="text-sm text-custom-text-400">Duplicate</span>
|
|
</div>
|
|
<div>
|
|
<DuplicateSelect disabled={isArchive || memberRole.isGuest || memberRole.isViewer} />
|
|
</div>
|
|
</div>
|
|
{duplicateIssuesRelation &&
|
|
duplicateIssuesRelation.map((relation) => (
|
|
<div
|
|
key={relation.issue_detail?.id}
|
|
className="group inline-flex mr-1 cursor-pointer items-center gap-1 rounded-2xl border border-custom-border-200 px-1.5 py-0.5 text-xs text-red-500 duration-300 hover:border-red-500/20 hover:bg-red-500/20"
|
|
>
|
|
<span
|
|
onClick={() =>
|
|
console.log(
|
|
"issue",
|
|
JSON.stringify({
|
|
issue_id: relation.issue_detail?.id,
|
|
project_id: relation.issue_detail?.project_detail.id,
|
|
})
|
|
)
|
|
}
|
|
className="flex items-center gap-1"
|
|
>
|
|
<CopyPlus height={10} width={10} />
|
|
{`${relation?.issue_detail?.project_detail?.identifier}-${relation?.issue_detail?.sequence_id}`}
|
|
</span>
|
|
{!isArchive && !(memberRole.isGuest || memberRole.isViewer) && (
|
|
<button
|
|
type="button"
|
|
className="duration-300"
|
|
onClick={() => {
|
|
if (memberRole.isGuest || memberRole.isViewer || !user) return;
|
|
|
|
issueService
|
|
.deleteIssueRelation(
|
|
workspaceSlug as string,
|
|
projectId as string,
|
|
issueId as string,
|
|
relation.id,
|
|
user
|
|
)
|
|
.then(() => {
|
|
mutate(ISSUE_DETAILS(issueId as string));
|
|
mutate(PROJECT_ISSUES_ACTIVITY(issueId as string));
|
|
});
|
|
}}
|
|
>
|
|
<X className="h-2 w-2" />
|
|
</button>
|
|
)}
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
|
|
{/* relates to */}
|
|
<div>
|
|
<div className="border border-custom-border-200 rounded-[4px] p-2">
|
|
<div className="flex justify-between items-center">
|
|
<div className="flex items-center gap-1">
|
|
<RelatedIcon height={16} width={16} color="rgb(var(--color-text-400))" />
|
|
<span className="text-sm text-custom-text-400">Relates To</span>
|
|
</div>
|
|
<div>
|
|
<RelatesSelect disabled={isArchive || memberRole.isGuest || memberRole.isViewer} />
|
|
</div>
|
|
</div>
|
|
{relatedToIssueRelation &&
|
|
relatedToIssueRelation.map((relation) => (
|
|
<div
|
|
key={relation.issue_detail?.id}
|
|
className="group inline-flex mr-1 cursor-pointer items-center gap-1 rounded-2xl border border-custom-border-200 px-1.5 py-0.5 text-xs text-red-500 duration-300 hover:border-red-500/20 hover:bg-red-500/20"
|
|
>
|
|
<span
|
|
onClick={() =>
|
|
console.log(
|
|
"issue",
|
|
JSON.stringify({
|
|
issue_id: relation.issue_detail?.id,
|
|
project_id: relation.issue_detail?.project_detail.id,
|
|
})
|
|
)
|
|
}
|
|
className="flex items-center gap-1"
|
|
>
|
|
<RelatedIcon height={10} width={10} />
|
|
{`${relation?.issue_detail?.project_detail?.identifier}-${relation?.issue_detail?.sequence_id}`}
|
|
</span>
|
|
{!isArchive && !(memberRole.isGuest || memberRole.isViewer) && (
|
|
<button
|
|
type="button"
|
|
className="duration-300"
|
|
onClick={() => {
|
|
if (memberRole.isGuest || memberRole.isViewer || !user) return;
|
|
|
|
issueService
|
|
.deleteIssueRelation(
|
|
workspaceSlug as string,
|
|
projectId as string,
|
|
issueId as string,
|
|
relation.id,
|
|
user
|
|
)
|
|
.then(() => {
|
|
mutate(ISSUE_DETAILS(issueId as string));
|
|
mutate(PROJECT_ISSUES_ACTIVITY(issueId as string));
|
|
});
|
|
}}
|
|
>
|
|
<X className="h-2 w-2" />
|
|
</button>
|
|
)}
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
|
|
<div>
|
|
<div className="border border-custom-border-200 rounded-[4px] p-2">
|
|
<div className="flex justify-between items-center">
|
|
<div className="flex items-center gap-1">
|
|
<CalendarDays className="w-4 h-4 text-custom-text-400" />
|
|
<span className="text-sm text-custom-text-400">Due date</span>
|
|
</div>
|
|
<div>
|
|
<Controller
|
|
control={control}
|
|
name="target_date"
|
|
render={({ field: { value } }) => (
|
|
<DateSelector
|
|
placeholderText="Due date"
|
|
value={value ?? undefined}
|
|
wrapperClassName="w-full"
|
|
disabled={isArchive || memberRole.isGuest || memberRole.isViewer}
|
|
onChange={(val) =>
|
|
submitChanges({
|
|
target_date: val,
|
|
})
|
|
}
|
|
className="border-transparent !shadow-none !w-[6.75rem]"
|
|
minDate={startDate ? new Date(startDate) : undefined}
|
|
/>
|
|
)}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div>
|
|
<div className="border border-custom-border-200 rounded-[4px] p-2">
|
|
<div className="flex justify-between items-center">
|
|
<div className="flex items-center gap-1">
|
|
<RectangleGroupIcon className="h-4 w-4 flex-shrink-0 text-custom-text-400" />
|
|
<span className="text-sm text-custom-text-400">Module</span>
|
|
</div>
|
|
<div>
|
|
<ModuleSelect
|
|
value={watch("issue_module")}
|
|
disabled={isArchive || memberRole.isGuest || memberRole.isViewer}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div>
|
|
<div className="border border-custom-border-200 rounded-[4px] p-2">
|
|
<div className="flex justify-between items-center">
|
|
<div className="flex items-center gap-1">
|
|
<ContrastIcon color="rgba(var(--color-text-400))" className="h-4 w-4 flex-shrink-0" />
|
|
<span className="text-sm text-custom-text-400">Cycle</span>
|
|
</div>
|
|
<div>
|
|
<CycleSelect
|
|
value={watch("issue_cycle")}
|
|
disabled={isArchive || memberRole.isGuest || memberRole.isViewer}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</>
|
|
)}
|
|
<div>
|
|
<Button type="button" onClick={() => setIsViewAllOpen((prev) => !prev)}>
|
|
{isViewAllOpen ? "View less" : "View all"}
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|