From 93aeedf1e100ee75a72727e64f52cd13785a355b Mon Sep 17 00:00:00 2001 From: Jonathan Date: Tue, 10 Jun 2025 00:56:10 +0200 Subject: [PATCH] Add tasks panels Signed-off-by: Bryan Frimin Signed-off-by: Sacha Al Himdani --- .../components/form/MeasureSelectField.tsx | 90 ++++ .../src/components/form/PeopleSelectField.tsx | 8 +- .../measures/LinkedMeasuresDialog.tsx | 55 +-- .../organizations/InviteUserDialog.tsx | 91 +++++ .../InviteUserDialogMutation.graphql.ts | 94 +++++ .../src/components/risks/LinkedRisksCard.tsx | 93 ++--- .../src/components/tasks/TaskFormDialog.tsx | 238 +++++++++++ .../src/components/tasks/TasksCard.tsx | 231 +++++++++++ .../TaskFormDialogCreateMutation.graphql.ts | 249 ++++++++++++ .../TaskFormDialogFragment.graphql.ts | 115 ++++++ .../TaskFormDialogUpdateMutation.graphql.ts | 199 +++++++++ .../TasksCardDeleteMutation.graphql.ts | 132 ++++++ apps/console2/src/hooks/graph/MeasureGraph.ts | 1 + apps/console2/src/hooks/graph/TaskGraph.ts | 12 + .../FrameworkGraphNodeQuery.graphql.ts | 9 +- .../MeasureGraphNodeQuery.graphql.ts | 110 ++++- .../OrganizationGraph_ViewQuery.graphql.ts | 79 +++- .../__generated__/TaskGraphQuery.graphql.ts | 311 ++++++++++++++ .../usePaginatedMeasuresFragment.graphql.ts} | 22 +- .../usePaginatedMeasuresQuery.graphql.ts} | 30 +- ...aginatedMeasuresQuery_fragment.graphql.ts} | 30 +- .../src/hooks/graph/usePaginatedMeasures.ts | 57 +++ .../src/pages/organizations/SettingsPage.tsx | 119 +++++- .../SettingsPageFragment.graphql.ts | 87 +++- ...SettingsPage_RemoveUserMutation.graphql.ts | 93 +++++ .../dialogs/CreateDocumentDialog.tsx | 1 + .../CreateDocumentDialogMutation.graphql.ts | 10 +- .../frameworks/FrameworkDetailPage.tsx | 189 +++++++-- ...DetailPageDeleteControlMutation.graphql.ts | 132 ++++++ .../FrameworkDetailPageFragment.graphql.ts | 14 +- .../dialogs/FrameworkControlDialog.tsx | 164 ++++++++ ...workControlDialogCreateMutation.graphql.ts | 208 ++++++++++ .../FrameworkControlDialogFragment.graphql.ts | 66 +++ ...workControlDialogUpdateMutation.graphql.ts | 158 +++++++ .../organizations/measures/MeasuresPage.tsx | 11 +- .../measures/dialog/MeasureFormDialog.tsx | 18 +- .../measures/tabs/MeasureTasksTab.tsx | 54 +++ .../MeasureTasksTabFragment.graphql.ts | 201 +++++++++ .../pages/organizations/tasks/TasksPage.tsx | 86 ++++ .../TasksPageFragment.graphql.ts | 291 +++++++++++++ .../TasksPageFragment_query.graphql.ts | 384 ++++++++++++++++++ apps/console2/src/routes.tsx | 2 + apps/console2/src/routes/measureRoutes.ts | 6 + apps/console2/src/routes/taskRoutes.ts | 18 + .../ui/src/Atoms/ControlItem/ControlItem.tsx | 16 +- .../ui/src/Atoms/Icons/IconCircleProgress.tsx | 2 +- .../src/Atoms/Icons/TaskStateIcon.stories.tsx | 22 + packages/ui/src/Atoms/Icons/TaskStateIcon.tsx | 14 + .../ui/src/Atoms/Icons/circle-progress.svg | 2 +- .../PriorityLevel/PriorityLevel.stories.tsx | 16 + .../src/Atoms/PriorityLevel/PriorityLevel.tsx | 30 ++ .../ui/src/Atoms/PropertyRow/PropertyRow.tsx | 4 +- packages/ui/src/Atoms/Select/Select.tsx | 33 +- packages/ui/src/Atoms/Slot.tsx | 2 +- packages/ui/src/Atoms/Tabs/Tabs.tsx | 60 +-- .../ui/src/Molecules/Combobox/Combobox.tsx | 4 +- .../DurationPicker/DurationPicker.stories.tsx | 18 + .../DurationPicker/DurationPicker.tsx | 83 ++++ .../MeasureImplementation.tsx | 4 +- packages/ui/src/index.ts | 5 +- 60 files changed, 4593 insertions(+), 290 deletions(-) create mode 100644 apps/console2/src/components/form/MeasureSelectField.tsx create mode 100644 apps/console2/src/components/organizations/InviteUserDialog.tsx create mode 100644 apps/console2/src/components/organizations/__generated__/InviteUserDialogMutation.graphql.ts create mode 100644 apps/console2/src/components/tasks/TaskFormDialog.tsx create mode 100644 apps/console2/src/components/tasks/TasksCard.tsx create mode 100644 apps/console2/src/components/tasks/__generated__/TaskFormDialogCreateMutation.graphql.ts create mode 100644 apps/console2/src/components/tasks/__generated__/TaskFormDialogFragment.graphql.ts create mode 100644 apps/console2/src/components/tasks/__generated__/TaskFormDialogUpdateMutation.graphql.ts create mode 100644 apps/console2/src/components/tasks/__generated__/TasksCardDeleteMutation.graphql.ts create mode 100644 apps/console2/src/hooks/graph/TaskGraph.ts create mode 100644 apps/console2/src/hooks/graph/__generated__/TaskGraphQuery.graphql.ts rename apps/console2/src/{components/measures/__generated__/LinkedMeasuresDialogFragment.graphql.ts => hooks/graph/__generated__/usePaginatedMeasuresFragment.graphql.ts} (88%) rename apps/console2/src/{components/measures/__generated__/LinkedMeasuresDialogQuery.graphql.ts => hooks/graph/__generated__/usePaginatedMeasuresQuery.graphql.ts} (87%) rename apps/console2/src/{components/measures/__generated__/LinkedMeasuresDialogQuery_fragment.graphql.ts => hooks/graph/__generated__/usePaginatedMeasuresQuery_fragment.graphql.ts} (88%) create mode 100644 apps/console2/src/hooks/graph/usePaginatedMeasures.ts create mode 100644 apps/console2/src/pages/organizations/__generated__/SettingsPage_RemoveUserMutation.graphql.ts create mode 100644 apps/console2/src/pages/organizations/frameworks/__generated__/FrameworkDetailPageDeleteControlMutation.graphql.ts create mode 100644 apps/console2/src/pages/organizations/frameworks/dialogs/FrameworkControlDialog.tsx create mode 100644 apps/console2/src/pages/organizations/frameworks/dialogs/__generated__/FrameworkControlDialogCreateMutation.graphql.ts create mode 100644 apps/console2/src/pages/organizations/frameworks/dialogs/__generated__/FrameworkControlDialogFragment.graphql.ts create mode 100644 apps/console2/src/pages/organizations/frameworks/dialogs/__generated__/FrameworkControlDialogUpdateMutation.graphql.ts create mode 100644 apps/console2/src/pages/organizations/measures/tabs/MeasureTasksTab.tsx create mode 100644 apps/console2/src/pages/organizations/measures/tabs/__generated__/MeasureTasksTabFragment.graphql.ts create mode 100644 apps/console2/src/pages/organizations/tasks/TasksPage.tsx create mode 100644 apps/console2/src/pages/organizations/tasks/__generated__/TasksPageFragment.graphql.ts create mode 100644 apps/console2/src/pages/organizations/tasks/__generated__/TasksPageFragment_query.graphql.ts create mode 100644 apps/console2/src/routes/taskRoutes.ts create mode 100644 packages/ui/src/Atoms/Icons/TaskStateIcon.stories.tsx create mode 100644 packages/ui/src/Atoms/Icons/TaskStateIcon.tsx create mode 100644 packages/ui/src/Atoms/PriorityLevel/PriorityLevel.stories.tsx create mode 100644 packages/ui/src/Atoms/PriorityLevel/PriorityLevel.tsx create mode 100644 packages/ui/src/Molecules/DurationPicker/DurationPicker.stories.tsx create mode 100644 packages/ui/src/Molecules/DurationPicker/DurationPicker.tsx diff --git a/apps/console2/src/components/form/MeasureSelectField.tsx b/apps/console2/src/components/form/MeasureSelectField.tsx new file mode 100644 index 000000000..c7c370e90 --- /dev/null +++ b/apps/console2/src/components/form/MeasureSelectField.tsx @@ -0,0 +1,90 @@ +import { Field, Option, Select } from "@probo/ui"; +import { Suspense, useMemo, useState, type ComponentProps } from "react"; +import { useTranslate } from "@probo/i18n"; +import { type Control, Controller } from "react-hook-form"; +import { usePaginatedMeasures } from "/hooks/graph/usePaginatedMeasures"; + +type Props = { + organizationId: string; + control: Control; + name: string; + label?: string; + error?: string; + disabled?: boolean; +} & ComponentProps; + +export function MeasureSelectField({ + organizationId, + control, + disabled, + ...props +}: Props) { + return ( + + } + > + + + + ); +} + +function MeasureSelectWithQuery( + props: Pick +) { + const { __ } = useTranslate(); + const { name, organizationId, control, disabled } = props; + const { data } = usePaginatedMeasures(organizationId); + const [search, setSearch] = useState(""); + const measures = useMemo(() => { + return ( + data?.measures.edges + ?.filter( + (edge) => + edge.node.name.toLowerCase().includes(search.toLowerCase()) || + edge.node.description?.toLowerCase().includes(search.toLowerCase()) + ) + .map((edge) => edge.node) ?? [] + ); + }, [data?.measures.edges, search]); + + return ( +
+ ( + + )} + /> +
+ ); +} diff --git a/apps/console2/src/components/form/PeopleSelectField.tsx b/apps/console2/src/components/form/PeopleSelectField.tsx index 5f704f559..c98cf8ea9 100644 --- a/apps/console2/src/components/form/PeopleSelectField.tsx +++ b/apps/console2/src/components/form/PeopleSelectField.tsx @@ -1,5 +1,5 @@ import { Avatar, Field, Option, Select } from "@probo/ui"; -import { Suspense } from "react"; +import { Suspense, type ComponentProps } from "react"; import { useTranslate } from "@probo/i18n"; import { type Control, Controller } from "react-hook-form"; import { usePeople } from "/hooks/graph/PeopleGraph.ts"; @@ -10,7 +10,7 @@ type Props = { name: string; label?: string; error?: string; -}; +} & ComponentProps; export function PeopleSelectField({ organizationId, @@ -26,6 +26,7 @@ export function PeopleSelectField({ organizationId={organizationId} control={control} name={props.name} + disabled={props.disabled} /> @@ -33,7 +34,7 @@ export function PeopleSelectField({ } function PeopleSelectWithQuery( - props: Pick + props: Pick ) { const { __ } = useTranslate(); const { name, organizationId, control } = props; @@ -46,6 +47,7 @@ function PeopleSelectWithQuery( name={name} render={({ field }) => ( +